From 7c0c85a86aa73c0c495523f994f8412e377a8195 Mon Sep 17 00:00:00 2001
From: Pixel <pixel@nobis-crew.org>
Date: Mon, 14 Jun 2010 23:47:31 -0700
Subject: Upgrading im to 3.6

---
 im/dox/im.dox                        |    2 +-
 im/include/im.h                      |    2 +-
 im/include/im_binfile.h              |    2 +-
 im/include/im_image.h                |   28 +-
 im/include/im_lib.h                  |   10 +-
 im/include/im_math.h                 |    8 +-
 im/include/im_process_loc.h          |    6 +-
 im/include/im_process_pon.h          |   22 +-
 im/include/imlua.h                   |   14 +-
 im/mak.vc8/im.sln                    |   16 +-
 im/mak.vc8/im_wmv.vcproj             |    2 +-
 im/mak.vc9/im.sln                    |   45 ++
 im/mak.vc9/im_copy.vcproj            |    1 +
 im/mak.vc9/im_info.vcproj            |   18 +-
 im/mak.vc9/im_view.vcproj            |    1 +
 im/src/COPYRIGHT                     |    2 +-
 im/src/config.mak                    |    2 +-
 im/src/im.def                        |    2 +
 im/src/im_binfile.cpp                |    4 +-
 im/src/im_dib.cpp                    |    4 +-
 im/src/im_file.cpp                   |    3 +-
 im/src/im_format.cpp                 |   23 +-
 im/src/im_image.cpp                  |   44 +-
 im/src/im_lib.cpp                    |    6 +-
 im/src/im_process.def                |    1 +
 im/src/lua5/clua/im_process.clua     |  344 +++++-----
 im/src/lua5/im_process.lua           |    1 +
 im/src/lua5/imlua_aux.c              |    4 +-
 im/src/lua5/imlua_image.c            |   46 +-
 im/src/lua5/imlua_process.c          |   41 +-
 im/src/process/im_analyze.cpp        |   23 +-
 im/src/process/im_arithmetic_bin.cpp |  144 +++-
 im/src/process/im_color.cpp          |    6 +-
 im/src/process/im_geometric.cpp      |   37 +-
 im/src/process/im_resize.cpp         |   24 +-
 im/src/tecmake.mak                   | 1253 ++++++++++++++++++++++++++++++++++
 im/test/im_info.cpp                  |    1 -
 37 files changed, 1901 insertions(+), 291 deletions(-)
 create mode 100644 im/src/tecmake.mak

(limited to 'im')

diff --git a/im/dox/im.dox b/im/dox/im.dox
index 5188237..b520835 100755
--- a/im/dox/im.dox
+++ b/im/dox/im.dox
@@ -31,7 +31,7 @@ PROJECT_NAME           = IM
 # This could be handy for archiving the generated documentation or 
 # if some version control system is used.
 
-PROJECT_NUMBER         = 3.5
+PROJECT_NUMBER         = 3.6
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 # base path where the generated documentation will be put. 
diff --git a/im/include/im.h b/im/include/im.h
index a324199..307e0a3 100755
--- a/im/include/im.h
+++ b/im/include/im.h
@@ -235,7 +235,7 @@ int imFileWriteImageData(imFile* ifile, void* data);
  * \ingroup format */
 void imFormatRegisterInternal(void);
 
-/** Remove all registered formats.
+/** Remove all registered formats. Call this if you are checking memory leaks.
  * \ingroup format */
 void imFormatRemoveAll(void);
 
diff --git a/im/include/im_binfile.h b/im/include/im_binfile.h
index 08af47a..ffcf8da 100755
--- a/im/include/im_binfile.h
+++ b/im/include/im_binfile.h
@@ -217,7 +217,7 @@ typedef imBinFileBase* (*imBinFileNewFunc)();
  * Returns the new function set id.\n
  * Accepts up to 10 modules.
  * \ingroup binfile */
-int imBinFileRegisterModule(imBinFileNewFunc pNewFunc);
+extern "C" int imBinFileRegisterModule(imBinFileNewFunc pNewFunc);
 
 #endif
 
