← Back to team overview

openshot.code team mailing list archive

[Merge] lp:~saiarcot895/libopenshot/qt-json into lp:libopenshot

 

Saikrishna Arcot has proposed merging lp:~saiarcot895/libopenshot/qt-json into lp:libopenshot.

Requested reviews:
  OpenShot Code (openshot.code)

For more details, see:
https://code.launchpad.net/~saiarcot895/libopenshot/qt-json/+merge/226240

Replace all uses of JsonCpp with Qt's built in JSON parser.

There are two things of note:
1. Based on the usage here, JsonCpp has a single class (Json::JsonValue) from which you can get the value (int, string, etc.) and you can get to a subtree. However, in Qt, this is separated. There is a class from which you can get the value (QJsonValue), and there is a separate class accessible from QJsonValue from which you can get to a subtree (QJsonObject). The method headers have been changed to use QJsonObject. If there are any cases where an array (QJsonArray) is passed in, this will need to be changed to use QJsonValue.
2. I couldn't determine if there were any tests that read or write JSON files to verify that these methods work correctly. There may be errors here.
-- 
https://code.launchpad.net/~saiarcot895/libopenshot/qt-json/+merge/226240
Your team OpenShot Code is requested to review the proposed merge of lp:~saiarcot895/libopenshot/qt-json into lp:libopenshot.
=== modified file 'include/ChunkReader.h'
--- include/ChunkReader.h	2014-03-29 23:49:22 +0000
+++ include/ChunkReader.h	2014-07-10 03:08:17 +0000
@@ -50,10 +50,10 @@
 #include <fstream>
 #include <omp.h>
 #include <QtCore/qdir.h>
+#include <QJsonObject>
 #include <stdio.h>
 #include <stdlib.h>
 #include <tr1/memory>
-#include "Json.h"
 #include "Magick++.h"
 #include "Cache.h"
 #include "Exceptions.h"
@@ -168,8 +168,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+		void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load QJsonObject into this object
 
 		/// Open the reader. This is required before you can access frames or data from the reader.
 		void Open() throw(InvalidFile);

=== modified file 'include/ChunkWriter.h'
--- include/ChunkWriter.h	2014-06-30 20:37:50 +0000
+++ include/ChunkWriter.h	2014-07-10 03:08:17 +0000
@@ -57,7 +57,6 @@
 #include "Magick++.h"
 #include "Cache.h"
 #include "Exceptions.h"
-#include "Json.h"
 #include "Sleep.h"
 
 

=== modified file 'include/Clip.h'
--- include/Clip.h	2014-03-29 23:49:22 +0000
+++ include/Clip.h	2014-07-10 03:08:17 +0000
@@ -169,8 +169,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate Json::JsonValue for this object
+		void SetJsonValue(QJsonObject root); ///< Load Json::JsonValue into this object
 
 		/// Waveform property
 		bool Waveform() { return waveform; } ///< Get the waveform property of this clip

=== modified file 'include/ClipBase.h'
--- include/ClipBase.h	2014-03-29 23:49:22 +0000
+++ include/ClipBase.h	2014-07-10 03:08:17 +0000
@@ -94,8 +94,8 @@
 		/// Get and Set JSON methods
 		virtual string Json() = 0; ///< Generate JSON string of this object
 		virtual void SetJson(string value) throw(InvalidJSON) = 0; ///< Load JSON string into this object
-		virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
-		virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
+        virtual QJsonObject JsonValue() = 0; ///< Generate QJsonObject for this object
+        virtual void SetJsonValue(QJsonObject root) = 0; ///< Load QJsonObject into this object
 
 	};
 

=== modified file 'include/Color.h'
--- include/Color.h	2014-03-29 23:49:22 +0000
+++ include/Color.h	2014-07-10 03:08:17 +0000
@@ -58,9 +58,9 @@
 
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+        void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 	};
 
 

=== modified file 'include/Coordinate.h'
--- include/Coordinate.h	2014-03-29 23:49:22 +0000
+++ include/Coordinate.h	2014-07-10 03:08:17 +0000
@@ -105,9 +105,9 @@
 
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+        void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 	};
 
 }

=== modified file 'include/DecklinkReader.h'
--- include/DecklinkReader.h	2014-03-29 23:49:22 +0000
+++ include/DecklinkReader.h	2014-07-10 03:08:17 +0000
@@ -127,8 +127,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate Json::JsonValue for this object
+		void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load Json::JsonValue into this object
 
 		/// Open device and video stream - which is called by the constructor automatically
 		void Open() throw(DecklinkError);

=== modified file 'include/DummyReader.h'
--- include/DummyReader.h	2014-03-29 23:49:22 +0000
+++ include/DummyReader.h	2014-07-10 03:08:17 +0000
@@ -94,8 +94,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate Json::JsonValue for this object
+		void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load Json::JsonValue into this object
 
 		/// Open File - which is called by the constructor automatically
 		void Open() throw(InvalidFile);

=== modified file 'include/EffectBase.h'
--- include/EffectBase.h	2014-03-29 23:49:22 +0000
+++ include/EffectBase.h	2014-07-10 03:08:17 +0000
@@ -104,8 +104,8 @@
 		/// Get and Set JSON methods
 		virtual string Json() = 0; ///< Generate JSON string of this object
 		virtual void SetJson(string value) throw(InvalidJSON) = 0; ///< Load JSON string into this object
-		virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
-		virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
+		virtual QJsonObject JsonValue() = 0; ///< Generate Json::JsonValue for this object
+		virtual void SetJsonValue(QJsonObject root) = 0; ///< Load Json::JsonValue into this object
 
 		/// Get the order that this effect should be executed.
 		int Order() { return order; }

=== modified file 'include/FFmpegReader.h'
--- include/FFmpegReader.h	2014-04-02 21:48:27 +0000
+++ include/FFmpegReader.h	2014-07-10 03:08:17 +0000
@@ -255,8 +255,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+		void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load QJsonObject into this object
 
 		/// Open File - which is called by the constructor automatically
 		void Open() throw(InvalidFile, NoStreamsFound, InvalidCodec);

=== modified file 'include/FrameMapper.h'
--- include/FrameMapper.h	2014-03-29 23:49:22 +0000
+++ include/FrameMapper.h	2014-07-10 03:08:17 +0000
@@ -188,8 +188,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+        void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load QJsonObject into this object
 
 		/// Get the target framerate
 		Fraction TargetFPS() { return target; };

=== modified file 'include/ImageReader.h'
--- include/ImageReader.h	2014-03-29 23:49:22 +0000
+++ include/ImageReader.h	2014-07-10 03:08:17 +0000
@@ -106,8 +106,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+        void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load QJsonObject into this object
 
 		/// Open File - which is called by the constructor automatically
 		void Open() throw(InvalidFile);

=== modified file 'include/Json.h'
--- include/Json.h	2014-03-29 23:49:22 +0000
+++ include/Json.h	2014-07-10 03:08:17 +0000
@@ -41,6 +41,7 @@
 #ifndef OPENSHOT_JSON_H
 #define OPENSHOT_JSON_H
 
-#include "../thirdparty/jsoncpp/include/json/json.h"
+#include <QJsonArray>
+#include <QJsonObject>
 
 #endif

=== modified file 'include/KeyFrame.h'
--- include/KeyFrame.h	2014-03-29 23:49:22 +0000
+++ include/KeyFrame.h	2014-07-10 03:08:17 +0000
@@ -149,9 +149,9 @@
 
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+        void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 
 		/**
 		 * @brief Calculate all of the values for this keyframe.

=== modified file 'include/Point.h'
--- include/Point.h	2014-03-29 23:49:22 +0000
+++ include/Point.h	2014-07-10 03:08:17 +0000
@@ -129,9 +129,9 @@
 
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+        void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 
 	};
 

=== modified file 'include/Profiles.h'
--- include/Profiles.h	2014-04-11 05:28:29 +0000
+++ include/Profiles.h	2014-07-10 03:08:17 +0000
@@ -101,9 +101,9 @@
 
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+		QJsonObject JsonValue(); ///< Generate Json::JsonValue for this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+		void SetJsonValue(QJsonObject root); ///< Load Json::JsonValue into this object
 	};
 
 }

=== modified file 'include/ReaderBase.h'
--- include/ReaderBase.h	2014-03-29 23:49:22 +0000
+++ include/ReaderBase.h	2014-07-10 03:08:17 +0000
@@ -47,11 +47,11 @@
 #include <stdlib.h>
 #include "Fraction.h"
 #include "Frame.h"
-#include "Json.h"
 #include <QtCore/qstring.h>
 #include <QGraphicsItem>
 #include <QGraphicsScene>
 #include <QGraphicsPixmapItem>
+#include <QJsonObject>
 #include <QPixmap>
 
 using namespace std;
@@ -137,8 +137,8 @@
 		/// Get and Set JSON methods
 		virtual string Json() = 0; ///< Generate JSON string of this object
 		virtual void SetJson(string value) throw(InvalidJSON) = 0; ///< Load JSON string into this object
-		virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
-		virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
+		virtual QJsonObject JsonValue() = 0; ///< Generate QJsonObject for this object
+		virtual void SetJsonValue(QJsonObject root) = 0; ///< Load QJsonObject into this object
 
 		/// Open the reader (and start consuming resources, such as images or video files)
 		virtual void Open() = 0;

=== modified file 'include/TextReader.h'
--- include/TextReader.h	2014-03-29 23:49:22 +0000
+++ include/TextReader.h	2014-07-10 03:08:17 +0000
@@ -142,8 +142,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile); ///< Load Json::JsonValue into this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+        void SetJsonValue(QJsonObject root) throw(InvalidFile); ///< Load QJsonObject into this object
 
 		/// Open Reader - which is called by the constructor automatically
 		void Open();

=== modified file 'include/Timeline.h'
--- include/Timeline.h	2014-07-03 22:35:31 +0000
+++ include/Timeline.h	2014-07-10 03:08:17 +0000
@@ -158,9 +158,9 @@
 		void add_layer(tr1::shared_ptr<Frame> new_frame, Clip* source_clip, int clip_frame_number, int timeline_frame_number);
 
 		/// Apply JSON Diffs to various objects contained in this timeline
-		void apply_json_to_clips(Json::Value change) throw(InvalidJSONKey); ///<Apply JSON diff to clips
-		void apply_json_to_effects(Json::Value change) throw(InvalidJSONKey); ///<Apply JSON diff to effects
-		void apply_json_to_timeline(Json::Value change) throw(InvalidJSONKey); ///<Apply JSON diff to timeline properties
+		void apply_json_to_clips(QJsonObject change) throw(InvalidJSONKey); ///<Apply JSON diff to clips
+		void apply_json_to_effects(QJsonObject change) throw(InvalidJSONKey); ///<Apply JSON diff to effects
+		void apply_json_to_timeline(QJsonObject change) throw(InvalidJSONKey); ///<Apply JSON diff to timeline properties
 
 		/// Calculate time of a frame number, based on a framerate
 		float calculate_time(int number, Fraction rate);
@@ -224,8 +224,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root) throw(InvalidFile, ReaderClosed); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate Json::JsonValue for this object
+		void SetJsonValue(QJsonObject root) throw(InvalidFile, ReaderClosed); ///< Load Json::JsonValue into this object
 
 		/// @brief Apply a special formatted JSON object, which represents a change to the timeline (add, update, delete)
 		/// This is primarily designed to keep the timeline (and its child objects... such as clips and effects) in sync

=== modified file 'include/WriterBase.h'
--- include/WriterBase.h	2014-03-29 23:49:22 +0000
+++ include/WriterBase.h	2014-07-10 03:08:17 +0000
@@ -112,9 +112,9 @@
 
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+        QJsonObject JsonValue(); ///< Generate QJsonObject for this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+        void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 
 		/// Display file information in the standard output stream (stdout)
 		void DisplayInfo();

=== modified file 'include/effects/ChromaKey.h'
--- include/effects/ChromaKey.h	2014-03-29 23:49:22 +0000
+++ include/effects/ChromaKey.h	2014-07-10 03:08:17 +0000
@@ -98,8 +98,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+		void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 	};
 
 }

=== modified file 'include/effects/Deinterlace.h'
--- include/effects/Deinterlace.h	2014-03-29 23:49:22 +0000
+++ include/effects/Deinterlace.h	2014-07-10 03:08:17 +0000
@@ -94,8 +94,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+		void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 	};
 
 }

=== modified file 'include/effects/Mask.h'
--- include/effects/Mask.h	2014-03-29 23:49:22 +0000
+++ include/effects/Mask.h	2014-07-10 03:08:17 +0000
@@ -107,8 +107,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+		void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 	};
 
 }

=== modified file 'include/effects/Negate.h'
--- include/effects/Negate.h	2014-03-29 23:49:22 +0000
+++ include/effects/Negate.h	2014-07-10 03:08:17 +0000
@@ -85,8 +85,8 @@
 		/// Get and Set JSON methods
 		string Json(); ///< Generate JSON string of this object
 		void SetJson(string value) throw(InvalidJSON); ///< Load JSON string into this object
-		Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
-		void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+		QJsonObject JsonValue(); ///< Generate QJsonObject for this object
+		void SetJsonValue(QJsonObject root); ///< Load QJsonObject into this object
 	};
 
 }

=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt	2014-07-03 22:35:31 +0000
+++ src/CMakeLists.txt	2014-07-10 03:08:17 +0000
@@ -136,10 +136,6 @@
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} ")
 endif(OPENMP_FOUND)
 
-################### JSONCPP #####################
-# Include jsoncpp headers (needed for JSON parsing)
-include_directories("../thirdparty/jsoncpp/include")
-
 ###############  PROFILING  #################
 #set(PROFILER "/usr/lib/libprofiler.so")
 #set(PROFILER "/usr/lib/libtcmalloc.so")
@@ -184,12 +180,7 @@
 		
 		# Qt Video Player
 		${QT_PLAYER_FILES}
-		${MOC_FILES}
-		
-		# Third Party JSON Parser
-		../thirdparty/jsoncpp/src/lib_json/json_reader.cpp
-		../thirdparty/jsoncpp/src/lib_json/json_value.cpp
-		../thirdparty/jsoncpp/src/lib_json/json_writer.cpp )
+		${MOC_FILES} )
 		
 		IF (BLACKMAGIC_FOUND)
 			SET ( OPENSHOT_SOURCE_FILES ${OPENSHOT_SOURCE_FILES} 

=== modified file 'src/ChunkReader.cpp'
--- src/ChunkReader.cpp	2014-06-30 20:37:50 +0000
+++ src/ChunkReader.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/ChunkReader.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -90,45 +91,47 @@
 	}
 
 	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( json_string.str(), root );
-	if (!success)
+	QJsonObject root;
+	QJsonParseError errors;
+
+	QJsonDocument document = QJsonDocument::fromJson(QByteArray(json_string.str().c_str()), &errors);
+	if (errors.error != QJsonParseError::NoError) {
 		// Raise exception
 		throw InvalidJSON("Chunk folder could not be opened.", path);
-
+	}
+	root = document.object();
 
 	// Set info from the JSON objects
 	try
 	{
-		info.has_video = root["has_video"].asBool();
-		info.has_audio = root["has_audio"].asBool();
-		info.duration = root["duration"].asDouble();
-		info.file_size = atoll(root["file_size"].asString().c_str());
-		info.height = root["height"].asInt();
-		info.width = root["width"].asInt();
-		info.pixel_format = root["pixel_format"].asInt();
-		info.fps.num = root["fps"]["num"].asInt();
-		info.fps.den = root["fps"]["den"].asInt();
-		info.video_bit_rate = root["video_bit_rate"].asUInt();
-		info.pixel_ratio.num = root["pixel_ratio"]["num"].asInt();
-		info.pixel_ratio.den = root["pixel_ratio"]["den"].asInt();
-		info.display_ratio.num = root["display_ratio"]["num"].asInt();
-		info.display_ratio.den = root["display_ratio"]["den"].asInt();
-		info.vcodec = root["vcodec"].asString();
-		info.video_length = atoll(root["video_length"].asString().c_str());
-		info.video_stream_index = root["video_stream_index"].asInt();
-		info.video_timebase.num = root["video_timebase"]["num"].asInt();
-		info.video_timebase.den = root["video_timebase"]["den"].asInt();
-		info.interlaced_frame = root["interlaced_frame"].asBool();
-		info.top_field_first = root["top_field_first"].asBool();
-		info.acodec = root["acodec"].asString();
-		info.audio_bit_rate = root["audio_bit_rate"].asUInt();
-		info.sample_rate = root["sample_rate"].asUInt();
-		info.channels = root["channels"].asInt();
-		info.audio_stream_index = root["audio_stream_index"].asInt();
-		info.audio_timebase.num = root["audio_timebase"]["num"].asInt();
-		info.audio_timebase.den = root["audio_timebase"]["den"].asInt();
+        info.has_video = root["has_video"].toBool();
+		info.has_audio = root["has_audio"].toBool();
+		info.duration = root["duration"].toDouble();
+		info.file_size = atoll(root["file_size"].toString().toLocal8Bit().constData());
+		info.height = root["height"].toInt();
+		info.width = root["width"].toInt();
+		info.pixel_format = root["pixel_format"].toInt();
+		info.fps.num = root["fps"].toObject()["num"].toInt();
+		info.fps.den = root["fps"].toObject()["den"].toInt();
+        info.video_bit_rate = QVariant(root["video_bit_rate"]).toUInt();
+		info.pixel_ratio.num = root["pixel_ratio"].toObject()["num"].toInt();
+		info.pixel_ratio.den = root["pixel_ratio"].toObject()["den"].toInt();
+		info.display_ratio.num = root["display_ratio"].toObject()["num"].toInt();
+		info.display_ratio.den = root["display_ratio"].toObject()["den"].toInt();
+		info.vcodec = root["vcodec"].toString().toLocal8Bit().constData();
+        info.video_length = atoll(root["video_length"].toString().toLocal8Bit().constData());
+		info.video_stream_index = root["video_stream_index"].toInt();
+		info.video_timebase.num = root["video_timebase"].toObject()["num"].toInt();
+		info.video_timebase.den = root["video_timebase"].toObject()["den"].toInt();
+		info.interlaced_frame = root["interlaced_frame"].toBool();
+		info.top_field_first = root["top_field_first"].toBool();
+		info.acodec = root["acodec"].toString().toLocal8Bit().constData();
+        info.audio_bit_rate = QVariant(root["audio_bit_rate"]).toUInt();
+        info.sample_rate = QVariant(root["sample_rate"]).toUInt();
+		info.channels = root["channels"].toInt();
+		info.audio_stream_index = root["audio_stream_index"].toInt();
+		info.audio_timebase.num = root["audio_timebase"].toObject()["num"].toInt();
+		info.audio_timebase.den = root["audio_timebase"].toObject()["den"].toInt();
 
 	}
 	catch (exception e)
@@ -269,19 +272,20 @@
 // Generate JSON string of this object
 string ChunkReader::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value ChunkReader::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject ChunkReader::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "ChunkReader";
-	root["path"] = path;
-	root["chunk_size"] = chunk_size;
-	root["chunk_version"] = version;
+    QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+    root.insert("type", QJsonValue(QLatin1String("ChunkReader")));
+    root.insert("path", QJsonValue(QString(path.c_str())));
+    root.insert("chunk_size", QJsonValue(chunk_size));
+    root.insert("chunk_version", QJsonValue(version));
 
 	// return JsonValue
 	return root;
@@ -291,12 +295,16 @@
 void ChunkReader::SetJson(string value) throw(InvalidJSON) {
 
 	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -310,19 +318,19 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void ChunkReader::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void ChunkReader::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["path"].isNull())
-		path = root["path"].asString();
+        path = root["path"].toString().toLocal8Bit().constData();
 	if (!root["chunk_size"].isNull())
-		chunk_size = root["chunk_size"].asInt();
+        chunk_size = root["chunk_size"].toInt();
 	if (!root["chunk_version"].isNull())
-		version = (ChunkVersion) root["chunk_version"].asInt();
+        version = (ChunkVersion) root["chunk_version"].toInt();
 
 	// Re-Open path, and re-init everything (if needed)
 	if (is_open)

=== modified file 'src/Clip.cpp'
--- src/Clip.cpp	2014-03-29 23:49:22 +0000
+++ src/Clip.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/Clip.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -524,45 +525,46 @@
 // Generate JSON string of this object
 string Clip::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Clip::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Clip::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ClipBase::JsonValue(); // get parent properties
-	root["gravity"] = gravity;
-	root["scale"] = scale;
-	root["anchor"] = anchor;
-	root["waveform"] = waveform;
-	root["scale_x"] = scale_x.JsonValue();
-	root["scale_y"] = scale_y.JsonValue();
-	root["location_x"] = location_x.JsonValue();
-	root["location_y"] = location_y.JsonValue();
-	root["alpha"] = alpha.JsonValue();
-	root["rotation"] = rotation.JsonValue();
-	root["time"] = time.JsonValue();
-	root["volume"] = volume.JsonValue();
-	root["wave_color"] = wave_color.JsonValue();
-	root["crop_width"] = crop_width.JsonValue();
-	root["crop_height"] = crop_height.JsonValue();
-	root["crop_x"] = crop_x.JsonValue();
-	root["crop_y"] = crop_y.JsonValue();
-	root["shear_x"] = shear_x.JsonValue();
-	root["shear_y"] = shear_y.JsonValue();
-	root["perspective_c1_x"] = perspective_c1_x.JsonValue();
-	root["perspective_c1_y"] = perspective_c1_y.JsonValue();
-	root["perspective_c2_x"] = perspective_c2_x.JsonValue();
-	root["perspective_c2_y"] = perspective_c2_y.JsonValue();
-	root["perspective_c3_x"] = perspective_c3_x.JsonValue();
-	root["perspective_c3_y"] = perspective_c3_y.JsonValue();
-	root["perspective_c4_x"] = perspective_c4_x.JsonValue();
-	root["perspective_c4_y"] = perspective_c4_y.JsonValue();
+	QJsonObject root = ClipBase::JsonValue(); // get parent properties
+	root.insert("gravity", QJsonValue(gravity));
+	root.insert("scale", QJsonValue(scale));
+	root.insert("anchor", QJsonValue(anchor));
+	root.insert("waveform", QJsonValue(waveform));
+	root.insert("scale_x", QJsonValue(scale_x.JsonValue()));
+	root.insert("scale_y", QJsonValue(scale_y.JsonValue()));
+	root.insert("location_x", QJsonValue(location_x.JsonValue()));
+	root.insert("location_y", QJsonValue(location_y.JsonValue()));
+	root.insert("alpha", QJsonValue(alpha.JsonValue()));
+	root.insert("rotation", QJsonValue(rotation.JsonValue()));
+	root.insert("time", QJsonValue(time.JsonValue()));
+	root.insert("volume", QJsonValue(volume.JsonValue()));
+	root.insert("wave_color", QJsonValue(wave_color.JsonValue()));
+	root.insert("crop_width", QJsonValue(crop_width.JsonValue()));
+	root.insert("crop_height", QJsonValue(crop_height.JsonValue()));
+	root.insert("crop_x", QJsonValue(crop_x.JsonValue()));
+	root.insert("crop_y", QJsonValue(crop_y.JsonValue()));
+	root.insert("shear_x", QJsonValue(shear_x.JsonValue()));
+	root.insert("shear_y", QJsonValue(shear_y.JsonValue()));
+	root.insert("perspective_c1_x", QJsonValue(perspective_c1_x.JsonValue()));
+	root.insert("perspective_c1_y", QJsonValue(perspective_c1_y.JsonValue()));
+	root.insert("perspective_c2_x", QJsonValue(perspective_c2_x.JsonValue()));
+	root.insert("perspective_c2_y", QJsonValue(perspective_c2_y.JsonValue()));
+	root.insert("perspective_c3_x", QJsonValue(perspective_c3_x.JsonValue()));
+	root.insert("perspective_c3_y", QJsonValue(perspective_c3_y.JsonValue()));
+	root.insert("perspective_c4_x", QJsonValue(perspective_c4_x.JsonValue()));
+	root.insert("perspective_c4_y", QJsonValue(perspective_c4_y.JsonValue()));
 
 	if (reader)
-		root["reader"] = reader->JsonValue();
+		root.insert("reader", QJsonValue(reader->JsonValue()));
 
 	// return JsonValue
 	return root;
@@ -571,13 +573,15 @@
 // Load JSON string into this object
 void Clip::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
 
 	try
 	{
@@ -591,70 +595,70 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Clip::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Clip::SetJsonValue(QJsonObject root) {
 
 	// Set parent data
 	ClipBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["gravity"].isNull())
-		gravity = (GravityType) root["gravity"].asInt();
+		gravity = (GravityType) root["gravity"].toInt();
 	if (!root["scale"].isNull())
-		scale = (ScaleType) root["scale"].asInt();
+		scale = (ScaleType) root["scale"].toInt();
 	if (!root["anchor"].isNull())
-		anchor = (AnchorType) root["anchor"].asInt();
+		anchor = (AnchorType) root["anchor"].toInt();
 	if (!root["waveform"].isNull())
-		waveform = root["waveform"].asBool();
+		waveform = root["waveform"].toBool();
 	if (!root["scale_x"].isNull())
-		scale_x.SetJsonValue(root["scale_x"]);
+        scale_x.SetJsonValue(root["scale_x"].toObject());
 	if (!root["scale_y"].isNull())
-		scale_y.SetJsonValue(root["scale_y"]);
+        scale_y.SetJsonValue(root["scale_y"].toObject());
 	if (!root["location_x"].isNull())
-		location_x.SetJsonValue(root["location_x"]);
+        location_x.SetJsonValue(root["location_x"].toObject());
 	if (!root["location_y"].isNull())
-		location_y.SetJsonValue(root["location_y"]);
+        location_y.SetJsonValue(root["location_y"].toObject());
 	if (!root["alpha"].isNull())
-		alpha.SetJsonValue(root["alpha"]);
+        alpha.SetJsonValue(root["alpha"].toObject());
 	if (!root["rotation"].isNull())
-		rotation.SetJsonValue(root["rotation"]);
+        rotation.SetJsonValue(root["rotation"].toObject());
 	if (!root["time"].isNull())
-		time.SetJsonValue(root["time"]);
+        time.SetJsonValue(root["time"].toObject());
 	if (!root["volume"].isNull())
-		volume.SetJsonValue(root["volume"]);
+        volume.SetJsonValue(root["volume"].toObject());
 	if (!root["wave_color"].isNull())
-		wave_color.SetJsonValue(root["wave_color"]);
+        wave_color.SetJsonValue(root["wave_color"].toObject());
 	if (!root["crop_width"].isNull())
-		crop_width.SetJsonValue(root["crop_width"]);
+        crop_width.SetJsonValue(root["crop_width"].toObject());
 	if (!root["crop_height"].isNull())
-		crop_height.SetJsonValue(root["crop_height"]);
+        crop_height.SetJsonValue(root["crop_height"].toObject());
 	if (!root["crop_x"].isNull())
-		crop_x.SetJsonValue(root["crop_x"]);
+        crop_x.SetJsonValue(root["crop_x"].toObject());
 	if (!root["crop_y"].isNull())
-		crop_y.SetJsonValue(root["crop_y"]);
+        crop_y.SetJsonValue(root["crop_y"].toObject());
 	if (!root["shear_x"].isNull())
-		shear_x.SetJsonValue(root["shear_x"]);
+        shear_x.SetJsonValue(root["shear_x"].toObject());
 	if (!root["shear_y"].isNull())
-		shear_y.SetJsonValue(root["shear_y"]);
+        shear_y.SetJsonValue(root["shear_y"].toObject());
 	if (!root["perspective_c1_x"].isNull())
-		perspective_c1_x.SetJsonValue(root["perspective_c1_x"]);
+        perspective_c1_x.SetJsonValue(root["perspective_c1_x"].toObject());
 	if (!root["perspective_c1_y"].isNull())
-		perspective_c1_y.SetJsonValue(root["perspective_c1_y"]);
+        perspective_c1_y.SetJsonValue(root["perspective_c1_y"].toObject());
 	if (!root["perspective_c2_x"].isNull())
-		perspective_c2_x.SetJsonValue(root["perspective_c2_x"]);
+        perspective_c2_x.SetJsonValue(root["perspective_c2_x"].toObject());
 	if (!root["perspective_c2_y"].isNull())
-		perspective_c2_y.SetJsonValue(root["perspective_c2_y"]);
+        perspective_c2_y.SetJsonValue(root["perspective_c2_y"].toObject());
 	if (!root["perspective_c3_x"].isNull())
-		perspective_c3_x.SetJsonValue(root["perspective_c3_x"]);
+        perspective_c3_x.SetJsonValue(root["perspective_c3_x"].toObject());
 	if (!root["perspective_c3_y"].isNull())
-		perspective_c3_y.SetJsonValue(root["perspective_c3_y"]);
+        perspective_c3_y.SetJsonValue(root["perspective_c3_y"].toObject());
 	if (!root["perspective_c4_x"].isNull())
-		perspective_c4_x.SetJsonValue(root["perspective_c4_x"]);
+        perspective_c4_x.SetJsonValue(root["perspective_c4_x"].toObject());
 	if (!root["perspective_c4_y"].isNull())
-		perspective_c4_y.SetJsonValue(root["perspective_c4_y"]);
+        perspective_c4_y.SetJsonValue(root["perspective_c4_y"].toObject());
 	if (!root["reader"].isNull()) // does Json contain a reader?
 	{
-		if (!root["reader"]["type"].isNull()) // does the reader Json contain a 'type'?
+        if (!root["reader"].toObject()["type"].isNull()) // does the reader Json contain a 'type'?
 		{
 			// Close previous reader (if any)
 			bool already_open = false;
@@ -670,37 +674,37 @@
 			}
 
 			// Create new reader (and load properties)
-			string type = root["reader"]["type"].asString();
+            string type = root["reader"].toObject()["type"].toString().toLocal8Bit().constData();
 
 			if (type == "FFmpegReader") {
 
 				// Create new reader
-				reader = new FFmpegReader(root["reader"]["path"].asString());
-				reader->SetJsonValue(root["reader"]);
+                reader = new FFmpegReader(root["reader"].toObject()["path"].toString().toLocal8Bit().constData());
+                reader->SetJsonValue(root["reader"].toObject());
 
 			} else if (type == "ImageReader") {
 
 				// Create new reader
-				reader = new ImageReader(root["reader"]["path"].asString());
-				reader->SetJsonValue(root["reader"]);
+                reader = new ImageReader(root["reader"].toObject()["path"].toString().toLocal8Bit().constData());
+                reader->SetJsonValue(root["reader"].toObject());
 
 			} else if (type == "TextReader") {
 
 				// Create new reader
 				reader = new TextReader();
-				reader->SetJsonValue(root["reader"]);
+                reader->SetJsonValue(root["reader"].toObject());
 
 			} else if (type == "ChunkReader") {
 
 				// Create new reader
-				reader = new ChunkReader(root["reader"]["path"].asString(), (ChunkVersion) root["reader"]["chunk_version"].asInt());
-				reader->SetJsonValue(root["reader"]);
+                reader = new ChunkReader(root["reader"].toObject()["path"].toString().toLocal8Bit().constData(), (ChunkVersion) root["reader"].toObject()["chunk_version"].toInt());
+                reader->SetJsonValue(root["reader"].toObject());
 
 			} else if (type == "DummyReader") {
 
 				// Create new reader
 				reader = new DummyReader();
-				reader->SetJsonValue(root["reader"]);
+                reader->SetJsonValue(root["reader"].toObject());
 			}
 
 			// Re-Open reader (if needed)

=== modified file 'src/ClipBase.cpp'
--- src/ClipBase.cpp	2014-03-29 23:49:22 +0000
+++ src/ClipBase.cpp	2014-07-10 03:08:17 +0000
@@ -42,34 +42,34 @@
 
 using namespace openshot;
 
-// Generate Json::JsonValue for this object
-Json::Value ClipBase::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject ClipBase::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["id"] = Id();
-	root["position"] = Position();
-	root["layer"] = Layer();
-	root["start"] = Start();
-	root["end"] = End();
-	root["duration"] = Duration();
+    QJsonObject root;
+    root.insert("id", QJsonValue(QString(Id().c_str())));
+    root.insert("position", QJsonValue(Position()));
+    root.insert("layer", QJsonValue(Layer()));
+    root.insert("start", QJsonValue(Start()));
+    root.insert("end", QJsonValue(End()));
+    root.insert("duration", QJsonValue(Duration()));
 
 	// return JsonValue
 	return root;
 }
 
-// Load Json::JsonValue into this object
-void ClipBase::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void ClipBase::SetJsonValue(QJsonObject root) {
 
 	// Set data from Json (if key is found)
 	if (!root["id"].isNull())
-		Id(root["id"].asString());
+        Id(root["id"].toString().toLocal8Bit().constData());
 	if (!root["position"].isNull())
-		Position(root["position"].asDouble());
+        Position(root["position"].toDouble());
 	if (!root["layer"].isNull())
-		Layer(root["layer"].asInt());
+        Layer(root["layer"].toInt());
 	if (!root["start"].isNull())
-		Start(root["start"].asDouble());
+        Start(root["start"].toDouble());
 	if (!root["end"].isNull())
-		End(root["end"].asDouble());
+        End(root["end"].toDouble());
 }

=== modified file 'src/Color.cpp'
--- src/Color.cpp	2014-03-29 23:49:22 +0000
+++ src/Color.cpp	2014-07-10 03:08:17 +0000
@@ -39,24 +39,26 @@
  */
 
 #include "../include/Color.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
 // Generate JSON string of this object
 string Color::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Color::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Color::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["red"] = red.JsonValue();
