Autopsy
4.13.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
|
Inherits org.sleuthkit.autopsy.report.ReportModule.
Classes | |
class | GetImageTagCallback |
class | GetInterestingItemSetNamesCallback |
class | StoreMaxIdCallback |
Public Member Functions | |
PortableCaseReportModule () | |
void | generateReport (String reportPath, PortableCaseReportModuleSettings options, ReportProgressPanel progressPanel) |
default ReportModuleSettings | getConfiguration () |
default JPanel | getConfigurationPanel () |
default ReportModuleSettings | getDefaultConfiguration () |
String | getDescription () |
String | getName () |
String | getRelativeFilePath () |
default void | setConfiguration (ReportModuleSettings settings) |
Private Member Functions | |
void | addArtifactsToPortableCase (TagName oldTagName, ReportProgressPanel progressPanel) throws TskCoreException |
void | addFilesToPortableCase (TagName oldTagName, ReportProgressPanel progressPanel) throws TskCoreException |
void | addImageTagToPortableCase (ContentTag newContentTag, String appData) throws TskCoreException |
void | cleanup () |
void | closePortableCaseDatabase () |
boolean | compressCase (ReportProgressPanel progressPanel) |
BlackboardArtifact | copyArtifact (long newContentId, BlackboardArtifact artifactToCopy) throws TskCoreException |
long | copyContent (Content content) throws TskCoreException |
long | copyContentToPortableCase (Content content, ReportProgressPanel progressPanel) throws TskCoreException |
void | createCase (File outputDir, ReportProgressPanel progressPanel) |
List< String > | getAllInterestingItemsSets () throws NoCurrentCaseException, TskCoreException |
String | getExportSubfolder (AbstractFile abstractFile) |
String | getImageTagDataForContentTag (ContentTag tag) throws TskCoreException |
int | getNewArtifactTypeId (BlackboardArtifact oldArtifact) throws TskCoreException |
BlackboardAttribute.Type | getNewAttributeType (BlackboardAttribute oldAttribute) throws TskCoreException |
void | handleCancellation (ReportProgressPanel progressPanel) |
void | handleError (String logWarning, String dialogWarning, Exception ex, ReportProgressPanel progressPanel) |
void | initializeImageTags (ReportProgressPanel progressPanel) throws TskCoreException |
void | saveHighestIds () throws TskCoreException |
Static Private Member Functions | |
static File | locate7ZipExecutable () |
Private Attributes | |
File | caseFolder = null |
String | caseName = "" |
File | copiedFilesFolder = null |
Case | currentCase = null |
final Map< Long, Content > | newIdToContent = new HashMap<>() |
final Map< Long, BlackboardArtifact > | oldArtifactIdToNewArtifact = new HashMap<>() |
final Map< Integer, Integer > | oldArtTypeIdToNewArtTypeId = new HashMap<>() |
final Map< Integer, BlackboardAttribute.Type > | oldAttrTypeIdToNewAttrType = new HashMap<>() |
final Map< Long, Content > | oldIdToNewContent = new HashMap<>() |
final Map< TagName, TagName > | oldTagNameToNewTagName = new HashMap<>() |
SleuthkitCase | portableSkCase = null |
PortableCaseReportModuleSettings | settings |
Static Private Attributes | |
static final String | FILE_FOLDER_NAME = "PortableCaseFiles" |
static final List< FileTypeCategory > | FILE_TYPE_CATEGORIES |
static final Logger | logger = Logger.getLogger(PortableCaseReportModule.class.getName()) |
static final String | MAX_ID_TABLE_NAME = "portable_case_max_ids" |
static final String | UNKNOWN_FILE_TYPE_FOLDER = "Other" |
Creates a portable case from tagged files
Definition at line 71 of file PortableCaseReportModule.java.
org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.PortableCaseReportModule | ( | ) |
Definition at line 106 of file PortableCaseReportModule.java.
|
private |
Add all artifacts with a given tag to the portable case.
oldTagName | The TagName object from the current case |
progressPanel | The progress panel |
TskCoreException |
Definition at line 686 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.CANCELED, org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyArtifact(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContentToPortableCase(), org.sleuthkit.autopsy.casemodule.services.TagsManager.getBlackboardArtifactTagsByTagName(), org.sleuthkit.autopsy.casemodule.Case.getServices(), org.sleuthkit.autopsy.report.ReportProgressPanel.getStatus(), and org.sleuthkit.autopsy.casemodule.services.Services.getTagsManager().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
private |
Add all files with a given tag to the portable case.
oldTagName | The TagName object from the current case |
progressPanel | The progress panel |
TskCoreException |
Definition at line 580 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addImageTagToPortableCase(), org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.CANCELED, org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContentToPortableCase(), org.sleuthkit.autopsy.casemodule.services.TagsManager.getContentTagsByTagName(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getImageTagDataForContentTag(), org.sleuthkit.autopsy.casemodule.Case.getServices(), org.sleuthkit.autopsy.report.ReportProgressPanel.getStatus(), and org.sleuthkit.autopsy.casemodule.services.Services.getTagsManager().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
private |
Add an image tag to the portable case.
newContentTag | The content tag in the portable case |
appData | The string to copy into app_data |
TskCoreException |
Definition at line 672 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.casemodule.services.contentviewertags.ContentViewerTagManager.TABLE_NAME.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addFilesToPortableCase().
|
private |
Clear out the maps and other fields and close the database connections.
Definition at line 984 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.closePortableCaseDatabase(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.oldAttrTypeIdToNewAttrType.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.handleCancellation(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.handleError().
|
private |
Close the portable case
Definition at line 1002 of file PortableCaseReportModule.java.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.cleanup(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.compressCase().
|
private |
Definition at line 1053 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.CANCELED, org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.closePortableCaseDatabase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.getChunkSize(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.ChunkSize.getSevenZipParam(), org.sleuthkit.autopsy.report.ReportProgressPanel.getStatus(), org.sleuthkit.autopsy.casemodule.Case.getTempDirectory(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.handleError(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.locate7ZipExecutable(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.ChunkSize.NONE.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
private |
Copy an artifact into the new case. Will also copy any associated artifacts
newContentId | The content ID (in the portable case) of the source content |
artifactToCopy | The artifact to copy |
TskCoreException |
Definition at line 723 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getNewArtifactTypeId(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getNewAttributeType(), and org.sleuthkit.autopsy.casemodule.Case.getSleuthkitCase().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addArtifactsToPortableCase(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContent().
|
private |
Returns the object ID for the given content object in the portable case.
content | The content object to copy into the portable case |
TskCoreException |
Definition at line 862 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyArtifact(), org.sleuthkit.autopsy.coreutils.FileUtil.escapeFileName(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getExportSubfolder(), and org.sleuthkit.autopsy.datamodel.ContentUtils.writeToFile().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContentToPortableCase().
|
private |
Top level method to copy a content object to the portable case.
content | The content object to copy |
progressPanel | The progress panel |
TskCoreException |
Definition at line 848 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContent(), and org.sleuthkit.autopsy.report.ReportProgressPanel.updateStatusLabel().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addArtifactsToPortableCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addFilesToPortableCase(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
private |
Create the case directory and case database. portableSkCase will be set if this completes without error.
outputDir | The parent for the case folder |
progressPanel |
Definition at line 481 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.caseName, org.sleuthkit.autopsy.casemodule.Case.createPortableCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.FILE_FOLDER_NAME, org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.handleError(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.saveHighestIds(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.UNKNOWN_FILE_TYPE_FOLDER.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
void org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport | ( | String | reportPath, |
PortableCaseReportModuleSettings | options, | ||
ReportProgressPanel | progressPanel | ||
) |
Definition at line 199 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addArtifactsToPortableCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addFilesToPortableCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.areAllSetsSelected(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.areAllTagsSelected(), org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.CANCELED, org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.cleanup(), org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.COMPLETE, org.sleuthkit.autopsy.report.ReportProgressPanel.complete(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.compressCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContentToPortableCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.createCase(), org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoFormatExporter.export(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getAllInterestingItemsSets(), org.sleuthkit.autopsy.casemodule.Case.getCurrentCaseThrows(), org.sleuthkit.autopsy.casemodule.Case.getDisplayName(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.getSelectedSetNames(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.getSelectedTagNames(), org.sleuthkit.autopsy.casemodule.Case.getServices(), org.sleuthkit.autopsy.casemodule.Case.getSleuthkitCase(), org.sleuthkit.autopsy.report.ReportProgressPanel.getStatus(), org.sleuthkit.autopsy.casemodule.services.TagsManager.getTagNamesInUse(), org.sleuthkit.autopsy.casemodule.services.Services.getTagsManager(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.handleCancellation(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.handleError(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.initializeImageTags(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.oldAttrTypeIdToNewAttrType, org.sleuthkit.autopsy.report.ReportProgressPanel.setIndeterminate(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings.shouldCompress(), org.sleuthkit.autopsy.report.ReportProgressPanel.start(), and org.sleuthkit.autopsy.report.ReportProgressPanel.updateStatusLabel().
|
private |
Definition at line 442 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.casemodule.Case.getCurrentCaseThrows(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.GetInterestingItemSetNamesCallback.getSetCountMap(), and org.sleuthkit.autopsy.casemodule.Case.getSleuthkitCase().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
inherited |
Get current configuration for this report module.
Implemented in org.sleuthkit.autopsy.report.modules.stix.STIXReportModule, org.sleuthkit.autopsy.report.modules.html.HTMLReport, and org.sleuthkit.autopsy.report.modules.taggedhashes.SaveTaggedHashesToHashDb.
Definition at line 79 of file ReportModule.java.
|
inherited |
Returns the configuration panel for the report, which is displayed in the report configuration step of the report wizard.
Implemented in org.sleuthkit.autopsy.report.modules.kml.KMLReport, org.sleuthkit.autopsy.report.modules.stix.STIXReportModule, org.sleuthkit.autopsy.report.modules.taggedhashes.SaveTaggedHashesToHashDb, org.sleuthkit.autopsy.report.modules.html.HTMLReport, org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoReport, and org.sleuthkit.autopsy.report.GeneralReportModuleAdapter.
Definition at line 61 of file ReportModule.java.
|
inherited |
Get default configuration for this report module.
Implemented in org.sleuthkit.autopsy.report.modules.stix.STIXReportModule, org.sleuthkit.autopsy.report.modules.html.HTMLReport, and org.sleuthkit.autopsy.report.modules.taggedhashes.SaveTaggedHashesToHashDb.
Definition at line 70 of file ReportModule.java.
Referenced by org.sleuthkit.autopsy.report.infrastructure.ReportGenerator.generateReports().
String org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getDescription | ( | ) |
Gets a one-line, user friendly description of the type of report this module generates.
Implements org.sleuthkit.autopsy.report.ReportModule.
Definition at line 121 of file PortableCaseReportModule.java.
|
private |
Return the subfolder name for this file based on MIME type
abstractFile | the file |
Definition at line 968 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.UNKNOWN_FILE_TYPE_FOLDER.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyContent().
|
private |
Gets the image tag data for a given content tag
tag | The ContentTag in the current case |
TskCoreException |
Definition at line 623 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.casemodule.Case.getSleuthkitCase(), and org.sleuthkit.autopsy.casemodule.services.contentviewertags.ContentViewerTagManager.TABLE_NAME.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.addFilesToPortableCase().
String org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getName | ( | ) |
Get the name of the report this module generates.
Implements org.sleuthkit.autopsy.report.ReportModule.
Definition at line 113 of file PortableCaseReportModule.java.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.locate7ZipExecutable().
|
private |
Get the artifact type ID in the portable case and create new artifact type if needed. For built-in artifacts this will be the same as the original.
oldArtifact | The artifact in the current case |
Definition at line 795 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.casemodule.Case.getSleuthkitCase().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyArtifact().
|
private |
Get the attribute type ID in the portable case and create new attribute type if needed. For built-in attributes this will be the same as the original.
oldAttribute | The attribute in the current case |
Definition at line 818 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.oldAttrTypeIdToNewAttrType.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.copyArtifact().
String org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getRelativeFilePath | ( | ) |
Gets the relative path of the report file, if any, generated by this module. The path should be relative to the location that gets passed in to generateReport() (or similar).
Implements org.sleuthkit.autopsy.report.ReportModule.
Definition at line 126 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.caseName, org.sleuthkit.autopsy.casemodule.Case.getCurrentCaseThrows(), and org.sleuthkit.autopsy.casemodule.Case.getDisplayName().
|
private |
Convenience method for handling cancellation
progressPanel | The report progress panel |
Definition at line 141 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.CANCELED, org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.cleanup(), org.sleuthkit.autopsy.report.ReportProgressPanel.complete(), and org.sleuthkit.autopsy.report.ReportProgressPanel.setIndeterminate().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
private |
Convenience method to avoid code duplication. Assumes that if an exception is supplied then the error is SEVERE. Otherwise it is logged as a WARNING.
logWarning | Warning to write to the log |
dialogWarning | Warning to write to a pop-up window |
ex | The exception (can be null) |
progressPanel | The report progress panel |
Definition at line 158 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.cleanup(), org.sleuthkit.autopsy.report.ReportProgressPanel.complete(), org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus.ERROR, and org.sleuthkit.autopsy.report.ReportProgressPanel.setIndeterminate().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.compressCase(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.createCase(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
private |
Set up the image tag table in the portable case
progressPanel |
TskCoreException |
Definition at line 563 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.casemodule.services.contentviewertags.ContentViewerTagManager.TABLE_NAME, and org.sleuthkit.autopsy.casemodule.services.contentviewertags.ContentViewerTagManager.TABLE_SCHEMA_SQLITE.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport().
|
staticprivate |
Locate the 7-Zip executable from the release folder.
Definition at line 1136 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getName(), and org.sleuthkit.autopsy.coreutils.PlatformUtil.isWindowsOS().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.compressCase().
|
private |
Save the current highest IDs to the portable case.
TskCoreException |
Definition at line 541 of file PortableCaseReportModule.java.
References org.sleuthkit.autopsy.casemodule.Case.getSleuthkitCase().
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.createCase().
|
inherited |
Set report module configuration.
settings | Object which contains report module settings. |
Implemented in org.sleuthkit.autopsy.report.modules.stix.STIXReportModule, org.sleuthkit.autopsy.report.modules.html.HTMLReport, and org.sleuthkit.autopsy.report.modules.taggedhashes.SaveTaggedHashesToHashDb.
Definition at line 88 of file ReportModule.java.
Referenced by org.sleuthkit.autopsy.report.infrastructure.ReportGenerator.generateReports().
|
private |
Definition at line 85 of file PortableCaseReportModule.java.
|
private |
|
private |
Definition at line 86 of file PortableCaseReportModule.java.
|
private |
Definition at line 82 of file PortableCaseReportModule.java.
|
staticprivate |
Definition at line 73 of file PortableCaseReportModule.java.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.createCase().
|
staticprivate |
Definition at line 79 of file PortableCaseReportModule.java.
|
staticprivate |
Definition at line 72 of file PortableCaseReportModule.java.
|
staticprivate |
Definition at line 75 of file PortableCaseReportModule.java.
|
private |
Definition at line 92 of file PortableCaseReportModule.java.
|
private |
Definition at line 104 of file PortableCaseReportModule.java.
|
private |
Definition at line 98 of file PortableCaseReportModule.java.
|
private |
Definition at line 101 of file PortableCaseReportModule.java.
Referenced by org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.cleanup(), org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.generateReport(), and org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.getNewAttributeType().
|
private |
Definition at line 89 of file PortableCaseReportModule.java.
|
private |
Definition at line 95 of file PortableCaseReportModule.java.
|
private |
Definition at line 83 of file PortableCaseReportModule.java.
|
private |
Definition at line 76 of file PortableCaseReportModule.java.
|
staticprivate |
Copyright © 2012-2019 Basis Technology. Generated on: Tue Jan 7 2020
This work is licensed under a
Creative Commons Attribution-Share Alike 3.0 United States License.