* Thread-safe (immutable). */ -class FileType { +class FileType implements Serializable { + private static final long serialVersionUID = 1L; private final String mimeType; private final Signature signature; private final String interestingFilesSetName; @@ -104,19 +106,20 @@ class FileType { String getFilesSetName() { return interestingFilesSetName; } - + @Override public String toString() { return this.mimeType; } - + @Override public boolean equals(Object other) { - if(other != null && other instanceof FileType) { + if (other != null && other instanceof FileType) { FileType that = (FileType) other; - if(this.getMimeType().equals(that.getMimeType()) && this.getSignature().equals(that.getSignature())) + if (this.getMimeType().equals(that.getMimeType()) && this.getSignature().equals(that.getSignature())) { return true; - } + } + } return false; } @@ -134,14 +137,16 @@ class FileType { *
* Thread-safe (immutable).
*/
- static class Signature {
-
+ static class Signature implements Serializable {
+
+ private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(Signature.class.getName());
/**
* The way the signature byte sequence should be interpreted.
*/
enum Type {
+
RAW, ASCII
};
@@ -156,8 +161,8 @@ class FileType {
*
* @param signatureBytes The signature bytes.
* @param offset The offset of the signature bytes.
- * @param type The type of data in the byte array. Impacts
- * how it is displayed to the user in the UI.
+ * @param type The type of data in the byte array. Impacts how
+ * it is displayed to the user in the UI.
*/
Signature(final byte[] signatureBytes, long offset, Type type) {
this.signatureBytes = Arrays.copyOf(signatureBytes, signatureBytes.length);
@@ -165,13 +170,13 @@ class FileType {
this.type = type;
this.isRelativeToStart = true;
}
-
+
/**
- * Creates a file signature consisting of an ASCII string at a
- * specific offset within a file.
+ * Creates a file signature consisting of an ASCII string at a specific
+ * offset within a file.
*
* @param signatureString The ASCII string
- * @param offset The offset of the signature bytes.
+ * @param offset The offset of the signature bytes.
*/
Signature(String signatureString, long offset) {
this.signatureBytes = signatureString.getBytes(StandardCharsets.US_ASCII);
@@ -179,12 +184,12 @@ class FileType {
this.type = Type.ASCII;
this.isRelativeToStart = true;
}
-
+
/**
* Creates a file signature consisting of a sequence of bytes at a
- * specific offset within a file. If bytes correspond to an ASCII
- * string, use one of the other constructors so that the string is
- * displayed to the user instead of the raw bytes.
+ * specific offset within a file. If bytes correspond to an ASCII
+ * string, use one of the other constructors so that the string is
+ * displayed to the user instead of the raw bytes.
*
* @param signatureBytes The signature bytes.
* @param offset The offset of the signature bytes.
@@ -195,16 +200,17 @@ class FileType {
this.type = Type.RAW;
this.isRelativeToStart = true;
}
-
+
/**
* Creates a file signature consisting of a sequence of bytes at a
* specific offset within a file.
*
- * @param signatureBytes The signature bytes.
- * @param offset The offset of the signature bytes.
- * @param type The type of data in the byte array. Impacts
- * how it is displayed to the user in the UI.
- * @param isRelativeToStart Determines whether this signature is relative to start.
+ * @param signatureBytes The signature bytes.
+ * @param offset The offset of the signature bytes.
+ * @param type The type of data in the byte array. Impacts
+ * how it is displayed to the user in the UI.
+ * @param isRelativeToStart Determines whether this signature is
+ * relative to start.
*/
Signature(final byte[] signatureBytes, long offset, Type type, boolean isRelativeToStart) {
this.signatureBytes = Arrays.copyOf(signatureBytes, signatureBytes.length);
@@ -212,14 +218,15 @@ class FileType {
this.type = type;
this.isRelativeToStart = isRelativeToStart;
}
-
+
/**
- * Creates a file signature consisting of an ASCII string at a
- * specific offset within a file.
+ * Creates a file signature consisting of an ASCII string at a specific
+ * offset within a file.
*
- * @param signatureString The ASCII string
- * @param offset The offset of the signature bytes.
- * @param isRelativeToStart Determines whether this signature is relative to start.
+ * @param signatureString The ASCII string
+ * @param offset The offset of the signature bytes.
+ * @param isRelativeToStart Determines whether this signature is
+ * relative to start.
*/
Signature(String signatureString, long offset, boolean isRelativeToStart) {
this.signatureBytes = signatureString.getBytes(StandardCharsets.US_ASCII);
@@ -227,16 +234,17 @@ class FileType {
this.type = Type.ASCII;
this.isRelativeToStart = isRelativeToStart;
}
-
+
/**
* Creates a file signature consisting of a sequence of bytes at a
- * specific offset within a file. If bytes correspond to an ASCII
- * string, use one of the other constructors so that the string is
- * displayed to the user instead of the raw bytes.
+ * specific offset within a file. If bytes correspond to an ASCII
+ * string, use one of the other constructors so that the string is
+ * displayed to the user instead of the raw bytes.
*
- * @param signatureBytes The signature bytes.
- * @param offset The offset of the signature bytes.
- * @param isRelativeToStart Determines whether this signature is relative to start.
+ * @param signatureBytes The signature bytes.
+ * @param offset The offset of the signature bytes.
+ * @param isRelativeToStart Determines whether this signature is
+ * relative to start.
*/
Signature(final byte[] signatureBytes, long offset, boolean isRelativeToStart) {
this.signatureBytes = Arrays.copyOf(signatureBytes, signatureBytes.length);
@@ -271,7 +279,7 @@ class FileType {
Type getType() {
return type;
}
-
+
boolean isRelativeToStart() {
return isRelativeToStart;
}
@@ -285,12 +293,13 @@ class FileType {
* @return True or false.
*/
boolean containedIn(final AbstractFile file) {
- if(offset >= file.getSize()) {
+ if (offset >= file.getSize()) {
return false; // File is too small, offset lies outside file.
}
long actualOffset = offset;
- if(!isRelativeToStart)
+ if (!isRelativeToStart) {
actualOffset = file.getSize() - 1 - offset;
+ }
if (file.getSize() < (actualOffset + signatureBytes.length)) {
return false; /// too small, can't contain this signature
}
@@ -308,15 +317,16 @@ class FileType {
return false;
}
}
-
+
@Override
public boolean equals(Object other) {
if (other != null && other instanceof Signature) {
Signature that = (Signature) other;
- if(Arrays.equals(this.getSignatureBytes(), that.getSignatureBytes())
+ if (Arrays.equals(this.getSignatureBytes(), that.getSignatureBytes())
&& this.getOffset() == that.getOffset()
- && this.getType().equals(that.getType()))
+ && this.getType().equals(that.getType())) {
return true;
+ }
}
return false;
}
diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java
index e6e8269ac9..0546a01f01 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java
@@ -133,48 +133,20 @@ public class FileTypeDetector {
* Gets the MIME type of a file, detecting it if it is not already known. If
* detection is necessary, the result is added to the case database.
*
- * IMPORTANT: This method should not be called except by ingest modules; all
+ * IMPORTANT: This method should only be called by ingest modules. All
* other clients should call AbstractFile.getMIMEType, and may call
* FileTypeDetector.detect, if AbstractFile.getMIMEType returns null.
*
* @param file The file.
*
- * @return A MIME type name.
+ * @return A MIME type name. If file type could not be detected or results
+ * were uncertain, octet-stream is returned.
*
* @throws TskCoreException if detection is required and there is a problem
* writing the result to the case database.
*/
- @SuppressWarnings("deprecation")
public String getFileType(AbstractFile file) throws TskCoreException {
- String mimeType = file.getMIMEType();
- if (null != mimeType) {
- return mimeType;
- }
-
- mimeType = detect(file);
- Case.getCurrentCase().getSleuthkitCase().setFileMIMEType(file, mimeType);
-
- /*
- * Add the file type attribute to the general info artifact. Note that
- * no property change is fired for this blackboard posting because
- * general info artifacts are different from other artifacts, e.g., they
- * are not displayed in the results tree.
- *
- * SPECIAL NOTE: Adding a file type attribute to the general info
- * artifact is meant to be replaced by the use of the MIME type field of
- * the AbstractFile class (tsk_files.mime_type in the case database).
- * The attribute is still added here to support backward compatibility,
- * but it introduces a check-then-act race condition that can lead to
- * duplicate attributes. Various mitigation strategies were considered.
- * It was decided to go with the policy that this method would not be
- * called outside of ingest (see note in method docs), at least until
- * such time as the attribute is no longer created.
- */
- BlackboardArtifact getInfoArt = file.getGenInfoArtifact();
- BlackboardAttribute batt = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_FILE_TYPE_SIG, FileTypeIdModuleFactory.getModuleName(), mimeType);
- getInfoArt.addAttribute(batt);
-
- return mimeType;
+ return detect(file, true);
}
/**
@@ -186,9 +158,39 @@ public class FileTypeDetector {
* @return A MIME type name. If file type could not be detected or results
* were uncertain, octet-stream is returned.
*
- * @throws TskCoreException
+ * @throws TskCoreException If there is a problem writing the result to the
+ * case database.
*/
public String detect(AbstractFile file) throws TskCoreException {
+ return detect(file, false);
+ }
+
+ /**
+ * Detects the MIME type of a file. The result is saved to the case database
+ * only if the add to case dastabase flag is set.
+ *
+ * @param file The file to test.
+ * @param addToCaseDb Whether the MIME type should be added to the case
+ * database. This flag is part of a partial workaround
+ * for a check-then-act-race condition (see notes in
+ * comments for details).
+ *
+ * @return A MIME type name. If file type could not be detected or results
+ * were uncertain, octet-stream is returned.
+ *
+ * @throws TskCoreException If there is a problem writing the result to the
+ * case database.
+ */
+ private String detect(AbstractFile file, boolean addToCaseDb) throws TskCoreException {
+ /*
+ * Check to see if the file has already been typed. This is the "check"
+ * part of a check-then-act race condition (see note below).
+ */
+ String mimeType = file.getMIMEType();
+ if (null != mimeType) {
+ return mimeType;
+ }
+
/*
* Mark non-regular files (refer to TskData.TSK_FS_META_TYPE_ENUM),
* zero-sized files, unallocated space, and unused blocks (refer to
@@ -198,18 +200,21 @@ public class FileTypeDetector {
|| (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)
|| (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS)
|| (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.VIRTUAL_DIR)) {
- return MimeTypes.OCTET_STREAM;
+ mimeType = MimeTypes.OCTET_STREAM;
}
/*
- * Give precedence to user-defined types.
+ * If the file is a regular file, give precedence to user-defined types.
+ */
+ if (null == mimeType) {
+ mimeType = detectUserDefinedType(file, addToCaseDb);
+ }
+
+ /*
+ * If the file does not match a user-defined type, send the initial
+ * bytes to Tika.
*/
- String mimeType = detectUserDefinedType(file);
if (null == mimeType) {
- /*
- * The file does not match a user-defined type. Send the initial
- * bytes to Tika.
- */
try {
byte buf[];
int len = file.read(buffer, 0, BUFFER_SIZE);
@@ -237,25 +242,63 @@ public class FileTypeDetector {
mimeType = MimeTypes.OCTET_STREAM;
}
}
+
+ /*
+ * If adding the result to the case database, do so now.
+ *
+ * NOTE: This condtional is a way to deal with the check-then-act race
+ * condition created by the gap between querying the MIME type and
+ * recording it. It is not really a problem for the mime_type column of
+ * the tsk_files table, but it can lead to duplicate blackboard posts,
+ * and the posts are required to maintain backward compatibility.
+ * Various mitigation strategies were considered. It was decided to go
+ * with the policy that only ingest modules are allowed to add file
+ * types to the case database, at least until such time as file types
+ * are no longer posted to the blackboard. Of course, this is not a
+ * perfect solution. It's not really enforceable for community
+ * contributed plug ins and it does not handle the unlikely but possible
+ * scenario of multiple processes typing the same file for a multi-user
+ * case.
+ */
+ if (addToCaseDb) {
+ /*
+ * Add the MIME type to the files table in the case database.
+ */
+ Case.getCurrentCase().getSleuthkitCase().setFileMIMEType(file, mimeType);
+
+ /*
+ * Post to the blackboard, adding the file type attribute to the
+ * general info artifact. A property change is not fired for this
+ * posting because general info artifacts are different from other
+ * artifacts, e.g., they are not displayed in the results tree.
+ */
+ BlackboardArtifact getInfoArt = file.getGenInfoArtifact();
+ @SuppressWarnings("deprecation")
+ BlackboardAttribute batt = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_FILE_TYPE_SIG, FileTypeIdModuleFactory.getModuleName(), mimeType);
+ getInfoArt.addAttribute(batt);
+ }
+
return mimeType;
}
/**
* Determines whether or not the a file matches a user-defined or Autopsy
- * predefined file type. If a match is found and the file type definition
- * calls for an alert on a match, an interesting file hit artifact is posted
- * to the blackboard.
+ * predefined file type. If postToBlackBoard is true, and a match is found,
+ * and the file type definition calls for an alert on a match, an
+ * interesting file hit artifact is posted to the blackboard.
*
- * @param file The file to test.
+ * @param file The file to test.
+ * @param postToBlackBoard Whether an interesting file hit could be posted
+ * to the blackboard.
*
* @return The file type name string or null, if no match is detected.
*
* @throws TskCoreException
*/
- private String detectUserDefinedType(AbstractFile file) throws TskCoreException {
+ private String detectUserDefinedType(AbstractFile file, boolean postToBlackBoard) throws TskCoreException {
for (FileType fileType : userDefinedFileTypes) {
if (fileType.matches(file)) {
- if (fileType.alertOnMatch()) {
+ if (postToBlackBoard && fileType.alertOnMatch()) {
/*
* Create an interesting file hit artifact.
*/
diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java
index 8f2dbaabca..6ae8404c13 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java
@@ -19,7 +19,9 @@
package org.sleuthkit.autopsy.modules.filetypeid;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Path;
@@ -27,6 +29,7 @@ import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
+import javax.persistence.PersistenceException;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -34,10 +37,13 @@ import org.w3c.dom.NodeList;
import javax.xml.bind.DatatypeConverter;
import javax.xml.transform.TransformerException;
import org.openide.util.NbBundle;
+import org.openide.util.io.NbObjectInputStream;
+import org.openide.util.io.NbObjectOutputStream;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
import org.sleuthkit.autopsy.coreutils.XMLUtil;
import org.sleuthkit.autopsy.modules.filetypeid.FileType.Signature;
+import org.sleuthkit.datamodel.TskCoreException;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
@@ -59,7 +65,8 @@ import org.xml.sax.SAXException;
final class UserDefinedFileTypesManager {
private static final Logger logger = Logger.getLogger(UserDefinedFileTypesManager.class.getName());
- private static final String USER_DEFINED_TYPE_DEFINITIONS_FILE = "UserFileTypeDefinitions.xml"; //NON-NLS
+ private static final String USER_DEFINED_TYPES_XML_FILE = "UserFileTypeDefinitions.xml"; //NON-NLS
+ private static final String USER_DEFINED_TYPES_SERIALIZATION_FILE = "UserFileTypeDefinitions.settings";
private static final String FILE_TYPES_TAG_NAME = "FileTypes"; //NON-NLS
private static final String FILE_TYPE_TAG_NAME = "FileType"; //NON-NLS
private static final String MIME_TYPE_TAG_NAME = "MimeType"; //NON-NLS
@@ -246,12 +253,19 @@ final class UserDefinedFileTypesManager {
*/
private void loadUserDefinedFileTypes() throws UserDefinedFileTypesException {
try {
- String filePath = getFileTypeDefinitionsFilePath(USER_DEFINED_TYPE_DEFINITIONS_FILE);
- File file = new File(filePath);
- if (file.exists() && file.canRead()) {
- for (FileType fileType : XmlReader.readFileTypes(filePath)) {
+ File serialized = new File(getFileTypeDefinitionsFilePath(USER_DEFINED_TYPES_SERIALIZATION_FILE));
+ if (serialized.exists()) {
+ for (FileType fileType : readFileTypesSerialized()) {
addUserDefinedFileType(fileType);
}
+ } else {
+ String filePath = getFileTypeDefinitionsFilePath(USER_DEFINED_TYPES_XML_FILE);
+ File xmlFile = new File(filePath);
+ if (xmlFile.exists()) {
+ for (FileType fileType : XMLDefinitionsReader.readFileTypes(filePath)) {
+ addUserDefinedFileType(fileType);
+ }
+ }
}
} catch (IOException | ParserConfigurationException | SAXException ex) {
@@ -282,14 +296,8 @@ final class UserDefinedFileTypesManager {
* types.
*/
synchronized void setUserDefinedFileTypes(List\u30A4\u30E1\u30FC\u30B8\u60C5\u5831\uFF1A
-ReportHTML.writeSum.timezone=\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF1A
-ReportProgressPanel.progress.queuing=\u30AD\u30E5\u30FC\u30A4\u30F3\u30B0\u2026
-ReportProgressPanel.initPathLabel.noFile=\u30EC\u30DD\u30FC\u30C8\u30D5\u30A1\u30A4\u30EB\u7121\u3057
-ReportProgressPanel.start.progress.text=\u30EC\u30DD\u30FC\u30C8\u958B\u59CB\u4E2D\u2026
-ReportProgressPanel.cancel.procLbl.text=\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F
-ReportVisualPanel1.getName.text=\u30EC\u30DD\u30FC\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u306E\u9078\u629E\u304A\u3088\u3073\u8A2D\u5B9A
-ReportVisualPanel2.getName.text=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30EC\u30DD\u30FC\u30C8\u3092\u8A2D\u5B9A
-ReportWizardFileOptionsPanel.finishButton.text=\u7D42\u4E86
-ReportWizardFileOptionsVisualPanel.getName.text=\u30D5\u30A1\u30A4\u30EB\u30EC\u30DD\u30FC\u30C8\u3092\u8A2D\u5B9A
-ReportWizardPanel1.finishButton.text=\u7D42\u4E86
-ReportWizardPanel2.finishButton.text=\u7D42\u4E86
-ReportHTML.writeSum.reportGenOn.text={0}\u306BHTML\u30EC\u30DD\u30FC\u30C8\u306F\u751F\u6210\u3055\u308C\u307E\u3057\u305F
-ReportHTML.writeSum.noCaseNum=\u30B1\u30FC\u30B9\u756A\u53F7\u304C\u3042\u308A\u307E\u305B\u3093
-ReportGenerator.errors.reportErrorTitle=\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
-ReportGenerator.errors.reportErrorText=\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A
-ReportKML.getDesc.text=\u95A2\u9023\u30D5\u30A1\u30A4\u30EB\u306E\u5EA7\u6A19\u3092\u542B\u3080KML\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306E\u30EC\u30DD\u30FC\u30C8\u3002\u3053\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306FGoogle Earth\u30D3\u30E5\u30FC\u306B\u4F7F\u7528\u3067\u304D\u307E\u3059\u3002
+ReportGenerator.artTableColHdr.msgType=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7
+ReportGenerator.artTableColHdr.latitude=\u7def\u5ea6
+ReportGenerator.artTableColHdr.longitude=\u7d4c\u5ea6
+ReportGenerator.artTableColHdr.dateTaken=\u64ae\u5f71\u65e5\u4ed8
+ReportGenerator.artTableColHdr.subject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
+ReportGenerator.artTableColHdr.calendarEntryType=\u30ab\u30ec\u30f3\u30c0\u30fc\u30a8\u30f3\u30c8\u30ea\u30bf\u30a4\u30d7
+ReportGenerator.artTableColHdr.description=\u8aac\u660e
+ReportGenerator.artTableColHdr.startDateTime=\u958b\u59cb\u65e5\u4ed8\uff0f\u6642\u523b
+ReportGenerator.artTableColHdr.shortCut=\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8
+ReportGenerator.artTableColHdr.endDateTime=\u4fee\u4e86\u65e5\u4ed8\uff0f\u6642\u523b
+ReportGenerator.artTableColHdr.location=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3
+ReportGenerator.artTableColHdr.deviceName=\u6a5f\u5668\u540d
+ReportGenerator.artTableColHdr.deviceAddress=\u6a5f\u5668\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.altitude=\u6a19\u9ad8
+ReportGenerator.artTableColHdr.locationAddress=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.category=\u30ab\u30c6\u30b4\u30ea\u30fc
+ReportGenerator.artTableColHdr.userId=\u30e6\u30fc\u30b6ID
+ReportGenerator.artTableColHdr.password=\u30d1\u30b9\u30ef\u30fc\u30c9
+ReportGenerator.artTableColHdr.replytoAddress=\u8fd4\u4fe1\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.mailServer=\u30e1\u30fc\u30eb\u30b5\u30fc\u30d0
+ReportGenerator.artTableColHdr.tags=\u30bf\u30b0
+ReportHTML.addThumbRows.dataType.title=\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30a4\u30e1\u30fc\u30b8 - {0}
+ReportHTML.addThumbRows.dataType.msg=\u30a4\u30e1\u30fc\u30b8\u3092\u542b\u3080\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u7d50\u679c\u304a\u3088\u3073\u30b3\u30f3\u30c6\u30f3\u30c4\u3002
+ReportHTML.thumbLink.tags=\u30bf\u30b0\uff1a
+ReportHTML.getName.text=\u7d50\u679c - HTML
+ReportHTML.getDesc.text=HTML\u5f62\u5f0f\u306e\u7d50\u679c\u304a\u3088\u3073\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30a2\u30a4\u30c6\u30e0\u306e\u30ec\u30dd\u30fc\u30c8
+ReportHTML.writeIndex.title=\u30b1\u30fc\u30b9{0}\u306eAutopsy\u30ec\u30dd\u30fc\u30c8
+ReportHTML.writeNav.title=\u30ec\u30dd\u30fc\u30c8\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3
+ReportHTML.writeNav.h1=\u30ec\u30dd\u30fc\u30c8\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3
+ReportHTML.writeNav.summary=\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc
+ReportHTML.writeSum.title=\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc
+ReportHTML.writeSum.caseName=\u30b1\u30fc\u30b9\uff1a
+ReportHTML.writeSum.caseNum=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a
+ReportHTML.writeSum.examiner=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a
+ReportHTML.writeSum.numImages=\u30a4\u30e1\u30fc\u30b8\u6570\uff1a
+ReportHTML.writeSum.path=\u30d1\u30b9\uff1a
+ReportProgressPanel.start.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
+ReportProgressPanel.complete.processLbl.text=\u5b8c\u4e86
+ReportProgressPanel.complete.cancelButton.text=\u5b8c\u4e86
+ReportProgressPanel.cancel.cancelButton.toolTipText=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f
+ReportWizardAction.actionName.text=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
+ReportWizardAction.reportWiz.title=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
+ReportWizardAction.toolBarButton.text=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
+ReportWizardPanel1.nextButton.text=\u6b21 >
+ReportWizardPanel2.nextButton.text=\u6b21 >
+ReportGenerator.artTableColHdr.direction=\u65b9\u5411
+ReportGenerator.artTableColHdr.fromEmail=\u9001\u4fe1\u5143E\u30e1\u30fc\u30eb
+ReportGenerator.artTableColHdr.toEmail=\u9001\u4fe1\u5148E\u30e1\u30fc\u30eb
+ReportGenerator.artTableColHdr.fromPhoneNum=\u767a\u4fe1\u8005\u96fb\u8a71\u756a\u53f7
+ReportGenerator.artTableColHdr.toPhoneNum=\u7740\u4fe1\u8005\u96fb\u8a71\u756a\u53f7
+ReportGenerator.artTableColHdr.appName=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u540d
+ReportGenerator.artTableColHdr.appPath=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d1\u30b9
+ReportHTML.writeIndex.noFrames.msg=\u4f7f\u7528\u3057\u3066\u3044\u308b\u30d6\u30e9\u30a6\u30b6\u306f\u5f0a\u793e\u306e\u30d5\u30ec\u30fc\u30e0\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3068\u306e\u4e92\u63db\u6027\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+ReportHTML.writeIndex.noFrames.seeNav=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ea\u30f3\u30af\u306f\u4e0b\u8a18\u306e\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30da\u30fc\u30b8\u3092\u3054\u89a7\u4e0b\u3055\u3044
+ReportHTML.writeIndex.seeSum=\u307e\u305f\u3001\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc\u306f\u4e0b\u8a18\u306e\u30b5\u30de\u30ea\u30fc\u30da\u30fc\u30b8\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002
+ReportHTML.writeSum.warningMsg=\u8b66\u544a\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b5\u30fc\u30d3\u30b9\u304c\u5b8c\u4e86\u3059\u308b\u524d\u306b\u30ec\u30dd\u30fc\u30c8\u304c\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\uff01
+ReportHTML.writeSum.noExaminer=\u8abf\u67fb\u62c5\u5f53\u8005\u7121\u3057
+ReportHTML.writeSum.imageInfoHeading=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831\uff1a
+ReportHTML.writeSum.timezone=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\uff1a
+ReportProgressPanel.progress.queuing=\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0\u2026
+ReportProgressPanel.initPathLabel.noFile=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u7121\u3057
+ReportProgressPanel.start.progress.text=\u30ec\u30dd\u30fc\u30c8\u958b\u59cb\u4e2d\u2026
+ReportProgressPanel.cancel.procLbl.text=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f
+ReportVisualPanel1.getName.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u9078\u629e\u304a\u3088\u3073\u8a2d\u5b9a
+ReportVisualPanel2.getName.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u3092\u8a2d\u5b9a
+ReportWizardFileOptionsPanel.finishButton.text=\u7d42\u4e86
+ReportWizardFileOptionsVisualPanel.getName.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u3092\u8a2d\u5b9a
+ReportWizardPanel1.finishButton.text=\u7d42\u4e86
+ReportWizardPanel2.finishButton.text=\u7d42\u4e86
+ReportHTML.writeSum.reportGenOn.text={0}\u306bHTML\u30ec\u30dd\u30fc\u30c8\u306f\u751f\u6210\u3055\u308c\u307e\u3057\u305f
+ReportHTML.writeSum.noCaseNum=\u30b1\u30fc\u30b9\u756a\u53f7\u304c\u3042\u308a\u307e\u305b\u3093
+ReportGenerator.errors.reportErrorTitle=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ReportGenerator.errors.reportErrorText=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a
+ReportKML.getDesc.text=\u95a2\u9023\u30d5\u30a1\u30a4\u30eb\u306e\u5ea7\u6a19\u3092\u542b\u3080KML\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u30ec\u30dd\u30fc\u30c8\u3002\u3053\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306fGoogle Earth\u30d3\u30e5\u30fc\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002
ReportKML.getName.text=Google Earth/KML
-ReportKML.progress.loading=\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026
-ReportKML.progress.querying=\u30D5\u30A1\u30A4\u30EB\u306E\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u4E2D\u2026
-ReportBodyFile.generateReport.srcModuleName.text=TSK\u30DC\u30C7\u30A3\u30D5\u30A1\u30A4\u30EB
-ReportExcel.endReport.srcModuleName.text=Excel\u30EC\u30DD\u30FC\u30C8
-ReportGenerator.artTableColHdr.extension.text=\u62E1\u5F35\u5B50
-ReportGenerator.artTableColHdr.mimeType.text=MIME\u30BF\u30A4\u30D7
-ReportHTML.writeIndex.srcModuleName.text=HTML\u30EC\u30DD\u30FC\u30C8
-ReportKML.genReport.srcModuleName.text=KML\u30EC\u30DD\u30FC\u30C8
-ReportGenerator.artTableColHdr.associatedArtifact=\u95A2\u4FC2\u3059\u308B\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8
-ReportGenerator.artTableColHdr.count=\u30AB\u30A6\u30F3\u30C8
-ReportGenerator.artTableColHdr.devMake=\u6A5F\u5668\u578B\u540D
-ReportGenerator.artTableColHdr.latitudeEnd=\u5230\u7740\u7DEF\u5EA6
-ReportGenerator.artTableColHdr.latitudeStart=\u51FA\u767A\u7DEF\u5EA6
-ReportGenerator.artTableColHdr.localPath=\u30ED\u30FC\u30AB\u30EB\u30D1\u30B9
-ReportGenerator.artTableColHdr.longitudeEnd=\u5230\u7740\u7D4C\u5EA6
-ReportGenerator.artTableColHdr.longitudeStart=\u51FA\u767A\u7D4C\u5EA6
-ReportGenerator.artTableColHdr.osInstallDate.text=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u65E5\u4ED8
-ReportGenerator.artTableColHdr.osName.text=\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0\u30B7\u30B9\u30C6\u30E0\u540D
-ReportGenerator.artTableColHdr.processorArchitecture.text=\u30D7\u30ED\u30BB\u30C3\u30B5\u30A2\u30FC\u30AD\u30C6\u30AF\u30C1\u30E3
-ReportGenerator.artTableColHdr.readStatus=\u8AAD\u307F\u53D6\u308A\u4E2D\u30B9\u30C6\u30FC\u30BF\u30B9
-ReportGenerator.artTableColHdr.remotePath=\u30EA\u30E2\u30FC\u30C8\u30D1\u30B9
-ReportGenerator.artTableColHdr.tskDateTimeRcvd=\u53D7\u4FE1\u65E5
-ReportGenerator.artTableColHdr.tskDateTimeSent=\u9001\u4FE1\u65E5
+ReportKML.progress.loading=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u2026
+ReportKML.progress.querying=\u30d5\u30a1\u30a4\u30eb\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u2026
+ReportBodyFile.generateReport.srcModuleName.text=TSK\u30dc\u30c7\u30a3\u30d5\u30a1\u30a4\u30eb
+ReportExcel.endReport.srcModuleName.text=Excel\u30ec\u30dd\u30fc\u30c8
+ReportGenerator.artTableColHdr.extension.text=\u62e1\u5f35\u5b50
+ReportGenerator.artTableColHdr.mimeType.text=MIME\u30bf\u30a4\u30d7
+ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
+ReportKML.genReport.srcModuleName.text=KML\u30ec\u30dd\u30fc\u30c8
+ReportGenerator.artTableColHdr.associatedArtifact=\u95a2\u4fc2\u3059\u308b\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
+ReportGenerator.artTableColHdr.count=\u30ab\u30a6\u30f3\u30c8
+ReportGenerator.artTableColHdr.devMake=\u6a5f\u5668\u578b\u540d
+ReportGenerator.artTableColHdr.latitudeEnd=\u5230\u7740\u7def\u5ea6
+ReportGenerator.artTableColHdr.latitudeStart=\u51fa\u767a\u7def\u5ea6
+ReportGenerator.artTableColHdr.localPath=\u30ed\u30fc\u30ab\u30eb\u30d1\u30b9
+ReportGenerator.artTableColHdr.longitudeEnd=\u5230\u7740\u7d4c\u5ea6
+ReportGenerator.artTableColHdr.longitudeStart=\u51fa\u767a\u7d4c\u5ea6
+ReportGenerator.artTableColHdr.osInstallDate.text=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5\u4ed8
+ReportGenerator.artTableColHdr.osName.text=\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u540d
+ReportGenerator.artTableColHdr.processorArchitecture.text=\u30d7\u30ed\u30bb\u30c3\u30b5\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3
+ReportGenerator.artTableColHdr.readStatus=\u8aad\u307f\u53d6\u308a\u4e2d\u30b9\u30c6\u30fc\u30bf\u30b9
+ReportGenerator.artTableColHdr.remotePath=\u30ea\u30e2\u30fc\u30c8\u30d1\u30b9
+ReportGenerator.artTableColHdr.tskDateTimeRcvd=\u53d7\u4fe1\u65e5
+ReportGenerator.artTableColHdr.tskDateTimeSent=\u9001\u4fe1\u65e5
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
-ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail\u9001\u4FE1\u5143
-ReportGenerator.artTableColHdr.tskEmailTo=E-Mail\u9001\u4FE1\u5148
-ReportGenerator.artTableColHdr.tskGpsRouteCategory=\u30AB\u30C6\u30B4\u30EA
-ReportGenerator.artTableColHdr.tskInterestingFilesCategory=\u30EB\u30FC\u30EB
-ReportGenerator.artTableColHdr.tskMsgId=\u30E1\u30C3\u30BB\u30FC\u30B8ID
-ReportGenerator.artTableColHdr.tskPath=\u30D1\u30B9
-ReportGenerator.artTableColHdr.tskSetName=\u30BB\u30C3\u30C8\u540D
-ReportGenerator.artTableColHdr.tskSubject=\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8
-ReportGenerator.artTableColHdr.urlDomainDecoded=URL\u30C9\u30E1\u30A4\u30F3
-ReportGenerator.artTableColHdr.userName=\u30E6\u30FC\u30B6\u540D
-ReportGenerator.errList.coreExceptionWhileGenRptRow=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30EC\u30DD\u30FC\u30C8\u7528\u30ED\u30FC\u30C7\u30FC\u30BF\u306E\u751F\u6210\u4E2D\u306B\u30B3\u30A2\u30A8\u30AF\u30BB\u30D7\u30B7\u30E7\u30F3\uFF08\u4F8B\u5916\uFF09\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F
-ReportGenerator.errList.errGetContentFromBBArtifact=Blackboard\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u304B\u3089\u30EC\u30DD\u30FC\u30C8\u7528\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u53D6\u5F97\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedGetAbstractFileByID=ID\u306B\u57FA\u3065\u304D\u30A2\u30D6\u30B9\u30C8\u30E9\u30AF\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3059\u308B\u306E\u3092\u5931\u6557\u3057\u307E\u3057\u305F
-ReportGenerator.errList.failedGetBBArtifacts=\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u4E2D\u306BBlackboard\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedGetBBArtifactTags=Blackboard\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30BF\u30B0\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedGetBBAttribs=\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u4E2D\u306BBlackboard\u5C5E\u6027\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedGetContentTags=\u30B3\u30F3\u30C6\u30F3\u30C4\u30BF\u30B0\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedMakeRptFolder=\u30EC\u30DD\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u304C\u3067\u304D\u306A\u3044\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
-ReportGenerator.errList.failedQueryHashsetHits=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u30D2\u30C3\u30C8\u3092\u30AF\u30A8\u30EA\u3059\u308B\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedQueryHashsetLists=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u30EA\u30B9\u30C8\u3092\u30AF\u30A8\u30EA\u3059\u308B\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedQueryKWLists=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u30AF\u30A8\u30EA\u3059\u308B\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.errList.failedQueryKWs=\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u30AF\u30A8\u30EA\u3059\u308B\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
-ReportGenerator.htmlOutput.header.comment=\u30B3\u30E1\u30F3\u30C8
-ReportGenerator.htmlOutput.header.file=\u30D5\u30A1\u30A4\u30EB
-ReportGenerator.htmlOutput.header.hash=\u30CF\u30C3\u30B7\u30E5
-ReportGenerator.htmlOutput.header.size=\u30B5\u30A4\u30BA\uFF08\u30D0\u30A4\u30C8\uFF09
-ReportGenerator.htmlOutput.header.tag=\u30BF\u30B0
-ReportGenerator.htmlOutput.header.timeAccessed=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642
-ReportGenerator.htmlOutput.header.timeChanged=\u5909\u66F4\u65E5\u6642
-ReportGenerator.htmlOutput.header.timeCreated=\u4F5C\u6210\u65E5\u6642
-ReportGenerator.htmlOutput.header.timeModified=\u4FEE\u6B63\u65E5\u6642
-ReportGenerator.notifyErr.errsDuringRptGen=\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u4E2D\u306E\u30A8\u30E9\u30FC\uFF1A
-ReportGenerator.errList.failedGetAbstractFileFromID=ID\u306B\u57FA\u3065\u304D\u30A2\u30D6\u30B9\u30C8\u30E9\u30AF\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3059\u308B\u306E\u3092\u5931\u6557\u3057\u307E\u3057\u305F
-ReportKML.getFilePath.text=\u30EC\u30DD\u30FC\u30C8KML.kml
-ReportVisualPanel1.invalidModuleWarning=\u7121\u52B9\u306A\u30EC\u30DD\u30FC\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB({0})\u306B\u906D\u9047\u3057\u307E\u3057\u305F
-ReportGenerationPanel.confDlg.cancelReport.msg=\u672C\u5F53\u306B\u30EC\u30DD\u30FC\u30C8\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059\u304B\uFF1F
-ReportProgressPanel.complete.processLb2.text=\u5B8C\u4E86\u3057\u307E\u3057\u305F\u304C\u3001\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
-ReportGenerationPanel.cancelButton.actionCommand=\u30AD\u30E3\u30F3\u30BB\u30EB
-ReportGenerationPanel.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB
\ No newline at end of file
+ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail\u9001\u4fe1\u5143
+ReportGenerator.artTableColHdr.tskEmailTo=E-Mail\u9001\u4fe1\u5148
+ReportGenerator.artTableColHdr.tskGpsRouteCategory=\u30ab\u30c6\u30b4\u30ea
+ReportGenerator.artTableColHdr.tskInterestingFilesCategory=\u30eb\u30fc\u30eb
+ReportGenerator.artTableColHdr.tskMsgId=\u30e1\u30c3\u30bb\u30fc\u30b8ID
+ReportGenerator.artTableColHdr.tskPath=\u30d1\u30b9
+ReportGenerator.artTableColHdr.tskSetName=\u30bb\u30c3\u30c8\u540d
+ReportGenerator.artTableColHdr.tskSubject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
+ReportGenerator.artTableColHdr.urlDomainDecoded=URL\u30c9\u30e1\u30a4\u30f3
+ReportGenerator.artTableColHdr.userName=\u30e6\u30fc\u30b6\u540d
+ReportGenerator.errList.coreExceptionWhileGenRptRow=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u7528\u30ed\u30fc\u30c7\u30fc\u30bf\u306e\u751f\u6210\u4e2d\u306b\u30b3\u30a2\u30a8\u30af\u30bb\u30d7\u30b7\u30e7\u30f3\uff08\u4f8b\u5916\uff09\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f
+ReportGenerator.errList.errGetContentFromBBArtifact=Blackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u304b\u3089\u30ec\u30dd\u30fc\u30c8\u7528\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedGetAbstractFileByID=ID\u306b\u57fa\u3065\u304d\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3059\u308b\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f
+ReportGenerator.errList.failedGetBBArtifacts=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306bBlackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedGetBBArtifactTags=Blackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedGetBBAttribs=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306bBlackboard\u5c5e\u6027\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedGetContentTags=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedMakeRptFolder=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u304c\u3067\u304d\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
+ReportGenerator.errList.failedQueryHashsetHits=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d2\u30c3\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryHashsetLists=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryKWLists=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryKWs=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.htmlOutput.header.comment=\u30b3\u30e1\u30f3\u30c8
+ReportGenerator.htmlOutput.header.file=\u30d5\u30a1\u30a4\u30eb
+ReportGenerator.htmlOutput.header.hash=\u30cf\u30c3\u30b7\u30e5
+ReportGenerator.htmlOutput.header.size=\u30b5\u30a4\u30ba\uff08\u30d0\u30a4\u30c8\uff09
+ReportGenerator.htmlOutput.header.tag=\u30bf\u30b0
+ReportGenerator.htmlOutput.header.timeAccessed=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
+ReportGenerator.htmlOutput.header.timeCreated=\u4f5c\u6210\u65e5\u6642
+ReportGenerator.htmlOutput.header.timeModified=\u4fee\u6b63\u65e5\u6642
+ReportGenerator.notifyErr.errsDuringRptGen=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306e\u30a8\u30e9\u30fc\uff1a
+ReportGenerator.errList.failedGetAbstractFileFromID=ID\u306b\u57fa\u3065\u304d\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3059\u308b\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f
+ReportKML.getFilePath.text=\u30ec\u30dd\u30fc\u30c8KML.kml
+ReportVisualPanel1.invalidModuleWarning=\u7121\u52b9\u306a\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb({0})\u306b\u906d\u9047\u3057\u307e\u3057\u305f
+ReportGenerationPanel.confDlg.cancelReport.msg=\u672c\u5f53\u306b\u30ec\u30dd\u30fc\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u304b\uff1f
+ReportProgressPanel.complete.processLb2.text=\u5b8c\u4e86\u3057\u307e\u3057\u305f\u304c\u3001\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
+ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
\ No newline at end of file
diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form b/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form
index f7da786aa4..86a4cbe37d 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form
@@ -26,22 +26,16 @@