-	root["green"] = green.JsonValue();
-	root["blue"] = blue.JsonValue();
+    QJsonObject root;
+    root.insert("red", QJsonValue(red.JsonValue()));
+    root.insert("green", QJsonValue(green.JsonValue()));
+    root.insert("blue", QJsonValue(blue.JsonValue()));
 
 	// return JsonValue
 	return root;
@@ -65,13 +67,17 @@
 // Load JSON string into this object
 void Color::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -85,14 +91,14 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Color::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Color::SetJsonValue(QJsonObject root) {
 
 	// Set data from Json (if key is found)
 	if (!root["red"].isNull())
-		red.SetJsonValue(root["red"]);
+        red.SetJsonValue(root["red"].toObject());
 	if (!root["green"].isNull())
-		green.SetJsonValue(root["green"]);
+        green.SetJsonValue(root["green"].toObject());
 	if (!root["blue"].isNull())
-		blue.SetJsonValue(root["blue"]);
+        blue.SetJsonValue(root["blue"].toObject());
 }

=== modified file 'src/Coordinate.cpp'
--- src/Coordinate.cpp	2014-05-16 19:48:25 +0000
+++ src/Coordinate.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/Coordinate.h"
+#include <QJsonParseError>
 
 using namespace std;
 using namespace openshot;
@@ -57,22 +58,23 @@
 // Generate JSON string of this object
 string Coordinate::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Coordinate::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Coordinate::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["X"] = X;
-	root["Y"] = Y;
-	//root["increasing"] = increasing;
-	//root["repeated"] = Json::Value(Json::objectValue);
-	//root["repeated"]["num"] = repeated.num;
-	//root["repeated"]["den"] = repeated.den;
-	//root["delta"] = delta;
+	QJsonObject root;
+	root.insert("X", QJsonValue(X));
+	root.insert("Y", QJsonValue(Y));
+	//root.insert("increasing", QJsonValue(increasing));
+	//root.insert("repeated", QJsonValue(QJsonObject(Json::objectValue)));
+	//root.insert("repeated"]["num", QJsonValue(repeated.num));
+	//root.insert("repeated"]["den", QJsonValue(repeated.den));
+	//root.insert("delta", QJsonValue(delta));
 
 	// return JsonValue
 	return root;
@@ -81,13 +83,17 @@
 // Load JSON string into this object
 void Coordinate::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -101,23 +107,23 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Coordinate::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Coordinate::SetJsonValue(QJsonObject root) {
 
 	// Set data from Json (if key is found)
 	if (!root["X"].isNull())
-		X = root["X"].asDouble();
+		X = root["X"].toDouble();
 	if (!root["Y"].isNull())
-		Y = root["Y"].asDouble();
+		Y = root["Y"].toDouble();
 	if (!root["increasing"].isNull())
-		increasing = root["increasing"].asBool();
+		increasing = root["increasing"].toBool();
 	if (!root["repeated"].isNull() && root["repeated"].isObject())
 	{
-		if (!root["repeated"]["num"].isNull())
-			repeated.num = root["repeated"]["num"].asInt();
-		if (!root["repeated"]["den"].isNull())
-			repeated.den = root["repeated"]["den"].asInt();
+        if (!root["repeated"].toObject()["num"].isNull())
+            repeated.num = root["repeated"].toObject()["num"].toInt();
+        if (!root["repeated"].toObject()["den"].isNull())
+            repeated.den = root["repeated"].toObject()["den"].toInt();
 	}
 	if (!root["delta"].isNull())
-		delta = root["delta"].asDouble();
+		delta = root["delta"].toDouble();
 }

=== modified file 'src/DecklinkReader.cpp'
--- src/DecklinkReader.cpp	2014-03-29 23:49:22 +0000
+++ src/DecklinkReader.cpp	2014-07-10 03:08:17 +0000
@@ -265,12 +265,12 @@
 	return JsonValue().toStyledString();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value DecklinkReader::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject DecklinkReader::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "DecklinkReader";
+	QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue("DecklinkReader"));
 
 	// return JsonValue
 	return root;
@@ -280,7 +280,7 @@
 void DecklinkReader::SetJson(string value) throw(InvalidJSON) {
 
 	// Parse JSON string into JSON objects
-	Json::Value root;
+	QJsonObject root;
 	Json::Reader reader;
 	bool success = reader.parse( value, root );
 	if (!success)
@@ -299,8 +299,8 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void DecklinkReader::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void DecklinkReader::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);

=== modified file 'src/DummyReader.cpp'
--- src/DummyReader.cpp	2014-03-29 23:49:22 +0000
+++ src/DummyReader.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/DummyReader.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -136,16 +137,17 @@
 // Generate JSON string of this object
 string DummyReader::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value DummyReader::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject DummyReader::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "DummyReader";
+	QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("DummyReader")));
 
 	// return JsonValue
 	return root;
@@ -154,13 +156,17 @@
 // Load JSON string into this object
 void DummyReader::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -174,8 +180,8 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void DummyReader::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void DummyReader::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);

=== modified file 'src/EffectBase.cpp'
--- src/EffectBase.cpp	2014-03-29 23:49:22 +0000
+++ src/EffectBase.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/EffectBase.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -74,16 +75,17 @@
 // Generate JSON string of this object
 string EffectBase::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value EffectBase::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject EffectBase::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ClipBase::JsonValue(); // get parent properties
-	root["order"] = Order();
+	QJsonObject root = ClipBase::JsonValue(); // get parent properties
+	root.insert("order", QJsonValue(Order()));
 
 	// return JsonValue
 	return root;
@@ -92,13 +94,17 @@
 // Load JSON string into this object
 void EffectBase::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -112,13 +118,13 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void EffectBase::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void EffectBase::SetJsonValue(QJsonObject root) {
 
 	// Set parent data
 	ClipBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["order"].isNull())
-		Order(root["order"].asInt());
+		Order(root["order"].toInt());
 }

=== modified file 'src/FFmpegReader.cpp'
--- src/FFmpegReader.cpp	2014-04-05 15:19:20 +0000
+++ src/FFmpegReader.cpp	2014-07-10 03:08:17 +0000
@@ -42,6 +42,7 @@
  */
 
 #include "../include/FFmpegReader.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -1577,17 +1578,18 @@
 // Generate JSON string of this object
 string FFmpegReader::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value FFmpegReader::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject FFmpegReader::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "FFmpegReader";
-	root["path"] = path;
+	QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("FFmpegReader")));
+    root.insert("path", QJsonValue(QString(path.c_str())));
 
 	// return JsonValue
 	return root;
@@ -1596,13 +1598,17 @@
 // Load JSON string into this object
 void FFmpegReader::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -1616,15 +1622,15 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void FFmpegReader::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void FFmpegReader::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["path"].isNull())
-		path = root["path"].asString();
+		path = root["path"].toString().toLocal8Bit().constData();
 
 	// Re-Open path, and re-init everything (if needed)
 	if (is_open)

=== modified file 'src/FrameMapper.cpp'
--- src/FrameMapper.cpp	2014-03-29 23:49:22 +0000
+++ src/FrameMapper.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/FrameMapper.h"
+#include <QJsonParseError>
 
 using namespace std;
 using namespace openshot;
@@ -450,31 +451,36 @@
 // Generate JSON string of this object
 string FrameMapper::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value FrameMapper::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject FrameMapper::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "FrameMapper";
+    QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+    root.insert("type", QJsonValue(QLatin1String("FrameMapper")));
 
-	// return JsonValue
+    // return QJsonObject
 	return root;
 }
 
 // Load JSON string into this object
 void FrameMapper::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -488,8 +494,8 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void FrameMapper::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void FrameMapper::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);

=== modified file 'src/ImageReader.cpp'
--- src/ImageReader.cpp	2014-03-29 23:49:22 +0000
+++ src/ImageReader.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/ImageReader.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -137,32 +138,37 @@
 // Generate JSON string of this object
 string ImageReader::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value ImageReader::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject ImageReader::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "ImageReader";
-	root["path"] = path;
+    QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+    root.insert("type", QJsonValue(QLatin1String("ImageReader")));
+    root.insert("path", QJsonValue(QString(path.c_str())));
 
-	// return JsonValue
+    // return QJsonObject
 	return root;
 }
 
 // Load JSON string into this object
 void ImageReader::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -176,15 +182,15 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void ImageReader::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void ImageReader::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["path"].isNull())
-		path = root["path"].asString();
+        path = root["path"].toString().toLocal8Bit().constData();
 
 	// Re-Open path, and re-init everything (if needed)
 	if (is_open)

=== modified file 'src/KeyFrame.cpp'
--- src/KeyFrame.cpp	2014-03-29 23:49:22 +0000
+++ src/KeyFrame.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/KeyFrame.h"
+#include <QJsonParseError>
 
 using namespace std;
 using namespace openshot;
@@ -253,24 +254,25 @@
 // Generate JSON string of this object
 string Keyframe::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Keyframe::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Keyframe::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["Points"] = Json::Value(Json::arrayValue);
+    QJsonObject root;
+    root.insert("Points", QJsonValue(QJsonArray()));
 
 	// loop through points, and find a matching coordinate
 	for (int x = 0; x < Points.size(); x++) {
 		// Get each point
 		Point existing_point = Points[x];
-		root["Points"].append(existing_point.JsonValue());
+        root["Points"].toArray().append(existing_point.JsonValue());
 	}
-	//root["Auto_Handle_Percentage"] = Auto_Handle_Percentage;
+	//root.insert("Auto_Handle_Percentage", QJsonValue(Auto_Handle_Percentage));
 
 	// return JsonValue
 	return root;
@@ -279,13 +281,17 @@
 // Load JSON string into this object
 void Keyframe::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -299,8 +305,8 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Keyframe::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Keyframe::SetJsonValue(QJsonObject root) {
 
 	// mark as dirty
 	needs_update = true;
@@ -310,9 +316,9 @@
 
 	if (!root["Points"].isNull())
 		// loop through points
-		for (int x = 0; x < root["Points"].size(); x++) {
+        for (int x = 0; x < root["Points"].toArray().size(); x++) {
 			// Get each point
-			Json::Value existing_point = root["Points"][x];
+            QJsonObject existing_point = root["Points"].toArray()[x].toObject();
 
 			// Create Point
 			Point p;
@@ -325,7 +331,7 @@
 		}
 
 	if (!root["Auto_Handle_Percentage"].isNull())
-		Auto_Handle_Percentage = root["Auto_Handle_Percentage"].asBool();
+        Auto_Handle_Percentage = root["Auto_Handle_Percentage"].toBool();
 
 }
 

=== modified file 'src/Point.cpp'
--- src/Point.cpp	2014-03-29 23:49:22 +0000
+++ src/Point.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/Point.h"
+#include <QJsonParseError>
 
 using namespace std;
 using namespace openshot;
@@ -109,22 +110,23 @@
 // Generate JSON string of this object
 string Point::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Point::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Point::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["co"] = co.JsonValue();
+    QJsonObject root;
+    root.insert("co", QJsonValue(co.JsonValue()));
 	if (interpolation == BEZIER) {
-		root["handle_left"] = handle_left.JsonValue();
-		root["handle_right"] = handle_right.JsonValue();
-		root["handle_type"] = handle_type;
+        root.insert("handle_left", QJsonValue(handle_left.JsonValue()));
+        root.insert("handle_right", QJsonValue(handle_right.JsonValue()));
+        root.insert("handle_type", QJsonValue(handle_type));
 	}
-	root["interpolation"] = interpolation;
+    root.insert("interpolation", QJsonValue(interpolation));
 
 	// return JsonValue
 	return root;
@@ -133,13 +135,17 @@
 // Load JSON string into this object
 void Point::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -153,18 +159,18 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Point::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Point::SetJsonValue(QJsonObject root) {
 
 	if (!root["co"].isNull())
-		co.SetJsonValue(root["co"]); // update coordinate
+        co.SetJsonValue(root["co"].toObject()); // update coordinate
 	if (!root["handle_left"].isNull())
-		handle_left.SetJsonValue(root["handle_left"]); // update coordinate
+        handle_left.SetJsonValue(root["handle_left"].toObject()); // update coordinate
 	if (!root["handle_right"].isNull())
-		handle_right.SetJsonValue(root["handle_right"]); // update coordinate
+        handle_right.SetJsonValue(root["handle_right"].toObject()); // update coordinate
 	if (!root["interpolation"].isNull())
-		interpolation = (InterpolationType) root["interpolation"].asInt();
+        interpolation = (InterpolationType) root["interpolation"].toInt();
 	if (!root["handle_type"].isNull())
-		handle_type = (HandleType) root["handle_type"].asInt();
+        handle_type = (HandleType) root["handle_type"].toInt();
 
 }

=== modified file 'src/Profiles.cpp'
--- src/Profiles.cpp	2014-04-11 05:28:29 +0000
+++ src/Profiles.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/Profiles.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -149,28 +150,29 @@
 // Generate JSON string of this object
 string Profile::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Profile::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Profile::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["height"] = info.height;
-	root["width"] = info.width;
-	root["pixel_format"] = info.pixel_format;
-	root["fps"] = Json::Value(Json::objectValue);
-	root["fps"]["num"] = info.fps.num;
-	root["fps"]["den"] = info.fps.den;
-	root["pixel_ratio"] = Json::Value(Json::objectValue);
-	root["pixel_ratio"]["num"] = info.pixel_ratio.num;
-	root["pixel_ratio"]["den"] = info.pixel_ratio.den;
-	root["display_ratio"] = Json::Value(Json::objectValue);
-	root["display_ratio"]["num"] = info.display_ratio.num;
-	root["display_ratio"]["den"] = info.display_ratio.den;
-	root["interlaced_frame"] = info.interlaced_frame;
+	QJsonObject root;
+	root.insert("height", QJsonValue(info.height));
+	root.insert("width", QJsonValue(info.width));
+	root.insert("pixel_format", QJsonValue(info.pixel_format));
+    root.insert("fps", QJsonValue(QJsonObject()));
+    root["fps"].toObject().insert("num", QJsonValue(info.fps.num));
+    root["fps"].toObject().insert("den", QJsonValue(info.fps.den));
+    root.insert("pixel_ratio", QJsonValue(QJsonObject()));
+    root["pixel_ratio"].toObject().insert("num", QJsonValue(info.pixel_ratio.num));
+    root["pixel_ratio"].toObject().insert("den", QJsonValue(info.pixel_ratio.den));
+    root.insert("display_ratio", QJsonValue(QJsonObject()));
+    root["display_ratio"].toObject().insert("num", QJsonValue(info.display_ratio.num));
+    root["display_ratio"].toObject().insert("den", QJsonValue(info.display_ratio.den));
+	root.insert("interlaced_frame", QJsonValue(info.interlaced_frame));
 
 	// return JsonValue
 	return root;
@@ -179,13 +181,17 @@
 // Load JSON string into this object
 void Profile::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -199,28 +205,28 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Profile::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Profile::SetJsonValue(QJsonObject root) {
 
 	if (!root["height"].isNull())
-		info.height = root["height"].asInt();
+		info.height = root["height"].toInt();
 	if (!root["width"].isNull())
-		info.width = root["width"].asInt();
+		info.width = root["width"].toInt();
 	if (!root["pixel_format"].isNull())
-		info.pixel_format = root["pixel_format"].asInt();
+		info.pixel_format = root["pixel_format"].toInt();
 	if (!root["fps"].isNull()) {
-		info.fps.num = root["fps"]["num"].asInt();
-		info.fps.den = root["fps"]["den"].asInt();
+        info.fps.num = root["fps"].toObject()["num"].toInt();
+        info.fps.den = root["fps"].toObject()["den"].toInt();
 	}
 	if (!root["pixel_ratio"].isNull()) {
-		info.pixel_ratio.num = root["pixel_ratio"]["num"].asInt();
-		info.pixel_ratio.den = root["pixel_ratio"]["den"].asInt();
+        info.pixel_ratio.num = root["pixel_ratio"].toObject()["num"].toInt();
+        info.pixel_ratio.den = root["pixel_ratio"].toObject()["den"].toInt();
 	}
 	if (!root["display_ratio"].isNull()) {
-		info.display_ratio.num = root["display_ratio"]["num"].asInt();
-		info.display_ratio.den = root["display_ratio"]["den"].asInt();
+        info.display_ratio.num = root["display_ratio"].toObject()["num"].toInt();
+        info.display_ratio.den = root["display_ratio"].toObject()["den"].toInt();
 	}
 	if (!root["interlaced_frame"].isNull())
-		info.interlaced_frame = root["interlaced_frame"].asBool();
+		info.interlaced_frame = root["interlaced_frame"].toBool();
 
 }

=== modified file 'src/ReaderBase.cpp'
--- src/ReaderBase.cpp	2014-05-16 19:48:25 +0000
+++ src/ReaderBase.cpp	2014-07-10 03:08:17 +0000
@@ -108,123 +108,123 @@
 	cout << "----------------------------" << endl;
 }
 
-// Generate Json::JsonValue for this object
-Json::Value ReaderBase::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject ReaderBase::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["has_video"] = info.has_video;
-	root["has_audio"] = info.has_audio;
-	root["duration"] = info.duration;
+	QJsonObject root;
+	root.insert("has_video", QJsonValue(info.has_video));
+	root.insert("has_audio", QJsonValue(info.has_audio));
+	root.insert("duration", QJsonValue(info.duration));
 	stringstream filesize_stream;
 	filesize_stream << info.file_size;
-	root["file_size"] = filesize_stream.str();
-	root["height"] = info.height;
-	root["width"] = info.width;
-	root["pixel_format"] = info.pixel_format;
-	root["fps"] = Json::Value(Json::objectValue);
-	root["fps"]["num"] = info.fps.num;
-	root["fps"]["den"] = info.fps.den;
-	root["video_bit_rate"] = info.video_bit_rate;
-	root["pixel_ratio"] = Json::Value(Json::objectValue);
-	root["pixel_ratio"]["num"] = info.pixel_ratio.num;
-	root["pixel_ratio"]["den"] = info.pixel_ratio.den;
-	root["display_ratio"] = Json::Value(Json::objectValue);
-	root["display_ratio"]["num"] = info.display_ratio.num;
-	root["display_ratio"]["den"] = info.display_ratio.den;
-	root["vcodec"] = info.vcodec;
+    root.insert("file_size", QJsonValue(QString(filesize_stream.str().c_str())));
+	root.insert("height", QJsonValue(info.height));
+	root.insert("width", QJsonValue(info.width));
+	root.insert("pixel_format", QJsonValue(info.pixel_format));
+    root.insert("fps", QJsonValue(QJsonObject()));
+    root["fps"].toObject().insert("num", QJsonValue(info.fps.num));
+    root["fps"].toObject().insert("den", QJsonValue(info.fps.den));
+	root.insert("video_bit_rate", QJsonValue(info.video_bit_rate));
+    root.insert("pixel_ratio", QJsonValue(QJsonObject()));
+    root["pixel_ratio"].toObject().insert("num", QJsonValue(info.pixel_ratio.num));
+    root["pixel_ratio"].toObject().insert("den", QJsonValue(info.pixel_ratio.den));
+    root.insert("display_ratio", QJsonValue(QJsonObject()));
+    root["display_ratio"].toObject().insert("num", QJsonValue(info.display_ratio.num));
+    root["display_ratio"].toObject().insert("den", QJsonValue(info.display_ratio.den));
+    root.insert("vcodec", QJsonValue(QString(info.vcodec.c_str())));
 	stringstream video_length_stream;
 	video_length_stream << info.video_length;
-	root["video_length"] = video_length_stream.str();
-	root["video_stream_index"] = info.video_stream_index;
-	root["video_timebase"] = Json::Value(Json::objectValue);
-	root["video_timebase"]["num"] = info.video_timebase.num;
-	root["video_timebase"]["den"] = info.video_timebase.den;
-	root["interlaced_frame"] = info.interlaced_frame;
-	root["top_field_first"] = info.top_field_first;
-	root["acodec"] = info.acodec;
-	root["audio_bit_rate"] = info.audio_bit_rate;
-	root["sample_rate"] = info.sample_rate;
-	root["channels"] = info.channels;
-	root["audio_stream_index"] = info.audio_stream_index;
-	root["audio_timebase"] = Json::Value(Json::objectValue);
-	root["audio_timebase"]["num"] = info.audio_timebase.num;
-	root["audio_timebase"]["den"] = info.audio_timebase.den;
+    root.insert("video_length", QJsonValue(QString(video_length_stream.str().c_str())));
+	root.insert("video_stream_index", QJsonValue(info.video_stream_index));
+    root.insert("video_timebase", QJsonValue(QJsonObject()));
+    root["video_timebase"].toObject().insert("num", QJsonValue(info.video_timebase.num));
+    root["video_timebase"].toObject().insert("den", QJsonValue(info.video_timebase.den));
+	root.insert("interlaced_frame", QJsonValue(info.interlaced_frame));
+	root.insert("top_field_first", QJsonValue(info.top_field_first));
+    root.insert("acodec", QJsonValue(QString(info.acodec.c_str())));
+	root.insert("audio_bit_rate", QJsonValue(info.audio_bit_rate));
+	root.insert("sample_rate", QJsonValue(info.sample_rate));
+	root.insert("channels", QJsonValue(info.channels));
+	root.insert("audio_stream_index", QJsonValue(info.audio_stream_index));
+    root.insert("audio_timebase", QJsonValue(QJsonObject()));
+    root["audio_timebase"].toObject().insert("num", QJsonValue(info.audio_timebase.num));
+    root["audio_timebase"].toObject().insert("den", QJsonValue(info.audio_timebase.den));
 
 	// return JsonValue
 	return root;
 }
 
-// Load Json::JsonValue into this object
-void ReaderBase::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void ReaderBase::SetJsonValue(QJsonObject root) {
 
 	// Set data from Json (if key is found)
 	if (!root["has_video"].isNull())
-		info.has_video = root["has_video"].asBool();
+		info.has_video = root["has_video"].toBool();
 	if (!root["has_audio"].isNull())
-		info.has_audio = root["has_audio"].asBool();
+		info.has_audio = root["has_audio"].toBool();
 	if (!root["duration"].isNull())
-		info.duration = root["duration"].asDouble();
+		info.duration = root["duration"].toDouble();
 	if (!root["file_size"].isNull())
-		info.file_size = atoll(root["file_size"].asString().c_str());
+        info.file_size = atoll(root["file_size"].toString().toLocal8Bit().constData());
 	if (!root["height"].isNull())
-		info.height = root["height"].asInt();
+		info.height = root["height"].toInt();
 	if (!root["width"].isNull())
-		info.width = root["width"].asInt();
+		info.width = root["width"].toInt();
 	if (!root["pixel_format"].isNull())
-		info.pixel_format = root["pixel_format"].asInt();
+		info.pixel_format = root["pixel_format"].toInt();
 	if (!root["fps"].isNull() && root["fps"].isObject()) {
-		if (!root["fps"]["num"].isNull())
-			info.fps.num = root["fps"]["num"].asInt();
-		if (!root["fps"]["den"].isNull())
-		info.fps.den = root["fps"]["den"].asInt();
+        if (!root["fps"].toObject()["num"].isNull())
+            info.fps.num = root["fps"].toObject()["num"].toInt();
+        if (!root["fps"].toObject()["den"].isNull())
+        info.fps.den = root["fps"].toObject()["den"].toInt();
 	}
 	if (!root["video_bit_rate"].isNull())
-		info.video_bit_rate = root["video_bit_rate"].asInt();
+		info.video_bit_rate = root["video_bit_rate"].toInt();
 	if (!root["pixel_ratio"].isNull() && root["pixel_ratio"].isObject()) {
-		if (!root["pixel_ratio"]["num"].isNull())
-			info.pixel_ratio.num = root["pixel_ratio"]["num"].asInt();
-		if (!root["pixel_ratio"]["den"].isNull())
-			info.pixel_ratio.den = root["pixel_ratio"]["den"].asInt();
+        if (!root["pixel_ratio"].toObject()["num"].isNull())
+            info.pixel_ratio.num = root["pixel_ratio"].toObject()["num"].toInt();
+        if (!root["pixel_ratio"].toObject()["den"].isNull())
+            info.pixel_ratio.den = root["pixel_ratio"].toObject()["den"].toInt();
 	}
 	if (!root["display_ratio"].isNull() && root["display_ratio"].isObject()) {
-		if (!root["display_ratio"]["num"].isNull())
-			info.display_ratio.num = root["display_ratio"]["num"].asInt();
-		if (!root["display_ratio"]["den"].isNull())
-			info.display_ratio.den = root["display_ratio"]["den"].asInt();
+        if (!root["display_ratio"].toObject()["num"].isNull())
+            info.display_ratio.num = root["display_ratio"].toObject()["num"].toInt();
+        if (!root["display_ratio"].toObject()["den"].isNull())
+            info.display_ratio.den = root["display_ratio"].toObject()["den"].toInt();
 	}
 	if (!root["vcodec"].isNull())
-		info.vcodec = root["vcodec"].asString();
+		info.vcodec = root["vcodec"].toString().toLocal8Bit().constData();
 	if (!root["video_length"].isNull())
-		info.video_length = atoll(root["video_length"].asString().c_str());
+        info.video_length = atoll(root["video_length"].toString().toLocal8Bit().constData());
 	if (!root["video_stream_index"].isNull())
-		info.video_stream_index = root["video_stream_index"].asInt();
+		info.video_stream_index = root["video_stream_index"].toInt();
 	if (!root["video_timebase"].isNull() && root["video_timebase"].isObject()) {
-		if (!root["video_timebase"]["num"].isNull())
-			info.video_timebase.num = root["video_timebase"]["num"].asInt();
-		if (!root["video_timebase"]["den"].isNull())
-			info.video_timebase.den = root["video_timebase"]["den"].asInt();
+        if (!root["video_timebase"].toObject()["num"].isNull())
+            info.video_timebase.num = root["video_timebase"].toObject()["num"].toInt();
+        if (!root["video_timebase"].toObject()["den"].isNull())
+            info.video_timebase.den = root["video_timebase"].toObject()["den"].toInt();
 	}
 	if (!root["interlaced_frame"].isNull())
-		info.interlaced_frame = root["interlaced_frame"].asBool();
+		info.interlaced_frame = root["interlaced_frame"].toBool();
 	if (!root["top_field_first"].isNull())
-		info.top_field_first = root["top_field_first"].asBool();
+		info.top_field_first = root["top_field_first"].toBool();
 	if (!root["acodec"].isNull())
-		info.acodec = root["acodec"].asString();
+		info.acodec = root["acodec"].toString().toLocal8Bit().constData();
 
 	if (!root["audio_bit_rate"].isNull())
-		info.audio_bit_rate = root["audio_bit_rate"].asInt();
+		info.audio_bit_rate = root["audio_bit_rate"].toInt();
 	if (!root["sample_rate"].isNull())
-		info.sample_rate = root["sample_rate"].asInt();
+		info.sample_rate = root["sample_rate"].toInt();
 	if (!root["channels"].isNull())
-		info.channels = root["channels"].asInt();
+		info.channels = root["channels"].toInt();
 	if (!root["audio_stream_index"].isNull())
-		info.audio_stream_index = root["audio_stream_index"].asInt();
+		info.audio_stream_index = root["audio_stream_index"].toInt();
 	if (!root["audio_timebase"].isNull() && root["audio_timebase"].isObject()) {
-		if (!root["audio_timebase"]["num"].isNull())
-			info.audio_timebase.num = root["audio_timebase"]["num"].asInt();
-		if (!root["audio_timebase"]["den"].isNull())
-			info.audio_timebase.den = root["audio_timebase"]["den"].asInt();
+        if (!root["audio_timebase"].toObject()["num"].isNull())
+            info.audio_timebase.num = root["audio_timebase"].toObject()["num"].toInt();
+        if (!root["audio_timebase"].toObject()["den"].isNull())
+            info.audio_timebase.den = root["audio_timebase"].toObject()["den"].toInt();
 	}
 }
 

=== modified file 'src/TextReader.cpp'
--- src/TextReader.cpp	2014-06-30 20:37:50 +0000
+++ src/TextReader.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/TextReader.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -189,41 +190,46 @@
 // Generate JSON string of this object
 string TextReader::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value TextReader::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject TextReader::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "TextReader";
-	root["width"] = width;
-	root["height"] = height;
-	root["x_offset"] = x_offset;
-	root["y_offset"] = y_offset;
-	root["text"] = text;
-	root["font"] = font;
-	root["size"] = size;
-	root["text_color"] = text_color;
-	root["background_color"] = background_color;
-	root["gravity"] = gravity;
+	QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("TextReader")));
+	root.insert("width", QJsonValue(width));
+	root.insert("height", QJsonValue(height));
+	root.insert("x_offset", QJsonValue(x_offset));
+	root.insert("y_offset", QJsonValue(y_offset));
+    root.insert("text", QJsonValue(QString(text.c_str())));
+    root.insert("font", QJsonValue(QString(font.c_str())));
+	root.insert("size", QJsonValue(size));
+    root.insert("text_color", QJsonValue(QString(text_color.c_str())));
+    root.insert("background_color", QJsonValue(QString(background_color.c_str())));
+	root.insert("gravity", QJsonValue(gravity));
 
-	// return JsonValue
+    // return QJsonObject
 	return root;
 }
 
 // Load JSON string into this object
 void TextReader::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -237,33 +243,33 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void TextReader::SetJsonValue(Json::Value root) throw(InvalidFile) {
+// Load QJsonObject into this object
+void TextReader::SetJsonValue(QJsonObject root) throw(InvalidFile) {
 
 	// Set parent data
 	ReaderBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["width"].isNull())
-		width = root["width"].asInt();
+		width = root["width"].toInt();
 	if (!root["height"].isNull())
-		height = root["height"].asInt();
+		height = root["height"].toInt();
 	if (!root["x_offset"].isNull())
-		x_offset = root["x_offset"].asInt();
+		x_offset = root["x_offset"].toInt();
 	if (!root["y_offset"].isNull())
-		y_offset = root["y_offset"].asInt();
+		y_offset = root["y_offset"].toInt();
 	if (!root["text"].isNull())
-		text = root["text"].asString();
+		text = root["text"].toString().toLocal8Bit().constData();
 	if (!root["font"].isNull())
-		font = root["font"].asString();
+		font = root["font"].toString().toLocal8Bit().constData();
 	if (!root["size"].isNull())
-		size = root["size"].asDouble();
+		size = root["size"].toDouble();
 	if (!root["text_color"].isNull())
-		text_color = root["text_color"].asString();
+		text_color = root["text_color"].toString().toLocal8Bit().constData();
 	if (!root["background_color"].isNull())
-		background_color = root["background_color"].asString();
+		background_color = root["background_color"].toString().toLocal8Bit().constData();
 	if (!root["gravity"].isNull())
-		gravity = (GravityType) root["gravity"].asInt();
+		gravity = (GravityType) root["gravity"].toInt();
 
 	// Re-Open path, and re-init everything (if needed)
 	if (is_open)

=== modified file 'src/Timeline.cpp'
--- src/Timeline.cpp	2014-07-03 17:26:02 +0000
+++ src/Timeline.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/Timeline.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -542,23 +543,24 @@
 // Generate JSON string of this object
 string Timeline::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Timeline::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Timeline::JsonValue() {
 
 	// Create root json object
-	Json::Value root = ReaderBase::JsonValue(); // get parent properties
-	root["type"] = "Timeline";
-	root["viewport_scale"] = viewport_scale.JsonValue();
-	root["viewport_x"] = viewport_x.JsonValue();
-	root["viewport_y"] = viewport_y.JsonValue();
-	root["color"] = color.JsonValue();
+	QJsonObject root = ReaderBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("Timeline")));
+	root.insert("viewport_scale", QJsonValue(viewport_scale.JsonValue()));
+	root.insert("viewport_x", QJsonValue(viewport_x.JsonValue()));
+	root.insert("viewport_y", QJsonValue(viewport_y.JsonValue()));
+	root.insert("color", QJsonValue(color.JsonValue()));
 
 	// Add array of clips
-	root["clips"] = Json::Value(Json::arrayValue);
+    root.insert("clips", QJsonValue(QJsonObject()));
 
 	// Find Clips at this time
 	list<Clip*>::iterator clip_itr;
@@ -566,11 +568,11 @@
 	{
 		// Get clip object from the iterator
 		Clip *existing_clip = (*clip_itr);
-		root["clips"].append(existing_clip->JsonValue());
+        root["clips"].toArray().append(existing_clip->JsonValue());
 	}
 
 	// Add array of effects
