public static int Execute( List<string> args )
        {
            if ( args.Count != 4 ) {
                Console.WriteLine( "Usage: LuxPainEvt_GraceNote event.evt NewDBFile GracesJapanese event.jp.evt" );
                return -1;
            }
            String Filename = args[0];
            String NewDB = args[1];
            String GracesDB = args[2];
            String JapaneseFilename = args[3];

            LuxPainEvt Evt;
            LuxPainEvt EvtJp;
            try {
                Evt = new LuxPainEvt( Filename );
                EvtJp = new LuxPainEvt( JapaneseFilename );
            } catch ( Exception ex ) {
                Console.WriteLine( ex.Message );
                Console.WriteLine( "Failed loading text file!" );
                return -1;
            }
            Evt.FormatTextForEditing();
            EvtJp.FormatTextForEditing();

            if ( Evt.TextEntries.Count != EvtJp.TextEntries.Count ) {
                Console.WriteLine( "Entry count over languages doesn't match, padding..." );

                while ( Evt.TextEntries.Count < EvtJp.TextEntries.Count ) {
                    LuxPainEvtText t = new LuxPainEvtText();
                    t.OffsetLocation = 0x7FFFFFFF;
                    t.Text = "[Entry does not exist in this language, this is just for completion's sake.]";
                    Evt.TextEntries.Add( t );
                }

                while ( Evt.TextEntries.Count > EvtJp.TextEntries.Count ) {
                    LuxPainEvtText t = new LuxPainEvtText();
                    t.OffsetLocation = 0x7FFFFFFF;
                    t.Text = "[Entry does not exist in this language, this is just for completion's sake.]";
                    EvtJp.TextEntries.Add( t );
                }

                if ( Evt.TextEntries.Count != EvtJp.TextEntries.Count ) { throw new Exception( "this shouldn't happen!" ); }
            }

            Console.WriteLine( "Found " + Evt.TextEntries.Count + " entries, importing..." );
            System.IO.File.WriteAllBytes( NewDB, Properties.Resources.gndb_template );

            List<GraceNoteDatabaseEntry> Entries = new List<GraceNoteDatabaseEntry>( Evt.TextEntries.Count );
            for ( int i = 0; i < Evt.TextEntries.Count; ++i ) {
                // fetch GracesJapanese ID or generate new & insert new text
                String EnPlusJp = Evt.TextEntries[i].Text + "\n\n" + EvtJp.TextEntries[i].Text;
                GraceNoteDatabaseEntry gn =
                    new GraceNoteDatabaseEntry( EnPlusJp, Evt.TextEntries[i].Text, "", 0, (int)Evt.TextEntries[i].OffsetLocation, "", 0 );
                Entries.Add( gn );
            }
            GraceNoteDatabaseEntry.InsertSQL( Entries.ToArray(), "Data Source=" + NewDB, "Data Source=" + GracesDB );
            Console.WriteLine( "Successfully imported entries!" );

            return 0;
        }
        public static int Execute( List<string> args )
        {
            if ( args.Count != 3 ) {
                Console.WriteLine( "Usage: GN_LPE Infile Outfile DB" );
                return -1;
            }

            //*
            String InFilename = args[0];
            String OutFilename = args[1];
            String DB = args[2];
            //String GracesDB = args[3];
            //*/

            /*
            String Filename = @"c:\Users\Georg\Downloads\Xillia Script files\69753.SDBJPN";
            String NewDB = @"c:\Users\Georg\Downloads\Xillia Script files\X69753";
            String TemplateDB = @"c:\Users\Georg\Downloads\Xillia Script files\XTemplate";
            String GracesDB = @"c:\Users\Georg\Downloads\Xillia Script files\GracesJapanese";
            //*/

            LuxPainEvt Evt;
            byte[] EvtFile;
            try {
                EvtFile = System.IO.File.ReadAllBytes( InFilename );
                Evt = new LuxPainEvt( EvtFile );
                Evt.GetSQL( "Data Source=" + DB );
            } catch ( Exception ex ) {
                Console.WriteLine( ex.Message );
                Console.WriteLine( "Failed loading menu file!" );
                return -1;
            }

            LuxPainEvt Evt2 = new LuxPainEvt( EvtFile );
            Evt.FormatTextForGameInserting();
            byte[] newtextblock = Evt.CreateTextBlock( 256 * 256 * 2 );

            List<byte> newEvtFile = new List<byte>( (int)Evt.Header.TextOffsetsLocation + newtextblock.Length );

            for ( uint i = 0; i < Evt.Header.TextOffsetsLocation; ++i ) {
                newEvtFile.Add( EvtFile[i] );
            }
            newEvtFile.AddRange( newtextblock );

            // replicating the weird behavoir that if the last entry ends with 0x8144, there's an additional 0x0000 after it, sometimes.
            // No idea if that's actually relevant but better be safe than sorry!
            if ( newEvtFile[newEvtFile.Count - 4] == 0x81 && newEvtFile[newEvtFile.Count - 3] == 0x44 ) {
                newEvtFile.Add( 0x00 );
                newEvtFile.Add( 0x00 );
            }

            System.IO.File.WriteAllBytes( OutFilename, newEvtFile.ToArray() );

            return 0;
        }