changeset 0:a2f0a2c135cf

hg init
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Sun, 06 Jun 2010 22:00:38 +0900
parents
children 0b233d5d1944
files Algorithm/Diff.pm Cassandra/CassHash.pm Cassandra/lib/Cassandra/Cassandra.pm Cassandra/lib/Cassandra/Constants.pm Cassandra/lib/Cassandra/Types.pm Cassandra/lib/Thrift.pm Cassandra/lib/Thrift/BinaryProtocol.pm Cassandra/lib/Thrift/BufferedTransport.pm Cassandra/lib/Thrift/FramedTransport.pm Cassandra/lib/Thrift/HttpClient.pm Cassandra/lib/Thrift/MemoryBuffer.pm Cassandra/lib/Thrift/Protocol.pm Cassandra/lib/Thrift/Server.pm Cassandra/lib/Thrift/Socket.pm Cassandra/lib/Thrift/Transport.pm Yuki/DiffText.pm Yuki/PluginManager.pm Yuki/RSS.pm Yuki/YukiWikiDB.pm conflict.txt format.txt frontpage.txt history.txt icon40x40.gif icon80x80.gif jcode.pl plugin.txt plugin/link.pl plugin/recent.pl plugin/ruby.pl plugin/verb.pl readme.txt resource.txt rss.xml touched.txt wiki.cgi wiki.css
diffstat 37 files changed, 15279 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Algorithm/Diff.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,584 @@
+package Algorithm::Diff;
+use strict;
+use vars qw($VERSION @EXPORT_OK @ISA @EXPORT);
+use integer;		# see below in _replaceNextLargerWith() for mod to make
+					# if you don't use this
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw();
+@EXPORT_OK = qw(LCS diff traverse_sequences);
+$VERSION = sprintf('%d.%02d', (q$Revision: 1.1.2.1 $ =~ /\d+/g));
+
+# McIlroy-Hunt diff algorithm
+# Adapted from the Smalltalk code of Mario I. Wolczko, <mario@wolczko.com>
+# by Ned Konz, perl@bike-nomad.com
+
+=head1 NAME
+
+Algorithm::Diff - Compute `intelligent' differences between two files / lists
+
+=head1 SYNOPSIS
+
+  use Algorithm::Diff qw(diff LCS traverse_sequences);
+
+  @lcs    = LCS( \@seq1, \@seq2 );
+
+  @lcs    = LCS( \@seq1, \@seq2, $key_generation_function );
+
+  $lcsref = LCS( \@seq1, \@seq2 );
+
+  $lcsref = LCS( \@seq1, \@seq2, $key_generation_function );
+
+  @diffs = diff( \@seq1, \@seq2 );
+
+  @diffs = diff( \@seq1, \@seq2, $key_generation_function );
+  
+  traverse_sequences( \@seq1, \@seq2,
+                     { MATCH => $callback,
+                       DISCARD_A => $callback,
+                       DISCARD_B => $callback,
+                     } );
+
+  traverse_sequences( \@seq1, \@seq2,
+                     { MATCH => $callback,
+                       DISCARD_A => $callback,
+                       DISCARD_B => $callback,
+                     },
+                     $key_generation_function );
+
+=head1 INTRODUCTION
+
+(by Mark-Jason Dominus)
+
+I once read an article written by the authors of C<diff>; they said
+that they hard worked very hard on the algorithm until they found the
+right one.
+
+I think what they ended up using (and I hope someone will correct me,
+because I am not very confident about this) was the `longest common
+subsequence' method.  in the LCS problem, you have two sequences of
+items:
+
+        a b c d f g h j q z
+
+        a b c d e f g i j k r x y z
+
+and you want to find the longest sequence of items that is present in
+both original sequences in the same order.  That is, you want to find
+a new sequence I<S> which can be obtained from the first sequence by
+deleting some items, and from the secend sequence by deleting other
+items.  You also want I<S> to be as long as possible.  In this case
+I<S> is
+
+        a b c d f g j z
+
+From there it's only a small step to get diff-like output:
+
+        e   h i   k   q r x y 
+        +   - +   +   - + + +
+
+This module solves the LCS problem.  It also includes a canned
+function to generate C<diff>-like output.
+
+It might seem from the example above that the LCS of two sequences is
+always pretty obvious, but that's not always the case, especially when
+the two sequences have many repeated elements.  For example, consider
+
+	a x b y c z p d q
+	a b c a x b y c z
+
+A naive approach might start by matching up the C<a> and C<b> that
+appear at the beginning of each sequence, like this:
+
+	a x b y c         z p d q
+	a   b   c a b y c z
+
+This finds the common subsequence C<a b c z>.  But actually, the LCS
+is C<a x b y c z>:
+
+	      a x b y c z p d q
+	a b c a x b y c z
+
+=head1 USAGE
+
+This module provides three exportable functions, which we'll deal with in
+ascending order of difficulty: C<LCS>, C<diff>, and
+C<traverse_sequences>.
+
+=head2 C<LCS>
+
+Given references to two lists of items, LCS returns an array containing their
+longest common subsequence.  In scalar context, it returns a reference to
+such a list.
+
+  @lcs    = LCS( \@seq1, \@seq2 );
+  $lcsref = LCS( \@seq1, \@seq2 );
+
+C<LCS> may be passed an optional third parameter; this is a CODE
+reference to a key generation function.  See L</KEY GENERATION
+FUNCTIONS>.
+
+  @lcs    = LCS( \@seq1, \@seq2, $keyGen );
+  $lcsref = LCS( \@seq1, \@seq2, $keyGen );
+
+Additional parameters, if any, will be passed to the key generation
+routine.
+
+=head2 C<diff>
+
+  @diffs     = diff( \@seq1, \@seq2 );
+  $diffs_ref = diff( \@seq1, \@seq2 );
+
+C<diff> computes the smallest set of additions and deletions necessary
+to turn the first sequence into the second, and returns a description
+of these changes.  The description is a list of I<hunks>; each hunk
+represents a contiguous section of items which should be added,
+deleted, or replaced.  The return value of C<diff> is a list of
+hunks, or, in scalar context, a reference to such a list.
+
+Here is an example:  The diff of the following two sequences:
+
+  a b c e h j l m n p
+  b c d e f j k l m r s t
+
+Result:
+
+ [ 
+   [ [ '-', 0, 'a' ] ],       
+
+   [ [ '+', 2, 'd' ] ],
+
+   [ [ '-', 4, 'h' ] , 
+     [ '+', 4, 'f' ] ],
+
+   [ [ '+', 6, 'k' ] ],
+
+   [ [ '-', 8, 'n' ], 
+     [ '-', 9, 'p' ], 
+     [ '+', 9, 'r' ], 
+     [ '+', 10, 's' ], 
+     [ '+', 11, 't' ],
+   ]
+ ]
+
+There are five hunks here.  The first hunk says that the C<a> at
+position 0 of the first sequence should be deleted (C<->).  The second
+hunk says that the C<d> at position 2 of the second sequence should
+be inserted (C<+>).  The third hunk says that the C<h> at position 4
+of the first sequence should be removed and replaced with the C<f>
+from position 4 of the second sequence.  The other two hunks similarly. 
+
+C<diff> may be passed an optional third parameter; this is a CODE
+reference to a key generation function.  See L</KEY GENERATION
+FUNCTIONS>.
+
+Additional parameters, if any, will be passed to the key generation
+routine.
+
+=head2 C<traverse_sequences>
+
+C<traverse_sequences> is the most general facility provided by this
+module; C<diff> and C<LCS> are implemented as calls to it.
+
+Imagine that there are two arrows.  Arrow A points to an element of
+sequence A, and arrow B points to an element of the sequence B.
+Initially, the arrows point to the first elements of the respective
+sequences.  C<traverse_sequences> will advance the arrows through the
+sequences one element at a time, calling an appropriate user-specified
+callback function before each advance.  It willadvance the arrows in
+such a way that if there are equal elements C<$A[$i]> and C<$B[$j]>
+which are equal and which are part of the LCS, there will be some
+moment during the execution of C<traverse_sequences> when arrow A is
+pointing to C<$A[$i]> and arrow B is pointing to C<$B[$j]>.  When this
+happens, C<traverse_sequences> will call the C<MATCH> callback
+function and then it will advance both arrows. 
+
+Otherwise, one of the arrows is pointing to an element of its sequence
+that is not part of the LCS.  C<traverse_sequences> will advance that
+arrow and will call the C<DISCARD_A> or the C<DISCARD_B> callback,
+depending on which arrow it advanced.  If both arrows point to
+elements that are not part of the LCS, then C<traverse_sequences> will
+advance one of them and call the appropriate callback, but it is not
+specified which it will call.
+
+The arguments to C<traverse_sequences> are the two sequences to
+traverse, and a callback which specifies the callback functions, like
+this:
+
+  traverse_sequences( \@seq1, \@seq2,
+                     { MATCH => $callback_1,
+                       DISCARD_A => $callback_2,
+                       DISCARD_B => $callback_3,
+                     } );
+
+Callbacks are invoked with at least the indices of the two arrows as
+their arguments.  They are not expected to return any values.  If a
+callback is omitted from the table, it is not called.
+
+If arrow A reaches the end of its sequence, before arrow B does,
+C<traverse_sequences> will call the C<A_FINISHED> callback when it
+advances arrow B, if there is such a function; if not it will call
+C<DISCARD_B> instead.  Similarly if arrow B finishes first.
+C<traverse_sequences> returns when both arrows are at the ends of
+their respective sequences.  It returns true on success and false on
+failure.  At present there is no way to fail.
+
+C<traverse_sequences> may be passed an optional fourth parameter; this
+is a CODE reference to a key generation function.  See L</KEY
+GENERATION FUNCTIONS>.
+
+Additional parameters, if any, will be passed to the key generation
+function.
+
+=head1 KEY GENERATION FUNCTIONS
+
+C<diff>, C<LCS>, and C<traverse_sequences> accept an optional last parameter.
+This is a CODE reference to a key generating (hashing) function that should
+return a string that uniquely identifies a given element.
+It should be the case that if two elements are to be considered equal,
+their keys should be the same (and the other way around).
+If no key generation function is provided, the key will be the
+element as a string.
+
+By default, comparisons will use "eq" and elements will be turned into keys
+using the default stringizing operator '""'.
+
+Where this is important is when you're comparing something other than
+strings. If it is the case that you have multiple different objects 
+that should be considered to be equal, you should supply a key
+generation function. Otherwise, you have to make sure that your arrays
+contain unique references.
+
+For instance, consider this example:
+
+  package Person;
+
+  sub new
+  {
+    my $package = shift;
+    return bless { name => '', ssn => '', @_ }, $package;
+  }
+
+  sub clone
+  {
+    my $old = shift;
+    my $new = bless { %$old }, ref($old);
+  }
+
+  sub hash
+  {
+    return shift()->{'ssn'};
+  }
+
+  my $person1 = Person->new( name => 'Joe', ssn => '123-45-6789' );
+  my $person2 = Person->new( name => 'Mary', ssn => '123-47-0000' );
+  my $person3 = Person->new( name => 'Pete', ssn => '999-45-2222' );
+  my $person4 = Person->new( name => 'Peggy', ssn => '123-45-9999' );
+  my $person5 = Person->new( name => 'Frank', ssn => '000-45-9999' );
+
+If you did this:
+
+  my $array1 = [ $person1, $person2, $person4 ];
+  my $array2 = [ $person1, $person3, $person4, $person5 ];
+  Algorithm::Diff::diff( $array1, $array2 );
+
+everything would work out OK (each of the objects would be converted
+into a string like "Person=HASH(0x82425b0)" for comparison).
+
+But if you did this:
+
+  my $array1 = [ $person1, $person2, $person4 ];
+  my $array2 = [ $person1, $person3, $person4->clone(), $person5 ];
+  Algorithm::Diff::diff( $array1, $array2 );
+
+$person4 and $person4->clone() (which have the same name and SSN)
+would be seen as different objects. If you wanted them to be considered
+equivalent, you would have to pass in a key generation function:
+
+  my $array1 = [ $person1, $person2, $person4 ];
+  my $array2 = [ $person1, $person3, $person4->clone(), $person5 ];
+  Algorithm::Diff::diff( $array1, $array2, \&Person::hash );
+
+This would use the 'ssn' field in each Person as a comparison key, and
+so would consider $person4 and $person4->clone() as equal.
+
+You may also pass additional parameters to the key generation function
+if you wish.
+
+=head1 AUTHOR
+
+This version by Ned Konz, perl@bike-nomad.com
+
+=head1 CREDITS
+
+Versions through 0.59 (and much of this documentation) were written by:
+
+Mark-Jason Dominus, mjd-perl-diff@plover.com
+
+This version borrows the documentation and names of the routines
+from Mark-Jason's, but has all new code in Diff.pm.
+
+This code was adapted from the Smalltalk code of
+Mario Wolczko <mario@wolczko.com>, which is available at
+ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st
+
+The algorithm is that described in 
+I<A Fast Algorithm for Computing Longest Common Subsequences>,
+CACM, vol.20, no.5, pp.350-353, May 1977, with a few
+minor improvements to improve the speed.
+
+=cut
+
+# Create a hash that maps each element of $aCollection to the set of positions
+# it occupies in $aCollection, restricted to the elements within the range of
+# indexes specified by $start and $end.
+# The fourth parameter is a subroutine reference that will be called to
+# generate a string to use as a key.
+# Additional parameters, if any, will be passed to this subroutine.
+#
+# my $hashRef = _withPositionsOfInInterval( \@array, $start, $end, $keyGen );
+
+sub _withPositionsOfInInterval
+{
+	my $aCollection = shift;	# array ref
+	my $start = shift;
+	my $end = shift;
+	my $keyGen = shift;
+	my %d;
+	my $index;
+	for ( $index = $start; $index <= $end; $index++ )
+	{
+		my $element = $aCollection->[ $index ];
+		my $key = &$keyGen( $element, @_ );
+		if ( exists( $d{ $key } ) )
+		{
+			push( @{ $d{ $key } }, $index );
+		}
+		else
+		{
+			$d{ $key } = [ $index ];
+		}
+	}
+	return wantarray ? %d: \%d;
+}
+
+# Find the place at which aValue would normally be inserted into the array. If
+# that place is already occupied by aValue, do nothing, and return undef. If
+# the place does not exist (i.e., it is off the end of the array), add it to
+# the end, otherwise replace the element at that point with aValue.
+# It is assumed that the array's values are numeric.
+# This is where the bulk (75%) of the time is spent in this module, so try to
+# make it fast!
+
+sub _replaceNextLargerWith
+{
+	my ( $array, $aValue, $high ) = @_;
+	$high ||= $#$array;
+
+	# off the end?
+	if ( $high == -1 || $aValue > $array->[ -1 ] )
+	{
+		push( @$array, $aValue );
+		return $high + 1;
+	}
+
+	# binary search for insertion point...
+	my $low = 0;
+	my $index;
+	my $found;
+	while ( $low <= $high )
+	{
+		$index = ( $high + $low ) / 2;
+#		$index = int(( $high + $low ) / 2);		# without 'use integer'
+		$found = $array->[ $index ];
+
+		if ( $aValue == $found )
+		{
+			return undef;
+		}
+		elsif ( $aValue > $found )
+		{
+			$low = $index + 1;
+		}
+		else
+		{
+			$high = $index - 1;
+		}
+	}
+
+	# now insertion point is in $low.
+	$array->[ $low ] = $aValue;		# overwrite next larger
+	return $low;
+}
+
+# This method computes the longest common subsequence in $a and $b.
+
+# Result is array or ref, whose contents is such that
+# 	$a->[ $i ] = $b->[ $result[ $i ] ]
+# foreach $i in ( 0..scalar( @result ) if $result[ $i ] is defined.
+
+# An additional argument may be passed; this is a hash or key generating
+# function that should return a string that uniquely identifies the given
+# element.  It should be the case that if the key is the same, the elements
+# will compare the same. If this parameter is undef or missing, the key
+# will be the element as a string.
+
+# By default, comparisons will use "eq" and elements will be turned into keys
+# using the default stringizing operator '""'.
+
+# Additional parameters, if any, will be passed to the key generation routine.
+
+sub _longestCommonSubsequence
+{
+	my $a = shift;	# array ref
+	my $b = shift;	# array ref
+	my $keyGen = shift;	# code ref
+	my $compare;	# code ref
+
+	# set up code refs
+	# Note that these are optimized.
+	if ( !defined( $keyGen ) )	# optimize for strings
+	{
+		$keyGen = sub { $_[0] };
+		$compare = sub { my ($a, $b) = @_; $a eq $b };
+	}
+	else
+	{
+		$compare = sub {
+			my $a = shift; my $b = shift;
+			&$keyGen( $a, @_ ) eq &$keyGen( $b, @_ )
+		};
+	}
+
+	my ($aStart, $aFinish, $bStart, $bFinish, $matchVector) = (0, $#$a, 0, $#$b, []);
+
+	# First we prune off any common elements at the beginning
+	while ( $aStart <= $aFinish
+		and $bStart <= $bFinish
+		and &$compare( $a->[ $aStart ], $b->[ $bStart ], @_ ) )
+	{
+		$matchVector->[ $aStart++ ] = $bStart++;
+	}
+
+	# now the end
+	while ( $aStart <= $aFinish
+		and $bStart <= $bFinish
+		and &$compare( $a->[ $aFinish ], $b->[ $bFinish ], @_ ) )
+	{
+		$matchVector->[ $aFinish-- ] = $bFinish--;
+	}
+
+	# Now compute the equivalence classes of positions of elements
+	my $bMatches = _withPositionsOfInInterval( $b, $bStart, $bFinish, $keyGen, @_ );
+	my $thresh = [];
+	my $links = [];
+
+	my ( $i, $ai, $j, $k );
+	for ( $i = $aStart; $i <= $aFinish; $i++ )
+	{
+		$ai = &$keyGen( $a->[ $i ] );
+		if ( exists( $bMatches->{ $ai } ) )
+		{
+			$k = 0;
+			for $j ( reverse( @{ $bMatches->{ $ai } } ) )
+			{
+				# optimization: most of the time this will be true
+				if ( $k
+					and $thresh->[ $k ] > $j
+					and $thresh->[ $k - 1 ] < $j )
+				{
+					$thresh->[ $k ] = $j;
+				}
+				else
+				{
+					$k = _replaceNextLargerWith( $thresh, $j, $k );
+				}
+
+				# oddly, it's faster to always test this (CPU cache?).
+				if ( defined( $k ) )
+				{
+					$links->[ $k ] = 
+						[ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ];
+				}
+			}
+		}
+	}
+
+	if ( @$thresh )
+	{
+		for ( my $link = $links->[ $#$thresh ]; $link; $link = $link->[ 0 ] )
+		{
+			$matchVector->[ $link->[ 1 ] ] = $link->[ 2 ];
+		}
+	}
+
+	return wantarray ? @$matchVector : $matchVector;
+}
+
+sub traverse_sequences
+{
+	my $a = shift;	# array ref
+	my $b = shift;	# array ref
+	my $callbacks = shift || { };
+	my $keyGen = shift;
+	my $matchCallback = $callbacks->{'MATCH'} || sub { };
+	my $discardACallback = $callbacks->{'DISCARD_A'} || sub { };
+	my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { };
+	my $matchVector = _longestCommonSubsequence( $a, $b, $keyGen, @_ );
+	# Process all the lines in match vector
+	my $lastA = $#$a;
+	my $lastB = $#$b;
+	my $bi = 0;
+	my $ai;
+	for ( $ai = 0; $ai <= $#$matchVector; $ai++ )
+	{
+		my $bLine = $matchVector->[ $ai ];
+		if ( defined( $bLine ) )
+		{
+			&$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine;
+			&$matchCallback( $ai, $bi++, @_ );
+		}
+		else
+		{
+			&$discardACallback( $ai, $bi, @_ );
+		}
+	}
+
+	&$discardACallback( $ai++, $bi, @_ ) while ( $ai <= $lastA );
+	&$discardBCallback( $ai, $bi++, @_ ) while ( $bi <= $lastB );
+	return 1;
+}
+
+sub LCS
+{
+	my $a = shift;	# array ref
+	my $matchVector = _longestCommonSubsequence( $a, @_ );
+	my @retval;
+	my $i;
+	for ( $i = 0; $i <= $#$matchVector; $i++ )
+	{
+		if ( defined( $matchVector->[ $i ] ) )
+		{
+			push( @retval, $a->[ $i ] );
+		}
+	}
+	return wantarray ? @retval : \@retval;
+}
+
+sub diff
+{
+	my $a = shift;	# array ref
+	my $b = shift;	# array ref
+	my $retval = [];
+	my $hunk = [];
+	my $discard = sub { push( @$hunk, [ '-', $_[ 0 ], $a->[ $_[ 0 ] ] ] ) };
+	my $add = sub { push( @$hunk, [ '+', $_[ 1 ], $b->[ $_[ 1 ] ] ] ) };
+	my $match = sub { push( @$retval, $hunk ) if scalar(@$hunk); $hunk = [] };
+	traverse_sequences( $a, $b,
+		{ MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add },
+		@_ );
+	&$match();
+	return wantarray ? @$retval : $retval;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/CassHash.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,161 @@
+#this perl module for using Cassandra DB on YukiWiki 
+package Cassandra::CassHash;
+
+use strict;
+use warnings;
+
+use lib './Cassandra/lib';
+use Cassandra::Cassandra;
+use Cassandra::Constants;
+use Cassandra::Types;
+
+use Thrift;
+use Thrift::BinaryProtocol;
+use Thrift::Socket;
+use Thrift::BufferedTransport;
+
+
+use Data::Dumper;
+
+sub TIEHASH
+{
+	my ($_pkg,$_host,$_port,$_ksp,$_cf,$_row) = @_;
+
+	my $self = {
+		_socket => undef,
+		_transport => undef,
+		_protocol => undef,
+		_client => undef,
+		_keyspace => undef,
+		_columnfamily => undef,
+		_row => undef,
+		_column_list => undef
+	};
+
+	$self->{_socket} = new Thrift::Socket($_host,$_port);
+	$self->{_transport} = new Thrift::BufferedTransport($self->{_socket},1024,1024);
+	$self->{_protocol} = new Thrift::BinaryProtocol($self->{_transport});
+	$self->{_client} = new Cassandra::CassandraClient($self->{_protocol});
+	$self->{_keyspace} = $_ksp;
+	$self->{_columnfamily} = $_cf;
+	$self->{_row} = $_row;
+
+	$self->{_transport}->open();
+
+	return bless $self,$_pkg;
+}
+
+sub FETCH
+{
+	my $self = shift;
+	my $column = shift;
+	my $client = $self->{_client};
+	my $column_path = new Cassandra::ColumnPath();
+	$column_path->{column_family} = $self->{_columnfamily};
+	$column_path->{super_column} = undef;
+	$column_path->{column} = $column;
+	
+	my $value;
+	eval{
+		$value = $client->get($self->{_keyspace},$self->{_row},$column_path,Cassandra::ConsistencyLevel::ONE);
+	};
+	if($@){
+		return undef;
+	}
+	
+	return $value->{column}->{value};
+}
+
+sub EXIST
+{
+	my $self = shift;
+	my $column = shift;
+	my $client = $self->{_client};
+	my $column_path = new Cassandra::ColumnPath();
+	$column_path->{column_family} = $self->{_columnfamily};
+	$column_path->{super_column} = undef;
+	$column_path->{column} = $column;
+	
+	my $value;
+	eval{
+		$value = $client->get($self->{_keyspace},$self->{_row},$column_path,Cassandra::ConsistencyLevel::ONE);
+	};
+	if($@){
+		return 0;
+	}
+	
+	return 1;
+}
+
+sub STORE
+{
+	my ($_self,$_column,$_value) = @_;
+
+	my $column_path = new Cassandra::ColumnPath();
+	$column_path->{column_family} = $_self->{_columnfamily};
+	$column_path->{super_column} = undef;
+	$column_path->{column} = $_column;
+
+	my $client = $_self->{_client};
+
+	$client->insert($_self->{_keyspace},$_self->{_row},$column_path,$_value,time,Cassandra::ConsistencyLevel::ONE);
+	
+	return $_value;
+}
+
+sub DELETE
+{
+	my ($_self,$_column) = @_;
+	my $client = $_self->{_client};
+	
+	my $column_path = new Cassandra::ColumnPath();
+	$column_path->{column_family} = $_self->{_columnfamily};
+	$column_path->{super_column} = undef;
+	$column_path->{column} = $_column;
+
+	$client->remove($_self->{_keyspace},$_self->{_row},$column_path,time,Cassandra::ConsistencyLevel::ONE);	
+	
+	return undef;
+}
+
+sub FIRSTKEY
+{
+	my ($_self) = @_;	
+
+	my $client = $_self->{_client};
+
+	my $column_parent = new Cassandra::ColumnParent();
+	$column_parent->{column_family} = $_self->{_columnfamily};
+	$column_parent->{super_column} = undef;
+	
+	my $slice_range = new Cassandra::SliceRange();
+	$slice_range->{start} = "";
+	$slice_range->{finish} = "";
+
+	my $predicate = new Cassandra::SlicePredicate();
+	my @list = $predicate->{column_names};
+	$predicate->{slice_range} = $slice_range;
+
+	my @result = $client->get_slice($_self->{_keyspace},$_self->{_row},$column_parent,$predicate,Cassandra::ConsistencyLevel::ONE);
+	@{$_self->{_column_list}} = @{$result[0]};
+
+	my $first_column = shift @{$_self->{_column_list}};	
+
+	return $first_column->{column}->{name};
+}
+
+sub NEXTKEY
+{
+	my $_self = shift;
+	my $next_item = shift @{$_self->{_column_list}};
+	return $next_item->{column}->{name};
+}
+
+sub DESTROY
+{
+	my $self = shift;
+	$self->{_transport}->close();
+	return 1;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Cassandra/Cassandra.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,6014 @@
+#
+# Autogenerated by Thrift
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+require 5.6.0;
+use strict;
+use warnings;
+use Thrift;
+
+use Cassandra::Types;
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+package Cassandra::Cassandra_login_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_login_args->mk_accessors( qw( keyspace auth_request ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{auth_request} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{auth_request}) {
+      $self->{auth_request} = $vals->{auth_request};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_login_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{auth_request} = new Cassandra::AuthenticationRequest();
+        $xfer += $self->{auth_request}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_login_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{auth_request}) {
+    $xfer += $output->writeFieldBegin('auth_request', TType::STRUCT, 2);
+    $xfer += $self->{auth_request}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_login_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_login_result->mk_accessors( qw( ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{authnx} = undef;
+  $self->{authzx} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{authnx}) {
+      $self->{authnx} = $vals->{authnx};
+    }
+    if (defined $vals->{authzx}) {
+      $self->{authzx} = $vals->{authzx};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_login_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{authnx} = new Cassandra::AuthenticationException();
+        $xfer += $self->{authnx}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{authzx} = new Cassandra::AuthorizationException();
+        $xfer += $self->{authzx}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_login_result');
+  if (defined $self->{authnx}) {
+    $xfer += $output->writeFieldBegin('authnx', TType::STRUCT, 1);
+    $xfer += $self->{authnx}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{authzx}) {
+    $xfer += $output->writeFieldBegin('authzx', TType::STRUCT, 2);
+    $xfer += $self->{authzx}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_args->mk_accessors( qw( keyspace key column_path consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{key} = undef;
+  $self->{column_path} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{column_path}) {
+      $self->{column_path} = $vals->{column_path};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_path} = new Cassandra::ColumnPath();
+        $xfer += $self->{column_path}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_path}) {
+    $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3);
+    $xfer += $self->{column_path}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{nfe} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{nfe}) {
+      $self->{nfe} = $vals->{nfe};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{success} = new Cassandra::ColumnOrSuperColumn();
+        $xfer += $self->{success}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{nfe} = new Cassandra::NotFoundException();
+        $xfer += $self->{nfe}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::STRUCT, 0);
+    $xfer += $self->{success}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{nfe}) {
+    $xfer += $output->writeFieldBegin('nfe', TType::STRUCT, 2);
+    $xfer += $self->{nfe}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 3);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 4);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_slice_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_slice_args->mk_accessors( qw( keyspace key column_parent predicate consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{key} = undef;
+  $self->{column_parent} = undef;
+  $self->{predicate} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{column_parent}) {
+      $self->{column_parent} = $vals->{column_parent};
+    }
+    if (defined $vals->{predicate}) {
+      $self->{predicate} = $vals->{predicate};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_slice_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_parent} = new Cassandra::ColumnParent();
+        $xfer += $self->{column_parent}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{predicate} = new Cassandra::SlicePredicate();
+        $xfer += $self->{predicate}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_slice_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_parent}) {
+    $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 3);
+    $xfer += $self->{column_parent}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{predicate}) {
+    $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 4);
+    $xfer += $self->{predicate}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_slice_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_slice_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_slice_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size37 = 0;
+          $self->{success} = [];
+          my $_etype40 = 0;
+          $xfer += $input->readListBegin(\$_etype40, \$_size37);
+          for (my $_i41 = 0; $_i41 < $_size37; ++$_i41)
+          {
+            my $elem42 = undef;
+            $elem42 = new Cassandra::ColumnOrSuperColumn();
+            $xfer += $elem42->read($input);
+            push(@{$self->{success}},$elem42);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_slice_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::LIST, 0);
+    {
+      $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}}));
+      {
+        foreach my $iter43 (@{$self->{success}}) 
+        {
+          $xfer += ${iter43}->write($output);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_multiget_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_multiget_args->mk_accessors( qw( keyspace keys column_path consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{keys} = undef;
+  $self->{column_path} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{keys}) {
+      $self->{keys} = $vals->{keys};
+    }
+    if (defined $vals->{column_path}) {
+      $self->{column_path} = $vals->{column_path};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_multiget_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size44 = 0;
+          $self->{keys} = [];
+          my $_etype47 = 0;
+          $xfer += $input->readListBegin(\$_etype47, \$_size44);
+          for (my $_i48 = 0; $_i48 < $_size44; ++$_i48)
+          {
+            my $elem49 = undef;
+            $xfer += $input->readString(\$elem49);
+            push(@{$self->{keys}},$elem49);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_path} = new Cassandra::ColumnPath();
+        $xfer += $self->{column_path}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_multiget_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{keys}) {
+    $xfer += $output->writeFieldBegin('keys', TType::LIST, 2);
+    {
+      $output->writeListBegin(TType::STRING, scalar(@{$self->{keys}}));
+      {
+        foreach my $iter50 (@{$self->{keys}}) 
+        {
+          $xfer += $output->writeString($iter50);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_path}) {
+    $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3);
+    $xfer += $self->{column_path}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_multiget_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_multiget_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_multiget_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::MAP) {
+        {
+          my $_size51 = 0;
+          $self->{success} = {};
+          my $_ktype52 = 0;
+          my $_vtype53 = 0;
+          $xfer += $input->readMapBegin(\$_ktype52, \$_vtype53, \$_size51);
+          for (my $_i55 = 0; $_i55 < $_size51; ++$_i55)
+          {
+            my $key56 = '';
+            my $val57 = new Cassandra::ColumnOrSuperColumn();
+            $xfer += $input->readString(\$key56);
+            $val57 = new Cassandra::ColumnOrSuperColumn();
+            $xfer += $val57->read($input);
+            $self->{success}->{$key56} = $val57;
+          }
+          $xfer += $input->readMapEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_multiget_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::MAP, 0);
+    {
+      $output->writeMapBegin(TType::STRING, TType::STRUCT, scalar(keys %{$self->{success}}));
+      {
+        while( my ($kiter58,$viter59) = each %{$self->{success}}) 
+        {
+          $xfer += $output->writeString($kiter58);
+          $xfer += ${viter59}->write($output);
+        }
+      }
+      $output->writeMapEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_multiget_slice_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_multiget_slice_args->mk_accessors( qw( keyspace keys column_parent predicate consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{keys} = undef;
+  $self->{column_parent} = undef;
+  $self->{predicate} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{keys}) {
+      $self->{keys} = $vals->{keys};
+    }
+    if (defined $vals->{column_parent}) {
+      $self->{column_parent} = $vals->{column_parent};
+    }
+    if (defined $vals->{predicate}) {
+      $self->{predicate} = $vals->{predicate};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_multiget_slice_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size60 = 0;
+          $self->{keys} = [];
+          my $_etype63 = 0;
+          $xfer += $input->readListBegin(\$_etype63, \$_size60);
+          for (my $_i64 = 0; $_i64 < $_size60; ++$_i64)
+          {
+            my $elem65 = undef;
+            $xfer += $input->readString(\$elem65);
+            push(@{$self->{keys}},$elem65);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_parent} = new Cassandra::ColumnParent();
+        $xfer += $self->{column_parent}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{predicate} = new Cassandra::SlicePredicate();
+        $xfer += $self->{predicate}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_multiget_slice_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{keys}) {
+    $xfer += $output->writeFieldBegin('keys', TType::LIST, 2);
+    {
+      $output->writeListBegin(TType::STRING, scalar(@{$self->{keys}}));
+      {
+        foreach my $iter66 (@{$self->{keys}}) 
+        {
+          $xfer += $output->writeString($iter66);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_parent}) {
+    $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 3);
+    $xfer += $self->{column_parent}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{predicate}) {
+    $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 4);
+    $xfer += $self->{predicate}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_multiget_slice_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_multiget_slice_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_multiget_slice_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::MAP) {
+        {
+          my $_size67 = 0;
+          $self->{success} = {};
+          my $_ktype68 = 0;
+          my $_vtype69 = 0;
+          $xfer += $input->readMapBegin(\$_ktype68, \$_vtype69, \$_size67);
+          for (my $_i71 = 0; $_i71 < $_size67; ++$_i71)
+          {
+            my $key72 = '';
+            my $val73 = [];
+            $xfer += $input->readString(\$key72);
+            {
+              my $_size74 = 0;
+              $val73 = [];
+              my $_etype77 = 0;
+              $xfer += $input->readListBegin(\$_etype77, \$_size74);
+              for (my $_i78 = 0; $_i78 < $_size74; ++$_i78)
+              {
+                my $elem79 = undef;
+                $elem79 = new Cassandra::ColumnOrSuperColumn();
+                $xfer += $elem79->read($input);
+                push(@{$val73},$elem79);
+              }
+              $xfer += $input->readListEnd();
+            }
+            $self->{success}->{$key72} = $val73;
+          }
+          $xfer += $input->readMapEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_multiget_slice_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::MAP, 0);
+    {
+      $output->writeMapBegin(TType::STRING, TType::LIST, scalar(keys %{$self->{success}}));
+      {
+        while( my ($kiter80,$viter81) = each %{$self->{success}}) 
+        {
+          $xfer += $output->writeString($kiter80);
+          {
+            $output->writeListBegin(TType::STRUCT, scalar(@{${viter81}}));
+            {
+              foreach my $iter82 (@{${viter81}}) 
+              {
+                $xfer += ${iter82}->write($output);
+              }
+            }
+            $output->writeListEnd();
+          }
+        }
+      }
+      $output->writeMapEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_count_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_count_args->mk_accessors( qw( keyspace key column_parent consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{key} = undef;
+  $self->{column_parent} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{column_parent}) {
+      $self->{column_parent} = $vals->{column_parent};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_count_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_parent} = new Cassandra::ColumnParent();
+        $xfer += $self->{column_parent}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_count_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_parent}) {
+    $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 3);
+    $xfer += $self->{column_parent}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_count_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_count_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_count_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{success});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_count_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::I32, 0);
+    $xfer += $output->writeI32($self->{success});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_range_slice_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_range_slice_args->mk_accessors( qw( keyspace column_parent predicate start_key finish_key row_count consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{column_parent} = undef;
+  $self->{predicate} = undef;
+  $self->{start_key} = "";
+  $self->{finish_key} = "";
+  $self->{row_count} = 100;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{column_parent}) {
+      $self->{column_parent} = $vals->{column_parent};
+    }
+    if (defined $vals->{predicate}) {
+      $self->{predicate} = $vals->{predicate};
+    }
+    if (defined $vals->{start_key}) {
+      $self->{start_key} = $vals->{start_key};
+    }
+    if (defined $vals->{finish_key}) {
+      $self->{finish_key} = $vals->{finish_key};
+    }
+    if (defined $vals->{row_count}) {
+      $self->{row_count} = $vals->{row_count};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_range_slice_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_parent} = new Cassandra::ColumnParent();
+        $xfer += $self->{column_parent}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{predicate} = new Cassandra::SlicePredicate();
+        $xfer += $self->{predicate}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{start_key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{finish_key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^6$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{row_count});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^7$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_range_slice_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_parent}) {
+    $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 2);
+    $xfer += $self->{column_parent}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{predicate}) {
+    $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 3);
+    $xfer += $self->{predicate}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{start_key}) {
+    $xfer += $output->writeFieldBegin('start_key', TType::STRING, 4);
+    $xfer += $output->writeString($self->{start_key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{finish_key}) {
+    $xfer += $output->writeFieldBegin('finish_key', TType::STRING, 5);
+    $xfer += $output->writeString($self->{finish_key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{row_count}) {
+    $xfer += $output->writeFieldBegin('row_count', TType::I32, 6);
+    $xfer += $output->writeI32($self->{row_count});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 7);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_range_slice_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_range_slice_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_range_slice_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size83 = 0;
+          $self->{success} = [];
+          my $_etype86 = 0;
+          $xfer += $input->readListBegin(\$_etype86, \$_size83);
+          for (my $_i87 = 0; $_i87 < $_size83; ++$_i87)
+          {
+            my $elem88 = undef;
+            $elem88 = new Cassandra::KeySlice();
+            $xfer += $elem88->read($input);
+            push(@{$self->{success}},$elem88);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_range_slice_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::LIST, 0);
+    {
+      $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}}));
+      {
+        foreach my $iter89 (@{$self->{success}}) 
+        {
+          $xfer += ${iter89}->write($output);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_range_slices_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_range_slices_args->mk_accessors( qw( keyspace column_parent predicate range consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{column_parent} = undef;
+  $self->{predicate} = undef;
+  $self->{range} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{column_parent}) {
+      $self->{column_parent} = $vals->{column_parent};
+    }
+    if (defined $vals->{predicate}) {
+      $self->{predicate} = $vals->{predicate};
+    }
+    if (defined $vals->{range}) {
+      $self->{range} = $vals->{range};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_range_slices_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_parent} = new Cassandra::ColumnParent();
+        $xfer += $self->{column_parent}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{predicate} = new Cassandra::SlicePredicate();
+        $xfer += $self->{predicate}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{range} = new Cassandra::KeyRange();
+        $xfer += $self->{range}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_range_slices_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_parent}) {
+    $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 2);
+    $xfer += $self->{column_parent}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{predicate}) {
+    $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 3);
+    $xfer += $self->{predicate}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{range}) {
+    $xfer += $output->writeFieldBegin('range', TType::STRUCT, 4);
+    $xfer += $self->{range}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_range_slices_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_range_slices_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_range_slices_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size90 = 0;
+          $self->{success} = [];
+          my $_etype93 = 0;
+          $xfer += $input->readListBegin(\$_etype93, \$_size90);
+          for (my $_i94 = 0; $_i94 < $_size90; ++$_i94)
+          {
+            my $elem95 = undef;
+            $elem95 = new Cassandra::KeySlice();
+            $xfer += $elem95->read($input);
+            push(@{$self->{success}},$elem95);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_range_slices_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::LIST, 0);
+    {
+      $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}}));
+      {
+        foreach my $iter96 (@{$self->{success}}) 
+        {
+          $xfer += ${iter96}->write($output);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_insert_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_insert_args->mk_accessors( qw( keyspace key column_path value timestamp consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{key} = undef;
+  $self->{column_path} = undef;
+  $self->{value} = undef;
+  $self->{timestamp} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{column_path}) {
+      $self->{column_path} = $vals->{column_path};
+    }
+    if (defined $vals->{value}) {
+      $self->{value} = $vals->{value};
+    }
+    if (defined $vals->{timestamp}) {
+      $self->{timestamp} = $vals->{timestamp};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_insert_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_path} = new Cassandra::ColumnPath();
+        $xfer += $self->{column_path}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{value});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::I64) {
+        $xfer += $input->readI64(\$self->{timestamp});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^6$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_insert_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_path}) {
+    $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3);
+    $xfer += $self->{column_path}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{value}) {
+    $xfer += $output->writeFieldBegin('value', TType::STRING, 4);
+    $xfer += $output->writeString($self->{value});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{timestamp}) {
+    $xfer += $output->writeFieldBegin('timestamp', TType::I64, 5);
+    $xfer += $output->writeI64($self->{timestamp});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 6);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_insert_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_insert_result->mk_accessors( qw( ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_insert_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_insert_result');
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_batch_insert_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_batch_insert_args->mk_accessors( qw( keyspace key cfmap consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{key} = undef;
+  $self->{cfmap} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{cfmap}) {
+      $self->{cfmap} = $vals->{cfmap};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_batch_insert_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::MAP) {
+        {
+          my $_size97 = 0;
+          $self->{cfmap} = {};
+          my $_ktype98 = 0;
+          my $_vtype99 = 0;
+          $xfer += $input->readMapBegin(\$_ktype98, \$_vtype99, \$_size97);
+          for (my $_i101 = 0; $_i101 < $_size97; ++$_i101)
+          {
+            my $key102 = '';
+            my $val103 = [];
+            $xfer += $input->readString(\$key102);
+            {
+              my $_size104 = 0;
+              $val103 = [];
+              my $_etype107 = 0;
+              $xfer += $input->readListBegin(\$_etype107, \$_size104);
+              for (my $_i108 = 0; $_i108 < $_size104; ++$_i108)
+              {
+                my $elem109 = undef;
+                $elem109 = new Cassandra::ColumnOrSuperColumn();
+                $xfer += $elem109->read($input);
+                push(@{$val103},$elem109);
+              }
+              $xfer += $input->readListEnd();
+            }
+            $self->{cfmap}->{$key102} = $val103;
+          }
+          $xfer += $input->readMapEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_batch_insert_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{cfmap}) {
+    $xfer += $output->writeFieldBegin('cfmap', TType::MAP, 3);
+    {
+      $output->writeMapBegin(TType::STRING, TType::LIST, scalar(keys %{$self->{cfmap}}));
+      {
+        while( my ($kiter110,$viter111) = each %{$self->{cfmap}}) 
+        {
+          $xfer += $output->writeString($kiter110);
+          {
+            $output->writeListBegin(TType::STRUCT, scalar(@{${viter111}}));
+            {
+              foreach my $iter112 (@{${viter111}}) 
+              {
+                $xfer += ${iter112}->write($output);
+              }
+            }
+            $output->writeListEnd();
+          }
+        }
+      }
+      $output->writeMapEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_batch_insert_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_batch_insert_result->mk_accessors( qw( ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_batch_insert_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_batch_insert_result');
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_remove_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_remove_args->mk_accessors( qw( keyspace key column_path timestamp consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{key} = undef;
+  $self->{column_path} = undef;
+  $self->{timestamp} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{column_path}) {
+      $self->{column_path} = $vals->{column_path};
+    }
+    if (defined $vals->{timestamp}) {
+      $self->{timestamp} = $vals->{timestamp};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_remove_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_path} = new Cassandra::ColumnPath();
+        $xfer += $self->{column_path}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::I64) {
+        $xfer += $input->readI64(\$self->{timestamp});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_remove_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column_path}) {
+    $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3);
+    $xfer += $self->{column_path}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{timestamp}) {
+    $xfer += $output->writeFieldBegin('timestamp', TType::I64, 4);
+    $xfer += $output->writeI64($self->{timestamp});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_remove_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_remove_result->mk_accessors( qw( ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_remove_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_remove_result');
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_batch_mutate_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_batch_mutate_args->mk_accessors( qw( keyspace mutation_map consistency_level ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  $self->{mutation_map} = undef;
+  $self->{consistency_level} = 1;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+    if (defined $vals->{mutation_map}) {
+      $self->{mutation_map} = $vals->{mutation_map};
+    }
+    if (defined $vals->{consistency_level}) {
+      $self->{consistency_level} = $vals->{consistency_level};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_batch_mutate_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::MAP) {
+        {
+          my $_size113 = 0;
+          $self->{mutation_map} = {};
+          my $_ktype114 = 0;
+          my $_vtype115 = 0;
+          $xfer += $input->readMapBegin(\$_ktype114, \$_vtype115, \$_size113);
+          for (my $_i117 = 0; $_i117 < $_size113; ++$_i117)
+          {
+            my $key118 = '';
+            my $val119 = [];
+            $xfer += $input->readString(\$key118);
+            {
+              my $_size120 = 0;
+              $val119 = {};
+              my $_ktype121 = 0;
+              my $_vtype122 = 0;
+              $xfer += $input->readMapBegin(\$_ktype121, \$_vtype122, \$_size120);
+              for (my $_i124 = 0; $_i124 < $_size120; ++$_i124)
+              {
+                my $key125 = '';
+                my $val126 = [];
+                $xfer += $input->readString(\$key125);
+                {
+                  my $_size127 = 0;
+                  $val126 = [];
+                  my $_etype130 = 0;
+                  $xfer += $input->readListBegin(\$_etype130, \$_size127);
+                  for (my $_i131 = 0; $_i131 < $_size127; ++$_i131)
+                  {
+                    my $elem132 = undef;
+                    $elem132 = new Cassandra::Mutation();
+                    $xfer += $elem132->read($input);
+                    push(@{$val126},$elem132);
+                  }
+                  $xfer += $input->readListEnd();
+                }
+                $val119->{$key125} = $val126;
+              }
+              $xfer += $input->readMapEnd();
+            }
+            $self->{mutation_map}->{$key118} = $val119;
+          }
+          $xfer += $input->readMapEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{consistency_level});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_batch_mutate_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{mutation_map}) {
+    $xfer += $output->writeFieldBegin('mutation_map', TType::MAP, 2);
+    {
+      $output->writeMapBegin(TType::STRING, TType::MAP, scalar(keys %{$self->{mutation_map}}));
+      {
+        while( my ($kiter133,$viter134) = each %{$self->{mutation_map}}) 
+        {
+          $xfer += $output->writeString($kiter133);
+          {
+            $output->writeMapBegin(TType::STRING, TType::LIST, scalar(keys %{${viter134}}));
+            {
+              while( my ($kiter135,$viter136) = each %{${viter134}}) 
+              {
+                $xfer += $output->writeString($kiter135);
+                {
+                  $output->writeListBegin(TType::STRUCT, scalar(@{${viter136}}));
+                  {
+                    foreach my $iter137 (@{${viter136}}) 
+                    {
+                      $xfer += ${iter137}->write($output);
+                    }
+                  }
+                  $output->writeListEnd();
+                }
+              }
+            }
+            $output->writeMapEnd();
+          }
+        }
+      }
+      $output->writeMapEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{consistency_level}) {
+    $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 3);
+    $xfer += $output->writeI32($self->{consistency_level});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_batch_mutate_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_batch_mutate_result->mk_accessors( qw( ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{ire} = undef;
+  $self->{ue} = undef;
+  $self->{te} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{ire}) {
+      $self->{ire} = $vals->{ire};
+    }
+    if (defined $vals->{ue}) {
+      $self->{ue} = $vals->{ue};
+    }
+    if (defined $vals->{te}) {
+      $self->{te} = $vals->{te};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_batch_mutate_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ire} = new Cassandra::InvalidRequestException();
+        $xfer += $self->{ire}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{ue} = new Cassandra::UnavailableException();
+        $xfer += $self->{ue}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{te} = new Cassandra::TimedOutException();
+        $xfer += $self->{te}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_batch_mutate_result');
+  if (defined $self->{ire}) {
+    $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+    $xfer += $self->{ire}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{ue}) {
+    $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2);
+    $xfer += $self->{ue}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{te}) {
+    $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3);
+    $xfer += $self->{te}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_string_property_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_string_property_args->mk_accessors( qw( property ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{property} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{property}) {
+      $self->{property} = $vals->{property};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_string_property_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{property});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_string_property_args');
+  if (defined $self->{property}) {
+    $xfer += $output->writeFieldBegin('property', TType::STRING, 1);
+    $xfer += $output->writeString($self->{property});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_string_property_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_string_property_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_string_property_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{success});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_string_property_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::STRING, 0);
+    $xfer += $output->writeString($self->{success});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_string_list_property_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_string_list_property_args->mk_accessors( qw( property ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{property} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{property}) {
+      $self->{property} = $vals->{property};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_string_list_property_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{property});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_string_list_property_args');
+  if (defined $self->{property}) {
+    $xfer += $output->writeFieldBegin('property', TType::STRING, 1);
+    $xfer += $output->writeString($self->{property});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_get_string_list_property_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_get_string_list_property_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_get_string_list_property_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size138 = 0;
+          $self->{success} = [];
+          my $_etype141 = 0;
+          $xfer += $input->readListBegin(\$_etype141, \$_size138);
+          for (my $_i142 = 0; $_i142 < $_size138; ++$_i142)
+          {
+            my $elem143 = undef;
+            $xfer += $input->readString(\$elem143);
+            push(@{$self->{success}},$elem143);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_get_string_list_property_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::LIST, 0);
+    {
+      $output->writeListBegin(TType::STRING, scalar(@{$self->{success}}));
+      {
+        foreach my $iter144 (@{$self->{success}}) 
+        {
+          $xfer += $output->writeString($iter144);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_keyspaces_args;
+use base qw(Class::Accessor);
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_keyspaces_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_keyspaces_args');
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_keyspaces_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_keyspaces_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_keyspaces_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::SET) {
+        {
+          my $_size145 = 0;
+          $self->{success} = {};
+          my $_etype148 = 0;
+          $xfer += $input->readSetBegin(\$_etype148, \$_size145);
+          for (my $_i149 = 0; $_i149 < $_size145; ++$_i149)
+          {
+            my $elem150 = undef;
+            $xfer += $input->readString(\$elem150);
+            $self->{success}->{$elem150} = 1;
+          }
+          $xfer += $input->readSetEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_keyspaces_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::SET, 0);
+    {
+      $output->writeSetBegin(TType::STRING, scalar(@{$self->{success}}));
+      {
+        foreach my $iter151 (@{$self->{success}})
+        {
+          $xfer += $output->writeString($iter151);
+        }
+      }
+      $output->writeSetEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_cluster_name_args;
+use base qw(Class::Accessor);
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_cluster_name_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_cluster_name_args');
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_cluster_name_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_cluster_name_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_cluster_name_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{success});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_cluster_name_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::STRING, 0);
+    $xfer += $output->writeString($self->{success});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_version_args;
+use base qw(Class::Accessor);
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_version_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_version_args');
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_version_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_version_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_version_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{success});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_version_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::STRING, 0);
+    $xfer += $output->writeString($self->{success});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_ring_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_ring_args->mk_accessors( qw( keyspace ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_ring_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_ring_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_ring_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_ring_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_ring_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size152 = 0;
+          $self->{success} = [];
+          my $_etype155 = 0;
+          $xfer += $input->readListBegin(\$_etype155, \$_size152);
+          for (my $_i156 = 0; $_i156 < $_size152; ++$_i156)
+          {
+            my $elem157 = undef;
+            $elem157 = new Cassandra::TokenRange();
+            $xfer += $elem157->read($input);
+            push(@{$self->{success}},$elem157);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_ring_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::LIST, 0);
+    {
+      $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}}));
+      {
+        foreach my $iter158 (@{$self->{success}}) 
+        {
+          $xfer += ${iter158}->write($output);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_keyspace_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_keyspace_args->mk_accessors( qw( keyspace ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{keyspace} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{keyspace}) {
+      $self->{keyspace} = $vals->{keyspace};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_keyspace_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{keyspace});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_keyspace_args');
+  if (defined $self->{keyspace}) {
+    $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1);
+    $xfer += $output->writeString($self->{keyspace});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_keyspace_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_keyspace_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  $self->{nfe} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+    if (defined $vals->{nfe}) {
+      $self->{nfe} = $vals->{nfe};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_keyspace_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::MAP) {
+        {
+          my $_size159 = 0;
+          $self->{success} = {};
+          my $_ktype160 = 0;
+          my $_vtype161 = 0;
+          $xfer += $input->readMapBegin(\$_ktype160, \$_vtype161, \$_size159);
+          for (my $_i163 = 0; $_i163 < $_size159; ++$_i163)
+          {
+            my $key164 = '';
+            my $val165 = [];
+            $xfer += $input->readString(\$key164);
+            {
+              my $_size166 = 0;
+              $val165 = {};
+              my $_ktype167 = 0;
+              my $_vtype168 = 0;
+              $xfer += $input->readMapBegin(\$_ktype167, \$_vtype168, \$_size166);
+              for (my $_i170 = 0; $_i170 < $_size166; ++$_i170)
+              {
+                my $key171 = '';
+                my $val172 = '';
+                $xfer += $input->readString(\$key171);
+                $xfer += $input->readString(\$val172);
+                $val165->{$key171} = $val172;
+              }
+              $xfer += $input->readMapEnd();
+            }
+            $self->{success}->{$key164} = $val165;
+          }
+          $xfer += $input->readMapEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{nfe} = new Cassandra::NotFoundException();
+        $xfer += $self->{nfe}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_keyspace_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::MAP, 0);
+    {
+      $output->writeMapBegin(TType::STRING, TType::MAP, scalar(keys %{$self->{success}}));
+      {
+        while( my ($kiter173,$viter174) = each %{$self->{success}}) 
+        {
+          $xfer += $output->writeString($kiter173);
+          {
+            $output->writeMapBegin(TType::STRING, TType::STRING, scalar(keys %{${viter174}}));
+            {
+              while( my ($kiter175,$viter176) = each %{${viter174}}) 
+              {
+                $xfer += $output->writeString($kiter175);
+                $xfer += $output->writeString($viter176);
+              }
+            }
+            $output->writeMapEnd();
+          }
+        }
+      }
+      $output->writeMapEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{nfe}) {
+    $xfer += $output->writeFieldBegin('nfe', TType::STRUCT, 1);
+    $xfer += $self->{nfe}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_splits_args;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_splits_args->mk_accessors( qw( start_token end_token keys_per_split ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{start_token} = undef;
+  $self->{end_token} = undef;
+  $self->{keys_per_split} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{start_token}) {
+      $self->{start_token} = $vals->{start_token};
+    }
+    if (defined $vals->{end_token}) {
+      $self->{end_token} = $vals->{end_token};
+    }
+    if (defined $vals->{keys_per_split}) {
+      $self->{keys_per_split} = $vals->{keys_per_split};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_splits_args';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{start_token});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{end_token});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{keys_per_split});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_splits_args');
+  if (defined $self->{start_token}) {
+    $xfer += $output->writeFieldBegin('start_token', TType::STRING, 1);
+    $xfer += $output->writeString($self->{start_token});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{end_token}) {
+    $xfer += $output->writeFieldBegin('end_token', TType::STRING, 2);
+    $xfer += $output->writeString($self->{end_token});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{keys_per_split}) {
+    $xfer += $output->writeFieldBegin('keys_per_split', TType::I32, 3);
+    $xfer += $output->writeI32($self->{keys_per_split});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Cassandra_describe_splits_result;
+use base qw(Class::Accessor);
+Cassandra::Cassandra_describe_splits_result->mk_accessors( qw( success ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{success} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{success}) {
+      $self->{success} = $vals->{success};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Cassandra_describe_splits_result';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^0$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size177 = 0;
+          $self->{success} = [];
+          my $_etype180 = 0;
+          $xfer += $input->readListBegin(\$_etype180, \$_size177);
+          for (my $_i181 = 0; $_i181 < $_size177; ++$_i181)
+          {
+            my $elem182 = undef;
+            $xfer += $input->readString(\$elem182);
+            push(@{$self->{success}},$elem182);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Cassandra_describe_splits_result');
+  if (defined $self->{success}) {
+    $xfer += $output->writeFieldBegin('success', TType::LIST, 0);
+    {
+      $output->writeListBegin(TType::STRING, scalar(@{$self->{success}}));
+      {
+        foreach my $iter183 (@{$self->{success}}) 
+        {
+          $xfer += $output->writeString($iter183);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::CassandraIf;
+
+use strict;
+
+
+sub login{
+  my $self = shift;
+  my $keyspace = shift;
+  my $auth_request = shift;
+
+  die 'implement interface';
+}
+
+sub get{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub get_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub multiget{
+  my $self = shift;
+  my $keyspace = shift;
+  my $keys = shift;
+  my $column_path = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub multiget_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $keys = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub get_count{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_parent = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub get_range_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $start_key = shift;
+  my $finish_key = shift;
+  my $row_count = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub get_range_slices{
+  my $self = shift;
+  my $keyspace = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $range = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub insert{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $value = shift;
+  my $timestamp = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub batch_insert{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $cfmap = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub remove{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $timestamp = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub batch_mutate{
+  my $self = shift;
+  my $keyspace = shift;
+  my $mutation_map = shift;
+  my $consistency_level = shift;
+
+  die 'implement interface';
+}
+
+sub get_string_property{
+  my $self = shift;
+  my $property = shift;
+
+  die 'implement interface';
+}
+
+sub get_string_list_property{
+  my $self = shift;
+  my $property = shift;
+
+  die 'implement interface';
+}
+
+sub describe_keyspaces{
+  my $self = shift;
+
+  die 'implement interface';
+}
+
+sub describe_cluster_name{
+  my $self = shift;
+
+  die 'implement interface';
+}
+
+sub describe_version{
+  my $self = shift;
+
+  die 'implement interface';
+}
+
+sub describe_ring{
+  my $self = shift;
+  my $keyspace = shift;
+
+  die 'implement interface';
+}
+
+sub describe_keyspace{
+  my $self = shift;
+  my $keyspace = shift;
+
+  die 'implement interface';
+}
+
+sub describe_splits{
+  my $self = shift;
+  my $start_token = shift;
+  my $end_token = shift;
+  my $keys_per_split = shift;
+
+  die 'implement interface';
+}
+
+package Cassandra::CassandraRest;
+
+use strict;
+
+
+sub new {
+  my ($classname, $impl) = @_;
+  my $self     ={ impl => $impl };
+
+  return bless($self,$classname);
+}
+
+sub login{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $auth_request = ($request->{'auth_request'}) ? $request->{'auth_request'} : undef;
+  return $self->{impl}->login($keyspace, $auth_request);
+}
+
+sub get{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $key = ($request->{'key'}) ? $request->{'key'} : undef;
+  my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->get($keyspace, $key, $column_path, $consistency_level);
+}
+
+sub get_slice{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $key = ($request->{'key'}) ? $request->{'key'} : undef;
+  my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef;
+  my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->get_slice($keyspace, $key, $column_parent, $predicate, $consistency_level);
+}
+
+sub multiget{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $keys = ($request->{'keys'}) ? $request->{'keys'} : undef;
+  my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->multiget($keyspace, $keys, $column_path, $consistency_level);
+}
+
+sub multiget_slice{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $keys = ($request->{'keys'}) ? $request->{'keys'} : undef;
+  my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef;
+  my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->multiget_slice($keyspace, $keys, $column_parent, $predicate, $consistency_level);
+}
+
+sub get_count{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $key = ($request->{'key'}) ? $request->{'key'} : undef;
+  my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->get_count($keyspace, $key, $column_parent, $consistency_level);
+}
+
+sub get_range_slice{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef;
+  my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef;
+  my $start_key = ($request->{'start_key'}) ? $request->{'start_key'} : undef;
+  my $finish_key = ($request->{'finish_key'}) ? $request->{'finish_key'} : undef;
+  my $row_count = ($request->{'row_count'}) ? $request->{'row_count'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->get_range_slice($keyspace, $column_parent, $predicate, $start_key, $finish_key, $row_count, $consistency_level);
+}
+
+sub get_range_slices{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef;
+  my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef;
+  my $range = ($request->{'range'}) ? $request->{'range'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->get_range_slices($keyspace, $column_parent, $predicate, $range, $consistency_level);
+}
+
+sub insert{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $key = ($request->{'key'}) ? $request->{'key'} : undef;
+  my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef;
+  my $value = ($request->{'value'}) ? $request->{'value'} : undef;
+  my $timestamp = ($request->{'timestamp'}) ? $request->{'timestamp'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->insert($keyspace, $key, $column_path, $value, $timestamp, $consistency_level);
+}
+
+sub batch_insert{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $key = ($request->{'key'}) ? $request->{'key'} : undef;
+  my $cfmap = ($request->{'cfmap'}) ? $request->{'cfmap'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->batch_insert($keyspace, $key, $cfmap, $consistency_level);
+}
+
+sub remove{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $key = ($request->{'key'}) ? $request->{'key'} : undef;
+  my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef;
+  my $timestamp = ($request->{'timestamp'}) ? $request->{'timestamp'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->remove($keyspace, $key, $column_path, $timestamp, $consistency_level);
+}
+
+sub batch_mutate{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  my $mutation_map = ($request->{'mutation_map'}) ? $request->{'mutation_map'} : undef;
+  my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef;
+  return $self->{impl}->batch_mutate($keyspace, $mutation_map, $consistency_level);
+}
+
+sub get_string_property{
+  my ($self, $request) = @_;
+
+  my $property = ($request->{'property'}) ? $request->{'property'} : undef;
+  return $self->{impl}->get_string_property($property);
+}
+
+sub get_string_list_property{
+  my ($self, $request) = @_;
+
+  my $property = ($request->{'property'}) ? $request->{'property'} : undef;
+  return $self->{impl}->get_string_list_property($property);
+}
+
+sub describe_keyspaces{
+  my ($self, $request) = @_;
+
+  return $self->{impl}->describe_keyspaces();
+}
+
+sub describe_cluster_name{
+  my ($self, $request) = @_;
+
+  return $self->{impl}->describe_cluster_name();
+}
+
+sub describe_version{
+  my ($self, $request) = @_;
+
+  return $self->{impl}->describe_version();
+}
+
+sub describe_ring{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  return $self->{impl}->describe_ring($keyspace);
+}
+
+sub describe_keyspace{
+  my ($self, $request) = @_;
+
+  my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef;
+  return $self->{impl}->describe_keyspace($keyspace);
+}
+
+sub describe_splits{
+  my ($self, $request) = @_;
+
+  my $start_token = ($request->{'start_token'}) ? $request->{'start_token'} : undef;
+  my $end_token = ($request->{'end_token'}) ? $request->{'end_token'} : undef;
+  my $keys_per_split = ($request->{'keys_per_split'}) ? $request->{'keys_per_split'} : undef;
+  return $self->{impl}->describe_splits($start_token, $end_token, $keys_per_split);
+}
+
+package Cassandra::CassandraClient;
+
+
+use base qw(Cassandra::CassandraIf);
+sub new {
+  my ($classname, $input, $output) = @_;
+  my $self      = {};
+  $self->{input}  = $input;
+  $self->{output} = defined $output ? $output : $input;
+  $self->{seqid}  = 0;
+  return bless($self,$classname);
+}
+
+sub login{
+  my $self = shift;
+  my $keyspace = shift;
+  my $auth_request = shift;
+
+    $self->send_login($keyspace, $auth_request);
+  $self->recv_login();
+}
+
+sub send_login{
+  my $self = shift;
+  my $keyspace = shift;
+  my $auth_request = shift;
+
+  $self->{output}->writeMessageBegin('login', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_login_args();
+  $args->{keyspace} = $keyspace;
+  $args->{auth_request} = $auth_request;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_login{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_login_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{authnx}) {
+    die $result->{authnx};
+  }
+  if (defined $result->{authzx}) {
+    die $result->{authzx};
+  }
+  return;
+}
+sub get{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $consistency_level = shift;
+
+    $self->send_get($keyspace, $key, $column_path, $consistency_level);
+  return $self->recv_get();
+}
+
+sub send_get{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('get', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_args();
+  $args->{keyspace} = $keyspace;
+  $args->{key} = $key;
+  $args->{column_path} = $column_path;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{nfe}) {
+    die $result->{nfe};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "get failed: unknown result";
+}
+sub get_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $consistency_level = shift;
+
+    $self->send_get_slice($keyspace, $key, $column_parent, $predicate, $consistency_level);
+  return $self->recv_get_slice();
+}
+
+sub send_get_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('get_slice', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_slice_args();
+  $args->{keyspace} = $keyspace;
+  $args->{key} = $key;
+  $args->{column_parent} = $column_parent;
+  $args->{predicate} = $predicate;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get_slice{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_slice_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "get_slice failed: unknown result";
+}
+sub multiget{
+  my $self = shift;
+  my $keyspace = shift;
+  my $keys = shift;
+  my $column_path = shift;
+  my $consistency_level = shift;
+
+    $self->send_multiget($keyspace, $keys, $column_path, $consistency_level);
+  return $self->recv_multiget();
+}
+
+sub send_multiget{
+  my $self = shift;
+  my $keyspace = shift;
+  my $keys = shift;
+  my $column_path = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('multiget', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_multiget_args();
+  $args->{keyspace} = $keyspace;
+  $args->{keys} = $keys;
+  $args->{column_path} = $column_path;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_multiget{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_multiget_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "multiget failed: unknown result";
+}
+sub multiget_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $keys = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $consistency_level = shift;
+
+    $self->send_multiget_slice($keyspace, $keys, $column_parent, $predicate, $consistency_level);
+  return $self->recv_multiget_slice();
+}
+
+sub send_multiget_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $keys = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('multiget_slice', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_multiget_slice_args();
+  $args->{keyspace} = $keyspace;
+  $args->{keys} = $keys;
+  $args->{column_parent} = $column_parent;
+  $args->{predicate} = $predicate;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_multiget_slice{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_multiget_slice_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "multiget_slice failed: unknown result";
+}
+sub get_count{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_parent = shift;
+  my $consistency_level = shift;
+
+    $self->send_get_count($keyspace, $key, $column_parent, $consistency_level);
+  return $self->recv_get_count();
+}
+
+sub send_get_count{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_parent = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('get_count', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_count_args();
+  $args->{keyspace} = $keyspace;
+  $args->{key} = $key;
+  $args->{column_parent} = $column_parent;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get_count{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_count_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "get_count failed: unknown result";
+}
+sub get_range_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $start_key = shift;
+  my $finish_key = shift;
+  my $row_count = shift;
+  my $consistency_level = shift;
+
+    $self->send_get_range_slice($keyspace, $column_parent, $predicate, $start_key, $finish_key, $row_count, $consistency_level);
+  return $self->recv_get_range_slice();
+}
+
+sub send_get_range_slice{
+  my $self = shift;
+  my $keyspace = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $start_key = shift;
+  my $finish_key = shift;
+  my $row_count = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('get_range_slice', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_range_slice_args();
+  $args->{keyspace} = $keyspace;
+  $args->{column_parent} = $column_parent;
+  $args->{predicate} = $predicate;
+  $args->{start_key} = $start_key;
+  $args->{finish_key} = $finish_key;
+  $args->{row_count} = $row_count;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get_range_slice{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_range_slice_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "get_range_slice failed: unknown result";
+}
+sub get_range_slices{
+  my $self = shift;
+  my $keyspace = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $range = shift;
+  my $consistency_level = shift;
+
+    $self->send_get_range_slices($keyspace, $column_parent, $predicate, $range, $consistency_level);
+  return $self->recv_get_range_slices();
+}
+
+sub send_get_range_slices{
+  my $self = shift;
+  my $keyspace = shift;
+  my $column_parent = shift;
+  my $predicate = shift;
+  my $range = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('get_range_slices', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_range_slices_args();
+  $args->{keyspace} = $keyspace;
+  $args->{column_parent} = $column_parent;
+  $args->{predicate} = $predicate;
+  $args->{range} = $range;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get_range_slices{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_range_slices_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  die "get_range_slices failed: unknown result";
+}
+sub insert{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $value = shift;
+  my $timestamp = shift;
+  my $consistency_level = shift;
+
+    $self->send_insert($keyspace, $key, $column_path, $value, $timestamp, $consistency_level);
+  $self->recv_insert();
+}
+
+sub send_insert{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $value = shift;
+  my $timestamp = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('insert', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_insert_args();
+  $args->{keyspace} = $keyspace;
+  $args->{key} = $key;
+  $args->{column_path} = $column_path;
+  $args->{value} = $value;
+  $args->{timestamp} = $timestamp;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_insert{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_insert_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  return;
+}
+sub batch_insert{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $cfmap = shift;
+  my $consistency_level = shift;
+
+    $self->send_batch_insert($keyspace, $key, $cfmap, $consistency_level);
+  $self->recv_batch_insert();
+}
+
+sub send_batch_insert{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $cfmap = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('batch_insert', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_batch_insert_args();
+  $args->{keyspace} = $keyspace;
+  $args->{key} = $key;
+  $args->{cfmap} = $cfmap;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_batch_insert{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_batch_insert_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  return;
+}
+sub remove{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $timestamp = shift;
+  my $consistency_level = shift;
+
+    $self->send_remove($keyspace, $key, $column_path, $timestamp, $consistency_level);
+  $self->recv_remove();
+}
+
+sub send_remove{
+  my $self = shift;
+  my $keyspace = shift;
+  my $key = shift;
+  my $column_path = shift;
+  my $timestamp = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('remove', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_remove_args();
+  $args->{keyspace} = $keyspace;
+  $args->{key} = $key;
+  $args->{column_path} = $column_path;
+  $args->{timestamp} = $timestamp;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_remove{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_remove_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  return;
+}
+sub batch_mutate{
+  my $self = shift;
+  my $keyspace = shift;
+  my $mutation_map = shift;
+  my $consistency_level = shift;
+
+    $self->send_batch_mutate($keyspace, $mutation_map, $consistency_level);
+  $self->recv_batch_mutate();
+}
+
+sub send_batch_mutate{
+  my $self = shift;
+  my $keyspace = shift;
+  my $mutation_map = shift;
+  my $consistency_level = shift;
+
+  $self->{output}->writeMessageBegin('batch_mutate', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_batch_mutate_args();
+  $args->{keyspace} = $keyspace;
+  $args->{mutation_map} = $mutation_map;
+  $args->{consistency_level} = $consistency_level;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_batch_mutate{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_batch_mutate_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{ire}) {
+    die $result->{ire};
+  }
+  if (defined $result->{ue}) {
+    die $result->{ue};
+  }
+  if (defined $result->{te}) {
+    die $result->{te};
+  }
+  return;
+}
+sub get_string_property{
+  my $self = shift;
+  my $property = shift;
+
+    $self->send_get_string_property($property);
+  return $self->recv_get_string_property();
+}
+
+sub send_get_string_property{
+  my $self = shift;
+  my $property = shift;
+
+  $self->{output}->writeMessageBegin('get_string_property', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_string_property_args();
+  $args->{property} = $property;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get_string_property{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_string_property_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "get_string_property failed: unknown result";
+}
+sub get_string_list_property{
+  my $self = shift;
+  my $property = shift;
+
+    $self->send_get_string_list_property($property);
+  return $self->recv_get_string_list_property();
+}
+
+sub send_get_string_list_property{
+  my $self = shift;
+  my $property = shift;
+
+  $self->{output}->writeMessageBegin('get_string_list_property', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_get_string_list_property_args();
+  $args->{property} = $property;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_get_string_list_property{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_get_string_list_property_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "get_string_list_property failed: unknown result";
+}
+sub describe_keyspaces{
+  my $self = shift;
+
+    $self->send_describe_keyspaces();
+  return $self->recv_describe_keyspaces();
+}
+
+sub send_describe_keyspaces{
+  my $self = shift;
+
+  $self->{output}->writeMessageBegin('describe_keyspaces', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_describe_keyspaces_args();
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_describe_keyspaces{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_describe_keyspaces_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "describe_keyspaces failed: unknown result";
+}
+sub describe_cluster_name{
+  my $self = shift;
+
+    $self->send_describe_cluster_name();
+  return $self->recv_describe_cluster_name();
+}
+
+sub send_describe_cluster_name{
+  my $self = shift;
+
+  $self->{output}->writeMessageBegin('describe_cluster_name', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_describe_cluster_name_args();
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_describe_cluster_name{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_describe_cluster_name_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "describe_cluster_name failed: unknown result";
+}
+sub describe_version{
+  my $self = shift;
+
+    $self->send_describe_version();
+  return $self->recv_describe_version();
+}
+
+sub send_describe_version{
+  my $self = shift;
+
+  $self->{output}->writeMessageBegin('describe_version', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_describe_version_args();
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_describe_version{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_describe_version_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "describe_version failed: unknown result";
+}
+sub describe_ring{
+  my $self = shift;
+  my $keyspace = shift;
+
+    $self->send_describe_ring($keyspace);
+  return $self->recv_describe_ring();
+}
+
+sub send_describe_ring{
+  my $self = shift;
+  my $keyspace = shift;
+
+  $self->{output}->writeMessageBegin('describe_ring', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_describe_ring_args();
+  $args->{keyspace} = $keyspace;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_describe_ring{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_describe_ring_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "describe_ring failed: unknown result";
+}
+sub describe_keyspace{
+  my $self = shift;
+  my $keyspace = shift;
+
+    $self->send_describe_keyspace($keyspace);
+  return $self->recv_describe_keyspace();
+}
+
+sub send_describe_keyspace{
+  my $self = shift;
+  my $keyspace = shift;
+
+  $self->{output}->writeMessageBegin('describe_keyspace', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_describe_keyspace_args();
+  $args->{keyspace} = $keyspace;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_describe_keyspace{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_describe_keyspace_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  if (defined $result->{nfe}) {
+    die $result->{nfe};
+  }
+  die "describe_keyspace failed: unknown result";
+}
+sub describe_splits{
+  my $self = shift;
+  my $start_token = shift;
+  my $end_token = shift;
+  my $keys_per_split = shift;
+
+    $self->send_describe_splits($start_token, $end_token, $keys_per_split);
+  return $self->recv_describe_splits();
+}
+
+sub send_describe_splits{
+  my $self = shift;
+  my $start_token = shift;
+  my $end_token = shift;
+  my $keys_per_split = shift;
+
+  $self->{output}->writeMessageBegin('describe_splits', TMessageType::CALL, $self->{seqid});
+  my $args = new Cassandra::Cassandra_describe_splits_args();
+  $args->{start_token} = $start_token;
+  $args->{end_token} = $end_token;
+  $args->{keys_per_split} = $keys_per_split;
+  $args->write($self->{output});
+  $self->{output}->writeMessageEnd();
+  $self->{output}->getTransport()->flush();
+}
+
+sub recv_describe_splits{
+  my $self = shift;
+
+  my $rseqid = 0;
+  my $fname;
+  my $mtype = 0;
+
+  $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid);
+  if ($mtype == TMessageType::EXCEPTION) {
+    my $x = new TApplicationException();
+    $x->read($self->{input});
+    $self->{input}->readMessageEnd();
+    die $x;
+  }
+  my $result = new Cassandra::Cassandra_describe_splits_result();
+  $result->read($self->{input});
+  $self->{input}->readMessageEnd();
+
+  if (defined $result->{success} ) {
+    return $result->{success};
+  }
+  die "describe_splits failed: unknown result";
+}
+package Cassandra::CassandraProcessor;
+
+use strict;
+
+
+sub new {
+    my ($classname, $handler) = @_;
+    my $self      = {};
+    $self->{handler} = $handler;
+    return bless ($self, $classname);
+}
+
+sub process {
+    my ($self, $input, $output) = @_;
+    my $rseqid = 0;
+    my $fname  = undef;
+    my $mtype  = 0;
+
+    $input->readMessageBegin(\$fname, \$mtype, \$rseqid);
+    my $methodname = 'process_'.$fname;
+    if (!$self->can($methodname)) {
+      $input->skip(TType::STRUCT);
+      $input->readMessageEnd();
+      my $x = new TApplicationException('Function '.$fname.' not implemented.', TApplicationException::UNKNOWN_METHOD);
+      $output->writeMessageBegin($fname, TMessageType::EXCEPTION, $rseqid);
+      $x->write($output);
+      $output->writeMessageEnd();
+      $output->getTransport()->flush();
+      return;
+    }
+    $self->$methodname($rseqid, $input, $output);
+    return 1;
+}
+
+sub process_login {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_login_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_login_result();
+    eval {
+      $self->{handler}->login($args->keyspace, $args->auth_request);
+    }; if( UNIVERSAL::isa($@,'Cassandra::AuthenticationException') ){ 
+      $result->{authnx} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::AuthorizationException') ){ 
+      $result->{authzx} = $@;
+    }
+    $output->writeMessageBegin('login', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_result();
+    eval {
+      $result->{success} = $self->{handler}->get($args->keyspace, $args->key, $args->column_path, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::NotFoundException') ){ 
+      $result->{nfe} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('get', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get_slice {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_slice_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_slice_result();
+    eval {
+      $result->{success} = $self->{handler}->get_slice($args->keyspace, $args->key, $args->column_parent, $args->predicate, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('get_slice', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_multiget {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_multiget_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_multiget_result();
+    eval {
+      $result->{success} = $self->{handler}->multiget($args->keyspace, $args->keys, $args->column_path, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('multiget', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_multiget_slice {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_multiget_slice_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_multiget_slice_result();
+    eval {
+      $result->{success} = $self->{handler}->multiget_slice($args->keyspace, $args->keys, $args->column_parent, $args->predicate, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('multiget_slice', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get_count {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_count_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_count_result();
+    eval {
+      $result->{success} = $self->{handler}->get_count($args->keyspace, $args->key, $args->column_parent, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('get_count', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get_range_slice {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_range_slice_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_range_slice_result();
+    eval {
+      $result->{success} = $self->{handler}->get_range_slice($args->keyspace, $args->column_parent, $args->predicate, $args->start_key, $args->finish_key, $args->row_count, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('get_range_slice', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get_range_slices {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_range_slices_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_range_slices_result();
+    eval {
+      $result->{success} = $self->{handler}->get_range_slices($args->keyspace, $args->column_parent, $args->predicate, $args->range, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('get_range_slices', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_insert {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_insert_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_insert_result();
+    eval {
+      $self->{handler}->insert($args->keyspace, $args->key, $args->column_path, $args->value, $args->timestamp, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('insert', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_batch_insert {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_batch_insert_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_batch_insert_result();
+    eval {
+      $self->{handler}->batch_insert($args->keyspace, $args->key, $args->cfmap, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('batch_insert', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_remove {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_remove_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_remove_result();
+    eval {
+      $self->{handler}->remove($args->keyspace, $args->key, $args->column_path, $args->timestamp, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('remove', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_batch_mutate {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_batch_mutate_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_batch_mutate_result();
+    eval {
+      $self->{handler}->batch_mutate($args->keyspace, $args->mutation_map, $args->consistency_level);
+    }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ 
+      $result->{ire} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ 
+      $result->{ue} = $@;
+        }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ 
+      $result->{te} = $@;
+    }
+    $output->writeMessageBegin('batch_mutate', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get_string_property {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_string_property_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_string_property_result();
+    $result->{success} = $self->{handler}->get_string_property($args->property);
+    $output->writeMessageBegin('get_string_property', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_get_string_list_property {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_get_string_list_property_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_get_string_list_property_result();
+    $result->{success} = $self->{handler}->get_string_list_property($args->property);
+    $output->writeMessageBegin('get_string_list_property', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_describe_keyspaces {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_describe_keyspaces_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_describe_keyspaces_result();
+    $result->{success} = $self->{handler}->describe_keyspaces();
+    $output->writeMessageBegin('describe_keyspaces', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_describe_cluster_name {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_describe_cluster_name_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_describe_cluster_name_result();
+    $result->{success} = $self->{handler}->describe_cluster_name();
+    $output->writeMessageBegin('describe_cluster_name', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_describe_version {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_describe_version_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_describe_version_result();
+    $result->{success} = $self->{handler}->describe_version();
+    $output->writeMessageBegin('describe_version', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_describe_ring {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_describe_ring_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_describe_ring_result();
+    $result->{success} = $self->{handler}->describe_ring($args->keyspace);
+    $output->writeMessageBegin('describe_ring', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_describe_keyspace {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_describe_keyspace_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_describe_keyspace_result();
+    eval {
+      $result->{success} = $self->{handler}->describe_keyspace($args->keyspace);
+    }; if( UNIVERSAL::isa($@,'Cassandra::NotFoundException') ){ 
+      $result->{nfe} = $@;
+    }
+    $output->writeMessageBegin('describe_keyspace', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+sub process_describe_splits {
+    my ($self, $seqid, $input, $output) = @_;
+    my $args = new Cassandra::Cassandra_describe_splits_args();
+    $args->read($input);
+    $input->readMessageEnd();
+    my $result = new Cassandra::Cassandra_describe_splits_result();
+    $result->{success} = $self->{handler}->describe_splits($args->start_token, $args->end_token, $args->keys_per_split);
+    $output->writeMessageBegin('describe_splits', TMessageType::REPLY, $seqid);
+    $result->write($output);
+    $output->writeMessageEnd();
+    $output->getTransport()->flush();
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Cassandra/Constants.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,15 @@
+#
+# Autogenerated by Thrift
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+package Cassandra::Constants;
+require 5.6.0;
+use strict;
+use warnings;
+use Thrift;
+
+
+use constant VERSION => "2.1.0";
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Cassandra/Types.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,1619 @@
+#
+# Autogenerated by Thrift
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+require 5.6.0;
+use strict;
+use warnings;
+use Thrift;
+
+package Cassandra::ConsistencyLevel;
+use constant ZERO => 0;
+use constant ONE => 1;
+use constant QUORUM => 2;
+use constant DCQUORUM => 3;
+use constant DCQUORUMSYNC => 4;
+use constant ALL => 5;
+use constant ANY => 6;
+package Cassandra::Column;
+use base qw(Class::Accessor);
+Cassandra::Column->mk_accessors( qw( name value timestamp ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{name} = undef;
+  $self->{value} = undef;
+  $self->{timestamp} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{name}) {
+      $self->{name} = $vals->{name};
+    }
+    if (defined $vals->{value}) {
+      $self->{value} = $vals->{value};
+    }
+    if (defined $vals->{timestamp}) {
+      $self->{timestamp} = $vals->{timestamp};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Column';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{name});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{value});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::I64) {
+        $xfer += $input->readI64(\$self->{timestamp});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Column');
+  if (defined $self->{name}) {
+    $xfer += $output->writeFieldBegin('name', TType::STRING, 1);
+    $xfer += $output->writeString($self->{name});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{value}) {
+    $xfer += $output->writeFieldBegin('value', TType::STRING, 2);
+    $xfer += $output->writeString($self->{value});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{timestamp}) {
+    $xfer += $output->writeFieldBegin('timestamp', TType::I64, 3);
+    $xfer += $output->writeI64($self->{timestamp});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::SuperColumn;
+use base qw(Class::Accessor);
+Cassandra::SuperColumn->mk_accessors( qw( name columns ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{name} = undef;
+  $self->{columns} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{name}) {
+      $self->{name} = $vals->{name};
+    }
+    if (defined $vals->{columns}) {
+      $self->{columns} = $vals->{columns};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'SuperColumn';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{name});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size0 = 0;
+          $self->{columns} = [];
+          my $_etype3 = 0;
+          $xfer += $input->readListBegin(\$_etype3, \$_size0);
+          for (my $_i4 = 0; $_i4 < $_size0; ++$_i4)
+          {
+            my $elem5 = undef;
+            $elem5 = new Cassandra::Column();
+            $xfer += $elem5->read($input);
+            push(@{$self->{columns}},$elem5);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('SuperColumn');
+  if (defined $self->{name}) {
+    $xfer += $output->writeFieldBegin('name', TType::STRING, 1);
+    $xfer += $output->writeString($self->{name});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{columns}) {
+    $xfer += $output->writeFieldBegin('columns', TType::LIST, 2);
+    {
+      $output->writeListBegin(TType::STRUCT, scalar(@{$self->{columns}}));
+      {
+        foreach my $iter6 (@{$self->{columns}}) 
+        {
+          $xfer += ${iter6}->write($output);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::ColumnOrSuperColumn;
+use base qw(Class::Accessor);
+Cassandra::ColumnOrSuperColumn->mk_accessors( qw( column super_column ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{column} = undef;
+  $self->{super_column} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{column}) {
+      $self->{column} = $vals->{column};
+    }
+    if (defined $vals->{super_column}) {
+      $self->{super_column} = $vals->{super_column};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'ColumnOrSuperColumn';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column} = new Cassandra::Column();
+        $xfer += $self->{column}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{super_column} = new Cassandra::SuperColumn();
+        $xfer += $self->{super_column}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('ColumnOrSuperColumn');
+  if (defined $self->{column}) {
+    $xfer += $output->writeFieldBegin('column', TType::STRUCT, 1);
+    $xfer += $self->{column}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{super_column}) {
+    $xfer += $output->writeFieldBegin('super_column', TType::STRUCT, 2);
+    $xfer += $self->{super_column}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::NotFoundException;
+use base qw(Thrift::TException);
+use base qw(Class::Accessor);
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'NotFoundException';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('NotFoundException');
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::InvalidRequestException;
+use base qw(Thrift::TException);
+use base qw(Class::Accessor);
+Cassandra::InvalidRequestException->mk_accessors( qw( why ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{why} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{why}) {
+      $self->{why} = $vals->{why};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'InvalidRequestException';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{why});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('InvalidRequestException');
+  if (defined $self->{why}) {
+    $xfer += $output->writeFieldBegin('why', TType::STRING, 1);
+    $xfer += $output->writeString($self->{why});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::UnavailableException;
+use base qw(Thrift::TException);
+use base qw(Class::Accessor);
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'UnavailableException';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('UnavailableException');
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::TimedOutException;
+use base qw(Thrift::TException);
+use base qw(Class::Accessor);
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'TimedOutException';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('TimedOutException');
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::AuthenticationException;
+use base qw(Thrift::TException);
+use base qw(Class::Accessor);
+Cassandra::AuthenticationException->mk_accessors( qw( why ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{why} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{why}) {
+      $self->{why} = $vals->{why};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'AuthenticationException';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{why});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('AuthenticationException');
+  if (defined $self->{why}) {
+    $xfer += $output->writeFieldBegin('why', TType::STRING, 1);
+    $xfer += $output->writeString($self->{why});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::AuthorizationException;
+use base qw(Thrift::TException);
+use base qw(Class::Accessor);
+Cassandra::AuthorizationException->mk_accessors( qw( why ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{why} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{why}) {
+      $self->{why} = $vals->{why};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'AuthorizationException';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{why});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('AuthorizationException');
+  if (defined $self->{why}) {
+    $xfer += $output->writeFieldBegin('why', TType::STRING, 1);
+    $xfer += $output->writeString($self->{why});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::ColumnParent;
+use base qw(Class::Accessor);
+Cassandra::ColumnParent->mk_accessors( qw( column_family super_column ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{column_family} = undef;
+  $self->{super_column} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{column_family}) {
+      $self->{column_family} = $vals->{column_family};
+    }
+    if (defined $vals->{super_column}) {
+      $self->{super_column} = $vals->{super_column};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'ColumnParent';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^3$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{column_family});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{super_column});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('ColumnParent');
+  if (defined $self->{column_family}) {
+    $xfer += $output->writeFieldBegin('column_family', TType::STRING, 3);
+    $xfer += $output->writeString($self->{column_family});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{super_column}) {
+    $xfer += $output->writeFieldBegin('super_column', TType::STRING, 4);
+    $xfer += $output->writeString($self->{super_column});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::ColumnPath;
+use base qw(Class::Accessor);
+Cassandra::ColumnPath->mk_accessors( qw( column_family super_column column ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{column_family} = undef;
+  $self->{super_column} = undef;
+  $self->{column} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{column_family}) {
+      $self->{column_family} = $vals->{column_family};
+    }
+    if (defined $vals->{super_column}) {
+      $self->{super_column} = $vals->{super_column};
+    }
+    if (defined $vals->{column}) {
+      $self->{column} = $vals->{column};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'ColumnPath';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^3$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{column_family});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{super_column});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{column});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('ColumnPath');
+  if (defined $self->{column_family}) {
+    $xfer += $output->writeFieldBegin('column_family', TType::STRING, 3);
+    $xfer += $output->writeString($self->{column_family});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{super_column}) {
+    $xfer += $output->writeFieldBegin('super_column', TType::STRING, 4);
+    $xfer += $output->writeString($self->{super_column});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{column}) {
+    $xfer += $output->writeFieldBegin('column', TType::STRING, 5);
+    $xfer += $output->writeString($self->{column});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::SliceRange;
+use base qw(Class::Accessor);
+Cassandra::SliceRange->mk_accessors( qw( start finish reversed count ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{start} = undef;
+  $self->{finish} = undef;
+  $self->{reversed} = 0;
+  $self->{count} = 100;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{start}) {
+      $self->{start} = $vals->{start};
+    }
+    if (defined $vals->{finish}) {
+      $self->{finish} = $vals->{finish};
+    }
+    if (defined $vals->{reversed}) {
+      $self->{reversed} = $vals->{reversed};
+    }
+    if (defined $vals->{count}) {
+      $self->{count} = $vals->{count};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'SliceRange';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{start});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{finish});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::BOOL) {
+        $xfer += $input->readBool(\$self->{reversed});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{count});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('SliceRange');
+  if (defined $self->{start}) {
+    $xfer += $output->writeFieldBegin('start', TType::STRING, 1);
+    $xfer += $output->writeString($self->{start});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{finish}) {
+    $xfer += $output->writeFieldBegin('finish', TType::STRING, 2);
+    $xfer += $output->writeString($self->{finish});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{reversed}) {
+    $xfer += $output->writeFieldBegin('reversed', TType::BOOL, 3);
+    $xfer += $output->writeBool($self->{reversed});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{count}) {
+    $xfer += $output->writeFieldBegin('count', TType::I32, 4);
+    $xfer += $output->writeI32($self->{count});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::SlicePredicate;
+use base qw(Class::Accessor);
+Cassandra::SlicePredicate->mk_accessors( qw( column_names slice_range ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{column_names} = undef;
+  $self->{slice_range} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{column_names}) {
+      $self->{column_names} = $vals->{column_names};
+    }
+    if (defined $vals->{slice_range}) {
+      $self->{slice_range} = $vals->{slice_range};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'SlicePredicate';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size7 = 0;
+          $self->{column_names} = [];
+          my $_etype10 = 0;
+          $xfer += $input->readListBegin(\$_etype10, \$_size7);
+          for (my $_i11 = 0; $_i11 < $_size7; ++$_i11)
+          {
+            my $elem12 = undef;
+            $xfer += $input->readString(\$elem12);
+            push(@{$self->{column_names}},$elem12);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{slice_range} = new Cassandra::SliceRange();
+        $xfer += $self->{slice_range}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('SlicePredicate');
+  if (defined $self->{column_names}) {
+    $xfer += $output->writeFieldBegin('column_names', TType::LIST, 1);
+    {
+      $output->writeListBegin(TType::STRING, scalar(@{$self->{column_names}}));
+      {
+        foreach my $iter13 (@{$self->{column_names}}) 
+        {
+          $xfer += $output->writeString($iter13);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{slice_range}) {
+    $xfer += $output->writeFieldBegin('slice_range', TType::STRUCT, 2);
+    $xfer += $self->{slice_range}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::KeyRange;
+use base qw(Class::Accessor);
+Cassandra::KeyRange->mk_accessors( qw( start_key end_key start_token end_token count ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{start_key} = undef;
+  $self->{end_key} = undef;
+  $self->{start_token} = undef;
+  $self->{end_token} = undef;
+  $self->{count} = 100;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{start_key}) {
+      $self->{start_key} = $vals->{start_key};
+    }
+    if (defined $vals->{end_key}) {
+      $self->{end_key} = $vals->{end_key};
+    }
+    if (defined $vals->{start_token}) {
+      $self->{start_token} = $vals->{start_token};
+    }
+    if (defined $vals->{end_token}) {
+      $self->{end_token} = $vals->{end_token};
+    }
+    if (defined $vals->{count}) {
+      $self->{count} = $vals->{count};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'KeyRange';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{start_key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{end_key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{start_token});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^4$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{end_token});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^5$/ && do{      if ($ftype == TType::I32) {
+        $xfer += $input->readI32(\$self->{count});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('KeyRange');
+  if (defined $self->{start_key}) {
+    $xfer += $output->writeFieldBegin('start_key', TType::STRING, 1);
+    $xfer += $output->writeString($self->{start_key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{end_key}) {
+    $xfer += $output->writeFieldBegin('end_key', TType::STRING, 2);
+    $xfer += $output->writeString($self->{end_key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{start_token}) {
+    $xfer += $output->writeFieldBegin('start_token', TType::STRING, 3);
+    $xfer += $output->writeString($self->{start_token});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{end_token}) {
+    $xfer += $output->writeFieldBegin('end_token', TType::STRING, 4);
+    $xfer += $output->writeString($self->{end_token});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{count}) {
+    $xfer += $output->writeFieldBegin('count', TType::I32, 5);
+    $xfer += $output->writeI32($self->{count});
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::KeySlice;
+use base qw(Class::Accessor);
+Cassandra::KeySlice->mk_accessors( qw( key columns ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{key} = undef;
+  $self->{columns} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{key}) {
+      $self->{key} = $vals->{key};
+    }
+    if (defined $vals->{columns}) {
+      $self->{columns} = $vals->{columns};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'KeySlice';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{key});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size14 = 0;
+          $self->{columns} = [];
+          my $_etype17 = 0;
+          $xfer += $input->readListBegin(\$_etype17, \$_size14);
+          for (my $_i18 = 0; $_i18 < $_size14; ++$_i18)
+          {
+            my $elem19 = undef;
+            $elem19 = new Cassandra::ColumnOrSuperColumn();
+            $xfer += $elem19->read($input);
+            push(@{$self->{columns}},$elem19);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('KeySlice');
+  if (defined $self->{key}) {
+    $xfer += $output->writeFieldBegin('key', TType::STRING, 1);
+    $xfer += $output->writeString($self->{key});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{columns}) {
+    $xfer += $output->writeFieldBegin('columns', TType::LIST, 2);
+    {
+      $output->writeListBegin(TType::STRUCT, scalar(@{$self->{columns}}));
+      {
+        foreach my $iter20 (@{$self->{columns}}) 
+        {
+          $xfer += ${iter20}->write($output);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Deletion;
+use base qw(Class::Accessor);
+Cassandra::Deletion->mk_accessors( qw( timestamp super_column predicate ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{timestamp} = undef;
+  $self->{super_column} = undef;
+  $self->{predicate} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{timestamp}) {
+      $self->{timestamp} = $vals->{timestamp};
+    }
+    if (defined $vals->{super_column}) {
+      $self->{super_column} = $vals->{super_column};
+    }
+    if (defined $vals->{predicate}) {
+      $self->{predicate} = $vals->{predicate};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Deletion';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::I64) {
+        $xfer += $input->readI64(\$self->{timestamp});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{super_column});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{predicate} = new Cassandra::SlicePredicate();
+        $xfer += $self->{predicate}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Deletion');
+  if (defined $self->{timestamp}) {
+    $xfer += $output->writeFieldBegin('timestamp', TType::I64, 1);
+    $xfer += $output->writeI64($self->{timestamp});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{super_column}) {
+    $xfer += $output->writeFieldBegin('super_column', TType::STRING, 2);
+    $xfer += $output->writeString($self->{super_column});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{predicate}) {
+    $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 3);
+    $xfer += $self->{predicate}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::Mutation;
+use base qw(Class::Accessor);
+Cassandra::Mutation->mk_accessors( qw( column_or_supercolumn deletion ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{column_or_supercolumn} = undef;
+  $self->{deletion} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{column_or_supercolumn}) {
+      $self->{column_or_supercolumn} = $vals->{column_or_supercolumn};
+    }
+    if (defined $vals->{deletion}) {
+      $self->{deletion} = $vals->{deletion};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'Mutation';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{column_or_supercolumn} = new Cassandra::ColumnOrSuperColumn();
+        $xfer += $self->{column_or_supercolumn}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRUCT) {
+        $self->{deletion} = new Cassandra::Deletion();
+        $xfer += $self->{deletion}->read($input);
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('Mutation');
+  if (defined $self->{column_or_supercolumn}) {
+    $xfer += $output->writeFieldBegin('column_or_supercolumn', TType::STRUCT, 1);
+    $xfer += $self->{column_or_supercolumn}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{deletion}) {
+    $xfer += $output->writeFieldBegin('deletion', TType::STRUCT, 2);
+    $xfer += $self->{deletion}->write($output);
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::TokenRange;
+use base qw(Class::Accessor);
+Cassandra::TokenRange->mk_accessors( qw( start_token end_token endpoints ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{start_token} = undef;
+  $self->{end_token} = undef;
+  $self->{endpoints} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{start_token}) {
+      $self->{start_token} = $vals->{start_token};
+    }
+    if (defined $vals->{end_token}) {
+      $self->{end_token} = $vals->{end_token};
+    }
+    if (defined $vals->{endpoints}) {
+      $self->{endpoints} = $vals->{endpoints};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'TokenRange';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{start_token});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^2$/ && do{      if ($ftype == TType::STRING) {
+        $xfer += $input->readString(\$self->{end_token});
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+      /^3$/ && do{      if ($ftype == TType::LIST) {
+        {
+          my $_size21 = 0;
+          $self->{endpoints} = [];
+          my $_etype24 = 0;
+          $xfer += $input->readListBegin(\$_etype24, \$_size21);
+          for (my $_i25 = 0; $_i25 < $_size21; ++$_i25)
+          {
+            my $elem26 = undef;
+            $xfer += $input->readString(\$elem26);
+            push(@{$self->{endpoints}},$elem26);
+          }
+          $xfer += $input->readListEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('TokenRange');
+  if (defined $self->{start_token}) {
+    $xfer += $output->writeFieldBegin('start_token', TType::STRING, 1);
+    $xfer += $output->writeString($self->{start_token});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{end_token}) {
+    $xfer += $output->writeFieldBegin('end_token', TType::STRING, 2);
+    $xfer += $output->writeString($self->{end_token});
+    $xfer += $output->writeFieldEnd();
+  }
+  if (defined $self->{endpoints}) {
+    $xfer += $output->writeFieldBegin('endpoints', TType::LIST, 3);
+    {
+      $output->writeListBegin(TType::STRING, scalar(@{$self->{endpoints}}));
+      {
+        foreach my $iter27 (@{$self->{endpoints}}) 
+        {
+          $xfer += $output->writeString($iter27);
+        }
+      }
+      $output->writeListEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+package Cassandra::AuthenticationRequest;
+use base qw(Class::Accessor);
+Cassandra::AuthenticationRequest->mk_accessors( qw( credentials ) );
+
+sub new {
+  my $classname = shift;
+  my $self      = {};
+  my $vals      = shift || {};
+  $self->{credentials} = undef;
+  if (UNIVERSAL::isa($vals,'HASH')) {
+    if (defined $vals->{credentials}) {
+      $self->{credentials} = $vals->{credentials};
+    }
+  }
+  return bless ($self, $classname);
+}
+
+sub getName {
+  return 'AuthenticationRequest';
+}
+
+sub read {
+  my ($self, $input) = @_;
+  my $xfer  = 0;
+  my $fname;
+  my $ftype = 0;
+  my $fid   = 0;
+  $xfer += $input->readStructBegin(\$fname);
+  while (1) 
+  {
+    $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
+    if ($ftype == TType::STOP) {
+      last;
+    }
+    SWITCH: for($fid)
+    {
+      /^1$/ && do{      if ($ftype == TType::MAP) {
+        {
+          my $_size28 = 0;
+          $self->{credentials} = {};
+          my $_ktype29 = 0;
+          my $_vtype30 = 0;
+          $xfer += $input->readMapBegin(\$_ktype29, \$_vtype30, \$_size28);
+          for (my $_i32 = 0; $_i32 < $_size28; ++$_i32)
+          {
+            my $key33 = '';
+            my $val34 = '';
+            $xfer += $input->readString(\$key33);
+            $xfer += $input->readString(\$val34);
+            $self->{credentials}->{$key33} = $val34;
+          }
+          $xfer += $input->readMapEnd();
+        }
+      } else {
+        $xfer += $input->skip($ftype);
+      }
+      last; };
+        $xfer += $input->skip($ftype);
+    }
+    $xfer += $input->readFieldEnd();
+  }
+  $xfer += $input->readStructEnd();
+  return $xfer;
+}
+
+sub write {
+  my ($self, $output) = @_;
+  my $xfer   = 0;
+  $xfer += $output->writeStructBegin('AuthenticationRequest');
+  if (defined $self->{credentials}) {
+    $xfer += $output->writeFieldBegin('credentials', TType::MAP, 1);
+    {
+      $output->writeMapBegin(TType::STRING, TType::STRING, scalar(keys %{$self->{credentials}}));
+      {
+        while( my ($kiter35,$viter36) = each %{$self->{credentials}}) 
+        {
+          $xfer += $output->writeString($kiter35);
+          $xfer += $output->writeString($viter36);
+        }
+      }
+      $output->writeMapEnd();
+    }
+    $xfer += $output->writeFieldEnd();
+  }
+  $xfer += $output->writeFieldStop();
+  $xfer += $output->writeStructEnd();
+  return $xfer;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,177 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+our $VERSION = '0.1';
+
+require 5.6.0;
+use strict;
+use warnings;
+
+#
+# Data types that can be sent via Thrift
+#
+package TType;
+use constant STOP   => 0;
+use constant VOID   => 1;
+use constant BOOL   => 2;
+use constant BYTE   => 3;
+use constant I08    => 3;
+use constant DOUBLE => 4;
+use constant I16    => 6;
+use constant I32    => 8;
+use constant I64    => 10;
+use constant STRING => 11;
+use constant UTF7   => 11;
+use constant STRUCT => 12;
+use constant MAP    => 13;
+use constant SET    => 14;
+use constant LIST   => 15;
+use constant UTF8   => 16;
+use constant UTF16  => 17;
+1;
+
+#
+# Message types for RPC
+#
+package TMessageType;
+use constant CALL      => 1;
+use constant REPLY     => 2;
+use constant EXCEPTION => 3;
+use constant ONEWAY    => 4;
+1;
+
+package Thrift::TException;
+
+sub new {
+    my $classname = shift;
+    my $self = {message => shift, code => shift || 0};
+
+    return bless($self,$classname);
+}
+1;
+
+package TApplicationException;
+use base('Thrift::TException');
+
+use constant UNKNOWN              => 0;
+use constant UNKNOWN_METHOD       => 1;
+use constant INVALID_MESSAGE_TYPE => 2;
+use constant WRONG_METHOD_NAME    => 3;
+use constant BAD_SEQUENCE_ID      => 4;
+use constant MISSING_RESULT       => 5;
+
+sub new {
+    my $classname = shift;
+
+    my $self = $classname->SUPER::new();
+
+    return bless($self,$classname);
+}
+
+sub read {
+    my $self  = shift;
+    my $input = shift;
+
+    my $xfer  = 0;
+    my $fname = undef;
+    my $ftype = 0;
+    my $fid   = 0;
+
+    $xfer += $input->readStructBegin($fname);
+
+    while (1)
+    {
+        $xfer += $input->readFieldBegin($fname, $ftype, $fid);
+        if ($ftype == TType::STOP) {
+            last; next;
+        }
+
+      SWITCH: for($fid)
+      {
+          /1/ && do{
+
+              if ($ftype == TType::STRING) {
+                  $xfer += $input->readString($self->{message});
+              } else {
+                  $xfer += $input->skip($ftype);
+              }
+
+              last;
+          };
+
+          /2/ && do{
+              if ($ftype == TType::I32) {
+                  $xfer += $input->readI32($self->{code});
+              } else {
+                  $xfer += $input->skip($ftype);
+              }
+              last;
+          };
+
+          $xfer += $input->skip($ftype);
+      }
+
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+
+    return $xfer;
+}
+
+sub write {
+    my $self   = shift;
+    my $output = shift;
+
+    my $xfer   = 0;
+
+    $xfer += $output->writeStructBegin('TApplicationException');
+
+    if ($self->getMessage()) {
+        $xfer += $output->writeFieldBegin('message', TType::STRING, 1);
+        $xfer += $output->writeString($self->getMessage());
+        $xfer += $output->writeFieldEnd();
+    }
+
+    if ($self->getCode()) {
+        $xfer += $output->writeFieldBegin('type', TType::I32, 2);
+        $xfer += $output->writeI32($self->getCode());
+        $xfer += $output->writeFieldEnd();
+    }
+
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+
+    return $xfer;
+}
+
+sub getMessage
+{
+    my $self = shift;
+
+    return $self->{message};
+}
+
+sub getCode
+{
+    my $self = shift;
+
+    return $self->{code};
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/BinaryProtocol.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,498 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+
+use strict;
+use warnings;
+
+use utf8;
+use Encode;
+
+use Thrift;
+use Thrift::Protocol;
+
+use Bit::Vector;
+
+#
+# Binary implementation of the Thrift protocol.
+#
+package Thrift::BinaryProtocol;
+use base('Thrift::Protocol');
+
+use constant VERSION_MASK   => 0xffff0000;
+use constant VERSION_1      => 0x80010000;
+
+sub new
+{
+    my $classname = shift;
+    my $trans     = shift;
+    my $self      = $classname->SUPER::new($trans);
+
+    return bless($self,$classname);
+}
+
+sub writeMessageBegin
+{
+    my $self = shift;
+    my ($name, $type, $seqid) = @_;
+
+    return
+        $self->writeI32(VERSION_1 | $type) +
+        $self->writeString($name) +
+        $self->writeI32($seqid);
+}
+
+sub writeMessageEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub writeStructBegin{
+    my $self = shift;
+    my $name = shift;
+    return 0;
+}
+
+sub writeStructEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub writeFieldBegin
+{
+    my $self = shift;
+    my ($fieldName, $fieldType, $fieldId) = @_;
+
+    return
+        $self->writeByte($fieldType) +
+        $self->writeI16($fieldId);
+}
+
+sub writeFieldEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub writeFieldStop
+{
+    my $self = shift;
+    return $self->writeByte(TType::STOP);
+}
+
+sub writeMapBegin
+{
+    my $self = shift;
+    my ($keyType, $valType, $size) = @_;
+
+    return
+        $self->writeByte($keyType) +
+        $self->writeByte($valType) +
+        $self->writeI32($size);
+}
+
+sub writeMapEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub writeListBegin
+{
+    my $self = shift;
+    my ($elemType, $size) = @_;
+
+    return
+        $self->writeByte($elemType) +
+        $self->writeI32($size);
+}
+
+sub writeListEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub writeSetBegin
+{
+    my $self = shift;
+    my ($elemType, $size) = @_;
+
+    return
+        $self->writeByte($elemType) +
+        $self->writeI32($size);
+}
+
+sub writeSetEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub writeBool
+{
+    my $self = shift;
+    my $value = shift;
+
+    my $data = pack('c', $value ? 1 : 0);
+    $self->{trans}->write($data, 1);
+    return 1;
+}
+
+sub writeByte
+{
+    my $self = shift;
+    my $value= shift;
+
+    my $data = pack('c', $value);
+    $self->{trans}->write($data, 1);
+    return 1;
+}
+
+sub writeI16
+{
+    my $self = shift;
+    my $value= shift;
+
+    my $data = pack('n', $value);
+    $self->{trans}->write($data, 2);
+    return 2;
+}
+
+sub writeI32
+{
+    my $self = shift;
+    my $value= shift;
+
+    my $data = pack('N', $value);
+    $self->{trans}->write($data, 4);
+    return 4;
+}
+
+sub writeI64
+{
+    my $self = shift;
+    my $value= shift;
+    my $data;
+
+    my $vec;
+    #stop annoying error
+    $vec = Bit::Vector->new_Dec(64, $value);
+    $data = pack 'NN', $vec->Chunk_Read(32, 32), $vec->Chunk_Read(32, 0);
+
+    $self->{trans}->write($data, 8);
+
+    return 8;
+}
+
+
+sub writeDouble
+{
+    my $self = shift;
+    my $value= shift;
+
+    my $data = pack('d', $value);
+    $self->{trans}->write(scalar reverse($data), 8);
+    return 8;
+}
+
+sub writeString{
+    my $self = shift;
+    my $value= shift;
+
+    if( utf8::is_utf8($value) ){
+        $value = Encode::encode_utf8($value);
+    }
+
+    my $len = length($value);
+
+    my $result = $self->writeI32($len);
+
+    if ($len) {
+        $self->{trans}->write($value,$len);
+    }
+    return $result + $len;
+  }
+
+
+#
+#All references
+#
+sub readMessageBegin
+{
+    my $self = shift;
+    my ($name, $type, $seqid) = @_;
+
+    my $version = 0;
+    my $result = $self->readI32(\$version);
+    if (($version & VERSION_MASK) > 0) {
+      if (($version & VERSION_MASK) != VERSION_1) {
+        die new Thrift::TException('Missing version identifier')
+      }
+      $$type = $version & 0x000000ff;
+      return
+          $result +
+          $self->readString($name) +
+          $self->readI32($seqid);
+    } else { # old client support code
+      return
+        $result +
+        $self->readStringBody($name, $version) + # version here holds the size of the string
+        $self->readByte($type) +
+        $self->readI32($seqid);
+    }
+}
+
+sub readMessageEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub readStructBegin
+{
+    my $self = shift;
+    my $name = shift;
+
+    $$name = '';
+
+    return 0;
+}
+
+sub readStructEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub readFieldBegin
+{
+    my $self = shift;
+    my ($name, $fieldType, $fieldId) = @_;
+
+    my $result = $self->readByte($fieldType);
+
+    if ($$fieldType == TType::STOP) {
+      $$fieldId = 0;
+      return $result;
+    }
+
+    $result += $self->readI16($fieldId);
+
+    return $result;
+}
+
+sub readFieldEnd() {
+    my $self = shift;
+    return 0;
+}
+
+sub readMapBegin
+{
+    my $self = shift;
+    my ($keyType, $valType, $size) = @_;
+
+    return
+        $self->readByte($keyType) +
+        $self->readByte($valType) +
+        $self->readI32($size);
+}
+
+sub readMapEnd()
+{
+    my $self = shift;
+    return 0;
+}
+
+sub readListBegin
+{
+    my $self = shift;
+    my ($elemType, $size) = @_;
+
+    return
+        $self->readByte($elemType) +
+        $self->readI32($size);
+}
+
+sub readListEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub readSetBegin
+{
+    my $self = shift;
+    my ($elemType, $size) = @_;
+
+    return
+        $self->readByte($elemType) +
+        $self->readI32($size);
+}
+
+sub readSetEnd
+{
+    my $self = shift;
+    return 0;
+}
+
+sub readBool
+{
+    my $self  = shift;
+    my $value = shift;
+
+    my $data = $self->{trans}->readAll(1);
+    my @arr = unpack('c', $data);
+    $$value = $arr[0] == 1;
+    return 1;
+}
+
+sub readByte
+{
+    my $self  = shift;
+    my $value = shift;
+
+    my $data = $self->{trans}->readAll(1);
+    my @arr = unpack('c', $data);
+    $$value = $arr[0];
+    return 1;
+}
+
+sub readI16
+{
+    my $self  = shift;
+    my $value = shift;
+
+    my $data  = $self->{trans}->readAll(2);
+
+    my @arr   = unpack('n', $data);
+
+    $$value = $arr[0];
+
+    if ($$value > 0x7fff) {
+      $$value = 0 - (($$value - 1) ^ 0xffff);
+    }
+
+    return 2;
+}
+
+sub readI32
+{
+    my $self = shift;
+    my $value= shift;
+
+    my $data = $self->{trans}->readAll(4);
+    my @arr = unpack('N', $data);
+
+    $$value = $arr[0];
+    if ($$value > 0x7fffffff) {
+      $$value = 0 - (($$value - 1) ^ 0xffffffff);
+    }
+    return 4;
+}
+
+sub readI64
+{
+    my $self  = shift;
+    my $value = shift;
+
+    my $data = $self->{trans}->readAll(8);
+
+    my ($hi,$lo)=unpack('NN',$data);
+
+    my $vec = new Bit::Vector(64);
+
+    $vec->Chunk_Store(32,32,$hi);
+    $vec->Chunk_Store(32,0,$lo);
+
+    $$value = $vec->to_Dec();
+
+    return 8;
+}
+
+sub readDouble
+{
+    my $self  = shift;
+    my $value = shift;
+
+    my $data = scalar reverse($self->{trans}->readAll(8));
+    my @arr = unpack('d', $data);
+
+    $$value = $arr[0];
+
+    return 8;
+}
+
+sub readString
+{
+    my $self  = shift;
+    my $value = shift;
+
+    my $len;
+    my $result = $self->readI32(\$len);
+
+    if ($len) {
+      $$value = $self->{trans}->readAll($len);
+    } else {
+      $$value = '';
+    }
+
+    return $result + $len;
+}
+
+sub readStringBody
+{
+    my $self  = shift;
+    my $value = shift;
+    my $len   = shift;
+
+    if ($len) {
+      $$value = $self->{trans}->readAll($len);
+    } else {
+      $$value = '';
+    }
+
+    return $len;
+}
+
+#
+# Binary Protocol Factory
+#
+package Thrift::BinaryProtocolFactory;
+use base('TProtocolFactory');
+
+sub new
+{
+    my $classname = shift;
+    my $self      = $classname->SUPER::new();
+
+    return bless($self,$classname);
+}
+
+sub getProtocol{
+    my $self  = shift;
+    my $trans = shift;
+
+    return new Thrift::BinaryProtocol($trans);
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/BufferedTransport.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,136 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+use Thrift::Transport;
+
+package Thrift::BufferedTransport;
+use base('Thrift::Transport');
+
+sub new
+{
+    my $classname = shift;
+    my $transport = shift;
+    my $rBufSize  = shift || 512;
+    my $wBufSize  = shift || 512;
+
+    my $self = {
+        transport => $transport,
+        rBufSize  => $rBufSize,
+        wBufSize  => $wBufSize,
+        wBuf      => '',
+        rBuf      => '',
+    };
+
+    return bless($self,$classname);
+}
+
+sub isOpen
+{
+    my $self = shift;
+
+    return $self->{transport}->isOpen();
+}
+
+sub open
+{
+    my $self = shift;
+    $self->{transport}->open();
+}
+
+sub close()
+{
+    my $self = shift;
+    $self->{transport}->close();
+}
+
+sub readAll
+{
+    my $self = shift;
+    my $len  = shift;
+
+    return $self->{transport}->readAll($len);
+}
+
+sub read
+{
+    my $self = shift;
+    my $len  = shift;
+    my $ret;
+
+    # Methinks Perl is already buffering these for us
+    return $self->{transport}->read($len);
+}
+
+sub write
+{
+    my $self = shift;
+    my $buf  = shift;
+
+    $self->{wBuf} .= $buf;
+    if (length($self->{wBuf}) >= $self->{wBufSize}) {
+        $self->{transport}->write($self->{wBuf});
+        $self->{wBuf} = '';
+    }
+}
+
+sub flush
+{
+    my $self = shift;
+
+    if (length($self->{wBuf}) > 0) {
+        $self->{transport}->write($self->{wBuf});
+        $self->{wBuf} = '';
+    }
+    $self->{transport}->flush();
+}
+
+
+#
+# BufferedTransport factory creates buffered transport objects from transports
+#
+package Thrift::BufferedTransportFactory;
+
+sub new {
+    my $classname = shift;
+    my $self      = {};
+
+    return bless($self,$classname);
+}
+
+#
+# Build a buffered transport from the base transport
+#
+# @return Thrift::BufferedTransport transport
+#
+sub getTransport
+{
+    my $self  = shift;
+    my $trans = shift;
+
+    my $buffered = Thrift::BufferedTransport->new($trans);
+    return $buffered;
+}
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/FramedTransport.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,164 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+use strict;
+use warnings;
+
+use Thrift;
+use Thrift::Transport;
+
+#
+# Framed transport. Writes and reads data in chunks that are stamped with
+# their length.
+#
+# @package thrift.transport
+#
+package Thrift::FramedTransport;
+
+use base('Thrift::Transport');
+
+sub new
+{
+    my $classname = shift;
+    my $transport = shift;
+    my $read      = shift || 1;
+    my $write     = shift || 1;
+
+    my $self      = {
+        transport => $transport,
+        read      => $read,
+        write     => $write,
+        wBuf      => '',
+        rBuf      => '',
+    };
+
+    return bless($self,$classname);
+}
+
+sub isOpen
+{
+    my $self = shift;
+    return $self->{transport}->isOpen();
+}
+
+sub open
+{
+    my $self = shift;
+
+    $self->{transport}->open();
+}
+
+sub close
+{
+    my $self = shift;
+
+    $self->{transport}->close();
+}
+
+#
+# Reads from the buffer. When more data is required reads another entire
+# chunk and serves future reads out of that.
+#
+# @param int $len How much data
+#
+sub read
+{
+
+    my $self = shift;
+    my $len  = shift;
+
+    if (!$self->{read}) {
+        return $self->{transport}->read($len);
+    }
+
+    if (length($self->{rBuf}) == 0) {
+        $self->_readFrame();
+    }
+
+
+    # Just return full buff
+    if ($len > length($self->{rBuf})) {
+        my $out = $self->{rBuf};
+        $self->{rBuf} = '';
+        return $out;
+    }
+
+    # Return substr
+    my $out = substr($self->{rBuf}, 0, $len);
+    $self->{rBuf} = substr($self->{rBuf}, $len);
+    return $out;
+}
+
+#
+# Reads a chunk of data into the internal read buffer.
+# (private)
+sub _readFrame
+{
+    my $self = shift;
+    my $buf  = $self->{transport}->readAll(4);
+    my @val  = unpack('N', $buf);
+    my $sz   = $val[0];
+
+    $self->{rBuf} = $self->{transport}->readAll($sz);
+}
+
+#
+# Writes some data to the pending output buffer.
+#
+# @param string $buf The data
+# @param int    $len Limit of bytes to write
+#
+sub write
+{
+    my $self = shift;
+    my $buf  = shift;
+    my $len  = shift;
+
+    unless($self->{write}) {
+        return $self->{transport}->write($buf, $len);
+    }
+
+    if ( defined $len && $len < length($buf)) {
+        $buf = substr($buf, 0, $len);
+    }
+
+    $self->{wBuf} .= $buf;
+  }
+
+#
+# Writes the output buffer to the stream in the format of a 4-byte length
+# followed by the actual data.
+#
+sub flush
+{
+    my $self = shift;
+
+    unless ($self->{write}) {
+        return $self->{transport}->flush();
+    }
+
+    my $out = pack('N', length($self->{wBuf}));
+    $out .= $self->{wBuf};
+    $self->{transport}->write($out);
+    $self->{transport}->flush();
+    $self->{wBuf} = '';
+
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/HttpClient.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,200 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+use Thrift::Transport;
+
+use HTTP::Request;
+use LWP::UserAgent;
+use IO::String;
+
+package Thrift::HttpClient;
+
+use base('Thrift::Transport');
+
+sub new
+{
+    my $classname = shift;
+    my $url       = shift || 'http://localhost:9090';
+    my $debugHandler = shift;
+
+    my $out = IO::String->new;
+    binmode($out);
+
+    my $self = {
+        url          => $url,
+        out          => $out,
+        debugHandler => $debugHandler,
+        debug        => 0,
+        sendTimeout  => 100,
+        recvTimeout  => 750,
+        handle       => undef,
+    };
+
+    return bless($self,$classname);
+}
+
+sub setSendTimeout
+{
+    my $self    = shift;
+    my $timeout = shift;
+
+    $self->{sendTimeout} = $timeout;
+}
+
+sub setRecvTimeout
+{
+    my $self    = shift;
+    my $timeout = shift;
+
+    $self->{recvTimeout} = $timeout;
+}
+
+
+#
+#Sets debugging output on or off
+#
+# @param bool $debug
+#
+sub setDebug
+{
+    my $self  = shift;
+    my $debug = shift;
+
+    $self->{debug} = $debug;
+}
+
+#
+# Tests whether this is open
+#
+# @return bool true if the socket is open
+#
+sub isOpen
+{
+    return 1;
+}
+
+sub open {}
+
+#
+# Cleans up the buffer.
+#
+sub close
+{
+    my $self = shift;
+    if (defined($self->{io})) {
+      close($self->{io});
+      $self->{io} = undef;
+    }
+}
+
+#
+# Guarantees that the full amount of data is read.
+#
+# @return string The data, of exact length
+# @throws TTransportException if cannot read data
+#
+sub readAll
+{
+    my $self = shift;
+    my $len  = shift;
+
+    my $buf = $self->read($len);
+
+    if (!defined($buf)) {
+      die new Thrift::TException('TSocket: Could not read '.$len.' bytes from input buffer');
+    }
+    return $buf;
+}
+
+#
+# Read and return string
+#
+sub read
+{
+    my $self = shift;
+    my $len  = shift;
+
+    my $buf;
+
+    my $in = $self->{in};
+
+    if (!defined($in)) {
+      die new Thrift::TException("Response buffer is empty, no request.");
+    }
+    eval {
+      my $ret = sysread($in, $buf, $len);
+      if (! defined($ret)) {
+        die new Thrift::TException("No more data available.");
+      }
+    }; if($@){
+      die new Thrift::TException($@);
+    }
+
+    return $buf;
+}
+
+#
+# Write string
+#
+sub write
+{
+    my $self = shift;
+    my $buf  = shift;
+    $self->{out}->print($buf);
+}
+
+#
+# Flush output (do the actual HTTP/HTTPS request)
+#
+sub flush
+{
+    my $self = shift;
+
+    my $ua = LWP::UserAgent->new('timeout' => ($self->{sendTimeout} / 1000),
+      'agent' => 'Perl/THttpClient'
+     );
+    $ua->default_header('Accept' => 'application/x-thrift');
+    $ua->default_header('Content-Type' => 'application/x-thrift');
+    $ua->cookie_jar({}); # hash to remember cookies between redirects
+
+    my $out = $self->{out};
+    $out->setpos(0); # rewind
+    my $buf = join('', <$out>);
+
+    my $request = new HTTP::Request(POST => $self->{url}, undef, $buf);
+    my $response = $ua->request($request);
+    my $content_ref = $response->content_ref;
+
+    my $in = IO::String->new($content_ref);
+    binmode($in);
+    $self->{in} = $in;
+    $in->setpos(0); # rewind
+
+    # reset write buffer
+    $out = IO::String->new;
+    binmode($out);
+    $self->{out} = $out;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/MemoryBuffer.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,146 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+use Thrift::Transport;
+
+package Thrift::MemoryBuffer;
+use base('Thrift::Transport');
+
+sub new
+{
+    my $classname = shift;
+
+    my $bufferSize= shift || 1024;
+
+    my $self = {
+        buffer    => '',
+        bufferSize=> $bufferSize,
+        wPos      => 0,
+        rPos      => 0,
+    };
+
+    return bless($self,$classname);
+}
+
+sub isOpen
+{
+    return 1;
+}
+
+sub open
+{
+
+}
+
+sub close
+{
+
+}
+
+sub peek
+{
+    my $self = shift;
+    return($self->{rPos} < $self->{wPos});
+}
+
+
+sub getBuffer
+{
+    my $self = shift;
+    return $self->{buffer};
+}
+
+sub resetBuffer
+{
+    my $self = shift;
+
+    my $new_buffer  = shift || '';
+
+    $self->{buffer}     = $new_buffer;
+    $self->{bufferSize} = length($new_buffer);
+    $self->{wPos}       = length($new_buffer);
+    $self->{rPos}       = 0;
+}
+
+sub available
+{
+    my $self = shift;
+    return ($self->{wPos} - $self->{rPos});
+}
+
+sub read
+{
+    my $self = shift;
+    my $len  = shift;
+    my $ret;
+
+    my $avail = ($self->{wPos} - $self->{rPos});
+    return '' if $avail == 0;
+
+    #how much to give
+    my $give = $len;
+    $give = $avail if $avail < $len;
+
+    $ret = substr($self->{buffer},$self->{rPos},$give);
+
+    $self->{rPos} += $give;
+
+    return $ret;
+}
+
+sub readAll
+{
+    my $self = shift;
+    my $len  = shift;
+
+    my $avail = ($self->{wPos} - $self->{rPos});
+    if ($avail < $len) {
+        die new TTransportException("Attempt to readAll($len) found only $avail available");
+    }
+
+    my $data = '';
+    my $got = 0;
+
+    while (($got = length($data)) < $len) {
+        $data .= $self->read($len - $got);
+    }
+
+    return $data;
+}
+
+sub write
+{
+    my $self = shift;
+    my $buf  = shift;
+
+    $self->{buffer} .= $buf;
+    $self->{wPos}   += length($buf);
+}
+
+sub flush
+{
+
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/Protocol.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,543 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+
+#
+# Protocol exceptions
+#
+package TProtocolException;
+use base('Thrift::TException');
+
+use constant UNKNOWN       => 0;
+use constant INVALID_DATA  => 1;
+use constant NEGATIVE_SIZE => 2;
+use constant SIZE_LIMIT    => 3;
+use constant BAD_VERSION   => 4;
+
+sub new {
+    my $classname = shift;
+
+    my $self = $classname->SUPER::new();
+
+    return bless($self,$classname);
+}
+
+#
+# Protocol base class module.
+#
+package Thrift::Protocol;
+
+sub new {
+    my $classname = shift;
+    my $self      = {};
+
+    my $trans     = shift;
+    $self->{trans}= $trans;
+
+    return bless($self,$classname);
+}
+
+sub getTransport
+{
+    my $self = shift;
+
+    return $self->{trans};
+}
+
+#
+# Writes the message header
+#
+# @param string $name Function name
+# @param int $type message type TMessageType::CALL or TMessageType::REPLY
+# @param int $seqid The sequence id of this message
+#
+sub writeMessageBegin
+{
+    my ($name, $type, $seqid);
+    die "abstract";
+}
+
+#
+# Close the message
+#
+sub writeMessageEnd {
+    die "abstract";
+}
+
+#
+# Writes a struct header.
+#
+# @param string     $name Struct name
+# @throws TException on write error
+# @return int How many bytes written
+#
+sub writeStructBegin {
+    my ($name);
+
+    die "abstract";
+}
+
+#
+# Close a struct.
+#
+# @throws TException on write error
+# @return int How many bytes written
+#
+sub writeStructEnd {
+    die "abstract";
+}
+
+#
+# Starts a field.
+#
+# @param string     $name Field name
+# @param int        $type Field type
+# @param int        $fid  Field id
+# @throws TException on write error
+# @return int How many bytes written
+#
+sub writeFieldBegin {
+    my ($fieldName, $fieldType, $fieldId);
+
+    die "abstract";
+}
+
+sub writeFieldEnd {
+    die "abstract";
+}
+
+sub writeFieldStop {
+    die "abstract";
+}
+
+sub writeMapBegin {
+    my ($keyType, $valType, $size);
+
+    die "abstract";
+}
+
+sub writeMapEnd {
+    die "abstract";
+}
+
+sub writeListBegin {
+    my ($elemType, $size);
+    die "abstract";
+}
+
+sub writeListEnd {
+    die "abstract";
+}
+
+sub writeSetBegin {
+    my ($elemType, $size);
+    die "abstract";
+}
+
+sub writeSetEnd {
+    die "abstract";
+}
+
+sub writeBool {
+    my ($bool);
+    die "abstract";
+}
+
+sub writeByte {
+    my ($byte);
+    die "abstract";
+}
+
+sub writeI16 {
+    my ($i16);
+    die "abstract";
+}
+
+sub writeI32 {
+    my ($i32);
+    die "abstract";
+}
+
+sub writeI64 {
+    my ($i64);
+    die "abstract";
+}
+
+sub writeDouble {
+    my ($dub);
+    die "abstract";
+}
+
+sub writeString
+{
+    my ($str);
+    die "abstract";
+}
+
+#
+# Reads the message header
+#
+# @param string $name Function name
+# @param int $type message type TMessageType::CALL or TMessageType::REPLY
+# @parem int $seqid The sequence id of this message
+#
+sub readMessageBegin
+{
+    my ($name, $type, $seqid);
+    die "abstract";
+}
+
+#
+# Read the close of message
+#
+sub readMessageEnd
+{
+    die "abstract";
+}
+
+sub readStructBegin
+{
+    my($name);
+
+    die "abstract";
+}
+
+sub readStructEnd
+{
+    die "abstract";
+}
+
+sub readFieldBegin
+{
+    my ($name, $fieldType, $fieldId);
+    die "abstract";
+}
+
+sub readFieldEnd
+{
+    die "abstract";
+}
+
+sub readMapBegin
+{
+    my ($keyType, $valType, $size);
+    die "abstract";
+}
+
+sub readMapEnd
+{
+    die "abstract";
+}
+
+sub readListBegin
+{
+    my ($elemType, $size);
+    die "abstract";
+}
+
+sub readListEnd
+{
+    die "abstract";
+}
+
+sub readSetBegin
+{
+    my ($elemType, $size);
+    die "abstract";
+}
+
+sub readSetEnd
+{
+    die "abstract";
+}
+
+sub readBool
+{
+    my ($bool);
+    die "abstract";
+}
+
+sub readByte
+{
+    my ($byte);
+    die "abstract";
+}
+
+sub readI16
+{
+    my ($i16);
+    die "abstract";
+}
+
+sub readI32
+{
+    my ($i32);
+    die "abstract";
+}
+
+sub readI64
+{
+    my ($i64);
+    die "abstract";
+}
+
+sub readDouble
+{
+    my ($dub);
+    die "abstract";
+}
+
+sub readString
+{
+    my ($str);
+    die "abstract";
+}
+
+#
+# The skip function is a utility to parse over unrecognized data without
+# causing corruption.
+#
+# @param TType $type What type is it
+#
+sub skip
+{
+    my $self = shift;
+    my $type = shift;
+
+    my $ref;
+    my $result;
+    my $i;
+
+    if($type == TType::BOOL)
+    {
+        return $self->readBool(\$ref);
+    }
+    elsif($type == TType::BYTE){
+        return $self->readByte(\$ref);
+    }
+    elsif($type == TType::I16){
+        return $self->readI16(\$ref);
+    }
+    elsif($type == TType::I32){
+        return $self->readI32(\$ref);
+    }
+    elsif($type == TType::I64){
+        return $self->readI64(\$ref);
+    }
+    elsif($type == TType::DOUBLE){
+        return $self->readDouble(\$ref);
+    }
+    elsif($type == TType::STRING)
+    {
+        return $self->readString(\$ref);
+    }
+    elsif($type == TType::STRUCT)
+    {
+        $result = $self->readStructBegin(\$ref);
+        while (1) {
+            my ($ftype,$fid);
+            $result += $self->readFieldBegin(\$ref, \$ftype, \$fid);
+            if ($ftype == TType::STOP) {
+                last;
+            }
+            $result += $self->skip($ftype);
+            $result += $self->readFieldEnd();
+        }
+        $result += $self->readStructEnd();
+        return $result;
+    }
+    elsif($type == TType::MAP)
+    {
+        my($keyType,$valType,$size);
+        $result = $self->readMapBegin(\$keyType, \$valType, \$size);
+        for ($i = 0; $i < $size; $i++) {
+          $result += $self->skip($keyType);
+          $result += $self->skip($valType);
+        }
+        $result += $self->readMapEnd();
+        return $result;
+    }
+    elsif($type == TType::SET)
+    {
+        my ($elemType,$size);
+        $result = $self->readSetBegin(\$elemType, \$size);
+        for ($i = 0; $i < $size; $i++) {
+            $result += $self->skip($elemType);
+        }
+        $result += $self->readSetEnd();
+        return $result;
+    }
+    elsif($type == TType::LIST)
+    {
+        my ($elemType,$size);
+        $result = $self->readListBegin(\$elemType, \$size);
+        for ($i = 0; $i < $size; $i++) {
+            $result += $self->skip($elemType);
+        }
+        $result += $self->readListEnd();
+        return $result;
+    }
+
+
+    return 0;
+
+  }
+
+#
+# Utility for skipping binary data
+#
+# @param TTransport $itrans TTransport object
+# @param int        $type   Field type
+#
+sub skipBinary
+{
+    my $self   = shift;
+    my $itrans = shift;
+    my $type   = shift;
+
+    if($type == TType::BOOL)
+    {
+      return $itrans->readAll(1);
+    }
+    elsif($type == TType::BYTE)
+    {
+        return $itrans->readAll(1);
+    }
+    elsif($type == TType::I16)
+    {
+        return $itrans->readAll(2);
+    }
+    elsif($type == TType::I32)
+    {
+        return $itrans->readAll(4);
+    }
+    elsif($type == TType::I64)
+    {
+        return $itrans->readAll(8);
+    }
+    elsif($type == TType::DOUBLE)
+    {
+        return $itrans->readAll(8);
+    }
+    elsif( $type == TType::STRING )
+    {
+        my @len = unpack('N', $itrans->readAll(4));
+        my $len = $len[0];
+        if ($len > 0x7fffffff) {
+            $len = 0 - (($len - 1) ^ 0xffffffff);
+        }
+        return 4 + $itrans->readAll($len);
+    }
+    elsif( $type == TType::STRUCT )
+    {
+        my $result = 0;
+        while (1) {
+          my $ftype = 0;
+          my $fid = 0;
+          my $data = $itrans->readAll(1);
+          my @arr = unpack('c', $data);
+          $ftype = $arr[0];
+          if ($ftype == TType::STOP) {
+            last;
+          }
+          # I16 field id
+          $result += $itrans->readAll(2);
+          $result += $self->skipBinary($itrans, $ftype);
+        }
+        return $result;
+    }
+    elsif($type == TType::MAP)
+    {
+        # Ktype
+        my $data = $itrans->readAll(1);
+        my @arr = unpack('c', $data);
+        my $ktype = $arr[0];
+        # Vtype
+        $data = $itrans->readAll(1);
+        @arr = unpack('c', $data);
+        my $vtype = $arr[0];
+        # Size
+        $data = $itrans->readAll(4);
+        @arr = unpack('N', $data);
+        my $size = $arr[0];
+        if ($size > 0x7fffffff) {
+            $size = 0 - (($size - 1) ^ 0xffffffff);
+        }
+        my $result = 6;
+        for (my $i = 0; $i < $size; $i++) {
+            $result += $self->skipBinary($itrans, $ktype);
+            $result += $self->skipBinary($itrans, $vtype);
+        }
+        return $result;
+    }
+    elsif($type == TType::SET || $type == TType::LIST)
+    {
+        # Vtype
+        my $data = $itrans->readAll(1);
+        my @arr = unpack('c', $data);
+        my $vtype = $arr[0];
+        # Size
+        $data = $itrans->readAll(4);
+        @arr = unpack('N', $data);
+        my $size = $arr[0];
+        if ($size > 0x7fffffff) {
+            $size = 0 - (($size - 1) ^ 0xffffffff);
+        }
+        my $result = 5;
+        for (my $i = 0; $i < $size; $i++) {
+          $result += $self->skipBinary($itrans, $vtype);
+        }
+        return $result;
+    }
+
+    return 0;
+
+}
+
+#
+# Protocol factory creates protocol objects from transports
+#
+package TProtocolFactory;
+
+
+sub new {
+    my $classname = shift;
+    my $self      = {};
+
+    return bless($self,$classname);
+}
+
+#
+# Build a protocol from the base transport
+#
+# @return TProtcol protocol
+#
+sub getProtocol
+{
+    my ($trans);
+    die "interface";
+}
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/Server.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,313 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+use Thrift::BufferedTransport;
+use Thrift::BinaryProtocol;
+
+#
+# Server base class module
+#
+package Thrift::Server;
+
+# 3 possible constructors:
+#   1.  (processor, serverTransport)
+#   2.  (processor, serverTransport, transportFactory, protocolFactory)
+#   3.  (processor, serverTransport,
+#        inputTransportFactory, outputTransportFactory,
+#        inputProtocolFactory, outputProtocolFactory)
+sub new
+{
+    my $classname    = shift;
+    my @args         = @_;
+
+    my $self;
+
+    if (scalar @args == 2)
+    {
+      $self = _init($args[0], $args[1],
+                    Thrift::BufferedTransportFactory->new(),
+                    Thrift::BufferedTransportFactory->new(),
+                    Thrift::BinaryProtocolFactory->new(),
+                    Thrift::BinaryProtocolFactory->new());
+    }
+    elsif (scalar @args == 4)
+    {
+      $self = _init($args[0], $args[1], $args[2], $args[2], $args[3], $args[3]);
+    }
+    elsif (scalar @args == 6)
+    {
+      $self = _init($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
+    }
+    else
+    {
+      die "Thrift::Server expects exactly 2, 4, or 6 args";
+    }
+
+    return bless($self,$classname);
+}
+
+sub _init
+{
+    my $processor              = shift;
+    my $serverTransport        = shift;
+    my $inputTransportFactory  = shift;
+    my $outputTransportFactory = shift;
+    my $inputProtocolFactory   = shift;
+    my $outputProtocolFactory  = shift;
+
+    my $self = {
+        processor              => $processor,
+        serverTransport        => $serverTransport,
+        inputTransportFactory  => $inputTransportFactory,
+        outputTransportFactory => $outputTransportFactory,
+        inputProtocolFactory   => $inputProtocolFactory,
+        outputProtocolFactory  => $outputProtocolFactory,
+    };
+}
+
+sub serve
+{
+    die "abstract";
+}
+
+sub _clientBegin
+{
+    my $self  = shift;
+    my $iprot = shift;
+    my $oprot = shift;
+
+    if (exists  $self->{serverEventHandler} and
+        defined $self->{serverEventHandler})
+    {
+        $self->{serverEventHandler}->clientBegin($iprot, $oprot);
+    }
+}
+
+sub _handleException
+{
+    my $self = shift;
+    my $e    = shift;
+
+    if ($e =~ m/TException/ and exists $e->{message}) {
+        my $message = $e->{message};
+        my $code    = $e->{code};
+        my $out     = $code . ':' . $message;
+
+        $message =~ m/TTransportException/ and die $out;
+        if ($message =~ m/TSocket/) {
+            # suppress TSocket messages
+        } else {
+            warn $out;
+        }
+    } else {
+        warn $e;
+    }
+}
+
+
+#
+# SimpleServer from the Server base class that handles one connection at a time
+#
+package Thrift::SimpleServer;
+use base qw( Thrift::Server );
+
+sub new
+{
+    my $classname = shift;
+    my @args      = @_;
+
+    my $self      = $classname->SUPER::new(@args);
+    return bless($self,$classname);
+}
+
+sub serve
+{
+    my $self = shift;
+
+    $self->{serverTransport}->listen();
+    while (1)
+    {
+        my $client = $self->{serverTransport}->accept();
+        my $itrans = $self->{inputTransportFactory}->getTransport($client);
+        my $otrans = $self->{outputTransportFactory}->getTransport($client);
+        my $iprot  = $self->{inputProtocolFactory}->getProtocol($itrans);
+        my $oprot  = $self->{outputProtocolFactory}->getProtocol($otrans);
+        eval {
+            $self->_clientBegin($iprot, $oprot);
+            while (1)
+            {
+                $self->{processor}->process($iprot, $oprot);
+            }
+        }; if($@) {
+            $self->_handleException($@);
+        }
+
+        $itrans->close();
+        $otrans->close();
+    }
+}
+
+
+#
+# ForkingServer that forks a new process for each request
+#
+package Thrift::ForkingServer;
+use base qw( Thrift::Server );
+
+use POSIX ":sys_wait_h";
+
+sub new
+{
+    my $classname = shift;
+    my @args      = @_;
+
+    my $self      = $classname->SUPER::new(@args);
+    return bless($self,$classname);
+}
+
+
+sub serve
+{
+    my $self = shift;
+
+    $self->{serverTransport}->listen();
+    while (1)
+    {
+        my $client = $self->{serverTransport}->accept();
+        $self->_client($client);
+    }
+}
+
+sub _client
+{
+    my $self   = shift;
+    my $client = shift;
+
+    eval {
+        my $itrans = $self->{inputTransportFactory}->getTransport($client);
+        my $otrans = $self->{outputTransportFactory}->getTransport($client);
+
+        my $iprot  = $self->{inputProtocolFactory}->getProtocol($itrans);
+        my $oprot  = $self->{outputProtocolFactory}->getProtocol($otrans);
+
+        $self->_clientBegin($iprot, $oprot);
+
+        my $pid = fork();
+
+        if ($pid) #parent
+        {
+            $self->_parent($pid, $itrans, $otrans);
+        } else {
+            $self->_child($itrans, $otrans, $iprot, $oprot);
+        }
+    }; if($@) {
+        $self->_handleException($@);
+    }
+}
+
+sub _parent
+{
+    my $self   = shift;
+    my $pid    = shift;
+    my $itrans = shift;
+    my $otrans = shift;
+
+    # add before collect, otherwise you race w/ waitpid
+    $self->{children}->{$pid} = 1;
+    $self->_collectChildren();
+
+    # Parent must close socket or the connection may not get closed promptly
+    $self->tryClose($itrans);
+    $self->tryClose($otrans);
+}
+
+sub _child
+{
+    my $self   = shift;
+    my $itrans = shift;
+    my $otrans = shift;
+    my $iprot  = shift;
+    my $oprot  = shift;
+
+    my $ecode = 0;
+    eval {
+        while (1)
+        {
+            $self->{processor}->process($iprot, $oprot);
+        }
+    }; if($@) {
+        $ecode = 1;
+        $self->_handleException($@);
+    }
+
+    $self->tryClose($itrans);
+    $self->tryClose($otrans);
+
+    exit($ecode);
+}
+
+sub tryClose
+{
+    my $self = shift;
+    my $file = shift;
+
+    eval {
+        if (defined $file)
+        {
+          $file->close();
+        }
+    }; if($@) {
+        if ($@ =~ m/TException/ and exists $@->{message}) {
+            my $message = $@->{message};
+            my $code    = $@->{code};
+            my $out     = $code . ':' . $message;
+
+            warn $out;
+        } else {
+            warn $@;
+        }
+    }
+}
+
+sub _collectChildren
+{
+    my $self = shift;
+
+    while (scalar keys %{$self->{children}})
+    {
+        my $pid    = waitpid(-1, WNOHANG);
+
+        if ($pid>0)
+        {
+            delete $self->{children}->{$pid};
+        }
+        else
+        {
+            last;
+        }
+    }
+}
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/Socket.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,330 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+use Thrift::Transport;
+
+use IO::Socket::INET;
+use IO::Select;
+
+package Thrift::Socket;
+
+use base('Thrift::Transport');
+
+sub new
+{
+    my $classname    = shift;
+    my $host         = shift || "localhost";
+    my $port         = shift || 9090;
+    my $debugHandler = shift;
+
+    my $self = {
+        host         => $host,
+        port         => $port,
+        debugHandler => $debugHandler,
+        debug        => 0,
+        sendTimeout  => 10000,
+        recvTimeout  => 10000,
+        handle       => undef,
+    };
+
+    return bless($self,$classname);
+}
+
+
+sub setSendTimeout
+{
+    my $self    = shift;
+    my $timeout = shift;
+
+    $self->{sendTimeout} = $timeout;
+}
+
+sub setRecvTimeout
+{
+    my $self    = shift;
+    my $timeout = shift;
+
+    $self->{recvTimeout} = $timeout;
+}
+
+
+#
+#Sets debugging output on or off
+#
+# @param bool $debug
+#
+sub setDebug
+{
+    my $self  = shift;
+    my $debug = shift;
+
+    $self->{debug} = $debug;
+}
+
+#
+# Tests whether this is open
+#
+# @return bool true if the socket is open
+#
+sub isOpen
+{
+    my $self = shift;
+
+    if( defined $self->{handle} ){
+        return ($self->{handle}->handles())[0]->connected;
+    }
+
+    return 0;
+}
+
+#
+# Connects the socket.
+#
+sub open
+{
+    my $self = shift;
+
+    my $sock = IO::Socket::INET->new(PeerAddr => $self->{host},
+                                            PeerPort => $self->{port},
+                                            Proto    => 'tcp',
+                                            Timeout  => $self->{sendTimeout}/1000)
+        || do {
+            my $error = 'TSocket: Could not connect to '.$self->{host}.':'.$self->{port}.' ('.$!.')';
+
+            if ($self->{debug}) {
+                $self->{debugHandler}->($error);
+            }
+
+            die new Thrift::TException($error);
+
+        };
+
+
+    $self->{handle} = new IO::Select( $sock );
+}
+
+#
+# Closes the socket.
+#
+sub close
+{
+    my $self = shift;
+
+    if( defined $self->{handle} ){
+        CORE::close( ($self->{handle}->handles())[0] );
+    }
+}
+
+#
+# Uses stream get contents to do the reading
+#
+# @param int $len How many bytes
+# @return string Binary data
+#
+sub readAll
+{
+    my $self = shift;
+    my $len  = shift;
+
+
+    return unless defined $self->{handle};
+
+    my $pre = "";
+    while (1) {
+
+        #check for timeout
+        my @sockets = $self->{handle}->can_read( $self->{recvTimeout} / 1000 );
+
+        if(@sockets == 0){
+            die new Thrift::TException('TSocket: timed out reading '.$len.' bytes from '.
+                                       $self->{host}.':'.$self->{port});
+        }
+
+        my $sock = $sockets[0];
+
+        my ($buf,$sz);
+        $sock->recv($buf, $len);
+
+        if (!defined $buf || $buf eq '') {
+
+            die new Thrift::TException('TSocket: Could not read '.$len.' bytes from '.
+                               $self->{host}.':'.$self->{port});
+
+        } elsif (($sz = length($buf)) < $len) {
+
+            $pre .= $buf;
+            $len -= $sz;
+
+        } else {
+            return $pre.$buf;
+        }
+    }
+}
+
+#
+# Read from the socket
+#
+# @param int $len How many bytes
+# @return string Binary data
+#
+sub read
+{
+    my $self = shift;
+    my $len  = shift;
+
+    return unless defined $self->{handle};
+
+    #check for timeout
+    my @sockets = $self->{handle}->can_read( $self->{recvTimeout} / 1000 );
+
+    if(@sockets == 0){
+        die new Thrift::TException('TSocket: timed out reading '.$len.' bytes from '.
+                                   $self->{host}.':'.$self->{port});
+    }
+
+    my $sock = $sockets[0];
+
+    my ($buf,$sz);
+    $sock->recv($buf, $len);
+
+    if (!defined $buf || $buf eq '') {
+
+        die new TException('TSocket: Could not read '.$len.' bytes from '.
+                           $self->{host}.':'.$self->{port});
+
+    }
+
+    return $buf;
+}
+
+
+#
+# Write to the socket.
+#
+# @param string $buf The data to write
+#
+sub write
+{
+    my $self = shift;
+    my $buf  = shift;
+
+
+    return unless defined $self->{handle};
+
+    while (length($buf) > 0) {
+
+
+        #check for timeout
+        my @sockets = $self->{handle}->can_write( $self->{sendTimeout} / 1000 );
+
+        if(@sockets == 0){
+            die new Thrift::TException('TSocket: timed out writing to bytes from '.
+                                       $self->{host}.':'.$self->{port});
+        }
+
+        my $sock = $sockets[0];
+
+        my $got = $sock->send($buf);
+
+        if (!defined $got || $got == 0 ) {
+            die new Thrift::TException('TSocket: Could not write '.length($buf).' bytes '.
+                                 $self->{host}.':'.$self->{host});
+        }
+
+        $buf = substr($buf, $got);
+    }
+}
+
+#
+# Flush output to the socket.
+#
+sub flush
+{
+    my $self = shift;
+
+    return unless defined $self->{handle};
+
+    my $ret  = ($self->{handle}->handles())[0]->flush;
+}
+
+
+#
+# Build a ServerSocket from the ServerTransport base class
+#
+package  Thrift::ServerSocket;
+
+use base qw( Thrift::Socket Thrift::ServerTransport );
+
+use constant LISTEN_QUEUE_SIZE => 128;
+
+sub new
+{
+    my $classname   = shift;
+    my $port        = shift;
+
+    my $self        = $classname->SUPER::new(undef, $port, undef);
+    return bless($self,$classname);
+}
+
+sub listen
+{
+    my $self = shift;
+
+    # Listen to a new socket
+    my $sock = IO::Socket::INET->new(LocalAddr => undef, # any addr
+                                     LocalPort => $self->{port},
+                                     Proto     => 'tcp',
+                                     Listen    => LISTEN_QUEUE_SIZE,
+                                     ReuseAddr => 1)
+        || do {
+            my $error = 'TServerSocket: Could not bind to ' .
+                        $self->{host} . ':' . $self->{port} . ' (' . $! . ')';
+
+            if ($self->{debug}) {
+                $self->{debugHandler}->($error);
+            }
+
+            die new Thrift::TException($error);
+        };
+
+    $self->{handle} = $sock;
+}
+
+sub accept
+{
+    my $self = shift;
+
+    if ( exists $self->{handle} and defined $self->{handle} )
+    {
+        my $client        = $self->{handle}->accept();
+        my $result        = new Thrift::Socket;
+        $result->{handle} = new IO::Select($client);
+        return $result;
+    }
+
+    return 0;
+}
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cassandra/lib/Thrift/Transport.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,177 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+require 5.6.0;
+use strict;
+use warnings;
+
+use Thrift;
+
+#
+# Transport exceptions
+#
+package TTransportException;
+use base('Thrift::TException');
+
+use constant UNKNOWN      => 0;
+use constant NOT_OPEN     => 1;
+use constant ALREADY_OPEN => 2;
+use constant TIMED_OUT    => 3;
+use constant END_OF_FILE  => 4;
+
+sub new{
+    my $classname = shift;
+    my $self      = $classname->SUPER::new(@_);
+
+    return bless($self,$classname);
+}
+
+package Thrift::Transport;
+
+#
+# Whether this transport is open.
+#
+# @return boolean true if open
+#
+sub isOpen
+{
+    die "abstract";
+}
+
+#
+# Open the transport for reading/writing
+#
+# @throws TTransportException if cannot open
+#
+sub open
+{
+    die "abstract";
+}
+
+#
+# Close the transport.
+#
+sub close
+{
+    die "abstract";
+}
+
+#
+# Read some data into the array.
+#
+# @param int    $len How much to read
+# @return string The data that has been read
+# @throws TTransportException if cannot read any more data
+#
+sub read
+{
+    my ($len);
+    die("abstract");
+}
+
+#
+# Guarantees that the full amount of data is read.
+#
+# @return string The data, of exact length
+# @throws TTransportException if cannot read data
+#
+sub readAll
+{
+    my $self = shift;
+    my $len  = shift;
+
+    my $data = '';
+    my $got = 0;
+
+    while (($got = length($data)) < $len) {
+        $data .= $self->read($len - $got);
+    }
+
+    return $data;
+}
+
+#
+# Writes the given data out.
+#
+# @param string $buf  The data to write
+# @throws TTransportException if writing fails
+#
+sub write
+{
+    my ($buf);
+    die "abstract";
+}
+
+#
+# Flushes any pending data out of a buffer
+#
+# @throws TTransportException if a writing error occurs
+#
+sub flush {}
+
+
+#
+# TransportFactory creates transport objects from transports
+#
+package Thrift::TransportFactory;
+
+sub new {
+    my $classname = shift;
+    my $self      = {};
+
+    return bless($self,$classname);
+}
+
+#
+# Build a transport from the base transport
+#
+# @return Thrift::Transport transport
+#
+sub getTransport
+{
+    my $self  = shift;
+    my $trans = shift;
+
+    return $trans;
+}
+
+
+#
+#  ServerTransport base class module
+#
+package Thrift::ServerTransport;
+
+sub listen
+{
+    die "abstract";
+}
+
+sub accept
+{
+    die "abstract";
+}
+
+sub close
+{
+    die "abstract";
+}
+
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Yuki/DiffText.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,90 @@
+package Yuki::DiffText;
+use strict;
+use Algorithm::Diff qw(traverse_sequences);
+use vars qw($VERSION @EXPORT_OK @ISA);
+use vars qw($diff_text $diff_msgrefA $diff_msgrefB @diff_deleted @diff_added);
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(difftext);
+$VERSION = '0.1';
+
+=head1 NAME
+
+Yuki::DiffText - A wrapper of Algorithm::Diff for YukiWiki.
+
+=head1 SYNOPSIS
+
+    use strict;
+    use Yuki::DiffText qw(difftext);
+
+    my @array1 = ( "Alice", "Bobby", "Chris", );
+    my @array2 = ( "Alice",          "Chris", "Diana", );
+    my $difftext = difftext(\@array1, \@array2);
+    print $difftext;
+
+    # Result:
+    # =Alice
+    # -Bobby
+    # =Chris
+    # +Diana
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Algorithm::Diff>
+
+=back
+
+=head1 AUTHOR
+
+Hiroshi Yuki <hyuki@hyuki.com> http://www.hyuki.com/
+
+=head1 LICENSE
+
+Copyright (C) 2002 by Hiroshi Yuki.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+sub difftext {
+    ($diff_msgrefA, $diff_msgrefB) = @_;
+    undef $diff_text;
+    undef @diff_deleted;
+    undef @diff_added;
+    traverse_sequences(
+        $diff_msgrefA, $diff_msgrefB,
+        {
+            MATCH => \&df_match,
+            DISCARD_A => \&df_delete,
+            DISCARD_B => \&df_add,
+        }
+    );
+    &diff_flush;
+    return $diff_text;
+}
+
+sub diff_flush {
+    $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));
+    $diff_text .= join('', map { "+$_\n" } splice(@diff_added));
+}
+
+sub df_match {
+    my ($a, $b) = @_;
+    &diff_flush;
+    $diff_text .= "=$diff_msgrefA->[$a]\n";
+}
+
+sub df_delete {
+    my ($a, $b) = @_;
+    push(@diff_deleted, $diff_msgrefA->[$a]);
+}
+
+sub df_add {
+    my ($a, $b) = @_;
+    push(@diff_added, $diff_msgrefB->[$b]);
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Yuki/PluginManager.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,150 @@
+package Yuki::PluginManager;
+
+use UNIVERSAL qw(can);
+
+# Be careful.
+# use strict;
+# no strict refs;
+
+my $VERSION = '0.2';
+my $DEBUG = 0;
+
+#
+# Constructor of Yuki::PluginManager.
+#
+sub new {
+    my ($class, $context, @dirs) = @_;
+    my $self = {
+        # Maps plugin name to its filename.
+        pluginname_to_filename => {},
+        # Listing of filter type plugins.
+        filter => [],
+        # Logs.
+        log => [],
+        # Plugin context given by YukiWiki plugin.
+        context => $context,
+    };
+    # Search for plugins.
+    for my $dir (@dirs) {
+        for my $file (sort glob("$dir/*.pl")) {
+            if (-e($file)) {
+                my $pluginname = $file;
+                $pluginname =~ s/.*?(\w+?)\.pl$/$1/;
+                $self->{pluginname_to_filename}->{$pluginname} = $file;
+                if ($plugin =~ /^filter_/) {
+                    push(@{$self->{filter}}, $plugin);
+                }
+            }
+        }
+    }
+    return bless $self, $class;
+}
+
+# Calls plugin.
+# $plugin is the plugin name, for example: 'amazon'
+# $type is either 'inline', 'block', 'usage, or 'filter'.
+# $argument is plugin dependent.
+sub call {
+    my ($self, $plugin, $type, $argument) = @_;
+    my $file = $self->{pluginname_to_filename}->{$plugin};
+    my $result = undef;
+    # <use-can>
+    # my $funcname = "plugin_$type";
+    # my $funcref = \&{"${plugin}::plugin_$type"};
+    # my $namespace = \%{"${plugin}::"};
+    # </use-can>
+    # Does the plugin exist?
+    if ($file) {
+        eval {
+            require $file;
+            # Check if the function is defined or not.
+            # <use-can>
+            # if (defined($namespace->{$funcname})) {
+            #     $result = $funcref->($argument, $self->{context});
+            # } else {
+            #     push(@{$self->{log}}, "$funcname: undefined function.");
+            # }
+            # </use-can>
+            my $funcname = "plugin_$type";
+            my $funcref = can($plugin, $funcname);
+            if (defined($funcref)) {
+                $result = $funcref->($argument, $self->{context});
+            } else {
+                push(@{$self->{log}}, "$funcname: undefined function.");
+            }
+        };
+        if ($@) {
+            push(@{$self->{log}}, "$@");
+        }
+    } else {
+        push(@{$self->{log}}, "$plugin: file for this plugin is not found.");
+    }
+    return $result;
+}
+
+# Return undef if no replacement.
+sub filter {
+    my ($self) = @_;
+    for my $plugin (@{$self->{filter}}) {
+        my $rawout = $self->call($plugin, 'filter', '');
+        return $rawout if defined($rawout);
+    }
+    return undef;
+}
+
+# Gather information of plugins.
+sub usage {
+    my ($self) = @_;
+    my $usage_array_ref = [];
+    for my $plugin (sort keys %{$self->{pluginname_to_filename}}) {
+        my $usage_hash = $self->call($plugin, 'usage', '');
+        if (defined($usage_hash)) {
+            push(@{$usage_array_ref}, $usage_hash);
+        }
+    }
+    return $usage_array_ref;
+}
+
+1;
+__END__
+=head1 NAME
+
+Yuki::PluginManager - Manages installed YukiWiki plugins.
+
+=head1 SYNOPSIS
+
+    use strict;
+    use Yuki::PluginManager;
+
+    my $plugin_manager = new Yuki::PluginManager($plugin_context, 'plugin/dir/');
+
+=head1 DESCRIPTION
+
+Yuki::PluginManager is used by YukiWiki.
+
+=head1 METHODS
+
+=over 4
+
+=item new($plugin_context, @dirs)
+
+=item call($self, $plugin, $type, $argument)
+
+It calls $plugin::plugin_$type($argument).
+
+=head1 SEE ALSO
+
+=back
+
+=head1 AUTHOR
+
+Hiroshi Yuki <hyuki@hyuki.com> http://www.hyuki.com/
+
+=head1 LICENSE
+
+Copyright (C) 2003, 2004 by Hiroshi Yuki.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Yuki/RSS.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,161 @@
+package Yuki::RSS;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '0.4a';
+
+=head1 NAME
+
+Yuki::RSS - The smallest module to generate RSS 1.0. 
+It is downward compatible to XML::RSS.
+
+=head1 SYNOPSIS
+
+    use strict;
+    use Yuki::RSS;
+
+    my $rss = new Yuki::RSS(
+        version => '1.0',
+        encoding => 'Shift_JIS'
+    );
+
+    $rss->channel(
+        title => "Site Title",
+        link => "http://www.example.com/index.html",
+        about => "http://www.example.com/rss.rdf",
+        description  => "The description of your site",
+    );
+
+    $rss->add_item(
+        title => "Item Title",
+        link => "http://www.example.com/item.html",
+        description => "Yoo, hoo, hoo",
+        dc_date => "2003-12-06T01:23:45+09:00",
+    );
+
+    print $rss->as_string;
+
+=head1 DESCRIPTION
+
+Yuki::RSS is the smallest RSS 1.0 generator.
+This module helps you to create the minimum document of RSS 1.0.
+If you need more than that, use XML::RSS.
+
+=head1 METHODS
+
+=over 4
+
+=item new Yuki::RSS (version => $version, encoding => $encoding)
+
+Constructor for Yuki::RSS.
+It returns a reference to a Yuki::RSS object.
+B<version> must be 1.0.
+B<encoding> will be inserted output document as a XML encoding.
+This module does not convert to this encoding.
+
+=item add_item (title => $title, link => $link, description => $description, dc_date => $date)
+
+Adds an item to the Yuki::RSS object.
+
+=item as_string
+
+Returns the RSS string.
+
+=item channel (title => $title, about => $about, link => $link, description => $desc)
+
+Channel information of RSS.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<XML::RSS>
+
+=back
+
+=head1 AUTHOR
+
+Hiroshi Yuki <hyuki@hyuki.com> http://www.hyuki.com/
+
+=head1 LICENSE
+
+Copyright (C) 2001,2004 by Hiroshi Yuki.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+# The constructor.
+sub new {
+    my ($class, %hash) = @_;
+    my $self = {
+        version => $hash{version},
+        encoding => $hash{encoding},
+        channel => { },
+        items => [],
+    };
+    return bless $self, $class;
+}
+
+# Setting channel.
+sub channel {
+    my ($self, %hash) = @_;
+    foreach (keys %hash) {
+        $self->{channel}->{$_} = $hash{$_};
+    }
+    return $self->{channel};
+}
+
+# Adding item.
+sub add_item {
+    my ($self, %hash) = @_;
+    push(@{$self->{items}}, \%hash);
+    return $self->{items};
+}
+
+# 
+sub as_string {
+    my ($self) = @_;
+    my $about = $self->{channel}->{about};
+    $about = $self->{channel}->{link} unless ($about);
+    my $doc = <<"EOD";
+<?xml version="1.0" encoding="$self->{encoding}" ?>
+
+<rdf:RDF
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://purl.org/rss/1.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+>
+
+<channel rdf:about="$self->{channel}->{about}">
+ <title>$self->{channel}->{title}</title>
+ <link>$self->{channel}->{link}</link>
+ <description>$self->{channel}->{description}</description>
+ <items>
+  <rdf:Seq>
+   @{[
+    map {
+     qq{   <rdf:li rdf:resource="$_->{link}" />\n}
+    } @{$self->{items}}
+   ]}
+  </rdf:Seq>
+ </items>
+</channel>
+@{[
+ map {
+  qq{
+   <item rdf:about="$_->{link}">
+    <title>$_->{title}</title>
+    <link>$_->{link}</link>
+    <description>$_->{description}</description>
+    <dc:date>$_->{dc_date}</dc:date>
+   </item>
+  }
+ } @{$self->{items}}
+]}
+</rdf:RDF>
+EOD
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Yuki/YukiWikiDB.pm	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,121 @@
+package Yuki::YukiWikiDB;
+
+use strict;
+use Fcntl ':flock';
+
+# Constructor
+sub new {
+    return shift->TIEHASH(@_);
+}
+
+# tying
+sub TIEHASH {
+    my ($class, $dbname) = @_;
+    my $self = {
+        dir => $dbname,
+        keys => [],
+    };
+    if (not -d $self->{dir}) {
+        if (!mkdir($self->{dir}, 0777)) {
+            die "mkdir(" . $self->{dir} . ") fail";
+        }
+    }
+    return bless($self, $class);
+}
+
+# Store
+sub STORE {
+    my ($self, $key, $value) = @_;
+    my $filename = &make_filename($self, $key);
+    &lock_store($filename, $value);
+    return $value;
+}
+
+# Fetch
+sub FETCH {
+    my ($self, $key) = @_;
+    my $filename = &make_filename($self, $key);
+    my $value = &lock_fetch($filename);
+    return $value;
+}
+
+# Exists
+sub EXISTS {
+    my ($self, $key) = @_;
+    my $filename = &make_filename($self, $key);
+    return -e($filename);
+}
+
+# Delete
+sub DELETE {
+    my ($self, $key) = @_;
+    my $filename = &make_filename($self, $key);
+    unlink $filename;
+    # return delete $self->{$key};
+}
+
+sub FIRSTKEY {
+    my ($self) = @_;
+    opendir(DIR, $self->{dir}) or die $self->{dir};
+    @{$self->{keys}} = grep /\.txt$/, readdir(DIR);
+    foreach my $name (@{$self->{keys}}) {
+        $name =~ s/\.txt$//;
+        $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;
+    }
+    return shift @{$self->{keys}};
+}
+
+sub NEXTKEY {
+    my ($self) = @_;
+    return shift @{$self->{keys}};
+}
+
+sub make_filename {
+    my ($self, $key) = @_;
+    my $enkey = '';
+    foreach my $ch (split(//, $key)) {
+        $enkey .= sprintf("%02X", ord($ch));
+    }
+    return $self->{dir} . "/$enkey.txt";
+}
+
+sub lock_store {
+    my ($filename, $value) = @_;
+    open(FILE, "+< $filename") or open(FILE, "> $filename") or die "$filename cannot be created";
+    eval("flock(FILE, LOCK_EX)");
+    if ($@) {
+        # Your platform does not support flock.
+        # Implement another EXCLUSIVE LOCK here.
+    }
+    truncate(FILE, 0);
+    # binmode(FILE);
+    $value =~ s/\x0D\x0A/\n/g;
+    print FILE $value;
+    eval("flock(FILE, LOCK_UN)");
+    if ($@) {
+        # Your platform does not support flock.
+        # Implement another UNLOCK here.
+    }
+    close(FILE);
+}
+
+sub lock_fetch {
+    my ($filename) = @_;
+    open(FILE, "$filename") or return(undef);
+    eval("flock(FILE, LOCK_SH)");
+    if ($@) {
+        # Your platform does not support flock.
+        # Implement another SHARED LOCK here.
+    }
+    local $/;
+    my $value = <FILE>;
+    eval("flock(FILE, LOCK_UN)");
+    if ($@) {
+        # Your platform does not support flock.
+        # Implement another UNLOCK here.
+    }
+    close(FILE);
+    return $value;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/conflict.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,11 @@
+XV‚ÌÕ“Ë‚ª”­¶‚µ‚Ü‚µ‚½B
+
+‘¼‚Ìl‚ªA‚±‚̃y[ƒW‚ðXV‚µ‚Ä‚µ‚Ü‚Á‚½‚悤‚Å‚·B
+
+ˆÈ‰º‚ÉA
+‚ ‚È‚½‚Ì•ÒW‚µ‚½ƒeƒLƒXƒg‚ª‚ ‚è‚Ü‚·‚Ì‚ÅA
+‚ ‚È‚½‚Ì•ÒW“à—e‚ªŽ¸‚í‚ê‚È‚¢‚悤‚ÉA
+‚¢‚Ü‚·‚®Aƒƒ‚’ ‚ȂǂɃRƒs[•ƒy[ƒXƒg‚µ‚Ä‚­‚¾‚³‚¢B
+
+ƒRƒs[•ƒy[ƒXƒg‚ªÏ‚ñ‚Å‚©‚çA
+RecentChanges‚ÅÅV‚Ì“à—e‚ðŒ©‚ÄAÄ“x•ÒW‚µ’¼‚µ‚Ä‚­‚¾‚³‚¢B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/format.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,62 @@
+**ƒeƒLƒXƒg®Œ`‚̃‹[ƒ‹
+
+’Êí‚Í“ü—Í‚µ‚½•¶Žš‚ª‚»‚Ì‚Ü‚Üo—Í‚³‚ê‚Ü‚·‚ªA
+ˆÈ‰º‚̃‹[ƒ‹‚É]‚Á‚ăeƒLƒXƒg®Œ`‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B
+
+***Šî–{ƒ‹[ƒ‹
+- ˜A‘±‚µ‚½•¡”s‚͘AŒ‹‚³‚ê‚Ü‚·B
+- ‹ós‚Í’i—Ž‚Ì‹æØ‚è‚Æ‚È‚è‚Ü‚·B
+- s“ª‚ªƒXƒy[ƒX‚ÅŽn‚Ü‚Á‚Ä‚¢‚é‚ÆA‚»‚Ì’i—Ž‚Í®Œ`Ï‚Ý‚Æ‚µ‚Ĉµ‚í‚ê‚Ü‚·B
+- HTML‚̃^ƒO‚Í‘‚¯‚Ü‚¹‚ñB
+
+***•¶Žšü‚è
+- ƒVƒ“ƒOƒ‹ƒNƒH[ƒg2ŒÂ‚Å‚Í‚³‚ñ‚¾•”•ª‚ÍA''ƒ{[ƒ‹ƒh''‚É‚È‚è‚Ü‚·B
+- ƒVƒ“ƒOƒ‹ƒNƒH[ƒg3ŒÂ‚Å‚Í‚³‚ñ‚¾•”•ª‚ÍA'''ƒCƒ^ƒŠƒbƒN'''‚É‚È‚è‚Ü‚·B
+
+***Œ©o‚µ
+- ƒAƒXƒ^ƒŠƒXƒN(*)‚ðs“ª‚É‘‚­‚ÆA‘匩o‚µ‚É‚È‚è‚Ü‚·B
+- ƒAƒXƒ^ƒŠƒXƒN2ŒÂ(**)‚ðs“ª‚É‘‚­‚ÆA’†Œ©o‚µ‚É‚È‚è‚Ü‚·B
+- ƒAƒXƒ^ƒŠƒXƒN3ŒÂ(***)‚ðs“ª‚É‘‚­‚ÆA¬Œ©o‚µ‚É‚È‚è‚Ü‚·B
+- Œ©o‚µ‚ª‚ ‚é‚ÆŽ©“®“I‚É–ÚŽŸ‚ªì‚ç‚ê‚Ü‚·B
+
+***‰Óð‘‚«A…•½üAˆø—p•¶
+- ƒ}ƒCƒiƒX(-)‚ðs“ª‚É‘‚­‚ÆA‰Óð‘‚«‚É‚È‚è‚Ü‚·B- -- --- ‚Ì3ƒŒƒxƒ‹‚ª‚ ‚è‚Ü‚·B
+- ƒ}ƒCƒiƒX4ŒÂ(----)‚ðs“ª‚É‘‚­‚ÆA…•½ü‚É‚È‚è‚Ü‚·B
+- > ‚ðs“ª‚É‘‚­‚ÆAˆø—p•¶‚ª‘‚¯‚Ü‚·B> >> >>> ‚Ì3ƒŒƒxƒ‹‚ª‚ ‚è‚Ü‚·B
+
+***ƒnƒCƒp[ƒŠƒ“ƒN
+- http://www.hyuki.com/‚̂悤‚ÈURL‚ÍŽ©“®“I‚ɃŠƒ“ƒN‚É‚È‚è‚Ü‚·B
+- YukiWiki‚̂悤‚ɑ啶Žš¬•¶Žš‚𬂺‚½‰p•¶Žš—ñ‚ð‘‚­‚ÆAYukiWiki‚̃y[ƒW–¼‚É‚È‚è‚Ü‚·B
+- “ñd‚Ì‘å‚©‚Á‚±[[ ]]‚Å‚­‚­‚Á‚½•¶Žš—ñ‚ð‘‚­‚ÆAYukiWiki‚̃y[ƒW–¼‚É‚È‚è‚Ü‚·B‘å‚©‚Á‚±‚Ì’†‚ɂ̓Xƒy[ƒX‚ðŠÜ‚ß‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB“ú–{Œê‚àŽg‚¦‚Ü‚·B
+
+***—pŒê‰ðà
+- ƒRƒƒ“(:)‚ðs“ª‚É‘‚­‚ÆA—pŒê‚Ɖðà•¶‚ªì‚ê‚Ü‚·BˆÈ‰º‚̂悤‚É‚µ‚Ü‚·B
+
+---(
+:—pŒê1:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶1
+:—pŒê2:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶2
+:—pŒê3:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶3
+---)
+
+:—pŒê1:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶1
+:—pŒê2:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶2
+:—pŒê3:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶3
+
+***ƒe[ƒuƒ‹
+- ƒRƒ“ƒ}(,)‚ðs“ª‚É‘‚­‚ÆAƒe[ƒuƒ‹(•\)‚ªì‚ê‚Ü‚·BˆÈ‰º‚̂悤‚É‚µ‚Ü‚·B
+
+---(
+, Wiki‚Ì–¼‘O  ,  ìŽÒ  , URL 
+,Wiki,Ward Cunningham,http://www.c2.com/
+,YukiWiki,Hiroshi Yuki,http://www.hyuki.com/
+,WalWiki,Makio Tsukamoto,http://digit.que.ne.jp/
+---)
+
+, Wiki‚Ì–¼‘O  ,  ìŽÒ  , URL 
+,Wiki,Ward Cunningham,http://www.c2.com/
+,YukiWiki,Hiroshi Yuki,http://www.hyuki.com/
+,WalWiki,Makio Tsukamoto,http://digit.que.ne.jp/
+
+***ƒo[ƒxƒCƒ^ƒ€‹@”\
+- --( ‚Æ --) ‚Å‚­‚­‚ç‚ꂽs‚Í‘‚¢‚½‚Ü‚Ü•\Ž¦‚³‚ê‚Ü‚·‚ªAƒŠƒ“ƒN‚╶Žšü‚è‚Í—LŒø‚Å‚·(ƒo[ƒxƒCƒ^ƒ€Eƒ\ƒtƒg)B
+- ---( ‚Æ ---) ‚Å‚­‚­‚ç‚ꂽs‚̓Šƒ“ƒN‚╶Žšü‚è‚à–³Ž‹‚³‚ê‚Ä‘‚¢‚½‚Ü‚Ü•\Ž¦‚³‚ê‚Ü‚·(ƒo[ƒxƒCƒ^ƒ€Eƒn[ƒh)B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frontpage.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,13 @@
+‚±‚̃y[ƒW‚ÍYukiWiki‚ÌFrontPage‚Å‚·B
+
+‚à‚µ‚ ‚È‚½‚ªŠÇ—ŽÒ‚È‚çA‚±‚ÌYukiWiki‚ðŒöŠJ‚·‚é‘O‚ÉA
+AdminChangePassword‚̃Šƒ“ƒNŒo—R‚ÅŠÇ—ŽÒ‚̃pƒXƒ[ƒh‚ðݒ肵‚Ä‚­‚¾‚³‚¢B
+
+ŠÇ—ŽÒ‚̃pƒXƒ[ƒh‚ªÝ’è‚Å‚«‚½‚È‚çA
+frontpage.txt‚ð•ÒW‚µ‚ÄA
+‚ ‚È‚½“ÆŽ©‚ÌFrontPage‚ðì‚Á‚Ä‚­‚¾‚³‚¢B
+
+- YukiWiki‚ÌÅVî•ñ‚Í http://www.hyuki.com/yukiwiki/ ‚É‚ ‚è‚Ü‚·B
+- RecentChanges‚ªÅ‹ßXV‚³‚ꂽƒy[ƒW‚̈ꗗ‚É‚È‚è‚Ü‚·B
+- IndexPage‚Í‘Sƒy[ƒW‚̈ꗗ‚Å‚·B
+- —ûK‚É‚ÍSandBox‚ª‚¨Š©‚ß‚Å‚·B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/history.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,570 @@
+YukiWikiì‹Æ‹L˜^
+
+*2006-07-06
+- Version 2.1.3.
+- Subversion‚ɈÚsB
+- RSS‚ðƒtƒ@ƒCƒ‹‚Æ‚µ‚Äo—Í‚·‚é‚悤‚É•ÏXB
+-- wiki.cgi: $modifier_rss_about’ljÁB
+-- wiki.cgi: $file_rss’ljÁB
+-- wiki.cgi: update_rssfile’ljÁB
+-- ƒpƒbƒP[ƒW‚Érss.xml’ljÁBà–¾‚Íreadme.txt‚ÉB
+- ŠÈ’P‚Èspam‘ÎôB
+-- wiki.cgi: keyword_reject’ljÁB
+- ƒ[ƒ‹‚Ì‘Ž®‚ð•ÏXB
+- ‘‚«ž‚Ý’·‚³‚Ìő姌À
+-- wiki.cgi: length_reject’ljÁB
+-- wiki.cgi: $max_message_length’ljÁB
+-- resource.txt: toolongpost’ljÁB
+
+*2004-10-24
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.2a.
+- wiki.cgi: &make_link‚ŃXƒL[ƒ€‚̃`ƒFƒbƒN‚ð“ü‚ê‚é‚悤‚ÉC³B
+- zenitani‚³‚ñ‚ÉŠ´ŽÓB
+- wiki.cgi: textarea‚©‚çwrap="off"‚ðíœB
+- wiki.cgi: Copyright•\Ž¦‚ðPowered by‚É•ÏXB
+- cvs tag tag_release-212a_2004-10-24
+
+*2004-05-07
+- wikibook_branch‚Åì‹Æ’†B
+- wiki.css: VerdanaƒtƒHƒ“ƒg‚ðƒfƒtƒHƒ‹ƒg‚ÉB‚»‚Ì‘¼×‚©‚¢“_‚ðC³B
+
+*2004-05-06
+- wikibook_branch‚Åì‹Æ’†B
+- wiki.css: dl, dt, dd‚ð’²®B
+
+*2004-03-31
+- wikibook_branch‚Åì‹Æ’†B
+- wiki.cgi: RssPage¨$RssPage
+- zenitani‚³‚ñ‚ÉŠ´ŽÓB
+
+*2004-03-27
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.2.
+- cvs tag tag_release-212_2004-03-28
+
+*2004-03-27
+- wikibook_branch‚Åì‹Æ’†B
+- plugin/link.pl: http|https|ftp|mailtoˆÈŠO‚ÌURL‚Í–³Ž‹‚·‚é‚悤‚ÉC³B
+- zenitani‚³‚ñ‚ÉŠ´ŽÓB
+
+*2004-03-27
+- wikibook_branch‚Åì‹Æ’†B
+- wiki.cgi: –ÚŽŸ•”•ª‚̓^ƒO‚𜋎‚·‚é‚悤‚ÉC³B
+- shino‚³‚ñ‚ÉŠ´ŽÓB
+
+*2004-03-21
+- ‘ЃTƒ|[ƒgƒTƒCƒg‚Éu—ûK—pYukiWikiƒTƒCƒgv‚ðÝ’u‚·‚邽‚ßA•Êƒuƒ‰ƒ“ƒ`‚ðì‚éB
+- branch_wb-wiki_2004-03-21
+- http://www.hyuki.com/wb/wiki/wiki.cgi
+
+*2004-03-02
+- wikibook_branch‚Åì‹Æ’†B
+- Yuki/PluginManager.pm: stash‚ðŽg‚킸UNIVERSAL::can‚ðŽg‚Á‚Äsub‚Ì—L–³‚ð”»’èB
+- andi‚³‚ñ‚ÉŠ´ŽÓB
+
+*2004-03-02
+- wikibook_branch‚Åì‹Æ’†B
+- Yuki/PluginManager.pm: •s—v‚Èuse vars‚ðíœB
+
+*2004-02-27
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.1.
+- readme.txt: plugin‚ÉŠÖ‚·‚é‹Lq˜R‚ê‚ðC³B
+- cvs tag tag_release-candidate-211_2004-02-27
+- ‚±‚ê‚ð‘ÐŽû˜^”Å‚É‚·‚é—\’èB
+
+*2004-02-26
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.1.
+- ƒvƒ‰ƒOƒCƒ“‚ð’ljÁiƒTƒ“ƒvƒ‹‚Æ‚µ‚Ă̈Ӗ¡‡‚¢‚ª‹­‚¢jB
+- plugin.txt: ’ljÁB
+- plugin/link.pl: ’ljÁB
+- plugin/recent.pl: ’ljÁB
+- plugin/ruby.pl: ’ljÁB
+- plugin/verb.pl: ’ljÁB
+- cvs tag tag_release-candidate-211_2004-02-26
+- ‚±‚ê‚ð‘ÐŽû˜^”Å‚É‚·‚é—\’訂â‚ßB
+
+*2004-02-24
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0e.
+- Yuki/PluginManager.pm: ’ljÁB
+- wiki.cgi: pluginŠÖ˜A’ljÁB
+- resource.txt: pluginŠÖ˜A’ljÁB
+- ‚±‚ê‚Ńvƒ‰ƒOƒCƒ“‹@”\‚ªenable‚É‚È‚Á‚½B
+-- ƒvƒ‰ƒOƒCƒ“Ž©‘Ì‚Ízip‚É‚Í‚Ü‚¾ŠÜ‚ß‚È‚¢B
+-- •W€ƒvƒ‰ƒOƒCƒ“‚ðŒˆ‚ß‚é•K—v‚ª‚ ‚éB
+
+*2004-02-24
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0d.
+- wiki.css: table‚ÌŠDF‚ª‚«‚‚·‚¬‚é‚̂щƒCƒgƒuƒ‹[‚ÉB
+- .htaccess: AddType text/css .css ’ljÁB
+
+*2004-02-24
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0d.
+- .htaccess: AddHandler cgi-script .cgi
+- wiki.css: body.normal‚ª”²‚¯‚Ä‚¢‚½B
+
+*2004-02-21
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0d.
+- $use_FixedFrontPage‚ªŒø‚¢‚Ä‚¢‚È‚©‚Á‚½B
+- RSS‚Ìdc_date‚ªŒø‚¢‚Ä‚¢‚È‚©‚Á‚½B
+- cvs tag tag_release-210d_2004-02-21
+
+*2004-02-21
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0c.
+- UNIXŠÂ‹«‚ų‚µ‚­diff‚Å‚«‚È‚¢‚Ì‚ðC³B
+
+*2004-02-20
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0b.
+- ƒƒCƒ“‚ÌYukiWiki‚ð‚±‚Ìƒo[ƒWƒ‡ƒ“‚É–ß‚µA
+- ƒvƒ‰ƒOƒCƒ“‹@”\‚Í‚¢‚Á‚½‚ñdisable‚É‚·‚éB
+
+*2004-02-15
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0b.
+- wiki.cgi: textarea‚Ì擪‚É1ŒÂ‰üs‚ð“ü‚ê‚éB
+
+*2004-02-13
+- wikibook_branch‚Åì‹Æ’†B
+- wiki.cgi: RSS Autodiscovery—p‚̃wƒbƒ_‚ð’ljÁB
+- <link rel="alternate" type="application/rss+xml" title="RSS" href="$url_cgi?RssPage" />
+
+*2004-02-13
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0a.
+- RSS‚Ìchannel‚Ìabout‚É‚ÍRSS‚Ìchannel‚ð“ü‚ꂽ‚Ù‚¤‚ª‚æ‚¢‚Æ‚¢‚¤‚Ì‚ÅC³B
+- Yuki/RSS.pm: channel‚Éabout‚ð’ljÁBVersion 0.4.
+- wiki.cgi: $modifier_rss_link‚ðŽg‚Á‚ÄaboutƒtƒB[ƒ‹ƒh‚ð–„‚ß‚é.
+
+*2004-02-09
+- wikibook_branch‚Åì‹Æ’†B
+- Version 2.1.0.
+- cvs tag tag_release-210_2004-02-09
+
+*2004-02-09
+- wikibook_branch‚Åì‹Æ’†B
+- Yuki/YukiWikiDB.pm: ƒtƒ@ƒCƒ‹‘‚«ž‚Ý‚Ìbinmode‚ð‚â‚ß‚éB
+- WindowsŠÂ‹«‚ÅCR LF‚ÆLF‚ª¬Ý‚µ‚Ä‚µ‚Ü‚¢diff‚ª³‚µ‚­o‚È‚¢‚½‚ßB
+- wiki.css: ®—B
+
+*2004-02-02
+- wikibook_branch‚Åì‹Æ’†B
+- ‚±‚±‚Ü‚Å‚Ì‹@”\‚ð2.1.0‚É‚µ‚悤‚ÆŽv‚Á‚Ä‚¢‚éB
+
+*2004-02-02
+- wikibook_branch‚Åì‹Æ’†B
+- wiki.css, wiki.cgi: [VerbatimSoft] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB --(, --)
+- wiki.css, wiki.cgi: [VerbatimHard] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB ---(, ---)
+- Yuki/RSS.pm: dc_date‚ð“ü‚ꂽ(WalWikiŽQl)B
+- Yuki/RSS.pm: xmlns”²‚¯C³(Thank you, y-Aki‚³‚ñ)B
+- wiki.cgi: WalWiki‚ÉK‚Á‚Äencode‚ðC³[better encode]B
+- resource.txt, wiki.cgi: &text_to_html: –ÚŽŸ‚ª‚ ‚é‚Æ‚«‚Íu–ÚŽŸv‚ð’ljÁB
+- wiki.cgi: Fix bug: Œ©o‚µ•¶Žš—ñ‚ª‹ó‚ÌŽž‚É‚ÍŒ©o‚µ‚Æ‚µ‚Ĉµ‚í‚È‚¢‚悤‚É‚µ‚½B
+- wiki.cgi: Œ©o‚µƒŒƒxƒ‹‚ð*, **, ***‚Ì3ƒŒƒxƒ‹‚É‚µ‚½B
+- wiki.cgi: $use_FixedFrontPage‚𓱓ü‚µ‚ÄFrontPage‚ð•ÒW‰Â”\‚É‚Å‚«‚é‚悤‚É‚µ‚½B
+- frontpage.txt: Fix typo.
+- wiki.css: Styles for printer.
+- wiki.cgi: Add "editlink" class.
+
+*2004-01-26
+- wikibook_branch‚Åì‹Æ’†B
+- TODO:
+    - prohosting‚Å“®ìŠm”FB“Á‚Émodifier_...‚ð•ÏX‚µ‚½ê‡B
+
+*2004-01-25
+- šˆÈ‰ºAwikibook_branch‚Åì‹Æš
+- 2004-12-04`2004-01-14‚ÌC³‚Ítrunk‘¤‚È‚Ì‚ÅA‚±‚¿‚ç‚É‚Í‚Ü‚¾”½‰f‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚É’ˆÓB
+- wiki.cgi: ƒo[ƒWƒ‡ƒ“–¼‚ÉWB‚ð•t‰Á‚·‚éBCopyright•\‹L‚ðC³B
+- convert.cgi: 휂·‚éB
+- history1.txt: 휂·‚éB
+- history2.txt: 휂·‚éB
+- history.txt: trunk‚Ì•û‚©‚瓇‚·‚éB
+- frontpage.txt: C³B
+- ‚±‚±‚Ü‚Å‚Å“®ìŠm”FBƒ^ƒO‚𒣂éB
+- cvs tag tag_run_2004-01-26
+
+*2004-01-25
+- YukiWiki 2.0.6Œn‚ð/wb/wiki‚Ɉړ®‚µA‚»‚¿‚ç‚ðV‚½‚È2.1Œn‚É‚·‚éB
+- YukiWiki 2.1.devŒn‚Í•Û—¯‚Æ‚·‚éB
+
+*2004-01-14
+- YukiWiki 2.1.dev8‚Åì‹Æ’†B
+- readme.txt‚ɇ‚킹‚ăfƒBƒŒƒNƒgƒŠ‚ð®—‚µ‚½B
+- ‚»‚ê‚É”º‚¢Aconfig.pl‚ð®—B
+- theme/ ƒfƒBƒŒƒNƒgƒŠ‚ðì¬BCSS‚ÆGIF‚Í‚±‚±‚É“ü‚ê‚éB
+
+*2003-12-20
+- YukiWiki 2.1.dev8‚Åì‹Æ’†B
+- Œ©o‚µƒŒƒxƒ‹‚ð*, **, ***‚Ì3ƒŒƒxƒ‹‚É‚µ‚½B
+- Jcode-0.68‚ðlibˆÈ‰º‚É“WŠJ‚µ‚½B
+- do_rss: Jcode‚ð—p‚¢AEUC-JP, Shift_JIS, UTF-8‚Ì‚¢‚¸‚ê‚Å‚àRSSo—͉”\‚É‚µ‚½B
+- config.pl: rss_encoding‚ð’ljÁB
+- config.pl: kanjicode‚ðíœBƒRƒ“ƒeƒ“ƒc‚Ícharset‚Å“ˆê‚·‚éB
+- code_convert: •¶ŽšƒR[ƒh‚ð“K؂Ƀ}ƒbƒsƒ“ƒO‚·‚é‚悤‚É‚µ‚½B
+- readme.txt: ‚΂ç‚΂ç‚É‚È‚Á‚Ä‚¢‚½î•ñ‚ðW‚ß‚½‚èAƒfƒBƒŒƒNƒgƒŠˆê——‚ðì‚Á‚½‚肵‚½B
+
+*2003-12-14
+- YukiWiki1‚Ìhistory1.txt‚Æhistory2.txt‚ð‚Ü‚Æ‚ß‚Ähistory.txt‚Æ‚µ‚½B
+- test_convert‚ðíœB
+- YukiWikiMini‚ÌꊂðˆÚ“®B
+
+*2003-12-14
+- plugins/ ¨ plugin/ ‚É–¼‘O•ÏXB
+- image/ ì¬B
+
+*2003-12-13
+- YukiWiki 2.1.dev7‚Åì‹Æ’†B
+- config.pl: ì¬B
+- $modifier_ •Ï”ŒQ‚ð‚·‚×‚Ä$config{  }‚É•ÏXB
+
+*2003-12-11
+- template.html, wiki.css: transparent‚ÍCSS‚É‘‚­B
+- plugins/attach.pl: 쬒†B
+
+*2003-12-10
+- YukiWiki 2.1.dev5‚Åì‹Æ’†B
+- Yuki::Template‚ÌŽÀ‘•B
+- template.html: ƒeƒ“ƒvƒŒ[ƒg—á‚ðì¬B
+- %decoration: íœB
+- dump_error: ’ljÁBƒeƒ“ƒvƒŒ[ƒg‚ªŽg‚¦‚È‚­‚Ä‚àŽg‚¦‚éprint_error‘Š“–B
+- resource.txt: ‚¢‚ë‚¢‚ë’ljÁB
+- &text_to_html: –ÚŽŸ‚ª‚ ‚é‚Æ‚«‚Íu–ÚŽŸv‚ð’ljÁB
+
+*2003-12-09
+- YukiWiki 2.1.dev4‚Åì‹Æ’†B
+- ActionPlugin‚̉º€”õB
+- linktree.pl: WikiName‚ªarmored‚Ì‚Æ‚«‚̃oƒOC³B
+
+*2003-12-09
+- YukiWiki 2.1.dev3‚Åì‹Æ’†B
+- filterƒvƒ‰ƒOƒCƒ“‚ÌŽd—l‚ð•ÏXBdefined‚Ì‚Æ‚«ƒI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚É‚µ‚½B
+- filter_layout.pl: ƒTƒ“ƒvƒ‹‚Æ‚µ‚Äspecial_rawout‚ðì‚Á‚½B
+
+*2003-12-08
+- YukiWiki 2.1.dev2‚Åì‹Æ’†B
+- WalWiki‚ÉK‚Á‚Äencode‚ðC³[better encode]B
+- [LinkTreePlugin][[ƒŠƒ“ƒNƒcƒŠ[ƒvƒ‰ƒOƒCƒ“]]‚ðì‚Á‚Ä‚Ý‚½(linktree.pl)B
+- RSS.pm‚Ì‚Åxmlns”²‚¯C³(Thank you, y-Aki‚³‚ñ)B
+
+*2003-12-07
+- YukiWiki 2.1.dev1‚Åì‹Æ’†B
+- ƒtƒBƒ‹ƒ^ƒvƒ‰ƒOƒCƒ“‚Ì‹@\‚ð“ü‚ꂽB
+- ƒuƒƒbƒNƒvƒ‰ƒOƒCƒ“‚ð“ü‚ꂽB
+- [VerbatimSoft] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB --(, --)
+- [VerbatimHard] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB ---(, ---)
+- [FilterPlugin] ƒtƒBƒ‹ƒ^‹@”\‚ð“ü‚ꂽBƒTƒ“ƒvƒ‹‚Æ‚µ‚Äfilter_layout.pl‚ðŽÀ‘•‚µ‚½B
+- [AutoPluginUsage]ƒvƒ‰ƒOƒCƒ“‚Ì—˜—p•û–@‚ªŽ©“®“I‚É•ÒWŽž‚̃wƒ‹ƒv‚ÉŽæ‚èž‚Ü‚ê‚悤‚É‚µ‚½B
+- Fix bug: Œ©o‚µ•¶Žš—ñ‚ª‹ó‚ÌŽž‚É‚ÍŒ©o‚µ‚Æ‚µ‚Ĉµ‚í‚È‚¢‚悤‚É‚µ‚½B
+
+*2003-12-06
+- YukiWiki 2.1.dev0‚Åì‹Æ’†B
+- ƒvƒ‰ƒOƒCƒ“‚Ì‹@\‚ð“ü‚ꂽB‚Æ‚è‚ ‚¦‚¸&user_plugin(argument)‚ÌŒ`Ž®B
+- plugins/link.pl‚Å–¼‘O•t‚«ƒŠƒ“ƒN‚ðŽÀŒ»‚µ‚½B
+- plugins/amazon.pl‚ŃAƒ}ƒ]ƒ“‚̃Šƒ“ƒN‚ðŽÀŒ»‚µ‚½B
+- RSS.pm‚Édc_date‚ð“ü‚ꂽ(WalWikiŽQl)B
+
+*2003-12-04
+- YukiWiki 2.1.dev0‚Åì‹Æ’†B
+- Yuki::YukiWikiDB‚ðƒfƒtƒHƒ‹ƒg‚É‚µ‚½B
+- $use_FixedFrontPage‚𓱓ü‚µ‚ÄFrontPage‚ð•ÒW‰Â”\‚É‚Å‚«‚é‚悤‚É‚µ‚½B
+- WalWiki‚Ì’Ë–{‚³‚ñ‚©‚ç—L‰v‚Èî•ñ‚Æ—ã‚Ü‚µ‚ð‚½‚­‚³‚ñ‚¢‚½‚¾‚¢‚½B
+
+*2003-07-13
+- YukiWiki 2.0.6xx‚Åì‹Æ’†B
+- 2.0.6x‚Å“ü‚ꂽC³‚ÌÄC³BƒRƒƒ“ƒg‹@”\‚Ì‚ ‚½‚èB
+
+*2003-06-06
+- YukiWiki 2.0.6x‚Åì‹Æ’†B
+- ®Œ`Ï‚Ý‚Ì’†‚Ìembed_command, embed_rcommand‚̈µ‚¢‚ðC³’†B’Ë–{‚³‚ñ‚ÌŽw“E‚É‚æ‚éB
+- TODO:AnyDBM_File‚ÅYuki::YukiWikiDB‚ðƒfƒtƒHƒ‹ƒgƒf[ƒ^ƒx[ƒX‚̇”Ô‚ð‚¢‚¶‚é‚悤‚É‚µ‚½‚Ù‚¤‚ª‚æ‚¢‚ÆŽv‚¤B
+
+*2003-02-23
+- /^\s*$/ ‚Ƀ}ƒbƒ`‚µ‚½‚Æ‚«‚É’Ê탂[ƒh‚É–ß‚é‚Ì‚Å‚Í‚È‚­/^$/‚Ƀ}ƒbƒ`‚µ‚½‚Æ‚«‚É–ß‚é‚悤‚ÉC³B
+‚±‚ê‚ÍA<pre>‚Ì’†‚ɃXƒy[ƒX‚¾‚¯‚Ìs‚ªŠÜ‚܂ꂽ‚Æ‚«‚Ɉê“x</pre>‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ð–h‚®‚½‚ßB
+
+*2002-08-28
+- Yuki::YukiWikiDB‚Éflock‚ð“ü‚ꂽB
+- Yuki::YukiWikiDB‚̃fƒoƒbƒOƒvƒŠƒ“ƒg‚ðdie‚É•ÏX‚µ‚½B
+- hyuki.com‚ʼn^—p‚µ‚Ä‚¢‚½YukiWiki‚̃f[ƒ^ƒx[ƒX‚𕜋ŒB
+- AnyDBM_File‚©‚çYuki::YukiWikiDB‚ÉŽè“®‚Å•ÏŠ·B
+- wiki.cgiƒXƒNƒŠƒvƒg‚É‚Í•ÏX‚È‚µB
+
+*2002-08-22
+- YukiWiki 2.0.5ŒöŠJB
+
+*2002-08-22
+- 2.0.4‚ÌXSS‘Îô‚É•s\•ª‚È“_‚ª‚ ‚Á‚½‚Ì‚Å&print_editformC³(ŠÖ‘º‚³‚ñ‚ÌŽw“E‚É‚æ‚é)B
+$form{mypassword}‚ð&escape‚µ‚Ä‚¢‚È‚©‚Á‚½B
+- $resource{anydbmfileerroranydbmfileerror}‚ÌtypoC³B
+
+*2002-07-12
+- YukiWiki 2.0.4ŒöŠJB
+
+*2002-07-12
+- 2.0.3‚ÌXSS‘Îô‚É•s\•ª‚È“_‚ª‚ ‚Á‚½‚Ì‚Å&make_linkC³(’Ë–{–q¶‚³‚ñ‚ÌŽw“E‚É‚æ‚é)B
+- ”z•z•¨‚ɃfƒoƒbƒO—p‚̃R[ƒh‚ªŽc‚Á‚Ä‚¢‚½‚̂ŃRƒƒ“ƒgƒAƒEƒgB
+
+*2002-07-11
+- YukiWiki 2.0.3ŒöŠJB
+
+*2002-07-11
+- office‚³‚ñ‚©‚çuƒNƒƒXƒTƒCƒgƒXƒNƒŠƒvƒeƒBƒ“ƒOÆŽã«v‚ÌŽw“E‚ðŽó‚¯‚éB
+- ƒy[ƒW–¼‚ɃXƒNƒŠƒvƒg‚ª¬“ü‚³‚¹‚ç‚ꂽꇂɑΈB
+- ¶‚Ńy[ƒW–¼‚ðŒ©‚¹‚¸A•K‚¸&escape‚·‚éC³‚ðs‚¤B
+
+*2002-06-30
+- do_index‚Ńy[ƒW˜R‚ꂪ¶‚¶‚é–â‘è‚Í‚Ü‚¾–¢‰ðŒˆB
+- use AnyDBM_File;‚ðeval‚Å‚­‚é‚ÝAƒGƒ‰[‚É‚È‚ç‚È‚¢‚悤‚É’ˆÓ‚·‚éB
+- ƒGƒ‰[‚É‚È‚Á‚½‚Æ‚«A$modifier_dbtype‚ªAnyDBM_File‚É‚È‚Á‚Ä‚¢‚½‚çƒGƒ‰[ƒy[ƒW‚ð•\Ž¦B
+- (Ž©“®“I‚É$modifier_dbtype‚ð•ÏX‚·‚邱‚Æ‚Í‚µ‚È‚¢)
+
+*2002-06-06
+- YukiWiki 2.0.0ŒöŠJB
+
+*2002-05-31
+- history1.txt, history2.txtì¬B
+- wikiman_ja.plì¬B
+
+*2002-05-22
+- #‚ÅŽn‚Ü‚éƒy[ƒW–¼‚Ínot is_editable.
+- Õ“Ë‚ª‹N‚«‚½‚Æ‚«‚̉æ–Ê‚ðC³B
+
+*2002-05-21
+- RSS‚ðXMLƒtƒ@ƒCƒ‹‚Å‚Í‚È‚­CGIŒo—R‚Åo‚·‚悤‚ÉC³B
+- &‚𳂵‚­ƒy[ƒW–¼‚Æ‚µ‚Ĉµ‚¦‚é‚悤‚ÉC³B
+- wiki.cgi‚ðreadme2.txt‚ðreadme_en.txt‚Æreadme_ja.txt‚É•ª—£B
+- CGI’†‚ÌPOD‚ÍŬŒÀ‚É‚µ‚½B
+- ƒf[ƒ^ƒfƒBƒŒƒNƒgƒŠ‚ð•ÊƒfƒBƒŒƒNƒgƒŠ‚É‚Å‚«‚é‚悤‚É$modifier_dir_data‚𓱓ü‚µ‚½B
+- alpha6
+
+*2002-05-19
+- footer‚Ì•”•ª‚Íaddress—v‘f‚É•ÏXBshino‚³‚ñ‚ÌŽw“E‚É‚æ‚éB
+- –ÚŽŸƒŠƒ“ƒN‚ɃoƒO‚ ‚èB—]Œv‚È#‚ª‚ ‚èA‚¤‚Ü‚­–ÚŽŸƒŠƒ“ƒN‚©‚çƒWƒƒƒ“ƒv‚Å‚«‚È‚©‚Á‚½B
+
+*2002-05-18
+- WalWiki‚ðŽQl‚É‚µ‚ÄAƒy[ƒW‚Ì * ‚â ** ‚Í–ÚŽŸ‚Æ‚µ‚ÄŽûW‚·‚é‚悤‚É‚µ‚½B
+
+*2002-05-17
+- ƒvƒŒƒrƒ…[‰æ–Ê(YukiWiki1‚©‚玂Á‚Ä‚«‚½)
+- YukiWiki1‚©‚çYukiWiki2‚ւ̈Úsƒc[ƒ‹(WalWiki‚Ìconvert.cgi‚ð‰ü‘¢BŠ´ŽÓ)B
+- wiki.txt¨frontpage.txt‚ɃŠƒl[ƒ€B
+- YukiWikiDB‚ð•Êƒtƒ@ƒCƒ‹‚É‚µ‚ÄYuki::YukiWikiDB‚Ɉړ®B
+- AnyDBM_File, YukiWikiDB, dbmopen‚Ì3•ûŽ®‚ɑΉži‚Ó‚¤cjB
+- alpha5‚̃XƒNƒŠƒvƒg‚ðŒöŠJB
+- YukiWiki1‚̃f[ƒ^‚ð‚²‚»‚Á‚ÆYukiWiki2‚ɈÚs‚µ‚Ä‚Ý‚éB‘åä•v‚¾‚낤‚©cB
+- ‚Æ‚è‚ ‚¦‚¸AYukiWiki1‚Ì‚Ù‚¤‚Í•ÒW‚Å‚«‚È‚­‚µ‚Ä‚Ý‚½B‚»‚Ì‚¤‚¿AŽ©“®“I‚ÉYukiWiki2‚É“]‘—‚·‚é‚悤‚É‚·‚é‚‚à‚èB
+
+*2002-05-16
+- exists‚ª‚È‚¢ê‡‚É‚Ídefined‚Å‘ã—p‚Å‚«‚é‚悤‚É$use_exists‚𓱓üB
+- RecentChanges‚ÌXVƒ~ƒX‚ðC³B
+
+*2002-05-14
+- RSS‹@”\(Yuki::RSS)‚ð’ljÁ‚µ‚½B
+- ·•ª—p‚̃R[ƒh‚ª‚²‚¿‚Ⴒ‚¿‚Ⴕ‚Ä‚¢‚½‚Ì‚ÅAYuki::DiffText‚ðì‚Á‚½B
+- WalWiki(http://digit.que.ne.jp/work/index.cgi?WalWiki)‚©‚çƒR[ƒh‚ðŽØ‚è‚ăe[ƒuƒ‹‚ðŽÀ‘•B
+- alpha3‚̃XƒNƒŠƒvƒg‚ðŒöŠJB
+
+*2002-05-13
+- •’ʂ̃y[ƒW‚𓀌‹‚·‚éŽè’i‚Í‚·‚Å‚Éì‚ç‚ê‚Ä‚¢‚éB
+- FrontPage‚É‘å‚«‚ȃƒS‚ð‚‚¯‚½B
+- ·•ª‚ð‚Ü‚¸‚Í‘g‚Ýž‚ñ‚¾BŠ®‘S‚ɂ̓Šƒ\[ƒX‰»‚³‚ê‚Ä‚¢‚È‚¢BHTML::Template‚ªŽg‚¢‚½‚­‚È‚éB
+
+*2002-05-09
+- ‰æ‘œ‚ðimg‰»‚·‚é‚悤‚É‚µ‚½B
+- FormatRule‚ð•ÒW‰æ–ʂ̉º‚Ì‚Ù‚¤‚Éo‚·‚悤‚É‚µ‚½B
+
+*2002-05-08
+- TfWiki‚ðYukiWiki2‚Æ‚µ‚ÄAƒfƒBƒŒƒNƒgƒŠˆÚ“®B
+- Œ³‚ÌTfWiki‚Ì‚Ù‚¤‚ւ̃Šƒ“ƒN‚ÍYukiWiki2‚ÖƒŠƒ_ƒCƒŒƒNƒgB
+
+*2002-04-14
+- [[YukiWiki2]]‚ðŽŸ‰ñ‚ÌC MAGAZINE‚̘AÚ‘èÞ‚É‚µ‚悤‚Æl—¶’†B
+- [[YukiWiki2]]‚̃ƒS쬈˗Š’†B
+
+*2002-03-27
+- [[ˆêŒ¾ƒRƒƒ“ƒg‹@”\]]‚Å‘‚«ž‚ñ‚Å‚à[[XV—š—ð]]‚ªXV‚³‚ê‚È‚¢•s‹ï‡‚ÌC³B
+- [[ˆêŒ¾ƒRƒƒ“ƒg‹t‡‹@”\]]‚ðŽŽ‚µ‚ÉŽÀ‘•‚·‚éB
+
+*2002-03-26
+- [[‘åã•Ù:TfWikiì‹Æ‹L˜^]]‚Æ‚¢‚¤‚Ì‚Í‚Ç‚¤‚Å‚µ‚傤‚©B[[‹Éˆ«]]‚³‚ñ‚Ì‚²Ð‰îB
+- ‰æ‘œ‚̃ƒS‚Í•s—v‚©‚à‚µ‚ê‚È‚¢‚ªAƒŠƒ“ƒN—pƒoƒi[ƒAƒCƒRƒ“88x31‚Í‚ ‚Á‚Ä‚à‚¢‚¢‚©‚ÈB¡“x‚ÍŠ„‚ƃVƒƒ[ƒv‚ÈŠ´‚¶‚É‚µ‚½‚¢‚ÈB
+- •ÒW‚̃Šƒ“ƒN‚ɉ摜‚ðŽg‚¤‚±‚Æ‚Í‚â‚ç‚È‚¢—\’èB‚ ‚ ‚¢‚¤ƒAƒCƒRƒ“‚Á‚Ä•ª‚©‚è‚É‚­‚¢‚ÆŽv‚¤‚©‚çB
+- ƒƒjƒ…[ƒo[‚ÍŠ¿Žš•\‹L‚É‚È‚Á‚Ä‚¢‚邯‚ê‚ÇAŽÀ‚̓XƒNƒŠƒvƒg’†‚É‚Í‚Ü‚Á‚½‚­“ú–{Œê‚Í‚È‚¢‚Ì‚¾BƒŠƒ\[ƒXƒtƒ@ƒCƒ‹‚Æ‚µ‚ÄŠO•”ƒtƒ@ƒCƒ‹‰»‚µ‚Ä‚¢‚éB‚¾‚©‚ç‚â‚é‹C‚É‚È‚ê‚ÎAƒXƒNƒŠƒvƒg‚Í‚»‚Ì‚Ü‚Ü‚ÅA(ƒNƒbƒL[‚âCGI‚Ö“n‚·ˆø”‚È‚Ç‚Å)‰pŒê/“ú–{Œê‚Ì‘SØ‚è‘Ö‚¦‚à‰Â”\‚È‚Ì‚¾B
+- ’m‚ç‚È‚¢‚¤‚¿‚É[[‰pŒê”Å:FrontPage]]‚à‚Å‚«‚»‚¤‚ÈŠ´‚¶BInterWikiName‚ɒljÁ‚µ‚Ä‚­‚ꂽlA‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B
+
+*2002-03-25
+- AdminEdit‚ł̃Gƒ“ƒR[ƒh–Y‚êC³B
+- ƒ^ƒCƒgƒ‹‚ðŒŸõƒŠƒ“ƒN‚É‚µ‚½B
+- TfWiki‚à‚¢‚¢‚¯‚ê‚ÇAYukiWiki‚ðƒo[ƒWƒ‡ƒ“ƒAƒbƒv‚µ‚½‚­‚È‚Á‚Ä‚«‚½B
+- ‹}‚É®Œ`ƒ‹[ƒ‹‚ð•ÏX‚µ‚Ä‚Ý‚éB“–‘R‚Ì‚²‚Æ‚­‚ ‚¿‚±‚¿‚̃ŒƒCƒAƒEƒg‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚Å‚ ‚Á‚½B‚Ђ¦[B
+- ‚¾‚ñ‚¾‚ñTfWiki‚Å‚Í‚È‚­AYukiWiki2.0‚ðì‚Á‚Ä‚¢‚é‹C•ª‚É‚È‚Á‚Ä‚«‚Ü‚µ‚½B
+- [[ˆêŒ¾ƒRƒƒ“ƒg‹@”\]]‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
+- RecentChanges‚âˆêŒ¾ƒRƒƒ“ƒg‚Ì“ú•t‚¯‚Ímonospace‚É‚È‚é‚悤‚ɃXƒ^ƒCƒ‹Žw’èB
+- ˆêŒ¾ƒRƒƒ“ƒg‚ð‚‚¯‚½‚Æ‚«‚É‚àRecentChanges‚ªXV‚³‚ê‚é‚悤‚ÉC³B
+- PlugIn‹@”\‚ðŽÀ‘•‚µ‚Ä‚¢‚éWiki‚ª‚ ‚邯‚ê‚ÇAŽ„‚ÍPlugIn‚É‚Í‚ ‚Ü‚è‹»–¡‚È‚µB
+- ‚Å‚«‚邾‚¯ƒVƒ“ƒvƒ‹‚ÉA‚Å‚à‚ ‚¿‚±‚¿‚ÌWikiClones‚ÅŽÀ‘•‚³‚ê‚Ä‚¢‚é•Ö—˜‚È‹@”\‚ÍŽæ‚èž‚ñ‚Å‚¢‚­‚‚à‚èB
+- ‚ÅA“K“–‚ȃ^ƒCƒ~ƒ“ƒO‚ÅŒ»Ý‚ÌYukiWikiƒŒƒ|ƒWƒgƒŠ‚ðEUC‚É•ÏŠ·‚µ‚ÄAYukiWiki‚̃o[ƒWƒ‡ƒ“ƒAƒbƒv‚ւƂ‚Ȃ°‚Ä‚¢‚±‚¤‚ÆŽv‚Á‚Ä‚¢‚éB
+- [[YukiWiki2]]Œü‚¯‚̃ƒS‚àì‚肽‚¢‚ÈB
+- ‚±‚̃y[ƒW‚ðŠÏŽ@‚µ‚Ä‚¢‚éƒy[ƒW‚ð”­Œ©(^_^) => http://www1.u-netsurf.ne.jp/~dune/wiki_2Epl.html?
+
+*2002-03-24
+- InterWiki‚ðŽÀŒ±“I‚ÉŽÀ‘•’†B[[google:Œ‹é_]]
+InterWiki‚̓NƒŠƒbƒN‚³‚ꂽ‚Æ‚«‚É“WŠJ‚µ‚½‚Ù‚¤‚ª‚æ‚¢A‚Æ‚¢‚¤Žw“E‚ª‚ ‚è‚Ü‚µ‚½B
+‚Å‚àA‚»‚ê‚Ù‚Ç‘å‚«‚È•‰’S‚Å‚Í‚È‚¢‚ÆŽv‚¤‚Ì‚ÅA‚Ü‚¸‚Í‚±‚Ì‚Ü‚Ü‚É‚µ‚Ä‚¨‚«‚Ü‚·B
+- ƒ^ƒCƒ€ƒXƒ^ƒ“ƒv‚ÌXV‚ð‚â‚߂邱‚Æ‚à‰Â”\‚É‚µ‚Ü‚µ‚½B
+- ƒ^ƒbƒ`ƒtƒ@ƒCƒ‹‚ð‚¢‚ê‚ÄAXVî•ñ‚Ń`ƒFƒbƒN‚µ‚â‚·‚­‚µ‚Ü‚µ‚½B
+- ŠÇ—ŽÒ‚Æ‚¢‚¤‘¶Ý‚ð“ü‚ê‚Ü‚µ‚½BŠO‚©‚ç‚ÍŒ©‚¦‚È‚¢‚¯‚ê‚ÇB
+- [[“€Œ‹ƒy[ƒW‹@”\]]‚ðŽÀ‘•‚µ‚Ü‚µ‚½B‚¿‚È‚Ý‚É‚±‚̃y[ƒWŽ©g‚à“€Œ‹B
+- “€Œ‹ƒy[ƒW‚Ìꇂɂ͉E‰º‚ÉAdminEdit‚̃Šƒ“ƒN‚ð—pˆÓ‚·‚é‚悤‚É‚µ‚½B
+
+*2002-03-23
+- “ú–{Œê‚ÌWikiName‚Í[[ ]]‚Å‚­‚­‚邱‚Æ‚É‚µ‚Ü‚µ‚½B
+-- KbWiki‚̂悤‚Éu@@v‚É‚µ‚悤‚©‚ÈcB
+-- ‚»‚êATiki‚Å‚»‚¤‚È‚Á‚Ä‚¢‚邯‚ÇA‚È‚É‚©‚Æ•s•Ö‚Å‚·dddB
+-- ‚Ó‚¤‚ñA‚â‚Á‚Ï‚è“‚¢‚à‚Ì‚È‚Ì‚Å‚·‚ËB
+-- Žv‚¢•t‚«‚Å‚·‚ªA"‚Ù‚°‚Ù‚°BB"‚Æ‚¢‚¤‚悤‚ÉA‚Ü‚é‚ð‚Q‚•t‚¯‚ê‚ÎWikiname‚É‚È‚é‚Æ‚¢‚¤‚Ì‚Ç‚¤‚Å‚µ‚傤‚©B‚¢‚¿‚¢‚¿AIME‚ðØ‘Ö‚¦‚È‚­‚ÄŠy‚©‚à’m‚ê‚Ü‚¹‚ñB
+-- ‚Ü‚½‚ÍA"”‚Ù‚°‚Ù‚°"‚̂悤‚ÉA‘SŠp‚Ì”‚ð•t‚¯‚½‚Æ‚«‚Æ‚©B”‚Í–Å‘½‚ÉŽg‚¢‚Ü‚¹‚ñ‚µB
+-- ƒAƒCƒfƒBƒA‚Ç‚¤‚à‚Å‚·BEUC‚É‚·‚é‚Æ[[  ]]‚Å‚­‚­‚Á‚Ä‚à‚ ‚Ü‚è‚«‚É‚È‚ç‚È‚­‚È‚Á‚¿‚á‚¢‚Ü‚µ‚½...
+
+- Փ˂̃`ƒFƒbƒNB
+-- ‚¿‚È‚Ý‚ÉAՓ˂̃`ƒFƒbƒN‚ÍYukiWiki‚Ì‚Æ‚«‚Æ“¯‚¶‚悤‚Ƀy[ƒW‚̃nƒbƒVƒ…’l‚ðŽg‚¤B
+-- Last modified‚Ìî•ñ‚ð“ü‚ê‚é
+-- ‚±‚êA‚à‚¤­‚µ”Ä—p‚É‚µ‚ÄAƒy[ƒW‚Ìuƒwƒbƒ_v‚ðì‚éBSubject‚à‚»‚±‚É“ü‚ê‚éB
+-- Œ‹‹ÇAՓ˂̃`ƒFƒbƒN‚ÍLast-Modifed‚Ìî•ñ‚ð•Êƒf[ƒ^ƒx[ƒX‚É‚¢‚ꂽB
+-- ƒy[ƒW‚̃wƒbƒ_‚͔ώG‚·‚¬‚é‚Ì‚Å‚â‚ßB
+
+*2002-03-22
+- ˆÈ~‚ÍAYukiWiki2‚Ìì‹Æ‹L˜^‚Å‚ ‚éB
+- IndexPage, SearchPage, HelpPage‚È‚Ç‚ðì‚é
+-- ‚±‚êAInterWiki‚Ì‹@”\‚ðŽg‚Á‚ÄŽÀŒ»‚Å‚«‚»‚¤‚¾‚ÈBŽ©•ªŽ©g‚ðƒT[ƒo‚Æ‚·‚éB
+
+*2002-03-06
+- Version 1.6.8B
+- ƒXƒ^ƒCƒ‹ƒV[ƒg‚ð•Êƒtƒ@ƒCƒ‹‚Æ‚µ‚½($stylesheet)B
+- Content-type‚ðo—Í‚·‚éÛ‚Écharset‚𖾎¦“I‚Éo‚·‚悤‚É‚µ‚½(print_header)B
+- ƒvƒŒƒrƒ…[‰æ–Ê‚Å‚àXV‚ÌÕ“Ë‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³(check_conflict)B
+- ·•ª•\Ž¦‚Ì‚Æ‚«Aƒ‚ƒmƒNƒ‚ȃuƒ‰ƒEƒU‚Å‚à•ª‚©‚é‚悤‚É•\Ž¦(do_diff)B
+
+*2002-03-01
+- Version 1.6.7B
+- ƒpƒbƒP[ƒW‚ÉDiff.pm‚𓯫B
+
+*2001-10-20
+- Version 1.6.6B
+- XV‚ÌÕ“Ë‘ÎôB
+- Œ³ƒy[ƒW‚ÌŠÈ’P‚ȃ`ƒFƒbƒNƒTƒ€‚ðŽæ‚Á‚Ä‚¨‚«AXV‘O‚Ƀ`ƒFƒbƒNƒTƒ€‚ð”äŠr‚·‚éB
+C³ŒÂŠ‚Ídigest‚Æ‚¢‚¤•¶Žš—ñ‚ðŒŸõ‚·‚ê‚Εª‚©‚éB
+–{—ˆ‚ÍMD5‚È‚Ç‚Å‚¿‚á‚ñ‚Æ‚â‚Á‚½•û‚ª‚¢‚¢‚Ì‚¾‚¯‚ê‚ÇB
+- Õ“ËŽž‚É•\Ž¦‚³‚ê‚郃bƒZ[ƒW‚È‚Ç‚Íu‹Éˆ«v‚³‚ñ‚̃y[ƒW‚ðŽQl‚É‚µ‚½B
+
+*2001-10-17
+- Version 1.6.5B
+- ƒvƒŒƒrƒ…[‰æ–Ê‚ÅAXVƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½‚Æ‚«‚É‘—M‚³‚ê‚é
+ƒƒbƒZ[ƒW‚Ì“à—e‚ðinput—v‘f‚Ìtype="hidden"‚ðŽg‚Á‚Ä–„‚ßž‚Þ‚Ì‚ð‚â‚ß‚éB
+‘ã‚í‚è‚ÉAtextarea—v‘f‚ðŽg‚¤B
+- ăvƒŒƒrƒ…[—p‚Émyspecial_‚𓱓üB‚Å‚à‚«‚ê‚¢‚È‘Îô‚Å‚Í‚È‚¢B
+
+*2001-08-30
+- Version 1.6.4B
+- URL‚Ń_ƒCƒŒƒNƒg‚Ƀy[ƒW–¼‚ðŽw’肵‚Ä‚àA
+$WikiName‚Æ$BracketNameˆÈŠO‚̃y[ƒW‚ðì‚ê‚È‚¢‚悤‚É‚µ‚½B
+(is_valid_name‚Æis_editableŽQÆ)B
+
+*2001-08-30
+- Version 1.6.3B
+- RecentChanges‚ð•ÒWEÄ•ÒW•s‰Â‚Æ‚µ‚½B
+- •ÒW•s‰Âƒy[ƒW‚Í@uneditable‚Ƀy[ƒW–¼‚ð“ü‚ê‚éB
+
+*2001-02-25
+- Version 1.6.1, 1.6.2B
+- ·•ª‹@”\‚̃oƒOC³B
+- do_preview‚Å'>'‚ªˆµ‚¦‚È‚¢ƒoƒO‚ðC³iƒ†[ƒU‚©‚ç‚ÌŽw“EjB
+
+*2001-02-22
+- Version 1.6.0B
+- ·•ª‹@”\‚ðŽÀ‘•‚µ‚½B
+
+*2001-02-19
+- Version 1.5.4B
+- ‰æ‘œƒtƒ@ƒCƒ‹‚ւ̃Šƒ“ƒN‚͉摜‚É‚µ‚Ä‚Ý‚½B
+
+*2001-02-19
+- Version 1.5.3B
+- RecentChanges‚Ì’†‚É휂µ‚½ƒy[ƒW‚ª‚ ‚é‚Ì‚ð‚â‚ß‚½B
+- use strict;‚ňø‚Á‚©‚©‚é•”•ª‚ð­‚µ®—(Š®‘S‚Å‚Í‚È‚¢)B
+
+*2001-02-16
+- Version 1.5.2B
+- textarea‚É•\Ž¦‚¨‚æ‚уvƒŒƒrƒ…[‚·‚é‘O‚É < ‚â > ‚ð &lt; ‚â &gt; ‚É•ÏŠ·‚µ‚½
+(do_preview, editpage, print_preview_buttons)B
+
+*2000-12-27
+- Version 1.5.1B
+- ƒvƒŒƒrƒ…[‰æ–Ê‚ð®—‚µ‚½B
+
+*2000-12-22
+- Version 1.5.0B
+- ‘S‘Ì“I‚É‚¸‚¢‚Ô‚ñ‘‚«’¼‚µ‚½B
+- ˆê——‚ð•Ê“r쬂·‚é‚悤‚É‚µ‚½(do_list)B
+- ‘‚«ž‚Þ‘O‚ÉŠm”F‰æ–Ê‚ðo‚·‚悤‚É‚µ‚½(do_preview)B
+- ƒeƒLƒXƒg‚Ì‘‚«•û‚ð•ÒW‰æ–Ê‚É“ü‚ꂽ(do_edit, do_reedit)B
+- WhatsNew¨RecentChangesATopPage¨FrontPage‚É•ÏX‚µ‚½B
+
+*2000-12-20
+- Version 1.1.0B
+- tie‚ð—˜—p‚µ‚ÄAdbmopen‚ªŽg‚¦‚È‚¢ê‡‚Å‚à“®ì‚·‚é‚悤‚ÉC³B
+- —˜—pŽÒ‚Ì1l‚Å‚ ‚éu‹Éˆ«v‚³‚ñ‚©‚ç‘—‚Á‚Ä‚¢‚½‚¾‚¢‚½ƒR[ƒh‚ðŒ³‚É‚µ‚Ä‚¢‚Ü‚·B
+
+*2000-09-05
+- Version 1.0.2B
+-  <body color=...> ¨ <body bgcolor=...>
+- —˜—pŽÒ‚©‚ç‚ÌŽw“E‚É‚æ‚éBŠ´ŽÓB
+
+*2000-08-06
+- Version 1.0.1‚ðŒöŠJB
+- C MAGAZINEiƒ\ƒtƒgƒoƒ“ƒNƒpƒuƒŠƒbƒVƒ“ƒOj2000”N10ŒŽ†˜AÚ‹LŽ–Œü‚¯ŒöŠJ”ÅB
+- [[ ]] ‚ÌŌオu–]v‚̂悤‚ɃVƒtƒgJIS‚Å
+- 0x5D‚É‚È‚éꇂ̉ñ”ð‚ðs‚È‚Á‚½B
+
+*2000-08-05
+- Version 1.0.0‚ðŒöŠJB
+
+*2000-07-23
+- Version 0.82‚ðŒöŠJB
+- •ÒWŽž‚̃Šƒ“ƒNƒ~ƒXB
+- <textarea>‚Ì‘®«•ÏXB
+
+*2000-07-22
+- Version 0.81‚ðŒöŠJB
+- ƒƒS‚ð‘g‚Ýž‚ÞB
+
+*2000-07-21
+- Version 0.80‚ðŒöŠJB
+- POD‚ðCGI’†‚É‘‚«ž‚ÞB
+
+*2000-07-19
+- Version 0.70‚ðŒöŠJB
+- '''ƒCƒ^ƒŠƒbƒN'''‚âA--A---A>>A>>>‚È‚Ç‚ðŽÀ‘•B
+
+*2000-07-18
+- Version 0.60‚ðŒöŠJB
+- *‘¾Žš*‚ð''‘¾Žš''‚É•ÏX
+
+*2000-07-17
+- Version 0.50‚ðŒöŠJB
+
+*2000-07-17
+- ‚³‚ç‚É‚¢‚ë‚¢‚ë’ljÁ‚·‚éB
+
+*2000-07-16
+- ‚¢‚ë‚¢‚ë’ljÁB
+
+*2000-07-15
+- ŒöŠJB
Binary file icon40x40.gif has changed
Binary file icon80x80.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcode.pl	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,780 @@
+package jcode;
+;######################################################################
+;#
+;# jcode.pl: Perl library for Japanese character code conversion
+;#
+;# Copyright (c) 1995-1999 Kazumasa Utashiro <utashiro@iij.ad.jp>
+;# Internet Initiative Japan Inc.
+;# 3-13 Kanda Nishiki-cho, Chiyoda-ku, Tokyo 101-0054, Japan
+;#
+;# Copyright (c) 1992,1993,1994 Kazumasa Utashiro
+;# Software Research Associates, Inc.
+;#
+;# Use and redistribution for ANY PURPOSE are granted as long as all
+;# copyright notices are retained.  Redistribution with modification
+;# is allowed provided that you make your modified version obviously
+;# distinguishable from the original one.  THIS SOFTWARE IS PROVIDED
+;# BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES ARE
+;# DISCLAIMED.
+;#
+;# Original version was developed under the name of srekcah@sra.co.jp
+;# February 1992 and it was called kconv.pl at the beginning.  This
+;# address was a pen name for group of individuals and it is no longer
+;# valid.
+;#
+;# The latest version is available here:
+;#
+;#	ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/
+;#
+;; $rcsid = q$Id: jcode.pl,v 2.11 1999/12/26 17:16:47 utashiro Exp $;
+;#
+;######################################################################
+;#
+;# PERL4 INTERFACE:
+;#
+;#	&jcode'getcode(*line)
+;#		Return 'jis', 'sjis', 'euc' or undef according to
+;#		Japanese character code in $line.  Return 'binary' if
+;#		the data has non-character code.
+;#
+;#		When evaluated in array context, it returns a list
+;#		contains two items.  First value is the number of
+;#		characters which matched to the expected code, and
+;#		second value is the code name.  It is useful if and
+;#		only if the number is not 0 and the code is undef;
+;#		that case means it couldn't tell 'euc' or 'sjis'
+;#		because the evaluation score was exactly same.  This
+;#		interface is too tricky, though.
+;#
+;#		Code detection between euc and sjis is very difficult
+;#		or sometimes impossible or even lead to wrong result
+;#		when it includes JIS X0201 KANA characters.  So JIS
+;#		X0201 KANA is ignored for automatic code detection.
+;#
+;#	&jcode'convert(*line, $ocode [, $icode [, $option]])
+;#		Convert the contents of $line to the specified
+;#		Japanese code given in the second argument $ocode.
+;#		$ocode can be any of "jis", "sjis" or "euc", or use
+;#		"noconv" when you don't want the code conversion.
+;#		Input code is recognized automatically from the line
+;#		itself when $icode is not supplied (JIS X0201 KANA is
+;#		ignored in code detection.  See the above descripton
+;#		of &getcode).  $icode also can be specified, but
+;#		xxx2yyy routine is more efficient when both codes are
+;#		known.
+;#
+;#		It returns the code of input string in scalar context,
+;#		and a list of pointer of convert subroutine and the
+;#		input code in array context.
+;#
+;#		Japanese character code JIS X0201, X0208, X0212 and
+;#		ASCII code are supported.  X0212 characters can not be
+;#		represented in SJIS and they will be replased by
+;#		"geta" character when converted to SJIS.
+;#
+;#		See next paragraph for $option parameter.
+;#
+;#	&jcode'xxx2yyy(*line [, $option])
+;#		Convert the Japanese code from xxx to yyy.  String xxx
+;#		and yyy are any convination from "jis", "euc" or
+;#		"sjis".  They return *approximate* number of converted
+;#		bytes.  So return value 0 means the line was not
+;#		converted at all.
+;#
+;#		Optional parameter $option is used to specify optional
+;#		conversion method.  String "z" is for JIS X0201 KANA
+;#		to X0208 KANA, and "h" is for reverse.
+;#
+;#	$jcode'convf{'xxx', 'yyy'}
+;#		The value of this associative array is pointer to the
+;#		subroutine jcode'xxx2yyy().
+;#
+;#	&jcode'to($ocode, $line [, $icode [, $option]])
+;#	&jcode'jis($line [, $icode [, $option]])
+;#	&jcode'euc($line [, $icode [, $option]])
+;#	&jcode'sjis($line [, $icode [, $option]])
+;#		These functions are prepared for easy use of
+;#		call/return-by-value interface.  You can use these
+;#		funcitons in s///e operation or any other place for
+;#		convenience.
+;#
+;#	&jcode'jis_inout($in, $out)
+;#		Set or inquire JIS start and end sequences.  Default
+;#		is "ESC-$-B" and "ESC-(-B".  If you supplied only one
+;#		character, "ESC-$" or "ESC-(" is prepended for each
+;#		character respectively.  Acutually "ESC-(-B" is not a
+;#		sequence to end JIS code but a sequence to start ASCII
+;#		code set.  So `in' and `out' are somewhat misleading.
+;#
+;#	&jcode'get_inout($string)
+;#		Get JIS start and end sequences from $string.
+;#
+;#	&jcode'cache()
+;#	&jcode'nocache()
+;#	&jcode'flush()
+;#		Usually, converted character is cached in memory to
+;#		avoid same calculations have to be done many times.
+;#		To disable this caching, call &jcode'nocache().  It
+;#		can be revived by &jcode'cache() and cache is flushed
+;#		by calling &jcode'flush().  &cache() and &nocache()
+;#		functions return previous caching state.
+;#
+;#	---------------------------------------------------------------
+;#
+;#	&jcode'h2z_xxx(*line)
+;#		JIS X0201 KANA (so-called Hankaku-KANA) to X0208 KANA
+;#		(Zenkaku-KANA) code conversion routine.  String xxx is
+;#		any of "jis", "sjis" and "euc".  From the difficulty
+;#		of recognizing code set from 1-byte KATAKANA string,
+;#		automatic code recognition is not supported.
+;#
+;#	&jcode'z2h_xxx(*line)
+;#		X0208 to X0201 KANA code conversion routine.  String
+;#		xxx is any of "jis", "sjis" and "euc".
+;#
+;#	$jcode'z2hf{'xxx'}
+;#	$jcode'h2zf{'xxx'}
+;#		These are pointer to the corresponding function just
+;#		as $jcode'convf.
+;#
+;#	---------------------------------------------------------------
+;#
+;#	&jcode'tr(*line, $from, $to [, $option])
+;#		&jcode'tr emulates tr operator for 2 byte code.  Only 'd'
+;#		is interpreted as an option.
+;#
+;#		Range operator like `A-Z' for 2 byte code is partially
+;#		supported.  Code must be JIS or EUC, and first byte
+;#		have to be same on first and last character.
+;#
+;#		CAUTION: Handling range operator is a kind of trick
+;#		and it is not perfect.  So if you need to transfer `-' 
+;#		character, please be sure to put it at the beginning
+;#		or the end of $from and $to strings.
+;#
+;#	&jcode'trans($line, $from, $to [, $option)
+;#		Same as &jcode'tr but accept string and return string
+;#		after translation.
+;#
+;#	---------------------------------------------------------------
+;#
+;#	&jcode'init()
+;#		Initialize the variables used in this package.  You
+;#		don't have to call this when using jocde.pl by `do' or
+;#		`require' interface.  Call it first if you embedded
+;#		the jcode.pl at the end of your script.
+;#
+;######################################################################
+;#
+;# PERL5 INTERFACE:
+;#
+;# Current jcode.pl is written in Perl 4 but it is possible to use
+;# from Perl 5 using `references'.  Fully perl5 capable version is
+;# future issue.
+;#
+;# Since lexical variable is not a subject of typeglob, *string style
+;# call doesn't work if the variable is declared as `my'.  Same thing
+;# happens to special variable $_ if the perl is compiled to use
+;# thread capability.  So using reference is generally recommented to
+;# avoid the mysterious error.
+;#
+;#	jcode::getcode(\$line)
+;#	jcode::convert(\$line, $ocode [, $icode [, $option]])
+;#	jcode::xxx2yyy(\$line [, $option])
+;#	&{$jcode::convf{'xxx', 'yyy'}}(\$line)
+;#	jcode::to($ocode, $line [, $icode [, $option]])
+;#	jcode::jis($line [, $icode [, $option]])
+;#	jcode::euc($line [, $icode [, $option]])
+;#	jcode::sjis($line [, $icode [, $option]])
+;#	jcode::jis_inout($in, $out)
+;#	jcode::get_inout($string)
+;#	jcode::cache()
+;#	jcode::nocache()
+;#	jcode::flush()
+;#	jcode::h2z_xxx(\$line)
+;#	jcode::z2h_xxx(\$line)
+;#	&{$jcode::z2hf{'xxx'}}(\$line)
+;#	&{$jcode::h2zf{'xxx'}}(\$line)
+;#	jcode::tr(\$line, $from, $to [, $option])
+;#	jcode::trans($line, $from, $to [, $option)
+;#	jcode::init()
+;#
+;######################################################################
+;#
+;# SAMPLES
+;#
+;# Convert any Kanji code to JIS and print each line with code name.
+;#
+;#	while (defined($s = <>)) {
+;#	    $code = &jcode'convert(*s, 'jis');
+;#	    print $code, "\t", $s;
+;#	}
+;#	
+;# Convert all lines to JIS according to the first recognized line.
+;#
+;#	while (defined($s = <>)) {
+;#	    print, next unless $s =~ /[\033\200-\377]/;
+;#	    (*f, $icode) = &jcode'convert(*s, 'jis');
+;#	    print;
+;#	    defined(&f) || next;
+;#	    while (<>) { &f(*s); print; }
+;#	    last;
+;#	}
+;#
+;# The safest way of JIS conversion.
+;#
+;#	while (defined($s = <>)) {
+;#	    ($matched, $icode) = &jcode'getcode(*s);
+;#	    if (@buf == 0 && $matched == 0) {
+;#		print $s;
+;#		next;
+;#	    }
+;#	    push(@buf, $s);
+;#	    next unless $icode;
+;#	    while (defined($s = shift(@buf))) {
+;#		&jcode'convert(*s, 'jis', $icode);
+;#		print $s;
+;#	    }
+;#	    while (defined($s = <>)) {
+;#		&jcode'convert(*s, 'jis', $icode);
+;#		print $s;
+;#	    }
+;#	    last;
+;#	}
+;#	print @buf if @buf;
+;#		
+;######################################################################
+
+;#
+;# Call initialize function if it is not called yet.  This may sound
+;# strange but it makes easy to embed the jcode.pl at the end of
+;# script.  Call &jcode'init at the beginning of the script in that
+;# case.
+;#
+&init unless defined $version;
+
+;#
+;# Initialize variables.
+;#
+sub init {
+    $version = $rcsid =~ /,v ([\d.]+)/ ? $1 : 'unkown';
+
+    $re_bin  = '[\000-\006\177\377]';
+
+    $re_jis0208_1978 = '\e\$\@';
+    $re_jis0208_1983 = '\e\$B';
+    $re_jis0208_1990 = '\e&\@\e\$B';
+    $re_jis0208 = "$re_jis0208_1978|$re_jis0208_1983|$re_jis0208_1990";
+    $re_jis0212 = '\e\$\(D';
+    $re_jp      = "$re_jis0208|$re_jis0212";
+    $re_asc     = '\e\([BJ]';
+    $re_kana    = '\e\(I';
+
+    $esc_0208 = "\e\$B";
+    $esc_0212 = "\e\$(D";
+    $esc_asc  = "\e(B";
+    $esc_kana = "\e(I";
+
+    $re_sjis_c    = '[\201-\237\340-\374][\100-\176\200-\374]';
+    $re_sjis_kana = '[\241-\337]';
+
+    $re_euc_c    = '[\241-\376][\241-\376]';
+    $re_euc_kana = '\216[\241-\337]';
+    $re_euc_0212 = '\217[\241-\376][\241-\376]';
+
+    # Use `geta' for undefined character code
+    $undef_sjis = "\x81\xac";
+
+    $cache = 1;
+
+    # X0201 -> X0208 KANA conversion table.  Looks weird?  Not that
+    # much.  This is simply JIS text without escape sequences.
+    ($h2z_high = $h2z = <<'__TABLE_END__') =~ tr/\041-\176/\241-\376/;
+!	!#	$	!"	%	!&	"	!V	#	!W
+^	!+	_	!,	0	!<
+'	%!	(	%#	)	%%	*	%'	+	%)
+,	%c	-	%e	.	%g	/	%C
+1	%"	2	%$	3	%&	4	%(	5	%*
+6	%+	7	%-	8	%/	9	%1	:	%3
+6^	%,	7^	%.	8^	%0	9^	%2	:^	%4
+;	%5	<	%7	=	%9	>	%;	?	%=
+;^	%6	<^	%8	=^	%:	>^	%<	?^	%>
+@	%?	A	%A	B	%D	C	%F	D	%H
+@^	%@	A^	%B	B^	%E	C^	%G	D^	%I
+E	%J	F	%K	G	%L	H	%M	I	%N
+J	%O	K	%R	L	%U	M	%X	N	%[
+J^	%P	K^	%S	L^	%V	M^	%Y	N^	%\
+J_	%Q	K_	%T	L_	%W	M_	%Z	N_	%]
+O	%^	P	%_	Q	%`	R	%a	S	%b
+T	%d			U	%f			V	%h
+W	%i	X	%j	Y	%k	Z	%l	[	%m
+\	%o	]	%s	&	%r	3^	%t
+__TABLE_END__
+    %h2z = split(/\s+/, $h2z . $h2z_high);
+    %z2h = reverse %h2z;
+
+    $convf{'jis'  , 'jis' } = *jis2jis;
+    $convf{'jis'  , 'sjis'} = *jis2sjis;
+    $convf{'jis'  , 'euc' } = *jis2euc;
+    $convf{'euc'  , 'jis' } = *euc2jis;
+    $convf{'euc'  , 'sjis'} = *euc2sjis;
+    $convf{'euc'  , 'euc' } = *euc2euc;
+    $convf{'sjis' , 'jis' } = *sjis2jis;
+    $convf{'sjis' , 'sjis'} = *sjis2sjis;
+    $convf{'sjis' , 'euc' } = *sjis2euc;
+    $h2zf{'jis' } = *h2z_jis;
+    $z2hf{'jis' } = *z2h_jis;
+    $h2zf{'euc' } = *h2z_euc;
+    $z2hf{'euc' } = *z2h_euc;
+    $h2zf{'sjis'} = *h2z_sjis;
+    $z2hf{'sjis'} = *z2h_sjis;
+}
+
+;#
+;# Set escape sequences which should be put before and after Japanese
+;# (JIS X0208) string.
+;#
+sub jis_inout {
+    $esc_0208 = shift || $esc_0208;
+    $esc_0208 = "\e\$$esc_0208" if length($esc_0208) == 1;
+    $esc_asc = shift || $esc_asc;
+    $esc_asc = "\e\($esc_asc" if length($esc_asc) == 1;
+    ($esc_0208, $esc_asc);
+}
+
+;#
+;# Get JIS in and out sequences from the string.
+;#
+sub get_inout {
+    local($esc_0208, $esc_asc);
+    $_[$[] =~ /($re_jis0208)/o && ($esc_0208 = $1);
+    $_[$[] =~ /($re_asc)/o && ($esc_asc = $1);
+    ($esc_0208, $esc_asc);
+}
+
+;#
+;# Recognize character code.
+;#
+sub getcode {
+    local(*s) = @_;
+    local($matched, $code);
+
+    if ($s !~ /[\e\200-\377]/) {	# not Japanese
+	$matched = 0;
+	$code = undef;
+    }					# 'jis'
+    elsif ($s =~ /$re_jp|$re_asc|$re_kana/o) {
+	$matched = 1;
+	$code = 'jis';
+    }
+    elsif ($s =~ /$re_bin/o) {		# 'binary'
+	$matched = 0;
+	$code = 'binary';
+    }
+    else {				# should be 'euc' or 'sjis'
+	local($sjis, $euc) = (0, 0);
+
+	while ($s =~ /(($re_sjis_c)+)/go) {
+	    $sjis += length($1);
+	}
+	while ($s =~ /(($re_euc_c|$re_euc_kana|$re_euc_0212)+)/go) {
+	    $euc  += length($1);
+	}
+	$matched = &max($sjis, $euc);
+	$code = ('euc', undef, 'sjis')[($sjis<=>$euc) + $[ + 1];
+    }
+    wantarray ? ($matched, $code) : $code;
+}
+sub max { $_[ $[ + ($_[ $[ ] < $_[ $[ + 1 ]) ]; }
+
+;#
+;# Convert any code to specified code.
+;#
+sub convert {
+    local(*s, $ocode, $icode, $opt) = @_;
+    return (undef, undef) unless $icode = $icode || &getcode(*s);
+    return (undef, $icode) if $icode eq 'binary';
+    $ocode = 'jis' unless $ocode;
+    $ocode = $icode if $ocode eq 'noconv';
+    local(*f) = $convf{$icode, $ocode};
+    &f(*s, $opt);
+    wantarray ? (*f, $icode) : $icode;
+}
+
+;#
+;# Easy return-by-value interfaces.
+;#
+sub jis  { &to('jis',  @_); }
+sub euc  { &to('euc',  @_); }
+sub sjis { &to('sjis', @_); }
+sub to {
+    local($ocode, $s, $icode, $opt) = @_;
+    &convert(*s, $ocode, $icode, $opt);
+    $s;
+}
+sub what {
+    local($s) = @_;
+    &getcode(*s);
+}
+sub trans {
+    local($s) = shift;
+    &tr(*s, @_);
+    $s;
+}
+
+;#
+;# SJIS to JIS
+;#
+sub sjis2jis {
+    local(*s, $opt, $n) = @_;
+    &sjis2sjis(*s, $opt) if $opt;
+    $s =~ s/(($re_sjis_c|$re_sjis_kana)+)/&_sjis2jis($1) . $esc_asc/geo;
+    $n;
+}
+sub _sjis2jis {
+    local($s) = shift;
+    $s =~ s/(($re_sjis_c)+|($re_sjis_kana)+)/&__sjis2jis($1)/geo;
+    $s;
+}
+sub __sjis2jis {
+    local($s) = shift;
+    if ($s =~ /^$re_sjis_kana/o) {
+	$n += $s =~ tr/\241-\337/\041-\137/;
+	$esc_kana . $s;
+    } else {
+	$n += $s =~ s/($re_sjis_c)/$s2e{$1}||&s2e($1)/geo;
+	$s =~ tr/\241-\376/\041-\176/;
+	$esc_0208 . $s;
+    }
+}
+
+;#
+;# EUC to JIS
+;#
+sub euc2jis {
+    local(*s, $opt, $n) = @_;
+    &euc2euc(*s, $opt) if $opt;
+    $s =~ s/(($re_euc_c|$re_euc_kana|$re_euc_0212)+)/
+	&_euc2jis($1) . $esc_asc
+    /geo;
+    $n;
+}
+sub _euc2jis {
+    local($s) = shift;
+    $s =~ s/(($re_euc_c)+|($re_euc_kana)+|($re_euc_0212)+)/&__euc2jis($1)/geo;
+    $s;
+}
+sub __euc2jis {
+    local($s) = shift;
+    local($esc);
+
+    if ($s =~ tr/\216//d) {
+	$esc = $esc_kana;
+    } elsif ($s =~ tr/\217//d) {
+	$esc = $esc_0212;
+    } else {
+	$esc = $esc_0208;
+    }
+
+    $n += $s =~ tr/\241-\376/\041-\176/;
+    $esc . $s;
+}
+
+;#
+;# JIS to EUC
+;#
+sub jis2euc {
+    local(*s, $opt, $n) = @_;
+    $s =~ s/($re_jp|$re_asc|$re_kana)([^\e]*)/&_jis2euc($1,$2)/geo;
+    &euc2euc(*s, $opt) if $opt;
+    $n;
+}
+sub _jis2euc {
+    local($esc, $s) = @_;
+    if ($esc !~ /^$re_asc/o) {
+	$n += $s =~ tr/\041-\176/\241-\376/;
+	if ($esc =~ /^$re_kana/o) {
+	    $s =~ s/([\241-\337])/\216$1/g;
+	}
+	elsif ($esc =~ /^$re_jis0212/o) {
+	    $s =~ s/([\241-\376][\241-\376])/\217$1/g;
+	}
+    }
+    $s;
+}
+
+;#
+;# JIS to SJIS
+;#
+sub jis2sjis {
+    local(*s, $opt, $n) = @_;
+    &jis2jis(*s, $opt) if $opt;
+    $s =~ s/($re_jp|$re_asc|$re_kana)([^\e]*)/&_jis2sjis($1,$2)/geo;
+    $n;
+}
+sub _jis2sjis {
+    local($esc, $s) = @_;
+    if ($esc =~ /^$re_jis0212/o) {
+	$s =~ s/../$undef_sjis/g;
+	$n = length;
+    }
+    elsif ($esc !~ /^$re_asc/o) {
+	$n += $s =~ tr/\041-\176/\241-\376/;
+	if ($esc =~ /^$re_jp/o) {
+	    $s =~ s/($re_euc_c)/$e2s{$1}||&e2s($1)/geo;
+	}
+    }
+    $s;
+}
+
+;#
+;# SJIS to EUC
+;#
+sub sjis2euc {
+    local(*s, $opt,$n) = @_;
+    $n = $s =~ s/($re_sjis_c|$re_sjis_kana)/$s2e{$1}||&s2e($1)/geo;
+    &euc2euc(*s, $opt) if $opt;
+    $n;
+}
+sub s2e {
+    local($c1, $c2, $code);
+    ($c1, $c2) = unpack('CC', $code = shift);
+
+    if (0xa1 <= $c1 && $c1 <= 0xdf) {
+	$c2 = $c1;
+	$c1 = 0x8e;
+    } elsif (0x9f <= $c2) {
+	$c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60);
+	$c2 += 2;
+    } else {
+	$c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61);
+	$c2 += 0x60 + ($c2 < 0x7f);
+    }
+    if ($cache) {
+	$s2e{$code} = pack('CC', $c1, $c2);
+    } else {
+	pack('CC', $c1, $c2);
+    }
+}
+
+;#
+;# EUC to SJIS
+;#
+sub euc2sjis {
+    local(*s, $opt,$n) = @_;
+    &euc2euc(*s, $opt) if $opt;
+    $n = $s =~ s/($re_euc_c|$re_euc_kana|$re_euc_0212)/$e2s{$1}||&e2s($1)/geo;
+}
+sub e2s {
+    local($c1, $c2, $code);
+    ($c1, $c2) = unpack('CC', $code = shift);
+
+    if ($c1 == 0x8e) {		# SS2
+	return substr($code, 1, 1);
+    } elsif ($c1 == 0x8f) {	# SS3
+	return $undef_sjis;
+    } elsif ($c1 % 2) {
+	$c1 = ($c1>>1) + ($c1 < 0xdf ? 0x31 : 0x71);
+	$c2 -= 0x60 + ($c2 < 0xe0);
+    } else {
+	$c1 = ($c1>>1) + ($c1 < 0xdf ? 0x30 : 0x70);
+	$c2 -= 2;
+    }
+    if ($cache) {
+	$e2s{$code} = pack('CC', $c1, $c2);
+    } else {
+	pack('CC', $c1, $c2);
+    }
+}
+
+;#
+;# JIS to JIS, SJIS to SJIS, EUC to EUC
+;#
+sub jis2jis {
+    local(*s, $opt) = @_;
+    $s =~ s/$re_jis0208/$esc_0208/go;
+    $s =~ s/$re_asc/$esc_asc/go;
+    &h2z_jis(*s) if $opt =~ /z/;
+    &z2h_jis(*s) if $opt =~ /h/;
+}
+sub sjis2sjis {
+    local(*s, $opt) = @_;
+    &h2z_sjis(*s) if $opt =~ /z/;
+    &z2h_sjis(*s) if $opt =~ /h/;
+}
+sub euc2euc {
+    local(*s, $opt) = @_;
+    &h2z_euc(*s) if $opt =~ /z/;
+    &z2h_euc(*s) if $opt =~ /h/;
+}
+
+;#
+;# Cache control functions
+;#
+sub cache {
+    ($cache, $cache = 1)[$[];
+}
+sub nocache {
+    ($cache, $cache = 0)[$[];
+}
+sub flushcache {
+    undef %e2s;
+    undef %s2e;
+}
+
+;#
+;# X0201 -> X0208 KANA conversion routine
+;#
+sub h2z_jis {
+    local(*s, $n) = @_;
+    if ($s =~ s/$re_kana([^\e]*)/$esc_0208 . &_h2z_jis($1)/geo) {
+	1 while $s =~ s/(($re_jis0208)[^\e]*)($re_jis0208)/$1/o;
+    }
+    $n;
+}
+sub _h2z_jis {
+    local($s) = @_;
+    $n += $s =~ s/([\41-\137]([\136\137])?)/$h2z{$1}/g;
+    $s;
+}
+
+sub h2z_euc {
+    local(*s) = @_;
+    $s =~ s/\216([\241-\337])(\216([\336\337]))?/$h2z{"$1$3"}/g;
+}
+
+sub h2z_sjis {
+    local(*s, $n) = @_;
+    $s =~ s/(($re_sjis_c)+)|(([\241-\337])([\336\337])?)/
+	$1 || ($n++, $e2s{$h2z{$3}} || &e2s($h2z{$3}))
+    /geo;
+    $n;
+}
+
+;#
+;# X0208 -> X0201 KANA conversion routine
+;#
+sub z2h_jis {
+    local(*s, $n) = @_;
+    $s =~ s/($re_jis0208)([^\e]+)/&_z2h_jis($2)/geo;
+    $n;
+}
+sub _z2h_jis {
+    local($s) = @_;
+    $s =~ s/((\%[!-~]|![\#\"&VW+,<])+|([^!%][!-~]|![^\#\"&VW+,<])+)/
+	&__z2h_jis($1)
+    /ge;
+    $s;
+}
+sub __z2h_jis {
+    local($s) = @_;
+    return $esc_0208 . $s unless /^%/ || $s =~ /^![\#\"&VW+,<]/;
+    $n += length($s) / 2;
+    $s =~ s/(..)/$z2h{$1}/g;
+    $esc_kana . $s;
+}
+
+sub z2h_euc {
+    local(*s, $n) = @_;
+    &init_z2h_euc unless defined %z2h_euc;
+    $s =~ s/($re_euc_c|$re_euc_kana)/
+	$z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1
+    /geo;
+    $n;
+}
+
+sub z2h_sjis {
+    local(*s, $n) = @_;
+    &init_z2h_sjis unless defined %z2h_sjis;
+    $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo;
+    $n;
+}
+
+;#
+;# Initializing JIS X0208 to X0201 KANA table for EUC and SJIS.  This
+;# can be done in &init but it's not worth doing.  Similarly,
+;# precalculated table is not worth to occupy the file space and
+;# reduce the readability.  The author personnaly discourages to use
+;# X0201 Kana character in the any situation.
+;#
+sub init_z2h_euc {
+    local($k, $s);
+    while (($k, $s) = each %z2h) {
+	$s =~ s/([\241-\337])/\216$1/g && ($z2h_euc{$k} = $s);
+    }
+}
+sub init_z2h_sjis {
+    local($s, $v);
+    while (($s, $v) = each %z2h) {
+	$s =~ /[\200-\377]/ && ($z2h_sjis{&e2s($s)} = $v);
+    }
+}
+
+;#
+;# TR function for 2-byte code
+;#
+sub tr {
+    # $prev_from, $prev_to, %table are persistent variables
+    local(*s, $from, $to, $opt) = @_;
+    local(@from, @to);
+    local($jis, $n) = (0, 0);
+    
+    $jis++, &jis2euc(*s) if $s =~ /$re_jp|$re_asc|$re_kana/o;
+    $jis++ if $to =~ /$re_jp|$re_asc|$re_kana/o;
+
+    if (!defined($prev_from) || $from ne $prev_from || $to ne $prev_to) {
+	($prev_from, $prev_to) = ($from, $to);
+	undef %table;
+	&_maketable;
+    }
+
+    $s =~ s/([\200-\377][\000-\377]|[\000-\377])/
+	defined($table{$1}) && ++$n ? $table{$1} : $1
+    /ge;
+
+    &euc2jis(*s) if $jis;
+
+    $n;
+}
+
+sub _maketable {
+    local($ascii) = '(\\\\[\\-\\\\]|[\0-\133\135-\177])';
+
+    &jis2euc(*to) if $to =~ /$re_jp|$re_asc|$re_kana/o;
+    &jis2euc(*from) if $from =~ /$re_jp|$re_asc|$re_kana/o;
+
+    grep(s/(([\200-\377])[\200-\377]-\2[\200-\377])/&_expnd2($1)/ge,
+	 $from, $to);
+    grep(s/($ascii-$ascii)/&_expnd1($1)/geo,
+	 $from, $to);
+
+    @to   = $to   =~ /[\200-\377][\000-\377]|[\000-\377]/g;
+    @from = $from =~ /[\200-\377][\000-\377]|[\000-\377]/g;
+    push(@to, ($opt =~ /d/ ? '' : $to[$#to]) x (@from - @to)) if @to < @from;
+    @table{@from} = @to;
+}
+
+sub _expnd1 {
+    local($s) = @_;
+    $s =~ s/\\(.)/$1/g;
+    local($c1, $c2) = unpack('CxC', $s);
+    if ($c1 <= $c2) {
+	for ($s = ''; $c1 <= $c2; $c1++) {
+	    $s .= pack('C', $c1);
+	}
+    }
+    $s;
+}
+
+sub _expnd2 {
+    local($s) = @_;
+    local($c1, $c2, $c3, $c4) = unpack('CCxCC', $s);
+    if ($c1 == $c3 && $c2 <= $c4) {
+	for ($s = ''; $c2 <= $c4; $c2++) {
+	    $s .= pack('CC', $c1, $c2);
+	}
+    }
+    $s;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,60 @@
+YukiWikiƒvƒ‰ƒOƒCƒ“
+
+-------------------------------------------------
+¡‚Í‚¶‚ß‚É
+-------------------------------------------------
+
+‚±‚Ì•¶‘‚ÍYukiWiki‚̃vƒ‰ƒOƒCƒ“‚ÉŠÖ‚·‚éî•ñ‚ð‚Ü‚Æ‚ß‚½‚à‚Ì‚Å‚·B
+
+-------------------------------------------------
+¡ƒvƒ‰ƒOƒCƒ“‚Æ‚Í
+-------------------------------------------------
+
+ƒvƒ‰ƒOƒCƒ“‚ÍAYukiWiki–{‘Ì‚ÉŽè‚ð“ü‚ê‚邱‚Æ‚È‚­‹@”\Šg’£‚·‚邽‚ß‚Ì‹@\‚Å‚·B
+ƒvƒ‰ƒOƒCƒ“‚Ì쬂ɂÍPerl‚Ì’mŽ¯‚ª•K—v‚Å‚·B
+
+YukiWiki‚̃vƒ‰ƒOƒCƒ“‹@”\‚ðŽÀŒ»‚µ‚Ä‚¢‚é‚Ì‚Í
+Yuki::PluginManagerƒ‚ƒWƒ…[ƒ‹‚Å‚·B
+YukiWiki–{‘Ì(wiki.cgi)‹N“®Žž‚ÉYuki::PluginManagerƒ‚ƒWƒ…[ƒ‹‚ª‰Šú‰»‚³‚êA
+‚»‚̃^ƒCƒ~ƒ“ƒO‚ŃCƒ“ƒXƒg[ƒ‹Ï‚݂̃vƒ‰ƒOƒCƒ“‚ªƒ[ƒh‚³‚êA
+—˜—p‰Â”\‚É‚È‚è‚Ü‚·B
+
+ŠÇ—ŽÒˆÈŠO‚ÌYukiWiki—˜—pŽÒ‚ªƒvƒ‰ƒOƒCƒ“‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+
+-------------------------------------------------
+¡ƒvƒ‰ƒOƒCƒ“‚ÌŽí•Ê
+-------------------------------------------------
+
+ƒvƒ‰ƒOƒCƒ“‚ɂ͈ȉº‚ÌŽOŽí—Þ‚ª‚ ‚è‚Ü‚·B
+
+EƒCƒ“ƒ‰ƒCƒ“ƒ^ƒCƒv
+    &bold(‚±‚±‚𑾎š) ‚̂悤‚ÉWikiƒy[ƒW“à‚É‹Lq‚µ‚Ü‚·B
+    HTML‚̃Cƒ“ƒ‰ƒCƒ“—v‘f‚ɑΉž‚µ‚Ü‚·B
+EƒuƒƒbƒNƒ^ƒCƒv
+    #recent() ‚̂悤‚ÉWikiƒy[ƒW“à‚É‹Lq‚µ‚Ü‚·B
+    HTML‚̃uƒƒbƒN—v‘f‚ɑΉž‚µ‚Ü‚·B
+EƒtƒBƒ‹ƒ^ƒ^ƒCƒv
+    Wiki‚̃y[ƒW“à•”‚É‹Lq‚·‚é‚Ì‚Å‚Í‚È‚­A
+    ƒRƒ“ƒeƒ“ƒc‘S‘Ì‚ð•ÏŠ·‚·‚é‚Æ‚«‚ÉŽg‚¢‚Ü‚·B
+
+-------------------------------------------------
+¡ƒvƒ‰ƒOƒCƒ“‚̃tƒ@ƒCƒ‹
+-------------------------------------------------
+
+ƒvƒ‰ƒOƒCƒ“‚̃tƒ@ƒCƒ‹‚ÍA
+
+    ƒvƒ‰ƒOƒCƒ“–¼.pl
+
+‚Æ‚¢‚¤–¼‘O‚É‚µ‚Ü‚·B“Á‚ɃtƒBƒ‹ƒ^ƒ^ƒCƒv‚̃vƒ‰ƒOƒCƒ“‚ÌꇂɂÍA
+
+    filter_ƒvƒ‰ƒOƒCƒ“–¼.pl
+
+‚Æ‚¢‚¤–¼‘O‚É‚µ‚Ü‚·B
+ƒvƒ‰ƒOƒCƒ“‚̃tƒ@ƒCƒ‹‚ÍPerl‚Å‹Lq‚µA
+wiki.cgi‚Ì$modifier_dir_plugin‚ÅŽw’肵‚½ƒfƒBƒŒƒNƒgƒŠ‚É’u‚«‚Ü‚·B
+
+-------------------------------------------------
+¡ƒvƒ‰ƒOƒCƒ“‚̃vƒƒOƒ‰ƒ~ƒ“ƒO
+-------------------------------------------------
+
+YukiWiki‚É“¯«‚³‚ê‚Ä‚¢‚éƒvƒ‰ƒOƒCƒ“‚ðŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/link.pl	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,26 @@
+use strict;
+
+package link;
+
+sub plugin_inline {
+    my ($escaped_argument) = @_;
+    my ($caption, $url) = split(/,/, $escaped_argument);
+    if ($url =~ /^(mailto|http|https|ftp):/) {
+        return qq(<a href="$url">$caption</a>);
+    } else {
+        return qq(&link($escaped_argument));
+    }
+}
+
+sub plugin_usage {
+    return {
+        name => 'link',
+        version => '1.1',
+        author => 'Hiroshi Yuki <hyuki@hyuki.com>',
+        syntax => '&link(caption,url)',
+        description => 'Create link with given caption..',
+        example => "Please visit &link(Hiroshi Yuki,http://www.hyuki.com/).",
+    };
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/recent.pl	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,26 @@
+use strict;
+
+package recent;
+
+sub plugin_block {
+    my ($escaped_argument, $context) = @_;
+    my ($count) = split(/,/, $escaped_argument);
+    my @raw_recent_changes = split(/\n/, $context->{database}->{RecentChanges});
+    my @recent_changes = splice(@raw_recent_changes, 0, $count);
+    my $recent_changes = join("\n", @recent_changes);
+    my $result = &main::text_to_html($recent_changes, toc=>0);
+    return $result;
+}
+
+sub plugin_usage {
+    return {
+        name => 'recent',
+        version => '1.0',
+        author => 'Hiroshi Yuki <hyuki@hyuki.com>',
+        syntax => '#recent(count)',
+        description => 'Show recent changes.',
+        example => '#recent(10)',
+    };
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/ruby.pl	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,22 @@
+use strict;
+
+package ruby;
+
+sub plugin_inline {
+    my ($escaped_argument) = @_;
+    my ($string,$ruby) = split(/,/, $escaped_argument);
+    return qq(<ruby><rb>$string</rb><rp>(</rp><rt>$ruby</rt><rp>)</rp></ruby>);
+}
+
+sub plugin_usage {
+    return {
+        name => 'ruby',
+        version => '1.0',
+        author => 'Hiroshi Yuki <hyuki@hyuki.com>',
+        syntax => '&ruby(string,ruby)',
+        description => 'Make ruby.',
+        example => '&ruby(KANJI,kana)',
+    };
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/verb.pl	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,21 @@
+use strict;
+
+package verb;
+
+sub plugin_inline {
+    my ($escaped_argument) = @_;
+    return qq(<span class="verb">$escaped_argument</span>);
+}
+
+sub plugin_usage {
+    return {
+        name => 'verb',
+        version => '1.0',
+        author => 'Hiroshi Yuki <hyuki@hyuki.com>',
+        syntax => '&verb(as-is string)',
+        description => 'Inline verbatim (hard).',
+        example => '&verb(ThisIsNotWikiName)',
+    };
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/readme.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,331 @@
+YukiWiki - Ž©—R‚Ƀy[ƒW‚ð’ljÁEíœE•ÒW‚Å‚«‚éWebƒy[ƒW\’zCGI
+
+-------------------------------------------------
+¡ìŽÒ
+-------------------------------------------------
+
+Copyright (C) 2000-2006 by Hiroshi Yuki.
+Œ‹é_ <hyuki@hyuki.com>
+http://www.hyuki.com/
+http://www.hyuki.com/yukiwiki/
+
+
+-------------------------------------------------
+¡ÅVî•ñ
+-------------------------------------------------
+
+ˆÈ‰º‚ÌURL‚ÅÅVî•ñ‚ð“üŽè‚µ‚Ä‚­‚¾‚³‚¢B
+http://www.hyuki.com/yukiwiki/
+
+
+-------------------------------------------------
+¡‚Í‚¶‚ß‚É
+-------------------------------------------------
+
+YukiWikiiŒ‹éƒEƒBƒLj‚ÍŽQ‰ÁŽÒ‚ªŽ©—R‚Ƀy[ƒW‚ð’ljÁEíœE•ÒW‚Å‚«‚é‚Æ‚¢‚¤
+•sŽv‹c‚ÈWebƒy[ƒWŒQ‚ðì‚éCGI‚Å‚·B
+Web‚Å“®ì‚·‚éŒfŽ¦”‚Ƃ¿‚å‚Á‚ÆŽ—‚Ä‚¢‚Ü‚·‚ªA
+WebŒfŽ¦”‚ª’P‚ɃƒbƒZ[ƒW‚ð’ljÁ‚·‚邾‚¯‚Ȃ̂ɑ΂µ‚ÄA
+YukiWiki‚ÍAWebƒy[ƒW‘S‘Ì‚ðŽ©—R‚É•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+
+YukiWiki‚ÍAWard Cunningham‚ÌWiki‚ÌŽd—l‚ðŽQl‚É‚µ‚Ä“ÆŽ©‚Éì‚ç‚ê‚Ü‚µ‚½B
+‚±‚¤‚¢‚Á‚½CGI‚Í¢ŠE’†‚É–³”‚É‚ ‚èuWikiƒNƒ[ƒ“v‚ƌĂ΂ê‚Ä‚¢‚Ü‚·B
+YukiWiki‚ÍWikiƒNƒ[ƒ“‚̈êŽí‚Å‚·B
+
+YukiWiki‚ÍPerl‚Å‘‚©‚ꂽCGIƒXƒNƒŠƒvƒg‚Æ‚µ‚ÄŽÀŒ»‚³‚ê‚Ä‚¢‚Ü‚·‚Ì‚ÅA
+Perl‚ª“®ì‚·‚éWebƒT[ƒo‚È‚ç‚ΔäŠr“I—eˆÕ‚ÉÝ’u‚Å‚«‚Ü‚·B
+
+YukiWiki‚̓tƒŠ[ƒ\ƒtƒg‚Å‚·B
+‚²Ž©—R‚É‚¨Žg‚¢‚­‚¾‚³‚¢B
+
+
+-------------------------------------------------
+¡ƒ‰ƒCƒZƒ“ƒX
+-------------------------------------------------
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+-------------------------------------------------
+¡Ý’uŽè‡
+-------------------------------------------------
+
+(1) wiki.cgi‚̈ês–Ú‚ð‚ ‚È‚½‚̃T[ƒo‚ɇ‚킹‚ÄC³‚µ‚Ü‚·B
+    —á1
+    #!/usr/bin/perl
+
+    —á2:Windows‚ÌActivePerl‚Ìê‡
+    #!perl
+
+(2) wiki.cgi‚Ì‚Í‚¶‚ß‚Ì•û‚É‚ ‚éA•Ï”$modifier_...‚Ì’l‚ðC³‚µ‚Ü‚·(•K{)
+
+    my $modifier_mail
+        ŠÇ—ŽÒƒ[ƒ‹ƒAƒhƒŒƒX
+
+    my $modifier_url
+        ŠÇ—ŽÒWebƒy[ƒW
+
+    my $modifier_name
+        ŠÇ—ŽÒ–¼‘O
+
+    my $modifier_dbtype
+        ƒf[ƒ^ƒx[ƒX‚ÌŽí—Þ(ˆÈ‰º‚Ì‚¢‚¸‚ê‚©)
+            'YukiWikiDB'        („§)“ü—Í‚³‚ꂽƒeƒLƒXƒg‚ð‚»‚Ì‚Ü‚Üƒtƒ@ƒCƒ‹‚Æ‚µ‚Ä•Û‘¶
+            'dbmopen'           ƒT[ƒo‚É‚æ‚Á‚ÄŽg‚¦‚È‚¢ê‡‚ ‚è
+            'AnyDBM_File'       ƒT[ƒo‚É‚æ‚Á‚ÄŽg‚¦‚È‚¢ê‡‚ ‚è
+
+    my $modifier_sendmail
+        YukiWiki‘‚«ž‚ÝŽž‚ÉŠÇ—ŽÒ‚Ƀ[ƒ‹‚𑗂邽‚ß‚Ì
+        sendmail‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“
+            '/usr/sbin/sendmail -t -n'      ˆê—á
+            ''                              ƒ[ƒ‹‚ð‘—‚ç‚È‚¢/‘—‚ê‚È‚¢ê‡
+
+    my $modifier_dir_data
+        CGI‚ª“Ç‚Ý‘‚«‚·‚éƒf[ƒ^‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠB
+
+    my $modifier_url_data
+        CSS‚â‰æ‘œƒtƒ@ƒCƒ‹‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠ‚ɑΉž‚µ‚½URLB
+
+    my $modifier_rss_title
+        ƒ^ƒCƒgƒ‹(RSS—p)
+
+    my $modifier_rss_link
+        Ý’u‚·‚éYukiWiki‚ÌURL(RSS—p)
+
+    my $modifier_rss_about
+        RSSƒtƒB[ƒh‚ÌURL(RSS—p)
+
+    my $modifier_rss_description
+        à–¾•¶(RSS—p)
+
+
+(3) uƒtƒ@ƒCƒ‹ˆê——v‚É‚ ‚éƒtƒ@ƒCƒ‹‚ðƒT[ƒo‚É“]‘—‚µ‚Ü‚·B
+    “]‘—ƒ‚[ƒh‚âƒp[ƒ~ƒbƒVƒ‡ƒ“‚ð“KØ‚Éݒ肵‚Ü‚·B
+
+(4) ƒuƒ‰ƒEƒU‚ŃT[ƒoã‚Ìwiki.cgi‚ÌURL‚ɃAƒNƒZƒX‚µ‚Ü‚·B
+
+(5) FrontPage‚ª•\Ž¦‚³‚ꂽ‚çAAdminChangePassword‚Æ‚¢‚¤ƒŠƒ“ƒN‚ð‚½‚Ç‚Á‚ÄA
+    ŠÇ—ŽÒ—p‚̃pƒXƒ[ƒh‚ðݒ肵‚Ü‚·B
+
+(6) ݒ肪ςñ‚¾‚çAfrontpage.txtƒtƒ@ƒCƒ‹‚ð‘‚«Š·‚¦AÄ“x“]‘—‚µ‚Ü‚·B
+
+
+-------------------------------------------------
+¡ƒtƒ@ƒCƒ‹ˆê——
+-------------------------------------------------
+
+œà–¾•¶
+
+ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA
+WebƒT[ƒo‚É“]‘—‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB
+
++-- readme.txt          ‰ðà•¶‘i‚±‚̃tƒ@ƒCƒ‹j
++-- plugin.txt          ƒvƒ‰ƒOƒCƒ“‰ðà
++-- history.txt         ŠJ”­‹L˜^
+
+
+œCGIŒQ
+
+ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍCGI‚ªŽÀs‚Å‚«‚éƒfƒBƒŒƒNƒgƒŠ‚ÉFTP‚µ‚Ü‚·B
+
+                         “]‘—ƒ‚[ƒh  ƒp[ƒ~ƒbƒVƒ‡ƒ“      à–¾
++-- wiki.cgi             TEXT        755 (rwxr-xr-x)     CGI–{‘Ì
++-- jcode.pl             TEXT        644 (rw-r--r--)     •¶ŽšƒR[ƒh•ÏŠ·ƒ‰ƒCƒuƒ‰ƒŠ
++-- Yuki                             755 (rwxr-xr-x)     ƒfƒBƒŒƒNƒgƒŠ
+|   +-- YukiWikiDB.pm    TEXT        644 (rw-r--r--)     ƒtƒ@ƒCƒ‹ƒx[ƒX‚ÌDB—p
+|   +-- RSS.pm           TEXT        644 (rw-r--r--)     RSS—p
+|   +-- DiffText.pm      TEXT        644 (rw-r--r--)     ·•ª—p
+|   +-- PluginManager.pm TEXT        644 (rw-r--r--)     ƒvƒ‰ƒOƒCƒ“—p
++-- Algorithm                        755 (rwxr-xr-x)     ƒfƒBƒŒƒNƒgƒŠ
+    +-- Diff.pm          TEXT        644 (rw-r--r--)     ·•ª—p
+
+œƒvƒ‰ƒOƒCƒ“
+
+ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA
+wiki.cgi“à‚Ì•Ï”$modifier_dir_plugin‚ÅŽw’è‚·‚éƒfƒBƒŒƒNƒgƒŠ‚É“]‘—‚µ‚Ü‚·B
+
++-- plugin                          755 (rwxr-xr-x)     ƒfƒBƒŒƒNƒgƒŠ
+    +-- link.pl         TEXT        644 (rw-r--r--)     linkƒvƒ‰ƒOƒCƒ“
+    +-- recent.pl       TEXT        644 (rw-r--r--)     recentƒvƒ‰ƒOƒCƒ“
+    +-- ruby.pl         TEXT        644 (rw-r--r--)     rubyƒvƒ‰ƒOƒCƒ“
+    +-- verb.pl         TEXT        644 (rw-r--r--)     verbƒvƒ‰ƒOƒCƒ“
+
+œŽQƃtƒ@ƒCƒ‹
+
+ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA
+wiki.cgi“à‚Ì•Ï”$modifier_dir_data‚ÅŽw’è‚·‚éƒfƒBƒŒƒNƒgƒŠ‚É“]‘—‚µ‚Ü‚·B
+
+                    “]‘—ƒ‚[ƒh  ƒp[ƒ~ƒbƒVƒ‡ƒ“      à–¾
++-- rss.xml         TEXT        666 (rw-rw-rw-)     RSSƒtƒ@ƒCƒ‹
++-- touched.txt     TEXT        666 (rw-rw-rw-)     •ÒWŽž‚ÌXVƒtƒ@ƒCƒ‹
++-- frontpage.txt   TEXT        644 (rw-r--r--)     FrontPage‚̃eƒLƒXƒg
++-- resource.txt    TEXT        644 (rw-r--r--)     ƒŠƒ\[ƒXƒtƒ@ƒCƒ‹
++-- conflict.txt    TEXT        644 (rw-r--r--)     XV‚ÌÕ“ËŽž‚̃eƒLƒXƒg
++-- format.txt      TEXT        644 (rw-r--r--)     ®Œ`ƒ‹[ƒ‹‚̃eƒLƒXƒg
+
+ƒvƒƒoƒCƒ_‚É‚æ‚Á‚Ä‚ÍA
+CGI‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒtƒ@ƒCƒ‹‚ÍACGI‚©‚çƒAƒNƒZƒX‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B
+
+‚»‚ÌꇂɂÍA•Ï”$modifier_dir_data‚ðŽg‚Á‚ÄA
+uCGI‚ª“Ç‚Ý‘‚«‚Å‚«‚éƒtƒ@ƒCƒ‹‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠv‚ðŽw’肵‚Ä‚¨‚«A
+‚»‚̃fƒBƒŒƒNƒgƒŠ‚Éã‹L‚̃tƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B
+
+‚»‚̂悤‚ȧŒÀ‚ª‚È‚¢ê‡‚É‚ÍA
+•Ï”$modifier_dir_data‚Å‚Íwiki.cgi‚ð“]‘—‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵A
+“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚Éã‹Lƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B
+
+
+œƒXƒ^ƒCƒ‹ƒV[ƒg‚Ɖ摜ƒtƒ@ƒCƒ‹
+
+ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA
+wiki.cgi“à‚Ì•Ï”$modifier_url_data‚ÅŽw’è‚·‚éURL‚ɑΉž‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚É“]‘—‚µ‚Ü‚·B
+
++-- wiki.css        TEXT        644 (rw-r--r--)     ƒXƒ^ƒCƒ‹ƒV[ƒg
++-- icon40x40.gif   BINARY      644 (rw-r--r--)     ƒAƒCƒRƒ“(¬)
++-- icon80x80.gif   BINARY      644 (rw-r--r--)     ƒAƒCƒRƒ“(‘å)
+
+ƒvƒƒoƒCƒ_‚É‚æ‚Á‚Ä‚ÍA
+CGI‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠ‚ɃXƒ^ƒCƒ‹ƒV[ƒg‚â‰æ‘œƒtƒ@ƒCƒ‹‚ð’u‚¢‚Ä‚à
+WebƒT[ƒo‚©‚çŽQÆ‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B
+
+‚»‚ÌꇂɂÍA
+WebƒT[ƒo‚©‚çŽQÆ‚Å‚«‚éꊂÌURL‚ð$modifier_url_data‚ðŽg‚Á‚ÄŽw’肵A
+‚»‚̃fƒBƒŒƒNƒgƒŠ‚Éã‹Lƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B
+
+‚»‚̂悤‚ȧŒÀ‚ª‚È‚¢ê‡‚É‚ÍA
+•Ï”$modifier_url_data‚Å‚Íwiki.cgi‚ð“]‘—‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵A
+“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚Éã‹Lƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B
+
+œì¬‚³‚ê‚éƒf[ƒ^
+
+ˆÈ‰º‚̃tƒ@ƒCƒ‹(deleteme.txt)‚ÍA“]‘—‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB
+i“]‘—‚µ‚Ä‚à‚©‚Ü‚¢‚Ü‚¹‚ñj
+wiki, diff, info‚̃fƒBƒŒƒNƒgƒŠ‚Í쬂µ‚Ä‚¨‚­•K—v‚ª‚ ‚è‚Ü‚·B
+
++-- wiki                        777 (rwxrwxrwx)     ƒfƒBƒŒƒNƒgƒŠ
+|   +-- deleteme.txt            “]‘—•s—v
+|
++-- diff                        777 (rwxrwxrwx)     ƒfƒBƒŒƒNƒgƒŠ
+|   +-- deleteme.txt            “]‘—•s—v
+|
++-- info                        777 (rwxrwxrwx)     ƒfƒBƒŒƒNƒgƒŠ
+|   +-- deleteme.txt            “]‘—•s—v
+
+
+ƒvƒƒoƒCƒ_‚É‚æ‚Á‚Ä‚ÍA
+CGI‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒtƒ@ƒCƒ‹‚ÍACGI‚©‚çƒAƒNƒZƒX‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B
+
+‚»‚ÌꇂɂÍA•Ï”$modifier_dir_data‚ðŽg‚Á‚ÄA
+uCGI‚ª“Ç‚Ý‘‚«‚Å‚«‚éƒtƒ@ƒCƒ‹‚ð’u‚­ƒfƒBƒŒƒNƒgƒŠv‚ðŽw’肵‚Ä‚¨‚«A
+‚»‚̃fƒBƒŒƒNƒgƒŠ‚Éã‹L‚Ìwiki, diff, infoƒfƒBƒŒƒNƒgƒŠ‚ðì‚è‚Ü‚·B
+
+‚»‚̂悤‚ȧŒÀ‚ª‚È‚¢ê‡‚É‚ÍA
+•Ï”$modifier_dir_data‚Å‚Íwiki.cgi‚ð“]‘—‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵A
+“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚Éã‹L‚Ìwiki, diff, infoƒfƒBƒŒƒNƒgƒŠ‚ðì‚è‚Ü‚·B
+
+-------------------------------------------------
+¡ƒf[ƒ^‚̃oƒbƒNƒAƒbƒv•û–@
+-------------------------------------------------
+
+YukiWiki‚Å\’z‚³‚ꂽWebƒy[ƒW‚̃Rƒ“ƒeƒ“ƒc‚ÍA
+wiki.cgi‚ªì‚èo‚·ƒf[ƒ^ƒx[ƒX“à‚É•ÛŽ‚³‚ê‚Ü‚·B
+
+ì‚ç‚ꂽƒf[ƒ^‚Í‚·‚ׂÄ
+•Ï”$modifier_dir_data‚ÅŽw’肵‚½ƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚Éì‚ç‚ê‚Ü‚·‚Ì‚ÅA
+‚±‚̃fƒBƒŒƒNƒgƒŠ‚̉º‚ð‚·‚×‚ÄƒoƒbƒNƒAƒbƒv‚µ‚Ä‚¨‚¯‚΂悢‚Å‚µ‚傤B
+
+•Ï”$modifier_dbtype‚ð'YukiWikiDB'‚É‚µ‚½ê‡‚É‚ÍA
+wiki, info, diff‚Æ‚¢‚¤3‚‚̃fƒBƒŒƒNƒgƒŠ‚ªì‚ç‚êA
+‚»‚̉º‚Ƀy[ƒW‚²‚ƂɃtƒ@ƒCƒ‹‚ªì‚ç‚ê‚Ü‚·B
+ƒoƒbƒNƒAƒbƒv‚à‚ꂪ‚È‚¢‚悤‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+
+
+-------------------------------------------------
+¡Šî–{“I‚ÈŽg‚¢•û
+-------------------------------------------------
+
+œV‚µ‚¢ƒy[ƒW‚Ìì‚è•û
+
+1.uV‹Kì¬v‚Æ‚¢‚¤ƒŠƒ“ƒN‚ð‚½‚Ç‚è‚Ü‚·B
+2. V‚µ‚¢ƒy[ƒW‚Ì–¼‘O‚ð“ü—Í‚µ‚Ü‚·B
+3. ƒy[ƒW‚Ì“à—e‚ð“ü—Í‚µ‚Ü‚·B
+
+œƒeƒLƒXƒg®Œ`‚̃‹[ƒ‹
+
+format.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+œƒnƒCƒp[ƒŠƒ“ƒN
+
+LinkToSomePage‚âFrontPage‚̂悤‚ÉA
+‰p’PŒê‚Ìʼn‚̈ꕶŽš‚ð‘啶Žš‚É‚µ‚½‚à‚Ì‚ª
+“ñ‚ˆÈã˜A‘±‚µ‚½‚à‚Ì‚ÍYukiWiki‚̃y[ƒW–¼‚Æ‚È‚èA
+‚»‚ꂪ•¶Í’†‚ÉŠÜ‚Ü‚ê‚é‚ƃŠƒ“ƒN‚É‚È‚è‚Ü‚·B
+
+“ñd‚Ì‘å‚©‚Á‚±[[ ]]‚Å‚­‚­‚Á‚½•¶Žš—ñ‚àA
+YukiWiki‚̃y[ƒW–¼‚É‚È‚è‚Ü‚·B
+‘å‚©‚Á‚±‚Ì’†‚ɂ̓Xƒy[ƒX‚ðŠÜ‚ß‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB
+“ú–{Œê‚àŽg‚¦‚Ü‚·B
+
+http://www.hyuki.com/
+‚̂悤‚ÈURL‚ÍŽ©“®“I‚ɃŠƒ“ƒN‚É‚È‚è‚Ü‚·B
+
+
+-------------------------------------------------
+¡ŽÓŽ«
+-------------------------------------------------
+
+–{‰Æ‚ÌWiki‚ðì‚Á‚½Ward Cunningham‚ÉŠ´ŽÓ‚µ‚Ü‚·B
+http://c2.com/cgi/wiki
+
+YukiWiki‚ðŠy‚µ‚ñ‚ÅŽg‚Á‚Ä‚­‚¾‚³‚éƒlƒbƒgã‚Ì•ûX‚ÉŠ´ŽÓ‚µ‚Ü‚·B
+
+‘½‚­‚ÌWikiƒNƒ[ƒ“‚ÌìŽÒ‚³‚ñ‚½‚¿‚ÆA
+YukiWiki‚̃†[ƒU‚³‚ñ‚½‚¿‚É[‚­Š´ŽÓ‚µ‚Ü‚·B
+
+ŸPukiWiki (PHP)
+http://pukiwiki.org/
+“Á‚ÉInterWiki, ˆêŒ¾ƒRƒƒ“ƒg‹@”\‚È‚Ç‚ÉŠ´ŽÓ‚µ‚Ü‚·B
+
+ŸTiki (Ruby)
+http://www.todo.org/cgi-bin/jp/tiki.cgi
+
+ŸRWiki (Ruby)
+http://www.jin.gr.jp/~nahi/RWiki/
+
+ŸKbWiki (Perl + HTML::Template)
+http://www.hippo2000.info/cgi-bin/KbWiki/KbWiki.pl
+
+Ÿu‹Éˆ«v‚³‚ñ‚Ìwiki (Perl)
+http://hpcgi1.nifty.com/dune/gwiki.pl
+“Á‚ÉAYukiWikiDB‚ÉŠ´ŽÓ‚µ‚Ü‚·B
+
+Ÿ’Ë–{–q¶‚³‚ñ‚ÌWalWiki (Perl)
+http://digit.que.ne.jp/work/
+ƒe[ƒuƒ‹‹@”\‚¨‚æ‚ÑYukiWiki‚ɑ΂·‚鑽”‚̉ü—Ç‚ÉŠ´ŽÓ‚µ‚Ü‚·B
+
+YukiWiki‚̃ƒS‚ðƒfƒUƒCƒ“‚µ‚Ä‚­‚¾‚³‚Á‚½‹´–{—ç“Þ‚³‚ñ
+http://city.hokkai.or.jp/~reina/
+‚ÉŠ´ŽÓ‚µ‚Ü‚·B
+
+
+-------------------------------------------------
+¡ŠÖ˜AƒŠƒ“ƒN
+-------------------------------------------------
+
+ŸŒ‹é_‚̃y[ƒW
+http://www.hyuki.com/
+
+ŸYukiWikiƒz[ƒ€ƒy[ƒW
+http://www.hyuki.com/yukiwiki/
+
+Ÿ‘ÐFŒ‹é_‚ÌWiki“ü–å
+http://www.hyuki.com/wb/
+
+Ÿ–{‰Æ‚ÌWiki
+http://c2.com/cgi/wiki?WikiWikiWeb
+
+Ÿ“ú–{”­‚ÌwikiƒNƒ[ƒ“ƒŠƒXƒg
+http://www1.neweb.ne.jp/wa/yamdas/column/technique/clonelist.html
+
+Ÿ“ú–{”­‚ÌwikiƒNƒ[ƒ“ƒŠƒXƒg2
+http://www1.neweb.ne.jp/wa/yamdas/column/technique/clonelist2.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resource.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,57 @@
+#
+# Resource file
+#
+deleted=휂µ‚Ü‚µ‚½B
+notfound=Œ©‚‚©‚è‚Ü‚¹‚ñB
+invalidname=–¼‘O‚ª³‚µ‚­‚ ‚è‚Ü‚¹‚ñB
+editthispage=‚±‚̃y[ƒW‚ð•ÒW‚µ‚Ü‚·
+admineditthispage=‚±‚̃y[ƒW‚ð•ÒW‚µ‚Ü‚·iƒpƒXƒ[ƒh‚ª•K—vj
+cantchange=‚±‚̃y[ƒW‚Í•ÏX‚Å‚«‚Ü‚¹‚ñB
+newpagename=V‚µ‚¢ƒy[ƒW‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B
+touch=ƒ^ƒCƒ€ƒXƒ^ƒ“ƒv‚ðXV
+savebutton=•Û‘¶‚·‚é
+createbutton=쬂·‚é
+frozenbutton=“€Œ‹‚·‚é
+notfrozenbutton=“€Œ‹‚µ‚È‚¢
+frozenpassword=ƒpƒXƒ[ƒh
+passworderror=ƒpƒXƒ[ƒh‚ªŒë‚Á‚Ä‚¢‚Ü‚·B
+changepasswordbutton=ƒpƒXƒ[ƒh•ÏX
+oldpassword=ŒÃ‚¢ƒpƒXƒ[ƒh
+newpassword=V‚µ‚¢ƒpƒXƒ[ƒh
+newpassword2=V‚µ‚¢ƒpƒXƒ[ƒh(Ä“ü—Í)
+passwordmismatcherror=V‚µ‚¢ƒpƒXƒ[ƒh‚ªˆê’v‚µ‚Ä‚¢‚Ü‚¹‚ñB
+passwordchanged=ƒpƒXƒ[ƒh‚ð•ÏX‚µ‚Ü‚µ‚½B
+changepassword=ƒpƒXƒ[ƒh•ÏX
+success=Š®—¹‚µ‚Ü‚µ‚½
+passwordneeded=ƒy[ƒW‚𓀌‹‚·‚é‚ɂ̓pƒXƒ[ƒh‚ª•K—v‚Å‚·B
+searchbutton=ŒŸõ
+saved=•Û‘¶‚µ‚Ü‚µ‚½B
+continuereading=ŽŸ‚̃Šƒ“ƒN‚ð‚½‚Ç‚Á‚Ä‚­‚¾‚³‚¢:
+searchthispage=‚±‚̃y[ƒW‚ðŒŸõ
+recentchangesbutton=XV—š—ð
+indexbutton=ˆê——
+createbutton=V‹Kì¬
+editbutton=•ÒW
+admineditbutton=•ÒW(ŠÇ—ŽÒ—p)
+yourname=‚ ‚È‚½‚Ì–¼‘O:
+commentbutton=ƒRƒƒ“ƒg’ljÁ
+difftitle=·•ª•\Ž¦
+diffnotice=<ul><li>ÅŒã‚ÌXV‚ŒljÁ‚³‚ꂽs‚Í<b class="added">‚±‚̂悤‚É</b>•\Ž¦‚µ‚Ü‚·B</li><li>ÅŒã‚ÌXV‚Å휂³‚ꂽs‚Í<s class="deleted">‚±‚̂悤‚É</s>•\Ž¦‚µ‚Ü‚·B</li></ul><hr />
+diffbutton=᥻
+rssbutton=RSS
+previewtitle=ƒvƒŒƒrƒ…[
+previewnotice=<p>ˆÈ‰º‚̃vƒŒƒrƒ…[‚ðŠm”F‚µ‚ÄA‚悯‚ê‚΃y[ƒW‰º•”‚̃{ƒ^ƒ“‚Å•Û‘¶‚µ‚Ä‚­‚¾‚³‚¢B</p><hr />
+previewempty=<p>iƒy[ƒW‚Ì“à—e‚Í‹ó‚Å‚·B•Û‘¶‚·‚é‚Æ‚±‚̃y[ƒW‚Í<b>íœ</b>‚³‚ê‚Ü‚·Bj</p>
+previewbutton=ƒvƒŒƒrƒ…[
+bulkreadnotice=<p>ˆÈ‰º‚̃eƒLƒXƒgƒGƒŠƒA‚Ì’†‚É‘Sƒy[ƒW‚Ì“à—e‚ª“WŠJ‚³‚ê‚Ä‚¢‚Ü‚·B</p>
+anydbmfileerror=<p>AnyDBM_File‚ÍŽg‚¦‚Ü‚¹‚ñB\$modifier_dbtype‚ð'YukiWikiDB'‚É•ÏX‚µ‚Ä‚­‚¾‚³‚¢B</p>
+table_of_contents=–ÚŽŸ
+pluginerror=<p>ƒvƒ‰ƒOƒCƒ“‚ŃGƒ‰[‚ª‹N‚«‚Ü‚µ‚½B</p>
+available_plugins=—˜—p‚Å‚«‚éƒvƒ‰ƒOƒCƒ“
+plugin_usage_name=–¼‘O
+plugin_usage_version=Ver.
+plugin_usage_author=ìŽÒ
+plugin_usage_syntax=‹L–@
+plugin_usage_description=‰ðà
+plugin_usage_example=ŽÀ—á
+toolongpost=ƒƒbƒZ[ƒW‚ª’·‚·‚¬‚Ü‚·BÅ‘å:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rss.xml	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="euc-jp" ?>
+
+<rdf:RDF
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://purl.org/rss/1.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+>
+
+<channel rdf:about="http://www.hyuki.com/yukiwiki/rss.xml">
+ <title>YukiWiki 2.1.3</title>
+ <link>http://www.hyuki.com/yukiwiki/wiki.cgi</link>
+ <description>This is YukiWiki, yet another Wiki clone</description>
+ <items>
+  <rdf:Seq>
+      <rdf:li rdf:resource="http://www.hyuki.com/yukiwiki/wiki.cgi?FrontPage" />
+    <rdf:li rdf:resource="http://www.hyuki.com/yukiwiki/wiki.cgi?hogehoge" />
+    <rdf:li rdf:resource="http://www.hyuki.com/yukiwiki/wiki.cgi?%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2" />
+
+  </rdf:Seq>
+ </items>
+</channel>
+
+   <item rdf:about="http://www.hyuki.com/yukiwiki/wiki.cgi?FrontPage">
+    <title>FrontPage</title>
+    <link>http://www.hyuki.com/yukiwiki/wiki.cgi?FrontPage</link>
+    <description>FrontPage - YukiWiki on Cassandra</description>
+    <dc:date>2010-06-06T21:50:42+09:00</dc:date>
+   </item>
+   
+   <item rdf:about="http://www.hyuki.com/yukiwiki/wiki.cgi?hogehoge">
+    <title>hogehoge</title>
+    <link>http://www.hyuki.com/yukiwiki/wiki.cgi?hogehoge</link>
+    <description>hogehoge - ¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã£ó</description>
+    <dc:date>2010-06-06T18:27:11+09:00</dc:date>
+   </item>
+   
+   <item rdf:about="http://www.hyuki.com/yukiwiki/wiki.cgi?%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2">
+    <title>¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢</title>
+    <link>http://www.hyuki.com/yukiwiki/wiki.cgi?%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2</link>
+    <description>¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢ - ¤¦¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢</description>
+    <dc:date>2010-06-06T18:25:40+09:00</dc:date>
+   </item>
+  
+</rdf:RDF>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/touched.txt	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,1 @@
+Sun Jun  6 21:50:42 2010
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wiki.cgi	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,1435 @@
+#!/usr/bin/perl -X
+#!perl -X
+#
+# wiki.cgi - YukiWiki on Cassandra
+# Shoshi TAMAKI
+#
+##############################
+#
+# wiki.cgi - This is YukiWiki, yet another Wiki clone.
+#
+# Copyright (C) 2000-2004 by Hiroshi Yuki.
+# <hyuki@hyuki.com>
+# http://www.hyuki.com/yukiwiki/
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+##############################
+# Libraries.
+use strict;
+use lib qw(.);
+use CGI qw(:standard);
+use CGI::Carp qw(fatalsToBrowser);
+use Yuki::RSS;
+use Yuki::DiffText qw(difftext);
+use Yuki::YukiWikiDB;
+use Yuki::PluginManager;
+use Cassandra::CassHash;
+require 'jcode.pl';
+# use Jcode;
+use Fcntl;
+# Check if the server can use 'AnyDBM_File' or not.
+# eval 'use AnyDBM_File';
+# my $error_AnyDBM_File = $@;
+my $version = '2.1.3';
+##############################
+#
+# You MUST modify following '$modifier_...' variables.
+#
+my $modifier_mail = 'hyuki@hyuki.com';
+my $modifier_url = 'http://www.hyuki.com/';
+my $modifier_name = 'Hiroshi Yuki';
+my $modifier_dir_data = '.'; # Your data directory (not URL, but DIRECTORY).
+my $modifier_url_data = '.'; # Your data URL (not DIRECTORY, but URL).
+my $modifier_rss_title = "YukiWiki $version";
+my $modifier_rss_link = 'http://www.hyuki.com/yukiwiki/wiki.cgi';
+my $modifier_rss_about = 'http://www.hyuki.com/yukiwiki/rss.xml';
+my $modifier_rss_description = 'This is YukiWiki, yet another Wiki clone';
+my $modifier_rss_timezone = '+09:00';
+##############################
+#
+# You MAY modify following variables.
+#
+#my $modifier_dbtype = 'YukiWikiDB';
+my $modifier_dbtype = 'Cassandra::CassHash';
+my $modifier_sendmail = '';
+# my $modifier_sendmail = '/usr/sbin/sendmail -t -n';
+my $modifier_dir_plugin = './plugin';
+##############################
+#
+# You MAY modify following variables.
+#
+my $file_touch = "$modifier_dir_data/touched.txt";
+my $file_resource = "$modifier_dir_data/resource.txt";
+my $file_FrontPage = "$modifier_dir_data/frontpage.txt";
+my $file_conflict = "$modifier_dir_data/conflict.txt";
+my $file_format = "$modifier_dir_data/format.txt";
+my $file_rss = "$modifier_dir_data/rss.xml";
+my $url_cgi = 'wiki.cgi';
+my $url_stylesheet = "$modifier_url_data/wiki.css";
+my $icontag = qq(<img src="$modifier_url_data/icon40x40.gif" alt="*" width="40" height="40" />);
+my $maxrecent = 50;
+my $max_message_length = 500_000; # -1 for unlimited.
+my $cols = 80;
+my $rows = 20;
+##############################
+#
+# You MAY modify following variables.
+# 
+my $dataname = "$modifier_dir_data/wiki";
+my $infoname = "$modifier_dir_data/info";
+my $diffname = "$modifier_dir_data/diff";
+my $editchar = '?';
+my $subject_delimiter = ' - ';
+my $use_autoimg = 1; # automatically convert image URL into <img> tag.
+my $use_exists = 0; # If you can use 'exists' method for your DB.
+my $use_FixedFrontPage = 0;
+##############################
+my $InterWikiName = 'InterWikiName';
+my $RecentChanges = 'RecentChanges';
+my $AdminChangePassword = 'AdminChangePassword';
+my $CompletedSuccessfully = 'CompletedSuccessfully';
+my $FrontPage = 'FrontPage';
+my $IndexPage = 'IndexPage';
+my $SearchPage = 'SearchPage';
+my $CreatePage = 'CreatePage';
+my $ErrorPage = 'ErrorPage';
+my $RssPage = 'RssPage';
+my $AdminSpecialPage = 'Admin Special Page'; # must include spaces.
+##############################
+my $wiki_name = '\b([A-Z][a-z]+([A-Z][a-z]+)+)\b';
+my $bracket_name = '\[\[(\S+?)\]\]';
+my $embedded_name = '\[\[(#\S+?)\]\]';
+my $interwiki_definition = '\[\[(\S+?)\ (\S+?)\]\]';
+my $interwiki_name = '([^:]+):([^:].*)';
+# Sorry for wierd regex.
+my $inline_plugin = '\&amp;(\w+)\((([^()]*(\([^()]*\))?)*)\)';
+##############################
+my $embed_comment = '[[#comment]]';
+my $embed_rcomment = '[[#rcomment]]';
+##############################
+my $info_ConflictChecker = 'ConflictChecker';
+my $info_LastModified = 'LastModified';
+my $info_IsFrozen = 'IsFrozen';
+my $info_AdminPassword = 'AdminPassword';
+##############################
+my $kanjicode = 'euc';
+my $charset = 'euc-jp';
+my $lang = 'ja';
+my %fixedpage = (
+    $IndexPage => 1,
+    $CreatePage => 1,
+    $ErrorPage => 1,
+    $RssPage => 1,
+    $RecentChanges => 1,
+    $SearchPage => 1,
+    $AdminChangePassword => 1,
+    $CompletedSuccessfully => 1,
+    $FrontPage => $use_FixedFrontPage,
+);
+my %form;
+my %database;
+my %infobase;
+my %diffbase;
+my %resource;
+my %interwiki;
+my $plugin_manager;
+my $plugin_context = {
+    debug => 0,
+    database => \%database,
+    infobase => \%infobase,
+    resource => \%resource,
+    form => \%form,
+    interwiki => \%interwiki,
+    url_cgi => $url_cgi,
+};
+##############################
+my %page_command = (
+    $IndexPage => 'index',
+    $SearchPage => 'searchform',
+    $CreatePage => 'create',
+    $RssPage => 'rss',
+    $AdminChangePassword => 'adminchangepasswordform',
+    $FrontPage => 'FrontPage',
+);
+my %command_do = (
+    read => \&do_read,
+    edit => \&do_edit,
+    adminedit => \&do_adminedit,
+    adminchangepasswordform => \&do_adminchangepasswordform,
+    adminchangepassword => \&do_adminchangepassword,
+    write => \&do_write,
+    index => \&do_index,
+    searchform => \&do_searchform,
+    search => \&do_search,
+    create => \&do_create,
+    createresult => \&do_createresult,
+    FrontPage => \&do_FrontPage,
+    comment => \&do_comment,
+    rss => \&do_rss,
+    diff => \&do_diff,
+);
+##############################
+# &test_convert;
+&main;
+exit(0);
+##############################
+
+sub main {
+    &init_resource;
+    # &check_modifiers;
+    &open_db;
+    &init_form;
+    &init_InterWikiName;
+    &init_plugin;
+    if ($command_do{$form{mycmd}}) {
+        &{$command_do{$form{mycmd}}};
+    } else {
+        &do_FrontPage;
+    }
+    &close_db;
+}
+
+sub do_read {
+    &print_header($form{mypage});
+    &print_content($database{$form{mypage}});
+    &print_footer($form{mypage});
+}
+
+sub do_edit {
+    my ($page) = &unarmor_name(&armor_name($form{mypage}));
+    &print_header($page);
+    if (not &is_editable($page)) {
+        &print_message($resource{cantchange});
+    } elsif (&is_frozen($page)) {
+        &print_message($resource{cantchange});
+    } else {
+        &print_editform($database{$page}, &get_info($page, $info_ConflictChecker), admin=>0);
+    }
+    &print_footer($page);
+}
+
+sub do_adminedit {
+    my ($page) = &unarmor_name(&armor_name($form{mypage}));
+    &print_header($page);
+    if (not &is_editable($page)) {
+        &print_message($resource{cantchange});
+    } else {
+        &print_message($resource{passwordneeded});
+        &print_editform($database{$page}, &get_info($page, $info_ConflictChecker), admin=>1);
+    }
+    &print_footer($page);
+}
+
+sub do_adminchangepasswordform {
+    &print_header($AdminChangePassword);
+    &print_passwordform;
+    &print_footer($AdminChangePassword);
+}
+
+sub do_adminchangepassword {
+    if ($form{mynewpassword} ne $form{mynewpassword2}) {
+        &print_error($resource{passwordmismatcherror});
+    }
+    my ($validpassword_crypt) = &get_info($AdminSpecialPage, $info_AdminPassword);
+    if ($validpassword_crypt) {
+        if (not &valid_password($form{myoldpassword})) {
+            &send_mail_to_admin(<<"EOD", "AdminChangePassword");
+myoldpassword=$form{myoldpassword}
+mynewpassword=$form{mynewpassword}
+mynewpassword2=$form{mynewpassword2}
+EOD
+            &print_error($resource{passworderror});
+        }
+    }
+    my ($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);
+    my (@token) = ('0'..'9', 'A'..'Z', 'a'..'z');
+    my $salt1 = $token[(time | $$) % scalar(@token)];
+    my $salt2 = $token[($sec + $min*60 + $hour*60*60) % scalar(@token)];
+    my $crypted = crypt($form{mynewpassword}, "$salt1$salt2");
+    &set_info($AdminSpecialPage, $info_AdminPassword, $crypted);
+
+    &print_header($CompletedSuccessfully);
+    &print_message($resource{passwordchanged});
+    &print_footer($CompletedSuccessfully);
+}
+
+sub do_index {
+    &print_header($IndexPage);
+    print qq(<ul>);
+    foreach my $page (sort keys %database) {
+        if (&is_editable($page)) {
+            print qq(<li><a href="$url_cgi?@{[&encode($page)]}">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</li>);
+            # print qq(<li>@{[&get_info($page, $info_IsFrozen)]}</li>);
+            # print qq(<li>@{[0 + &is_frozen($page)]}</li>);
+        }
+    }
+    print qq(</ul>);
+    &print_footer($IndexPage);
+}
+
+sub do_write {
+    if (&keyword_reject()) {
+        return;
+    }
+
+    if (&frozen_reject()) {
+        return;
+    }
+
+    if (&length_reject()) {
+        return;
+    }
+
+    if (not &is_editable($form{mypage})) {
+        &print_header($form{mypage});
+        &print_message($resource{cantchange});
+        &print_footer($form{mypage});
+        return;
+    }
+
+    if (&conflict($form{mypage}, $form{mymsg})) {
+        return;
+    }
+
+    # Making diff
+    if (1) {
+        &open_diff;
+        my @msg1 = split(/\r?\n/, $database{$form{mypage}});
+        my @msg2 = split(/\r?\n/, $form{mymsg});
+        $diffbase{$form{mypage}} = &difftext(\@msg1, \@msg2);
+        &close_diff;
+    }
+
+    if ($form{mymsg}) {
+        $database{$form{mypage}} = $form{mymsg};
+        &send_mail_to_admin($form{mypage}, "Modify");
+        &set_info($form{mypage}, $info_ConflictChecker, '' . localtime);
+        if ($form{mytouch}) {
+            &set_info($form{mypage}, $info_LastModified, '' . localtime);
+            &update_recent_changes;
+        }
+        &set_info($form{mypage}, $info_IsFrozen, 0 + $form{myfrozen});
+        &print_header($CompletedSuccessfully);
+        &print_message($resource{saved});
+        &print_content("$resource{continuereading} @{[&armor_name($form{mypage})]}");
+        &print_footer($CompletedSuccessfully);
+    } else {
+        &send_mail_to_admin($form{mypage}, "Delete");
+        delete $database{$form{mypage}};
+        delete $infobase{$form{mypage}};
+        if ($form{mytouch}) {
+            &update_recent_changes;
+        }
+        &print_header($form{mypage});
+        &print_message($resource{deleted});
+        &print_footer($form{mypage});
+    }
+}
+
+sub do_searchform {
+    &print_header($SearchPage);
+    &print_searchform("");
+    &print_footer($SearchPage);
+}
+
+sub do_search {
+    my $word = &escape($form{mymsg});
+    &print_header($SearchPage);
+    &print_searchform($word);
+    my $counter = 0;
+    foreach my $page (sort keys %database) {
+        next if $page =~ /^$RecentChanges$/;
+        if ($database{$page} =~ /\Q$form{mymsg}\E/ or $page =~ /\Q$form{mymsg}\E/) {
+            if ($counter == 0) {
+                print qq|<ul>|;
+            }
+            print qq(<li><a href ="$url_cgi?@{[&encode($page)]}">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</li>);
+            $counter++;
+        }
+    }
+    if ($counter == 0) {
+        &print_message($resource{notfound});
+    } else {
+        print qq|</ul>|;
+    }
+    &print_footer($SearchPage);
+}
+
+sub do_create {
+    &print_header($CreatePage);
+    print <<"EOD";
+<form action="$url_cgi" method="post">
+    <input type="hidden" name="mycmd" value="edit">
+    <strong>$resource{newpagename}</strong><br>
+    <input type="text" name="mypage" value="" size="20">
+    <input type="submit" value="$resource{createbutton}"><br>
+</form>
+EOD
+    &print_footer($CreatePage);
+}
+
+sub do_FrontPage {
+    if ($fixedpage{$FrontPage}) {
+        open(FILE, $file_FrontPage) or &print_error("($file_FrontPage)");
+        my $content = join('', <FILE>);
+        &code_convert(\$content, $kanjicode);
+        close(FILE);
+        &print_header($FrontPage);
+        &print_content($content);
+        &print_footer($FrontPage);
+    } else {
+        $form{mycmd} = 'read';
+        $form{mypage} = $FrontPage;
+        &do_read;
+    }
+}
+
+sub print_error {
+    my ($msg) = @_;
+    &print_header($ErrorPage);
+    print qq(<p><strong class="error">$msg</strong></p>);
+    &print_plugin_log;
+    &print_footer($ErrorPage);
+    exit(0);
+}
+
+sub print_header {
+    my ($page) = @_;
+    my $bodyclass = "normal";
+    my $editable = 0;
+    my $admineditable = 0;
+    if (&is_frozen($page) and $form{mycmd} =~ /^(read|write)$/) {
+        $editable = 0;
+        $admineditable = 1;
+        $bodyclass = "frozen";
+    } elsif (&is_editable($page) and $form{mycmd} =~ /^(read|write)$/) {
+        $admineditable = 1;
+        $editable = 1;
+    } else {
+        $editable = 0;
+    }
+    my $cookedpage = &encode($page);
+    my $escapedpage = &escape($page);
+    print <<"EOD";
+Content-type: text/html; charset=$charset
+
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="$lang">
+<head>
+    <meta http-equiv="Content-Language" content="$lang">
+    <meta http-equiv="Content-Type" content="text/html; charset=$charset">
+    <title>$escapedpage @{[&escape(&get_subjectline($page))]}</title>
+    <link rel="index" href="$url_cgi?$IndexPage">
+    <link rev="made" href="mailto:$modifier_mail">
+    <link rel="stylesheet" type="text/css" href="$url_stylesheet">
+    <link rel="alternate" type="application/rss+xml" title="RSS" href="$modifier_rss_about" />
+</head>
+<body class="$bodyclass">
+<div class="tools">
+    @{[ $admineditable
+        ? qq(<a title="$resource{admineditthispage}" href="$url_cgi?mycmd=adminedit&amp;mypage=$cookedpage">$resource{admineditbutton}</a> | )
+        : qq()
+    ]}
+    @{[ $editable
+        ? qq(<a title="$resource{editthispage}" href="$url_cgi?mycmd=edit&amp;mypage=$cookedpage">$resource{editbutton}</a> | )
+        : qq()
+    ]}
+    @{[ $admineditable
+        ? qq(<a href="$url_cgi?mycmd=diff&amp;mypage=$cookedpage">$resource{diffbutton}</a> | )
+        : qq()
+    ]}
+    <a href="$url_cgi?$CreatePage">$resource{createbutton}</a> | 
+    <a href="$url_cgi?$IndexPage">$resource{indexbutton}</a> | 
+    <a href="$modifier_rss_about">$resource{rssbutton}</a> | 
+    <a href="$url_cgi?$FrontPage">$FrontPage</a> | 
+    <a href="$url_cgi?$SearchPage">$resource{searchbutton}</a> | 
+    <a href="$url_cgi?$RecentChanges">$resource{recentchangesbutton}</a>
+</div>
+<h1 class="header"><a
+    title="$resource{searchthispage}"
+    href="$url_cgi?mycmd=search&amp;mymsg=$cookedpage">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</h1>
+EOD
+}
+
+sub print_footer {
+    my ($page) = @_;
+    print <<"EOD";
+<hr>
+<address class="footer">
+    Powered by <a href="http://www.hyuki.com/yukiwiki/">YukiWiki</a> $version <br />
+    Modified by <a href="$modifier_url">$modifier_name</a>.
+</address>
+<p class="footer">
+    <a href="http://www.hyuki.com/yukiwiki/">$icontag</a>
+</p>
+</body>
+</html>
+EOD
+}
+
+sub escape {
+    my $s = shift;
+    $s =~ s|\r\n|\n|g;
+    $s =~ s|\&|&amp;|g;
+    $s =~ s|<|&lt;|g;
+    $s =~ s|>|&gt;|g;
+    $s =~ s|"|&quot;|g;
+    return $s;
+}
+
+sub unescape {
+    my $s = shift;
+    # $s =~ s|\n|\r\n|g;
+    $s =~ s|\&amp;|\&|g;
+    $s =~ s|\&lt;|\<|g;
+    $s =~ s|\&gt;|\>|g;
+    $s =~ s|\&quot;|\"|g;
+    return $s;
+}
+
+sub print_content {
+    my ($rawcontent) = @_;
+    print &text_to_html($rawcontent, toc=>1);
+}
+
+sub text_to_html {
+    my ($txt, %option) = @_;
+    my (@txt) = split(/\r?\n/, $txt);
+    my (@toc);
+    my $verbatim;
+    my $tocnum = 0;
+    my (@saved, @result);
+    unshift(@saved, "</p>");
+    push(@result, "<p>");
+    foreach (@txt) {
+        chomp;
+
+        # verbatim.
+        if ($verbatim->{func}) {
+            if (/^\Q$verbatim->{done}\E$/) {
+                undef $verbatim;
+                push(@result, splice(@saved));
+            } else {
+                push(@result, $verbatim->{func}->($_));
+            }
+            next;
+        }
+
+        # non-verbatim follows.
+        push(@result, shift(@saved)) if (@saved and $saved[0] eq '</pre>' and /^[^ \t]/);
+        if (/^(\*{1,3})(.+)/) {
+            # $hn = 'h2', 'h3' or 'h4'
+            my $hn = "h" . (length($1) + 1);
+            push(@toc, '-' x length($1) . qq( <a href="#i$tocnum">) . &remove_tag(&inline($2)) . qq(</a>\n));
+            push(@result, splice(@saved), qq(<$hn><a name="i$tocnum"> </a>) . &inline($2) . qq(</$hn>));
+            $tocnum++;
+        } elsif (/^(-{2,3})\($/) {
+            if ($& eq '--(') {
+                $verbatim = { func => \&inline, done => '--)', class => 'verbatim-soft' };
+            } else {
+                $verbatim = { func => \&escape, done => '---)', class => 'verbatim-hard' };
+            }
+            &back_push('pre', 1, \@saved, \@result, " class='$verbatim->{class}'");
+        } elsif (/^----/) {
+            push(@result, splice(@saved), '<hr>');
+        } elsif (/^(-{1,3})(.+)/) {
+            &back_push('ul', length($1), \@saved, \@result);
+            push(@result, '<li>' . &inline($2) . '</li>');
+        } elsif (/^:([^:]+):(.+)/) {
+            &back_push('dl', 1, \@saved, \@result);
+            push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');
+        } elsif (/^(>{1,3})(.+)/) {
+            &back_push('blockquote', length($1), \@saved, \@result);
+            push(@result, &inline($2));
+        } elsif (/^$/) {
+            push(@result, splice(@saved));
+            unshift(@saved, "</p>");
+            push(@result, "<p>");
+        } elsif (/^(\s+.*)$/) {
+            &back_push('pre', 1, \@saved, \@result);
+            push(@result, &escape($1)); # Not &inline, but &escape
+        } elsif (/^\,(.*?)[\x0D\x0A]*$/) {
+            &back_push('table', 1, \@saved, \@result, ' border="1"');
+            #######
+            # This part is taken from Mr. Ohzaki's Perl Memo and Makio Tsukamoto's WalWiki.
+            # XXXXX
+            my $tmp = "$1,";
+            my @value = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
+            my @align = map {(s/^\s+//) ? ((s/\s+$//) ? ' align="center"' : ' align="right"') : ''} @value;
+            my @colspan = map {($_ eq '==') ? 0 : 1} @value;
+            for (my $i = 0; $i < @value; $i++) {
+                if ($colspan[$i]) {
+                    while ($i + $colspan[$i] < @value and $value[$i + $colspan[$i]] eq '==') {
+                        $colspan[$i]++;
+                    }
+                    $colspan[$i] = ($colspan[$i] > 1) ? sprintf(' colspan="%d"', $colspan[$i]) : '';
+                    $value[$i] = sprintf('<td%s%s>%s</td>', $align[$i], $colspan[$i], &inline($value[$i]));
+                } else {
+                    $value[$i] = '';
+                }
+            }
+            push(@result, join('', '<tr>', @value, '</tr>'));
+            # XXXXX
+            #######
+        } elsif (/^\#(\w+)(\((.*)\))?/) {
+            # BlockPlugin.
+            my $original_line = $_;
+            my $plugin_name = $1;
+            my $argument = &escape($3);
+            my $result = $plugin_manager->call($plugin_name, 'block', $argument);
+            if (defined($result)) {
+                push(@result, splice(@saved));
+            } else {
+                $result = $original_line;
+            }
+            push(@result, $result);
+        } else {
+            push(@result, &inline($_));
+        }
+    }
+    push(@result, splice(@saved));
+
+    if ($option{toc}) {
+        # Convert @toc (table of contents) to HTML.
+        # This part is taken from Makio Tsukamoto's WalWiki.
+        my (@tocsaved, @tocresult);
+        foreach (@toc) {
+            if (/^(-{1,3})(.*)/) {
+                &back_push('ul', length($1), \@tocsaved, \@tocresult);
+                push(@tocresult, '<li>' . $2 . '</li>');
+            }
+        }
+        push(@tocresult, splice(@tocsaved));
+
+        # Insert "table of contents".
+        if (@tocresult) {
+            unshift(@tocresult, qq(<h2>$resource{table_of_contents}</h2>));
+        }
+
+        return join("\n", @tocresult, @result);
+    } else {
+        return join("\n", @result);
+    }
+}
+
+sub back_push {
+    my ($tag, $level, $savedref, $resultref, $attr) = @_;
+    while (@$savedref > $level) {
+        push(@$resultref, shift(@$savedref));
+    }
+    if ($savedref->[0] ne "</$tag>") {
+        push(@$resultref, splice(@$savedref));
+    }
+    while (@$savedref < $level) {
+        unshift(@$savedref, "</$tag>");
+        push(@$resultref, "<$tag$attr>");
+    }
+}
+
+sub remove_tag {
+    my ($line) = @_;
+    $line =~ s|\<\/?[A-Za-z][^>]*?\>||g;
+    return $line;
+}
+
+sub inline {
+    my ($line) = @_;
+    $line = &escape($line);
+    $line =~ s|'''([^']+?)'''|<i>$1</i>|g;  # Italic
+    $line =~ s|''([^']+?)''|<b>$1</b>|g;    # Bold
+    $line =~ s|(\d\d\d\d-\d\d-\d\d \(\w\w\w\) \d\d:\d\d:\d\d)|<span class="date">$1</span>|g;   # Date
+    $line =~ s!
+                (
+                    ((mailto|http|https|ftp):([^\x00-\x20()<>\x7F-\xFF])*)  # Direct http://...
+                        |
+                    ($bracket_name)             # [[likethis]], [[#comment]], [[Friend:remotelink]]
+                        |
+                    ($interwiki_definition)     # [[Friend http://somewhere/?q=sjis($1)]]
+                        |
+                    ($wiki_name)                # LocalLinkLikeThis
+                        |
+                    ($inline_plugin)            # &user_defined_plugin(123,hello)
+                )
+            !
+                &make_link($1)
+            !gex;
+    return $line;
+}
+
+sub make_link {
+    my $chunk = shift;
+    if ($chunk =~ /^(http|https|ftp):/) {
+        if ($use_autoimg and $chunk =~ /\.(gif|png|jpeg|jpg)$/) {
+            return qq(<a href="$chunk"><img src="$chunk"></a>);
+        } else {
+            return qq(<a href="$chunk">$chunk</a>);
+        }
+    } elsif ($chunk =~ /^(mailto):(.*)/) {
+        return qq(<a href="$chunk">$2</a>);
+    } elsif ($chunk =~ /^$interwiki_definition$/) {
+        return qq(<span class="InterWiki">$chunk</span>);
+    } elsif ($chunk =~ /^$embedded_name$/) {
+        return &embedded_to_html($chunk);
+    } elsif ($chunk =~ /^$inline_plugin$/) {
+        # InlinePlugin.
+        my $plugin_name = $1;
+        my $argument = $2;
+        my $result = $plugin_manager->call($plugin_name, 'inline', $argument);
+        if (defined($result)) {
+            return $result;
+        } else {
+            return $chunk;
+        }
+    } else {
+        $chunk = &unarmor_name($chunk);
+        $chunk = &unescape($chunk); # To treat '&' or '>' or '<' correctly.
+        my $cookedchunk = &encode($chunk);
+        my $escapedchunk = &escape($chunk);
+        if ($chunk =~ /^$interwiki_name$/) {
+            my ($intername, $localname) = ($1, $2);
+            my $remoteurl = $interwiki{$intername};
+            if ($remoteurl =~ /^(http|https|ftp):\/\//) { # Check if scheme if valid.
+                $remoteurl =~ s/\b(euc|sjis|ykwk|asis)\(\$1\)/&interwiki_convert($1, $localname)/e;
+                return qq(<a href="$remoteurl">$escapedchunk</a>);
+            } else {
+                return $escapedchunk;
+            }
+        } elsif ($database{$chunk}) {
+            my $subject = &escape(&get_subjectline($chunk, delimiter => ''));
+            return qq(<a title="$subject" href="$url_cgi?$cookedchunk">$escapedchunk</a>);
+        } elsif ($page_command{$chunk}) {
+            return qq(<a title="$escapedchunk" href="$url_cgi?$cookedchunk">$escapedchunk</a>);
+        } else {
+            return qq($escapedchunk<a title="$resource{editthispage}" class="editlink" href="$url_cgi?mycmd=edit&amp;mypage=$cookedchunk">$editchar</a>);
+        }
+    }
+}
+
+sub print_message {
+    my ($msg) = @_;
+    print qq(<p><strong>$msg</strong></p>);
+}
+
+sub init_form {
+    if (param()) {
+        foreach my $var (param()) {
+            $form{$var} = param($var);
+        }
+    } else {
+        $ENV{QUERY_STRING} = $FrontPage;
+    }
+
+    my $query = &decode($ENV{QUERY_STRING});
+    if ($page_command{$query}) {
+        $form{mycmd} = $page_command{$query};
+        $form{mypage} = $query;
+    } elsif ($query =~ /^($wiki_name)$/) {
+        $form{mycmd} = 'read';
+        $form{mypage} = $1;
+    } elsif ($database{$query}) {
+        $form{mycmd} = 'read';
+        $form{mypage} = $query;
+    }
+
+    # mypreview_edit        -> do_edit, with preview.
+    # mypreview_adminedit   -> do_adminedit, with preview.
+    # mypreview_write       -> do_write, without preview.
+    foreach (keys %form) {
+        if (/^mypreview_(.*)$/) {
+            $form{mycmd} = $1;
+            $form{mypreview} = 1;
+        }
+    }
+
+    #
+    # $form{mycmd} is frozen here.
+    #
+
+    $form{mymsg} = &code_convert(\$form{mymsg}, $kanjicode);
+    $form{myname} = &code_convert(\$form{myname}, $kanjicode);
+}
+
+sub update_recent_changes {
+    my $update = "- @{[&get_now]} @{[&armor_name($form{mypage})]} @{[&get_subjectline($form{mypage})]}";
+    my @oldupdates = split(/\r?\n/, $database{$RecentChanges});
+    my @updates;
+    foreach (@oldupdates) {
+        /^\- \d\d\d\d\-\d\d\-\d\d \(...\) \d\d:\d\d:\d\d (\S+)/;    # date format.
+        my $name = &unarmor_name($1);
+        if (&is_exist_page($name) and ($name ne $form{mypage})) {
+            push(@updates, $_);
+        }
+    }
+    if (&is_exist_page($form{mypage})) {
+        unshift(@updates, $update);
+    }
+    splice(@updates, $maxrecent + 1);
+    $database{$RecentChanges} = join("\n", @updates);
+    if ($file_touch) {
+        open(FILE, "> $file_touch");
+        print FILE localtime() . "\n";
+        close(FILE);
+    }
+    if ($file_rss) {
+        &update_rssfile;
+    }
+}
+
+sub get_subjectline {
+    my ($page, %option) = @_;
+    if (not &is_editable($page)) {
+        return "";
+    } else {
+        # Delimiter check.
+        my $delim = $subject_delimiter;
+        if (defined($option{delimiter})) {
+            $delim = $option{delimiter};
+        }
+
+        # Get the subject of the page.
+        my $subject = $database{$page};
+        $subject =~ s/\r?\n.*//s;
+        return "$delim$subject";
+    }
+}
+
+sub send_mail_to_admin {
+    my ($page, $mode) = @_;
+    return unless $modifier_sendmail;
+    my $message = <<"EOD";
+To: $modifier_mail
+From: $modifier_mail
+Subject: [Wiki/$mode]
+MIME-Version: 1.0
+Content-Type: text/plain; charset=ISO-2022-JP
+Content-Transfer-Encoding: 7bit
+
+--------
+MODE = $mode
+REMOTE_ADDR = $ENV{REMOTE_ADDR}
+REMOTE_HOST = $ENV{REMOTE_HOST}
+--------
+$page
+--------
+$database{$page}
+--------
+EOD
+    &code_convert(\$message, 'jis');
+    open(MAIL, "| $modifier_sendmail");
+    print MAIL $message;
+    close(MAIL);
+}
+
+sub open_db {
+    if ($modifier_dbtype eq 'dbmopen') {
+        dbmopen(%database, $dataname, 0666) or &print_error("(dbmopen) $dataname");
+        dbmopen(%infobase, $infoname, 0666) or &print_error("(dbmopen) $infoname");
+    } elsif ($modifier_dbtype eq 'AnyDBM_File') {
+        tie(%database, "AnyDBM_File", $dataname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $dataname");
+        tie(%infobase, "AnyDBM_File", $infoname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $infoname");
+	} elsif ($modifier_dbtype eq 'Cassandra::CassHash') {
+		#use cassandra
+        tie(%database, "Cassandra::CassHash","localhost",9161,"Keyspace1","Standard1","yukiwiki3") or &print_error("(tie Cassandra::CassHash) $dataname");
+        tie(%infobase, "Cassandra::CassHash","localhost",9161,"Keyspace1","Standard1","yukiwiki5") or &print_error("(tie Cassandra::CassHash) $infoname");
+    } else {
+        tie(%database, "Yuki::YukiWikiDB", $dataname) or &print_error("(tie Yuki::YukiWikiDB) $dataname");
+        tie(%infobase, "Yuki::YukiWikiDB", $infoname) or &print_error("(tie Yuki::YukiWikiDB) $infoname");
+    }
+}
+
+sub close_db {
+    if ($modifier_dbtype eq 'dbmopen') {
+        dbmclose(%database);
+        dbmclose(%infobase);
+    } elsif ($modifier_dbtype eq 'AnyDBM_File') {
+        untie(%database);
+        untie(%infobase);
+    } else {
+        untie(%database);
+        untie(%infobase);
+    }
+}
+
+sub open_diff {
+    if ($modifier_dbtype eq 'dbmopen') {
+        dbmopen(%diffbase, $diffname, 0666) or &print_error("(dbmopen) $diffname");
+    } elsif ($modifier_dbtype eq 'AnyDBM_File') {
+        tie(%diffbase, "AnyDBM_File", $diffname) or &print_error("(tie AnyDBM_File) $diffname");
+	} elsif ($modifier_dbtype eq 'Cassandra::CassHash') {
+		#use cassandra
+        tie(%diffbase, "Cassandra::CassHash","localhost",9161,"Keyspace1","Standard1","yukiwiki4") or &print_error("(tie Cassandra::CassHash) $diffname");
+    } else {
+        tie(%diffbase, "Yuki::YukiWikiDB", $diffname) or &print_error("(tie Yuki::YukiWikiDB) $diffname");
+    }
+}
+
+sub close_diff {
+    if ($modifier_dbtype eq 'dbmopen') {
+        dbmclose(%diffbase);
+    } elsif ($modifier_dbtype eq 'AnyDBM_File') {
+        untie(%diffbase);
+    } else {
+        untie(%diffbase);
+    }
+}
+
+sub print_searchform {
+    my ($word) = @_;
+    print <<"EOD";
+<form action="$url_cgi" method="get">
+    <input type="hidden" name="mycmd" value="search">
+    <input type="text" name="mymsg" value="$word" size="20">
+    <input type="submit" value="$resource{searchbutton}">
+</form>
+EOD
+}
+
+sub print_editform {
+    my ($mymsg, $conflictchecker, %mode) = @_;
+    my $frozen = &is_frozen($form{mypage});
+
+    if ($form{mypreview}) {
+        if ($form{mymsg}) {
+            unless ($mode{conflict}) {
+                print qq(<h3>$resource{previewtitle}</h3>\n);
+                print qq($resource{previewnotice}\n);
+                print qq(<div class="preview">\n);
+                &print_content($form{mymsg});
+                print qq(</div>\n);
+            }
+        } else {
+            print qq($resource{previewempty});
+        }
+        $mymsg = &escape($form{mymsg});
+    } else {
+        $mymsg = &escape($mymsg);
+    }
+
+    my $edit = $mode{admin} ? 'adminedit' : 'edit';
+    my $escapedmypage = &escape($form{mypage});
+    my $escapedmypassword = &escape($form{mypassword});
+
+    print <<"EOD";
+<form action="$url_cgi" method="post">
+    @{[ $mode{admin} ? qq($resource{frozenpassword} <input type="password" name="mypassword" value="$escapedmypassword" size="10"><br>) : "" ]}
+    <input type="hidden" name="myConflictChecker" value="$conflictchecker">
+    <input type="hidden" name="mypage" value="$escapedmypage">
+    <textarea cols="$cols" rows="$rows" name="mymsg">
+$mymsg</textarea><br>
+@{[
+    $mode{admin} ?
+    qq(
+    <input type="radio" name="myfrozen" value="1" @{[$frozen ? qq(checked="checked") : ""]}>$resource{frozenbutton}
+    <input type="radio" name="myfrozen" value="0" @{[$frozen ? "" : qq(checked="checked")]}>$resource{notfrozenbutton}<br>)
+    : ""
+]}
+@{[
+    $mode{conflict} ? "" :
+    qq(
+        <input type="checkbox" name="mytouch" value="on" checked="checked">$resource{touch}<br>
+        <input type="submit" name="mypreview_$edit" value="$resource{previewbutton}">
+        <input type="submit" name="mypreview_write" value="$resource{savebutton}"><br>
+    )
+]}
+</form>
+EOD
+    unless ($mode{conflict}) {
+        # Show the format rule.
+        open(FILE, $file_format) or &print_error("($file_format)");
+        my $content = join('', <FILE>);
+        &code_convert(\$content, $kanjicode);
+        close(FILE);
+        print &text_to_html($content, toc=>0);
+    }
+
+    unless ($mode{conflict}) {
+        # Show plugin information.
+        my $plugin_usage = <<"EOD";
+*$resource{available_plugins}
+EOD
+        foreach my $usage (@{$plugin_manager->usage}) {
+            $plugin_usage .= <<"EOD";
+** $usage->{name}
+---(
+$resource{plugin_usage_name}: $usage->{name}
+$resource{plugin_usage_version}: $usage->{version}
+$resource{plugin_usage_author}: $usage->{author}
+$resource{plugin_usage_syntax}: $usage->{syntax}
+$resource{plugin_usage_description}: $usage->{description}
+$resource{plugin_usage_example}: $usage->{example}
+---)
+EOD
+        }
+        &code_convert(\$plugin_usage, $kanjicode);
+        print &text_to_html($plugin_usage, toc=>0);
+    }
+}
+
+sub print_passwordform {
+        print <<"EOD";
+<form action="$url_cgi" method="post">
+    <input type="hidden" name="mycmd" value="adminchangepassword">
+    $resource{oldpassword} <input type="password" name="myoldpassword" size="10"><br>
+    $resource{newpassword} <input type="password" name="mynewpassword" size="10"><br>
+    $resource{newpassword2} <input type="password" name="mynewpassword2" size="10"><br>
+    <input type="submit" value="$resource{changepasswordbutton}"><br>
+</form>
+EOD
+}
+
+sub is_editable {
+    my ($page) = @_;
+    if (&is_bracket_name($page)) {
+        return 0;
+    } elsif ($fixedpage{$page}) {
+        return 0;
+    } elsif ($page =~ /\s/) {
+        return 0;
+    } elsif ($page =~ /^\#/) {
+        return 0;
+    } elsif ($page =~ /^$interwiki_name$/) {
+        return 0;
+    } elsif (not $page) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+# armor_name:
+#   WikiName -> WikiName
+#   not_wiki_name -> [[not_wiki_name]]
+sub armor_name {
+    my ($name) = @_;
+    if ($name =~ /^$wiki_name$/) {
+        return $name;
+    } else {
+        return "[[$name]]";
+    }
+}
+
+# unarmor_name:
+#   [[bracket_name]] -> bracket_name
+#   WikiName -> WikiName
+sub unarmor_name {
+    my ($name) = @_;
+    if ($name =~ /^$bracket_name$/) {
+        return $1;
+    } else {
+        return $name;
+    }
+}
+
+sub is_bracket_name {
+    my ($name) = @_;
+    if ($name =~ /^$bracket_name$/) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+sub decode {
+    my ($s) = @_;
+    $s =~ tr/+/ /;
+    $s =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
+    return $s;
+}
+
+# Thanks to WalWiki for [better encode].
+sub encode {
+    my ($encoded) = @_;
+    $encoded =~ s/(\W)/'%' . unpack('H2', $1)/eg;
+    return $encoded;
+}
+
+sub init_resource {
+    open(FILE, $file_resource) or &print_error("(resource)");
+    while (<FILE>) {
+        chomp;
+        next if /^#/;
+        my ($key, $value) = split(/=/, $_, 2);
+        $resource{$key} = &code_convert(\$value, $kanjicode);
+    }
+    close(FILE);
+}
+
+sub conflict {
+    my ($page, $rawmsg) = @_;
+    if ($form{myConflictChecker} eq &get_info($page, $info_ConflictChecker)) {
+        return 0;
+    }
+    open(FILE, $file_conflict) or &print_error("(conflict)");
+    my $content = join('', <FILE>);
+    &code_convert(\$content, $kanjicode);
+    close(FILE);
+    &print_header($page);
+    &print_content($content);
+    &print_editform($rawmsg, $form{myConflictChecker}, frozen=>0, conflict=>1);
+    &print_footer($page);
+    return 1;
+}
+
+sub get_now {
+    my (@week) = qw(Sun Mon Tue Wed Thu Fri Sat);
+    my ($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);
+    $year += 1900;
+    $mon++;
+    $mon = "0$mon" if $mon < 10;
+    $day = "0$day" if $day < 10;
+    $hour = "0$hour" if $hour < 10;
+    $min = "0$min" if $min < 10;
+    $sec = "0$sec" if $sec < 10;
+    $weekday = $week[$weekday];
+    return "$year-$mon-$day ($weekday) $hour:$min:$sec";
+}
+
+# [[YukiWiki http://www.hyuki.com/yukiwiki/wiki.cgi?euc($1)]]
+sub init_InterWikiName {
+    my $content = $database{$InterWikiName};
+    while ($content =~ /\[\[(\S+) +(\S+)\]\]/g) {
+        my ($name, $url) = ($1, $2);
+        $interwiki{$name} = $url;
+    }
+}
+
+sub interwiki_convert {
+    my ($type, $localname) = @_;
+    if ($type eq 'sjis' or $type eq 'euc') {
+        &code_convert(\$localname, $type);
+        return &encode($localname);
+    } elsif ($type eq 'ykwk') {
+        # for YukiWiki1
+        if ($localname =~ /^$wiki_name$/) {
+            return $localname;
+        } else {
+            &code_convert(\$localname, 'sjis');
+            return &encode("[[" . $localname . "]]");
+        }
+    } elsif ($type eq 'asis') {
+        return $localname;
+    } else {
+        return $localname;
+    }
+}
+
+sub get_info {
+    my ($page, $key) = @_;
+    my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page});
+    return $info{$key};
+}
+
+sub set_info {
+    my ($page, $key, $value) = @_;
+    my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page});
+    $info{$key} = $value;
+    my $s = '';
+    for (keys %info) {
+        $s .= "$_=$info{$_}\n";
+    }
+    $infobase{$page} = $s;
+}
+
+sub frozen_reject {
+    my ($isfrozen) = &get_info($form{mypage}, $info_IsFrozen);
+    my ($willbefrozen) = $form{myfrozen};
+    if (not $isfrozen and not $willbefrozen) {
+        # You need no check.
+        return 0;
+    } elsif (valid_password($form{mypassword})) {
+        # You are admin.
+        return 0;
+    } else {
+        &print_error($resource{passworderror});
+        return 1;
+    }
+}
+
+sub length_reject {
+    if ($max_message_length < 0) {
+        return 0;
+    }
+    if ($max_message_length < length($form{mymsg})) {
+        &print_error($resource{toolongpost} . $max_message_length);
+        return 1;
+    }
+    return 0;
+}
+
+sub valid_password {
+    my ($givenpassword) = @_;
+    my ($validpassword_crypt) = &get_info($AdminSpecialPage, $info_AdminPassword);
+    if (crypt($givenpassword, $validpassword_crypt) eq $validpassword_crypt) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+sub is_frozen {
+    my ($page) = @_;
+    if (&get_info($page, $info_IsFrozen)) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+sub do_comment {
+    my ($content) = $database{$form{mypage}};
+    my $datestr = &get_now;
+    my $namestr = $form{myname} ? " ''[[$form{myname}]]'' : " : " ";
+    if ($content =~ s/(^|\n)(\Q$embed_comment\E)/$1- $datestr$namestr$form{mymsg}\n$2/) {
+        ;
+    } else {
+        $content =~ s/(^|\n)(\Q$embed_rcomment\E)/$1$2\n- $datestr$namestr$form{mymsg}/;
+    }
+    if ($form{mymsg}) {
+        $form{mymsg} = $content;
+        $form{mytouch} = 'on';
+        &do_write;
+    } else {
+        $form{mycmd} = 'read';
+        &do_read;
+    }
+}
+
+sub embedded_to_html {
+    my ($embedded) = @_;
+    my $escapedmypage = &escape($form{mypage});
+    if ($embedded eq $embed_comment or $embedded eq $embed_rcomment) {
+        my $conflictchecker = &get_info($form{mypage}, $info_ConflictChecker);
+        return <<"EOD";
+<form action="$url_cgi" method="post">
+    <input type="hidden" name="mycmd" value="comment">
+    <input type="hidden" name="mypage" value="$escapedmypage">
+    <input type="hidden" name="myConflictChecker" value="$conflictchecker">
+    <input type="hidden" name="mytouch" value="on">
+    $resource{yourname}
+    <input type="text" name="myname" value="" size="10">
+    <input type="text" name="mymsg" value="" size="40">
+    <input type="submit" value="$resource{commentbutton}">
+</form>
+EOD
+    } else {
+        return $embedded;
+    }
+}
+
+sub code_convert {
+    my ($contentref, $kanjicode) = @_;
+#   &Jcode::convert($contentref, $kanjicode);       # for Jcode.pm
+    &jcode::convert($contentref, $kanjicode);       # for jcode.pl
+    return $$contentref;
+}
+
+sub test_convert {
+    my $txt = &text_to_html(<<"EOD", toc=>1);
+*HEADER1
+**HEADER1-1
+-ITEM1
+-ITEM2
+-ITEM3
+PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+PAR1PAR1PAR1PAR1PAR1PAR1''BOLD''PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+
+PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2
+PAR2PAR2PAR2PAR2PAR2PAR2'''ITALIC'''PAR2PAR2PAR2PAR2PAR2PAR2PAR2
+PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2
+**HEADER1-2
+:TERM1:DESCRIPTION1 AND ''BOLD''
+PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+PAR1PAR1PAR1PAR1PAR1PAR1''BOLD''PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+:TERM2:DESCRIPTION2
+:TERM3:DESCRIPTION3
+----
+*HEADER2
+**HEADER2-1
+http://www.hyuki.com/
+**HEADER2-2
+
+[[YukiWiki2]]
+
+PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+PAR1PAR1PAR1PAR1PAR1PAR1'''''BOLD ITALIC'''''PAR1PAR1PAR1PAR1PAR1
+PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1
+>PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2
+>PAR2PAR2PAR2PAR2PAR2PAR2'''ITALIC'''PAR2PAR2PAR2PAR2PAR2PAR2PAR2
+>PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2
+
+LEVEL0LEVEL0LEVEL0LEVEL0LEVEL0LEVEL0LEVEL0
+
+>LEVEL1
+>LEVEL1
+>LEVEL1
+>>LEVEL2
+>>LEVEL2
+>>LEVEL2
+>>>LEVEL3
+-HELLO-1
+--HELLO-2
+(HELLO-2, HELLO-2, HELLO-2)
+---HELLO-3
+(HELLO-3, HELLO-3, HELLO-3)
+--HELLO-2
+---HELLO-3
+--HELLO-2
+---HELLO-3
+>>>LEVEL3
+>>>LEVEL3
+>>>LEVEL3
+>>>LEVEL3
+EOD
+    print $txt;
+    exit;
+}
+
+sub do_diff {
+    if (not &is_editable($form{mypage})) {
+        &do_read;
+        return;
+    }
+    &open_diff;
+    my $title = $form{mypage};
+    &print_header($title);
+    $_ = &escape($diffbase{$form{mypage}});
+    &close_diff;
+    print qq(<h3>$resource{difftitle}</h3>);
+    print qq($resource{diffnotice});
+    print qq(<pre class="diff">);
+    foreach (split(/\n/, $_)) {
+        if (/^\+(.*)/) {
+            print qq(<b class="added">$1</b>\n);
+        } elsif (/^\-(.*)/) {
+            print qq(<s class="deleted">$1</s>\n);
+        } elsif (/^\=(.*)/) {
+            print qq(<span class="same">$1</span>\n);
+        } else {
+            print qq|??? $_\n|;
+        }
+    }
+    print qq(</pre>);
+    print qq(<hr>);
+    &print_footer($title);
+}
+
+sub do_rss {
+    if ($file_rss) {
+        print <<"EOD";
+Status: 301 Moved Permanently
+Location: $modifier_rss_about
+
+EOD
+        return;
+    }
+}
+
+sub is_exist_page {
+    my ($name) = @_;
+    if ($use_exists) {
+        return exists($database{$name});
+    } else {
+        return $database{$name};
+    }
+}
+
+# sub check_modifiers {
+#     if ($error_AnyDBM_File and $modifier_dbtype eq 'AnyDBM_File') {
+#         &print_error($resource{anydbmfileerror});
+#     }
+# }
+
+# Initialize plugins.
+sub init_plugin {
+    $plugin_manager = new Yuki::PluginManager($plugin_context, $modifier_dir_plugin);
+}
+
+sub print_plugin_log {
+    if ($plugin_context->{debug}) {
+        print "<pre>(print_plugin_log)\n", join("\n", @{$plugin_manager->{log}}), "</pre>";
+    }
+}
+
+sub keyword_reject {
+    my $s = $form{mymsg};
+    my @reject_words = qw(
+buy-cheap.com
+ultram.online-buy.com
+    );
+    for (@reject_words) {
+        if ($s =~ /\Q$_\E/) {
+            &send_mail_to_admin($form{mypage}, "Rejectword: $_");
+            sleep(30);
+            return 1;
+        }
+    }
+    return 0;
+}
+
+# Thanks to Makio Tsukamoto for dc_date.
+sub update_rssfile {
+    my $rss = new Yuki::RSS(
+        version => '1.0',
+        encoding => $charset,
+    );
+    $rss->channel(
+        title => $modifier_rss_title,
+        link  => $modifier_rss_link,
+        about  => $modifier_rss_about,
+        description => $modifier_rss_description,
+    );
+    my $recentchanges = $database{$RecentChanges};
+    my $count = 0;
+    foreach (split(/\n/, $recentchanges)) {
+        last if ($count >= 15);
+        /^\- (\d\d\d\d\-\d\d\-\d\d) \(...\) (\d\d:\d\d:\d\d) (\S+)/;    # date format.
+        my $dc_date = "$1T$2$modifier_rss_timezone";
+        my $title = &unarmor_name($3);
+        my $escaped_title = &escape($title);
+        my $link = $modifier_rss_link . '?' . &encode($title);
+        my $description = $escaped_title . &escape(&get_subjectline($title));
+        $rss->add_item(
+            title => $escaped_title,
+            link  => $link,
+            description => $description,
+            dc_date => $dc_date,
+        );
+        $count++;
+    }
+    open(FILE, "> $file_rss") or &print_error("($file_rss)");
+    print FILE $rss->as_string;
+    close(FILE);
+}
+
+1;
+__END__
+=head1 NAME
+
+wiki.cgi - This is YukiWiki, yet another Wiki clone.
+
+=head1 DESCRIPTION
+
+YukiWiki is yet another Wiki clone.
+
+YukiWiki can treat Japanese WikiNames (enclosed with [[ and ]]).
+YukiWiki provides 'InterWiki' feature, RDF Site Summary (RSS),
+and some embedded commands (such as [[#comment]] to add comments).
+
+=head1 AUTHOR
+
+Hiroshi Yuki <hyuki@hyuki.com> http://www.hyuki.com/yukiwiki/
+
+=head1 LICENSE
+
+Copyright (C) 2000-2006 by Hiroshi Yuki.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wiki.css	Sun Jun 06 22:00:38 2010 +0900
@@ -0,0 +1,221 @@
+/*
+ * wiki.css
+ */
+
+body {
+    margin: .5em .5em .5em .5em;
+    color: black;
+    font-family: "Verdana";
+}
+
+body.normal {
+    background-color: white;
+}
+
+body.frozen {
+    background-color: #eee;
+}
+
+.preview {
+    color: black;
+    background-color: #fcc;
+}
+
+p, dl {
+    margin: 5pt;
+    padding: 5pt;
+}
+
+p, pre, ul, li, dl, dt, dd {
+    line-height: 140%;
+}
+
+dt {
+    font-weight: bold;
+}
+
+dd {
+    margin: 5pt;
+    padding: 5pt;
+}
+
+a {
+}
+
+a:hover {
+    color: red;
+    background-color: white;
+    text-decoration: underline;
+}
+
+a img {
+    border: none;
+}
+
+.tools {
+    margin: 1pt;
+    padding: 1pt;
+    text-align: right;
+}
+
+.header {
+    margin: 10pt 0 5pt 0;
+    padding: 5pt 5pt 5pt 5pt;
+    text-align: left;
+    /* border: #999 1px solid; */
+    color: black;
+    background-color: #ccf;
+}
+
+.footer {
+    font-style: normal;
+    text-align: right;
+}
+
+.InterWiki {
+    color: black;
+    background-color: #eee;
+}
+
+h2 {
+    margin: 10pt 0 5pt 0;
+    padding: 5pt 5pt 5pt 5pt;
+    text-align: left;
+    color: black;
+    background-color: #ccf;
+    /* border: #999 1px solid; */
+    
+}
+
+h3 {
+    margin: 10pt 0 5pt 0;
+    padding: 5pt 5pt 5pt 5pt;
+    text-align: left;
+    color: black;
+    border-left: #ccf 10pt solid;
+    border-bottom: #ccf 1pt solid;
+}
+
+h4 {
+    margin: 10pt 0 5pt 0;
+    padding: 5pt 5pt 5pt 5pt;
+    text-align: left;
+    color: black;
+    border-bottom: #ccf 1px solid;
+}
+
+.date {
+    font-family: monospace;
+}
+
+/* verbatim */
+pre.verbatim-hard {
+    margin: 5pt;
+    padding: 5pt;
+    background-color: #eef;
+    border: #ccf 1px solid;
+    padding: 1em 1em 1em 1em;
+}
+
+pre.verbatim-soft {
+    margin: 5pt;
+    padding: 5pt;
+    background-color: #eef;
+    border: #ccf 1px solid;
+}
+
+/* diff */
+.added {
+    color: blue;
+}
+
+.deleted {
+    color: red;
+}
+
+.same {
+    color: #666;
+}
+
+.diff {
+    color: black;
+    background-color: #eee;
+}
+
+/* table */
+table {
+    margin: 5pt;
+    padding: 5pt;
+    background-color: #ccf;
+}
+
+td {
+    margin: 1px;
+    padding: 5px;
+    background-color: #eef;
+}
+
+.error {
+}
+
+/*
+ * Styles for printer.
+ */
+
+@media print {
+    form {
+        display: none;
+    }
+
+    .header {
+        color: black;
+        border: none;
+        text-align: center;
+        /* font-size: large; */
+        margin-bottom: 1em;
+    }
+
+    h2 {
+        border: none;
+        border-bottom: #ccc 1px solid;
+        border-left: #ccc .5em solid;
+    }
+
+    h3 {
+        border: none;
+        border-bottom: #ccc 1px solid;
+    }
+
+    h4 {
+        border: none;
+    }
+
+    a:hover {
+        color: black;
+        text-decoration: none;
+    }
+
+    a {
+        text-decoration: none;
+    }
+
+    a.editlink {
+        display: none;
+    }
+
+    .footer {
+        display: none;
+    }
+
+    body {
+    }
+
+    .tools {
+        display: none;
+    }
+
+    p {
+        font-family: Serif;
+    }
+}
+