-	root["effects"] = Json::Value(Json::arrayValue);
+    root.insert("effects", QJsonValue(QJsonObject()));
 
 	// loop through effects
 	list<EffectBase*>::iterator effect_itr;
@@ -578,7 +580,7 @@
 	{
 		// Get clip object from the iterator
 		EffectBase *existing_effect = (*effect_itr);
-		root["effects"].append(existing_effect->JsonValue());
+        root["effects"].toArray().append(existing_effect->JsonValue());
 	}
 
 	// return JsonValue
@@ -588,13 +590,17 @@
 // Load JSON string into this object
 void Timeline::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -608,8 +614,8 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Timeline::SetJsonValue(Json::Value root) throw(InvalidFile, ReaderClosed) {
+// Load QJsonObject into this object
+void Timeline::SetJsonValue(QJsonObject root) throw(InvalidFile, ReaderClosed) {
 
 	// Close timeline before we do anything (this also removes all open and closing clips)
 	Close();
@@ -622,9 +628,9 @@
 
 	if (!root["clips"].isNull())
 		// loop through clips
-		for (int x = 0; x < root["clips"].size(); x++) {
+        for (int x = 0; x < root["clips"].toArray().size(); x++) {
 			// Get each clip
-			Json::Value existing_clip = root["clips"][x];
+            QJsonObject existing_clip = root["clips"].toArray()[x].toObject();
 
 			// Create Clip
 			Clip *c = new Clip();
@@ -641,25 +647,25 @@
 
 	if (!root["effects"].isNull())
 		// loop through effects
-		for (int x = 0; x < root["effects"].size(); x++) {
+        for (int x = 0; x < root["effects"].toArray().size(); x++) {
 			// Get each effect
-			Json::Value existing_effect = root["effects"][x];
+            QJsonObject existing_effect = root["effects"].toArray()[x].toObject();
 
 			// Create Effect
 			EffectBase *e = NULL;
 
 			if (!existing_effect["type"].isNull())
 				// Init the matching effect object
-				if (existing_effect["type"].asString() == "ChromaKey")
+                if (existing_effect["type"].toString() == "ChromaKey")
 					e = new ChromaKey();
 
-				else if (existing_effect["type"].asString() == "Deinterlace")
+                else if (existing_effect["type"].toString() == "Deinterlace")
 					e = new Deinterlace();
 
-				else if (existing_effect["type"].asString() == "Mask")
+                else if (existing_effect["type"].toString() == "Mask")
 					e = new Mask();
 
-				else if (existing_effect["type"].asString() == "Negate")
+                else if (existing_effect["type"].toString() == "Negate")
 					e = new Negate();
 
 			// Load Json into Effect
@@ -676,21 +682,25 @@
 	// Clear internal cache (since things are about to change)
 	final_cache.Clear();
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success || !root.isArray())
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid).", "");
+    // Parse JSON string into JSON objects
+    QJsonArray root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.array();
 
 	try
 	{
 		// Process the JSON change array, loop through each item
-		for (int x = 0; x < root.size(); x++) {
+        for (int x = 0; x < root.size(); x++) {
 			// Get each change
-			Json::Value change = root[x];
-			string root_key = change["key"][(uint)0].asString();
+            QJsonObject change = root[x].toObject();
+            QString root_key = change["key"].toArray()[0].toString();
 
 			// Process each type of change
 			if (root_key == "clips")
@@ -715,23 +725,23 @@
 }
 
 // Apply JSON diff to clips
-void Timeline::apply_json_to_clips(Json::Value change) throw(InvalidJSONKey) {
+void Timeline::apply_json_to_clips(QJsonObject change) throw(InvalidJSONKey) {
 
 	// Get key and type of change
-	string change_type = change["type"].asString();
-	string clip_id = "";
+    QString change_type = change["type"].toString();
+    QString clip_id;
 	Clip *existing_clip = NULL;
 
 	// Find id of clip (if any)
-	for (int x = 0; x < change["key"].size(); x++) {
+    for (int x = 0; x < change["key"].toArray().size(); x++) {
 		// Get each change
-		Json::Value key_part = change["key"][x];
+        QJsonValue key_part = change["key"].toArray()[x];
 
-		if (key_part.isObject()) {
+        if (key_part.isObject()) {
 			// Check for id
-			if (!key_part["id"].isNull()) {
+            if (!key_part.toObject()["id"].isNull()) {
 				// Set the id
-				clip_id = key_part["id"].asString();
+                clip_id = key_part.toObject()["id"].toString();
 
 				// Find matching clip in timeline (if any)
 				list<Clip*>::iterator clip_itr;
@@ -739,7 +749,7 @@
 				{
 					// Get clip object from the iterator
 					Clip *c = (*clip_itr);
-					if (c->Id() == clip_id) {
+                    if (c->Id().c_str() == clip_id) {
 						existing_clip = c;
 						break; // clip found, exit loop
 					}
@@ -754,14 +764,14 @@
 
 		// Create new clip
 		Clip *clip = new Clip();
-		clip->SetJsonValue(change["value"]); // Set properties of new clip from JSON
+        clip->SetJsonValue(change["value"].toObject()); // Set properties of new clip from JSON
 		AddClip(clip); // Add clip to timeline
 
 	} else if (change_type == "update") {
 
 		// Update existing clip
 		if (existing_clip)
-			existing_clip->SetJsonValue(change["value"]); // Update clip properties from JSON
+            existing_clip->SetJsonValue(change["value"].toObject()); // Update clip properties from JSON
 
 	} else if (change_type == "delete") {
 
@@ -774,24 +784,24 @@
 }
 
 // Apply JSON diff to effects
-void Timeline::apply_json_to_effects(Json::Value change) throw(InvalidJSONKey) {
+void Timeline::apply_json_to_effects(QJsonObject change) throw(InvalidJSONKey) {
 
 	// Get key and type of change
-	string change_type = change["type"].asString();
-	string effect_id = "";
+    QString change_type = change["type"].toString();
+    QString effect_id;
 	EffectBase *existing_effect = NULL;
 
 	// Find id of an effect (if any)
-	for (int x = 0; x < change["key"].size(); x++) {
+    for (int x = 0; x < change["key"].toArray().size(); x++) {
 		// Get each change
-		Json::Value key_part = change["key"][x];
+        QJsonValue key_part = change["key"].toArray()[x];
 
 		if (key_part.isObject()) {
 			// Check for id
-			if (!key_part["id"].isNull())
+            if (!key_part.toObject()["id"].isNull())
 			{
 				// Set the id
-				effect_id = key_part["id"].asString();
+                effect_id = key_part.toObject()["id"].toString();
 
 				// Find matching effect in timeline (if any)
 				list<EffectBase*>::iterator effect_itr;
@@ -799,7 +809,7 @@
 				{
 					// Get effect object from the iterator
 					EffectBase *e = (*effect_itr);
-					if (e->Id() == effect_id) {
+                    if (e->Id().c_str() == effect_id) {
 						existing_effect = e;
 						break; // effect found, exit loop
 					}
@@ -813,7 +823,7 @@
 	if (change_type == "insert") {
 
 		// Determine type of effect
-		string effect_type = change["value"]["type"].asString();
+        QString effect_type = change["value"].toObject()["type"].toString();
 
 		// Create Effect
 		EffectBase *e = NULL;
@@ -832,7 +842,7 @@
 			e = new Negate();
 
 		// Load Json into Effect
-		e->SetJsonValue(change["value"]);
+        e->SetJsonValue(change["value"].toObject());
 
 		// Add Effect to Timeline
 		AddEffect(e);
@@ -841,7 +851,7 @@
 
 		// Update existing effect
 		if (existing_effect)
-			existing_effect->SetJsonValue(change["value"]); // Update effect properties from JSON
+            existing_effect->SetJsonValue(change["value"].toObject()); // Update effect properties from JSON
 
 	} else if (change_type == "delete") {
 
@@ -854,11 +864,11 @@
 }
 
 // Apply JSON diff to timeline properties
-void Timeline::apply_json_to_timeline(Json::Value change) throw(InvalidJSONKey) {
+void Timeline::apply_json_to_timeline(QJsonObject change) throw(InvalidJSONKey) {
 
 	// Get key and type of change
-	string change_type = change["type"].asString();
-	string root_key = change["key"][(uint)0].asString();
+    QString change_type = change["type"].toString();
+    QString root_key = change["key"].toArray()[0].toString();
 
 	// Determine type of change operation
 	if (change_type == "insert" || change_type == "update") {
@@ -867,22 +877,25 @@
 		// Check for valid property
 		if (root_key == "color")
 			// Set color
-			color.SetJsonValue(change["value"]);
+            color.SetJsonValue(change["value"].toObject());
 		else if (root_key == "viewport_scale")
 			// Set viewport scale
-			viewport_scale.SetJsonValue(change["value"]);
+            viewport_scale.SetJsonValue(change["value"].toObject());
 		else if (root_key == "viewport_x")
 			// Set viewport x offset
-			viewport_x.SetJsonValue(change["value"]);
+            viewport_x.SetJsonValue(change["value"].toObject());
 		else if (root_key == "viewport_y")
 			// Set viewport y offset
-			viewport_y.SetJsonValue(change["value"]);
-		else
+            viewport_y.SetJsonValue(change["value"].toObject());
+        else {
 			// Error parsing JSON (or missing keys)
-			throw InvalidJSONKey("JSON change key is invalid", change.toStyledString());
-
-
-	} else if (change["type"].asString() == "delete") {
+            QJsonDocument document;
+            document.setObject(change);
+            throw InvalidJSONKey("JSON change key is invalid", document.toJson().constData());
+        }
+
+
+    } else if (change["type"].toString() == "delete") {
 
 		// DELETE / RESET
 		// Reset the following properties (since we can't delete them)
@@ -898,9 +911,12 @@
 			viewport_x = Keyframe(0.0);
 		else if (root_key == "viewport_y")
 			viewport_y = Keyframe(0.0);
-		else
-			// Error parsing JSON (or missing keys)
-			throw InvalidJSONKey("JSON change key is invalid", change.toStyledString());
+        else {
+            // Error parsing JSON (or missing keys)
+            QJsonDocument document;
+            document.setObject(change);
+            throw InvalidJSONKey("JSON change key is invalid", document.toJson().constData());
+        }
 
 	}
 

=== modified file 'src/WriterBase.cpp'
--- src/WriterBase.cpp	2014-05-16 19:48:25 +0000
+++ src/WriterBase.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../include/WriterBase.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -144,52 +145,53 @@
 // Generate JSON string of this object
 string WriterBase::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value WriterBase::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject WriterBase::JsonValue() {
 
 	// Create root json object
-	Json::Value root;
-	root["has_video"] = info.has_video;
-	root["has_audio"] = info.has_audio;
-	root["duration"] = info.duration;
+	QJsonObject root;
+	root.insert("has_video", QJsonValue(info.has_video));
+	root.insert("has_audio", QJsonValue(info.has_audio));
+	root.insert("duration", QJsonValue(info.duration));
 	stringstream filesize_stream;
 	filesize_stream << info.file_size;
-	root["file_size"] = filesize_stream.str();
-	root["height"] = info.height;
-	root["width"] = info.width;
-	root["pixel_format"] = info.pixel_format;
-	root["fps"] = Json::Value(Json::objectValue);
-	root["fps"]["num"] = info.fps.num;
-	root["fps"]["den"] = info.fps.den;
-	root["video_bit_rate"] = info.video_bit_rate;
-	root["pixel_ratio"] = Json::Value(Json::objectValue);
-	root["pixel_ratio"]["num"] = info.pixel_ratio.num;
-	root["pixel_ratio"]["den"] = info.pixel_ratio.den;
-	root["display_ratio"] = Json::Value(Json::objectValue);
-	root["display_ratio"]["num"] = info.display_ratio.num;
-	root["display_ratio"]["den"] = info.display_ratio.den;
-	root["vcodec"] = info.vcodec;
+    root.insert("file_size", QJsonValue(QString(filesize_stream.str().c_str())));
+	root.insert("height", QJsonValue(info.height));
+	root.insert("width", QJsonValue(info.width));
+	root.insert("pixel_format", QJsonValue(info.pixel_format));
+    root.insert("fps", QJsonValue(QJsonObject()));
+    root["fps"].toObject().insert("num", QJsonValue(info.fps.num));
+    root["fps"].toObject().insert("den", QJsonValue(info.fps.den));
+	root.insert("video_bit_rate", QJsonValue(info.video_bit_rate));
+    root.insert("pixel_ratio", QJsonValue(QJsonObject()));
+    root["pixel_ratio"].toObject().insert("num", QJsonValue(info.pixel_ratio.num));
+    root["pixel_ratio"].toObject().insert("den", QJsonValue(info.pixel_ratio.den));
+    root.insert("display_ratio", QJsonValue(QJsonObject()));
+    root["display_ratio"].toObject().insert("num", QJsonValue(info.display_ratio.num));
+    root["display_ratio"].toObject().insert("den", QJsonValue(info.display_ratio.den));
+    root.insert("vcodec", QJsonValue(QString(info.vcodec.c_str())));
 	stringstream video_length_stream;
 	video_length_stream << info.video_length;
-	root["video_length"] = video_length_stream.str();
-	root["video_stream_index"] = info.video_stream_index;
-	root["video_timebase"] = Json::Value(Json::objectValue);
-	root["video_timebase"]["num"] = info.video_timebase.num;
-	root["video_timebase"]["den"] = info.video_timebase.den;
-	root["interlaced_frame"] = info.interlaced_frame;
-	root["top_field_first"] = info.top_field_first;
-	root["acodec"] = info.acodec;
-	root["audio_bit_rate"] = info.audio_bit_rate;
-	root["sample_rate"] = info.sample_rate;
-	root["channels"] = info.channels;
-	root["audio_stream_index"] = info.audio_stream_index;
-	root["audio_timebase"] = Json::Value(Json::objectValue);
-	root["audio_timebase"]["num"] = info.audio_timebase.num;
-	root["audio_timebase"]["den"] = info.audio_timebase.den;
+    root.insert("video_length", QJsonValue(QString(video_length_stream.str().c_str())));
+	root.insert("video_stream_index", QJsonValue(info.video_stream_index));
+    root.insert("video_timebase", QJsonValue(QJsonObject()));
+    root["video_timebase"].toObject().insert("num", QJsonValue(info.video_timebase.num));
+    root["video_timebase"].toObject().insert("den", QJsonValue(info.video_timebase.den));
+	root.insert("interlaced_frame", QJsonValue(info.interlaced_frame));
+	root.insert("top_field_first", QJsonValue(info.top_field_first));
+    root.insert("acodec", QJsonValue(QString(info.acodec.c_str())));
+	root.insert("audio_bit_rate", QJsonValue(info.audio_bit_rate));
+	root.insert("sample_rate", QJsonValue(info.sample_rate));
+	root.insert("channels", QJsonValue(info.channels));
+	root.insert("audio_stream_index", QJsonValue(info.audio_stream_index));
+    root.insert("audio_timebase", QJsonValue(QJsonObject()));
+    root["audio_timebase"].toObject().insert("num", QJsonValue(info.audio_timebase.num));
+    root["audio_timebase"].toObject().insert("den", QJsonValue(info.audio_timebase.den));
 
 	// return JsonValue
 	return root;
@@ -198,13 +200,17 @@
 // Load JSON string into this object
 void WriterBase::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -218,75 +224,75 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void WriterBase::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void WriterBase::SetJsonValue(QJsonObject root) {
 
 	// Set data from Json (if key is found)
 	if (!root["has_video"].isNull())
-		info.has_video = root["has_video"].asBool();
+        info.has_video = root["has_video"].toBool();
 	if (!root["has_audio"].isNull())
-		info.has_audio = root["has_audio"].asBool();
+        info.has_audio = root["has_audio"].toBool();
 	if (!root["duration"].isNull())
-		info.duration = root["duration"].asDouble();
+        info.duration = root["duration"].toDouble();
 	if (!root["file_size"].isNull())
-		info.file_size = (long long) root["file_size"].asUInt();
+        info.file_size = (long long) QVariant(root["file_size"]).toUInt();
 	if (!root["height"].isNull())
-		info.height = root["height"].asInt();
+        info.height = root["height"].toInt();
 	if (!root["width"].isNull())
-		info.width = root["width"].asInt();
+        info.width = root["width"].toInt();
 	if (!root["pixel_format"].isNull())
-		info.pixel_format = root["pixel_format"].asInt();
+        info.pixel_format = root["pixel_format"].toInt();
 	if (!root["fps"].isNull() && root["fps"].isObject()) {
-		if (!root["fps"]["num"].isNull())
-			info.fps.num = root["fps"]["num"].asInt();
-		if (!root["fps"]["den"].isNull())
-		info.fps.den = root["fps"]["den"].asInt();
+        if (!root["fps"].toObject()["num"].isNull())
+            info.fps.num = root["fps"].toObject()["num"].toInt();
+        if (!root["fps"].toObject()["den"].isNull())
+        info.fps.den = root["fps"].toObject()["den"].toInt();
 	}
 	if (!root["video_bit_rate"].isNull())
-		info.video_bit_rate = root["video_bit_rate"].asInt();
+        info.video_bit_rate = root["video_bit_rate"].toInt();
 	if (!root["pixel_ratio"].isNull() && root["pixel_ratio"].isObject()) {
-		if (!root["pixel_ratio"]["num"].isNull())
-			info.pixel_ratio.num = root["pixel_ratio"]["num"].asInt();
-		if (!root["pixel_ratio"]["den"].isNull())
-			info.pixel_ratio.den = root["pixel_ratio"]["den"].asInt();
+        if (!root["pixel_ratio"].toObject()["num"].isNull())
+            info.pixel_ratio.num = root["pixel_ratio"].toObject()["num"].toInt();
+        if (!root["pixel_ratio"].toObject()["den"].isNull())
+            info.pixel_ratio.den = root["pixel_ratio"].toObject()["den"].toInt();
 	}
 	if (!root["display_ratio"].isNull() && root["display_ratio"].isObject()) {
-		if (!root["display_ratio"]["num"].isNull())
-			info.display_ratio.num = root["display_ratio"]["num"].asInt();
-		if (!root["display_ratio"]["den"].isNull())
-			info.display_ratio.den = root["display_ratio"]["den"].asInt();
+        if (!root["display_ratio"].toObject()["num"].isNull())
+            info.display_ratio.num = root["display_ratio"].toObject()["num"].toInt();
+        if (!root["display_ratio"].toObject()["den"].isNull())
+            info.display_ratio.den = root["display_ratio"].toObject()["den"].toInt();
 	}
 	if (!root["vcodec"].isNull())
-		info.vcodec = root["vcodec"].asString();
+        info.vcodec = root["vcodec"].toString().toLocal8Bit().constData();
 	if (!root["video_length"].isNull())
-		info.video_length = (long int) root["video_length"].asUInt();
+        info.video_length = (long int) QVariant(root["video_length"]).toUInt();
 	if (!root["video_stream_index"].isNull())
-		info.video_stream_index = root["video_stream_index"].asInt();
+        info.video_stream_index = root["video_stream_index"].toInt();
 	if (!root["video_timebase"].isNull() && root["video_timebase"].isObject()) {
-		if (!root["video_timebase"]["num"].isNull())
-			info.video_timebase.num = root["video_timebase"]["num"].asInt();
-		if (!root["video_timebase"]["den"].isNull())
-			info.video_timebase.den = root["video_timebase"]["den"].asInt();
+        if (!root["video_timebase"].toObject()["num"].isNull())
+            info.video_timebase.num = root["video_timebase"].toObject()["num"].toInt();
+        if (!root["video_timebase"].toObject()["den"].isNull())
+            info.video_timebase.den = root["video_timebase"].toObject()["den"].toInt();
 	}
 	if (!root["interlaced_frame"].isNull())
-		info.interlaced_frame = root["interlaced_frame"].asBool();
+        info.interlaced_frame = root["interlaced_frame"].toBool();
 	if (!root["top_field_first"].isNull())
-		info.top_field_first = root["top_field_first"].asBool();
+        info.top_field_first = root["top_field_first"].toBool();
 	if (!root["acodec"].isNull())
-		info.acodec = root["acodec"].asString();
+        info.acodec = root["acodec"].toString().toLocal8Bit().constData();
 
 	if (!root["audio_bit_rate"].isNull())
-		info.audio_bit_rate = root["audio_bit_rate"].asInt();
+        info.audio_bit_rate = root["audio_bit_rate"].toInt();
 	if (!root["sample_rate"].isNull())
-		info.sample_rate = root["sample_rate"].asInt();
+        info.sample_rate = root["sample_rate"].toInt();
 	if (!root["channels"].isNull())
-		info.channels = root["channels"].asInt();
+        info.channels = root["channels"].toInt();
 	if (!root["audio_stream_index"].isNull())
-		info.audio_stream_index = root["audio_stream_index"].asInt();
+        info.audio_stream_index = root["audio_stream_index"].toInt();
 	if (!root["audio_timebase"].isNull() && root["audio_timebase"].isObject()) {
-		if (!root["audio_timebase"]["num"].isNull())
-			info.audio_timebase.num = root["audio_timebase"]["num"].asInt();
-		if (!root["audio_timebase"]["den"].isNull())
-			info.audio_timebase.den = root["audio_timebase"]["den"].asInt();
+        if (!root["audio_timebase"].toObject()["num"].isNull())
+            info.audio_timebase.num = root["audio_timebase"].toObject()["num"].toInt();
+        if (!root["audio_timebase"].toObject()["den"].isNull())
+            info.audio_timebase.den = root["audio_timebase"].toObject()["den"].toInt();
 	}
 }

=== modified file 'src/effects/ChromaKey.cpp'
--- src/effects/ChromaKey.cpp	2014-07-03 17:26:02 +0000
+++ src/effects/ChromaKey.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../../include/effects/ChromaKey.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -82,18 +83,19 @@
 // Generate JSON string of this object
 string ChromaKey::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value ChromaKey::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject ChromaKey::JsonValue() {
 
 	// Create root json object
-	Json::Value root = EffectBase::JsonValue(); // get parent properties
-	root["type"] = "ChromaKey";
-	root["color"] = color.JsonValue();
-	root["fuzz"] = fuzz.JsonValue();
+	QJsonObject root = EffectBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("ChromaKey")));
+	root.insert("color", QJsonValue(color.JsonValue()));
+	root.insert("fuzz", QJsonValue(fuzz.JsonValue()));
 
 	// return JsonValue
 	return root;
@@ -102,13 +104,17 @@
 // Load JSON string into this object
 void ChromaKey::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -122,15 +128,15 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void ChromaKey::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void ChromaKey::SetJsonValue(QJsonObject root) {
 
 	// Set parent data
 	EffectBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["color"].isNull())
-		color.SetJsonValue(root["color"]);
+        color.SetJsonValue(root["color"].toObject());
 	if (!root["fuzz"].isNull())
-		fuzz.SetJsonValue(root["fuzz"]);
+        fuzz.SetJsonValue(root["fuzz"].toObject());
 }

=== modified file 'src/effects/Deinterlace.cpp'
--- src/effects/Deinterlace.cpp	2014-04-11 03:38:01 +0000
+++ src/effects/Deinterlace.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../../include/effects/Deinterlace.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -87,17 +88,18 @@
 // Generate JSON string of this object
 string Deinterlace::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Deinterlace::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Deinterlace::JsonValue() {
 
 	// Create root json object
-	Json::Value root = EffectBase::JsonValue(); // get parent properties
-	root["type"] = "Deinterlace";
-	root["isOdd"] = isOdd;
+	QJsonObject root = EffectBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("Deinterlace")));
+	root.insert("isOdd", QJsonValue(isOdd));
 
 	// return JsonValue
 	return root;
@@ -106,13 +108,17 @@
 // Load JSON string into this object
 void Deinterlace::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -126,13 +132,13 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Deinterlace::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Deinterlace::SetJsonValue(QJsonObject root) {
 
 	// Set parent data
 	EffectBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["isOdd"].isNull())
-		isOdd = root["isOdd"].asBool();
+        isOdd = root["isOdd"].toBool();
 }

=== modified file 'src/effects/Mask.cpp'
--- src/effects/Mask.cpp	2014-04-11 03:38:01 +0000
+++ src/effects/Mask.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../../include/effects/Mask.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -143,19 +144,20 @@
 // Generate JSON string of this object
 string Mask::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Mask::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Mask::JsonValue() {
 
 	// Create root json object
-	Json::Value root = EffectBase::JsonValue(); // get parent properties
-	root["type"] = "Mask";
-	root["brightness"] = brightness.JsonValue();
-	root["contrast"] = contrast.JsonValue();
-	//root["reader"] = reader.JsonValue();
+	QJsonObject root = EffectBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("Mask")));
+	root.insert("brightness", QJsonValue(brightness.JsonValue()));
+	root.insert("contrast", QJsonValue(contrast.JsonValue()));
+	//root.insert("reader", QJsonValue(reader.JsonValue()));
 
 	// return JsonValue
 	return root;
@@ -164,13 +166,17 @@
 // Load JSON string into this object
 void Mask::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -184,16 +190,16 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Mask::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Mask::SetJsonValue(QJsonObject root) {
 
 	// Set parent data
 	EffectBase::SetJsonValue(root);
 
 	// Set data from Json (if key is found)
 	if (!root["brightness"].isNull())
-		brightness.SetJsonValue(root["brightness"]);
+        brightness.SetJsonValue(root["brightness"].toObject());
 	if (!root["contrast"].isNull())
-		contrast.SetJsonValue(root["contrast"]);
+        contrast.SetJsonValue(root["contrast"].toObject());
 }
 

=== modified file 'src/effects/Negate.cpp'
--- src/effects/Negate.cpp	2014-04-11 03:38:01 +0000
+++ src/effects/Negate.cpp	2014-07-10 03:08:17 +0000
@@ -39,6 +39,7 @@
  */
 
 #include "../../include/effects/Negate.h"
+#include <QJsonParseError>
 
 using namespace openshot;
 
@@ -69,16 +70,17 @@
 // Generate JSON string of this object
 string Negate::Json() {
 
-	// Return formatted string
-	return JsonValue().toStyledString();
+    QJsonDocument document;
+    document.setObject(JsonValue());
+    return document.toJson().constData();
 }
 
-// Generate Json::JsonValue for this object
-Json::Value Negate::JsonValue() {
+// Generate QJsonObject for this object
+QJsonObject Negate::JsonValue() {
 
 	// Create root json object
-	Json::Value root = EffectBase::JsonValue(); // get parent properties
-	root["type"] = "Negate";
+	QJsonObject root = EffectBase::JsonValue(); // get parent properties
+	root.insert("type", QJsonValue(QLatin1String("Negate")));
 
 	// return JsonValue
 	return root;
@@ -87,13 +89,17 @@
 // Load JSON string into this object
 void Negate::SetJson(string value) throw(InvalidJSON) {
 
-	// Parse JSON string into JSON objects
-	Json::Value root;
-	Json::Reader reader;
-	bool success = reader.parse( value, root );
-	if (!success)
-		// Raise exception
-		throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    // Parse JSON string into JSON objects
+    QJsonObject root;
+    QJsonParseError errors;
+
+    QJsonDocument document = QJsonDocument::fromJson(QByteArray(value.c_str()), &errors);
+    if (errors.error != QJsonParseError::NoError) {
+        // Raise exception
+        throw InvalidJSON("JSON could not be parsed (or is invalid)", "");
+    }
+
+    root = document.object();
 
 	try
 	{
@@ -107,8 +113,8 @@
 	}
 }
 
-// Load Json::JsonValue into this object
-void Negate::SetJsonValue(Json::Value root) {
+// Load QJsonObject into this object
+void Negate::SetJsonValue(QJsonObject root) {
 
 	// Set parent data
 	EffectBase::SetJsonValue(root);

=== modified file 'tests/ReaderBase_Tests.cpp'
--- tests/ReaderBase_Tests.cpp	2014-03-29 23:49:22 +0000
+++ tests/ReaderBase_Tests.cpp	2014-07-10 03:08:17 +0000
@@ -58,8 +58,8 @@
 		void Open() { };
 		string Json() { };
 		void SetJson(string value) throw(InvalidJSON) { };
-		Json::Value JsonValue() { };
-		void SetJsonValue(Json::Value root) { };
+        QJsonObject JsonValue() { };
+        void SetJsonValue(QJsonObject root) { };
 		bool IsOpen() { return true; };
 	};
 

=== removed directory 'thirdparty'
=== removed directory 'thirdparty/jsoncpp'
=== removed file 'thirdparty/jsoncpp/LICENSE'
--- thirdparty/jsoncpp/LICENSE	2013-08-01 18:45:09 +0000
+++ thirdparty/jsoncpp/LICENSE	1970-01-01 00:00:00 +0000
@@ -1,1 +0,0 @@
-The json-cpp library and this documentation are in Public Domain.

=== removed directory 'thirdparty/jsoncpp/include'
=== removed directory 'thirdparty/jsoncpp/include/json'
=== removed file 'thirdparty/jsoncpp/include/json/autolink.h'
--- thirdparty/jsoncpp/include/json/autolink.h	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/include/json/autolink.h	1970-01-01 00:00:00 +0000
@@ -1,19 +0,0 @@
-#ifndef JSON_AUTOLINK_H_INCLUDED
-# define JSON_AUTOLINK_H_INCLUDED
-
-# include "config.h"
-
-# ifdef JSON_IN_CPPTL
-#  include <cpptl/cpptl_autolink.h>
-# endif
-
-# if !defined(JSON_NO_AUTOLINK)  &&  !defined(JSON_DLL_BUILD)  &&  !defined(JSON_IN_CPPTL)
-#  define CPPTL_AUTOLINK_NAME "json"
-#  undef CPPTL_AUTOLINK_DLL
-#  ifdef JSON_DLL
-#   define CPPTL_AUTOLINK_DLL
-#  endif
-#  include "autolink.h"
-# endif
-
-#endif // JSON_AUTOLINK_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/config.h'
--- thirdparty/jsoncpp/include/json/config.h	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/include/json/config.h	1970-01-01 00:00:00 +0000
@@ -1,43 +0,0 @@
-#ifndef JSON_CONFIG_H_INCLUDED
-# define JSON_CONFIG_H_INCLUDED
-
-/// If defined, indicates that json library is embedded in CppTL library.
-//# define JSON_IN_CPPTL 1
-
-/// If defined, indicates that json may leverage CppTL library
-//#  define JSON_USE_CPPTL 1
-/// If defined, indicates that cpptl vector based map should be used instead of std::map
-/// as Value container.
-//#  define JSON_USE_CPPTL_SMALLMAP 1
-/// If defined, indicates that Json specific container should be used
-/// (hash table & simple deque container with customizable allocator).
-/// THIS FEATURE IS STILL EXPERIMENTAL!
-//#  define JSON_VALUE_USE_INTERNAL_MAP 1
-/// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
-/// The memory pools allocator used optimization (initializing Value and ValueInternalLink
-/// as if it was a POD) that may cause some validation tool to report errors.
-/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
-//#  define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
-
-/// If defined, indicates that Json use exception to report invalid type manipulation
-/// instead of C assert macro.
-# define JSON_USE_EXCEPTION 1
-
-# ifdef JSON_IN_CPPTL
-#  include <cpptl/config.h>
-#  ifndef JSON_USE_CPPTL
-#   define JSON_USE_CPPTL 1
-#  endif
-# endif
-
-# ifdef JSON_IN_CPPTL
-#  define JSON_API CPPTL_API
-# elif defined(JSON_DLL_BUILD)
-#  define JSON_API __declspec(dllexport)
-# elif defined(JSON_DLL)
-#  define JSON_API __declspec(dllimport)
-# else
-#  define JSON_API
-# endif
-
-#endif // JSON_CONFIG_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/features.h'
--- thirdparty/jsoncpp/include/json/features.h	2013-09-10 04:32:16 +0000
+++ thirdparty/jsoncpp/include/json/features.h	1970-01-01 00:00:00 +0000
@@ -1,42 +0,0 @@
-#ifndef CPPTL_JSON_FEATURES_H_INCLUDED
-# define CPPTL_JSON_FEATURES_H_INCLUDED
-
-# include "forwards.h"
-
-namespace Json {
-
-   /** @brief Configuration passed to reader and writer.
-    * This configuration object can be used to force the Reader or Writer
-    * to behave in a standard conforming way.
-    */
-   class JSON_API Features
-   {
-   public:
-      /** @brief A configuration that allows all features and assumes all strings are UTF-8.
-       * - C & C++ comments are allowed
-       * - Root object can be any JSON value
-       * - Assumes Value strings are encoded in UTF-8
-       */
-      static Features all();
-
-      /** @brief A configuration that is strictly compatible with the JSON specification.
-       * - Comments are forbidden.
-       * - Root object must be either an array or an object value.
-       * - Assumes Value strings are encoded in UTF-8
-       */
-      static Features strictMode();
-
-      /** @brief Initialize the configuration like JsonConfig::allFeatures;
-       */
-      Features();
-
-      /// \c true if comments are allowed. Default: \c true.
-      bool allowComments_;
-
-      /// \c true if root must be either an array or an object value. Default: \c false.
-      bool strictRoot_;
-   };
-
-} // namespace Json
-
-#endif // CPPTL_JSON_FEATURES_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/forwards.h'
--- thirdparty/jsoncpp/include/json/forwards.h	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/include/json/forwards.h	1970-01-01 00:00:00 +0000
@@ -1,39 +0,0 @@
-#ifndef JSON_FORWARDS_H_INCLUDED
-# define JSON_FORWARDS_H_INCLUDED
-
-# include "config.h"
-
-namespace Json {
-
-   // writer.h
-   class FastWriter;
-   class StyledWriter;
-
-   // reader.h
-   class Reader;
-
-   // features.h
-   class Features;
-
-   // value.h
-   typedef int Int;
-   typedef unsigned int UInt;
-   class StaticString;
-   class Path;
-   class PathArgument;
-   class Value;
-   class ValueIteratorBase;
-   class ValueIterator;
-   class ValueConstIterator;
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-   class ValueAllocator;
-   class ValueMapAllocator;
-   class ValueInternalLink;
-   class ValueInternalArray;
-   class ValueInternalMap;
-#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
-
-} // namespace Json
-
-
-#endif // JSON_FORWARDS_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/json.h'
--- thirdparty/jsoncpp/include/json/json.h	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/include/json/json.h	1970-01-01 00:00:00 +0000
@@ -1,10 +0,0 @@
-#ifndef JSON_JSON_H_INCLUDED
-# define JSON_JSON_H_INCLUDED
-
-# include "autolink.h"
-# include "value.h"
-# include "reader.h"
-# include "writer.h"
-# include "features.h"
-
-#endif // JSON_JSON_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/reader.h'
--- thirdparty/jsoncpp/include/json/reader.h	2013-09-10 04:32:16 +0000
+++ thirdparty/jsoncpp/include/json/reader.h	1970-01-01 00:00:00 +0000
@@ -1,196 +0,0 @@
-#ifndef CPPTL_JSON_READER_H_INCLUDED
-# define CPPTL_JSON_READER_H_INCLUDED
-
-# include "features.h"
-# include "value.h"
-# include <deque>
-# include <stack>
-# include <string>
-# include <iostream>
-
-namespace Json {
-
-   /** @brief Unserialize a <a HREF="http://www.json.org";>JSON</a> document into a Value.
-    *
-    */
-   class JSON_API Reader
-   {
-   public:
-      typedef char Char;
-      typedef const Char *Location;
-
-      /** @brief Constructs a Reader allowing all features
-       * for parsing.
-       */
-      Reader();
-
-      /** @brief Constructs a Reader allowing the specified feature set
-       * for parsing.
-       */
-      Reader( const Features &features );
-
-      /** @brief Read a Value from a <a HREF="http://www.json.org";>JSON</a> document.
-       * \param document UTF-8 encoded string containing the document to read.
-       * \param root [out] Contains the root value of the document if it was
-       *             successfully parsed.
-       * \param collectComments \c true to collect comment and allow writing them back during
-       *                        serialization, \c false to discard comments.
-       *                        This parameter is ignored if Features::allowComments_
-       *                        is \c false.
-       * \return \c true if the document was successfully parsed, \c false if an error occurred.
-       */
-      bool parse( const std::string &document, 
-                  Value &root,
-                  bool collectComments = true );
-
-      /** @brief Read a Value from a <a HREF="http://www.json.org";>JSON</a> document.
-       * \param document UTF-8 encoded string containing the document to read.
-       * \param root [out] Contains the root value of the document if it was
-       *             successfully parsed.
-       * \param collectComments \c true to collect comment and allow writing them back during
-       *                        serialization, \c false to discard comments.
-       *                        This parameter is ignored if Features::allowComments_
-       *                        is \c false.
-       * \return \c true if the document was successfully parsed, \c false if an error occurred.
-       */
-      bool parse( const char *beginDoc, const char *endDoc, 
-                  Value &root,
-                  bool collectComments = true );
-
-      /// @brief Parse from input stream.
-      /// \see Json::operator>>(std::istream&, Json::Value&).
-      bool parse( std::istream &is,
-                  Value &root,
-                  bool collectComments = true );
-
-      /** @brief Returns a user friendly string that list errors in the parsed document.
-       * \return Formatted error message with the list of errors with their location in 
-       *         the parsed document. An empty string is returned if no error occurred
-       *         during parsing.
-       */
-      std::string getFormatedErrorMessages() const;
-
-   private:
-      enum TokenType
-      {
-         tokenEndOfStream = 0,
-         tokenObjectBegin,
-         tokenObjectEnd,
-         tokenArrayBegin,
-         tokenArrayEnd,
-         tokenString,
-         tokenNumber,
-         tokenTrue,
-         tokenFalse,
-         tokenNull,
-         tokenArraySeparator,
-         tokenMemberSeparator,
-         tokenComment,
-         tokenError
-      };
-
-      class Token
-      {
-      public:
-         TokenType type_;
-         Location start_;
-         Location end_;
-      };
-
-      class ErrorInfo
-      {
-      public:
-         Token token_;
-         std::string message_;
-         Location extra_;
-      };
-
-      typedef std::deque<ErrorInfo> Errors;
-
-      bool expectToken( TokenType type, Token &token, const char *message );
-      bool readToken( Token &token );
-      void skipSpaces();
-      bool match( Location pattern, 
-                  int patternLength );
-      bool readComment();
-      bool readCStyleComment();
-      bool readCppStyleComment();
-      bool readString();
-      void readNumber();
-      bool readValue();
-      bool readObject( Token &token );
-      bool readArray( Token &token );
-      bool decodeNumber( Token &token );
-      bool decodeString( Token &token );
-      bool decodeString( Token &token, std::string &decoded );
-      bool decodeDouble( Token &token );
-      bool decodeUnicodeCodePoint( Token &token, 
-                                   Location &current, 
-                                   Location end, 
-                                   unsigned int &unicode );
-      bool decodeUnicodeEscapeSequence( Token &token, 
-                                        Location &current, 
-                                        Location end, 
-                                        unsigned int &unicode );
-      bool addError( const std::string &message, 
-                     Token &token,
-                     Location extra = 0 );
-      bool recoverFromError( TokenType skipUntilToken );
-      bool addErrorAndRecover( const std::string &message, 
-                               Token &token,
-                               TokenType skipUntilToken );
-      void skipUntilSpace();
-      Value &currentValue();
-      Char getNextChar();
-      void getLocationLineAndColumn( Location location,
-                                     int &line,
-                                     int &column ) const;
-      std::string getLocationLineAndColumn( Location location ) const;
-      void addComment( Location begin, 
-                       Location end, 
-                       CommentPlacement placement );
-      void skipCommentTokens( Token &token );
-   
-      typedef std::stack<Value *> Nodes;
-      Nodes nodes_;
-      Errors errors_;
-      std::string document_;
-      Location begin_;
-      Location end_;
-      Location current_;
-      Location lastValueEnd_;
-      Value *lastValue_;
-      std::string commentsBefore_;
-      Features features_;
-      bool collectComments_;
-   };
-
-   /** @brief Read from 'sin' into 'root'.
-
-    Always keep comments from the input JSON.
-
-    This can be used to read a file into a particular sub-object.
-    For example:
-    \code
-    Json::Value root;
-    cin >> root["dir"]["file"];
-    cout << root;
-    \endcode
-    Result:
-    \verbatim
-    {
-	"dir": {
-	    "file": {
-		// The input stream JSON would be nested here.
-	    }
-	}
-    }
-    \endverbatim
-    \throw std::exception on parse error.
-    \see Json::operator<<()
-   */
-   std::istream& operator>>( std::istream&, Value& );
-
-} // namespace Json
-
-#endif // CPPTL_JSON_READER_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/value.h'
--- thirdparty/jsoncpp/include/json/value.h	2013-09-10 04:32:16 +0000
+++ thirdparty/jsoncpp/include/json/value.h	1970-01-01 00:00:00 +0000
@@ -1,1069 +0,0 @@
-#ifndef CPPTL_JSON_H_INCLUDED
-# define CPPTL_JSON_H_INCLUDED
-
-# include "forwards.h"
-# include <string>
-# include <vector>
-
-# ifndef JSON_USE_CPPTL_SMALLMAP
-#  include <map>
-# else
-#  include <cpptl/smallmap.h>
-# endif
-# ifdef JSON_USE_CPPTL
-#  include <cpptl/forwards.h>
-# endif
-
-/** @brief JSON (JavaScript Object Notation).
- */
-namespace Json {
-
-   /** @brief Type of the value held by a Value object.
-    */
-   enum ValueType
-   {
-      nullValue = 0, ///< 'null' value
-      intValue,      ///< signed integer value
-      uintValue,     ///< unsigned integer value
-      realValue,     ///< double value
-      stringValue,   ///< UTF-8 string value
-      booleanValue,  ///< bool value
-      arrayValue,    ///< array value (ordered list)
-      objectValue    ///< object value (collection of name/value pairs).
-   };
-
-   enum CommentPlacement
-   {
-      commentBefore = 0,        ///< a comment placed on the line before a value
-      commentAfterOnSameLine,   ///< a comment just after a value on the same line
-      commentAfter,             ///< a comment on the line after a value (only make sense for root value)
-      numberOfCommentPlacement
-   };
-
-//# ifdef JSON_USE_CPPTL
-//   typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
-//   typedef CppTL::AnyEnumerator<const Value &> EnumValues;
-//# endif
-
-   /** @brief Lightweight wrapper to tag static string.
-    *
-    * Value constructor and objectValue member assignement takes advantage of the
-    * StaticString and avoid the cost of string duplication when storing the
-    * string or the member name.
-    *
-    * Example of usage:
-    * \code
-    * Json::Value aValue( StaticString("some text") );
-    * Json::Value object;
-    * static const StaticString code("code");
-    * object[code] = 1234;
-    * \endcode
-    */
-   class JSON_API StaticString
-   {
-   public:
-      explicit StaticString( const char *czstring )
-         : str_( czstring )
-      {
-      }
-
-      operator const char *() const
-      {
-         return str_;
-      }
-
-      const char *c_str() const
-      {
-         return str_;
-      }
-
-   private:
-      const char *str_;
-   };
-
-   /** @brief Represents a <a HREF="http://www.json.org";>JSON</a> value.
-    *
-    * This class is a discriminated union wrapper that can represents a:
-    * - signed integer [range: Value::minInt - Value::maxInt]
-    * - unsigned integer (range: 0 - Value::maxUInt)
-    * - double
-    * - UTF-8 string
-    * - boolean
-    * - 'null'
-    * - an ordered list of Value
-    * - collection of name/value pairs (javascript object)
-    *
-    * The type of the held value is represented by a #ValueType and 
-    * can be obtained using type().
-    *
-    * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. 
-    * Non const methods will automatically create the a #nullValue element 
-    * if it does not exist. 
-    * The sequence of an #arrayValue will be automatically resize and initialized 
-    * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
-    *
-    * The get() methods can be used to obtanis default value in the case the required element
-    * does not exist.
-    *
-    * It is possible to iterate over the list of a #objectValue values using 
-    * the getMemberNames() method.
-    */
-   class JSON_API Value 
-   {
-      friend class ValueIteratorBase;
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-      friend class ValueInternalLink;
-      friend class ValueInternalMap;
-# endif
-   public:
-      typedef std::vector<std::string> Members;
-      typedef ValueIterator iterator;
-      typedef ValueConstIterator const_iterator;
-      typedef Json::UInt UInt;
-      typedef Json::Int Int;
-      typedef UInt ArrayIndex;
-
-      static const Value null;
-      static const Int minInt;
-      static const Int maxInt;
-      static const UInt maxUInt;
-
-   private:
-#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-# ifndef JSON_VALUE_USE_INTERNAL_MAP
-      class CZString 
-      {
-      public:
-         enum DuplicationPolicy 
-         {
-            noDuplication = 0,
-            duplicate,
-            duplicateOnCopy
-         };
-         CZString( int index );
-         CZString( const char *cstr, DuplicationPolicy allocate );
-         CZString( const CZString &other );
-         ~CZString();
-         CZString &operator =( const CZString &other );
-         bool operator<( const CZString &other ) const;
-         bool operator==( const CZString &other ) const;
-         int index() const;
-         const char *c_str() const;
-         bool isStaticString() const;
-      private:
-         void swap( CZString &other );
-         const char *cstr_;
-         int index_;
-      };
-
-   public:
-#  ifndef JSON_USE_CPPTL_SMALLMAP
-      typedef std::map<CZString, Value> ObjectValues;
-#  else
-      typedef CppTL::SmallMap<CZString, Value> ObjectValues;
-#  endif // ifndef JSON_USE_CPPTL_SMALLMAP
-# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
-#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-   public:
-      /** @brief Create a default Value of the given type.
-
-        This is a very useful constructor.
-        To create an empty array, pass arrayValue.
-        To create an empty object, pass objectValue.
-        Another Value can then be set to this one by assignment.
-	This is useful since clear() and resize() will not alter types.
-
-        Examples:
-	\code
-	Json::Value null_value; // null
-	Json::Value arr_value(Json::arrayValue); // []
-	Json::Value obj_value(Json::objectValue); // {}
-	\endcode
-      */
-      Value( ValueType type = nullValue );
-      Value( Int value );
-      Value( UInt value );
-      Value( double value );
-      Value( const char *value );
-      Value( const char *beginValue, const char *endValue );
-      /** @brief Constructs a value from a static string.
-
-       * Like other value string constructor but do not duplicate the string for
-       * internal storage. The given string must remain alive after the call to this
-       * constructor.
-       * Example of usage:
-       * \code
-       * Json::Value aValue( StaticString("some text") );
-       * \endcode
-       */
-      Value( const StaticString &value );
-      Value( const std::string &value );
-# ifdef JSON_USE_CPPTL
-      Value( const CppTL::ConstString &value );
-# endif
-      Value( bool value );
-      Value( const Value &other );
-      ~Value();
-
-      Value &operator=( const Value &other );
-      /// Swap values.
-      /// \note Currently, comments are intentionally not swapped, for
-      /// both logic and efficiency.
-      void swap( Value &other );
-
-      ValueType type() const;
-
-      bool operator <( const Value &other ) const;
-      bool operator <=( const Value &other ) const;
-      bool operator >=( const Value &other ) const;
-      bool operator >( const Value &other ) const;
-
-      bool operator ==( const Value &other ) const;
-      bool operator !=( const Value &other ) const;
-
-      int compare( const Value &other );
-
-      const char *asCString() const;
-      std::string asString() const;
-# ifdef JSON_USE_CPPTL
-      CppTL::ConstString asConstString() const;
-# endif
-      Int asInt() const;
-      UInt asUInt() const;
-      double asDouble() const;
-      bool asBool() const;
-
-      bool isNull() const;
-      bool isBool() const;
-      bool isInt() const;
-      bool isUInt() const;
-      bool isIntegral() const;
-      bool isDouble() const;
-      bool isNumeric() const;
-      bool isString() const;
-      bool isArray() const;
-      bool isObject() const;
-
-      bool isConvertibleTo( ValueType other ) const;
-
-      /// Number of values in array or object
-      UInt size() const;
-
-      /// @brief Return true if empty array, empty object, or null;
-      /// otherwise, false.
-      bool empty() const;
-
-      /// Return isNull()
-      bool operator!() const;
-
-      /// Remove all object members and array elements.
-      /// \pre type() is arrayValue, objectValue, or nullValue
-      /// \post type() is unchanged
-      void clear();
-
-      /// Resize the array to size elements. 
-      /// New elements are initialized to null.
-      /// May only be called on nullValue or arrayValue.
-      /// \pre type() is arrayValue or nullValue
-      /// \post type() is arrayValue
-      void resize( UInt size );
-
-      /// Access an array element (zero based index ).
-      /// If the array contains less than index element, then null value are inserted
-      /// in the array so that its size is index+1.
-      /// (You may need to say 'value[0u]' to get your compiler to distinguish
-      ///  this from the operator[] which takes a string.)
-      Value &operator[]( UInt index );
-      /// Access an array element (zero based index )
-      /// (You may need to say 'value[0u]' to get your compiler to distinguish
-      ///  this from the operator[] which takes a string.)
-      const Value &operator[]( UInt index ) const;
-      /// If the array contains at least index+1 elements, returns the element value, 
-      /// otherwise returns defaultValue.
-      Value get( UInt index, 
-                 const Value &defaultValue ) const;
-      /// Return true if index < size().
-      bool isValidIndex( UInt index ) const;
-      /// @brief Append value to array at the end.
-      ///
-      /// Equivalent to jsonvalue[jsonvalue.size()] = value;
-      Value &append( const Value &value );
-
-      /// Access an object value by name, create a null member if it does not exist.
-      Value &operator[]( const char *key );
-      /// Access an object value by name, returns null if there is no member with that name.
-      const Value &operator[]( const char *key ) const;
-      /// Access an object value by name, create a null member if it does not exist.
-      Value &operator[]( const std::string &key );
-      /// Access an object value by name, returns null if there is no member with that name.
-      const Value &operator[]( const std::string &key ) const;
-      /** @brief Access an object value by name, create a null member if it does not exist.
-
-       * If the object as no entry for that name, then the member name used to store
-       * the new entry is not duplicated.
-       * Example of use:
-       * \code
-       * Json::Value object;
-       * static const StaticString code("code");
-       * object[code] = 1234;
-       * \endcode
-       */
-      Value &operator[]( const StaticString &key );
-# ifdef JSON_USE_CPPTL
-      /// Access an object value by name, create a null member if it does not exist.
-      Value &operator[]( const CppTL::ConstString &key );
-      /// Access an object value by name, returns null if there is no member with that name.
-      const Value &operator[]( const CppTL::ConstString &key ) const;
-# endif
-      /// Return the member named key if it exist, defaultValue otherwise.
-      Value get( const char *key, 
-                 const Value &defaultValue ) const;
-      /// Return the member named key if it exist, defaultValue otherwise.
-      Value get( const std::string &key,
-                 const Value &defaultValue ) const;
-# ifdef JSON_USE_CPPTL
-      /// Return the member named key if it exist, defaultValue otherwise.
-      Value get( const CppTL::ConstString &key,
-                 const Value &defaultValue ) const;
-# endif
-      /// @brief Remove and return the named member.  
-      ///
-      /// Do nothing if it did not exist.
-      /// \return the removed Value, or null.
-      /// \pre type() is objectValue or nullValue
-      /// \post type() is unchanged
-      Value removeMember( const char* key );
-      /// Same as removeMember(const char*)
-      Value removeMember( const std::string &key );
-
-      /// Return true if the object has a member named key.
-      bool isMember( const char *key ) const;
-      /// Return true if the object has a member named key.
-      bool isMember( const std::string &key ) const;
-# ifdef JSON_USE_CPPTL
-      /// Return true if the object has a member named key.
-      bool isMember( const CppTL::ConstString &key ) const;
-# endif
-
-      /// @brief Return a list of the member names.
-      ///
-      /// If null, return an empty list.
-      /// \pre type() is objectValue or nullValue
-      /// \post if type() was nullValue, it remains nullValue
-      Members getMemberNames() const;
-
-//# ifdef JSON_USE_CPPTL
-//      EnumMemberNames enumMemberNames() const;
-//      EnumValues enumValues() const;
-//# endif
-
-      /// Comments must be //... or /* ... */
-      void setComment( const char *comment,
-                       CommentPlacement placement );
-      /// Comments must be //... or /* ... */
-      void setComment( const std::string &comment,
-                       CommentPlacement placement );
-      bool hasComment( CommentPlacement placement ) const;
-      /// Include delimiters and embedded newlines.
-      std::string getComment( CommentPlacement placement ) const;
-
-      std::string toStyledString() const;
-
-      const_iterator begin() const;
-      const_iterator end() const;
-
-      iterator begin();
-      iterator end();
-
-   private:
-      Value &resolveReference( const char *key, 
-                               bool isStatic );
-
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-      inline bool isItemAvailable() const
-      {
-         return itemIsUsed_ == 0;
-      }
-
-      inline void setItemUsed( bool isUsed = true )
-      {
-         itemIsUsed_ = isUsed ? 1 : 0;
-      }
-
-      inline bool isMemberNameStatic() const
-      {
-         return memberNameIsStatic_ == 0;
-      }
-
-      inline void setMemberNameIsStatic( bool isStatic )
-      {
-         memberNameIsStatic_ = isStatic ? 1 : 0;
-      }
-# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP
-
-   private:
-      struct CommentInfo
-      {
-         CommentInfo();
-         ~CommentInfo();
-
-         void setComment( const char *text );
-
-         char *comment_;
-      };
-
-      //struct MemberNamesTransform
-      //{
-      //   typedef const char *result_type;
-      //   const char *operator()( const CZString &name ) const
-      //   {
-      //      return name.c_str();
-      //   }
-      //};
-
-      union ValueHolder
-      {
-         Int int_;
-         UInt uint_;
-         double real_;
-         bool bool_;
-         char *string_;
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-         ValueInternalArray *array_;
-         ValueInternalMap *map_;
-#else
-         ObjectValues *map_;
-# endif
-      } value_;
-      ValueType type_ : 8;
-      int allocated_ : 1;     // Notes: if declared as bool, bitfield is useless.
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-      unsigned int itemIsUsed_ : 1;      // used by the ValueInternalMap container.
-      int memberNameIsStatic_ : 1;       // used by the ValueInternalMap container.
-# endif
-      CommentInfo *comments_;
-   };
-
-
-   /** @brief Experimental and untested: represents an element of the "path" to access a node.
-    */
-   class PathArgument
-   {
-   public:
-      friend class Path;
-
-      PathArgument();
-      PathArgument( UInt index );
-      PathArgument( const char *key );
-      PathArgument( const std::string &key );
-
-   private:
-      enum Kind
-      {
-         kindNone = 0,
-         kindIndex,
-         kindKey
-      };
-      std::string key_;
-      UInt index_;
-      Kind kind_;
-   };
-
-   /** @brief Experimental and untested: represents a "path" to access a node.
-    *
-    * Syntax:
-    * - "." => root node
-    * - ".[n]" => elements at index 'n' of root node (an array value)
-    * - ".name" => member named 'name' of root node (an object value)
-    * - ".name1.name2.name3"
-    * - ".[0][1][2].name1[3]"
-    * - ".%" => member name is provided as parameter
-    * - ".[%]" => index is provied as parameter
-    */
-   class Path
-   {
-   public:
-      Path( const std::string &path,
-            const PathArgument &a1 = PathArgument(),
-            const PathArgument &a2 = PathArgument(),
-            const PathArgument &a3 = PathArgument(),
-            const PathArgument &a4 = PathArgument(),
-            const PathArgument &a5 = PathArgument() );
-
-      const Value &resolve( const Value &root ) const;
-      Value resolve( const Value &root, 
-                     const Value &defaultValue ) const;
-      /// Creates the "path" to access the specified node and returns a reference on the node.
-      Value &make( Value &root ) const;
-
-   private:
-      typedef std::vector<const PathArgument *> InArgs;
-      typedef std::vector<PathArgument> Args;
-
-      void makePath( const std::string &path,
-                     const InArgs &in );
-      void addPathInArg( const std::string &path, 
-                         const InArgs &in, 
-                         InArgs::const_iterator &itInArg, 
-                         PathArgument::Kind kind );
-      void invalidPath( const std::string &path, 
-                        int location );
-
-      Args args_;
-   };
-
-   /** @brief Experimental do not use: Allocator to customize member name and string value memory management done by Value.
-    *
-    * - makeMemberName() and releaseMemberName() are called to respectively duplicate and
-    *   free an Json::objectValue member name.
-    * - duplicateStringValue() and releaseStringValue() are called similarly to
-    *   duplicate and free a Json::stringValue value.
-    */
-   class ValueAllocator
-   {
-   public:
-      enum { unknown = (unsigned)-1 };
-
-      virtual ~ValueAllocator();
-
-      virtual char *makeMemberName( const char *memberName ) = 0;
-      virtual void releaseMemberName( char *memberName ) = 0;
-      virtual char *duplicateStringValue( const char *value, 
-                                          unsigned int length = unknown ) = 0;
-      virtual void releaseStringValue( char *value ) = 0;
-   };
-
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-   /** @brief Allocator to customize Value internal map.
-    * Below is an example of a simple implementation (default implementation actually
-    * use memory pool for speed).
-    * \code
-      class DefaultValueMapAllocator : public ValueMapAllocator
-      {
-      public: // overridden from ValueMapAllocator
-         virtual ValueInternalMap *newMap()
-         {
-            return new ValueInternalMap();
-         }
-
-         virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
-         {
-            return new ValueInternalMap( other );
-         }
-
-         virtual void destructMap( ValueInternalMap *map )
-         {
-            delete map;
-         }
-
-         virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
-         {
-            return new ValueInternalLink[size];
-         }
-
-         virtual void releaseMapBuckets( ValueInternalLink *links )
-         {
-            delete [] links;
-         }
-
-         virtual ValueInternalLink *allocateMapLink()
-         {
-            return new ValueInternalLink();
-         }
-
-         virtual void releaseMapLink( ValueInternalLink *link )
-         {
-            delete link;
-         }
-      };
-    * \endcode
-    */ 
-   class JSON_API ValueMapAllocator
-   {
-   public:
-      virtual ~ValueMapAllocator();
-      virtual ValueInternalMap *newMap() = 0;
-      virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0;
-      virtual void destructMap( ValueInternalMap *map ) = 0;
-      virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0;
-      virtual void releaseMapBuckets( ValueInternalLink *links ) = 0;
-      virtual ValueInternalLink *allocateMapLink() = 0;
-      virtual void releaseMapLink( ValueInternalLink *link ) = 0;
-   };
-
-   /** @brief ValueInternalMap hash-map bucket chain link (for internal use only).
-    * \internal previous_ & next_ allows for bidirectional traversal.
-    */
-   class JSON_API ValueInternalLink
-   {
-   public:
-      enum { itemPerLink = 6 };  // sizeof(ValueInternalLink) = 128 on 32 bits architecture.
-      enum InternalFlags { 
-         flagAvailable = 0,
-         flagUsed = 1
-      };
-
-      ValueInternalLink();
-
-      ~ValueInternalLink();
-
-      Value items_[itemPerLink];
-      char *keys_[itemPerLink];
-      ValueInternalLink *previous_;
-      ValueInternalLink *next_;
-   };
-
-
-   /** @brief A linked page based hash-table implementation used internally by Value.
-    * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked
-    * list in each bucket to handle collision. There is an addional twist in that
-    * each node of the collision linked list is a page containing a fixed amount of
-    * value. This provides a better compromise between memory usage and speed.
-    * 
-    * Each bucket is made up of a chained list of ValueInternalLink. The last
-    * link of a given bucket can be found in the 'previous_' field of the following bucket.
-    * The last link of the last bucket is stored in tailLink_ as it has no following bucket.
-    * Only the last link of a bucket may contains 'available' item. The last link always
-    * contains at least one element unless is it the bucket one very first link.
-    */
-   class JSON_API ValueInternalMap
-   {
-      friend class ValueIteratorBase;
-      friend class Value;
-   public:
-      typedef unsigned int HashKey;
-      typedef unsigned int BucketIndex;
-
-# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-      struct IteratorState
-      {
-         IteratorState() 
-            : map_(0)
-            , link_(0)
-            , itemIndex_(0)
-            , bucketIndex_(0) 
-         {
-         }
-         ValueInternalMap *map_;
-         ValueInternalLink *link_;
-         BucketIndex itemIndex_;
-         BucketIndex bucketIndex_;
-      };
-# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-      ValueInternalMap();
-      ValueInternalMap( const ValueInternalMap &other );
-      ValueInternalMap &operator =( const ValueInternalMap &other );
-      ~ValueInternalMap();
-
-      void swap( ValueInternalMap &other );
-
-      BucketIndex size() const;
-
-      void clear();
-
-      bool reserveDelta( BucketIndex growth );
-
-      bool reserve( BucketIndex newItemCount );
-
-      const Value *find( const char *key ) const;
-
-      Value *find( const char *key );
-
-      Value &resolveReference( const char *key, 
-                               bool isStatic );
-
-      void remove( const char *key );
-
-      void doActualRemove( ValueInternalLink *link, 
-                           BucketIndex index,
-                           BucketIndex bucketIndex );
-
-      ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex );
-
-      Value &setNewItem( const char *key, 
-                         bool isStatic, 
-                         ValueInternalLink *link, 
-                         BucketIndex index );
-
-      Value &unsafeAdd( const char *key, 
-                        bool isStatic, 
-                        HashKey hashedKey );
-
-      HashKey hash( const char *key ) const;
-
-      int compare( const ValueInternalMap &other ) const;
-
-   private:
-      void makeBeginIterator( IteratorState &it ) const;
-      void makeEndIterator( IteratorState &it ) const;
-      static bool equals( const IteratorState &x, const IteratorState &other );
-      static void increment( IteratorState &iterator );
-      static void incrementBucket( IteratorState &iterator );
-      static void decrement( IteratorState &iterator );
-      static const char *key( const IteratorState &iterator );
-      static const char *key( const IteratorState &iterator, bool &isStatic );
-      static Value &value( const IteratorState &iterator );
-      static int distance( const IteratorState &x, const IteratorState &y );
-
-   private:
-      ValueInternalLink *buckets_;
-      ValueInternalLink *tailLink_;
-      BucketIndex bucketsSize_;
-      BucketIndex itemCount_;
-   };
-
-   /** @brief A simplified deque implementation used internally by Value.
-   * \internal
-   * It is based on a list of fixed "page", each page contains a fixed number of items.
-   * Instead of using a linked-list, a array of pointer is used for fast item look-up.
-   * Look-up for an element is as follow:
-   * - compute page index: pageIndex = itemIndex / itemsPerPage
-   * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage]
-   *
-   * Insertion is amortized constant time (only the array containing the index of pointers
-   * need to be reallocated when items are appended).
-   */
-   class JSON_API ValueInternalArray
-   {
-      friend class Value;
-      friend class ValueIteratorBase;
-   public:
-      enum { itemsPerPage = 8 };    // should be a power of 2 for fast divide and modulo.
-      typedef Value::ArrayIndex ArrayIndex;
-      typedef unsigned int PageIndex;
-
-# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-      struct IteratorState // Must be a POD
-      {
-         IteratorState() 
-            : array_(0)
-            , currentPageIndex_(0)
-            , currentItemIndex_(0) 
-         {
-         }
-         ValueInternalArray *array_;
-         Value **currentPageIndex_;
-         unsigned int currentItemIndex_;
-      };
-# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-      ValueInternalArray();
-      ValueInternalArray( const ValueInternalArray &other );
-      ValueInternalArray &operator =( const ValueInternalArray &other );
-      ~ValueInternalArray();
-      void swap( ValueInternalArray &other );
-
-      void clear();
-      void resize( ArrayIndex newSize );
-
-      Value &resolveReference( ArrayIndex index );
-
-      Value *find( ArrayIndex index ) const;
-
-      ArrayIndex size() const;
-
-      int compare( const ValueInternalArray &other ) const;
-
-   private:
-      static bool equals( const IteratorState &x, const IteratorState &other );
-      static void increment( IteratorState &iterator );
-      static void decrement( IteratorState &iterator );
-      static Value &dereference( const IteratorState &iterator );
-      static Value &unsafeDereference( const IteratorState &iterator );
-      static int distance( const IteratorState &x, const IteratorState &y );
-      static ArrayIndex indexOf( const IteratorState &iterator );
-      void makeBeginIterator( IteratorState &it ) const;
-      void makeEndIterator( IteratorState &it ) const;
-      void makeIterator( IteratorState &it, ArrayIndex index ) const;
-
-      void makeIndexValid( ArrayIndex index );
-
-      Value **pages_;
-      ArrayIndex size_;
-      PageIndex pageCount_;
-   };
-
-   /** @brief Experimental: do not use. Allocator to customize Value internal array.
-    * Below is an example of a simple implementation (actual implementation use
-    * memory pool).
-      \code
-class DefaultValueArrayAllocator : public ValueArrayAllocator
-{
-public: // overridden from ValueArrayAllocator
-   virtual ~DefaultValueArrayAllocator()
-   {
-   }
-
-   virtual ValueInternalArray *newArray()
-   {
-      return new ValueInternalArray();
-   }
-
-   virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
-   {
-      return new ValueInternalArray( other );
-   }
-
-   virtual void destruct( ValueInternalArray *array )
-   {
-      delete array;
-   }
-
-   virtual void reallocateArrayPageIndex( Value **&indexes, 
-                                          ValueInternalArray::PageIndex &indexCount,
-                                          ValueInternalArray::PageIndex minNewIndexCount )
-   {
-      ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
-      if ( minNewIndexCount > newIndexCount )
-         newIndexCount = minNewIndexCount;
-      void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
-      if ( !newIndexes )
-         throw std::bad_alloc();
-      indexCount = newIndexCount;
-      indexes = static_cast<Value **>( newIndexes );
-   }
-   virtual void releaseArrayPageIndex( Value **indexes, 
-                                       ValueInternalArray::PageIndex indexCount )
-   {
-      if ( indexes )
-         free( indexes );
-   }
-
-   virtual Value *allocateArrayPage()
-   {
-      return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) );
-   }
-
-   virtual void releaseArrayPage( Value *value )
-   {
-      if ( value )
-         free( value );
-   }
-};
-      \endcode
-    */ 
-   class JSON_API ValueArrayAllocator
-   {
-   public:
-      virtual ~ValueArrayAllocator();
-      virtual ValueInternalArray *newArray() = 0;
-      virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0;
-      virtual void destructArray( ValueInternalArray *array ) = 0;
-      /** @brief Reallocate array page index.
-       * Reallocates an array of pointer on each page.
-       * \param indexes [input] pointer on the current index. May be \c NULL.
-       *                [output] pointer on the new index of at least 
-       *                         \a minNewIndexCount pages. 
-       * \param indexCount [input] current number of pages in the index.
-       *                   [output] number of page the reallocated index can handle.
-       *                            \b MUST be >= \a minNewIndexCount.
-       * \param minNewIndexCount Minimum number of page the new index must be able to
-       *                         handle.
-       */
-      virtual void reallocateArrayPageIndex( Value **&indexes, 
-                                             ValueInternalArray::PageIndex &indexCount,
-                                             ValueInternalArray::PageIndex minNewIndexCount ) = 0;
-      virtual void releaseArrayPageIndex( Value **indexes, 
-                                          ValueInternalArray::PageIndex indexCount ) = 0;
-      virtual Value *allocateArrayPage() = 0;
-      virtual void releaseArrayPage( Value *value ) = 0;
-   };
-#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
-
-
-   /** @brief base class for Value iterators.
-    *
-    */
-   class ValueIteratorBase
-   {
-   public:
-      typedef unsigned int size_t;
-      typedef int difference_type;
-      typedef ValueIteratorBase SelfType;
-
-      ValueIteratorBase();
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-      explicit ValueIteratorBase( const Value::ObjectValues::iterator &current );
-#else
-      ValueIteratorBase( const ValueInternalArray::IteratorState &state );
-      ValueIteratorBase( const ValueInternalMap::IteratorState &state );
-#endif
-
-      bool operator ==( const SelfType &other ) const
-      {
-         return isEqual( other );
-      }
-
-      bool operator !=( const SelfType &other ) const
-      {
-         return !isEqual( other );
-      }
-
-      difference_type operator -( const SelfType &other ) const
-      {
-         return computeDistance( other );
-      }
-
-      /// Return either the index or the member name of the referenced value as a Value.
-      Value key() const;
-
-      /// Return the index of the referenced Value. -1 if it is not an arrayValue.
-      UInt index() const;
-
-      /// Return the member name of the referenced Value. "" if it is not an objectValue.
-      const char *memberName() const;
-
-   protected:
-      Value &deref() const;
-
-      void increment();
-
-      void decrement();
-
-      difference_type computeDistance( const SelfType &other ) const;
-
-      bool isEqual( const SelfType &other ) const;
-
-      void copy( const SelfType &other );
-
-   private:
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-      Value::ObjectValues::iterator current_;
-      // Indicates that iterator is for a null value.
-      bool isNull_;
-#else
-      union
-      {
-         ValueInternalArray::IteratorState array_;
-         ValueInternalMap::IteratorState map_;
-      } iterator_;
-      bool isArray_;
-#endif
-   };
-
-   /** @brief const iterator for object and array value.
-    *
-    */
-   class ValueConstIterator : public ValueIteratorBase
-   {
-      friend class Value;
-   public:
-      typedef unsigned int size_t;
-      typedef int difference_type;
-      typedef const Value &reference;
-      typedef const Value *pointer;
-      typedef ValueConstIterator SelfType;
-
-      ValueConstIterator();
-   private:
-      /*! \internal Use by Value to create an iterator.
-       */
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-      explicit ValueConstIterator( const Value::ObjectValues::iterator &current );
-#else
-      ValueConstIterator( const ValueInternalArray::IteratorState &state );
-      ValueConstIterator( const ValueInternalMap::IteratorState &state );
-#endif
-   public:
-      SelfType &operator =( const ValueIteratorBase &other );
-
-      SelfType operator++( int )
-      {
-         SelfType temp( *this );
-         ++*this;
-         return temp;
-      }
-
-      SelfType operator--( int )
-      {
-         SelfType temp( *this );
-         --*this;
-         return temp;
-      }
-
-      SelfType &operator--()
-      {
-         decrement();
-         return *this;
-      }
-
-      SelfType &operator++()
-      {
-         increment();
-         return *this;
-      }
-
-      reference operator *() const
-      {
-         return deref();
-      }
-   };
-
-
-   /** @brief Iterator for object and array value.
-    */
-   class ValueIterator : public ValueIteratorBase
-   {
-      friend class Value;
-   public:
-      typedef unsigned int size_t;
-      typedef int difference_type;
-      typedef Value &reference;
-      typedef Value *pointer;
-      typedef ValueIterator SelfType;
-
-      ValueIterator();
-      ValueIterator( const ValueConstIterator &other );
-      ValueIterator( const ValueIterator &other );
-   private:
-      /*! \internal Use by Value to create an iterator.
-       */
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-      explicit ValueIterator( const Value::ObjectValues::iterator &current );
-#else
-      ValueIterator( const ValueInternalArray::IteratorState &state );
-      ValueIterator( const ValueInternalMap::IteratorState &state );
-#endif
-   public:
-
-      SelfType &operator =( const SelfType &other );
-
-      SelfType operator++( int )
-      {
-         SelfType temp( *this );
-         ++*this;
-         return temp;
-      }
-
-      SelfType operator--( int )
-      {
-         SelfType temp( *this );
-         --*this;
-         return temp;
-      }
-
-      SelfType &operator--()
-      {
-         decrement();
-         return *this;
-      }
-
-      SelfType &operator++()
-      {
-         increment();
-         return *this;
-      }
-
-      reference operator *() const
-      {
-         return deref();
-      }
-   };
-
-
-} // namespace Json
-
-
-#endif // CPPTL_JSON_H_INCLUDED

=== removed file 'thirdparty/jsoncpp/include/json/writer.h'
--- thirdparty/jsoncpp/include/json/writer.h	2013-09-10 04:32:16 +0000
+++ thirdparty/jsoncpp/include/json/writer.h	1970-01-01 00:00:00 +0000
@@ -1,174 +0,0 @@
-#ifndef JSON_WRITER_H_INCLUDED
-# define JSON_WRITER_H_INCLUDED
-
-# include "value.h"
-# include <vector>
-# include <string>
-# include <iostream>
-
-namespace Json {
-
-   class Value;
-
-   /** @brief Abstract class for writers.
-    */
-   class JSON_API Writer
-   {
-   public:
-      virtual ~Writer();
-
-      virtual std::string write( const Value &root ) = 0;
-   };
-
-   /** @brief Outputs a Value in <a HREF="http://www.json.org";>JSON</a> format without formatting (not human friendly).
-    *
-    * The JSON document is written in a single line. It is not intended for 'human' consumption,
-    * but may be usefull to support feature such as RPC where bandwith is limited.
-    * \sa Reader, Value
-    */
-   class JSON_API FastWriter : public Writer
-   {
-   public:
-      FastWriter();
-      virtual ~FastWriter(){}
-
-      void enableYAMLCompatibility();
-
-   public: // overridden from Writer
-      virtual std::string write( const Value &root );
-
-   private:
-      void writeValue( const Value &value );
-
-      std::string document_;
-      bool yamlCompatiblityEnabled_;
-   };
-
-   /** @brief Writes a Value in <a HREF="http://www.json.org";>JSON</a> format in a human friendly way.
-    *
-    * The rules for line break and indent are as follow:
-    * - Object value:
-    *     - if empty then print {} without indent and line break
-    *     - if not empty the print '{', line break & indent, print one value per line
-    *       and then unindent and line break and print '}'.
-    * - Array value:
-    *     - if empty then print [] without indent and line break
-    *     - if the array contains no object value, empty array or some other value types,
-    *       and all the values fit on one lines, then print the array on a single line.
-    *     - otherwise, it the values do not fit on one line, or the array contains
-    *       object or non empty array, then print one value per line.
-    *
-    * If the Value have comments then they are outputed according to their #CommentPlacement.
-    *
-    * \sa Reader, Value, Value::setComment()
-    */
-   class JSON_API StyledWriter: public Writer
-   {
-   public:
-      StyledWriter();
-      virtual ~StyledWriter(){}
-
-   public: // overridden from Writer
-      /** @brief Serialize a Value in <a HREF="http://www.json.org";>JSON</a> format.
-       * \param root Value to serialize.
-       * \return String containing the JSON document that represents the root value.
-       */
-      virtual std::string write( const Value &root );
-
-   private:
-      void writeValue( const Value &value );
-      void writeArrayValue( const Value &value );
-      bool isMultineArray( const Value &value );
-      void pushValue( const std::string &value );
-      void writeIndent();
-      void writeWithIndent( const std::string &value );
-      void indent();
-      void unindent();
-      void writeCommentBeforeValue( const Value &root );
-      void writeCommentAfterValueOnSameLine( const Value &root );
-      bool hasCommentForValue( const Value &value );
-      static std::string normalizeEOL( const std::string &text );
-
-      typedef std::vector<std::string> ChildValues;
-
-      ChildValues childValues_;
-      std::string document_;
-      std::string indentString_;
-      int rightMargin_;
-      int indentSize_;
-      bool addChildValues_;
-   };
-
-   /** @brief Writes a Value in <a HREF="http://www.json.org";>JSON</a> format in a human friendly way,
-        to a stream rather than to a string.
-    *
-    * The rules for line break and indent are as follow:
-    * - Object value:
-    *     - if empty then print {} without indent and line break
-    *     - if not empty the print '{', line break & indent, print one value per line
-    *       and then unindent and line break and print '}'.
-    * - Array value:
-    *     - if empty then print [] without indent and line break
-    *     - if the array contains no object value, empty array or some other value types,
-    *       and all the values fit on one lines, then print the array on a single line.
-    *     - otherwise, it the values do not fit on one line, or the array contains
-    *       object or non empty array, then print one value per line.
-    *
-    * If the Value have comments then they are outputed according to their #CommentPlacement.
-    *
-    * \param indentation Each level will be indented by this amount extra.
-    * \sa Reader, Value, Value::setComment()
-    */
-   class JSON_API StyledStreamWriter
-   {
-   public:
-      StyledStreamWriter( std::string indentation="\t" );
-      ~StyledStreamWriter(){}
-
-   public:
-      /** @brief Serialize a Value in <a HREF="http://www.json.org";>JSON</a> format.
-       * \param out Stream to write to. (Can be ostringstream, e.g.)
-       * \param root Value to serialize.
-       * \note There is no point in deriving from Writer, since write() should not return a value.
-       */
-      void write( std::ostream &out, const Value &root );
-
-   private:
-      void writeValue( const Value &value );
-      void writeArrayValue( const Value &value );
-      bool isMultineArray( const Value &value );
-      void pushValue( const std::string &value );
-      void writeIndent();
-      void writeWithIndent( const std::string &value );
-      void indent();
-      void unindent();
-      void writeCommentBeforeValue( const Value &root );
-      void writeCommentAfterValueOnSameLine( const Value &root );
-      bool hasCommentForValue( const Value &value );
-      static std::string normalizeEOL( const std::string &text );
-
-      typedef std::vector<std::string> ChildValues;
-
-      ChildValues childValues_;
-      std::ostream* document_;
-      std::string indentString_;
-      int rightMargin_;
-      std::string indentation_;
-      bool addChildValues_;
-   };
-
-   std::string JSON_API valueToString( Int value );
-   std::string JSON_API valueToString( UInt value );
-   std::string JSON_API valueToString( double value );
-   std::string JSON_API valueToString( bool value );
-   std::string JSON_API valueToQuotedString( const char *value );
-
-   /// @brief Output using the StyledStreamWriter.
-   /// \see Json::operator>>()
-   std::ostream& operator<<( std::ostream&, const Value &root );
-
-} // namespace Json
-
-
-
-#endif // JSON_WRITER_H_INCLUDED

=== removed directory 'thirdparty/jsoncpp/src'
=== removed directory 'thirdparty/jsoncpp/src/lib_json'
=== removed file 'thirdparty/jsoncpp/src/lib_json/json_batchallocator.h'
--- thirdparty/jsoncpp/src/lib_json/json_batchallocator.h	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_batchallocator.h	1970-01-01 00:00:00 +0000
@@ -1,125 +0,0 @@
-#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED
-# define JSONCPP_BATCHALLOCATOR_H_INCLUDED
-
-# include <stdlib.h>
-# include <assert.h>
-
-# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-namespace Json {
-
-/* Fast memory allocator.
- *
- * This memory allocator allocates memory for a batch of object (specified by
- * the page size, the number of object in each page).
- *
- * It does not allow the destruction of a single object. All the allocated objects
- * can be destroyed at once. The memory can be either released or reused for future
- * allocation.
- * 
- * The in-place new operator must be used to construct the object using the pointer
- * returned by allocate.
- */
-template<typename AllocatedType
-        ,const unsigned int objectPerAllocation>
-class BatchAllocator
-{
-public:
-   typedef AllocatedType Type;
-
-   BatchAllocator( unsigned int objectsPerPage = 255 )
-      : freeHead_( 0 )
-      , objectsPerPage_( objectsPerPage )
-   {
-//      printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() );
-      assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space.
-      assert( objectsPerPage >= 16 );
-      batches_ = allocateBatch( 0 );   // allocated a dummy page
-      currentBatch_ = batches_;
-   }
-
-   ~BatchAllocator()
-   {
-      for ( BatchInfo *batch = batches_; batch;  )
-      {
-         BatchInfo *nextBatch = batch->next_;
-         free( batch );
-         batch = nextBatch;
-      }
-   }
-
-   /// allocate space for an array of objectPerAllocation object.
-   /// @warning it is the responsability of the caller to call objects constructors.
-   AllocatedType *allocate()
-   {
-      if ( freeHead_ ) // returns node from free list.
-      {
-         AllocatedType *object = freeHead_;
-         freeHead_ = *(AllocatedType **)object;
-         return object;
-      }
-      if ( currentBatch_->used_ == currentBatch_->end_ )
-      {
-         currentBatch_ = currentBatch_->next_;
-         while ( currentBatch_  &&  currentBatch_->used_ == currentBatch_->end_ )
-            currentBatch_ = currentBatch_->next_;
-
-         if ( !currentBatch_  ) // no free batch found, allocate a new one
-         { 
-            currentBatch_ = allocateBatch( objectsPerPage_ );
-            currentBatch_->next_ = batches_; // insert at the head of the list
-            batches_ = currentBatch_;
-         }
-      }
-      AllocatedType *allocated = currentBatch_->used_;
-      currentBatch_->used_ += objectPerAllocation;
-      return allocated;
-   }
-
-   /// Release the object.
-   /// @warning it is the responsability of the caller to actually destruct the object.
-   void release( AllocatedType *object )
-   {
-      assert( object != 0 );
-      *(AllocatedType **)object = freeHead_;
-      freeHead_ = object;
-   }
-
-private:
-   struct BatchInfo
-   {
-      BatchInfo *next_;
-      AllocatedType *used_;
-      AllocatedType *end_;
-      AllocatedType buffer_[objectPerAllocation];
-   };
-
-   // disabled copy constructor and assignement operator.
-   BatchAllocator( const BatchAllocator & );
-   void operator =( const BatchAllocator &);
-
-   static BatchInfo *allocateBatch( unsigned int objectsPerPage )
-   {
-      const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation
-                                + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage;
-      BatchInfo *batch = static_cast<BatchInfo*>( malloc( mallocSize ) );
-      batch->next_ = 0;
-      batch->used_ = batch->buffer_;
-      batch->end_ = batch->buffer_ + objectsPerPage;
-      return batch;
-   }
-
-   BatchInfo *batches_;
-   BatchInfo *currentBatch_;
-   /// Head of a single linked list within the allocated space of freeed object
-   AllocatedType *freeHead_;
-   unsigned int objectsPerPage_;
-};
-
-
-} // namespace Json
-
-# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION
-
-#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED
-

=== removed file 'thirdparty/jsoncpp/src/lib_json/json_internalarray.inl'
--- thirdparty/jsoncpp/src/lib_json/json_internalarray.inl	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_internalarray.inl	1970-01-01 00:00:00 +0000
@@ -1,448 +0,0 @@
-// included by json_value.cpp
-// everything is within Json namespace
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueInternalArray
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueArrayAllocator::~ValueArrayAllocator()
-{
-}
-
-// //////////////////////////////////////////////////////////////////
-// class DefaultValueArrayAllocator
-// //////////////////////////////////////////////////////////////////
-#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
-class DefaultValueArrayAllocator : public ValueArrayAllocator
-{
-public: // overridden from ValueArrayAllocator
-   virtual ~DefaultValueArrayAllocator()
-   {
-   }
-
-   virtual ValueInternalArray *newArray()
-   {
-      return new ValueInternalArray();
-   }
-
-   virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
-   {
-      return new ValueInternalArray( other );
-   }
-
-   virtual void destructArray( ValueInternalArray *array )
-   {
-      delete array;
-   }
-
-   virtual void reallocateArrayPageIndex( Value **&indexes, 
-                                          ValueInternalArray::PageIndex &indexCount,
-                                          ValueInternalArray::PageIndex minNewIndexCount )
-   {
-      ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
-      if ( minNewIndexCount > newIndexCount )
-         newIndexCount = minNewIndexCount;
-      void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
-      if ( !newIndexes )
-         throw std::bad_alloc();
-      indexCount = newIndexCount;
-      indexes = static_cast<Value **>( newIndexes );
-   }
-   virtual void releaseArrayPageIndex( Value **indexes, 
-                                       ValueInternalArray::PageIndex indexCount )
-   {
-      if ( indexes )
-         free( indexes );
-   }
-
-   virtual Value *allocateArrayPage()
-   {
-      return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) );
-   }
-
-   virtual void releaseArrayPage( Value *value )
-   {
-      if ( value )
-         free( value );
-   }
-};
-
-#else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
-/// @todo make this thread-safe (lock when accessign batch allocator)
-class DefaultValueArrayAllocator : public ValueArrayAllocator
-{
-public: // overridden from ValueArrayAllocator
-   virtual ~DefaultValueArrayAllocator()
-   {
-   }
-
-   virtual ValueInternalArray *newArray()
-   {
-      ValueInternalArray *array = arraysAllocator_.allocate();
-      new (array) ValueInternalArray(); // placement new
-      return array;
-   }
-
-   virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
-   {
-      ValueInternalArray *array = arraysAllocator_.allocate();
-      new (array) ValueInternalArray( other ); // placement new
-      return array;
-   }
-
-   virtual void destructArray( ValueInternalArray *array )
-   {
-      if ( array )
-      {
-         array->~ValueInternalArray();
-         arraysAllocator_.release( array );
-      }
-   }
-
-   virtual void reallocateArrayPageIndex( Value **&indexes, 
-                                          ValueInternalArray::PageIndex &indexCount,
-                                          ValueInternalArray::PageIndex minNewIndexCount )
-   {
-      ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
-      if ( minNewIndexCount > newIndexCount )
-         newIndexCount = minNewIndexCount;
-      void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
-      if ( !newIndexes )
-         throw std::bad_alloc();
-      indexCount = newIndexCount;
-      indexes = static_cast<Value **>( newIndexes );
-   }
-   virtual void releaseArrayPageIndex( Value **indexes, 
-                                       ValueInternalArray::PageIndex indexCount )
-   {
-      if ( indexes )
-         free( indexes );
-   }
-
-   virtual Value *allocateArrayPage()
-   {
-      return static_cast<Value *>( pagesAllocator_.allocate() );
-   }
-
-   virtual void releaseArrayPage( Value *value )
-   {
-      if ( value )
-         pagesAllocator_.release( value );
-   }
-private:
-   BatchAllocator<ValueInternalArray,1> arraysAllocator_;
-   BatchAllocator<Value,ValueInternalArray::itemsPerPage> pagesAllocator_;
-};
-#endif // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
-
-static ValueArrayAllocator *&arrayAllocator()
-{
-   static DefaultValueArrayAllocator defaultAllocator;
-   static ValueArrayAllocator *arrayAllocator = &defaultAllocator;
-   return arrayAllocator;
-}
-
-static struct DummyArrayAllocatorInitializer {
-   DummyArrayAllocatorInitializer() 
-   {
-      arrayAllocator();      // ensure arrayAllocator() statics are initialized before main().
-   }
-} dummyArrayAllocatorInitializer;
-
-// //////////////////////////////////////////////////////////////////
-// class ValueInternalArray
-// //////////////////////////////////////////////////////////////////
-bool 
-ValueInternalArray::equals( const IteratorState &x, 
-                            const IteratorState &other )
-{
-   return x.array_ == other.array_  
-          &&  x.currentItemIndex_ == other.currentItemIndex_  
-          &&  x.currentPageIndex_ == other.currentPageIndex_;
-}
-
-
-void 
-ValueInternalArray::increment( IteratorState &it )
-{
-   JSON_ASSERT_MESSAGE( it.array_  &&
-      (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_
-      != it.array_->size_,
-      "ValueInternalArray::increment(): moving iterator beyond end" );
-   ++(it.currentItemIndex_);
-   if ( it.currentItemIndex_ == itemsPerPage )
-   {
-      it.currentItemIndex_ = 0;
-      ++(it.currentPageIndex_);
-   }
-}
-
-
-void 
-ValueInternalArray::decrement( IteratorState &it )
-{
-   JSON_ASSERT_MESSAGE( it.array_  &&  it.currentPageIndex_ == it.array_->pages_ 
-                        &&  it.currentItemIndex_ == 0,
-      "ValueInternalArray::decrement(): moving iterator beyond end" );
-   if ( it.currentItemIndex_ == 0 )
-   {
-      it.currentItemIndex_ = itemsPerPage-1;
-      --(it.currentPageIndex_);
-   }
-   else
-   {
-      --(it.currentItemIndex_);
-   }
-}
-
-
-Value &
-ValueInternalArray::unsafeDereference( const IteratorState &it )
-{
-   return (*(it.currentPageIndex_))[it.currentItemIndex_];
-}
-
-
-Value &
-ValueInternalArray::dereference( const IteratorState &it )
-{
-   JSON_ASSERT_MESSAGE( it.array_  &&
-      (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_
-      < it.array_->size_,
-      "ValueInternalArray::dereference(): dereferencing invalid iterator" );
-   return unsafeDereference( it );
-}
-
-void 
-ValueInternalArray::makeBeginIterator( IteratorState &it ) const
-{
-   it.array_ = const_cast<ValueInternalArray *>( this );
-   it.currentItemIndex_ = 0;
-   it.currentPageIndex_ = pages_;
-}
-
-
-void 
-ValueInternalArray::makeIterator( IteratorState &it, ArrayIndex index ) const
-{
-   it.array_ = const_cast<ValueInternalArray *>( this );
-   it.currentItemIndex_ = index % itemsPerPage;
-   it.currentPageIndex_ = pages_ + index / itemsPerPage;
-}
-
-
-void 
-ValueInternalArray::makeEndIterator( IteratorState &it ) const
-{
-   makeIterator( it, size_ );
-}
-
-
-ValueInternalArray::ValueInternalArray()
-   : pages_( 0 )
-   , size_( 0 )
-   , pageCount_( 0 )
-{
-}
-
-
-ValueInternalArray::ValueInternalArray( const ValueInternalArray &other )
-   : pages_( 0 )
-   , pageCount_( 0 )
-   , size_( other.size_ )
-{
-   PageIndex minNewPages = other.size_ / itemsPerPage;
-   arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages );
-   JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, 
-                        "ValueInternalArray::reserve(): bad reallocation" );
-   IteratorState itOther;
-   other.makeBeginIterator( itOther );
-   Value *value;
-   for ( ArrayIndex index = 0; index < size_; ++index, increment(itOther) )
-   {
-      if ( index % itemsPerPage == 0 )
-      {
-         PageIndex pageIndex = index / itemsPerPage;
-         value = arrayAllocator()->allocateArrayPage();
-         pages_[pageIndex] = value;
-      }
-      new (value) Value( dereference( itOther ) );
-   }
-}
-
-
-ValueInternalArray &
-ValueInternalArray::operator =( const ValueInternalArray &other )
-{
-   ValueInternalArray temp( other );
-   swap( temp );
-   return *this;
-}
-
-
-ValueInternalArray::~ValueInternalArray()
-{
-   // destroy all constructed items
-   IteratorState it;
-   IteratorState itEnd;
-   makeBeginIterator( it);
-   makeEndIterator( itEnd );
-   for ( ; !equals(it,itEnd); increment(it) )
-   {
-      Value *value = &dereference(it);
-      value->~Value();
-   }
-   // release all pages
-   PageIndex lastPageIndex = size_ / itemsPerPage;
-   for ( PageIndex pageIndex = 0; pageIndex < lastPageIndex; ++pageIndex )
-      arrayAllocator()->releaseArrayPage( pages_[pageIndex] );
-   // release pages index
-   arrayAllocator()->releaseArrayPageIndex( pages_, pageCount_ );
-}
-
-
-void 
-ValueInternalArray::swap( ValueInternalArray &other )
-{
-   Value **tempPages = pages_;
-   pages_ = other.pages_;
-   other.pages_ = tempPages;
-   ArrayIndex tempSize = size_;
-   size_ = other.size_;
-   other.size_ = tempSize;
-   PageIndex tempPageCount = pageCount_;
-   pageCount_ = other.pageCount_;
-   other.pageCount_ = tempPageCount;
-}
-
-void 
-ValueInternalArray::clear()
-{
-   ValueInternalArray dummy;
-   swap( dummy );
-}
-
-
-void 
-ValueInternalArray::resize( ArrayIndex newSize )
-{
-   if ( newSize == 0 )
-      clear();
-   else if ( newSize < size_ )
-   {
-      IteratorState it;
-      IteratorState itEnd;
-      makeIterator( it, newSize );
-      makeIterator( itEnd, size_ );
-      for ( ; !equals(it,itEnd); increment(it) )
-      {
-         Value *value = &dereference(it);
-         value->~Value();
-      }
-      PageIndex pageIndex = (newSize + itemsPerPage - 1) / itemsPerPage;
-      PageIndex lastPageIndex = size_ / itemsPerPage;
-      for ( ; pageIndex < lastPageIndex; ++pageIndex )
-         arrayAllocator()->releaseArrayPage( pages_[pageIndex] );
-      size_ = newSize;
-   }
-   else if ( newSize > size_ )
-      resolveReference( newSize );
-}
-
-
-void 
-ValueInternalArray::makeIndexValid( ArrayIndex index )
-{
-   // Need to enlarge page index ?
-   if ( index >= pageCount_ * itemsPerPage )
-   {
-      PageIndex minNewPages = (index + 1) / itemsPerPage;
-      arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages );
-      JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, "ValueInternalArray::reserve(): bad reallocation" );
-   }
-
-   // Need to allocate new pages ?
-   ArrayIndex nextPageIndex = 
-      (size_ % itemsPerPage) != 0 ? size_ - (size_%itemsPerPage) + itemsPerPage
-                                  : size_;
-   if ( nextPageIndex <= index )
-   {
-      PageIndex pageIndex = nextPageIndex / itemsPerPage;
-      PageIndex pageToAllocate = (index - nextPageIndex) / itemsPerPage + 1;
-      for ( ; pageToAllocate-- > 0; ++pageIndex )
-         pages_[pageIndex] = arrayAllocator()->allocateArrayPage();
-   }
-
-   // Initialize all new entries
-   IteratorState it;
-   IteratorState itEnd;
-   makeIterator( it, size_ );
-   size_ = index + 1;
-   makeIterator( itEnd, size_ );
-   for ( ; !equals(it,itEnd); increment(it) )
-   {
-      Value *value = &dereference(it);
-      new (value) Value(); // Construct a default value using placement new
-   }
-}
-
-Value &
-ValueInternalArray::resolveReference( ArrayIndex index )
-{
-   if ( index >= size_ )
-      makeIndexValid( index );
-   return pages_[index/itemsPerPage][index%itemsPerPage];
-}
-
-Value *
-ValueInternalArray::find( ArrayIndex index ) const
-{
-   if ( index >= size_ )
-      return 0;
-   return &(pages_[index/itemsPerPage][index%itemsPerPage]);
-}
-
-ValueInternalArray::ArrayIndex 
-ValueInternalArray::size() const
-{
-   return size_;
-}
-
-int 
-ValueInternalArray::distance( const IteratorState &x, const IteratorState &y )
-{
-   return indexOf(y) - indexOf(x);
-}
-
-
-ValueInternalArray::ArrayIndex 
-ValueInternalArray::indexOf( const IteratorState &iterator )
-{
-   if ( !iterator.array_ )
-      return ArrayIndex(-1);
-   return ArrayIndex(
-      (iterator.currentPageIndex_ - iterator.array_->pages_) * itemsPerPage 
-      + iterator.currentItemIndex_ );
-}
-
-
-int 
-ValueInternalArray::compare( const ValueInternalArray &other ) const
-{
-   int sizeDiff( size_ - other.size_ );
-   if ( sizeDiff != 0 )
-      return sizeDiff;
-   
-   for ( ArrayIndex index =0; index < size_; ++index )
-   {
-      int diff = pages_[index/itemsPerPage][index%itemsPerPage].compare( 
-         other.pages_[index/itemsPerPage][index%itemsPerPage] );
-      if ( diff != 0 )
-         return diff;
-   }
-   return 0;
-}

=== removed file 'thirdparty/jsoncpp/src/lib_json/json_internalmap.inl'
--- thirdparty/jsoncpp/src/lib_json/json_internalmap.inl	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_internalmap.inl	1970-01-01 00:00:00 +0000
@@ -1,607 +0,0 @@
-// included by json_value.cpp
-// everything is within Json namespace
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueInternalMap
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-/** \internal MUST be safely initialized using memset( this, 0, sizeof(ValueInternalLink) );
-   * This optimization is used by the fast allocator.
-   */
-ValueInternalLink::ValueInternalLink()
-   : previous_( 0 )
-   , next_( 0 )
-{
-}
-
-ValueInternalLink::~ValueInternalLink()
-{ 
-   for ( int index =0; index < itemPerLink; ++index )
-   {
-      if ( !items_[index].isItemAvailable() )
-      {
-         if ( !items_[index].isMemberNameStatic() )
-            free( keys_[index] );
-      }
-      else
-         break;
-   }
-}
-
-
-
-ValueMapAllocator::~ValueMapAllocator()
-{
-}
-
-#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
-class DefaultValueMapAllocator : public ValueMapAllocator
-{
-public: // overridden from ValueMapAllocator
-   virtual ValueInternalMap *newMap()
-   {
-      return new ValueInternalMap();
-   }
-
-   virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
-   {
-      return new ValueInternalMap( other );
-   }
-
-   virtual void destructMap( ValueInternalMap *map )
-   {
-      delete map;
-   }
-
-   virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
-   {
-      return new ValueInternalLink[size];
-   }
-
-   virtual void releaseMapBuckets( ValueInternalLink *links )
-   {
-      delete [] links;
-   }
-
-   virtual ValueInternalLink *allocateMapLink()
-   {
-      return new ValueInternalLink();
-   }
-
-   virtual void releaseMapLink( ValueInternalLink *link )
-   {
-      delete link;
-   }
-};
-#else
-/// @todo make this thread-safe (lock when accessign batch allocator)
-class DefaultValueMapAllocator : public ValueMapAllocator
-{
-public: // overridden from ValueMapAllocator
-   virtual ValueInternalMap *newMap()
-   {
-      ValueInternalMap *map = mapsAllocator_.allocate();
-      new (map) ValueInternalMap(); // placement new
-      return map;
-   }
-
-   virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
-   {
-      ValueInternalMap *map = mapsAllocator_.allocate();
-      new (map) ValueInternalMap( other ); // placement new
-      return map;
-   }
-
-   virtual void destructMap( ValueInternalMap *map )
-   {
-      if ( map )
-      {
-         map->~ValueInternalMap();
-         mapsAllocator_.release( map );
-      }
-   }
-
-   virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
-   {
-      return new ValueInternalLink[size];
-   }
-
-   virtual void releaseMapBuckets( ValueInternalLink *links )
-   {
-      delete [] links;
-   }
-
-   virtual ValueInternalLink *allocateMapLink()
-   {
-      ValueInternalLink *link = linksAllocator_.allocate();
-      memset( link, 0, sizeof(ValueInternalLink) );
-      return link;
-   }
-
-   virtual void releaseMapLink( ValueInternalLink *link )
-   {
-      link->~ValueInternalLink();
-      linksAllocator_.release( link );
-   }
-private:
-   BatchAllocator<ValueInternalMap,1> mapsAllocator_;
-   BatchAllocator<ValueInternalLink,1> linksAllocator_;
-};
-#endif
-
-static ValueMapAllocator *&mapAllocator()
-{
-   static DefaultValueMapAllocator defaultAllocator;
-   static ValueMapAllocator *mapAllocator = &defaultAllocator;
-   return mapAllocator;
-}
-
-static struct DummyMapAllocatorInitializer {
-   DummyMapAllocatorInitializer() 
-   {
-      mapAllocator();      // ensure mapAllocator() statics are initialized before main().
-   }
-} dummyMapAllocatorInitializer;
-
-
-
-// h(K) = value * K >> w ; with w = 32 & K prime w.r.t. 2^32.
-
-/*
-use linked list hash map. 
-buckets array is a container.
-linked list element contains 6 key/values. (memory = (16+4) * 6 + 4 = 124)
-value have extra state: valid, available, deleted
-*/
-
-
-ValueInternalMap::ValueInternalMap()
-   : buckets_( 0 )
-   , tailLink_( 0 )
-   , bucketsSize_( 0 )
-   , itemCount_( 0 )
-{
-}
-
-
-ValueInternalMap::ValueInternalMap( const ValueInternalMap &other )
-   : buckets_( 0 )
-   , tailLink_( 0 )
-   , bucketsSize_( 0 )
-   , itemCount_( 0 )
-{
-   reserve( other.itemCount_ );
-   IteratorState it;
-   IteratorState itEnd;
-   other.makeBeginIterator( it );
-   other.makeEndIterator( itEnd );
-   for ( ; !equals(it,itEnd); increment(it) )
-   {
-      bool isStatic;
-      const char *memberName = key( it, isStatic );
-      const Value &aValue = value( it );
-      resolveReference(memberName, isStatic) = aValue;
-   }
-}
-
-
-ValueInternalMap &
-ValueInternalMap::operator =( const ValueInternalMap &other )
-{
-   ValueInternalMap dummy( other );
-   swap( dummy );
-   return *this;
-}
-
-
-ValueInternalMap::~ValueInternalMap()
-{
-   if ( buckets_ )
-   {
-      for ( BucketIndex bucketIndex =0; bucketIndex < bucketsSize_; ++bucketIndex )
-      {
-         ValueInternalLink *link = buckets_[bucketIndex].next_;
-         while ( link )
-         {
-            ValueInternalLink *linkToRelease = link;
-            link = link->next_;
-            mapAllocator()->releaseMapLink( linkToRelease );
-         }
-      }
-      mapAllocator()->releaseMapBuckets( buckets_ );
-   }
-}
-
-
-void 
-ValueInternalMap::swap( ValueInternalMap &other )
-{
-   ValueInternalLink *tempBuckets = buckets_;
-   buckets_ = other.buckets_;
-   other.buckets_ = tempBuckets;
-   ValueInternalLink *tempTailLink = tailLink_;
-   tailLink_ = other.tailLink_;
-   other.tailLink_ = tempTailLink;
-   BucketIndex tempBucketsSize = bucketsSize_;
-   bucketsSize_ = other.bucketsSize_;
-   other.bucketsSize_ = tempBucketsSize;
-   BucketIndex tempItemCount = itemCount_;
-   itemCount_ = other.itemCount_;
-   other.itemCount_ = tempItemCount;
-}
-
-
-void 
-ValueInternalMap::clear()
-{
-   ValueInternalMap dummy;
-   swap( dummy );
-}
-
-
-ValueInternalMap::BucketIndex 
-ValueInternalMap::size() const
-{
-   return itemCount_;
-}
-
-bool 
-ValueInternalMap::reserveDelta( BucketIndex growth )
-{
-   return reserve( itemCount_ + growth );
-}
-
-bool 
-ValueInternalMap::reserve( BucketIndex newItemCount )
-{
-   if ( !buckets_  &&  newItemCount > 0 )
-   {
-      buckets_ = mapAllocator()->allocateMapBuckets( 1 );
-      bucketsSize_ = 1;
-      tailLink_ = &buckets_[0];
-   }
-//   BucketIndex idealBucketCount = (newItemCount + ValueInternalLink::itemPerLink) / ValueInternalLink::itemPerLink;
-   return true;
-}
-
-
-const Value *
-ValueInternalMap::find( const char *key ) const
-{
-   if ( !bucketsSize_ )
-      return 0;
-   HashKey hashedKey = hash( key );
-   BucketIndex bucketIndex = hashedKey % bucketsSize_;
-   for ( const ValueInternalLink *current = &buckets_[bucketIndex]; 
-         current != 0; 
-         current = current->next_ )
-   {
-      for ( BucketIndex index=0; index < ValueInternalLink::itemPerLink; ++index )
-      {
-         if ( current->items_[index].isItemAvailable() )
-            return 0;
-         if ( strcmp( key, current->keys_[index] ) == 0 )
-            return &current->items_[index];
-      }
-   }
-   return 0;
-}
-
-
-Value *
-ValueInternalMap::find( const char *key )
-{
-   const ValueInternalMap *constThis = this;
-   return const_cast<Value *>( constThis->find( key ) );
-}
-
-
-Value &
-ValueInternalMap::resolveReference( const char *key,
-                                    bool isStatic )
-{
-   HashKey hashedKey = hash( key );
-   if ( bucketsSize_ )
-   {
-      BucketIndex bucketIndex = hashedKey % bucketsSize_;
-      ValueInternalLink **previous = 0;
-      BucketIndex index;
-      for ( ValueInternalLink *current = &buckets_[bucketIndex]; 
-            current != 0; 
-            previous = &current->next_, current = current->next_ )
-      {
-         for ( index=0; index < ValueInternalLink::itemPerLink; ++index )
-         {
-            if ( current->items_[index].isItemAvailable() )
-               return setNewItem( key, isStatic, current, index );
-            if ( strcmp( key, current->keys_[index] ) == 0 )
-               return current->items_[index];
-         }
-      }
-   }
-
-   reserveDelta( 1 );
-   return unsafeAdd( key, isStatic, hashedKey );
-}
-
-
-void 
-ValueInternalMap::remove( const char *key )
-{
-   HashKey hashedKey = hash( key );
-   if ( !bucketsSize_ )
-      return;
-   BucketIndex bucketIndex = hashedKey % bucketsSize_;
-   for ( ValueInternalLink *link = &buckets_[bucketIndex]; 
-         link != 0; 
-         link = link->next_ )
-   {
-      BucketIndex index;
-      for ( index =0; index < ValueInternalLink::itemPerLink; ++index )
-      {
-         if ( link->items_[index].isItemAvailable() )
-            return;
-         if ( strcmp( key, link->keys_[index] ) == 0 )
-         {
-            doActualRemove( link, index, bucketIndex );
-            return;
-         }
-      }
-   }
-}
-
-void 
-ValueInternalMap::doActualRemove( ValueInternalLink *link, 
-                                  BucketIndex index,
-                                  BucketIndex bucketIndex )
-{
-   // find last item of the bucket and swap it with the 'removed' one.
-   // set removed items flags to 'available'.
-   // if last page only contains 'available' items, then desallocate it (it's empty)
-   ValueInternalLink *&lastLink = getLastLinkInBucket( index );
-   BucketIndex lastItemIndex = 1; // a link can never be empty, so start at 1
-   for ( ;   
-         lastItemIndex < ValueInternalLink::itemPerLink; 
-         ++lastItemIndex ) // may be optimized with dicotomic search
-   {
-      if ( lastLink->items_[lastItemIndex].isItemAvailable() )
-         break;
-   }
-   
-   BucketIndex lastUsedIndex = lastItemIndex - 1;
-   Value *valueToDelete = &link->items_[index];
-   Value *valueToPreserve = &lastLink->items_[lastUsedIndex];
-   if ( valueToDelete != valueToPreserve )
-      valueToDelete->swap( *valueToPreserve );
-   if ( lastUsedIndex == 0 )  // page is now empty
-   {  // remove it from bucket linked list and delete it.
-      ValueInternalLink *linkPreviousToLast = lastLink->previous_;
-      if ( linkPreviousToLast != 0 )   // can not deleted bucket link.
-      {
-         mapAllocator()->releaseMapLink( lastLink );
-         linkPreviousToLast->next_ = 0;
-         lastLink = linkPreviousToLast;
-      }
-   }
-   else
-   {
-      Value dummy;
-      valueToPreserve->swap( dummy ); // restore deleted to default Value.
-      valueToPreserve->setItemUsed( false );
-   }
-   --itemCount_;
-}
-
-
-ValueInternalLink *&
-ValueInternalMap::getLastLinkInBucket( BucketIndex bucketIndex )
-{
-   if ( bucketIndex == bucketsSize_ - 1 )
-      return tailLink_;
-   ValueInternalLink *&previous = buckets_[bucketIndex+1].previous_;
-   if ( !previous )
-      previous = &buckets_[bucketIndex];
-   return previous;
-}
-
-
-Value &
-ValueInternalMap::setNewItem( const char *key, 
-                              bool isStatic,
-                              ValueInternalLink *link, 
-                              BucketIndex index )
-{
-   char *duplicatedKey = valueAllocator()->makeMemberName( key );
-   ++itemCount_;
-   link->keys_[index] = duplicatedKey;
-   link->items_[index].setItemUsed();
-   link->items_[index].setMemberNameIsStatic( isStatic );
-   return link->items_[index]; // items already default constructed.
-}
-
-
-Value &
-ValueInternalMap::unsafeAdd( const char *key, 
-                             bool isStatic, 
-                             HashKey hashedKey )
-{
-   JSON_ASSERT_MESSAGE( bucketsSize_ > 0, "ValueInternalMap::unsafeAdd(): internal logic error." );
-   BucketIndex bucketIndex = hashedKey % bucketsSize_;
-   ValueInternalLink *&previousLink = getLastLinkInBucket( bucketIndex );
-   ValueInternalLink *link = previousLink;
-   BucketIndex index;
-   for ( index =0; index < ValueInternalLink::itemPerLink; ++index )
-   {
-      if ( link->items_[index].isItemAvailable() )
-         break;
-   }
-   if ( index == ValueInternalLink::itemPerLink ) // need to add a new page
-   {
-      ValueInternalLink *newLink = mapAllocator()->allocateMapLink();
-      index = 0;
-      link->next_ = newLink;
-      previousLink = newLink;
-      link = newLink;
-   }
-   return setNewItem( key, isStatic, link, index );
-}
-
-
-ValueInternalMap::HashKey 
-ValueInternalMap::hash( const char *key ) const
-{
-   HashKey hash = 0;
-   while ( *key )
-      hash += *key++ * 37;
-   return hash;
-}
-
-
-int 
-ValueInternalMap::compare( const ValueInternalMap &other ) const
-{
-   int sizeDiff( itemCount_ - other.itemCount_ );
-   if ( sizeDiff != 0 )
-      return sizeDiff;
-   // Strict order guaranty is required. Compare all keys FIRST, then compare values.
-   IteratorState it;
-   IteratorState itEnd;
-   makeBeginIterator( it );
-   makeEndIterator( itEnd );
-   for ( ; !equals(it,itEnd); increment(it) )
-   {
-      if ( !other.find( key( it ) ) )
-         return 1;
-   }
-
-   // All keys are equals, let's compare values
-   makeBeginIterator( it );
-   for ( ; !equals(it,itEnd); increment(it) )
-   {
-      const Value *otherValue = other.find( key( it ) );
-      int valueDiff = value(it).compare( *otherValue );
-      if ( valueDiff != 0 )
-         return valueDiff;
-   }
-   return 0;
-}
-
-
-void 
-ValueInternalMap::makeBeginIterator( IteratorState &it ) const
-{
-   it.map_ = const_cast<ValueInternalMap *>( this );
-   it.bucketIndex_ = 0;
-   it.itemIndex_ = 0;
-   it.link_ = buckets_;
-}
-
-
-void 
-ValueInternalMap::makeEndIterator( IteratorState &it ) const
-{
-   it.map_ = const_cast<ValueInternalMap *>( this );
-   it.bucketIndex_ = bucketsSize_;
-   it.itemIndex_ = 0;
-   it.link_ = 0;
-}
-
-
-bool 
-ValueInternalMap::equals( const IteratorState &x, const IteratorState &other )
-{
-   return x.map_ == other.map_  
-          &&  x.bucketIndex_ == other.bucketIndex_  
-          &&  x.link_ == other.link_
-          &&  x.itemIndex_ == other.itemIndex_;
-}
-
-
-void 
-ValueInternalMap::incrementBucket( IteratorState &iterator )
-{
-   ++iterator.bucketIndex_;
-   JSON_ASSERT_MESSAGE( iterator.bucketIndex_ <= iterator.map_->bucketsSize_,
-      "ValueInternalMap::increment(): attempting to iterate beyond end." );
-   if ( iterator.bucketIndex_ == iterator.map_->bucketsSize_ )
-      iterator.link_ = 0;
-   else
-      iterator.link_ = &(iterator.map_->buckets_[iterator.bucketIndex_]);
-   iterator.itemIndex_ = 0;
-}
-
-
-void 
-ValueInternalMap::increment( IteratorState &iterator )
-{
-   JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterator using invalid iterator." );
-   ++iterator.itemIndex_;
-   if ( iterator.itemIndex_ == ValueInternalLink::itemPerLink )
-   {
-      JSON_ASSERT_MESSAGE( iterator.link_ != 0,
-         "ValueInternalMap::increment(): attempting to iterate beyond end." );
-      iterator.link_ = iterator.link_->next_;
-      if ( iterator.link_ == 0 )
-         incrementBucket( iterator );
-   }
-   else if ( iterator.link_->items_[iterator.itemIndex_].isItemAvailable() )
-   {
-      incrementBucket( iterator );
-   }
-}
-
-
-void 
-ValueInternalMap::decrement( IteratorState &iterator )
-{
-   if ( iterator.itemIndex_ == 0 )
-   {
-      JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterate using invalid iterator." );
-      if ( iterator.link_ == &iterator.map_->buckets_[iterator.bucketIndex_] )
-      {
-         JSON_ASSERT_MESSAGE( iterator.bucketIndex_ > 0, "Attempting to iterate beyond beginning." );
-         --(iterator.bucketIndex_);
-      }
-      iterator.link_ = iterator.link_->previous_;
-      iterator.itemIndex_ = ValueInternalLink::itemPerLink - 1;
-   }
-}
-
-
-const char *
-ValueInternalMap::key( const IteratorState &iterator )
-{
-   JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." );
-   return iterator.link_->keys_[iterator.itemIndex_];
-}
-
-const char *
-ValueInternalMap::key( const IteratorState &iterator, bool &isStatic )
-{
-   JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." );
-   isStatic = iterator.link_->items_[iterator.itemIndex_].isMemberNameStatic();
-   return iterator.link_->keys_[iterator.itemIndex_];
-}
-
-
-Value &
-ValueInternalMap::value( const IteratorState &iterator )
-{
-   JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." );
-   return iterator.link_->items_[iterator.itemIndex_];
-}
-
-
-int 
-ValueInternalMap::distance( const IteratorState &x, const IteratorState &y )
-{
-   int offset = 0;
-   IteratorState it = x;
-   while ( !equals( it, y ) )
-      increment( it );
-   return offset;
-}

=== removed file 'thirdparty/jsoncpp/src/lib_json/json_reader.cpp'
--- thirdparty/jsoncpp/src/lib_json/json_reader.cpp	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_reader.cpp	1970-01-01 00:00:00 +0000
@@ -1,885 +0,0 @@
-#include <json/reader.h>
-#include <json/value.h>
-#include <utility>
-#include <cstdio>
-#include <cassert>
-#include <cstring>
-#include <iostream>
-#include <stdexcept>
-
-#if _MSC_VER >= 1400 // VC++ 8.0
-#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.
-#endif
-
-namespace Json {
-
-// Implementation of class Features
-// ////////////////////////////////
-
-Features::Features()
-   : allowComments_( true )
-   , strictRoot_( false )
-{
-}
-
-
-Features 
-Features::all()
-{
-   return Features();
-}
-
-
-Features 
-Features::strictMode()
-{
-   Features features;
-   features.allowComments_ = false;
-   features.strictRoot_ = true;
-   return features;
-}
-
-// Implementation of class Reader
-// ////////////////////////////////
-
-
-static inline bool 
-in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 )
-{
-   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4;
-}
-
-static inline bool 
-in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 )
-{
-   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4  ||  c == c5;
-}
-
-
-static bool 
-containsNewLine( Reader::Location begin, 
-                 Reader::Location end )
-{
-   for ( ;begin < end; ++begin )
-      if ( *begin == '\n'  ||  *begin == '\r' )
-         return true;
-   return false;
-}
-
-static std::string codePointToUTF8(unsigned int cp)
-{
-   std::string result;
-   
-   // based on description from http://en.wikipedia.org/wiki/UTF-8
-
-   if (cp <= 0x7f) 
-   {
-      result.resize(1);
-      result[0] = static_cast<char>(cp);
-   } 
-   else if (cp <= 0x7FF) 
-   {
-      result.resize(2);
-      result[1] = static_cast<char>(0x80 | (0x3f & cp));
-      result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));
-   } 
-   else if (cp <= 0xFFFF) 
-   {
-      result.resize(3);
-      result[2] = static_cast<char>(0x80 | (0x3f & cp));
-      result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));
-      result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));
-   }
-   else if (cp <= 0x10FFFF) 
-   {
-      result.resize(4);
-      result[3] = static_cast<char>(0x80 | (0x3f & cp));
-      result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));
-      result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));
-      result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));
-   }
-
-   return result;
-}
-
-
-// Class Reader
-// //////////////////////////////////////////////////////////////////
-
-Reader::Reader()
-   : features_( Features::all() )
-{
-}
-
-
-Reader::Reader( const Features &features )
-   : features_( features )
-{
-}
-
-
-bool
-Reader::parse( const std::string &document, 
-               Value &root,
-               bool collectComments )
-{
-   document_ = document;
-   const char *begin = document_.c_str();
-   const char *end = begin + document_.length();
-   return parse( begin, end, root, collectComments );
-}
-
-
-bool
-Reader::parse( std::istream& sin,
-               Value &root,
-               bool collectComments )
-{
-   //std::istream_iterator<char> begin(sin);
-   //std::istream_iterator<char> end;
-   // Those would allow streamed input from a file, if parse() were a
-   // template function.
-
-   // Since std::string is reference-counted, this at least does not
-   // create an extra copy.
-   std::string doc;
-   std::getline(sin, doc, (char)EOF);
-   return parse( doc, root, collectComments );
-}
-
-bool 
-Reader::parse( const char *beginDoc, const char *endDoc, 
-               Value &root,
-               bool collectComments )
-{
-   if ( !features_.allowComments_ )
-   {
-      collectComments = false;
-   }
-
-   begin_ = beginDoc;
-   end_ = endDoc;
-   collectComments_ = collectComments;
-   current_ = begin_;
-   lastValueEnd_ = 0;
-   lastValue_ = 0;
-   commentsBefore_ = "";
-   errors_.clear();
-   while ( !nodes_.empty() )
-      nodes_.pop();
-   nodes_.push( &root );
-   
-   bool successful = readValue();
-   Token token;
-   skipCommentTokens( token );
-   if ( collectComments_  &&  !commentsBefore_.empty() )
-      root.setComment( commentsBefore_, commentAfter );
-   if ( features_.strictRoot_ )
-   {
-      if ( !root.isArray()  &&  !root.isObject() )
-      {
-         // Set error location to start of doc, ideally should be first token found in doc
-         token.type_ = tokenError;
-         token.start_ = beginDoc;
-         token.end_ = endDoc;
-         addError( "A valid JSON document must be either an array or an object value.",
-                   token );
-         return false;
-      }
-   }
-   return successful;
-}
-
-
-bool
-Reader::readValue()
-{
-   Token token;
-   skipCommentTokens( token );
-   bool successful = true;
-
-   if ( collectComments_  &&  !commentsBefore_.empty() )
-   {
-      currentValue().setComment( commentsBefore_, commentBefore );
-      commentsBefore_ = "";
-   }
-
-
-   switch ( token.type_ )
-   {
-   case tokenObjectBegin:
-      successful = readObject( token );
-      break;
-   case tokenArrayBegin:
-      successful = readArray( token );
-      break;
-   case tokenNumber:
-      successful = decodeNumber( token );
-      break;
-   case tokenString:
-      successful = decodeString( token );
-      break;
-   case tokenTrue:
-      currentValue() = true;
-      break;
-   case tokenFalse:
-      currentValue() = false;
-      break;
-   case tokenNull:
-      currentValue() = Value();
-      break;
-   default:
-      return addError( "Syntax error: value, object or array expected.", token );
-   }
-
-   if ( collectComments_ )
-   {
-      lastValueEnd_ = current_;
-      lastValue_ = &currentValue();
-   }
-
-   return successful;
-}
-
-
-void 
-Reader::skipCommentTokens( Token &token )
-{
-   if ( features_.allowComments_ )
-   {
-      do
-      {
-         readToken( token );
-      }
-      while ( token.type_ == tokenComment );
-   }
-   else
-   {
-      readToken( token );
-   }
-}
-
-
-bool 
-Reader::expectToken( TokenType type, Token &token, const char *message )
-{
-   readToken( token );
-   if ( token.type_ != type )
-      return addError( message, token );
-   return true;
-}
-
-
-bool 
-Reader::readToken( Token &token )
-{
-   skipSpaces();
-   token.start_ = current_;
-   Char c = getNextChar();
-   bool ok = true;
-   switch ( c )
-   {
-   case '{':
-      token.type_ = tokenObjectBegin;
-      break;
-   case '}':
-      token.type_ = tokenObjectEnd;
-      break;
-   case '[':
-      token.type_ = tokenArrayBegin;
-      break;
-   case ']':
-      token.type_ = tokenArrayEnd;
-      break;
-   case '"':
-      token.type_ = tokenString;
-      ok = readString();
-      break;
-   case '/':
-      token.type_ = tokenComment;
-      ok = readComment();
-      break;
-   case '0':
-   case '1':
-   case '2':
-   case '3':
-   case '4':
-   case '5':
-   case '6':
-   case '7':
-   case '8':
-   case '9':
-   case '-':
-      token.type_ = tokenNumber;
-      readNumber();
-      break;
-   case 't':
-      token.type_ = tokenTrue;
-      ok = match( "rue", 3 );
-      break;
-   case 'f':
-      token.type_ = tokenFalse;
-      ok = match( "alse", 4 );
-      break;
-   case 'n':
-      token.type_ = tokenNull;
-      ok = match( "ull", 3 );
-      break;
-   case ',':
-      token.type_ = tokenArraySeparator;
-      break;
-   case ':':
-      token.type_ = tokenMemberSeparator;
-      break;
-   case 0:
-      token.type_ = tokenEndOfStream;
-      break;
-   default:
-      ok = false;
-      break;
-   }
-   if ( !ok )
-      token.type_ = tokenError;
-   token.end_ = current_;
-   return true;
-}
-
-
-void 
-Reader::skipSpaces()
-{
-   while ( current_ != end_ )
-   {
-      Char c = *current_;
-      if ( c == ' '  ||  c == '\t'  ||  c == '\r'  ||  c == '\n' )
-         ++current_;
-      else
-         break;
-   }
-}
-
-
-bool 
-Reader::match( Location pattern, 
-               int patternLength )
-{
-   if ( end_ - current_ < patternLength )
-      return false;
-   int index = patternLength;
-   while ( index-- )
-      if ( current_[index] != pattern[index] )
-         return false;
-   current_ += patternLength;
-   return true;
-}
-
-
-bool
-Reader::readComment()
-{
-   Location commentBegin = current_ - 1;
-   Char c = getNextChar();
-   bool successful = false;
-   if ( c == '*' )
-      successful = readCStyleComment();
-   else if ( c == '/' )
-      successful = readCppStyleComment();
-   if ( !successful )
-      return false;
-
-   if ( collectComments_ )
-   {
-      CommentPlacement placement = commentBefore;
-      if ( lastValueEnd_  &&  !containsNewLine( lastValueEnd_, commentBegin ) )
-      {
-         if ( c != '*'  ||  !containsNewLine( commentBegin, current_ ) )
-            placement = commentAfterOnSameLine;
-      }
-
-      addComment( commentBegin, current_, placement );
-   }
-   return true;
-}
-
-
-void 
-Reader::addComment( Location begin, 
-                    Location end, 
-                    CommentPlacement placement )
-{
-   assert( collectComments_ );
-   if ( placement == commentAfterOnSameLine )
-   {
-      assert( lastValue_ != 0 );
-      lastValue_->setComment( std::string( begin, end ), placement );
-   }
-   else
-   {
-      if ( !commentsBefore_.empty() )
-         commentsBefore_ += "\n";
-      commentsBefore_ += std::string( begin, end );
-   }
-}
-
-
-bool 
-Reader::readCStyleComment()
-{
-   while ( current_ != end_ )
-   {
-      Char c = getNextChar();
-      if ( c == '*'  &&  *current_ == '/' )
-         break;
-   }
-   return getNextChar() == '/';
-}
-
-
-bool 
-Reader::readCppStyleComment()
-{
-   while ( current_ != end_ )
-   {
-      Char c = getNextChar();
-      if (  c == '\r'  ||  c == '\n' )
-         break;
-   }
-   return true;
-}
-
-
-void 
-Reader::readNumber()
-{
-   while ( current_ != end_ )
-   {
-      if ( !(*current_ >= '0'  &&  *current_ <= '9')  &&
-           !in( *current_, '.', 'e', 'E', '+', '-' ) )
-         break;
-      ++current_;
-   }
-}
-
-bool
-Reader::readString()
-{
-   Char c = 0;
-   while ( current_ != end_ )
-   {
-      c = getNextChar();
-      if ( c == '\\' )
-         getNextChar();
-      else if ( c == '"' )
-         break;
-   }
-   return c == '"';
-}
-
-
-bool 
-Reader::readObject( Token &tokenStart )
-{
-   Token tokenName;
-   std::string name;
-   currentValue() = Value( objectValue );
-   while ( readToken( tokenName ) )
-   {
-      bool initialTokenOk = true;
-      while ( tokenName.type_ == tokenComment  &&  initialTokenOk )
-         initialTokenOk = readToken( tokenName );
-      if  ( !initialTokenOk )
-         break;
-      if ( tokenName.type_ == tokenObjectEnd  &&  name.empty() )  // empty object
-         return true;
-      if ( tokenName.type_ != tokenString )
-         break;
-      
-      name = "";
-      if ( !decodeString( tokenName, name ) )
-         return recoverFromError( tokenObjectEnd );
-
-      Token colon;
-      if ( !readToken( colon ) ||  colon.type_ != tokenMemberSeparator )
-      {
-         return addErrorAndRecover( "Missing ':' after object member name", 
-                                    colon, 
-                                    tokenObjectEnd );
-      }
-      Value &value = currentValue()[ name ];
-      nodes_.push( &value );
-      bool ok = readValue();
-      nodes_.pop();
-      if ( !ok ) // error already set
-         return recoverFromError( tokenObjectEnd );
-
-      Token comma;
-      if ( !readToken( comma )
-            ||  ( comma.type_ != tokenObjectEnd  &&  
-                  comma.type_ != tokenArraySeparator &&
-		  comma.type_ != tokenComment ) )
-      {
-         return addErrorAndRecover( "Missing ',' or '}' in object declaration", 
-                                    comma, 
-                                    tokenObjectEnd );
-      }
-      bool finalizeTokenOk = true;
-      while ( comma.type_ == tokenComment &&
-              finalizeTokenOk )
-         finalizeTokenOk = readToken( comma );
-      if ( comma.type_ == tokenObjectEnd )
-         return true;
-   }
-   return addErrorAndRecover( "Missing '}' or object member name", 
-                              tokenName, 
-                              tokenObjectEnd );
-}
-
-
-bool 
-Reader::readArray( Token &tokenStart )
-{
-   currentValue() = Value( arrayValue );
-   skipSpaces();
-   if ( *current_ == ']' ) // empty array
-   {
-      Token endArray;
-      readToken( endArray );
-      return true;
-   }
-   int index = 0;
-   while ( true )
-   {
-      Value &value = currentValue()[ index++ ];
-      nodes_.push( &value );
-      bool ok = readValue();
-      nodes_.pop();
-      if ( !ok ) // error already set
-         return recoverFromError( tokenArrayEnd );
-
-      Token token;
-      // Accept Comment after last item in the array.
-      ok = readToken( token );
-      while ( token.type_ == tokenComment  &&  ok )
-      {
-         ok = readToken( token );
-      }
-      bool badTokenType = ( token.type_ == tokenArraySeparator  &&  
-                            token.type_ == tokenArrayEnd );
-      if ( !ok  ||  badTokenType )
-      {
-         return addErrorAndRecover( "Missing ',' or ']' in array declaration", 
-                                    token, 
-                                    tokenArrayEnd );
-      }
-      if ( token.type_ == tokenArrayEnd )
-         break;
-   }
-   return true;
-}
-
-
-bool 
-Reader::decodeNumber( Token &token )
-{
-   bool isDouble = false;
-   for ( Location inspect = token.start_; inspect != token.end_; ++inspect )
-   {
-      isDouble = isDouble  
-                 ||  in( *inspect, '.', 'e', 'E', '+' )  
-                 ||  ( *inspect == '-'  &&  inspect != token.start_ );
-   }
-   if ( isDouble )
-      return decodeDouble( token );
-   Location current = token.start_;
-   bool isNegative = *current == '-';
-   if ( isNegative )
-      ++current;
-   Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) 
-                                       : Value::maxUInt) / 10;
-   Value::UInt value = 0;
-   while ( current < token.end_ )
-   {
-      Char c = *current++;
-      if ( c < '0'  ||  c > '9' )
-         return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
-      if ( value >= threshold )
-         return decodeDouble( token );
-      value = value * 10 + Value::UInt(c - '0');
-   }
-   if ( isNegative )
-      currentValue() = -Value::Int( value );
-   else if ( value <= Value::UInt(Value::maxInt) )
-      currentValue() = Value::Int( value );
-   else
-      currentValue() = value;
-   return true;
-}
-
-
-bool 
-Reader::decodeDouble( Token &token )
-{
-   double value = 0;
-   const int bufferSize = 32;
-   int count;
-   int length = int(token.end_ - token.start_);
-   if ( length <= bufferSize )
-   {
-      Char buffer[bufferSize];
-      memcpy( buffer, token.start_, length );
-      buffer[length] = 0;
-      count = sscanf( buffer, "%lf", &value );
-   }
-   else
-   {
-      std::string buffer( token.start_, token.end_ );
-      count = sscanf( buffer.c_str(), "%lf", &value );
-   }
-
-   if ( count != 1 )
-      return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
-   currentValue() = value;
-   return true;
-}
-
-
-bool 
-Reader::decodeString( Token &token )
-{
-   std::string decoded;
-   if ( !decodeString( token, decoded ) )
-      return false;
-   currentValue() = decoded;
-   return true;
-}
-
-
-bool 
-Reader::decodeString( Token &token, std::string &decoded )
-{
-   decoded.reserve( token.end_ - token.start_ - 2 );
-   Location current = token.start_ + 1; // skip '"'
-   Location end = token.end_ - 1;      // do not include '"'
-   while ( current != end )
-   {
-      Char c = *current++;
-      if ( c == '"' )
-         break;
-      else if ( c == '\\' )
-      {
-         if ( current == end )
-            return addError( "Empty escape sequence in string", token, current );
-         Char escape = *current++;
-         switch ( escape )
-         {
-         case '"': decoded += '"'; break;
-         case '/': decoded += '/'; break;
-         case '\\': decoded += '\\'; break;
-         case 'b': decoded += '\b'; break;
-         case 'f': decoded += '\f'; break;
-         case 'n': decoded += '\n'; break;
-         case 'r': decoded += '\r'; break;
-         case 't': decoded += '\t'; break;
-         case 'u':
-            {
-               unsigned int unicode;
-               if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )
-                  return false;
-               decoded += codePointToUTF8(unicode);
-            }
-            break;
-         default:
-            return addError( "Bad escape sequence in string", token, current );
-         }
-      }
-      else
-      {
-         decoded += c;
-      }
-   }
-   return true;
-}
-
-bool
-Reader::decodeUnicodeCodePoint( Token &token, 
-                                     Location &current, 
-                                     Location end, 
-                                     unsigned int &unicode )
-{
-
-   if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) )
-      return false;
-   if (unicode >= 0xD800 && unicode <= 0xDBFF)
-   {
-      // surrogate pairs
-      if (end - current < 6)
-         return addError( "additional six characters expected to parse unicode surrogate pair.", token, current );
-      unsigned int surrogatePair;
-      if (*(current++) == '\\' && *(current++)== 'u')
-      {
-         if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair ))
-         {
-            unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
-         } 
-         else
-            return false;
-      } 
-      else
-         return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current );
-   }
-   return true;
-}
-
-bool 
-Reader::decodeUnicodeEscapeSequence( Token &token, 
-                                     Location &current, 
-                                     Location end, 
-                                     unsigned int &unicode )
-{
-   if ( end - current < 4 )
-      return addError( "Bad unicode escape sequence in string: four digits expected.", token, current );
-   unicode = 0;
-   for ( int index =0; index < 4; ++index )
-   {
-      Char c = *current++;
-      unicode *= 16;
-      if ( c >= '0'  &&  c <= '9' )
-         unicode += c - '0';
-      else if ( c >= 'a'  &&  c <= 'f' )
-         unicode += c - 'a' + 10;
-      else if ( c >= 'A'  &&  c <= 'F' )
-         unicode += c - 'A' + 10;
-      else
-         return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current );
-   }
-   return true;
-}
-
-
-bool 
-Reader::addError( const std::string &message, 
-                  Token &token,
-                  Location extra )
-{
-   ErrorInfo info;
-   info.token_ = token;
-   info.message_ = message;
-   info.extra_ = extra;
-   errors_.push_back( info );
-   return false;
-}
-
-
-bool 
-Reader::recoverFromError( TokenType skipUntilToken )
-{
-   int errorCount = int(errors_.size());
-   Token skip;
-   while ( true )
-   {
-      if ( !readToken(skip) )
-         errors_.resize( errorCount ); // discard errors caused by recovery
-      if ( skip.type_ == skipUntilToken  ||  skip.type_ == tokenEndOfStream )
-         break;
-   }
-   errors_.resize( errorCount );
-   return false;
-}
-
-
-bool 
-Reader::addErrorAndRecover( const std::string &message, 
-                            Token &token,
-                            TokenType skipUntilToken )
-{
-   addError( message, token );
-   return recoverFromError( skipUntilToken );
-}
-
-
-Value &
-Reader::currentValue()
-{
-   return *(nodes_.top());
-}
-
-
-Reader::Char 
-Reader::getNextChar()
-{
-   if ( current_ == end_ )
-      return 0;
-   return *current_++;
-}
-
-
-void 
-Reader::getLocationLineAndColumn( Location location,
-                                  int &line,
-                                  int &column ) const
-{
-   Location current = begin_;
-   Location lastLineStart = current;
-   line = 0;
-   while ( current < location  &&  current != end_ )
-   {
-      Char c = *current++;
-      if ( c == '\r' )
-      {
-         if ( *current == '\n' )
-            ++current;
-         lastLineStart = current;
-         ++line;
-      }
-      else if ( c == '\n' )
-      {
-         lastLineStart = current;
-         ++line;
-      }
-   }
-   // column & line start at 1
-   column = int(location - lastLineStart) + 1;
-   ++line;
-}
-
-
-std::string
-Reader::getLocationLineAndColumn( Location location ) const
-{
-   int line, column;
-   getLocationLineAndColumn( location, line, column );
-   char buffer[18+16+16+1];
-   sprintf( buffer, "Line %d, Column %d", line, column );
-   return buffer;
-}
-
-
-std::string 
-Reader::getFormatedErrorMessages() const
-{
-   std::string formattedMessage;
-   for ( Errors::const_iterator itError = errors_.begin();
-         itError != errors_.end();
-         ++itError )
-   {
-      const ErrorInfo &error = *itError;
-      formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n";
-      formattedMessage += "  " + error.message_ + "\n";
-      if ( error.extra_ )
-         formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n";
-   }
-   return formattedMessage;
-}
-
-
-std::istream& operator>>( std::istream &sin, Value &root )
-{
-    Json::Reader reader;
-    bool ok = reader.parse(sin, root, true);
-    //JSON_ASSERT( ok );
-    if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages());
-    return sin;
-}
-
-
-} // namespace Json

