changeset 9:e6ad9016601c

Add Msgpack for Unity.
author Kazuma
date Sun, 23 Oct 2016 04:37:16 +0900
parents d132d442dc34
children abe0c247f5a5
files src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/SingletonMessage.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/HEAD src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/config src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/description src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/applypatch-msg.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/commit-msg.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/post-update.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-applypatch.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-commit.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-push.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-rebase.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/prepare-commit-msg.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/update.sample src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/index src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/info/exclude src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/HEAD src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/heads/master src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/remotes/origin/HEAD src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/00/c8e51cd16ac10c74dd2f9974e6261ae72dfe4c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/04/bd98d0918f4e21e0aa28f957af42639481ec72 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/05/4668352f9f1e28268bc74604ad4c73a3a24e74 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/18/17b354ce3301394fc5af5f8a2a17b690812ec1 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/1f/116ad7ca93823183d33d8223139c717df069c3 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/2d/f9bb3e0866da49532c79177f5a2febd5b8973e src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/30/6b516bef3bf54505433f44b53d4fc99311ecd6 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/34/d46e7bef952bd8fabb5f2847d7a283855b83fe src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/46/d080685b602b8ccec7a343da7c62256c35ad0c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/50/bcb39015be539af4a654036cef49a5f08c0321 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/57/543770118822a5eb91efa7cac5037297df169d src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/618130994ffb0591f53545cf84a89f552df84f src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/cbb52610087bad1c48572c99c998a4928013d5 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/61/c2225fc4a2b7742c3b8d3ec6cb6f78aac73868 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/6c/4d4e0b98bd4200dea587f867232aaf94fb7efa src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/4aff4f6de364bc022a7653c2cde3116f184e8f src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/a31fc6b0d5d061f5151d9e1ada8e54346e2c98 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/8c/c971fe5e16554747f616b1f65e26103b5f71ec src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9a/c0ec3d0fb15a1b74cb749b1d25189f5bab7ff1 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9c/6d483546704aaa1453f57ca14c6471830c91ac src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/a7/c97a61698cdf1839fcdcd447b37ecdd4ffd88e src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/ae/899d9608dcb968d6073329c2cd45a4b9b825de src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/be/c4d4c4558d625539410a5b3a2e69f48ec48f48 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/d5/40b060aeccc5b4e1ab26aec45267e8ae7393c2 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e7/c80cc200584b818c491a184cfc6f2b5f9e17a8 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e9/8430e1f9a9d93e5971d6e65d0d70a771e6a070 src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/packed-refs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/heads/master src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/remotes/origin/HEAD src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.gitignore src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/README.md src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/BoxingPacker.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/CompiledPacker.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/EmitExtensions.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/PackILGenerator.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/Variable.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/VariableType.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackReader.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackWriter.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ObjectPacker.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCache.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCacheEntry.cs src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/TypePrefixes.cs
diffstat 61 files changed, 2948 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/SingletonMessage.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,9 @@
+using UnityEngine;
+using System.Collections;
+
+public class SingletonMessage : MonoBehaviour {
+
+	public static MsgPack.ObjectPacker getInstance () {
+		return new MsgPack.ObjectPacker();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/HEAD	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+ref: refs/heads/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/config	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,13 @@
+[core]
+	repositoryformatversion = 0
+	filemode = false
+	bare = false
+	logallrefupdates = true
+	symlinks = false
+	ignorecase = true
+[remote "origin"]
+	url = https://github.com/masharada/msgpack-unity.git
+	fetch = +refs/heads/*:refs/remotes/origin/*
+[branch "master"]
+	remote = origin
+	merge = refs/heads/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/description	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/applypatch-msg.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.  The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "applypatch-msg".
+
+. git-sh-setup
+commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
+test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
+:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/commit-msg.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by "git commit" with one argument, the name of the file
+# that has the commit message.  The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit.  The hook is allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "commit-msg".
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
+# hook is more suited to it.
+#
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
+	echo >&2 Duplicate Signed-off-by lines.
+	exit 1
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/post-update.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, rename this file to "post-update".
+
+exec git update-server-info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-applypatch.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-applypatch".
+
+. git-sh-setup
+precommit="$(git rev-parse --git-path hooks/pre-commit)"
+test -x "$precommit" && exec "$precommit" ${1+"$@"}
+:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-commit.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments.  The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+	against=HEAD
+else
+	# Initial commit: diff against an empty tree object
+	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+# If you want to allow non-ASCII filenames set this variable to true.
+allownonascii=$(git config --bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ASCII filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+	# Note that the use of brackets around a tr range is ok here, (it's
+	# even required, for portability to Solaris 10's /usr/bin/tr), since
+	# the square bracket bytes happen to fall in the designated range.
+	test $(git diff --cached --name-only --diff-filter=A -z $against |
+	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+	cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+  git config hooks.allownonascii true
+EOF
+	exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+exec git diff-index --check --cached $against --
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-push.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# An example hook script to verify what is about to be pushed.  Called by "git
+# push" after it has checked the remote status, but before anything has been
+# pushed.  If this script exits with a non-zero status nothing will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+#   <local ref> <local sha1> <remote ref> <remote sha1>
+#
+# This sample shows how to prevent push of commits where the log message starts
+# with "WIP" (work in progress).
+
+remote="$1"
+url="$2"
+
+z40=0000000000000000000000000000000000000000
+
+while read local_ref local_sha remote_ref remote_sha
+do
+	if [ "$local_sha" = $z40 ]
+	then
+		# Handle delete
+		:
+	else
+		if [ "$remote_sha" = $z40 ]
+		then
+			# New branch, examine all commits
+			range="$local_sha"
+		else
+			# Update to existing branch, examine new commits
+			range="$remote_sha..$local_sha"
+		fi
+
+		# Check for WIP commit
+		commit=`git rev-list -n 1 --grep '^WIP' "$range"`
+		if [ -n "$commit" ]
+		then
+			echo >&2 "Found WIP commit in $local_ref, not pushing"
+			exit 1
+		fi
+	fi
+done
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-rebase.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, 2008 Junio C Hamano
+#
+# The "pre-rebase" hook is run just before "git rebase" starts doing
+# its job, and can prevent the command from running by exiting with
+# non-zero status.
+#
+# The hook is called with the following parameters:
+#
+# $1 -- the upstream the series was forked from.
+# $2 -- the branch being rebased (or empty when rebasing the current branch).
+#
+# This sample shows how to prevent topic branches that are already
+# merged to 'next' branch from getting rebased, because allowing it
+# would result in rebasing already published history.
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+	topic="refs/heads/$2"
+else
+	topic=`git symbolic-ref HEAD` ||
+	exit 0 ;# we do not interrupt rebasing detached HEAD
+fi
+
+case "$topic" in
+refs/heads/??/*)
+	;;
+*)
+	exit 0 ;# we do not interrupt others.
+	;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master.  Is it OK to rebase it?
+
+# Does the topic really exist?
+git show-ref -q "$topic" || {
+	echo >&2 "No such branch $topic"
+	exit 1
+}
+
+# Is topic fully merged to master?
+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+	echo >&2 "$topic is fully merged to master; better remove it."
+	exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next?  If so you should not be rebasing it.
+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git rev-list ^master           ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+	not_in_topic=`git rev-list "^$topic" master`
+	if test -z "$not_in_topic"
+	then
+		echo >&2 "$topic is already up-to-date with master"
+		exit 1 ;# we could allow it, but there is no point.
+	else
+		exit 0
+	fi
+else
+	not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
+	/usr/bin/perl -e '
+		my $topic = $ARGV[0];
+		my $msg = "* $topic has commits already merged to public branch:\n";
+		my (%not_in_next) = map {
+			/^([0-9a-f]+) /;
+			($1 => 1);
+		} split(/\n/, $ARGV[1]);
+		for my $elem (map {
+				/^([0-9a-f]+) (.*)$/;
+				[$1 => $2];
+			} split(/\n/, $ARGV[2])) {
+			if (!exists $not_in_next{$elem->[0]}) {
+				if ($msg) {
+					print STDERR $msg;
+					undef $msg;
+				}
+				print STDERR " $elem->[1]\n";
+			}
+		}
+	' "$topic" "$not_in_next" "$not_in_master"
+	exit 1
+fi
+
+exit 0
+
+################################################################
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+   merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+   it is deleted.  If you need to build on top of it to correct
+   earlier mistakes, a new topic branch is created by forking at
+   the tip of the "master".  This is not strictly necessary, but
+   it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+   branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next".  Young
+    topic branches can have stupid mistakes you would rather
+    clean up before publishing, and things that have not been
+    merged into other branches can be easily rebased without
+    affecting other people.  But once it is published, you would
+    not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+    Then you can delete it.  More importantly, you should not
+    build on top of it -- other people may already want to
+    change things related to the topic as patches against your
+    "master", so if you need further changes, it is better to
+    fork the topic (perhaps with the same name) afresh from the
+    tip of "master".
+
+Let's look at this example:
+
+		   o---o---o---o---o---o---o---o---o---o "next"
+		  /       /           /           /
+		 /   a---a---b A     /           /
+		/   /               /           /
+	       /   /   c---c---c---c B         /
+	      /   /   /             \         /
+	     /   /   /   b---b C     \       /
+	    /   /   /   /             \     /
+    ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished.  It has been fully merged up to "master" and "next",
+   and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+	git rev-list ^master ^topic next
+	git rev-list ^master        next
+
+	if these match, topic has not merged in next at all.
+
+To compute (2):
+
+	git rev-list master..topic
+
+	if this is empty, it is fully merged to "master".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/prepare-commit-msg.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# An example hook script to prepare the commit log message.
+# Called by "git commit" with the name of the file that has the
+# commit message, followed by the description of the commit
+# message's source.  The hook's purpose is to edit the commit
+# message file.  If the hook fails with a non-zero status,
+# the commit is aborted.
+#
+# To enable this hook, rename this file to "prepare-commit-msg".
+
+# This hook includes three examples.  The first comments out the
+# "Conflicts:" part of a merge commit.
+#
+# The second includes the output of "git diff --name-status -r"
+# into the message, just before the "git status" output.  It is
+# commented because it doesn't cope with --amend or with squashed
+# commits.
+#
+# The third example adds a Signed-off-by line to the message, that can
+# still be edited.  This is rarely a good idea.
+
+case "$2,$3" in
+  merge,)
+    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
+
+# ,|template,)
+#   /usr/bin/perl -i.bak -pe '
+#      print "\n" . `git diff --cached --name-status -r`
+#	 if /^#/ && $first++ == 0' "$1" ;;
+
+  *) ;;
+esac
+
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/update.sample	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,128 @@
+#!/bin/sh
+#
+# An example hook script to block unannotated tags from entering.
+# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
+#
+# To enable this hook, rename this file to "update".
+#
+# Config
+# ------
+# hooks.allowunannotated
+#   This boolean sets whether unannotated tags will be allowed into the
+#   repository.  By default they won't be.
+# hooks.allowdeletetag
+#   This boolean sets whether deleting tags will be allowed in the
+#   repository.  By default they won't be.
+# hooks.allowmodifytag
+#   This boolean sets whether a tag may be modified after creation. By default
+#   it won't be.
+# hooks.allowdeletebranch
+#   This boolean sets whether deleting branches will be allowed in the
+#   repository.  By default they won't be.
+# hooks.denycreatebranch
+#   This boolean sets whether remotely creating branches will be denied
+#   in the repository.  By default this is allowed.
+#
+
+# --- Command line
+refname="$1"
+oldrev="$2"
+newrev="$3"
+
+# --- Safety check
+if [ -z "$GIT_DIR" ]; then
+	echo "Don't run this script from the command line." >&2
+	echo " (if you want, you could supply GIT_DIR then run" >&2
+	echo "  $0 <ref> <oldrev> <newrev>)" >&2
+	exit 1
+fi
+
+if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
+	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
+	exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --bool hooks.allowunannotated)
+allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --bool hooks.denycreatebranch)
+allowdeletetag=$(git config --bool hooks.allowdeletetag)
+allowmodifytag=$(git config --bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+	echo "*** Project description file hasn't been set" >&2
+	exit 1
+	;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero="0000000000000000000000000000000000000000"
+if [ "$newrev" = "$zero" ]; then
+	newrev_type=delete
+else
+	newrev_type=$(git cat-file -t $newrev)
+fi
+
+case "$refname","$newrev_type" in
+	refs/tags/*,commit)
+		# un-annotated tag
+		short_refname=${refname##refs/tags/}
+		if [ "$allowunannotated" != "true" ]; then
+			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
+			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+			exit 1
+		fi
+		;;
+	refs/tags/*,delete)
+		# delete tag
+		if [ "$allowdeletetag" != "true" ]; then
+			echo "*** Deleting a tag is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	refs/tags/*,tag)
+		# annotated tag
+		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+		then
+			echo "*** Tag '$refname' already exists." >&2
+			echo "*** Modifying a tag is not allowed in this repository." >&2
+			exit 1
+		fi
+		;;
+	refs/heads/*,commit)
+		# branch
+		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+			echo "*** Creating a branch is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	refs/heads/*,delete)
+		# delete branch
+		if [ "$allowdeletebranch" != "true" ]; then
+			echo "*** Deleting a branch is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	refs/remotes/*,commit)
+		# tracking branch
+		;;
+	refs/remotes/*,delete)
+		# delete tracking branch
+		if [ "$allowdeletebranch" != "true" ]; then
+			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	*)
+		# Anything else (is there anything else?)
+		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+		exit 1
+		;;
+esac
+
+# --- Finished
+exit 0
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/index has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/info/exclude	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/HEAD	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda <kazuma-arashi@hotmail.co.jp> 1477164441 +0900	clone: from https://github.com/masharada/msgpack-unity.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/heads/master	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda <kazuma-arashi@hotmail.co.jp> 1477164441 +0900	clone: from https://github.com/masharada/msgpack-unity.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/remotes/origin/HEAD	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda <kazuma-arashi@hotmail.co.jp> 1477164441 +0900	clone: from https://github.com/masharada/msgpack-unity.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/00/c8e51cd16ac10c74dd2f9974e6261ae72dfe4c	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,5 @@
+xSn05
+"촇[Ѓf.E8Bɓ^/a_8Iv-|QJ
+w~/`|bt~7g0Q3V,fP
5BX>]dh
+.B1ht[р*TCZXR,Hޖ*E[}*>xj	J(Ы@#
vu]k^
ntO.Nh-^ICrDIRBԠ
 ŜfʵN|V\-2LZgdRWuJtgBA?!pQ<"n	bΖ4&u3}p7zH~d4hJָ`EqS)ISy%r\@HhL-̘R!	n‹	y^e97níU))e=O-ZWƟUB^CZp/d۽Ez˦$Qi|}2|:#${||B6>G}
+<Z01(T0h?W,|vhUF&iMK0MVhv璉FP.l<891X^v'O޴77Oi
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/04/bd98d0918f4e21e0aa28f957af42639481ec72	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,2 @@
+xmTMs0_b ^C:L (ۋQ%W_ߕ0-޾qcfA֊DrN<(鎽`ǽp}{e-)r"j
wF,Aca)V/A~<oY-nOH*cH9N&LXcĔ3FJ%z Zn3Zi0B0T։<gB#7ci̭%g[zuePǪز
Dnu;zV(^;W$n_AIaCތA̤b¢̩`/ȡ1=ZɄ%O
+X2;#\Ng~\c-fh6hRT3q~;c$cy$pL1v?y(>UPɓ8,J5jѱ|DӻL'u~M6OV*\,%}P<
~WGI&"	*2C3Ìj#TV\-uSiqVMПon:߄qnxϣm`}:	:7̣'܆Nrn\J2)uTk[R"αLUL!XJ2>uDӎZ.yW/[t
\ No newline at end of file
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/05/4668352f9f1e28268bc74604ad4c73a3a24e74 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/18/17b354ce3301394fc5af5f8a2a17b690812ec1 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/1f/116ad7ca93823183d33d8223139c717df069c3 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/2d/f9bb3e0866da49532c79177f5a2febd5b8973e has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/30/6b516bef3bf54505433f44b53d4fc99311ecd6	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+xUR͎0<Ũ'JESmIQ'45
h+0.|ߏVpů?$JXj3Zn../G
q@Ț+RjUM 5X2!'X+/eOջ@1:Ai#`{n	"T3-=K8']zqf?hmInm̸d-Wyz-#w%җ-G@#*,EhhX yY5pzt%69}> yZ@V}Zd"<d<mU-,7M6>@?m,$/i
D&,>WPo[<읡\54+Y%؅N;OHaGN&X㥔*5{43})a{bݍ]Gjh=G75
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/34/d46e7bef952bd8fabb5f2847d7a283855b83fe	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+x}Sn06y^RIbT25ݦ	!产,=<m]UVs3_|ϯq1UQk,QLĚUr.8J(5 `J.Q$EuN[EJذP$a`)rXX`#T®N9C-#8i8*bntM'8='m˅k`YlNFsV2TYBf}0ji+\c$@43&3H!I;~&iߑ\%\
xRLa8$d2,i^-K@6%.Rt,Φ@.S4,C
jI@ԐG7akCaXכ)<GS?C6hh9Lu3rNC8Q).ya@EtfV;]'>4BG5G4Xx+iktӃ?
J0XyGk6zby$%KOC|iG-lyNo:6^ϧʼn~%GwNvWtϠnX6t	Mg_F8j:ԍK'/aLom?vVw_
\ No newline at end of file
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/46/d080685b602b8ccec7a343da7c62256c35ad0c has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/50/bcb39015be539af4a654036cef49a5f08c0321 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/57/543770118822a5eb91efa7cac5037297df169d has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/618130994ffb0591f53545cf84a89f552df84f has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/cbb52610087bad1c48572c99c998a4928013d5 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/61/c2225fc4a2b7742c3b8d3ec6cb6f78aac73868 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/6c/4d4e0b98bd4200dea587f867232aaf94fb7efa has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/4aff4f6de364bc022a7653c2cde3116f184e8f has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/a31fc6b0d5d061f5151d9e1ada8e54346e2c98 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/8c/c971fe5e16554747f616b1f65e26103b5f71ec has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9a/c0ec3d0fb15a1b74cb749b1d25189f5bab7ff1 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9c/6d483546704aaa1453f57ca14c6471830c91ac has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/a7/c97a61698cdf1839fcdcd447b37ecdd4ffd88e has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/ae/899d9608dcb968d6073329c2cd45a4b9b825de has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/be/c4d4c4558d625539410a5b3a2e69f48ec48f48 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/d5/40b060aeccc5b4e1ab26aec45267e8ae7393c2 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e7/c80cc200584b818c491a184cfc6f2b5f9e17a8 has changed
Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e9/8430e1f9a9d93e5971d6e65d0d70a771e6a070 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/packed-refs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,2 @@
+# pack-refs with: peeled fully-peeled 
+e7c80cc200584b818c491a184cfc6f2b5f9e17a8 refs/remotes/origin/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/heads/master	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+e7c80cc200584b818c491a184cfc6f2b5f9e17a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/remotes/origin/HEAD	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,1 @@
+ref: refs/remotes/origin/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.gitignore	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,6 @@
+# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
+bin
+obj
+
+# mstest test results
+TestResults
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/README.md	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,34 @@
+# MessagePack for Unity
+
+## What is it?
+
+This is MessagePack serialization/deserialization for Unity (or Unity Pro.)
+
+This library is based on Kazuki's MessagePack for C#
+(not the current official for CLI, because it depends on .NET framework 4.0.) 
+
+## Install
+
+To install this, copy files in src to Assets folder in your project.
+
+## See also
+
+  Official Library           : https://github.com/msgpack/msgpack
+  
+  Original C# Implementation : https://github.com/kazuki/msgpack
+  
+## License
+
+    Copyright (C) 2011-2012 Kazuki Oikawa, Kazunari Kida
+    
+       Licensed under the Apache License, Version 2.0 (the "License");
+       you may not use this file except in compliance with the License.
+       You may obtain a copy of the License at
+    
+           http://www.apache.org/licenses/LICENSE-2.0
+    
+       Unless required by applicable law or agreed to in writing, software
+       distributed under the License is distributed on an "AS IS" BASIS,
+       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+       See the License for the specific language governing permissions and
+       limitations under the License.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/BoxingPacker.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,184 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+
+namespace MsgPack
+{
+	public class BoxingPacker
+	{
+		static Type KeyValuePairDefinitionType;
+
+		static BoxingPacker ()
+		{
+			KeyValuePairDefinitionType = typeof (KeyValuePair<object,object>).GetGenericTypeDefinition ();
+		}
+
+		public void Pack (Stream strm, object o)
+		{
+			MsgPackWriter writer = new MsgPackWriter (strm);
+			Pack (writer, o);
+		}
+
+		public byte[] Pack (object o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		void Pack (MsgPackWriter writer, object o)
+		{
+			if (o == null) {
+				writer.WriteNil ();
+				return;
+			}
+
+			Type t = o.GetType ();
+			if (t.IsPrimitive) {
+				if (t.Equals (typeof (int))) writer.Write ((int)o);
+				else if (t.Equals (typeof (uint))) writer.Write ((uint)o);
+				else if (t.Equals (typeof (float))) writer.Write ((float)o);
+				else if (t.Equals (typeof (double))) writer.Write ((double)o);
+				else if (t.Equals (typeof (long))) writer.Write ((long)o);
+				else if (t.Equals (typeof (ulong))) writer.Write ((ulong)o);
+				else if (t.Equals (typeof (bool))) writer.Write ((bool)o);
+				else if (t.Equals (typeof (byte))) writer.Write ((byte)o);
+				else if (t.Equals (typeof (sbyte))) writer.Write ((sbyte)o);
+				else if (t.Equals (typeof (short))) writer.Write ((short)o);
+				else if (t.Equals (typeof (ushort))) writer.Write ((ushort)o);
+				else throw new NotSupportedException ();  // char?
+				return;
+			}
+
+			IDictionary dic = o as IDictionary;
+			if (dic != null) {
+				writer.WriteMapHeader (dic.Count);
+				foreach (System.Collections.DictionaryEntry e in dic) {
+					Pack (writer, e.Key);
+					Pack (writer, e.Value);
+				}
+				return;
+			}
+			
+			if (t.IsArray) {
+				Array ary = (Array)o;
+				Type et = t.GetElementType ();
+
+				// KeyValuePair<K,V>[] (Map Type)
+				if (et.IsGenericType && et.GetGenericTypeDefinition ().Equals (KeyValuePairDefinitionType)) {
+					PropertyInfo propKey = et.GetProperty ("Key");
+					PropertyInfo propValue = et.GetProperty ("Value");
+					writer.WriteMapHeader (ary.Length);
+					for (int i = 0; i < ary.Length; i ++) {
+						object e = ary.GetValue (i);
+						Pack (writer, propKey.GetValue (e, null));
+						Pack (writer, propValue.GetValue (e, null));
+					}
+					return;
+				}
+
+				// Array
+				writer.WriteArrayHeader (ary.Length);
+				for (int i = 0; i < ary.Length; i ++)
+					Pack (writer, ary.GetValue (i));
+				return;
+			}
+		}
+
+		public object Unpack (Stream strm)
+		{
+			MsgPackReader reader = new MsgPackReader (strm);
+			return Unpack (reader);
+		}
+
+		public object Unpack (byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack (ms);
+			}
+		}
+
+		public object Unpack (byte[] buf)
+		{
+			return Unpack (buf, 0, buf.Length);
+		}
+
+		object Unpack (MsgPackReader reader)
+		{
+			if (!reader.Read ())
+				throw new FormatException ();
+
+			switch (reader.Type) {
+				case TypePrefixes.PositiveFixNum:
+				case TypePrefixes.NegativeFixNum:
+				case TypePrefixes.Int8:
+				case TypePrefixes.Int16:
+				case TypePrefixes.Int32:
+					return reader.ValueSigned;
+				case TypePrefixes.Int64:
+					return reader.ValueSigned64;
+				case TypePrefixes.UInt8:
+				case TypePrefixes.UInt16:
+				case TypePrefixes.UInt32:
+					return reader.ValueUnsigned;
+				case TypePrefixes.UInt64:
+					return reader.ValueUnsigned64;
+				case TypePrefixes.True:
+					return true;
+				case TypePrefixes.False:
+					return false;
+				case TypePrefixes.Float:
+					return reader.ValueFloat;
+				case TypePrefixes.Double:
+					return reader.ValueDouble;
+				case TypePrefixes.Nil:
+					return null;
+				case TypePrefixes.FixRaw:
+				case TypePrefixes.Raw16:
+				case TypePrefixes.Raw32:
+					byte[] raw = new byte[reader.Length];
+					reader.ReadValueRaw (raw, 0, raw.Length);
+					return raw;
+				case TypePrefixes.FixArray:
+				case TypePrefixes.Array16:
+				case TypePrefixes.Array32:
+					object[] ary = new object[reader.Length];
+					for (int i = 0; i < ary.Length; i ++)
+						ary[i] = Unpack (reader);
+					return ary;
+				case TypePrefixes.FixMap:
+				case TypePrefixes.Map16:
+				case TypePrefixes.Map32:
+					IDictionary<object, object> dic = new Dictionary<object, object> ((int)reader.Length);
+					int count = (int)reader.Length;
+					for (int i = 0; i < count; i ++) {
+						object k = Unpack (reader);
+						object v = Unpack (reader);
+						dic.Add (k, v);
+					}
+					return dic;
+				default:
+					throw new FormatException ();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/CompiledPacker.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,549 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Threading;
+using MsgPack.Compiler;
+
+namespace MsgPack
+{
+	public class CompiledPacker
+	{
+		static PackerBase _publicFieldPacker, _allFieldPacker;
+		PackerBase _packer;
+
+		static CompiledPacker ()
+		{
+			_publicFieldPacker = new MethodBuilderPacker ();
+			_allFieldPacker = new DynamicMethodPacker ();
+		}
+
+		public CompiledPacker () : this (false) {}
+		public CompiledPacker (bool packPrivateField)
+		{
+			_packer = (packPrivateField ? _allFieldPacker : _publicFieldPacker);
+		}
+
+		public void Prepare<T> ()
+		{
+			_packer.CreatePacker<T> ();
+			_packer.CreateUnpacker<T> ();
+		}
+
+		#region Generics Pack/Unpack Methods
+		public byte[] Pack<T> (T o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack<T> (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		public void Pack<T> (Stream strm, T o)
+		{
+			_packer.CreatePacker<T> () (new MsgPackWriter (strm), o);
+		}
+
+		public T Unpack<T> (byte[] buf)
+		{
+			return Unpack<T> (buf, 0, buf.Length);
+		}
+
+		public T Unpack<T> (byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack<T> (ms);
+			}
+		}
+
+		public T Unpack<T> (Stream strm)
+		{
+			return _packer.CreateUnpacker<T> () (new MsgPackReader (strm));
+		}
+		#endregion
+
+		#region Non-generics Pack/Unpack Methods
+		public byte[] Pack (object o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		public void Pack (Stream strm, object o)
+		{
+			throw new NotImplementedException ();
+		}
+
+		public object Unpack (Type t, byte[] buf)
+		{
+			return Unpack (t, buf, 0, buf.Length);
+		}
+
+		public object Unpack (Type t, byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack (t, ms);
+			}
+		}
+
+		public object Unpack (Type t, Stream strm)
+		{
+			throw new NotImplementedException ();
+		}
+		#endregion
+
+		#region Compiled Packer Implementations
+		public abstract class PackerBase
+		{
+			Dictionary<Type, Delegate> _packers = new Dictionary<Type, Delegate> ();
+			Dictionary<Type, Delegate> _unpackers = new Dictionary<Type, Delegate> ();
+
+			protected Dictionary<Type, MethodInfo> _packMethods = new Dictionary<Type, MethodInfo> ();
+			protected Dictionary<Type, MethodInfo> _unpackMethods = new Dictionary<Type, MethodInfo> ();
+
+			protected PackerBase ()
+			{
+				DefaultPackMethods.Register (_packMethods, _unpackMethods);
+			}
+
+			public Action<MsgPackWriter, T> CreatePacker<T> ()
+			{
+				Delegate d;
+				lock (_packers) {
+					if (!_packers.TryGetValue (typeof (T), out d)) {
+						d = CreatePacker_Internal<T> ();
+						_packers.Add (typeof (T), d);
+					}
+				}
+				return (Action<MsgPackWriter, T>)d;
+			}
+
+			public Func<MsgPackReader, T> CreateUnpacker<T> ()
+			{
+				Delegate d;
+				lock (_unpackers) {
+					if (!_unpackers.TryGetValue (typeof (T), out d)) {
+						d = CreateUnpacker_Internal<T> ();
+						_unpackers.Add (typeof (T), d);
+					}
+				}
+				return (Func<MsgPackReader, T>)d;
+			}
+
+			protected abstract Action<MsgPackWriter, T> CreatePacker_Internal<T> ();
+			protected abstract Func<MsgPackReader, T> CreateUnpacker_Internal<T> ();
+		}
+		public sealed class DynamicMethodPacker : PackerBase
+		{
+			 private static MethodInfo LookupMemberMappingMethod;
+			static Dictionary<Type, IDictionary<string, int>> UnpackMemberMappings;
+
+			static DynamicMethodPacker ()
+			{
+				UnpackMemberMappings = new Dictionary<Type, IDictionary<string, int>> ();
+				LookupMemberMappingMethod = typeof (DynamicMethodPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic);
+			}
+
+			public DynamicMethodPacker () : base ()
+			{
+			}
+
+			protected override Action<MsgPackWriter, T> CreatePacker_Internal<T> ()
+			{
+				DynamicMethod dm = CreatePacker (typeof (T), CreatePackDynamicMethod (typeof (T)));
+				return (Action<MsgPackWriter, T>)dm.CreateDelegate (typeof (Action<MsgPackWriter, T>));
+			}
+
+			protected override Func<MsgPackReader, T> CreateUnpacker_Internal<T> ()
+			{
+				DynamicMethod dm = CreateUnpacker (typeof (T), CreateUnpackDynamicMethod (typeof (T)));
+				return (Func<MsgPackReader, T>)dm.CreateDelegate (typeof (Func<MsgPackReader, T>));
+			}
+
+			DynamicMethod CreatePacker (Type t, DynamicMethod dm)
+			{
+				ILGenerator il = dm.GetILGenerator ();
+				_packMethods.Add (t, dm);
+				PackILGenerator.EmitPackCode (t, dm, il, LookupMembers, FormatMemberName, LookupPackMethod);
+				return dm;
+			}
+
+			DynamicMethod CreateUnpacker (Type t, DynamicMethod dm)
+			{
+				ILGenerator il = dm.GetILGenerator ();
+				_unpackMethods.Add (t, dm);
+				PackILGenerator.EmitUnpackCode (t, dm, il, LookupMembers, FormatMemberName, LookupUnpackMethod,
+					LookupMemberMapping, LookupMemberMappingMethod);
+				return dm;
+			}
+
+			static DynamicMethod CreatePackDynamicMethod (Type t)
+			{
+				return CreateDynamicMethod (typeof (void), new Type[] {typeof (MsgPackWriter), t});
+			}
+
+			static DynamicMethod CreateUnpackDynamicMethod (Type t)
+			{
+				return CreateDynamicMethod (t, new Type[] {typeof (MsgPackReader)});
+			}
+
+			static MemberInfo[] LookupMembers (Type t)
+			{
+				BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
+				System.Collections.Generic.List<MemberInfo> list = new System.Collections.Generic.List<MemberInfo> ();
+				list.AddRange (t.GetFields (baseFlags));
+				// TODO: Add NonSerialized Attribute Filter ?
+				return list.ToArray ();
+			}
+
+			MethodInfo LookupPackMethod (Type t)
+			{
+				MethodInfo mi;
+				DynamicMethod dm;
+				if (_packMethods.TryGetValue (t, out mi))
+					return mi;
+				dm = CreatePackDynamicMethod (t);
+				return CreatePacker (t, dm);
+			}
+
+			MethodInfo LookupUnpackMethod (Type t)
+			{
+				MethodInfo mi;
+				if (_unpackMethods.TryGetValue (t, out mi))
+					return mi;
+				DynamicMethod dm = CreateUnpackDynamicMethod (t);
+				return CreateUnpacker (t, dm);
+			}
+
+			static string FormatMemberName (MemberInfo m)
+			{
+				if (m.MemberType != MemberTypes.Field)
+					return m.Name;
+
+				int pos;
+				string name = m.Name;
+				if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1)
+					name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) <ab>
+				return name;
+			}
+
+			static int _dynamicMethodIdx = 0;
+			static DynamicMethod CreateDynamicMethod (Type returnType, Type[] parameterTypes)
+			{
+				string name = "_" + Interlocked.Increment (ref _dynamicMethodIdx).ToString ();
+				return new DynamicMethod (name, returnType, parameterTypes, true);
+			}
+
+			internal static IDictionary<string,int> LookupMemberMapping (Type t)
+			{
+				IDictionary<string, int> mapping;
+				lock (UnpackMemberMappings) {
+					if (!UnpackMemberMappings.TryGetValue (t, out mapping)) {
+						mapping = new Dictionary<string, int> ();
+						UnpackMemberMappings.Add (t, mapping);
+					}
+				}
+				return mapping;
+			}
+		}
+		public sealed class MethodBuilderPacker : PackerBase
+		{
+			public const string AssemblyName = "MessagePackInternalAssembly";
+			static AssemblyName DynamicAsmName;
+			static AssemblyBuilder DynamicAsmBuilder;
+			static ModuleBuilder DynamicModuleBuilder;
+
+			private static MethodInfo LookupMemberMappingMethod;
+			static Dictionary<Type, IDictionary<string, int>> UnpackMemberMappings;
+
+			static MethodBuilderPacker ()
+			{
+				UnpackMemberMappings = new Dictionary<Type, IDictionary<string, int>> ();
+				LookupMemberMappingMethod = typeof (MethodBuilderPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic);
+
+				DynamicAsmName = new AssemblyName (AssemblyName);
+				DynamicAsmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (DynamicAsmName, AssemblyBuilderAccess.Run);
+				DynamicModuleBuilder = DynamicAsmBuilder.DefineDynamicModule (DynamicAsmName.Name);
+			}
+
+			public MethodBuilderPacker () : base ()
+			{
+			}
+
+			protected override Action<MsgPackWriter, T> CreatePacker_Internal<T> ()
+			{
+				TypeBuilder tb;
+				MethodBuilder mb;
+				CreatePackMethodBuilder (typeof (T), out tb, out mb);
+				_packMethods.Add (typeof (T), mb);
+				CreatePacker (typeof (T), mb);
+				MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, true);
+				return (Action<MsgPackWriter, T>)Delegate.CreateDelegate (typeof (Action<MsgPackWriter, T>), mi);
+			}
+
+			protected override Func<MsgPackReader, T> CreateUnpacker_Internal<T> ()
+			{
+				TypeBuilder tb;
+				MethodBuilder mb;
+				CreateUnpackMethodBuilder (typeof (T), out tb, out mb);
+				_unpackMethods.Add (typeof (T), mb);
+				CreateUnpacker (typeof (T), mb);
+				MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, false);
+				return (Func<MsgPackReader, T>)Delegate.CreateDelegate (typeof (Func<MsgPackReader, T>), mi);
+			}
+
+			void CreatePacker (Type t, MethodBuilder mb)
+			{
+				ILGenerator il = mb.GetILGenerator ();
+				PackILGenerator.EmitPackCode (t, mb, il, LookupMembers, FormatMemberName, LookupPackMethod);
+			}
+
+			void CreateUnpacker (Type t, MethodBuilder mb)
+			{
+				ILGenerator il = mb.GetILGenerator ();
+				PackILGenerator.EmitUnpackCode (t, mb, il, LookupMembers, FormatMemberName, LookupUnpackMethod,
+					LookupMemberMapping, LookupMemberMappingMethod);
+			}
+
+			MethodInfo ToCallableMethodInfo (Type t, TypeBuilder tb, bool isPacker)
+			{
+				Type type = tb.CreateType ();
+				MethodInfo mi = type.GetMethod (isPacker ? "Pack" : "Unpack", BindingFlags.Static | BindingFlags.Public);
+				if (isPacker) {
+					_packMethods[t] = mi;
+				} else {
+					_unpackMethods[t] = mi;
+				}
+				return mi;
+			}
+
+			MethodInfo LookupPackMethod (Type t)
+			{
+				MethodInfo mi;
+				TypeBuilder tb;
+				MethodBuilder mb;
+				if (_packMethods.TryGetValue (t, out mi))
+					return mi;
+				CreatePackMethodBuilder (t, out tb, out mb);
+				_packMethods.Add (t, mb);
+				CreatePacker (t, mb);
+				return ToCallableMethodInfo (t, tb, true);
+			}
+
+			MethodInfo LookupUnpackMethod (Type t)
+			{
+				MethodInfo mi;
+				TypeBuilder tb;
+				MethodBuilder mb;
+				if (_unpackMethods.TryGetValue (t, out mi))
+					return mi;
+				CreateUnpackMethodBuilder (t, out tb, out mb);
+				_unpackMethods.Add (t, mb);
+				CreateUnpacker (t, mb);
+				return ToCallableMethodInfo (t, tb, false);
+			}
+
+			static string FormatMemberName (MemberInfo m)
+			{
+				return m.Name;
+			}
+
+			static MemberInfo[] LookupMembers (Type t)
+			{
+				BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public;
+				System.Collections.Generic.List<MemberInfo> list = new System.Collections.Generic.List<MemberInfo> ();
+				list.AddRange (t.GetFields (baseFlags));
+				// TODO: Add NonSerialized Attribute Filter ?
+				return list.ToArray ();
+			}
+
+			static void CreatePackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb)
+			{
+				tb = DynamicModuleBuilder.DefineType (t.Name + "PackerType", TypeAttributes.Public);
+				mb = tb.DefineMethod ("Pack", MethodAttributes.Static | MethodAttributes.Public, typeof (void), new Type[] {typeof (MsgPackWriter), t});
+			}
+
+			static void CreateUnpackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb)
+			{
+				tb = DynamicModuleBuilder.DefineType (t.Name + "UnpackerType", TypeAttributes.Public);
+				mb = tb.DefineMethod ("Unpack", MethodAttributes.Static | MethodAttributes.Public, t, new Type[] {typeof (MsgPackReader)});
+			}
+
+			internal static IDictionary<string,int> LookupMemberMapping (Type t)
+			{
+				IDictionary<string, int> mapping;
+				lock (UnpackMemberMappings) {
+					if (!UnpackMemberMappings.TryGetValue (t, out mapping)) {
+						mapping = new Dictionary<string, int> ();
+						UnpackMemberMappings.Add (t, mapping);
+					}
+				}
+				return mapping;
+			}
+		}
+		#endregion
+
+		#region default pack/unpack methods
+		internal static class DefaultPackMethods
+		{
+			public static void Register (Dictionary<Type, MethodInfo> packMethods, Dictionary<Type, MethodInfo> unpackMethods)
+			{
+				RegisterPackMethods (packMethods);
+				RegisterUnpackMethods (unpackMethods);
+			}
+
+			#region Pack
+			static void RegisterPackMethods (Dictionary<Type, MethodInfo> packMethods)
+			{
+				Type type = typeof (DefaultPackMethods);
+				MethodInfo[] methods = type.GetMethods (BindingFlags.Static | BindingFlags.NonPublic);
+				string methodName = "Pack";
+				for (int i = 0; i < methods.Length; i ++) {
+					if (!methodName.Equals (methods[i].Name))
+						continue;
+					ParameterInfo[] parameters = methods[i].GetParameters ();
+					if (parameters.Length != 2 || parameters[0].ParameterType != typeof (MsgPackWriter))
+						continue;
+					packMethods.Add (parameters[1].ParameterType, methods[i]);
+				}
+			}
+
+			internal static void Pack (MsgPackWriter writer, string x)
+			{
+				if (x == null) {
+					writer.WriteNil ();
+				} else {
+					writer.Write (x, false);
+				}
+			}
+			#endregion
+
+			#region Unpack
+			static void RegisterUnpackMethods (Dictionary<Type, MethodInfo> unpackMethods)
+			{
+				BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic;
+				Type type = typeof (DefaultPackMethods);
+				MethodInfo mi = type.GetMethod ("Unpack_Signed", flags);
+				unpackMethods.Add (typeof (sbyte), mi);
+				unpackMethods.Add (typeof (short), mi);
+				unpackMethods.Add (typeof (int), mi);
+
+				mi = type.GetMethod ("Unpack_Signed64", flags);
+				unpackMethods.Add (typeof (long), mi);
+
+				mi = type.GetMethod ("Unpack_Unsigned", flags);
+				unpackMethods.Add (typeof (byte), mi);
+				unpackMethods.Add (typeof (ushort), mi);
+				unpackMethods.Add (typeof (char), mi);
+				unpackMethods.Add (typeof (uint), mi);
+
+				mi = type.GetMethod ("Unpack_Unsigned64", flags);
+				unpackMethods.Add (typeof (ulong), mi);
+
+				mi = type.GetMethod ("Unpack_Boolean", flags);
+				unpackMethods.Add (typeof (bool), mi);
+
+				mi = type.GetMethod ("Unpack_Float", flags);
+				unpackMethods.Add (typeof (float), mi);
+
+				mi = type.GetMethod ("Unpack_Double", flags);
+				unpackMethods.Add (typeof (double), mi);
+
+				mi = type.GetMethod ("Unpack_String", flags);
+				unpackMethods.Add (typeof (string), mi);
+			}
+
+			internal static int Unpack_Signed (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsSigned ())
+					UnpackFailed ();
+				return reader.ValueSigned;
+			}
+
+			internal static long Unpack_Signed64 (MsgPackReader reader)
+			{
+				if (!reader.Read ())
+					UnpackFailed ();
+				if (reader.IsSigned ())
+					return reader.ValueSigned;
+				if (reader.IsSigned64 ())
+					return reader.ValueSigned64;
+				UnpackFailed ();
+				return 0; // unused
+			}
+
+			internal static uint Unpack_Unsigned (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsUnsigned ())
+					UnpackFailed ();
+				return reader.ValueUnsigned;
+			}
+
+			internal static ulong Unpack_Unsigned64 (MsgPackReader reader)
+			{
+				if (!reader.Read ())
+					UnpackFailed ();
+				if (reader.IsUnsigned ())
+					return reader.ValueUnsigned;
+				if (reader.IsUnsigned64 ())
+					return reader.ValueUnsigned64;
+				UnpackFailed ();
+				return 0; // unused
+			}
+
+			internal static bool Unpack_Boolean (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsBoolean ())
+					UnpackFailed ();
+				return reader.ValueBoolean;
+			}
+
+			internal static float Unpack_Float (MsgPackReader reader)
+			{
+				if (!reader.Read () || reader.Type != TypePrefixes.Float)
+					UnpackFailed ();
+				return reader.ValueFloat;
+			}
+
+			internal static double Unpack_Double (MsgPackReader reader)
+			{
+				if (!reader.Read () || reader.Type != TypePrefixes.Double)
+					UnpackFailed ();
+				return reader.ValueDouble;
+			}
+
+			internal static string Unpack_String (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsRaw ())
+					UnpackFailed ();
+				return reader.ReadRawString ();
+			}
+
+			internal static void UnpackFailed ()
+			{
+				throw new FormatException ();
+			}
+			#endregion
+		}
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/EmitExtensions.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,191 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace MsgPack.Compiler
+{
+	public static class EmitExtensions
+	{
+		public static void EmitLd (this ILGenerator il, Variable v)
+		{
+			switch (v.VarType) {
+				case VariableType.Arg:
+					EmitLdarg (il, v);
+					break;
+				case VariableType.Local:
+					EmitLdloc (il, v);
+					break;
+				default:
+					throw new ArgumentException ();
+			}
+		}
+
+		public static void EmitLd (this ILGenerator il, params Variable[] list)
+		{
+			for (int i = 0; i < list.Length; i ++)
+				EmitLd (il, list[i]);
+		}
+
+		public static void EmitLdarg (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Arg)
+				throw new ArgumentException ();
+
+			switch (v.Index) {
+				case 0: il.Emit (OpCodes.Ldarg_0); return;
+				case 1: il.Emit (OpCodes.Ldarg_1); return;
+				case 2: il.Emit (OpCodes.Ldarg_2); return;
+				case 3: il.Emit (OpCodes.Ldarg_3); return;
+			}
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Ldarg_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Ldarg, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitLdloc (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Local)
+				throw new ArgumentException ();
+
+			switch (v.Index) {
+				case 0: il.Emit (OpCodes.Ldloc_0); return;
+				case 1: il.Emit (OpCodes.Ldloc_1); return;
+				case 2: il.Emit (OpCodes.Ldloc_2); return;
+				case 3: il.Emit (OpCodes.Ldloc_3); return;
+			}
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Ldloc_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Ldloc, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitSt (this ILGenerator il, Variable v)
+		{
+			switch (v.VarType) {
+				case VariableType.Arg:
+					EmitStarg (il, v);
+					break;
+				case VariableType.Local:
+					EmitStloc (il, v);
+					break;
+				default:
+					throw new ArgumentException ();
+			}
+		}
+
+		public static void EmitStarg (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Arg)
+				throw new ArgumentException ();
+
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Starg_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Starg, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitStloc (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Local)
+				throw new ArgumentException ();
+
+			switch (v.Index) {
+				case 0: il.Emit (OpCodes.Stloc_0); return;
+				case 1: il.Emit (OpCodes.Stloc_1); return;
+				case 2: il.Emit (OpCodes.Stloc_2); return;
+				case 3: il.Emit (OpCodes.Stloc_3); return;
+			}
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Stloc_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Stloc, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitLdc (this ILGenerator il, int v)
+		{
+			switch (v) {
+				case 0: il.Emit (OpCodes.Ldc_I4_0); return;
+				case 1: il.Emit (OpCodes.Ldc_I4_1); return;
+				case 2: il.Emit (OpCodes.Ldc_I4_2); return;
+				case 3: il.Emit (OpCodes.Ldc_I4_3); return;
+				case 4: il.Emit (OpCodes.Ldc_I4_4); return;
+				case 5: il.Emit (OpCodes.Ldc_I4_5); return;
+				case 6: il.Emit (OpCodes.Ldc_I4_6); return;
+				case 7: il.Emit (OpCodes.Ldc_I4_7); return;
+				case 8: il.Emit (OpCodes.Ldc_I4_8); return;
+				case -1: il.Emit (OpCodes.Ldc_I4_M1); return;
+			}
+			if (v <= sbyte.MaxValue && v >= sbyte.MinValue) {
+				il.Emit (OpCodes.Ldc_I4_S, (sbyte)v);
+			} else {
+				il.Emit (OpCodes.Ldc_I4, v);
+			}
+		}
+
+		public static void EmitLd_False (this ILGenerator il)
+		{
+			il.Emit (OpCodes.Ldc_I4_1);
+		}
+
+		public static void EmitLd_True (this ILGenerator il)
+		{
+			il.Emit (OpCodes.Ldc_I4_1);
+		}
+
+		public static void EmitLdstr (this ILGenerator il, string v)
+		{
+			il.Emit (OpCodes.Ldstr, v);
+		}
+
+		public static void EmitLdMember (this ILGenerator il, MemberInfo m)
+		{
+			if (m.MemberType == MemberTypes.Field) {
+				il.Emit (OpCodes.Ldfld, (FieldInfo)m);
+			} else if (m.MemberType == MemberTypes.Property) {
+				il.Emit (OpCodes.Callvirt, ((PropertyInfo)m).GetGetMethod (true));
+			} else {
+				throw new ArgumentException ();
+			}
+		}
+
+		public static void EmitStMember (this ILGenerator il, MemberInfo m)
+		{
+			if (m.MemberType == MemberTypes.Field) {
+				il.Emit (OpCodes.Stfld, (FieldInfo)m);
+			} else if (m.MemberType == MemberTypes.Property) {
+				il.Emit (OpCodes.Callvirt, ((PropertyInfo)m).GetSetMethod (true));
+			} else {
+				throw new ArgumentException ();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/PackILGenerator.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,386 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.Serialization;
+
+namespace MsgPack.Compiler
+{
+	static class PackILGenerator
+	{
+		#region Pack IL Generator
+		public static void EmitPackCode (Type type, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupPackMethod)
+		{
+			if (type.IsPrimitive || type.IsInterface)
+				throw new NotSupportedException ();
+
+			Variable arg_writer = Variable.CreateArg (0);
+			Variable arg_obj = Variable.CreateArg (1);
+			Variable local_i = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+
+			if (!type.IsValueType) { // null check
+				Label notNullLabel = il.DefineLabel ();
+				il.EmitLd (arg_obj);
+				il.Emit (OpCodes.Brtrue_S, notNullLabel);
+				il.EmitLd (arg_writer);
+				il.Emit (OpCodes.Call, typeof(MsgPackWriter).GetMethod("WriteNil", new Type[0]));
+				il.Emit (OpCodes.Ret);
+				il.MarkLabel (notNullLabel);
+			}
+
+			if (type.IsArray) {
+				EmitPackArrayCode (mi, il, type, arg_writer, arg_obj, local_i, lookupPackMethod);
+				goto FinallyProcess;
+			}
+
+			// MsgPackWriter.WriteMapHeader
+			MemberInfo[] members = targetMemberSelector (type);
+			il.EmitLd (arg_writer);
+			il.EmitLdc (members.Length);
+			il.Emit (OpCodes.Callvirt, typeof (MsgPackWriter).GetMethod("WriteMapHeader", new Type[]{typeof (int)}));
+
+			for (int i = 0; i < members.Length; i ++) {
+				MemberInfo m = members[i];
+				Type mt = m.GetMemberType ();
+
+				// write field-name
+				il.EmitLd (arg_writer);
+				il.EmitLdstr (memberNameFormatter (m));
+				il.EmitLd_True ();
+				il.Emit (OpCodes.Call, typeof (MsgPackWriter).GetMethod("Write", new Type[]{typeof (string), typeof (bool)}));
+
+				// write value
+				EmitPackMemberValueCode (mt, il, arg_writer, arg_obj, m, null, type, mi, lookupPackMethod);
+			}
+
+FinallyProcess:
+      il.Emit (OpCodes.Ret);
+		}
+
+		static void EmitPackArrayCode (MethodInfo mi, ILGenerator il, Type t, Variable var_writer, Variable var_obj, Variable var_loop, Func<Type, MethodInfo> lookupPackMethod)
+		{
+			Type et = t.GetElementType ();
+			il.EmitLd (var_writer, var_obj);
+			il.Emit (OpCodes.Ldlen);
+			il.Emit (OpCodes.Call, typeof(MsgPackWriter).GetMethod("WriteArrayHeader", new Type[]{ typeof(int) }));
+
+			Label beginLabel = il.DefineLabel ();
+			Label exprLabel = il.DefineLabel ();
+
+			// for-loop: init loop counter
+			il.EmitLdc (0);
+			il.EmitSt (var_loop);
+
+			// jump
+			il.Emit (OpCodes.Br_S, exprLabel);
+
+			// mark begin-label
+			il.MarkLabel (beginLabel);
+
+			// write element
+			EmitPackMemberValueCode (et, il, var_writer, var_obj, null, var_loop, t, mi, lookupPackMethod);
+
+			// increment loop-counter
+			il.EmitLd (var_loop);
+			il.Emit (OpCodes.Ldc_I4_1);
+			il.Emit (OpCodes.Add);
+			il.EmitSt (var_loop);
+
+			// mark expression label
+			il.MarkLabel (exprLabel);
+
+			// expression
+			il.EmitLd (var_loop, var_obj);
+			il.Emit (OpCodes.Ldlen);
+			il.Emit (OpCodes.Blt_S, beginLabel);
+		}
+
+		/// <param name="m">(optional)</param>
+		/// <param name="elementIdx">(optional)</param>
+		static void EmitPackMemberValueCode (Type type, ILGenerator il, Variable var_writer, Variable var_obj,
+			MemberInfo m, Variable elementIdx, Type currentType, MethodInfo currentMethod, Func<Type, MethodInfo> lookupPackMethod)
+		{
+			MethodInfo mi;
+			il.EmitLd (var_writer, var_obj);
+			if (m != null)
+				il.EmitLdMember (m);
+			if (elementIdx != null) {
+				il.EmitLd (elementIdx);
+				il.Emit (OpCodes.Ldelem, type);
+			}
+			if (type.IsPrimitive) {
+				mi = typeof(MsgPackWriter).GetMethod("Write", new Type[]{type});
+			} else {
+				if (currentType == type) {
+					mi = currentMethod;
+				} else {
+					mi = lookupPackMethod (type);
+				}
+			}
+			il.Emit (OpCodes.Call, mi);
+		}
+		#endregion
+
+		#region Unpack IL Generator
+		public static void EmitUnpackCode (Type type, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupUnpackMethod,
+			Func<Type, IDictionary<string,int>> lookupMemberMapping,
+			MethodInfo lookupMemberMappingMethod)
+		{
+			if (type.IsArray) {
+				EmitUnpackArrayCode (type, mi, il, targetMemberSelector, memberNameFormatter, lookupUnpackMethod);
+			} else {
+				EmitUnpackMapCode (type, mi, il, targetMemberSelector, memberNameFormatter, lookupUnpackMethod, lookupMemberMapping, lookupMemberMappingMethod);
+			}
+		}
+
+		static void EmitUnpackMapCode (Type type, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupUnpackMethod,
+			Func<Type, IDictionary<string,int>> lookupMemberMapping,
+			MethodInfo lookupMemberMappingMethod)
+		{
+			MethodInfo failedMethod = typeof (PackILGenerator).GetMethod ("UnpackFailed", BindingFlags.Static | BindingFlags.NonPublic);
+			MemberInfo[] members = targetMemberSelector (type);
+			IDictionary<string, int> member_mapping = lookupMemberMapping (type);
+			for (int i = 0; i < members.Length; i ++)
+				member_mapping.Add (memberNameFormatter (members[i]), i);
+
+			Variable msgpackReader = Variable.CreateArg (0);
+			Variable obj = Variable.CreateLocal (il.DeclareLocal (type));
+			Variable num_of_fields = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable loop_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable mapping = Variable.CreateLocal (il.DeclareLocal (typeof (IDictionary<string, int>)));
+			Variable switch_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable var_type = Variable.CreateLocal (il.DeclareLocal (typeof (Type)));
+
+			// if (!MsgPackReader.Read()) UnpackFailed ();
+			// if (MsgPackReader.Type == TypePrefixes.Nil) return null;
+			// if (!MsgPackReader.IsMap ()) UnpackFailed ();
+			EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsMap"), failedMethod, true);
+			
+			// type = typeof (T)
+			il.Emit (OpCodes.Ldtoken, type);
+			il.Emit (OpCodes.Call, typeof(Type).GetMethod ("GetTypeFromHandle"));
+			il.EmitSt (var_type);
+
+			// mapping = LookupMemberMapping (typeof (T))
+			il.EmitLd (var_type);
+			il.Emit (OpCodes.Call, lookupMemberMappingMethod);
+			il.EmitSt (mapping);
+
+			// object o = FormatterServices.GetUninitializedObject (Type);
+			il.EmitLd (var_type);
+			il.Emit (OpCodes.Call, typeof (FormatterServices).GetMethod ("GetUninitializedObject"));
+			il.Emit (OpCodes.Castclass, type);
+			il.EmitSt (obj);
+
+			// num_of_fields = (int)reader.Length
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Length").GetGetMethod ());
+			il.EmitSt (num_of_fields);
+
+			// Loop labels
+			Label lblLoopStart = il.DefineLabel ();
+			Label lblLoopExpr = il.DefineLabel ();
+			
+			// i = 0;
+			il.EmitLdc (0);
+			il.EmitSt (loop_idx);
+			il.Emit (OpCodes.Br, lblLoopExpr);
+			il.MarkLabel (lblLoopStart);
+
+			/* process */
+			// if (!MsgPackReader.Read() || !MsgPackReader.IsRaw()) UnpackFailed();
+			EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsRaw"), failedMethod, false);
+
+			// MsgPackReader.ReadRawString ()
+			// if (!Dictionary.TryGetValue (,)) UnpackFailed();
+			Label lbl3 = il.DefineLabel ();
+			il.EmitLd (mapping);
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetMethod ("ReadRawString", new Type[0]));
+			il.Emit (OpCodes.Ldloca_S, (byte)switch_idx.Index);
+			il.Emit (OpCodes.Callvirt, typeof (IDictionary<string,int>).GetMethod ("TryGetValue"));
+			il.Emit (OpCodes.Brtrue, lbl3);
+			il.Emit (OpCodes.Call, failedMethod);
+			il.MarkLabel (lbl3);
+
+			// switch
+			Label[] switchCases = new Label[members.Length];
+			for (int i = 0; i < switchCases.Length; i ++)
+				switchCases[i] = il.DefineLabel ();
+			Label switchCaseEndLabel = il.DefineLabel ();
+			il.EmitLd (switch_idx);
+			il.Emit (OpCodes.Switch, switchCases);
+			il.Emit (OpCodes.Call, failedMethod);
+
+			for (int i = 0; i < switchCases.Length; i ++) {
+				il.MarkLabel (switchCases[i]);
+				MemberInfo minfo = members[i];
+				Type mt = minfo.GetMemberType ();
+				MethodInfo unpack_method = lookupUnpackMethod (mt);
+				il.EmitLd (obj);
+				il.EmitLd (msgpackReader);
+				il.Emit (OpCodes.Call, unpack_method);
+				il.EmitStMember (minfo);
+				il.Emit (OpCodes.Br, switchCaseEndLabel);
+			}
+			il.MarkLabel (switchCaseEndLabel);
+
+			// i ++
+			il.EmitLd (loop_idx);
+			il.EmitLdc (1);
+			il.Emit (OpCodes.Add);
+			il.EmitSt (loop_idx);
+
+			// i < num_of_fields;
+			il.MarkLabel (lblLoopExpr);
+			il.EmitLd (loop_idx);
+			il.EmitLd (num_of_fields);
+			il.Emit (OpCodes.Blt, lblLoopStart);
+			
+			// return
+			il.EmitLd (obj);
+			il.Emit (OpCodes.Ret);
+		}
+
+		static void EmitUnpackArrayCode (Type arrayType, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupUnpackMethod)
+		{
+			Type elementType = arrayType.GetElementType ();
+			MethodInfo failedMethod = typeof (PackILGenerator).GetMethod ("UnpackFailed", BindingFlags.Static | BindingFlags.NonPublic);
+
+			Variable msgpackReader = Variable.CreateArg (0);
+			Variable obj = Variable.CreateLocal (il.DeclareLocal (arrayType));
+			Variable num_of_elements = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable loop_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable type = Variable.CreateLocal (il.DeclareLocal (typeof (Type)));
+
+			// if (!MsgPackReader.Read() || !MsgPackReader.IsArray ()) UnpackFailed ();
+			EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsArray"), failedMethod, true);
+
+			// type = typeof (T)
+			il.Emit (OpCodes.Ldtoken, elementType);
+			il.Emit (OpCodes.Call, typeof(Type).GetMethod ("GetTypeFromHandle"));
+			il.EmitSt (type);
+
+			// num_of_elements = (int)reader.Length
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Length").GetGetMethod ());
+			il.EmitSt (num_of_elements);
+
+			// object o = Array.CreateInstance (Type, Length);
+			il.EmitLd (type);
+			il.EmitLd (num_of_elements);
+			il.Emit (OpCodes.Call, typeof (Array).GetMethod ("CreateInstance", new Type[] {typeof (Type), typeof (int)}));
+			il.Emit (OpCodes.Castclass, arrayType);
+			il.EmitSt (obj);
+
+			// Unpack element method
+			MethodInfo unpack_method = lookupUnpackMethod (elementType);
+
+			// Loop labels
+			Label lblLoopStart = il.DefineLabel ();
+			Label lblLoopExpr = il.DefineLabel ();
+			
+			// i = 0;
+			il.EmitLdc (0);
+			il.EmitSt (loop_idx);
+			il.Emit (OpCodes.Br, lblLoopExpr);
+			il.MarkLabel (lblLoopStart);
+
+			/* process */
+			il.EmitLd (obj, loop_idx);
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, unpack_method);
+			il.Emit (OpCodes.Stelem, elementType);
+
+			// i ++
+			il.EmitLd (loop_idx);
+			il.EmitLdc (1);
+			il.Emit (OpCodes.Add);
+			il.EmitSt (loop_idx);
+
+			// i < num_of_fields;
+			il.MarkLabel (lblLoopExpr);
+			il.EmitLd (loop_idx);
+			il.EmitLd (num_of_elements);
+			il.Emit (OpCodes.Blt, lblLoopStart);
+			
+			// return
+			il.EmitLd (obj);
+			il.Emit (OpCodes.Ret);
+		}
+
+		static void EmitUnpackReadAndTypeCheckCode (ILGenerator il, Variable msgpackReader, MethodInfo typeCheckMethod, MethodInfo failedMethod, bool nullCheckAndReturn)
+		{
+			Label lblFailed = il.DefineLabel ();
+			Label lblNullReturn = nullCheckAndReturn ? il.DefineLabel () : default(Label);
+			Label lblPassed = il.DefineLabel ();
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetMethod ("Read"));
+			il.Emit (OpCodes.Brfalse_S, lblFailed);
+			if (nullCheckAndReturn) {
+				il.EmitLd (msgpackReader);
+				il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Type").GetGetMethod ());
+				il.EmitLdc ((int)TypePrefixes.Nil);
+				il.Emit (OpCodes.Beq_S, lblNullReturn);
+			}
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeCheckMethod);
+			il.Emit (OpCodes.Brtrue_S, lblPassed);
+			il.Emit (OpCodes.Br, lblFailed);
+			if (nullCheckAndReturn) {
+				il.MarkLabel (lblNullReturn);
+				il.Emit (OpCodes.Ldnull);
+				il.Emit (OpCodes.Ret);
+			}
+			il.MarkLabel (lblFailed);
+			il.Emit (OpCodes.Call, failedMethod);
+			il.MarkLabel (lblPassed);
+		}
+		
+		/// <summary>Exception Helper</summary>
+		internal static void UnpackFailed ()
+		{
+			throw new FormatException ();
+		}
+		#endregion
+
+		#region Misc
+		static Type GetMemberType (this MemberInfo mi)
+		{
+			if (mi.MemberType == MemberTypes.Field)
+				return ((FieldInfo)mi).FieldType;
+			if (mi.MemberType == MemberTypes.Property)
+				return ((PropertyInfo)mi).PropertyType;
+			throw new ArgumentException ();
+		}
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/Variable.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,42 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System.Reflection.Emit;
+
+namespace MsgPack.Compiler
+{
+	public class Variable
+	{
+		Variable (VariableType type, int index)
+		{
+			this.VarType = type;
+			this.Index = index;
+		}
+
+		public static Variable CreateLocal (LocalBuilder local)
+		{
+			return new Variable (VariableType.Local, local.LocalIndex);
+		}
+
+		public static Variable CreateArg (int idx)
+		{
+			return new Variable (VariableType.Arg, idx);
+		}
+
+		public VariableType VarType { get; set; }
+		public int Index { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/VariableType.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,24 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+namespace MsgPack.Compiler
+{
+	public enum VariableType
+	{
+		Local,
+		Arg
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackReader.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,258 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.IO;
+using System.Text;
+
+namespace MsgPack
+{
+	public class MsgPackReader
+	{
+		Stream _strm;
+		byte[] _tmp0 = new byte[8];
+		byte[] _tmp1 = new byte[8];
+
+		Encoding _encoding = Encoding.UTF8;
+		//Decoder _decoder = Encoding.UTF8.GetDecoder ();
+		byte[] _buf = new byte[64];
+
+		public MsgPackReader (Stream strm)
+		{
+			_strm = strm;
+		}
+
+		public TypePrefixes Type { get; private set; }
+
+		public bool ValueBoolean { get; private set; }
+		public uint Length { get; private set; }
+
+		public uint ValueUnsigned { get; private set; }
+		public ulong ValueUnsigned64 { get; private set; }
+
+		public int ValueSigned { get; private set; }
+		public long ValueSigned64 { get; private set; }
+
+		public float ValueFloat { get; private set; }
+		public double ValueDouble { get; private set; }
+
+		public bool IsSigned ()
+		{
+			return this.Type == TypePrefixes.NegativeFixNum ||
+				this.Type == TypePrefixes.PositiveFixNum ||
+				this.Type == TypePrefixes.Int8 ||
+				this.Type == TypePrefixes.Int16 ||
+				this.Type == TypePrefixes.Int32;
+		}
+
+		public bool IsBoolean ()
+		{
+			return this.Type == TypePrefixes.True || this.Type == TypePrefixes.False;
+		}
+
+		public bool IsSigned64 ()
+		{
+			return this.Type == TypePrefixes.Int64;
+		}
+
+		public bool IsUnsigned ()
+		{
+			return this.Type == TypePrefixes.PositiveFixNum ||
+				this.Type == TypePrefixes.UInt8 ||
+				this.Type == TypePrefixes.UInt16 ||
+				this.Type == TypePrefixes.UInt32;
+		}
+
+		public bool IsUnsigned64 ()
+		{
+			return this.Type == TypePrefixes.UInt64;
+		}
+
+		public bool IsRaw ()
+		{
+			return this.Type == TypePrefixes.FixRaw || this.Type == TypePrefixes.Raw16 || this.Type == TypePrefixes.Raw32;
+		}
+
+		public bool IsArray ()
+		{
+			return this.Type == TypePrefixes.FixArray || this.Type == TypePrefixes.Array16 || this.Type == TypePrefixes.Array32;
+		}
+
+		public bool IsMap ()
+		{
+			return this.Type == TypePrefixes.FixMap || this.Type == TypePrefixes.Map16 || this.Type == TypePrefixes.Map32;
+		}
+
+		public bool Read ()
+		{
+			byte[] tmp0 = _tmp0, tmp1 = _tmp1;
+			int x = _strm.ReadByte ();
+			if (x < 0)
+				return false; // EOS
+			
+			if (x >= 0x00 && x <= 0x7f) {
+				this.Type = TypePrefixes.PositiveFixNum;
+			} else if (x >= 0xe0 && x <= 0xff) {
+				this.Type = TypePrefixes.NegativeFixNum;
+			} else if (x >= 0xa0 && x <= 0xbf) {
+				this.Type = TypePrefixes.FixRaw;
+			} else if (x >= 0x90 && x <= 0x9f) {
+				this.Type = TypePrefixes.FixArray;
+			} else if (x >= 0x80 && x <= 0x8f) {
+				this.Type = TypePrefixes.FixMap;
+			} else {
+				this.Type = (TypePrefixes)x;
+			}
+
+			switch (this.Type) {
+				case TypePrefixes.Nil:
+					break;
+				case TypePrefixes.False:
+					ValueBoolean = false;
+					break;
+				case TypePrefixes.True:
+					ValueBoolean = true;
+					break;
+				case TypePrefixes.Float:
+					_strm.Read (tmp0, 0, 4);
+					if (BitConverter.IsLittleEndian) {
+						tmp1[0] = tmp0[3];
+						tmp1[1] = tmp0[2];
+						tmp1[2] = tmp0[1];
+						tmp1[3] = tmp0[0];
+						ValueFloat = BitConverter.ToSingle (tmp1, 0);
+					} else {
+						ValueFloat = BitConverter.ToSingle (tmp0, 0);
+					}
+					break;
+				case TypePrefixes.Double:
+					_strm.Read (tmp0, 0, 8);
+					if (BitConverter.IsLittleEndian) {
+						tmp1[0] = tmp0[7];
+						tmp1[1] = tmp0[6];
+						tmp1[2] = tmp0[5];
+						tmp1[3] = tmp0[4];
+						tmp1[4] = tmp0[3];
+						tmp1[5] = tmp0[2];
+						tmp1[6] = tmp0[1];
+						tmp1[7] = tmp0[0];
+						ValueDouble = BitConverter.ToDouble (tmp1, 0);
+					} else {
+						ValueDouble = BitConverter.ToDouble (tmp0, 0);
+					}
+					break;
+				case TypePrefixes.NegativeFixNum:
+					ValueSigned = (x & 0x1f) - 0x20;
+					break;
+				case TypePrefixes.PositiveFixNum:
+					ValueSigned = x & 0x7f;
+					ValueUnsigned = (uint)ValueSigned;
+					break;
+				case TypePrefixes.UInt8:
+					x = _strm.ReadByte ();
+					if (x < 0)
+						throw new FormatException ();
+					ValueUnsigned = (uint)x;
+					break;
+				case TypePrefixes.UInt16:
+					if (_strm.Read (tmp0, 0, 2) != 2)
+						throw new FormatException ();
+					ValueUnsigned = ((uint)tmp0[0] << 8) | (uint)tmp0[1];
+					break;
+				case TypePrefixes.UInt32:
+					if (_strm.Read (tmp0, 0, 4) != 4)
+						throw new FormatException ();
+					ValueUnsigned = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3];
+					break;
+				case TypePrefixes.UInt64:
+					if (_strm.Read (tmp0, 0, 8) != 8)
+						throw new FormatException ();
+					ValueUnsigned64 = ((ulong)tmp0[0] << 56) | ((ulong)tmp0[1] << 48) | ((ulong)tmp0[2] << 40) | ((ulong)tmp0[3] << 32) | ((ulong)tmp0[4] << 24) | ((ulong)tmp0[5] << 16) | ((ulong)tmp0[6] << 8) | (ulong)tmp0[7];
+					break;
+				case TypePrefixes.Int8:
+					x = _strm.ReadByte ();
+					if (x < 0)
+						throw new FormatException ();
+					ValueSigned = (sbyte)x;
+					break;
+				case TypePrefixes.Int16:
+					if (_strm.Read (tmp0, 0, 2) != 2)
+						throw new FormatException ();
+					ValueSigned = (short)((tmp0[0] << 8) | tmp0[1]);
+					break;
+				case TypePrefixes.Int32:
+					if (_strm.Read (tmp0, 0, 4) != 4)
+						throw new FormatException ();
+					ValueSigned = (tmp0[0] << 24) | (tmp0[1] << 16) | (tmp0[2] << 8) | tmp0[3];
+					break;
+				case TypePrefixes.Int64:
+					if (_strm.Read (tmp0, 0, 8) != 8)
+						throw new FormatException ();
+					ValueSigned64 = ((long)tmp0[0] << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32) | ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7];
+					break;
+				case TypePrefixes.FixRaw:
+					Length = (uint)(x & 0x1f);
+					break;
+				case TypePrefixes.FixArray:
+				case TypePrefixes.FixMap:
+					Length = (uint)(x & 0xf);
+					break;
+				case TypePrefixes.Raw16:
+				case TypePrefixes.Array16:
+				case TypePrefixes.Map16:
+					if (_strm.Read (tmp0, 0, 2) != 2)
+						throw new FormatException ();
+					Length = ((uint)tmp0[0] << 8) | (uint)tmp0[1];
+					break;
+				case TypePrefixes.Raw32:
+				case TypePrefixes.Array32:
+				case TypePrefixes.Map32:
+					if (_strm.Read (tmp0, 0, 4) != 4)
+						throw new FormatException ();
+					Length = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3];
+					break;
+				default:
+					throw new FormatException ();
+			}
+			return true;
+		}
+
+		public int ReadValueRaw (byte[] buf, int offset, int count)
+		{
+			return _strm.Read (buf, offset, count);
+		}
+
+		public string ReadRawString ()
+		{
+			return ReadRawString (_buf);
+		}
+
+		public string ReadRawString (byte[] buf)
+		{
+			if (this.Length < buf.Length) {
+				if (ReadValueRaw (buf, 0, (int)this.Length) != this.Length)
+					throw new FormatException ();
+				return _encoding.GetString (buf, 0, (int)this.Length);
+			}
+
+			// Poor implementation
+			byte[] tmp = new byte[(int)this.Length];
+			if (ReadValueRaw (tmp, 0, tmp.Length) != tmp.Length)
+				throw new FormatException ();
+			return _encoding.GetString (tmp);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackWriter.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,321 @@
+//
+// Copyright 2011 Kazuki Oikawa, Kazunari Kida
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.IO;
+using System.Text;
+
+namespace MsgPack
+{
+	public class MsgPackWriter
+	{
+		Stream _strm;
+		//Encoding _encoding = Encoding.UTF8;
+		Encoder _encoder = Encoding.UTF8.GetEncoder ();
+		byte[] _tmp = new byte[9];
+		byte[] _buf = new byte[64];
+
+		public MsgPackWriter (Stream strm)
+		{
+			_strm = strm;
+		}
+
+		public void Write (byte x)
+		{
+			if (x < 128) {
+				_strm.WriteByte (x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xcc; 
+				tmp[1] = x;
+				_strm.Write (tmp, 0, 2);
+			}
+		}
+
+		public void Write (ushort x)
+		{
+			if (x < 0x100) {
+				Write ((byte)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xcd; 
+				tmp[1] = (byte)(x >> 8);
+				tmp[2] = (byte)x;
+				_strm.Write (tmp, 0, 3);
+			}
+		}
+
+		public void Write (char x)
+		{
+			Write ((ushort)x);
+		}
+
+		public void Write (uint x)
+		{
+			if (x < 0x10000) {
+				Write ((ushort)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xce; 
+				tmp[1] = (byte)(x >> 24);
+				tmp[2] = (byte)(x >> 16);
+				tmp[3] = (byte)(x >>  8);
+				tmp[4] = (byte)x;
+				_strm.Write (tmp, 0, 5);
+			}
+		}
+
+		public void Write (ulong x)
+		{
+			if (x < 0x100000000) {
+				Write ((uint)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xcf; 
+				tmp[1] = (byte)(x >> 56);
+				tmp[2] = (byte)(x >> 48);
+				tmp[3] = (byte)(x >> 40);
+				tmp[4] = (byte)(x >> 32);
+				tmp[5] = (byte)(x >> 24);
+				tmp[6] = (byte)(x >> 16);
+				tmp[7] = (byte)(x >>  8);
+				tmp[8] = (byte)x;
+				_strm.Write (tmp, 0, 9);
+			}
+		}
+
+		public void Write (sbyte x)
+		{
+			if (x >= -32 && x <= -1) {
+				_strm.WriteByte ((byte)(0xe0 | (byte)x));
+			} else if (x >= 0 && x <= 127) {
+				_strm.WriteByte ((byte)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd0;
+				tmp[1] = (byte)x;
+				_strm.Write (tmp, 0, 2);
+			}
+		}
+
+		public void Write (short x)
+		{
+			if (x >= sbyte.MinValue && x <= sbyte.MaxValue) {
+				Write ((sbyte)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd1;
+				tmp[1] = (byte)(x >> 8);
+				tmp[2] = (byte)x;
+				_strm.Write (tmp, 0, 3);
+			}
+		}
+
+		public void Write (int x)
+		{
+			if (x >= short.MinValue && x <= short.MaxValue) {
+				Write ((short)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd2;
+				tmp[1] = (byte)(x >> 24);
+				tmp[2] = (byte)(x >> 16);
+				tmp[3] = (byte)(x >> 8);
+				tmp[4] = (byte)x;
+				_strm.Write (tmp, 0, 5);
+			}
+		}
+
+		public void Write (long x)
+		{
+			if (x >= int.MinValue && x <= int.MaxValue) {
+				Write ((int)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd3;
+				tmp[1] = (byte)(x >> 56);
+				tmp[2] = (byte)(x >> 48);
+				tmp[3] = (byte)(x >> 40);
+				tmp[4] = (byte)(x >> 32);
+				tmp[5] = (byte)(x >> 24);
+				tmp[6] = (byte)(x >> 16);
+				tmp[7] = (byte)(x >> 8);
+				tmp[8] = (byte)x;
+				_strm.Write (tmp, 0, 9);
+			}
+		}
+
+		public void WriteNil ()
+		{
+			_strm.WriteByte (0xc0);
+		}
+
+		public void Write (bool x)
+		{
+			_strm.WriteByte ((byte)(x ? 0xc3 : 0xc2));
+		}
+
+		public void Write (float x)
+		{
+			byte[] raw = BitConverter.GetBytes (x); // unsafeコードを使う?
+			byte[] tmp = _tmp;
+
+			tmp[0] = 0xca;
+			if (BitConverter.IsLittleEndian) {
+				tmp[1] = raw[3];
+				tmp[2] = raw[2];
+				tmp[3] = raw[1];
+				tmp[4] = raw[0];
+			} else {
+				tmp[1] = raw[0];
+				tmp[2] = raw[1];
+				tmp[3] = raw[2];
+				tmp[4] = raw[3];
+			}
+			_strm.Write (tmp, 0, 5);
+		}
+
+		public void Write (double x)
+		{
+			byte[] raw = BitConverter.GetBytes (x); // unsafeコードを使う?
+			byte[] tmp = _tmp;
+
+			tmp[0] = 0xcb;
+			if (BitConverter.IsLittleEndian) {
+				tmp[1] = raw[7];
+				tmp[2] = raw[6];
+				tmp[3] = raw[5];
+				tmp[4] = raw[4];
+				tmp[5] = raw[3];
+				tmp[6] = raw[2];
+				tmp[7] = raw[1];
+				tmp[8] = raw[0];
+			} else {
+				tmp[1] = raw[0];
+				tmp[2] = raw[1];
+				tmp[3] = raw[2];
+				tmp[4] = raw[3];
+				tmp[5] = raw[4];
+				tmp[6] = raw[5];
+				tmp[7] = raw[6];
+				tmp[8] = raw[7];
+			}
+			_strm.Write (tmp, 0, 9);
+		}
+		
+		public void Write (byte[] bytes)
+		{
+			WriteRawHeader (bytes.Length);
+			_strm.Write (bytes, 0, bytes.Length);
+		}
+
+		public void WriteRawHeader (int N)
+		{
+			WriteLengthHeader (N, 32, 0xa0, 0xda, 0xdb);
+		}
+
+		public void WriteArrayHeader (int N)
+		{
+			WriteLengthHeader (N, 16, 0x90, 0xdc, 0xdd);
+		}
+
+		public void WriteMapHeader (int N)
+		{
+			WriteLengthHeader (N, 16, 0x80, 0xde, 0xdf);
+		}
+
+		void WriteLengthHeader (int N, int fix_length, byte fix_prefix, byte len16bit_prefix, byte len32bit_prefix)
+		{
+			if (N < fix_length) {
+				_strm.WriteByte ((byte)(fix_prefix | N));
+			} else {
+				byte[] tmp = _tmp;
+				int header_len;
+				if (N < 0x10000) {
+					tmp[0] = len16bit_prefix;
+					tmp[1] = (byte)(N >> 8);
+					tmp[2] = (byte)N;
+					header_len = 3;
+				} else {
+					tmp[0] = len32bit_prefix;
+					tmp[1] = (byte)(N >> 24);
+					tmp[2] = (byte)(N >> 16);
+					tmp[3] = (byte)(N >>  8);
+					tmp[4] = (byte)N;
+					header_len = 5;
+				}
+				_strm.Write (tmp, 0, header_len);
+			}
+		}
+
+		public void Write (string x)
+		{
+			Write (x, false);
+		}
+		
+		public void Write (string x, bool highProbAscii)
+		{
+			Write (x, _buf, highProbAscii);
+		}
+
+		public void Write (string x, byte[] buf)
+		{
+			Write (x, buf, false);
+		}
+
+		public void Write (string x, byte[] buf, bool highProbAscii)
+		{
+			Encoder encoder = _encoder;
+			//fixed (char *pstr = x)
+			//fixed (byte *pbuf = buf) {
+			char[] str = x.ToCharArray();
+				if (highProbAscii && x.Length <= buf.Length) {
+					bool isAsciiFullCompatible = true;
+					for (int i = 0; i < x.Length; i ++) { 
+						//int v = (int)pstr[i];
+						int v = (int)(x[i]);
+						if (v > 0x7f) {
+							isAsciiFullCompatible = false;
+							break;
+						}
+						buf[i] = (byte)v;
+					}
+					if (isAsciiFullCompatible) {
+						WriteRawHeader (x.Length);
+						_strm.Write (buf, 0, x.Length);
+						return;
+					}
+				}
+
+				//WriteRawHeader (encoder.GetByteCount (pstr, x.Length, true));
+				WriteRawHeader (encoder.GetByteCount (str, 0, x.Length, true));
+				int str_len = x.Length;
+				//char *p = pstr;
+				int convertedChars, bytesUsed;
+				bool completed = true;
+				int j = 0;
+				while (str_len > 0 || !completed) {
+					//encoder.Convert (p, str_len, pbuf, buf.Length, false, out convertedChars, out bytesUsed, out completed);
+					encoder.Convert (str, j, str_len, buf, 0, buf.Length, false, out convertedChars, out bytesUsed, out completed);
+					_strm.Write (buf, 0, bytesUsed);
+					str_len -= convertedChars;
+					//p += convertedChars;
+					j += convertedChars;
+				}
+			//}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ObjectPacker.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,259 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Text;
+
+namespace MsgPack
+{
+	public class ObjectPacker
+	{
+		byte[] _buf = new byte[64];
+		//Encoding _encoding = Encoding.UTF8;
+		static Dictionary<Type, PackDelegate> PackerMapping;
+		static Dictionary<Type, UnpackDelegate> UnpackerMapping;
+
+		delegate void PackDelegate (ObjectPacker packer, MsgPackWriter writer, object o);
+		delegate object UnpackDelegate (ObjectPacker packer, MsgPackReader reader);
+
+		static ObjectPacker ()
+		{
+			PackerMapping = new Dictionary<Type, PackDelegate> ();
+			UnpackerMapping = new Dictionary<Type, UnpackDelegate> ();
+
+			PackerMapping.Add (typeof (string), StringPacker);
+			UnpackerMapping.Add (typeof (string), StringUnpacker);
+		}
+
+		public byte[] Pack (object o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		public void Pack (Stream strm, object o)
+		{
+			if (o != null && o.GetType ().IsPrimitive)
+				throw new NotSupportedException ();
+			MsgPackWriter writer = new MsgPackWriter (strm);
+			Pack (writer, o);
+		}
+
+		void Pack (MsgPackWriter writer, object o)
+		{
+			if (o == null) {
+				writer.WriteNil ();
+				return;
+			}
+
+			Type t = o.GetType ();
+			if (t.IsPrimitive) {
+				if (t.Equals (typeof (int))) writer.Write ((int)o);
+				else if (t.Equals (typeof (uint))) writer.Write ((uint)o);
+				else if (t.Equals (typeof (float))) writer.Write ((float)o);
+				else if (t.Equals (typeof (double))) writer.Write ((double)o);
+				else if (t.Equals (typeof (long))) writer.Write ((long)o);
+				else if (t.Equals (typeof (ulong))) writer.Write ((ulong)o);
+				else if (t.Equals (typeof (bool))) writer.Write ((bool)o);
+				else if (t.Equals (typeof (byte))) writer.Write ((byte)o);
+				else if (t.Equals (typeof (sbyte))) writer.Write ((sbyte)o);
+				else if (t.Equals (typeof (short))) writer.Write ((short)o);
+				else if (t.Equals (typeof (ushort))) writer.Write ((ushort)o);
+				else if (t.Equals (typeof (char))) writer.Write ((ushort)(char)o);
+				else throw new NotSupportedException ();
+				return;
+			}
+
+			PackDelegate packer;
+			if (PackerMapping.TryGetValue (t, out packer)) {
+				packer (this, writer, o);
+				return;
+			}
+
+			if (t.IsArray) {
+				Array ary = (Array)o;
+				writer.WriteArrayHeader (ary.Length);
+				for (int i = 0; i < ary.Length; i ++)
+					Pack (writer, ary.GetValue (i));
+				return;
+			}
+
+			ReflectionCacheEntry entry = ReflectionCache.Lookup (t);
+			writer.WriteMapHeader (entry.FieldMap.Count);
+			foreach (KeyValuePair<string, FieldInfo> pair in entry.FieldMap) {
+				writer.Write (pair.Key, _buf);
+				object v = pair.Value.GetValue (o);
+				if (pair.Value.FieldType.IsInterface && v != null) {
+					writer.WriteArrayHeader (2);
+					writer.Write (v.GetType().FullName);
+				}
+				Pack (writer, v);
+			}
+		}
+
+		public T Unpack<T> (byte[] buf)
+		{
+			return Unpack<T> (buf, 0, buf.Length);
+		}
+
+		public T Unpack<T> (byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack<T> (ms);
+			}
+		}
+
+		public T Unpack<T> (Stream strm)
+		{
+			if (typeof (T).IsPrimitive)
+				throw new NotSupportedException ();
+			MsgPackReader reader = new MsgPackReader (strm);
+			return (T)Unpack (reader, typeof (T));
+		}
+
+		public object Unpack (Type type, byte[] buf)
+		{
+			return Unpack (type, buf, 0, buf.Length);
+		}
+
+		public object Unpack (Type type, byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack (type, ms);
+			}
+		}
+
+		public object Unpack (Type type, Stream strm)
+		{
+			if (type.IsPrimitive)
+				throw new NotSupportedException ();
+			MsgPackReader reader = new MsgPackReader (strm);
+			return Unpack (reader, type);
+		}
+
+		object Unpack (MsgPackReader reader, Type t)
+		{
+			if (t.IsPrimitive) {
+				if (!reader.Read ()) throw new FormatException ();
+				if (t.Equals (typeof (int)) && reader.IsSigned ()) return reader.ValueSigned;
+				else if (t.Equals (typeof (uint)) && reader.IsUnsigned ()) return reader.ValueUnsigned;
+				else if (t.Equals (typeof (float)) && reader.Type == TypePrefixes.Float) return reader.ValueFloat;
+				else if (t.Equals (typeof (double)) && reader.Type == TypePrefixes.Double) return reader.ValueDouble;
+				else if (t.Equals (typeof (long))) {
+					if (reader.IsSigned64 ())
+						return reader.ValueSigned64;
+					if (reader.IsSigned ())
+						return (long)reader.ValueSigned;
+				} else if (t.Equals (typeof (ulong))) {
+					if (reader.IsUnsigned64 ())
+						return reader.ValueUnsigned64;
+					if (reader.IsUnsigned ())
+						return (ulong)reader.ValueUnsigned;
+				} else if (t.Equals (typeof (bool)) && reader.IsBoolean ()) return (reader.Type == TypePrefixes.True);
+				else if (t.Equals (typeof (byte)) && reader.IsUnsigned ()) return (byte)reader.ValueUnsigned;
+				else if (t.Equals (typeof (sbyte)) && reader.IsSigned ()) return (sbyte)reader.ValueSigned;
+				else if (t.Equals (typeof (short)) && reader.IsSigned ()) return (short)reader.ValueSigned;
+				else if (t.Equals (typeof (ushort)) && reader.IsUnsigned ()) return (ushort)reader.ValueUnsigned;
+				else if (t.Equals (typeof (char)) && reader.IsUnsigned ()) return (char)reader.ValueUnsigned;
+				else throw new NotSupportedException ();
+			}
+
+			UnpackDelegate unpacker;
+			if (UnpackerMapping.TryGetValue (t, out unpacker))
+				return unpacker (this, reader);
+
+			if (t.IsArray) {
+				if (!reader.Read () || (!reader.IsArray () && reader.Type != TypePrefixes.Nil))
+					throw new FormatException ();
+				if (reader.Type == TypePrefixes.Nil)
+					return null;
+				Type et = t.GetElementType ();
+				Array ary = Array.CreateInstance (et, (int)reader.Length);
+				for (int i = 0; i < ary.Length; i ++)
+					ary.SetValue (Unpack (reader, et), i);
+				return ary;
+			}
+
+			if (!reader.Read ())
+				throw new FormatException ();
+			if (reader.Type == TypePrefixes.Nil)
+					return null;
+			if (t.IsInterface) {
+				if (reader.Type != TypePrefixes.FixArray && reader.Length != 2)
+					throw new FormatException ();
+				if (!reader.Read () || !reader.IsRaw ())
+					throw new FormatException ();
+				CheckBufferSize ((int)reader.Length);
+				reader.ReadValueRaw (_buf, 0, (int)reader.Length);
+				t = Type.GetType (Encoding.UTF8.GetString (_buf, 0, (int)reader.Length));
+				if (!reader.Read () || reader.Type == TypePrefixes.Nil)
+					throw new FormatException ();
+			}
+			if (!reader.IsMap ())
+				throw new FormatException ();
+
+			object o = FormatterServices.GetUninitializedObject (t);
+			ReflectionCacheEntry entry = ReflectionCache.Lookup (t);
+			int members = (int)reader.Length;
+			for (int i = 0; i < members; i ++) {
+				if (!reader.Read () || !reader.IsRaw ())
+					throw new FormatException ();
+				CheckBufferSize ((int)reader.Length);
+				reader.ReadValueRaw (_buf, 0, (int)reader.Length);
+				string name = Encoding.UTF8.GetString (_buf, 0, (int)reader.Length);
+				FieldInfo f;
+				if (!entry.FieldMap.TryGetValue (name, out f))
+					throw new FormatException ();
+				f.SetValue (o, Unpack (reader, f.FieldType));
+			}
+
+			IDeserializationCallback callback = o as IDeserializationCallback;
+			if (callback != null)
+				callback.OnDeserialization (this);
+			return o;
+		}
+
+		void CheckBufferSize (int size)
+		{
+			if (_buf.Length < size)
+				Array.Resize<byte> (ref _buf, size);
+		}
+
+		static void StringPacker (ObjectPacker packer, MsgPackWriter writer, object o)
+		{
+			writer.Write (Encoding.UTF8.GetBytes ((string)o));
+		}
+
+		static object StringUnpacker (ObjectPacker packer, MsgPackReader reader)
+		{
+			if (!reader.Read ())
+				throw new FormatException ();
+			if (reader.Type == TypePrefixes.Nil)
+				return null;
+			if (!reader.IsRaw ())
+				throw new FormatException ();
+			packer.CheckBufferSize ((int)reader.Length);
+			reader.ReadValueRaw (packer._buf, 0, (int)reader.Length);
+			return Encoding.UTF8.GetString (packer._buf, 0, (int)reader.Length);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCache.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,60 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+
+namespace MsgPack
+{
+	public static class ReflectionCache
+	{
+		static Dictionary<Type, ReflectionCacheEntry> _cache;
+
+		static ReflectionCache ()
+		{
+			_cache = new Dictionary<Type,ReflectionCacheEntry> ();
+		}
+
+		public static ReflectionCacheEntry Lookup (Type type)
+		{
+			ReflectionCacheEntry entry;
+			lock (_cache) {
+				if (_cache.TryGetValue (type, out entry))
+					return entry;
+			}
+
+			entry = new ReflectionCacheEntry (type);
+			lock (_cache) {
+				_cache[type] = entry;
+			}
+			return entry;
+		}
+
+		public static void RemoveCache (Type type)
+		{
+			lock (_cache) {
+				_cache.Remove (type);
+			}
+		}
+
+		public static void Clear ()
+		{
+			lock (_cache) {
+				_cache.Clear ();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCacheEntry.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,44 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace MsgPack
+{
+	public class ReflectionCacheEntry
+	{
+		const BindingFlags FieldBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.SetField;
+		
+		public ReflectionCacheEntry (Type t)
+		{
+			FieldInfo[] fields = t.GetFields (FieldBindingFlags);
+			IDictionary<string, FieldInfo> map = new Dictionary<string, FieldInfo> (fields.Length);
+			for (int i = 0; i < fields.Length; i ++) {
+				FieldInfo f = fields[i];
+				string name = f.Name;
+				int pos;
+				if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1)
+					name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) <ab>
+				map[name] = f;
+			}
+			FieldMap = map;
+		}
+
+		public IDictionary<string, FieldInfo> FieldMap { get; private set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/TypePrefixes.cs	Sun Oct 23 04:37:16 2016 +0900
@@ -0,0 +1,48 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+namespace MsgPack
+{
+	public enum TypePrefixes : byte
+	{
+		PositiveFixNum = 0x00, // 0x00 - 0x7f
+		NegativeFixNum = 0xe0, // 0xe0 - 0xff
+
+		Nil = 0xc0,
+		False = 0xc2,
+		True = 0xc3,
+		Float = 0xca,
+		Double = 0xcb,
+		UInt8 = 0xcc,
+		UInt16 = 0xcd,
+		UInt32 = 0xce,
+		UInt64 = 0xcf,
+		Int8 = 0xd0,
+		Int16 = 0xd1,
+		Int32 = 0xd2,
+		Int64 = 0xd3,
+		Raw16 = 0xda,
+		Raw32 = 0xdb,
+		Array16 = 0xdc,
+		Array32 = 0xdd,
+		Map16 = 0xde,
+		Map32 = 0xdf,
+
+		FixRaw = 0xa0,   // 0xa0 - 0xbf
+		FixArray = 0x90, // 0x90 - 0x9f
+		FixMap = 0x80,   // 0x80 - 0x8f
+	}
+}