diff --git a/im/include/im_image.h b/im/include/im_image.h
index 12dbad8..6a325c1 100755
--- a/im/include/im_image.h
+++ b/im/include/im_image.h
@@ -103,12 +103,18 @@ imImage* imImageCreateBased(const imImage* image, int width, int height, int col
  * \ingroup imgclass */
 void imImageDestroy(imImage* image);
 
-/** Adds an alpha channel plane.
+/** Adds an alpha channel plane and sets its value to 0 (transparent).
  *
  * \verbatim image:AddAlpha() [in Lua 5] \endverbatim
  * \ingroup imgclass */
 void imImageAddAlpha(imImage* image);
 
+/** Sets the alpha channel plane to a constant.
+ *
+ * \verbatim image:SetAlpha() [in Lua 5] \endverbatim
+ * \ingroup imgclass */
+void imImageSetAlpha(imImage* image, float alpha);
+
 /** Changes the buffer size. Reallocate internal buffers if the new size is larger than the original.
  *
  * \verbatim image:Reshape(width: number, height: number) [in Lua 5] \endverbatim
@@ -129,6 +135,20 @@ void imImageCopy(const imImage* src_image, imImage* dst_image);
  * \ingroup imgclass */
 void imImageCopyData(const imImage* src_image, imImage* dst_image);
 
+/** Copies the image attributes from src to dst.
+ * Includes the pallete when a MAP or GRAY image.
+ *
+ * \verbatim image:CopyAttributes(dst_image: imImage) [in Lua 5] \endverbatim
+ * \ingroup imgclass */
+void imImageCopyAttributes(const imImage* src_image, imImage* dst_image);
+
+/** Copy one image plane fom one image to another. \n
+ * Images must have the same size and type.
+ *
+ * \verbatim image:CopyPlane(src_plane: number, dst_image: imImage, dst_plane: number) [in Lua 5] \endverbatim
+ * \ingroup imgclass */
+void imImageCopyPlane(const imImage* src_image, int src_plane, imImage* dst_image, int dst_plane);
+
 /** Creates a copy of the image.
  *
  * \verbatim image:Duplicate() -> new_image: imImage [in Lua 5] \endverbatim
@@ -190,12 +210,6 @@ int imImageIsBitmap(const imImage* image);
  * \ingroup imgclass */
 void imImageSetPalette(imImage* image, long* palette, int palette_count);
 
-/** Copies the image attributes from src to dst.
- *
- * \verbatim image:CopyAttributes(dst_image: imImage) [in Lua 5] \endverbatim
- * \ingroup imgclass */
-void imImageCopyAttributes(const imImage* src_image, imImage* dst_image);
-
 /** Returns 1 if the images match width and height. Returns 0 otherwise.
  *
  * \verbatim image:MatchSize(image2: imImage) -> match: boolean [in Lua 5] \endverbatim
diff --git a/im/include/im_lib.h b/im/include/im_lib.h
index b72b646..964faee 100755
--- a/im/include/im_lib.h
+++ b/im/include/im_lib.h
@@ -30,10 +30,10 @@ extern "C" {
  * @{
  */
 #define IM_AUTHOR "Antonio Scuri"
-#define IM_COPYRIGHT "Copyright (C) 1994-2009 Tecgraf, PUC-Rio."
-#define IM_VERSION "3.5"      /* bug fixes are reported only by imVersion functions */
-#define IM_VERSION_NUMBER 305000
-#define IM_VERSION_DATE "2009/10/02"
+#define IM_COPYRIGHT "Copyright (C) 1994-2010 Tecgraf, PUC-Rio."
+#define IM_VERSION "3.6"      /* bug fixes are reported only by imVersion functions */
+#define IM_VERSION_NUMBER 306000
+#define IM_VERSION_DATE "2010/01/26"
 #define IM_DESCRIPTION "Image Representation, Storage, Capture and Processing"
 #define IM_NAME "IM - An Imaging Toolkit"
 /** @} */
@@ -105,7 +105,7 @@ int imVersionNumber(void);
 \verbatim
 
 ****************************************************************************
-Copyright (C) 1994-2009 Tecgraf, PUC-Rio.                                
+Copyright (C) 1994-2010 Tecgraf, PUC-Rio.                                
                                                                          
 Permission is hereby granted, free of charge, to any person obtaining    
 a copy of this software and associated documentation files (the          
diff --git a/im/include/im_math.h b/im/include/im_math.h
index 8e9b3dd..1a05d3d 100755
--- a/im/include/im_math.h
+++ b/im/include/im_math.h
@@ -195,7 +195,7 @@ inline T imBilinearInterpolation(int width, int height, T *map, float xl, float
     x1 = x0 = 0; 
     t = 0;
   }
-  else if (xl > width-0.5)
+  else if (xl >= width-0.5)
   {
     x1 = x0 = width-1;
     t = 0;
@@ -212,7 +212,7 @@ inline T imBilinearInterpolation(int width, int height, T *map, float xl, float
     y1 = y0 = 0; 
     u = 0;
   }
-  else if (yl > height-0.5)
+  else if (yl >= height-0.5)
   {
     y1 = y0 = height-1;
     u = 0;
@@ -244,7 +244,7 @@ inline T imBicubicInterpolation(int width, int height, T *map, float xl, float y
   float t, u;
   (void)Dummy;
 
-  if (xl > width-0.5)
+  if (xl >= width-0.5)
   {
     X[3] = X[2] = X[1] = width-1;
     X[0] = X[1]-1;
@@ -265,7 +265,7 @@ inline T imBicubicInterpolation(int width, int height, T *map, float xl, float y
     t = xl - (X[1]+0.5f);
   }
 
-  if (yl > height-0.5)
+  if (yl >= height-0.5)
   {
     Y[3] = Y[2] = Y[1] = height-1;
     Y[0] = Y[1]-1;
diff --git a/im/include/im_process_loc.h b/im/include/im_process_loc.h
index 44e8281..14c1de5 100755
--- a/im/include/im_process_loc.h
+++ b/im/include/im_process_loc.h
@@ -17,7 +17,8 @@ extern "C" {
 
 /** \defgroup resize Image Resize
  * \par
- * Operations to change the image size.
+ * Operations to change the image size. \n
+ * All size operations include the alpha channel if any.
  * \par
  * See \ref im_process_loc.h
  * \ingroup process */
@@ -87,7 +88,8 @@ void imProcessAddMargins(const imImage* src_image, imImage* dst_image, int xmin,
 
 /** \defgroup geom Geometric Operations
  * \par
- * Operations to change the shape of the image.
+ * Operations to change the shape of the image. \n
+ * All geometric operations include the alpha channel if any.
  * \par
  * See \ref im_process_loc.h
  * \ingroup process */
diff --git a/im/include/im_process_pon.h b/im/include/im_process_pon.h
index 0611cc6..635448a 100755
--- a/im/include/im_process_pon.h
+++ b/im/include/im_process_pon.h
@@ -126,6 +126,20 @@ void imProcessBlendConst(const imImage* src_image1, const imImage* src_image2, i
  * \ingroup arithm */
 void imProcessBlend(const imImage* src_image1, const imImage* src_image2, const imImage* alpha_image, imImage* dst_image);
 
+/** Compose two images that have an alpha channel using the OVER operator. \n
+ * Can be done in place, images must match size and type. \n
+ * Integer alpha values must be:
+\verbatim 
+0 - 255        IM_BYTE  
+0 - 65535      IM_USHORT
+0 - 2147483647 IM_INT
+\endverbatim
+ * that will be normalized to 0 - 1.
+ * \verbatim im.ProcessCompose(src_image1: imImage, src_image2: imImage, dst_image: imImage) [in Lua 5] \endverbatim
+ * \verbatim im.ProcessComposeNew(image1: imImage, image2: imImage) -> new_image: imImage [in Lua 5] \endverbatim
+ * \ingroup arithm */
+void imProcessCompose(const imImage* src_image1, const imImage* src_image2, imImage* dst_image);
+
 /** Split a complex image into two images with real and imaginary parts \n
  * or magnitude and phase parts (polar). \n
  * Source image must be IM_CFLOAT, destiny images must be IM_FLOAT.
@@ -268,18 +282,18 @@ void imProcessSplitHSI(const imImage* src_image, imImage* h_image, imImage* s_im
  * \ingroup colorproc */
 void imProcessMergeHSI(const imImage* h_image, const imImage* s_image, const imImage* i_image, imImage* dst_image);
 
-/** Split a multicomponent image into separate components.\n
+/** Split a multicomponent image into separate components, including alpha.\n
  * Destiny images must be IM_GRAY. Size and data types must be all the same.\n
- * The number of destiny images must match the depth of the source image.
+ * The number of destiny images must match the depth of the source image, including alpha.
  *
  * \verbatim im.ProcessSplitComponents(src_image: imImage, dst_image_list: table of imImage) [in Lua 5] \endverbatim
  * \verbatim im.ProcessSplitComponentsNew(src_image: imImage) -> dst_image_list: table of imImage [in Lua 5] \endverbatim
  * \ingroup colorproc */
 void imProcessSplitComponents(const imImage* src_image, imImage** dst_image_list);
 
-/** Merges separate components into a multicomponent image.\n
+/** Merges separate components into a multicomponent image, including alpha.\n
  * Source images must be IM_GRAY. Size and data types must be all the same.\n
- * The number of source images must match the depth of the destiny image.
+ * The number of source images must match the depth of the destiny image, including alpha.
  *
  * \verbatim im.ProcessMergeComponents(src_image_list: table of imImage, dst_image: imImage) [in Lua 5] \endverbatim
  * \verbatim im.ProcessMergeComponentsNew(src_image_list: table of imImage) -> dst_image: imImage [in Lua 5] \endverbatim
diff --git a/im/include/imlua.h b/im/include/imlua.h
index 5714dff..ad61889 100755
--- a/im/include/imlua.h
+++ b/im/include/imlua.h
@@ -11,23 +11,13 @@
 extern "C" {
 #endif
 
-/** \defgroup imlua IM Lua 5 Binding
+/** \defgroup imlua ImLua 5 Binding Reference
  * \par
  * Binding for the Lua 5 scripting language.           \n
  * Lua 5.1 Copyright (C) 1994-2005 Lua.org, PUC-Rio    \n
  * R. Ierusalimschy, L. H. de Figueiredo & W. Celes    \n
  * http://www.lua.org
  * \par
- * The name of the functions were changed because of the namespace "im" and because of the object orientation. \n
- * As a general rule use:
-\verbatim
-    imXxx  -> im.Xxx
-    IM_XXX -> im.XXX
-    imFileXXX(ifile,... -> ifile:XXX(...
-    imImageXXX(image,... -> image:XXX(...
-\endverbatim
- * All the objects are garbage collected by the Lua garbage collector.
- * \par
  * See \ref imlua.h
  * \ingroup util */
 
@@ -44,6 +34,7 @@ void imlua_open(void);
 int imlua_open(lua_State *L);
 int luaopen_imlua(lua_State *L);
 
+#ifdef __IM_IMAGE_H  /* must include im_image.h before this */
 /** Pushes an image as a metatable on the stack.
  * \ingroup imlua */
 void imlua_pushimage(lua_State *L, imImage* image);
@@ -51,6 +42,7 @@ void imlua_pushimage(lua_State *L, imImage* image);
 /** Gets an image as a metatable from the stack, checks for correct type.
  * \ingroup imlua */
 imImage* imlua_checkimage(lua_State *L, int param);
+#endif
 
 /** Initializes the Lua binding of the capture library.  \n
  * Returns 1 (leaves the "im" table on the top of the stack).
diff --git a/im/mak.vc8/im.sln b/im/mak.vc8/im.sln
index 3860357..39a3829 100755
--- a/im/mak.vc8/im.sln
+++ b/im/mak.vc8/im.sln
@@ -159,18 +159,18 @@ Global
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
+		{CB96E607-6B6C-0000-0000-000000000000} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
+		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
+		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
+		{CB863607-6B6C-0000-0000-000000000000} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
 		{43564684-75A9-41FE-847B-BF8514C14571} = {0AB99E2F-D746-4ABC-BF14-33F6936CF927}
+		{CB863607-6B6C-0000-0000-678900001234} = {45695057-0514-4294-AE1D-15D4017F0389}
+		{CB863607-6B6C-0000-1234-000000001234} = {45695057-0514-4294-AE1D-15D4017F0389}
+		{CB863607-6B6C-0000-7689-000000001234} = {45695057-0514-4294-AE1D-15D4017F0389}
+		{CB863607-6B6C-0000-0000-000000001234} = {45695057-0514-4294-AE1D-15D4017F0389}
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5} = {F36FF650-2081-42D4-82C2-645324897900}
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912} = {F36FF650-2081-42D4-82C2-645324897900}
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B} = {F36FF650-2081-42D4-82C2-645324897900}
-		{CB863607-6B6C-0000-7689-000000001234} = {45695057-0514-4294-AE1D-15D4017F0389}
-		{CB863607-6B6C-0000-1234-000000001234} = {45695057-0514-4294-AE1D-15D4017F0389}
-		{CB863607-6B6C-0000-0000-678900001234} = {45695057-0514-4294-AE1D-15D4017F0389}
-		{CB863607-6B6C-0000-0000-000000001234} = {45695057-0514-4294-AE1D-15D4017F0389}
-		{CB863607-6B6C-0000-0000-000000000000} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
-		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
-		{CB96E607-6B6C-0000-0000-000000000000} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
-		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463} = {E23E03B7-7DFC-4A8F-B996-F0D052E8EBDD}
 	EndGlobalSection
 	GlobalSection(DevPartner Solution Properties) = postSolution
 	EndGlobalSection
diff --git a/im/mak.vc8/im_wmv.vcproj b/im/mak.vc8/im_wmv.vcproj
index 79d9234..f9c32dd 100755
--- a/im/mak.vc8/im_wmv.vcproj
+++ b/im/mak.vc8/im_wmv.vcproj
@@ -43,7 +43,7 @@
 				Name="VCCLCompilerTool"
 				Optimization="0"
 				AdditionalIncludeDirectories="../include;../src;d:\LNG\WMFSDK9\include"
-				PreprocessorDefinitions="WIN32,_DEBUG,_LIB,_CRT_SECURE_NO_DEPRECATE"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS"
 				ExceptionHandling="0"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="1"
diff --git a/im/mak.vc9/im.sln b/im/mak.vc9/im.sln
index 2a2d791..06da12a 100755
--- a/im/mak.vc9/im.sln
+++ b/im/mak.vc9/im.sln
@@ -61,6 +61,8 @@ Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
 		Debug|x64 = Debug|x64
+		DebugGTK|Win32 = DebugGTK|Win32
+		DebugGTK|x64 = DebugGTK|x64
 		Release|Win32 = Release|Win32
 		Release|x64 = Release|x64
 	EndGlobalSection
@@ -68,89 +70,132 @@ Global
 		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.Debug|Win32.ActiveCfg = Debug|Win32
 		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.Debug|Win32.Build.0 = Debug|Win32
 		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.Debug|x64.ActiveCfg = Debug|x64
+		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.DebugGTK|Win32.ActiveCfg = Debug|x64
+		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.DebugGTK|x64.ActiveCfg = Debug|x64
+		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.DebugGTK|x64.Build.0 = Debug|x64
 		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.Release|Win32.ActiveCfg = Debug|Win32
 		{5A761929-07C3-48BD-8E4A-B37EC5C72C42}.Release|x64.ActiveCfg = Debug|x64
 		{CB863607-6B6C-0000-0000-000000000000}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000000000}.Debug|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-0000-000000000000}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-0000-000000000000}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB863607-6B6C-0000-0000-000000000000}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000000000}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000000000}.Release|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000000000}.Release|x64.ActiveCfg = Debug|Win32
 		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.Debug|Win32.Build.0 = Debug|Win32
 		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB868607-6B6C-4CDF-9B6D-27AA925AE473}.Release|x64.ActiveCfg = Debug|Win32
 		{CB96E607-6B6C-0000-0000-000000000000}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB96E607-6B6C-0000-0000-000000000000}.Debug|Win32.Build.0 = Debug|Win32
 		{CB96E607-6B6C-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB96E607-6B6C-0000-0000-000000000000}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB96E607-6B6C-0000-0000-000000000000}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB96E607-6B6C-0000-0000-000000000000}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB96E607-6B6C-0000-0000-000000000000}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB96E607-6B6C-0000-0000-000000000000}.Release|x64.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.Debug|Win32.Build.0 = Debug|Win32
 		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-4ADF-9B6D-27AA925AE493}.Release|x64.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.Debug|Win32.Build.0 = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA925AE463}.Release|x64.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.Debug|Win32.Build.0 = Debug|Win32
 		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB80E607-6B6C-345F-9B6D-27AA9123E493}.Release|x64.ActiveCfg = Debug|Win32
 		{43564684-75A9-41FE-847B-BF8514C14571}.Debug|Win32.ActiveCfg = Debug|Win32
 		{43564684-75A9-41FE-847B-BF8514C14571}.Debug|Win32.Build.0 = Debug|Win32
 		{43564684-75A9-41FE-847B-BF8514C14571}.Debug|x64.ActiveCfg = Debug|Win32
+		{43564684-75A9-41FE-847B-BF8514C14571}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{43564684-75A9-41FE-847B-BF8514C14571}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{43564684-75A9-41FE-847B-BF8514C14571}.Release|Win32.ActiveCfg = Debug|Win32
 		{43564684-75A9-41FE-847B-BF8514C14571}.Release|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000001234}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000001234}.Debug|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000001234}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-0000-000000001234}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-0000-000000001234}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000001234}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000001234}.Release|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-0000-000000001234}.Release|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-678900001234}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-678900001234}.Debug|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-0000-678900001234}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-0000-678900001234}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-0000-678900001234}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-678900001234}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-0000-678900001234}.Release|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-0000-678900001234}.Release|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-1234-000000001234}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-1234-000000001234}.Debug|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-1234-000000001234}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-1234-000000001234}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-1234-000000001234}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-1234-000000001234}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-1234-000000001234}.Release|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-1234-000000001234}.Release|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-7689-000000001234}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-7689-000000001234}.Debug|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-7689-000000001234}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-7689-000000001234}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB863607-6B6C-0000-7689-000000001234}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-7689-000000001234}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB863607-6B6C-0000-7689-000000001234}.Release|Win32.Build.0 = Debug|Win32
 		{CB863607-6B6C-0000-7689-000000001234}.Release|x64.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.Debug|Win32.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.Debug|Win32.Build.0 = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.Debug|x64.ActiveCfg = Debug|Win32
+		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.Release|Win32.ActiveCfg = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.Release|Win32.Build.0 = Debug|Win32
 		{CB86E507-6B6C-4FDF-9B6D-27AA123AE463}.Release|x64.ActiveCfg = Debug|Win32
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.Debug|Win32.ActiveCfg = Debug|Win32
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.Debug|Win32.Build.0 = Debug|Win32
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.Debug|x64.ActiveCfg = Debug|Win32
+		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.Release|Win32.ActiveCfg = Debug|Win32
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.Release|Win32.Build.0 = Debug|Win32
 		{909637FA-8229-45A9-9F42-53D8ED5F91C5}.Release|x64.ActiveCfg = Debug|Win32
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.Debug|Win32.ActiveCfg = Debug|Win32
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.Debug|Win32.Build.0 = Debug|Win32
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.Debug|x64.ActiveCfg = Debug|Win32
+		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.Release|Win32.ActiveCfg = Debug|Win32
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.Release|Win32.Build.0 = Debug|Win32
 		{328002C9-0726-4BB5-AD09-1BA1DC96F912}.Release|x64.ActiveCfg = Debug|Win32
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.Debug|Win32.ActiveCfg = Debug|Win32
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.Debug|Win32.Build.0 = Debug|Win32
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.Debug|x64.ActiveCfg = Debug|Win32
+		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.DebugGTK|Win32.ActiveCfg = Debug|Win32
+		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.DebugGTK|Win32.Build.0 = Debug|Win32
+		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.DebugGTK|x64.ActiveCfg = Debug|Win32
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.Release|Win32.ActiveCfg = Debug|Win32
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.Release|Win32.Build.0 = Debug|Win32
 		{99675DC2-A7EE-4BC8-B7E7-CD437D4FAC3B}.Release|x64.ActiveCfg = Debug|Win32
diff --git a/im/mak.vc9/im_copy.vcproj b/im/mak.vc9/im_copy.vcproj
index d9bc064..c538ec6 100755
--- a/im/mak.vc9/im_copy.vcproj
+++ b/im/mak.vc9/im_copy.vcproj
@@ -69,6 +69,7 @@
 				OutputFile="$(OutDir)\$(ProjectName).exe"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="D:\LNG\WMFSDK9\lib;../lib"
+				GenerateManifest="false"
 				GenerateDebugInformation="true"
 				ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
 				SubSystem="1"
diff --git a/im/mak.vc9/im_info.vcproj b/im/mak.vc9/im_info.vcproj
index 7cdd700..398e56b 100755
--- a/im/mak.vc9/im_info.vcproj
+++ b/im/mak.vc9/im_info.vcproj
@@ -69,6 +69,7 @@
 				OutputFile="$(OutDir)\$(ProjectName).exe"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="D:\LNG\WMFSDK9\lib;../lib"
+				GenerateManifest="false"
 				GenerateDebugInformation="true"
 				ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
 				SubSystem="1"
@@ -100,16 +101,17 @@
 	<References>
 	</References>
 	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+		<File
+			RelativePath="..\test\im_info.cpp"
 			>
-			<File
-				RelativePath="..\test\im_info.cpp"
+			<FileConfiguration
+				Name="Debug|Win32"
 				>
-			</File>
-		</Filter>
+				<Tool
+					Name="VCCLCompilerTool"
+				/>
+			</FileConfiguration>
+		</File>
 	</Files>
 	<Globals>
 	</Globals>
diff --git a/im/mak.vc9/im_view.vcproj b/im/mak.vc9/im_view.vcproj
index e7642c7..6ae9671 100755
--- a/im/mak.vc9/im_view.vcproj
+++ b/im/mak.vc9/im_view.vcproj
@@ -69,6 +69,7 @@
 				OutputFile="$(OutDir)\$(ProjectName).exe"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="../lib;../../iup/lib;../../cd/lib"
+				GenerateManifest="false"
 				GenerateDebugInformation="true"
 				ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
 				SubSystem="1"
diff --git a/im/src/COPYRIGHT b/im/src/COPYRIGHT
index ca0b899..4aae86e 100755
--- a/im/src/COPYRIGHT
+++ b/im/src/COPYRIGHT
@@ -7,7 +7,7 @@ and commercial purposes at absolutely no cost.
 
 ===============================================================================
 
-Copyright (C) 1994-2009 Tecgraf, PUC-Rio.
+Copyright (C) 1994-2010 Tecgraf, PUC-Rio.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/im/src/config.mak b/im/src/config.mak
index a938100..f0b7966 100755
--- a/im/src/config.mak
+++ b/im/src/config.mak
@@ -60,7 +60,7 @@ ifneq ($(findstring Win, $(TEC_SYSNAME)), )
       USE_EXIF = Yes
     endif
 else
-    SRC += im_sysfile_unix.cpp
+  SRC += im_sysfile_unix.cpp
 endif
 
 ifdef USE_EXIF
diff --git a/im/src/im.def b/im/src/im.def
index 41aa175..9c448d5 100755
--- a/im/src/im.def
+++ b/im/src/im.def
@@ -118,8 +118,10 @@ EXPORTS
   imImageSetPalette
   imImageCopy
   imImageCopyData
+  imImageCopyPlane
   imImageCreateBased
   imImageAddAlpha
+  imImageSetAlpha
   imDibToHBitmap
   imDibLogicalPalette
   imDibCaptureScreen
diff --git a/im/src/im_binfile.cpp b/im/src/im_binfile.cpp
index 7171032..636a9a5 100755
--- a/im/src/im_binfile.cpp
+++ b/im/src/im_binfile.cpp
@@ -2,7 +2,7 @@
  * \brief Binary File Access
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_binfile.cpp,v 1.2 2009/10/01 14:15:47 scuri Exp $
+ * $Id: im_binfile.cpp,v 1.3 2010/01/26 19:13:02 scuri Exp $
  */
 
 
@@ -499,7 +499,7 @@ int imBinFileSetCurrentModule(int pModule)
   return old_module;
 }
 
-int imBinFileRegisterModule(imBinFileNewFunc pNewFunc)
+extern "C" int imBinFileRegisterModule(imBinFileNewFunc pNewFunc)
 {
   if (iBinFileModuleCount == MAX_MODULES) return -1;
   int id = iBinFileModuleCount;
diff --git a/im/src/im_dib.cpp b/im/src/im_dib.cpp
index 3dd6780..4057f3e 100755
--- a/im/src/im_dib.cpp
+++ b/im/src/im_dib.cpp
@@ -2,7 +2,7 @@
  * \brief Windows DIB
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_dib.cpp,v 1.1 2008/10/17 06:10:16 scuri Exp $
+ * $Id: im_dib.cpp,v 1.2 2010/01/26 18:06:01 scuri Exp $
  */
 
 
@@ -964,7 +964,7 @@ void imDibDecodeToMap(const imDib* dib, unsigned char* map, long* palette)
   DIB <-> File
 *******************/
 
-int imDibSaveFile(const imDib* dib, char* filename)
+int imDibSaveFile(const imDib* dib, const char* filename)
 { 
   DWORD dwTmp; 
   HANDLE hFile;                 /* file handle */ 
diff --git a/im/src/im_file.cpp b/im/src/im_file.cpp
index 3bfa779..9a4519a 100755
--- a/im/src/im_file.cpp
+++ b/im/src/im_file.cpp
@@ -2,7 +2,7 @@
  * \brief File Access
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_file.cpp,v 1.5 2009/08/23 23:57:51 scuri Exp $
+ * $Id: im_file.cpp,v 1.6 2009/11/23 17:13:05 scuri Exp $
  */
 
 #include <stdlib.h>
@@ -125,6 +125,7 @@ void imFileClose(imFile* ifile)
   if (ifile->line_buffer) free(ifile->line_buffer);
   
   delete attrib_table;
+  delete ifileformat;
 }
 
 void* imFileHandle(imFile* ifile, int index)
diff --git a/im/src/im_format.cpp b/im/src/im_format.cpp
index d389743..ad04a3b 100755
--- a/im/src/im_format.cpp
+++ b/im/src/im_format.cpp
@@ -2,7 +2,7 @@
  * \brief File Format Access
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_format.cpp,v 1.2 2008/12/03 15:45:34 scuri Exp $
+ * $Id: im_format.cpp,v 1.3 2009/11/23 17:13:05 scuri Exp $
  */
 
 
@@ -194,7 +194,7 @@ imFileFormatBase* imFileFormatBaseOpen(const char* file_name, int *error)
         imFileFormatBase* ifileformat = iformat->Create();
         *error = ifileformat->Open(file_name);                                               
         if (*error != IM_ERR_NONE && *error != IM_ERR_FORMAT)  // Error situation that must abort
-        {                                                      // Only IM_ERR_FORMAT is a valid error here
+        {                                                      // Only IM_ERR_FORMAT is considered here
           free(extension);
           delete [] ext_mark;
           delete ifileformat;
@@ -206,6 +206,11 @@ imFileFormatBase* imFileFormatBaseOpen(const char* file_name, int *error)
           delete [] ext_mark;
           return ifileformat;
         }
+        else
+        {
+          /* Other errors, release the format and test another one */
+          delete ifileformat;
+        }
       }
     }
 
@@ -233,6 +238,11 @@ imFileFormatBase* imFileFormatBaseOpen(const char* file_name, int *error)
         delete [] ext_mark;
         return ifileformat;
       }
+      else
+      {
+        /* Other errors, release the format and test another one */
+        delete ifileformat;
+      }
     }
   }
 
@@ -269,9 +279,12 @@ imFileFormatBase* imFileFormatBaseOpenAs(const char* file_name, const char* form
   }
   else if (*error == IM_ERR_NONE) // Sucessfully oppened the file
     return ifileformat;
-
-  *error = IM_ERR_FORMAT;
-  return NULL;
+  else
+  {
+    *error = IM_ERR_FORMAT;
+    delete ifileformat;
+    return NULL;
+  }
 }
 
 imFileFormatBase* imFileFormatBaseNew(const char* file_name, const char* format, int *error)
diff --git a/im/src/im_image.cpp b/im/src/im_image.cpp
index 1fb993d..5f865f8 100755
--- a/im/src/im_image.cpp
+++ b/im/src/im_image.cpp
@@ -2,7 +2,7 @@
  * \brief Image Manipulation
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_image.cpp,v 1.4 2009/08/13 22:34:25 scuri Exp $
+ * $Id: im_image.cpp,v 1.7 2010/01/17 18:18:12 scuri Exp $
  */
 
 #include <stdlib.h>
@@ -273,6 +273,39 @@ void imImageClear(imImage* image)
     memset(image->data[image->depth], 0, image->plane_size);
 }
 
+template <class T> 
+inline void iSet(T *map, T value, int count)
+{
+  for (int i = 0; i < count; i++)
+  {
+    *map++ = value;
+  }
+}
+  
+void imImageSetAlpha(imImage* image, float alpha)
+{
+  assert(image);
+
+  if (image->has_alpha)
+  {
+    switch(image->data_type)
+    {
+    case IM_BYTE:
+      memset(image->data[image->depth], (imbyte)alpha, image->plane_size);
+      break;                                                                                
+    case IM_USHORT:                                                                           
+      iSet((imushort*)image->data[image->depth], (imushort)alpha, image->plane_size);
+      break;                                                                                
+    case IM_INT:                                                                           
+      iSet((int*)image->data[image->depth], (int)alpha, image->plane_size);
+      break;                                                                                
+    case IM_FLOAT:                                                                           
+      iSet((float*)image->data[image->depth], (float)alpha, image->plane_size);
+      break;                                                                                
+    }
+  }
+}
+
 int imImageIsBitmap(const imImage* image)
 {
   assert(image);
@@ -302,6 +335,15 @@ void imImageCopyData(const imImage* src_image, imImage* dst_image)
   }
 }
 
+void imImageCopyPlane(const imImage* src_image, int src_plane, imImage* dst_image, int dst_plane)
+{
+  assert(src_image);
+  assert(dst_image);
+  assert(imImageMatchDataType(src_image, dst_image));
+
+  memcpy(dst_image->data[dst_plane], src_image->data[src_plane], src_image->plane_size);
+}
+
 imImage* imImageDuplicate(const imImage* image)
 {
   assert(image);
diff --git a/im/src/im_lib.cpp b/im/src/im_lib.cpp
index 05a71d8..4860ea7 100755
--- a/im/src/im_lib.cpp
+++ b/im/src/im_lib.cpp
@@ -2,7 +2,7 @@
  * \brief Library Management
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_lib.cpp,v 1.5 2009/10/01 14:43:42 scuri Exp $
+ * $Id: im_lib.cpp,v 1.6 2010/04/23 17:45:44 scuri Exp $
  */
 
 #include <stdlib.h>
@@ -11,8 +11,8 @@
 #include "im_lib.h"
 
 /* This appears only here to avoid changing the im_lib.h header for bug fixes */
-#define IM_VERSION_FIX ""
-#define IM_VERSION_FIX_NUMBER 0
+#define IM_VERSION_FIX ".1"
+#define IM_VERSION_FIX_NUMBER 1
 
 static char *iVersion = "TECVERID.str:IM:LIB:" IM_VERSION IM_VERSION_FIX;
 
diff --git a/im/src/im_process.def b/im/src/im_process.def
index 07bba47..7e637e9 100755
--- a/im/src/im_process.def
+++ b/im/src/im_process.def
@@ -73,6 +73,7 @@ EXPORTS
   imProcessBitwiseOp
   imProcessBlendConst
   imProcessBlend
+  imProcessCompose
   imProcessCalcRotateSize
   imProcessDifusionErrThreshold
   imProcessDirectConv
diff --git a/im/src/lua5/clua/im_process.clua b/im/src/lua5/clua/im_process.clua
index b5274f7..bb91893 100644
--- a/im/src/lua5/clua/im_process.clua
+++ b/im/src/lua5/clua/im_process.clua
@@ -605,192 +605,194 @@ static const unsigned char B1[] = {
 	0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x43, 
 	0x6f, 0x6e, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x6f, 0x75, 0x72, 
 	0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 
-	0x65, 0x73, 0x73, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 
-	0x75, 0x72, 0x63, 0x65, 0x54, 0x77, 0x6f, 0x44, 0x65, 0x73, 0x74, 0x73, 0x28, 0x22, 0x50, 0x72, 
-	0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 
-	0x78, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 
-	0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 
-	0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
-	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x43, 
-	0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
-	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 
-	0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 
-	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 
-	0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 
-	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 
-	0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 
-	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 
-	0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 
-	0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 
-	0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 
-	0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 
-	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 
-	0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 
-	0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x4e, 
-	0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 
-	0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 
-	0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
-	0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 
-	0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
-	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 
-	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 
-	0x74, 0x64, 0x44, 0x65, 0x76, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 
-	0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 
-	0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 
-	0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 
-	0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 
-	0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x41, 
-	0x75, 0x74, 0x6f, 0x43, 0x6f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x29, 0x0a, 
-	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 
-	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 
-	0x79, 0x43, 0x6f, 0x6e, 0x6a, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 
-	0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 
-	0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x52, 0x47, 0x42, 0x55, 0x6e, 0x69, 0x66, 
-	0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
-	0x69, 0x6d, 0x2e, 0x4d, 0x41, 0x50, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 
-	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 
-	0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x47, 0x72, 
-	0x61, 0x79, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
-	0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 
-	0x67, 0x72, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
-	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 
-	0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 
-	0x6d, 0x22, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 
-	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x59, 0x43, 0x68, 
-	0x72, 0x6f, 0x6d, 0x61, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 
-	0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x5f, 0x69, 0x6d, 
-	0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 
-	0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 
-	0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 
-	0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 
-	0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 
-	0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 
-	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 
-	0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 
-	0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 
-	0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 
-	0x6c, 0x69, 0x74, 0x59, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 
-	0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 
-	0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 
-	0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 
-	0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 
-	0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x44, 
-	0x65, 0x73, 0x74, 0x73, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 
-	0x69, 0x74, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
-	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x46, 0x4c, 
-	0x4f, 0x41, 0x54, 0x29, 0x0a, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
-	0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 
-	0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 
-	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x69, 0x6d, 
-	0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
-	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 
-	0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 
-	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 
-	0x6c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 
-	0x61, 0x67, 0x65, 0x3a, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 
-	0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x3d, 
-	0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 
-	0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 
-	0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x64, 0x73, 0x74, 0x5f, 0x69, 
-	0x6d, 0x61, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 
-	0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 
-	0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
-	0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 
-	0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 
-	0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x73, 0x72, 0x63, 0x5f, 
-	0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 
-	0x73, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x70, 0x61, 
-	0x63, 0x6b, 0x28, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x29, 0x0a, 0x65, 
-	0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 
-	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 
-	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 
-	0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 
+	0x65, 0x73, 0x73, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 
+	0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x4f, 
+	0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x77, 0x6f, 0x44, 0x65, 0x73, 0x74, 0x73, 
+	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 
+	0x6d, 0x70, 0x6c, 0x65, 0x78, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 
+	0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 
+	0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x22, 0x2c, 
+	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
+	0x69, 0x6d, 0x2e, 0x43, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 
+	0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 
+	0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x4e, 0x65, 0x77, 0x20, 0x28, 
+	0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 
+	0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 
 	0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 
 	0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 
 	0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 
-	0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
-	0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 
-	0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 
-	0x6e, 0x74, 0x73, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 
-	0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 
-	0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
-	0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
+	0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 
+	0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x28, 0x73, 
+	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 
+	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 
+	0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 
+	0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x64, 
+	0x44, 0x65, 0x76, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
+	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6d, 0x61, 
+	0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 
+	0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 
+	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 
+	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 
+	0x70, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 
+	0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 
+	0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 
+	0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 
+	0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 
+	0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 
+	0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x63, 
+	0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 
+	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 
+	0x74, 0x69, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x6a, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 
+	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x52, 0x47, 0x42, 
+	0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x4d, 0x41, 0x50, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 
+	0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 
+	0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 
+	0x7a, 0x65, 0x47, 0x72, 0x61, 0x79, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x29, 0x0a, 
+	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 
+	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x48, 
+	0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 
+	0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 
+	0x63, 0x65, 0x73, 0x73, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x48, 0x69, 0x73, 0x74, 
+	0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
+	0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 
+	0x74, 0x59, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 
+	0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 
+	0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 
+	0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 
+	0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 
+	0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 
+	0x59, 0x54, 0x45, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x72, 
+	0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 
+	0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 
+	0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
+	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 
+	0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 
+	0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x59, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x28, 0x73, 
+	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
+	0x65, 0x2c, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 
+	0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
+	0x65, 0x2c, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 
+	0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x68, 
+	0x72, 0x65, 0x65, 0x44, 0x65, 0x73, 0x74, 0x73, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 
+	0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 
+	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 
+	0x6d, 0x2e, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x6f, 
+	0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 
+	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 
+	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 
+	0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 
+	0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 
+	0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 
+	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x72, 
+	0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x29, 0x0a, 
+	0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
+	0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 
+	0x3d, 0x20, 0x31, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 
+	0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x64, 
+	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 
+	0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 
+	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x29, 0x29, 0x0a, 0x20, 0x20, 
+	0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 
+	0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 
+	0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 
+	0x6d, 0x61, 0x67, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 
+	0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 
+	0x73, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
+	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 
+	0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 
+	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 
+	0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 
+	0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 
+	0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 
+	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 
+	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 
+	0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
+	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 
+	0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 
+	0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 
+	0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 
+	0x63, 0x65, 0x73, 0x73, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, 
+	0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x46, 0x4c, 0x4f, 0x41, 
+	0x54, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 
+	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 
+	0x61, 0x63, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 
+	0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x4f, 0x70, 0x22, 0x29, 
+	0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 
+	0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 
+	0x65, 0x4e, 0x6f, 0x74, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
 	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 
-	0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 
-	0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
-	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x4f, 
-	0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 
-	0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 
-	0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
-	0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 
-	0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x4f, 0x70, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 
-	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 
-	0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x4e, 0x6f, 0x74, 
-	0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 
-	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x4d, 
-	0x61, 0x73, 0x6b, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 
-	0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 
-	0x69, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 
+	0x42, 0x69, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 
 	0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 
-	0x65, 0x73, 0x73, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x61, 0x6d, 0x75, 0x74, 0x22, 0x29, 0x0a, 0x4f, 
-	0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 
-	0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 
-	0x69, 0x7a, 0x65, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
-	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x4f, 0x6e, 
+	0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 
 	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 
-	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 
-	0x76, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 
-	0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
-	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x0a, 
+	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x61, 0x6d, 0x75, 0x74, 
+	0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 
+	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x4e, 0x6f, 
+	0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 
+	0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 
+	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 
+	0x74, 0x43, 0x6f, 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
+	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 
 	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 
-	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 
-	0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 
-	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 
-	0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
-	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 
-	0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 
-	0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 
-	0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 
-	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x68, 0x72, 0x65, 
-	0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
-	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
-	0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 
-	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x68, 0x72, 0x65, 
-	0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x79, 0x44, 0x69, 0x66, 0x66, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 
-	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 
-	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 
-	0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
-	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 
-	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
-	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 
-	0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x72, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 
+	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 
+	0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 
+	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e, 
+	0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 
 	0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
 	0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 
 	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 
-	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x66, 0x75, 0x73, 0x69, 0x6f, 
-	0x6e, 0x45, 0x72, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a, 
+	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61, 
+	0x78, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
+	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 
+	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 
+	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 
+	0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 
+	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 
+	0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 
+	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 
+	0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x79, 0x44, 0x69, 0x66, 0x66, 0x22, 
+	0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 
+	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x79, 0x73, 0x74, 0x65, 
+	0x72, 0x65, 0x73, 0x69, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 
+	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 
+	0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 
+	0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 
+	0x63, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x72, 0x72, 0x54, 0x68, 
+	0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 
+	0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 
+	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x66, 
+	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 
+	0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 
+	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 
+	0x63, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a, 
 	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 
-	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 
-	0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 
-	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4f, 0x74, 0x73, 0x75, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 
-	0x6c, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 
-	0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x69, 
-	0x6e, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 
-	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 
-	0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 
-	0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 
-	0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 
+	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4f, 0x74, 0x73, 0x75, 0x54, 0x68, 0x72, 
+	0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 
+	0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 
+	0x73, 0x73, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 
 	0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 
 	0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 
 	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 
-	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x22, 
+	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 
+	0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
+	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 
 	0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 
-	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x73, 0x74, 0x65, 
-	0x72, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x0a, 0x0a, 
+	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x69, 0x78, 0x65, 0x6c, 
+	0x61, 0x74, 0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 
+	0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 
+	0x6f, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x0a, 0x0a, 
 };
 
  if (luaL_loadbuffer(L, (const char *)B1, sizeof(B1), "im_process.lua") == 0) lua_call(L, 0, 0);
diff --git a/im/src/lua5/im_process.lua b/im/src/lua5/im_process.lua
index eefac4b..5c73b29 100755
--- a/im/src/lua5/im_process.lua
+++ b/im/src/lua5/im_process.lua
@@ -255,6 +255,7 @@ end
 
 TwoSourcesOneDest("ProcessBlendConst")
 ThreeSourcesOneDest("ProcessBlend")
+TwoSourcesOneDest("ProcessCompose")
 OneSourceTwoDests("ProcessSplitComplex")
 TwoSourcesOneDest("ProcessMergeComplex", nil, nil, nil, im.CFLOAT)
 
diff --git a/im/src/lua5/imlua_aux.c b/im/src/lua5/imlua_aux.c
index e472dca..b26df93 100755
--- a/im/src/lua5/imlua_aux.c
+++ b/im/src/lua5/imlua_aux.c
@@ -2,7 +2,7 @@
  * \brief IM Lua 5 Binding
  *
  * See Copyright Notice in im_lib.h
- * $Id: imlua_aux.c,v 1.2 2009/08/04 21:35:26 scuri Exp $
+ * $Id: imlua_aux.c,v 1.3 2010/01/21 18:24:22 scuri Exp $
  */
 
 #include <memory.h>
@@ -46,7 +46,7 @@ int imlua_newarrayint (lua_State *L, int *value, int count, int start)
   lua_newtable(L);
   for (i = 0; i < count; i++)
   {
-    lua_pushnumber(L, value[i]);
+    lua_pushinteger(L, value[i]);
     lua_rawseti(L, -2, i+start);
   }
   return 1;
diff --git a/im/src/lua5/imlua_image.c b/im/src/lua5/imlua_image.c
index 55dcc82..0e8676d 100755
--- a/im/src/lua5/imlua_image.c
+++ b/im/src/lua5/imlua_image.c
@@ -2,7 +2,7 @@
  * \brief IM Lua 5 Binding
  *
  * See Copyright Notice in im_lib.h
- * $Id: imlua_image.c,v 1.5 2009/09/25 18:40:31 scuri Exp $
+ * $Id: imlua_image.c,v 1.9 2010/01/17 18:18:12 scuri Exp $
  */
 
 #include <string.h>
@@ -127,6 +127,15 @@ static int imluaImageAddAlpha (lua_State *L)
   return 0;
 }
 
+/*****************************************************************************\
+ image:SetAlpha()
+\*****************************************************************************/
+static int imluaImageSetAlpha (lua_State *L)
+{
+  imImageSetAlpha(imlua_checkimage(L, 1), (float)luaL_checknumber(L, 2));
+  return 0;
+}
+
 /*****************************************************************************\
  image:Reshape()
 \*****************************************************************************/
@@ -166,6 +175,31 @@ static int imluaImageCopyData (lua_State *L)
   return 0;
 }
 
+/*****************************************************************************\
+ image:CopyPlane()
+\*****************************************************************************/
+static int imluaImageCopyPlane(lua_State *L)
+{
+  imImage* src_image = imlua_checkimage(L, 1);
+  int src_plane = luaL_checkint(L, 2);
+  imImage* dst_image = imlua_checkimage(L, 3);
+  int dst_plane = luaL_checkint(L, 4);
+  int src_depth, dst_depth;
+
+  imlua_matchdatatype(L, src_image, dst_image);
+
+  src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  if (src_plane < 0 || src_plane >= src_depth)
+    luaL_argerror(L, 2, "invalid source channel, out of bounds");
+
+  dst_depth = dst_image->has_alpha? dst_image->depth+1: dst_image->depth;
+  if (dst_plane < 0 || dst_plane >= dst_depth)
+    luaL_argerror(L, 4, "invalid destiny channel, out of bounds");
+
+  imImageCopyPlane(src_image, src_plane, dst_image, dst_plane);
+  return 0;
+}
+
 /*****************************************************************************\
  image:Duplicate()
 \*****************************************************************************/
@@ -751,13 +785,14 @@ static int imluaImage_tostring (lua_State *L)
   if (*image_p)
   {
     imImage *image = *image_p;
-    lua_pushfstring(L, "imImage(%p) [width=%d,height=%d,color_space=%s,data_type=%s,depth=%d]", 
+    lua_pushfstring(L, "imImage(%p) [width=%d,height=%d,color_space=%s,data_type=%s,depth=%d,has_alpha=%d]", 
       image_p,
       image->width, 
       image->height,
       imColorModeSpaceName(image->color_space),
       imDataTypeName(image->data_type),
-      image->depth
+      image->depth,
+      image->has_alpha
     );
   }
   else
@@ -956,7 +991,8 @@ static int imluaImage_index (lua_State *L)
     int channel = luaL_checkint(L, 2);
 
     /* create channel */
-    if (channel < 0 || channel >= image->depth)
+    int depth = image->has_alpha? image->depth+1: image->depth;
+    if (channel < 0 || channel >= depth)
       luaL_argerror(L, 2, "invalid channel, out of bounds");
 
     imlua_newimagechannel(L, image, channel);
@@ -989,9 +1025,11 @@ static const luaL_reg imimage_lib[] = {
 static const luaL_reg imimage_metalib[] = {
   {"Destroy", imluaImageDestroy},
   {"AddAlpha", imluaImageAddAlpha},
+  {"SetAlpha", imluaImageSetAlpha},
   {"Reshape", imluaImageReshape},
   {"Copy", imluaImageCopy},
   {"CopyData", imluaImageCopyData},
+  {"CopyPlane", imluaImageCopyPlane},
   {"Duplicate", imluaImageDuplicate},
   {"Clone", imluaImageClone},
   {"SetAttribute", imluaImageSetAttribute},
diff --git a/im/src/lua5/imlua_process.c b/im/src/lua5/imlua_process.c
index 38d39e9..978428b 100755
--- a/im/src/lua5/imlua_process.c
+++ b/im/src/lua5/imlua_process.c
@@ -2,7 +2,7 @@
  * \brief IM Lua 5 Binding
  *
  * See Copyright Notice in im_lib.h
- * $Id: imlua_process.c,v 1.8 2009/10/01 02:56:58 scuri Exp $
+ * $Id: imlua_process.c,v 1.11 2010/03/21 22:29:10 scuri Exp $
  */
 
 #include <memory.h>
@@ -1702,6 +1702,22 @@ static int imluaProcessBlend (lua_State *L)
   return 0;
 }
 
+/*****************************************************************************\
+ im.ProcessCompose
+\*****************************************************************************/
+static int imluaProcessCompose(lua_State *L)
+{
+  imImage *src_image1 = imlua_checkimage(L, 1);
+  imImage *src_image2 = imlua_checkimage(L, 2);
+  imImage *dst_image = imlua_checkimage(L, 3);
+
+  imlua_match(L, src_image1, src_image2);
+  imlua_match(L, src_image1, dst_image);
+
+  imProcessCompose(src_image1, src_image2, dst_image);
+  return 0;
+}
+
 /*****************************************************************************\
  im.ProcessSplitComplex
 \*****************************************************************************/
@@ -2009,18 +2025,19 @@ static int imluaProcessMergeHSI (lua_State *L)
 \*****************************************************************************/
 static int imluaProcessSplitComponents (lua_State *L)
 {
-  int i;
+  int i, src_depth;
   imImage *src_image = imlua_checkimage(L, 1);
   imImage **dst_image_list;
 
   luaL_checktype(L, 2, LUA_TTABLE);
 
-  if (imlua_getn(L, 2) != src_image->depth)
+  src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  if (imlua_getn(L, 2) != src_depth)
     luaL_error(L, "number of destiny images must match the depth of the source image");
 
-  dst_image_list = (imImage**)malloc(sizeof(imImage*)*src_image->depth);
+  dst_image_list = (imImage**)malloc(sizeof(imImage*)*src_depth);
 
-  for (i = 0; i < src_image->depth; i++)
+  for (i = 0; i < src_depth; i++)
   {
     lua_pushnumber(L, i+1);
     lua_gettable(L, 2);
@@ -2029,7 +2046,7 @@ static int imluaProcessSplitComponents (lua_State *L)
     lua_pop(L, 1);
   }
 
-  for (i = 0; i < src_image->depth; i++)
+  for (i = 0; i < src_depth; i++)
   {
     int check = imImageMatchDataType(src_image, dst_image_list[i]);
     if (!check) free(dst_image_list);
@@ -2048,19 +2065,20 @@ static int imluaProcessSplitComponents (lua_State *L)
 \*****************************************************************************/
 static int imluaProcessMergeComponents (lua_State *L)
 {
-  int i;
+  int i, dst_depth;
   imImage** src_image_list;
   imImage *dst_image;
 
   luaL_checktype(L, 1, LUA_TTABLE);
   dst_image = imlua_checkimage(L, 2);
 
-  if (imlua_getn(L, 1) != dst_image->depth)
+  dst_depth = dst_image->has_alpha? dst_image->depth+1: dst_image->depth;
+  if (imlua_getn(L, 1) != dst_depth)
     luaL_error(L, "number of source images must match the depth of the destination image");
 
-  src_image_list = (imImage**)malloc(sizeof(imImage*)*dst_image->depth);
+  src_image_list = (imImage**)malloc(sizeof(imImage*)*dst_depth);
 
-  for (i = 0; i < dst_image->depth; i++)
+  for (i = 0; i < dst_depth; i++)
   {
     lua_pushnumber(L, i+1);
     lua_gettable(L, 1);
@@ -2069,7 +2087,7 @@ static int imluaProcessMergeComponents (lua_State *L)
     lua_pop(L, 1);
   }
 
-  for (i = 0; i < dst_image->depth; i++)
+  for (i = 0; i < dst_depth; i++)
   {
     int check = imImageMatchDataType(src_image_list[i], dst_image);
     if (!check) free(src_image_list);
@@ -2988,6 +3006,7 @@ static const luaL_reg improcess_lib[] = {
   {"ProcessArithmeticConstOp", imluaProcessArithmeticConstOp},
   {"ProcessBlendConst", imluaProcessBlendConst},
   {"ProcessBlend", imluaProcessBlend},
+  {"ProcessCompose", imluaProcessCompose},
   {"ProcessSplitComplex", imluaProcessSplitComplex},
   {"ProcessMergeComplex", imluaProcessMergeComplex},
   {"ProcessMultipleMean", imluaProcessMultipleMean},
diff --git a/im/src/process/im_analyze.cpp b/im/src/process/im_analyze.cpp
index 6fa9405..5a775a0 100755
--- a/im/src/process/im_analyze.cpp
+++ b/im/src/process/im_analyze.cpp
@@ -2,7 +2,7 @@
  * \brief Image Analysis
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_analyze.cpp,v 1.2 2009/09/28 20:19:09 scuri Exp $
+ * $Id: im_analyze.cpp,v 1.5 2010/01/22 19:47:56 scuri Exp $
  */
 
 
@@ -139,7 +139,7 @@ static int DoAnalyzeFindRegions(int width, int height, imbyte* map, imushort* ne
 
   int region_count = 2;  // 0- background, 1-border
   imushort* alias_table = new imushort [MAX_COUNT];
-  memset(alias_table, 0, MAX_COUNT); // aliases are all zero at start (not used)
+  memset(alias_table, 0, MAX_COUNT*sizeof(imushort)); // aliases are all zero at start (not used)
 
   for (i = 1; i < height; i++)
   {
@@ -273,7 +273,7 @@ static int DoAnalyzeFindRegionsBorder(int width, int height, imbyte* map, imusho
 
   int region_count = 2;  // still consider: 0- background, 1-border
   imushort* alias_table = new imushort [MAX_COUNT];
-  memset(alias_table, 0, MAX_COUNT); // aliases are all zero at start (not used)
+  memset(alias_table, 0, MAX_COUNT*sizeof(imushort)); // aliases are all zero at start (not used)
 
   for (i = 0; i < height; i++)
   {
@@ -981,7 +981,7 @@ void imAnalyzeMeasurePerimeter(const imImage* image, float* perim_data, int regi
 
   imushort* map = (imushort*)image->data[0];
 
-  memset(perim_data, 0, region_count*sizeof(int));
+  memset(perim_data, 0, region_count*sizeof(float));
 
   int width = image->width;
   int height = image->height;
@@ -1203,8 +1203,19 @@ void imProcessRemoveByArea(const imImage* image, imImage* NewImage, int connect,
   if (end_size == 0)
     end_size = image->width*image->height;
 
-  int outside=0;
-  if (!inside) outside = 1;
+  int outside;
+  if (inside)
+  {
+    /* remove from inside */
+    inside = 0;
+    outside = 1;
+  }
+  else
+  {
+    /* remove from outside */
+    inside = 1;
+    outside = 0;
+  }
 
   int* area_data = (int*)malloc(region_count*sizeof(int));
   imAnalyzeMeasureArea(region_image, area_data, region_count);
diff --git a/im/src/process/im_arithmetic_bin.cpp b/im/src/process/im_arithmetic_bin.cpp
index 494b6c0..575e650 100755
--- a/im/src/process/im_arithmetic_bin.cpp
+++ b/im/src/process/im_arithmetic_bin.cpp
@@ -2,7 +2,7 @@
  * \brief Binary Arithmetic Operations
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_arithmetic_bin.cpp,v 1.2 2009/10/01 02:56:58 scuri Exp $
+ * $Id: im_arithmetic_bin.cpp,v 1.3 2010/01/08 03:49:05 scuri Exp $
  */
 
 
@@ -262,6 +262,148 @@ void imProcessBlend(const imImage* src_image1, const imImage* src_image2, const
   }
 }
 
+#define COMPOSE_OVER(_SRC, _SRC_ALPHA, _DST, _TMP_MULTI, _TMP_ALPHA) (T)(((_SRC_ALPHA)*(_SRC) + (_TMP_MULTI)*(_DST)) / (_TMP_ALPHA))
+#define ALPHA_BLEND(_src,_dst,_alpha) (T)(((_src) * (_alpha) + (_dst) * (max - (_alpha))) / max)
+
+template <class T, class TA>
+static inline T compose_op(const T& v1, const T& v2, const T& alpha1, const T& alpha2, const TA& max)
+{
+  if (alpha1 != max)   /* some transparency */                                                                     
+  {                                                                                                                    
+    if (alpha1 != 0) /* source not full transparent */                                                             
+    {                                                                                                                  
+      if (alpha2 == 0) /* destiny full transparent */                                                            
+      {                                                                                                                
+        return v1;                                                                                           
+      }                                                                                                                
+      else if (alpha2 == max) /* destiny opaque */                                                               
+      {                                                                                                                
+        return ALPHA_BLEND(v1, v2, alpha1);                                                   
+      }                                                                                                                
+      else /* (0<alpha2<max && 0<alpha1<max) destiny and source are semi-transparent */                      
+      {                                                                                                                
+        /* Closed Compositing SRC over DST  (see smith95a.pdf)        */                                               
+        /* Colors NOT Premultiplied by Alpha                          */                                               
+        /* DST = SRC * SRC_ALPHA + DST * DST_ALPHA * (1 - SRC_ALPHA)  */                                               
+        /* DST_ALPHA = SRC_ALPHA + DST_ALPHA * (1 - SRC_ALPHA)        */                                               
+        /* DST /= DST_ALPHA */                                                                                         
+        TA _tmp_multi = alpha2 * (max - alpha1);                                                            
+        TA _tmp_src_alpha = alpha1*max;                                                                           
+        TA _tmp_alpha = _tmp_src_alpha + _tmp_multi;                                                                  
+        return COMPOSE_OVER(v1, _tmp_src_alpha, v2, _tmp_multi, _tmp_alpha);                     
+      }                                                                                                                
+    }                                                                                                                  
+    else  /* (alpha1 == 0) source full transparent */                                                              
+    {                                                                                                                  
+      return v2;                                                                                           
+    }                                                                                                                  
+  }                                                                                                                    
+  else  /* (alpha1 == max) source has no alpha = opaque */                                                         
+  {                                                                                                                    
+    return v1;                                                                                               
+  }                                                                                                                    
+}
+
+template <class T, class TA>
+static inline T compose_alpha_op(const T& alpha1, const T& alpha2, const TA& max)
+{
+  if (alpha1 != max)   /* some transparency */                                                                     
+  {                                                                                                                    
+    if (alpha1 != 0) /* source not full transparent */                                                             
+    {                                                                                                                  
+      if (alpha2 == 0) /* destiny full transparent */                                                            
+      {                                                                                                                
+        return alpha1;                                                                                     
+      }                                                                                                                
+      else if (alpha2 == max) /* destiny opaque */                                                               
+      {                                                                                                                
+        /* alpha2 is not changed */                                                                              
+        return alpha2;
+      }                                                                                                                
+      else /* (0<alpha2<max && 0<alpha1<max) destiny and source are semi-transparent */                      
+      {                                                                                                                
+        /* Closed Compositing SRC over DST  (see smith95a.pdf)        */                                               
+        /* Colors NOT Premultiplied by Alpha                          */                                               
+        /* DST = SRC * SRC_ALPHA + DST * DST_ALPHA * (1 - SRC_ALPHA)  */                                               
+        /* DST_ALPHA = SRC_ALPHA + DST_ALPHA * (1 - SRC_ALPHA)        */                                               
+        /* DST /= DST_ALPHA */                                                                                         
+        TA _tmp_multi = alpha2 * (max - alpha1);                                                            
+        TA _tmp_src_alpha = alpha1*max;                                                                           
+        TA _tmp_alpha = _tmp_src_alpha + _tmp_multi;                                                                  
+        return (T)(_tmp_alpha / max);
+      }                                                                                                                
+    }                                                                                                                  
+    else  /* (alpha1 == 0) source full transparent */                                                              
+    {                                                                                                                  
+      /* alpha2 is not changed */                                                                                
+      return alpha2;
+    }                                                                                                                  
+  }                                                                                                                    
+  else  /* (alpha1 == max) source has no alpha = opaque */                                                         
+  {                                                                                                                    
+    return (unsigned char)max;   /* set destiny as opaque */                                                   
+  }                                                                                                                    
+}
+
+template <class T, class TA> 
+static void DoCompose(T *map1, T *map2, T *alpha1, T *alpha2, T *map, int count, TA max)
+{
+  for (int i = 0; i < count; i++)
+    map[i] = compose_op(map1[i], map2[i], alpha1[i], alpha2[i], max);
+}
+
+template <class T, class TA> 
+static void DoComposeAlpha(T *alpha1, T *alpha2, T *dst_alpha, int count, TA max)
+{
+  for (int i = 0; i < count; i++)
+    dst_alpha[i] = compose_alpha_op(alpha1[i], alpha2[i], max);
+}
+
+void imProcessCompose(const imImage* src_image1, const imImage* src_image2, imImage* dst_image)
+{
+  int count = src_image1->count, 
+      src_alpha = src_image1->depth;
+
+  if (!src_image1->has_alpha || !src_image2->has_alpha || !dst_image->has_alpha)
+    return;
+
+  for (int i = 0; i < src_image1->depth; i++)
+  {
+    switch(src_image1->data_type)
+    {
+    case IM_BYTE:
+      DoCompose((imbyte*)src_image1->data[i], (imbyte*)src_image2->data[i], (imbyte*)src_image1->data[src_alpha], (imbyte*)src_image2->data[src_alpha], (imbyte*)dst_image->data[i], count, (int)255);
+      break;
+    case IM_USHORT:
+      DoCompose((imushort*)src_image1->data[i], (imushort*)src_image2->data[i], (imushort*)src_image1->data[src_alpha], (imushort*)src_image2->data[src_alpha], (imushort*)dst_image->data[i], count, (int)65535);
+      break;
+    case IM_INT:
+      DoCompose((int*)src_image1->data[i], (int*)src_image2->data[i], (int*)src_image1->data[src_alpha], (int*)src_image2->data[src_alpha], (int*)dst_image->data[i], count, (int)2147483647);
+      break;
+    case IM_FLOAT:
+      DoCompose((float*)src_image1->data[i], (float*)src_image2->data[i], (float*)src_image1->data[src_alpha], (float*)src_image2->data[src_alpha], (float*)dst_image->data[i], count, 1.0f);
+      break;
+    }
+  }
+
+  /* one more for the alpha channel */
+  switch(src_image1->data_type)
+  {
+  case IM_BYTE:
+    DoComposeAlpha((imbyte*)src_image1->data[src_alpha], (imbyte*)src_image2->data[src_alpha], (imbyte*)dst_image->data[src_alpha], count, (int)255);
+    break;
+  case IM_USHORT:
+    DoComposeAlpha((imushort*)src_image1->data[src_alpha], (imushort*)src_image2->data[src_alpha], (imushort*)dst_image->data[src_alpha], count, (int)65535);
+    break;
+  case IM_INT:
+    DoComposeAlpha((int*)src_image1->data[src_alpha], (int*)src_image2->data[src_alpha], (int*)dst_image->data[src_alpha], count, (int)2147483647);
+    break;
+  case IM_FLOAT:
+    DoComposeAlpha((float*)src_image1->data[src_alpha], (float*)src_image2->data[src_alpha], (float*)dst_image->data[src_alpha], count, 1.0f);
+    break;
+  }
+}
+
 static void DoBinaryConstOpCpxReal(imcfloat *map1, float value, imcfloat *map, int count, int op)
 {
   int i;
diff --git a/im/src/process/im_color.cpp b/im/src/process/im_color.cpp
index b27d4b3..29933c4 100755
--- a/im/src/process/im_color.cpp
+++ b/im/src/process/im_color.cpp
@@ -2,7 +2,7 @@
  * \brief Color Processing Operations
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_color.cpp,v 1.1 2008/10/17 06:16:33 scuri Exp $
+ * $Id: im_color.cpp,v 1.2 2010/01/06 20:16:30 scuri Exp $
  */
 
 #include <im.h>
@@ -142,7 +142,7 @@ void imProcessSplitComponents(const imImage* src_image, imImage** dst_image)
   memcpy(dst_image[0]->data[0], src_image->data[0], src_image->plane_size);
   memcpy(dst_image[1]->data[0], src_image->data[1], src_image->plane_size);
   memcpy(dst_image[2]->data[0], src_image->data[2], src_image->plane_size);
-  if (imColorModeDepth(src_image->color_space) == 4) 
+  if (imColorModeDepth(src_image->color_space) == 4 || src_image->has_alpha) 
     memcpy(dst_image[3]->data[0], src_image->data[3], src_image->plane_size);
 }
 
@@ -151,7 +151,7 @@ void imProcessMergeComponents(const imImage** src_image, imImage* dst_image)
   memcpy(dst_image->data[0], src_image[0]->data[0], dst_image->plane_size);
   memcpy(dst_image->data[1], src_image[1]->data[0], dst_image->plane_size);
   memcpy(dst_image->data[2], src_image[2]->data[0], dst_image->plane_size);
-  if (imColorModeDepth(dst_image->color_space) == 4) 
+  if (imColorModeDepth(dst_image->color_space) == 4 || dst_image->has_alpha) 
     memcpy(dst_image->data[3], src_image[3]->data[0], dst_image->plane_size);
 }
 
diff --git a/im/src/process/im_geometric.cpp b/im/src/process/im_geometric.cpp
index a0b5129..d4dbed3 100755
--- a/im/src/process/im_geometric.cpp
+++ b/im/src/process/im_geometric.cpp
@@ -2,7 +2,7 @@
  * \brief Geometric Operations
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_geometric.cpp,v 1.1 2008/10/17 06:16:33 scuri Exp $
+ * $Id: im_geometric.cpp,v 1.2 2010/01/07 19:12:53 scuri Exp $
  */
 
 
@@ -393,7 +393,8 @@ static void InterlaceSplit(int src_width,
 
 void imProcessRotate90(const imImage* src_image, imImage* dst_image, int dir)
 {
-  for (int i = 0; i < src_image->depth; i++)
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  for (int i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -418,7 +419,8 @@ void imProcessRotate90(const imImage* src_image, imImage* dst_image, int dir)
 
 void imProcessRotate180(const imImage* src_image, imImage* dst_image)
 {
-  for (int i = 0; i < src_image->depth; i++)
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  for (int i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -446,9 +448,10 @@ int imProcessRadial(const imImage* src_image, imImage* dst_image, float k1, int
   int ret = 0;
 
   int counter = imCounterBegin("Radial Distort");
-  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing...");
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */
 
-  for (int i = 0; i < src_image->depth; i++)
+  for (int i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -483,9 +486,10 @@ int imProcessSwirl(const imImage* src_image, imImage* dst_image, float k, int or
   int ret = 0;
 
   int counter = imCounterBegin("Swirl Distort");
-  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing...");
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */
 
-  for (int i = 0; i < src_image->depth; i++)
+  for (int i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -559,7 +563,8 @@ int imProcessRotate(const imImage* src_image, imImage* dst_image, double cos0, d
   int ret = 0;
 
   int counter = imCounterBegin("Rotate");
-  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing...");
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */
 
   if (src_image->color_space == IM_MAP)
   {
@@ -567,7 +572,7 @@ int imProcessRotate(const imImage* src_image, imImage* dst_image, double cos0, d
   }
   else
   {
-     for (int i = 0; i < src_image->depth; i++)
+    for (int i = 0; i < src_depth; i++)
     {
       switch(src_image->data_type)
       {
@@ -603,7 +608,8 @@ int imProcessRotateRef(const imImage* src_image, imImage* dst_image, double cos0
   int ret = 0;
 
   int counter = imCounterBegin("RotateRef");
-  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing...");
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */
 
   if (src_image->color_space == IM_MAP)
   {
@@ -611,7 +617,7 @@ int imProcessRotateRef(const imImage* src_image, imImage* dst_image, double cos0
   }
   else
   {
-     for (int i = 0; i < src_image->depth; i++)
+    for (int i = 0; i < src_depth; i++)
     {
       switch(src_image->data_type)
       {
@@ -645,8 +651,9 @@ int imProcessRotateRef(const imImage* src_image, imImage* dst_image, double cos0
 void imProcessMirror(const imImage* src_image, imImage* dst_image)
 {
   int i;
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
 
-  for (i = 0; i < src_image->depth; i++)
+  for (i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -672,8 +679,9 @@ void imProcessMirror(const imImage* src_image, imImage* dst_image)
 void imProcessFlip(const imImage* src_image, imImage* dst_image)
 {
   int i;
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
 
-  for (i = 0; i < src_image->depth; i++)
+  for (i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -699,8 +707,9 @@ void imProcessFlip(const imImage* src_image, imImage* dst_image)
 void imProcessInterlaceSplit(const imImage* src_image, imImage* dst_image1, imImage* dst_image2)
 {
   int i;
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
 
-  for (i = 0; i < src_image->depth; i++)
+  for (i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
diff --git a/im/src/process/im_resize.cpp b/im/src/process/im_resize.cpp
index ddf6e47..4dbaa60 100755
--- a/im/src/process/im_resize.cpp
+++ b/im/src/process/im_resize.cpp
@@ -2,7 +2,7 @@
  * \brief Image Resize
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_resize.cpp,v 1.1 2008/10/17 06:16:33 scuri Exp $
+ * $Id: im_resize.cpp,v 1.2 2010/01/07 19:12:53 scuri Exp $
  */
 
 
@@ -106,9 +106,10 @@ int imProcessReduce(const imImage* src_image, imImage* dst_image, int order)
   int ret = 0;
   int counter = imCounterBegin("Reduce Size");
   const char* int_msg = (order == 1)? "Bilinear Decimation": "Zero Order Decimation";
-  imCounterTotal(counter, src_image->depth*dst_image->height, int_msg);
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  imCounterTotal(counter, src_depth*dst_image->height, int_msg);
 
-  for (int i = 0; i < src_image->depth; i++)
+  for (int i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -149,9 +150,10 @@ int imProcessResize(const imImage* src_image, imImage* dst_image, int order)
   int ret = 0;
   int counter = imCounterBegin("Resize");
   const char* int_msg = (order == 3)? "Bicubic Interpolation": (order == 1)? "Bilinear Interpolation": "Zero Order Interpolation";
-  imCounterTotal(counter, src_image->depth*dst_image->height, int_msg);
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  imCounterTotal(counter, src_depth*dst_image->height, int_msg);
 
-  for (int i = 0; i < src_image->depth; i++)
+  for (int i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -219,8 +221,9 @@ static void ReduceBy4(int src_width,
 void imProcessReduceBy4(const imImage* src_image, imImage* dst_image)
 {
   int i;
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
 
-  for (i = 0; i < src_image->depth; i++)
+  for (i = 0; i < src_depth; i++)
   {
     switch(src_image->data_type)
     {
@@ -246,7 +249,8 @@ void imProcessReduceBy4(const imImage* src_image, imImage* dst_image)
 void imProcessCrop(const imImage* src_image, imImage* dst_image, int xmin, int ymin)
 {
   int type_size = imDataTypeSize(src_image->data_type);
-  for (int i = 0; i < src_image->depth; i++)
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  for (int i = 0; i < src_depth; i++)
   {
     imbyte *src_map = (imbyte*)src_image->data[i];
     imbyte *dst_map = (imbyte*)dst_image->data[i];
@@ -269,6 +273,7 @@ void imProcessInsert(const imImage* src_image, const imImage* rgn_image, imImage
   int dst_offset2 = dst_size1+rgn_image->line_size;
   int ymax = ymin+rgn_image->height-1;
   int rgn_size = rgn_image->line_size;
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
 
   if (dst_size2 < 0)
   {
@@ -280,7 +285,7 @@ void imProcessInsert(const imImage* src_image, const imImage* rgn_image, imImage
   if (ymax > src_image->height-1)
     ymax = src_image->height-1;
 
-  for (int i = 0; i < src_image->depth; i++)
+  for (int i = 0; i < src_depth; i++)
   {
     imbyte *src_map = (imbyte*)src_image->data[i];
     imbyte *rgn_map = (imbyte*)rgn_image->data[i];
@@ -315,7 +320,8 @@ void imProcessInsert(const imImage* src_image, const imImage* rgn_image, imImage
 void imProcessAddMargins(const imImage* src_image, imImage* dst_image, int xmin, int ymin)
 {
   int type_size = imDataTypeSize(src_image->data_type);
-  for (int i = 0; i < src_image->depth; i++)
+  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;
+  for (int i = 0; i < src_depth; i++)
   {
     imbyte *dst_map = (imbyte*)dst_image->data[i];
     imbyte *src_map = (imbyte*)src_image->data[i];
diff --git a/im/src/tecmake.mak b/im/src/tecmake.mak
new file mode 100644
index 0000000..56bd748
--- /dev/null
+++ b/im/src/tecmake.mak
@@ -0,0 +1,1253 @@
+#-------------------------------------------------------------------------#
+#- Tecmake  (POSIX Version)                                              -#
+#- Generic Makefile to build applications and libraries at TeCGraf       -#
+#- The user makefile usually has the name "config.mak".                  -#
+#-------------------------------------------------------------------------#
+
+#---------------------------------#
+# Tecmake Version
+VERSION = 4.0
+
+
+#---------------------------------#
+# First target 
+.PHONY: build
+build: tecmake
+
+
+#---------------------------------#
+# System Variables Definitions
+
+ifndef TEC_UNAME
+  # Base Defintions
+  TEC_SYSNAME:=$(shell uname -s)
+  TEC_SYSVERSION:=$(shell uname -r|cut -f1 -d.)
+  TEC_SYSMINOR:=$(shell uname -r|cut -f2 -d.)
+  TEC_SYSARCH:=$(shell uname -m)
+
+  # Fixes
+  ifeq ($(TEC_SYSNAME), SunOS)
+    TEC_SYSARCH:=$(shell uname -p)
+  endif
+  ifeq ($(TEC_SYSNAME), IRIX)
+    TEC_SYSARCH:=$(shell uname -p)
+  endif
+  ifeq ($(TEC_SYSNAME), FreeBSD)
+    TEC_SYSMINOR:=$(shell uname -r|cut -f2 -d.|cut -f1 -d-)
+  endif
+  ifeq ($(TEC_SYSNAME), AIX)
+    TEC_SYSVERSION:=$(shell uname -v)
+    TEC_SYSMINOR:=$(shell uname -r)
+    TEC_SYSARCH:=ppc
+  endif
+  ifeq ($(TEC_SYSNAME), Darwin)
+    TEC_SYSARCH:=$(shell uname -p)
+  endif
+
+  ifeq ($(TEC_SYSARCH), i686)
+    TEC_SYSARCH:=x86
+  endif
+  ifeq ($(TEC_SYSARCH), i386)
+    TEC_SYSARCH:=x86
+  endif
+  ifeq ($(TEC_SYSARCH), powerpc)
+    TEC_SYSARCH:=ppc
+  endif
+  ifeq ($(TEC_SYSARCH), x86_64)
+    TEC_SYSARCH:=x64
+  endif
+
+  # Compose
+  TEC_SYSRELEASE:=$(TEC_SYSVERSION).$(TEC_SYSMINOR)
+  TEC_UNAME:=$(TEC_SYSNAME)$(TEC_SYSVERSION)$(TEC_SYSMINOR)
+
+  # Linux 2.4 and GCC 3.x
+  ifeq ($(TEC_UNAME), Linux24)
+    GCCVER:=$(shell gcc -dumpversion|cut -f1 -d.)
+    ifeq ($(GCCVER), 3)
+      TEC_UNAME:=$(TEC_UNAME)g3
+    endif
+  endif
+
+  # Linux 2.6 and GCC 4.x
+  ifeq ($(TEC_UNAME), Linux26)
+    GCCVER:=$(shell gcc -dumpversion|cut -f1 -d.)
+    ifeq ($(GCCVER), 4)
+      TEC_UNAME:=$(TEC_UNAME)g4
+    endif
+  endif
+
+  # Linux and PowerPC
+  ifeq ($(TEC_SYSNAME), Linux)
+    ifeq ($(TEC_SYSARCH), ppc)
+      TEC_UNAME:=$(TEC_UNAME)ppc
+    endif
+  endif
+
+  # 64-bits Linux
+  ifeq ($(TEC_SYSARCH), x64)
+    BUILD_64=Yes
+    TEC_UNAME:=$(TEC_UNAME)_64
+  endif
+
+  ifeq ($(TEC_SYSARCH), ia64)
+    BUILD_64=Yes
+    TEC_UNAME:=$(TEC_UNAME)_ia64
+  endif
+
+  # Solaris and Intel
+  ifeq ($(TEC_SYSNAME), SunOS)
+    ifeq ($(TEC_SYSARCH) , x86)
+      TEC_UNAME:=$(TEC_UNAME)x86
+    endif
+  endif
+
+  # Darwin and Intel
+  ifeq ($(TEC_SYSNAME), Darwin)
+  ifeq ($(TEC_SYSARCH), x86)
+      TEC_UNAME:=$(TEC_UNAME)x86
+    endif
+  endif
+
+endif
+
+
+#---------------------------------#
+# System Info
+.PHONY: sysinfo
+sysinfo:
+	@echo ''; echo 'Tecmake - System Info'
+	@echo 'TEC_SYSNAME = $(TEC_SYSNAME)'
+	@echo 'TEC_SYSVERSION = $(TEC_SYSVERSION)'
+	@echo 'TEC_SYSMINOR = $(TEC_SYSMINOR)'
+	@echo 'TEC_SYSARCH = $(TEC_SYSARCH)'
+	@echo 'TEC_UNAME = $(TEC_UNAME)'; echo ''
+
+  
+#---------------------------------#
+# Known Platforms
+
+UNAMES = Linux24 Linux24g3 Linux24g3_64 Linux26 Linux26_64 Linux26g4 Linux26g4_64 Linux26_ia64 FreeBSD54 SunOS57 SunOS58 SunOS510 SunOS510_x86 AIX43 IRIX65 IRIX6465
+
+
+#---------------------------------#
+# Directories Definitions
+
+PROJDIR = ..
+SRCDIR  = .
+OBJROOT = $(PROJDIR)/obj
+
+
+#---------------------------------#
+# Byte Order and Word Size
+
+ifneq ($(findstring x86, $(TEC_SYSARCH)), )
+   TEC_BYTEORDER = TEC_LITTLEENDIAN
+else
+ifeq ($(TEC_SYSARCH), arm)
+   TEC_BYTEORDER = TEC_LITTLEENDIAN
+else
+   TEC_BYTEORDER = TEC_BIGENDIAN
+endif
+endif
+
+ifeq ($(TEC_SYSARCH), x64)
+  TEC_BYTEORDER = TEC_LITTLEENDIAN
+  TEC_WORDSIZE = TEC_64
+else
+ifdef BUILD_64
+  TEC_WORDSIZE = TEC_64
+else
+  TEC_WORDSIZE = TEC_32
+endif
+endif
+
+# Itanium Exception
+ifeq ($(TEC_SYSARCH), ia64)
+  TEC_BYTEORDER = TEC_LITTLEENDIAN
+  TEC_WORDSIZE = TEC_64
+endif
+
+
+#---------------------------------#
+# Compilation Flags
+STDFLAGS := -Wall
+STDDEFS  := -DTEC_UNAME=$(TEC_UNAME) -DTEC_SYSNAME=$(TEC_SYSNAME) -D$(TEC_SYSNAME)=$(TEC_SYSRELEASE) -D$(TEC_BYTEORDER) -D$(TEC_WORDSIZE) -DFUNCPROTO=15
+STDINCS  := 
+OPTFLAGS := -O2
+STDLFLAGS  := r
+DEBUGFLAGS := -g  
+STDLDFLAGS := -shared
+DLIBEXT := so
+DLIBPRE := lib
+APPEXT :=
+
+
+ifneq ($(findstring cygw, $(TEC_UNAME)), )
+  GTK_DEFAULT = Yes
+endif  
+ifneq ($(findstring Linux, $(TEC_UNAME)), )
+  GTK_DEFAULT = Yes
+endif  
+ifneq ($(findstring Darwin, $(TEC_UNAME)), )
+  GTK_DEFAULT = Yes
+endif  
+ifneq ($(findstring FreeBSD, $(TEC_UNAME)), )
+  GTK_DEFAULT = Yes
+endif  
+ifneq ($(findstring Linux24, $(TEC_UNAME)), )
+  GTK_DEFAULT :=
+endif  
+
+
+#---------------------------------#
+# Tools
+
+CC       := $(TEC_TOOLCHAIN)gcc
+CPPC     := $(TEC_TOOLCHAIN)g++
+FF       := $(TEC_TOOLCHAIN)g77
+RANLIB   := $(TEC_TOOLCHAIN)ranlib
+AR       := $(TEC_TOOLCHAIN)ar
+DEBUGGER := $(TEC_TOOLCHAIN)gdb
+RCC      := $(TEC_TOOLCHAIN)windres 
+
+# Remote build script
+REMOTE  = $(TECMAKE_HOME)/remote
+
+# Packed LOHs script
+LUAPRE = $(TECMAKE_HOME)/luapre.lua
+
+
+#---------------------------------#
+# User Configuration File
+
+MAKENAME = config.mak
+
+ifdef MF
+  MAKENAME = $(MF).mak
+endif
+
+###################
+include $(MAKENAME)
+###################
+
+
+#---------------------------------#
+# Definitions of public variables 
+
+ifdef LIBNAME
+  TARGETNAME = $(LIBNAME)
+  MAKETYPE = LIB
+else
+  TARGETNAME = $(APPNAME)
+  MAKETYPE = APP
+endif
+
+ifndef TARGETNAME
+  $(error LIBNAME nor APPNAME defined in $(MAKENAME)) 
+endif
+
+PROJNAME ?= $(TARGETNAME)
+
+DEPEND := $(TARGETNAME).dep
+
+ifdef DEPENDDIR
+  DEPEND := $(DEPENDDIR)/$(TARGETNAME).dep.$(TEC_UNAME)
+endif
+
+SRCLUADIR ?= $(SRCDIR)
+LOHDIR ?= $(SRCLUADIR)
+
+ifeq ($(MAKETYPE), APP)
+  TARGETROOT ?= $(PROJDIR)/bin
+else
+  TARGETROOT ?= $(PROJDIR)/lib
+endif
+
+ifneq ($(PROJNAME), $(TARGETNAME))
+  OBJROOT := $(OBJROOT)/$(TARGETNAME)
+endif
+
+ifdef DBG
+  STDFLAGS += $(DEBUGFLAGS)
+  STDDEFS += -DDEBUG
+else
+  STDDEFS += -DNDEBUG
+  ifdef OPT
+    STDFLAGS += $(OPTFLAGS)
+    STRIP ?= Yes
+  endif
+endif
+
+ifdef BUILD_64
+  ifneq ($(findstring SunOS, $(TEC_UNAME)), )
+    USE_CC = Yes
+    BUILD_64_DIR = Yes   
+  endif
+  ifneq ($(findstring AIX, $(TEC_UNAME)), )
+    USE_CC = Yes
+    BUILD_64_DIR = Yes
+  endif
+  ifneq ($(findstring IRIX, $(TEC_UNAME)), )
+    USE_CC = Yes
+    BUILD_64_DIR = Yes
+  endif
+endif
+  
+ifdef USE_CC
+  CC := cc
+  CPPC := CC
+  STDFLAGS = 
+  UNAMES := $(UNAMES_CC)
+  ifdef USE_CC_DIR
+    TEC_UNAME := $(TEC_UNAME)cc
+  endif
+endif
+
+ifdef BUILD_64
+  ifdef BUILD_64_DIR
+    TEC_UNAME := $(TEC_UNAME)_64
+  endif
+endif
+
+TEC_UNAME_DIR ?= $(TEC_UNAME)
+TEC_UNAME_LIB_DIR ?= $(TEC_UNAME)
+ifdef DBG
+  ifdef DBG_LIB_DIR
+    TEC_UNAME_LIB_DIR := $(TEC_UNAME_DIR)d
+  endif
+  ifdef DBG_DIR
+    TEC_UNAME_DIR := $(TEC_UNAME_DIR)d
+  endif
+endif
+
+OBJDIR := $(OBJROOT)/$(TEC_UNAME_DIR)
+TARGETDIR := $(TARGETROOT)/$(TEC_UNAME_DIR)
+
+# Change linker if any C++ source
+ifndef LINKER
+  ifneq "$(findstring .cpp, $(SRC))" ""
+    LINKER := $(CPPC)
+    LD := $(CPPC)
+  else
+    LINKER := $(CC)
+    LD := $(CC)
+  endif
+endif
+
+
+#---------------------------------#
+# LO and LOH Suffix
+
+ifeq ($(TEC_BYTEORDER), TEC_BIGENDIAN)
+  ifeq ($(TEC_WORDSIZE), TEC_64)
+    LO_SUFFIX ?= _be64
+  else
+    LO_SUFFIX ?= _be32
+  endif
+else
+  ifeq ($(TEC_WORDSIZE), TEC_64)
+    LO_SUFFIX ?= _le64
+  else
+    LO_SUFFIX ?=
+  endif
+endif
+
+
+#---------------------------------#
+#  Platform specific variables
+
+# Definitions for X11
+X11_LIBS := Xmu Xt Xext X11
+#X11_LIB := 
+#X11_INC :=                     #include <X11/X.h>
+
+# Definitions for OpenGL
+OPENGL_LIBS := GLU GL
+#OPENGL_LIB := 
+#OPENGL_INC :=                  #include <GL/gl.h>  and possibly  
+MOTIFGL_LIB := GLw              #include <GL/GLwMDrawA.h>
+
+# Definitions for Motif
+#MOTIF_LIB := 
+#MOTIF_INC :=                   #include <Xm/Xm.h>
+
+# Definitions for GLUT
+#GLUT_LIB := 
+#GLUT_INC := 
+
+
+ifneq ($(findstring Linux, $(TEC_UNAME)), )
+  ifdef BUILD_64
+    ifeq ($(TEC_SYSARCH), ia64)
+      STDFLAGS += -fPIC
+      X11_LIB := /usr/X11R6/lib
+    else
+      STDFLAGS += -m64 -fPIC
+      X11_LIB := /usr/X11R6/lib64
+    endif
+  else
+    X11_LIB := /usr/X11R6/lib
+  endif
+  X11_INC := /usr/X11R6/include
+  MOTIFGL_LIB := 
+endif
+
+ifneq ($(findstring IRIX, $(TEC_UNAME)), )
+  LD = ld
+  STDLDFLAGS := -elf -shared -rdata_shared -soname lib$(TARGETNAME).so
+  RANLIB := /bin/true
+  X11_LIBS := Xmu Xt X11
+  ifdef BUILD_64    
+    ifdef USE_CC  
+      STDFLAGS += -64 -KPIC
+      STDLDFLAGS += -64
+      LINKER += -64
+    endif
+    X11_LIB := /usr/lib64
+    MOTIF_LIB := /usr/Motif-2.1/lib64
+  else
+    X11_LIB := /usr/lib32
+    MOTIF_LIB := /usr/Motif-2.1/lib32
+  endif
+  MOTIF_INC = /usr/Motif-2.1/include
+endif
+
+ifneq ($(findstring AIX, $(TEC_UNAME)), ) 
+  NO_DYNAMIC ?= Yes
+  ifdef BUILD_64
+    ifdef USE_CC  
+      STDFLAGS += -q64 # to compilers C and C++
+      STDLFLAGS := -X64 $(STDLFLAGS) # to librarian
+      STDLDFLAGS += -64
+      LINKER += -q64 # to linker
+    endif
+  endif
+endif
+
+ifneq ($(findstring HP-UX, $(TEC_UNAME)), )
+  NO_DYNAMIC ?= Yes
+  MOTIF_INC := /usr/include/Motif2.1
+  X11_LIBS := Xt Xext X11
+  OPENGL_LIB := /opt/graphics/OpenGL/lib
+  OPENGL_INC := /opt/graphics/OpenGL/include
+  STDDEFS := -DTEC_UNAME=$(TEC_UNAME) -DTEC_SYSNAME=$(TEC_SYSNAME) -D$(TEC_BYTEORDER) -D$(TEC_WORDSIZE) -DFUNCPROTO=15
+  CC := aCC
+  CPPC := aCC
+  LINKER := aCC
+endif
+
+ifneq ($(findstring SunOS, $(TEC_UNAME)), )
+  LD = ld
+  STDLDFLAGS := -G
+  X11_INC := /usr/openwin/share/include
+  X11_LIB := /usr/openwin/lib
+  MOTIF_INC := /usr/dt/share/include
+  MOTIF_LIB := /usr/dt/lib
+  OPENGL_INC := /usr/openwin/share/include/X11
+  GLUT_LIB := /usr/local/glut-3.7/lib/glut
+  GLUT_INC := /usr/local/glut-3.7/include
+  ifdef BUILD_64
+    ifdef USE_CC  
+      STDFLAGS += -xarch=v9 -KPIC
+      # have to force these PATHs because of a conflict with standard PATHs
+      STDLDFLAGS += -64 -L/usr/lib/64 -L/usr/ucblib/sparcv9  
+      LINKER += -xarch=v9
+    endif
+  endif
+endif
+
+ifneq ($(findstring Darwin, $(TEC_UNAME)), )
+  X11_LIBS := Xmu Xp Xt Xext X11
+  X11_LIB := /usr/X11R6/lib
+  X11_INC := /usr/X11R6/include
+  MOTIF_INC := /usr/OpenMotif/include
+  MOTIF_LIB := /usr/OpenMotif/lib
+  ifdef BUILD_DYLIB
+    STDLDFLAGS := -dynamiclib -Wl -fno-common -headerpad_max_install_names -undefined dynamic_lookup -install_name lib$(TARGETNAME).dylib
+    DLIBEXT := dylib
+    STDFLAGS += -fno-common
+  else
+    STDLDFLAGS := -bundle -undefined dynamic_lookup
+  endif
+endif
+
+ifneq ($(findstring FreeBSD, $(TEC_UNAME)), )
+  X11_LIB := /usr/X11R6/lib
+  X11_INC := /usr/X11R6/include
+endif
+
+
+#---------------------------------#
+# Allows an extra configuration file.
+ifdef EXTRA_CONFIG
+include $(EXTRA_CONFIG)
+endif
+
+
+#---------------------------------#
+# Tecgraf Libraries Location
+TECTOOLS_HOME ?= ../..
+
+IUP   ?= $(TECTOOLS_HOME)/iup
+CD    ?= $(TECTOOLS_HOME)/cd
+IM    ?= $(TECTOOLS_HOME)/im
+LUA   ?= $(TECTOOLS_HOME)/lua
+LUA51 ?= $(TECTOOLS_HOME)/lua5.1
+LUA52 ?= $(TECTOOLS_HOME)/lua52
+
+
+#---------------------------------#
+#  Pre-defined libraries
+
+# Library order:
+#   user + iupcd + cd + iup + motif + X
+# Library path order is reversed
+
+ifdef USE_LUA
+  LUASUFX :=
+  LIBLUASUFX := 3
+endif
+
+ifdef USE_LUA4
+  LUASUFX := 4
+  LIBLUASUFX := 4
+  override USE_LUA = Yes
+  LUA := $(LUA4)
+endif
+
+ifdef USE_LUA5
+  LUASUFX := 5
+  LIBLUASUFX := 5
+  override USE_LUA = Yes
+  LUA := $(LUA5)
+endif
+
+ifdef USE_LUA50
+  LUASUFX := 50
+  LIBLUASUFX := 5
+  override USE_LUA = Yes
+  LUA := $(LUA50)
+  NO_LUALIB := Yes
+endif
+
+ifdef USE_LUA51
+  LUASUFX := 5.1
+  LIBLUASUFX := 51
+  override USE_LUA = Yes
+  LUA := $(LUA51)
+  NO_LUALIB := Yes
+endif
+
+ifdef USE_LUA52
+  LUASUFX := 52
+  LIBLUASUFX := 52
+  override USE_LUA = Yes
+  LUA := $(LUA52)
+  NO_LUALIB := Yes
+endif
+
+ifdef USE_IUP3
+  override USE_IUP = Yes
+# Inside Tecgraf only  
+  ifndef IUP3_BUILD
+#  IUP := $(IUP)3
+  endif
+endif 
+
+ifdef USE_IUPBETA
+  IUP := $(IUP)/beta
+endif 
+
+ifdef USE_CDBETA
+  CD := $(CD)/beta
+endif 
+
+ifdef USE_IMBETA
+  IM := $(IM)/beta
+endif 
+
+ifdef USE_GLUT
+  override USE_OPENGL = Yes
+endif
+
+ifdef USE_GDK
+  override USE_GTK = Yes
+endif
+
+ifdef USE_IUPCONTROLS
+  override USE_CD = Yes
+  override USE_IUP = Yes
+  ifdef USE_IUPLUA
+    ifdef USE_STATIC
+      SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupluacontrols$(LIBLUASUFX).a
+    else
+      LIBS += iupluacontrols$(LIBLUASUFX)
+    endif
+    override USE_CDLUA = Yes
+  endif
+  ifdef USE_STATIC
+    SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupcontrols.a
+  else
+    LIBS += iupcontrols
+  endif
+endif
+  
+ifdef USE_IMLUA
+  override USE_IM = Yes
+  ifdef USE_STATIC
+    SLIB += $(IM)/lib/$(TEC_UNAME_LIB_DIR)/libimlua$(LIBLUASUFX).a
+  else
+    LIBS += imlua$(LIBLUASUFX)
+  endif
+endif
+
+ifdef USE_CDLUA
+  override USE_CD = Yes
+  ifdef USE_STATIC
+    ifdef USE_IUP
+      ifdef USE_OLDNAMES
+        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdluaiup$(LIBLUASUFX).a
+      endif
+    endif
+    SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdlua$(LIBLUASUFX).a
+  else
+    ifdef USE_IUP
+      ifdef USE_OLDNAMES
+        LIBS += cdluaiup$(LIBLUASUFX)
+      endif
+    endif
+    LIBS += cdlua$(LIBLUASUFX)
+  endif
+endif
+
+ifdef USE_IUPLUA
+  override USE_IUP = Yes
+  ifdef USE_STATIC
+    ifdef USE_CD
+      ifndef USE_OLDNAMES
+        SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupluacd$(LIBLUASUFX).a
+      endif
+    endif
+    ifdef USE_OPENGL
+      SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupluagl$(LIBLUASUFX).a
+    endif
+    SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiuplua$(LIBLUASUFX).a
+  else
+    ifdef USE_CD
+      ifndef USE_OLDNAMES
+        LIBS += iupluacd$(LIBLUASUFX)
+      endif
+    endif
+    ifdef USE_OPENGL
+      LIBS += iupluagl$(LIBLUASUFX)
+    endif
+    LIBS += iuplua$(LIBLUASUFX)
+  endif
+endif
+
+ifdef USE_LUA
+  LUA_LIB ?= $(LUA)/lib/$(TEC_UNAME_LIB_DIR)
+  ifdef USE_STATIC
+    ifndef NO_LUALIB
+      SLIB += $(LUA_LIB)/liblualib$(LUASUFX).a
+    endif
+    SLIB += $(LUA_LIB)/liblua$(LUASUFX).a
+  else
+    ifndef NO_LUALIB
+      LIBS += lualib$(LUASUFX)
+    endif
+    ifndef NO_LUALINK
+        LIBS += lua$(LUASUFX)
+        LDIR += $(LUA_LIB)
+    else
+      ifneq ($(findstring cygw, $(TEC_UNAME)), )
+        LIBS += lua$(LUASUFX)
+        LDIR += $(LUA_LIB)
+      endif
+    endif
+  endif
+  
+  LUA_INC   ?= $(LUA)/include
+  INCLUDES += $(LUA_INC)
+  
+  LUA_BIN ?= $(LUA)/bin/$(TEC_UNAME)
+  BIN2C     := $(LUA_BIN)/bin2c$(LUASUFX)
+  LUAC      := $(LUA_BIN)/luac$(LUASUFX)
+  LUABIN    := $(LUA_BIN)/lua$(LUASUFX)
+endif
+
+ifdef USE_IUP   
+  IUPSUFX := 
+  ifdef USE_IUP3
+    ifdef GTK_DEFAULT
+      ifdef USE_MOTIF
+        IUPSUFX := mot
+      else
+        override USE_GTK = Yes
+      endif
+    else
+      ifdef USE_GTK
+        IUPSUFX := gtk
+      else
+        override USE_MOTIF = Yes
+      endif
+    endif
+  else
+    override USE_MOTIF = Yes
+  endif
+  ifdef USE_STATIC
+    ifdef USE_CD
+      ifndef USE_OLDNAMES
+        SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupcd.a
+      endif
+    endif
+    ifdef USE_OPENGL
+      SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupgl.a
+    endif
+    SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiup$(IUPSUFX).a
+  else
+    ifdef USE_CD
+      ifndef USE_OLDNAMES
+        LIBS += iupcd
+      endif
+    endif
+    ifdef USE_OPENGL
+      LIBS += iupgl
+    endif
+    LIBS += iup$(IUPSUFX)
+    LDIR += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)
+  endif
+  INCLUDES += $(IUP)/include
+endif
+
+ifdef USE_CD
+  override USE_X11 = Yes
+  ifdef USE_STATIC
+    ifdef USE_IUP
+      ifdef USE_OLDNAMES
+        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdiup.a
+      endif
+    endif
+    ifdef USE_XRENDER
+      ifdef USE_OLDNAMES
+        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdxrender.a
+      else
+        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdcontextplus.a
+      endif
+    endif
+    ifdef USE_GDK
+      SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdgdk.a
+    else
+      SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcd.a
+    endif
+    ifdef USE_XRENDER
+      LIBS += Xrender Xft
+    else
+      ifndef USE_GTK
+        ifndef USE_OLDNAMES
+          # Freetype is included in GTK
+          SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libfreetype.a
+        endif 
+      endif
+    endif
+  else
+    ifdef USE_IUP
+      ifdef USE_OLDNAMES
+        LIBS += cdiup
+      endif
+    endif
+    ifdef USE_XRENDER
+      ifdef USE_OLDNAMES
+        LIBS += cdxrender
+      else
+        LIBS += cdcontextplus
+      endif
+    endif
+    ifdef USE_GDK
+      LIBS += cdgdk
+    else
+      LIBS += cd
+    endif
+    LDIR += $(CD)/lib/$(TEC_UNAME_LIB_DIR)
+    ifdef USE_XRENDER
+      LIBS += Xrender Xft
+    else
+      ifndef USE_GTK
+        ifndef USE_OLDNAMES
+          # Freetype is included in GTK
+          LIBS += freetype
+        endif
+      endif
+    endif
+  endif
+  INCLUDES += $(CD)/include
+endif
+
+ifdef USE_IM
+  ifdef USE_STATIC
+    SLIB += $(IM)/lib/$(TEC_UNAME_LIB_DIR)/libim.a
+  else
+    LIBS += im
+    LDIR += $(IM)/lib/$(TEC_UNAME_LIB_DIR)
+  endif
+  INCLUDES += $(IM)/include
+endif
+
+ifdef USE_GLUT
+  LIBS += glut
+  LDIR += $(GLUT_LIB)
+  STDINCS += $(GLUT_INC)
+endif 
+
+ifdef USE_OPENGL
+  override USE_X11 = Yes
+  ifdef USE_MOTIF
+    ifndef USE_IUP3
+      LIBS += $(MOTIFGL_LIB)
+    endif
+  endif
+  LIBS += $(OPENGL_LIBS)
+  LDIR += $(OPENGL_LIB)
+  STDINCS += $(OPENGL_INC)
+endif 
+
+ifdef USE_MOTIF
+  override USE_X11 = Yes
+  LIBS += Xm
+  LDIR += $(MOTIF_LIB)
+  STDINCS += $(MOTIF_INC)
+  ifneq ($(findstring Linux, $(TEC_UNAME)), )
+    X11_LIBS := Xpm $(X11_LIBS)
+  endif
+  ifneq ($(findstring cygw, $(TEC_UNAME)), ) 
+    X11_LIBS := Xpm $(X11_LIBS)
+  endif
+endif
+
+ifdef USE_GTK
+  ifneq ($(findstring Darwin, $(TEC_UNAME)), )
+# Option 1 - Fink GTK port
+    GTK_BASE ?= /sw
+    LDIR += $(GTK_BASE)/lib
+    override USE_X11 = Yes
+    LIBS += gtk-x11-2.0 gdk-x11-2.0 pangox-1.0
+# Option 2 - Imendio Framework
+#   STDINCS += /Library/Frameworks/Gtk.framework/Headers
+#   STDINCS += /Library/Frameworks/GLib.framework/Headers
+#   STDINCS += /Library/Frameworks/Cairo.framework/Headers
+#   LFLAGS += -framework Gtk
+# Option 3 - GTK-OSX Framework
+#   GTK_BASE := /Users/cpts/gtk/inst
+#   LDIR += $(GTK_BASE)/lib
+#   LFLAGS += -framework Carbon
+#   LIBS += gtk-quartz-2.0 gdk-quartz-2.0 pangoft2-1.0
+
+    LIBS += freetype
+  else
+    # if not the default, then include it for linker
+    # must be before the default
+    ifdef GTK_BASE
+      LDIR += $(GTK_BASE)/lib
+    endif
+    GTK_BASE ?= /usr
+    override USE_X11 = Yes
+    LIBS += gtk-x11-2.0 gdk-x11-2.0 pangox-1.0
+  endif
+  
+  LIBS += gdk_pixbuf-2.0 pango-1.0 gobject-2.0 gmodule-2.0 glib-2.0
+  STDINCS += $(GTK_BASE)/include/atk-1.0 $(GTK_BASE)/include/gtk-2.0 $(GTK_BASE)/include/cairo $(GTK_BASE)/include/pango-1.0 $(GTK_BASE)/include/glib-2.0
+  
+  ifeq ($(TEC_SYSARCH), x64)
+    STDINCS += $(GTK_BASE)/lib64/glib-2.0/include $(GTK_BASE)/lib64/gtk-2.0/include
+  else
+  ifeq ($(TEC_SYSARCH), ia64)
+    STDINCS += $(GTK_BASE)/lib64/glib-2.0/include $(GTK_BASE)/lib64/gtk-2.0/include
+  else
+    STDINCS += $(GTK_BASE)/lib/glib-2.0/include $(GTK_BASE)/lib/gtk-2.0/include
+  endif
+  endif
+  ifneq ($(findstring FreeBSD, $(TEC_UNAME)), )
+    STDINCS += /lib/X11R6/include/gtk-2.0  
+  endif
+endif
+
+ifdef USE_QT
+  override USE_X11 = Yes
+  LIBS += QtGui QtCore
+  QT_BASE_INC := /usr/include/qt4
+  STDINCS += $(QT_BASE_INC) $(QT_BASE_INC)/QtCore $(QT_BASE_INC)/QtGui
+  STDDEFS += -DQT_DLL -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
+endif
+
+ifdef USE_X11
+  LIBS += $(X11_LIBS)
+  LDIR += $(X11_LIB)
+  STDINCS += $(X11_INC)
+endif 
+
+LIBS += m
+
+ifneq ($(findstring cygw, $(TEC_UNAME)), )
+  # INCLUDES for dependencies, remove references to "c:" and similars
+  DEPINCS := $(patsubst c:%, /cygdrive/c%, $(INCLUDES))
+  DEPINCS := $(patsubst d:%, /cygdrive/d%, $(DEPINCS))
+  DEPINCS := $(patsubst x:%, /cygdrive/x%, $(DEPINCS))
+  DEPINCS := $(patsubst t:%, /cygdrive/t%, $(DEPINCS))
+  
+  DLIBEXT := dll
+  APPEXT := .exe
+  # Use the cyg prefix to indicate that it is a Cygwin Posix DLL  
+  DLIBPRE := cyg
+  
+  STDLDFLAGS += -Wl,--out-implib=$(TARGETDIR)/lib$(TARGETNAME).dll.a
+endif 
+
+#---------------------------------#
+#  Building compilation flags that are sets
+
+DEPINCS ?= $(INCLUDES)
+DEPINCS := $(addprefix -I, $(DEPINCS))
+
+INCLUDES := $(addprefix -I, $(INCLUDES))
+STDINCS := $(addprefix -I, $(STDINCS))
+EXTRAINCS := $(addprefix -I, $(EXTRAINCS))
+DEFINES := $(addprefix -D, $(DEFINES))
+
+LIBS := $(addprefix -l, $(LIBS))
+ifdef LDIR
+  LDIR := $(addprefix -L, $(LDIR))
+endif
+
+
+#---------------------------------#
+# Definitions of private variables
+
+# Library flags for application and dynamic library linker
+LFLAGS += $(LDIR) $(LIBS)
+# C compiler flags
+CFLAGS   = $(FLAGS) $(STDFLAGS) $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS)
+# C++ compiler flags
+CXXFLAGS = $(CPPFLAGS) $(STDFLAGS) $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS)
+
+# Sources with relative path
+SOURCES := $(addprefix $(SRCDIR)/, $(SRC))
+
+TARGETAPPNAME := $(TARGETNAME)$(APPEXT)
+TARGETSLIBNAME := lib$(TARGETNAME).a
+TARGETDLIBNAME := $(DLIBPRE)$(TARGETNAME).$(DLIBEXT)
+
+# Target for applications or libraries
+ifeq ($(MAKETYPE), APP)
+  TARGET := $(TARGETDIR)/$(TARGETAPPNAME)
+else
+  ifeq ($(NO_DYNAMIC), Yes) 
+    TARGET := $(TARGETDIR)/$(TARGETSLIBNAME)
+  else
+    TARGET := $(TARGETDIR)/$(TARGETSLIBNAME) $(TARGETDIR)/$(TARGETDLIBNAME)
+  endif
+endif
+
+# OBJ: list of .o, without path
+# OBJS: list of .o with relative path
+OBJ = $(notdir $(SRC))
+OBJ := $(OBJ:.c=.o)
+OBJ := $(OBJ:.cpp=.o)
+OBJ := $(OBJ:.cxx=.o)
+OBJ := $(OBJ:.cc=.o)
+OBJ := $(OBJ:.f=.o)
+OBJ := $(OBJ:.for=.o)
+OBJ := $(OBJ:.rc=.ro)
+OBJS = $(addprefix $(OBJDIR)/, $(OBJ))
+
+ifdef LOHPACK
+  # Package with all LOHs
+  LOHS := $(LOHDIR)/$(LOHPACK)
+  LOHDIRS :=
+else
+  # LOH: list of .loh, without path
+  # LOHS: list of .loh, with relative path
+  LO = $(notdir $(SRCLUA))
+  LO := $(LO:.lua=$(LO_SUFFIX).lo)
+  LOS = $(addprefix $(OBJROOT)/, $(LO))
+
+  LOH = $(notdir $(SRCLUA))
+  LOH := $(LOH:.lua=$(LO_SUFFIX).loh)
+  LOHS = $(addprefix $(LOHDIR)/, $(LOH))
+endif
+
+# Construct VPATH variable
+P-SRC = $(dir $(SRC))
+P-SRC += $(dir $(SRCLUA))
+VPATH = .:$(foreach dir,$(P-SRC),$(if $(dir)="./",:$(dir)))
+
+
+#---------------------------------#
+# Main Rule - Build Everything that it is necessary
+
+.PHONY: tecmake 
+ifeq ($(MAKETYPE), APP)
+  tecmake: print-start directories application scripts
+else
+  ifeq ($(NO_DYNAMIC), Yes) 
+    tecmake: print-start directories static-lib
+  else
+    tecmake: print-start directories static-lib dynamic-lib
+  endif
+endif
+
+.PHONY: print-start
+print-start:
+	@echo ''; echo 'Tecmake - Starting [ $(TARGETNAME):$(TEC_UNAME) ]'
+
+  
+#---------------------------------#
+# Dynamic Library Build
+
+.PHONY: dynamic-lib
+dynamic-lib: $(TARGETDIR)/$(TARGETDLIBNAME)
+
+$(TARGETDIR)/$(TARGETDLIBNAME) : $(LOHS) $(OBJS) $(EXTRADEPS)
+	$(LD) $(STDLDFLAGS) -o $@ $(OBJS) $(SLIB) $(LFLAGS)
+	@echo 'Tecmake - Dynamic Library ($@) Done.'; echo ''
+
+  
+#---------------------------------#
+# Static Library Build
+
+.PHONY: static-lib
+static-lib: $(TARGETDIR)/$(TARGETSLIBNAME)
+
+$(TARGETDIR)/$(TARGETSLIBNAME) : $(LOHS) $(OBJS) $(EXTRADEPS)
+	$(AR) $(STDLFLAGS) $@ $(OBJS) $(SLIB) $(LCFLAGS)
+	-$(RANLIB) $@
+	@echo 'Tecmake - Static Library ($@) Done.'; echo ''
+
+  
+#---------------------------------#
+# Application Build
+
+.PHONY: application
+application: $(TARGETDIR)/$(TARGETAPPNAME)
+
+$(TARGETDIR)/$(TARGETAPPNAME) : $(LOHS) $(OBJS) $(EXTRADEPS)
+	$(LINKER) -o $@ $(OBJS) $(SLIB) $(LFLAGS)
+	@if [ ! -z "$(STRIP)" ]; then \
+	   echo "Striping debug information" ;\
+	   strip $@ ;\
+	 fi
+	@echo 'Tecmake - Application ($@) Done.'; echo ''
+
+  
+#---------------------------------#
+#  Application Scripts
+
+# Script name
+SRELEASE := $(SRCDIR)/$(TARGETNAME)
+
+.PHONY: scripts
+ifdef NO_SCRIPTS
+  scripts: ;
+else
+  scripts: $(SRELEASE) ;
+endif
+  
+$(SRELEASE): $(MAKENAME)
+	@echo 'Building script $(@F)'
+	@echo "#!/bin/csh" > $@
+	@echo "# Script generated automatically by tecmake v$(VERSION)" >> $@
+	@echo "# Remove the comment bellow to set the LD_LIBRARY_PATH if needed." >> $@
+	@echo '#setenv LD_LIBRARY_PATH $(MYLIB1)/lib/$${TEC_UNAME}:$(MYLIB2)/lib/$${TEC_UNAME}:$$LD_LIBRARY_PATH' >> $@
+	@echo 'if ( -r app.env ) source app.env' >> $@
+	@echo 'exec $(TARGETROOT)/$$TEC_UNAME/$(TARGETNAME) $$*' >> $@
+	@chmod a+x $@
+
+  
+#---------------------------------#
+# Directories Creation
+
+.PHONY: directories
+directories: $(OBJDIR) $(TARGETDIR) $(EXTRADIR) $(LOHDIR)
+
+$(OBJDIR) $(TARGETDIR):
+	if [ ! -d $@ ] ; then mkdir -p $@ ; fi
+
+ifdef EXTRADIR
+  $(EXTRADIR):
+	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi
+else
+  $(EXTRADIR): ;
+endif
+
+ifdef LOHDIR
+  $(LOHDIR):
+	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi
+else
+  $(LOHDIR): ;
+endif
+
+
+#---------------------------------#
+# Compilation Rules
+
+$(OBJDIR)/%.o:  $(SRCDIR)/%.c
+	@echo Compiling $(<F)...
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp
+	@echo Compiling $(<F)...
+	$(CPPC) -c $(CXXFLAGS) -o $@ $<
+
+$(OBJDIR)/%.o:  $(SRCDIR)/%.cxx
+	@echo Compiling $(<F)...
+	$(CPPC) -c $(CXXFLAGS) -o $@ $<
+
+$(OBJDIR)/%.o:  $(SRCDIR)/%.cc
+	@echo Compiling $(<F)...
+	$(CPPC) -c $(CXXFLAGS) -o $@ $<
+
+$(OBJDIR)/%.o: $(SRCDIR)/%.f
+	@echo Compiling $(<F)...
+	$(FC) -c $(FFLAGS) -o $@ $<
+
+$(OBJDIR)/%.o: $(SRCDIR)/%.for
+	@echo Compiling $(<F)...
+	$(FC) -c $(FFLAGS) -o $@ $<
+
+$(OBJDIR)/%.ro:  $(SRCDIR)/%.rc
+	@echo Compiling $(<F)...
+	$(RCC) $(RCFLAGS) -O coff -o $@ $<
+
+$(LOHDIR)/%.loh:  $(OBJROOT)/%.lo
+	@echo Generating $(<F)...
+	$(BIN2C) $< > $@
+
+$(OBJROOT)/%$(LO_SUFFIX).lo:  $(SRCLUADIR)/%.lua
+	@echo Compiling $(<F)...
+	$(LUAC) -o $@ $<
+
+ifdef LOHPACK
+$(LOHDIR)/$(LOHPACK):  $(SRCLUA)
+	@echo Generating $(<F)...
+	$(LUABIN) $(LUAPRE) $(LUAPREFLAGS) -l $(SRCLUADIR) -o $@ $(SRCLUA)
+endif
+
+  
+#---------------------------------#
+# Dependencies
+
+# make depend
+#   Build dependencies
+.PHONY: depend
+depend: $(DEPEND)
+
+$(DEPEND): $(MAKENAME)
+  ifdef SRC
+	  @echo "" > $(DEPEND)
+	  @which $(CPPC) 2> /dev/null 1>&2 ;\
+	  if [ $$? -eq 0 ]; then \
+	    echo "Building dependencies... (can be slow)" ;\
+	    $(CPPC) $(DEPINCS) $(DEFINES) $(STDDEFS) -MM $(SOURCES) | \
+	    sed -e '1,$$s/^\([^ ]\)/$$(OBJDIR)\/\1/' > $(DEPEND) ;\
+	  else \
+	    echo "" ;\
+	    echo "$(CPPC) not found. Dependencies can not be built." ;\
+	    echo "Must set USE_NODEPEND=Yes." ;\
+	    echo "" ;\
+	    exit 1 ;\
+	  fi
+  endif
+
+###################
+ifndef USE_NODEPEND
+include $(DEPEND)
+endif
+###################
+
+
+#---------------------------------#
+# Management Rules
+
+# make clean-extra
+#   Remove extra files
+.PHONY: clean-extra
+clean-extra:
+	rm -f $(DEPEND) $(SRELEASE) so_locations
+	
+# make clean-lohs
+#   Remove Lua object inclusion files
+.PHONY: clean-lohs
+clean-lohs:
+	rm -f $(LOS) $(LOHS)
+	
+# make clean-obj
+#   Remove object files
+.PHONY: clean-obj
+clean-obj:
+	rm -f $(OBJS)
+
+# make clean-target
+#   Remove target
+.PHONY: clean-target
+clean-target:
+	rm -f $(TARGET)
+
+# make clean-dir
+.PHONY: clean-dir
+clean-dir:
+	rm -fr $(OBJROOT) $(TARGETROOT)
+
+# make clean
+#   Remove target and object files
+.PHONY: clean
+clean: clean-target clean-obj
+
+# make strip
+#   Remove symbols from executables
+.PHONY: strip
+strip:
+	test -r $(TARGETDIR)/$(TARGETAPPNAME) && strip $(TARGETDIR)/$(TARGETAPPNAME)
+
+# make rebuild
+#   Rebuild target and object files 
+.PHONY: rebuild
+rebuild: clean-extra clean-lohs clean-obj clean-target tecmake
+
+# make relink
+#   Rebuild target without rebuilding object files 
+.PHONY: relink
+relink: clean-target tecmake
+
+# make clean-all-obj
+#   Remove target and object files
+.PHONY: clean-all-obj
+clean-all-obj:
+	@for d in $(UNAMES); do \
+	  (cd $(OBJROOT)/$$d; echo $(OBJ) | xargs rm -f) ;\
+	done
+
+# make clean-all-target
+#   Remove libraries and executables for all platforms
+.PHONY: clean-all-target
+clean-all-target:
+	@for d in $(UNAMES); do \
+	  (rm -f $(TARGETROOT)/$$d/$(TARGETNAME) $(TARGETROOT)/$$d/$(TARGETSLIBNAME) $(TARGETROOT)/$$d/$(TARGETDLIBNAME)) ;\
+	done
+ 
+#---------------------------------#
+# Remote build
+# There must be aliases in DNS for the known UNAMES
+.PHONY: $(UNAMES)
+$(UNAMES):
+	@cwd=`csh -c "\\pwd"` ; home=`csh -c "cd;\\pwd"` ;\
+	 dir=`echo $$cwd | sed -e "s|$$home/||"` ;\
+	 xterm -bg black -fg lightblue -T "Tecmake: $@ ($(TARGETNAME))" -e ssh $@ $(REMOTE) $$dir $(TECMAKEFLAGS) $(MAKEFLAGS) & 2> /dev/null
+
+
+#---------------------------------#
+
+.PHONY: version
+version:
+	@echo "Tecmake Posix Version $(VERSION)"
+
+#---------------------------------#
diff --git a/im/test/im_info.cpp b/im/test/im_info.cpp
index 89ec8c4..00ff5ff 100644
--- a/im/test/im_info.cpp
+++ b/im/test/im_info.cpp
@@ -208,4 +208,3 @@ int main(int argc, char* argv[])
 
   return 1;
 }
-
-- 
cgit v1.2.3