=== removed file 'thirdparty/jsoncpp/src/lib_json/json_value.cpp'
--- thirdparty/jsoncpp/src/lib_json/json_value.cpp	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_value.cpp	1970-01-01 00:00:00 +0000
@@ -1,1718 +0,0 @@
-#include <iostream>
-#include <json/value.h>
-#include <json/writer.h>
-#include <utility>
-#include <stdexcept>
-#include <cstring>
-#include <cassert>
-#ifdef JSON_USE_CPPTL
-# include <cpptl/conststring.h>
-#endif
-#include <cstddef>    // size_t
-#ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
-# include "json_batchallocator.h"
-#endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
-
-#define JSON_ASSERT_UNREACHABLE assert( false )
-#define JSON_ASSERT( condition ) assert( condition );  // @todo <= change this into an exception throw
-#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) throw std::runtime_error( message );
-
-namespace Json {
-
-const Value Value::null;
-const Int Value::minInt = Int( ~(UInt(-1)/2) );
-const Int Value::maxInt = Int( UInt(-1)/2 );
-const UInt Value::maxUInt = UInt(-1);
-
-// A "safe" implementation of strdup. Allow null pointer to be passed. 
-// Also avoid warning on msvc80.
-//
-//inline char *safeStringDup( const char *czstring )
-//{
-//   if ( czstring )
-//   {
-//      const size_t length = (unsigned int)( strlen(czstring) + 1 );
-//      char *newString = static_cast<char *>( malloc( length ) );
-//      memcpy( newString, czstring, length );
-//      return newString;
-//   }
-//   return 0;
-//}
-//
-//inline char *safeStringDup( const std::string &str )
-//{
-//   if ( !str.empty() )
-//   {
-//      const size_t length = str.length();
-//      char *newString = static_cast<char *>( malloc( length + 1 ) );
-//      memcpy( newString, str.c_str(), length );
-//      newString[length] = 0;
-//      return newString;
-//   }
-//   return 0;
-//}
-
-ValueAllocator::~ValueAllocator()
-{
-}
-
-class DefaultValueAllocator : public ValueAllocator
-{
-public:
-   virtual ~DefaultValueAllocator()
-   {
-   }
-
-   virtual char *makeMemberName( const char *memberName )
-   {
-      return duplicateStringValue( memberName );
-   }
-
-   virtual void releaseMemberName( char *memberName )
-   {
-      releaseStringValue( memberName );
-   }
-
-   virtual char *duplicateStringValue( const char *value, 
-                                       unsigned int length = unknown )
-   {
-      //@todo invesgate this old optimization
-      //if ( !value  ||  value[0] == 0 )
-      //   return 0;
-
-      if ( length == unknown )
-         length = (unsigned int)strlen(value);
-      char *newString = static_cast<char *>( malloc( length + 1 ) );
-      memcpy( newString, value, length );
-      newString[length] = 0;
-      return newString;
-   }
-
-   virtual void releaseStringValue( char *value )
-   {
-      if ( value )
-         free( value );
-   }
-};
-
-static ValueAllocator *&valueAllocator()
-{
-   static DefaultValueAllocator defaultAllocator;
-   static ValueAllocator *valueAllocator = &defaultAllocator;
-   return valueAllocator;
-}
-
-static struct DummyValueAllocatorInitializer {
-   DummyValueAllocatorInitializer() 
-   {
-      valueAllocator();      // ensure valueAllocator() statics are initialized before main().
-   }
-} dummyValueAllocatorInitializer;
-
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// ValueInternals...
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-# include "json_internalarray.inl"
-# include "json_internalmap.inl"
-#endif // JSON_VALUE_USE_INTERNAL_MAP
-
-# include "json_valueiterator.inl"
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class Value::CommentInfo
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-
-Value::CommentInfo::CommentInfo()
-   : comment_( 0 )
-{
-}
-
-Value::CommentInfo::~CommentInfo()
-{
-   if ( comment_ )
-      valueAllocator()->releaseStringValue( comment_ );
-}
-
-
-void 
-Value::CommentInfo::setComment( const char *text )
-{
-   if ( comment_ )
-      valueAllocator()->releaseStringValue( comment_ );
-   JSON_ASSERT( text );
-   JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /");
-   // It seems that /**/ style comments are acceptable as well.
-   comment_ = valueAllocator()->duplicateStringValue( text );
-}
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class Value::CZString
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-# ifndef JSON_VALUE_USE_INTERNAL_MAP
-
-// Notes: index_ indicates if the string was allocated when
-// a string is stored.
-
-Value::CZString::CZString( int index )
-   : cstr_( 0 )
-   , index_( index )
-{
-}
-
-Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate )
-   : cstr_( allocate == duplicate ? valueAllocator()->makeMemberName(cstr) 
-                                  : cstr )
-   , index_( allocate )
-{
-}
-
-Value::CZString::CZString( const CZString &other )
-: cstr_( other.index_ != noDuplication &&  other.cstr_ != 0
-                ?  valueAllocator()->makeMemberName( other.cstr_ )
-                : other.cstr_ )
-   , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate)
-                         : other.index_ )
-{
-}
-
-Value::CZString::~CZString()
-{
-   if ( cstr_  &&  index_ == duplicate )
-      valueAllocator()->releaseMemberName( const_cast<char *>( cstr_ ) );
-}
-
-void 
-Value::CZString::swap( CZString &other )
-{
-   std::swap( cstr_, other.cstr_ );
-   std::swap( index_, other.index_ );
-}
-
-Value::CZString &
-Value::CZString::operator =( const CZString &other )
-{
-   CZString temp( other );
-   swap( temp );
-   return *this;
-}
-
-bool 
-Value::CZString::operator<( const CZString &other ) const 
-{
-   if ( cstr_ )
-      return strcmp( cstr_, other.cstr_ ) < 0;
-   return index_ < other.index_;
-}
-
-bool 
-Value::CZString::operator==( const CZString &other ) const 
-{
-   if ( cstr_ )
-      return strcmp( cstr_, other.cstr_ ) == 0;
-   return index_ == other.index_;
-}
-
-
-int 
-Value::CZString::index() const
-{
-   return index_;
-}
-
-
-const char *
-Value::CZString::c_str() const
-{
-   return cstr_;
-}
-
-bool 
-Value::CZString::isStaticString() const
-{
-   return index_ == noDuplication;
-}
-
-#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class Value::Value
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-/*! \internal Default constructor initialization must be equivalent to:
- * memset( this, 0, sizeof(Value) )
- * This optimization is used in ValueInternalMap fast allocator.
- */
-Value::Value( ValueType type )
-   : type_( type )
-   , allocated_( 0 )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   switch ( type )
-   {
-   case nullValue:
-      break;
-   case intValue:
-   case uintValue:
-      value_.int_ = 0;
-      break;
-   case realValue:
-      value_.real_ = 0.0;
-      break;
-   case stringValue:
-      value_.string_ = 0;
-      break;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-   case objectValue:
-      value_.map_ = new ObjectValues();
-      break;
-#else
-   case arrayValue:
-      value_.array_ = arrayAllocator()->newArray();
-      break;
-   case objectValue:
-      value_.map_ = mapAllocator()->newMap();
-      break;
-#endif
-   case booleanValue:
-      value_.bool_ = false;
-      break;
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-}
-
-
-Value::Value( Int value )
-   : type_( intValue )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.int_ = value;
-}
-
-
-Value::Value( UInt value )
-   : type_( uintValue )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.uint_ = value;
-}
-
-Value::Value( double value )
-   : type_( realValue )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.real_ = value;
-}
-
-Value::Value( const char *value )
-   : type_( stringValue )
-   , allocated_( true )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.string_ = valueAllocator()->duplicateStringValue( value );
-}
-
-
-Value::Value( const char *beginValue, 
-              const char *endValue )
-   : type_( stringValue )
-   , allocated_( true )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.string_ = valueAllocator()->duplicateStringValue( beginValue, 
-                                                            UInt(endValue - beginValue) );
-}
-
-
-Value::Value( const std::string &value )
-   : type_( stringValue )
-   , allocated_( true )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.string_ = valueAllocator()->duplicateStringValue( value.c_str(), 
-                                                            (unsigned int)value.length() );
-
-}
-
-Value::Value( const StaticString &value )
-   : type_( stringValue )
-   , allocated_( false )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.string_ = const_cast<char *>( value.c_str() );
-}
-
-
-# ifdef JSON_USE_CPPTL
-Value::Value( const CppTL::ConstString &value )
-   : type_( stringValue )
-   , allocated_( true )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.string_ = valueAllocator()->duplicateStringValue( value, value.length() );
-}
-# endif
-
-Value::Value( bool value )
-   : type_( booleanValue )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   value_.bool_ = value;
-}
-
-
-Value::Value( const Value &other )
-   : type_( other.type_ )
-   , comments_( 0 )
-# ifdef JSON_VALUE_USE_INTERNAL_MAP
-   , itemIsUsed_( 0 )
-#endif
-{
-   switch ( type_ )
-   {
-   case nullValue:
-   case intValue:
-   case uintValue:
-   case realValue:
-   case booleanValue:
-      value_ = other.value_;
-      break;
-   case stringValue:
-      if ( other.value_.string_ )
-      {
-         value_.string_ = valueAllocator()->duplicateStringValue( other.value_.string_ );
-         allocated_ = true;
-      }
-      else
-         value_.string_ = 0;
-      break;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-   case objectValue:
-      value_.map_ = new ObjectValues( *other.value_.map_ );
-      break;
-#else
-   case arrayValue:
-      value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ );
-      break;
-   case objectValue:
-      value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ );
-      break;
-#endif
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   if ( other.comments_ )
-   {
-      comments_ = new CommentInfo[numberOfCommentPlacement];
-      for ( int comment =0; comment < numberOfCommentPlacement; ++comment )
-      {
-         const CommentInfo &otherComment = other.comments_[comment];
-         if ( otherComment.comment_ )
-            comments_[comment].setComment( otherComment.comment_ );
-      }
-   }
-}
-
-
-Value::~Value()
-{
-   switch ( type_ )
-   {
-   case nullValue:
-   case intValue:
-   case uintValue:
-   case realValue:
-   case booleanValue:
-      break;
-   case stringValue:
-      if ( allocated_ )
-         valueAllocator()->releaseStringValue( value_.string_ );
-      break;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-   case objectValue:
-      delete value_.map_;
-      break;
-#else
-   case arrayValue:
-      arrayAllocator()->destructArray( value_.array_ );
-      break;
-   case objectValue:
-      mapAllocator()->destructMap( value_.map_ );
-      break;
-#endif
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-
-   if ( comments_ )
-      delete[] comments_;
-}
-
-Value &
-Value::operator=( const Value &other )
-{
-   Value temp( other );
-   swap( temp );
-   return *this;
-}
-
-void 
-Value::swap( Value &other )
-{
-   ValueType temp = type_;
-   type_ = other.type_;
-   other.type_ = temp;
-   std::swap( value_, other.value_ );
-   int temp2 = allocated_;
-   allocated_ = other.allocated_;
-   other.allocated_ = temp2;
-}
-
-ValueType 
-Value::type() const
-{
-   return type_;
-}
-
-
-int 
-Value::compare( const Value &other )
-{
-   /*
-   int typeDelta = other.type_ - type_;
-   switch ( type_ )
-   {
-   case nullValue:
-
-      return other.type_ == type_;
-   case intValue:
-      if ( other.type_.isNumeric()
-   case uintValue:
-   case realValue:
-   case booleanValue:
-      break;
-   case stringValue,
-      break;
-   case arrayValue:
-      delete value_.array_;
-      break;
-   case objectValue:
-      delete value_.map_;
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   */
-   return 0;  // unreachable
-}
-
-bool 
-Value::operator <( const Value &other ) const
-{
-   int typeDelta = type_ - other.type_;
-   if ( typeDelta )
-      return typeDelta < 0 ? true : false;
-   switch ( type_ )
-   {
-   case nullValue:
-      return false;
-   case intValue:
-      return value_.int_ < other.value_.int_;
-   case uintValue:
-      return value_.uint_ < other.value_.uint_;
-   case realValue:
-      return value_.real_ < other.value_.real_;
-   case booleanValue:
-      return value_.bool_ < other.value_.bool_;
-   case stringValue:
-      return ( value_.string_ == 0  &&  other.value_.string_ )
-             || ( other.value_.string_  
-                  &&  value_.string_  
-                  && strcmp( value_.string_, other.value_.string_ ) < 0 );
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-   case objectValue:
-      {
-         int delta = int( value_.map_->size() - other.value_.map_->size() );
-         if ( delta )
-            return delta < 0;
-         return (*value_.map_) < (*other.value_.map_);
-      }
-#else
-   case arrayValue:
-      return value_.array_->compare( *(other.value_.array_) ) < 0;
-   case objectValue:
-      return value_.map_->compare( *(other.value_.map_) ) < 0;
-#endif
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return 0;  // unreachable
-}
-
-bool 
-Value::operator <=( const Value &other ) const
-{
-   return !(other > *this);
-}
-
-bool 
-Value::operator >=( const Value &other ) const
-{
-   return !(*this < other);
-}
-
-bool 
-Value::operator >( const Value &other ) const
-{
-   return other < *this;
-}
-
-bool 
-Value::operator ==( const Value &other ) const
-{
-   //if ( type_ != other.type_ )
-   // GCC 2.95.3 says:
-   // attempt to take address of bit-field structure member `Json::Value::type_'
-   // Beats me, but a temp solves the problem.
-   int temp = other.type_;
-   if ( type_ != temp )
-      return false;
-   switch ( type_ )
-   {
-   case nullValue:
-      return true;
-   case intValue:
-      return value_.int_ == other.value_.int_;
-   case uintValue:
-      return value_.uint_ == other.value_.uint_;
-   case realValue:
-      return value_.real_ == other.value_.real_;
-   case booleanValue:
-      return value_.bool_ == other.value_.bool_;
-   case stringValue:
-      return ( value_.string_ == other.value_.string_ )
-             || ( other.value_.string_  
-                  &&  value_.string_  
-                  && strcmp( value_.string_, other.value_.string_ ) == 0 );
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-   case objectValue:
-      return value_.map_->size() == other.value_.map_->size()
-             && (*value_.map_) == (*other.value_.map_);
-#else
-   case arrayValue:
-      return value_.array_->compare( *(other.value_.array_) ) == 0;
-   case objectValue:
-      return value_.map_->compare( *(other.value_.map_) ) == 0;
-#endif
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return 0;  // unreachable
-}
-
-bool 
-Value::operator !=( const Value &other ) const
-{
-   return !( *this == other );
-}
-
-const char *
-Value::asCString() const
-{
-   JSON_ASSERT( type_ == stringValue );
-   return value_.string_;
-}
-
-
-std::string 
-Value::asString() const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-      return "";
-   case stringValue:
-      return value_.string_ ? value_.string_ : "";
-   case booleanValue:
-      return value_.bool_ ? "true" : "false";
-   case intValue:
-   case uintValue:
-   case realValue:
-   case arrayValue:
-   case objectValue:
-      JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" );
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return ""; // unreachable
-}
-
-# ifdef JSON_USE_CPPTL
-CppTL::ConstString 
-Value::asConstString() const
-{
-   return CppTL::ConstString( asString().c_str() );
-}
-# endif
-
-Value::Int 
-Value::asInt() const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-      return 0;
-   case intValue:
-      return value_.int_;
-   case uintValue:
-      JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" );
-      return value_.uint_;
-   case realValue:
-      JSON_ASSERT_MESSAGE( value_.real_ >= minInt  &&  value_.real_ <= maxInt, "Real out of signed integer range" );
-      return Int( value_.real_ );
-   case booleanValue:
-      return value_.bool_ ? 1 : 0;
-   case stringValue:
-   case arrayValue:
-   case objectValue:
-      JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" );
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return 0; // unreachable;
-}
-
-Value::UInt 
-Value::asUInt() const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-      return 0;
-   case intValue:
-      JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" );
-      return value_.int_;
-   case uintValue:
-      return value_.uint_;
-   case realValue:
-      JSON_ASSERT_MESSAGE( value_.real_ >= 0  &&  value_.real_ <= maxUInt,  "Real out of unsigned integer range" );
-      return UInt( value_.real_ );
-   case booleanValue:
-      return value_.bool_ ? 1 : 0;
-   case stringValue:
-   case arrayValue:
-   case objectValue:
-      JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" );
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return 0; // unreachable;
-}
-
-double 
-Value::asDouble() const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-      return 0.0;
-   case intValue:
-      return value_.int_;
-   case uintValue:
-      return value_.uint_;
-   case realValue:
-      return value_.real_;
-   case booleanValue:
-      return value_.bool_ ? 1.0 : 0.0;
-   case stringValue:
-   case arrayValue:
-   case objectValue:
-      JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" );
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return 0; // unreachable;
-}
-
-bool 
-Value::asBool() const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-      return false;
-   case intValue:
-   case uintValue:
-      return value_.int_ != 0;
-   case realValue:
-      return value_.real_ != 0.0;
-   case booleanValue:
-      return value_.bool_;
-   case stringValue:
-      return value_.string_  &&  value_.string_[0] != 0;
-   case arrayValue:
-   case objectValue:
-      return value_.map_->size() != 0;
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return false; // unreachable;
-}
-
-
-bool 
-Value::isConvertibleTo( ValueType other ) const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-      return true;
-   case intValue:
-      return ( other == nullValue  &&  value_.int_ == 0 )
-             || other == intValue
-             || ( other == uintValue  && value_.int_ >= 0 )
-             || other == realValue
-             || other == stringValue
-             || other == booleanValue;
-   case uintValue:
-      return ( other == nullValue  &&  value_.uint_ == 0 )
-             || ( other == intValue  && value_.uint_ <= (unsigned)maxInt )
-             || other == uintValue
-             || other == realValue
-             || other == stringValue
-             || other == booleanValue;
-   case realValue:
-      return ( other == nullValue  &&  value_.real_ == 0.0 )
-             || ( other == intValue  &&  value_.real_ >= minInt  &&  value_.real_ <= maxInt )
-             || ( other == uintValue  &&  value_.real_ >= 0  &&  value_.real_ <= maxUInt )
-             || other == realValue
-             || other == stringValue
-             || other == booleanValue;
-   case booleanValue:
-      return ( other == nullValue  &&  value_.bool_ == false )
-             || other == intValue
-             || other == uintValue
-             || other == realValue
-             || other == stringValue
-             || other == booleanValue;
-   case stringValue:
-      return other == stringValue
-             || ( other == nullValue  &&  (!value_.string_  ||  value_.string_[0] == 0) );
-   case arrayValue:
-      return other == arrayValue
-             ||  ( other == nullValue  &&  value_.map_->size() == 0 );
-   case objectValue:
-      return other == objectValue
-             ||  ( other == nullValue  &&  value_.map_->size() == 0 );
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return false; // unreachable;
-}
-
-
-/// Number of values in array or object
-Value::UInt 
-Value::size() const
-{
-   switch ( type_ )
-   {
-   case nullValue:
-   case intValue:
-   case uintValue:
-   case realValue:
-   case booleanValue:
-   case stringValue:
-      return 0;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:  // size of the array is highest index + 1
-      if ( !value_.map_->empty() )
-      {
-         ObjectValues::const_iterator itLast = value_.map_->end();
-         --itLast;
-         return (*itLast).first.index()+1;
-      }
-      return 0;
-   case objectValue:
-      return Int( value_.map_->size() );
-#else
-   case arrayValue:
-      return Int( value_.array_->size() );
-   case objectValue:
-      return Int( value_.map_->size() );
-#endif
-   default:
-      JSON_ASSERT_UNREACHABLE;
-   }
-   return 0; // unreachable;
-}
-
-
-bool 
-Value::empty() const
-{
-   if ( isNull() || isArray() || isObject() )
-      return size() == 0u;
-   else
-      return false;
-}
-
-
-bool
-Value::operator!() const
-{
-   return isNull();
-}
-
-
-void 
-Value::clear()
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue  || type_ == objectValue );
-
-   switch ( type_ )
-   {
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-   case objectValue:
-      value_.map_->clear();
-      break;
-#else
-   case arrayValue:
-      value_.array_->clear();
-      break;
-   case objectValue:
-      value_.map_->clear();
-      break;
-#endif
-   default:
-      break;
-   }
-}
-
-void 
-Value::resize( UInt newSize )
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
-   if ( type_ == nullValue )
-      *this = Value( arrayValue );
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   UInt oldSize = size();
-   if ( newSize == 0 )
-      clear();
-   else if ( newSize > oldSize )
-      (*this)[ newSize - 1 ];
-   else
-   {
-      for ( UInt index = newSize; index < oldSize; ++index )
-         value_.map_->erase( index );
-      assert( size() == newSize );
-   }
-#else
-   value_.array_->resize( newSize );
-#endif
-}
-
-
-Value &
-Value::operator[]( UInt index )
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
-   if ( type_ == nullValue )
-      *this = Value( arrayValue );
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   CZString key( index );
-   ObjectValues::iterator it = value_.map_->lower_bound( key );
-   if ( it != value_.map_->end()  &&  (*it).first == key )
-      return (*it).second;
-
-   ObjectValues::value_type defaultValue( key, null );
-   it = value_.map_->insert( it, defaultValue );
-   return (*it).second;
-#else
-   return value_.array_->resolveReference( index );
-#endif
-}
-
-
-const Value &
-Value::operator[]( UInt index ) const
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
-   if ( type_ == nullValue )
-      return null;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   CZString key( index );
-   ObjectValues::const_iterator it = value_.map_->find( key );
-   if ( it == value_.map_->end() )
-      return null;
-   return (*it).second;
-#else
-   Value *value = value_.array_->find( index );
-   return value ? *value : null;
-#endif
-}
-
-
-Value &
-Value::operator[]( const char *key )
-{
-   return resolveReference( key, false );
-}
-
-
-Value &
-Value::resolveReference( const char *key, 
-                         bool isStatic )
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
-   if ( type_ == nullValue )
-      *this = Value( objectValue );
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   CZString actualKey( key, isStatic ? CZString::noDuplication 
-                                     : CZString::duplicateOnCopy );
-   ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
-   if ( it != value_.map_->end()  &&  (*it).first == actualKey )
-      return (*it).second;
-
-   ObjectValues::value_type defaultValue( actualKey, null );
-   it = value_.map_->insert( it, defaultValue );
-   Value &value = (*it).second;
-   return value;
-#else
-   return value_.map_->resolveReference( key, isStatic );
-#endif
-}
-
-
-Value 
-Value::get( UInt index, 
-            const Value &defaultValue ) const
-{
-   const Value *value = &((*this)[index]);
-   return value == &null ? defaultValue : *value;
-}
-
-
-bool 
-Value::isValidIndex( UInt index ) const
-{
-   return index < size();
-}
-
-
-
-const Value &
-Value::operator[]( const char *key ) const
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
-   if ( type_ == nullValue )
-      return null;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   CZString actualKey( key, CZString::noDuplication );
-   ObjectValues::const_iterator it = value_.map_->find( actualKey );
-   if ( it == value_.map_->end() )
-      return null;
-   return (*it).second;
-#else
-   const Value *value = value_.map_->find( key );
-   return value ? *value : null;
-#endif
-}
-
-
-Value &
-Value::operator[]( const std::string &key )
-{
-   return (*this)[ key.c_str() ];
-}
-
-
-const Value &
-Value::operator[]( const std::string &key ) const
-{
-   return (*this)[ key.c_str() ];
-}
-
-Value &
-Value::operator[]( const StaticString &key )
-{
-   return resolveReference( key, true );
-}
-
-
-# ifdef JSON_USE_CPPTL
-Value &
-Value::operator[]( const CppTL::ConstString &key )
-{
-   return (*this)[ key.c_str() ];
-}
-
-
-const Value &
-Value::operator[]( const CppTL::ConstString &key ) const
-{
-   return (*this)[ key.c_str() ];
-}
-# endif
-
-
-Value &
-Value::append( const Value &value )
-{
-   return (*this)[size()] = value;
-}
-
-
-Value 
-Value::get( const char *key, 
-            const Value &defaultValue ) const
-{
-   const Value *value = &((*this)[key]);
-   return value == &null ? defaultValue : *value;
-}
-
-
-Value 
-Value::get( const std::string &key,
-            const Value &defaultValue ) const
-{
-   return get( key.c_str(), defaultValue );
-}
-
-Value
-Value::removeMember( const char* key )
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
-   if ( type_ == nullValue )
-      return null;
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   CZString actualKey( key, CZString::noDuplication );
-   ObjectValues::iterator it = value_.map_->find( actualKey );
-   if ( it == value_.map_->end() )
-      return null;
-   Value old(it->second);
-   value_.map_->erase(it);
-   return old;
-#else
-   Value *value = value_.map_->find( key );
-   if (value){
-      Value old(*value);
-      value_.map_.remove( key );
-      return old;
-   } else {
-      return null;
-   }
-#endif
-}
-
-Value
-Value::removeMember( const std::string &key )
-{
-   return removeMember( key.c_str() );
-}
-
-# ifdef JSON_USE_CPPTL
-Value 
-Value::get( const CppTL::ConstString &key,
-            const Value &defaultValue ) const
-{
-   return get( key.c_str(), defaultValue );
-}
-# endif
-
-bool 
-Value::isMember( const char *key ) const
-{
-   const Value *value = &((*this)[key]);
-   return value != &null;
-}
-
-
-bool 
-Value::isMember( const std::string &key ) const
-{
-   return isMember( key.c_str() );
-}
-
-
-# ifdef JSON_USE_CPPTL
-bool 
-Value::isMember( const CppTL::ConstString &key ) const
-{
-   return isMember( key.c_str() );
-}
-#endif
-
-Value::Members 
-Value::getMemberNames() const
-{
-   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
-   if ( type_ == nullValue )
-       return Value::Members();
-   Members members;
-   members.reserve( value_.map_->size() );
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   ObjectValues::const_iterator it = value_.map_->begin();
-   ObjectValues::const_iterator itEnd = value_.map_->end();
-   for ( ; it != itEnd; ++it )
-      members.push_back( std::string( (*it).first.c_str() ) );
-#else
-   ValueInternalMap::IteratorState it;
-   ValueInternalMap::IteratorState itEnd;
-   value_.map_->makeBeginIterator( it );
-   value_.map_->makeEndIterator( itEnd );
-   for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) )
-      members.push_back( std::string( ValueInternalMap::key( it ) ) );
-#endif
-   return members;
-}
-//
-//# ifdef JSON_USE_CPPTL
-//EnumMemberNames
-//Value::enumMemberNames() const
-//{
-//   if ( type_ == objectValue )
-//   {
-//      return CppTL::Enum::any(  CppTL::Enum::transform(
-//         CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
-//         MemberNamesTransform() ) );
-//   }
-//   return EnumMemberNames();
-//}
-//
-//
-//EnumValues 
-//Value::enumValues() const
-//{
-//   if ( type_ == objectValue  ||  type_ == arrayValue )
-//      return CppTL::Enum::anyValues( *(value_.map_), 
-//                                     CppTL::Type<const Value &>() );
-//   return EnumValues();
-//}
-//
-//# endif
-
-
-bool
-Value::isNull() const
-{
-   return type_ == nullValue;
-}
-
-
-bool 
-Value::isBool() const
-{
-   return type_ == booleanValue;
-}
-
-
-bool 
-Value::isInt() const
-{
-   return type_ == intValue;
-}
-
-
-bool 
-Value::isUInt() const
-{
-   return type_ == uintValue;
-}
-
-
-bool 
-Value::isIntegral() const
-{
-   return type_ == intValue  
-          ||  type_ == uintValue  
-          ||  type_ == booleanValue;
-}
-
-
-bool 
-Value::isDouble() const
-{
-   return type_ == realValue;
-}
-
-
-bool 
-Value::isNumeric() const
-{
-   return isIntegral() || isDouble();
-}
-
-
-bool 
-Value::isString() const
-{
-   return type_ == stringValue;
-}
-
-
-bool 
-Value::isArray() const
-{
-   return type_ == nullValue  ||  type_ == arrayValue;
-}
-
-
-bool 
-Value::isObject() const
-{
-   return type_ == nullValue  ||  type_ == objectValue;
-}
-
-
-void 
-Value::setComment( const char *comment,
-                   CommentPlacement placement )
-{
-   if ( !comments_ )
-      comments_ = new CommentInfo[numberOfCommentPlacement];
-   comments_[placement].setComment( comment );
-}
-
-
-void 
-Value::setComment( const std::string &comment,
-                   CommentPlacement placement )
-{
-   setComment( comment.c_str(), placement );
-}
-
-
-bool 
-Value::hasComment( CommentPlacement placement ) const
-{
-   return comments_ != 0  &&  comments_[placement].comment_ != 0;
-}
-
-std::string 
-Value::getComment( CommentPlacement placement ) const
-{
-   if ( hasComment(placement) )
-      return comments_[placement].comment_;
-   return "";
-}
-
-
-std::string 
-Value::toStyledString() const
-{
-   StyledWriter writer;
-   return writer.write( *this );
-}
-
-
-Value::const_iterator 
-Value::begin() const
-{
-   switch ( type_ )
-   {
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-      if ( value_.array_ )
-      {
-         ValueInternalArray::IteratorState it;
-         value_.array_->makeBeginIterator( it );
-         return const_iterator( it );
-      }
-      break;
-   case objectValue:
-      if ( value_.map_ )
-      {
-         ValueInternalMap::IteratorState it;
-         value_.map_->makeBeginIterator( it );
-         return const_iterator( it );
-      }
-      break;
-#else
-   case arrayValue:
-   case objectValue:
-      if ( value_.map_ )
-         return const_iterator( value_.map_->begin() );
-      break;
-#endif
-   default:
-      break;
-   }
-   return const_iterator();
-}
-
-Value::const_iterator 
-Value::end() const
-{
-   switch ( type_ )
-   {
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-      if ( value_.array_ )
-      {
-         ValueInternalArray::IteratorState it;
-         value_.array_->makeEndIterator( it );
-         return const_iterator( it );
-      }
-      break;
-   case objectValue:
-      if ( value_.map_ )
-      {
-         ValueInternalMap::IteratorState it;
-         value_.map_->makeEndIterator( it );
-         return const_iterator( it );
-      }
-      break;
-#else
-   case arrayValue:
-   case objectValue:
-      if ( value_.map_ )
-         return const_iterator( value_.map_->end() );
-      break;
-#endif
-   default:
-      break;
-   }
-   return const_iterator();
-}
-
-
-Value::iterator 
-Value::begin()
-{
-   switch ( type_ )
-   {
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-      if ( value_.array_ )
-      {
-         ValueInternalArray::IteratorState it;
-         value_.array_->makeBeginIterator( it );
-         return iterator( it );
-      }
-      break;
-   case objectValue:
-      if ( value_.map_ )
-      {
-         ValueInternalMap::IteratorState it;
-         value_.map_->makeBeginIterator( it );
-         return iterator( it );
-      }
-      break;
-#else
-   case arrayValue:
-   case objectValue:
-      if ( value_.map_ )
-         return iterator( value_.map_->begin() );
-      break;
-#endif
-   default:
-      break;
-   }
-   return iterator();
-}
-
-Value::iterator 
-Value::end()
-{
-   switch ( type_ )
-   {
-#ifdef JSON_VALUE_USE_INTERNAL_MAP
-   case arrayValue:
-      if ( value_.array_ )
-      {
-         ValueInternalArray::IteratorState it;
-         value_.array_->makeEndIterator( it );
-         return iterator( it );
-      }
-      break;
-   case objectValue:
-      if ( value_.map_ )
-      {
-         ValueInternalMap::IteratorState it;
-         value_.map_->makeEndIterator( it );
-         return iterator( it );
-      }
-      break;
-#else
-   case arrayValue:
-   case objectValue:
-      if ( value_.map_ )
-         return iterator( value_.map_->end() );
-      break;
-#endif
-   default:
-      break;
-   }
-   return iterator();
-}
-
-
-// class PathArgument
-// //////////////////////////////////////////////////////////////////
-
-PathArgument::PathArgument()
-   : kind_( kindNone )
-{
-}
-
-
-PathArgument::PathArgument( Value::UInt index )
-   : index_( index )
-   , kind_( kindIndex )
-{
-}
-
-
-PathArgument::PathArgument( const char *key )
-   : key_( key )
-   , kind_( kindKey )
-{
-}
-
-
-PathArgument::PathArgument( const std::string &key )
-   : key_( key.c_str() )
-   , kind_( kindKey )
-{
-}
-
-// class Path
-// //////////////////////////////////////////////////////////////////
-
-Path::Path( const std::string &path,
-            const PathArgument &a1,
-            const PathArgument &a2,
-            const PathArgument &a3,
-            const PathArgument &a4,
-            const PathArgument &a5 )
-{
-   InArgs in;
-   in.push_back( &a1 );
-   in.push_back( &a2 );
-   in.push_back( &a3 );
-   in.push_back( &a4 );
-   in.push_back( &a5 );
-   makePath( path, in );
-}
-
-
-void 
-Path::makePath( const std::string &path,
-                const InArgs &in )
-{
-   const char *current = path.c_str();
-   const char *end = current + path.length();
-   InArgs::const_iterator itInArg = in.begin();
-   while ( current != end )
-   {
-      if ( *current == '[' )
-      {
-         ++current;
-         if ( *current == '%' )
-            addPathInArg( path, in, itInArg, PathArgument::kindIndex );
-         else
-         {
-            Value::UInt index = 0;
-            for ( ; current != end && *current >= '0'  &&  *current <= '9'; ++current )
-               index = index * 10 + Value::UInt(*current - '0');
-            args_.push_back( index );
-         }
-         if ( current == end  ||  *current++ != ']' )
-            invalidPath( path, int(current - path.c_str()) );
-      }
-      else if ( *current == '%' )
-      {
-         addPathInArg( path, in, itInArg, PathArgument::kindKey );
-         ++current;
-      }
-      else if ( *current == '.' )
-      {
-         ++current;
-      }
-      else
-      {
-         const char *beginName = current;
-         while ( current != end  &&  !strchr( "[.", *current ) )
-            ++current;
-         args_.push_back( std::string( beginName, current ) );
-      }
-   }
-}
-
-
-void 
-Path::addPathInArg( const std::string &path, 
-                    const InArgs &in, 
-                    InArgs::const_iterator &itInArg, 
-                    PathArgument::Kind kind )
-{
-   if ( itInArg == in.end() )
-   {
-      // Error: missing argument %d
-   }
-   else if ( (*itInArg)->kind_ != kind )
-   {
-      // Error: bad argument type
-   }
-   else
-   {
-      args_.push_back( **itInArg );
-   }
-}
-
-
-void 
-Path::invalidPath( const std::string &path, 
-                   int location )
-{
-   // Error: invalid path.
-}
-
-
-const Value &
-Path::resolve( const Value &root ) const
-{
-   const Value *node = &root;
-   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
-   {
-      const PathArgument &arg = *it;
-      if ( arg.kind_ == PathArgument::kindIndex )
-      {
-         if ( !node->isArray()  ||  node->isValidIndex( arg.index_ ) )
-         {
-            // Error: unable to resolve path (array value expected at position...
-         }
-         node = &((*node)[arg.index_]);
-      }
-      else if ( arg.kind_ == PathArgument::kindKey )
-      {
-         if ( !node->isObject() )
-         {
-            // Error: unable to resolve path (object value expected at position...)
-         }
-         node = &((*node)[arg.key_]);
-         if ( node == &Value::null )
-         {
-            // Error: unable to resolve path (object has no member named '' at position...)
-         }
-      }
-   }
-   return *node;
-}
-
-
-Value 
-Path::resolve( const Value &root, 
-               const Value &defaultValue ) const
-{
-   const Value *node = &root;
-   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
-   {
-      const PathArgument &arg = *it;
-      if ( arg.kind_ == PathArgument::kindIndex )
-      {
-         if ( !node->isArray()  ||  node->isValidIndex( arg.index_ ) )
-            return defaultValue;
-         node = &((*node)[arg.index_]);
-      }
-      else if ( arg.kind_ == PathArgument::kindKey )
-      {
-         if ( !node->isObject() )
-            return defaultValue;
-         node = &((*node)[arg.key_]);
-         if ( node == &Value::null )
-            return defaultValue;
-      }
-   }
-   return *node;
-}
-
-
-Value &
-Path::make( Value &root ) const
-{
-   Value *node = &root;
-   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
-   {
-      const PathArgument &arg = *it;
-      if ( arg.kind_ == PathArgument::kindIndex )
-      {
-         if ( !node->isArray() )
-         {
-            // Error: node is not an array at position ...
-         }
-         node = &((*node)[arg.index_]);
-      }
-      else if ( arg.kind_ == PathArgument::kindKey )
-      {
-         if ( !node->isObject() )
-         {
-            // Error: node is not an object at position...
-         }
-         node = &((*node)[arg.key_]);
-      }
-   }
-   return *node;
-}
-
-
-} // namespace Json

=== removed file 'thirdparty/jsoncpp/src/lib_json/json_valueiterator.inl'
--- thirdparty/jsoncpp/src/lib_json/json_valueiterator.inl	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_valueiterator.inl	1970-01-01 00:00:00 +0000
@@ -1,292 +0,0 @@
-// included by json_value.cpp
-// everything is within Json namespace
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueIteratorBase
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueIteratorBase::ValueIteratorBase()
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   : current_()
-   , isNull_( true )
-{
-}
-#else
-   : isArray_( true )
-   , isNull_( true )
-{
-   iterator_.array_ = ValueInternalArray::IteratorState();
-}
-#endif
-
-
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator &current )
-   : current_( current )
-   , isNull_( false )
-{
-}
-#else
-ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state )
-   : isArray_( true )
-{
-   iterator_.array_ = state;
-}
-
-
-ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state )
-   : isArray_( false )
-{
-   iterator_.map_ = state;
-}
-#endif
-
-Value &
-ValueIteratorBase::deref() const
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   return current_->second;
-#else
-   if ( isArray_ )
-      return ValueInternalArray::dereference( iterator_.array_ );
-   return ValueInternalMap::value( iterator_.map_ );
-#endif
-}
-
-
-void 
-ValueIteratorBase::increment()
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   ++current_;
-#else
-   if ( isArray_ )
-      ValueInternalArray::increment( iterator_.array_ );
-   ValueInternalMap::increment( iterator_.map_ );
-#endif
-}
-
-
-void 
-ValueIteratorBase::decrement()
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   --current_;
-#else
-   if ( isArray_ )
-      ValueInternalArray::decrement( iterator_.array_ );
-   ValueInternalMap::decrement( iterator_.map_ );
-#endif
-}
-
-
-ValueIteratorBase::difference_type 
-ValueIteratorBase::computeDistance( const SelfType &other ) const
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-# ifdef JSON_USE_CPPTL_SMALLMAP
-   return current_ - other.current_;
-# else
-   // Iterator for null value are initialized using the default
-   // constructor, which initialize current_ to the default
-   // std::map::iterator. As begin() and end() are two instance 
-   // of the default std::map::iterator, they can not be compared.
-   // To allow this, we handle this comparison specifically.
-   if ( isNull_  &&  other.isNull_ )
-   {
-      return 0;
-   }
-
-
-   // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL,
-   // which is the one used by default).
-   // Using a portable hand-made version for non random iterator instead:
-   //   return difference_type( std::distance( current_, other.current_ ) );
-   difference_type myDistance = 0;
-   for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it )
-   {
-      ++myDistance;
-   }
-   return myDistance;
-# endif
-#else
-   if ( isArray_ )
-      return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ );
-   return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ );
-#endif
-}
-
-
-bool 
-ValueIteratorBase::isEqual( const SelfType &other ) const
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   if ( isNull_ )
-   {
-      return other.isNull_;
-   }
-   return current_ == other.current_;
-#else
-   if ( isArray_ )
-      return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ );
-   return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ );
-#endif
-}
-
-
-void 
-ValueIteratorBase::copy( const SelfType &other )
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   current_ = other.current_;
-#else
-   if ( isArray_ )
-      iterator_.array_ = other.iterator_.array_;
-   iterator_.map_ = other.iterator_.map_;
-#endif
-}
-
-
-Value 
-ValueIteratorBase::key() const
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   const Value::CZString czstring = (*current_).first;
-   if ( czstring.c_str() )
-   {
-      if ( czstring.isStaticString() )
-         return Value( StaticString( czstring.c_str() ) );
-      return Value( czstring.c_str() );
-   }
-   return Value( czstring.index() );
-#else
-   if ( isArray_ )
-      return Value( ValueInternalArray::indexOf( iterator_.array_ ) );
-   bool isStatic;
-   const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic );
-   if ( isStatic )
-      return Value( StaticString( memberName ) );
-   return Value( memberName );
-#endif
-}
-
-
-UInt 
-ValueIteratorBase::index() const
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   const Value::CZString czstring = (*current_).first;
-   if ( !czstring.c_str() )
-      return czstring.index();
-   return Value::UInt( -1 );
-#else
-   if ( isArray_ )
-      return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) );
-   return Value::UInt( -1 );
-#endif
-}
-
-
-const char *
-ValueIteratorBase::memberName() const
-{
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-   const char *name = (*current_).first.c_str();
-   return name ? name : "";
-#else
-   if ( !isArray_ )
-      return ValueInternalMap::key( iterator_.map_ );
-   return "";
-#endif
-}
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueConstIterator
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueConstIterator::ValueConstIterator()
-{
-}
-
-
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator &current )
-   : ValueIteratorBase( current )
-{
-}
-#else
-ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state )
-   : ValueIteratorBase( state )
-{
-}
-
-ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state )
-   : ValueIteratorBase( state )
-{
-}
-#endif
-
-ValueConstIterator &
-ValueConstIterator::operator =( const ValueIteratorBase &other )
-{
-   copy( other );
-   return *this;
-}
-
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueIterator
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueIterator::ValueIterator()
-{
-}
-
-
-#ifndef JSON_VALUE_USE_INTERNAL_MAP
-ValueIterator::ValueIterator( const Value::ObjectValues::iterator &current )
-   : ValueIteratorBase( current )
-{
-}
-#else
-ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state )
-   : ValueIteratorBase( state )
-{
-}
-
-ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state )
-   : ValueIteratorBase( state )
-{
-}
-#endif
-
-ValueIterator::ValueIterator( const ValueConstIterator &other )
-   : ValueIteratorBase( other )
-{
-}
-
-ValueIterator::ValueIterator( const ValueIterator &other )
-   : ValueIteratorBase( other )
-{
-}
-
-ValueIterator &
-ValueIterator::operator =( const SelfType &other )
-{
-   copy( other );
-   return *this;
-}

=== removed file 'thirdparty/jsoncpp/src/lib_json/json_writer.cpp'
--- thirdparty/jsoncpp/src/lib_json/json_writer.cpp	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/json_writer.cpp	1970-01-01 00:00:00 +0000
@@ -1,829 +0,0 @@
-#include <json/writer.h>
-#include <utility>
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-#include <iostream>
-#include <sstream>
-#include <iomanip>
-
-#if _MSC_VER >= 1400 // VC++ 8.0
-#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.
-#endif
-
-namespace Json {
-
-static bool isControlCharacter(char ch)
-{
-   return ch > 0 && ch <= 0x1F;
-}
-
-static bool containsControlCharacter( const char* str )
-{
-   while ( *str ) 
-   {
-      if ( isControlCharacter( *(str++) ) )
-         return true;
-   }
-   return false;
-}
-static void uintToString( unsigned int value, 
-                          char *&current )
-{
-   *--current = 0;
-   do
-   {
-      *--current = (value % 10) + '0';
-      value /= 10;
-   }
-   while ( value != 0 );
-}
-
-std::string valueToString( Int value )
-{
-   char buffer[32];
-   char *current = buffer + sizeof(buffer);
-   bool isNegative = value < 0;
-   if ( isNegative )
-      value = -value;
-   uintToString( UInt(value), current );
-   if ( isNegative )
-      *--current = '-';
-   assert( current >= buffer );
-   return current;
-}
-
-
-std::string valueToString( UInt value )
-{
-   char buffer[32];
-   char *current = buffer + sizeof(buffer);
-   uintToString( value, current );
-   assert( current >= buffer );
-   return current;
-}
-
-std::string valueToString( double value )
-{
-   char buffer[32];
-#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. 
-   sprintf_s(buffer, sizeof(buffer), "%#.16g", value); 
-#else	
-   sprintf(buffer, "%#.16g", value); 
-#endif
-   char* ch = buffer + strlen(buffer) - 1;
-   if (*ch != '0') return buffer; // nothing to truncate, so save time
-   while(ch > buffer && *ch == '0'){
-     --ch;
-   }
-   char* last_nonzero = ch;
-   while(ch >= buffer){
-     switch(*ch){
-     case '0':
-     case '1':
-     case '2':
-     case '3':
-     case '4':
-     case '5':
-     case '6':
-     case '7':
-     case '8':
-     case '9':
-       --ch;
-       continue;
-     case '.':
-       // Truncate zeroes to save bytes in output, but keep one.
-       *(last_nonzero+2) = '\0';
-       return buffer;
-     default:
-       return buffer;
-     }
-   }
-   return buffer;
-}
-
-
-std::string valueToString( bool value )
-{
-   return value ? "true" : "false";
-}
-
-std::string valueToQuotedString( const char *value )
-{
-   // Not sure how to handle unicode...
-   if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value ))
-      return std::string("\"") + value + "\"";
-   // We have to walk value and escape any special characters.
-   // Appending to std::string is not efficient, but this should be rare.
-   // (Note: forward slashes are *not* rare, but I am not escaping them.)
-   unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL
-   std::string result;
-   result.reserve(maxsize); // to avoid lots of mallocs
-   result += "\"";
-   for (const char* c=value; *c != 0; ++c)
-   {
-      switch(*c)
-      {
-         case '\"':
-            result += "\\\"";
-            break;
-         case '\\':
-            result += "\\\\";
-            break;
-         case '\b':
-            result += "\\b";
-            break;
-         case '\f':
-            result += "\\f";
-            break;
-         case '\n':
-            result += "\\n";
-            break;
-         case '\r':
-            result += "\\r";
-            break;
-         case '\t':
-            result += "\\t";
-            break;
-         //case '/':
-            // Even though \/ is considered a legal escape in JSON, a bare
-            // slash is also legal, so I see no reason to escape it.
-            // (I hope I am not misunderstanding something.
-            // blep notes: actually escaping \/ may be useful in javascript to avoid </ 
-            // sequence.
-            // Should add a flag to allow this compatibility mode and prevent this 
-            // sequence from occurring.
-         default:
-            if ( isControlCharacter( *c ) )
-            {
-               std::ostringstream oss;
-               oss << "\\u" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c);
-               result += oss.str();
-            }
-            else
-            {
-               result += *c;
-            }
-            break;
-      }
-   }
-   result += "\"";
-   return result;
-}
-
-// Class Writer
-// //////////////////////////////////////////////////////////////////
-Writer::~Writer()
-{
-}
-
-
-// Class FastWriter
-// //////////////////////////////////////////////////////////////////
-
-FastWriter::FastWriter()
-   : yamlCompatiblityEnabled_( false )
-{
-}
-
-
-void 
-FastWriter::enableYAMLCompatibility()
-{
-   yamlCompatiblityEnabled_ = true;
-}
-
-
-std::string 
-FastWriter::write( const Value &root )
-{
-   document_ = "";
-   writeValue( root );
-   document_ += "\n";
-   return document_;
-}
-
-
-void 
-FastWriter::writeValue( const Value &value )
-{
-   switch ( value.type() )
-   {
-   case nullValue:
-      document_ += "null";
-      break;
-   case intValue:
-      document_ += valueToString( value.asInt() );
-      break;
-   case uintValue:
-      document_ += valueToString( value.asUInt() );
-      break;
-   case realValue:
-      document_ += valueToString( value.asDouble() );
-      break;
-   case stringValue:
-      document_ += valueToQuotedString( value.asCString() );
-      break;
-   case booleanValue:
-      document_ += valueToString( value.asBool() );
-      break;
-   case arrayValue:
-      {
-         document_ += "[";
-         int size = value.size();
-         for ( int index =0; index < size; ++index )
-         {
-            if ( index > 0 )
-               document_ += ",";
-            writeValue( value[index] );
-         }
-         document_ += "]";
-      }
-      break;
-   case objectValue:
-      {
-         Value::Members members( value.getMemberNames() );
-         document_ += "{";
-         for ( Value::Members::iterator it = members.begin(); 
-               it != members.end(); 
-               ++it )
-         {
-            const std::string &name = *it;
-            if ( it != members.begin() )
-               document_ += ",";
-            document_ += valueToQuotedString( name.c_str() );
-            document_ += yamlCompatiblityEnabled_ ? ": " 
-                                                  : ":";
-            writeValue( value[name] );
-         }
-         document_ += "}";
-      }
-      break;
-   }
-}
-
-
-// Class StyledWriter
-// //////////////////////////////////////////////////////////////////
-
-StyledWriter::StyledWriter()
-   : rightMargin_( 74 )
-   , indentSize_( 3 )
-{
-}
-
-
-std::string 
-StyledWriter::write( const Value &root )
-{
-   document_ = "";
-   addChildValues_ = false;
-   indentString_ = "";
-   writeCommentBeforeValue( root );
-   writeValue( root );
-   writeCommentAfterValueOnSameLine( root );
-   document_ += "\n";
-   return document_;
-}
-
-
-void 
-StyledWriter::writeValue( const Value &value )
-{
-   switch ( value.type() )
-   {
-   case nullValue:
-      pushValue( "null" );
-      break;
-   case intValue:
-      pushValue( valueToString( value.asInt() ) );
-      break;
-   case uintValue:
-      pushValue( valueToString( value.asUInt() ) );
-      break;
-   case realValue:
-      pushValue( valueToString( value.asDouble() ) );
-      break;
-   case stringValue:
-      pushValue( valueToQuotedString( value.asCString() ) );
-      break;
-   case booleanValue:
-      pushValue( valueToString( value.asBool() ) );
-      break;
-   case arrayValue:
-      writeArrayValue( value);
-      break;
-   case objectValue:
-      {
-         Value::Members members( value.getMemberNames() );
-         if ( members.empty() )
-            pushValue( "{}" );
-         else
-         {
-            writeWithIndent( "{" );
-            indent();
-            Value::Members::iterator it = members.begin();
-            while ( true )
-            {
-               const std::string &name = *it;
-               const Value &childValue = value[name];
-               writeCommentBeforeValue( childValue );
-               writeWithIndent( valueToQuotedString( name.c_str() ) );
-               document_ += " : ";
-               writeValue( childValue );
-               if ( ++it == members.end() )
-               {
-                  writeCommentAfterValueOnSameLine( childValue );
-                  break;
-               }
-               document_ += ",";
-               writeCommentAfterValueOnSameLine( childValue );
-            }
-            unindent();
-            writeWithIndent( "}" );
-         }
-      }
-      break;
-   }
-}
-
-
-void 
-StyledWriter::writeArrayValue( const Value &value )
-{
-   unsigned size = value.size();
-   if ( size == 0 )
-      pushValue( "[]" );
-   else
-   {
-      bool isArrayMultiLine = isMultineArray( value );
-      if ( isArrayMultiLine )
-      {
-         writeWithIndent( "[" );
-         indent();
-         bool hasChildValue = !childValues_.empty();
-         unsigned index =0;
-         while ( true )
-         {
-            const Value &childValue = value[index];
-            writeCommentBeforeValue( childValue );
-            if ( hasChildValue )
-               writeWithIndent( childValues_[index] );
-            else
-            {
-               writeIndent();
-               writeValue( childValue );
-            }
-            if ( ++index == size )
-            {
-               writeCommentAfterValueOnSameLine( childValue );
-               break;
-            }
-            document_ += ",";
-            writeCommentAfterValueOnSameLine( childValue );
-         }
-         unindent();
-         writeWithIndent( "]" );
-      }
-      else // output on a single line
-      {
-         assert( childValues_.size() == size );
-         document_ += "[ ";
-         for ( unsigned index =0; index < size; ++index )
-         {
-            if ( index > 0 )
-               document_ += ", ";
-            document_ += childValues_[index];
-         }
-         document_ += " ]";
-      }
-   }
-}
-
-
-bool 
-StyledWriter::isMultineArray( const Value &value )
-{
-   int size = value.size();
-   bool isMultiLine = size*3 >= rightMargin_ ;
-   childValues_.clear();
-   for ( int index =0; index < size  &&  !isMultiLine; ++index )
-   {
-      const Value &childValue = value[index];
-      isMultiLine = isMultiLine  ||
-                     ( (childValue.isArray()  ||  childValue.isObject())  &&  
-                        childValue.size() > 0 );
-   }
-   if ( !isMultiLine ) // check if line length > max line length
-   {
-      childValues_.reserve( size );
-      addChildValues_ = true;
-      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
-      for ( int index =0; index < size  &&  !isMultiLine; ++index )
-      {
-         writeValue( value[index] );
-         lineLength += int( childValues_[index].length() );
-         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );
-      }
-      addChildValues_ = false;
-      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;
-   }
-   return isMultiLine;
-}
-
-
-void 
-StyledWriter::pushValue( const std::string &value )
-{
-   if ( addChildValues_ )
-      childValues_.push_back( value );
-   else
-      document_ += value;
-}
-
-
-void 
-StyledWriter::writeIndent()
-{
-   if ( !document_.empty() )
-   {
-      char last = document_[document_.length()-1];
-      if ( last == ' ' )     // already indented
-         return;
-      if ( last != '\n' )    // Comments may add new-line
-         document_ += '\n';
-   }
-   document_ += indentString_;
-}
-
-
-void 
-StyledWriter::writeWithIndent( const std::string &value )
-{
-   writeIndent();
-   document_ += value;
-}
-
-
-void 
-StyledWriter::indent()
-{
-   indentString_ += std::string( indentSize_, ' ' );
-}
-
-
-void 
-StyledWriter::unindent()
-{
-   assert( int(indentString_.size()) >= indentSize_ );
-   indentString_.resize( indentString_.size() - indentSize_ );
-}
-
-
-void 
-StyledWriter::writeCommentBeforeValue( const Value &root )
-{
-   if ( !root.hasComment( commentBefore ) )
-      return;
-   document_ += normalizeEOL( root.getComment( commentBefore ) );
-   document_ += "\n";
-}
-
-
-void 
-StyledWriter::writeCommentAfterValueOnSameLine( const Value &root )
-{
-   if ( root.hasComment( commentAfterOnSameLine ) )
-      document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
-
-   if ( root.hasComment( commentAfter ) )
-   {
-      document_ += "\n";
-      document_ += normalizeEOL( root.getComment( commentAfter ) );
-      document_ += "\n";
-   }
-}
-
-
-bool 
-StyledWriter::hasCommentForValue( const Value &value )
-{
-   return value.hasComment( commentBefore )
-          ||  value.hasComment( commentAfterOnSameLine )
-          ||  value.hasComment( commentAfter );
-}
-
-
-std::string 
-StyledWriter::normalizeEOL( const std::string &text )
-{
-   std::string normalized;
-   normalized.reserve( text.length() );
-   const char *begin = text.c_str();
-   const char *end = begin + text.length();
-   const char *current = begin;
-   while ( current != end )
-   {
-      char c = *current++;
-      if ( c == '\r' ) // mac or dos EOL
-      {
-         if ( *current == '\n' ) // convert dos EOL
-            ++current;
-         normalized += '\n';
-      }
-      else // handle unix EOL & other char
-         normalized += c;
-   }
-   return normalized;
-}
-
-
-// Class StyledStreamWriter
-// //////////////////////////////////////////////////////////////////
-
-StyledStreamWriter::StyledStreamWriter( std::string indentation )
-   : document_(NULL)
-   , rightMargin_( 74 )
-   , indentation_( indentation )
-{
-}
-
-
-void
-StyledStreamWriter::write( std::ostream &out, const Value &root )
-{
-   document_ = &out;
-   addChildValues_ = false;
-   indentString_ = "";
-   writeCommentBeforeValue( root );
-   writeValue( root );
-   writeCommentAfterValueOnSameLine( root );
-   *document_ << "\n";
-   document_ = NULL; // Forget the stream, for safety.
-}
-
-
-void 
-StyledStreamWriter::writeValue( const Value &value )
-{
-   switch ( value.type() )
-   {
-   case nullValue:
-      pushValue( "null" );
-      break;
-   case intValue:
-      pushValue( valueToString( value.asInt() ) );
-      break;
-   case uintValue:
-      pushValue( valueToString( value.asUInt() ) );
-      break;
-   case realValue:
-      pushValue( valueToString( value.asDouble() ) );
-      break;
-   case stringValue:
-      pushValue( valueToQuotedString( value.asCString() ) );
-      break;
-   case booleanValue:
-      pushValue( valueToString( value.asBool() ) );
-      break;
-   case arrayValue:
-      writeArrayValue( value);
-      break;
-   case objectValue:
-      {
-         Value::Members members( value.getMemberNames() );
-         if ( members.empty() )
-            pushValue( "{}" );
-         else
-         {
-            writeWithIndent( "{" );
-            indent();
-            Value::Members::iterator it = members.begin();
-            while ( true )
-            {
-               const std::string &name = *it;
-               const Value &childValue = value[name];
-               writeCommentBeforeValue( childValue );
-               writeWithIndent( valueToQuotedString( name.c_str() ) );
-               *document_ << " : ";
-               writeValue( childValue );
-               if ( ++it == members.end() )
-               {
-                  writeCommentAfterValueOnSameLine( childValue );
-                  break;
-               }
-               *document_ << ",";
-               writeCommentAfterValueOnSameLine( childValue );
-            }
-            unindent();
-            writeWithIndent( "}" );
-         }
-      }
-      break;
-   }
-}
-
-
-void 
-StyledStreamWriter::writeArrayValue( const Value &value )
-{
-   unsigned size = value.size();
-   if ( size == 0 )
-      pushValue( "[]" );
-   else
-   {
-      bool isArrayMultiLine = isMultineArray( value );
-      if ( isArrayMultiLine )
-      {
-         writeWithIndent( "[" );
-         indent();
-         bool hasChildValue = !childValues_.empty();
-         unsigned index =0;
-         while ( true )
-         {
-            const Value &childValue = value[index];
-            writeCommentBeforeValue( childValue );
-            if ( hasChildValue )
-               writeWithIndent( childValues_[index] );
-            else
-            {
-	       writeIndent();
-               writeValue( childValue );
-            }
-            if ( ++index == size )
-            {
-               writeCommentAfterValueOnSameLine( childValue );
-               break;
-            }
-            *document_ << ",";
-            writeCommentAfterValueOnSameLine( childValue );
-         }
-         unindent();
-         writeWithIndent( "]" );
-      }
-      else // output on a single line
-      {
-         assert( childValues_.size() == size );
-         *document_ << "[ ";
-         for ( unsigned index =0; index < size; ++index )
-         {
-            if ( index > 0 )
-               *document_ << ", ";
-            *document_ << childValues_[index];
-         }
-         *document_ << " ]";
-      }
-   }
-}
-
-
-bool 
-StyledStreamWriter::isMultineArray( const Value &value )
-{
-   int size = value.size();
-   bool isMultiLine = size*3 >= rightMargin_ ;
-   childValues_.clear();
-   for ( int index =0; index < size  &&  !isMultiLine; ++index )
-   {
-      const Value &childValue = value[index];
-      isMultiLine = isMultiLine  ||
-                     ( (childValue.isArray()  ||  childValue.isObject())  &&  
-                        childValue.size() > 0 );
-   }
-   if ( !isMultiLine ) // check if line length > max line length
-   {
-      childValues_.reserve( size );
-      addChildValues_ = true;
-      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
-      for ( int index =0; index < size  &&  !isMultiLine; ++index )
-      {
-         writeValue( value[index] );
-         lineLength += int( childValues_[index].length() );
-         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );
-      }
-      addChildValues_ = false;
-      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;
-   }
-   return isMultiLine;
-}
-
-
-void 
-StyledStreamWriter::pushValue( const std::string &value )
-{
-   if ( addChildValues_ )
-      childValues_.push_back( value );
-   else
-      *document_ << value;
-}
-
-
-void 
-StyledStreamWriter::writeIndent()
-{
-  /*
-    Some comments in this method would have been nice. ;-)
-
-   if ( !document_.empty() )
-   {
-      char last = document_[document_.length()-1];
-      if ( last == ' ' )     // already indented
-         return;
-      if ( last != '\n' )    // Comments may add new-line
-         *document_ << '\n';
-   }
-  */
-   *document_ << '\n' << indentString_;
-}
-
-
-void 
-StyledStreamWriter::writeWithIndent( const std::string &value )
-{
-   writeIndent();
-   *document_ << value;
-}
-
-
-void 
-StyledStreamWriter::indent()
-{
-   indentString_ += indentation_;
-}
-
-
-void 
-StyledStreamWriter::unindent()
-{
-   assert( indentString_.size() >= indentation_.size() );
-   indentString_.resize( indentString_.size() - indentation_.size() );
-}
-
-
-void 
-StyledStreamWriter::writeCommentBeforeValue( const Value &root )
-{
-   if ( !root.hasComment( commentBefore ) )
-      return;
-   *document_ << normalizeEOL( root.getComment( commentBefore ) );
-   *document_ << "\n";
-}
-
-
-void 
-StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root )
-{
-   if ( root.hasComment( commentAfterOnSameLine ) )
-      *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
-
-   if ( root.hasComment( commentAfter ) )
-   {
-      *document_ << "\n";
-      *document_ << normalizeEOL( root.getComment( commentAfter ) );
-      *document_ << "\n";
-   }
-}
-
-
-bool 
-StyledStreamWriter::hasCommentForValue( const Value &value )
-{
-   return value.hasComment( commentBefore )
-          ||  value.hasComment( commentAfterOnSameLine )
-          ||  value.hasComment( commentAfter );
-}
-
-
-std::string 
-StyledStreamWriter::normalizeEOL( const std::string &text )
-{
-   std::string normalized;
-   normalized.reserve( text.length() );
-   const char *begin = text.c_str();
-   const char *end = begin + text.length();
-   const char *current = begin;
-   while ( current != end )
-   {
-      char c = *current++;
-      if ( c == '\r' ) // mac or dos EOL
-      {
-         if ( *current == '\n' ) // convert dos EOL
-            ++current;
-         normalized += '\n';
-      }
-      else // handle unix EOL & other char
-         normalized += c;
-   }
-   return normalized;
-}
-
-
-std::ostream& operator<<( std::ostream &sout, const Value &root )
-{
-   Json::StyledStreamWriter writer;
-   writer.write(sout, root);
-   return sout;
-}
-
-
-} // namespace Json

=== removed file 'thirdparty/jsoncpp/src/lib_json/sconscript'
--- thirdparty/jsoncpp/src/lib_json/sconscript	2013-07-31 21:18:54 +0000
+++ thirdparty/jsoncpp/src/lib_json/sconscript	1970-01-01 00:00:00 +0000
@@ -1,8 +0,0 @@
-Import( 'env buildLibrary' )
-
-buildLibrary( env, Split( """
-    json_reader.cpp 
-    json_value.cpp 
-    json_writer.cpp
-     """ ),
-    'json' )