From 210368477219e1517f982fa5952564fc1f8da85d Mon Sep 17 00:00:00 2001 From: Kelvin Rodriguez Date: Mon, 15 Jun 2020 10:20:11 -0700 Subject: [PATCH] Hayabusa2 dev merge (#3921) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * tgocassisrdrgen exported label re-order. (#3135) * Add 32-bit ISIS Special Pixel Constants to ProcessExportPds4 * Add ability to set title and version id in exported PDS4 produce in tgocassisrdrgen and ProcessExportPds4 API * Fix bug that occurs when exporting mosaics with Archive groups and fixed min/max lat/lon to east/west bounding box positive east flip bug * Added docs. * Update schema to most recent versions and comment-out schema that isn't used (temporarily) in tgocassisrdrgen. * Added reorder function to ProcessExportPds4 to reorder xml files generated in the wrong order for PDS4 and added cassis-specific schema * Update label generated by tgocassisrdrgen from additional feedback (#3137) * Add 32-bit ISIS Special Pixel Constants to ProcessExportPds4 * Add ability to set title and version id in exported PDS4 produce in tgocassisrdrgen and ProcessExportPds4 API * Fix bug that occurs when exporting mosaics with Archive groups and fixed min/max lat/lon to east/west bounding box positive east flip bug * Added docs. * Update schema to most recent versions and comment-out schema that isn't used (temporarily) in tgocassisrdrgen. * Added reorder function to ProcessExportPds4 to reorder xml files generated in the wrong order for PDS4 and added cassis-specific schema * Add StopTime to tgocassismos's Mosaic PVL group, as it is required for PDS4 export. Also, fix time formatting and east_azimuth units * Remove comment * Updated truthdata for ProcessExportPds4 class to match updates made for CaSSIS sprint (#3146) * Fix time-formatting in reingested CaSSIS images. (#3149) * Updated truthdata for ProcessExportPds4 class to match updates made for CaSSIS sprint * Fix trailing Z time-format in tgocassis2isis when reingesting images exported from ISIS3 * Added LineEqationTests.cpp (#3152) * History entry added to cube after running sumspice. Fixes #4972. (#658) * Added WriteHistory() method to SumFinder. * Renamed method. * Refactored writeHistory to be up to isis standards. * Added history entries and updated code to be up to isis standards. * Updated history entry. * Various minor mods to the readme (#3165) * Added FileList test (#3168) * Added LineEqationTests.cpp * Added FileListTests.cpp Implemented an istream constructor in FileList.cpp to help with testing. * added FileList tests. implemented istream constructor for FileList.cpp to help with testing. * fixed whitespace issues in FileListTests.cpp * Update FileListTests.cpp * Cleaned up data area wording in install guide (#3170) * Add ISIS3 update instructions to README (#3175) * Merged multisegment DSKs for Bullet * updated with update instructions * isis->isis3 * added header * Updating Contributing.md (#3179) * Merged multisegment DSKs for Bullet * updated with update instructions * isis->isis3 * added header * updated contributing guidelines * removed mentions of TC * Added LatitudeTest using Gtest (#3160) * Added gtest for ID and split TestUtilities into a cpp and h file to fix duplicate symbol error when building. * Created LatitudeTests. * Added C-Shell variable setup (#3173) * Added C-Shell variable setup * Fixed history * Made a bit more pythonic * Updates BulletDSKShape's methods for multisegment DSKs (#3181) * fixed DSK segment methods * fixed some errors * added contraints * fixed bug where an extra segment was added * Fixed memory leak in Bullet shape model (#3180) * Added AffineTests (#3166) * Add Longitude gtest (rebase of #601) (#3182) * Created gtest for Longitude class * Remove old Longitude test * Fix syntax for Longitude Tests * Remove comment * Revert "Remove old Longitude test" This reverts commit 608d3fd5c32d7e4a1de7fec407697a0147fbfae0. * Cleaned file, organzied test cases * Fixed failing copy constructor test * Fixed bug where findrx was not adding a history blob to the input cube (#3186) * Added writeHistory to findrx. * Rearranged includes in findrx. * Removed extra exceptions writing controlnets (#3185) * Fixed bug where focal plane measured x,y coordinates were not set if the cam->SetImage call failed, References #2591). (#3193) * updates to ControlPoint::ComputeApriori * Fixed bug where focal plane measured x,y coordinates were not set if the cam->SetImage call failed (References #2591). Added check to IsConstrained() method to see if point type is Free, in which case we ignore stored a priori sigmas on the coordinates. * added isis error when GenericTransform::calculateInverse gets empty matrix (#3195) * Writing 0 Value Residuals to PVL (#3194) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixing errors introduced with the changes to ProcessExportPds4.cpp for the tgo sprint. (#3202) * Github/Discuss Documentation Update (#3203) * Updated website documentation to point to github and discuss where appropriate * Updated last install link * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and tru… (#3200) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Update README.md (#3204) Updated to include instructions for release candidate builds on anaconda * Added gtests for Displacement.cpp, removed Displacement unitTest and truthfile. (#3209) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Updated README data area instructions (#3214) * Fixed data area instructions in README and some links * Fixed bold in block quote * Fixed legacy install guide link * extra l * Testing indentation list * Testing indentation list again * Testing indentation list code snippet * Minor wording clean up * Removed extra number * Removed duplicate Mars Odyssey entry * Updates to the build recipe for ISIS releases for the 3.7.0 release candidate. (#3205) * Minor modifications for RC build * Small modification to version in the recipe/meta.yaml * Updating release stage in isis/version * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Adding tab completion for tcsh on conda activation (#3244) * Modifying meta.yaml and version files for ISIS3.7.0 Public Release (#3254) * Modifying meta.yaml and version files for ISIS3.7.0 Public Release * Fixing date on version file * Added GaussianDistribution Tests (#3221) * Added GaussianDistribution Test. * Removed unused method and added test for exception. * Changed comment. * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Adding tab completion for tcsh on conda activation (#3244) * Modifying meta.yaml and version files for ISIS3.7.0 Public Release (#3254) * Modifying meta.yaml and version files for ISIS3.7.0 Public Release * Fixing date on version file * Put the Probability method back and removed the old unit test and truth data. * Changed FeatureAlgorithmFactory.cpp to allow pathnames in the algorithm parameter. (Adresses issue #2474) (#3270) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * changed formatSpecifications function to ignore pathnames when splitting the algorithm parameter. * added history comment to FeatureAlgorithmFactory header file * more changes to history in header file * Changes for de430 (#3283) * Removes patchelf; Fixes 3136 (#3265) * Removes patchelf * Removes patchelf from gcc4 as well * changed support href to github issues link (#3287) * Updated pull request for Statistics.cpp test to adhere to recommendations. (#3291) * Unit Test for Statistics object. * Added changes based on comments from PR. Added test for XML serialization read/write. * Changed special pixel type declarations to more readable Hrs,Lrs,Lis,His,.... * Updated pull request for StatisticsTest to adhere to recommendations * renamed Statistics.cpp test to StatisticsTest.cpp * Ticked version number (#3294) * Updated build meta.yaml (#3295) * Updated for 3.7.1 release ... again (#3303) * Added odyssey cat test. (#3307) * Added mex cat test. (#3309) * Updated tolerance for thmproc vis test after false positive test failures (#3315) * update release version (#3316) * Updated csvdiff to python3 (#3319) * Hayabusa2 cat test (#3304) * Added cat test for hayabusa2 * Updated campt calls and removed cub * Pipeline Test Update (#3321) * Updated pipeline to use TestPreferences where necessary * Updated pipeline truth data * Made preference parameter position consistant * Updated pipeline truth data again * Add Kaguya TC support to ISIS (#3240) * Added base for KaguyaTcCamera * Still adding to base * additonal changes * Added appropriate ckframeid * Fixed improper makefile * Added unitTest.cpp to KaguyaTcCamera * Adding camera plugin and test. * Update camera plugin. * Added working unit test. Added naif ck ID to ingestion. * Changed camera parent class to LineScanCamera * Add a Distortion Model to Kaguya TC ISIS camera model (#3215) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Update Kaguya TC Camera model to use LineScan Camera detector map (#3218) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Fixes GroundMap, SkyMap in Kaguya TC Camera Model and improve Focal Map Origin (#3220) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update Kaguya TC Camera Model to include Detector offsets for swath modes (#3222) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update to center position and offsets for distortion map swath modes added to Kaguya TC Camera Model * Change camera model to pull the Origin from the IAK * Update Kaguya TC camera model time and add option to Spice::getClockTime (#3237) * Added gtests for Displacement.cpp, removed Displacement unitTest and truthfile. (#3209) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Initial distortion model changes * Updated README data area instructions (#3214) * Fixed data area instructions in README and some links * Fixed bold in block quote * Fixed legacy install guide link * extra l * Testing indentation list * Testing indentation list again * Testing indentation list code snippet * Minor wording clean up * Removed extra number * Removed duplicate Mars Odyssey entry * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Updates to the build recipe for ISIS releases for the 3.7.0 release candidate. (#3205) * Minor modifications for RC build * Small modification to version in the recipe/meta.yaml * Updating release stage in isis/version * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update to center position and offsets for distortion map swath modes added to Kaguya TC Camera Model * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Updated the time used by the camera model to use the clock count, rather than the start time * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Update unit test for Kaguya TC to match output of updated camera model * Update unit test for Kaguya TC to match output of updated camera model (#3241) * Merge dev info kaguyatc (#3243) * Added gtests for Displacement.cpp, removed Displacement unitTest and truthfile. (#3209) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Updated README data area instructions (#3214) * Fixed data area instructions in README and some links * Fixed bold in block quote * Fixed legacy install guide link * extra l * Testing indentation list * Testing indentation list again * Testing indentation list code snippet * Minor wording clean up * Removed extra number * Removed duplicate Mars Odyssey entry * Updates to the build recipe for ISIS releases for the 3.7.0 release candidate. (#3205) * Minor modifications for RC build * Small modification to version in the recipe/meta.yaml * Updating release stage in isis/version * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Update kaguyatc branch from dev (#3245) * Updated truthdata for ProcessExportPds4 class to match updates made for CaSSIS sprint * Fix trailing Z time-format in tgocassis2isis when reingesting images exported from ISIS3 * Added gtests for Displacement.cpp, removed Displacement unitTest and truthfile. (#3209) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Updated README data area instructions (#3214) * Fixed data area instructions in README and some links * Fixed bold in block quote * Fixed legacy install guide link * extra l * Testing indentation list * Testing indentation list again * Testing indentation list code snippet * Minor wording clean up * Removed extra number * Removed duplicate Mars Odyssey entry * Updates to the build recipe for ISIS releases for the 3.7.0 release candidate. (#3205) * Minor modifications for RC build * Small modification to version in the recipe/meta.yaml * Updating release stage in isis/version * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Adding tab completion for tcsh on conda activation (#3244) * Added base for KaguyaTcCamera * Still adding to base * additonal changes * Added appropriate ckframeid * Fixed improper makefile * Added unitTest.cpp to KaguyaTcCamera * Adding camera plugin and test. * Update camera plugin. * Added working unit test. Added naif ck ID to ingestion. * Changed camera parent class to LineScanCamera * Add a Distortion Model to Kaguya TC ISIS camera model (#3215) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Update Kaguya TC Camera model to use LineScan Camera detector map (#3218) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Fixes GroundMap, SkyMap in Kaguya TC Camera Model and improve Focal Map Origin (#3220) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update Kaguya TC Camera Model to include Detector offsets for swath modes (#3222) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update to center position and offsets for distortion map swath modes added to Kaguya TC Camera Model * Change camera model to pull the Origin from the IAK * Update Kaguya TC camera model time and add option to Spice::getClockTime (#3237) * Added gtests for Displacement.cpp, removed Displacement unitTest and truthfile. (#3209) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Initial distortion model changes * Updated README data area instructions (#3214) * Fixed data area instructions in README and some links * Fixed bold in block quote * Fixed legacy install guide link * extra l * Testing indentation list * Testing indentation list again * Testing indentation list code snippet * Minor wording clean up * Removed extra number * Removed duplicate Mars Odyssey entry * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Updates to the build recipe for ISIS releases for the 3.7.0 release candidate. (#3205) * Minor modifications for RC build * Small modification to version in the recipe/meta.yaml * Updating release stage in isis/version * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update to center position and offsets for distortion map swath modes added to Kaguya TC Camera Model * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Updated the time used by the camera model to use the clock count, rather than the start time * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Update unit test for Kaguya TC to match output of updated camera model * Moddified description (#3246) * updates for review comments (#3277) * Updated truthdata for ProcessExportPds4 class to match updates made for CaSSIS sprint * Fix trailing Z time-format in tgocassis2isis when reingesting images exported from ISIS3 * Added base for KaguyaTcCamera * Still adding to base * additonal changes * Added appropriate ckframeid * Fixed improper makefile * Added unitTest.cpp to KaguyaTcCamera * Adding camera plugin and test. * Update camera plugin. * Added working unit test. Added naif ck ID to ingestion. * Changed camera parent class to LineScanCamera * Add a Distortion Model to Kaguya TC ISIS camera model (#3215) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Update Kaguya TC Camera model to use LineScan Camera detector map (#3218) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Fixes GroundMap, SkyMap in Kaguya TC Camera Model and improve Focal Map Origin (#3220) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update Kaguya TC Camera Model to include Detector offsets for swath modes (#3222) * Initial distortion model changes * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update to center position and offsets for distortion map swath modes added to Kaguya TC Camera Model * Change camera model to pull the Origin from the IAK * Update Kaguya TC camera model time and add option to Spice::getClockTime (#3237) * Added gtests for Displacement.cpp, removed Displacement unitTest and truthfile. (#3209) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Initial distortion model changes * Updated README data area instructions (#3214) * Fixed data area instructions in README and some links * Fixed bold in block quote * Fixed legacy install guide link * extra l * Testing indentation list * Testing indentation list again * Testing indentation list code snippet * Minor wording clean up * Removed extra number * Removed duplicate Mars Odyssey entry * Distortion model updates to actually match equation in documentation * Update truthdata for sensor model * Updates to the build recipe for ISIS releases for the 3.7.0 release candidate. (#3205) * Minor modifications for RC build * Small modification to version in the recipe/meta.yaml * Updating release stage in isis/version * Switch Kaguya TC to use L/S camera detector map. It is not a framer! * Fix typo * Update detector origin in Kaguya TC model to be more reasonable * Update to center position and offsets for distortion map swath modes added to Kaguya TC Camera Model * Added Area3DTests.cpp (#3216) * Added BasisFunctionTests.cpp. Removed BasisFunction unit test and truthfile. * changed expectedOutput values for some of the tests * Made tests for Displacement.cpp using gtest. removed Displacement unitTest and truthfile. * Added Area3DTests.cpp, removed Area3D truthfile and unit test. * included TestUtilities.h for use with exception testing, added a test for teh Area3D '=' operator * changed formatting to adhere to USGS coding standards * re-addedd the unit test and truth file * gllssi2isis Original Label Fix (#3226) * Allowed writting of residuals when value is zero to controlnet pvl * Updated ControlNetVersioner unit test * Fixed pvl labels original pvl labels not being written to the resulting cube. * Updated docstrings and history for updated methods * Removed the need to set the output cube pixel type * Reverted proceeimport changes * Set the dimensions in the process before processing * Added missing 1 in a history record * Reverted and applied a more appropriate fix * Used outfile obtained at the beginning of the program * Added history comment to app xml * Removed accidental comma (#3230) * Update README.md (#3232) Update readability * Updated the time used by the camera model to use the clock count, rather than the start time * Modifying files for conda build for ISIS3.7.0_RC2 (#3229) * Modifying files for conda build for ISIS3.7.0_RC_2 * Changes to modifications until issue #3231 can be completed * Small typo * One final added comment for clarification * Update unit test for Kaguya TC to match output of updated camera model * Updates to Kaguya TC big PR based on comments * Update kaguyatc2isis.xml Replace tab with spaces. * Fix spacing * Updated comment for clarity * Move comment * Update chandrayaan1 test data for switch to use base lro dem (#3322) * Fixed caminfo csv test Makefile sed to remove isis version and date (#3325) * Remove "kernels can be excluded" from README.md (#3329) Fixed a small typo, reworded a paragraph, and then removed "(kernels can be excluded)" from the description of how to download data for each mission. It was present for _each mission_, so including (kernels can be excluded) didn't communicate any real, mission-specific information. The paragraph above the mission-specific data downloads explains that the kernels can be excluded unless a mission-specific calibration program or end-to-end program needs them and directs the reader to consult mission-specific documentation. * Add sensor model support for Calibrated VIRTIS_M_IR and VIRTIS_M_VIS images to ISIS (#647) * Fixes the reading of SCETs into the ISIS3 table in the ingested image for level-3, calibrated VIRTIS-M images * Added initial updates to the RosettaVirtisCamera model to support VIRTIS-M calibrated images * Corrected StartTime and SpacecraftClockStartCount in calibrated VIRTIS-M ingested images and initial camera model cleanup * Fix spacecraft clock start / stop count and start time and stop time in rosetta virtis labels * Updated label fix for rosvirtis2isis. * fixed StopTime and SpacecraftClockStopCount in virtis labels * Cleanup of camera model * Fix sclk calculation in rosvirtis2isis, update table attached to ingested cube to include the sclk string, update camera model to use updated table. * Changes to the RosettaVirtisCamera and SpiceRotation to allow spiceinit with mirror kernels * Clean up debug output * Update SpiceRotation's minimize-cache-status setting function to not update if it has been previously set to fixed * Update SpiceRotation to only set the time cache explicitly if one has not already been loaded from the InstrumentPosition table attached to the cube * Clean up rosetta virtis changes * Cleanup of merge of virtis changes * Minor Update to Fix Voyager Bundle Adjustment (#3343) * Added argument to CameraGroundMap::GetXY to allow back-of-planet test to be skipped for the bundle adjust * Added ability to turn off back-of-planet test while iterating in a bundle adjust * Replaced DBL_EPSILON as a testing constant for valid distances and angles in SurfacePoint. * Corrected a bool check in CameraGroundMap::GetXY * Virtis level 2 ingestion fix (#3347) * Update date and other metadata * Fix level 2 virtis ingestion * Fix accidental merge with 3.7? * Updates for 3.8.0_RC1 (#3349) * Fix ckwriter failing test - update to use fixed kernels aside from the sclks (#3350) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Fix for 3.8 (#3354) * Fixes failing Rosetta VIRTIS Camera Model test (#3355) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Update Rosetta VIRTIS test to test the calibrated (level 3) data supported by the camera model and test both VIS and IR * Wrong version of GSL (#3359) Based on the file environment.yml in this repository, the GSL version used is 2.2.1. Yet CMakeLists.txt insists on version 19. That is wrong. The latest stable release of GSL is 2.5. Maybe there 1.9 was meant. In either case, apparently this version number is ignored anyway, the only reason I found out is when I switched from your homegrown isis/cmake/FindGSL.cmake when does not use the version in its logic to miniconda3/envs/isis3/share/cmake-3.11/Modules/FindGSL.cmake which does. * Updates qmos to fix grid-drawing if LongitudeDirection is PositiveWest (#3368) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Swaps min/max longitude for PositiveWest * Remove debug comment * Updated cisscal label output (#3375) * Updated cisscal to output the version of cisscal that ISIS has ported over * Added history to cisscal xml * Improved voycal error messages (#3373) * Testing updates for Jenkins and MRO (#3380) * updated tests to get them passing in different OSes * removed bad program launcher test * tracking table except fix * missed PDS table file * typo * added colon * tracking table test updated * Changed FileName to use US English for date conversions (#3379) * Changed FileName to use US English for date conversions * Removed defaulte locale * Fixed FileList test * Fixes 3382 Removes mention of redmine. Fixes #3382. * add fish support * Removed grep from Makefile and added Program to diff file. (#3393) * Update isis3VarInit.py (#3392) fix paste bug * Update kerneldbgen to work with spks with many time intervals (#3386) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated spk max window size to 200000 to accomodate large smithed spks * fix size to be consistent * Removed redundant find scripts (#3394) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * Set the buffer size to the area being worked instead of 1x1 (#3381) * Modifying how ProcessRubberSheet::transformPatch() handles buffers. * Updated a comment to reflect the new way * Fix for slight diff in DNs at edge of image for cam2map * Add to a comment * Removed comments and moved tests so they trigger sooner * removed email message from DawnFcCamera (#3397) * Findfeatures (#3399) * Changed match function in Matchmaker to pass in copies of pointers * Revert "Changed match function in Matchmaker to pass in copies of pointers" This reverts commit f687eb668f4438245572a0c6a62b50b64846a12f. * updated match method in MatchMaker to pass in clones of pointers * Added the ability to pass lists instead of directories and filters to kerneldbgen (#3398) * Added file list option to spicedbgen * First pass at actual params * Fixed scoping error * Updated no parameters selected check * Added historty comment to SpiceDbGen * Fixed weird type logic * added error for level 2 input cube * Simplifies Jenkinsfile for webhook testing (#3403) * made RELEASE mode default, added debug optimization flag * Update to CaSSIS Exported PDS4 images and Mosaicking program (#3402) * Update date and other metadata * Added changes to tgo-related applications and PEP4 to update PDS4 exported labels for CaSSIS based on requests * Updated tgocassisrdrgen to add PSA schema * Add function on cube to return actual min/max lat/lons based on DNs and updated PEP4 to format a couple of specific output map values with a trailing .0. Also update PEP4 to use the new function on Cube to calculate min/max lat/lons * Fixed description order, updated geom schema details to pass validation, propagate Archive group to mosaic output needed for PDS4 export * Update to PEP4 * Update tgocassisrdrgen * Cleanup before commit * More cleanup add header file history entries * Clean up PEP4 before commit * Updates to address review comments * Patch jenkinsfile (#3407) * Simplifies Jenkinsfile for webhook testing * Updates to how bundleout.txt is being written cont'd. (#3404) * Added column/unit descriptions to image header in outputHeader(...) function. * More changes to clean up the bundleout.txt file. * Added the locations of the cube list file/file_prefix to the bundleout.txt file. * Added bundleOut output function to the BundleObservation class. * Updated BundleObservation::bundleOutput(std::ofstream &fpOut,bool errorPropagation, bool imageCCSV) * Added history entries/function documentation and minor tweaks to BundleSolutionInfo/BundleObservation * Fixed a memory issue associated with attempting to set the output control network for BundleSettingsInfo in jigsaw. * Added reviewer-requested changes. * Added more updates to this PR per Summer's (the reviewer) request. * Fixed some formatting in the parameter list ouput introduced by the refactor of the bundleOutputString function. * Formatting tweaks in BundleSolutionInfo::outputText(...) and BundleObservation::bundleOutputString()... so the columns line-up nicely. * Implemented more changes requested by Summer (the reviewer). * Added BundleObservation::bundleoutCSV()/bundleoutputFetchData() functions. Also changed precision of output, which necessitated formatting changs to the BundleSolutionInfo::outputText() function. Full refactor per Summer's request not completed yet (needs to be tested). * Removed BundleObservation::formatBundleOutputString and all references to it in ISIS3. * Minor formatting changes requested by reviewers. * Cleaning-up code and logic for changes made for bundleout.txt * Adding logic to fix incorrect values in bundleout.txt * Updated cisscal to output the version of cisscal that ISIS has ported over * Added history to cisscal xml * Fixing failing unit tests for bundleout logic. * Minor reversal of modification to BundleObservation.cpp * Minor typo fixes before PR creation * Cleaning-up the output code as per reviewer request * Added back in old formatBundleOutputString function * Added deprication message for the old bundle output formatter * Addressed PR comments * Fixes failing tgo cat tests and PEP4 unitTest (#3408) * Update date and other metadata * Added changes to tgo-related applications and PEP4 to update PDS4 exported labels for CaSSIS based on requests * Updated tgocassisrdrgen to add PSA schema * Add function on cube to return actual min/max lat/lons based on DNs and updated PEP4 to format a couple of specific output map values with a trailing .0. Also update PEP4 to use the new function on Cube to calculate min/max lat/lons * Fixed description order, updated geom schema details to pass validation, propagate Archive group to mosaic output needed for PDS4 export * Update to PEP4 * Update tgocassisrdrgen * Cleanup before commit * More cleanup add header file history entries * Clean up PEP4 before commit * Updates to address review comments * Fix raw image failing tests * Update truthdata for PEP4 * Added oblique resolutions to advanced track tool and the geometry and camstats groups of caminfo output (#3249) (#3288) * Removed oblique resolutions not needed in the Advanced Track Tool and added oblique res max/min to camstats group. * Pulled down branch and made changes to documentaiton. * Changed documentation. * updated documentation. * Quick fixes. * Deleted old caminfo.cpp * Fixes 3410 - Question template improvement (#3411) * Fixes 3410 * Update 3_Support_question.md * Bundle Output Test Update (#3414) * Rebased off of dev * Reset bundleObservation cpp * Removed duplicate outputs * Updates deltack tests with bundle changes * Changed cube sample and line loop to double (#3421) * Updated Bundle Utilities truth data * Allows user control of output bit type in hideal2pds. Added for tjwilson. #2692 #3366 (#3420) * Allows user control of output bit type. Added for tjwilson * Updated no global variables, indents * Fixed race condition in FileName test * Updated cisscal to match IDL version 3.9.1 (#3406) * Removed grep from Makefile and added Program to diff file. * Updated cisscall to IDL version 3.9. * Fixed typo. * Updated to version 3.9.1. * Updated documentation. * Updated version number. * Fixed CissLabels unit test. (#3428) * Fixed mac build error. * Updates for 3.9.0 RC (#3431) * Fixed optimization flag for Linux and added -g for debug builds * Bundleout Reformat (#3447) * Updated bundle text output to match expected output * Further formatting for the bundle text output * Added history comments * Reformat of RMS output in bundleout.txt * Updated BundleSolutionInfo unittest * Updated version to 3.9.0_RC1 (#3448) * Fixed compiler warnings. Fixes #3418, Fixes #3198 (#3459) * Updated version to 3.9.0_RC1 * Removed compiler warnings with as few changes as possible * Updated pvldiff to support PvlContainers with unequal keyword lengths (#3460) * Updated pvldiff to support PvlContainers with unequal keyword lengths with IngoreKeys * groups now remove keys as well * Added Anaconda cloud badge (#3463) * Ale integration into dev (#3464) * Adds Ale into isis env (#3437) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * remove load call * reordered env.yml * reordered env * unpinned more stuff * updated cmakelists * Naif Keywords/SpicePosition/SpiceRotation now obtained from Ale label and not Spice kernels on Spiceinit (#3442) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * working naif keywords from ale * added PvlObject constructor from json * reverted env file * added loadcache(json) * reverted spiceinit main * Spice Rotation and Position now derived from ale * added PvlObject from json null behavior * type * SpiceRotation no longer default to iden matrix * Adding spiceinit classic as back up to Ale implementation. (#3458) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * working naif keywords from ale * added PvlObject constructor from json * reverted env file * added loadcache(json) * reverted spiceinit main * Spice Rotation and Position now derived from ale * added PvlObject from json null behavior * type * SpiceRotation no longer default to iden matrix * added back ISIS spiceinit classic as a backup to ale * added source keyword to Kernels group * kernel group now added only in spiceinit * updates as per comments * Matrix p_cache (#3461) * Converted quaternion into matrix when pushing onto the p_cache * Removed extra print * Tests docs (#3467) * Reverted Blob change * Added doc strings * Moved usage into source files * Added SpicePosition test * changed thread inc to target * Updated SpicePoition unitTest * Added SpiceRotation unit test * Updated SpiceRotation truth * Update README.md fixes a white space formatting issue in step 7 which prevented a portion of the documentation being rendered correctly * Correct documentation. The file written to the path specified by CNETFILE will be in binary control network format, not plain-text PVL format. The incorrect description in this documentation has been incorrect for at least 7 years, based on the 'Blame' view of the relevant lines in hijitreg/main.cpp, ControlNet/ControlNet.h, and ControlNet/ControlNet.cpp. * Revert "Ale integration into dev (#3464)" This reverts commit 48e4efd1babab7e9608ec15cd4030cc7f51d66c2. * Converted PixelType unit test to gtest (#3478) * converted Pixel type unit test to gtest * removed old unit test and truth data * converted Column unit test to gtest (#3480) * converted Column unit test to gtest * removed redundant tests * Added Working BundleMeasure gtest File (#3470) * Initial Stab at BundleMeasureTest with Fixtures. * Added Working BundleMeasure gtest File * Added a refernce to phocube to camdev docs * Fixes Qmos grid to properly consider PositiveWest and PositiveEast (#3488) * Fixes Qmos grid to properly consider PositiveWest and PositiveEast * clean up * update as per comments * added comments on positive west angles as they come into the GridGraphicsItem constructor * Bundleout Text file update (#3485) * Initial changes to get the bundleout into a better place * Added a few comments and updated how the spacing for the sprintfs is obtained * Reverted unnecessary changes to BundleObservation * Updated file path length checking as suggested * Updates voy2isis to add an optional parameter to specify the instrument name (#3490) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated voy2isis to add instrument parameter which can be used to specify the instrument name wac or nac if it is not provided in the image label * Added simple test * Updates test and documentation for voy2isis adds instrument_name update * Updated history documentation to add ticket number for voy2isis changes * Warning for photomet added (#3486) * added warning if anglesource option is used with mixed or topo normalization method; based on github tickets 3451 and 3452 * adding tests * Addressing Stuarts comments * Addressing Kristin's comment * Updating Kaguya Distortion Model with Boresight (Finishing #3492) (#3498) * added warning if anglesource option is used with mixed or topo normalization method; based on github tickets 3451 and 3452 * adding tests * changes to KaguyaTC distortion map * Fixed test on Aarons PR * updated unit test * reseting test data location * Adding camera uptick * Replaced code, removed earlier, that abandons work on a tile Fixes: #3466 (#3497) * Replaced code, removed earlier, that abondons work on a tile when it is outside the output image * Typo * Cisscal Output Change (#3496) * Updated cisscal output cub creation to after bitweight correction and dark subtraction * Updated history in cisscal app xml * Added issue number * Added new test for cisscal * Typo * Removed cube when an exception is thrown rather than moving the instantiation point * Austin Sander's "clemhirescal: Adds support for all MCP gain settings for filters A and D" (#3503) * Added support for all MCP gain settings. Closes #3190 * Revised comments to better reflect updated logic * Added history comment. * Added additional description and link to Robinson paper. * added issue number * Added dynamic creation of version file (#3502) * Added dynamic creation of version file * removed commented line * Update README.md * Updates marci2isis to add variable exposure times and associated frame sequences (#3501) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated voy2isis to add instrument parameter which can be used to specify the instrument name wac or nac if it is not provided in the image label * Added simple test * Updates test and documentation for voy2isis adds instrument_name update * Updated history documentation to add ticket number for voy2isis changes * Updated to reverse frameseq number appropriately with flip * Remove commented-out code * Added documentation for change and test * Updated no exposure duration in varexp file condition * Re-remove iTime.h * Update warning message for assuming a single exposure time * Modified to use the frame and exposure keywords added by marci2isis i… (#3505) * Modified to use the frame and exposure keywords added by marci2isis instead of the varexp.tab file * Added the issue that caused this to need to be fixed * Update main.cpp * Updated Readme with Contributing link * Jenkins Build Script update (#3533) * Updated pipeline to use TestPreferences where necessary * Updated pipeline truth data * Made preference parameter position consistant * Updated pipeline truth data again * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Changed testing avoid which failure * Removed echo * Pointed at install bin instead of build bin * Added a forgotten / * Added the actual install directory * Changed isisroot to point to install directory * More tweeks to the groovy script * Removed conda prefix echo * Moved path update to a single line * new groove * new groove * new groove * new groove * new groove * Updated spice rotation test with isis variable * Testing with appjit * Only testing app jit * Changed app test to -R * More messing with stuffs * Added check for catlab * Changed install directory location * Changed paths again * Echoed pwd in checkout * Retry the print * Pathing one more time * Paths * updated build.groovy * Update Jenkinsfile (#3525) * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * fixed compiler warning. Fixes #3531 * Update kerneldbgen test to handle input file path edge case (#3536) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated kerneldbgen test to deal with specific filepath length edge case * Updated groovy to use new Kakadu include (#3537) * Updated groovy to use new Kakadu include * Fixed typo in include path * changed cisscal to no longer use absolute paths (#3541) * excluded file group now prints original file * Added preferences variable to shapemodel path. * Update failing kerneldbgen ck test again (#3540) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated kerneldbgen test to deal with specific filepath length edge case * Update kerneldbgen ck test to use IgnoreFilePaths * Removed requirement of having to start a path with a slash, and added the dollar sign to the regex to allow the ignorepath feature to ignore file paths that start with an environment or isis variable * Updating test and truth data to print relative file (#3545) * Minor updates to "How to Write Documentation" documentation (#3510) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Minor updates to How to Write Documentation documentation to reflect build changes post-cmake * remove additionally as per review comments * Adding just the meta.yml, previous PR updated CMakeLists.txt (#3549) * Moved deactivates outside of the try block, also added an env clean up step (#3556) * Jenkins Changes (#3557) * Jenkins file update to make use of the web hook * Added a groovy utilities file * Changed the pipeline to load the right file * Updated the name of the groovy file * Removed unnecessary isis app -help commands * Copy the header files on install (#3565) * Copy the header files on install * Update CMakeLists.txt * Added flag to skip SSL verification in CI (#3572) * Added flag to skip SSL verification on PR CI * Added no SSL flag to nightly build script * Update Jenkinsfile * Update build.groovy * Update build.groovy * Update Jenkinsfile * Added command to skip SSL verification in Anaconda * Updated build.groovy with anaconda SSL flag * Merging ALE into dev (#3590) * Adds Ale into isis env (#3437) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * remove load call * reordered env.yml * reordered env * unpinned more stuff * updated cmakelists * Naif Keywords/SpicePosition/SpiceRotation now obtained from Ale label and not Spice kernels on Spiceinit (#3442) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * working naif keywords from ale * added PvlObject constructor from json * reverted env file * added loadcache(json) * reverted spiceinit main * Spice Rotation and Position now derived from ale * added PvlObject from json null behavior * type * SpiceRotation no longer default to iden matrix * Adding spiceinit classic as back up to Ale implementation. (#3458) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * working naif keywords from ale * added PvlObject constructor from json * reverted env file * added loadcache(json) * reverted spiceinit main * Spice Rotation and Position now derived from ale * added PvlObject from json null behavior * type * SpiceRotation no longer default to iden matrix * added back ISIS spiceinit classic as a backup to ale * added source keyword to Kernels group * kernel group now added only in spiceinit * updates as per comments * Matrix p_cache (#3461) * Converted quaternion into matrix when pushing onto the p_cache * Removed extra print * Tests docs (#3467) * Reverted Blob change * Added doc strings * Moved usage into source files * Added SpicePosition test * changed thread inc to target * Updated SpicePoition unitTest * Added SpiceRotation unit test * Updated SpiceRotation truth * Merging Dev into ale_integration (#3552) * Fixed optimization flag for Linux and added -g for debug builds * Bundleout Reformat (#3447) * Updated bundle text output to match expected output * Further formatting for the bundle text output * Added history comments * Reformat of RMS output in bundleout.txt * Updated BundleSolutionInfo unittest * Updated version to 3.9.0_RC1 (#3448) * Fixed compiler warnings. Fixes #3418, Fixes #3198 (#3459) * Updated version to 3.9.0_RC1 * Removed compiler warnings with as few changes as possible * Updated pvldiff to support PvlContainers with unequal keyword lengths (#3460) * Updated pvldiff to support PvlContainers with unequal keyword lengths with IngoreKeys * groups now remove keys as well * Added Anaconda cloud badge (#3463) * Ale integration into dev (#3464) * Adds Ale into isis env (#3437) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * remove load call * reordered env.yml * reordered env * unpinned more stuff * updated cmakelists * Naif Keywords/SpicePosition/SpiceRotation now obtained from Ale label and not Spice kernels on Spiceinit (#3442) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * working naif keywords from ale * added PvlObject constructor from json * reverted env file * added loadcache(json) * reverted spiceinit main * Spice Rotation and Position now derived from ale * added PvlObject from json null behavior * type * SpiceRotation no longer default to iden matrix * Adding spiceinit classic as back up to Ale implementation. (#3458) * removed redundant scripts * removed unused check from cmake lists * removed debug prints * removed v007 comment and boost debug flag * added ale into ISIS * removed debug prints * working naif keywords from ale * added PvlObject constructor from json * reverted env file * added loadcache(json) * reverted spiceinit main * Spice Rotation and Position now derived from ale * added PvlObject from json null behavior * type * SpiceRotation no longer default to iden matrix * added back ISIS spiceinit classic as a backup to ale * added source keyword to Kernels group * kernel group now added only in spiceinit * updates as per comments * Matrix p_cache (#3461) * Converted quaternion into matrix when pushing onto the p_cache * Removed extra print * Tests docs (#3467) * Reverted Blob change * Added doc strings * Moved usage into source files * Added SpicePosition test * changed thread inc to target * Updated SpicePoition unitTest * Added SpiceRotation unit test * Updated SpiceRotation truth * Update README.md fixes a white space formatting issue in step 7 which prevented a portion of the documentation being rendered correctly * Correct documentation. The file written to the path specified by CNETFILE will be in binary control network format, not plain-text PVL format. The incorrect description in this documentation has been incorrect for at least 7 years, based on the 'Blame' view of the relevant lines in hijitreg/main.cpp, ControlNet/ControlNet.h, and ControlNet/ControlNet.cpp. * Revert "Ale integration into dev (#3464)" This reverts commit 48e4efd1babab7e9608ec15cd4030cc7f51d66c2. * Converted PixelType unit test to gtest (#3478) * converted Pixel type unit test to gtest * removed old unit test and truth data * converted Column unit test to gtest (#3480) * converted Column unit test to gtest * removed redundant tests * Added Working BundleMeasure gtest File (#3470) * Initial Stab at BundleMeasureTest with Fixtures. * Added Working BundleMeasure gtest File * Added a refernce to phocube to camdev docs * Fixes Qmos grid to properly consider PositiveWest and PositiveEast (#3488) * Fixes Qmos grid to properly consider PositiveWest and PositiveEast * clean up * update as per comments * added comments on positive west angles as they come into the GridGraphicsItem constructor * Bundleout Text file update (#3485) * Initial changes to get the bundleout into a better place * Added a few comments and updated how the spacing for the sprintfs is obtained * Reverted unnecessary changes to BundleObservation * Updated file path length checking as suggested * Updates voy2isis to add an optional parameter to specify the instrument name (#3490) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated voy2isis to add instrument parameter which can be used to specify the instrument name wac or nac if it is not provided in the image label * Added simple test * Updates test and documentation for voy2isis adds instrument_name update * Updated history documentation to add ticket number for voy2isis changes * Warning for photomet added (#3486) * added warning if anglesource option is used with mixed or topo normalization method; based on github tickets 3451 and 3452 * adding tests * Addressing Stuarts comments * Addressing Kristin's comment * Updating Kaguya Distortion Model with Boresight (Finishing #3492) (#3498) * added warning if anglesource option is used with mixed or topo normalization method; based on github tickets 3451 and 3452 * adding tests * changes to KaguyaTC distortion map * Fixed test on Aarons PR * updated unit test * reseting test data location * Adding camera uptick * Replaced code, removed earlier, that abandons work on a tile Fixes: #3466 (#3497) * Replaced code, removed earlier, that abondons work on a tile when it is outside the output image * Typo * Cisscal Output Change (#3496) * Updated cisscal output cub creation to after bitweight correction and dark subtraction * Updated history in cisscal app xml * Added issue number * Added new test for cisscal * Typo * Removed cube when an exception is thrown rather than moving the instantiation point * Austin Sander's "clemhirescal: Adds support for all MCP gain settings for filters A and D" (#3503) * Added support for all MCP gain settings. Closes #3190 * Revised comments to better reflect updated logic * Added history comment. * Added additional description and link to Robinson paper. * added issue number * Added dynamic creation of version file (#3502) * Added dynamic creation of version file * removed commented line * Update README.md * Updates marci2isis to add variable exposure times and associated frame sequences (#3501) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated voy2isis to add instrument parameter which can be used to specify the instrument name wac or nac if it is not provided in the image label * Added simple test * Updates test and documentation for voy2isis adds instrument_name update * Updated history documentation to add ticket number for voy2isis changes * Updated to reverse frameseq number appropriately with flip * Remove commented-out code * Added documentation for change and test * Updated no exposure duration in varexp file condition * Re-remove iTime.h * Update warning message for assuming a single exposure time * Modified to use the frame and exposure keywords added by marci2isis i… (#3505) * Modified to use the frame and exposure keywords added by marci2isis instead of the varexp.tab file * Added the issue that caused this to need to be fixed * Update main.cpp * Updated Readme with Contributing link * Jenkins Build Script update (#3533) * Updated pipeline to use TestPreferences where necessary * Updated pipeline truth data * Made preference parameter position consistant * Updated pipeline truth data again * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Jenkins * Changed testing avoid which failure * Removed echo * Pointed at install bin instead of build bin * Added a forgotten / * Added the actual install directory * Changed isisroot to point to install directory * More tweeks to the groovy script * Removed conda prefix echo * Moved path update to a single line * new groove * new groove * new groove * new groove * new groove * Updated spice rotation test with isis variable * Testing with appjit * Only testing app jit * Changed app test to -R * More messing with stuffs * Added check for catlab * Changed install directory location * Changed paths again * Echoed pwd in checkout * Retry the print * Pathing one more time * Paths * updated build.groovy * Update Jenkinsfile (#3525) * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * Update Jenkinsfile * fixed compiler warning. Fixes #3531 * Update kerneldbgen test to handle input file path edge case (#3536) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated kerneldbgen test to deal with specific filepath length edge case * Updated groovy to use new Kakadu include (#3537) * Updated groovy to use new Kakadu include * Fixed typo in include path * changed cisscal to no longer use absolute paths (#3541) * excluded file group now prints original file * Added preferences variable to shapemodel path. * Update failing kerneldbgen ck test again (#3540) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Updated kerneldbgen test to deal with specific filepath length edge case * Update kerneldbgen ck test to use IgnoreFilePaths * Removed requirement of having to start a path with a slash, and added the dollar sign to the regex to allow the ignorepath feature to ignore file paths that start with an environment or isis variable * Updating test and truth data to print relative file (#3545) * Minor updates to "How to Write Documentation" documentation (#3510) * Update date and other metadata * ckwriter_test_fix * Fix unintentional cmakelists change * Minor updates to How to Write Documentation documentation to reflect build changes post-cmake * remove additionally as per review comments * Adding just the meta.yml, previous PR updated CMakeLists.txt (#3549) * pinned boost (#3561) * Merge Dev into Ale_integration (#3560) * Updated version to 3.9.0_RC1 (#3448) * Added dynamic creation of version file (#3502) * Added dynamic creation of version file * removed commented line * Moved deactivates outside of the try block, also added an env clean up step (#3556) * Jenkins Changes (#3557) * Jenkins file update to make use of the web hook * Added a groovy utilities file * Changed the pipeline to load the right file * Updated the name of the groovy file * Removed unnecessary isis app -help commands * Added ninja into environment.yml * Add ALESPICEROOT to ENV (#3568) * Updated variable initialization to include ALESPICEROOT * Removed duplicate code from the isis3VarInit file * Update isis3VarInit.py * CkWriter Changes (#3571) * Updated variable initialization to include ALESPICEROOT * Removed couts and added CKs to the list of kernels to load * Updated ckwriters lroc test * Added AngularVelocities to the Ale load code in SpiceRotation * Added history comment * Removed unnecessary couts and variable * Removed accidental duplicate argparse code * Env update to support building with ALE (#3563) * pinned boost * updated envs for ale support * trivial jenkinsfile change * revert Jenkinsfile * added excplicit ninja * pcl now 1.8 * 1.8.1 -> 1.8 in cmake config * experimenting with unpinned PCL * removing versions from find PCL * repinned some things * unpinned some things * moved order for gcc4 * more experiments with ale * using env used on local prog24 * fit adjustment * eeeeeeeehhhhhhh * Moved usgs-astrogeology first in channel order * Ticked ALE version up * Forced Spice class to use ISIS when pointing is NADIR * updated truth for SpiceRotation (#3577) * Added flag to skip SSL verification in CI (#3572) * Added flag to skip SSL verification on PR CI * Added no SSL flag to nightly build script * Update Jenkinsfile * Update build.groovy * Update build.groovy * Update Jenkinsfile * Added command to skip SSL verification in Anaconda * Updated build.groovy with anaconda SSL flag * Working on a working Linux env (#3578) * Working on a working Linux env * fixed ALE pin * Removed FindFeatures filter test (#3582) * updated truth for SpiceRotation * removed findfeatures filter test * Removed var_init call from jenkins nightly * Changed to print out build environment * cnet2dem tests updated with a tolerance (#3586) * updated truth for SpiceRotation * removed findfeatures filter test * updated cnet2dem tests to have a floating point tolerance * fixed spacing * Fixed test to account for numbers starting with plus signs (#3588) * Restricted openssl version (#3589) * Ticked ALE version * Update Cube.cpp No real change. Just removed spaces * Removed NGINX cache for Jenkins tests (#3591) * Changed to use c++ and * Fixed links in README (#3593) The table of contents links were missing dashes * Update README.md links Update to follow on to PR #3593. I found that the link names were fixed, but the `##` didn't actually work to go to each subsection "anchor" (at least on my browser.) I changed these all to `#` and the links work now. * Solar Lon now computed via SpiceRotation and Position caches (#3599) * Solar Lon now computed via SpiceRotation and Position caches * remembered we have to support non-ale instruments lmao * Getting CentOS environment working (#3596) * Tick CentOS ALE version * Testing disabling kakadu * Reverted gcc4 channel order change * Re-enable Kakadu * Dumb thing to see if this works * Revert dumb change * Remove compiler from GCC4 env * Pin specially distributed libraries * Pin x264 * Reduce jenkins, fix MacOS builds (#3609) * Solar Lon now computed via SpiceRotation and Position caches * remembered we have to support non-ale instruments lmao * reduced build.groovy, made MacOS use per-job envs * removed conda search * removed conda search * added env bin * removed echos * removed echos * Centos has no which (#3613) * Month/Day/Year for Mac Builds (#3615) * Centos has no which * month/day/year now also hashed * updated lronacal to compute sun to body distance from cached ephem data (#3611) * updated lronacal to compute sun -> body distance from cached ephem data * removed forced exception * added basic Spice test * Added doc string to Spice::Spice(PVL, json) and removed debug print * Update photomet's LunarLambertEmperical model to handle PVL input in photemplate format. (#3614) * Update LunarLambertEmpherical model to handle frompvl input with values of the form PvlKeyword = (1,2,3,3,4) in addition to PvlKeyword = 1,2,3,3,4 * Added tests for new functionality * Avoid edge cases where the histogram only has one bin (#3616) * Updating Geos to 3.7 (#3617) * Centos has no which * month/day/year now also hashed * Added GDAL and ported ISIS to Geos 3.6 port to geos 3.6 ported chip updated env env ev env env * removed uneeded contructor env environment environment environment build env Asda env removed gdal * unpinned opencv force remove anaconda channel printing conda channels afkasdfg asdfkjas;d updated env updated ev 3.7 pinned bullet added defaults again hopefully this works sdlkfjlasdkj sjdfhalsdjhf * updated for centos * updated centos env * Merging build.groovy into Jenkinsfile (#3620) * teasting different way to get os * moved build.groovy into Jenkinsfile * made ISISENV scoped * updated env * Made CMAKEFLAGS scoped * updated centos recipe * pinned geos for centos * sepaerated create and update * added channel * removed krodriguez channel * removed lib * hushed Geos Warning (#3622) * hushed Geos Warning * moved flag location * defined unstable API flag for Geos * Fix for spkwriter test failing with bad personal IsisPreference file.… (#3624) * Fix for spkwriter test failing with bad personal IsisPreference file. Fixes #3623 * Used TSTARGS instead of explicit preference file * Fix for CSV errors in Jenkins (#3625) * hushed Geos Warning moved flag location csvdiff now outputs everything explicit export removed warning line * reverted redirect * reverted cmakelists * reverted weird slash * moved install * slashes * explicit mac cleaup * Moved Kernel and KernelDb unitTests to GTest (#3626) * Converted Kernel test to GTest * Changed kernel type 0 to None * Stub kernel db gtest * Added another test * Fixed KernelDb tests * Added HiRISE test * Fixed HiRISE test * Added CRISM test * fixed CK Config test * Removed old KernelDb unit test * Removed None type from kernels * Fixed rename * removed inline * Update version to 4.0 to prep for release candidate (#3629) * Update version to 4.0 to prep for release candidate * Update correct version * Revert "Update version to 4.0 to prep for release candidate (#3629)" (#3631) This reverts commit 8f48ed94db46daa1c44ba77d1c0f6263439f209b. * Update version to 4.0 to prep for release candidate #3629 (#3632) * Update version to 4.0 to prep for release candidate * Update correct version * Remove accidental comment * Moved Kernel type compositon to source file (#3633) * Fix Environment unitTest failure in dev (#3634) * Update version to 4.0 to prep for release candidate * Update correct version * Remove accidental comment * Update Environment unitTest for ISIS 4.0 * Moved spiceinit to a callable (#3628) * Update meta.yaml build/run environment for 4.0 (#3635) * Update meta.yaml build/run environment for 4.0 * Pin opencv to remove libopencv not found errors in installed ISIS package * Update meta.yaml to rename conda package to isis from isis3 (#3642) * Pin armadillo in meta.yaml (#3650) * Update meta.yaml to rename conda package to isis from isis3 * Pin anaconda to version 9.0 in meta.yaml so it will run without a missing shared libraries error. * Actually pin armadillo to version 8.200.0 because 9 isn't needed and we know 8.200.0 works. * Update installation information to reflect 4.0 vs. 3.10 and package name change (#3649) * Update meta.yaml to rename conda package to isis from isis3 * Initial update to install docs to reflect install guide changes with the 3.10 and 4.0 split and the change in the package name * Update readme to newer installation instructions based on what we decided to do for the builds. * Update install docs to fix formatting * Add badge for isis package * Initial PR for Europa Clipper ingest, models, jitter correction (#3661) * Add initial files needed for EIS/clipper (#3636) * First add of jitterfit application * Initial commit of jitterfit * Clipper (#3656) * Try again * Try again * Documentation improvements * Fixed issues from first review * Initial ClipperNacRollingShutterCameraModel and associated classes PR (#3657) * Adds NthOrderPolynomial class needed for jitterfit (for EIS) to ISIS * Remove incorrect documentation * Update unitTest output * Remove unnecessary Makefile * Adds NthOrderPolynomial class to ISIS needed for jitterfit for EIS (#3639) * Adds NthOrderPolynomial class needed for jitterfit (for EIS) to ISIS * Remove incorrect documentation * Update unitTest output * Remove unnecessary Makefile * Adds ingestion application eis2isis to ISIS (#3638) * Initial commit of eis2isis * Remove references to EISBlob in comments and remove unnecessary Makefiles * Initial EIS Camera model commit with associated classes * Convert initial RSCameraDetectorMap unit test to a gtest * Changes in response to review comments: add checks to make sure tables and keywords exist before setting * Updated with old-style unit tests for camera models * Clipper (#3658) * Try again * Try again * Documentation improvements * Fixed issues from first review * Add more documentation * Fixed compile warning * Fix typo. Co-authored-by: Kristin * Adds Europa Clipper WAC Framing Camera Model - initial. (#3660) * Adds NthOrderPolynomial class needed for jitterfit (for EIS) to ISIS * Remove incorrect documentation * Update unitTest output * Remove unnecessary Makefile * Adds NthOrderPolynomial class to ISIS needed for jitterfit for EIS (#3639) * Adds NthOrderPolynomial class needed for jitterfit (for EIS) to ISIS * Remove incorrect documentation * Update unitTest output * Remove unnecessary Makefile * Adds ingestion application eis2isis to ISIS (#3638) * Initial commit of eis2isis * Remove references to EISBlob in comments and remove unnecessary Makefiles * Initial checkin of WAC camera model and associated changes to eis2isis. * add truthdata Co-authored-by: Kristin * Update installation instructions for 4.0 release. (#3671) * normalized apps (#3668) * normalized apps * added code for attaching spice tables to cube from ISD * noww featuring brain-dead cube test * added fixtures * readded docs * updated with docs * chnaged test names * Fixes EIS/Clipper-related errors with tests on CI (#3673) * Update meta.yaml to rename conda package to isis from isis3 * Update clipper-related errors discovered by CI * Adds new method to contruct cubes (#3675) * added new methods to Cube, tried to update spiceinit and cube tests * fixed errors * tweaks * syntax errors * re-added cout line that was suppoed to be there * updates as per comments * tempfile.open() lmao * revert j flag Co-authored-by: paarongiroux <47163875+paarongiroux@users.noreply.github.com> * Attempting to fix RollingShutterCameraDetectorMap CI failure on CentOS (#3677) * Update meta.yaml to rename conda package to isis from isis3 * Update maximum iterations to 50 because maxiters=20 is failing in CI on CentOS * added cnet fixture (#3680) * added cnet fixture * removed filelist * update as per comments * updated docs * typo * Campt Error App tests using TestCube fixture (#3679) * Abstracted campt app. * adds campt error app tests using cube fixture, adds new campt method to take in a pointer to a cube * updated variable names * Added default test case. * finished assterts * Changed expect_double_eq to expect_near. * added coordlist and allowoutside tests * removed extra tests, updated APP_XML variable Co-authored-by: Kaitlyn Lee Co-authored-by: Kelvin Rodriguez * added cnetcheck tests (#3681) * added cnetcheck tests * typos * whitespace * forgot the head lmao * forgot the source lmao * removed current cnetcheck tests * added comments * removed results line * Update README.md (#3691) * Initial application + testing refactor for cnetbin2pvl (#3693) * Initial application/testing refactor of cnetbin2pvl * Removed makefile for old test. * Adjusted spacing to better comply with isis3 internal standard. * Removed default cnetbin2pvl testing makefile * Addressed PR comments / reviews. Removed old comment Removed unnecessary cnet write Added default null pointer for progress parameter. * Removed extra whitespace * Added campt tests and removed old Makefile tests (#3687) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Added more tests. * Removed old Makfile tests. * Updated CAMPT_XML to APP_XML. * adds CoordList and AllowOutside test cases Co-authored-by: paarongiroux <47163875+paarongiroux@users.noreply.github.com> * Cmake update to link mission libraries with gtest executable (#3694) * Update meta.yaml to rename conda package to isis from isis3 * Update gtests to link against all the non-isis3 shared libraries built by ISIS * Update to work on macs * Cnet Winnow App Conversion and Functional Test (#3682) * Converted cnetwinnow and added in functional test * Moved cnetwinnow helper function declaration out of the header and back into the cpp * Updated PR based on comments <3 * Forgot Test in test name * Removed old comment and updated docs string * Camstats normalization and test refactor (#3696) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * normalized camstats, added functional tests * removed old test makefile * added docstring Co-authored-by: Kaitlyn Lee * Added temp dir for test files (#3692) * Added temp dir for test files * Moved to fixture inheritance * Added valid check * Updated tests to use new fixtures * Fixed build errors * Fixed build warning * Updated winnow test * Refactored and added cnetstats tests (#3702) * Abstracted cnetstats. * Added default test for cnetstats and cleaned up imports. * Added more tests. * Added exception tests. * Removed unnecessary tests. * Removed old makefiles. * Added docstrings and renamed test. * Added temp dir for test files (#3692) * Added temp dir for test files * Moved to fixture inheritance * Added valid check * Updated tests to use new fixtures * Fixed build errors * Fixed build warning * Updated winnow test * updated tests to pass Co-authored-by: Jesse Mapel Co-authored-by: Kelvin Rodriguez * Initial application + testing refactor for cnetpvl2bin (#3695) * Initial cnetpvl2bin refactor and gtest * Renamed cnetbin2pvlTests.cpp to FunctionalTestsCnetbin2pvl.cpp * Added docstring. * Replaced temporary directory logic with temp dir from fixtures. * Added docstring * Update cmake for gtest again to successfully link against shared libraries (#3699) * Update meta.yaml to rename conda package to isis from isis3 * Update gtests to link against all the non-isis3 shared libraries built by ISIS * Update to work on macs * Update CMakeLists for tests to grab all shared libraries on linux and mac successfully * Autoseed, Footprintinit, and 1/2 of Findimageoverlaps (#3688) * Initial stab at converting autoseed which includes findimageoverlaps and footprintinit (eventually) * Finished autoseed test and added footprintinit test * Finished autoseed and footprintinit tests * Updated autoseed, and tests and addressed PR feedback * Updated footprintinit from feedback * Updated findimageoverlaps based on feedback * Moved enum into the namespace * Adding overlaps list file to data, fixtures, and tests * Fixed path pointing to the wrong file * Finished last autoseed test * Updated autoseed test * Removed unnecessary temp file and renamed footprintinit test * leisa2isis app test conversion and one gtest replacement (#3704) * Update meta.yaml to rename conda package to isis from isis3 * Initial leisa2isis app test conversion and gtest * Remove debug code * Update main.cpp Added a CR at EOF Co-authored-by: Stuart Sides * fixed building errors (#3707) * Leisa2ISIS tests passing (#3708) * fixed building errors * fixed leisa tests * Set MALLOC_CHECK_ in Jenkinsfile as a temporary fix for the failing tests (#3712) * Fix for QMOS not updating lat/lon ranges correctly. (#3714) * qqqqqqmoooooosssssss * added doc string * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * 2.5D Occlusion and Testing Update (#3757) * Adds occlusion handling to cam2map * Added conditional check for occlusion, updated xml * Updated documentation * Converted cam2map to a function style application * Converted map2cam to cpp / functions * Added new cam2map file and test file * Moved cam2map gui helpers into the main.cpp * Added baseline cam2map gtest * Added a projected version of the default cube with a mapping for mars * Updated map2cam for testability * Added a gtest for map2cam * Mocked rubbersheet and added initial cam2map test with mocked process * Added initial mock file. * Added cam2map transform tests, new line scanner fixture, and a mocked camera * Fixed a few things in the cam2map tests * Updated ISD and fixed paths * Added more tests * Updated fromisd with necessary camera load for some data sources * Added cam2map mock tests, added bodies for transform pure virtual funcs * Updated gtest to latest version * Fixed a few things after the rebase * Removed a cout Co-authored-by: Austin Sanders * Multisensor (#3792) * added SCCONFIG parameter to jigsaw * fixed problem with how I was assigning observation numbers, added history comments * fixed problem with how I was removing observation numbers * cleaned up BOSS constructor * more fixes to BOSS constructor * added BOSS gtest * Added jigsaw scconfig app test * Added scconfig with heldlist app test * more updates to xml save test * finished xml save test * Updated with Themis VO data * Updating jigsaw errors Co-authored-by: Peter Aaron Giroux * updated spiceserver version check to include major version (#3791) * updated spiceserver version check to include major version * spiceserver tests added * removed old tests * big binaries are bad * uses different temp file * correcting swapped line sample prints in enlarge application output file (#3797) * correcting swapped line sample prints in output file * Updating unit test truth data to check Results Group * I forgot to add the changed test Co-authored-by: Lauren Adoram-Kershner * PDS2ISIS Docs Update (#3800) * Update to pds2isis docs regarding zero values in 8bit images * Updated docs with recommended verbage. * Updated pds2isis docs based on feedback round 2 * Fixed special pixels link * Fixed a few other special pixels links * Added in missing comma * Fixed typo * Getsn tests (#3790) * Replaced old getsn tests with gtests * removed an old Makefile * getsn? for like get working am I right? (now featuring less spiceinit) Co-authored-by: Kelvin * Fixed cam2map ignoring band specifications on the input cube (#3798) * Added input atts to cam2map * Fixed cam2map ui call * Trying to get vbands working again * Revert gtest * Changed to use GetInputAttribute * Move application-related data into the repository. (#3804) * Adds initial directory structure for appdata in source and update from dev (#3724) * Update meta.yaml to rename conda package to isis from isis3 * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Add directory structure for appdata in source Co-authored-by: Jesse Mapel Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Update CMakeLists process translation files in the ISIS source code. (#3726) * Update meta.yaml to rename conda package to isis from isis3 * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Add directory structure for appdata in source * Update cmakelists to copy translation files over into the appdata/translations area in the build directory. * Update to install appdata * Add appdata/templates directory needed for apollo work. Co-authored-by: Jesse Mapel Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Change ISIS3DATA to ISISDATA (#3728) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Migrates subset of base data to appdata area in source. Fixes CI error. (#3731) * Update meta.yaml to rename conda package to isis from isis3 * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Add directory structure for appdata in source * Update cmakelists to copy translation files over into the appdata/translations area in the build directory. * Update to install appdata * Add appdata/templates directory needed for apollo work. * Migrates everything in maps, labels, and and autoreg into source, adds placeholders for cmake for images and templates, and adds two actual base translation files and associated changes * Actually address all merge conflicts * Add placeholder for serialnumbers Co-authored-by: Jesse Mapel Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Updates cmake to copy apollo templates (#3732) * Just hard-code the apollo templates for now * Updated to have templates only search for *.def * Moving apollo15 data into source (#3733) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * adds apollopantranstable translations * rename apollopantranstable0001.trn -> apollopantranstable.trn * move apollopantranstable0002.trn -> apollopantranstable.trn * adds apollo15 serialNumbers * renaming serial number files * moved SerialNumber0002 -> Apollo15SerialNumber and metricSerialNumber002 -> Apollo15MetricSerialNumber * moved metricSerialNumber0003.trn -> Apollo15MetricSerialNumber.trn * created templates directory and added apollo template. updated apollopaninit and apollopanstitcher to reflect data directory changes * added apollo templates directory * renamed apolloPanFiducialFinder.pvl -> apolloPanFiducialFinder.def * update paths referencing data * fixed redundant naming of apolloPanFiducialFinder.def -> PanFiducialFinder.def * renamed apollopantranstable.trn -> ApolloPanInit.trn, updated reference in source code * changed Instruments translation file to uper camel case * more tweaks to Instruments.trn Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Moving apollo16 data into source (#3734) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * adds apollo16 serialnumbers * moved panoramicSerialNumber0001.trn -> Apollo15PanoramicSerialNumber.trn and metricSerialNumber0001.trn -> ApolloMetricSerialNumber.trn * moved metricSerialNumber0002.trn -> ApolloMetricSerialNumber.trn * moved metricSerialNumber0003.trn -> ApolloMetricSerialNumber.trn * fixed serialnumber file naming * removed serialnumbers DELETEME file Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Moving apollo17 data into source (#3735) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * adds apollo17 serialnumber files * moved metricSerialNumber0001.trn -> Apollo17MetricSerialNumber.trn and panoramicSerialNumber0001.trn -> Apollo17PanoramicSerialNumber.trn * moved metricSerialNumber0002.trn Apollo17MetricSerialNumber.trn * moved metricSerialNumber0003.trn -> Apollo17MetricSerialNumber.trn * remove serialnumbers DELETEME file Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Moved Juno data files into source code (#3736) * Added translation files. * Renamed junoSerialNumber0001.trn * Updated Preference file to use ISISDATA env variable for juno. * Moved SN xfile to appdata and updated app to point to appdata/translations. * Removed commented line. * Renamed files to be upper camel case. * Fixed typo. * Moved Mex data files into source code (#3738) * Added translation files. * Renamed hrscSerialNumber0001.trn * Renamed Xfiles, updated app to point to /appdata/translations, and moved SN xfile to appdata. * Renamed files to be upper camel case. * Removed commented line Co-authored-by: Stuart Sides * Moved Dawn data files into source code (#3739) * Set MALLOC_CHECK_ in Jenkinsfile as a temporary fix for the failing tests * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Copied dawn serial number files. * renamed files. * Updated serial number file with the most recent version. * copied over some xfiles. * New version. * updated to new version. * Added xfile. * New xfile. * new version. * new version. * new version. * copied xfile. * new version. * updated version. * copied xfile. * copied xfile. * updated version. * updated apps. * Updated env variable in preferences files. * Renamed files to be upper camel case. * Removed commented lines. * Renmaed serial number files to be upper camel case. Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Migrates application data from base into source (#3740) * Just hard-code the apollo templates for now * Updated to have templates only search for *.def * Add CMakeLists updates to support lro * Migrate icons and targets and update source code as needed * Migrate remaining base translation files and make any additional needed code changes * Move base serial number to serial numbers directory * Remove unneeded additional serial number trn file * Update LRO appdata (#3742) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Converted LRO mission to new data area * Added MiniRF format files * Add pft files * Update typ paths, and add LRO serial number files * Moved Messenger data into source (#3745) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * moved mdessenger translation files into source * moved mdisArchive translation files to MessengerMdisArchive.trn * moved mdisBandBin translation files to MessengerMdisBandBin.trn * moved mdisInstrument translation files to MessengerMdisInstrument.trn * moved mdisCDRLabel translation files to MessengerMdisCdrLabel.trn * moved mdisDDRLabel translation files to MessengerMdisDdrLabel.trn * added translations directory with mdisCalibration translation files * moved mdisCalibration files to MessengerMdisCalibration.trn * updated mdis apps references to translation files. * renamed mdisSerialNumber files to MessengerMdisSerialNumber.trn * copied over mdis template files to source * renamed mdis template files * update references to template files in source code * changed naming and references of template files Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level (#3746) * moved Kaguya data into source (#3747) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * copied over translation files from data area * renamed kaguya translation files to upper camel case. Updated references to these files in source code. Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Move template files into revision control (#3748) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * Added templates files to revision control * Update source files to use moved template files * Moved Cassini data into source (#3744) * Added ciss2isis files. * Added first version of file. * Added new version. * Renamed new version. * Updated vims2isis * Added cassini iss sn files. * New version. * New version. * Added cassini vims sn files. * Updated vims sn to v2. * Updated vims sn to v3. * Newhorizons data (#3749) * Abstracted campt app. * Revert "Merge branch 'campt' of https://github.com/kaitlyndlee/ISIS3 into dev" This reverts commit 521dd44a6831b488052aa0e21e65ca3c5f40f7f1, reversing changes made to 2874acf628c944823f317ebd1a2525d15dee497b. * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * moved over translation and serialnumber files from isis3 data area into source * renaming translation and serial number files to fit naming conventions * updated references to newhorizons data are in application source code * fixed filename typo * actually fixed file name typo this time * isis/src/newhorizons/apps/leisa2isis/NewHorizonsLeisaKernels_fit.trn removed comment from leisa kernels translation file Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * moved hayabusa2 data into source (#3752) * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * moves hayabusa2 translation and serial number files into source * renamed translation files to match naming conventions * updates references to translation files Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * moved hayabusa data into source (#3751) * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * moves hayabusa translation and serial file numbers from isis data area into source * renamed translation and serial number files to match convention * updated references to translation files in source code Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Fix unit test failures associated with base data area update. (#3753) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * Update classes and tests with base-area changes that were uncovered via CI tests failing * Moved Near Data into Source (#3755) * Set MALLOC_CHECK_ in Jenkinsfile as a temporary fix for the failing tests * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Added near translation files. Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Appdata for viking 1 and 2 (#3743) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Converted LRO mission to new data area * Added MiniRF format files * Add pft files * Update typ paths, and add LRO serial number files * Move Viking 1 data files into git source repo * Additions to initial commit of Viking 1 and 2, move data to repo * Updated serial number file names * Removed uneeded translations and fixed now that there is one file per instrument * Updating Application data for LRO (#3758) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Converted LRO mission to new data area * Added MiniRF format files * Add pft files * Update typ paths, and add LRO serial number files * Fixed LRO serial number file names * Moved MGS data into source (#3754) * Set MALLOC_CHECK_ in Jenkinsfile as a temporary fix for the failing tests * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Added moc2isis translation files. * Added serial number files. * SN file v2. * SN file v3. * SN file v4. * Removed from unit test. * Updated truth data. * Update truthdata to strip out path before mgs * Update unit test Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Moved Odyssey Data into Source (#3750) * Set MALLOC_CHECK_ in Jenkinsfile as a temporary fix for the failing tests * Used CK quality for PCK selection in spiceinit (#3716) * Changed PCK to use CK quality in spiceinit * Added spiceinit history for change * Adds the ability to save and restore a greyscale stretch to/from a Cube (#3717) * Update meta.yaml to rename conda package to isis from isis3 * Initial stretch attempt * Now will write a single stretch with a name and type to the cube * Stretch updated to inherit from Blob, re-loading a saved stretch works but only if Linear right now * Clean up Stretch class * Completely move stretchTypes into stretch class, and some minor cleanup * Fixed combo-box not updating bug and more cleanup * Further cleanup of propagated earlier changes with types and names being removed from unnecessary classes * Removed added unneeded member variables from StretchType * Cleanup StretchTool class * Update enter-text dialogs to drop down selection options * Wrapped some long strings * Initial commit to address most of review comments * Removed buttons in case of RGB stretch and add a 'Color' PvlKeyword to Stretch output Co-authored-by: Stuart Sides * Updated kaguyatc2isis to allow ingestion of data provided by JAXA online archive (#3713) * Updated to allow ingestion of data provided by JAXA online archive * Listed SLN-L-TC-5-MORNING-MAP-V4.0 as a supported format. * Added tests + testing data * Replaced several label parsing tests with cube attribute tests. * Fixes ddd2isis to support updated uvflat files (#3719) * Fixes ddd2isis to support updated uvflat files * Added history comment * Changed version numbers for 4.1 RC (#3722) * Added themis sn files. * Updated sn file to v2. * Updated sn file to v3. * Updated sn file to v4. * Updated Pipeline's truth data since it had references to . * New truth data. * Updated pipeline truth data. Co-authored-by: Jesse Mapel Co-authored-by: Kristin Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette * Move application data from ISIS3DATA to git repo for Voyager 1 and 2 (#3759) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Converted LRO mission to new data area * Added MiniRF format files * Add pft files * Update typ paths, and add LRO serial number files * Fixed LRO serial number file names * Adding Voyager 1 and 2 application files to repo from the data area * Moved the voyager translation files to voy2isis * Moves tgo application data into source control and also fixes other assorted issues that were causing tests to fail (#3756) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * Move tgo translation files into revision control and update apps accordingly * Fix some failing tests unrelated to tgo * Update TestPreferences file. * Make necessary changes to tgocassis2isis and put in debug output for other baffling failing tests on Jenkins * Fix failing tgo tests and update SerialNumber class to use the correct new file names * Clean up commented-out groups from translation files * Fixed spiceinit path to MissionName2DataDir.trn * Modify path of Map formatting file to point to the /scratch/localhome/kberry/dev/ISIS3/appdata-debug/appdata/ area * Update paths to map files in applications that use map templates (#3760) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Initial commit of files with map paths that needed to be updated * Moves lo-associated appdata into the repository (#3761) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * Initial move of lo into git repo * Add addition lo files to git repo * Update lo data into source to get tests passing * Moves Clementine-related appdata into repository (#3762) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Move clementine appdata into repo * Moves Mariner10 related appdata into the repo (#3763) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Move appdata for Mariner10 into repo and associated updates * Moves MER-related appdata into the repo (#3764) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Migrate MER appdata into the repo * Update Instruments.trn for MER * Moves Rosetta-related application data into this repo (#3765) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Update rosetta by moving appdata into the repo * Move application-related data for mro into repo (#3766) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Move appdata files for mro into repo * Chandrayaan1 changes for #3727 (#3768) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Converted LRO mission to new data area * Added MiniRF format files * Add pft files * Update typ paths, and add LRO serial number files * Fixed LRO serial number file names * Adding Voyager 1 and 2 application files to repo from the data area * Adding Chandrayaan1 to appdata * Removed Chandrayaan1 MiniRf test embeded in the M3 tests * Fixed mistakes * Add missing lo translation file (#3769) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Added missing Lo translation file. Fixes failing lo2isis_app_test_case03 test * Move Galileo application data into the repo (#3770) * Changeing env variable ISIS3DATA to ISISDATA * Changed ISIS3DATA to ISISDATA and pointed to new data area * Updating PR with new location of ISISDATA * Converted LRO mission to new data area * Added MiniRF format files * Add pft files * Update typ paths, and add LRO serial number files * Fixed LRO serial number file names * Adding Voyager 1 and 2 application files to repo from the data area * Adding Chandrayaan1 to appdata * Removed Chandrayaan1 MiniRf test embeded in the M3 tests * Adding Galileo and changed permissions on TGO trn files * Update GalileoNIMSCoreBandBin.trn * Update GalileoNIMSSuffixBandBin.trn * Removed ISIS3DATA from base apps (#3771) * Removed ISIS3DATA from base apps * Removing ISIS3DATA from base/objs * more ISIS3DATAs * more ISIS3DATAs * Other non base ISIS3DATAs * Remove ISIS3DATA from docsys * Update maptemplate.xml * Update smtk.xml * Update unitTest.xml * Fixed another file name * Fix unit test failures in appdata branch (#3772) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Fixes XmlToPvlTranslationManager unit test failure after migrating appdata to repo * Forgot the truth file update * Update $base paths for files moved into the repo, add noproj template, and remove unused file. (#3773) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Update references to for files that have been moved into the appdata area * Removed unused file * Removed references to Standard Pref file (#3774) * Removed ISIS3DATA from base apps * Removing ISIS3DATA from base/objs * more ISIS3DATAs * more ISIS3DATAs * Other non base ISIS3DATAs * Remove ISIS3DATA from docsys * Update maptemplate.xml * Update smtk.xml * Update unitTest.xml * Fixed another file name * Removed local Standard preference file references and took all but the ShapeModel group out of the other two preference files in the input dir * Adds rolo translation files to repo, fixes additional paths to point to data in the repo. (#3775) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Remove unneeded references to DataDirectory, fix paths where needed, and add rolo translation files to this repo * Fix failing lrowac2pds and mrf2pds tests on appdata branch (#3776) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Remove unneeded references to DataDirectory, fix paths where needed, and add rolo translation files to this repo * Fix failing lrowac2pds and mrf2pds tests on appdata branch * Fix scripts to use isis_testData and fix app tests (#3777) * Removed ISIS3DATA from base apps * Removing ISIS3DATA from base/objs * more ISIS3DATAs * more ISIS3DATAs * Other non base ISIS3DATAs * Remove ISIS3DATA from docsys * Update maptemplate.xml * Update smtk.xml * Update unitTest.xml * Fixed another file name * Removed local Standard preference file references and took all but the ShapeModel group out of the other two preference files in the input dir * Moving ISIS3DATA to ISISDATA fixing apptests * Fixing app tests * App test fixes (#3779) * Removed ISIS3DATA from base apps * Removing ISIS3DATA from base/objs * more ISIS3DATAs * more ISIS3DATAs * Other non base ISIS3DATAs * Remove ISIS3DATA from docsys * Update maptemplate.xml * Update smtk.xml * Update unitTest.xml * Fixed another file name * Removed local Standard preference file references and took all but the ShapeModel group out of the other two preference files in the input dir * Moving ISIS3DATA to ISISDATA fixing apptests * Fixing app tests * More app test fixes * Fixes mro test failures in appdata branch (#3778) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Remove unneeded references to DataDirectory, fix paths where needed, and add rolo translation files to this repo * Fixes failing mro tests and remove unused label file in chan1 * Update MroHirisePdsRdrEqui.pft * Update MroHirisePdsRdrEquiJP2.pft * Update MroHirisePdsRdrPolarJP2.pft * Update MroHirisePdsRdrPolar.pft * Update MroHirisePdsRdrPolar.pft * Fixes failing hirdrgen tests in appdata branch (#3782) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Remove unneeded references to DataDirectory, fix paths where needed, and add rolo translation files to this repo * Fixes failing mro tests and remove unused label file in chan1 * Remove reference to ISIS3DATA (#3783) * Removed ISIS3DATA from base apps * Removing ISIS3DATA from base/objs * more ISIS3DATAs * more ISIS3DATAs * Other non base ISIS3DATAs * Remove ISIS3DATA from docsys * Update maptemplate.xml * Update smtk.xml * Update unitTest.xml * Fixed another file name * Removed local Standard preference file references and took all but the ShapeModel group out of the other two preference files in the input dir * Moving ISIS3DATA to ISISDATA fixing apptests * Fixing app tests * More app test fixes * Remove ref to ISIS3DATA * Remove unnecessary TestPreferences file from ISIS (#3780) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Remove unneeded references to DataDirectory, fix paths where needed, and add rolo translation files to this repo * Fixes failing mro tests and remove unused label file in chan1 * Remove un-needed TestPreferences file and remove from install * Fixes individual ISIS applications missing icons in appdata branch (#3784) * Fix missed ProcessImportPds base references and update CMakelists to move translation files from the ISIS3/isis/src/missionName/translations level * merge cmakelists * Remove unneeded references to DataDirectory, fix paths where needed, and add rolo translation files to this repo * Fixes failing mro tests and remove unused label file in chan1 * ../isis/src/base/objs/Gui/Gui.cpp * Fixed icons not showing up in individual ISIS apps in appdata branch * Replace ISIS3TESTDATA with ISISTESTDATA and update Jenkinsscript to use the new data area (#3785) * Move Europa Clipper data files into repo (#3787) * Removed ISIS3DATA from base apps * Removing ISIS3DATA from base/objs * more ISIS3DATAs * more ISIS3DATAs * Other non base ISIS3DATAs * Remove ISIS3DATA from docsys * Update maptemplate.xml * Update smtk.xml * Update unitTest.xml * Fixed another file name * Removed local Standard preference file references and took all but the ShapeModel group out of the other two preference files in the input dir * Moving ISIS3DATA to ISISDATA fixing apptests * Fixing app tests * More app test fixes * Remove ref to ISIS3DATA * Moved Europa Clipper data files to reop * Update ClipperEisCore.trn Co-authored-by: Kristin * Add osirisrex translation files to repo (#3789) * move lopdsgen out of templates into translations, add hidtmgen template, add controlnetwork template (#3793) * Moves maps and labels under templates in appdata (#3794) * move lopdsgen out of templates into translations, add hidtmgen template, add controlnetwork template * Move maps under appdata/templates * Move labels and maps under templates * Fixes mdiscal and osirisrex test failures in appdata branch (#3799) * move lopdsgen out of templates into translations, add hidtmgen template, add controlnetwork template * Fixes mdiscal and osirisrex test failures in appdata branch * Cmake update for appdata branch (#3803) * move lopdsgen out of templates into translations, add hidtmgen template, add controlnetwork template * tesitng * Update cmakelists again * Cmake update * Update path in spiceserver from merge failure (#3808) * Update viking serial number translation files for backwards compatabi… (#3811) * Update viking serial number translation files for backwards compatability * Readd default option for translation Co-authored-by: Jesse Mapel Co-authored-by: Stuart Sides Co-authored-by: AustinSanders Co-authored-by: acpaquette Co-authored-by: paarongiroux <47163875+paarongiroux@users.noreply.github.com> Co-authored-by: Kaitlyn Lee Co-authored-by: Jesse Mapel Co-authored-by: AustinSanders Co-authored-by: acpaquette * Updates cassini vims visable light cub calibration to use the old vis_perf files (#3807) * Upate IsisPreferences for backwards compatability with cubes created with versions of ISIS prior to 4.1 using ISIS3DATA env var * Reformatted slpmap documentation (#3809) * Set MALLOC_CHECK_ in Jenkinsfile as a temporary fix for the failing tests * Fixed typos in slpmap documentation. * Reformatted documentation. * Update slpmap.xml Co-authored-by: Kristin * update hyb2onc2isis to support newer image format * Changed jitterfit test to use a csv * Update README.md Updates README to remove the ISIS3 header and to include the Zenodo DOI for citing our work. * Update README.md * Make gtests resillient to error printing (#3820) * correcting swapped line sample prints in output file * Updating unit test truth data to check Results Group * I forgot to add the changed test * Removing period is search phrases Co-authored-by: Lauren Adoram-Kershner * Updated build script to set ISISROOT prior to build * Add support for MacOS 10.14, needed for make base tests * Adds support for JAXA archive Level 2B2 images to Kaguya MI in ISIS. (#3823) * Get kaguyami2isis working with l2b2 images from Jaxa archive and update unittest to includes images of this type. * Updated documentation to include level 2B2 support. * Added NIR image to unit test Co-authored-by: Kaitlyn Lee * Fix: hyb2onccal expects 2nd coord of ROI to be called X4, Y4; not X2, Y2 (#3827) * Fixed tc data set IDs (#3830) * Change to a CC0-based license. (#3831) * Change to a CC0-based license. * I always forget the link syntax. * Adds image data to the default cube fixture and enlarge tests (#3840) * refactored enlarge. * Added setinputcube call. * Removed return from setinputcube. * Removed print. * Added fixture for adding image data to a cube. * Need to add changed files to a different machine. * Changed SetOutputCube call so we can pass in the ui object. * Added enlarge tests. * Removed Makefile tests. * Added CubeAttribute. * Fixed typo. * Refactored opening input cube * Update README.md (#3844) That space is kinda important. ;) * Fix: update to reflect license change .txt --> .md (#3843) License file was changed from LICENSE.txt to LICENSE.md in ffa861e * Add support for Mars Express HRSC SRC instrument (#3826) * Add support for MacOS 10.14, needed for make base tests * Add support for MEX SRC instrument * Fixs found by PR review * Fixed PR issues * Tweaking translation * Added exposure duration * Adding in the SRC model * Now with lat/lon, and test updates * Adding Mex SRC Camera unitest * Fix spelling in application docs. Co-authored-by: Kristin * Instructions for using conda packages in different environments (#3835) * Added instructions for using conda packages in different environment than ISIS. * Fixed typos. * Changes from PR discussion with Jay. * Typo fixes (why can't I ever just do one commit?) and ISIS3 cleanup. * More typos ... grr. * Spelling fix. * Changes suggested by Jesse. * updated with new isd format (#3839) * updated with new isd format * removed missed debug prints * changed header stuff for ale * updated env * Added reference for boilerplate text. (#3845) * Added reference for boilerplate text. * Cleaned up SPDX line comment and refined text per Jesse's comment. * added authors list as per ISIS_TC action item, (#3867) * added authors list as per ISIS_TC action item, need to figure out some first name only authors still * Converted some e-mails to names * Fixed alphabetical order and removed duplicate * Update AUTHORS.rst Lee -> Kaitlyn Lee * Removed old Michael * Removed Oxez as duplicate Co-authored-by: Jesse Mapel * Fixes Jenkins errors: Revert "updated with new isd format" (#3888) * Revert "updated with new isd format (#3839)" This reverts commit e926548c06d7f60937f76975ab40dea8ac19b514. * Un-revert environment.yml and include changes * Updated GCC4 environment (#3889) * Updated GCC4 environment * Fixed warning in SpiceRotation unit test * Removed tracking table warning * MacOS tests (#3887) * Adds k8s dockerfile & updates Jenkinsfile * Updates Make config for Mac 10.15 * added mac 15 config * custom workspace * lower macx * removed custom workspace * uuuuugh * envs * sdafl;kajsdf * added retry on checkout * changed grep line * upped the retrys * changed grep * changed grep * simplified tests for exception checking * SpiceRotation os truth * Jenkinsfile ISIS3 env -> ISIS env * revert conda env name * Jenkinsfile env update Co-authored-by: Evin Dunn Co-authored-by: isis3mgr * Added small cube with image data fixture (#3893) * Added small cube fixture * fixed double definition * mappt will now report physical band number (#3890) * mappt will now report physical band number * added filter name output * translated tests * allowoutside tests now check pvl * now more tests * removed prints * Added and tested functionality for 'N/A' stats calculation. (#3895) * Added and tested functionality for 'N/A' stats calculation. * Added changelog and updated style to conform with isis standards. * Closed cube file and deleted cube after propagating tables (#3899) * Update PolarStereographic projection to directly translate ISIS's center longitude value (#3900) * Added closing tag for changelog. (#3902) * Test Fixes (#3898) * added findutils * temp output for findfeatures * embree tests rounding * re-added prints * Isis2ascii Header Update (#3903) * Updated the isis2ascii header to be more CSV friendly * Changed isis2ascii header from colmnar data to be more header like * Updated app and added gtests * Updated special pixel test and added fixture based on feedback * Added the ability to skip special pixels in phocube (#3897) * Added ignore special pixels parameter and new test * Forgot to include change to xml file * Changed process function to lambda function to get rid of global variables * Response to comments * Speed up q-isis applications by decreasing the number of times CubeViewport::paintPixmap() gets a new stretch (#3906) * Update CubeViewport class to speed up q-isis applications by moving getStretch out of for-loop * Add time-saving fix to rgb stretches, too, and update docs in header * Linux test fixes (#3911) * fab af * added find image overlap tests overlap * removed old test * isis2ascii spacing fix (#3910) * Increased the width of ascii DN output from 13 spaces to 14 spaces * Removed old ISIS test make files * Addresses PR feedback * Added a test for a custom delimiter * Added new delimiter to header * Added optional logging to cnetcombinept (#3907) * Added simple logging to cnetcombinept logic * Now outputing? * cnetcombinept test conversion * Cleaned up fixture * Added merge log test * Added starting and ending measure counts * Fixed app docs * Add local solar time option to phocube (#3912) * Add local solar time option to phocube * Add missing ticket number * Added more documentation updates for adding localsolartime to phocube * Updated logic so that min/max are not calculated if values are provided (#3909) * Updated logic so that min/max are no longer calculated if values are provided. * Resolved memory leak * added mappt coordlist functionality (#3905) * added mappt coordlist functionality * include guards * more copy paste errors * uuuuuuuuuggggghhhh * reverted campt.xml * updated docs * added flatfile output and associated tests * addressing Kristin's comment * left in group selection * removed couts * Changed histogram binning logic (#3918) * Changed how the bins are calculated and where the data goes. * Changed hist's output to align with the changes to Histogram * Added changes to cnethist * Added history entries * Changed histogram binning logic * Added ui.interactive check * Removed extra history end tag Co-authored-by: Kaitlyn Lee * Ticked ALE to 0.8.1 Co-authored-by: Kristin Co-authored-by: paarongiroux <47163875+paarongiroux@users.noreply.github.com> Co-authored-by: Kaitlyn Lee Co-authored-by: Stuart Sides Co-authored-by: Jesse Mapel Co-authored-by: kledmundson <6842706+kledmundson@users.noreply.github.com> Co-authored-by: acpaquette Co-authored-by: Summer Stapleton Co-authored-by: Jesse Mapel Co-authored-by: jlaura Co-authored-by: egaultUSGS <47678984+egaultUSGS@users.noreply.github.com> Co-authored-by: acpaquette Co-authored-by: dcookastro <34168267+dcookastro@users.noreply.github.com> Co-authored-by: Oleg Alexandrov Co-authored-by: jlaura Co-authored-by: K.-Michael Aye Co-authored-by: K.-Michael Aye Co-authored-by: Peter Giroux Co-authored-by: evindunn-usgs <47226513+evindunn-usgs@users.noreply.github.com> Co-authored-by: ascbot <41846569+ascbot@users.noreply.github.com> Co-authored-by: Andrew Annex Co-authored-by: Ross Beyer Co-authored-by: Lauren Adoram-Kershner <42873279+ladoramkershner@users.noreply.github.com> Co-authored-by: Austin Sanders Co-authored-by: Lauren Adoram-Kershner Co-authored-by: tgiroux <62255438+tgiroux@users.noreply.github.com> Co-authored-by: AustinSanders Co-authored-by: Aaron Curtis Co-authored-by: Evin Dunn Co-authored-by: isis3mgr --- .github/ISSUE_TEMPLATE/1_Bug_report.md | 19 + .github/ISSUE_TEMPLATE/2_Feature_request.md | 13 + .github/ISSUE_TEMPLATE/3_Support_question.md | 15 + .../ISSUE_TEMPLATE/4_Documentation_issue.md | 13 + .github/pull_request_template.md | 2 +- .gitignore | 5 +- AUTHORS.rst | 67 + CONTRIBUTING.md | 127 +- Jenkinsfile | 245 +- LICENSE.md | 44 + LICENSE.txt | 24 - README.md | 467 ++- docker/centos.dockerfile | 30 + docker/fedora.dockerfile | 32 + docker/ubuntu.dockerfile | 33 + environment.yml | 95 +- environment_gcc4.yml | 96 +- gtest | 2 +- isis/CMakeLists.txt | 237 +- isis/IsisPreferences | 74 +- isis/TestPreferences | 71 +- .../autoreg/coreg.adaptgruen.p1515s3030.def | 256 ++ .../autoreg/coreg.maxcor.p1515.s3030.def | 163 ++ .../autoreg/coreg.maxcor.p2020.s5050.def | 163 ++ .../autoreg/coreg.mindif.p1515.s3030.def | 168 ++ .../autoreg/coreg.mindif.p2020.s5050.def | 168 ++ isis/appdata/autoreg/default.def | 31 + isis/appdata/autoreg/findrx.def | 22 + isis/appdata/autoreg/gruen_default.def | 29 + isis/appdata/autoreg/qnetReg.def | 21 + isis/appdata/images/icons/3d-glasses-icon.png | Bin 0 -> 768 bytes .../appdata/images/icons/HILLBLU_molecola.png | Bin 0 -> 13747 bytes isis/appdata/images/icons/add.png | Bin 0 -> 1055 bytes isis/appdata/images/icons/add_large.png | Bin 0 -> 65896 bytes .../images/icons/applications-system.png | Bin 0 -> 1836 bytes .../images/icons/archive-insert-directory.png | Bin 0 -> 1786 bytes isis/appdata/images/icons/back.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/blink.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/blinkAdvance.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/blinkReverse.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/blinkStart.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/blinkStop.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/button_cancel.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/button_ok.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/camera-photo.png | Bin 0 -> 1201 bytes isis/appdata/images/icons/camera.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/color_line.png | Bin 0 -> 1995 bytes isis/appdata/images/icons/colorize.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/contexthelp.png | Bin 0 -> 2125 bytes isis/appdata/images/icons/copy_bands.png | Bin 0 -> 4254 bytes isis/appdata/images/icons/copy_stretch.png | Bin 0 -> 2084 bytes .../appdata/images/icons/document-save-as.png | Bin 0 -> 2152 bytes isis/appdata/images/icons/document-save.png | Bin 0 -> 1263 bytes isis/appdata/images/icons/down.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/edit.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/editcopy.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/editdelete.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/editpaste.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/exec.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/exit.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/fileclose.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/fileexport.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/filefind.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/filenew.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/fileopen.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/fileprint.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/filesave.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/filesaveas.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/find.png | Bin 0 -> 1232 bytes .../images/icons/folder-activities.png | Bin 0 -> 1685 bytes isis/appdata/images/icons/folder-image.png | Bin 0 -> 1633 bytes isis/appdata/images/icons/folder-orange.png | Bin 0 -> 1505 bytes isis/appdata/images/icons/folder-red.png | Bin 0 -> 1412 bytes isis/appdata/images/icons/folder-remote.png | Bin 0 -> 2336 bytes isis/appdata/images/icons/folder.png | Bin 0 -> 1387 bytes isis/appdata/images/icons/forward.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/frame_query.png | Bin 0 -> 2084 bytes .../images/icons/get-hot-new-stuff.png | Bin 0 -> 1998 bytes isis/appdata/images/icons/global_stretch.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/goto.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/gray.png | Bin 0 -> 4254 bytes isis/appdata/images/icons/grid.png | Bin 0 -> 207 bytes isis/appdata/images/icons/guiClearLog.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/guiExit.png | Bin 0 -> 1119 bytes isis/appdata/images/icons/guiNextHistory.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/guiPrevHistory.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/guiReset.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/guiRun.png | Bin 0 -> 1352 bytes isis/appdata/images/icons/guiSaveLog.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/guiStop.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/help-contents.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/histogram.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/ice.png | Bin 0 -> 2895 bytes isis/appdata/images/icons/info.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/kchart.png | Bin 0 -> 1909 bytes isis/appdata/images/icons/labels.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/license.txt | 11 + .../images/icons/licenses/ATTRIBUTES.txt | 2 + .../images/icons/licenses/lgpl-3.0.txt | 166 ++ isis/appdata/images/icons/linefit.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/link.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/link_valid.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/linked.png | Bin 0 -> 2084 bytes .../images/icons/mActionExportMapServer.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/mActionFileSave.png | Bin 0 -> 2084 bytes .../images/icons/mActionFileSaveAs.png | Bin 0 -> 2084 bytes .../images/icons/mActionHelpContents.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/mActionLabel.png | Bin 0 -> 2084 bytes .../images/icons/mActionMoveVertex.png | Bin 0 -> 918 bytes isis/appdata/images/icons/mActionSelect.png | Bin 0 -> 1086 bytes isis/appdata/images/icons/measure.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/mouse.png | Bin 0 -> 16598 bytes isis/appdata/images/icons/move.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/nasa_enceladus.png | Bin 0 -> 1738 bytes isis/appdata/images/icons/nasa_europa.png | Bin 0 -> 2998 bytes isis/appdata/images/icons/nasa_mars.png | Bin 0 -> 2682 bytes isis/appdata/images/icons/nasa_titan.png | Bin 0 -> 2593 bytes .../images/icons/network-server-database.png | Bin 0 -> 1569 bytes isis/appdata/images/icons/nomenclature.png | Bin 0 -> 2084 bytes .../appdata/images/icons/office-chart-pie.png | Bin 0 -> 2176 bytes isis/appdata/images/icons/ographic.png | Bin 0 -> 930 bytes isis/appdata/images/icons/openList.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_clear.png | Bin 0 -> 2173 bytes isis/appdata/images/icons/plot_configure.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_copy.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_grid.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_hideCurves.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_markers.png | Bin 0 -> 1549 bytes .../images/icons/plot_renameLabels.png | Bin 0 -> 380 bytes .../images/icons/plot_renameLables.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_resetscale.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_setScale.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_showCurves.png | Bin 0 -> 2084 bytes .../images/icons/plot_switchBackgrd.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/plot_table.png | Bin 0 -> 2084 bytes .../preferences-desktop-launch-feedback.png | Bin 0 -> 1654 bytes .../images/icons/preferences-plugin.png | Bin 0 -> 1763 bytes isis/appdata/images/icons/qmos_area.png | Bin 0 -> 2454 bytes isis/appdata/images/icons/quickopen.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_NoWarning.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_Warning.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_angle.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_circle.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_ellipse.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_line.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_polygon.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/qview_rectangle.png | Bin 0 -> 2084 bytes .../images/icons/qview_rotated_rectangle.png | Bin 0 -> 2084 bytes .../images/icons/qview_segmentedline.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/rating.png | Bin 0 -> 1504 bytes isis/appdata/images/icons/redDot.png | Bin 0 -> 324 bytes isis/appdata/images/icons/redo.png | Bin 0 -> 2084 bytes .../images/icons/regional_stretch-2.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/reload.png | Bin 0 -> 1793 bytes isis/appdata/images/icons/rgb.png | Bin 0 -> 4254 bytes isis/appdata/images/icons/savechips.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/scatterplot.png | Bin 0 -> 2084 bytes .../images/icons/scatterplotalarming.png | Bin 0 -> 2084 bytes .../images/icons/scatterplotcontour.png | Bin 0 -> 1316 bytes isis/appdata/images/icons/sort.png | Bin 0 -> 1798 bytes isis/appdata/images/icons/spatial_plot.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/spectral_plot.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/statistics.png | Bin 0 -> 203 bytes .../stock_draw-connector-with-arrows.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/stretch_global.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/sunshadow.png | Bin 0 -> 2084 bytes .../images/icons/svg/application-exit.svgz | Bin 0 -> 6543 bytes .../applications-education-miscellaneous.svgz | Bin 0 -> 2710 bytes .../icons/svg/applications-graphics.svgz | Bin 0 -> 29253 bytes .../icons/svg/applications-internet.svgz | Bin 0 -> 202524 bytes .../images/icons/svg/applications-system.svgz | Bin 0 -> 4119 bytes .../images/icons/svg/archive-extract.svgz | Bin 0 -> 6812 bytes .../icons/svg/archive-insert-directory.svgz | Bin 0 -> 115956 bytes isis/appdata/images/icons/svg/back.svgz | Bin 0 -> 4019 bytes .../appdata/images/icons/svg/blockdevice.svgz | Bin 0 -> 3120 bytes .../images/icons/svg/camera-photo.svgz | Bin 0 -> 7877 bytes isis/appdata/images/icons/svg/configure.svgz | Bin 0 -> 4630 bytes isis/appdata/images/icons/svg/contents2.svgz | Bin 0 -> 2540 bytes .../images/icons/svg/dialog-cancel.svgz | Bin 0 -> 1731 bytes .../images/icons/svg/dialog-ok-apply.svgz | Bin 0 -> 3480 bytes .../images/icons/svg/dialog-warning.svgz | Bin 0 -> 4805 bytes .../images/icons/svg/document-edit.svgz | Bin 0 -> 11441 bytes .../images/icons/svg/document-new.svgz | Bin 0 -> 3949 bytes .../images/icons/svg/document-open.svgz | Bin 0 -> 210035 bytes .../images/icons/svg/document-preview.svgz | Bin 0 -> 18613 bytes .../images/icons/svg/document-print.svgz | Bin 0 -> 25273 bytes .../images/icons/svg/document-save-as.svgz | Bin 0 -> 63101 bytes .../images/icons/svg/document-save.svgz | Bin 0 -> 58013 bytes isis/appdata/images/icons/svg/down.svgz | Bin 0 -> 5991 bytes .../images/icons/svg/draw-arrow-back.svgz | Bin 0 -> 2339 bytes .../images/icons/svg/draw-arrow-forward.svgz | Bin 0 -> 2425 bytes .../appdata/images/icons/svg/draw-circle.svgz | Bin 0 -> 1830 bytes .../images/icons/svg/draw-ellipse.svgz | Bin 0 -> 1921 bytes .../images/icons/svg/draw-freehand.svgz | Bin 0 -> 9799 bytes .../images/icons/svg/draw-polyline.svgz | Bin 0 -> 4553 bytes .../images/icons/svg/draw-rectangle.svgz | Bin 0 -> 4204 bytes .../images/icons/svg/draw-triangle3.svgz | Bin 0 -> 1868 bytes isis/appdata/images/icons/svg/edit-copy.svgz | Bin 0 -> 4888 bytes .../appdata/images/icons/svg/edit-delete.svgz | Bin 0 -> 19200 bytes isis/appdata/images/icons/svg/edit-find.svgz | Bin 0 -> 7353 bytes isis/appdata/images/icons/svg/edit-paste.svgz | Bin 0 -> 12987 bytes .../appdata/images/icons/svg/edit-select.svgz | Bin 0 -> 4469 bytes isis/appdata/images/icons/svg/fileclose.svgz | Bin 0 -> 3505 bytes isis/appdata/images/icons/svg/fill-color.svgz | Bin 0 -> 10344 bytes .../images/icons/svg/folder-activities.svgz | Bin 0 -> 94683 bytes .../images/icons/svg/folder-image.svgz | Bin 0 -> 388114 bytes .../images/icons/svg/folder-orange.svgz | Bin 0 -> 88460 bytes isis/appdata/images/icons/svg/folder-red.svgz | Bin 0 -> 912335 bytes .../images/icons/svg/folder-remote.svgz | Bin 0 -> 282625 bytes isis/appdata/images/icons/svg/folder.svgz | Bin 0 -> 88357 bytes isis/appdata/images/icons/svg/forward.svgz | Bin 0 -> 5355 bytes .../images/icons/svg/get-hot-new-stuff.svgz | Bin 0 -> 6598 bytes .../images/icons/svg/help-contents.svgz | Bin 0 -> 768880 bytes .../appdata/images/icons/svg/input-mouse.svgz | Bin 0 -> 6430 bytes isis/appdata/images/icons/svg/kchart.svgz | Bin 0 -> 18048 bytes .../images/icons/svg/layer-visible-on.svgz | Bin 0 -> 10515 bytes isis/appdata/images/icons/svg/list-add.svgz | Bin 0 -> 3730 bytes .../images/icons/svg/mail-attachment.svgz | Bin 0 -> 1419 bytes .../images/icons/svg/mail-reply-sender.svgz | Bin 0 -> 8307 bytes .../appdata/images/icons/svg/mail-tagged.svgz | Bin 0 -> 6343 bytes .../icons/svg/media-playback-start.svgz | Bin 0 -> 1916 bytes .../images/icons/svg/media-playback-stop.svgz | Bin 0 -> 1991 bytes .../images/icons/svg/media-seek-backward.svgz | Bin 0 -> 1991 bytes .../images/icons/svg/media-seek-forward.svgz | Bin 0 -> 1960 bytes .../images/icons/svg/network-connect.svgz | Bin 0 -> 7341 bytes .../images/icons/svg/network-disconnect.svgz | Bin 0 -> 5582 bytes .../icons/svg/network-server-database.svgz | Bin 0 -> 117632 bytes .../images/icons/svg/office-chart-line.svgz | Bin 0 -> 15608 bytes .../images/icons/svg/office-chart-pie.svgz | Bin 0 -> 14348 bytes .../preferences-desktop-launch-feedback.svgz | Bin 0 -> 6894 bytes .../images/icons/svg/preferences-plugin.svgz | Bin 0 -> 5244 bytes .../images/icons/svg/process-stop.svgz | Bin 0 -> 4051 bytes .../images/icons/svg/project-open.svgz | Bin 0 -> 282018 bytes isis/appdata/images/icons/svg/quickopen.svgz | Bin 0 -> 7549 bytes isis/appdata/images/icons/svg/rating.svgz | Bin 0 -> 7759 bytes isis/appdata/images/icons/svg/reload.svgz | Bin 0 -> 4127 bytes .../appdata/images/icons/svg/system-help.svgz | Bin 0 -> 2545 bytes .../images/icons/svg/transform-crop.svgz | Bin 0 -> 4263 bytes .../images/icons/svg/transform-move.svgz | Bin 0 -> 9541 bytes isis/appdata/images/icons/svg/up.svgz | Bin 0 -> 5889 bytes .../appdata/images/icons/svg/user-online.svgz | Bin 0 -> 1640 bytes isis/appdata/images/icons/svg/view-close.svgz | Bin 0 -> 8022 bytes .../images/icons/svg/view-form-table.svgz | Bin 0 -> 6567 bytes .../images/icons/svg/view-fullscreen.svgz | Bin 0 -> 42185 bytes .../images/icons/svg/view-list-text.svgz | Bin 0 -> 8317 bytes .../images/icons/svg/view-list-tree.svgz | Bin 0 -> 8564 bytes .../svg/view-object-histogram-linear.svgz | Bin 0 -> 4537 bytes .../images/icons/svg/view-preview.svgz | Bin 0 -> 17364 bytes .../images/icons/svg/view-sort-ascending.svgz | Bin 0 -> 2457 bytes .../icons/svg/view-split-top-bottom.svgz | Bin 0 -> 8172 bytes .../images/icons/svg/view-statistics.svgz | Bin 0 -> 4757 bytes .../icons/svg/view-web-browser-dom-tree.svgz | Bin 0 -> 27886 bytes .../images/icons/svg/weather-clear-night.svgz | Bin 0 -> 536104 bytes .../images/icons/svg/weather-clear.svgz | Bin 0 -> 12109 bytes .../icons/svg/weather-freezing-rain.svgz | Bin 0 -> 101091 bytes .../images/icons/svg/window-duplicate.svgz | Bin 0 -> 20834 bytes isis/appdata/images/icons/svg/window-new.svgz | Bin 0 -> 9263 bytes isis/appdata/images/icons/svg/zoom-in.svgz | Bin 0 -> 15797 bytes .../images/icons/svg/zoom-original.svgz | Bin 0 -> 15775 bytes isis/appdata/images/icons/svg/zoom-out.svgz | Bin 0 -> 15851 bytes .../appdata/images/icons/svg/zoom-select.svgz | Bin 0 -> 32047 bytes isis/appdata/images/icons/undo.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/unlinked.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/up.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/view-catalog.png | Bin 0 -> 2063 bytes isis/appdata/images/icons/view-preview.png | Bin 0 -> 1462 bytes .../icons/view-web-browser-dom-tree.png | Bin 0 -> 1627 bytes isis/appdata/images/icons/view_text.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/view_tree.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/viewmag+.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/viewmag-.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/viewmag.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/viewmag1.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/viewmagfit.png | Bin 0 -> 2084 bytes .../images/icons/weather-clear-night.png | Bin 0 -> 1126 bytes .../images/icons/window_fullscreen.png | Bin 0 -> 2084 bytes isis/appdata/images/icons/window_list.png | Bin 0 -> 975 bytes isis/appdata/images/icons/window_new.png | Bin 0 -> 2084 bytes isis/appdata/images/targets/ReadMe.txt | 5 + .../images/targets/nasa_enceladus_saturn.png | Bin 0 -> 269682 bytes .../images/targets/nasa_europa_large.png | Bin 0 -> 264082 bytes .../images/targets/nasa_mars_large.png | Bin 0 -> 322531 bytes .../images/targets/nasa_moon_large.png | Bin 0 -> 175728 bytes .../images/targets/nasa_titan_large.png | Bin 0 -> 125488 bytes .../Apollo15MetricSerialNumber.trn | 30 + .../Apollo15PanoramicSerialNumber.trn | 32 + .../serialnumbers/Apollo15SerialNumber.trn | 30 + .../Apollo16MetricSerialNumber.trn | 30 + .../Apollo16PanoramicSerialNumber.trn | 32 + .../Apollo17MetricSerialNumber.trn | 30 + .../Apollo17PanoramicSerialNumber.trn | 32 + .../serialnumbers/CassiniIssSerialNumber.trn | 31 + .../serialnumbers/CassiniVimsSerialNumber.trn | 41 + .../Chandrayaan1M3SerialNumber.trn | 33 + .../Chandrayaan1MinirfSerialNumber.trn | 33 + .../Clementine1HiresSerialNumber.trn | 32 + .../Clementine1LwirSerialNumber.trn | 32 + .../Clementine1NirSerialNumber.trn | 32 + .../Clementine1UvvisSerialNumber.trn | 32 + .../serialnumbers/DawnFcSerialNumber.trn | 33 + .../serialnumbers/DawnVirSerialNumber.trn | 41 + .../serialnumbers/GalileoSsiSerialNumber.trn | 34 + .../Hayabusa2OncSerialNumber.trn | 29 + .../HayabusaAmicaSerialNumber.trn | 31 + .../serialnumbers/JunoJunoCamSerialNumber.trn | 54 + .../serialnumbers/LoHrcSerialNumber.trn | 46 + .../serialnumbers/LoMrcSerialNumber.trn | 46 + .../serialnumbers/LroMinirfSerialNumber.trn | 33 + .../serialnumbers/LroNacSerialNumber.trn | 33 + .../MessengerMdisSerialNumber.trn | 31 + .../serialnumbers/MexHrscSerialNumber.trn | 42 + .../serialnumbers/MexSrcSerialNumber.trn | 42 + .../serialnumbers/MgsMocSerialNumber.trn | 44 + .../serialnumbers/MroCrismSerialNumber.trn | 31 + .../serialnumbers/MroCtxSerialNumber.trn | 31 + .../serialnumbers/MroHiriseSerialNumber.trn | 52 + .../serialnumbers/NearMsiSerialNumber.trn | 28 + .../NewHorizonsLeisaSerialNumber.trn | 30 + .../NewHorizonsLorriSerialNumber.trn | 30 + .../NewHorizonsMvicSerialNumber.trn | 40 + .../OdysseyThemisSerialNumber.trn | 43 + .../OsirisRexOCamsSerialNumber.trn | 57 + isis/appdata/serialnumbers/SerialNumber.trn | 30 + .../serialnumbers/TgoCassisSerialNumber.trn | 58 + .../Viking1CameraASerialNumber.trn | 32 + .../Viking1CameraBSerialNumber.trn | 32 + .../Viking2CameraASerialNumber.trn | 31 + .../Viking2CameraBSerialNumber.trn | 31 + .../serialnumbers/Voyager1NacSerialNumber.trn | 31 + .../serialnumbers/Voyager1WacSerialNumber.trn | 31 + .../serialnumbers/Voyager2NacSerialNumber.trn | 31 + .../serialnumbers/Voyager2WacSerialNumber.trn | 31 + .../serialnumbers/aerialphotoSerialNumber.trn | 50 + .../autoreg/coreg.adaptgruen.p1515s3030.def | 256 ++ .../autoreg/coreg.maxcor.p1515.s3030.def | 163 ++ .../autoreg/coreg.maxcor.p2020.s5050.def | 163 ++ .../autoreg/coreg.mindif.p1515.s3030.def | 168 ++ .../autoreg/coreg.mindif.p2020.s5050.def | 168 ++ isis/appdata/templates/autoreg/default.def | 31 + isis/appdata/templates/autoreg/findrx.def | 22 + .../templates/autoreg/gruen_default.def | 29 + isis/appdata/templates/autoreg/qnetReg.def | 21 + isis/appdata/templates/autoseed/grid.def | 33 + .../templates/autoseed/gridExtraKeywords.pvl | 19 + isis/appdata/templates/autoseed/limit.def | 40 + isis/appdata/templates/autoseed/strip.def | 39 + .../cnet_validmeasure/validmeasure.def | 81 + .../validmeasure.def.example | 15 + .../templates/cnetref/cnetref_nooperator.def | 51 + .../templates/cnetref/cnetref_operator.def | 82 + .../cnetref/gradient_operator.def.example | 66 + .../templates/cnetref/no_operator.def.example | 34 + .../standard_deviation_operator.def.example | 67 + .../appdata/templates/cnetstats/cnetstats.def | 178 ++ .../templates/cnetstats/cnetstats.def.example | 90 + .../ControlNetPvlV0005.template | 78 + .../findfeatures/multi_algorithms.lis | 4 + .../findfeatures/single_algorithms.lis | 4 + .../templates/fullcnetdiff/fullcnetdiff.def | 59 + .../hidtmgen/hidtmgenParamsTemplate.pvl | 14 + .../templates/jigsaw/SensorParameters.pvl | 69 + .../templates/jigsaw/TargetBodyParameters.pvl | 72 + .../templates/kernels/blurGaussian3x3.txt | 8 + .../templates/kernels/derivativeNWtoSE2x2.txt | 7 + isis/appdata/templates/kernels/emboss3x3.txt | 8 + .../templates/kernels/gaussianSquare5x5.txt | 10 + .../templates/kernels/highpassCircle5x5.txt | 10 + .../templates/kernels/laplacianCircle3x3.txt | 8 + .../templates/kernels/smoothCircle5x5.txt | 10 + .../templates/kernels/smoothCone5x5.txt | 10 + .../templates/kernels/smoothPyramid5x5.txt | 10 + .../templates/kernels/smoothRectangle5x5.txt | 10 + .../templates/labels/CubeFormatTemplate.pft | 42 + .../templates/labels/MappingGroupKeywords.pft | 19 + .../templates/labels/pdsExportAllMapping.pft | 30 + .../maps/ellipsoidtransverseazimuthal.map | 48 + .../templates/maps/equirectangular.map | 38 + .../maps/lambertazimuthalequalarea.map | 38 + .../templates/maps/lambertconformal.map | 57 + isis/appdata/templates/maps/mercator.map | 38 + isis/appdata/templates/maps/mollweide.map | 36 + .../templates/maps/obliquecylindrical.map | 39 + isis/appdata/templates/maps/orthographic.map | 38 + isis/appdata/templates/maps/planar.map | 35 + .../templates/maps/pointperspective.map | 44 + .../templates/maps/polarstereographic.map | 38 + .../templates/maps/ringcylindrical.map | 36 + isis/appdata/templates/maps/robinson.map | 37 + .../templates/maps/simplecylindrical.map | 37 + isis/appdata/templates/maps/sinusoidal.map | 37 + .../templates/maps/transversemercator.map | 42 + .../templates/noproj/noprojInstruments.pvl | 142 + .../appdata/templates/photometry/callisto.pvl | 50 + isis/appdata/templates/photometry/europa.pvl | 51 + .../appdata/templates/photometry/ganymede.pvl | 50 + .../templates/photometry/general_photomet.pvl | 72 + isis/appdata/templates/photometry/io.pvl | 40 + isis/appdata/templates/photometry/mars.pvl | 49 + .../mars_mdim2.1_blu_hapken_albat_h2.pvl | 59 + .../mars_mdim2.1_blu_hapken_topat_h2.pvl | 63 + ...s_mdim2.1_otherfilters_hapken_albat_h2.pvl | 59 + ...s_mdim2.1_otherfilters_hapken_topat_h2.pvl | 60 + isis/appdata/templates/photometry/marsblu.pvl | 38 + isis/appdata/templates/photometry/marsred.pvl | 47 + .../photometry/moon_clementine_uvvis_a.pvl | 27 + .../photometry/moon_clementine_uvvis_b.pvl | 27 + .../photometry/moon_clementine_uvvis_cde.pvl | 29 + isis/appdata/translations/ClipperEisCore.trn | 124 + .../translations/ClipperEisInstrument.trn | 123 + isis/appdata/translations/Instruments.trn | 162 ++ .../Mariner10VidiconASerialNumber.trn | 31 + .../Mariner10VidiconBSerialNumber.trn | 31 + .../translations/MerMiSerialNumber.trn | 35 + .../translations/MissionName2DataDir.trn | 90 + isis/appdata/translations/NaifErrors.trn | 23 + isis/appdata/translations/README.TXT | 5 + isis/appdata/translations/geotiff/26910.trn | 106 + isis/appdata/translations/geotiff/26911.trn | 106 + isis/appdata/translations/geotiff/26912.trn | 106 + isis/appdata/translations/geotiff/26913.trn | 106 + isis/appdata/translations/geotiff/26914.trn | 106 + isis/appdata/translations/geotiff/26915.trn | 106 + isis/appdata/translations/geotiff/26916.trn | 106 + isis/appdata/translations/geotiff/26917.trn | 106 + isis/appdata/translations/geotiff/26918.trn | 106 + isis/appdata/translations/geotiff/26919.trn | 106 + isis/appdata/translations/isis2bandbin.trn | 44 + isis/appdata/translations/isis2instrument.trn | 101 + isis/appdata/translations/pds4Export.trn | 28 + .../translations/pds4ExportArray2DImage.trn | 57 + .../translations/pds4ExportArray3DImage.trn | 69 + .../pds4ExportArray3DSpectrum.trn | 68 + .../pds4ExportArray3DSpectrumBinSet.trn | 68 + .../pds4ExportArray3DSpectrumUniform.trn | 77 + .../translations/pds4ExportBandBin.trn | 205 ++ .../translations/pds4ExportBandBinImage.trn | 177 ++ .../pds4ExportBandBinSpectrum.trn | 172 ++ .../pds4ExportBandBinSpectrumBinSet.trn | 107 + .../pds4ExportBandBinSpectrumUniform.trn | 146 + .../pds4ExportDisplaySettings.trn | 72 + .../pds4ExportEquirectangular.trn | 267 ++ .../translations/pds4ExportFileArea.trn | 20 + .../pds4ExportIdentificationArea.trn | 55 + .../translations/pds4ExportInstrument.trn | 90 + .../pds4ExportLambertConformal.trn | 249 ++ .../pds4ExportObliqueMercator.trn | 255 ++ .../translations/pds4ExportOrthographic.trn | 248 ++ .../pds4ExportPolarStereographic.trn | 259 ++ .../translations/pds4ExportPolyconic.trn | 248 ++ .../pds4ExportSimpleCylindrical.trn | 248 ++ .../translations/pds4ExportSinusoidal.trn | 248 ++ .../pds4ExportTargetFromInstrument.trn | 166 ++ .../pds4ExportTargetFromMapping.trn | 164 ++ .../pds4ExportTransverseMercator.trn | 248 ++ isis/appdata/translations/pds4ExportUnits.pvl | 163 ++ .../translations/pdsCombinedSpectrum.trn | 223 ++ .../translations/pdsExportAllMapping.trn | 0 .../translations/pdsExportAllMapping.typ | 43 + .../translations/pdsExportEquirectangular.trn | 251 ++ .../translations/pdsExportImageImage.trn | 63 + .../translations/pdsExportImageImage.typ | 7 + .../pdsExportImageImagePixel16.typ | 8 + .../pdsExportImageImagePixel32.typ | 8 + .../pdsExportImageImagePixel8.typ | 8 + .../translations/pdsExportImageJP2.trn | 63 + .../translations/pdsExportImageJP2.typ | 5 + .../pdsExportLambertAzimuthalEqualArea.trn | 202 ++ .../pdsExportLambertConformal.trn | 251 ++ .../translations/pdsExportMercator.trn | 251 ++ .../pdsExportObliqueCylindrical.trn | 313 ++ .../translations/pdsExportOrthographic.trn | 251 ++ .../pdsExportPointPerspective.trn | 261 ++ .../pdsExportPolarStereographic.trn | 251 ++ .../translations/pdsExportRobinson.trn | 263 ++ .../appdata/translations/pdsExportRootGen.typ | 19 + .../pdsExportSimpleCylindrical.trn | 253 ++ .../translations/pdsExportSinusoidal.trn | 263 ++ isis/appdata/translations/pdsExportTarget.trn | 131 + .../pdsExportTransverseMercator.trn | 253 ++ isis/appdata/translations/pdsImage.trn | 355 +++ isis/appdata/translations/pdsImageArchive.trn | 176 ++ isis/appdata/translations/pdsImageBandBin.trn | 96 + .../translations/pdsImageProjection.trn | 288 ++ .../translations/pdsImportEquirectangular.trn | 28 + .../pdsImportLambertAzimuthalEqualArea.trn | 31 + .../pdsImportLambertConformal.trn | 56 + .../translations/pdsImportMercator.trn | 28 + .../pdsImportObliqueCylindrical.trn | 84 + .../translations/pdsImportOrthographic.trn | 28 + .../pdsImportPointPerspective.trn | 45 + .../pdsImportPolarStereographic.trn | 28 + .../translations/pdsImportRobinson.trn | 16 + .../pdsImportSimpleCylindrical.trn | 14 + .../translations/pdsImportSinusoidal.trn | 16 + .../pdsImportTransverseMercator.trn | 43 + isis/appdata/translations/pdsL0.trn | 219 ++ isis/appdata/translations/pdsLabelExport.trn | 121 + isis/appdata/translations/pdsLoc.trn | 220 ++ isis/appdata/translations/pdsObs.trn | 219 ++ .../pdsProjectionLineSampToXY.def | 118 + isis/appdata/translations/pdsQube.trn | 229 ++ .../translations/pdsQubeProjection.trn | 235 ++ isis/appdata/translations/pdsRdn.trn | 219 ++ isis/appdata/translations/pdsSpectralQube.trn | 229 ++ .../pdsSpectralQubeProjection.trn | 219 ++ isis/appdata/translations/voyager.trn | 204 ++ .../translations/voyager_na_bandbin.trn | 75 + .../translations/voyager_wa_bandbin.trn | 109 + isis/appdata/translations/xmlExample.trn | 241 ++ isis/appdata/translations/xmlImage.trn | 112 + isis/cmake/FindBoost.cmake | 138 - isis/cmake/FindBullet.cmake | 35 - isis/cmake/FindGSL.cmake | 25 - isis/cmake/FindGeos.cmake | 2 +- isis/cmake/FindHDF5.cmake | 24 - isis/cmake/FindJson.cmake | 14 + isis/cmake/FindOpenCV.cmake | 2 +- isis/cmake/FindPCL.cmake | 7 +- isis/cmake/FindPNG.cmake | 17 - isis/cmake/FindProtobuf.cmake | 11 - isis/cmake/FindTIFF.cmake | 9 - isis/cmake/FindXercesC.cmake | 10 - isis/cmake/Findale.cmake | 20 + isis/cmake/RunMakeFileTest.cmake | 2 +- isis/cmake/RunUnitTest.cmake | 6 +- isis/cmake/TestSetup.cmake | 6 +- isis/cmake/version.in | 3 + isis/make/config.darwin-MacOSX10_14 | 602 ++++ isis/make/config.darwin-MacOSX10_15 | 602 ++++ isis/make/isismake.tsts | 18 +- isis/scripts/csvdiff.py | 4 +- isis/scripts/fetchRequiredData.py | 645 ---- isis/scripts/isis3Startup.csh | 14 +- isis/scripts/isis3Startup.py | 12 +- isis/scripts/isis3Startup.sh | 12 +- isis/scripts/isis3VarInit.py | 156 +- isis/scripts/tabCompletion.csh | 25 + isis/src/CMakeLists.txt | 1 + isis/src/apollo/apps/apollo2isis/main.cpp | 3 +- isis/src/apollo/apps/apollocal/main.cpp | 3 +- .../apps/apollopaninit/ApolloPanInit.trn | 53 + isis/src/apollo/apps/apollopaninit/main.cpp | 180 +- .../apollo/apps/apollopanstitcher/main.cpp | 2 +- .../apollo/templates/PanFiducialFinder.def | 31 + isis/src/base/apps/automos/automos.xml | 2 +- isis/src/base/apps/cam2map/cam2map.cpp | 571 ++++ isis/src/base/apps/cam2map/cam2map.h | 134 +- isis/src/base/apps/cam2map/cam2map.xml | 2583 +++++++++-------- isis/src/base/apps/cam2map/main.cpp | 531 +--- isis/src/base/apps/caminfo/CamTools.cpp | 14 + isis/src/base/apps/caminfo/CamTools.h | 7 +- isis/src/base/apps/caminfo/caminfo.xml | 275 +- isis/src/base/apps/caminfo/main.cpp | 14 +- isis/src/base/apps/caminfo/tsts/csv/Makefile | 4 +- isis/src/base/apps/campt/campt.cpp | 268 ++ isis/src/base/apps/campt/campt.h | 12 + isis/src/base/apps/campt/main.cpp | 267 +- .../src/base/apps/campt/tsts/default/Makefile | 10 - isis/src/base/apps/campt/tsts/errors/Makefile | 19 - isis/src/base/apps/campt/tsts/flat/Makefile | 17 - .../apps/campt/tsts/no_sample_line/Makefile | 16 - .../apps/campt/tsts/pointlist_append/Makefile | 32 - .../apps/campt/tsts/pointlist_error/Makefile | 14 - .../apps/campt/tsts/pointlist_flat/Makefile | 15 - .../apps/campt/tsts/pointlist_ground/Makefile | 15 - .../campt/tsts/pointlist_no_append/Makefile | 34 - isis/src/base/apps/campt/tsts/setSL/Makefile | 14 - .../campt/tsts/set_sample_or_line/Makefile | 26 - isis/src/base/apps/camstats/camstats.cpp | 227 ++ isis/src/base/apps/camstats/camstats.h | 12 + isis/src/base/apps/camstats/main.cpp | 208 +- .../base/apps/camstats/tsts/default/Makefile | 8 - .../src/base/apps/ckwriter/CkSpiceSegment.cpp | 18 +- isis/src/base/apps/ckwriter/CkSpiceSegment.h | 3 + isis/src/base/apps/ckwriter/ckwriter.xml | 2 +- .../base/apps/ckwriter/tsts/lronac/Makefile | 77 +- .../apps/ckwriter/tsts/messenger/Makefile | 2 +- isis/src/base/apps/crop/crop.cpp | 395 +-- isis/src/base/apps/crop/crop.h | 5 +- isis/src/base/apps/cubeit/cubeit.xml | 2 +- .../base/apps/cubeit/tsts/badinputs/Makefile | 2 +- isis/src/base/apps/ddd2isis/ddd2isis.xml | 4 + isis/src/base/apps/ddd2isis/main.cpp | 7 + .../apps/ddd2isis/tsts/badBandBit/Makefile | 24 + isis/src/base/apps/enlarge/enlarge.xml | 9 + isis/src/base/apps/enlarge/enlarge_app.cpp | 100 + isis/src/base/apps/enlarge/enlarge_app.h | 14 + isis/src/base/apps/enlarge/main.cpp | 98 +- .../base/apps/enlarge/tsts/default/Makefile | 15 - .../src/base/apps/enlarge/tsts/total/Makefile | 21 - .../findimageoverlaps/findimageoverlaps.cpp | 93 + .../findimageoverlaps/findimageoverlaps.h | 14 + isis/src/base/apps/findimageoverlaps/main.cpp | 82 +- .../findimageoverlaps/tsts/nooverlap/Makefile | 19 - isis/src/base/apps/findrx/findrx.xml | 6 +- isis/src/base/apps/findrx/main.cpp | 66 +- .../base/apps/footprintinit/footprintinit.cpp | 157 + .../base/apps/footprintinit/footprintinit.h | 9 + .../base/apps/footprintinit/footprintinit.xml | 6 +- isis/src/base/apps/footprintinit/main.cpp | 136 +- isis/src/base/apps/footprintmerge/main.cpp | 2 +- isis/src/base/apps/getkey/getkey.xml | 2 +- isis/src/base/apps/getsn/getsn.cpp | 94 + isis/src/base/apps/getsn/getsn.h | 13 + isis/src/base/apps/getsn/main.cpp | 81 +- .../apps/getsn/tsts/ConsoleOutput/Makefile | 13 - .../src/base/apps/getsn/tsts/default/Makefile | 14 - isis/src/base/apps/getsn/tsts/flat/Makefile | 12 - isis/src/base/apps/hist/hist.xml | 14 +- isis/src/base/apps/hist/main.cpp | 162 +- isis/src/base/apps/isis2ascii/isis2ascii.cpp | 126 + isis/src/base/apps/isis2ascii/isis2ascii.h | 17 + isis/src/base/apps/isis2ascii/isis2ascii.xml | 89 +- isis/src/base/apps/isis2ascii/main.cpp | 107 +- .../base/apps/isis2ascii/tsts/case01/Makefile | 9 - .../apps/isis2ascii/tsts/caselarge/Makefile | 9 - .../apps/isis2ascii/tsts/casesmall/Makefile | 9 - .../apps/isis2ascii/tsts/caseuser/Makefile | 14 - .../apps/isisminer/PdsTableFormatStrategy.cpp | 2 +- isis/src/base/apps/isisminer/isisminer.xml | 2 +- isis/src/base/apps/kernfilter/kernfilter.xml | 2 +- isis/src/base/apps/makeflat/main.cpp | 2 +- isis/src/base/apps/map2cam/main.cpp | 114 +- isis/src/base/apps/map2cam/map2cam.cpp | 132 + isis/src/base/apps/map2cam/map2cam.h | 52 +- isis/src/base/apps/map2map/map2map.xml | 8 +- isis/src/base/apps/mappt/main.cpp | 336 +-- isis/src/base/apps/mappt/mappt.cpp | 422 +++ isis/src/base/apps/mappt/mappt.h | 12 + isis/src/base/apps/mappt/mappt.xml | 84 +- isis/src/base/apps/mappt/tsts/Makefile | 4 - .../apps/mappt/tsts/allowoutside/Makefile | 10 - .../base/apps/mappt/tsts/coordsys/Makefile | 16 - .../base/apps/mappt/tsts/flatOutput/Makefile | 21 - isis/src/base/apps/mappt/tsts/ground/Makefile | 11 - isis/src/base/apps/mappt/tsts/image/Makefile | 10 - .../base/apps/mappt/tsts/projection/Makefile | 11 - .../src/base/apps/maptemplate/maptemplate.xml | 21 +- isis/src/base/apps/mosrange/mosrange.xml | 2 +- .../base/apps/mosrange/tsts/default/Makefile | 2 +- isis/src/base/apps/nocam2map/nocam2map.xml | 10 +- isis/src/base/apps/noproj/main.cpp | 3 +- isis/src/base/apps/noproj/noproj.xml | 6 +- isis/src/base/apps/pds2isis/pds2isis.xml | 153 +- isis/src/base/apps/phocube/main.cpp | 686 +++-- isis/src/base/apps/phocube/phocube.xml | 424 +-- .../base/apps/phocube/tsts/allbands/Makefile | 4 +- .../tsts/ignore_special_pixels/Makefile | 13 + .../base/apps/phocube/tsts/off_body/Makefile | 12 + .../base/apps/phoempglobal/phoempglobal.xml | 2 +- .../src/base/apps/photemplate/photemplate.xml | 16 +- isis/src/base/apps/photomet/main.cpp | 8 +- isis/src/base/apps/photomet/photomet.xml | 907 +++--- .../photomet/tsts/testDemWarning/Makefile | 28 + isis/src/base/apps/pixel2map/pixel2map.xml | 16 +- .../pixel2map/tsts/crismpolyoverlap/Makefile | 2 +- .../apps/pixel2map/tsts/lonboundary/Makefile | 2 +- .../base/apps/pixel2map/tsts/pole/Makefile | 2 +- .../apps/pixel2map/tsts/vimshires/Makefile | 2 +- isis/src/base/apps/pvldiff/main.cpp | 41 +- .../base/apps/ringsautomos/ringsautomos.xml | 2 +- .../base/apps/ringscam2map/ringscam2map.xml | 12 +- isis/src/base/apps/ringsmappt/ringsmappt.xml | 2 +- isis/src/base/apps/shadowtau/shadowtau.xml | 2 +- isis/src/base/apps/skymap/skymap.xml | 10 +- isis/src/base/apps/slpmap/slpmap.xml | 133 +- isis/src/base/apps/smtk/smtk.xml | 6 +- isis/src/base/apps/spiceinit/main.cpp | 642 +--- isis/src/base/apps/spiceinit/spiceinit.cpp | 699 +++++ isis/src/base/apps/spiceinit/spiceinit.h | 18 + isis/src/base/apps/spiceinit/spiceinit.xml | 39 +- .../apps/spiceinit/tsts/shapemodel/Makefile | 4 +- isis/src/base/apps/spiceserver/main.cpp | 640 +--- .../src/base/apps/spiceserver/spiceserver.cpp | 654 +++++ isis/src/base/apps/spiceserver/spiceserver.h | 11 + .../src/base/apps/spiceserver/spiceserver.xml | 7 +- isis/src/base/apps/spiceserver/tsts/Makefile | 4 - .../apps/spiceserver/tsts/cubetest/Makefile | 26 - .../spiceserver/tsts/simplerequest/Makefile | 18 - .../spkwriter/tsts/apollo15_mixed/Makefile | 5 +- .../apps/spkwriter/tsts/mariner10/Makefile | 14 +- .../apps/spkwriter/tsts/messenger/Makefile | 8 +- isis/src/base/apps/stats/stats.cpp | 24 +- isis/src/base/apps/stats/stats.h | 1 + isis/src/base/apps/stats/stats.xml | 84 +- isis/src/base/apps/tabledump/tabledump.xml | 2 +- isis/src/base/objs/Angle/Angle.cpp | 6 +- isis/src/base/objs/Angle/Angle.h | 2 + .../src/base/objs/Application/Application.cpp | 4 +- .../objs/BasisFunction/BasisFunction.truth | 20 - isis/src/base/objs/BasisFunction/unitTest.cpp | 54 - .../objs/BulletDskShape/BulletDskShape.cpp | 232 +- .../base/objs/BulletDskShape/BulletDskShape.h | 13 +- .../objs/BulletDskShape/BulletDskShape.truth | 29 - .../src/base/objs/BulletDskShape/unitTest.cpp | 90 - isis/src/base/objs/CSVReader/spaces.csv | 2 +- isis/src/base/objs/Camera/Camera.h | 25 +- .../objs/CameraGroundMap/CameraGroundMap.cpp | 62 +- .../objs/CameraGroundMap/CameraGroundMap.h | 7 +- .../CameraStatistics/CameraStatistics.cpp | 2 +- isis/src/base/objs/Chip/Chip.cpp | 2 +- isis/src/base/objs/Chip/unitTest.cpp | 6 +- isis/src/base/objs/Column/Column.truth | 40 - isis/src/base/objs/Column/unitTest.cpp | 150 - isis/src/base/objs/Cube/Cube.cpp | 235 +- isis/src/base/objs/Cube/Cube.h | 13 + .../base/objs/Displacement/Displacement.truth | 85 - isis/src/base/objs/Displacement/unitTest.cpp | 285 -- .../EmbreeShapeModel/EmbreeShapeModel.truth | 20 +- .../base/objs/EmbreeShapeModel/unitTest.cpp | 6 +- .../EmbreeTargetManager.cpp | 94 +- .../EmbreeTargetManager.truth | 2 +- .../objs/EmbreeTargetManager/unitTest.cpp | 2 +- isis/src/base/objs/Enlarge/Enlarge.cpp | 4 +- isis/src/base/objs/Enlarge/Enlarge.truth | 12 + isis/src/base/objs/Enlarge/unitTest.cpp | 3 +- .../base/objs/Environment/Environment.truth | 2 +- .../base/objs/Equalization/Equalization.truth | 16 +- isis/src/base/objs/Equalization/unitTest.cpp | 6 +- isis/src/base/objs/FileList/FileList.cpp | 9 + isis/src/base/objs/FileList/FileList.truth | 10 - isis/src/base/objs/FileList/unitTest.cpp | 24 - isis/src/base/objs/FileList/unitTest.list | 14 - isis/src/base/objs/FileName/FileName.cpp | 4 +- isis/src/base/objs/FileName/FileName.h | 3 +- .../GaussianDistribution.cpp | 2 + .../GaussianDistribution.truth | 26 - .../objs/GaussianDistribution/unitTest.cpp | 26 - .../GridPolygonSeeder/GridPolygonSeeder.cpp | 10 +- .../base/objs/GridPolygonSeeder/unitTest.cpp | 14 +- isis/src/base/objs/Gruen/Gruen.cpp | 4 +- isis/src/base/objs/Gui/Gui.cpp | 18 +- .../base/objs/Gui/GuiFilenameParameter.cpp | 2 +- isis/src/base/objs/Histogram/Histogram.cpp | 34 +- isis/src/base/objs/Histogram/Histogram.h | 5 + isis/src/base/objs/Histogram/unitTest.cpp | 2 +- .../base/objs/ImageOverlap/ImageOverlap.cpp | 12 +- isis/src/base/objs/ImageOverlap/unitTest.cpp | 24 +- .../objs/ImageOverlapSet/ImageOverlapSet.cpp | 137 +- .../base/objs/ImageOverlapSet/unitTest.cpp | 36 +- .../base/objs/ImagePolygon/ImagePolygon.cpp | 28 +- .../objs/ImportPdsTable/ImportPdsTable.cpp | 9 + .../base/objs/ImportPdsTable/ImportPdsTable.h | 2 + .../ImportPdsTable/data/invalidByteOrder.lbl | 2 +- .../data/invalidColumnsValue.lbl | 2 +- .../ImportPdsTable/data/invalidDataType.lbl | 2 +- .../data/invalidLSBIntegerBytes.lbl | 2 +- .../data/invalidLSBRealBytes.lbl | 2 +- .../data/invalidMSBIntegerBytes.lbl | 2 +- .../data/invalidMSBRealBytes.lbl | 2 +- isis/src/base/objs/IsisAml/IsisAml.truth | 12 +- isis/src/base/objs/IsisAml/unitTest.xml | 6 +- isis/src/base/objs/Latitude/Latitude.cpp | 5 +- isis/src/base/objs/Latitude/Latitude.h | 2 + .../LimitPolygonSeeder/LimitPolygonSeeder.cpp | 4 +- .../base/objs/LimitPolygonSeeder/unitTest.cpp | 14 +- .../base/objs/LineEquation/LineEquation.cpp | 2 + .../base/objs/LineEquation/LineEquation.truth | 7 - isis/src/base/objs/LineEquation/unitTest.cpp | 30 - .../base/objs/Longitude/LongitudeTests.cpp | 174 ++ .../LunarLambertEmpirical.cpp | 85 + .../LunarLambertEmpirical.h | 7 + .../LunarLambertEmpirical.truth | 24 + .../objs/LunarLambertEmpirical/unitTest.cpp | 59 + .../NaifDskPlateModel/NaifDskPlateModel.truth | 2 +- .../base/objs/NaifDskPlateModel/unitTest.cpp | 2 +- isis/src/base/objs/NaifStatus/NaifStatus.cpp | 2 +- .../NthOrderPolynomial/NthOrderPolynomial.cpp | 71 + .../NthOrderPolynomial/NthOrderPolynomial.h | 60 + .../NthOrderPolynomial.truth | 27 + .../base/objs/NthOrderPolynomial/unitTest.cpp | 56 + .../ObservationNumber/ObservationNumber.cpp | 10 +- .../ObservationNumber/ObservationNumber.h | 2 + isis/src/base/objs/Pipeline/Pipeline.truth | 94 +- isis/src/base/objs/Pipeline/unitTest.cpp | 59 +- isis/src/base/objs/Pipeline/unitTest.xml | 2 +- isis/src/base/objs/PixelFOV/PixelFOV.cpp | 6 +- isis/src/base/objs/PixelType/PixelType.truth | 29 - isis/src/base/objs/PixelType/unitTest.cpp | 40 - .../base/objs/PolygonTools/PolygonTools.cpp | 125 +- .../src/base/objs/PolygonTools/PolygonTools.h | 5 +- isis/src/base/objs/PolygonTools/unitTest.cpp | 42 +- isis/src/base/objs/Preference/TestPreferences | 196 -- isis/src/base/objs/Process/Process.cpp | 8 +- isis/src/base/objs/Process/Process.h | 1 + .../ProcessExportPds/ProcessExportPds.cpp | 46 +- .../ProcessExportPds4/ProcessExportPds4.cpp | 441 ++- .../ProcessExportPds4/ProcessExportPds4.h | 19 +- .../ProcessExportPds4/ProcessExportPds4.truth | 194 +- .../base/objs/ProcessExportPds4/unitTest.cpp | 2 +- .../ProcessGroundPolygons.cpp | 4 +- .../base/objs/ProcessImport/ProcessImport.cpp | 33 +- .../base/objs/ProcessImport/ProcessImport.h | 3 +- .../ProcessImportPds/ProcessImportPds.cpp | 19 +- .../ProcessImportPds/ProcessImportPds.truth | 2 +- .../base/objs/ProcessImportPds/unitTest.cpp | 4 +- .../base/objs/ProcessImportVicar/unitTest.cpp | 2 +- .../objs/ProcessPolygons/ProcessPolygons.cpp | 14 +- .../ProcessRubberSheet/ProcessRubberSheet.cpp | 109 +- .../ProcessRubberSheet/ProcessRubberSheet.h | 20 +- .../ProgramLauncher/ProgramLauncher.truth | 16 - ...amLauncher_Darwin_x86_64_MacOSX10_11.truth | 85 - ...amLauncher_Darwin_x86_64_MacOSX10_13.truth | 75 - ...ramLauncher_Darwin_x86_64_MacOSX10_8.truth | 82 - ...ProgramLauncher_Linux_x86_64_CentOS7.truth | 76 - ...ProgramLauncher_Linux_x86_64_Debian8.truth | 87 - ...rogramLauncher_Linux_x86_64_Fedora21.truth | 87 - ...rogramLauncher_Linux_x86_64_Fedora25.truth | 87 - ...rogramLauncher_Linux_x86_64_Fedora28.truth | 76 - ...auncher_Linux_x86_64_ScientificLinux.truth | 83 - ...ramLauncher_Linux_x86_64_Ubuntu14_04.truth | 87 - .../base/objs/ProgramLauncher/unitTest.cpp | 29 - .../base/objs/ProgramLauncher/unitTest.xml | 2 +- isis/src/base/objs/Projection/Projection.h | 8 +- isis/src/base/objs/PvlObject/PvlObject.cpp | 44 + isis/src/base/objs/PvlObject/PvlObject.h | 4 + isis/src/base/objs/PvlObject/PvlObject.truth | 225 -- isis/src/base/objs/PvlObject/unitTest.cpp | 251 -- .../objs/RadarGroundMap/RadarGroundMap.cpp | 11 +- .../base/objs/RadarGroundMap/RadarGroundMap.h | 5 +- .../RollingShutterCamera.cpp | 35 + .../RollingShutterCamera.h | 80 + .../RollingShutterCamera.truth | 5 + .../objs/RollingShutterCamera/unitTest.cpp | 92 + .../RollingShutterCameraDetectorMap.cpp | 208 ++ .../RollingShutterCameraDetectorMap.h | 87 + isis/src/base/objs/Sensor/Sensor.h | 4 +- isis/src/base/objs/Sensor/Sensor.truth | 10 +- isis/src/base/objs/Sensor/unitTest.cpp | 12 +- .../base/objs/SerialNumber/SerialNumber.cpp | 11 +- .../src/base/objs/SerialNumber/SerialNumber.h | 2 + .../ShapeModelFactory/ShapeModelFactory.truth | 8 +- .../base/objs/ShapeModelFactory/unitTest.cpp | 8 +- isis/src/base/objs/Spice/Spice.cpp | 255 +- isis/src/base/objs/Spice/Spice.h | 22 +- .../base/objs/SpicePosition/SpicePosition.cpp | 332 ++- .../base/objs/SpicePosition/SpicePosition.h | 21 +- .../objs/SpicePosition/SpicePosition.truth | 116 + isis/src/base/objs/SpicePosition/unitTest.cpp | 70 +- .../base/objs/SpiceRotation/SpiceRotation.cpp | 92 +- .../base/objs/SpiceRotation/SpiceRotation.h | 6 + .../objs/SpiceRotation/SpiceRotation.truth | 51 + ...ceRotation_Darwin_x86_64_MacOSX10_13.truth | 51 + ...ceRotation_Darwin_x86_64_MacOSX10_15.truth | 713 +++++ isis/src/base/objs/SpiceRotation/unitTest.cpp | 110 +- isis/src/base/objs/Stretch/Stretch.cpp | 106 +- isis/src/base/objs/Stretch/Stretch.h | 17 +- .../StripPolygonSeeder/StripPolygonSeeder.cpp | 8 +- .../base/objs/StripPolygonSeeder/unitTest.cpp | 14 +- .../base/objs/SurfacePoint/SurfacePoint.cpp | 15 +- .../src/base/objs/SurfacePoint/SurfacePoint.h | 3 + isis/src/base/objs/TProjection/TProjection.h | 20 +- .../base/objs/TiffImporter/TiffImporter.cpp | 2 +- .../objs/TrackingTable/TrackingTable.truth | 4 +- .../TrackingTable_Linux_x86_64_CentOS7.truth | 4 +- isis/src/base/objs/TrackingTable/unitTest.cpp | 4 +- isis/src/base/objs/Transform/Transform.h | 14 +- .../base/objs/UserInterface/UserInterface.cpp | 73 +- .../base/objs/UserInterface/UserInterface.h | 3 + .../XmlToPvlTranslationManager.h | 2 +- .../XmlToPvlTranslationManager.truth | 2 +- .../XmlToPvlTranslationManager/unitTest.cpp | 4 +- isis/src/base/objs/iTime/iTime.cpp | 13 +- isis/src/base/objs/iTime/iTime.h | 6 +- .../base/tsts/RayTracingShapeModel/Makefile | 4 +- .../src/cassini/apps/ciss2isis/CassiniIss.trn | 348 +++ .../apps/ciss2isis/CassiniIssNarrowAngle.def | 169 ++ .../apps/ciss2isis/CassiniIssWideAngle.def | 82 + isis/src/cassini/apps/ciss2isis/main.cpp | 9 +- isis/src/cassini/apps/cisscal/cisscal.xml | 36 +- isis/src/cassini/apps/cisscal/main.cpp | 310 +- .../cisscal/tsts/badCisscalImage/Makefile | 9 + .../cassini/apps/vims2isis/CassiniVimsPds.trn | 337 +++ isis/src/cassini/apps/vims2isis/main.cpp | 11 +- isis/src/cassini/apps/vimscal/README.txt | 4 +- isis/src/cassini/apps/vimscal/main.cpp | 25 +- .../cassini/objs/CissLabels/CissLabels.cpp | 43 +- isis/src/cassini/objs/CissLabels/CissLabels.h | 16 + .../cassini/objs/CissLabels/CissLabels.truth | 8 +- isis/src/cassini/objs/CissLabels/unitTest.cpp | 4 + isis/src/cassini/tsts/vims/Makefile | 6 +- .../chan1m32isis/Chandrayaan1M3Archive.trn | 112 + .../chan1m32isis/Chandrayaan1M3Instrument.trn | 217 ++ .../chandrayaan1/apps/chan1m32isis/labels.pvl | 239 -- .../chandrayaan1/apps/chan1m32isis/main.cpp | 7 +- .../Chandrayaan1M3Camera.truth | 9 +- .../objs/Chandrayaan1M3Camera/unitTest.cpp | 24 +- .../clementine/apps/clem2isis/Clementine.trn | 162 ++ isis/src/clementine/apps/clem2isis/main.cpp | 7 +- .../apps/clemhirescal/clemhirescal.xml | 23 +- .../src/clementine/apps/clemhirescal/main.cpp | 40 +- .../clementine/apps/clemnircal/clemnircal.xml | 12 +- .../apps/clemuvviscal/clemuvviscal.xml | 6 +- isis/src/clipper/apps/eis2isis/eis2isis.xml | 168 ++ isis/src/clipper/apps/eis2isis/main.cpp | 421 +++ .../clipper/apps/eis2isis/tsts/nacRs/Makefile | 57 + .../clipper/apps/eis2isis/tsts/wacFc/Makefile | 10 + isis/src/clipper/apps/jitterfit/jitterfit.xml | 292 ++ isis/src/clipper/apps/jitterfit/main.cpp | 234 ++ .../apps/jitterfit/tsts/default/Makefile | 17 + .../Camera.plugin | 6 + .../ClipperNacRollingShutterCamera.cpp | 191 ++ .../ClipperNacRollingShutterCamera.h | 53 + .../ClipperNacRollingShutterCamera.truth | 31 + .../unitTest.cpp | 147 + .../objs/ClipperWacFcCamera/Camera.plugin | 5 + .../ClipperWacFcCamera/ClipperWacFcCamera.cpp | 114 + .../ClipperWacFcCamera/ClipperWacFcCamera.h | 79 + .../ClipperWacFcCamera.truth | 31 + .../objs/ClipperWacFcCamera/unitTest.cpp | 147 + isis/src/control/apps/autoseed/autoseed.cpp | 527 ++++ isis/src/control/apps/autoseed/autoseed.h | 19 + isis/src/control/apps/autoseed/autoseed.xml | 2 +- isis/src/control/apps/autoseed/main.cpp | 517 +--- .../apps/autoseed/tsts/overlap/Makefile | 29 - .../apps/autoseed/tsts/seeddef/Makefile | 53 - .../apps/cnet2dem/tsts/cnetlist/Makefile | 3 + .../apps/cnet2dem/tsts/default/Makefile | 3 + .../control/apps/cnetbin2pvl/cnetbin2pvl.cpp | 21 + .../control/apps/cnetbin2pvl/cnetbin2pvl.h | 13 + isis/src/control/apps/cnetbin2pvl/main.cpp | 18 +- .../control/apps/cnetbin2pvl/tsts/Makefile | 4 - .../apps/cnetbin2pvl/tsts/default/Makefile | 7 - isis/src/control/apps/cnetcheck/cnetcheck.cpp | 682 +++++ isis/src/control/apps/cnetcheck/cnetcheck.h | 16 + isis/src/control/apps/cnetcheck/main.cpp | 665 +---- isis/src/control/apps/cnetcheck/tsts/Makefile | 4 - .../apps/cnetcheck/tsts/camera/Makefile | 20 - .../apps/cnetcheck/tsts/ignore/Makefile | 24 - .../apps/cnetcheck/tsts/nopoints/Makefile | 19 - .../apps/cnetcombinept/ControlPointMerger.cpp | 58 +- .../apps/cnetcombinept/ControlPointMerger.h | 26 +- .../apps/cnetcombinept/cnetcombinept.cpp | 497 ++++ .../apps/cnetcombinept/cnetcombinept.h | 13 + .../apps/cnetcombinept/cnetcombinept.xml | 20 + isis/src/control/apps/cnetcombinept/main.cpp | 414 +-- .../cnetcombinept/tsts/duplicates/Makefile | 13 - .../cnetcombinept/tsts/messenger/Makefile | 18 - .../apps/cnetcombinept/tsts/noclean/Makefile | 19 - .../cnetcombinept/tsts/setapriori/Makefile | 18 - isis/src/control/apps/cnetedit/cnetedit.xml | 4 +- isis/src/control/apps/cnetedit/main.cpp | 2 +- isis/src/control/apps/cnethist/cnethist.xml | 5 + isis/src/control/apps/cnethist/main.cpp | 42 +- .../apps/cnethist/tsts/case01/Makefile | 2 +- .../control/apps/cnetpvl2bin/cnetpvl2bin.cpp | 43 + .../control/apps/cnetpvl2bin/cnetpvl2bin.h | 13 + isis/src/control/apps/cnetpvl2bin/main.cpp | 11 +- .../control/apps/cnetpvl2bin/tsts/Makefile | 4 - .../apps/cnetpvl2bin/tsts/default/Makefile | 7 - isis/src/control/apps/cnetref/cnetref.xml | 4 +- isis/src/control/apps/cnetref/main.cpp | 4 +- isis/src/control/apps/cnetstats/cnetstats.cpp | 233 ++ isis/src/control/apps/cnetstats/cnetstats.h | 15 + isis/src/control/apps/cnetstats/main.cpp | 214 +- isis/src/control/apps/cnetstats/tsts/Makefile | 4 - .../cnetstats/tsts/badWriteLocation/Makefile | 30 - .../apps/cnetstats/tsts/cubeFilter/Makefile | 13 - .../control/apps/cnetstats/tsts/gFit/Makefile | 15 - .../apps/cnetstats/tsts/imagestats/Makefile | 14 - .../apps/cnetstats/tsts/pointFilter/Makefile | 12 - .../apps/cnetstats/tsts/pointstats/Makefile | 13 - .../control/apps/cnetwinnow/cnetwinnow.cpp | 464 +++ isis/src/control/apps/cnetwinnow/cnetwinnow.h | 15 + isis/src/control/apps/cnetwinnow/main.cpp | 425 +-- .../apps/cnetwinnow/tsts/case01/Makefile | 25 - isis/src/control/apps/coreg/coreg.xml | 6 +- .../apps/deltack/tsts/singlePoint/Makefile | 10 +- .../control/apps/deltack/tsts/twist/Makefile | 7 - .../findfeatures/FeatureAlgorithmFactory.cpp | 40 +- .../findfeatures/FeatureAlgorithmFactory.h | 91 +- .../apps/findfeatures/GenericTransform.cpp | 63 +- .../control/apps/findfeatures/MatchMaker.cpp | 122 +- .../apps/findfeatures/findfeatures.xml | 755 ++--- .../apps/findfeatures/tsts/filters/Makefile | 32 - isis/src/control/apps/jigsaw/jigsaw.xml | 296 +- isis/src/control/apps/jigsaw/main.cpp | 222 +- .../control/apps/jigsaw/tsts/apollo/Makefile | 8 +- .../apps/jigsaw/tsts/bundleXYZ/Makefile | 56 +- .../apps/jigsaw/tsts/camsolveAll/Makefile | 8 +- .../control/apps/jigsaw/tsts/errors/Makefile | 8 +- .../apps/jigsaw/tsts/heldImage/Makefile | 8 +- .../apps/jigsaw/tsts/largeDataset/Makefile | 8 +- .../apps/jigsaw/tsts/mestimator/Makefile | 10 +- .../pole-ra-dec-w0-wDot-mean-radius/Makefile | 9 +- .../Makefile | 8 +- .../control/apps/jigsaw/tsts/radar/Makefile | 16 +- .../apps/jigsaw/tsts/rejection/Makefile | 7 +- .../apps/jigsaw/tsts/scconfig/Makefile | 21 + .../apps/jigsaw/tsts/scconfigHeld/Makefile | 22 + isis/src/control/apps/pointreg/pointreg.xml | 2 +- isis/src/control/apps/seedgrid/seedgrid.xml | 6 +- isis/src/control/apps/sumspice/SumFinder.cpp | 217 +- isis/src/control/apps/sumspice/SumFinder.h | 54 +- isis/src/control/apps/sumspice/main.cpp | 46 +- isis/src/control/apps/sumspice/sumspice.xml | 4 + .../apps/sumspice/tsts/hayabusa/Makefile | 2 +- .../objs/BundleAdjust/BundleAdjust.cpp | 93 +- .../control/objs/BundleAdjust/BundleAdjust.h | 6 + .../objs/BundleSettings/BundleSettings.cpp | 27 +- .../objs/BundleSettings/BundleSettings.h | 5 + .../BundleSolutionInfo/BundleSolutionInfo.cpp | 173 +- .../BundleSolutionInfo/BundleSolutionInfo.h | 15 + .../BundleSolutionInfo.truth | 24 +- .../BundleUtilities/BundleObservation.cpp | 1011 +++++-- .../objs/BundleUtilities/BundleObservation.h | 57 +- .../BundleObservationSolveSettings.cpp | 207 +- .../BundleObservationSolveSettings.h | 5 +- .../BundleUtilities/BundleUtilities.truth | 208 +- .../control/objs/BundleUtilities/unitTest.cpp | 36 +- .../ControlNetStatistics.cpp | 6 +- .../ControlNetVersioner.cpp | 25 +- .../ControlNetVersioner.truth | 72 +- .../objs/ControlNetVersioner/unitTest.cpp | 2 +- .../objs/ControlPoint/ControlPoint.cpp | 238 +- .../control/objs/ControlPoint/ControlPoint.h | 9 +- .../dawn/apps/dawnfc2isis/DawnFcArchive.trn | 162 ++ .../dawn/apps/dawnfc2isis/DawnFcBandBin.trn | 32 + .../apps/dawnfc2isis/DawnFcInstrument.trn | 168 ++ isis/src/dawn/apps/dawnfc2isis/main.cpp | 9 +- .../dawn/apps/dawnvir2isis/DawnVirArchive.trn | 175 ++ .../dawn/apps/dawnvir2isis/DawnVirBandBin.trn | 62 + .../apps/dawnvir2isis/DawnVirInstrument.trn | 245 ++ isis/src/dawn/apps/dawnvir2isis/main.cpp | 9 +- .../dawn/objs/DawnFcCamera/DawnFcCamera.cpp | 5 +- isis/src/dawn/objs/DawnVirCamera/unitTest.cpp | 2 +- isis/src/dev/apps/camdev/camdev.xml | 425 +-- .../docsys/Object/build/isisDoxyDefs.doxydef | 12 +- .../Schemas/Application/application.xsd | 8 + .../Application/documentation/index.html | 3 + isis/src/docsys/assets/scripts/footer.js | 8 +- isis/src/docsys/assets/scripts/homepage.js | 2 +- isis/src/docsys/build/Installation.xsl | 2 +- isis/src/docsys/build/TechnicalInfo.xsl | 38 +- isis/src/docsys/build/menu.xsl | 2 +- .../EnvironmentAndPreferencesSetup.xml | 2 +- .../HowToApplicationCategoryTest.xml | 2 +- .../HowToGeneralDocumentation.xml | 13 +- .../documents/InstallGuide/InstallGuide.xml | 564 ++-- .../documents/IsisHistory/IsisHistory.xml | 5 +- .../PreferenceDictionary.xml | 24 +- .../apps/gllnims2isis/GalileoNIMSArchive.trn | 735 +++++ .../gllnims2isis/GalileoNIMSCoreBandBin.trn | 81 + .../gllnims2isis/GalileoNIMSInstrument.trn | 312 ++ .../gllnims2isis/GalileoNIMSSuffixBandBin.trn | 46 + .../apps/gllnims2isis/gllnims2isis.xml | 8 +- isis/src/galileo/apps/gllnims2isis/main.cpp | 13 +- .../galileo/apps/gllssi2isis/GalileoSsi.trn | 159 + .../galileo/apps/gllssi2isis/gllssi2isis.xml | 52 +- isis/src/galileo/apps/gllssi2isis/main.cpp | 59 +- isis/src/galileo/apps/gllssical/gllssical.xml | 4 +- .../apps/amica2isis/HayabusaAmicaArchive.trn | 170 ++ .../apps/amica2isis/HayabusaAmicaBandBin.trn | 113 + .../amica2isis/HayabusaAmicaInstrument.trn | 204 ++ .../apps/amica2isis/HayabusaAmicaKernels.trn | 16 + isis/src/hayabusa/apps/amica2isis/main.cpp | 13 +- .../hyb1pds4gen/HayabusaAmicaPds4Export.trn | 55 + .../hyb1pds4gen/HayabusaNirsPds4Export.trn | 18 + isis/src/hayabusa/apps/hyb1pds4gen/main.cpp | 31 +- .../apps/nirs2isis/HayabusaNirsArchive.trn | 298 ++ .../apps/nirs2isis/HayabusaNirsBandBin.trn | 25 + .../apps/nirs2isis/HayabusaNirsInstrument.trn | 144 + .../apps/nirs2isis/HayabusaNirsKernels.trn | 15 + isis/src/hayabusa/apps/nirs2isis/main.cpp | 11 +- .../apps/hyb2onc2isis/Hayabusa2OncArchive.trn | 107 + .../apps/hyb2onc2isis/Hayabusa2OncBandBin.trn | 75 + .../hyb2onc2isis/Hayabusa2OncInstrument.trn | 499 ++++ .../apps/hyb2onc2isis/Hayabusa2OncKernels.trn | 17 + isis/src/hayabusa2/apps/hyb2onc2isis/main.cpp | 2 - .../apps/hyb2onc2isis/tsts/newFits/Makefile | 18 + .../apps/getsn => hayabusa2}/tsts/Makefile | 4 +- isis/src/hayabusa2/tsts/OncCamera/Makefile | 40 + .../apps/junocam2isis/JunoJunoCamArchive.trn | 55 + .../apps/junocam2isis/JunoJunoCamBandBin.trn | 37 + .../junocam2isis/JunoJunoCamInstrument.trn | 116 + isis/src/juno/apps/junocam2isis/main.cpp | 9 +- .../apps/kaguyami2isis/KaguyaMiArchive.trn | 163 ++ .../apps/kaguyami2isis/KaguyaMiBandBin.trn | 63 + .../apps/kaguyami2isis/KaguyaMiInstrument.trn | 586 ++++ .../apps/kaguyami2isis/kaguyami2isis.xml | 10 +- isis/src/kaguya/apps/kaguyami2isis/main.cpp | 9 +- .../apps/kaguyami2isis/tsts/level2b2/Makefile | 18 + .../apps/kaguyatc2isis/KaguyaTcArchive.trn | 923 ++++++ .../apps/kaguyatc2isis/KaguyaTcBandBin.trn | 70 + .../apps/kaguyatc2isis/KaguyaTcInstrument.trn | 307 ++ .../apps/kaguyatc2isis/KaguyaTcKernels.trn | 28 + .../apps/kaguyatc2isis/kaguyatc2isis.cpp | 294 ++ .../kaguya/apps/kaguyatc2isis/kaguyatc2isis.h | 11 + .../apps/kaguyatc2isis/kaguyatc2isis.xml | 80 +- isis/src/kaguya/apps/kaguyatc2isis/main.cpp | 161 +- .../apps/mimap2isis/KaguyaMiMapArchive.trn | 533 ++++ .../apps/mimap2isis/KaguyaMiMapBandBin.trn | 63 + .../apps/mimap2isis/KaguyaMiMapInstrument.trn | 103 + .../apps/mimap2isis/KaguyaMil3cArchive.trn | 483 +++ isis/src/kaguya/apps/mimap2isis/main.cpp | 11 +- .../objs/KaguyaMiCamera/KaguyaMiCamera.cpp | 1 - .../objs/KaguyaMiCamera/KaguyaMiCamera.h | 2 +- .../objs/KaguyaMiCamera/KaguyaMiCamera.truth | 70 + .../kaguya/objs/KaguyaMiCamera/unitTest.cpp | 12 +- .../kaguya/objs/KaguyaTcCamera/Camera.plugin | 11 + .../objs/KaguyaTcCamera/KaguyaTcCamera.cpp | 157 + .../objs/KaguyaTcCamera/KaguyaTcCamera.h | 49 + .../objs/KaguyaTcCamera/KaguyaTcCamera.truth | 65 + .../KaguyaTcCameraDistortionMap.cpp | 209 ++ .../KaguyaTcCameraDistortionMap.h | 59 + isis/src/kaguya/objs/KaguyaTcCamera/Makefile | 7 + .../kaguya/objs/KaguyaTcCamera/unitTest.cpp | 201 ++ isis/src/lo/apps/lo2isis/LoGeneralImport.trn | 77 + .../apps/lo2isis/LoIsis2BoresightImport.trn | 73 + .../lo/apps/lo2isis/LoIsis2FiducialImport.trn | 109 + .../lo/apps/lo2isis/LoPdsBoresightImport.trn | 20 + .../lo/apps/lo2isis/LoPdsFiducialImport.trn | 62 + isis/src/lo/apps/lo2isis/main.cpp | 5 +- .../lo/apps/lopdsgen/LoBoresightExport.trn | 21 + .../lo/apps/lopdsgen/LoExportFormatter.typ | 7 + .../src/lo/apps/lopdsgen/LoExportTemplate.pft | 59 + .../src/lo/apps/lopdsgen/LoFiducialExport.trn | 51 + isis/src/lo/apps/lopdsgen/LoLevel1Export.trn | 33 + .../src/lo/apps/lopdsgen/LoOriginalExport.trn | 115 + .../src/lo/apps/lopdsgen/LoReimportExport.trn | 109 + isis/src/lo/apps/lopdsgen/LoStripExport.trn | 29 + isis/src/lo/apps/lopdsgen/main.cpp | 7 +- .../lro/apps/lronac2isis/LroNacArchive.trn | 250 ++ .../lro/apps/lronac2isis/LroNacBandBin.trn | 48 + .../lro/apps/lronac2isis/LroNacInstrument.trn | 212 ++ isis/src/lro/apps/lronac2isis/main.cpp | 8 +- .../lronac2pds/LroNacPdsExportRootGen.typ | 25 + .../apps/lronac2pds/LroNacPdsLabelExport.trn | 567 ++++ isis/src/lro/apps/lronac2pds/main.cpp | 7 +- isis/src/lro/apps/lronaccal/main.cpp | 60 +- .../lro/apps/lrowac2isis/LroWacArchive.trn | 88 + .../lro/apps/lrowac2isis/LroWacInstrument.trn | 177 ++ isis/src/lro/apps/lrowac2isis/main.cpp | 10 +- .../lrowac2pds/LroNacPdsExportRootGen.typ | 25 + .../apps/lrowac2pds/LroWacPdsLabelExport.trn | 577 ++++ isis/src/lro/apps/lrowac2pds/main.cpp | 8 +- isis/src/lro/apps/mrf2isis/MrfLev1Archive.trn | 132 + isis/src/lro/apps/mrf2isis/MrfLev1BandBin.trn | 32 + isis/src/lro/apps/mrf2isis/MrfLev1Image.trn | 128 + .../lro/apps/mrf2isis/MrfLev1Instrument.trn | 282 ++ isis/src/lro/apps/mrf2isis/MrfLev2Archive.trn | 381 +++ isis/src/lro/apps/mrf2isis/MrfLev2BandBin.trn | 33 + isis/src/lro/apps/mrf2isis/main.cpp | 16 +- .../apps/mrf2pds/AllMrfExportOrigLabel.trn | 355 +++ .../Chandrayaan1MrfExportOrigLabel.trn | 20 + .../apps/mrf2pds/LroMrfExportOrigLabel.trn | 20 + .../lro/apps/mrf2pds/MrfExportAllMapping.typ | 30 + isis/src/lro/apps/mrf2pds/MrfExportRoot.typ | 23 + isis/src/lro/apps/mrf2pds/MrfPdsLevel2.pft | 113 + isis/src/lro/apps/mrf2pds/MrfPdsLevel3.pft | 84 + .../mrf2pds/ProcessExportMiniRFLroPds.cpp | 4 +- isis/src/lro/apps/mrf2pds/main.cpp | 10 +- .../apps/mar102isis/Mariner10isis2.trn | 183 ++ isis/src/mariner/apps/mar102isis/main.cpp | 7 +- isis/src/mariner/apps/mar10cal/mar10cal.xml | 2 +- .../src/mer/apps/mer2isis/MerImageRequest.trn | 44 + isis/src/mer/apps/mer2isis/MerInstrument.trn | 264 ++ isis/src/mer/apps/mer2isis/MerStructure.trn | 49 + isis/src/mer/apps/mer2isis/MerSubframe.trn | 44 + isis/src/mer/apps/mer2isis/main.cpp | 12 +- isis/src/mer/apps/mical/main.cpp | 5 +- isis/src/mer/apps/mical/mical.xml | 6 +- .../apps/mdis2isis/MessengerMdisArchive.trn | 202 ++ .../apps/mdis2isis/MessengerMdisBandBin.trn | 59 + .../mdis2isis/MessengerMdisInstrument.trn | 247 ++ isis/src/messenger/apps/mdis2isis/main.cpp | 13 +- .../apps/mdis2pds/MessengerMdisCdrLabel.trn | 1542 ++++++++++ isis/src/messenger/apps/mdis2pds/main.cpp | 52 +- .../messenger/apps/mdis2pds/mdisPdsCdr.def | 230 ++ isis/src/messenger/apps/mdiscal/main.cpp | 66 +- .../apps/mdisddr/MessengerMdisDdrLabel.trn | 1529 ++++++++++ isis/src/messenger/apps/mdisddr/main.cpp | 44 +- .../src/messenger/apps/mdisddr/mdisPdsDdr.def | 221 ++ .../messenger/objs/MdisCamera/MdisCamera.cpp | 6 +- .../messenger/objs/MdisCamera/MdisCamera.h | 2 +- .../src/mex/apps/hrsc2isis/MexHrscArchive.trn | 43 + .../src/mex/apps/hrsc2isis/MexHrscBandBin.trn | 19 + .../mex/apps/hrsc2isis/MexHrscInstrument.trn | 126 + .../src/mex/apps/hrsc2isis/MexHrscKernels.trn | 21 + isis/src/mex/apps/hrsc2isis/hrsc2isis.xml | 51 +- isis/src/mex/apps/hrsc2isis/main.cpp | 292 +- .../mex/apps/hrsc2isis/tsts/default/Makefile | 2 + .../mex/apps/hrsc2isis/tsts/srcImage/Makefile | 15 +- .../mex/objs/MexHrscSrcCamera/Camera.plugin | 6 + .../MexHrscSrcCamera/MexHrscSrcCamera.cpp | 129 + .../objs/MexHrscSrcCamera/MexHrscSrcCamera.h | 86 + .../MexHrscSrcCamera/MexHrscSrcCamera.truth | 34 + .../mex/objs/MexHrscSrcCamera/unitTest.cpp | 133 + .../{base/apps/campt => mex}/tsts/Makefile | 2 +- isis/src/mex/tsts/hrsc/Makefile | 18 + isis/src/mgs/apps/moc2isis/MgsMocArchive.trn | 60 + isis/src/mgs/apps/moc2isis/MgsMocBandBin.trn | 28 + .../mgs/apps/moc2isis/MgsMocInstrument.trn | 105 + isis/src/mgs/apps/moc2isis/main.cpp | 24 +- isis/src/mgs/apps/moccal/main.cpp | 3 + isis/src/mgs/apps/moccal/moccal.xml | 52 +- isis/src/mgs/apps/mocproc/mocproc.xml | 26 +- .../mro/apps/crism2isis/MroCrismArchive.trn | 62 + .../apps/crism2isis/MroCrismInstrument.trn | 162 ++ isis/src/mro/apps/crism2isis/main.cpp | 6 +- isis/src/mro/apps/ctxcal/ctxcal.xml | 26 +- isis/src/mro/apps/ctxcal/main.cpp | 5 +- .../mro/apps/ctxcal/tsts/calibration/Makefile | 2 +- .../src/mro/apps/ctxcal/tsts/default/Makefile | 2 +- .../src/mro/apps/hi2isis/MroHiriseArchive.trn | 146 + .../src/mro/apps/hi2isis/MroHiriseBandBin.trn | 60 + .../mro/apps/hi2isis/MroHiriseInstrument.trn | 883 ++++++ isis/src/mro/apps/hi2isis/main.cpp | 11 +- isis/src/mro/apps/hical/README | 6 +- isis/src/mro/apps/hicalproc/hicalproc.xml | 2 +- isis/src/mro/apps/hiccdstitch/hiccdstitch.xml | 2 +- ...n => MroHiriseIdealPdsExportCubeLabel.trn} | 0 .../MroHirisePdsRdrOriginalLabel.trn} | 11 + isis/src/mro/apps/hideal2pds/hideal2pds.xml | 28 + isis/src/mro/apps/hideal2pds/main.cpp | 81 +- .../hideal2pds/tsts/croppedAlphaCube/Makefile | 1 + .../tsts/differentBitCompressions/Makefile | 54 + .../mro/apps/hideal2pds/tsts/errors/Makefile | 14 +- .../tsts/notJitterCorrected/Makefile | 2 +- .../mro/apps/hidtmgen/MroHiriseIdealPds.pft | 173 ++ .../mro/apps/hidtmgen/MroHiriseIdealPds.typ | 109 + .../mro/apps/hidtmgen/MroHirisePdsDTMEqui.pft | 84 + .../apps/hidtmgen/MroHirisePdsDTMPolar.pft | 74 + isis/src/mro/apps/hidtmgen/hidtmgen.xml | 2 +- isis/src/mro/apps/hidtmgen/main.cpp | 4 +- isis/src/mro/apps/hijitreg/HiJitCube.cpp | 4 +- isis/src/mro/apps/hijitreg/hijitreg.xml | 4 +- .../apps/hirdr2isis/MroHiriseRdrBandBin.trn | 86 + .../apps/hirdr2isis/MroHiriseRdrMosaic.trn | 186 ++ isis/src/mro/apps/hirdr2isis/main.cpp | 9 +- .../hirdrgen/MroHirisePdsRdrCubeLabel.trn | 153 + .../mro/apps/hirdrgen/MroHirisePdsRdrEqui.pft | 102 + .../apps/hirdrgen/MroHirisePdsRdrEquiJP2.pft | 115 + .../apps/hirdrgen/MroHirisePdsRdrExtras.typ | 15 + .../hirdrgen/MroHirisePdsRdrOriginalLabel.trn | 139 + .../apps/hirdrgen/MroHirisePdsRdrPolar.pft | 86 + .../apps/hirdrgen/MroHirisePdsRdrPolarJP2.pft | 99 + isis/src/mro/apps/hirdrgen/main.cpp | 14 +- isis/src/mro/apps/marci2isis/main.cpp | 84 +- isis/src/mro/apps/marci2isis/marci2isis.xml | 4 + .../mro/apps/marci2isis/tsts/varexp/Makefile | 10 + isis/src/mro/apps/marcical/main.cpp | 149 +- isis/src/mro/apps/marcical/marcical.xml | 4 + .../marcical/tsts/single_duration/Makefile | 11 + .../mro/apps/mroctx2isis/MroCtxArchive.trn | 67 + .../mro/apps/mroctx2isis/MroCtxInstrument.trn | 118 + isis/src/mro/apps/mroctx2isis/main.cpp | 8 +- ...l.trn => MroHiriseIdealPdsImportLabel.trn} | 50 +- isis/src/mro/apps/pds2hideal/main.cpp | 2 +- .../pds2hideal/tsts/compressedImage/Makefile | 17 + isis/src/mro/objs/HiCal/HiCalConf.cpp | 10 +- isis/src/mro/objs/HiCal/HiCalConf.h | 2 + isis/src/mro/objs/HiEqualization/FromList.lst | 6 +- isis/src/mro/objs/HiEqualization/HoldList.lst | 2 +- .../apps/msi2isis/NearMsiImportPdsLabel.trn | 113 + isis/src/near/apps/msi2isis/main.cpp | 2 +- .../NewHorizonsLeisaArchive_fit.trn | 42 + .../NewHorizonsLeisaBandBin_fit.trn | 28 + .../NewHorizonsLeisaInstrument_fit.trn | 58 + .../NewHorizonsLeisaKernels_fit.trn | 10 + .../apps/leisa2isis/leisa2isis.cpp | 298 ++ .../newhorizons/apps/leisa2isis/leisa2isis.h | 11 + isis/src/newhorizons/apps/leisa2isis/main.cpp | 306 +- .../NewHorizonsLorriArchive_fit.trn | 36 + .../NewHorizonsLorriBandBin_fit.trn | 28 + .../NewHorizonsLorriInstrument_fit.trn | 106 + .../NewHorizonsLorriKernels_fit.trn | 11 + isis/src/newhorizons/apps/lorri2isis/main.cpp | 18 +- .../mvic2isis/NewHorizonsMvicArchive_fit.trn | 37 + .../mvic2isis/NewHorizonsMvicBandBin_fit.trn | 45 + .../NewHorizonsMvicCalibration_fit.trn | 213 ++ .../NewHorizonsMvicInstrument_fit.trn | 154 + .../mvic2isis/NewHorizonsMvicKernels_fit.trn | 24 + isis/src/newhorizons/apps/mvic2isis/main.cpp | 32 +- isis/src/odyssey/apps/thmproc/thmproc.xml | 2 +- .../odyssey/apps/thmproc/tsts/vis/Makefile | 2 +- .../apps/enlarge => odyssey}/tsts/Makefile | 2 +- isis/src/odyssey/tsts/themis/Makefile | 18 + .../ocams2isis/OsirisRexOcamsBandBin_fit.trn | 37 + .../OsirisRexOcamsInstrument_fit.trn | 98 + .../ocams2isis/OsirisRexOcamsKernels_fit.trn | 24 + isis/src/osirisrex/apps/ocams2isis/main.cpp | 9 +- .../apps/cneteditor/CnetEditorWindow.cpp | 12 +- isis/src/qisis/apps/ipce/IpceMainWindow.cpp | 2 +- isis/src/qisis/apps/qtie/QtieTool.cpp | 4 +- .../AdvancedTrackTool/AdvancedTrackTool.cpp | 322 +- .../AdvancedTrackTool/AdvancedTrackTool.h | 111 +- isis/src/qisis/objs/BlinkTool/BlinkTool.cpp | 4 +- .../AbstractFilterSelector.cpp | 2 +- .../CnetEditorWidget/CnetEditorWidget.cpp | 6 +- .../objs/CnetEditorWidget/FilterGroup.cpp | 3 +- .../objs/CnetEditorWidget/FilterWidget.cpp | 2 +- .../ControlMeasureEditWidget.cpp | 22 +- .../ControlPointEdit/ControlPointEdit.cpp | 22 +- .../objs/CubePlotCurve/CubePlotCurve.cpp | 2 +- .../qisis/objs/CubeViewport/CubeViewport.cpp | 20 +- .../qisis/objs/CubeViewport/CubeViewport.h | 3 + isis/src/qisis/objs/Directory/Directory.cpp | 8 +- .../objs/HistogramTool/HistogramTool.cpp | 2 +- isis/src/qisis/objs/Image/Image.cpp | 2 +- .../JigsawSetupDialog/JigsawSetupDialog.cpp | 10 +- .../objs/MdiCubeViewport/MdiCubeViewport.cpp | 6 +- .../MosaicMainWindow/MosaicMainWindow.cpp | 4 +- .../MosaicSceneWidget/GridGraphicsItem.cpp | 50 +- .../objs/MosaicSceneWidget/MosaicGridTool.cpp | 37 +- .../objs/MosaicSceneWidget/MosaicGridTool.h | 3 +- .../MosaicSceneWidget/MosaicSceneWidget.cpp | 15 +- .../objs/MosaicSceneWidget/MosaicTool.cpp | 2 +- isis/src/qisis/objs/PlotWindow/PlotWindow.cpp | 32 +- .../qisis/objs/ProjectItem/ProjectItem.cpp | 56 +- .../ProjectItemModel/ProjectItemModel.cpp | 8 +- isis/src/qisis/objs/QnetTools/QnetTool.cpp | 2 +- .../objs/RubberBandTool/RubberBandTool.cpp | 16 +- .../ScatterPlotTool/ScatterPlotWindow.cpp | 10 +- .../SensorInfoWidget/SensorInfoWidget.cpp | 2 +- isis/src/qisis/objs/Shape/Shape.cpp | 2 +- .../SpectralPlotTool/SpectralPlotTool.cpp | 6 +- .../objs/StretchTool/AdvancedStretch.cpp | 61 +- .../qisis/objs/StretchTool/AdvancedStretch.h | 8 +- .../StretchTool/AdvancedStretchDialog.cpp | 21 +- .../objs/StretchTool/AdvancedStretchDialog.h | 4 + .../objs/StretchTool/BinaryStretchType.cpp | 2 + .../objs/StretchTool/LinearStretchType.cpp | 9 +- .../objs/StretchTool/LinearStretchType.h | 1 - .../objs/StretchTool/ManualStretchType.cpp | 2 + .../objs/StretchTool/SawtoothStretchType.cpp | 9 +- .../objs/StretchTool/SawtoothStretchType.h | 1 - .../qisis/objs/StretchTool/StretchTool.cpp | 181 ++ isis/src/qisis/objs/StretchTool/StretchTool.h | 3 + .../qisis/objs/StretchTool/StretchType.cpp | 17 +- isis/src/qisis/objs/StretchTool/StretchType.h | 6 +- .../TargetInfoWidget/TargetInfoWidget.cpp | 20 +- isis/src/qisis/objs/Tool/Tool.cpp | 2 +- .../objs/WarningWidget/WarningWidget.cpp | 2 +- isis/src/rolo/apps/rolo2isis/RoloArchive.trn | 31 + isis/src/rolo/apps/rolo2isis/RoloBandBin.trn | 559 ++++ .../rolo/apps/rolo2isis/RoloInstrument.trn | 281 ++ isis/src/rolo/apps/rolo2isis/RoloMapping.trn | 106 + isis/src/rolo/apps/rolo2isis/main.cpp | 12 +- .../rososiris2isis/RosettaOsirisArchive.trn | 143 + .../rososiris2isis/RosettaOsirisBandBin.trn | 34 + .../rososiris2isis/RosettaOsirisFilters.trn | 146 + .../RosettaOsirisInstrument.trn | 190 ++ isis/src/rosetta/apps/rososiris2isis/main.cpp | 11 +- .../rosvirtis2isis/RosettaVirtisArchive.trn | 125 + .../RosettaVirtisInstruments.trn | 290 ++ .../RosettaVirtisMHousekeeping.def | 107 + isis/src/rosetta/apps/rosvirtis2isis/main.cpp | 126 +- .../RosettaVirtisCamera.cpp | 80 +- .../RosettaVirtisCamera/RosettaVirtisCamera.h | 2 + .../RosettaVirtisCamera.truth | 55 +- .../objs/RosettaVirtisCamera/unitTest.cpp | 155 +- .../socet/apps/socetlinescankeywords/main.cpp | 2 +- isis/src/system/apps/blobdump/blobdump.xml | 2 +- isis/src/system/apps/csspckgen/csspckgen.xml | 4 +- isis/src/system/apps/dempack/dempack.xml | 2 +- isis/src/system/apps/dempack/main.cpp | 2 +- .../system/apps/kerneldbgen/SpiceDbGen.cpp | 99 +- isis/src/system/apps/kerneldbgen/SpiceDbGen.h | 9 +- .../system/apps/kerneldbgen/kerneldbgen.xml | 86 +- isis/src/system/apps/kerneldbgen/main.cpp | 50 +- .../system/apps/kerneldbgen/tsts/ck/Makefile | 12 +- isis/src/system/apps/messckgen/messckgen.xml | 8 +- .../src/system/apps/messspkgen/messspkgen.xml | 2 +- isis/src/system/objs/Kernel/Kernel.cpp | 17 +- isis/src/system/objs/Kernel/Kernel.h | 3 + isis/src/system/objs/Kernel/Kernel.truth | 92 - isis/src/system/objs/Kernel/unitTest.cpp | 143 - isis/src/system/objs/KernelDb/KernelDb.truth | 507 ---- isis/src/system/objs/KernelDb/test.db | 129 - isis/src/system/objs/KernelDb/unitTest.cpp | 411 --- .../src/tgo/apps/tgocassis2isis/TgoCassis.trn | 124 + .../apps/tgocassis2isis/TgoCassisArchive.trn | 509 ++++ .../apps/tgocassis2isis/TgoCassisBandBin.trn | 76 + .../TgoCassisExportedInstrument.trn | 165 ++ .../tgocassis2isis/TgoCassisInstrument.trn | 125 + .../apps/tgocassis2isis/TgoCassisMapping.trn | 195 ++ .../apps/tgocassis2isis/TgoCassisMosaic.trn | 151 + .../tgocassis2isis/TgoCassisMosaicBandBin.trn | 77 + .../TgoCassisOperationPeriod.trn | 11 + .../tgo/apps/tgocassis2isis/TgoCassisRdr.trn | 118 + .../tgocassis2isis/TgoCassisSubWindow.trn | 352 +++ isis/src/tgo/apps/tgocassis2isis/main.cpp | 152 +- isis/src/tgo/apps/tgocassismos/main.cpp | 44 +- .../tgo/apps/tgocassismos/tgocassismos.xml | 30 +- .../apps/tgocassismos/tsts/default/Makefile | 1 + .../apps/tgocassisrdrgen/TgoCassisExport.trn | 680 +++++ .../tgocassisrdrgen/TgoCassisExportMosaic.trn | 531 ++++ isis/src/tgo/apps/tgocassisrdrgen/main.cpp | 79 +- .../apps/tgocassisrdrgen/tgocassisrdrgen.xml | 28 + .../TgoCassisDistortionMap.cpp | 4 +- .../TgoCassisCamera/TgoCassisDistortionMap.h | 2 +- isis/src/tgo/tsts/coloredMosaic/Makefile | 1 + .../tsts/singleColorMosaicReingest/Makefile | 2 +- .../uncontrolledSingleColorMosaic/Makefile | 2 +- isis/src/viking/apps/viknobutter/main.cpp | 10 +- .../voy2isis/assets/images/voy2isisGUI.jpg | Bin 84119 -> 52415 bytes .../voy2isis/assets/thumbs/voy2isisGUI.jpg | Bin 14687 -> 2474 bytes isis/src/voyager/apps/voy2isis/main.cpp | 67 +- .../voy2isis/tsts/instrumentname/Makefile | 13 + isis/src/voyager/apps/voy2isis/voy2isis.xml | 46 + isis/src/voyager/apps/voy2isis/voyager.trn | 204 ++ .../apps/voy2isis/voyager_na_bandbin.trn | 75 + .../apps/voy2isis/voyager_wa_bandbin.trn | 109 + isis/src/voyager/apps/voycal/main.cpp | 32 +- isis/src/voyager/apps/voycal/voycal.xml | 49 +- isis/templates/README.md | 24 + isis/templates/default.cpp | 7 + isis/tests/AffineTests.cpp | 169 ++ isis/tests/Area3DTests.cpp | 266 ++ isis/tests/AutoseedTests.cpp | 199 ++ isis/tests/BasisFunctionTests.cpp | 142 + isis/tests/BulletDskShapeTests.cpp | 65 + isis/tests/BundleMeasureTests.cpp | 146 + .../BundleObservationSolveSettingsTests.cpp | 504 ++++ isis/tests/CMakeLists.txt | 38 +- isis/tests/Cam2mapTests.cpp | 486 ++++ isis/tests/CamptFunctionalTests.cpp | 262 ++ isis/tests/CnetWinnowTests.cpp | 56 + isis/tests/ColumnTests.cpp | 191 ++ isis/tests/CubeTests.cpp | 234 ++ isis/tests/DisplacementTests.cpp | 202 ++ isis/tests/FileListTests.cpp | 47 + isis/tests/FileNameTests.cpp | 20 +- isis/tests/Fixtures.cpp | 205 ++ isis/tests/Fixtures.h | 103 + isis/tests/FootprintinitTests.cpp | 26 + isis/tests/FunctionalTestCnetstats.cpp | 236 ++ isis/tests/FunctionalTestsCamstats.cpp | 156 + isis/tests/FunctionalTestsCnetCombinePt.cpp | 507 ++++ isis/tests/FunctionalTestsCnetbin2pvl.cpp | 31 + isis/tests/FunctionalTestsCnetpvl2bin.cpp | 30 + isis/tests/FunctionalTestsEnlarge.cpp | 111 + isis/tests/FunctionalTestsGetsn.cpp | 149 + isis/tests/FunctionalTestsIsis2ascii.cpp | 129 + isis/tests/FunctionalTestsKaguyatc2isis.cpp | 88 + isis/tests/FunctionalTestsLeisa2isis.cpp | 90 + isis/tests/FunctionalTestsMappt.cpp | 365 +++ isis/tests/FunctionalTestsSpiceserver.cpp | 180 ++ .../tests/FuntionalTestsFindImageOverlaps.cpp | 53 + isis/tests/GaussianDistributionTests.cpp | 67 + isis/tests/IDTests.cpp | 83 + isis/tests/KernelDbTests.cpp | 336 +++ isis/tests/KernelTests.cpp | 90 + isis/tests/LatitudeTests.cpp | 439 +++ isis/tests/LineEquationTests.cpp | 173 ++ isis/tests/Map2camTests.cpp | 32 + isis/tests/Mocks.h | 84 + isis/tests/PixelTypeTests.cpp | 62 + isis/tests/PvlObjectTests.cpp | 197 ++ .../RollingShutterCameraDetectorMapTests.cpp | 34 + isis/tests/SpiceTests.cpp | 194 ++ isis/tests/StatisticsTest.cpp | 271 ++ isis/tests/TestUtilities.cpp | 113 + isis/tests/TestUtilities.h | 49 +- isis/tests/cnetcheckFunctionalTests.cpp | 148 + .../LineScannerImage/defaultLineScanner.isd | 1 + .../LineScannerImage/defaultLineScanner.pvl | 440 +++ .../projDefaultLineScanner.pvl | 470 +++ isis/tests/data/defaultImage/defaultCube.isd | 146 + isis/tests/data/defaultImage/defaultCube.pvl | 95 + .../data/defaultImage/projDefaultCube.pvl | 385 +++ .../TC1S2B0_01_05186N225E0040_mini.img | Bin 0 -> 19248 bytes .../TC1S2B0_01_05186N225E0040_mini.lbl | 131 + .../lsb_0034933739_0x53c_sci_1_cropped.fit | 797 +++++ .../data/threeImageNetwork/controlnetwork.net | 573 ++++ isis/tests/data/threeImageNetwork/cube1.isd | 325 +++ isis/tests/data/threeImageNetwork/cube1.pvl | 110 + isis/tests/data/threeImageNetwork/cube2.isd | 325 +++ isis/tests/data/threeImageNetwork/cube2.pvl | 110 + isis/tests/data/threeImageNetwork/cube3.isd | 313 ++ isis/tests/data/threeImageNetwork/cube3.pvl | 110 + .../threeImageNetwork/threeImageOverlaps.lis | 12 + .../threeImageNetwork/twoImageOverlaps.lis | 6 + isis/tests/spiceinitTests.cpp | 514 ++++ isis/tests/statsTests.cpp | 9 + isis/version | 3 - recipe/build.sh | 2 +- recipe/meta.yaml | 220 +- 1480 files changed, 88978 insertions(+), 20965 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/1_Bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/2_Feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/3_Support_question.md create mode 100644 .github/ISSUE_TEMPLATE/4_Documentation_issue.md create mode 100644 AUTHORS.rst create mode 100644 LICENSE.md delete mode 100644 LICENSE.txt create mode 100644 docker/centos.dockerfile create mode 100644 docker/fedora.dockerfile create mode 100644 docker/ubuntu.dockerfile create mode 100644 isis/appdata/autoreg/coreg.adaptgruen.p1515s3030.def create mode 100644 isis/appdata/autoreg/coreg.maxcor.p1515.s3030.def create mode 100644 isis/appdata/autoreg/coreg.maxcor.p2020.s5050.def create mode 100644 isis/appdata/autoreg/coreg.mindif.p1515.s3030.def create mode 100644 isis/appdata/autoreg/coreg.mindif.p2020.s5050.def create mode 100644 isis/appdata/autoreg/default.def create mode 100644 isis/appdata/autoreg/findrx.def create mode 100644 isis/appdata/autoreg/gruen_default.def create mode 100644 isis/appdata/autoreg/qnetReg.def create mode 100644 isis/appdata/images/icons/3d-glasses-icon.png create mode 100644 isis/appdata/images/icons/HILLBLU_molecola.png create mode 100644 isis/appdata/images/icons/add.png create mode 100644 isis/appdata/images/icons/add_large.png create mode 100644 isis/appdata/images/icons/applications-system.png create mode 100644 isis/appdata/images/icons/archive-insert-directory.png create mode 100644 isis/appdata/images/icons/back.png create mode 100644 isis/appdata/images/icons/blink.png create mode 100644 isis/appdata/images/icons/blinkAdvance.png create mode 100644 isis/appdata/images/icons/blinkReverse.png create mode 100644 isis/appdata/images/icons/blinkStart.png create mode 100644 isis/appdata/images/icons/blinkStop.png create mode 100644 isis/appdata/images/icons/button_cancel.png create mode 100644 isis/appdata/images/icons/button_ok.png create mode 100644 isis/appdata/images/icons/camera-photo.png create mode 100644 isis/appdata/images/icons/camera.png create mode 100644 isis/appdata/images/icons/color_line.png create mode 100644 isis/appdata/images/icons/colorize.png create mode 100644 isis/appdata/images/icons/contexthelp.png create mode 100644 isis/appdata/images/icons/copy_bands.png create mode 100644 isis/appdata/images/icons/copy_stretch.png create mode 100644 isis/appdata/images/icons/document-save-as.png create mode 100644 isis/appdata/images/icons/document-save.png create mode 100644 isis/appdata/images/icons/down.png create mode 100644 isis/appdata/images/icons/edit.png create mode 100644 isis/appdata/images/icons/editcopy.png create mode 100644 isis/appdata/images/icons/editdelete.png create mode 100644 isis/appdata/images/icons/editpaste.png create mode 100644 isis/appdata/images/icons/exec.png create mode 100644 isis/appdata/images/icons/exit.png create mode 100644 isis/appdata/images/icons/fileclose.png create mode 100644 isis/appdata/images/icons/fileexport.png create mode 100644 isis/appdata/images/icons/filefind.png create mode 100644 isis/appdata/images/icons/filenew.png create mode 100644 isis/appdata/images/icons/fileopen.png create mode 100644 isis/appdata/images/icons/fileprint.png create mode 100644 isis/appdata/images/icons/filesave.png create mode 100644 isis/appdata/images/icons/filesaveas.png create mode 100644 isis/appdata/images/icons/find.png create mode 100644 isis/appdata/images/icons/folder-activities.png create mode 100644 isis/appdata/images/icons/folder-image.png create mode 100644 isis/appdata/images/icons/folder-orange.png create mode 100644 isis/appdata/images/icons/folder-red.png create mode 100644 isis/appdata/images/icons/folder-remote.png create mode 100644 isis/appdata/images/icons/folder.png create mode 100644 isis/appdata/images/icons/forward.png create mode 100644 isis/appdata/images/icons/frame_query.png create mode 100644 isis/appdata/images/icons/get-hot-new-stuff.png create mode 100644 isis/appdata/images/icons/global_stretch.png create mode 100644 isis/appdata/images/icons/goto.png create mode 100644 isis/appdata/images/icons/gray.png create mode 100644 isis/appdata/images/icons/grid.png create mode 100644 isis/appdata/images/icons/guiClearLog.png create mode 100644 isis/appdata/images/icons/guiExit.png create mode 100644 isis/appdata/images/icons/guiNextHistory.png create mode 100644 isis/appdata/images/icons/guiPrevHistory.png create mode 100644 isis/appdata/images/icons/guiReset.png create mode 100644 isis/appdata/images/icons/guiRun.png create mode 100644 isis/appdata/images/icons/guiSaveLog.png create mode 100644 isis/appdata/images/icons/guiStop.png create mode 100644 isis/appdata/images/icons/help-contents.png create mode 100644 isis/appdata/images/icons/histogram.png create mode 100644 isis/appdata/images/icons/ice.png create mode 100644 isis/appdata/images/icons/info.png create mode 100644 isis/appdata/images/icons/kchart.png create mode 100644 isis/appdata/images/icons/labels.png create mode 100644 isis/appdata/images/icons/license.txt create mode 100644 isis/appdata/images/icons/licenses/ATTRIBUTES.txt create mode 100644 isis/appdata/images/icons/licenses/lgpl-3.0.txt create mode 100644 isis/appdata/images/icons/linefit.png create mode 100644 isis/appdata/images/icons/link.png create mode 100644 isis/appdata/images/icons/link_valid.png create mode 100644 isis/appdata/images/icons/linked.png create mode 100644 isis/appdata/images/icons/mActionExportMapServer.png create mode 100644 isis/appdata/images/icons/mActionFileSave.png create mode 100644 isis/appdata/images/icons/mActionFileSaveAs.png create mode 100644 isis/appdata/images/icons/mActionHelpContents.png create mode 100644 isis/appdata/images/icons/mActionLabel.png create mode 100644 isis/appdata/images/icons/mActionMoveVertex.png create mode 100644 isis/appdata/images/icons/mActionSelect.png create mode 100644 isis/appdata/images/icons/measure.png create mode 100644 isis/appdata/images/icons/mouse.png create mode 100644 isis/appdata/images/icons/move.png create mode 100644 isis/appdata/images/icons/nasa_enceladus.png create mode 100644 isis/appdata/images/icons/nasa_europa.png create mode 100644 isis/appdata/images/icons/nasa_mars.png create mode 100644 isis/appdata/images/icons/nasa_titan.png create mode 100644 isis/appdata/images/icons/network-server-database.png create mode 100644 isis/appdata/images/icons/nomenclature.png create mode 100644 isis/appdata/images/icons/office-chart-pie.png create mode 100644 isis/appdata/images/icons/ographic.png create mode 100644 isis/appdata/images/icons/openList.png create mode 100644 isis/appdata/images/icons/plot.png create mode 100644 isis/appdata/images/icons/plot_clear.png create mode 100644 isis/appdata/images/icons/plot_configure.png create mode 100644 isis/appdata/images/icons/plot_copy.png create mode 100644 isis/appdata/images/icons/plot_grid.png create mode 100644 isis/appdata/images/icons/plot_hideCurves.png create mode 100644 isis/appdata/images/icons/plot_markers.png create mode 100644 isis/appdata/images/icons/plot_renameLabels.png create mode 100644 isis/appdata/images/icons/plot_renameLables.png create mode 100644 isis/appdata/images/icons/plot_resetscale.png create mode 100644 isis/appdata/images/icons/plot_setScale.png create mode 100644 isis/appdata/images/icons/plot_showCurves.png create mode 100644 isis/appdata/images/icons/plot_switchBackgrd.png create mode 100644 isis/appdata/images/icons/plot_table.png create mode 100644 isis/appdata/images/icons/preferences-desktop-launch-feedback.png create mode 100644 isis/appdata/images/icons/preferences-plugin.png create mode 100644 isis/appdata/images/icons/qmos_area.png create mode 100644 isis/appdata/images/icons/quickopen.png create mode 100644 isis/appdata/images/icons/qview_NoWarning.png create mode 100644 isis/appdata/images/icons/qview_Warning.png create mode 100644 isis/appdata/images/icons/qview_angle.png create mode 100644 isis/appdata/images/icons/qview_circle.png create mode 100644 isis/appdata/images/icons/qview_ellipse.png create mode 100644 isis/appdata/images/icons/qview_line.png create mode 100644 isis/appdata/images/icons/qview_polygon.png create mode 100644 isis/appdata/images/icons/qview_rectangle.png create mode 100644 isis/appdata/images/icons/qview_rotated_rectangle.png create mode 100644 isis/appdata/images/icons/qview_segmentedline.png create mode 100644 isis/appdata/images/icons/rating.png create mode 100644 isis/appdata/images/icons/redDot.png create mode 100644 isis/appdata/images/icons/redo.png create mode 100644 isis/appdata/images/icons/regional_stretch-2.png create mode 100644 isis/appdata/images/icons/reload.png create mode 100644 isis/appdata/images/icons/rgb.png create mode 100644 isis/appdata/images/icons/savechips.png create mode 100644 isis/appdata/images/icons/scatterplot.png create mode 100644 isis/appdata/images/icons/scatterplotalarming.png create mode 100644 isis/appdata/images/icons/scatterplotcontour.png create mode 100644 isis/appdata/images/icons/sort.png create mode 100644 isis/appdata/images/icons/spatial_plot.png create mode 100644 isis/appdata/images/icons/spectral_plot.png create mode 100644 isis/appdata/images/icons/statistics.png create mode 100644 isis/appdata/images/icons/stock_draw-connector-with-arrows.png create mode 100644 isis/appdata/images/icons/stretch_global.png create mode 100644 isis/appdata/images/icons/sunshadow.png create mode 100644 isis/appdata/images/icons/svg/application-exit.svgz create mode 100644 isis/appdata/images/icons/svg/applications-education-miscellaneous.svgz create mode 100644 isis/appdata/images/icons/svg/applications-graphics.svgz create mode 100644 isis/appdata/images/icons/svg/applications-internet.svgz create mode 100644 isis/appdata/images/icons/svg/applications-system.svgz create mode 100644 isis/appdata/images/icons/svg/archive-extract.svgz create mode 100755 isis/appdata/images/icons/svg/archive-insert-directory.svgz create mode 100644 isis/appdata/images/icons/svg/back.svgz create mode 100644 isis/appdata/images/icons/svg/blockdevice.svgz create mode 100644 isis/appdata/images/icons/svg/camera-photo.svgz create mode 100644 isis/appdata/images/icons/svg/configure.svgz create mode 100644 isis/appdata/images/icons/svg/contents2.svgz create mode 100644 isis/appdata/images/icons/svg/dialog-cancel.svgz create mode 100644 isis/appdata/images/icons/svg/dialog-ok-apply.svgz create mode 100644 isis/appdata/images/icons/svg/dialog-warning.svgz create mode 100644 isis/appdata/images/icons/svg/document-edit.svgz create mode 100644 isis/appdata/images/icons/svg/document-new.svgz create mode 100644 isis/appdata/images/icons/svg/document-open.svgz create mode 100644 isis/appdata/images/icons/svg/document-preview.svgz create mode 100644 isis/appdata/images/icons/svg/document-print.svgz create mode 100644 isis/appdata/images/icons/svg/document-save-as.svgz create mode 100644 isis/appdata/images/icons/svg/document-save.svgz create mode 100644 isis/appdata/images/icons/svg/down.svgz create mode 100644 isis/appdata/images/icons/svg/draw-arrow-back.svgz create mode 100644 isis/appdata/images/icons/svg/draw-arrow-forward.svgz create mode 100644 isis/appdata/images/icons/svg/draw-circle.svgz create mode 100644 isis/appdata/images/icons/svg/draw-ellipse.svgz create mode 100644 isis/appdata/images/icons/svg/draw-freehand.svgz create mode 100644 isis/appdata/images/icons/svg/draw-polyline.svgz create mode 100644 isis/appdata/images/icons/svg/draw-rectangle.svgz create mode 100644 isis/appdata/images/icons/svg/draw-triangle3.svgz create mode 100644 isis/appdata/images/icons/svg/edit-copy.svgz create mode 100644 isis/appdata/images/icons/svg/edit-delete.svgz create mode 100644 isis/appdata/images/icons/svg/edit-find.svgz create mode 100644 isis/appdata/images/icons/svg/edit-paste.svgz create mode 100644 isis/appdata/images/icons/svg/edit-select.svgz create mode 100644 isis/appdata/images/icons/svg/fileclose.svgz create mode 100644 isis/appdata/images/icons/svg/fill-color.svgz create mode 100644 isis/appdata/images/icons/svg/folder-activities.svgz create mode 100644 isis/appdata/images/icons/svg/folder-image.svgz create mode 100644 isis/appdata/images/icons/svg/folder-orange.svgz create mode 100644 isis/appdata/images/icons/svg/folder-red.svgz create mode 100644 isis/appdata/images/icons/svg/folder-remote.svgz create mode 100644 isis/appdata/images/icons/svg/folder.svgz create mode 100644 isis/appdata/images/icons/svg/forward.svgz create mode 100644 isis/appdata/images/icons/svg/get-hot-new-stuff.svgz create mode 100644 isis/appdata/images/icons/svg/help-contents.svgz create mode 100644 isis/appdata/images/icons/svg/input-mouse.svgz create mode 100644 isis/appdata/images/icons/svg/kchart.svgz create mode 100644 isis/appdata/images/icons/svg/layer-visible-on.svgz create mode 100644 isis/appdata/images/icons/svg/list-add.svgz create mode 100644 isis/appdata/images/icons/svg/mail-attachment.svgz create mode 100644 isis/appdata/images/icons/svg/mail-reply-sender.svgz create mode 100644 isis/appdata/images/icons/svg/mail-tagged.svgz create mode 100644 isis/appdata/images/icons/svg/media-playback-start.svgz create mode 100644 isis/appdata/images/icons/svg/media-playback-stop.svgz create mode 100644 isis/appdata/images/icons/svg/media-seek-backward.svgz create mode 100644 isis/appdata/images/icons/svg/media-seek-forward.svgz create mode 100644 isis/appdata/images/icons/svg/network-connect.svgz create mode 100644 isis/appdata/images/icons/svg/network-disconnect.svgz create mode 100644 isis/appdata/images/icons/svg/network-server-database.svgz create mode 100644 isis/appdata/images/icons/svg/office-chart-line.svgz create mode 100755 isis/appdata/images/icons/svg/office-chart-pie.svgz create mode 100644 isis/appdata/images/icons/svg/preferences-desktop-launch-feedback.svgz create mode 100644 isis/appdata/images/icons/svg/preferences-plugin.svgz create mode 100644 isis/appdata/images/icons/svg/process-stop.svgz create mode 100644 isis/appdata/images/icons/svg/project-open.svgz create mode 100644 isis/appdata/images/icons/svg/quickopen.svgz create mode 100644 isis/appdata/images/icons/svg/rating.svgz create mode 100644 isis/appdata/images/icons/svg/reload.svgz create mode 100644 isis/appdata/images/icons/svg/system-help.svgz create mode 100644 isis/appdata/images/icons/svg/transform-crop.svgz create mode 100644 isis/appdata/images/icons/svg/transform-move.svgz create mode 100644 isis/appdata/images/icons/svg/up.svgz create mode 100644 isis/appdata/images/icons/svg/user-online.svgz create mode 100644 isis/appdata/images/icons/svg/view-close.svgz create mode 100644 isis/appdata/images/icons/svg/view-form-table.svgz create mode 100644 isis/appdata/images/icons/svg/view-fullscreen.svgz create mode 100644 isis/appdata/images/icons/svg/view-list-text.svgz create mode 100644 isis/appdata/images/icons/svg/view-list-tree.svgz create mode 100644 isis/appdata/images/icons/svg/view-object-histogram-linear.svgz create mode 100644 isis/appdata/images/icons/svg/view-preview.svgz create mode 100644 isis/appdata/images/icons/svg/view-sort-ascending.svgz create mode 100644 isis/appdata/images/icons/svg/view-split-top-bottom.svgz create mode 100644 isis/appdata/images/icons/svg/view-statistics.svgz create mode 100644 isis/appdata/images/icons/svg/view-web-browser-dom-tree.svgz create mode 100644 isis/appdata/images/icons/svg/weather-clear-night.svgz create mode 100644 isis/appdata/images/icons/svg/weather-clear.svgz create mode 100644 isis/appdata/images/icons/svg/weather-freezing-rain.svgz create mode 100644 isis/appdata/images/icons/svg/window-duplicate.svgz create mode 100644 isis/appdata/images/icons/svg/window-new.svgz create mode 100644 isis/appdata/images/icons/svg/zoom-in.svgz create mode 100644 isis/appdata/images/icons/svg/zoom-original.svgz create mode 100644 isis/appdata/images/icons/svg/zoom-out.svgz create mode 100644 isis/appdata/images/icons/svg/zoom-select.svgz create mode 100644 isis/appdata/images/icons/undo.png create mode 100644 isis/appdata/images/icons/unlinked.png create mode 100644 isis/appdata/images/icons/up.png create mode 100644 isis/appdata/images/icons/view-catalog.png create mode 100644 isis/appdata/images/icons/view-preview.png create mode 100644 isis/appdata/images/icons/view-web-browser-dom-tree.png create mode 100644 isis/appdata/images/icons/view_text.png create mode 100644 isis/appdata/images/icons/view_tree.png create mode 100644 isis/appdata/images/icons/viewmag+.png create mode 100644 isis/appdata/images/icons/viewmag-.png create mode 100644 isis/appdata/images/icons/viewmag.png create mode 100644 isis/appdata/images/icons/viewmag1.png create mode 100644 isis/appdata/images/icons/viewmagfit.png create mode 100644 isis/appdata/images/icons/weather-clear-night.png create mode 100644 isis/appdata/images/icons/window_fullscreen.png create mode 100644 isis/appdata/images/icons/window_list.png create mode 100644 isis/appdata/images/icons/window_new.png create mode 100644 isis/appdata/images/targets/ReadMe.txt create mode 100644 isis/appdata/images/targets/nasa_enceladus_saturn.png create mode 100644 isis/appdata/images/targets/nasa_europa_large.png create mode 100644 isis/appdata/images/targets/nasa_mars_large.png create mode 100644 isis/appdata/images/targets/nasa_moon_large.png create mode 100644 isis/appdata/images/targets/nasa_titan_large.png create mode 100644 isis/appdata/serialnumbers/Apollo15MetricSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Apollo15PanoramicSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Apollo15SerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Apollo16MetricSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Apollo16PanoramicSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Apollo17MetricSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Apollo17PanoramicSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/CassiniIssSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/CassiniVimsSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Chandrayaan1M3SerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Chandrayaan1MinirfSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Clementine1HiresSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Clementine1LwirSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Clementine1NirSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Clementine1UvvisSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/DawnFcSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/DawnVirSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/GalileoSsiSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Hayabusa2OncSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/HayabusaAmicaSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/JunoJunoCamSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/LoHrcSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/LoMrcSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/LroMinirfSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/LroNacSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MessengerMdisSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MexHrscSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MexSrcSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MgsMocSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MroCrismSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MroCtxSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/MroHiriseSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/NearMsiSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/NewHorizonsLeisaSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/NewHorizonsLorriSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/NewHorizonsMvicSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/OdysseyThemisSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/OsirisRexOCamsSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/SerialNumber.trn create mode 100644 isis/appdata/serialnumbers/TgoCassisSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Viking1CameraASerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Viking1CameraBSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Viking2CameraASerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Viking2CameraBSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Voyager1NacSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Voyager1WacSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Voyager2NacSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/Voyager2WacSerialNumber.trn create mode 100644 isis/appdata/serialnumbers/aerialphotoSerialNumber.trn create mode 100644 isis/appdata/templates/autoreg/coreg.adaptgruen.p1515s3030.def create mode 100644 isis/appdata/templates/autoreg/coreg.maxcor.p1515.s3030.def create mode 100644 isis/appdata/templates/autoreg/coreg.maxcor.p2020.s5050.def create mode 100644 isis/appdata/templates/autoreg/coreg.mindif.p1515.s3030.def create mode 100644 isis/appdata/templates/autoreg/coreg.mindif.p2020.s5050.def create mode 100644 isis/appdata/templates/autoreg/default.def create mode 100644 isis/appdata/templates/autoreg/findrx.def create mode 100644 isis/appdata/templates/autoreg/gruen_default.def create mode 100644 isis/appdata/templates/autoreg/qnetReg.def create mode 100644 isis/appdata/templates/autoseed/grid.def create mode 100644 isis/appdata/templates/autoseed/gridExtraKeywords.pvl create mode 100644 isis/appdata/templates/autoseed/limit.def create mode 100644 isis/appdata/templates/autoseed/strip.def create mode 100644 isis/appdata/templates/cnet_validmeasure/validmeasure.def create mode 100644 isis/appdata/templates/cnet_validmeasure/validmeasure.def.example create mode 100644 isis/appdata/templates/cnetref/cnetref_nooperator.def create mode 100644 isis/appdata/templates/cnetref/cnetref_operator.def create mode 100644 isis/appdata/templates/cnetref/gradient_operator.def.example create mode 100644 isis/appdata/templates/cnetref/no_operator.def.example create mode 100644 isis/appdata/templates/cnetref/standard_deviation_operator.def.example create mode 100644 isis/appdata/templates/cnetstats/cnetstats.def create mode 100644 isis/appdata/templates/cnetstats/cnetstats.def.example create mode 100644 isis/appdata/templates/controlnetworks/ControlNetPvlV0005.template create mode 100644 isis/appdata/templates/findfeatures/multi_algorithms.lis create mode 100644 isis/appdata/templates/findfeatures/single_algorithms.lis create mode 100644 isis/appdata/templates/fullcnetdiff/fullcnetdiff.def create mode 100644 isis/appdata/templates/hidtmgen/hidtmgenParamsTemplate.pvl create mode 100644 isis/appdata/templates/jigsaw/SensorParameters.pvl create mode 100644 isis/appdata/templates/jigsaw/TargetBodyParameters.pvl create mode 100644 isis/appdata/templates/kernels/blurGaussian3x3.txt create mode 100644 isis/appdata/templates/kernels/derivativeNWtoSE2x2.txt create mode 100644 isis/appdata/templates/kernels/emboss3x3.txt create mode 100644 isis/appdata/templates/kernels/gaussianSquare5x5.txt create mode 100644 isis/appdata/templates/kernels/highpassCircle5x5.txt create mode 100644 isis/appdata/templates/kernels/laplacianCircle3x3.txt create mode 100644 isis/appdata/templates/kernels/smoothCircle5x5.txt create mode 100644 isis/appdata/templates/kernels/smoothCone5x5.txt create mode 100644 isis/appdata/templates/kernels/smoothPyramid5x5.txt create mode 100644 isis/appdata/templates/kernels/smoothRectangle5x5.txt create mode 100644 isis/appdata/templates/labels/CubeFormatTemplate.pft create mode 100644 isis/appdata/templates/labels/MappingGroupKeywords.pft create mode 100644 isis/appdata/templates/labels/pdsExportAllMapping.pft create mode 100644 isis/appdata/templates/maps/ellipsoidtransverseazimuthal.map create mode 100644 isis/appdata/templates/maps/equirectangular.map create mode 100644 isis/appdata/templates/maps/lambertazimuthalequalarea.map create mode 100644 isis/appdata/templates/maps/lambertconformal.map create mode 100644 isis/appdata/templates/maps/mercator.map create mode 100644 isis/appdata/templates/maps/mollweide.map create mode 100644 isis/appdata/templates/maps/obliquecylindrical.map create mode 100644 isis/appdata/templates/maps/orthographic.map create mode 100644 isis/appdata/templates/maps/planar.map create mode 100644 isis/appdata/templates/maps/pointperspective.map create mode 100644 isis/appdata/templates/maps/polarstereographic.map create mode 100644 isis/appdata/templates/maps/ringcylindrical.map create mode 100644 isis/appdata/templates/maps/robinson.map create mode 100644 isis/appdata/templates/maps/simplecylindrical.map create mode 100644 isis/appdata/templates/maps/sinusoidal.map create mode 100644 isis/appdata/templates/maps/transversemercator.map create mode 100644 isis/appdata/templates/noproj/noprojInstruments.pvl create mode 100644 isis/appdata/templates/photometry/callisto.pvl create mode 100644 isis/appdata/templates/photometry/europa.pvl create mode 100644 isis/appdata/templates/photometry/ganymede.pvl create mode 100644 isis/appdata/templates/photometry/general_photomet.pvl create mode 100644 isis/appdata/templates/photometry/io.pvl create mode 100644 isis/appdata/templates/photometry/mars.pvl create mode 100644 isis/appdata/templates/photometry/mars_mdim2.1_blu_hapken_albat_h2.pvl create mode 100644 isis/appdata/templates/photometry/mars_mdim2.1_blu_hapken_topat_h2.pvl create mode 100644 isis/appdata/templates/photometry/mars_mdim2.1_otherfilters_hapken_albat_h2.pvl create mode 100644 isis/appdata/templates/photometry/mars_mdim2.1_otherfilters_hapken_topat_h2.pvl create mode 100644 isis/appdata/templates/photometry/marsblu.pvl create mode 100644 isis/appdata/templates/photometry/marsred.pvl create mode 100644 isis/appdata/templates/photometry/moon_clementine_uvvis_a.pvl create mode 100644 isis/appdata/templates/photometry/moon_clementine_uvvis_b.pvl create mode 100644 isis/appdata/templates/photometry/moon_clementine_uvvis_cde.pvl create mode 100644 isis/appdata/translations/ClipperEisCore.trn create mode 100644 isis/appdata/translations/ClipperEisInstrument.trn create mode 100644 isis/appdata/translations/Instruments.trn create mode 100644 isis/appdata/translations/Mariner10VidiconASerialNumber.trn create mode 100644 isis/appdata/translations/Mariner10VidiconBSerialNumber.trn create mode 100644 isis/appdata/translations/MerMiSerialNumber.trn create mode 100644 isis/appdata/translations/MissionName2DataDir.trn create mode 100644 isis/appdata/translations/NaifErrors.trn create mode 100644 isis/appdata/translations/README.TXT create mode 100644 isis/appdata/translations/geotiff/26910.trn create mode 100644 isis/appdata/translations/geotiff/26911.trn create mode 100644 isis/appdata/translations/geotiff/26912.trn create mode 100644 isis/appdata/translations/geotiff/26913.trn create mode 100644 isis/appdata/translations/geotiff/26914.trn create mode 100644 isis/appdata/translations/geotiff/26915.trn create mode 100644 isis/appdata/translations/geotiff/26916.trn create mode 100644 isis/appdata/translations/geotiff/26917.trn create mode 100644 isis/appdata/translations/geotiff/26918.trn create mode 100644 isis/appdata/translations/geotiff/26919.trn create mode 100644 isis/appdata/translations/isis2bandbin.trn create mode 100644 isis/appdata/translations/isis2instrument.trn create mode 100644 isis/appdata/translations/pds4Export.trn create mode 100644 isis/appdata/translations/pds4ExportArray2DImage.trn create mode 100644 isis/appdata/translations/pds4ExportArray3DImage.trn create mode 100644 isis/appdata/translations/pds4ExportArray3DSpectrum.trn create mode 100644 isis/appdata/translations/pds4ExportArray3DSpectrumBinSet.trn create mode 100644 isis/appdata/translations/pds4ExportArray3DSpectrumUniform.trn create mode 100644 isis/appdata/translations/pds4ExportBandBin.trn create mode 100644 isis/appdata/translations/pds4ExportBandBinImage.trn create mode 100644 isis/appdata/translations/pds4ExportBandBinSpectrum.trn create mode 100644 isis/appdata/translations/pds4ExportBandBinSpectrumBinSet.trn create mode 100644 isis/appdata/translations/pds4ExportBandBinSpectrumUniform.trn create mode 100644 isis/appdata/translations/pds4ExportDisplaySettings.trn create mode 100644 isis/appdata/translations/pds4ExportEquirectangular.trn create mode 100644 isis/appdata/translations/pds4ExportFileArea.trn create mode 100644 isis/appdata/translations/pds4ExportIdentificationArea.trn create mode 100644 isis/appdata/translations/pds4ExportInstrument.trn create mode 100644 isis/appdata/translations/pds4ExportLambertConformal.trn create mode 100644 isis/appdata/translations/pds4ExportObliqueMercator.trn create mode 100644 isis/appdata/translations/pds4ExportOrthographic.trn create mode 100644 isis/appdata/translations/pds4ExportPolarStereographic.trn create mode 100644 isis/appdata/translations/pds4ExportPolyconic.trn create mode 100644 isis/appdata/translations/pds4ExportSimpleCylindrical.trn create mode 100644 isis/appdata/translations/pds4ExportSinusoidal.trn create mode 100644 isis/appdata/translations/pds4ExportTargetFromInstrument.trn create mode 100644 isis/appdata/translations/pds4ExportTargetFromMapping.trn create mode 100644 isis/appdata/translations/pds4ExportTransverseMercator.trn create mode 100644 isis/appdata/translations/pds4ExportUnits.pvl create mode 100644 isis/appdata/translations/pdsCombinedSpectrum.trn create mode 100644 isis/appdata/translations/pdsExportAllMapping.trn create mode 100644 isis/appdata/translations/pdsExportAllMapping.typ create mode 100644 isis/appdata/translations/pdsExportEquirectangular.trn create mode 100644 isis/appdata/translations/pdsExportImageImage.trn create mode 100644 isis/appdata/translations/pdsExportImageImage.typ create mode 100644 isis/appdata/translations/pdsExportImageImagePixel16.typ create mode 100644 isis/appdata/translations/pdsExportImageImagePixel32.typ create mode 100644 isis/appdata/translations/pdsExportImageImagePixel8.typ create mode 100644 isis/appdata/translations/pdsExportImageJP2.trn create mode 100644 isis/appdata/translations/pdsExportImageJP2.typ create mode 100644 isis/appdata/translations/pdsExportLambertAzimuthalEqualArea.trn create mode 100644 isis/appdata/translations/pdsExportLambertConformal.trn create mode 100644 isis/appdata/translations/pdsExportMercator.trn create mode 100644 isis/appdata/translations/pdsExportObliqueCylindrical.trn create mode 100644 isis/appdata/translations/pdsExportOrthographic.trn create mode 100644 isis/appdata/translations/pdsExportPointPerspective.trn create mode 100644 isis/appdata/translations/pdsExportPolarStereographic.trn create mode 100644 isis/appdata/translations/pdsExportRobinson.trn create mode 100644 isis/appdata/translations/pdsExportRootGen.typ create mode 100644 isis/appdata/translations/pdsExportSimpleCylindrical.trn create mode 100644 isis/appdata/translations/pdsExportSinusoidal.trn create mode 100644 isis/appdata/translations/pdsExportTarget.trn create mode 100644 isis/appdata/translations/pdsExportTransverseMercator.trn create mode 100644 isis/appdata/translations/pdsImage.trn create mode 100644 isis/appdata/translations/pdsImageArchive.trn create mode 100644 isis/appdata/translations/pdsImageBandBin.trn create mode 100644 isis/appdata/translations/pdsImageProjection.trn create mode 100644 isis/appdata/translations/pdsImportEquirectangular.trn create mode 100644 isis/appdata/translations/pdsImportLambertAzimuthalEqualArea.trn create mode 100644 isis/appdata/translations/pdsImportLambertConformal.trn create mode 100644 isis/appdata/translations/pdsImportMercator.trn create mode 100644 isis/appdata/translations/pdsImportObliqueCylindrical.trn create mode 100644 isis/appdata/translations/pdsImportOrthographic.trn create mode 100644 isis/appdata/translations/pdsImportPointPerspective.trn create mode 100644 isis/appdata/translations/pdsImportPolarStereographic.trn create mode 100644 isis/appdata/translations/pdsImportRobinson.trn create mode 100644 isis/appdata/translations/pdsImportSimpleCylindrical.trn create mode 100644 isis/appdata/translations/pdsImportSinusoidal.trn create mode 100644 isis/appdata/translations/pdsImportTransverseMercator.trn create mode 100644 isis/appdata/translations/pdsL0.trn create mode 100644 isis/appdata/translations/pdsLabelExport.trn create mode 100644 isis/appdata/translations/pdsLoc.trn create mode 100644 isis/appdata/translations/pdsObs.trn create mode 100644 isis/appdata/translations/pdsProjectionLineSampToXY.def create mode 100644 isis/appdata/translations/pdsQube.trn create mode 100644 isis/appdata/translations/pdsQubeProjection.trn create mode 100644 isis/appdata/translations/pdsRdn.trn create mode 100644 isis/appdata/translations/pdsSpectralQube.trn create mode 100644 isis/appdata/translations/pdsSpectralQubeProjection.trn create mode 100644 isis/appdata/translations/voyager.trn create mode 100644 isis/appdata/translations/voyager_na_bandbin.trn create mode 100644 isis/appdata/translations/voyager_wa_bandbin.trn create mode 100644 isis/appdata/translations/xmlExample.trn create mode 100644 isis/appdata/translations/xmlImage.trn delete mode 100644 isis/cmake/FindBoost.cmake delete mode 100644 isis/cmake/FindBullet.cmake delete mode 100644 isis/cmake/FindGSL.cmake delete mode 100644 isis/cmake/FindHDF5.cmake create mode 100644 isis/cmake/FindJson.cmake delete mode 100644 isis/cmake/FindPNG.cmake delete mode 100644 isis/cmake/FindProtobuf.cmake delete mode 100644 isis/cmake/FindTIFF.cmake delete mode 100644 isis/cmake/FindXercesC.cmake create mode 100644 isis/cmake/Findale.cmake create mode 100644 isis/cmake/version.in create mode 100644 isis/make/config.darwin-MacOSX10_14 create mode 100644 isis/make/config.darwin-MacOSX10_15 delete mode 100644 isis/scripts/fetchRequiredData.py create mode 100644 isis/scripts/tabCompletion.csh create mode 100644 isis/src/apollo/apps/apollopaninit/ApolloPanInit.trn create mode 100644 isis/src/apollo/templates/PanFiducialFinder.def create mode 100644 isis/src/base/apps/cam2map/cam2map.cpp create mode 100644 isis/src/base/apps/campt/campt.cpp create mode 100644 isis/src/base/apps/campt/campt.h delete mode 100644 isis/src/base/apps/campt/tsts/default/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/errors/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/flat/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/no_sample_line/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/pointlist_append/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/pointlist_error/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/pointlist_flat/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/pointlist_ground/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/pointlist_no_append/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/setSL/Makefile delete mode 100644 isis/src/base/apps/campt/tsts/set_sample_or_line/Makefile create mode 100644 isis/src/base/apps/camstats/camstats.cpp create mode 100644 isis/src/base/apps/camstats/camstats.h delete mode 100644 isis/src/base/apps/camstats/tsts/default/Makefile create mode 100644 isis/src/base/apps/ddd2isis/tsts/badBandBit/Makefile create mode 100644 isis/src/base/apps/enlarge/enlarge_app.cpp create mode 100644 isis/src/base/apps/enlarge/enlarge_app.h delete mode 100644 isis/src/base/apps/enlarge/tsts/default/Makefile delete mode 100644 isis/src/base/apps/enlarge/tsts/total/Makefile create mode 100644 isis/src/base/apps/findimageoverlaps/findimageoverlaps.cpp create mode 100644 isis/src/base/apps/findimageoverlaps/findimageoverlaps.h delete mode 100644 isis/src/base/apps/findimageoverlaps/tsts/nooverlap/Makefile create mode 100644 isis/src/base/apps/footprintinit/footprintinit.cpp create mode 100644 isis/src/base/apps/footprintinit/footprintinit.h create mode 100644 isis/src/base/apps/getsn/getsn.cpp create mode 100644 isis/src/base/apps/getsn/getsn.h delete mode 100644 isis/src/base/apps/getsn/tsts/ConsoleOutput/Makefile delete mode 100644 isis/src/base/apps/getsn/tsts/default/Makefile delete mode 100644 isis/src/base/apps/getsn/tsts/flat/Makefile create mode 100644 isis/src/base/apps/isis2ascii/isis2ascii.cpp create mode 100644 isis/src/base/apps/isis2ascii/isis2ascii.h delete mode 100644 isis/src/base/apps/isis2ascii/tsts/case01/Makefile delete mode 100644 isis/src/base/apps/isis2ascii/tsts/caselarge/Makefile delete mode 100644 isis/src/base/apps/isis2ascii/tsts/casesmall/Makefile delete mode 100644 isis/src/base/apps/isis2ascii/tsts/caseuser/Makefile create mode 100644 isis/src/base/apps/map2cam/map2cam.cpp create mode 100644 isis/src/base/apps/mappt/mappt.cpp create mode 100644 isis/src/base/apps/mappt/mappt.h delete mode 100644 isis/src/base/apps/mappt/tsts/Makefile delete mode 100644 isis/src/base/apps/mappt/tsts/allowoutside/Makefile delete mode 100644 isis/src/base/apps/mappt/tsts/coordsys/Makefile delete mode 100644 isis/src/base/apps/mappt/tsts/flatOutput/Makefile delete mode 100644 isis/src/base/apps/mappt/tsts/ground/Makefile delete mode 100644 isis/src/base/apps/mappt/tsts/image/Makefile delete mode 100644 isis/src/base/apps/mappt/tsts/projection/Makefile create mode 100644 isis/src/base/apps/phocube/tsts/ignore_special_pixels/Makefile create mode 100644 isis/src/base/apps/phocube/tsts/off_body/Makefile create mode 100644 isis/src/base/apps/photomet/tsts/testDemWarning/Makefile create mode 100644 isis/src/base/apps/spiceinit/spiceinit.cpp create mode 100644 isis/src/base/apps/spiceinit/spiceinit.h create mode 100644 isis/src/base/apps/spiceserver/spiceserver.cpp create mode 100644 isis/src/base/apps/spiceserver/spiceserver.h delete mode 100644 isis/src/base/apps/spiceserver/tsts/Makefile delete mode 100644 isis/src/base/apps/spiceserver/tsts/cubetest/Makefile delete mode 100644 isis/src/base/apps/spiceserver/tsts/simplerequest/Makefile delete mode 100644 isis/src/base/objs/BasisFunction/BasisFunction.truth delete mode 100644 isis/src/base/objs/BasisFunction/unitTest.cpp delete mode 100644 isis/src/base/objs/BulletDskShape/BulletDskShape.truth delete mode 100644 isis/src/base/objs/BulletDskShape/unitTest.cpp delete mode 100644 isis/src/base/objs/Column/Column.truth delete mode 100644 isis/src/base/objs/Column/unitTest.cpp delete mode 100644 isis/src/base/objs/Displacement/Displacement.truth delete mode 100644 isis/src/base/objs/Displacement/unitTest.cpp delete mode 100644 isis/src/base/objs/FileList/FileList.truth delete mode 100644 isis/src/base/objs/FileList/unitTest.cpp delete mode 100644 isis/src/base/objs/FileList/unitTest.list delete mode 100644 isis/src/base/objs/GaussianDistribution/GaussianDistribution.truth delete mode 100644 isis/src/base/objs/GaussianDistribution/unitTest.cpp delete mode 100644 isis/src/base/objs/LineEquation/LineEquation.truth delete mode 100644 isis/src/base/objs/LineEquation/unitTest.cpp create mode 100644 isis/src/base/objs/Longitude/LongitudeTests.cpp create mode 100644 isis/src/base/objs/NthOrderPolynomial/NthOrderPolynomial.cpp create mode 100644 isis/src/base/objs/NthOrderPolynomial/NthOrderPolynomial.h create mode 100644 isis/src/base/objs/NthOrderPolynomial/NthOrderPolynomial.truth create mode 100644 isis/src/base/objs/NthOrderPolynomial/unitTest.cpp delete mode 100644 isis/src/base/objs/PixelType/PixelType.truth delete mode 100644 isis/src/base/objs/PixelType/unitTest.cpp delete mode 100644 isis/src/base/objs/Preference/TestPreferences delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Darwin_x86_64_MacOSX10_11.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Darwin_x86_64_MacOSX10_13.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Darwin_x86_64_MacOSX10_8.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_CentOS7.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_Debian8.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_Fedora21.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_Fedora25.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_Fedora28.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_ScientificLinux.truth delete mode 100644 isis/src/base/objs/ProgramLauncher/ProgramLauncher_Linux_x86_64_Ubuntu14_04.truth delete mode 100644 isis/src/base/objs/PvlObject/PvlObject.truth delete mode 100644 isis/src/base/objs/PvlObject/unitTest.cpp create mode 100644 isis/src/base/objs/RollingShutterCamera/RollingShutterCamera.cpp create mode 100644 isis/src/base/objs/RollingShutterCamera/RollingShutterCamera.h create mode 100644 isis/src/base/objs/RollingShutterCamera/RollingShutterCamera.truth create mode 100644 isis/src/base/objs/RollingShutterCamera/unitTest.cpp create mode 100644 isis/src/base/objs/RollingShutterCameraDetectorMap/RollingShutterCameraDetectorMap.cpp create mode 100644 isis/src/base/objs/RollingShutterCameraDetectorMap/RollingShutterCameraDetectorMap.h create mode 100644 isis/src/base/objs/SpiceRotation/SpiceRotation_Darwin_x86_64_MacOSX10_15.truth create mode 100644 isis/src/cassini/apps/ciss2isis/CassiniIss.trn create mode 100644 isis/src/cassini/apps/ciss2isis/CassiniIssNarrowAngle.def create mode 100644 isis/src/cassini/apps/ciss2isis/CassiniIssWideAngle.def create mode 100644 isis/src/cassini/apps/cisscal/tsts/badCisscalImage/Makefile create mode 100644 isis/src/cassini/apps/vims2isis/CassiniVimsPds.trn create mode 100644 isis/src/chandrayaan1/apps/chan1m32isis/Chandrayaan1M3Archive.trn create mode 100644 isis/src/chandrayaan1/apps/chan1m32isis/Chandrayaan1M3Instrument.trn delete mode 100644 isis/src/chandrayaan1/apps/chan1m32isis/labels.pvl create mode 100644 isis/src/clementine/apps/clem2isis/Clementine.trn create mode 100644 isis/src/clipper/apps/eis2isis/eis2isis.xml create mode 100644 isis/src/clipper/apps/eis2isis/main.cpp create mode 100644 isis/src/clipper/apps/eis2isis/tsts/nacRs/Makefile create mode 100644 isis/src/clipper/apps/eis2isis/tsts/wacFc/Makefile create mode 100644 isis/src/clipper/apps/jitterfit/jitterfit.xml create mode 100644 isis/src/clipper/apps/jitterfit/main.cpp create mode 100644 isis/src/clipper/apps/jitterfit/tsts/default/Makefile create mode 100644 isis/src/clipper/objs/ClipperNacRollingShutterCamera/Camera.plugin create mode 100644 isis/src/clipper/objs/ClipperNacRollingShutterCamera/ClipperNacRollingShutterCamera.cpp create mode 100644 isis/src/clipper/objs/ClipperNacRollingShutterCamera/ClipperNacRollingShutterCamera.h create mode 100644 isis/src/clipper/objs/ClipperNacRollingShutterCamera/ClipperNacRollingShutterCamera.truth create mode 100644 isis/src/clipper/objs/ClipperNacRollingShutterCamera/unitTest.cpp create mode 100644 isis/src/clipper/objs/ClipperWacFcCamera/Camera.plugin create mode 100644 isis/src/clipper/objs/ClipperWacFcCamera/ClipperWacFcCamera.cpp create mode 100644 isis/src/clipper/objs/ClipperWacFcCamera/ClipperWacFcCamera.h create mode 100644 isis/src/clipper/objs/ClipperWacFcCamera/ClipperWacFcCamera.truth create mode 100644 isis/src/clipper/objs/ClipperWacFcCamera/unitTest.cpp create mode 100644 isis/src/control/apps/autoseed/autoseed.cpp create mode 100644 isis/src/control/apps/autoseed/autoseed.h delete mode 100644 isis/src/control/apps/autoseed/tsts/overlap/Makefile delete mode 100644 isis/src/control/apps/autoseed/tsts/seeddef/Makefile create mode 100644 isis/src/control/apps/cnetbin2pvl/cnetbin2pvl.cpp create mode 100644 isis/src/control/apps/cnetbin2pvl/cnetbin2pvl.h delete mode 100644 isis/src/control/apps/cnetbin2pvl/tsts/Makefile delete mode 100644 isis/src/control/apps/cnetbin2pvl/tsts/default/Makefile create mode 100644 isis/src/control/apps/cnetcheck/cnetcheck.cpp create mode 100644 isis/src/control/apps/cnetcheck/cnetcheck.h delete mode 100644 isis/src/control/apps/cnetcheck/tsts/Makefile delete mode 100644 isis/src/control/apps/cnetcheck/tsts/camera/Makefile delete mode 100644 isis/src/control/apps/cnetcheck/tsts/ignore/Makefile delete mode 100644 isis/src/control/apps/cnetcheck/tsts/nopoints/Makefile create mode 100644 isis/src/control/apps/cnetcombinept/cnetcombinept.cpp create mode 100644 isis/src/control/apps/cnetcombinept/cnetcombinept.h delete mode 100644 isis/src/control/apps/cnetcombinept/tsts/duplicates/Makefile delete mode 100644 isis/src/control/apps/cnetcombinept/tsts/messenger/Makefile delete mode 100644 isis/src/control/apps/cnetcombinept/tsts/noclean/Makefile delete mode 100644 isis/src/control/apps/cnetcombinept/tsts/setapriori/Makefile create mode 100644 isis/src/control/apps/cnetpvl2bin/cnetpvl2bin.cpp create mode 100644 isis/src/control/apps/cnetpvl2bin/cnetpvl2bin.h delete mode 100644 isis/src/control/apps/cnetpvl2bin/tsts/Makefile delete mode 100644 isis/src/control/apps/cnetpvl2bin/tsts/default/Makefile create mode 100644 isis/src/control/apps/cnetstats/cnetstats.cpp create mode 100644 isis/src/control/apps/cnetstats/cnetstats.h delete mode 100644 isis/src/control/apps/cnetstats/tsts/Makefile delete mode 100644 isis/src/control/apps/cnetstats/tsts/badWriteLocation/Makefile delete mode 100644 isis/src/control/apps/cnetstats/tsts/cubeFilter/Makefile delete mode 100644 isis/src/control/apps/cnetstats/tsts/gFit/Makefile delete mode 100644 isis/src/control/apps/cnetstats/tsts/imagestats/Makefile delete mode 100644 isis/src/control/apps/cnetstats/tsts/pointFilter/Makefile delete mode 100644 isis/src/control/apps/cnetstats/tsts/pointstats/Makefile create mode 100644 isis/src/control/apps/cnetwinnow/cnetwinnow.cpp create mode 100644 isis/src/control/apps/cnetwinnow/cnetwinnow.h delete mode 100644 isis/src/control/apps/cnetwinnow/tsts/case01/Makefile delete mode 100644 isis/src/control/apps/findfeatures/tsts/filters/Makefile create mode 100644 isis/src/control/apps/jigsaw/tsts/scconfig/Makefile create mode 100644 isis/src/control/apps/jigsaw/tsts/scconfigHeld/Makefile create mode 100644 isis/src/dawn/apps/dawnfc2isis/DawnFcArchive.trn create mode 100644 isis/src/dawn/apps/dawnfc2isis/DawnFcBandBin.trn create mode 100644 isis/src/dawn/apps/dawnfc2isis/DawnFcInstrument.trn create mode 100644 isis/src/dawn/apps/dawnvir2isis/DawnVirArchive.trn create mode 100644 isis/src/dawn/apps/dawnvir2isis/DawnVirBandBin.trn create mode 100644 isis/src/dawn/apps/dawnvir2isis/DawnVirInstrument.trn create mode 100644 isis/src/galileo/apps/gllnims2isis/GalileoNIMSArchive.trn create mode 100644 isis/src/galileo/apps/gllnims2isis/GalileoNIMSCoreBandBin.trn create mode 100644 isis/src/galileo/apps/gllnims2isis/GalileoNIMSInstrument.trn create mode 100644 isis/src/galileo/apps/gllnims2isis/GalileoNIMSSuffixBandBin.trn create mode 100644 isis/src/galileo/apps/gllssi2isis/GalileoSsi.trn create mode 100644 isis/src/hayabusa/apps/amica2isis/HayabusaAmicaArchive.trn create mode 100644 isis/src/hayabusa/apps/amica2isis/HayabusaAmicaBandBin.trn create mode 100644 isis/src/hayabusa/apps/amica2isis/HayabusaAmicaInstrument.trn create mode 100644 isis/src/hayabusa/apps/amica2isis/HayabusaAmicaKernels.trn create mode 100644 isis/src/hayabusa/apps/hyb1pds4gen/HayabusaAmicaPds4Export.trn create mode 100644 isis/src/hayabusa/apps/hyb1pds4gen/HayabusaNirsPds4Export.trn create mode 100644 isis/src/hayabusa/apps/nirs2isis/HayabusaNirsArchive.trn create mode 100644 isis/src/hayabusa/apps/nirs2isis/HayabusaNirsBandBin.trn create mode 100644 isis/src/hayabusa/apps/nirs2isis/HayabusaNirsInstrument.trn create mode 100644 isis/src/hayabusa/apps/nirs2isis/HayabusaNirsKernels.trn create mode 100644 isis/src/hayabusa2/apps/hyb2onc2isis/Hayabusa2OncArchive.trn create mode 100644 isis/src/hayabusa2/apps/hyb2onc2isis/Hayabusa2OncBandBin.trn create mode 100644 isis/src/hayabusa2/apps/hyb2onc2isis/Hayabusa2OncInstrument.trn create mode 100644 isis/src/hayabusa2/apps/hyb2onc2isis/Hayabusa2OncKernels.trn create mode 100644 isis/src/hayabusa2/apps/hyb2onc2isis/tsts/newFits/Makefile rename isis/src/{base/apps/getsn => hayabusa2}/tsts/Makefile (54%) create mode 100644 isis/src/hayabusa2/tsts/OncCamera/Makefile create mode 100644 isis/src/juno/apps/junocam2isis/JunoJunoCamArchive.trn create mode 100644 isis/src/juno/apps/junocam2isis/JunoJunoCamBandBin.trn create mode 100644 isis/src/juno/apps/junocam2isis/JunoJunoCamInstrument.trn create mode 100644 isis/src/kaguya/apps/kaguyami2isis/KaguyaMiArchive.trn create mode 100644 isis/src/kaguya/apps/kaguyami2isis/KaguyaMiBandBin.trn create mode 100644 isis/src/kaguya/apps/kaguyami2isis/KaguyaMiInstrument.trn create mode 100644 isis/src/kaguya/apps/kaguyami2isis/tsts/level2b2/Makefile create mode 100644 isis/src/kaguya/apps/kaguyatc2isis/KaguyaTcArchive.trn create mode 100644 isis/src/kaguya/apps/kaguyatc2isis/KaguyaTcBandBin.trn create mode 100644 isis/src/kaguya/apps/kaguyatc2isis/KaguyaTcInstrument.trn create mode 100644 isis/src/kaguya/apps/kaguyatc2isis/KaguyaTcKernels.trn create mode 100644 isis/src/kaguya/apps/kaguyatc2isis/kaguyatc2isis.cpp create mode 100644 isis/src/kaguya/apps/kaguyatc2isis/kaguyatc2isis.h create mode 100644 isis/src/kaguya/apps/mimap2isis/KaguyaMiMapArchive.trn create mode 100644 isis/src/kaguya/apps/mimap2isis/KaguyaMiMapBandBin.trn create mode 100644 isis/src/kaguya/apps/mimap2isis/KaguyaMiMapInstrument.trn create mode 100644 isis/src/kaguya/apps/mimap2isis/KaguyaMil3cArchive.trn create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/Camera.plugin create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/KaguyaTcCamera.cpp create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/KaguyaTcCamera.h create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/KaguyaTcCamera.truth create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/KaguyaTcCameraDistortionMap.cpp create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/KaguyaTcCameraDistortionMap.h create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/Makefile create mode 100644 isis/src/kaguya/objs/KaguyaTcCamera/unitTest.cpp create mode 100644 isis/src/lo/apps/lo2isis/LoGeneralImport.trn create mode 100644 isis/src/lo/apps/lo2isis/LoIsis2BoresightImport.trn create mode 100644 isis/src/lo/apps/lo2isis/LoIsis2FiducialImport.trn create mode 100644 isis/src/lo/apps/lo2isis/LoPdsBoresightImport.trn create mode 100644 isis/src/lo/apps/lo2isis/LoPdsFiducialImport.trn create mode 100644 isis/src/lo/apps/lopdsgen/LoBoresightExport.trn create mode 100644 isis/src/lo/apps/lopdsgen/LoExportFormatter.typ create mode 100644 isis/src/lo/apps/lopdsgen/LoExportTemplate.pft create mode 100644 isis/src/lo/apps/lopdsgen/LoFiducialExport.trn create mode 100644 isis/src/lo/apps/lopdsgen/LoLevel1Export.trn create mode 100644 isis/src/lo/apps/lopdsgen/LoOriginalExport.trn create mode 100644 isis/src/lo/apps/lopdsgen/LoReimportExport.trn create mode 100644 isis/src/lo/apps/lopdsgen/LoStripExport.trn create mode 100644 isis/src/lro/apps/lronac2isis/LroNacArchive.trn create mode 100644 isis/src/lro/apps/lronac2isis/LroNacBandBin.trn create mode 100644 isis/src/lro/apps/lronac2isis/LroNacInstrument.trn create mode 100644 isis/src/lro/apps/lronac2pds/LroNacPdsExportRootGen.typ create mode 100644 isis/src/lro/apps/lronac2pds/LroNacPdsLabelExport.trn create mode 100644 isis/src/lro/apps/lrowac2isis/LroWacArchive.trn create mode 100644 isis/src/lro/apps/lrowac2isis/LroWacInstrument.trn create mode 100644 isis/src/lro/apps/lrowac2pds/LroNacPdsExportRootGen.typ create mode 100644 isis/src/lro/apps/lrowac2pds/LroWacPdsLabelExport.trn create mode 100644 isis/src/lro/apps/mrf2isis/MrfLev1Archive.trn create mode 100644 isis/src/lro/apps/mrf2isis/MrfLev1BandBin.trn create mode 100644 isis/src/lro/apps/mrf2isis/MrfLev1Image.trn create mode 100644 isis/src/lro/apps/mrf2isis/MrfLev1Instrument.trn create mode 100644 isis/src/lro/apps/mrf2isis/MrfLev2Archive.trn create mode 100644 isis/src/lro/apps/mrf2isis/MrfLev2BandBin.trn create mode 100644 isis/src/lro/apps/mrf2pds/AllMrfExportOrigLabel.trn create mode 100644 isis/src/lro/apps/mrf2pds/Chandrayaan1MrfExportOrigLabel.trn create mode 100644 isis/src/lro/apps/mrf2pds/LroMrfExportOrigLabel.trn create mode 100644 isis/src/lro/apps/mrf2pds/MrfExportAllMapping.typ create mode 100644 isis/src/lro/apps/mrf2pds/MrfExportRoot.typ create mode 100644 isis/src/lro/apps/mrf2pds/MrfPdsLevel2.pft create mode 100644 isis/src/lro/apps/mrf2pds/MrfPdsLevel3.pft create mode 100644 isis/src/mariner/apps/mar102isis/Mariner10isis2.trn create mode 100644 isis/src/mer/apps/mer2isis/MerImageRequest.trn create mode 100644 isis/src/mer/apps/mer2isis/MerInstrument.trn create mode 100644 isis/src/mer/apps/mer2isis/MerStructure.trn create mode 100644 isis/src/mer/apps/mer2isis/MerSubframe.trn create mode 100644 isis/src/messenger/apps/mdis2isis/MessengerMdisArchive.trn create mode 100644 isis/src/messenger/apps/mdis2isis/MessengerMdisBandBin.trn create mode 100644 isis/src/messenger/apps/mdis2isis/MessengerMdisInstrument.trn create mode 100644 isis/src/messenger/apps/mdis2pds/MessengerMdisCdrLabel.trn create mode 100644 isis/src/messenger/apps/mdis2pds/mdisPdsCdr.def create mode 100644 isis/src/messenger/apps/mdisddr/MessengerMdisDdrLabel.trn create mode 100644 isis/src/messenger/apps/mdisddr/mdisPdsDdr.def create mode 100644 isis/src/mex/apps/hrsc2isis/MexHrscArchive.trn create mode 100644 isis/src/mex/apps/hrsc2isis/MexHrscBandBin.trn create mode 100644 isis/src/mex/apps/hrsc2isis/MexHrscInstrument.trn create mode 100644 isis/src/mex/apps/hrsc2isis/MexHrscKernels.trn create mode 100644 isis/src/mex/objs/MexHrscSrcCamera/Camera.plugin create mode 100644 isis/src/mex/objs/MexHrscSrcCamera/MexHrscSrcCamera.cpp create mode 100644 isis/src/mex/objs/MexHrscSrcCamera/MexHrscSrcCamera.h create mode 100644 isis/src/mex/objs/MexHrscSrcCamera/MexHrscSrcCamera.truth create mode 100644 isis/src/mex/objs/MexHrscSrcCamera/unitTest.cpp rename isis/src/{base/apps/campt => mex}/tsts/Makefile (79%) create mode 100644 isis/src/mex/tsts/hrsc/Makefile create mode 100644 isis/src/mgs/apps/moc2isis/MgsMocArchive.trn create mode 100644 isis/src/mgs/apps/moc2isis/MgsMocBandBin.trn create mode 100644 isis/src/mgs/apps/moc2isis/MgsMocInstrument.trn create mode 100644 isis/src/mro/apps/crism2isis/MroCrismArchive.trn create mode 100644 isis/src/mro/apps/crism2isis/MroCrismInstrument.trn create mode 100644 isis/src/mro/apps/hi2isis/MroHiriseArchive.trn create mode 100644 isis/src/mro/apps/hi2isis/MroHiriseBandBin.trn create mode 100644 isis/src/mro/apps/hi2isis/MroHiriseInstrument.trn rename isis/src/mro/apps/hideal2pds/{hiriseIdealPdsExportCubeLabel.trn => MroHiriseIdealPdsExportCubeLabel.trn} (100%) rename isis/src/mro/apps/{pds2hideal/hiriseIdealPdsImportOriginalLabel.trn => hideal2pds/MroHirisePdsRdrOriginalLabel.trn} (91%) create mode 100644 isis/src/mro/apps/hideal2pds/tsts/differentBitCompressions/Makefile create mode 100644 isis/src/mro/apps/hidtmgen/MroHiriseIdealPds.pft create mode 100644 isis/src/mro/apps/hidtmgen/MroHiriseIdealPds.typ create mode 100644 isis/src/mro/apps/hidtmgen/MroHirisePdsDTMEqui.pft create mode 100644 isis/src/mro/apps/hidtmgen/MroHirisePdsDTMPolar.pft create mode 100644 isis/src/mro/apps/hirdr2isis/MroHiriseRdrBandBin.trn create mode 100644 isis/src/mro/apps/hirdr2isis/MroHiriseRdrMosaic.trn create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrCubeLabel.trn create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrEqui.pft create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrEquiJP2.pft create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrExtras.typ create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrOriginalLabel.trn create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrPolar.pft create mode 100644 isis/src/mro/apps/hirdrgen/MroHirisePdsRdrPolarJP2.pft create mode 100644 isis/src/mro/apps/marci2isis/tsts/varexp/Makefile create mode 100644 isis/src/mro/apps/marcical/tsts/single_duration/Makefile create mode 100644 isis/src/mro/apps/mroctx2isis/MroCtxArchive.trn create mode 100644 isis/src/mro/apps/mroctx2isis/MroCtxInstrument.trn rename isis/src/mro/apps/pds2hideal/{hiriseIdealPdsImportLabel.trn => MroHiriseIdealPdsImportLabel.trn} (93%) create mode 100644 isis/src/mro/apps/pds2hideal/tsts/compressedImage/Makefile create mode 100644 isis/src/near/apps/msi2isis/NearMsiImportPdsLabel.trn create mode 100644 isis/src/newhorizons/apps/leisa2isis/NewHorizonsLeisaArchive_fit.trn create mode 100644 isis/src/newhorizons/apps/leisa2isis/NewHorizonsLeisaBandBin_fit.trn create mode 100644 isis/src/newhorizons/apps/leisa2isis/NewHorizonsLeisaInstrument_fit.trn create mode 100644 isis/src/newhorizons/apps/leisa2isis/NewHorizonsLeisaKernels_fit.trn create mode 100644 isis/src/newhorizons/apps/leisa2isis/leisa2isis.cpp create mode 100644 isis/src/newhorizons/apps/leisa2isis/leisa2isis.h create mode 100644 isis/src/newhorizons/apps/lorri2isis/NewHorizonsLorriArchive_fit.trn create mode 100644 isis/src/newhorizons/apps/lorri2isis/NewHorizonsLorriBandBin_fit.trn create mode 100644 isis/src/newhorizons/apps/lorri2isis/NewHorizonsLorriInstrument_fit.trn create mode 100644 isis/src/newhorizons/apps/lorri2isis/NewHorizonsLorriKernels_fit.trn create mode 100644 isis/src/newhorizons/apps/mvic2isis/NewHorizonsMvicArchive_fit.trn create mode 100644 isis/src/newhorizons/apps/mvic2isis/NewHorizonsMvicBandBin_fit.trn create mode 100644 isis/src/newhorizons/apps/mvic2isis/NewHorizonsMvicCalibration_fit.trn create mode 100644 isis/src/newhorizons/apps/mvic2isis/NewHorizonsMvicInstrument_fit.trn create mode 100644 isis/src/newhorizons/apps/mvic2isis/NewHorizonsMvicKernels_fit.trn rename isis/src/{base/apps/enlarge => odyssey}/tsts/Makefile (79%) create mode 100644 isis/src/odyssey/tsts/themis/Makefile create mode 100644 isis/src/osirisrex/apps/ocams2isis/OsirisRexOcamsBandBin_fit.trn create mode 100644 isis/src/osirisrex/apps/ocams2isis/OsirisRexOcamsInstrument_fit.trn create mode 100644 isis/src/osirisrex/apps/ocams2isis/OsirisRexOcamsKernels_fit.trn create mode 100644 isis/src/rolo/apps/rolo2isis/RoloArchive.trn create mode 100644 isis/src/rolo/apps/rolo2isis/RoloBandBin.trn create mode 100644 isis/src/rolo/apps/rolo2isis/RoloInstrument.trn create mode 100644 isis/src/rolo/apps/rolo2isis/RoloMapping.trn create mode 100644 isis/src/rosetta/apps/rososiris2isis/RosettaOsirisArchive.trn create mode 100644 isis/src/rosetta/apps/rososiris2isis/RosettaOsirisBandBin.trn create mode 100644 isis/src/rosetta/apps/rososiris2isis/RosettaOsirisFilters.trn create mode 100644 isis/src/rosetta/apps/rososiris2isis/RosettaOsirisInstrument.trn create mode 100644 isis/src/rosetta/apps/rosvirtis2isis/RosettaVirtisArchive.trn create mode 100644 isis/src/rosetta/apps/rosvirtis2isis/RosettaVirtisInstruments.trn create mode 100644 isis/src/rosetta/apps/rosvirtis2isis/RosettaVirtisMHousekeeping.def delete mode 100644 isis/src/system/objs/Kernel/Kernel.truth delete mode 100644 isis/src/system/objs/Kernel/unitTest.cpp delete mode 100644 isis/src/system/objs/KernelDb/KernelDb.truth delete mode 100644 isis/src/system/objs/KernelDb/test.db delete mode 100644 isis/src/system/objs/KernelDb/unitTest.cpp create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassis.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisArchive.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisBandBin.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisExportedInstrument.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisInstrument.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisMapping.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisMosaic.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisMosaicBandBin.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisOperationPeriod.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisRdr.trn create mode 100644 isis/src/tgo/apps/tgocassis2isis/TgoCassisSubWindow.trn create mode 100644 isis/src/tgo/apps/tgocassisrdrgen/TgoCassisExport.trn create mode 100644 isis/src/tgo/apps/tgocassisrdrgen/TgoCassisExportMosaic.trn create mode 100644 isis/src/voyager/apps/voy2isis/tsts/instrumentname/Makefile create mode 100644 isis/src/voyager/apps/voy2isis/voyager.trn create mode 100644 isis/src/voyager/apps/voy2isis/voyager_na_bandbin.trn create mode 100644 isis/src/voyager/apps/voy2isis/voyager_wa_bandbin.trn create mode 100644 isis/templates/README.md create mode 100644 isis/templates/default.cpp create mode 100644 isis/tests/AffineTests.cpp create mode 100644 isis/tests/Area3DTests.cpp create mode 100644 isis/tests/AutoseedTests.cpp create mode 100644 isis/tests/BasisFunctionTests.cpp create mode 100644 isis/tests/BulletDskShapeTests.cpp create mode 100644 isis/tests/BundleMeasureTests.cpp create mode 100644 isis/tests/BundleObservationSolveSettingsTests.cpp create mode 100644 isis/tests/Cam2mapTests.cpp create mode 100644 isis/tests/CamptFunctionalTests.cpp create mode 100644 isis/tests/CnetWinnowTests.cpp create mode 100644 isis/tests/ColumnTests.cpp create mode 100644 isis/tests/CubeTests.cpp create mode 100644 isis/tests/DisplacementTests.cpp create mode 100644 isis/tests/FileListTests.cpp create mode 100644 isis/tests/Fixtures.cpp create mode 100644 isis/tests/Fixtures.h create mode 100644 isis/tests/FootprintinitTests.cpp create mode 100644 isis/tests/FunctionalTestCnetstats.cpp create mode 100644 isis/tests/FunctionalTestsCamstats.cpp create mode 100644 isis/tests/FunctionalTestsCnetCombinePt.cpp create mode 100644 isis/tests/FunctionalTestsCnetbin2pvl.cpp create mode 100644 isis/tests/FunctionalTestsCnetpvl2bin.cpp create mode 100644 isis/tests/FunctionalTestsEnlarge.cpp create mode 100644 isis/tests/FunctionalTestsGetsn.cpp create mode 100644 isis/tests/FunctionalTestsIsis2ascii.cpp create mode 100644 isis/tests/FunctionalTestsKaguyatc2isis.cpp create mode 100644 isis/tests/FunctionalTestsLeisa2isis.cpp create mode 100644 isis/tests/FunctionalTestsMappt.cpp create mode 100644 isis/tests/FunctionalTestsSpiceserver.cpp create mode 100644 isis/tests/FuntionalTestsFindImageOverlaps.cpp create mode 100644 isis/tests/GaussianDistributionTests.cpp create mode 100644 isis/tests/IDTests.cpp create mode 100644 isis/tests/KernelDbTests.cpp create mode 100644 isis/tests/KernelTests.cpp create mode 100644 isis/tests/LatitudeTests.cpp create mode 100644 isis/tests/LineEquationTests.cpp create mode 100644 isis/tests/Map2camTests.cpp create mode 100644 isis/tests/Mocks.h create mode 100644 isis/tests/PixelTypeTests.cpp create mode 100644 isis/tests/PvlObjectTests.cpp create mode 100644 isis/tests/RollingShutterCameraDetectorMapTests.cpp create mode 100644 isis/tests/SpiceTests.cpp create mode 100644 isis/tests/StatisticsTest.cpp create mode 100644 isis/tests/TestUtilities.cpp create mode 100644 isis/tests/cnetcheckFunctionalTests.cpp create mode 100644 isis/tests/data/LineScannerImage/defaultLineScanner.isd create mode 100644 isis/tests/data/LineScannerImage/defaultLineScanner.pvl create mode 100644 isis/tests/data/LineScannerImage/projDefaultLineScanner.pvl create mode 100644 isis/tests/data/defaultImage/defaultCube.isd create mode 100644 isis/tests/data/defaultImage/defaultCube.pvl create mode 100644 isis/tests/data/defaultImage/projDefaultCube.pvl create mode 100644 isis/tests/data/kaguyatc2isis/TC1S2B0_01_05186N225E0040_mini.img create mode 100644 isis/tests/data/kaguyatc2isis/TC1S2B0_01_05186N225E0040_mini.lbl create mode 100644 isis/tests/data/leisa2isis/lsb_0034933739_0x53c_sci_1_cropped.fit create mode 100644 isis/tests/data/threeImageNetwork/controlnetwork.net create mode 100644 isis/tests/data/threeImageNetwork/cube1.isd create mode 100644 isis/tests/data/threeImageNetwork/cube1.pvl create mode 100644 isis/tests/data/threeImageNetwork/cube2.isd create mode 100644 isis/tests/data/threeImageNetwork/cube2.pvl create mode 100644 isis/tests/data/threeImageNetwork/cube3.isd create mode 100644 isis/tests/data/threeImageNetwork/cube3.pvl create mode 100644 isis/tests/data/threeImageNetwork/threeImageOverlaps.lis create mode 100644 isis/tests/data/threeImageNetwork/twoImageOverlaps.lis create mode 100644 isis/tests/spiceinitTests.cpp delete mode 100644 isis/version diff --git a/.github/ISSUE_TEMPLATE/1_Bug_report.md b/.github/ISSUE_TEMPLATE/1_Bug_report.md new file mode 100644 index 0000000000..0f60459ecb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_Bug_report.md @@ -0,0 +1,19 @@ +--- +name: 🐛 Bug Report +about: Report errors and problems + +--- + +**ISIS version(s) affected**: x.y.z + +**Description** + + +**How to reproduce** + + +**Possible Solution** + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/2_Feature_request.md b/.github/ISSUE_TEMPLATE/2_Feature_request.md new file mode 100644 index 0000000000..a0e697f4b9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_Feature_request.md @@ -0,0 +1,13 @@ +--- +name: 🚀 Feature Request +about: RFC and ideas for new features and improvements + +--- + +**Description** + + +**Example** + + diff --git a/.github/ISSUE_TEMPLATE/3_Support_question.md b/.github/ISSUE_TEMPLATE/3_Support_question.md new file mode 100644 index 0000000000..75fba21942 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_Support_question.md @@ -0,0 +1,15 @@ +--- +name: ⛔ Support Question +about: See https://astrodiscuss.usgs.gov for questions about using ISIS3 and other Astrogeology Science Center software. + +--- + +We use Github issues solely for discussing bugs, documentation issues, and new features. + +For +questions about using ISIS3 or other ASC software, please use +any of the support alternatives: https://astrodiscuss.usgs.gov or https://gitter.im/USGS-Astrogeology/IAA + +A great resource about asking high quality questions that generate high quality answers is available from the StackOverflow community: [How do I ask a good question?](https://stackoverflow.com/help/how-to-ask) + +Thanks! diff --git a/.github/ISSUE_TEMPLATE/4_Documentation_issue.md b/.github/ISSUE_TEMPLATE/4_Documentation_issue.md new file mode 100644 index 0000000000..d14877fcf8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4_Documentation_issue.md @@ -0,0 +1,13 @@ +--- +name: ⛔ Documentation Issue +about: Report issues or problems with documentation. + +--- + +**Description** + + +**Suggested Edit** + + +Thanks! diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 63686ef867..c9ce01f66c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,7 +4,7 @@ ## Related Issue - + diff --git a/.gitignore b/.gitignore index be8aea3649..bce992dee0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ !TestPreferences !*/3rdParty/Makefile +# Unignore version file +!version + *.cub *.o *.so @@ -44,7 +47,7 @@ print.prt */tsts/*/output/* */build/ build/ -*/install/ +install/ # Created by https://www.gitignore.io/api/macos # Edit at https://www.gitignore.io/?templates=macos diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000000..23124c7c1e --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,67 @@ +ISIS3 Contributors +================== + +- Aaron Curtis +- Adam Goins +- Adam Paquette +- Andrew Annex +- Andrew Stebenne +- Austin Sanders +- B. Seignovert +- Christopher Austin +- Christopher Ryan Combs Jr +- Cole Neubauer +- Curtis Rose +- David Miller +- Debbie Cook +- Ella Mae Lee +- Elpitha Howington-Kraus +- Eric Gault +- Eric Hyer +- Evin Dunn +- Ian Humphrey +- Jac Shinaman +- Jai Rideout +- James Alexander Crough +- Janet Barrett +- Jason Laura +- Jeannie Backer +- Jeff Anderson +- Jeffrey Covington +- Jesse Mapel +- John Bonn +- Kaitlyn Lee +- Kaj E Williams +- Kelvin Rodriguez +- Ken Edmundson +- Kim Oyama +- Kris Becker +- Kristin Berry +- Lauren Adoram-Kershner +- Lynn Weller +- Mackenzie Boyd +- Makayla Shepherd +- Marjorie Hahn +- Mathew Eis +- Michael Aye +- Moses Milazzo +- Oleg Alexandrov +- Orrin Thomas +- Peter Giroux +- Raad A. Saleh +- Ross Beyer +- Sasha Brownsberger +- Sharmilla Prasad +- Steven Lambright +- Stuart Sides +- Summer Stapleton +- Tracie Sucharski +- Travis Addair +- Tyler Wilson +- Victor Silva + +----- +This list was initially generated using this bash command (additional manual edits are needed): + +git log --pretty="- %an %n" | sort | uniq -i >> AUTHORS.rst + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 70035ab9a9..28d3e9a52a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,76 +1,53 @@ -# Contributing to ISIS3 -# Under Construction - -#### Table of Contents -[I have a question or a problem!](#i-have-a-question-or-a-problem) - -[How can I contribute?](#how-can-i-contribute) - * [Suggesting enhancements](#redmine-issues) - * [Working on an existing issue or enhancement](#working-on-an-existing-issue-or-enhancement) - * [Working on a new issue or enhancement](#working-on-a-new-issue) - -[Code Base Contribution Guidelines](#code-base-contribution-guidelines) - -[What can I expect from the ISIS3 development team](#What-can-I-expect-from-the-ISIS3-development-team) - * [Response time](#Response-time) - * [Feedback](#feedback) - -[Development Process Checklists](https://github.com/USGS-Astrogeology/ISIS3/wiki/Developer-Checklists) - -[References](#references) - -## I have a question or a problem! -If you have a question about or a problem with ISIS3, please see the [Redmine Issues](#redmine-issues) section. - -If you have a question or a problem with contributing to our software please contact mshepherd@usgs.gov - -## How can I contribute? - -### Redmine Issues -Redmine is our ticket tracking tool. If you have a question about, a problem with, or a suggestion for ISIS3, please read our [Guidelines for reporting Redmine issues](https://isis.astrogeology.usgs.gov/fixit/projects/isis/wiki/Guidelines_for_Reporting_Issues). Once you have read that please [submit](https://isis.astrogeology.usgs.gov/fixit/projects/isis/issues/new) a Redmine issue. - -### Working on an issue or enhancement -1. Find a issue or enhancement that you want to work on. Check Redmine [issues](https://isis.astrogeology.usgs.gov/fixit/projects/isis/issues) to see if there has been a ticket reported about it. If one does not exist that addresses what you want to work on, make a ticket. -2. Assign the Redmine issue to yourself. If you don't have the permission to do this, please make a note on the issue indicating that you would like to work on it. -3. Propose a solution on the redmine issue. -4. Work with an ISIS3 developer, the issue reporter, and any other interested parties to get feedback on your solution. This may be an iterative process. -5. Add an [impact statement](https://isis.astrogeology.usgs.gov/fixit/projects/isis/wiki/Impact_Statement) to the redmine issue. If you don't have the permission to do this, please make a note on the issue with the impact statement. -6. Make the changes on your fork of the ISIS3 main GitHub repo. Follow the [Code Base Contribution Guidelines](#code-base-contribution-guidelines). -7. Follow the Developer's Checklist to ensure your changes are ready for review. -8. Make a pull request. Include the redmine issue number in the title of the pull request. Use the "Fixes #0000" format. -9. Work with your code reviewer, tester, and reporter to improve your changes. Your pull request will not be merged in until all parties approve the changes. -10. Check in your test data. If you are an outside contributer, work with your code reviewer to ensure your tests and test data get checked in. - -### Working on a new issue or enhancement -1. Please create a [Redmine issue](#redmine-issues). -2. Indicate in the comments of your issue that you would like to work on the issue or enhancement. -3. Follow the [Working on an existing issue or enhancement](#working-on-an-existing-issue-or-enhancement) steps. - -## Code Base Contribution Guidelines -The following is a set of guidelines for contributing to ISIS3. -* Personal style changes will not be accepted. -* Changes to bring code closer to our [Coding Standards and Style Guide](https://isis.astrogeology.usgs.gov/documents/CodingStandards/CodingStandards.html) are encouraged. -* Please be professional, even in comments. -* Variable names must be meaningful. -* All modified code is required to pass our [Coding Standards and Style Guide](https://isis.astrogeology.usgs.gov/documents/CodingStandards/CodingStandards.html). -* You must write or update tests to exercise any modified code. -* You must provide test data for any new or modified tests. -* You must have a Redmine issue assigned to you before submitting a pull request. -* You must complete the Developer Checklist before submitting your pull request. -* When submitting a pull request, you must include the Redmine issue number in the title of the pull request. Use the "Fixes #0000" format (#0000 being the Redmine ticket number). - -## What can I expect from the ISIS3 development team? -### Response Time -Our response time will depend on availability and scheduling. -### Feedback -Our feedback will address any discrepancies related to the contribution guidelines, our coding standards and style guide, and our code review checklist. - -## References - * [ISIS3 API Reference](https://isis.astrogeology.usgs.gov/Object/Developer/index.html) - * [Tutorials](https://isis.astrogeology.usgs.gov/fixit/projects/isis/wiki/ISIS_Online_Workshops) - * [Application Documentation](https://isis.astrogeology.usgs.gov/Application/index.html) - * [Coding Standards and Style Guide](https://isis.astrogeology.usgs.gov/documents/CodingStandards/CodingStandards.html) - * [Documentation](https://isis.astrogeology.usgs.gov/documents/CodingStandards/CodingStandards.html#documentation) - * [Redmine Issue Lifecycle](https://isis.astrogeology.usgs.gov/fixit/projects/isis/wiki/Life_Cycle_of_an_ISIS_Issue) - +# ISIS Contributing Guide +The goal of this document is to create a contribution process that: + +* Encourages new contributions. +* Encourages contributors to remain involved. +* Avoids unnecessary processes and bureaucracy whenever possible. +* Creates a transparent decision making process which makes it clear how +contributors can be involved in decision making. + + +## Vocabulary + +* A **Contributor** is any individual creating or commenting on an issue or pull request. +* A **Committer** is a subset of contributors who have been given write access to the repository. + +# Logging Issues + +Log an issue for any question or problem you might have. When in doubt, log an issue, +any additional policies about what to include will be provided in the responses. The only +exception is security disclosures which should be sent privately. + +Committers may direct you to another repository, ask for additional clarifications, and +add appropriate metadata before the issue is addressed. + +Please be courteous, respectful, and every participant is expected to follow the +project's Code of Conduct. + +# Contributions + +Any change to resources in this repository must be through pull requests. This applies to all changes +to documentation, code, binary files, etc. + +No pull request can be merged without being reviewed. + +The default for each contribution is that it is accepted once no committer has an objection. +During review committers may also request that a specific contributor who is most versed in a +particular area gives a "LGTM" before the PR can be merged. There is no additional "sign off" +process for contributions to land. Once all issues brought by committers are addressed it can +be landed by any committer. + +In the case of an objection being raised in a pull request by another committer, all involved +committers should seek to arrive at a consensus by way of addressing concerns being expressed +by discussion, compromise on the proposed change, or withdrawal of the proposed change. + + +# Becoming a Committer + +All contributors who land a non-trivial contribution should be on-boarded in a timely manner, +and added as a committer, and be given write access to the repository. + +Committers are expected to follow this policy and continue to send pull requests, go through +proper review, and have other committers merge their pull requests. diff --git a/Jenkinsfile b/Jenkinsfile index 67aec8e33c..1cd23ff8bb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,145 +1,122 @@ -properties([pipelineTriggers([githubPush()])]) - -def nodes = [:] - -nodes["isis-fedora-25"] = { - node("isis-fedora-25") { - withEnv(["ISISROOT=" + "${workspace}" + "/build/", "ISIS3TESTDATA=/usgs/cpkgs/isis3/testData/", "ISIS3DATA=/usgs/cpkgs/isis3/data/"]) { - stage ("Fedora 25") { - git branch: 'dev', url: 'https://github.com/USGS-Astrogeology/ISIS3.git' -// sh """ -// git clone https://github.com/abseil/googletest.git gtest -// conda config --set channel_alias http://astro-bin.wr.usgs.gov/conda -// conda config --prepend channels anaconda -// conda config --append channels conda-forge -// conda config --append channels usgs-astrogeology -// conda config --prepend default_channels anaconda -// conda env create -n isis3 -f environment.yml -// source activate isis3 -// mkdir -p ./install ./build && cd build -// cmake -GNinja -DJP2KFLAG=OFF -Dpybindings=OFF -DCMAKE_INSTALL_PREFIX=../install -Disis3Data=/usgs/cpkgs/isis3/data -Disis3TestData=/usgs/cpkgs/isis3/testData ../isis -// set +e -// ninja -j8 && ninja install -// source /usgs/cpkgs/isis3/isis3mgr_scripts/initIsisCmake.sh . -// ctest -V -R _unit_ --timeout 500 -// ctest -V -R _app_ --timeout 500 -// ctest -V -R _module_ --timeout 500 -// """ - } - } - } -} +// vim: ft=groovy -nodes["isis-centos-7"] = { - node("isis-centos-7") { - withEnv(["ISISROOT=" + "${workspace}" + "/build/", "ISIS3TESTDATA=/usgs/cpkgs/isis3/testData/", "ISIS3DATA=/usgs/cpkgs/isis3/data/"]) { - stage ("CentOS 7") { - git branch: 'dev', url: 'https://github.com/USGS-Astrogeology/ISIS3.git' -// sh """ -// git clone https://github.com/abseil/googletest.git gtest -// conda config --set channel_alias http://astro-bin.wr.usgs.gov/conda -// conda config --prepend channels anaconda -// conda config --append channels conda-forge -// conda config --append channels usgs-astrogeology -// conda config --prepend default_channels anaconda -// conda env create -n isis3 -f environment.yml -// source activate isis3 -// mkdir -p ./install ./build && cd build -// cmake -GNinja -DJP2KFLAG=OFF -Dpybindings=OFF -DCMAKE_INSTALL_PREFIX=../install -Disis3Data=/usgs/cpkgs/isis3/data -Disis3TestData=/usgs/cpkgs/isis3/testData ../isis -// set +e -// ninja -j8 && ninja install -// source /usgs/cpkgs/isis3/isis3mgr_scripts/initIsisCmake.sh . -// ctest -V -R _unit_ --timeout 500 -// ctest -V -R _app_ --timeout 500 -// ctest -V -R _module_ --timeout 500 -// """ - } - } - } -} +def NUM_CORES = 8 +def errors = [] +def labels = ['CentOS', 'Fedora', 'Ubuntu', 'Mac'] // labels for Jenkins node types we will build on +def nodes = [:] -nodes["isis-debian-9"] = { - node("isis-debian-9") { - withEnv(["ISISROOT=" + "${workspace}" + "/build/", "ISIS3TESTDATA=/usgs/cpkgs/isis3/testData/", "ISIS3DATA=/usgs/cpkgs/isis3/data/"]) { - stage ("Debian 9") { - git branch: 'dev', url: 'https://github.com/USGS-Astrogeology/ISIS3.git' -// sh """ -// git clone https://github.com/abseil/googletest.git gtest -// conda config --set channel_alias http://astro-bin.wr.usgs.gov/conda -// conda config --prepend channels anaconda -// conda config --append channels conda-forge -// conda config --append channels usgs-astrogeology -// conda config --prepend default_channels anaconda -// conda env create -n isis3 -f environment.yml -// source activate isis3 -// mkdir -p ./install ./build && cd build -// cmake -GNinja -DJP2KFLAG=OFF -Dpybindings=OFF -DCMAKE_INSTALL_PREFIX=../install -Disis3Data=/usgs/cpkgs/isis3/data -Disis3TestData=/usgs/cpkgs/isis3/testData ../isis -// set +e -// ninja -j8 && ninja install -// source /usgs/cpkgs/isis3/isis3mgr_scripts/initIsisCmake.sh . -// ctest -V -R _unit_ --timeout 500 -// ctest -V -R _app_ --timeout 500 -// ctest -V -R _module_ --timeout 500 -// """ - } - } - } -} +for (lbl in labels) { + def label = lbl + def envFile = (label == "CentOS") ? "environment_gcc4.yml" : "environment.yml" + + nodes[label] = { + stage(label) { + isisNode(label) { + def isisEnv = [ + "ISISDATA=/isisData/isis_data", + "ISISTESTDATA=/isisData/isis_testData", + "ISIS3MGRSCRIPTS=/isisData/data/isis3mgr_scripts", + "MALLOC_CHECK_=1" + ] + + def cmakeFlags = [ + "-DJP2KFLAG=ON", + "-DKAKADU_INCLUDE_DIR=/isisData/kakadu", + "-Dpybindings=OFF", + "-DCMAKE_BUILD_TYPE=RELEASE" + ] -nodes["isis-ubuntu-1804"] = { - node("isis-ubuntu-1804") { - withEnv(["ISISROOT=" + "${workspace}" + "/build/", "ISIS3TESTDATA=/usgs/cpkgs/isis3/testData/", "ISIS3DATA=/usgs/cpkgs/isis3/data/"]) { - stage ("Ubuntu 18.04") { - git branch: 'dev', url: 'https://github.com/USGS-Astrogeology/ISIS3.git' -// sh """ -// git clone https://github.com/abseil/googletest.git gtest -// conda config --set channel_alias http://astro-bin.wr.usgs.gov/conda -// conda config --prepend channels anaconda -// conda config --append channels conda-forge -// conda config --append channels usgs-astrogeology -// conda config --prepend default_channels anaconda -// conda env create -n isis3 -f environment.yml -// source activate isis3 -// mkdir -p ./install ./build && cd build -// cmake -GNinja -DJP2KFLAG=OFF -Dpybindings=OFF -DCMAKE_INSTALL_PREFIX=../install -Disis3Data=/usgs/cpkgs/isis3/data -Disis3TestData=/usgs/cpkgs/isis3/testData ../isis -// set +e -// ninja -j8 && ninja install -// source /usgs/cpkgs/isis3/isis3mgr_scripts/initIsisCmake.sh . -// ctest -V -R _unit_ --timeout 500 -// ctest -V -R _app_ --timeout 500 -// ctest -V -R _module_ --timeout 500 -// """ + def stageStatus = "Checking out ISIS on ${label}" + + // Checkout + checkout scm + + condaEnv("isis3") { + // Environment + loginShell """ + conda install -c conda-forge python=3 findutils + conda env update -f ${envFile} --prune + mkdir build install + """ + + def osFailed = false + isisEnv.add("ISISROOT=${pwd()}/build") + isisEnv.add("PATH=${pwd()}/install/bin:${env.PATH}") + cmakeFlags.add("-DCMAKE_INSTALL_PREFIX=${pwd()}/install") + + withEnv(isisEnv) { + dir(env.ISISROOT) { + // Build + stageStatus = "Building ISIS on ${label}" + try { + loginShell """ + cmake -GNinja ${cmakeFlags.join(' ')} ../isis + ninja -j${NUM_CORES} install + """ + } catch(e) { + // Die right here + error stageStatus + } + + // Unit tests + stageStatus = "Running unit tests on ${label}" + try { + loginShell "ctest -R _unit_ -j${NUM_CORES} -VV" + } catch(e) { + errors.add(stageStatus) + osFailed = true + } + + // App tests + stageStatus = "Running app tests on ${label}" + try { + loginShell "ctest -R _app_ -j${NUM_CORES} -VV" + } catch(e) { + errors.add(stageStatus) + osFailed = true + } + + try { + loginShell "ctest -R _module_ -j${NUM_CORES} -VV" + } catch(e) { + errors.add(stageStatus) + osFailed = true + } + + // Gtests + stageStatus = "Running gtests on ${label}" + try { + loginShell "ctest -R '.' -E '(_app_|_unit_|_module_)' -j${NUM_CORES} -VV" + } catch(e) { + errors.add(stageStatus) + osFailed = true + } + + if (osFailed) { + error "Failed on ${label}" + } + } + } + } } } } } -nodes["mac1013"] = { - node("mac1013") { - withEnv(["ISISROOT=" + "${workspace}" + "/build/", "ISIS3TESTDATA=/usgs/cpkgs/isis3/testData/", "ISIS3DATA=/usgs/cpkgs/isis3/data/"]) { - stage ("MacOS 10.13 (High Sierra)") { - git branch: 'dev', url: 'https://github.com/USGS-Astrogeology/ISIS3.git' -// sh """ -// git clone https://github.com/abseil/googletest.git gtest -// conda config --set channel_alias http://astro-bin.wr.usgs.gov/conda -// conda config --prepend channels anaconda -// conda config --append channels conda-forge -// conda config --append channels usgs-astrogeology -// conda config --prepend default_channels anaconda -// conda env create -n isis3 -f environment.yml -// source activate isis3 -// mkdir -p ./install ./build && cd build -// cmake -GNinja -DJP2KFLAG=OFF -Dpybindings=OFF -DCMAKE_INSTALL_PREFIX=../install -Disis3Data=/usgs/cpkgs/isis3/data -Disis3TestData=/usgs/cpkgs/isis3/testData ../isis -// set +e -// ninja -j8 && ninja install -// source /usgs/cpkgs/isis3/isis3mgr_scripts/initIsisCmake.sh . -// ctest -V -R _unit_ --timeout 500 -// ctest -V -R _app_ --timeout 500 -// ctest -V -R _module_ --timeout 500 -// """ - } +// Run the builds in parallel +node { + try { + parallel nodes + + } catch(e) { + // Report result to GitHub + currentBuild.result = "FAILURE" + + def comment = "Failed during:\n" + errors.each { + comment += "- ${it}\n" } + + setGithubStatus(comment) } } - -parallel nodes diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000..4cb848de73 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,44 @@ +Unless otherwise noted, this project is in the public domain in the +United States. + +It contains materials that originally came from the United States +Geological Survey, an agency of the United States Department of +Interior. For more information on their copyright policies, see +https://www.usgs.gov/information-policies-and-instructions/copyrights-and-credits + +It also contains materials from contributors that have waived their +copyright interest to the public domain. + +Additionally, the authors waive copyright and related rights in the +work worldwide through the CC0 1.0 Universal public domain dedication. + +CC0 1.0 Universal Summary +------------------------- + +This is a human-readable summary of the [Legal Code (read the full +text)](https://creativecommons.org/publicdomain/zero/1.0/legalcode). + + +### No Copyright + +The authors have associated their contributions to the ISIS project +with this deed, and have dedicated the work to the public domain +by waiving all of their rights to the work worldwide under copyright +law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for +commercial purposes, all without asking permission. + + +### Other Information + +In no way are the patent or trademark rights of any person affected +by CC0, nor are the rights that other persons may have in the work +or in how the work is used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the authors who have associated +the ISIS project with this deed make no warranties about the work, +and disclaim liability for all uses of the work, to the fullest +extent permitted by applicable law. When using or citing the work, +you should not imply endorsement by the authors. diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 68a49daad8..0000000000 --- a/LICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to diff --git a/README.md b/README.md index 6dc9ae18e1..172384ab44 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,63 @@ -# ISIS3 +# ISIS [![Join the chat at https://gitter.im/USGS-Astrogeology/isis3_cmake](https://badges.gitter.im/USGS-Astrogeology/isis3_cmake.svg)](https://gitter.im/USGS-Astrogeology/isis3_cmake?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the discourse at https://astrodiscuss.usgs.gov](https://img.shields.io/discourse/https/astrodiscuss.usgs.gov/topics.svg?style=flat)](https://astrodiscuss.usgs.gov/) +[![Anaconda-Server Badge](https://anaconda.org/usgs-astrogeology/isis3/badges/version.svg)](https://anaconda.org/usgs-astrogeology/isis3) +[![Anaconda-Server Badge](https://anaconda.org/usgs-astrogeology/isis/badges/version.svg)](https://anaconda.org/usgs-astrogeology/isis) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3697216.svg)](https://doi.org/10.5281/zenodo.3697216) + ## Table of Contents -* [Installation](README.md##Installation) +* [Requests for Comment](README.md#Requests-for-Comment) +* [FAQ](README.md#FAQ) +* [Installation](README.md#Installation) +* [Start Contributing](https://github.com/USGS-Astrogeology/ISIS3/wiki/How-to-Start-Contributing) +* [ISIS Data Area](README.md#The-ISIS-Data-Area) +* [Installing Older Versions of ISIS](README.md#Installing-older-versions-of-ISIS) + +## Requests for Comment +The ISIS project uses a Request for Comment (RFC) model whereby major potential changes to the code base, data area, or binary delivery process are proposed, iterated on by any interested parties, and potentially adopted. Right now, RFCs are being housed in this repository's [wiki](https://github.com/USGS-Astrogeology/ISIS3/wiki) with associated discussions occurring on [astrodiscuss](astrodiscuss.usgs.gov). + +Current open RFCs: + * [Migration of ISIS Data to Git](https://github.com/USGS-Astrogeology/ISIS3/wiki/RFC4---Migration-of-ISIS-Data-to-Git) + * [Removal of LOLAGRAIL SPKs from the data area](https://github.com/USGS-Astrogeology/ISIS3/wiki/RFC5-Remove-old-LOLAGRAIL-SPKs) + + We encourage all contributors and users to review open RFCs and comment as these proposed changes will impact use of the software. + +## FAQ +We maintain a list of frequently encountered questions and issues. Before opening a new issue, please take a look at the [FAQ](https://github.com/USGS-Astrogeology/ISIS3/wiki/FAQ). ## Installation -This installation guide is for ISIS3 users interested in installing ISIS3 (3.6.0)+ through conda. +This installation guide is for ISIS users interested in installing ISIS (3.6.0)+ through conda. -### ISIS3 Installation With Conda +### ISIS Installation With Conda 1. Download either the Anaconda or Miniconda installation script for your OS platform. Anaconda is a much larger distribtion of packages supporting scientific python, while Miniconda is a minimal installation and not as large: [Anaconda installer](https://www.anaconda.com/download), [Miniconda installer](https://conda.io/miniconda.html) 2. If you are running on some variant of Linux, open a terminal window in the directory where you downloaded the script, and run the following commands. In this example, we chose to do a full install of Anaconda, and our OS is Linux-based. Your file name may be different depending on your environment. chmod +x Anaconda3-5.2.0-Linux-x86_64.sh ./Anaconda3-5.2.0-Linux-x86_64.sh - + This will start the Anaconda installer which will guide you through the installation process. 3. If you are running Mac OS X, a pkg file (which looks similar to Anaconda3-5.3.0-MacOSX-x86\_64.pkg) will be downloaded. Double-click on the file to start the installation process. 4. After the installation has finished, open up a bash prompt in your terminal window. -5. Next setup your Anaconda environment for ISIS3. In the bash prompt, run the following commands: +5. Next setup your Anaconda environment for ISIS. In the bash prompt, run the following commands: - #Create a new conda environment to install ISIS3 in - conda create -n isis3 python=3.6 + #Create a new conda environment to install ISIS in + conda create -n isis python=3.6 #Activate the environment - #Depending on your OS, you may need to use conda activate isis3 instead - source activate isis3 + #Depending on your version of Anaconda use one of the following: + + #Anaconda 3.4 and up: + conda activate isis + + #Prior to Anaconda 3.4: + source activate isis #Add the following channels to the environment conda config --env --add channels conda-forge @@ -50,42 +76,192 @@ This installation guide is for ISIS3 users interested in installing ISIS3 (3.6.0 #The order is important. If conda-forge is before usgs-astrogeology, you will need to run: conda config --env --add channels usgs-astrogeology - -6. The environment is now ready to download ISIS3 and its dependencies: - conda install -c usgs-astrogeology isis3 - +6. The environment is now ready to download ISIS and its dependencies: + + conda install -c usgs-astrogeology isis + + If you would like to work with our latest ISIS version 3, rather than updating + to ISIS 4, instead run: + + conda install -c usgs-astrogeology isis=3.10.0 + 7. Finally, setup the environment variables: - #Execute the ISIS3 variable initialization script with default arguments. - #This script prepares default values for: $ISISROOT/$ISIS3DATA/$ISIS3TESTDATA + #Execute the ISIS variable initialization script with default arguments. + #This script prepares default values for: $ISISROOT, $ISIS3DATA, $ISIS3TESTDATA python $CONDA_PREFIX/scripts/isis3VarInit.py - + Executing this script with no arguments will result in $ISIS3DATA=$CONDA\_PREFIX/data, and $ISIS3TESTDATA=$CONDA\_PREFIX/testdata. The user can specify different directories for both of these optional values: python $CONDA_PREFIX/scripts/isis3VarInit.py --data-dir=[path to data directory] --test-dir=[path to test data directory] - - Directions for running rsync to download ISIS3 data can be found [here.](#ISIS3DataDownload) Now everytime the isis3 environment is activated, $ISISROOT, $ISIS3DATA, and $ISIS3TESTDATA will be set to the values passed to isis3VarInit.py. This does not happen retroactively, re-activate the isis3 envionment with the following command: - #Depending on your OS, you may need to use conda activate isis3 instead - source activate isis3 - + More information about the ISIS3DATA environment variable and the ISIS Data Area can be found [here]("#The-ISIS-Data-Area"). Now everytime the isis environment is activated, $ISISROOT, $ISIS3DATA, and $ISIS3TESTDATA will be set to the values passed to isis3VarInit.py. This does not happen retroactively, re-activate the isis envionment with one of the following commands: + + for Anaconda 3.4 and up - conda activate isis + prior to Anaconda 3.4 - source activate isis + + +### Practical Usage with other conda packages + +If you don't use conda for anything else on your computer, you can +skip this section. + +If you use conda to install other packages, you may run into +difficulties with adding the isis conda package to those environments +or adding other conda packages to the isis environment you just +created above. This is because the isis conda package pins a number +of requirements that may clash with other packages. + +At this time, we recommend creating the isis environment as detailed +above, and then not adding any other conda packages to it. This +is similar to the best practice usage of not adding any conda +packages to your 'base' conda environment. + +Instead, when you need to have a conda environment with other +packages that also needs to be able to run ISIS programs, we have +two different options. In both cases, we'll assume that you create +a new environment called 'working' (but it could be named anything) +that you want to add some conda packages to, but from which you +also want ISIS access. + +The first step is to create 'working' and add whatever conda packages you want. + +#### Easy mode, with stacking + +1. `conda activate isis` + +2. `conda activate --stack working` + +That's it. Told you it was easy. + +This activates the isis environment, gets it all set up, and +then it 'stacks' the new working environment on top of it. To get +out, you'll have to `conda deactivate` two times to get out of +`working` and then out of `isis`. + + +#### Harder mode, with activation script hacking + +The above stacking situation may have issues if you have a particularly +complicated set of packages or other dependencies. The idea here is that +the only thing you *really* need in your 'working' environment are +the ISIS environment variables and the path to the ISIS executables. + +If the above paragraph sounded like gibberish, please seek help +from your system administrator or local computer guru. + +And we can do this via customizations in the conda environment's +activate.d/ and deactivate.d/ directories. Adding these things can +also be done manually from the command line, but encoding them in +the activate.d/ and deactivate.d/ scripts is handy. + +1. Create your conda environment however you like, adding whatever +packages you need. If you were reading the directions above, you've +already done this. + +2. Locate the path to your conda environments: + + conda activate + echo $CONDA_PREFIX + conda deactivate + + You'll probably get a directory that is in your home directory and + is named `anaconda3` or `miniconda3` or something similar. For the + rest of this set of instructions, we'll refer to it as `$HOME/anaconda3` + to represent a directory named `anaconda3` in your home directory, but + this should be whatever you get from the above echo command. + +3. Locate the path to your ISIS conda environment: + + conda activate isis + echo $CONDA_PREFIX + conda deactivate + + This should probably be `$HOME/anaconda3/envs/isis`. You can see + that it starts with whatever you got from step 1, and ends in the + name of your isis environment, if you followed the installation + instructions above, you called that environment 'isis'. + + You can do the same thing to find the path to your new 'working' + environment, but in this example, it will be at + `$HOME/anaconda3/envs/working`. + +4. Copy the ISIS activation and deactivation scripts to your new +environment. Please note that the directory names in the instructions +below are based on how you installed conda and what you named the +'isis' environment and the 'working' environment. You may *not* be +able to just copy and paste these instructions directly, they are +an example. Likewise, if your shell doesn't take the bash syntax +in the .sh files, then you may need to select one of the other +`env_vars.*` files in the isis directories. + + cd $HOME/anaconda3/envs/ + mkdir -p working/etc/conda/activate.d/ + mkdir -p working/etc/conda/deactivate.d/ + cp isis/etc/conda/activate.d/env_vars.sh working/etc/conda/activate.d/env_vars.sh + cp isis/etc/conda/deactivate.d/env_vars.sh working/etc/conda/deactivate.d/env_vars.sh + +5. Edit the copied activation file in +`$HOME/anaconda3/envs/working/etc/conda/activate.d/` to add the +ISIS executable directory to the path, by adding this line at the +end: + + export PATH=$PATH:$ISISROOT/bin + + Or whatever is appropriate for your shell if you aren't using + the .sh file. No matter how you do it, it is important that + you add `$ISISROOT/bin` to the end of the current path in your + working environment, and not at the beginning. + + +6. Edit the copied deactivation file in +`$HOME/anaconda3/envs/working/etc/conda/deactivate.d/` to remove +the path, by adding this line at the end: + + export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '/isis/ {next} {print}' | sed 's/:$//'`;` + + Or whatever is appropriate for your shell if you aren't using the + .sh file. If your ISIS environment is not called `isis`, then you + need to replace that part in the awk line above. You can look in + the `activate.d/env_vars.sh` file to see what it should be. + +Adding the lines in steps 5 and 6 manually adds the 'bin/' +directory of the ISIS environment to your path (step 5), and then +manually removes it (step 6) on deactivation. If you are using +some other shell, you may need to use a different syntax to add and +remove these elements to and from your path. + + + +### Updating + + To update to a new version of ISIS up to version 3.9.1, simply run `conda update isis3` + + To update to our latest release candidate up to version 3.9.1, run `conda update -c usgs-astrogeology -c usgs-astrogeology/label/RC isis3` + + Note that for ISIS versions 3.10 and above, new versions and release candidates will only be + available under the package name `isis` and `conda update isis3` and + `conda update -c usgs-astrogeology -c usgs-astrogeology/label/RC isis3` + will no longer work for additional updates. Instead, after installing an `isis` package, + `conda update isis` should be used to update to a new version and + `conda update -c usgs-astrogeology/label/RC isis` to update to a new release candidate. ### Operating System Requirements -ISIS3 runs on many UNIX variants. ISIS does not run natively on MS Windows, although it has been successfully run on Windows 10 using the Windows Subsystem for Linux (WSL). Instructions for doing this can be found [here.](#RunningOnWindows) The UNIX variants ISIS3 has been successfully built on are: +ISIS runs on many UNIX variants. ISIS does not run natively on MS Windows, although it has been successfully run on Windows 10 using the Windows Subsystem for Linux (WSL). Instructions for doing this can be found [here](http://planetarygis.blogspot.com/2017/07/isis3-on-windows-10-bash.html). The UNIX variants ISIS has been successfully built on are: - Ubuntu 18.04 LTS - Mac OS X 10.13.6 High Sierra - Fedora 28 - CentOS 7.2 -ISIS3 may be run on other Linux or macOS operating systems then those listed above, but it has not been tested and is not supported. +ISIS may be run on other Linux or macOS operating systems then those listed above, but it has not been tested and is not supported. ### Hardware Requirements @@ -93,12 +269,12 @@ Here are the minimum hardware requirements - 64-bit (x86) processors - 2 GB RAM -- 2.5 GB of disk space for ISIS3 binaries -- 10 GB to 510 GB disk space for ISIS3 data +- 2.5 GB of disk space for ISIS binaries +- 10 GB to 510 GB disk space for ISIS data - 10 GB to many TB disk space for processing images - A quality graphics card -To build and compile ISIS3 requires following the instructions listed below, which are given on the GitHub wiki page for the ISIS3 project: +To build and compile ISIS requires following the instructions listed below, which are given on the GitHub wiki page for the ISIS project: - [Getting Started With GitHub](https://github.com/USGS-Astrogeology/ISIS3/wiki/Developing-ISIS3-with-cmake#getting-started-with-github) - [Building ISIS3 With cmake](https://github.com/USGS-Astrogeology/ISIS3/wiki/Developing-ISIS3-with-cmake#building-isis3) @@ -109,38 +285,43 @@ To build and compile ISIS3 requires following the instructions listed below, whi - [Building ISIS3 documentation](https://github.com/USGS-Astrogeology/ISIS3/wiki/Developing-ISIS3-with-cmake#building-isis3-documentation) - [What to do if you encounter any problems](https://github.com/USGS-Astrogeology/ISIS3/wiki/Developing-ISIS3-with-cmake#problems) -### Mission Requirements +## The ISIS Data Area + +### Ancillary Data -ISIS3 supports many planetary missions; in fact, over 40 different instruments including some flown as early as the 1960s. Ancillary data are required to process images from these instruments. For example, translation definition files to help convert from PDS format to ISIS cubes, dark current and flat file images for radiometric calibration, and large quantities of SPICE files (spacecraft pointing and position) for map projecting images. If you plan to work with data from all missions, then the download will require about 180 GB for all the ancillary data. However, most of this volume is taken up by SPICE files. We have a SPICE Web service that can be used in lieu of downloading all of the SPICE files which can reduce the download size to 10 GB. When downloading ISIS, you will have the option of choosing which mission data to acquire as well as if you only want the translation and calibration files and not SPICE files. +Many ISIS applications require ancillary data. For example, ingestion applications require translation tables to convert labels, calibration applications require flat files to do flat field correct, and map projection applications require DTMs to accurately compute intersections. Due to its size, this data is stored in a separate directory called the ISIS Data Area. Any location can be used for the ISIS Data Area, the software simply requires that the ISIS3DATA environment variable is set to its location. -### DTM Requirements +### Structure of the ISIS3 Data Area -The strength of ISIS3 lies in its capabilities for planetary cartography. The image orthorectification process is improved if a digital terrain model (DTM) is used. The DTMs can be quite large and take some time to download. They exist for many planetary bodies (e.g., the Moon, Mars, etc.). Therefore, there are options for selecting which DTMs to download if you are only working with a particular target body. +Under the root directory of the ISIS Data Area pointed to by the ISIS3DATA environment variable are a variety of sub-directories. Each mission supported by ISIS has a sub-directory that contains mission specific processing data such as flat files and mission specific SPICE. There are also data areas used by more generic applications. These sub-directories contain everything from templates to test data. - +### Size of the ISIS3 Data Area + +If you plan to work with data from all missions, then the download will require about 520 GB for all the ancillary data. However, most of this volume is taken up by SPICE files. We have a [Web service](#isis-spice-web-service) that can be used in lieu of downloading all of the SPICE files. This reduces the total download size to about 10 GB. ### Full ISIS3 Data Download -Mission data is hosted on rsync servers and not through conda channels like the ISIS3 distribution. This requires using the rsync command from within a terminal window within your Unix distribution, or from within WSL if running Windows 10. Downloading all mission data requires over 130 GB of disk space. If you want to acquire only certain mission data [click here](#MissionSpecific). To download all ISIS3 data files, continue reading. +The ISIS Data Area is hosted on rsync servers and not through conda channels like the ISIS binaries. This requires using the rsync command from within a terminal window within your Unix distribution, or from within WSL if running Windows 10. Downloading all mission data requires over 520 GB of disk space. If you want to acquire only certain mission data [click here](#Mission-Specific-Data-Downloads). To download all ISIS data files, continue reading. -To download all ISIS3 data (approximately 180 GB), enter the following commands at the command prompt: +To download all ISIS data, enter the following commands in the location where you want to install the ISIS Data Area: cd $ISIS3DATA rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data . - + > Note: The above command downloads all ISIS data including the required base data area and all of the optional mission data areas. -### Partial Download of ISIS3 Base Data (Required) +### Partial Download of ISIS Base Data (Required) -The base data area is separate from the source code. This data area is crucial to ISIS3 and must be downloaded. +The base data area is separate from the source code. This data area is crucial to ISIS and must be downloaded. To do that run the following commands: - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/base data/ + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/base . ### Partial Download of Mission Specific Data -There are many missions supported by ISIS. If you are only working with a few missions then you should download only those specific data areas. One way you can save time and space is to not download the SPICE data for the mission you need. If you chose download the SPICE data, read the next section about the SPICE Web Service that provides instructions for excluding the SPICE kernels. Otherwise [jump](README.md#ApolloMission) to the mission specific sections. +There are many missions supported by ISIS. If you are only working with a few missions then you can save disk space by downloading only those specific data areas. If you want to limit the download even further, read the next section about the SPICE Web Service. Otherwise [jump](#Mission-Specific-Data-Downloads) to the mission specific sections. ### ISIS SPICE Web Service @@ -148,201 +329,179 @@ ISIS can now use a service to retrieve the SPICE data for all instruments ISIS s --exclude='kernels' -For example: `rsync -azv **--exclude='kernels'** --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/cassini data/` +For example: - WARNING: Some instruments require mission data to be present for calibration, which may not be supported by the SPICE Web Server exclusively, and some programs that are designed to run an image from ingestion through the mapping phase do not have an option to use the SPICE Web Service. For information specific to an instrument, see the documentation for radiometric callobration programs. +
+cd $ISIS3DATA
+rsync -azv --exclude='kernels' --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/cassini .
+
-#### Apollo Mission (kernels can be excluded): +**WARNING:** Some instruments require mission data to be present for radiometric calibration, which is not supported by the SPICE Web Server, and some programs that are designed to run an image from ingestion through the mapping phase do not have an option to use the SPICE Web Service. For information specific to an instrument, see the documentation for radiometric calibration programs. - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/apollo15 data/ - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/apollo16 data/ - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/apollo17 data/ - +### Mission Specific Data Downloads - +**Apollo Mission:** -Cassini Mission (kernels can be excluded): + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/apollo15 . + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/apollo16 . + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/apollo17 . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/cassini data/ - - +**Cassini Mission:** -Chandrayaan Mission (kernels can be excluded): + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/cassini . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/chandrayaan1 data/ - - +**Chandrayaan Mission:** -Clementine Mission (kernels can be excluded): + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/chandrayaan1 . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/clementine1 data/ - - +**Clementine Mission:** -Dawn Mission (kernels can be excluded): + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/clementine1 . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/dawn data/ - -ExoMars Trace Gas Orbiter Mission (kernels can be excluded): +**Dawn Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/dawn . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/tgo data/ - -Galileo Mission (kernels can be excluded): +**ExoMars Trace Gas Orbiter Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/tgo . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/galileo data/ - -Hayabusa Mission (kernels can be excluded): +**Galileo Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/galileo . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/hayabusa data/ - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/hayabusa2 data/ - -Juno Mission (kernels can be excluded): +**Hayabusa Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/juno data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/hayabusa . + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/hayabusa2 . - -Kaguya Mission (kernels can be excluded): +**Juno Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/kaguya data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/juno . - -Lunar Orbiter Mission (kernels can be excluded): +**Kaguya Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/lo data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/kaguya . - -Lunar Reconnaissance Orbiter Mission (kernels can be excluded): +**Lunar Orbiter Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/lro data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/lo . - -Mars Exploration Rover Mission (kernels can be excluded): +**Lunar Reconnaissance Orbiter Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mer data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/lro . - -Mariner10 Mission (kernels can be excluded): +**Mars Exploration Rover Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mariner10 data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mer . - -Messenger Mission (kernels can be excluded): +**Mariner10 Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/messenger data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mariner10 . - -Mars Express Mission (kernels can be excluded): +**Messenger Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mex data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/messenger . - -Mars Global Surveyor Mission (kernels can be excluded): +**Mars Express Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mgs data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mex . - -Mars Reconnaissance Orbiter Mission (kernels can be excluded): +**Mars Global Surveyor Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mro data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mgs . - -Mars Odyssey Mission (kernels can be excluded): +**Mars Reconnaissance Orbiter Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/odyssey data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mro . - -Near Mission (kernels can be excluded): +**Mars Odyssey Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/near data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/odyssey . -New Horizons Mission (kernels can be excluded): - +**Near Mission:** - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/newhorizons data/ - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/near . -Odyssey Mission (kernels can be excluded): - +**New Horizons Mission:** + + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/newhorizons . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/odyssey data/ - -Rolo Mission (kernels can be excluded): +**Rolo Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/rolo . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/rolo data/ - -Rosetta Mission (kernels can be excluded): +**Rosetta Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/rosetta . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/rosetta data/ - -Smart1 Mission (kernels can be excluded): +**Smart1 Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/smart1 . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/smart1 data/ - -Viking Mission (kernels can be excluded): +**Viking Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/viking1 . + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/viking2 . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/viking1 data/ - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/viking2 data/ - -Voyager Mission (kernels can be excluded): +**Voyager Mission:** - + cd $ISIS3DATA + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/voyager1 . + rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/voyager2 . - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/voyager1 data/ - rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/voyager2 data/ - -Installing older versions of ISIS +## Installing older versions of ISIS --------------------------------- ### How do I install ISIS2? @@ -351,4 +510,4 @@ If you are looking for ISIS2, please [refer to the ISIS 2 Installation Guide](ht ### How do I install ISIS3.5.2 or earlier? -If you are looking for a version of ISIS3 prior to 3.6.0, please [refer to the Legacy ISIS3 Installation Guide](../../documents/LegacyInstallGuide/index.html) for instructions on downloading and installing ISIS3, versions prior to 3.6.0. +If you are looking for a version of ISIS prior to 3.6.0, please [refer to the Legacy ISIS3 Installation Guide](https://isis.astrogeology.usgs.gov/documents/LegacyInstallGuide/index.html) for instructions on downloading and installing ISIS, versions prior to 3.6.0. diff --git a/docker/centos.dockerfile b/docker/centos.dockerfile new file mode 100644 index 0000000000..1bd2254d96 --- /dev/null +++ b/docker/centos.dockerfile @@ -0,0 +1,30 @@ +# vim: set ft=dockerfile: + +FROM usgsastro/centos:latest + +SHELL ["/bin/bash", "-lc"] + +RUN yum install -y \ + gcc \ + gcc-c++ \ + git \ + mesa-libGL-devel \ + && \ + yum clean all + +RUN curl -sLo /tmp/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ + chmod +x /tmp/miniconda.sh && \ + /tmp/miniconda.sh -b -p /opt/conda && \ + rm /tmp/miniconda.sh && \ + echo '. /opt/conda/etc/profile.d/conda.sh' >> /etc/bashrc + +RUN git config --system http.sslCAInfo /etc/ssl/certs/ca-bundle.crt && \ + echo 'ssl_verify: /etc/ssl/certs/ca-bundle.crt' > /opt/conda/.condarc && \ + echo 'always_yes: true' >> /opt/conda/.condarc && \ + conda update conda + +RUN useradd -m conda +USER conda +WORKDIR /home/conda + +CMD ["/bin/bash", "-l"] diff --git a/docker/fedora.dockerfile b/docker/fedora.dockerfile new file mode 100644 index 0000000000..da21641580 --- /dev/null +++ b/docker/fedora.dockerfile @@ -0,0 +1,32 @@ +# vim: set ft=dockerfile: + +FROM usgsastro/fedora:latest + +SHELL ["/bin/bash", "-lc"] + +RUN dnf makecache && \ + dnf install -y \ + gcc \ + gcc-c++ \ + git \ + libnsl \ + mesa-libGL-devel \ + && \ + dnf clean all + +RUN curl -sLo /tmp/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ + chmod +x /tmp/miniconda.sh && \ + /tmp/miniconda.sh -b -p /opt/conda && \ + rm /tmp/miniconda.sh && \ + echo '. /opt/conda/etc/profile.d/conda.sh' >> /etc/bashrc + +RUN git config --system http.sslCAInfo /etc/ssl/certs/ca-bundle.crt && \ + echo 'ssl_verify: /etc/ssl/certs/ca-bundle.crt' > /opt/conda/.condarc && \ + echo 'always_yes: true' >> /opt/conda/.condarc && \ + conda update conda + +RUN useradd -m conda +USER conda +WORKDIR /home/conda + +CMD ["/bin/bash", "-l"] diff --git a/docker/ubuntu.dockerfile b/docker/ubuntu.dockerfile new file mode 100644 index 0000000000..fee702db6d --- /dev/null +++ b/docker/ubuntu.dockerfile @@ -0,0 +1,33 @@ +# vim: set ft=dockerfile: + +FROM usgsastro/ubuntu:latest + +SHELL ["/bin/bash", "-lc"] + +RUN apt-get update && \ + apt-get install -y \ + curl \ + gcc \ + g++ \ + git \ + libgl1-mesa-dev \ + && \ + rm -rf /var/cache/apt/* + +RUN curl -sLo /tmp/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ + chmod +x /tmp/miniconda.sh && \ + /tmp/miniconda.sh -b -p /opt/conda && \ + rm /tmp/miniconda.sh && \ + ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \ + echo '. /opt/conda/etc/profile.d/conda.sh' >> /etc/bash.bashrc + +RUN git config --system http.sslCAInfo /etc/ssl/certs/ca-certificates.crt && \ + echo 'ssl_verify: /etc/ssl/certs/ca-certificates.crt' > /opt/conda/.condarc && \ + echo 'always_yes: true' >> /opt/conda/.condarc && \ + conda update conda + +RUN useradd -m conda +USER conda +WORKDIR /home/conda + +CMD ["/bin/bash", "-l"] diff --git a/environment.yml b/environment.yml index 6ce26f1563..9701aacae0 100644 --- a/environment.yml +++ b/environment.yml @@ -1,67 +1,62 @@ channels: - usgs-astrogeology - conda-forge - - probcomp - defaults dependencies: - - armadillo==8.200.0 - - blas==1.1 - - bullet==2.86.1 - - bz2file==0.98 - - bzip2==1.0.6 - - cmake>=3.10 - - cspice==66 - - curl==7.60.0 - - doxygen==1.8.14 - - eigen==3.3.3 - - embree==2.14.0 - - geos==3.5.1 - - geotiff==1.4.2 - - gmm==5.0 - - gmp==6.1.2 - - gsl==2.2.1 - - hdf5==1.8.18 - - icu==58.2 - - jama==125 + - ale >=0.8.1 + - boost=1.68.0 + - armadillo + - blas + - bullet=2.86.1=0 + - bz2file + - bzip2 + - cmake >=3.15 + - cspice + - curl + - doxygen + - eigen + - embree + - geos>=3.7,<3.8 + - geotiff + - gmm + - gmp + - gsl + - hdf5 + - icu + - jama - jpeg==9b - kakadu==1 - - krb5==1.14.2 + - krb5 - libpng>=1.6.34 - - libprotobuf==3.5.2 - - libtiff>=4.0.9 - - libxml2==2.9.7 + - libprotobuf=3.9.1 + - libtiff + - libxml2 - make - - mesalib==17.2.0 - - mysql==5.7.20 - - mysql-connector-c==6.1.6 - - nanoflann==1.2.2 + - mesalib + - mysql + - mysql-connector-c + - nanoflann + - nlohmann_json - ninja==1.7.2 - conda-forge/label/gcc7::nn - - openblas==0.2.19 - - opencv - - openssl==1.0.2n - - patchelf==0.9 - - pcl==1.8.1 - - pip==9.0.1 - - protobuf==3.5.2 - - python==3.6 - - qhull==7.2.0=0 + - opencv>=3.0.0,<=4.0.0 + - openssl>=1.0.0,<1.1.0 + - pcl + - protobuf=3.9.1 + - qhull - qt=5.9.6 - qwt=6.1.3 - - setuptools=38.5.1 - - sip==4.18 - - sqlite==3.13.0 - - suitesparse==4.5.4 - - superlu==5.2.1 - - tnt==126=0 - - wheel==0.30.0 - - x264==20131218 - - xalan-c==1.11 - - xerces-c==3.1.4 - - xorg-kbproto==1.0.7 + - sqlite + - suitesparse + - superlu + - tnt + - x264=20131218 + - xalan-c + - xerces-c + - xorg-kbproto - xorg-libice - xorg-libsm - - xorg-libx11==1.6.4 + - xorg-libx11 - xorg-libxi - - zlib==1.2.11 + - zlib diff --git a/environment_gcc4.yml b/environment_gcc4.yml index 92be4d2037..d20887dc2a 100644 --- a/environment_gcc4.yml +++ b/environment_gcc4.yml @@ -6,63 +6,59 @@ channels: - defaults dependencies: - - armadillo==8.200.0 - - blas==1.1=openblas - - bullet==2.86.1 - - bz2file==0.98 - - bzip2==1.0.6 - - cmake>=3.10 - - cspice==66 - - curl==7.60.0 - - doxygen==1.8.14 - - eigen==3.3.3 - - embree==2.14.0 - - geos==3.5.1 - - geotiff==1.4.2 - - gmm==5.0 - - gmp==6.1.2 - - gsl==2.2.1 - - hdf5==1.8.18 - - icu==58.2 - - jama==125 + - ale>=0.8.0 + - boost=1.68.0 + - armadillo + - blas + - bullet + - bz2file + - bzip2 + - cmake >=3.15 + - cspice + - curl + - doxygen + - eigen + - embree + - geos=3.7.1 + - geotiff + - gmm + - gmp + - gsl + - hdf5 + - icu + - jama - jpeg==9b - kakadu==1 - - krb5==1.14.2 + - krb5 - libpng>=1.6.34 - - libprotobuf==3.5.2 - - libtiff>=4.0.9 - - libxml2==2.9.7 + - libprotobuf=3.5.2 + - libtiff + - libxml2 - make - - mesalib==17.2.0 - - mysql==5.7.20 - - mysql-connector-c==6.1.6 - - nanoflann==1.2.2 + - mesalib + - mysql + - mysql-connector-c + - nanoflann + - nlohmann_json - ninja==1.7.2 - - nn==1.86.0 - - openblas==0.2.19 - - opencv - - openssl==1.0.2n - - patchelf==0.9 - - pcl==1.8.1 - - pip==9.0.1 - - protobuf==3.5.2 - - python==3.6 - - qhull==7.2.0=0 + - nn=1.86.0=h470a237_1003 + - opencv>=3.0.0,<=4.0.0 + - openssl + - pcl=1.8.1 + - protobuf=3.5.2 + - qhull - qt=5.9.6 - qwt=6.1.3 - - setuptools=38.5.1 - - sip==4.18 - - sqlite==3.13.0 - - suitesparse==4.5.4 - - superlu==5.2.1 - - tnt==126=0 - - wheel==0.30.0 - - x264==20131218 - - xalan-c==1.11 - - xerces-c==3.1.4 - - xorg-kbproto==1.0.7 + - sqlite + - suitesparse + - superlu + - tnt + - x264=20131218 + - xalan-c + - xerces-c + - xorg-kbproto - xorg-libice - xorg-libsm - - xorg-libx11==1.6.4 + - xorg-libx11 - xorg-libxi - - zlib==1.2.11 + - zlib diff --git a/gtest b/gtest index 529c2c6f4a..e588eb1ff9 160000 --- a/gtest +++ b/gtest @@ -1 +1 @@ -Subproject commit 529c2c6f4af29dadb8ee5cddf6a7919caa5ca5f6 +Subproject commit e588eb1ff9ff6598666279b737b27f983156ad85 diff --git a/isis/CMakeLists.txt b/isis/CMakeLists.txt index 5239c8fdbd..57d8685d3a 100644 --- a/isis/CMakeLists.txt +++ b/isis/CMakeLists.txt @@ -10,9 +10,7 @@ cmake_minimum_required(VERSION 3.10) # Point cmake to our other CMake files. list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") -# set(CMAKE_FIND_FRAMEWORK LAST) set(CMAKE_FRAMEWORK_PATH /System/Library/Frameworks/) - set(CMAKE_FIND_FRAMEWORK LAST) include(AddIsisModule) @@ -33,18 +31,18 @@ set(PACKAGE "ISIS") set(PACKAGE_NAME "USGS ISIS") # Version number -set(VERSION "3.6.0.1") +set(VERSION "4.1.0") set(PACKAGE_VERSION ${VERSION}) # Full name and version number set(PACKAGE_STRING "${PACKAGE_NAME} ${VERSION}") # Other release information -set(VERSION_DATE "2018-10-26") +string(TIMESTAMP VERSION_DATE "%Y-%m-%d" UTC) set(RELEASE_STAGE "beta") # (alpha, beta, stable) # Define to the address where bug reports for this package should be sent. -set(PACKAGE_BUGREPORT "https://isis.astrogeology.usgs.gov/fixit") +set(PACKAGE_BUGREPORT "https://github.com/USGS-Astrogeology/ISIS3/issues") # Main website associated with the software package set(PACKAGE_URL "https://isis.astrogeology.usgs.gov/") @@ -65,8 +63,8 @@ set(BUILD_SHARED_LIBS ON) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # Specify user options that can be passed in with the initial CMake command. -option(isis3Data "Directory containing Isis3Data" OFF ) -option(isis3TestData "Directory containing Isis3TestData" OFF ) +option(isisData "Directory containing IsisData" OFF ) +option(isisTestData "Directory containing IsisTestData" OFF ) option(testOutputDir "Directory to store app test output folders" OFF ) option(buildCore "Build the core ISIS modules" ON ) option(buildMissions "Build the mission specific modules" ON ) @@ -82,25 +80,25 @@ if(DEFINED ENV{CONDA_PREFIX} AND CMAKE_INSTALL_PREFIX STREQUAL "/usr/local") endif() # Prioritize passed in variables over env vars, probably a better way to do this -if(DEFINED ENV{ISIS3DATA} AND NOT isis3Data) - set(isis3Data $ENV{ISIS3DATA}) +if(DEFINED ENV{ISISDATA} AND NOT isisData) + set(isisData $ENV{ISISDATA}) endif() -if(DEFINED ENV{ISIS3TESTDATA} AND NOT isis3TestData) - set(isis3TestData $ENV{ISIS3TESTDATA}) +if(DEFINED ENV{ISISTESTDATA} AND NOT isisTestData) + set(isisTestData $ENV{ISISTESTDATA}) endif() -if(EXISTS ${isis3Data}) - set(ENV{ISIS3DATA} "${isis3Data}") +if(EXISTS ${isisData}) + set(ENV{ISISDATA} "${isisData}") else() - message(WARNING "Isis3Data directory ${isis3Data} not found, unit tests will fail.") - set(isis3Data OFF) + message(WARNING "Isis Data directory ${isisData} not found, unit tests will fail.") + set(isisData OFF) endif() -if(EXISTS ${isis3TestData}) - set(ENV{ISIS3TESTDATA} "${isis3TestData}") +if(EXISTS ${isisTestData}) + set(ENV{ISISTESTDATA} "${isisTestData}") else() - message(WARNING "Isis3TestData directory ${isis3TestData} not found, application and module tests will fail.") - set(isis3TestData OFF) + message(WARNING "IsisTestData directory ${isisTestData} not found, application and module tests will fail.") + set(isisTestData OFF) endif() if(${testOutputDir} STREQUAL "OFF") @@ -124,8 +122,8 @@ message("\tBUILD CORE: ${buildCore}") message("\tBUILD MISSIONS: ${buildMissions}") message("\tJP2K SUPPORT: ${JP2KFLAG}") message("\tPYTHON BINDINGS: ${pybindings}") -message("\tISIS3DATA: ${isis3Data}") -message("\tISISTESTDATA: ${isis3TestData}") +message("\tISISDATA: ${isisData}") +message("\tISISTESTDATA: ${isisTestData}") message("\tTEST OUTPUT DIR: ${testOutputDir}") message("\tINSTALL PREFIX: ${CMAKE_INSTALL_PREFIX}") @@ -163,13 +161,15 @@ set(thirdPartyCppFlags -Wall -Wno-unused-parameter -Wno-overloaded-virtual -Wno-strict-aliasing - -Wno-strict-overflow + -DUSE_UNSTABLE_GEOS_CPP_API=1 + -Wno-strict-overflow -DGMM_USES_SUPERLU -DENABLEJP2K=${JP2KFLAG} ) # Append CPP flags set in the third party lib file to the string set in this file. string(REPLACE ";" " " FLAGS_STR "${thirdPartyCppFlags}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS_STR}" ) @@ -182,10 +182,19 @@ if(NOT APPLE) -Wl,-rpath,$ENV{CONDA_PREFIX}/lib) endif() - # Append CPP flags set in the third party lib file to the string set in this file. - string(REPLACE ";" " " FLAGS_STR "${thirdPartyCppFlags}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS_STR}" ) +# Append CPP flags set in the third party lib file to the string set in this file. +string(REPLACE ";" " " FLAGS_STR "${thirdPartyCppFlags}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS_STR}" ) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "RELEASE") +endif() +if(APPLE) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0") +else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -Og") +endif() # Paths to required executables find_program(XALAN Xalan REQUIRED) @@ -219,11 +228,38 @@ find_package(Qt5 COMPONENTS # Search this path explicitly for MacOS OpenGL Framework PATHS /System/Library/Frameworks/ REQUIRED) -# Some of these will have non-traditional installs with version numbers in the paths in v007 -# For these, we pass in a version number, and use it in the path suffix -# This only applies to v007, and outside of the building, we should only expect standard installs -# The v007-specific installs are listed beside their find_package calls below: -find_package(Boost 1.59.0 REQUIRED) +find_package(Boost 1.59.0 REQUIRED atomic + log + regex + log_setup + serialization + chrono + math_c99 + signals + container + math_c99f + context + math_c99l + system + math_tr1 + math_tr1f + math_tr1l + test_exec_monitor + date_time + thread + exception + timer + filesystem + prg_exec_monitor + program_options + unit_test_framework + iostreams + wave + random + wserialization) + +find_package(ale REQUIRED) +find_package(Json REQUIRED) find_package(Bullet 2.86 REQUIRED) find_package(Cholmod 4.4.5 REQUIRED) find_package(CSPICE 65 REQUIRED) @@ -231,16 +267,17 @@ find_package(Eigen REQUIRED) find_package(Embree 2.15.0 REQUIRED) find_package(GeoTIFF 2 REQUIRED) find_package(GMM 5.0 REQUIRED) -find_package(GSL 19 REQUIRED) +SET(GSL_ROOT_DIR $ENV{CONDA_PREFIX}) +find_package(GSL 2.2.1 REQUIRED) find_package(HDF5 1.8.15 REQUIRED) find_package(Jama 125 REQUIRED) find_package(NN REQUIRED) find_package(OpenCV 3.1.0 REQUIRED) -find_package(PCL 1.8 REQUIRED) +find_package(PCL REQUIRED) find_package(Protobuf 2.6.1 REQUIRED) find_package(Qwt 6 REQUIRED) find_package(SuperLU 4.3 REQUIRED) -find_package(TIFF 4.0.5 REQUIRED) +find_package(TIFF 4.0.0 REQUIRED) find_package(TNT 126 REQUIRED) find_package(XercesC 3.1.2 REQUIRED) find_package(X11 6 REQUIRED) @@ -254,7 +291,7 @@ find_package(Threads) # In this case, we specify the version numbers being searched for in the non-traditional installs. if(APPLE) -find_package(OpenGL REQUIRED) + find_package(OpenGL REQUIRED) endif(APPLE) if(pybindings) @@ -271,7 +308,6 @@ set(ALLINCDIRS "") # Get all include dir variables foreach (_variableName ${_variableNames}) -#message("VAR=${_variableName}") if (_variableName MATCHES ".+_INCLUDE_DIR$") list(APPEND ALLINCDIRS "${${_variableName}}") elseif (_variableName MATCHES ".+_INCLUDE_PATH$") @@ -283,9 +319,6 @@ endforeach() foreach (_variableName ${_variableNames}) get_filename_component(LIBDIR "${${_variableName}}" DIRECTORY) if (_variableName MATCHES "^CMAKE+") - elseif (_variableName MATCHES ".+_LIB$") - list(APPEND ALLLIBDIRS "${LIBDIR}") - list(APPEND ALLLIBS "${${_variableName}}") elseif (_variableName MATCHES ".+_LIBRARY$") list(APPEND ALLLIBDIRS "${LIBDIR}") list(APPEND ALLLIBS "${${_variableName}}") @@ -392,9 +425,13 @@ install(CODE "EXECUTE_PROCESS(COMMAND rm -f ${CMAKE_INSTALL_PREFIX}/lib/libisis3 install(CODE "EXECUTE_PROCESS(COMMAND rm -f ${CMAKE_INSTALL_PREFIX}/lib/libisis3.6${SO})") install(CODE "EXECUTE_PROCESS(COMMAND rm -f ${CMAKE_INSTALL_PREFIX}/lib/libisis3.${SO})") EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/TestPreferences ${CMAKE_BINARY_DIR}/) -install(CODE "EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/src/base/objs/Preference/TestPreferences ${CMAKE_INSTALL_PREFIX}/)") install(CODE "EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/IsisPreferences ${CMAKE_INSTALL_PREFIX}/)") +# Install the header files +install(CODE "EXECUTE_PROCESS(COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX}/include/isis3)") +file(GLOB ISIS_INCLUDE_FILES ${CMAKE_BINARY_DIR}/inc/*) +install(CODE "EXECUTE_PROCESS(COMMAND cp -fv ${ISIS_INCLUDE_FILES} ${CMAKE_INSTALL_PREFIX}/include/isis3)") + # Delete any existing plugin files in the build folder so they # don't get filled with duplicate entries. file(GLOB existingPlugins "${CMAKE_BINARY_DIR}/plugins/*.plugin") @@ -406,19 +443,44 @@ endif() file(WRITE "${CMAKE_BINARY_DIR}/qt.conf" "[Paths]\nPlugins=../3rdParty/plugins/\n") install(FILES "${CMAKE_BINARY_DIR}/qt.conf" DESTINATION ${CMAKE_INSTALL_PREFIX}/bin/xml) -#Create the inc directory +# Create the inc directory execute_process(COMMAND mkdir -p ${CMAKE_BINARY_DIR}/inc) # Create an xml folder in the source directory that we will need later set(sourceXmlFolder ${CMAKE_BINARY_DIR}/bin/xml) execute_process(COMMAND mkdir -p ${CMAKE_BINARY_DIR}/bin/xml) -# Set up install of the templates folder. -install(DIRECTORY ${CMAKE_SOURCE_DIR}/templates DESTINATION .) +# Create the version file +configure_file(${CMAKE_SOURCE_DIR}/cmake/version.in ${CMAKE_BINARY_DIR}/version) # Set up install of the make folder. install(DIRECTORY ${CMAKE_SOURCE_DIR}/make DESTINATION ${CMAKE_INSTALL_PREFIX}) +# Set up install of appdata folder +install(DIRECTORY ${CMAKE_BINARY_DIR}/appdata DESTINATION ${CMAKE_INSTALL_PREFIX}) + +# Create the appdata directory with translations directory, images directory, templates directories +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/appdata/translations + ${CMAKE_BINARY_DIR}/appdata/templates/apollo + ${CMAKE_BINARY_DIR}/appdata/templates/autoseed + ${CMAKE_BINARY_DIR}/appdata/templates/autoreg + ${CMAKE_BINARY_DIR}/appdata/templates/noproj + ${CMAKE_BINARY_DIR}/appdata/templates/cnetref + ${CMAKE_BINARY_DIR}/appdata/templates/cnetstats + ${CMAKE_BINARY_DIR}/appdata/templates/cnet_validmeasure + ${CMAKE_BINARY_DIR}/appdata/templates/controlnetworks + ${CMAKE_BINARY_DIR}/appdata/templates/hidtmgen + ${CMAKE_BINARY_DIR}/appdata/templates/findfeatures + ${CMAKE_BINARY_DIR}/appdata/templates/fullcnetdiff + ${CMAKE_BINARY_DIR}/appdata/templates/jigsaw + ${CMAKE_BINARY_DIR}/appdata/templates/kernels + ${CMAKE_BINARY_DIR}/appdata/templates/labels + ${CMAKE_BINARY_DIR}/appdata/templates/maps + ${CMAKE_BINARY_DIR}/appdata/templates/photometry + ${CMAKE_BINARY_DIR}/appdata/images/icons + ${CMAKE_BINARY_DIR}/appdata/images/targets) + + # Have CMake process all of the source code and tests. add_subdirectory(src objects) @@ -447,6 +509,90 @@ add_custom_target(incs ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/src/*/apps/*/*.h ${CMAKE_BINARY_DIR}/inc) add_dependencies(isis3 incs) +# Add custom build target to copy modified translation files to the build/appdata/translations +## directory. +add_custom_target(appdata ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/serialnumbers/*.trn ${CMAKE_SOURCE_DIR}/appdata/translations/*.trn + ${CMAKE_SOURCE_DIR}/appdata/translations/*.typ ${CMAKE_SOURCE_DIR}/src/*/apps/*/*.typ + ${CMAKE_SOURCE_DIR}/src/*/apps/*/*.trn ${CMAKE_SOURCE_DIR}/src/*/apps/*/*.pft + ${CMAKE_SOURCE_DIR}/src/*/apps/*/*.def ${CMAKE_SOURCE_DIR}/appdata/translations/*.def + ${CMAKE_SOURCE_DIR}/appdata/translations/*.pvl + ${CMAKE_BINARY_DIR}/appdata/translations) +add_dependencies(isis3 appdata) + +# Add custom build targets to copy modified template files to build/appdata/templates +add_custom_target(apollotemplate ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/src/*/templates/*.def ${CMAKE_BINARY_DIR}/appdata/templates/apollo/) +add_dependencies(isis3 apollotemplate) + +add_custom_target(autoreg ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/autoreg/* ${CMAKE_BINARY_DIR}/appdata/templates/autoreg/) +add_dependencies(isis3 autoreg) + +add_custom_target(autoseed ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/autoseed/* ${CMAKE_BINARY_DIR}/appdata/templates/autoseed/) + +add_custom_target(noproj ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/noproj/* ${CMAKE_BINARY_DIR}/appdata/templates/noproj/) +add_dependencies(isis3 noproj) + +add_custom_target(cnetref ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/cnetref/* ${CMAKE_BINARY_DIR}/appdata/templates/cnetref/) +add_dependencies(isis3 cnetref) + +add_custom_target(cnetstats ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/cnetstats/* ${CMAKE_BINARY_DIR}/appdata/templates/cnetstats/) +add_dependencies(isis3 cnetstats) + +add_custom_target(cnetvalid ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/cnet_validmeasure/* ${CMAKE_BINARY_DIR}/appdata/templates/cnet_validmeasure/) +add_dependencies(isis3 cnetvalid) + +add_custom_target(controlnetworks ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/controlnetworks/* ${CMAKE_BINARY_DIR}/appdata/templates/controlnetworks/) +add_dependencies(isis3 controlnetworks) + +add_custom_target(findfeatures ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/findfeatures/* ${CMAKE_BINARY_DIR}/appdata/templates/findfeatures/) +add_dependencies(isis3 findfeatures) + +add_custom_target(fullcnetdiff ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/fullcnetdiff/* ${CMAKE_BINARY_DIR}/appdata/templates/fullcnetdiff/) +add_dependencies(isis3 fullcnetdiff) + +add_custom_target(jigsaw ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/jigsaw/* ${CMAKE_BINARY_DIR}/appdata/templates/jigsaw/) +add_dependencies(isis3 jigsaw) + +add_custom_target(kernels ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/kernels/* ${CMAKE_BINARY_DIR}/appdata/templates/kernels/) +add_dependencies(isis3 kernels) + +add_custom_target(photometry ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/photometry/* ${CMAKE_BINARY_DIR}/appdata/templates/photometry/) +add_dependencies(isis3 photometry) + +add_custom_target(icons ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/images/icons/* ${CMAKE_SOURCE_DIR}/appdata/images/icons/licenses/* + ${CMAKE_BINARY_DIR}/appdata/images/icons) +add_dependencies(isis3 icons) + +add_custom_target(targets ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/images/targets/* ${CMAKE_BINARY_DIR}/appdata/images/targets) +add_dependencies(isis3 targets) + +add_custom_target(maps ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/maps/* ${CMAKE_BINARY_DIR}/appdata/templates/maps) +add_dependencies(isis3 maps) + +add_custom_target(labels ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/labels/* ${CMAKE_BINARY_DIR}/appdata/templates/labels) +add_dependencies(isis3 labels) + +add_custom_target(hidtmgen ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/appdata/templates/hidtmgen/* ${CMAKE_BINARY_DIR}/appdata/templates/hidtmgen/) +add_dependencies(isis3 hidtmgen) + # Add a custom build target to clean out everything that gets added to the source # directory during the build process. # - Only a few things are added in order to make the tests work properly so @@ -456,14 +602,13 @@ add_custom_target(clean_source COMMAND rm -rf "${CMAKE_BINARY_DIR}/*" "${CMAKE_I # Set up a few top level files for installation. EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/IsisPreferences ${CMAKE_BINARY_DIR}) EXECUTE_PROCESS(COMMAND cp -rf ${CMAKE_SOURCE_DIR}/scripts ${CMAKE_BINARY_DIR}) -EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/../LICENSE.txt ${CMAKE_BINARY_DIR}) -EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/version ${CMAKE_BINARY_DIR}) +EXECUTE_PROCESS(COMMAND cp -f ${CMAKE_SOURCE_DIR}/../LICENSE.md ${CMAKE_BINARY_DIR}) EXECUTE_PROCESS(COMMAND cp -rf ${CMAKE_SOURCE_DIR}/make ${CMAKE_BINARY_DIR}) # Copy the files on make install as well install(FILES ${CMAKE_SOURCE_DIR}/IsisPreferences DESTINATION ${CMAKE_INSTALL_PREFIX}) -install(FILES ${CMAKE_SOURCE_DIR}/../LICENSE.txt DESTINATION ${CMAKE_INSTALL_PREFIX}) -install(FILES ${CMAKE_SOURCE_DIR}/version DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${CMAKE_SOURCE_DIR}/../LICENSE.md DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${CMAKE_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_PREFIX}) install(DIRECTORY ${CMAKE_SOURCE_DIR}/scripts DESTINATION ${CMAKE_INSTALL_PREFIX}) # Trigger all post-install behavior. diff --git a/isis/IsisPreferences b/isis/IsisPreferences index 1baf020611..70e0d4d324 100644 --- a/isis/IsisPreferences +++ b/isis/IsisPreferences @@ -175,41 +175,45 @@ EndGroup ######################################################## Group = DataDirectory - Apollo15 = $ISIS3DATA/apollo15 - Apollo16 = $ISIS3DATA/apollo16 - Apollo17 = $ISIS3DATA/apollo17 - Base = $ISIS3DATA/base - Cassini = $ISIS3DATA/cassini - Chan1 = $ISIS3DATA/chan1 - Chandrayaan1 = $ISIS3DATA/chandrayaan1 - Clementine1 = $ISIS3DATA/clementine1 - Control = $ISIS3DATA/control - Dawn = $ISIS3DATA/dawn - Galileo = $ISIS3DATA/galileo - Hayabusa = $ISIS3DATA/hayabusa - Hayabusa2 = /usgs/cpkgs/isis3/datalocal/hayabusa2/ - Juno = $ISIS3DATA/juno - Kaguya = $ISIS3DATA/kaguya - Lo = $ISIS3DATA/lo - Lro = $ISIS3DATA/lro - Mariner10 = $ISIS3DATA/mariner10 - Mer = $ISIS3DATA/mer - Mex = $ISIS3DATA/mex - Messenger = $ISIS3DATA/messenger - Mgs = $ISIS3DATA/mgs - Mro = $ISIS3DATA/mro - Near = $ISIS3DATA/near - NewHorizons = $ISIS3DATA/newhorizons - Odyssey = $ISIS3DATA/odyssey - OsirisRex = $ISIS3DATA/../datalocal/osirisrex - Rolo = $ISIS3DATA/rolo - Rosetta = $ISIS3DATA/rosetta - Smart1 = $ISIS3DATA/smart1 - Tgo = $ISIS3DATA/tgo - Viking1 = $ISIS3DATA/viking1 - Viking2 = $ISIS3DATA/viking2 - Voyager1 = $ISIS3DATA/voyager1 - Voyager2 = $ISIS3DATA/voyager2 +# Backwards compatability for versions prior to 4.1.0 + ISIS3DATA = $ISISDATA + + Apollo15 = $ISISDATA/apollo15 + Apollo16 = $ISISDATA/apollo16 + Apollo17 = $ISISDATA/apollo17 + Base = $ISISDATA/base + Cassini = $ISISDATA/cassini + Chan1 = $ISISDATA/chan1 + Chandrayaan1 = $ISISDATA/chandrayaan1 + Clementine1 = $ISISDATA/clementine1 + Clipper = $ISISDATA/../datalocal/clipper + Control = $ISISDATA/control + Dawn = $ISISDATA/dawn + Galileo = $ISISDATA/galileo + Hayabusa = $ISISDATA/hayabusa + Hayabusa2 = $ISISDATA/hayabusa2 + Juno = $ISISDATA/juno + Kaguya = $ISISDATA/kaguya + Lo = $ISISDATA/lo + Lro = $ISISDATA/lro + Mariner10 = $ISISDATA/mariner10 + Mer = $ISISDATA/mer + Mex = $ISISDATA/mex + Messenger = $ISISDATA/messenger + Mgs = $ISISDATA/mgs + Mro = $ISISDATA/mro + Near = $ISISDATA/near + NewHorizons = $ISISDATA/newhorizons + Odyssey = $ISISDATA/odyssey + OsirisRex = $ISISDATA/../datalocal/osirisrex + Rolo = $ISISDATA/rolo + Rosetta = $ISISDATA/rosetta + Smart1 = $ISISDATA/smart1 + Tgo = $ISISDATA/tgo + Viking1 = $ISISDATA/viking1 + Viking2 = $ISISDATA/viking2 + Voyager1 = $ISISDATA/voyager1 + Voyager2 = $ISISDATA/voyager2 Temporary = . EndGroup diff --git a/isis/TestPreferences b/isis/TestPreferences index ed45b979d5..663d4de2f0 100644 --- a/isis/TestPreferences +++ b/isis/TestPreferences @@ -175,41 +175,42 @@ EndGroup ######################################################## Group = DataDirectory - Apollo15 = $ISIS3DATA/apollo15 - Apollo16 = $ISIS3DATA/apollo16 - Apollo17 = $ISIS3DATA/apollo17 - Base = $ISIS3DATA/base - Cassini = $ISIS3DATA/cassini - Chan1 = $ISIS3DATA/chan1 - Chandrayaan1 = $ISIS3DATA/chandrayaan1 - Clementine1 = $ISIS3DATA/clementine1 - Control = $ISIS3DATA/control - Dawn = $ISIS3DATA/dawn - Galileo = $ISIS3DATA/galileo - Hayabusa = $ISIS3DATA/hayabusa - Hayabusa2 = $ISIS3DATA/../datalocal/hayabusa2 - Juno = $ISIS3DATA/juno - Kaguya = $ISIS3DATA/kaguya - Lo = $ISIS3DATA/lo - Lro = $ISIS3DATA/lro - Mariner10 = $ISIS3DATA/mariner10 - Mer = $ISIS3DATA/mer - Mex = $ISIS3DATA/mex - Messenger = $ISIS3DATA/messenger - Mgs = $ISIS3DATA/mgs - Mro = $ISIS3DATA/mro - Near = $ISIS3DATA/near - NewHorizons = $ISIS3DATA/newhorizons - Odyssey = $ISIS3DATA/odyssey - OsirisRex = $ISIS3DATA/../datalocal/osirisrex - Rolo = $ISIS3DATA/rolo - Rosetta = $ISIS3DATA/rosetta - Smart1 = $ISIS3DATA/smart1 - Tgo = $ISIS3DATA/tgo - Viking1 = $ISIS3DATA/viking1 - Viking2 = $ISIS3DATA/viking2 - Voyager1 = $ISIS3DATA/voyager1 - Voyager2 = $ISIS3DATA/voyager2 + Apollo15 = $ISISDATA/apollo15 + Apollo16 = $ISISDATA/apollo16 + Apollo17 = $ISISDATA/apollo17 + Base = $ISISDATA/base + Cassini = $ISISDATA/cassini + Chan1 = $ISISDATA/chan1 + Chandrayaan1 = $ISISDATA/chandrayaan1 + Clementine1 = $ISISDATA/clementine1 + Clipper = $ISISDATA/../datalocal/clipper + Control = $ISISDATA/control + Dawn = $ISISDATA/dawn + Galileo = $ISISDATA/galileo + Hayabusa = $ISISDATA/hayabusa + Hayabusa2 = $ISISDATA/hayabusa2 + Juno = $ISISDATA/juno + Kaguya = $ISISDATA/kaguya + Lo = $ISISDATA/lo + Lro = $ISISDATA/lro + Mariner10 = $ISISDATA/mariner10 + Mer = $ISISDATA/mer + Mex = $ISISDATA/mex + Messenger = $ISISDATA/messenger + Mgs = $ISISDATA/mgs + Mro = $ISISDATA/mro + Near = $ISISDATA/near + NewHorizons = $ISISDATA/newhorizons + Odyssey = $ISISDATA/odyssey + OsirisRex = $ISISDATA/../datalocal/osirisrex + Rolo = $ISISDATA/rolo + Rosetta = $ISISDATA/rosetta + Smart1 = $ISISDATA/smart1 + Tgo = $ISISDATA/tgo + Viking1 = $ISISDATA/viking1 + Viking2 = $ISISDATA/viking2 + Voyager1 = $ISISDATA/voyager1 + Voyager2 = $ISISDATA/voyager2 Temporary = . EndGroup diff --git a/isis/appdata/autoreg/coreg.adaptgruen.p1515s3030.def b/isis/appdata/autoreg/coreg.adaptgruen.p1515s3030.def new file mode 100644 index 0000000000..0519b54127 --- /dev/null +++ b/isis/appdata/autoreg/coreg.adaptgruen.p1515s3030.def @@ -0,0 +1,256 @@ + Object = AutoRegistration + Group = Algorithm + # This is the adaptive gruen algorithm, which provides adaptive image + # (chip) registration using an Affine transform to iteratively adjust + # the search chip at each iteration. Each iteration solves for new + # adjustments to the Affine transform until the 6 affine parameters + # fall below the tolerances as specified by the following parameters. + #REQUIRED + Name = AdaptiveGruen + + # The tolerance for the goodness-of-fit. For the + # AdaptiveGruen algorithm, the goodness-of-fit value must + # be less than Tolerance before the algorithm is considered + # to have converged to a user-acceptable solution. + #Possible Values: [0,infinity) + #REQUIRED + Tolerance = 0.1 + + # The Maximum number of iterations the algorithm is allowed to perform + # in an attempt to converge before failing and returning no registration. + #Possible Values: [1,infinity), integer + #REQUIRED + MaximumIterations = 30 + + # The AffineTolerance specifies the amount of offset in pixels an affine + # derived point is allowed to deviate from the orginal match point. + #Possible Values: [0,infinity) + #OPTIONAL + AffineTolerance = 5.0 + + # The AffineTranslationTolerance specifies the threshold convergence value + # of the affine translation shift in line/sample between each Gruen match + # iteration. If the amount of affine translation computed in the Gruen + # algorithm is less than the AffineTranslationTolerance, that point is + # deemed a match point for the purposes of the translation portion of the + # registered point. + #Possible Values: [0,infinity) + #OPTIONAL + AffineTranslationTolerance = 0.2 + + # The AffineScaleTolerance specifies the threshold convergence value of the + # affine scale in line/sample between each Gruen match iteration. If the + # amount of the affine translation computed in the Gruen algorithm is + # less than the AffineScaleTolerance, that point is deemed a match point + # for the purposes of the scaling portion of the registered point. + #Possible Values: [0,infinity) + #OPTIONAL + AffineScaleTolerance = 0.7 + + # The AffineShearTolerance specifies the threshold convergence value of the + # affine scale in line/sample between each Gruen match iteration. If the + # amount of the affine translation computed in the Gruen algorithm is + # less than the AffineShearTolerance, that point is deemed a match point + # for the purposes of the shear portion of the registered point. + #Possible Values: [0,infinity) + #OPTIONAL + #AffineShearTolerance = 0.7 + + #The SpiceTolerance defines the amount of offset in pixels a registration + # is allowed to deviate from a registered point. + #Possible Values: [0,infinity) + #OPTIONAL + #SpiceTolerance = 7.0 + + #The RadioShiftTolerance specifies the threshold convergence value for the + # radiometric shift of the pixel value between each Gruen match iteration. + # If the amount of the radiometric shift computed in the Gruen algorithm is + # less than the RadioShiftTolerance, that point is deemed a match point + # for the purposes of the radiometric shift portion of the registered point. + # This tolerance value depends heavily on the radiometric properties of + # your images. + #Possible Values: (-infinity,infinity) + #OPTIONAL + #RadioShiftTolerance = 256 + + #The RadioGainMinTolerance specifies the minimum value for the + # radiometric gain of the pixel value between each Gruen match iteration. + # If the amount of the radiometric gain computed in the Gruen algorithm is + # greater than the RadioGainMinTolerance and is less than + # RadioGainMaxTolerance, that point is deemed a match point for the + # purposes of the radiometric gain portion of the registered point. + # This tolerance value depends heavily on the radiometric properties of + # your images. + #Possible Values: (-infinity,infinity) + #OPTIONAL + #RadioGainMinTolerance = -0.75 + + #The RadioGainMaxTolerance specifies the maximum value for the + # radiometric gain of the pixel value between each Gruen match iteration. + # If the amount of the radiometric gain computed in the Gruen algorithm is + # greater than the RadioGainMinTolerance and is less than + # RadioGainMaxTolerance, that point is deemed a match point for the + # purposes of the radiometric gain portion of the registered point. + # This tolerance value depends heavily on the radiometric properties of + # your images. + #Possible Values: (-infinity,infinity) + #OPTIONAL + #RadioGainMaxTolerance = 3.0 + + #FitChipScale = 0.1 + + #The DefaultRadioShift sets the default value for the radiometric shift + # value used as a starting point in the Gruen algorithm. + #Possible Values: (-infinity,infinity) + #OPTIONAL + #DefaultRadioShift = 0.0 + + #The DefaultRadioGain sets the default value for the radiometric gain + # value used as a starting point in the Gruen algorithm. + #Possible Values: (-infinity,infinity) + #OPTIONAL + #DefaultRadioGain = 0.0 + + # Calculate the registration to subpixel accuracy. This is a + # boolean (True or False). + #Possible Values: {True, False} + #OPTIONAL + #SubPixelAccuracy = True + + # Reduce the size of of the Pattern and Search chips by a + # the ReductionFactor for a first-run through the data + # to find a low-accuracy match. Then focus the + # full-accuracy match to the surrounding area. + #Possible Values: Natural Numbers + #OPTIONAL + #ReductionFactor = 1 + + # Apply a Sobel gradient filter to the chips before running the + # pattern matching Algorithm. This essentially highlights + # edges within the chips, possibly increasing the chance of + # finding a good match between the search and pattern chips. + #Possible Values: {None, Sobel} + #OPTIONAL + #Gradient = None + + # If the two images to be registered do not have the same + # geometry, pattern matching becomes more difficult. This + # option informs the algorithm to warp the pattern cube to + # match the geometry of the search cube by using map + # projections and/or camera models. The warping requires + # interpolation, and the type of interpolation is chosen here. + #Possible Values: {NearestNeighborType, BiLinearType, CubicConvolutionType} + #OPTIONAL + #ChipInterpolator = NearestNeighborType + EndGroup + + #Pattern Chip Definitions + Group = PatternChip + #Size of the PatternChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 15 + Lines = 15 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The MinimumZScore is used to guarantee that the pattern chip has + # enough variability--if the chip is too smooth, spurious matches + # are likely to occur. + #Possible Values: (0.0,infinity) + #OPTIONAL + #MinimumZScore = 1.0 + + #The ValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the chip before the chip is + # considered invalid and the match fails. + #Possible Values: (0.0,100.0] + #OPTIONAL + #ValidPercent = 50.0 + EndGroup + + #Search Chip Definitions + Group = SearchChip + #Size of the SearchChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 30 + Lines = 30 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The SubchipValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the subchip before it is + # considered invalid and the match fails. + #Possible Values: (0.0, 100.0] + #OPTIONAL + #SubchipValidPercent = 50.0 + EndGroup + + #If the SubPixelAccuracy parameter is TRUE, then a continuous surface + # based on the fit chip is generated. A least squares fit is then used + # to estimate the true registration position (likely to be between pixels). + Group = SurfaceModel + #The result of a sub-pixel accuracy computation is likely to move + # the result away from its original whole-pixel fit. However, + # sometimes the move could be so drastic that it calls into + # question the validity of the match. This tolerance value + # thus specifies the max number of pixels the sub-pixel accuracy + # computation can move the best fit before the registration is rejected + # entirely. + #Possible Values (0.0, infinity) + #OPTIONAL + #DistanceTolerance = 1.5 + + #When refining a whole-pixel match to sub-pixel accuracy, it is important + # to consider how much area around that best whole-pixel fit to sample + # for constructing a surface model. The WindowSize keyword defines the + # size of the window, centered on the best whole-pixel match, that will + # be used for modelling the surface. Values for WindowSize specify the + # N of an NxN chip, and must be odd numbers greater than or equal to 3. + #Possible Values: [3, infinity), odd integer + #OPTIONAL + #WindowSize = 5 + + #After the least squares fit is performed to model a surface, the + # ideal result is a circular formation of goodness-of-fit values + # improving towards the center of the surface. The less circular, + # or more "eccentric", the formation of goodness-of-fit values, + # the less likely the modelling result is accurate. The + # conditions under which a high ratio occurs is when there are + # primiarily linear features in the search and pattern chips. + # In an attempt to let the user define what constitutes a tolerable + # amount of eccentricity in their surface models, we introduce the + # notion of an "Eccentricity Ratio". Here we think of eccentricity + # as a ratio between the semi-major and semi-minor axes of an ellipse. + #Possible Values [1.0, infinity] + #OPTIONAL + #EccentricityRatio = 1.0 + + #The least squares fit performed to construct the surface model + # takes discrete data from the whole-pixels around the best-fit. + # When these discrete data are fit with a continuous function, + # there is likely going to be some amount of error between the + # original value for some pixel and its interpolated value in the + # least squares solution. The ResidualTolerance keyword thus + # allows the user to specify the maximum average residual, or + # mean absolute error, for all pixels in the surface model area, + # that will be tolerated before the sub-pixel accuracy computation + # is rejected and the registration fails for that point. + #Possible Values: [0.0, infinity] + #OPTIONAL + #ResidualTolerance = 0.0 + EndGroup + EndObject diff --git a/isis/appdata/autoreg/coreg.maxcor.p1515.s3030.def b/isis/appdata/autoreg/coreg.maxcor.p1515.s3030.def new file mode 100644 index 0000000000..03c84ab9b1 --- /dev/null +++ b/isis/appdata/autoreg/coreg.maxcor.p1515.s3030.def @@ -0,0 +1,163 @@ + Object = AutoRegistration + # Algorithm specification. + Group = Algorithm + + # This is the maximum correlation algorithm, which + # computes the correlation coefficient, -1.0 <= R <= 1.0 + # between the pattern chip and sub-region of the search chip. + # The goodness-of-fit is defined as the absolute value + # of R. + #REQUIRED + Name = MaximumCorrelation + + # The tolerance for the goodness-of-fit. For the + # MaximumCorrelation algorithm, the goodness-of-fit value must + # be greater than Tolerance, before the algorithm is considered + # to have converged to a user-acceptable solution. + #Possible Values: [0,1.0) + #REQUIRED + Tolerance = 0.7 + + # Calculate the registration to subpixel accuracy. This is a + # boolean (True or False). + #Possible Values: {True, False} + #OPTIONAL + #SubPixelAccuracy = True + + # Reduce the size of of the Pattern and Search chips by a + # the ReductionFactor for a first-run through the data + # to find a low-accuracy match. Then focus the + # full-accuracy match to the surrounding area. + #Possible Values: Natural Numbers + #OPTIONAL + #ReductionFactor = 1 + + # Apply a Sobel gradient filter to the chips before running the + # pattern matching Algorithm. This essentially highlights + # edges within the chips, possibly increasing the chance of + # finding a good match between the search and pattern chips. + #Possible Values: {None, Sobel} + #OPTIONAL + #Gradient = None + + # If the two images to be registered do not have the same + # geometry, pattern matching becomes more difficult. This + # option informs the algorithm to warp the pattern cube to + # match the geometry of the search cube by using map + # projections and/or camera models. The warping requires + # interpolation, and the type of interpolation is chosen here. + #Possible Values: {NearestNeighborType, BiLinearType, CubicConvolutionType} + #OPTIONAL + #ChipInterpolator = NearestNeighborType + EndGroup + + #Pattern Chip Definitions + Group = PatternChip + #Size of the PatternChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 15 + Lines = 15 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The MinimumZScore is used to guarantee that the pattern chip has + # enough variability--if the chip is too smooth, spurious matches + # are likely to occur. + #Possible Values: (0.0,infinity) + #OPTIONAL + #MinimumZScore = 1.0 + + #The ValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the chip before the chip is + # considered invalid and the match fails. + #Possible Values: (0.0,100.0] + #OPTIONAL + #ValidPercent = 50.0 + EndGroup + + #Search Chip Definitions + Group = SearchChip + #Size of the SearchChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 30 + Lines = 30 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The SubchipValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the subchip before it is + # considered invalid and the match fails. + #Possible Values: (0.0, 100.0] + #OPTIONAL + #SubchipValidPercent = 50.0 + EndGroup + + #If the SubPixelAccuracy parameter is TRUE, then a continuous surface + # based on the fit chip is generated. A least squares fit is then used + # to estimate the true registration position (likely to be between pixels). + Group = SurfaceModel + #The result of a sub-pixel accuracy computation is likely to move + # the result away from its original whole-pixel fit. However, + # sometimes the move could be so drastic that it calls into + # question the validity of the match. This tolerance value + # thus specifies the max number of pixels the sub-pixel accuracy + # computation can move the best fit before the registration is rejected + # entirely. + #Possible Values (0.0, infinity) + #OPTIONAL + #DistanceTolerance = 1.5 + + #When refining a whole-pixel match to sub-pixel accuracy, it is important + # to consider how much area around that best whole-pixel fit to sample + # for constructing a surface model. The WindowSize keyword defines the + # size of the window, centered on the best whole-pixel match, that will + # be used for modelling the surface. Values for WindowSize specify the + # N of an NxN chip, and must be odd numbers greater than or equal to 3. + #Possible Values: [3, infinity), odd integer + #OPTIONAL + #WindowSize = 5 + + #After the least squares fit is performed to model a surface, the + # ideal result is a circular formation of goodness-of-fit values + # improving towards the center of the surface. The less circular, + # or more "eccentric", the formation of goodness-of-fit values, + # the less likely the modelling result is accurate. The + # conditions under which a high ratio occurs is when there are + # primiarily linear features in the search and pattern chips. + # In an attempt to let the user define what constitutes a tolerable + # amount of eccentricity in their surface models, we introduce the + # notion of an "Eccentricity Ratio". Here we think of eccentricity + # as a ratio between the semi-major and semi-minor axes of an ellipse. + #Possible Values [1.0, infinity] + #OPTIONAL + #EccentricityRatio = 1.0 + + #The least squares fit performed to construct the surface model + # takes discrete data from the whole-pixels around the best-fit. + # When these discrete data are fit with a continuous function, + # there is likely going to be some amount of error between the + # original value for some pixel and its interpolated value in the + # least squares solution. The ResidualTolerance keyword thus + # allows the user to specify the maximum average residual, or + # mean absolute error, for all pixels in the surface model area, + # that will be tolerated before the sub-pixel accuracy computation + # is rejected and the registration fails for that point. + #Possible Values: [0.0, infinity] + #OPTIONAL + #ResidualTolerance = 0.0 + EndGroup + EndObject diff --git a/isis/appdata/autoreg/coreg.maxcor.p2020.s5050.def b/isis/appdata/autoreg/coreg.maxcor.p2020.s5050.def new file mode 100644 index 0000000000..216c11d377 --- /dev/null +++ b/isis/appdata/autoreg/coreg.maxcor.p2020.s5050.def @@ -0,0 +1,163 @@ + Object = AutoRegistration + # Algorithm specification. + Group = Algorithm + + # This is the maximum correlation algorithm, which + # computes the correlation coefficient, -1.0 <= R <= 1.0 + # between the pattern chip and sub-region of the search chip. + # The goodness-of-fit is defined as the absolute value + # of R. + #REQUIRED + Name = MaximumCorrelation + + # The tolerance for the goodness-of-fit. For the + # MaximumCorrelation algorithm, the goodness-of-fit value must + # be greater than Tolerance, before the algorithm is considered + # to have converged to a user-acceptable solution. + #Possible Values: [0,1.0) + #REQUIRED + Tolerance = 0.7 + + # Calculate the registration to subpixel accuracy. This is a + # boolean (True or False). + #Possible Values: {True, False} + #OPTIONAL + #SubPixelAccuracy = True + + # Reduce the size of of the Pattern and Search chips by a + # the ReductionFactor for a first-run through the data + # to find a low-accuracy match. Then focus the + # full-accuracy match to the surrounding area. + #Possible Values: Natural Numbers + #OPTIONAL + #ReductionFactor = 1 + + # Apply a Sobel gradient filter to the chips before running the + # pattern matching Algorithm. This essentially highlights + # edges within the chips, possibly increasing the chance of + # finding a good match between the search and pattern chips. + #Possible Values: {None, Sobel} + #OPTIONAL + #Gradient = None + + # If the two images to be registered do not have the same + # geometry, pattern matching becomes more difficult. This + # option informs the algorithm to warp the pattern cube to + # match the geometry of the search cube by using map + # projections and/or camera models. The warping requires + # interpolation, and the type of interpolation is chosen here. + #Possible Values: {NearestNeighborType, BiLinearType, CubicConvolutionType} + #OPTIONAL + #ChipInterpolator = NearestNeighborType + EndGroup + + #Pattern Chip Definitions + Group = PatternChip + #Size of the PatternChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 20 + Lines = 20 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The MinimumZScore is used to guarantee that the pattern chip has + # enough variability--if the chip is too smooth, spurious matches + # are likely to occur. + #Possible Values: (0.0,infinity) + #OPTIONAL + #MinimumZScore = 1.0 + + #The ValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the chip before the chip is + # considered invalid and the match fails. + #Possible Values: (0.0,100.0] + #OPTIONAL + #ValidPercent = 50.0 + EndGroup + + #Search Chip Definitions + Group = SearchChip + #Size of the SearchChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 50 + Lines = 50 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The SubchipValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the subchip before it is + # considered invalid and the match fails. + #Possible Values: (0.0, 100.0] + #OPTIONAL + #SubchipValidPercent = 50.0 + EndGroup + + #If the SubPixelAccuracy parameter is TRUE, then a continuous surface + # based on the fit chip is generated. A least squares fit is then used + # to estimate the true registration position (likely to be between pixels). + Group = SurfaceModel + #The result of a sub-pixel accuracy computation is likely to move + # the result away from its original whole-pixel fit. However, + # sometimes the move could be so drastic that it calls into + # question the validity of the match. This tolerance value + # thus specifies the max number of pixels the sub-pixel accuracy + # computation can move the best fit before the registration is rejected + # entirely. + #Possible Values (0.0, infinity) + #OPTIONAL + #DistanceTolerance = 1.5 + + #When refining a whole-pixel match to sub-pixel accuracy, it is important + # to consider how much area around that best whole-pixel fit to sample + # for constructing a surface model. The WindowSize keyword defines the + # size of the window, centered on the best whole-pixel match, that will + # be used for modelling the surface. Values for WindowSize specify the + # N of an NxN chip, and must be odd numbers greater than or equal to 3. + #Possible Values: [3, infinity), odd integer + #OPTIONAL + #WindowSize = 5 + + #After the least squares fit is performed to model a surface, the + # ideal result is a circular formation of goodness-of-fit values + # improving towards the center of the surface. The less circular, + # or more "eccentric", the formation of goodness-of-fit values, + # the less likely the modelling result is accurate. The + # conditions under which a high ratio occurs is when there are + # primiarily linear features in the search and pattern chips. + # In an attempt to let the user define what constitutes a tolerable + # amount of eccentricity in their surface models, we introduce the + # notion of an "Eccentricity Ratio". Here we think of eccentricity + # as a ratio between the semi-major and semi-minor axes of an ellipse. + #Possible Values [1.0, infinity] + #OPTIONAL + #EccentricityRatio = 1.0 + + #The least squares fit performed to construct the surface model + # takes discrete data from the whole-pixels around the best-fit. + # When these discrete data are fit with a continuous function, + # there is likely going to be some amount of error between the + # original value for some pixel and its interpolated value in the + # least squares solution. The ResidualTolerance keyword thus + # allows the user to specify the maximum average residual, or + # mean absolute error, for all pixels in the surface model area, + # that will be tolerated before the sub-pixel accuracy computation + # is rejected and the registration fails for that point. + #Possible Values: [0.0, infinity] + #OPTIONAL + #ResidualTolerance = 0.0 + EndGroup + EndObject diff --git a/isis/appdata/autoreg/coreg.mindif.p1515.s3030.def b/isis/appdata/autoreg/coreg.mindif.p1515.s3030.def new file mode 100644 index 0000000000..fd968d345b --- /dev/null +++ b/isis/appdata/autoreg/coreg.mindif.p1515.s3030.def @@ -0,0 +1,168 @@ + Object = AutoRegistration + # Algorithm specification. + Group = Algorithm + + # This is the minimum difference algorithm, which + # defines goodness-of-fit as the average difference + # per pixel between the pattern chip and the search + # sub-region. A value of 0 in the goodness-of-fit + # result implies a perfect match. + #REQUIRED + Name = MinimumDifference + + # The tolerance for the goodness-of-fit. For the + # MinimumDifference algorithm, the goodness-of-fit value must + # be less than Tolerance, before the algorithm is considered + # to have converged to a user-acceptable solution. In addition, + # the tolerance value is dependent on the images being + # matched. For example, 100 might work for DN values in + # an image pair that have not been radiometrically + # calibrated, but 0.1 may be necessary for an image pair + # that have radiometrically calibrated values of I/F. + #Possible Values: [0,infinity) + #REQUIRED + Tolerance = 100 + + # Calculate the registration to subpixel accuracy. This is a + # boolean (True or False). + #Possible Values: {True, False} + #OPTIONAL + #SubPixelAccuracy = True + + # Reduce the size of of the Pattern and Search chips by a + # the ReductionFactor for a first-run through the data + # to find a low-accuracy match. Then focus the + # full-accuracy match to the surrounding area. + #Possible Values: Natural Numbers + #OPTIONAL + #ReductionFactor = 1 + + # Apply a Sobel gradient filter to the chips before running the + # pattern matching Algorithm. This essentially highlights + # edges within the chips, possibly increasing the chance of + # finding a good match between the search and pattern chips. + #Possible Values: {None, Sobel} + #OPTIONAL + #Gradient = None + + # If the two images to be registered do not have the same + # geometry, pattern matching becomes more difficult. This + # option informs the algorithm to warp the pattern cube to + # match the geometry of the search cube by using map + # projections and/or camera models. The warping requires + # interpolation, and the type of interpolation is chosen here. + #Possible Values: {NearestNeighborType, BiLinearType, CubicConvolutionType} + #OPTIONAL + #ChipInterpolator = NearestNeighborType + EndGroup + + #Pattern Chip Definitions + Group = PatternChip + #Size of the PatternChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 15 + Lines = 15 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The MinimumZScore is used to guarantee that the pattern chip has + # enough variability--if the chip is too smooth, spurious matches + # are likely to occur. + #Possible Values: (0.0,infinity) + #OPTIONAL + #MinimumZScore = 1.0 + + #The ValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the chip before the chip is + # considered invalid and the match fails. + #Possible Values: (0.0,100.0] + #OPTIONAL + #ValidPercent = 50.0 + EndGroup + + #Search Chip Definitions + Group = SearchChip + #Size of the SearchChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 30 + Lines = 30 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The SubchipValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the subchip before it is + # considered invalid and the match fails. + #Possible Values: (0.0, 100.0] + #OPTIONAL + #SubchipValidPercent = 50.0 + EndGroup + + #If the SubPixelAccuracy parameter is TRUE, then a continuous surface + # based on the fit chip is generated. A least squares fit is then used + # to estimate the true registration position (likely to be between pixels). + Group = SurfaceModel + #The result of a sub-pixel accuracy computation is likely to move + # the result away from its original whole-pixel fit. However, + # sometimes the move could be so drastic that it calls into + # question the validity of the match. This tolerance value + # thus specifies the max number of pixels the sub-pixel accuracy + # computation can move the best fit before the registration is rejected + # entirely. + #Possible Values (0.0, infinity) + #OPTIONAL + #DistanceTolerance = 1.5 + + #When refining a whole-pixel match to sub-pixel accuracy, it is important + # to consider how much area around that best whole-pixel fit to sample + # for constructing a surface model. The WindowSize keyword defines the + # size of the window, centered on the best whole-pixel match, that will + # be used for modelling the surface. Values for WindowSize specify the + # N of an NxN chip, and must be odd numbers greater than or equal to 3. + #Possible Values: [3, infinity), odd integer + #OPTIONAL + #WindowSize = 5 + + #After the least squares fit is performed to model a surface, the + # ideal result is a circular formation of goodness-of-fit values + # improving towards the center of the surface. The less circular, + # or more "eccentric", the formation of goodness-of-fit values, + # the less likely the modelling result is accurate. The + # conditions under which a high ratio occurs is when there are + # primiarily linear features in the search and pattern chips. + # In an attempt to let the user define what constitutes a tolerable + # amount of eccentricity in their surface models, we introduce the + # notion of an "Eccentricity Ratio". Here we think of eccentricity + # as a ratio between the semi-major and semi-minor axes of an ellipse. + #Possible Values [1.0, infinity] + #OPTIONAL + #EccentricityRatio = 1.0 + + #The least squares fit performed to construct the surface model + # takes discrete data from the whole-pixels around the best-fit. + # When these discrete data are fit with a continuous function, + # there is likely going to be some amount of error between the + # original value for some pixel and its interpolated value in the + # least squares solution. The ResidualTolerance keyword thus + # allows the user to specify the maximum average residual, or + # mean absolute error, for all pixels in the surface model area, + # that will be tolerated before the sub-pixel accuracy computation + # is rejected and the registration fails for that point. + #Possible Values: [0.0, infinity] + #OPTIONAL + #ResidualTolerance = 0.0 + EndGroup + EndObject diff --git a/isis/appdata/autoreg/coreg.mindif.p2020.s5050.def b/isis/appdata/autoreg/coreg.mindif.p2020.s5050.def new file mode 100644 index 0000000000..6614c9fca7 --- /dev/null +++ b/isis/appdata/autoreg/coreg.mindif.p2020.s5050.def @@ -0,0 +1,168 @@ + Object = AutoRegistration + # Algorithm specification. + Group = Algorithm + + # This is the minimum difference algorithm, which + # defines goodness-of-fit as the average difference + # per pixel between the pattern chip and the search + # sub-region. A value of 0 in the goodness-of-fit + # result implies a perfect match. + #REQUIRED + Name = MinimumDifference + + # The tolerance for the goodness-of-fit. For the + # MinimumDifference algorithm, the goodness-of-fit value must + # be less than Tolerance, before the algorithm is considered + # to have converged to a user-acceptable solution. In addition, + # the tolerance value is dependent on the images being + # matched. For example, 100 might work for DN values in + # an image pair that have not been radiometrically + # calibrated, but 0.1 may be necessary for an image pair + # that have radiometrically calibrated values of I/F. + #Possible Values: [0,infinity) + #REQUIRED + Tolerance = 100 + + # Calculate the registration to subpixel accuracy. This is a + # boolean (True or False). + #Possible Values: {True, False} + #OPTIONAL + #SubPixelAccuracy = True + + # Reduce the size of of the Pattern and Search chips by a + # the ReductionFactor for a first-run through the data + # to find a low-accuracy match. Then focus the + # full-accuracy match to the surrounding area. + #Possible Values: Natural Numbers + #OPTIONAL + #ReductionFactor = 1 + + # Apply a Sobel gradient filter to the chips before running the + # pattern matching Algorithm. This essentially highlights + # edges within the chips, possibly increasing the chance of + # finding a good match between the search and pattern chips. + #Possible Values: {None, Sobel} + #OPTIONAL + #Gradient = None + + # If the two images to be registered do not have the same + # geometry, pattern matching becomes more difficult. This + # option informs the algorithm to warp the pattern cube to + # match the geometry of the search cube by using map + # projections and/or camera models. The warping requires + # interpolation, and the type of interpolation is chosen here. + #Possible Values: {NearestNeighborType, BiLinearType, CubicConvolutionType} + #OPTIONAL + #ChipInterpolator = NearestNeighborType + EndGroup + + #Pattern Chip Definitions + Group = PatternChip + #Size of the PatternChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 20 + Lines = 20 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The MinimumZScore is used to guarantee that the pattern chip has + # enough variability--if the chip is too smooth, spurious matches + # are likely to occur. + #Possible Values: (0.0,infinity) + #OPTIONAL + #MinimumZScore = 1.0 + + #The ValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the chip before the chip is + # considered invalid and the match fails. + #Possible Values: (0.0,100.0] + #OPTIONAL + #ValidPercent = 50.0 + EndGroup + + #Search Chip Definitions + Group = SearchChip + #Size of the SearchChip in Samples and Lines + #Possible Values: Natural Numbers + #REQUIRED + Samples = 50 + Lines = 50 + + #The minimum/maximum pixel value the algorithm should use for registration. + # If a pixel is outside of this range, then it will not be used in the + # registration calculations. + #Possible Values: (-infinity, infinity), ValidMinimum < ValidMaximum + #OPTIONAL + #ValidMinimum = -100 + #ValidMaximum = 100 + + #The SubchipValidPercent parameter specifies how many invalid pixels + # (NULL, HIS, etc.) are allowed in the subchip before it is + # considered invalid and the match fails. + #Possible Values: (0.0, 100.0] + #OPTIONAL + #SubchipValidPercent = 50.0 + EndGroup + + #If the SubPixelAccuracy parameter is TRUE, then a continuous surface + # based on the fit chip is generated. A least squares fit is then used + # to estimate the true registration position (likely to be between pixels). + Group = SurfaceModel + #The result of a sub-pixel accuracy computation is likely to move + # the result away from its original whole-pixel fit. However, + # sometimes the move could be so drastic that it calls into + # question the validity of the match. This tolerance value + # thus specifies the max number of pixels the sub-pixel accuracy + # computation can move the best fit before the registration is rejected + # entirely. + #Possible Values (0.0, infinity) + #OPTIONAL + #DistanceTolerance = 1.5 + + #When refining a whole-pixel match to sub-pixel accuracy, it is important + # to consider how much area around that best whole-pixel fit to sample + # for constructing a surface model. The WindowSize keyword defines the + # size of the window, centered on the best whole-pixel match, that will + # be used for modelling the surface. Values for WindowSize specify the + # N of an NxN chip, and must be odd numbers greater than or equal to 3. + #Possible Values: [3, infinity), odd integer + #OPTIONAL + #WindowSize = 5 + + #After the least squares fit is performed to model a surface, the + # ideal result is a circular formation of goodness-of-fit values + # improving towards the center of the surface. The less circular, + # or more "eccentric", the formation of goodness-of-fit values, + # the less likely the modelling result is accurate. The + # conditions under which a high ratio occurs is when there are + # primiarily linear features in the search and pattern chips. + # In an attempt to let the user define what constitutes a tolerable + # amount of eccentricity in their surface models, we introduce the + # notion of an "Eccentricity Ratio". Here we think of eccentricity + # as a ratio between the semi-major and semi-minor axes of an ellipse. + #Possible Values [1.0, infinity] + #OPTIONAL + #EccentricityRatio = 1.0 + + #The least squares fit performed to construct the surface model + # takes discrete data from the whole-pixels around the best-fit. + # When these discrete data are fit with a continuous function, + # there is likely going to be some amount of error between the + # original value for some pixel and its interpolated value in the + # least squares solution. The ResidualTolerance keyword thus + # allows the user to specify the maximum average residual, or + # mean absolute error, for all pixels in the surface model area, + # that will be tolerated before the sub-pixel accuracy computation + # is rejected and the registration fails for that point. + #Possible Values: [0.0, infinity] + #OPTIONAL + #ResidualTolerance = 0.0 + EndGroup + EndObject diff --git a/isis/appdata/autoreg/default.def b/isis/appdata/autoreg/default.def new file mode 100644 index 0000000000..7641c11e6f --- /dev/null +++ b/isis/appdata/autoreg/default.def @@ -0,0 +1,31 @@ +Object = AutoRegistration + Group = Algorithm + Name = MaximumCorrelation + Tolerance = 0.7 + ReductionFactor = 1 + SubpixelAccuracy = True + + # Valid gradient value is Sobel. + # Gradient = Sobel + End_Group + + Group = PatternChip + Samples = 3 + Lines = 3 + MinimumZScore = 1.0 + End_Group + + Group = SearchChip + Samples = 5 + Lines = 5 + ValidPercent = 50.0 + End_Group + + Group = SurfaceModel + DistanceTolerance = 1.5 + WindowSize = 5 + EccentricityRatio = 2.0 + ResidualTolerance = 0.1 + End_Group +End_Object +End diff --git a/isis/appdata/autoreg/findrx.def b/isis/appdata/autoreg/findrx.def new file mode 100644 index 0000000000..a0ecc3b7a0 --- /dev/null +++ b/isis/appdata/autoreg/findrx.def @@ -0,0 +1,22 @@ + Object = AutoRegistration + Group = Algorithm + Name = MaximumCorrelation + Tolerance = 0.7 + + # Valid gradient value is Sobel. + # Gradient = Sobel + EndGroup + + Group = PatternChip + Samples = 9 + Lines = 9 + MinimumZScore = .5 + EndGroup + + Group = SearchChip + Samples = 21 + Lines = 21 + EndGroup + EndObject + + diff --git a/isis/appdata/autoreg/gruen_default.def b/isis/appdata/autoreg/gruen_default.def new file mode 100644 index 0000000000..cab72f8c50 --- /dev/null +++ b/isis/appdata/autoreg/gruen_default.def @@ -0,0 +1,29 @@ + Object = AutoRegistration + Group = Algorithm + Name = AdaptiveGruen + Tolerance = 99.0 + MaximumIterations = 25 + AffineTolerance = 8.0 + SpiceTolerance = 20.0 + AffineTranslationTolerance = 0.1 + AffineScaleTolerance = 0.3 + AffineShearTolerance = 0.3 + +# RadioShiftTolerance = 256 +# RadioGainMinTolerance = -0.75 +# RadioGainMaxTolerance = 3.0 +# DefaultRadioShift = 0.0 +# DefaultRadioGain = 0.0 + EndGroup + + Group = PatternChip + Samples = 19 + Lines = 19 + EndGroup + + Group = SearchChip + Samples = 31 + Lines = 31 + EndGroup + EndObject +End diff --git a/isis/appdata/autoreg/qnetReg.def b/isis/appdata/autoreg/qnetReg.def new file mode 100644 index 0000000000..99d9d6caee --- /dev/null +++ b/isis/appdata/autoreg/qnetReg.def @@ -0,0 +1,21 @@ + Object = AutoRegistration + Group = Algorithm + Name = MaximumCorrelation + Tolerance = 0.7 + + # Valid gradient value is Sobel. + # Gradient = Sobel + EndGroup + + Group = PatternChip + Samples = 15 + Lines = 15 + EndGroup + + Group = SearchChip + Samples = 30 + Lines = 30 + EndGroup + EndObject + + diff --git a/isis/appdata/images/icons/3d-glasses-icon.png b/isis/appdata/images/icons/3d-glasses-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0fafc03b93d781fdf8591bd004596cf2af0d1c31 GIT binary patch literal 768 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/add.png b/isis/appdata/images/icons/add.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfa551f3268128a271c6b7380979ce447765ffa GIT binary patch literal 1055 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/back.png b/isis/appdata/images/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..8f897a05cdc6ad7820b51dfa89801878df3e7312 GIT binary patch literal 2084 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 bU-!aFY<=?0<@ZhR;zQmYWA@Lt-~RkRCL_r9 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/blinkReverse.png b/isis/appdata/images/icons/blinkReverse.png new file mode 100644 index 0000000000000000000000000000000000000000..1aaf6f3c09d2d81e9bc875156390b5030b3aacb5 GIT binary patch literal 2084 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 I`kjaV1F|6vX#fBK literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/button_ok.png b/isis/appdata/images/icons/button_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb2a0e70f9948ed9d0d21e3498deba12865f53a GIT binary patch literal 2084 zcmeH|duUr#9LK-s-X=F`Qqwj~m#$rttlj!Zn`-NtvZ2(`J%X$bsbWFKm>`P&QBYx{ zI!h73A^tP}^B>tng`xQ9L}UerN*!x)KIY0Ew%bbAtj$f*BsVwr>F=i2>evwVFToSe zJ@@=L=X1a3_c(cNZ~v~c()FbP%3{0w9;UI{>JB?SzaD#b8x8gY5AN!NY5m?FfA1(+ zoI|?@pQ9ZYtj@MKzjcs|!t=2`JA|21&ez@fX2T2hWcfJO_rO3;1$$Q*lxf9(tg(Ng zm!TItf+#66W})Fr==5${bG~T&`wxaNYy|ZN+<}ehc)AiEaAZ^Qa}oXz!6UFkhMzP> zT=%$+2pfdQrFrQx(Xwbop5WT8iWx@e%e`Q9tlPIRK^3fnfp+g!@90p^P*_H{QmHN#$N zN5m8HOy(!sr8(&f0?)5FzKi^2M+F_CA#`_WFqug%rKVG35D43g&S#=cT>}{43Iru$6 z&y($&S_T?w>lw!}-q5tCCgtzV#reheDM(3D8VI%p4{mGfyuZfh!*ZTX8lXt3dE$o; z65@GrnAV&nH{DzTGm51ScX^p-&t`vsuAb9`zdeR=xIA;U1fqHtfwi6Zp30(q1UKvkm` z^cy)z)(U!|v&!#aW{JX>O=T5z0&}|rZ(}QEn4v&b^2lW*%=Ax}Uea~_bTOBX zLn5I?sHJ$Nq^$t*R69;=cHiaR-_W@3iMlS8Ax6f{T)X3kAHG7E9> zuqvzL6w(>o0=2*^d2HosfXdND?vs?cY(n9cWv-*5MFv-@GDFCNvzyS!r!(V1?nXi! z)imuC$+}9%&k^T$r54m`YXxG#{RA(8q%!qdApyIY79##A-Ow(^REe2C9_RB5i^*3s zL;IZe&f=5XL;no6W){4T3YH@{r(Vs+nH!=lT-Ccs5{@sRzNE#pw^$4 q3x=000000000002db*0001-oSezY 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 SXhn+2uV+nRL4E#f@Baz9v@)Uq literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/copy_bands.png b/isis/appdata/images/icons/copy_bands.png new file mode 100644 index 0000000000000000000000000000000000000000..34ad256cbf755ceb9c95e8efadae8be68df48147 GIT binary patch literal 4254 zcmdT`YfKzf6#iz0+1EhXib}!qu$tDEYHOj$4-CaXU`yIGeMBWDniA`eR%3#HL=%nw zOzjV(tqrt^v5EX>XsZ%6tww8~zFKMoC2fIFT6vYnb{AOoF`hHK*A5G;OG#`z}PI}DpoeR2S%S|znclma4 z(#RRJ&16I;A|rzk%+PeY!~zfwo|a}w103GevWGo-(jH4<3ep#6!s8xo>+k#x@LWHS zkw5mpI&mI8)eryh0{DCkn#;vNn1NYY;2^V!oRyVjvD@uhXTsA5oH?aiS1e0~-I0Jn zcL0-t5L&v12*4oF+vC$*^ zLuUS_Ex9Wez&+-}h<6f0qh83N0D0B1JmWrG>>fc^%h@1g&x?B9-s4y$apt0I<22{e zM2i8y+|`0A4sKOd)!)+IGnBe!)0VRQ6j)>_+;M?PJmApLu+UyKkYh-v>Q= zt)ly}PdV~w7M|>5u^6BQZ-F; zKA4`01j;0p|h@VgsE6j|}eMi{U#7vrS-8ncjz{$-joHeVt zUXRdv)a7ywQ{0duN#s^S`IBk*;@t{VtzT_8%UhO?fg?Lnx1)eUaEyrRL1vH_j7V(I zbY|h;Y{Vjr+jve4-1baJHxyZhnjqtw%e^>u=Bi;R9!;mO;MMvIltLtr5V1WucFp8V z_!dW|jRJr$6r9u*pf)+xu@b%zONiGTJ%$=PH_`qb7ke>#;-Dhz5TcM z=RKC}a3(=4I z&DH{c#`+D4_qEj7BQ$Sk%@a}vYcY&#QR@y=`)!(Dibvx!$kfOzfWvSYNu@tly) zu v(FfTE+-P`D<r{aC&P6-6S1mKExjEeX12MXtKPjx#&cxvM)`*qXj|mviqqXYT#(neTpg_Uz8G zQmZ-53;u?bEZYy+j#xQ@Gybzi{;ap=e1|YMk#`z+Zoe(bSah-W zm1;7RHd&5bmn7elcdgaZpKGRye*=E_w8zxe>1!#-vn{tJ3Xq&4K+TDEFqt?A1V^C1 zud9m}=jOkDSrM8FY;ul^1=Xipg~k`(-xsY+UY;~Z0F#jiqsWXyU<%d*6QnL!wKOpF zsbkrSlkBkLHXS$^QXLr!EIABF5YP-9h-lP6qOr(wq6P^GOBVBlcg97DWas>Q~%{5Q2QNfN@kaS$ASt9T+k;l)!6#Y;o* z925m0qDZLoNNa56w7@uVO0`5akFUZ05JF)Yq){)Zntbh_f&Zo!rVw^R1O5n_7s7$= zE_rnDaSRw$8ozbCzNr+fJMgG~AiPziH2zUm#IZ>;M1& literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/document-save-as.png b/isis/appdata/images/icons/document-save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..9695a56424eda300496caf56addc00657abfbc75 GIT binary patch literal 2152 zcmV-u2$%PXP)40bdUMYLM+G3ZQN z8LL)XFtx&fw8ct8%YYeeJ3z}IZAWEl2`x>3bQ~(SpKmZbDK&86oGA%j)ch5Hv z^n0=YH5Jcx^kFTnxiua~LRIm>4>sYJl`CN}0))l)oQ9Pv12fXh!1X7~0%oQ_Pex&! z`WgyCF1&S|;kiQwB9RE1Mn`e*-b%#Z9KvKG0fPjXHcc>VdI?O+oST5fh&L@f(>ppn zQn4Fxn32fiE5ZBx|faI-}h}E^AtA7k7VIKj`C;?5(O~3*S zda=AX$jj~6VB31k59{a~G_YZhfP|K^!Pnkbg8Kp{;KK87!K|XqO2f> zh;k>+qk*yzpt=WVjDsU`WJ=u+TgJZ+I~dz1D#fJ^8fRFk-O? znzshAxHJMytwTp*9sB_aq9nuZ^OEQ?ea|ul=Ng!{zjZkpXm5K9H-<+MTC^1H?f=5h z_J0Un&-QzRgfG@kAYm2b*KgE=$;aUFcHg7Jmn_B!j6I-^^(@ii`m5Imh{YR+Y#O zpH9FVDp?;aT_S{QX^ORg+n4J{@V)y4Bn=h2U#TZhFTm`eY|%|6lN^+%mXBPt9AH`& zII2UG6Qji*TI=)sF+m!Uv+0+rm)(247U@Anv4O3RU4vH-x8f&jO-PjLH9K4gmHAQR zQvh&qFPMEu8JL=yasX&_GC`y5I+2nkDKke7{;mK{-aaAaO!UQHfv72oXfL$rIn2)= z#TvR;3`YjAy@jEBz=a2Iu0T~)75;wY2!Zivbq?wXi=uZ*kOj|>)G0f*2s3vAfks)B z5Q|0;2nI6*PMnSHzRuGHuQYl7#SJK5O}BkgT*f&K8D90n9m9VzJLGbrSV0h zkx2e0`qfGIo?q+%nIkm12j&u?^K9rkZ$pQGB#QR@;NYO$J@V#tUw!n#(6CTj?(TfM z_2NS>9zHpq7Yu&8thDrLNtC=G(+%AQl4W^XnrXCCpH2U?Lx*op#_R0NIl{aYm@aFR zljrKI0>yuL<#+^un>;TXi=9lSQY|h;Er9@5Rb4H%zW3e&HDih-%Zef^sw9aD^}i&D z{0IVrAn?NLmc{gR+At!~s3xmQ&(MXT6tksw>0(doOd@nlZvNA|tpKhdUr4TGTQfr9 z`ZKu%!0hhsHv9YgQxug+3oX8wh*%Vj#pfu+CS}2*uO9Pyy%uH4;=d0M52q<}QuhBr e0ggFDQvU;t#p**?D{M;u0000M8$}SF`)$W|Vz+h^3K1d&siN<^An_F5_&0!O z)Rzj0@&v6^_10 zg~*Nh4_Qv0^%;Z#{w#!k|1X#ZQ;;@Dp6+HDfFwzvR;z(y+w7a5d4<3CPl}Rf7-tVSvZMG^9)A0BAQf8V&LJ zVG9{>Z3|Y_U^M`ViOHx#!ZB013K_`6*9ZV_uqB#YC@zDZ2d0D?f6(P|tQ3#a@s(2L z01}P3@xh-TA45^onUU7wF%q&o*g97OmE=lL4uFOcKDoWQ{=CRE|L5o=qZ!D84eqm0 z(TY!}fpk-G0x@+f4Xgl&tX`6`UHUODLTUZqH4rBXBHE6TT3rHJy|_6BfHj~JeTEX? z(^0ITcRZGj$IvMk;Sv)L>kUjP&dLt6R- zyYa=Bbgatf8{D{glU698=svQ`7Y~CniEsL{qWLobmqjQA_hgE!!xHWaYvFXB9A-fFUE*Y87hrIt&Mc0u2-(v~0T& zKomz11c4+VD@>5(9wI1v4m741bguyr;G&{9J{<$#x*U9p55;jL|g$=_H zfzf=j5U4rdp6zxU`u#o_*fcf*z=O+|E`3m`*1o|~wbT1m=)U#UEdfQHwk8G7iBS9~ z3|T7zz%osq?{>Q^UTjrN8wdl&ql1G#H#RoD-hSocXL!RJi!cf~kv-Q!YQ;po(4Rhx zD7a`UT{6*-j6*c%v3CUk-TC)uH2Mye-|{@~A`$TRl`GZ{4<78euIssuZ~ literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/down.png b/isis/appdata/images/icons/down.png new file mode 100644 index 0000000000000000000000000000000000000000..720657a28f426fbaed6baf57701e29c575ce37ee GIT binary patch literal 2084 zcmZ`)eQZ-z6#u=izOHMxc7t_o*(Ll1=KKxFb8ZPf&^m-F(#lPf}r@3Ff^b< zB^Y8N`iF)X338#G7>^`aX|=kGugVfTep_AUEB5b>pjnXr2}N1=DfGvd*1J! z^E)5+X!H8j7L(Hiz|yd$ej~lhm>LcAyms-8W%M%aXk1+njs3p6^1}&QDR^_u*0<=3 zJ50H{Io}+hMR{Mtx>a(Yi7zu0y|(tyVp_S-P`_f+QX6+#-l}k9GPz7^DS?`40;e_u zTs0Y0lB%RbbmlEUy9iPJ5d)uuCIfgBc-o!#g{US&tQ-GX#h#mGnu z0rxO4><6N;Fxhx18bfEE+id0rZ zR@L&~fTt5g9vF$H@%H(C{QUiIfY<8WK%Wsn)>fLZu3b-?LdeDd>+*imaooB+d# z45CVwD7X(gf&RcBM}G0*+}D=@zrPcrw4Bi*==+wscZtt!yAL#B-zpdUV`+rOGe~AM z9W)qAW1hVLj$#Sj-YCdX#FOfTE_4;5D{V%w$Kym&iDRtengEu4sAn8?OO3627r_@v zBM{AiQ4k^UzPm{XJcq|C3Ly$Se1Qafv8)~ui;Ag2yxXlZuKMUi-{4ayUHO#=WH)lf zMa6qxT7Up~))!QCFIo7WP>Q@(p=#1Z;PF%z!*uX}rN}6tYHlS4?)+V>jYpeA(I7Rd zP6rwn*l=qwp?k@a#ljE9asV>R)IDJo3=>t8NmZ!~kIM<6ufJIoWO1QmMmg@rGq`j+ zj0A<1xtFYb$}HqfURW~!4_GA1V6{Rph;w*Rl%|%H7UF8}7g{Z0M8BvJJaY&S4L6Wiz*c%Ry>zN&( zj_M00@xcW*G~$6Z!oe42;JI1mJT9soCVaVNI*JN%^ql)WfR4U6M#&-8nKHE?VGfCe z-aQ_Q&t|P+lyXTr-8rgv&auribnq8z>=VEnmauV{leW$PcAxEsk)mTlu_K+Nks*n< zc~O?ygjh_kM>8dffipdSGmMsYcMf5aXWJhE>}ee!K6Br&1heW9<8eksyHGNBvzt@3 zoiSdPE6UA?C9^aK*eu}i*H8ju@id;PE`A95%ymEByGWyf_+)m>Q!7!E2u7gZjf7;A zx=V=kwkp=STewU@Sy^beq1Ytq4I+{;)7yRpajJ@CGmCWavjlqh(ja*y>if*5%pxI4 z4kh~iG`?}jec|OR)OpmkX10XlJ`ZG(S?57!8+uVvvow zPGn^}l|U2JGzm`td{(_7rYy%9CT-=U`jwwtS{65qwnCR{cDepRXgrH3dGg@MWY%nU zuokw_oMxlb*F6j+6!UNbYI{zt^D&zVVD=9K=XvS8WE5*kD@#z}vJgOy8g_dyVRgzl z9aA#!_@W37gpgL!T@uHwzxC~Ek8VVdhk)7QW7~f|v5$_=dnPetHSMHIdociLQ6VE5}pzQq!aDH>)&JG(d(siSuk-B9*tvktDpuTZ) o(7H8_Z{vkbd)M(5?B07scGWE3{MpWm*V#tHs`d4)b=yDu7x#Wz%>V!Z literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/edit.png b/isis/appdata/images/icons/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8b063f9b6c4a9d72fc9656bf6373a252bf813c GIT binary patch literal 2084 zcmb7^e{54#6vw|U^atZ@V>bKI33D6meny130B%`=WMqtA5!^o*qXeT76eN==Au+~E zA_PPQW>ENpjVN(b7;_*aSws;8jnOP)<41IJwA;FNU4Oi-zxzDrrLU~UKkzi)ckaDC z_jAuX_r81JnGJQRDY+>CQtMaOZX%z>(rfAYQ`hU&IH6M`>ivuGO30 zq!|M&)yk3+duUL%yMFyD-C&A3OAs2r(Kpk``TE+Y8jR(VUB?YR%Xn!*^a<9LQD zQt<+DDPz1CD;fzSa(5dvDj#0l7lY_mq0n&O|Jrk^+_Y`_%LjlK2FoUA$zYy5V}Y4% zj)}!$nCRVuc^VsDIW!A4hlEG;b{yWJ*4n+gYtQZtv=eYT0cN`V`kZAvv!q4h(Az(M zgo3nwG&QTy_h*E5+KJ{yVAQ4au50ptP8c_7A_>f|uE6BB(vL$2`_7@#coj!G4fyeo z5LB@#9N8%$Wv+qh9O$3&!$DA%D;Z3H1YBtooHurC@H&d;oWYIZYP6ick61JW%N8H< zb2aE5Y=B#orU+^-MD&7K*z5OVK$plQc?n=(Fj2hn3aHX zhrhanC7=^lcpQJja(Wm&zXULEZWy0zcfsisaO^@pOy>D87!2~pdc9uR6NF2VumqTQ zUje&p{Rq#k!Q}KXw6jDU+u=i6S~?E5FGc;DN|cwEqpYk9IXQfPN$BqG<}!>XsMJV+ z8LF7qbqC?;dw8KPim@kCV9E>P;_yx^trAdKS;;j;Mn;Cb51pNz(c{NI`aM0~nT3QN?MkAl)wzjrtYwPK5o6UBS z=J(5t8IO(BK1HRFg2AA4-+P`iKRaI4WQKm0vW@egcE@%2+ zgW^=Kv6nPLcf%Ltb4l{0PyXM=9|3>1R?53Zw`*-Ea&!J@x6pWnSg<=msy&Bs{rlcu(G`Snv2^(Tqc zvi>{ZiJXtz|FpA<%7;Y!=Ek+K_Ez6K(J+O^JkAB>o&8b5k|TGSZy;Rh7{;#E?*nKW z&~6%98g8q^!GqSkUT+%1iC`dTAEyFgfkjYBIit@fRzQNvNi4OIfXZ0}mbtPQ4O>M;+FCqY@K8hRDT`*DC7ILDK@E-+yKKq=*6Hf!mHHNp_ZD=-|YPOD#p=+8D3WX?D{cMlBhznWgm@VmaN`ltw zb!fLwz=LfJhc7^-QfcYBj^Be}kBhNbY>NaMwOTEP^P%iH=>#W@z>P)&duzes;)3dN zKL5?kX0xeIr*lBLlST@QE$o{`7B5FlgenbBYwhpS7%(?lwHH7&Y=x7Ct z(=45sF3Rkh5DW$(pU)Y$?`&jhN3}0lXTLs&*EohoKV9~gQYfa|pAF8!;o-sGOlCdZ zYPG%(p!jV&9nM!3s{ogx(ddm~IO^fawQ{-q6?^(?bQR#<_Me@`OFw<~A+el}zhAoh F{2wK31MdI; literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/editdelete.png b/isis/appdata/images/icons/editdelete.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae7294c33b727935ac2d8b140243b294fc65d41 GIT binary patch literal 2084 zcmds2T})GV6#w1Z(%aHP#dbbWjZ~=;jSG7iA(%KdMMNWCAxtw}#JJ2XJ`5#h+lxeB zGBifTGcuMcjDZ;?zu(h)pIYI!$N@So+0&=a$_1#%=o<@laS< zU-I)eRBEl&TPn4ux#|aHOO77@;yY^ks{QL4%L|lq+O`Ni-UkY>AJ>4z@2aH-C=%an ze(GE$9c`M;b|VT5Gq7&1-FUw0a@DC;>yR0^brY}~dgGi0ETA-8DJU;rS8?oEj@j)F zbY}slZc{v&yzueCgW96)+t-AF>m75z)4)7LP=lzM2Cn{#k*=@B_h_Rj}CW)g1Xwn5-HUyB*`95MDibf>%I{ zZE9-C0xIzwW_IFe6osWuj*K8D!$o>)C3Ay7;I}50)o=vZ%(%;|_+oKWkUkq*A_2m$ z$@f!PfBG#~jgPZP<}iy6^FlDIOJxLIM2p;4;ShP8Tu9c)1!N~+8s(0!1s>c6hNw!@ zEa0{jX!lxTEv1VAIzssrm*X!c?gP|?d=_x2#zpWD(C`Th7~nmiN~d%y+JK_OGS6`B z<54q%b&~S`CUXVjl=skCR44avHY+F?!6TZ6D^pWZ8ke`tTo9RsLC?*PM{nQd6NjSj zs$|;5KJo?9d=~hngNciLj=JF)A0D_nH6_O#@^cY{(ybU^sr*9;yaYaarYOtAa3PiH z=j{NoQuGIKkN-0dh7_fKfvTDYxH|Fz;nmKnbX)Z6;<&4Iz|e@ZFUl{Nn0 I`kjaV1F|6vX#fBK literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/editpaste.png b/isis/appdata/images/icons/editpaste.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b97ef5537a96d44b3c072e6480341c2dc4148b GIT binary patch literal 2084 zcma)7O-x)>6h80GV}=!{>7t36__NV2 zv~6@@+mMcIswOtwv^KgjbYW08BnDY%tbt-kX@TL#8DQRKwvZ&3?4O2 zGiew`)OFne)>5TX$!%|M{{ZFRz>5cr{^elR$P%GY=-AB6%!L}cz=7M<)%6$T1paU8 z>FH_i?d|<)aB%SNR4U~H)Eyfeb4#Vt0j6wvdfIJjYI3`~y9)yY1Gn1R+LDKPupGzv zthKfE_2%Yg0hlZ;Ey?cgu4J>>Cu~+$R-~`5PZEj5(_33xudS}GJ_V&$_7q*8fopVj zcIK1GWOQgwv04zd^2Rx$Ua`T2Q4hB7=nEO1nwot^E4n3v=VxC|~? zFpS!^jlD;6b8~ttcq}Ot3X;#~)t;G<=wxkejWR~SR`P>x6loC-hgF@?UP4CesYrSEaPg6Vw^-a@|R5B?$ zJ3B`eFfTM|C7xMdJ}60-K^^czJ@h)*3&O+ja1d;mHP*Un^#fDj8SJa<1DeRlRQKA( zuX~^r`{o{?Ur{?@c?if=J5j)%LKWiBh&8BQnX(5;;DA>Kz6HvmfVr>2iaY`AyQ>;d z<_8U^+Ooa?<({BmKh@5PDp)m&J%cJRf%YP%gF}G{;BPs)Gr1&CSh41xy#3BA!Qev@A;j@t_|_J0lQh3|BJ1OyI@SM~s+sn{nE`9c8P0NibN7z@@kbXw!L<7skNGFAb5>(4 zR&i|GKF%^r&Qh50=Wl&KQA0@%jU0q&Y{uSvH6d!T*ku6f^+tb%R{9t_kEcTK) Mero7;`i%?!0Mk~rUH||9 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/exec.png b/isis/appdata/images/icons/exec.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4ae03c9286533b99b695055e6e8347033d9311 GIT binary patch literal 2084 zcma)-c~DbV6o>Ci$PSSN5?MmDbwi^prl?Z|0bzhaQK{CUQWhNtroU_)kPrWUym{sunBjb!o>Kx(JjM{o zk;k^cBx`fVvQ$2VEgucbr8mZKulR##UW^; z0T%FDn|b?oQ?1)g`FeW#NbpXaGbd)P!7%VrxU{tF7|bm?f4=JM$cV=`IB2%QIODad z;4mdOcincI&Ea#o+&-Ian8Gi?A{dGq@i`nW58NNYa=Hh3oW@4|j#Cgz2QPZH_% zzjw5@-Zl31k&f_i5r?8EKZT+d>2%%5<#HjBNQ~t27+Oe(7{+eY+}wF9zX0s!LAYS70;k_i#ym@l8 zdi4s#WU_osO)U*_d92*wa8pug$Vzai9nFd*J9g|T;&M3wQfYWNJjiHlY(Y0}+(KTj z*VEV6>*?<|dQGMwH>{e@_?4_O~`5;rqt@kl-+JWSX=vGnND|qk3b-*^LX5epv)7CMRXh< zu~>|{yZbEp`R|ury;=<^jeeuS1zUr|;ZV9YuCeehP(w$m8)Kl6*l# zN6X_96H}H%L`$AcC5nr;#mi(d@k}NgB_zZ%v|4ROd3iab zsHlhFlZ^xi2Q!pPE#$P_x@pszkW4m% z78m!H0M3Xj=gz6{Ve^+AIr4oDY;NK5<(Yn7NNcOrip*xR4;;+E9^lYufvh=o>fDaG zbK_=cG|%Z4%MeOWPe6fz0jR3#ml2ifiJ8r2)zIm5lfz+O=6uKEJ;HE@ScH1t>dvgdDF=%cg1VL)75{ORoA;2@sIL)i};_~N=&t5HQpMvlm2vp}5C zpFaIleQT>i&15oAZf;=|JQE9?2Mz!x;2&+3P$;}``0%$+3JMAuzyt5{ag|E-!fZDC zmM&e2|LSK@X_b|g7rGZMN~nQx88G(W!|+wZ4vD}I0M1MN8T$I<$&;OT?%XlP#>Qfy zslX-xp9>oSJ}}Py>n#lM#94z+m_h)bvp94H;1d8JN&$ccc*XLQ_YX(it%t)4zFVnT KDHoCpcK-n~j;Un; literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/exit.png b/isis/appdata/images/icons/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa1ec8adc77dde15b011a6700ce88b22d9f5f9c GIT binary patch literal 2084 zcmcImZ)jCz82_FB_ndp~ofmQBVz_Q4&ZM~_s0J==Q=1eP#2` zy+oWB*EX#B@O1{Ap02H(&Sg)pZ@Tl$_URHMUvzb>fBNB!_NlWoKpe+O`Z9V0m;YxY z-l9K1&j^W0_pYBfarce>{tw1hu55*->G4f^x!yXK@M5tFTNRgh z7fD4mn`486SlQhTH=9)iG0B%~?3A8|dskKwN($yKT);0wL#RZN=z|omnzWi?Q7fv& z%X71s7(9U7_|FO;Bu@5Ti&v&5F@O9M`8LMHkHB^vg=Jm;saW!>)0_7XVA=XD zid2X#QF>q(l133pGeqj}OC)SV>`JF=wEBHlIA$!JVJ%v!b{No4;@9tt{ zLKco7L2(@R?S?Tvs)#+$BgU#7r`5esJ1ZK?Y4&Ab};ZQm|^BU%t_DE>MLgCJcV?WQ@zDH+b07J8#R#w?d|Q6u^v$OthrO|Cg;>!mhsb-*$YdRQ)gH>x9nw--bOgYmh{2O@GVvBupZbFc5Xf>i^%f=1Z zzGV{_V+cov5sgNXNbo3(2zdfg6w%*5fSLn`asJX3L}T%162rVccWWotQh~YqL8M*R zNYd;hU+l)}m6ZsGBk%_T2!%rAcKkWySQEoH$G*eq+KU7(-!@6ZMLaAbR~3voJ4J!5 z-MnEvHoUzKef|BABoSJT27zFZ)&m$C3S%fdGQyDva%?uFrlg>&+k^ZmQ}Fnai^tv` zk%dsi-(N5C>@y@zPRw=ak9~a*o}L~g6onF&1-)Jmksf&LYC|v>A}_+Ac%xwE3^?pL zFc{L+M?Ib%Sgqr5yP*-$xI9O1F&q^nBvwhHVBAF34tTwAKkEQjc@sFD0foFeb>V$bW^e zaJ~KpBE$lsma6D>ci{c^)>BAy$fnTn!G(kVbn+McajO9mu_Gy*DWW7mN+{DrgEi-~ zyzvfQT3Q;KAGDCmp^-#UvUp;iw6&vXL1FT)I{$d$6fRvRiV+Qy3FUKylG@eX0~stu zB2J1tR?j*+(M_?{k?Tp3Bne9v^ZxN);d{Sdy#}w>ryj@&8Ge5NzQI8rV-U?{(VXR2 zCyIjAZp+4<#-CFV>;6%Y%UdFBKB6 zXa?#lJXGxh1hK^*2vKDzY7%%=@rv8?=_jKh;Glc`=qRUz##$BECJeA11R& zy~h*C>B*P~CP>Yq)t0NLm#XZxOn7~RD(Ld1rFi$PwWF4PzW*R<&)1=+w-wjX=)TlKK9YM^E5%I@AlUwx?<_@Iu*l;0P|({RWLz zqn_P+@DSUocd1F^{iEq#vr0*W!GIXCiLkt~ps!VXMgHtXJ1L8MC*|crq~``GDZDUJ zQ&UtvtET_&V>X+ip{n$FdSS7csPu>6p_VGgI2y- z?L0lblq_k?5ugUeL+5bhsCT@?3d+SzIbb-%F-P0x%kxVd@q}_SMXz(@+HJ6ovk-m! zYL7@348OpI7lI)@9VSx-dZ}T#JGyy$bxQ)9fA_}K4z4o_%oiM7fpD7I=RBU6T!&3< zG`w%bVk5mnL;on;i$EYqfL-Vt@bSLVn1~CN_y4@?<~Usb1I#yyi;MNXm}VOteMAqK z(kRYGV+Qm(9c?LygrgYr`w=3p$K?1RwZgqYqjcC+S2xV>C*=j;Pf>v29`mM^U=J5#cL_djS8 Bk%a&N literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/fileexport.png b/isis/appdata/images/icons/fileexport.png new file mode 100644 index 0000000000000000000000000000000000000000..eff38ff032a3afc115ff29e7b0463305017f4253 GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/fileopen.png b/isis/appdata/images/icons/fileopen.png new file mode 100644 index 0000000000000000000000000000000000000000..9ece2e24bcd007ec3bc0de833b4e0c43e2fd8691 GIT binary patch literal 2084 zcmb_dU1%Le6h5;%_wL@mnB4TnYGYHhNd3bETQme8QWDZoEH?O3pKSXeh)}^I0pC;* z5eh*?P#?5tMIR(W9zsJYt*w+i#Rsv$LXy&=H))dIo80}G-JS8Axx3rOwqR>dID3BP zoNs2%oO|-o%ln2(`G@lWP#WGdFoLp!*v{hj+{BxGD6)t44h?{!zpqby{|S0>Z|yno zHfH=m%y#eiaul7`(czZ{t+~9>@l4N&SNFe;o}Y&Y`d@jWjh(O#cnm{QQcC5}cp!De zisLwG-1PMHT7Q54`oClDWVhf#-`LpLL?DC`zOUK$Jmor$s@H02X>n1_&&{ddW@hC0 z`1mD^??%qt3DAfaER>by<>hi1h7d)OW+^2Q<4u4u1}5iNAYkQk`LVNS&YZ)X7m=y3 zw~z+jd*qu#yGD*26h{6L0!RsUvJJyXnVTlKt_xecx(cVJrY1197rB_`#0no8{c(G- zQ2MY?=w(K}(R34F5*csA5L{Di)2*KE?#@k4o}7ID_%EkB9__hiSyrSJ`|}Ao{Q(z? zYlT`{z!(OKLPS^9L^3^n3>Gix@{nFEm0;&{J$y8b29IA@heF$C2z)1+ua-`7m9P3i z&PYWa`1IHhPw|y{Ey!{MnD0Wv zEy1;wx^6Fg1&G23JP|;EGQ=|7LbNdwed#_*N!+vuYpYkE=A!CHGP?>=xUgCWxODk% z9U5W(dVT=)$ObnuLE)*JFn9@!AWCdf7$Td7368x5cJ%Z;#EyPG^%*nFHxvRD>TTBu>N6Kc!Kp%`~K_a^6boCyw->Yw{7c6b5^}nZ7NubyCr&aj!Agf^ip?=aoc!$ z4o;Bw85eNEATT1|?-Mh{6tAu{>}B`LZLf5%PFeRdG_0_Fk_Nh0sEv8~*2;BWZYlbm zom)1p{7)-zYYxXjVy-oC0AZKYzXSc4F|b5QcOf51Y9aCwkxcxFr2G(jEelxVz!#wq zAqGjfF*GUl1|=KNkD5SkCbAP?oQ2yXTj_C7j{GeFH!3e(k+~0G=VSO8@`> literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/fileprint.png b/isis/appdata/images/icons/fileprint.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5141dea5a42f969b157c7e2fea32e94a707290 GIT binary patch literal 2084 zcma)7O=ufO6n-o1N-M24mZGGRoLHb1lK57FF-_WwjAO?xR$HaGBo4GGgTBv(*e|#_)iVud~LQW3oQc@GOvI(}VM3E)!>SwiDZQk3>s?kqNM$FF4 zd*6KX=KYMmem^!Yy8GP#AWmE!jpO(lb>4yBd%xd$8wbay?~adxPQRc2_~jdvxNcv* zdIxtrq|S_-`(X}+&cwvjC1=_d4%j`veV6+lB^wi?(GTD9F+V%6))<8JY9b2RUWy*F z2Fj#Pc`ssiX=&;1Iy#`$dRb)~92`7}{d^1cKa+Giy^m^J zC!|Y2fO=g8P18EDU2DP+wpZ&So|&29%jNQkT1^2}ZM$9De$o+!u(4Ro*`~xr7jZNi zot9Ll*+vE6QW<#Ksrld7s{l><1=4mO)< zL$ld@aR})YC=`ki3I+I{#EXlI@44OXbD}5$!!YB;VhQs30=Qf}IGseyqTD3bb(2_8 zOv?$|-yi&7Wo1Q>Bnc{&%3pJHa~p=m9LIer2*P%siA2yX1vol7QnJ~shmA%r3`AZZl+iksswEsAU_+sh-P-snVN1J1FmDEdzxV;Roj z;dvhHb~8c9Pk5acC+X0dHdo|wIm5peh}`6Gn1)gII2oJBJV+*Q)XL=_Ef5h?u3C+J zU9DEFr7^l(F2lE$kVvg`BpDiWgB9K4lSnw+3J8%|joZDDY3%-Q7JI<%W_7$iG`#TLu}eEmCW=h%IumbZl%4@F~E8sY0nFK{lI{*mQbV za=Upn-(k35cz76=mzUw<#dn~u&x;4zjB8p%bO5_c8QNSeABf6oe+GTpb8Ydph-<&!!Et;@eWGn4$;hzetIMbc8{l zrf3g|UM9ElhJ+k;%5nj(cXMcH=nYIe7K6p0U)xF?Ni__nj=pbfZ*TvNuDFZ)$Q@Jw c^q11So_Y4!pP&EwG0tJ)Qfzd6W7{ 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/folder-image.png b/isis/appdata/images/icons/folder-image.png new file mode 100644 index 0000000000000000000000000000000000000000..034551af887f5439abaeaaaf53bed88349ea9561 GIT binary patch literal 1633 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 Hu0mjfQ^&@E literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/folder-red.png b/isis/appdata/images/icons/folder-red.png new file mode 100644 index 0000000000000000000000000000000000000000..53954faaac0261ab71d49f13e860f81c66b62dd9 GIT binary patch literal 1412 zcmV-~1$+95P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipW2 z7bP83DLL5y00jg|L_t(o!|j&4t|UnjhQB{DYjiZsFhYwkFu=qC9B{C3L3mia0tSzO zwGwOcCfN8GV62G*NC>ptm+Ocb*fU*~@nb}0b)O?4VSv^lrB-#9vLhqnzeK`^y}tAO z*?+wEofj|u>*ovL?H4cJy}%bN5t%rI5Sa-QEtB5bkH7u$<>&q<34HVUbAJPP9YIDw zCPWZ64Y;@Yfx;aN8ziv70EUSAt-#I-EMXfEYQm#p0w|M9=2yS_>ecr@olrQFJ%Yc#dBe+0ju0FNq2ftIOuigQ6OQAk@>P3n6PcvVA0qhK zez}|+_}a5){?xWH5Q=~tpkRWGf%`G|3*zlJ_w;S!zV|aYH@rFd&{{pyGlD8EGbzlg zkw5GJzd8;s5u{zX3Y^E>T%AtftvuL!=NET(=yIvUwhklfz!hAogggm43RYT!QAtR_ z?;Bt0?>v3_)2}>z>Noo?qRovR@~AG%K#JgvgWoY*s+pPRfvr_H2G{OQ4xMXtCIXGY z%j2NGm-(4rVlEQVge};2=#vBDOhgiD4evYZy&5~ltgO1=Of;dR1&mQ7of2duxZZsL z^nYfekrg~u z!YC$oz1MRET7=8>TR`A(pw=w7wswFN!k4{e#F{K$*)UC-R z(95=qjJn1-V{uN=Y(Yx&wDGo)`(83)Vc4#i#XL|d{pXk#tCC+tLAGQ!u~h4L9M`0C z#%&GKrGoN?#JyeFzpe^7uB@Nr@oMAg7rG%{oA6CutpgV+#Z|T;+&evhZEdn=E2qCN zd>0wlfM4RaEATPk$&+ctHv|BQG0+zy{E53ea0ar-eUaN z_oH#L_jJtSlVtvUB>iIwJ_(E`Pp%t!uPWnF@O1@SqjpvI@0J%~b#nvEd5eP4pdW${ zB*vq=+AMc`*|1?q)%WqVW@7=Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipV} z3@tYu?ujk{00^K-L_t(o!^M|dj9pb3$A912d!I9B=FFTk)9Fm-(mSQK7X;f9P!Uoj zilz_Z1H2hujgnx91|vSGiN^S5A}=Neq9(*dV+2zLL!byWw59D7+D_?huBUT3bLMhx z`>eG-ANHPh3TQCVxRRB<_R8Ap`~Khe|1KN;-{Y|#zVxxrKKkRA{_FAu;L#ub?RX=O z_ZtNjK?KBuGs#l|ArnStpMUzHeg6{$zVO6v^lOhD=K4Yd=fDGjfFNWdL0eT`I(k}z zC=k>jfTkBHU_S6J>Ds4j0UQvlo>N6#^Wi`JQ2Ih%!bnfEXbXPyrFa2$viz% zLuNH7Rux;XGB-EQTxptCD@IU|n`iwRB}5XztBUDbpNTNto@Z%(x^+W=dUc7)+yvhH zRIuEF2Sm5B=zbY%>Yv&6L~jfQ2ZVX4$w6#Bc_uz4Np*B6PM zziC;8X1z)nH=C#tLX+Z8(XB>;S;Oqa8y*#~VwiYuoN#%W19uKHKC#GnX_2}48rFL1 z^%x`I>oL{YMJ|YN$7goZmdoHYv9MQ+W zyd8T*B+$x4H+o=ygaikMb|DBs5L z#v)xk9W+$9G`YlyQxh!BS2^?MIRX(v1guZOMAJ%QNI0RI#JWk*UwQj|whVPLS84K< z!~5tewo_h?$>kz$+ulpmo&^kj!|QnM%mn>|MXt@)h=TxeEozOJYQtg>rpFiPH}xbF zIt9F9($KObLW9&jRv{Em>FO-&y4x5S?jW1X5?c>OSgKpXFko;)fn#TCvl$j+ z3xOeQi%=s>&MdQS&qgv~fX0@oOA{DXh)iMu=ThW8QOfy*6GnycbCZl*n57nbMz1bV zUasR%tcP4%L~nNo<;5!Vi&a)U_-sJXo`r0NAR8gsh+4ftM=?)6pTQxBwV){n z!t^Pc6roI-1!ktp?A|@Vk=HL#T4-|a>H=+1M5$aw1g@7?n3%7!d8o)E_irPY&mpN` z$wma3kf<#pY>Rl{;4m1$xrophAq;~XB@>_{U9YB2V+0>NmTED%_AH~56%NLhk*j6i zJUdM;pP{?hPQEjnlyMbYXb6K0Vhr9SJPX>gWHTYBE|$q=Ll!NBCof&+?BuHn(?22u zCiz|%uu5rmnS5W7APRZ={2YTrJ>0*4nA6uPw17XHo}s6+jrI8m+OptXT3MCAc^Y-- z>{F+K8}P@lZjW(ji{#5xQu)LSGL3SC)7M#jNHT$&{lGzq;^>dhAFlN`Uc7OsXR3PD#E z@k%ZmViiUwm$>J^CjNM$#65fZ*gDw7*8WbeR+?O%uMtEZiCcK*@KJ;YmJNj*qvuQ5 z$}+_e8m$Gw-CO(Fw|g(B1x?DUO>G|v#0rssgdt-`FS1;VDRg&G=xxV($8cWK<S`IuDz;&{Yx_EmofsofhqX}1M-&FS2ut%T3|4A1y}eNj z!qpybwXaJX&RzR&n)C6m}7HK8}H3lF-8c&fFLxe81@Vnc=YaJ&P=YLR&foBI7eG(=-aswb)GO2n90St z#UTj{l2Shtz>-Z+XCz5ZD?nQS_Z_~IxR3qRd+g}U17)9F{V9fg1vwUs*?0TX<(xU#eg?E zZ~y#;fnA3lpUUMl>h2KVo+ZD&z~hIuaBwh>^~&6e#86Mm3yU5j$4;>C~woJayxuuYPp*{IQ0rA|h=4)X%;hZ0LTfb5mdM zq0esR6We>aIK7N(v{))vIe%sXUs?Whb#~^P@4WJzvCR+uoNIr7^53@aAA4;2@-G>C z@f!g2Z~fj*x;h`obmoS{m^N%{&Mnv9ogDf8U-;L*5BwAP>4kL%2RjS^0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipV} z04xE*Rn(FI00iqvL_t(o!|j&8t6W7C$3JIgb^|d)F~$Ugg_e<|iLHf=60j3Am93S9 zSXiYAf`5UHm4c0>otR40LI_GU77?C5VxI3u-g_=DdGGG-ota}XXZFsn0TmP*FD!R< z?wK>^$M<~Cf&cosbmi(_mVNoHtN-}@0`St6Pp(bpvkM*}OW72qtQEuwKkW@K+;z8M5|9OnbA>!$}LnP;=u$H$HRf*j_c6M&FyR|{z&zHhnQ&9Ir zKy}EmwmB1F@`lXFb=?hw{)?LB$& z#wOF02m)D`^GRd93XDX^2;OA10bW~j?PZx#1xcGID9pM8!hAME9fYjqqlH#hLbs@U zEpl@mzDWbZwt{@KA9Yz4gsho>K+X_zlS3IUPYOXw83ijRH5t_sm24h~{P9d>RB!uE zhVzmYr@46LOtAndmvzoX`8<~kqJrjus+A&B!xJ;i%>7=C#wlk~W^soCy{d78S(NS9 z=i;f_<&|)fA7OHk%{p5T%@p?qGUCURbP)9L}@Rtr<~E&Z@L{XR^JW zA30ka@)9sMU1CkGH}A);U`UjLftYpSSp{J<>z#np5`l^lt=`B0w0Ro7XVcTy>|_>Q z)&a8wAt*_;Fk!N|Iadxx%B8i`q8TE#7C>B)iEV9XD?yX3`4(d%mGZqBr3yh6MoyV3 zq%_oUZ6vW0i75-d$mK@1mfYMttN?YctWz>RFyo7C0Y^|(VjSu_P(oKb*tj8(1V|j# zqlR>%k&QHD)2D%oL&GJ}@F5DpIl%`%cnus~VKZGJq>&hiOp!JmK@*h<#GWDl^{vh! zB80Ejwz%=@rv*6oVZe5DT5Y|0p9#pV&~je+zK|0*+}k2Ne&Q$(KYFIroGuR{&@fk3 zEQ0n(&q7z-TR^L0W_N;mHz<#M3)SO-^Cz&8}!mf)fb>u^|fct^1b zsa95Lhx92C&OUL9b7!9_ux^M3%k@kP5To&XrAE~*0N~^j~dq2 z8_zN!N_oR%CNM>rfn`IhbuifHvr}KcOFPyVm#lkX$FFwA*;k+!^Edm93$j1PYMo zBt4|_B4C_=s2@e=ZuNEqw-S%tVufMbLg4LiI2>G+7nL=Y@K!pI*L3vvCovH01NwS_ zL^4Xay^y50(b1T>S;0u+>P8=od=u=BnZ9|`v2)`+sGs77%O*hNd2ocz=5=&LvS|7< zg0~JfBX*vQPb4moFRReAGgu_QLF{|I8XSH@mDj)R)n$0Ip~fT{&gsZ$1~lC$-T_Y< zL>}l*q_3%ooFp~h|oyhhC2hwTh}zL_8HTaAr#Dv=_>Xu5zzMxzki zAT6=q^kdf#T{v{$C!n|YJVa?83yWZ$J8EB}c&>k8djqyD@}oDNhdNw9wqTf~8FGJ` z-v*hi3`TN@ld@D+FUeGY8JhEU47P=Q$YxTApE)alWgq%CRkgE~BU`5<9Lr-MQ2+}; zjL6%EvM85;abs*KQ$#o<4y}FJYvhDso-xIhE(=bF^FX-!UQ|5rfe2`;Ip-+n)<^Hg zKr)Z^!Hj7ob3df!$ZD#Dh=y?#FO9!i#XLk!HXdR{CFvfU)tih+?__62yGH?ij%Av~)_MYlR55<>t8&kl%BUNDikAecXn>ho~B8F}#IZ zkT`opVs9N*Q&>4Prut1r`e0zh%`lcZoDgP4mPjZ3vR3MVvx;aZ~6Ji-Xs6RdH~~`OcH;RbG^K zr@H#h$>n#+rWGtKMd^>{%%)+a&wOzO9q~fxjA5#rGL3E>#(>Hax2NOSlTmUK82iw- zRvF@1*=?WUzsnB`fd|Rm(m*2@%dI>mPe+=K`s<5@$m5XAn(uB2Bc~?L@k#4~tKTop zn#2q@@$v8chK6&ByUg#OXY$Pw$E~>d>EaOM zVQU02+ZeauXT>gSTj}U!QsA<=6u3z&GR-S0)J&S1A)Y}>&7hDi#ORf~D{INUbM@V& zS$4m;ZXqrnOx<+G&5QK9F|Z7VF@^ShWQIWD4stMB4URv?3x%fU{R?j`dII0~-2B3F SJbgdot6#LD?nv#1H~s6!IhU>C9%!@?37Vk`^fI5E4jH^>gcAlNsQ$RQvIND%oc z5Aj2kC=oBni3mbM3W4B&a8|(!#u)7NdN20wjCU?Q*Pgz2svERFAgNYW zb$?ZL>eP4Y`}#Kz9NMoYN(lh!^nu9-X}>M1l0e&!-hJv`+6h0pfBz)H=y~;n6E9MW z{Op05=je*Jqe^~pWX7RJ@%ib4Q{r+$$ZfmlmzPHy)bh^s-!Ox-E$}W<{Iu zNxtv%Ofl)SubX13W1)8RWd6@<-Sjev&iyQ9`pDF6CwEU2zji|yVxwG!ZQBqf32IUS zp|qSbDr-|s`B&vtHGhC zE4Nwo-{p)Jk&A(E%5t`rV8eR7PDD|H>pCzxeZ2M=WyvOyO*+_76p>bVtX54dcp={Z zs*iQU!Qq_)D3wZBUS38*P{M5qx&tjt)D+XKD+`2fYJ*ULJjcfC=UuGYNi=K@MNP!` zPzI%J5|8W|#=db4O^db+>>&pjYZjxhHy_2ad{lvFhQ& zYb@Fxk4o3a?D;;PI&lTZ-nxWV&&KwmhD((WR$4yZJ7=KNv#6*H+Wk;CSEat8C1!kh zr)&)A#Eb?>=;73ogN83)wdvwY!^P*d5DOI_rHl+s5%I!%7qQU_aIInE-B0Uqsi-a` zn%7u&cd=n?0naTuN~LKh2%-0sUa6HJht>91d2Alxs z+CDZ7o6ZXm1hf*K|FW(qTfor^Au)Lh3nZh=5z>{>EvMC^jJ`Lj#7BPV!wtBMNXMg@ z^vKkAJWEeXNquAb+8(v{jtRX|Rx+bqL&9R$4IC^h7B|Kg>EhFuI{4`;XR*}uA@Gz0 z1&TJj{RRb5u3=dgJmWjJWIDYFGp0HFpMGYg79>Ktr4JVS$3)~$m`J0L;gM2UguaJ|@6I8a5FiKwt~LVUOj*xt0pE9<)EX`%>?k~a8U&Guzn)US z*lox{fCL{PpJb7s)HDf5(dbiz5ciGAIJ6^+Bz0>PeRqtN>^pL;))sKN>GP%?2vJx@ z>dFZP69pc}_KL`aCYo&zM`xFC@V6h~uk)KQY4GeSF!S5Sfuf4yRdBx@QCGzOY zez>F9#d3}R9bfG)!+KW92m-SW+}}&r@yjt)8nKvciBlt8Vripn+ryvFvMN0 zStKPGo|3pzuT;-9^4XrYbI-0iBHQdmSye%wYP4% z4Wox&Y-ruO^Edw&2Oj^F)EW9#ta`^*jT|S3E7A`b_sdPygk*I^g-@ zzGQ9dh7C9Ggch%aZx(UG*4vT2G%oc-`qAr}f}eg;X%d?8-IX0TqqcP;{L(yN7oo-s zir9gfiNW^$zufzs>n6bS@w2-24^*t(bSwOF4xVEY7W_g6b*&vxv>05+zW2#5tW3P) z0v_I>>`B(G`dr)QTVW(p@QNAuu1!@oMU)|36YZOC!PLl!x_58?;=Xre6F&5DRcGiX zcE>AM-0{90Usl>~d_RzxASubE_k;{E&lw}1A4ib`yd72Po8a0p6)-;T&aH;mAVc)yAZBSk^lsw5QJwF z%ymE{Bil*nvoCZZf(kd$5Qy=DN^!vYgvaRXNnD&bgJM3*KIa+v{a5Tc*T=4*qdnHK zfnz8ebx@Nl01otRDj6ZFTS_ zk3-r;&KKl1NCV`Rc1PDr44z&Ap~nF&4id0gflyQ^wQDgpc^eCCn}^Y4^{Lr5vjL7N+fmK}x2O+uDnYp5{342bC)M`86?vQPE-tS*9?p<2)usL#hG~Fs?Zcas21*(B-{`v0BiPfWT4%|=c?>wQdH2N;(kxm%M792Q14urkzAEmoG6D! z-x9xizOVSkl82X$tp_VPLTl7K#Ifs^Er6>~H#KW%T@~rG(@u7-==qUb3L!58B9T6U zD7u8FE5h$ut>2`pNYQ}dSBFfBheJMli2xD?>4*@EpapRe#ua^f^t_CS?FbfO66MQc g)W#UyM`GOn0Oa}V2^~E2e*gdg07*qoM6N<$g6o8%eEMb>6@nnz>O;W~@U4`nwOdS~CEC!`7cI8dZIX3Ey1RGp$6Wtsb~kM|t?!-W%-lIM z=QsazcJ3YDzHKdtf=2+-|{{EFg4A%1x59cW2zt4_*^$|R=*S79> z9T8{Pv@QLUZ^CKs8F_Tb{v)<7oi#>xPyGnbcO$un9v|q^zO;9^*m09J?f>+?|LNR7 zr5ZkE=-Pl2GjBVvKOY)~yckOVm=N~C6ZvPSZxnxB@Yw#@OenRuocW9VW%& zI=wqKM}{t_T6L*ZT9B1;@rclkT_^Ip{%Soyv^w@q{B|!?&h+2j{>X;)9cH@ACd(3} z18A9oY+Fzw5u?o7KGEHC$50qlf6Z>5*wo6o2E2FTbmpIh+SFZlCVRR%Eiw&3hM|#d z>SP11z!*&&V8S1d+muRgNc!H=(T$rv$XpG-27K=C@)x~nr=zpoR8R&mjNv8}^Qh|@ zGGOC5GQdrZx36<*ZsE{%!EcPuZ1lV+w>Iq{nCfZ)(S?S(!T=RK=TV?E@bkgE*S1se z8Ta3v9lNgyUr}6GsJ`5rvPsi4WgIAAbr5`rV1o-#i~xeK_C#2*oeX(i>BUuGKZpj` zBrTO<5K0PVq*OIwdCH5rP26ziQwp z#c*Q{)>z=oblt##7S@fvRbY5kzDgM&9KbN1vpT*ZTvL^PLvekruD*VH6N|X!qm?QM1CNN58+l%6{@jQ z9mF?;ZwHKP90U*(_^=8D1;&uPn8$zY;Nh+5^S}IkQ z(n|SU5z9N(rbdVGEA8ab$x?RkrP<u>8W=+4qiLA*rOUp4OkA+4D=*3*?8HwA0_c#!jU=EzyOq+{gQ7upuC~dRe-) z`69j#XQL?G4d}^MN9>-SlK+89Ul5_3Bqbo1f(%7=ahQ^l(mOFRv1F1=BBU7P3we3@ z|BQ@`bnyit_n^qDtEs6SvbVSY1&qL>KpAxuSu_qa8Xqe+BqSt}ot=F*(97}y0s_q3 z+}yHXzI@36;uSy*Z?S43Bv@Wv&aJAddeGb3`+rbS(0>gLjsL8yte}(u!fRprb#!z} zkdq<{OadRx#l>au^5sj0j~_oW+`fGqS*Zt%^XSo|GN6V0K>j2kUIi1!OFK9?Tmrci zm_cAJh0$;q0}a5I6!DtN08CN_Dk>_-K>#xtZv?_j4MPqim>`UHadGhmM&L#u|0@uK zTuPLoAXmLrP*4E51fI}A5eLNDKrxB{Mi}w&@x|iv1zEO%Tnfw(?`36WQG7wHVN7@w zKH%l$?R@d##VeqiJUr^~N~s$f8lEsQG5M*fsd*TvlDLS$VQ%g6%^j;>gtDqrPv!_Rt8oW1OPBK>;`4mxVX6gK#j2U38Ik` zKZB^K=o=9c5#qxe=-MB^eE#3Y#^ygKCnvJOp!A9iFj5V&BsTV1M@L6+;R2LIHWMc_P@IiC&*y*vf7+|$+1Wt~$(695g-z8U}k literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/gray.png b/isis/appdata/images/icons/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..83d20a06959f07676617ccfde6fd7025a61e210c GIT binary patch literal 4254 zcmb_gTTGNk6rNpRmt9yy5s<5EwTKWgs4-%+6oS#M)tIJWF*LF5LmL~LdI=?_4`R{; zuQV-fLYp)uVp@yYG)*5gfj*#32nH`zK)D8rRS*S{n{wHH-_fDC?$Sj&W_JFW|I9hx zeCP5H9@@HPgUuRkRZ7_$8?)ZRXlD;J;dk%;{R0?G?{C_WrCj`XqVmVDv10jjWA0w; zXka&FCVpRlMe{z#=Jn<_OMG}(K&kO7gHoZ%j;xHg-?13%p>4g8c)3NN=r+RUA}y||NQy$Lr0Dr`S1nQC@?a!cHqDP^Y|t{aUo z5SJ}mCPs#bhlL%|&yGxxSovQ7z*q>3o7|N#7?}|aOvZ&a&NaScbKj#6Fm?3Gz|NgJ z{SnFg7A;!z2~Hd2Nf}w;X}vX1d)#F`)`7!^4{t-MJ-vGM>TQb`FSa4z3|6aE4GauO zU@2M(=qZ{6SNEXOnIhhYHF&uhw(u< zvheWX!;qk$pv{P@x~o^OHfs<9ASWkh7ZxIzUR0{(MrMux&?SkX-wOL%W`cpebm>yjL3f~lNu&z{ zQvv9mRGN^GATH6LU;2}Q#&^BFy#kg1beYE8P~oOvpWQokpt99LQ5U10>`d+4 z%WntW#du&R04<|g695EJQc`jP)a4-!|EADXg9M>F-GK;h!PWa?r_-5+nvsQIy~Yfo zQr)RTKf8}ibp*5An4fS%1ZXIcP55$EA#k!l+iX(D7@#s1DQx=d%9SgJP=L1A*4EZ= zPeVgPKaBr`eXl`r98XM_Va`8R4Oy& z6;AiPUIDlZ`Z~|f&Nkqr-{2zi9^#`DY4;_nJX5*!^z==rfc*c2X%Qkc)B=-Se#ByNl5r{-hnY8X@S57 zg^iL6ztji)c)@0%^wCmMLLy?~j~pHzp8prF7#s6dNF4a{WqxC0<3a1qlIOmk%Q<%X xcou_Y&9Q~^`8aku@OGYUPP^d2$=t-iu=lM>Ufgq!CqR1`JYD@<);T3K0RRs7NCW@? literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/guiClearLog.png b/isis/appdata/images/icons/guiClearLog.png new file mode 100644 index 0000000000000000000000000000000000000000..880453fca9d9fce84e41518a251acff1f0c39167 GIT binary patch literal 2084 zcmdT_OH30{6g|_vc4i7#pz;ZzHeymD5knyOO^jHC2KgBzvIAMT5QB-v=)xE^E_A7J zqZ=0rVFPG1h)QS#m5_)#5p4odL-^PS z3u7!P7637>BIi-EiCiT!J$s(i?;~SAQC#SR#((!an{E>#pDC(7ODhJr3i%oLE)Xc5 zbCnc`LzY;ZV^7P|dOIPHT+V})yW@mLu{tP-qL@!^0%;VfOllzYl5QpSkS<8NrfI`8 zm=XkmZ;eYb=_uhGv-5efse}nkQ54DJ@mwKL<(_L5A~rf4j=PMA5*1}OHy8}+oT?gH zfm?&oXk7F)nHWN$5Hu}BID;ffP*wE~Cq^I;geWpF#xOSKgMlB$62eJrHmmMCG2w&N z8V$ZFzh6OOq7}4BeWgwu3@YgB>&5i6ADNjum!J&82Ks7uch914TU$3`W8;yOl#Gs! zcI4#b{wDVO{YXhk(*gdzk}UWJ0s%N2+vzAksv$c&53(GN>-;gOb#9!~z=N^g!a0|T|JpwH{}D5u+)Yi*R5|NX(V&Xf3kDRy8tM}f2?a@; zo0-%%?ef3F!#`a5qU3?j=Y4a(S=X|7^!mWy(8k_`G#L$_A_7~ zeuGc_&q2Ki{gk??5ga!UjJG4-g(l_Uqf4*(zf)8oCD1dHI>qJ#Q0i>S HuetgQ=&Np# literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/guiExit.png b/isis/appdata/images/icons/guiExit.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb985935f1ec74ff5923e7e1a47991ba4a46135 GIT binary patch literal 1119 zcmV-l1fctgP)eJs>pz0mKL<& z08;arn3xPqO^q4+{T&%JHRTw%xY*%pu3vx5uxr zZy7diI>7Ms=?kExAAmu_ETE_714^C;00M{ws>T79q~5*z2o~77^(cd@s~Ipw$bs3%JB8;SGX7(8#^$S`~e#b5I{_@SY%~oW%&I03((*XaJ+KmE}$## zU_=}?LqUL(lam3KkpKdS1!gb^ynXut!;sUbuQ3=HsGx{Fc<=(lP!Ra{50oqaf!P27 z1Pcmqj(Yd*J&Hn0OJj!AR6h&@?CkV`WE{h!NsCa#zkT}xcO*an!GhudD4YKJ^^4*6 z@84i-W@f;UlM{^M{X>T?q8Of+7YEJ*F#O}k53pGvd4K={8w@H?KzaZB_wS&XWe^t^ zW5~}BL&;%HO*0v$PhZY(dj2Z)7-m@;X=!M4vfx8La2^>sMeiV1@w% z5DQYlF##AH{;yuWHc(Sj0j7rQ;PASA`ytp+9v*JE3s$b&!SL|mbD&Qzg2k^~xeCnM z-#}S<0!$4+0HG8@CMH3kY`I@rT2??yOPv9fw($W_rnz+KDlnDY1s6isukV5vLI44T zQEVC;2Z9Wr&&kPUprfM$%(mD|xI1?qGF-fP0hsnbfecH8845EPAb_wI^oEB1;DR2M z_u1Lm1%!k|fTf)TSi`et&lujkc@0bf-{A#4&`^wm9w30Q8jK8}c^_Og{rmS9rtttQ l_Hk8B00G2EtI8B0zyRRb`ov(v=I8(b002ovPDHLkV1heR;aUIy literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/guiNextHistory.png b/isis/appdata/images/icons/guiNextHistory.png new file mode 100644 index 0000000000000000000000000000000000000000..720657a28f426fbaed6baf57701e29c575ce37ee GIT binary patch literal 2084 zcmZ`)eQZ-z6#u=izOHMxc7t_o*(Ll1=KKxFb8ZPf&^m-F(#lPf}r@3Ff^b< zB^Y8N`iF)X338#G7>^`aX|=kGugVfTep_AUEB5b>pjnXr2}N1=DfGvd*1J! z^E)5+X!H8j7L(Hiz|yd$ej~lhm>LcAyms-8W%M%aXk1+njs3p6^1}&QDR^_u*0<=3 zJ50H{Io}+hMR{Mtx>a(Yi7zu0y|(tyVp_S-P`_f+QX6+#-l}k9GPz7^DS?`40;e_u zTs0Y0lB%RbbmlEUy9iPJ5d)uuCIfgBc-o!#g{US&tQ-GX#h#mGnu z0rxO4><6N;Fxhx18bfEE+id0rZ zR@L&~fTt5g9vF$H@%H(C{QUiIfY<8WK%Wsn)>fLZu3b-?LdeDd>+*imaooB+d# z45CVwD7X(gf&RcBM}G0*+}D=@zrPcrw4Bi*==+wscZtt!yAL#B-zpdUV`+rOGe~AM z9W)qAW1hVLj$#Sj-YCdX#FOfTE_4;5D{V%w$Kym&iDRtengEu4sAn8?OO3627r_@v zBM{AiQ4k^UzPm{XJcq|C3Ly$Se1Qafv8)~ui;Ag2yxXlZuKMUi-{4ayUHO#=WH)lf zMa6qxT7Up~))!QCFIo7WP>Q@(p=#1Z;PF%z!*uX}rN}6tYHlS4?)+V>jYpeA(I7Rd zP6rwn*l=qwp?k@a#ljE9asV>R)IDJo3=>t8NmZ!~kIM<6ufJIoWO1QmMmg@rGq`j+ zj0A<1xtFYb$}HqfURW~!4_GA1V6{Rph;w*Rl%|%H7UF8}7g{Z0M8BvJJaY&S4L6Wiz*c%Ry>zN&( zj_M00@xcW*G~$6Z!oe42;JI1mJT9soCVaVNI*JN%^ql)WfR4U6M#&-8nKHE?VGfCe z-aQ_Q&t|P+lyXTr-8rgv&auribnq8z>=VEnmauV{leW$PcAxEsk)mTlu_K+Nks*n< zc~O?ygjh_kM>8dffipdSGmMsYcMf5aXWJhE>}ee!K6Br&1heW9<8eksyHGNBvzt@3 zoiSdPE6UA?C9^aK*eu}i*H8ju@id;PE`A95%ymEByGWyf_+)m>Q!7!E2u7gZjf7;A zx=V=kwkp=STewU@Sy^beq1Ytq4I+{;)7yRpajJ@CGmCWavjlqh(ja*y>if*5%pxI4 z4kh~iG`?}jec|OR)OpmkX10XlJ`ZG(S?57!8+uVvvow zPGn^}l|U2JGzm`td{(_7rYy%9CT-=U`jwwtS{65qwnCR{cDepRXgrH3dGg@MWY%nU zuokw_oMxlb*F6j+6!UNbYI{zt^D&zVVD=9K=XvS8WE5*kD@#z}vJgOy8g_dyVRgzl z9aA#!_@W37gpgL!T@uHwzxC~Ek8VVdhk)7QW7~f|v5$_=dnPetHSMHIdociLQ6VE5}pzQq!aDH>)&JG(d(siSuk-B9*tvktDpuTZ) o(7H8_Z{vkbd)M(5?B07scGWE3{MpWm*V#tHs`d4)b=yDu7x#Wz%>V!Z literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/guiPrevHistory.png b/isis/appdata/images/icons/guiPrevHistory.png new file mode 100644 index 0000000000000000000000000000000000000000..efa12d018a0ecf1cf080f45a6b57496492ea3bd3 GIT binary patch literal 2084 zcmZuyU2GIp6#iy*W_G*XrMs=Lf0PnT0EI?`hl&yqDALl`)s3b=I3IqZ%qL2^_4b?zs+6rxV`@5z4zdN(DGvm3l&O(8+IdgaJJ@>ok zeCM1y`&yea-%HC_(@ILLh z&6Ha)_xqhRY2VSfc9s3ElbU{uTP5^D3pl+M z;AWH23{stRn9jTj7-t~pCor%#_Ben?fv0aPgW=pp#yjD5ySacLz8W9=J~vcN$JkgJ z(f(0jbOcDH<7D?GMDc6%waE`2Fd4YIEeJzxhs(Vvxa3*v-m(CV^StmlZ4h`K99b)> zj=l*6?f*>RizA&#bdd9@)D4Q|Weo4`x4`cM2S2F>hpPzqLpwfd!e=ctCQvr7Bd;0I zbi>*Mo=y;WU@WEL!()9o`{N%#BoYBH)gjzA#0-nTEPOaGBN$wC@T+y$ve<_V0mgF$ zq-2dKFp7p`ZQRE%9kl0s1iv1-2#kz$KoFNOT5RU3d&S4Z=f-z;wqVDq5Jr+JV%Y+e zf?9DnvC(G$%f5?AofG9P>utjmELcM{ltK3oDmdUXWHu1C#x2EP5J5VA6(B##{B z1Z8#*3)O;65^WsEqyL_QAqw9va446EdXkQR6WIDwFXqkinD6Yt8f4GKVKb?3KJSB0 z^*2Uzgi{4fP}HK0hfNeU1{{gUvvXJl3{Xe0a9R&`p)TOS`P*@5qKIm$WlLDIFxqyV ziQxE+2}JJ6=!vQ3GV4q`wIE>*3xwX4jb-Mr4seJ?Px~fRYFlPZB}Vnin#2;;fvg*u zThpNz(AquxBf#OLnoo->B=Ax1*kVg-TKpQM!yjnok92*%Z>q;Y&fgy_R zyd+7dY?_|z>K?}|Di_A_!)j*xe-w#=czE3*a`4hcg+vm(rpFv^?i4?8c4Lee#J!ow zn30KPURj#RX{AV_)D+gdH3q1Hbm~YW8e@su*LQMr+>CMhYrm995UxmG*TT@# zA=n9YoVxIV3k|h?2cEEVxO68C!$#hbu(F-%7LlVo4BZ|?K9;)1r^}Z0o?D}o$eaDf z>5!q}n!{Tj3eEAG8)8`vDMg!fWimh;A+i=`;j^oAuxk`@EFI=-SloSN?I5!$0kand z&hz3i(IM1T&8S3m$V~u(dBd@<2NPDOEKy0hfbd`n;{!3Mvf3$fT=UJttHY)dJthIO z$(fseceo^NJ1u=c2Y8$w2fUZJw0C~9oPGBmkaQ{Vsq literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/guiReset.png b/isis/appdata/images/icons/guiReset.png new file mode 100644 index 0000000000000000000000000000000000000000..57034cc54887cda46e264f070beae866a840067a GIT binary patch literal 2084 zcmZuyX>3$g6#m{e`%Gs#rQ5XA7Nj5zMp~2_wiJt{R9Yk~Atrd0{*cucCEE1rdDQziTX79Xt@6CIj``Q7j+{t-&?#aF1`Ob3B z-M6~6$?Yh00B|?2Xk0^cArqU0z86owxsWEymX@YQ80`1i4__Z5jeXmSjc?P5ZYJEa z*`MwprS+ZWRm-hC4!%(Gb!_dCNOQ8ev0-h!kNe8HQRZmN6UW@GKl^wQuMmC<45NlN zm4bs{03i;>O@rf4@Pc;g>W2-{CjtBqxN`Fao6C}Y3*g?BY@*lUwZTVXwTPtRAg5JC z<1$ha8Cph*kzem;tjb5X53S5RZeR*<^``FvJTHAqfD8P=e3S>=@YqDCS%XA3&q)Fg zN#GEdHT3l-FcOYHmDQ^f$F*KR+|-u?e+bM#jVwBCK4%~>s~FSV5+dVSBr;iKbqc^^ zL*O|wD8T0s@F1b0|KMH+Boeix!`&HZUgutHfg@sUnBR zHcf?|utNAIfpkX4KzBcsNTQQZ+LzuwyD~$81Ne-wO?Pm$1v5*a5!%q$M7S#Rt=Lpw zhy|5ScpV~Q=`6Z>llY=*7^#$H>vBdRvuMs(;P2;xto|M_DN&8>FkXd zF88GH@?0#N)-rb7X*70*?;uwi}y8fJMA9#hOJU<7i)jKsSBgq|7SOZJ6hMl2pXaP&H+xg=B- z*vKW|?ucw&X$!@;Ht0m-(;n1SIANtVPjy%57Ri0-p~R_FL)~E*i9`&%bW%XPBMr}D zDLFLOFkW1SwUiX*HY@r#B||48Y|R=^n#yr7rsBq6$~5XEwoEMK*}?PoFw)TpsOnCH zcb^x`0Oig94T`a%^TtqVuqKElPvx17NFnND6yqW4VE5xHM(IBTXEDyX&*qOi2JzF; zAAv~Z3PkC3L_4$z;P|f^TuaU(kywBFQrMIB7h*Y8gqvEUo!B_&u!C-94vh6^)-p4i zj`xm-aPspGU|`@Lc*~0jw?`P+$y}Sf>EgGS!cb4a<*qATG!J{WJWIX7M_o*yYT(%e zf($Y4rABq?uQ7aZxsOKF7;2m~Zl`3Yi(E{F=7iIQr<252zRg*)6z zBqWgN0uy2;#uzl|0*fmpu#g{-C|C-D{1oWW8Ju=X+bQ#A-pssv-*o|uB9)um#W^|m zJLjHz&p8H9S>_%BKog1I>L_v0V1zUdV@tPTPMYIYf&VK6^P z^7a>;ICBy&U%iTAm+x|v{dkXoA4Ym0+!oo`^U^zF$NU|%*>eFXsS;94LS~4N5vn=3 zFYj|C^Bw!o?$d=KXULaqXOgptY(kljjKpi~wZc}<+w0ykc6PmoZH7s^X)>iWMdct2 z!9;bEDQ^nbFX3qqAD^yh7t#8taXx!)mglH|SXSP<=EwY>&_3Kfp$kCAaRG}+B~s>=1kH5vkqn8M^vF~#Ze(~MWg z0R)PrXy#c!i(xRYCESXm93nc*@`e`xaB%o6^(l^W02nR}17HiAu4osV8aD&5Zek7j zsXS)L0+SZO18~H!L|w=Xkt^r0h0Q{9Aplp(m&sLfwKPPnIySX#rY$^|PC93Beg`>CbH<^YjVEFsPN0=fQ!nJe$WgcF!^@m8?LLX04y>W zbF}*y{j0xcskQV8@Mt-Q^d&(nfL~HRa0831*qYs1^(BX;Bd4p%V^(N3MOkFmrH{B! z8K?o8X$C+dYpDXrx_=S1qEwYfwcr&|95-zy%}bXqVQwVjSM_r!-QCgJLA_Ov@+D^` ze&LRn;+}txo0XdkI0GCR>*uTCFG+dBokTU>!dwWUF zNiGo<2O5?&Y*^p%vItw@$F6J{7E;S6QsGLM(|3OMr~jD#-LJ6Etm6bQ`S0!~bcMx+ z#pltk=!O*wRuYfKpEh6^a)ubZH9%p=IphwVDUnFf zzo_2;g50MGgE+8=7+TnPC@Q|kC>B{9iumNoQ%n>RvcJE-#`zl|vPUl3;0SR50000< KMNUMnLSTY>sB#_v literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/guiSaveLog.png b/isis/appdata/images/icons/guiSaveLog.png new file mode 100644 index 0000000000000000000000000000000000000000..dd33f5d4ed30db0399ec49625e5e35c138b9bc31 GIT binary patch literal 2084 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 TC;rOz33%JGRk0&Wp4<5kwQo8& literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/help-contents.png b/isis/appdata/images/icons/help-contents.png new file mode 100644 index 0000000000000000000000000000000000000000..6631abc97d9cd55e0c698d4ab09c950dd9f5be24 GIT binary patch literal 2084 zcmaJ?eQZ-z6#u>U^^>k;9dzpi+I4Jvx!{x`*?_oZ%P1hA7{W3XV1|`G*V6OKZy%P>OZ(26%5o^|S99UyA+i`gT2-}! zcGNNDc5kZ^$f(=tezih(->8|nbYb@4w#Q`o#a&+d#}QD&XZ=NlhkW`MXQ>CO2Z^DtAH^Pq*4Ay_b>-Fr$DEsL_vm}NI+CXND>b< z&(L@%^OTXC3lE(m)DO5ZGrZOTFKn%mK>4pD+7iGO2$X`(ip{xQbl?uAEC(w1V36ga- z&NN<|(caR+fTN^zo~L9CSdr=2!U&YeW8?-KuzaxtmY1l3I=j%{-=9pG^T9*pyNi)e z0hD-J53US{w-a11X@r;qGSV~l=nZk|AWo6RPrfUV=emVz~qiRXAU41>1; zJLYom&zObu)3x}fu??R5)%a^rizZ(b|D-z*>}*C}e>V(s^Wd=CT&=CGepODsZ?q~{ z+$j-68JrLUC&y3`X+vkxMlAaK25MT`QCspp)Mguux@km(3QPvN=NSSvS!*FI;@Iv-<@OSUxVr~UE^K;OWYAjjcEjIAevoNg5 zf+uek6t5Q;9>$XBuqhrKvL&go5*3C~jLXCO1Z#>YA)E_t$t?2k(dOp&yRRK4y~5ms2mamB-8O( zV+skG?i3jkHAaGC5X^^Kh3BbpBnrTs@l0TW?!kLQBe=Gy66P}}urcg|YoH6Ucnont zfFMd#ITFOUgoGd>E8LCOqCK4H=6SS!drlM!_Vrc7wSJ6 z$VEYTeHqSVJ8-M+IQj(c`l*oe$q3Lz00S)IK9#GuFlI`(h?G%|SNX_>L@dG!gFgMa zTQ_G)gYoPawOOT{k>7N_*EVJJS@5GrqPi(|ZXZYs)x%d9wy?5@Nna6i4Q^i7WA&R16 zxfIXHpM&Hyt9(^3D7#hpc!UkMOT#V5j_m6X{cY*5yry zwiP!ul83Or@JS$kl%<{uzsEgN@W-i3dB;(zYG)D+W_!#&UukHKqLGwZSh5v|^$2m! z>}O%yVE$3i+lwrzZCvK5n`6K zQ~xPuMXGJ9>V?9X!3ge%Z-OlWR`ON67nekX`AZRsT5dvk>(8%*wzaqr literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/ice.png b/isis/appdata/images/icons/ice.png new file mode 100644 index 0000000000000000000000000000000000000000..c136f3323a5556e07660e19ed03f3f169a4805cd GIT binary patch literal 2895 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/kchart.png b/isis/appdata/images/icons/kchart.png new file mode 100644 index 0000000000000000000000000000000000000000..1b614d287bb46b9e311b584bc9b77dbbd9f23614 GIT binary patch literal 1909 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/labels.png b/isis/appdata/images/icons/labels.png new file mode 100644 index 0000000000000000000000000000000000000000..6231f0965cd450a21d73da463c73ab29f8159159 GIT binary patch literal 2084 zcmcIlL2DC16rRl{o4PdUra{qyu_BiKf)+ibm6SH9rAR@76iToMK}4vBfb`N+6mQ;x z2WdehD0meb@PCA0BZzG&sfk%}cly3{XLeoFO-q{>CiC7m-}`p*b~5k9{M<}Jzoaw9 z61myzJ(|yB3~2QI<&G(E`5k^PH zLWL_8kJrr~AHTt<3PTXKP4gEU9=_}dwpy)FVLz{%4=pkdVP={g)^0lh!V?*^V2<$Q zWadO--I8&B4?UyZ5{`n=vDX}n479~gU1?G?O@>nbuTcjtPszDQ_=!XrW z6oXJM6bd~bP%f7xNALv}j8Te5r&Rmsmeb z5q>#{Ego-HOv4sv2*EH?Et3x-kXS9Yk zL-#cI_cV_{p5VA3dMGgNG*jwX24WJB3m}Ll>Gm{0|C!5i@@NqoLo>CmzI*%p;e%Jp ONXSjkWh=Lq)(!v#O2sJv literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/license.txt b/isis/appdata/images/icons/license.txt new file mode 100644 index 0000000000..f8aecf92d2 --- /dev/null +++ b/isis/appdata/images/icons/license.txt @@ -0,0 +1,11 @@ +Most of the icons have been adapted from the oxygen theme are under the LGPLv3 license. The original svg files are located in the svg directory. + +For more information, please see: http://www.kde.org/ + +A copy of the LGPLv3 license is available at licenses/lgpl-3.0.txt + +The following files are Copyright (c) U.S. Geological Survey (2012): + ographic.png + +All images beginning with "nasa_" have been adapted from images provided by NASA. You can review NASA's Media Usage Guidelines at: + https://www.nasa.gov/multimedia/guidelines/index.html \ No newline at end of file diff --git a/isis/appdata/images/icons/licenses/ATTRIBUTES.txt b/isis/appdata/images/icons/licenses/ATTRIBUTES.txt new file mode 100644 index 0000000000..36b9df3370 --- /dev/null +++ b/isis/appdata/images/icons/licenses/ATTRIBUTES.txt @@ -0,0 +1,2 @@ +3d-glasses-icon.png attributed to Fatcow Web Hosting under CC Attribution 4.0 (http://creativecommons.org/licenses/by/4.0/) +HILLBLU_molecula.png attributed to Hill (Wikimedia Commons) under CC Attribution 3.0 Unported (https://creativecommons.org/licenses/by/3.0/) \ No newline at end of file diff --git a/isis/appdata/images/icons/licenses/lgpl-3.0.txt b/isis/appdata/images/icons/licenses/lgpl-3.0.txt new file mode 100644 index 0000000000..fb6d90b9fb --- /dev/null +++ b/isis/appdata/images/icons/licenses/lgpl-3.0.txt @@ -0,0 +1,166 @@ +GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/isis/appdata/images/icons/linefit.png b/isis/appdata/images/icons/linefit.png new file mode 100644 index 0000000000000000000000000000000000000000..213d1ad57074a33f88d46df6d4106c9991fbe675 GIT binary patch literal 2084 zcmcIleN0S?V-2NtOfRw5?YAsc&NsS__u%u7;!AqLH+R8__Z`N@=D(f;wOa9f6B#Et6cm=ym zl7b@1k`xxD6n%-rWRCkglst}FR#vvvX0!Fh=eP17&pa+kkcrxLMWS4(V_@+6<}m+z zGs0W~CgCPyQbk3Di6YuzG#bYo4##}L8WZ|E3!spzaQDV~s8e&HP^CexNP|j~39ZhA zg_)mFZB9b(w?e{|XHqyE-nx<}tR#H;b}lr!0^~oi3mmUPaM?*DAQ*5WBzgdz!0DfvF>olCq2_G29+eN=-?V!XYmm`zEsUpC?;q%pO8c!Hd*nL2$*}wvn=d zsPWPVOG~p0MmpIP;yK<)1{+agc>Uq9(FXa6 z==FiNjMkL$1C$~IK6_z^yL8osWVJdPaU#qW!pXBvY5I?4OkDS2LGWPF9e~>{BJa5# z16NcxKud=@w_iClId(qb)zq^oZ*D>4PMi^#4$f#eNPZqO$ zvLZEi)nDsXsbtV3$#>MFl{tfBo+ Ds4vH_ literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/link.png b/isis/appdata/images/icons/link.png new file mode 100644 index 0000000000000000000000000000000000000000..13bc07ff8d2cc3365492389b8f4eac2262407430 GIT binary patch literal 2084 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 F{{p4slQIAR literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/linked.png b/isis/appdata/images/icons/linked.png new file mode 100644 index 0000000000000000000000000000000000000000..13bc07ff8d2cc3365492389b8f4eac2262407430 GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/mActionSelect.png b/isis/appdata/images/icons/mActionSelect.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2385c64063d65991fd076808dde592ce07e39b GIT binary patch literal 1086 zcmV-E1i|}>P)U(e&6+U?F~^Dg|srFW||vkq$n)n<(in>EwIg$S`)SWHCdkHugW ztdbx$rX%_*lFb%euC)f)n041A9fTHPZka(cl^yCs{(8Feyz@T&asIkXxM02EfzR{) ze!lPT=XrlW-|qv>BCJ3G5Q!7&D%;oB$2#5+NfQy#H0}76_CU3=ny+j>yFWo-6)!ft zxl1Jp-QC^H1W}+$#C!4DPTZXbfX{VZ7v~2e&?Jq?vlJ1T2W%Tj^{b&oVl~qMwj^Zw z{)iJILMRksXlMwimlH(?FFyqb4*=7^+X_gd_gCJndw}#C(^z{3L#o3Pp+uWACg*~t z!AV=D*{srBm3tb1F+*aK0-5C>?o|Qwg}B$rXm4*{ix=lIO(uW`a|r_($;lp%hw<@o zbX~_&5C{QqWjJxkU@*8APfbmU&1Ms*dLE7@?$V}clGkXKkOFez>+2ke#h|>1MIsXY zc5uNurblpF7h>+MLF3$D_R^`Bb6fbdvu9^2C#G~`9zcEn(n4mcDn@kG3ZVYxH!T0! zXeH6fp^2ChZ{OmKrR3zo!a^!5E7#uLIV-N7{=~m4xyGEF9O>=tm6etjBP>R|j6h7? ztWJl+L4SWg#l^)0BbefBY3DPWDT|1Vj*iOk@UQ?YM=ltQC9A4xd@+~HMO#}N^+(SD zU~)FSbXmFoTn%Q6dbobutV5lN1_FV4MNtZSdV2PEbbNLznBQ`qDiH-ughRj=oJ2e8 zyUpYk8f&-s)JeVm7neam~2;OL?}YeKR+gR%B+unNd^r z!|bK&k7uF3vX^p>aCNoD(leFcjmT}o`(s47=giX^t{;oa|A4rNSy_t@*Jm3~-b?s) zg^RY$g&!#!GuDJl^3<3KqNygjTrL_K8fa~8-E>^DnWOoZ#SPuC`{KTz1F1c9I-P5= z!{HFG*PAfz9}&Ux@xFCieh;VL)KhSBl$~=evrZF)wfvT#w-EJ;)oLqW1-5Tu&(l{os_RJPO`ocqa`p2-`ZD;=bKgr0* zBxW@ezH|fAeRpD<_70?f+0n-G@-jZ3kAi{%^7HdqUS6iU`Z<|3ZC9#l56yRm-us(p zkGlYom8UU<19t%1fyaO+fLh>YMMXsf@B^hFO{;qU0Hfu6wA8?anE(I)07*qoM6N<$ Ef;!>{wEzGB literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/measure.png b/isis/appdata/images/icons/measure.png new file mode 100644 index 0000000000000000000000000000000000000000..9807b87e72d4d399adace7e50f280db624a78483 GIT binary patch literal 2084 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~7rU^Ep1{{R0UsEYc4 ziTXxDOdK^B9wkwHf2|I?+iaCJaSz-*YJ z6+z-agD+abM41a+9KYth)eDfF>D2hCwvv2~64900H zP=cVrcpQb#Tm}|&SyIc}b1{-uMg~?S9ww9V=|O$sa~??ldtmP4z%&S11f26m l%VSuOkR5q218~tp&)}CyHZBV*xNSf_@^tlcS?83{1OS4mTKWJ0 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/mouse.png b/isis/appdata/images/icons/mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..427f4c6c62aec27e06cbe3e6ce274048ac36ae11 GIT binary patch literal 16598 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/move.png b/isis/appdata/images/icons/move.png new file mode 100644 index 0000000000000000000000000000000000000000..92c0d2d2631747150cc0a3149b75a3ff63965e30 GIT binary patch literal 2084 zcmbtUZA_C_6u#y4?N?~UFUrs%{E!eg0f8(gE(%(NVkFyW75+KxHc`IRE%65$HGYy9 zf0$_IN1{|J^oc`kwKrV7eW{;#pZ7?Co;5ZjDP=LwGxwh%laa-Abu|XdF>Q5y1L?u-SBWS zRBJNM?SWGBqh&*(#;r?9G|Kjjd^0pH7IT4h#T-?mrs6diQOhDQmqyKwl4vMgS2(=? zz`ii}xl#H=L5mX&?w-dqHa1F0pO_r*kfZRLk+Q`8ojo)-JV1T@KDv49Cc$GbFbh!4 z=sgudtJB_YYj35Ft_Q$<@;>RIVoOm7{2V}<$}esz!??b5Q@L&JeA9ekj5i9SAwj5A zDp6fiC1J0Jz~P*Kkfe$@aW*qM)9>hbK+j){P;FgxNY=`Yh?W&gM9$f4;4ttxz(q0v z=Jbqomu-{nIo8!cGQgt3hnp~?ji(p0DaqtH^Ydxa$LpIxod@v8IAwgS=8S`L%f%}@ z)^LQjZT}$*#)WYkrniy+!@0VhwPBC9m!1ywQ|+!AE|4AIU>ZpyonM@q;=+0x!17sQ zQli)0+fAM)Zfa}4OF6kY&!D$PtQZoO=VT8!IvmtL_#b)udT9u)#rd?_%3i_FhraUC zm5UKuOKPBxHEul);FzIdh*E?`;d*BfYA)-vAVW?F?DY{*<-V%J+-AOO}BXq3cXn6dWi(`uP4tecX`?ryt zb4&3(;Q?;_fs05bTELz5*WZaX@l~x+H~-Umha8>v$lTRy?&#KTd*?rFq3=KyIfB4kNOD*;|?e@-HMY(nMAA2&0Fr>zN1osEn^b< fN2v_(=Hnfe%sX7rbUdMAjLDY5Qgic~%?JMnLBn92 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/nasa_enceladus.png b/isis/appdata/images/icons/nasa_enceladus.png new file mode 100644 index 0000000000000000000000000000000000000000..11b21c8da523c36e4363d8b317dee84efb9987fb GIT binary patch literal 1738 zcmV;*1~vJKP)Yj7Y z_xm2d?@`Qq&v3}Y81n#dS1Qi=oc`}_NPYin!g<;#~} z^!xqKH#RmtJAL|ed6;Z==pkeN?%lf|uC1;8ZfR*LvDShyhA4_)t%VQ*jJ>(8l!Esj z-h1SE?jJmO@ad&Xmwxs(`E!98WB&2u$BSiI{&jtQeI?Ixlw}FdIfM}K-Xo4<2qC~Z zr#oPb1!d~>IyN^q^Ios_$>qzJe?5yM=Yd|oe*Jr^tE+!Vl7#j9eK5u#r3B|Z{HDiy z56(F_=kVUcS_|hKoO4)NS*e{mb?R4*M&kp<*pI8=Qx-GE{O#Mfe{$i%g?maVkZXky z!8$4Bly&5RS*xwJK`HM&dcEGiE?&I&4q@>s=(TItzH|Qk`FjA6Wf_byaLxtGsup?g z;hcjpCY;fC#+VR$Yb~s`ID7W&sr&cu|DMRoD=v%9ojdnOYb{2jQE(RlkN{eAPTw%b zrWBxky05jy#>U1EZr!@|^C{pvckcYHUayOyC}6EcS(X9B7!$x~Piu{$D4?}|t1{#* zdY?=tSYKcNC1dPOd~e>o`HeGY&iqp;1u13tFp45XQ3TF8q9_7m49+>kaU6(NWwj9E z4P&L8@&W*qWf_!w^ytx_B>*Hz@|fZmMG=%zFvb7?j4_Dg7|yw=xEW(0ga{1hoWmG{ zD2l?}>O-+N#$au2?R|OW%9VH9?e^D5;Fkp;ST3au1R~Zt=OBa#x%J!|b0VAb8m z7-U(7D2kXg#=Nh!#=*e>;y8x)K3Gf@iohs`36v}$1qpPPX!M(ki*pV#P16rZW4cfj z1)?aL%FSw#ATT;3i%2Me(S7oy);d@&i=ue1EK3wc5sCvTBBewWMbKKKR;x`3<(vnB zq;SB)nG14L02+@+KX){y2!QJ`AQ=&VXQ+9xaNteTdjgna$_ zbt}uVQ1ly(1}2k9=r*JfV+>mB!0>8~CQIpe)&1n!Dsd;13FL4%^uys0N-4x~90031 zDuh5;mWbmRWm$$anr)4SVWVzNFd7h&v3J7cMkB%QdzPzxoFcl-pUwS76$Yo@~Y%3(C%CZa< z%Q=UlC@`5!kYyQ$!y$yV_FZf3`oh8jk|YU*gJMSUoCPI@(q6TmS6NJpEKSoC{eB-p zO34R;aa8xHr8?)3Wf`(8!(=i+nx@#@-G!*tY7?#X z)uJfS>2$(OMKRM_qup+!D2k~RBIRb8TTPjwD1wXgJjZA>!f-gmlP6Cg$K&xU&iNNR zJ3HUn+}sRWFDxuTYmFpHu)n`Qm0HxXh-|aXfV{;RLzZR8^Bm*x82x@9&z?O)uh-KO z0FE6y_Tk>%Ui$p`^U&Iyb7-|%fr(N|)a&(-N|Z+Piit4>Ns^%7?}KxW@pz0hP4Vj0 zD?EJo5R9=;!^|awxaYn9NC<(Il@+Y6u3~X<5l4<3fl>WA-=D*el!KFlzK;Ny-9_j+wEd;aS@$P z2idK9%x`ATCIjgqY;>&BngrvL6&70jYiN~V>}*XI2>Yse;;X@5)W=zYp)*qPeLhm zT5J9Hc>_Py^G2fqrBp~KAw(z;S(Z%=A&jxB*4kUM^k?%{r_M#`j(RDw%VX_QtC#X_g1)hY@tE-K1=c1oeJfjL<>?JFB= z&C^v={rzItfAYzvo=-PVJkfdYanEl^X|xl2=kbTvq4S!?89<8vtK55!5CTBF>jPJv zo0sF?N_x>1VW@Wv=N1TUL|YfQ&SS!ux-7}Fnzj*aWsd1qc5-V}e2JF7ed1s4Jp}OT z{g?3Evk(5b~N6<1%+onQPc7ystvXZ+k5yB^rK9Gx%gDQ#7dBq6@YNM{p_(F8$2lq_JQ1Q0kg zN1NxgK;tCEXw2GH&DJ=js=LQG*Eg?v^wEc&bGO|s<%i$n{2jL;-v8kr16=oqH}m;h zZsvEcxOVRuyLNrApVY&?ZRx6#WMQ6abc)f5S5Q`CltNmKwINNJV!{Fag%#4-1dl<5 zF>T$_G=lX>LsK}89y@VjYc#v)JMaJX7k!os`3E2E0K_%>?&AypegJ?QKK>WGZD^m_ zwxoysAfU`nf^!%xnVvdI6k58bCQB#udwrU6g3uw`_wFOFDts&HfXT^Y#Df85u*Bw8 z!E9QywK-2YFtxL&c;MZf>nyy>Iv{I&UIKVX^M=^BmY5m>L}%OOc*MZZ)wv_d{fh# zPx{E{qBpx7|~Ks$8=?e z(vqgk*>UDxe39d*ab-zU6yRGX$6jH2{5Wk@VT~pmtx=9Psml~)EY=EyjkecSJN(zD z9{tvnPd$PHIOiAkpKoOGmx0T}E*s;^8KSFE3WV>Vt)XiXt|jh;GPqo(Nd#~#5XTnxEhO+SmQY6Hh$$&qw7aKl3?@OW)b$ zTSHf+G(|?4&Cmc%O)(o$q%&}WdX^*V4((dXwN1vyPa#`}kP@jBfenb~1}wj7H@$63 zl#?lKS!05L)6P5{i$LX5jLWwrD*rtIb=Lk1=XE`~Bk0P=NKn2b4h)`_I!`f5V2vRN zEIKsc8d}$okH#2lP+B9E#3694V`=+o1pRr6X-YGl(l!ms1h}T71@f|>HyGmZ(XYM! zSH7#YuUpwq~A*@q7am%t1IfJqU$VHY3k7ib|HRsj{JG;i^)Y@K7%HwoJ|NLO%NDd*U%ph ziRb#bJO$rT<~mwSw3bK{QBHEIwxy$kE+E@n zqwEyP%C2)|J54XBCo__{Az?qFZ5y;P2mvMv>57Ul2=Hx(mI|dbQYn&!A+mGKuPn2$ zyp5)9iRKbKj_HYGj9z}_e;_~_kJ1X7hH$P&wKb+(-@yCsJYA*Po(PW=0v%ey&=LiT zd_2N;4G2e`Rak3~+GBb#Rtu&ZYZ$2!N+66TN&1XW9KjHO};hL@KdgTWfd7Mxc?nq9*TZjP7Bh09=CJZ-pT2_o+T2qbo}CbVi-!NG-_99HAt|c$2!xi3fdTU;#nr9lj{BgCRB<5-lyGgys+uQd^+=aFm5Je$YfL73y6~;)Ulmt--P9bE+Wc4IQ zN)Uq9dx9t;7z|Kx4=W@#iZRw=`UBF{RcLBj=aAasTSw;s6G0TC1AD)2t$eVbEPYgW zIkJ_MO^pc+Q82(5K{V`97A3>&A=%~zNR7}AlqZmyCNJok3TX_{+z{s_v?)O_z(g_O z;v(M0G~Us64(|h05a7{7w*QP?oLhdnE~cwxQLd=ALIn}Mg&3L=B|#!6^PJh{8daLo z)Gfv;=2jLdr#aeM^4S*Kx9_I6vYjv-K$}x!1;PFWUViRboHUT-=zfUpEi;`~2o)Sg z=)>A;Q=sgZbUc4!5?hQB7*S!O0O1-Y$6q3{A=B{`*;K?yk5)D~=kR!R+@l{Eu!h0H z=?s%ad|R@)c8t;5VfrgO(EW<>XqDdL8I-LdkQt3I-@W0cPdzUWUi-n;EAcnj@Kh}f zKIkEJk7Qv7^E+O}o?m)B;oJiK`2i{!AbT;=7^agcLQA9yh~pjf7WN|TfKD2mvdCzN zvI$L5V0$6){0@9LkC%#0nDuOH{8a!6@UiP}c&5SJg$gn85U+a#!_%odNQ)djSfoP{ z_vZ+MgfLhDEH#G83E~|)F@t$lkN+o|t4G*aJHcpcl|~Ap#U*A%gO3ul?c+p9NBDQ2 zy!FeEb@$#M$=mPx3ILrJw>GVRvM6etv5eL?>F5zJ?nNc15pCPe;LLN83oH0I#DyWz zV1OO;nB*f)oqCS-Wv-9_zk2Z-0XTTw zHQ%>Ud{OQ4_3<=ioTbdFnpx_pnuelmXjDYgdg^*Y)p;7>@lN1^kj8|Ji=4^}Y8f-m z3aVC8wwA55c&QQM(m%caQ!n`M{9`OmZg%AB)lZ1Y-Cw_p_x$#Ix#JrT>>Q8Q{=wC5 ze-s923rdU$;|1EzV7hhIj{N{sgF+DumQfl!lCEn(5Aj}s3(z8>?Ycv=ygcwn*WU1g z|Jpqo+3#Up$Fi+{M$P`|(eH8b8(zch-@H4XoEqO!rPbv@#B!(=$|?Y~%B-* zj?@MdMbvFeU6f!Fyo+dRzmd!@erv~$T^~5`mdmo@<2T9hv>_yOk|>Z&%TD~1i~{hv zzy2Zz-*@$oWaYD;exqpecMC7x;AOK<2|*kQq?UMJ(pBpqJGAcOMMpN95%yLN=aqkC zn9Se%v8!)<7~t^z-xO!x{!T9*uJQLiq(>zxG#L_paan-}@t< zzVVzgOV93y!G2+?^ALK!lI0#;iHU+((^Ze@G~y}f;atcCmy~R s|HD5M9NMmVal`PY3tP6D7U$f519Eh+|F$u$tpET307*qoM6N<$f-aQ7WdHyG literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/nasa_mars.png b/isis/appdata/images/icons/nasa_mars.png new file mode 100644 index 0000000000000000000000000000000000000000..8043235234482094d3c61d91390bf4487a9e091d GIT binary patch literal 2682 zcmV-=3WfEFP)BWf`rftVPpv1n3?Sg;1PiGa4$)~d8jhSGMX^Umd+>AaWop6hejYx&`s zmLZt#FHiQ)lfD0Yt^Zp8|CW#5?Zt2f8SUa+8`sazpNF4#@)v;`Gr$YJXu-qbBpAr$J6vppv-_9))RXh=UwLq8_uVJ&eE@qk0P@khy|{ki2(StK?oWLozxTmEdT_mC zCzrcI8iXPhddnLuCS#txJY{pQ!QCmcj7~6?I?zeM%xTP-S8mf%A9?TkN8We3`ar#T zBXIsz0KD!5{_q3XkN(IzPY$#BU%j~3yk@1NZ1e+71E}NC>30I#Gvmq4ih1pHGsr_A z4NkwK^fMuvF{vP^(oKDHf1ZBuOy|+ZPMm0?4zRk4C$HrF1pe4X;+x)Z$FHyC~Lh5R}aUXH-G4c z8=m~^$_ny5900icICgY&@}0d<{qZ1|qKYugh2>r#O`$Po(KtKPhKqYOFYYu3xTWbQ^;r zRr)y)8`Pabom`zXfh53ECYU*s3MQ3+D27nh&a5;pPvH5T$kSWKvoATjGeeyIO0oN; z{;B&rr>+NZ-+jc#p8D&5y=f>nbWvQC3=4<`i^>roQK2@d%_wVO+8A{M;|lglIK5@e8kkj%hyae8P-Jju;M~3u zxHJ+B=av=f7kAPR9D3KI59x2e^^2PLeS|R zQf1hIm0mdf!qw>~lYTNid2mUKSrt)H`kA9@n6)J9rh>cR?r3xzXbh?nW+iOxJEIbg z3@!0(k~`5>O%ZY3Ev>j% zbQ*)kggU~`%mJaB3b(E)-89g+F_gBFMwPRixB5^=r*>yjI-){d!}c6jyOG3zXod@< zB1|h|SO`f1i`vLS8?JCo7Z#OqWddd6qzZ?Z6IP2BWFjB|l1%7if<-4!+v>3fwr4^= zfg~8wg))Lh*BXQv1y!S;LnndgkS2<|Bigo1b1)ZD1rZ@jlu6l;s8B_iH&8{GRc$2% z70Md&;5>b~wFQ+syEE9IJCy}=G;MZOpqC3-5HbyzfeI9z_SUH?S=ws-a#vaHDa+SN zN<=BLRv)f)4LYgQOQ4@amMB-}P*zUWK#`=(Dq(8^m&ZQR?WvuPE{x|!6^(8Ns1ii6 zM(B2w2v`(~Oc`{b6NIHgTfhM(6^KAL4-BrUU-ZD0Nee7RDRQBgDf7nIn!tXkJaMjm zRA-euFt3F)DB?=l7_l*o7WHHS`*R~A;7%4`sRNlpP^cPVvS>qY-d534E=((D(I}gH z@Z65^(gcbGE{%=tnNc>dQuO~$7q<3qSI0JAG{U$v##Ll*-cUxTLD-u+?!x}8;XB(< zMy1Hw&bXAr&fMADZ|DTY43;wGg`*X!4uvbRT?bcN8G&mtin3XV^8%>1h!nd}J)grJx6aMRhabX1K z_gj+HQ7{v(PK{X!b%aGNZo-K}Xr0IsMG(B*L((fU(wX`%E`8@}SkU zS^A5N<52+~KK%6XK+QO?lu$)@;Ywt(0L9rFJ2io( zX~TSF99hcY*0sP|Pe|10=8B7Rb=sh+G_H?7^vomw43Gf)@=3ypl~29@A0GeE6Wdc> zd$8}kc0HidhHhHHi+fI_y;T-qX9~}4JC(uZajST>lT_`)bIcT%Bj;Nr;Gn?pBsHU@!y+M11V z1si?Xn+s+}9+V_+9nYEV1_OpgKvY=NPVJDXj5R%W*H_QHqkQ?rlnhsp-k?SEhSksi z&r^EmZ_O5y&s^M>;d<9t?FFjF7?r~ImXQSrL5SX3wq6Fiv(})9K!#Gswh1jNXd+}m z=;n;`Wa%SK=l;`&0Ir>@FCPvNZ$`VfJo3=3Yq#Fz63)%5glIy)qvVN_r-3Y05T%aS zID)XzPskD_sGuqoc>n|nfnKg09AxJP{ljBw~Gjq66)C2@wklSsZgW=GiO#oG^g=a3$ox03T3UpyJ`5w9Vh407SnP?^=RXc*VgpYCMKpZT*>|McM24M_jGy}##e`0?NI!SxIC5-IZU zzLsZG{Pi2>lJl27dC1G}yloN3KciwN($o*8SW#qwewHj|m2FQJ_AQf@&o^@OzaKpK ov915Td}Fh=`u%&q{9Oh94=A}Ocm(^g%m4rY07*qoM6N<$g8Zj36#xJL literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/nasa_titan.png b/isis/appdata/images/icons/nasa_titan.png new file mode 100644 index 0000000000000000000000000000000000000000..199a02d4bfb8d6e001ac70954ab2ba7470d7869f GIT binary patch literal 2593 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 T`3Fp500000NkvXXu0mjfdjsNX literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/nomenclature.png b/isis/appdata/images/icons/nomenclature.png new file mode 100644 index 0000000000000000000000000000000000000000..10def86dbb511496b533212fea730b77d72d8ddf GIT binary patch literal 2084 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~7rU^W-a8%cYM{tQPZ!4!3qi(Z?2$i!Dn`L*2oMnh z4nQ^kfmj5p7RCpO{R83;Kzs^_Yk`;-h_M1DtfJTjwSmG?Kx_uYeLx%t#OHum6o`oe z4nS4dTnzI8%n(i>;|35OpDO2#Cvpm>Gy0 zfEWXiV(?XP`aN5NX!_ literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/office-chart-pie.png b/isis/appdata/images/icons/office-chart-pie.png new file mode 100644 index 0000000000000000000000000000000000000000..008a22e4c300f771083691bd0dd88e38904b603d GIT binary patch literal 2176 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 Ef-~lxN&o-= literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/openList.png b/isis/appdata/images/icons/openList.png new file mode 100644 index 0000000000000000000000000000000000000000..ba242e52626be39ba318e5269f59a35e7c4236cc GIT binary patch literal 2084 zcmb7^Yitx%6vzMb+}W9(?(A!JyWMu%LL!Pr`9LJ$gF%Z>1=0|ZM-B24qLF}+4?rX# zhA%=$B>KTeNJtb6Vt7P9XpD&_#z@pC0kw$<1q=n+?z8)x-JS8=DP8G;h-dTPnRDje z-<*5S-23LhvPHTYR{`k#i~E+-)nrm+`v30pSLV}2-uUdIJ~-@m^y`n`rigdP;x(_) zj5AE!-WS(c6!h%uU%JpUtjgx>xx4(wPE+J;f8T-?^8(y)&zcHHL;knlq{yHlcFpz)rq9&ELPyZx44;C4+CW?@K$BPZRd96_9 zyWse%gKHnx)*YJ_5fL;LgggbbNkwqT(GVsw8>mi@CO!9Gvu)@~%(yMoymi3_*S$BH z=s~aWEkFr1NVL5FG@f4S6}wpD?=Tn4TV~>B#X#J;AKY|?p*+Bawy&C-I(*{C+n>1L zs+db>tAa0`E6|cz4e#HSs0F__xG@FX3C_yH#~P&@yUUJ-O6KPMQ>hDl)TV9F-G8ZN zmYZ=+bq-j?)b6?#LOT6Z%aFUfviTsqk8XrFnnY-5gl)5F=7O{Pj%J-btHHI!k;&Y< z&b%n2Yr$589$5;jKDocz6w@<}N{$O=L0c%;O5`CvolduoY5J;RV*aK>(A#IBUIzqf zhegu02p8JFvLp5S$!k-Co8Xc-UX&wUdN!Ab-Jn@5X2d$tzx!S2X3~XPHGt;kqr-U?rJSTSqT8zw;^Ly-BEEI+PR=EnXpc=qolm zB8V!z>!w)j+60$;sr{+(6e7u)$mMdb^7%aGE?J2^AAN>+huMTG1ZMKw0!xyNu$t() zD|qasBfnJYW%N8e2f7i&g6CeqTVI^RuEQT7s;lrzfS(GdQHE2QvTS7%t6abnqqY2F z%^I^%oi91hY~IGLeSQ-a&JR_ftY}RvUx=^O9t`r=hNDwHk^giK|<}(~QH6 z9^Gcz*dJq~g~yVn2!{r%v{nXZS=T5-r{UmQrh?03Wu&rIDuGP^hw3ZfYH6r!`ODu- z(OSUyL!%@45BWqC`E(J5i5g1zDk@eT0@Z_74pWz~WQK42F{O+Ip1HsQdf;) zF1!9HJE&co+&Z_MmA~ziJI@bRd%`l>H4e!DkO+C4Yu>Eak-A;`FlJ@N-o1&x7?jg3Dw ztzZHfW@l%o4y62`G*!$88~pFzKd@_IG*wK783GK7xiB_0XclT1Qn>1e3Omz(J63k) zv(3J27eQu{ZE(c&uZC=_j77kN>hS09e+CvtrUM**7|y{Q3N{!T3^p)9LbOA}f0jQC z-4)({{LlP!}yzH(?;bO6^1XI761M-?AnmUeHNcSoMF6Q z!GYs57w>e&zibBo8JH{?{;)eRFmY~Y`SDHYF9)9?K0`rrj4%bDFg|kRNHU1OP0v&2 z&oB0MO#fK!{Qn}9;`?mYH;{Oj{j_Uh@87e_U;3@?$k6ZyB!&xM1jQz8U(>%oIZreF zVPEERYfTi)Q0>|;`YRlx1cl#yz5h+}PY<$z{~7)>ZWWyFvqNC6K1>|LV8-7pzyAH< z4Dq?Maso^di2nQUZ_i&w<_350_aQmFN71=lI_t}ahnK!AGr(FKcz?_QssVu{2!)FzCFfx? z1E{~!*49=FCWjIfFhM8{Dm#uKi4o$%lx_mX)kYWxgGToOAwJNxW!Bc#sF9ChDis9G WempKJUuRJRGRo7{&t;ucLK6T;Dgmzm literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_clear.png b/isis/appdata/images/icons/plot_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..091390a610df2575ccd84da2355ae3bb123dee46 GIT binary patch literal 2173 zcmbuAduS9_6o-Fz9y_zU*_~{Xb(2l9iHVwMW0TrfEY_-xXewH1Z9!|0^hR3P=L-uUltQbmRSLgcGg4e=VG)Q}+=WYO^rL$w@rgjIR0y4xf!NDa<_D2+D zw~gbjUWvz-eLFZP=k*WMn7p&VFfo@XG6_vvu&k_X`@;Z>z6J2*aQG0^TWc_cNh&5*A@D6r_q<_BL53}BVZXagq&9=o9_W3n6w zW)&C_vsSS4T0GTzu5_JvjZ&IFptEX|;DVPKVZMY3P!mPjA_vxPd99u6_Qy zeLuc38!|W5xb7K=GxV&*u^4OW5kD4GTl462+C3=WNfV+j^C%_Ud=_~nC?oX8lUk7j~R)lH_NqC^1C zGL&ixI1`8H_y|&=dnlKT`~)H(IR$RF6MYv>Z9o3mws}(_GmR&~`+uI$3CnqNnl_qK zGEj{T;-L^YJp-1g2nIsXIUCH5n(7Jf;L$I3K2<#vu&A2^=M@ZPCvueZ$%+EXGDt)d z7#fYkHzA|{ZXCf#0<|s)r6jx@8gsz+>k(%WbibSi{=Mf;ERbTZ4TcDA-OFJ#rouPm zM=BNtphIA;5A^$ka>}FKE%h_DqzcF&V`@4TGo?P(15$6{jCESR}&@oA*sH(6OejW=A znx?{T;h;q$$fOc*l}kt~6k5#No*p>cJ$mi*imC8v5$6}8NhR1=>+lLD7GWc&yxD~I z#kKf*a2zg|v5}caR+dpA5YP;Zn*$T@*b|Mu-;Q-{?WkQ}gcpiXagvwK#lU5&Rq&(bUBm3laEv*k~HdwaSUByrc||ZrAl4 z+g9G07)n^nMP3hQX(bsL_gO0|dK+sTf`268B?2E#L0KBnN|#7YA;MA<{D2Uw0^1hkv1H$6AM@Cm@ea+BA>Bkc$=!SQ zj4UP3`S{V$bY%{NS`YVdk z)~eNNvmgk-^Xc_uk{MZDO@4X)d|hf=@^1c&jQsJg&-d?|q_9LHC3?MoJ{%hQy?i&U z=W;!siHmb{Py7nDBnYB3K0YnVAK@D2iKrB#CtQ?)dE;ae8}) z-tO)mFlS4?b!+J3`T6B|hK%%EQ>SXGa&ry$Iy$~Cvsf&iW5*7cVW=5dmRAf8 zg25;gizOD7kZisx9F7K(NfrnK2XykviHYgq>guurbd$|fDi`s*06yQUKN5*eDdX9E ze0@Fg{i8=K9LsWm;~3P{l^3Yh#MbpQGRPCNoJ}W=+ZAJim21P}+ zp5^7WH`HoXA(8}MCV*zFrR7Q?0GEq=zg8=4P?Yu8*4kjr-n=o;1{NU) zL_oC$Ks8C~H6Rwy(%;_nSUj3^W#HMsianmWKVLa?!BGM|FXu%GOUY+Nft-4 z>2<>N1Ki7}p22qncDDdQA3SiUqEc$Km;`)Vfsyv80O;X}kP-=T@`1_=VqQHe-v3+w zUm!Kx0)2tFy&{JaOQ?Jj10(^eFhDpCu)zQpO980@%w&PWrIn<4M__qt8D8QHxH+G# z!i+N|#uxNBgcAS=2vJlsxtRiS&{@^Q(i%bS7%am_M?u=}3b`4d?GVjIUNRan6(G$a z#REJ=8xROb65v}UH+BWiz)PFL{ZHrY6?Rp;m;z1(4jX_Mij$Q8De2q;FXPiIOw|)K}OjH&J literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_copy.png b/isis/appdata/images/icons/plot_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..73b0b281bee2591b709f2606c710ec526579d96a GIT binary patch literal 2084 zcmcIkO=}Zj5T4!aX0sdOHm#MmDWMjmlp+*bMDV1fv{5XgUUDmzf(H);a}cE{9t6Rg zN1=Eq3Le@Df~6o{1pk3OSZFDsNk5E)wAp0yu|D&*8~OpMP3XJK&bzxa&pR{E?7Y4+ zIvg-M3?d3dMwN~ZisLvEG%sgQop=}ak|Y%&eT70{ z?4XB&2Y)iT@uXBLxxfd%pSV{P*=}!dj~_Ku5NUpGEg`kEm{cg(w6&E!WTWdkwYCOn zW8)9`P_bapq(mY~rg@HZU8D8&Oa%_dvgC*z%d%*8_B#av0cvaOph~4e<#I_Jkj-Xk zdHFZ>^z;(jrBVs(`)G4BN&Iba@Ct)^AewO4JEXD?oTG5Ki%<^Q-rlBME=R>;Q5?X= z!C(u3Hie(x&k-lYUegR(U0snlYmdhhE|<%kE@x0?V97L1l4YWuon4xqezy<`g+_|S zy@+MGcIj1BQGwA4;F}O^$pM+Fq^jx*+qR#BRZ6GRG&3`k9v`1*=IHBL`(!@lh{fW% zG8ocn2AR|#nQ|2vbrLm28iFJylS|au8FtSWI+aS%;^J58?d<~>7P?{$`^&Vn^ouf? z43jDBs=)jtqtGmtm7}h%i^5=ccSmUV#x>^-;S7B~jk>!pp-uA$qDhEt=ebKnSGYb^ z&5?qX>hozfe!nglJm$@%7#Qe34b~xBaKv+m&}3(`7`S$$)_LxkMx3oPsG4q)rfG5X zuoxszUXa(1zwlm7uNogg9vOxaR{-*6-;UWdF!(2->jrkuJX&KW(sDmGpn0ZM7ng&j zp)TP;hLUEE0`n<6Pa9e6e`wh9Uub~LDa?Vt*t>rvXYoJF%~U}Hs6XfAPY**=uh=m< LG#Z(`G4}Ew3GySS literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_grid.png b/isis/appdata/images/icons/plot_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..4001b35cafcbb77be5e4d36b36acbda284b5b981 GIT binary patch literal 2084 zcmcIlO-NKx6#nkKnfFFTbVLN(M6{3)qGd3nWsEt)G#1h#p+y-%MvKA-T1Zntkh_vh zrJ$8si*U5GO|)==pj}WaDcTf8q~%j=X5PD<^PKybA8MMiGu(IH{q8y6J@@0hJJ%0& zchy#JsRmFRjf8v1H}UZ6^h`ZE6C|hi#k#_f{JZyba+r{+vyt8b%9!RM22b{;2{g_} z>~x|=L00g-AWkB#X1$23o5sM?!h_? zj}$&b+jcdszvcL1;$4J&qQOV{tsS|&3f(8bjheM2yuu^>S$t7R4slL~5P=4b1sY|w zo$9Yq9LlR={$AtQ%@y>FtSLg}xfr*gVkuNmfuC)ScqDvw_v=~gz4aM(M!=>ov&dA% z4(usfWR2C%&h9fiVvv?$i;N%1?MJCgt6&r7^yv~Q3aA9nl*Xx4>LpECV`c8q6z~T= z!7&aozc4uwpWyeool#`d20XSG(riHd!#Kkj+B1Ttr6p{Al|cs*4)&`@iN-Unaaccm z@K`<^SiJA%wGNt?(z3XGX9#P}q+p(+d=t(EMxjX^k!7bg6l)BT@d`UzRY1z@mTkcj z8vLskHLf4?jYH1WI$uAGCw1fSWDMA8zK=JoSmQ~x@DD!0xg{FcoL=%viFIiMng;m! z>++G;Ar`OIyFK=}ZWLZy$NrV$MB>u8^^|A~i&_+tA_dIl_tKo;4s^^VqZ| gZ5M*UU`q+nW&??}XZnl40QDvi?d%Re+;{BCPp8u11ONa4 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_hideCurves.png b/isis/appdata/images/icons/plot_hideCurves.png new file mode 100644 index 0000000000000000000000000000000000000000..2c73bd57f86988265d44ff385eade3f7353ea8d5 GIT binary patch literal 2084 zcmeHHSxi({82;{^joBDwU?#FB?X*J`T+mT)1f;_@zQR($dB!>vO#3Ov%Oz^N)_et>W0^8 zMF&gnt>+t}R8*X>AE;1Fsbr}ZzF^5{rAnvWwzq!Qdag~;5GKU`@gFH5rRRRkaoi1= zO!k9bueYrAk&=?Ki)#IBj%ueV8TNtT9;mDqn(TJ_>7t?{#m$>H(b3Uyy{4vS8=G=C z9L~DBx=nd`d5Fj3v6hyWSE>Bj>avHA3YvP2a@1n62st@9qE@RFbvm6_E|*_onVg*L zRjbt^n`>%n5*U{9I3-(qFaFuFfnLu+o#j_nR?4YUUJwMdwzi_ItV}2_F6P;)fq?;` zzrUY9eE2Z3va&!A61uy)qg`EHqoOF*5X8-J5;puDZHWkG)0mu`#MIOjM-sqhv%zY$Vs>_xOHECcnoK4GVa>$#4dYwuxT2t-pxtOR>O!Fq zh?wbznVA{n=jWrZuMdGhAn|;X0p;c87#$r&ZfPr&cljv9HM zKa-uEt)YZXm4-F;NT!iOG`noA7jiUi)?6U2;>YD78b%_Fn~!G4u_dc z+VS!6GjwlZ9iQB~b?YmZZJQPSmoH$!8-zrRW8eN7#3TxIc6K5oBLiePFC$)9SV(5F z)YjHQvJ%Fn3tfnF66ljvD68Cu;oq)>olfT`tmBg0tV~%?$G0f47Qvw6vEh-8IM>#O z$2VIbl}f>^MP!NnC?;w0>5X#Scj5Og;Yd|Af&m{QaS`(*Pl?f}c#-FyWW*^mcW&@} zJP2;_HcW<0$i3s(k-H8PV*`lAVxSI0!ri8X!R_8+Yi_2`LJDzZg_WRBjDU%1Bs%xp zdold$6-+t%5SqJ<+zbO$DwSt>dHF0^=@?73&o>dApGQhr z8Kjw+2+#(zWdB($=ypRTm99t$-0l&TTkLzRNwZhJhDI(T5Ern0TRui&rg-#f?@vU0 zj55*JM!mk*>vEYFolfX>>_B9BF;Q2NTno&aE*CU1*&j@|t7MZ>b>^n@@&om}dCM*? zv#?4Wx~mk?#;dqnMmX?;LC!!!(?i!J{xLmGVjBqVHet$gF(~a~EG6*}LAW5x= zMx%&MParsa8SZ%^B=<357R>#$BWQM$Mr*;md4Ghcprlj5^zsR$Jktnte-3##h-lpl zFe}tpe&cN{6KIY2{`C*NkI;-xt3lS&M-jOA1+$R(hB_EwWVGUfa0A?cMsej*bAaK$H2y=J*8v0I_ iou7i>M@&F~-s+U{$BFBshZ+)=u~!_leOG?uoxcF24EhrQ literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_markers.png b/isis/appdata/images/icons/plot_markers.png new file mode 100644 index 0000000000000000000000000000000000000000..f8cac1d3cccaf06363c6022b7a611ba33981eb92 GIT binary patch literal 1549 zcmV+o2J-odP)TG&j?Cb;hHjF2B%e!;@nmdb?R2bra@mA zr*F&>7wV=Gk(6w$K};l@FxJr-TT1CDtQ$lN%nlLCEp6J{miGR8`rP~6`#fhau6D#^ zd*k=rH|LyBPJZY6Jv8ikUpaH&a->cHkgcs!4iC%jiKdfCJ~C~gh}xY}Hb*|b ztL0d-eC53H*y+jeywaM;du(cvO?*Ylvp1hfe`(BtH(mtLe%F&KmqSAmRfTyfiGzPs z_^|t*+oY~bIW#1Hv)hmW%AZc_CBo+ulm5k%ciiqC1rQIsWxi4CKixAjp*w=sm_Cv# z^9$~kO}~C5ddr;)rvKi5IaBm;H0uw$b4E?kWMU#=YEg53P!Wo3ySVa3jU!@@@?c+6 z(-EZROO)Oc5aNlFB&0>v9Udn*Hmp#gNAoeloD zxmg9Me@wa-FTfdn4J2^?HpHKQ4+G;KFAul<_uc=OHn+&9w(OOL(4NY?`DoRtsHQ2b z{gx;05=Q>`g49Wb?c2v97wP%i>F<4&Wb{4nG|%pO(H!{gYJhk4 zf3Oum`^TlMN51faVBtbPxf}#^Cp8-E{4_MgNu|K$ zg7*)@lMjNG!BMv2o@m^296+fEX(pqiP+Sa}2DuzePSWy+Qm`eKK1$e|%K#{AZ+7cA zo#6F?&j-Nn=?ADN6WG@V$PRVX+*X=S04USCtuQkK2MGYv^eSL!9Gs5+ADeG^8b3@r(>q94wH%7wA{ijmF>M}=WK}gHDf1>-hELUc_2eUp^ zQCQ-Q=_g`kp&Iwqq)tGaGJWpVWwH2~$x{DE)3s|V%N@Ts8TA&fvVCXQ<|ke~wu7&! zZNKW;@x-g04FDQI9!=5I|9{Bn+p$;+RKKMJEAJJqFjzTkBZi$C?yyoL+dYxjhEx@7 zgqQ=@E%l^<_@0+v4iE@TQ(38y&x2)wZG*!BlP)-M0e*HXI0|2zT3mq|y6GN zHr&~ARgVMdIdIsg*nov;g5R%DR|n~IA$>v=l96%n8_5pZG#Y88Fle~s}}@pT<>OSWfEzOksWG3syKZ+ z&qa%V3MA*iqceFY;3gb~P^bVcDJej89WohC4Y(Ow@i?oh<+Lg+_nC9Hxo_|Joxfby z{Ce?yf6V|izVebAaL$3hz0f%eq&Pg7WNa+RrAr`XVaArlGl}Qdud5I2UbY5DQpe7k zTDp9`mXB7g-F|o5+5r$90E>b~3YeV(uUz6XfV4PtNCJuL({SHULn;iTHRSbZ#_9;BF00000NkvXXu0mjfkYe@2 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_renameLabels.png b/isis/appdata/images/icons/plot_renameLabels.png new file mode 100644 index 0000000000000000000000000000000000000000..f02cb1a66da551cc49d7e5099a7e73871eb38510 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;RN#5=* z4F5rJ!QSPQfg+p*9+AZi4BSE>%y{W;-5;PJdx@v7EBhrLVIFNw&1LhZ0)>8hx;TbZ z+*&%(Hm})1pml#lo^arC@e_=fo^zDEjLDyxZl`hni}u^oObWbBE4%*Ti$Jr@msM<%QaBN!E@4yDD4C>{`ZyhPDg2Huf1~A zDfSKLxt(XPS(|^nx`oZ4$<=h_yIU1Qi*os7`?PXYh!1DB_s-pjQ zCeL5?v-&}{qudkOUPJo>JJnn3SAJ5~Il;_#pfIyVSv($3cq5N65}D8EI|K+da6|Y7alKv_ z)xKRCdH?Gb{Fi6;^Xp3mpST5ZdCDwPs(%AsP~5>rqT zl}aT+*bPz+6&25{?U&@D71F3J-ep#+RhV|WU7*qUH-+p>Cc~snST2`^P3xYaIcBP{ zFOo|jwE_BpDlQg_qEZe)kf0+{4prPjDh=7=cEof@I-MpCo=hgiVbT`PPCeF4!?MO! zPscRTBb|ZZBY^I>Pq?E7iF*`i-(gy!U83UdGQUAc5ui_@K zNyeenhPEQ6LLD7kogd=NK+}QQ6K@?Y!>-RaUb__KBi6^D{p9?YG_T@xI>UayzieW^ z4^V09@)`vDfJdQw8+Hp+DwPq3!||?AD6CMRxxdk8bu!I0ji8iHw#<8u@m-L{I@BK2 j$@Y4^x7}_x{S$4jT=2~xfbm53EBO*GLoYO2;I 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_switchBackgrd.png b/isis/appdata/images/icons/plot_switchBackgrd.png new file mode 100644 index 0000000000000000000000000000000000000000..688b71196a0cbdd7e57f8a4afc82a61e6470907c GIT binary patch literal 2084 zcmZ`)drZ?;6h6Pc=>w#;+Lni4K}Fa=G|Es%Fl`iMvXE(pM%>Fs_Hb@<1~!*0CR}Ja_`?{Cx&&mYaTDgSC@#Dlt|$V^!@ekeb9c@UD%&zoa(ZuX@A>XI-}&zC zS1)hbsFEAx0H7+^WGcaN0l7?qpTAyucP$Q*H#ToH!F~80%Ab$5RN_k1flZ|!VMHT2 z_u1~!04_=o7QAGZ+T`K|+KggNQwUcs6qxc~$%*CarKLU&w>;ajtzv-bY2Y{x0^TtE zv7W7j6Bxr_8U%0)b~AwghY&p*m40DC4CGcX35&PodChS#=bVr3yA@ zyZsD+e;;@1lpI1KFDA)g-#&QtkX2psqNH)zBFPKD{G!K?AH&_dcfoGALzFZ+IAqnz zT@8~V4l7^~gzw>vxGuKTJ8sAt^`~x)Aoj3H~?wn4{tZE;0sci9~pQZSK_-I{i9@LIFOX56=riAP|6X zI1DnG49}j1<;$1Dym|BDq-v)0KY>Xqo&AIFxs3Pj1qEZ8y7ct1M6qNY0l8c*-X|v~ zd0;w#JTWm5GBYzlsZwq(I+oTnzQ~461`s115u4%I%6}DI^)`Qf=7%2-j6QkIS32IIq&%I%_@}*L_R630j_l%9fcRO}~5&?-Ohrdyu9l3A556VKiLBb zed=&K)N%skoTo+>kO@YgJke9`)Fg5tHZcmDmYtCS=W1%;TvHPm5)weERPvN)G#W6O zOwiienkyEI^>=a|VGL(T0~0|AfknXC3^taf&saTzro++=MkB-}C&SLITVZKd7EcKs zL`Jf+*=&%7>&du>8j04{($cbYD8=rK@7It_(D44iZvaJFEr&eX9u5pJR0HqqKUP;) z$M)~v&l(yUSYKZs^ZWhm-o1OQs;Y`zxpHOWk?jY0rHMXAP#xlOYXD@IHp9ucti5)( zTNbO;>f~~IRA#KdzaPrW%K;1Gx!3FUKvYCUMFH(gNlAeR4<1|yrz-RaX%`?UuMA4s zySk2fghDBnSv`i0!ek@3d@$X(;o)Iw7<6=W0A>tBLqkAvq(ksfsaC74?aa*N1Vl7O z&&UoZ8V(#46&2qgk39qsF@wPXWo2a$A0N+O5_*?VW|Sq2j*jw;rahR*nvaGHSFGS~BZAapGxi{d>xn~>AK4DnvBhEml}g2bCo1R?k>(dKUJRJj zwNHC`0&`cI-v%%q4$n#jraL=34O&E{;JE~By|fN^ngypAbr>O)ac5ll=>Jglv)-G26L z{Y{E}`nn-Udc091KX-TgaGjsihPJl0k8vl$6}WPOnVHt4Z2zY;5HDqb@t0PHM`S+wK0Ou&^)- zInBWLIDl&T>-zQUciP+AyAaAh>ncPKD#F`eJ=+L6BjCH16- literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/plot_table.png b/isis/appdata/images/icons/plot_table.png new file mode 100644 index 0000000000000000000000000000000000000000..80df188ae54bdb77df7e2f7133a2964b72e7c021 GIT binary patch literal 2084 zcmcIl&ubGw7@f`9-54oo3?W!hib(OOmx?`AQre(~5WIv2DS{_^5cH@B-aPvUM6hTN zB}D19P{Bk0iySNxmz)Yowvp}l-XxQ(VRx{Seqmx=#U9U<|@78Y(A ziR<;TUld+kyvz6j@$qp_%*|a@gq=>uNF4Ty!sH^cz~-&X7}?(5iLpp&vVpVu_c@!$ zwbxUtPiO~IlZ_rE*2iZMF`eG#IbLrxcDGus)>J5Sxtu7K9#mQ5YFr^}wU2QoX|gd{ z{dG+x+c1f7^TLj&#j3{j`qwSb^G+KZ>7UJJMY&v5HI6;UraGEzs>X&JDl(&gRVJ|Q zXK{|z2g3I*QXFSyFVX;|$p-TUZr&!qFO)<-H@M{_Pm8+wF!BM=7rOpZ!#bG9m;Nv| zu#(9n-|Q}}zV8dn2^CfV9dx6Yg+3JOfc1h(7w#S(yjuEpaDAD&!b&k;zqj%B57?QU A%>V!Z literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/preferences-desktop-launch-feedback.png b/isis/appdata/images/icons/preferences-desktop-launch-feedback.png new file mode 100644 index 0000000000000000000000000000000000000000..8a80d44686d206ee88ee8d2064649d33b8354709 GIT binary patch literal 1654 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 FV1f>+LjC{% literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qmos_area.png b/isis/appdata/images/icons/qmos_area.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd4bf4e2cca40c4c2532387e7d0fc17690f96fb GIT binary patch literal 2454 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`-Aj~-FC-YLEAbW|YuPgg~E_Pu}cAJ^T%0Okxo-U3d9=wbaoX@{8{{R0UsET%g ziFQUqOdhp>U*^T3_qT~VBpnIhdUI- zf?sdnGH@#?GO&q?!WEFpV0`lyMGHzCFtLG(BFX?OKOc$#C>Ah+yiOrtWI+iO1{4$j zeELkG@xW*S#u+j|vF`srU?ie}|9}57fPDsvOc+2efuZ6cbs+E$O2d?bXi#zjVXQ!g z4>e4&D#9)ZHh1Xf^f#j=IsFmiKnZd%Q~loCIG%e BT+jdj literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/quickopen.png b/isis/appdata/images/icons/quickopen.png new file mode 100644 index 0000000000000000000000000000000000000000..813a1ce0886defcde6f8ceea774af04c7e1cde6f GIT binary patch literal 2084 zcmcJQUuYaf9LImNvw!aPZgc-~F{w>j(jzgnp+O&N@F|kgoMMrp4?z(X@}O7{sxN{s zJ_x>Aih?f%F=8s!+LrU7($j`gdr8G=N~39-yEf6}5|T^q_Rs9>jV&6THW_UP14VjS?PI-bp`qSh=f8$tZf4d~=FN&ZUQkUU)Kw#+6YM@g~g-4G!)O zXtbj>j{n*x0zB#>2v9&wM2=pvrNYHr{_1uJZ`asf1Q70TLa;AcIQYg(_IGWMDF|Tz zxioqaYE69AG{0kp>geYqQcx>3Bc9qPRc z^@24ql;ol_gyX3mdq@y52qFXITELhDe`dByr)OKQ)wHj=4Z)ra#5C1|$;yH51C9n< z0zoi<=M~mxRrvfe{@z9C?<%dvX$UT-QX&MAHn5w#97`ZT0^?J(z_Bq*UB=7Tmei~Z ztWd+Nx{bhS6Jyz-EZVil9TboNSh9FW28*|Y?2D`6^8hF>N_4eKt8sk6o(xnXYJa=c z*V{wFULPzHunY{>rvj^rj5n}AOD#>~IeWSOZs(fmkXy5*NU^3%})p(>L>pH9oI8 zSO8zJ*BT+jT;`Z}@-);&w{S38&QLxr`iH~?0-C@39*t?es3Nqw?Tj^@kQ{eKA!B@of zT>MUUDsY}p<{olL>CDW`e;aW!nPn}qB6KI5j-f+Tv6v0_3t@Xaqn(l*XMs6(k;Iq1 z(eiZeG~W@I%PBFg3ZZ?fF&5PTEEB_}E85xe7W&;`WJ$0Bm24KAoyZ3f-{hqrq1e%K ztgo9q?l1<^Q!Vq8v+6lU?R$npHnMYzHb>N5Y987bjDs}PscsGQ^g7DIf7hFEmTa*g7@k>DZN_smPDQZ0r;RmJ8136Ytu nA?umBIqw+tP1r-||5`sYdHi^O@T-{jk@VrC!)Kp<^@D!^9dM4O literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qview_NoWarning.png b/isis/appdata/images/icons/qview_NoWarning.png new file mode 100644 index 0000000000000000000000000000000000000000..19dcf363dd1756fa09d6bba77dd65b0d38579eb7 GIT binary patch literal 2084 zcmZuyU2GIp6#nka?0?&B+0s&KOUgeKBSwiN4Io$pjiDh#gD4V%54>m~!9*V$UyP5w zsv#pVbeep#C5kX^2lv3oU&;s_C?ru9fyE{ME@62{8M5jG-W@pa*?sva)?z!*n z>EBtOUYZ6_-?yuGFMW$xGS2(?Gq3m1#ScBVvzLAycK>wR-NL8T(OvtGal{odwPWpv zZ}Vm1&A#2wCWh0o+!E{J`7b}_n{WDhw?DtRNqv^sUsepMT>~(>*TYKAAjQ9|J&xst z0{Y>qZBTfG)+m8mBd;{>Ag0e|b2y#J;U*ju%1v-C55mI$0*R{u6LjSw#Fkh{&vdMQ;kGFeSr~Xv8$~!dOWAH4Er{ z50J4JZk$^)e%pOx*=oFN+0$6AwK}k*xfz~O#%xfA$t5Z=0T)0{6mYOyhRNH!3?fA+ z2ffd@)?5yE#>NlYw*K5IOrt-RL@Kb#AzOSU|@L`piB>6C9ur6r`7^VP9jMZ z@R?E(jxN9=mS0iZERO0lV+5l8nZJk)nT@b0vQ)%ff>v!tMEXWkQ0KWJp#3pQL5Vy! zz~%h!#Ly5dYTjW{!-lA=Y`1`+!mnsEJIR_AKRypCz!CU-xnYi5y-X0_#aLk!wrhuE z1dE}K!uX-f@on6;hmeS6Ffp4ZdxrcEut!=+r-TXteV?;M6APM#wz&5TES;9H;Q76l zX^o1S!>l=n$}Bg^!q%&C&>WP^N=y__Pn|=PN@2b!CPug#hy}DLfb9frkMcJ`Wcxm7 zGPHdoCt*w!FSQ)u@bjpl41Lb4DtHyfRr!%#(`!zWX#%=>nEi%ud4h)&d)$hxd{j-!Gd{Ek4bb{ z=fn_jyQu|d4C$vz=@aZ1sIau8yj<2Q+W^=O5XcJXquQ2dc_-f_Mq*`5IF`?bp+CuF zFl;W}#bwpwN^wH<>OeIMtAzwJ5ewT_^pqUX1UO<@W!X90NRnhqGSs#T$1DR==Awhp zY!MZ$aG_LG{oILZ=Ih@K6Ht;W%N9VpW_C%d5= z5(wJskgvw@gOgW1fk);%17xep&XSBv6OshE)Kfr1vlS|Hp{~~&7VDQga~RC?6uCMA z&%}?=_n(4}3wRoZcr(76n}O+7)cU|zF#!|{Gd?eYx+TT>X0P7e$S zt>_wf;4ozavu$)qmkQ)C1v(hW;^PX~Z|Fu1Q=e^Egl{EL{QaN9w0P^}Nb+a(mW=6p Mw!inQ9k0Ig4?x++S^xk5 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qview_Warning.png b/isis/appdata/images/icons/qview_Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..098e275302b6a0342128c7ea68c9a8387936123e GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qview_line.png b/isis/appdata/images/icons/qview_line.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc2070fc3e082748ac1b7787bb175af409af2c9 GIT binary patch literal 2084 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_f1s;*b zKph)En6WlB@)uB$y~NYkmHj>!tEir#(6bg7pvXo~7sn6_LB?h5kw1VcMgf&W;D2MI z&Htt*4w$h_Fa{;`|LW=vp#GfaJXwsz#k*kU zkZth)loWP`|Nq+=I5<)m#Kq$nb8}a~3_TPYj zu77cH-~YF@1(T!^m*W52+)RJn+`9e+2mk)x+?ol#UYnL$x8im|C_9aRiw=H+c;wjx&1Xcy)2>y$VwD}(y`R!kMc`7;jaq9US6vP26 evAl397}gS5?=thv9;t%b01Te4elF{r5}E+z$cf4T literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qview_polygon.png b/isis/appdata/images/icons/qview_polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8def5b06973c6dfc3a03bb6ff77dcbcf1dfb19 GIT binary patch literal 2084 zcmdUw&1(};5Wwecy4f^wOPW*-o;=nbLRu;nBorn62x22vC@HiJm9&>0qy{OJND)f$ z;6a4m1O?HYf)xuMs$RVGR(sNu{tYEUn@!$0vrU$LqzTsc(znd++j;YTJMYcB*{65L zMoj-DKLD7?(ZpSPUSRQg>Hh8G!gYFhXK#%p0Qq|L`P~cBv_BY4KcpG&SwudYE|b#8 zC2tQIzx?|7?#t10o)~F1l8GDlu62sHMtYwt&R7$5e=(Q)0hSejGOcr;RziZ6${$fE zToE1**6sfF+2%3~;N&ETY88N`QUO?B5Bv|5nQkz}%?n5#JIio=^|)P4nV``t!#y4V zmJ_r_up54A;5OPB2G`&q<*|cS_eI%bL13H2fjePSz|1-=xVp!@6*V|eUxdSDIX?av zmzNtHunk+>8o`HfAxzT;`FvRP_GWN*_XGCzU2MT=7*fHMYUHVajt&EKU8B@P$Ywjm z^mGimy1o)T-au%gP{9oKdUdkp7)o0#OF}e?Fh6fXDD)Bs2OrUZI`0U$YG4>h9&<`m zsBTDG5G_hSi9J04D=Y07iQE^%!v&1TgGcZjm2-M2KtG{W@;gOH$||g``T(&?1&O`q zqGT5*Q7o2WdwY-aJR`QYzB@Em#{s)^b{D6ne#6=too@m&u$J34ocdyC2e42$AmiuS z<|h9Sl%{TlGDI)BF1dDa>e)gn&U5Z#ECym}$q=E?f=s2};LMEap57YFS;3%Y@L&*d zanUdO`v;sh?8cP&!W}f^7EiBO} literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qview_rectangle.png b/isis/appdata/images/icons/qview_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..99a113be772668c194483c7620450e4db3b2f886 GIT binary patch literal 2084 zcmdUvzfK!L5XN@_`;5VbkwU=>L{zj$sfcVD3t?G6$R7W}{XrE)|V2rTThhOU6Y! zg}i)!KRb9OL;lT1tzu$)KA(U6B%ax$_10U-IKg8(d#xLBM(^sI)#$RAd-1Y(yz*mN zJg4=_+Rkd(eu-KmiTKaVQg7Vt_GMn?`Y*?yw$oWa?o0w0jmoCo7LU5_?)=ungBxRv z^ohsL&-?wUDP!b`2Loe!y+oLJ)vm9NDHL1~U2a68n8m0?Z8i=Ck&j0$1&`z+t(=T1 zAjHKf9CHUn0lb0w<0-UMkKPId}ra+5&O{!=Zm2O>l6iA%sf3$Aj1@s@O4fU&^QfJU#8z zYT(3WA}nY(rx@$7AQ)C<=zCCDhUS=N)Vjw6o6>5pTNnGy;L!ik$^dYga=8E$z#ES@PLtkS vQnXqCP87?{_Ra3D`;+#h=YKoK^V9y3jJfT@5BC?%eaNX-8@YRWw&Ao)Cc^YkuPoR>=V%iQr?TwOh@FL5#P ziub_F27l%2bt9%>%rN{_ds=t%B1)t;y?D28lk)YOy&r_)2p$$eTwgRx-)1GLS6 zu(HyE^z`RyZm!+9cQ0-;J@M;-X!mXn+1b6=v!@&d1;G3FJ~cM>g?rAe*C+SZ9ffi9 zXiyzHR)xYsU||6;cnag=;_Z~0dP=LWUy1dAn2M>mcmQQ(9+PxQR%_L=vUq(R$JNBd zB3Ekca&%l%G3Dg6qOQ&lpAY!@6%gW;RdEtU`Q#)pHPyxodYTvX59NO-ro6lX)Yf`T z(nS#!!z|@~H9jsI;AAu^teDc$G-PBvg5Q6V9T3v*-z}wUC?=`J$3sm`0n^g~a=Ysy zm4_8mR#va7t}aIvoF-OYqtchspe)w zrKD6L7<_>4?zJgoG@?#ij1>|e7@D8AYVY2G#kJGS%wY?_FCvKw1b%R+HRk8tDmhul zzJ0(CDXp3i3c1XhBS~&AZr5x8D77(l#Yym^C#-<+p;hwM)KQ?qcN(rRc5Y}%k`O0)p=Ilr#^l> k6^;An?}pEpz|Q}t|ABSg&V~PW+6|H7-G8v8ySV!LPjn<$WB>pF literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/qview_segmentedline.png b/isis/appdata/images/icons/qview_segmentedline.png new file mode 100644 index 0000000000000000000000000000000000000000..394b0cdf0fa2102f888d67573099e8bbb50dba85 GIT binary patch literal 2084 zcmdT_Ur19?82`@QuG7J^Jvc*%kfHd{OOTjKigz1sXii!P8={sgX9xxUi5{W|3xa&8 zUIxAd)dEvf2*HOTQNFB~dgx7w1cRhNdeFPsyPK;OxpB9^+80at;DTfgkNehsl zm@y+U@2i0Ts9jwJO~MD}6x`eUPT(ye61kBxCr}ip}ew3F=CcZ%;5htZ7;tXWD6eP*cg2A5$ zM`CYp7`C_10Ant;y84yls@Ds`(vlV`;P`mTsH08;=_y)~M6C>4TV*Mbx45#ByfJKc zHUu`?T@b}L=x|)-7$?m-lC)ZmX@Y};Rty9-acb(Q=G5sBZbPp(rgnBdKL~57NC$9W zzzX~OA1IF_u(`Rx_#W^S$@ItJg(;)uK%Y1mEQ8(M z4cb(mYlU&rKe?xTQ28*@z2XN$puHDGM5EC_lbK0nBG&&(?C(!sd{KSAVqH=Hfjspq X`_k}U9(j5F2cN*>>UJ(jgLi%dR&VX) literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/rating.png b/isis/appdata/images/icons/rating.png new file mode 100644 index 0000000000000000000000000000000000000000..488baf2b515938d9fb7b31a6009236cc67f8c1ec GIT binary patch literal 1504 zcmV<61t0o}P)^Z)~juYpG6H=o%4iO|NqD@dL zAym?qzR-u>q*meq!3#pD5>OGTvAH||RZ$hhJs@7VJb)00N|bBbDpg||M{SZOZj;z4 zj$NF@$BCVD*)#Lw!)~-WaV*EBDZlh-X6I<;|IX~p?1-xJ{|v+b6e0<4KLXxn6n~k& zmCoB=Ko!pAceX!VKJ>25z{t;SOEuJieD~dj=zaGT>h*ftyCfhIi5mE~Y1Cg69Ft#sz*tK=`=6iM`HAkI%&qvUuYkJ3i8a{H91w>-u$4l1T3!z7AN*%1D zb=@b3kstNYI01BR3o>?%`I&!d+wt3miMDL1VH8)kbsNB$2s@L zv&g05jCDFFUVgj$visrFs^vXgia! zjY9is!uC~&de90YK*rqUa&_Ws>Y74`H#uB!oYLetlmC95>X~C_-7>#H2K!~XE?qLQ z>0_S;X8^#YNP8aBPlGW@TT#Y8A z^$hCeLTwq@cuINl6y>vTmbdNJQ3I+$>_2((@IR?cod91$XQ7TJrD|FyDH|X~ua9cu zSWbl3{_-mszN@U_I-Tj-_G5iRXSn zu3Y`jmOlT7#%(Af2X~uiS=Msr=AFB+K?h<1)4<$CnZ?}q?yn$d(9H4Ye@At6_;0uM z`#Vw927y$)f!F}WB7Pd&e8O7=F!bKGNHG zLj3|qarO=P$K&SA`VTGXTGiQsga!>f#@7E~4K)s=gy_YFgGfE#(oGR3OiWr%9@2@A ze%-G`Rd4uC=snfAatTUB)PY249-GcWK(;6WRS=&h7m!rS)p58*UrL=^Qn6H2((RgSf=Y>8e;;zg0`x(pOpuEJC4)>RnTXt+4eDL(c~sa?RJzphyl`v_Q=x zR>?kcB21h!3=JwL2Aq#tIkvKuuf;7?iX(jEnOEGV!|TQDxYw|z%VYj~V+QMIDF~p8 z5a@&4L&mv+wPh9F8i$jAR%XUrxzNVmiC^(}A80+&W8?RIAi2-!R|bCVzGMp0x^cT@ z^;(EpEIQ+qr+__hLkE$}#xq}N{=099?wB}!ftFTI+KA8J_XGaKoDOq4|K_u7G4PX1 zMYb&OZj;cv!@IsY{ozD-L4i!74}?TqnLqJ@{j=Gc8~*{XN&AfhN&l4q0000<>&kwMRY=rY`r+zuQ&5-Y~0*|YFsCf~i--KT6=Pr>qikePX zpE(zhx+ZIti^p2szpRb_C#Ui_hDu8Ev$Zo@G%#Bn*!_JjI6F%!Q z9Q>o2&AZIgn$2g&HYUR+j~$oxtY^CBRWhTV{lWQ-Abb8u9bn|Rq`o~d;Jqu*%?zHd KelF{r5}E-1ops6p literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/redo.png b/isis/appdata/images/icons/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..9280ed72315657683d6587a0c4f725cadd4061c7 GIT binary patch literal 2084 zcmcIlX>3$g6h800dCM%F&UBd4y%Y*9m941=Ep-8>w3Pq~5+(kyf+7Y?OfW7{erSl% zUqoCmC<*+KXrhRMASP18A_Us96#{fYN=vutY@N=$eLVMeIx^y4@8rDm-o591XTS5& zldI}8YpUkUkf$w6+E?-eLD`Y`03XqUQ*MSYKaoh7wLB|$@R&r_$Fcl{IqnA!XGz(^ z7KV@Eo{>~dvHLv!zUM1eH?_=m|EafGhI?^_^8vS8^n#Tm`2&a>F^H%^7?JM=Wj(fU zVfNA;F2NJ7&Z$cSPXi{P&Habwha#bGDhn3Rnv=B%B+d$G02usn$jLi3phux2&sL7hRtBY$pjO0Qw2Stp%*MD zCe{v1WhU?hW$e5Ya$NQ3}|{M3gSldcOQMaPsa?r0u9NQqYp(5;%ALat#Wd zpdK5VS?m&~U@pfoe`63<15lDt2CJtv!3<|b8fX%m?qLsO>SP$#BUoUK8c-sdC(sp5 zP+;^}C82x7senxn8G;)gM~`r-CUNfLL1hHK>)wOu2!V#6q?p7Z#G+Z4NQGhy9XWag zJhL27kXr=xh0oBz=#6&4)nF^!3|)f1#%{pQnuFB9aJ(PB?%GA2kSsO`D8rx{3UpoT z0bMbAh!6$F4muqjlqqoc^&TjgTLMRW55SklJ_b%;!B9;kY+lSBG4{@H8$k){V6k$* zS#W4*+yH|Y!+==rDPVj#6CG0eQ8?csvM>T11W#(TNVpm&#V=?V>{XNCCfF^QoF!>3V*&bF8oL$_Q8_4x~(BLK!_29F`Oj zKzfEUqn%M0ycF)st8%aVVC5ct5;%1U&3w+ytf*QW_UCu~+S}r<#e8KuvPEz?T{IOW z9ik|LU9y8DN)Q{5!=1AM2=~S=&TPn8x3T`!?zWLr<}bTj=)cKCd}xM@;h*PQn9lGO z2}jhm_weVh!~@C;SipR{R|IR8fOmmG3r9K#i**;Tg1sA7Z{CglA1ZK6S85j4CdhCQ zuT#L2A>7L)7teYtoYh#s1-M^~L@x3nmV?uM=YnlG3~B!w_v-#{@79fVJKt!smJkDt Mb*p>_mo>frH>fUR0RR91 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/regional_stretch-2.png b/isis/appdata/images/icons/regional_stretch-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6d70d368426a5a31910aba7cfdd512a6e1b86ca2 GIT binary patch literal 2084 zcmb_cZERCz6h8O+wrjg}&}JX3%w=1YuSqr|Y8E3Y!ooIdK4xRXPKQykc4O_Z# zVu+Ej_U?~ffl_<9rEQ%y;x1YAAo(J@o1pokCH%;yHGZK_+hPhZx$XM=>zF$>W-jS{ zzu)%w%EwM04<~MGT=3zRz&j88^pb5m+dOW$#^X`MPxhT9QOr>$lZ-fy^F9XwR-8l4X&s9MSYtoZ|7A;W)X+&VBpr zH+g9D1o7tn)weHnrZY}|(+a=8s;me=0*L}6g0}*fWyzt^Ma5KExy&mF;>lHwd!M{{ zzL0a^9s34XPE4f_uU=L{sv>a^1s-bZ4brt6T!k!4AcZIpyoYjD>QF=D-g^r{naqJB zQR8S$$ismYc&Z@`I3tzm0nTg`naJm>Bh#EXc1z&y-2-9Aq1qCkLJ~q| zo-zU5*!wQAk2a>a3))pO*z=f zl8StL@Lg(V_PVYw2351Y>^M$PQzcSZQIG~4rJU`Mg#0j%-gtdGjm9bfLIgar0hrC$ zl+NTRnX<4qD3$yzplRCEz)Az43j1*xq45GDrL(QYI6`K`bnvQs`(|{2#rxO>IQQ5h z%4DIl(g2^L_O=h7!?kcumO45*zLzl&5i4icv(RuOhy}tzMmVhc=!CLh5~k;E;}+L{aAb$~uD;Yh>gK zxm<35O!7)zUP;nOEJ3kxlYXB{ zlaatLZ2^k|vvVK3**H{N?FnA`)j0Frz%-rxahlFuyh=Zh8Vi6$o6bMAt83-e&)$8Y zSyiR`2O~2FPya9(9T+xd8*skm|FEyCtLsBC{?lr0ZSBkRxX=&GeW|Ld$wK|Vk$G3# z$uJ&|&vbTnPDZ2AW1&!}?M}Ar8-7y4@bK`(7f!v^eX!^JqfFPbu04Eo?NdE}0%vBZ A2mk;8 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/reload.png b/isis/appdata/images/icons/reload.png new file mode 100644 index 0000000000000000000000000000000000000000..ca7f2fb8ea583fd56bedf012925d3c506bfca182 GIT binary patch literal 1793 zcmV+c2mbhpP)X1^@s6D=Y3@00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&lSxEDRCwBA zWWWOc|NqYjq}YI%ABe@EY!LVh#J_;}2NZvY;@^ynjQ_Bi1rR_iSPW+cQbIti_VhD@ z;{Epw#vgt#Xn+09p!oeagXEvT4FCWBXL$VYKf|T}{}~RmvM_8-HDb8WfCB&o5F?u5 z96(9|s8Rjwa|XXR-x!iaxq!9-u>eqp2kMWHK)1jA!ocw0BLl7M)X17$ztS{%26&|IhFb7|1{|kmX=Dgb%|Ea18N21A~>!e+C=b{|xMWVt2$< zjagw900a;dG=*paz33~;_m4rI9~g@u9YFl+_b-O`A3iYLef5c9+k;;WGp_w-IQ8-$ z!;haoz<9^w{|pnaK*9m!OdGks3`Uaw7KKhV&elkDM;=Q!^#IN3`Qah42OImUitaw55t2Gj0}q} zGc#O0xleslwaYDl00P+}cK02Fi4ey>pvJ#omwy5pe(Cu)2EXItaKqJr5pF8_pFxnF zf#DM{CoH(b!tnhM1H*}z3=Hpn!V?OEEZ<)SWx;<8oT3W8plkpTKp+c*-+pJ%02vNa z@ay+qhIb!6F=SnmV0ihRkwFU>+2?}(Gh7e-&v4ZDAHzcXzYMHQ2;Ttn1jEiJNc_M5 z802_?4rS%B1qDAq0D+V;fB4BD$IbE=95i3QePh`5nup=$Cng3VplkO7y>B4Q0FD=s zLE(Fu8GfVX*;V%#!Ql$h|M%ZN1_>UZW7)X1K^6c65Xk@kzy4$pV`uscOexGjAN*lB z_?926F-iSDgD3|iwfqE%+eUJwn^{~4$bMF0KA$nfhg*a&8T00LR?1L);v@4hoA@c>=R%*+A| z8c3?R{|S=*nSqx60v19b%*xEnzy>UUKs3+}umeD@207w4P#$E#i!aO!KfZl=0Wt$1 zfIxBZ9jNB!^Dj&czyJPaU}9!suonFTwqW6HCWhDF|A7r=XJrMu`WH~m_g}xkNfKoE z*B`*V^7R|TmmfdDVt;@Z-21@9@a^N<+n^``2q2IJpIMj~PTl>;0?a(Wfi7cW2$lmD zn_T~asR$UU`{K9}FP}I2n$-WMZ(~%E@3V!p0!U z`Iq4=Q1kVVkaYSF82&SDAb|}E8W6biftBIHD^`ZrXE*Et)g1r<1olCI2E(1-fB%;q ze!|Z1@#_x;7A9r}bFu#n$9;YRQ_eqzPrn%$_C9B3SaOdIY&aWGSCjF7hG{nc!NCU! z`~P5k@CgUQ?Nht^p6{D-17ra}05L)fJMJ&P7+5@)FueCy{>0#~@`FK$mz#l=g_(hg ziIL&%XJ&>A?-+qOn2|vRn1Vt10-St-@cFw>;GhHfVA}&8hSj(D7|vz0>;C`q3sebx z1qdJ(V8j9K`2Pb~nXs__`J}etF3+t$K$rL_eP-YShOZDW7lSIW5LD-9gd|OH@?>Cm z|K&T-x8K1L4oYcTfrf9n&%^LwS+*b0@aNE~lmQ@skSiQe;{UJN^-7VISL}|x%vT0G z>8}jxf`7n1VF5-y6C)(OgMtK4`t?M904@2+AkX`YL5vHMd|!QIVR-nNjp4>Sc7{uD zI2azE+uiqcmjC?!f59&Q2s0c600M{+PbI}9owG-URY<{?iJixm5m>e`v2sd-vf#g; zUtawE_V)IlxA)I}xwK)=$3x%<{Rj;fl#&V{fEbCW4OyU-5*w7wjMRkr18v6qLUuJW j00V*1EP^)^1BSo3_iWW@}87 zS(7Dmt0gT>mu-zPSzS}xIbx&6W~6mi1e_QIVe&0U@sKa?j{Cm%{(JuK9dcL&t$oP< z-v7t*f1cm-`M$cpZp+44eVQIXY;8@|R(fXfq1Djuu04BZ>7n`Arj1o#{O?fHM-8;2 z`*qE8yXZy_AHs&bzr9YI((c;L)zXkIBPnk6UnW0z5ik|hR;}OmtWL->4b2e8{ZY(r zYjVNf>5BW4@@;PKwCJkew;gzIAYlK^6~C+W&52)r8!_s8zOmH?Dxkte8uo%I0%&&(z0t^hEZ zB!wf{M*?kR-DcYQjJ&~VEh#QB1EX4CfIOh`09`JiV99);5Qao7@#`nkBU0%)v7a^p zFG&=0Qrf2jnhB8TCglX+8s+{hd4Tc6Sb`{x7N?=%6$a7g(47=Ofhb^t6mtp}1HGE&i3K88 z^ZSvr+lGL>zUqg_$@v`~elkx?EE0;E#xZF!;y+%hy$E9D{yAW`Q>7AZsa5~`L0jwS z*R_tSwyB7#H>V2#uvb$nk!Ah^%Bo8d|Bwo5(%_uL8)cI)G~1Dw`8^!o7=t@Up$~yd$8IMh}u`5q4BccBSN{afip)yAKUT8!ku3w!Q z?d`Tc)BpX}7Or!Sl+dwvDlVd+ybxl1NU=w~6jV!~5sXJgRSP354m9}B#^&A%}w@*MVad(BTE3Q*a46VBZJ@8F= zXNEf`UhUr6a+tG)a)39QNh>L)hR^SJwuO%<>G+zT`>FnX1kUTm6Y@0J_%RDg0WazbN($5K62!QMhgaB}~9E3<+rl1IDJ4aTN zNpVTEei%s3BrnAh54AkYWiW35%rC&_lF@*_?cccK1?Or0k@(ky=!vJf#r&R0$@^EmP2l4o4^5Be_IM2xK3*+0BD@ z3u&ph^5)~cLBi}bsB<&oof)H$ko6ulWaUF(zN0s~ny_x=8l?0k!KjacZkYzNq7$m1 z8cy<@6K-_P_P`v-QV@gycu1%#(gR^2I@+5cw63LX8%ujRwJOI9b z#&rQd$=!-CY^^YO3=rvWmORRHV$5fyLUYqyrlhF?U~**qpeB3yo7%4jdFPlXF9ERA zKSCn+=1)nvh#&{=SqOl$OgL}ghTQ?D;3382MIxu{giEH-l0nQLlBxh$d1&zMOV9YH zGqTg`jn=CsrS|y^4_Q0QL-S1pp6HlhORwXyhl%kfzsY#RPx%o+K@Wq&&Xw^INg*(d zR~6As=ns8jIdrLg;KySzsbk=8FD(smbHVy?DxzmGW_JVBD;DfGZ|E zEH)Z_EZTCS-SKBz@6@060*ZjKx-N_Juuz#FmwsFmr7a(@jVQ7x#vuU8D)hs1z--L$ zFsuE`aqGw{d{;??2p(m6c(ozNyej!v*>X*u&@+mw(ZD?%kz!s!8OW<>e@H@Wp$pQ&G# zk(F@7S z3u7!P7637>BIi-EiCiT!J$s(i?;~SAQC#SR#((!an{E>#pDC(7ODhJr3i%oLE)Xc5 zbCnc`LzY;ZV^7P|dOIPHT+V})yW@mLu{tP-qL@!^0%;VfOllzYl5QpSkS<8NrfI`8 zm=XkmZ;eYb=_uhGv-5efse}nkQ54DJ@mwKL<(_L5A~rf4j=PMA5*1}OHy8}+oT?gH zfm?&oXk7F)nHWN$5Hu}BID;ffP*wE~Cq^I;geWpF#xOSKgMlB$62eJrHmmMCG2w&N z8V$ZFzh6OOq7}4BeWgwu3@YgB>&5i6ADNjum!J&82Ks7uch914TU$3`W8;yOl#Gs! zcI4#b{wDVO{YXhk(*gdzk}UWJ0s%N2+vzAksv$c&53(GN>-;gOb#9!~z=N^g!a0|T|JpwH{}D5u+)Yi*R5|NX(V&Xf3kDRy8tM}f2?a@; zo0-%%?ef3F!#`a5qU3?j=Y4a(S=X|7^!mWy(8k_`G#L$_A_7~ zeuGc_&q2Ki{gk??5ga!UjJG4-g(l_Uqf4*(zf)8oCD1dHI>qJ#Q0i>S HuetgQ=&Np# literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/scatterplot.png b/isis/appdata/images/icons/scatterplot.png new file mode 100644 index 0000000000000000000000000000000000000000..219aa3ff8cc1bd03f6fa8e7d5b8e56f48f0d80e9 GIT binary patch literal 2084 zcmbVNO=uHQ5ZX1@7$GH-VG#*x9^ zaA;>p)3k8bOb?Up#OespwJ>)sK`L;nuQ#pzz;FEQN|ZdC&YQW5lre)PuAR>PA!l$b zJCF%}4*5Idv3ny|m&h}lO&>bm6A|}=x!-~yZHbf;SpVAcdqc|dI@wa%>vD7SfD}SV zPm*LZIpi6v1{UW`@$toITg50)DwXQ8ZTqq?jGNEr=RdT%K|66DKtwu3OJD8lU)bM2 z5N;>Y3-j*Mm?~BWpin4`E1=K!(<`Bsf7j^II*1~!db|&yE~S3MgkNtxtP6mc4}*0b zz-t3SCIzO}#vVP^X(A@d<#G~^jl`WiwVc;ZL?%^=yJ8Sq)Z=_S9=}Vr=|#+>AZtg| zQ~*dr-W1P-2)aqR+GdFkaW%N376ei^S#2D)y9L9UEn@odssyp19^aukMvuSIa>$u< zd-NH(E3)+cpfbFwwQUUpVeuU2iTEWs98zvUD7~VH_yR&Ebyo|_%+pm18pJ%mtQ$t> zS9dqCj)1TkDFBZqcB{iut)RW6iVY`|3~s~PldZ~qEb>WdFG9{W&wNn@s>4ep5|cE? zJsf1sf0_5KNErtWVp%K}^RZZLitN2`LYVYl$SRqYtEw1gsZ{FV!2gnQJ~R`H>KCGR z++c4c&IC0B;RLb#)aTno4h(Jrovw!Sv z0lgw-E8ZqodT8)=;pZF=5$`dgM)lo-k1(dmNAW9ETo>65vWGnTYP?L!F6=?V{vg@- bi2G?Z$imyjHy6xp83eMK!SwXulh^+Of+p|L literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/scatterplotalarming.png b/isis/appdata/images/icons/scatterplotalarming.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8faa373ffe3e84237c56cd56494fa06b60c2b5 GIT binary patch literal 2084 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 oM!^R4zX$R07*qoM6N<$f||`)=l}o! literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/spatial_plot.png b/isis/appdata/images/icons/spatial_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..642d39c05580b3cb493af4dcfe7de015aac13285 GIT binary patch literal 2084 zcmcIlZAg<*6ux&~?>05J(&)p2Na#b#A0-rHk;0k~N5R#UbwhV~tQHLCpH;cxG44_}i!aOp&80=FDbnrZnyOlKBlSu!VA9EO- zBnEe!E{)-irA}ny9E9wag~@k}?#|GTWdYMMw?U8*a9a#kX>{7-O@4iuI}i;%6+pmd zCXx)n2LQGmHG}aQHT6QFDjpn5UdRawM#~Z`L>%t`5Q1p{;K@dkb_jS2h4Xyw^7Nm( zuKU%FJHuE-@~XHDeY_W=GLsxzFAZpNt`7Z~ERx9dv~uiD$~3!@>?t^J!6|NqpPEQOy$Yq3cUJLN?0l|m)wZ%6_7UCJ~ZXqztjyOLsHo< zRaN%sTeH0*pN8hMm2y^i57HK6jjhd4kL4JWFk%{11$b7MYx{Wrq8Nml<2jC_O22lH z+fG>R=GM6Ldy%l!P@UBlTi2@yGUa?gFY$%mWMYmXCF5U0g?)6MakfUKA_1M6kcFCA zr0Wb7+Tt%H@~pC(23a9os@*xI%2F*j_uYtbjy;a8f2PY3=9Rg(NS{P!vYRsaX^%O_fY?C%}z7s=g{ z9Y#EO%_u$&D@9GifOMXqlsdb+yWe5B^cWLdX{>9h1i_BfM?Mr6oRxFboS^-Cp-BDI j)YPLUlWF|nPr&=nt{~%&Ydz}jL?X+ktc*t+3(x)r6x$fL literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/spectral_plot.png b/isis/appdata/images/icons/spectral_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..747557b15ee0a8a1376239f582a4b83842334f2d GIT binary patch literal 2084 zcmcIlaZDRk7=L%P+_l(HWGtD2Q9}kd5)@_2W(xxYfo8NW3zHCoGn38DEK=s2W|4(0 z#$-cKGug-t3z-J9gp92>=H@`qRgH-zGjYKYlw?LFn@g+3!FuhTzwg>>TDyRM=#Tu~ z_rC9a_j_Nz_wG2f(Nkx$-e+Zu*wZe?mzKko|uC>dEoORVyH?Ga$28HGYWc<%?I-O5p3sann z?be6I&%kd%PdxD&>^S&2*b53A23A>FS){7!UQE0Ee*X^?TLfmTDWDC!1g-`Bpc5pt zf!RFGAWGE|j0$4j-A587+ynlu&r%1fxH=I+EBX`8(i0z2X2EswRH`@`<9fx(k$*X- zU$zE(gYr3!=U*F|&*+fDbi3%BG#VDg{vB)u61IWaITj|jzs@kUUx3d?Fb+U+6^>|r#_p7FY&Ar$48%1#q-7rW#;jXP9fongp z;!~e6y0c6!sdsA3e89Y9v>rbs2~*RSys7aA3&oJtc8rT=KB_T(9g7H6Ja755 z`jzj>?Kew1RHhw;)C9E*wh1f;^AGm1Dp>jzF;I{3);&+&`BGPYBrKffRnxRKcWTh@F$< z_OjxJc0(`i@c1=eNe#{5wd7=0);Y=saVe4^x#?560N#qT0CpufkX&t|Cs@#-hJKvK zhqQ-Hp1G7JN*R-KEynHO0Qe>NJ?M4j1}qg76{|4Uky5b{j9dD4_>*Ew`9`V_XLZ(a r(yY;QV__*D)$VmT9I1zIJp5nU56T?f*PZ?r(sb2&YED1-+`+#An1Ed7 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/statistics.png b/isis/appdata/images/icons/statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..1b43d9859347531a74760fd9be345ff43c6bc57f GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7lu}YI3>1p+ba4!cIQ;gyAs5g{hl^e3p5)rh zJ^nFZn``f-2N%k@4%R$S*!HdZ%VSy5z0YR`Uj3q<_HBv8Rb`-FAb8r4E$#M1e9`XZ k*)A#H(^$ZQ3;viWiwXSTv3SXCTLcpEboFyt=akR{08-IFxc~qF literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/stock_draw-connector-with-arrows.png b/isis/appdata/images/icons/stock_draw-connector-with-arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..a9dbaf37c2fe9c71439bf846b33c0ce7cbb7fc91 GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/applications-graphics.svgz b/isis/appdata/images/icons/svg/applications-graphics.svgz new file mode 100644 index 0000000000000000000000000000000000000000..6576e0d33ea2e2992e619597acb802a4fbb48949 GIT binary patch literal 29253 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/applications-internet.svgz b/isis/appdata/images/icons/svg/applications-internet.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5b5b088125754e3ba047b0151d453f5eec086d01 GIT binary patch literal 202524 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�=wG*+2ZaK#&P<_DTMwx>FtvQEGV-MUHlJ< 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

r8uN61CXA!=SykU>)fph*DCGS3~k>xs^S9tmer^ z|2ywP%|N>Ja%+7!N`k$OAJ6;@-z?lOX=p^dfQ90=ql!nO`F~YZH_{I&d4T?~*tz}k zdh;y0=3X6N=U}Z~pC*x1wOR>4f^fRBBbRSSywf^F-P&utOa;ide;VR7Qq6ZGgnNdJ zB3L*^_pI_t7b*9AZ+owEo;I8rPELhLH-EoQG;}i|k?hzg9r5KZ$!k-G)Yn#EiN~>M zSHZ1M&B3~uK#h#D+V5I}zgIEy+JUnfe${QHDGlr7jQ6F$Uu`CC0l-^q_?}0@>%jv| zuIZ!?;9P>>Gu((n`6{?Ae}mqn`CivsD6s0Ew8R|iQJgkEb9?q-fAn(`yau9hPu|PR z15}(A1}qu-&?41YVF%_Y{w0Z?5FYH}geTejHf6dsu~E2c^hfmf%CPWLgXL~Qd4wBZ zQoyI!)@)9zY@HY@mVK$MOWRMgX^E)lc5_J*gYA4 z75IL2Tl49enNOZDN!|sog2M0!N-eR(zYQqWq+BscmXaA}pG+MkeGfK5ZG^0Lf2s2d zgw0`zXPxZZ0du4y#g8r*5uVJkL$vQ-OnSc`*7F`lV0?wbr30+|7=OvfmF-TJ+56;( z50(Mu9&T3lpC-g;(Db)QmCIu`>LMdG-h;j^sV7SMneKZi{Vg8hRO!8pMm%0P!}M$) zv>D7S%rXm3h$kPX<;llEwpbz6MDbl2@Zt_H>hwQ;1nS69YV{J8U{^X7G8-LGi6jtBAn8$nu=A%K{Z3wEt~# zHNZ;EYV2!3L}{m?8cwrHzT8J_vh-ovHb7+-ZrG&oB3GaP5q< zNQMy*l{VfjUg<&sU|Pz>aX*ly79WB1ipJQ__h6?m#?sL^v4IX>XuAYRR+>)dmb@ON zk5V6=oVrr&FE)bwtj^I&I0rN3f05bqGo5t~GV@Q#s;?N>JPO#i4;tVkv(aA-lM-X) z2BQyhMGxXRu43^9FW`)SuLq(8_*#F4LK9~<2JKbI{i1hV-16xqtGf)vtCHLp80Ru| zF8^Jdg7E9L^tXSP9Q=>tHqXx|a{r<%KlZrt{kXJzhe)bkILVTYepIzf(tWyIT(wEv z?m2j!G%ejIfOk&9aos@;gUqktpoha)ppD^I`1a-en&RZ{@lboVS4*f=D`PnT!L7cK zy}|D;`r0D-S3whbsJMdDzO9UJTIFPR;s_aq^1m9VDMbQCu9zF81#rje&$aqFA1C{x z7C!l}#@_7^#TV@t6O+|@6%4}ipvr1kCf(B(9y+4@gWP^q03q?88Fg1Br zkVVk>*}X7eEnuPd8IgPY6z?S%TQRFyt9pq{8=XM?JJ8{YSd5qGfL%*a(_z3U@v7M> zrWa!eFx2u?VD#3yOUHC?rKdbjibLHfw>yyNQ>8?pjNiOK;s>LpD%V7$8= z1NZ6Vl%aJA;ds%g=}TCtVC5}lOw58-GjII#_15@n~37dEZ7oVV=_2& z+jpr};{h*Vw8MnYb;7Atf0; z7Bh1Jy5AD1%`NZodJ)%U`+kin`q;v3#6lMER_m3)5`j$y73z9_ZBy@#cw7laie|5m zDYWJxLuZH)s|-Z*SZXf?RSXoD_UD{})(g(=zmy+=>q8kv6)2$j3YxBqD;<@nQ)I@| zzR?23Xsvk`VD8Qdt;eB@Nqc2^(A;0y^*%oj`-5k+&jH25H~Oe=7CEDj=6 zwYg?1apEhOMJi(Iv|!@t|63@$a5tZBdnql1@c%;J(D&ZFIu>reXgJob_) zGs}hKY^o&Ty^@&fkTkaD?QYYy%fjAo{zd&Mf%{m@8aAvoC`X1q7x+EDl%PRx%_Tih z&1XRBK>Gb`N~q76BrZ;;vdT0@Ll5iIUyZSm`Jg?ux~+=0Ag-`T;J}Bp7V_rp1*_6D z`)rmo)9X&We+fCS@KjTcYlrwgAM@0munFWr8vYCD_4(g$eOCFgzv-$Fooww;yeblx z2$$gWPw!lCv76e#7dVl`0H`9iue0~p4P3R9+IBPGxHqrz69 zUd)gyAsryOqha286zP=ih^5k&D+j!l+Ki3Q0hO`_pT%_(JOhi0d4pDUW?KhpC&!Bk zcI}w7_zLrH;u2&&RJ1pZDb+sECPf#k5qZaLKmfneiH>cnBxR8rm8~U1fV*!o zK}}5@b{N}utY4?zi}il{mDYN%f|}p}48?{}Np~5rJbtHtytdY6mC7z?oPdA%*LV@3 zx`vH{M(mF|kNM_Y7R&5Xj;G?UMem44hP0aFRPl8;Vq4RcF4)F`DcpQ7b}h>K*7T6f zWqu6Wm|gD@Wx1NwZ{5mt>5wihS~~j*B-%GF0O*fof^hxaVN%ObcG*tv%z$M1KM4fY z&&a35??qZNN^TWVk>7z|)&r`Lt1pUdU77Ta?EQ*!ikStZ7zs|dpUF8c z*Pp92Wct$#lY>fBzbC^Mero5*bD~*_NA;*FT!LJ1!x$S?BvA)oiubc2WVBA_`(bnZ zrOvRX{;YTvoQ4a#w|hdSezgx>cSUv0xL) z0gaX+_mQU(%Dze>!^jVIK9O{*g_0OgGM`iS?%?fJA9NN1STY!|_*#Ga3)jE{%IKX3 zTXQ?qOzlUZPI+W*A88n;m1JCoY|N`oWVX+8#DLR5Qn)Ln@rpQ)@KF78F1;Wd6_W#W zN~wfIHU;|Qz^8i*HA4d zkv1-yxr+xv#Z+@|Y~Sh~iPljjbbqvQs~BDQPt1m^g~P;wp15*$pyHat z=kFXvh@Q<2+e9T#PrbJEjd!voMIt*U0y7UQd!iepDcjmf62wi*b*T96 zU?M8i?G0KCROJa$Ok{^MwhM$pUng3mK5Rb!Tu#0SxN<4^@Z*7t*R4Xsf1-x(cd8Ll zT#|g|tJP2XU>^Ax$8DZ>{Ato-PH!+MJCFqQ63d&{>^$`NHOFNGCrgw542p5bQ}-lUB)^B}0H+4GvPUZ1 z_n+nO4yLTo9)iCg{qE103tp14l7H$ig`{YFuL?T>75(l8va9qXSSGiKW}fo#ZM-vO zF0_5U)dV7_Udrv~L(5$))2yT3E1Q@={{!5svp?98?99zLfksmCyB4@cRZ$l@R&t6| zCG3`OaxbCBSM2wX>s*k(N#Irk8b{!=GPx-;&5~a}O6SYKyH8edozKdgSvIcDZ zlt}!GEbwgtY76i4yLW`jxG`k@T(?~+2Y?-_IPJ{-;!KQmaw9+!ge`^h!{Oig1OWFJ z#i1NhX3k@D{73HG!=>7JBj@n#O@|7dYbp)qYSx+YfV&!yh%4W|&tCTK`;E`X6RPTUdXelYf>vs%Yb*Kn1fO z36y^6$*2jvpYNX0mb~-HG9!yn@eZ9A6XZj23Y~%N%JP1TSb#;=(q|GB+ZSOlpu;xE!(-{<*sBot_t z4dK43UaBJTy;$vekEQfseH}$DMRT#xs5OMnZ+Te$~EEJ>IhB92y=!NY|HY zxaq5+UN+ic2HuZLr2JRG=^q$JbaN1-!bcf!UcwV!yKY;nN+W$c-jle*?b^hYh&P)z zh@2B^*7Zx$X2u%4ddBJwIjM-nr`WApX`IH+gbI1glzD^hV%u-T=oA5zu?&IbEWwjV ztMz4Qosh|Zn$#A|-s&mpb+t}Whkt^9A>9>x1JkV3Ay*d%d`MTRiRKSe%l3o zyeS4+j_z>M#=rU9w1H;(WSXqA|ECwV$n2)IEVyaPL@B2wK{vH4G&SvJU_WxYu0Rel zx2bu;ZoHad+8&u$>iHvYr;o5)=-_ ztcy)nMZd-^)C_*(GGTfyS=zVa?hx<(hlyJ_2jAvv0k8X^Tr=M@TzeOL>zypVqGB7Oou3DX-9w+}h_GNn!y*44#I2cwV zaAJzXzCAQ*$nTeWNuJyCq5wia27+3u21M+QNR#9}-CeEa@vjK@D<5<&`>ncFu;l2P zf}^(0mX-*jua@H8dbc&k^$-+_iLzO+V3Pb10Mf@?Dy3U7StJd%h9(pW)5Z+?npcKr zl{7GZFpL3Gt^LLR^1={l6qJy@bb}l%&mz6LkbQn8StSzNzGtcb+b9HfhfepJT@S_m>7@erlA)>~UeFJzc-0MI6YlJ&a$Y%>rp#ats#h1tPPyOBJx+ zVIN!4e%_S1EaW9WI&XeHqt-jx&}+A;6jpBZkrv|*f!>+FymD8#k#opa1^~XD(uy3$ zHp^!p^us5rt_H~&rpZ;&f5r`=*{K5%5K3}f4Ak$BL9y(ZB;Ryda^`3SuCBN$e=-gpc*>IhCbxjnujF?H8#^OeAW4klI#LK`zjg+inxacf{7({&`mu@vKDrrvLh|LP&Kq37QBR{8$ zh@_DjPaLgRxCP;!kjbJ~*)PNZd`O1nMlEg5cU&~aa+>%C5MTHahB}Sd&i^&yZcIfc z$QLF2&!y!#cw{tO?Gm1~6EatkQDrU;w8Lo_la|}I_j^#q7n8*|1zLisqw%%A@;o&b z$sf`uk$kI4@T863r;V@G7hO=_jE3d*Y%Jz7Ku3{<`hl6xRoiEl(U>>#o6_ID9MnJa zwX`VtvNE~ZUW}W}=PTj%i!1jo1Fs@$JMH;=hA&@Gw;@v!KEfGaKzG}wu`h^7|4Cto zNKbP38xIZ58%+{UbKBxqIXc^5aYCR46&zm*bn#Ls`Zn@nGC$m|c5Wm-3J(_adDqSi z6joX{BAx(^#^cV_hn!8|^HjR#ObKtS9=B&b`(=q0>4&?X-@YPT)6<~^U<4b zrMYgRh`YDR;df=P!*EhqL`4Kbw=>qKGg0)q>LX|CP!YU1d~Fo{mCzKL%2i&U){XYn z=TkquN;F>>AarCd(=zxD^5oR9z4Tzjj9yQ8ZlsAiX=&(ezItYii&8| zxaR;7o~8z6)@iG0HI9zq);6I2b@)If-+QE}hO^#MiU*YuQy+kIka*k3T0P4jv0`O#nM5jQ&r-7rm`XvHZi&Vm+)mclWAw zA+xj>+21-iWu&jgPlxf^Is4e-pz*@Vqzlo9ufg~zh7sQ%5_@qCLG{Wuv7efSxJNvp zgF&v(IOrN7K2)%&q%i6I@$ar|jTFlT$WW!UYYnQ(I_Bv2#6bc;VQ=uRzMEn!%#|ZA zqT_)JTbsyPjbn7=M|XqR;$2|*R)F;XQFNX0Y_)B?yH%qPO6?9rYZsv?I*cmODiK?) zq{J+-M_Z++QJYvTVkHqP_Gs-9o5YM&u~)@jZ{F|c)A^nIT=(^#Q4CH#z)=G?`YU4f zukBT-M#t|XtzIb&T27ADC%+}pV7K2$?L;**?s~^t8^wL(QaX?ZR6)?*f8?K zRsYK{JqfdUWzrR>Kh~stX1n*U(c67AgK{7E$bT+&=c?%G zrgcjZa9cIf(I?>-s$RI$$=oOYk0Gmi)w4An;8S)c?S7z|$43(0iLekYs8G9|Yn^}kU}u9wd} zq&Lr$zlHr5+-^k_c)(NnIa~g)G(BBp?i$e7-=v#gr|i0`$afiE_2@s?q>Gv5+}~3v zp#{sPs04!^P39-b#%FX#l(4?e;t&?)7j96bscL8DIcVfB zYr+nf>Vh`NT)R9O(RMSb_wV0HpQ_#Wpc*vLS?u#3x4bGW?R%D`s7b8A@X9!~Kgq`G z10>ioP?m!!-G`<^=y80ZYina>+jEb2#cbEJ?yJ=hc+QO3u%26S9C^=j8Kz&y*fnc! zESG>;(uy`5=k`#`8ILWN^lx5{8aT+?UH@PTd&M}hWpDR!ZIE?I9^JokHwxkJM1$;Q%;+lrl@8ifGwB>y_dWwfrtnwbm@IzJMYu?9iAfDK~7 zNYCXXgYZ5gxoG1hVzkk$G=vKLg#cmbzBvbe1Ixr#3#V`B!C8VsdEb0zQaBJb_60p1 zgv*|~OQTs57CdTo(a?{e+~;T@-7O2Q&W-#&yTn}H-Oc=a#+Tt%i3YUeK0{5fT9`3P z%`=1Fu~z-tXq{z)oc^w;xPSX@(!&7pnwRSPNCwML5N=Pkhfi9yyLMf)iN?{s&-Q~} zq0w_Mk8}K??5L3hya2-lbzO6EISLr|%oiJ$Bzzj2@M{YFh2xW_ATc=uXs1V`;3WHx z*F$*fsD(ZXRl>Rp)tB=GhFuaCz-;ij=TMAhQXtuU$gTw8H}Tx@PKW#7GKO1t;C;yk z0Y~P~j1t#s5Vs7oytyR?1fPOvv@j!F#!~1@YT|Q#_z?Qjk!8|gi2(W67%Wcvyn+Sz zCX(?y-v~5;RF(b!pSy{p!T))?NoL3avqO{W{t((OFayYb9FnS?yX-QAwgfG%K!x#{ zDGMkVtG}F{HJ_t%_c{Uj#yQ^y`&wXFIr^<#3XblzNeO^U2`4@>u0@+hI_2ihBA+UtSz#H`tuurZGx^N%Eg2q< zTl&AtPEh{Br{|7hfsIT*xTQpT#r#%%J6uQfdj*DgWVS z&6Mt1F^Pp#$Iq!x?oEVdv>4^e(Mqn3m=TsYH5O0rLWQgKt&GW==f9qEz?^nGRv7U= zEvf`C_P`wcXaFTU10L(h<_5aPUIwsVaLOc(kx!DuL#4*0eI}4z5kq~3HI@k%(5I|L zAF2LrO;ID#w2P$IBSdc^625QWcaX!FcFd8lJrHeQ+WYR5Jz{Der$#ZCyVcyat=vi% zeUPu_f=B5m;plS;*Lh>Sb@0J|W5AlxK&Z>t5V zSz&_h)YtR2WQEn)(#U-yz5CZ20G(Ww(s^oAcPX1%a?*pGsTOPuGzjFU$q%>`jhreb zO?(=AiM23>6*33%I`KS&+;5k_;{|qHZtG4rKkXZRio&88 z;2()suytitc%xIDN2whtz+aWNwxk+{&hBMHCJHm4 zm3Q4+z zEm+%y#srijD?Ap3wS;!NV8`((nQn+2zRf0j!D?4b~M%H-@PS8&YxBNqjzk zNMHXHz-to1<(u^-=xR0AgA0PI2E1BTi`KKl<=E3@+Kdi9Ol6Lho*?{2M#c>U>kCK` zMoF}dtkwvA37&)V->5kn3}1nS<ZshAB8n{Rx3D1JE8;tKMn^!B~E8rFFSlk z6WlWcnWb7gfN^^(5x_BruZ})I5l%z42(-EFj|Pxl_|KkOS5GL%6Bxe^!R-p~+zSKn zFVrp?4}EEL>zT22Ec%_jT?qiF;Ga;yPKHZuc~8?xefI|8Jg7{!Ug(Vjvl-{aex+oEO3tQPtQu&^>%7N`lFm(w_)IX?^UyCL>sL18_g>vnO*?g)@@!y$M8W= zAnKr*ZLvl7!X|e}YQ7{|?sRr{gBHkCxsa#e270zM19Wgt$LeLHfdn^yyGFK z$xaLx<0(VU%gDV3OcYPXA&F>$kvbpnEQ(_M|STzn78DNP31Oa|BRR z;piIZk@-{CS5Uf=0`lgW>!(&FIp zk4SY6;iM03O@QlbL$Q=TU3}3rQi*IO`T2oO@Gj{Twa{>Gzt-KA4x_{$1zTBfe-9)2Cpm z46`=avCTwh6SgFjtf4qMzYC4-o*rab2K6zE35;=k#MO?KL1!v#npG+2ddrQ z@`6Mg);ONxq@W@=X(X>Nb1D8Jf=>-jJbbetyBiQezM~->@gJfjB;B)y>C(Z}m|Ga5paX0Xj zo(9R=I|kogBYcHyE)jQ$$g-_IZws-D774{4DfRZn^PwrhZ1=~y(Dv5*i@WNdOTdrP zOZV-;?B28P(g(=*v3TNOQF32`Ay6F#o=i;!-WU4@&tkuE4t(OQMzx4MsqGhxOK=X8 zb+!U^z01x-?fUufX>Tq6v;y%gHKj_IPmC-~zecbXc{}RmUaWP88_z`gO700af9%bd zCwUy{*SiE4Sd4ay_=0|Hg#t@n8=n{(0;`tqn!RXvv{_nOX`(uFWJZ;!e$4-pTg8?# zAE21>AZwBIzEWXcV(o+z$5q@o_t?!E>6AcXm2j<7+L$9o4&u^__Wec&rTYX=01s>}FSeU0L7LYj<=wrO|a; z+6E0I*4;FSe7;sREElI)h@fbBrl7I3KCKb3j)HeL?Ed)lD$(XAspY+8k~p2Lh(Rlw zWg3Tt4-^Dhbcd@uA8Cm2b8LRXrzuGPbOb#eURAPAkhkC>t{Ae_m`rmR$vTm`OObUc zJnAaapxwTB{+Sx;dACV!;zW@Cr%9R{{am5n-j{Fy)QSY)@hA=&E92=dg--5(N zqyU%sjz?oDAnTMSQcD4O`*2B69!X-tV|xig2MlkE=oF>rP(zm`7=6GNiZPuE(qFvW zT&FD2GT37VuDZ)Mz=?FX=8UyMpkeraiDkO|KV zie^}+JV1qD7$tHc+ZB*J4L6W1H(%y{`kE4D9{W>hCD?H^*b^XQ)428fSm&WrhG85R z!=bHngZ@N=a38X{>{ZTTuI*FcV)|+~)O^B@F~j~{dS59oj3Kf{<|xh}^9at(yynGa z)36T1?AMSIEgRMAoI6em8>El9K3JccTWm_2>UpYTHQ8DHlmMy)02%0Y^|OrP{~#b^Nm?*GM<*&1fSu z*M!GTtvA;2Qr`=)x`wqT16jw$1iq?nw`m3%@-ozH?pryyoFpEM#D!nQx+F|3n6iS! z_Qs(hnXLu`yd{AWzMccL0sLwQRkS~5fprqt3f!4rdXgUDH31d#YD-(T7&4%DI?}qY zv>fmsp5C-1k-p_(!Iqc(5A$GpV)pX{p74-SRFlbVEx6vXLvLv5skB=U(9*Lh zAo3=;_awWa!~2`B$(~9%Ap%lFSEd06z1H<_uU1Sq<1$53|U~cBzQ7=vEH-qT9+n`BVVN~Wf-#}xQMTBD+Dlp)6Yd) zRK+#}xAP0g$jrMrvP zu?N*nvB6(dO#}}awR)~zH3%3Sk#8w1eqsc(3kaT#nE^H-sWj|g3*Ns|J179$nW`zE zC>PtUWm`7*J_r4fvk&zNGG()cZ6q4Fq8aPCuNA2KbGH`i%blWi@8L=lfQL?qfv7rz zo17Nzpb49k^QO@4zeumgxgL^Panf$7=vdEjW7{vZ1DpH0md-x4)1*YXJL;{6wC+1j zq!%lbt<$W%`tMVRCkrs+Q0cq-(IvujDC_@t^QNLItIJ>aA-9mg&Mum*S>^L-lP2%p z?f@u^{-wN!Y=+0I?pI1m!369M=>;OtY8oCb2fN;V!O;I zAc=#w8T`m68cTPr(uMboG#TFt?EKl6x?JvgW*P~4lWBk9OgNQRZ&_Lm zTU#k0y*4K`@$x0_WcZ;C8g8b z?uZwT{(9dU#B<=_Lt>&`JPXE*+OJq}IQ7&?{&MBlzgLQr8X*@rHqqSKLq)c6d_vCs zT$Es70j<71?b2|fKq@ni@BnS`1kf{IKJroX!*DOZtt7F9ElzHVSM7j)-an@n$$B#* zxHe#V&Zb8yZre6#k4NLw;Ny)grEI3-npc^>@r+W93VaZGfp|Gp`>&a5?*5qX2s`BY z?oQb9&~k!v#~I`{BTBhRH+mm|)+Yfk9AqPGRZcVE6?e z@RRc2DCuTD5N7-ViA*;)Hayj`IUK``o_pv;lV1gG26v2jMq^^0RR(Uf{>^met|)hG zgS2MF*8>zr46|K+qhd3z`Di*sv@zm*g1(D`)#d^KKY=ySrd~;lI8fCw(uTdqoI}SN z^BTeIsxDSpmPW01cb6gwba5u>*xedMY3^149|?y6pR3!dz~`rG#CfG9Ok=pdzbok8 z_ge`mOXDCKRkayeC!aQD6XW*d%a>F6fYDXDA_X*z@gl3mUM`_lDNuwvcT)FdmPlz} z4|+rF05|>w?*xxgkW=+y@&ip4PLfm|&twtz{S~hyIBAR`wXJzz^8%h4%=Yo)!EkdZ^G8qojh@2+p?2BTIYbfyimwz^-q|KV^Y-Mrgey1x=zuz?p)(xe7bjn!GF z5n4uU)NEl16W>kR=lKAQpZ=xRe^e7Ul~Mu-)7dj(k|E^`=B;G7?hQ=Ssa-Th*>SH5 z+eHF97`~gb3ZcCf$%A#dv#g1CD$1)~q`Onu+RA%I7Tg=^F$zb)kql*Wc&1v(@$5zI z{md%e%W2NFkLEe*8_U%nq}W!XdK{e^+^o(k0d!x-CJb98O>Lk22w2YT;rvr!%DT^m z18x^{Hk30JB?-$u`qDx2~Kl;qv-gzFnZ*kOOYSikT}ZgHVdU)I}3e$a4NQ{%Gu~A&cUF{f1dS z0nRegPgBdbv_uzh%1{Oak+Il}^V1)N&7`^%SCtEC0z!#{04u*{G_Pi}y-4-1VAaAgw@iO|1u8? zF!*~xNR_shCk{i?_F(`VXF6YH;Qe`U0bHC9Loo{RsIx>5!gQ<|>MUUP?o?x;E@s$O z4GdUS+Ih6%{!Z6O#5)p%?t+$XSVgwJ%u%=an)U1fwmjltksw;>--@KXp~x*O<=KCG zc-hp>YRnx5_)CqIlm{EBy;=5zJ0brq%%fkeiehL5C-v8Gp(VhQpVHHRzY1H7$6X`q z>j$@LnQR?RdAIi$=HEmvL?sI8UB8K1kt|4!_W^I>h zd5^J1un4Io?A>uG=w;o5QxlTZ5+B?Wyrl(+Wry?GI^pl`=4yHJSBFC>2P;I`+hsR2 z9G6#ff0??m*@w-ZHuTmNr5ayzn15V(*AruRl)S&Vj~L>EaQeYz;Z4VlE)Ym_BIImudcwzk+p|4O$M@yc!_za&oJanJ zy)BB&wR7-#jNhv15Gylfbrf*=q@;9|$X3x625dH-`uRxLycN6{@o`98lgnQ0(wgUD zW4YXP%E-m@NyEI{1oVhZ3%0+O-T68)-{IKA=W3;v4~SE?K72XK2yalQW>LzSsHM#L z0n@46;x_?199qecu+@4pNd7hKvV(7&c+hS#Ox4*J?M%rJd}N=CGGtM;YeSa!`Z*cB z%SYm>S#(FY>~lexZT(rqua1u^*tuE_$2Bfn*>&^ANbqEUON@1=HY;#b`^*7!|e zbW+$tlR{j@BUFtxfA#qO+$zv(juA49X+F2kh_ zs>=9w%`Wv;SkKDJqrZNVl{QILR-fy^iQFz(IhJ_8VI)L=gL)pY!C6|94fP^?|DmM) zBJ${DoZ`7M4kb_n*m37uq4!8x_@K;3D{D6`fO7ZN*X=+!pjU)SH+4T^eC;TeU#d>W zF55YTpWh|P>eq3<^S3sAYwX4OU^6TAnD5KIH8pDm<)|EX`(7C(32v;ZuO+Vb0+{v` z+dHfy^CSq9Xn@v8#>LUakmn zdvx2bQbkLD;v)FTVbbXV6@@dh;34wQR7uM=wSS`d>q#D+Z)?k)RV|Ri$!Hr{Z;C=B@bgRgB-xb0F3-xkae~&J0n%N)y|RLm z)EkTp@ShxQcBuJAIp{k4t!!(fx~Ri(ent%Wtq+MJ|=hM{w99x6V@07{eLL9KA6apkZ6 zrLP}{ZGN=$_#CLD?;pMSO|lA4dI~7>=m)E2`GPO#m6ZW{h%MyltMHL=AS{xqrAKIv z$WwDOVf92DL~?MnAn!FFP8>C5lR|i;i^6JB|8<`s55!&xTEF%08QVXcD0t*_fl-XjbpX_pTIF zUtvu>Nno%bllt4&=@oM0W_8SGS)xF*rPiQqzQ&mO_E^Zph(fv6l*0Xqar0Ia8Bs}? zb&A$tM$zcj{eb|5A@o;$#{&mi!xyV0bZbSSABQj=t8;IHYraow3pPtPWyRyGR#hk5 z$es3T0LazU8yL-kYrT^*fo9g8>uOrYc{}O$nFni~ntjVGLyAEr5o?r@hYD{Xf9HkqnQt$)I6r?hoKgAQCCiz# zr{`RQech5T(HZg<68cLA6DFVX)D2I|Q(1Lm!aC3>Nz1}Y-#^a=Xmj9SA+U3BBf#$N z2WsJ0Z~`_=m(7%Q^mse;$80ez0E%hs_sRL|OEj@yF6A?jj&Xn8Oe(Fz+s?hzA3QF6 zewwndWF8k0wgK#?E-EjGI z0mHSka+}*I0G(r@e09XDABkUs=O)h;qe9Hg7*?$jd&Pf@F!PRB#+VotDrxW;Tv*?=1_Gs$amM^}n4 zFA_vp)E0Ch#v@7f>E9SR0+zW%vz>(3);fW%gk+rNAEVvDf#y&!=llg2D!VV2!Hr-2 z(3gIoZK;twB>-t{QY4>saIGo8NolFoa)%gwdFKJL@?l%V$9mQ{o{!|v@-P)=m}e^Y zuRDuMk20&SE4)F&H%h$Nf%c$x{)I$=L1x3a*V=V8q&`wg}247!!Eb)x<;?; zLyHK#z(?N;&!`pQlQME~W@iyjXAztSa7yKaC{@^u(oO~l&%3KJ*29}nnT0WA?Nb%i zRMR2F8miqh_X6xEtO@ew{+Za+(zWc%k~9G*tp_OmHrTo2#9wOxgOZE{2+mPCd)&+e z2s?EfN-hKovP82CsAK3blP-zb_K?LJk=(k{)FEGmZ=}5D@B<~5sUi75zB0u`vHY8j zb=QTIQ~%W@DX9rPAPHRacsGQ)L?dRxJ+2WocA}) z5#R&*We{vRe^@dT`9$5m-ra+gWM*7Dv{*~?LcebSjL6dtkqUij%At08FtzgD4l)W{ za(}Nw=xaf^{QQTy(~V>!jf8}*~ zPKRgop03JNmI>pY((FInF4v?bunW?r37ld_aBS;-cRI=g%*t8vfSNOJi%r9O?GG2q zrF2w31mpccR$X4%M%G8RLqfaiqHnB-HZ{wTG4(bi{Y^qm&Gvv+t<7coys*@4EkU7G zR1g)7e%;8ZBJ*HE#jd+Q;G5#JG!)bf70rF5F4{{#s;WP<@cH4>;kz!T8NCA6<8qQS zkEmahF_)BLIIAxAFA^KfO>A-eaj=8f-t=Ja>T`8)-mAra0Q4A4Ul)JM-SkiN$)++} zp&mq|SYgc2qfN6ao_bEAfX?vv0-I3bA&RU0l^VIJNdY14@0>uIh=}993bz}wF3M+Ns9D!DotKbtDc$vKTf&1_bb7h z=01i~mG*afJ`j-tGE4hDS7$7!=4(K^ZIk4%=S6f%q0#)?&Yi<@&&3+)UKn#{kgQoxY933ly+7O3 z7xdrY$p=njBlzM@Pi?lK1k4Ie&u6B5GFZFmP6hjb6p1Y+X1J)(0j+Pv@83wnj_RM( z9p$(EHjRDccu;nu9;~N*jus8UX&%%!>!xH1@Hx`Z!AQv0+^P zU=#8`^`0{QdNP`=yhJZE-zZL3O_XlJ&r5&Z=duUBfz>Q)HhJIpI%63?cEt=nXS{+3 z6qTm|pEvVLq+dPFugSyFJyuGB5=ZkYX{9L1efo`Iu(2(fFBs#vj_o~QfjiX%|ISfU z;h&&UB2i0fNy@xbb767&EZK;)ox>iatr?j_6h~y}921OQNcRpCwn*IV^}njRa*wNf zsP$S{fG<=hGSNSQJ;uYi$bQQxj`71H@*#RuLTU36=8qM8BX zp9dpAxTZxjl`-tB1~kLXv46qU5*Tef@yv_RNDSQo)8WFE>3^RBGURtKdDKBRlP5U5 zkCAC+Na-9Qo)=!q`BQuyx#a1EOfq-0ZwLy>_fB9-_ZVhQ59HleWKDSi>Gm0lsB~Sl z&*yi3u6mgkE|f505qKnkQh2f6Eem=)6m?YO{(SFb;u(&$0l<@N1@e1UPxic32pmY+ zkPq|o?2KBHe_+~9vMJ3wQd0{5Oz-O>8U~E_4^A$Y?zv(QDy^%LP5aU5-duQPil3NM zn)`1m98XiDycgKuy+HP|?3ZtNXb==pRuYa&r%SxKvUa`%#mZvORGt=g{)rWM=N16c zm2H@n0EfAIq@^Gz$SPw0^y^Ss&Z8FYSAL~)Jl^72mXZcf>iqWHK49) zB~CLgp#o5Raiyo`7h9Qd)H63w*E1D*y_rEfcdSIM3>HtLifZalj`|tB5s#x%b&y7N zF0rr3vh)v!@z*YS-Fk>@ymeBR>Y9_$N{@ab_HW(ty{Fhmfta7zFj(C*JEzB^M1ib! znlp=2&pvO;-Z1Wl*0Da3Jq?t#dhPG%U#&O=*Mx`ICA2`6HAtI#ukpZwCAY^Zh8eOWD?bO1^*4w{j zfd(*^6P#tCjCp8>VxsupOFO z`+b`WUIDpNV~4N1b)_8m+&Hf92JO#U$)EAX z4AR-jru$`HaPQeahUr}ZLS8|8*Tki`M)jAIX@SEcG)g~<%ZENB zp{GZ{GQd&nVuJ%n*k9NE#(R(gG9AK^-h+ngRjz)1I4tCN(^L@AACSo7+xBeA7*IRy z8rJoxzS8ie+E@WC-trR1;$RWb76JiAntV@s<2T6H>(kv?p;fzhrT4+GFNnpFP}aMm z_3dX?W|o+5Z<`F6Yp7$@YJn7bt}41BVsy2# zWH}`!OfoZjGunE>(H87kVBQMA@T=OfuV09%=C&z8NflzhQ@}}$SB)FW<<5D((IFbB z?379GFsC+M2r@H)rXs%rLOYY$hW47q^8FSYxjh_jO5^%3hl+fEXTlkGOhDBy)fO^0`5R36)t)j!8^{=g>-&e31jk`3d8 zBWIARZzK|ys7uUp6EufSqJ66!|0S4XOf{e&RQctve=FnlvAA75R@(L#I&&xUu}o5o-D?5qZwFZq73e zpd(IxAiNgWDzvV)W6TCZxPWfQR3YB1>Q5K& z5ox;GY;sNg%hV(yVBPw&ytG;xu;w}`_5HcxMC*2yQOyDsIeJ^h8QAs0Y^wZLAEsQT z9u_i^xAfD(Hh*Q8?p`N%3HK9zsgts`&SiSo{WpVRu7m5=a%q)NQ}@_5(i5Y?I>3~p z8%6#}_UC+)a?mO&^&+k>OWugq3h{jFC|QIXMoE`j|FG}b0RVMdC`=9NO!N=HrMS{6 z6CYPhp`;3b2UaYDH!VpS~v@V9qzgyXqh8>gwk-rn_?s z#gbaMANpR8gc{TfCtHbX=BUlyEb#!VrJ}REZR;KI-^igL&>qqzcYLBCX8Xu##>3;w zhbuJ}9B>bNd<;EWhlrtj8sg?@5@J`U@PG!!5(fP282`o=GpuE6L(h?MC1VyjS5IzQ z%ZQQ$_#@Odrc#MP(->pjn1f0ey3uMYRbw#Owz7vBE6#XY&iZHJqK)4ohTUcRg(d=LsX6IJ#V))Wlcl9=6O@i zu%fG`3ECp&w(4GPpeF^}kAwP<@zolQ?mph>vT*av;;6YXFU)}Lp#2d;ucG;n$eeaO z^hfQ}I9dpwuZ83KKWtpN%cxPT*Q~At@uk`vXN)VmEP=lEr9WuU+RvP8esA0hwTln) zEGLx{rpWvjQI&M!de-Y^)}zB&98b7vKe)Or=n6wN0+3;XnpY(yy1s6gj-b%+-mWnC zq*}K$Lk;PQ{LuDbkwQ3_?txcA@l0Am)~-+LopoNGocTCn{%2g*U-!i^_oegzR8+<< zVcOc{?gbum7Bq?=!EWkW?Csv^!?hiJ#c76^)W^*{qayY7Cujs?YUtW@*M@8@B8VLc zd$`bNQTaU~Z52ZmZmjv#mQH*W(Ss!9*!ho{&8Xv-B+On4k~=p(8=M(O^1BVGAX%9= za~DT;2x-mxQV#|!D(u3K9-eBE7*OMtsxp()Shj8P?T6)o&NR7e!uPc; z?wGfxNTT_kk0)#bWhTPA8QE>sd+FCQd@g@>%x0?5GEW+txoP;q)$Yq%T2cW2N6>4f z@gk=zCG(nY>wmYKX$CH-@A9el7fD&tv#DnTro;xU^-`B{9Q2+QsBXz0!J6?q7a|Yd z^I%43TiCMG;{niX)Dg8iM@Fp&TE|v1w;A?~ptI^%CSgPYW9uUErh%P7Ldq6cQ;VZW zE&}22SkDnOvu{wM4?4nV>d*T#+lbDIqNlZNfNf&_VB|a>{GAc_ zyq!F?)={xGZn<&%NZiRc2yk8g!1|TXoo2|VkrMHHh`)JqJspv8k1!RpZJIOhNr%6g zBa#Erg-{}4ok15`aEdeWu^a^Q2}ZhXt#rT4n*v7ptj%XWQtX zO)sjuMx-}FXbc>}=6W@PWG&?qsr9;y0_B*(HUKzy*UQTNz8NOB5>WNCUduDQ0_b1T zKzOV!A1QBXjk`owT4fqpc6Ecy&Gfl_k=^FKDGby#2rqIPCv!W;NB-5C5OV-Oed6s{ z_`+KA_tsx5YC84Vi}BMT1ymidN;rc#UwZdnSz+(C*7c?x;K1SWl2he#T$iM-^D#ru z0r{uK`oX;1?0%1Y%g-5Z_l>YamC&Dnq$~CcNpd=>89fn)NoJ#Y-A9#D_J$Hl!<`mE zp6s%xXhzl3s3oKHla? zwd@UzXfx_-SkbBG*d4vT+<)ck1IX3+l|vcD9t-TAuf(5~dp-tc?mzS_^bmCF6bV$d zHRLP^EUTn-i5}|Dy9|%A3z!Jz|ByW0wWPntNf#;o0YScn76D7F3yA5YvQ;gs8nmJE zG$;Qho5{7SC$^fn`}m8CQNx#kmIxCi>mE$l!Y~@XyAq(7$1(3#|2<6k@)y5r?&o$S zvbe+@$sc~CeXr>{oIS!G+eN8y35f~=()ql>g~zZ8?m?CRlOZFU- z2vcrDjfJ^(rmVt@aN&g%oM$zy{NcYC#PWZ(y~BmSxjKLsfw$pSV>Hy-=vOZqF0zpO zeU6=~MrQ>`6p(?MuOfL&SR*~Q95eh!;8W0G&`XC91Xiooop|MHq!DZP=W$M~_}V)& zbHoxG1Nw%qS=gSRfjxHy9DscllVixP~k`noFvQ{Vn!UJDZeK2s##}mz6Lhk9&8`1uwrH zkL8$hJS$)6(F*=sDTvDBU0&QN?f31IAX9ki z+T;1&{MJk{pw;!;O`ip3Cl#!@cWx8>;@^xd+t(4v2`bJ1)RMCNM5Jmlukz8v8zOfOHnd|BJx+-_RY6n$+avliiWSBvTb`lPxjjoe0o{W;!9PX!7!iv!Q> zh?yEJhE;vXHlKBC0|y~^4n6c21APlrDl6PdmJvf&%25qi={?Db>-TB=!vXFA7DQ3Y zm=-D{ekaJMo(_~tmI1ey_RQlhbsWyuIV%You^Mkuz<)f{^PuA;!blz$P?pHN+k6i# zL-@a<0SJUUtnadz$Y)cwekY}PqIxfC0&^nj9|4bbbrw?OS;we_*?&uSWie!R@v8y= zpVt@1r28#5d1VOCCYOZ{R-51m`jep_{$YMvdoAAwpEt0sO#sw}fG0PAG@qM{v}skX z)U@mngZ1>+@mfa^&rK{gzJNGZtj{b&RXv=r%CG1EKlU6=6P%i_S9(0O+7wzUQM2{d zky2Z%%KsCQtG0_??XSBC5mv_5Zihtl{tfn5=Z1e#CmMgZwQZBGY#@q#4LTbrme=Z; zLso$nP)c2oNx=!T5{}AbQtD+yAm!<6jVBTeTJ2@`EM%p$k1dVodai8~@65~M7{dJ~ z?!zg;{-wJfg$4%yHZM*PTZA8112~x@XhRoba_DTk|6dv40)IoMUlseGl{0E@&OC3V zcI^u^lengBa8aaTbP1`2dHGHT)`qxFY$I$De1(hfO*}O8&|>v7I3Q7JKC)`)A##U; z{o{G_((^{CZ-+*=x_0meS5-X!4awjn4MT9#uZv0;hb;Ek*KMiOuerIbK~37t#4DmJ zBLfZu6+1WpA_$^S3TZzW;5cqFPNY%lc?%yD*R)7oSjQqp;q_?JpT4+?QqI}Mpg+?> zk$c0IRk9lq(nBj2(zkj~zC!-U&Wk;LyA0_Z^dt7>2R;=$=x)ehKQZYne;ycl@GWfm z%d3)`#trqy%Hqe6?t(u+SFjLKz(mXkw3PA~az{3E8e;DmJ@q5KAsDW17^gPO% z>n_5VuKt#^e2=-)jL{zGbwES}QNqbR$d ze(Gv6tz4|QnzG75HlBPOI6TaD8gO0L-VHtWq8;g8GwX2qbl>r9j*&IEt^MHDa=`8W z5=JdBo<>*{wuM0K!vBDV?ferYReM42Krl_h6IKX2`z{@t(NVXb=*sQ*!swKpEZ=zB zrQKmqBMe#7MbV#GRc<_KCz!hB$%?M zZ_R>SKFOE4+*83yH_yqypOSKb6R!N~klhg=Lp^|rIxN(4^I$pN-eSBX)A=Q_jUmIL zV)?%jo;?++D1i#?d@*KP(|w{od9JXyyAk1K0-1{3b@J^=#)ic;drEifF4L}juMvqy z&I_ugDoF_|6+q457DdM&`hm+F-@`oBnsabrL#byvhwhuw&lWjZ4{{!_D4DQO%RIT92K^vfSrqI zcBX!=Q{Os-?stp5eb7Kx=Id~<&UDw*pj2j0d|;+t9>_PaX=oPcEo&*?NEs77&K%2vjl`cKGD2hl{xioGL=63Su+|f*=t>f zF%PBOH2cTG?l8Kn8Du?7RYps0k-7Mgt=!J#^cEh=? ziPR*fz*GK|UX@TbLo3#bmoV$^O5&4x;7l2RjM)ECJ4E(-wh;SOWH>2D>IJMBZA65v zfa@Qmv(~A_)mxk!f9-LYw@`zF(~WHBQ(TXH`W5FY|X^8szc8RC;n;Nei|AZj=e_4eQ}$WY1V*H{ zv5|k=a7i(ID4%Qcll8E1+(m#2c5K`-Pl*@8skQl^TFx|ABBMi6@kF=}tR%o;7VLa05HAU2_P?H$A_YVW-{cR%0nIlptxb@?xs zzsP;R->>m}P-RsvJ#eMYz=UMV5#iAJ8Uqa#pV6@i=9qK6rQod|VC%*ZZ4JXISgQ^x z4Uo~fKh1FSRgtCLcQr6-q!I+ikaAnT6CE;(TNZ3d7+~_Q@-ijEZ_0%~D^hk$Td7)7 z>1li{@0#Er?D=hJ#9dJwCkDg;4?8dLlK-*$#tGl9W7*LJ#d*t3J;Nwy-_$e8!Z7>? z6+;I*hO>Zd0Y~c&xc}1IW0Z$=6tbb9J3oCagHX~KI6+`kz?JsCwotLeJ zdyTMZ1);y;pUkbnkuR;PapV|jpbgmQ8KgTf;{Qxwc;+dsS()3yZh$Mko0I8r=hU|p z`xK*%pUTg)Crk8c%7{tI`T017cR4i-(OXfe(r(=3!VTTvK?g1#rG1v$dD?MuXr;&} zFM9Nx${8meM(&=AH_)9O88|BQg$Obo+VZ283Mg)dXF|WnKB&}dPAS`4K=@NWNCv<6 z+j(fPH$M>2o&J9Bz9SI(9{r)HJUh>3KUNynAT=Xg+H#g_!-Q3n)#*fj&tfKUE%w$6 zJzgz%L+Xl3XCx*a_%4}tmrPjjDI7+9_smYAZ|_#eb5E@=r`El5sh?8Q>TE!jc-4qU zI1#N(n;#NCuRHD-x@sRz#ffuEnt1_v_&@+ui42!B-oxa*pIC6NA?@1!QBs1TXB~6y zE|5MykLW_vENAbA`Y9!x$Lq>pSeN_xRiQ(&{Eb5W=`pMu=N#%EgeJ5L$R#EgfVM{} z&Ek||)tDqDFRk0Wcr=oauJO0ht00?vb!G0P)GAYG|AgZXxs3#oL%Gdw39Hs|5ENDz zQT>&X*}a{MWlO280(S9R`StF}!=eRr@Q;N==m+dsS%P=xO4xjSU3yLK;Y5UWR{S&j zt)Apwg+O124kHMJ#fZ*Xr|#2(Wk=0|PXAtuqP-6(62tLfQ`1r!go}li5B&)POT^0d zqJQeLY6H8qPKuTE8jI_80l;tO0i!QVBc~-QZusK~8*_Gjndk82;xs(g2BUzaDFTHh z{eraFaCR^hVAiK5kTRK+e-MflT7bC39Zb~dYOE4!qJ`ZN}7WhKcQ^S zttEqiayE9JGs`wBJYHDy+i)m?w(BmiqP#*#UGxK99SfTVWcRRoJur(O?Tegy@BJwf?ZILmQvkic0q&! zC0lC4gCotBY`h4&N*_vlNz-!bedqGwY~ICr@?)t*|CsM8Q?I_(+QVWCl{B284TGh_ zi^Nq#TN5`PTq}@Dr{DE_cbC555*B7`#VGf=3R7x*X|K{^3=%NZ$845laTGpcuy{UO zbFtxnW^_IW{M4O}`JWE^Urb$`T#zH#PRlQj9WLgk4*UUQWzXnh?b*e_#n#5fQQcXq z|Jk$iqvM5@6r6wUd7basO5G{$V(Hmw9b>k?VcdT|x=5+LN6CzLF^9EeTXTil|Sb?NOsy!+t4Vzy{Kxq9@^B$FZidj0hPGT#8 z)1z0rg;q-J?$hqM&oZxtLexsl30;_oZPtP2i7qo}XKxXE9u?TeUgQn?#qzf;MPT@< zjK9pqVpF$OXNQMr!XssvK6*zx?z`&m9ZwV1XRun6jjL3trB`2)Wf4YS zn-m)7ZK@+cR9+Nlm8m;3J|-g?7s<^;P7ZAN{ywDupmiJ;Jr4mNH^ z{TLrIV!pq2oUf}$-VBFH5;+DWkE?`he4zRr@rkz>LGA9HQEChxLI}5cl-RU}=uR-7 zza?wRWCrJKy3Fun6zgfe%!aW93ri22F8syVik(FBdHxgF924?NP&Q5>WAx8Zc(psU<1J%T*7Yc8KK$x49lWFlW(b^E}lI}0RG!$Q`sB-roxS%Z)I za+a0kFWVzu?iG4j0s$m#Ik2WI)lwI&W-t5EyQ=O+8c%hohMRbR=uNhhp&Hl7a5)Sx zC%Z-z3;$K;#4$Ef1Y)%wK)&q!O{ZlsmL`S-^M^4RLpyzah)p-lfMIjCuEYulX6Yg> zCMqDEDT6*4j=R~xW%JsLcE2q!rU$B)%cDmZUpz0N?KbIQS$LX8neXZ8&-gOy(^l*Z z)KDk=YYoI(w?~PE*=vazACX`15a)V3*EQP`%2cHfDVIh2h#EM{^42~-+3>$vU!kxxk zl1M2@nlaPGgKp{CEo3Kq<|(Y-)#KuI>S0ve{Sn6zg)VhreAdy0)qUzj`ASTv2(2XY zBMBmyJ>SYTtK9X*_V}so!eal#a+zD4(;6hVJ6A}h>30VoD`2GWgB8}nOirv%K8C*$Y7^DtC`GO^1@T41t1nrf{^_&Tdr+`QyV>5SBrl72Fs=pVY+ z1lc8CQh>zdo{Yp$x)=10?FJ-QrHSu4t+bY#t5xEPZ9o2~_O|R^TaM7sc4d3GGn8`% z8*ZzhF=xxnn;Hy7d<)v~OQJufC8Atv@as&3geAWu3_+1Nc|e9_qO_ zX!zPhg5-?%q|d$*9`wQs|2)2JBuGJ@4%S z$Lwf-eomm`N7mdB37`aLVFR*U3tspP;Mvs!-!+mzHC~NhVk`+eLe{c6$!m<0J)xt> zmzuQ#_ZfVwHN6k>{tP}LHr<;=vTqh{L$*>?eW+ykS;YsB_2_V_zcbAgrMn9>f#MX2 z%Lt`NUE3%tt?fy z)EK>>_7zdJ!SBa{)kZQalsy^@%f4lna>-onz=x9HudYNpIOH-|S6^`A=?_;|a z_DFbFfV5_1dL&#DGlWrUDK0%a1+@<>rzom1SoK!Qno=t*TgLXg;rm)^KW0l3c#<;V z-Ke`kVM^}Df8q?7^{lq^Lez6G3Qsr6nI|7cu+D+_cJBg={gU z`;MM`MPI3@+f}Ah0?TUGzT4juPyw)%3ZRe`IVYnO8IPCUY!D<_B0p+X7lvpB4O1@# zw?Rypof|nR=9@|bNunj>HIF69G$*iJnT|zyub7=nv`;3 zwFUsUAaDX-nnfo+k?waF|ACQjSwK6pT%BKP%^D9{f>lPdoE%=SuAd6u}HpJP4!C1wgEildOg-6DCg6{8wZ%+9%%e($k>gzmX(%qfnKI{?;U-*(%BTjjF zpc_KUiNK!T`@_@H2Q(?dF3Eujfdt`uwIEVNZOHA>eb3vu(|eO)dcE4s@k{bgo;>sS zyo{ricQc5|TdC<@1&9=7okP@5I{}1*^_ktnlLv&|NCqk&=g*lWlz?->k^w+j8sCN$AAQTji`tJ|@W0G_QOrpvFj841UpG`F7uLe)RgzfSM+- zzbW%gG_S#x$ie+nh6Oy!+WRNV!`Vi)4jFJYA`yWC6aSH33LZ`rCoB!AZ-$fK*~Gs- z5Q4RaTN%cRnfdZP;HKG!Lod5~J#E3Mph?ci+|8{Xy)jpr9X`!cjACDLTt=y`nSu_n zh2`se05qF(#ypissC;6z8n-ddv$tZZW#g8G1`K*oac_K@{ z+G?HuDk{Mx6-3TL+rvCDlZ~r%@<>vGByet_TL)5L?yo>`kHA6sU?z7vwhsYgnKafz z2s>09ak+S8mun!sOg&&DZdTK})b_$*((GXWwH^cNprR3Hsl!an==@Pb?X^!cbf=Po zUT=dx$!t+4rn{h?3APsA*D5)D%_J8OiXFA&hnBY|mPV=&`YuVxW6_f9;n#A8&3Ps& zr-!V8!0!0QUEjM*^qpvzSM1!w8QE{Ov(31UKLi8Lis25w0b%Roqyc6D1xsvY!^aF~0j>0d*oBIOa%vaSSH zWV^@vKv$Gr?y!IyJy4+?r!WeS~e zv5e9qs1sQpO)tx%n0LsMQ+EyNW&53>#`bW8t+pXLdmo-qJezry#(BxjY7U;bxA)gj zk&}$*7ddaZ2W@%!NIYd$!t<}8@^iV`qz1nbaD$v^{W*N<181L@*-s~EgE$EhP}}|V zN5Jem(}HdaX>BXKO@~&`Qk692}zp zw>l?gI*Ag`tZl4tq1tr5F@Ieq-e`o#{4x@pe0E?#3*MF9>UqoR9h+{1+%Y6Qnjgc8 zG8+S143uAx;1D0{lv}n{%{P*UtHvcOp9F`YAlAe61?2J_v&&#tqMW86D?b$Bj#CtQ z7Bkx!40&PNzy9SvehLDJtDJaY_+TZZ+%4$iJ`d6uIb-oBlQ&g#dno?pV4iHg&~S#a z&#Z~(An)ssmaIb=LjigpjZI-K0-qq$R!xXhCs8M8-jHQ?;LusWLEdP-sdcUt3obWb z`Rxi%$u`*}tF+IOY20Y|uL%%N-FY7LDS2Hf5)K5gc{jBJe998j&~m{D(RsiNy#?9ce6(x7@eBemeYeL#ffo1-%WA{-@Oz+F5-f za`V%5VE51b+H$#5@fz#k!-fUv++hIdpx(1s08OQ>K% zN+Ep+v>YH-h)vOz>z8FBvb;9up=tljA% zHzNBJcPv=Ss_4J_3qESxQHGQbUu!WbP{=b`EzlJ*B=uVB5Tut~wI)maAKcU@(F5HK zVQ*m5eOg_-eT8+IVGpTm=zeyQEuxMJtgxW6k#G!L{{;ytvaPdb_jLlI0?q6v$v;1P z`A|l~+!(6Xa)9-Lu#oB zVusOhX;SER2ZOW^R7zJ8tFq)e`nE%YWlhE3dhy;4v7__;LSDKkp6DFm{F`4}udov6Vyx4asc|MgH5t|aVxrPKb$LwPG% zUovJPG;Z&0#33i<0jmtC7zck6 z9}Ug)Gg%xS4ZQebH_z}TiY}frS5d!&WHUpiv*g#pHE<-%_N7fDrPs$j3)U52_6Vt9 zrKta9tEW*TU+qKA$*PvwGFR6}Dd#^^dJ#9xo^ey2^R|eh#WJmlsC$Ve5yN4aNN<=KsgZ-k}BF$lAwK~`Tylm0^E(Fsc+Y= z2HJf(ZsBY#nM0MpD+pk9_fHQ)-(pmCO7pZh?VNm|_n6{=8&n@W`eUD?D~*K5k_|23 zp#(yfEJrd4f^M@36n52B_pV)F0|q=KOqx)KVn3A_XP(GoB1`gC=`6L86L(L#38l=O zJtNo;|8gh-hZ)gb?)O1qZkBdpc$*c(uW6Ou463E`ev90S0Yp2&lL&JqCPeR4&WZT| zDO|o7sDO`aWk?xkg43hnCT^)yjE1pj+(B8%xt4E=7VbptCQAq8GL-2663@Qf3GH%% z3afV*t+;_^{S2wi(Xf4?=UbDPWK}td920ExZ~Xu6r^?n%Ly2W)%kZg_<;rh#VBwwfp6FFPIxXl@C0@j-vCys0ayX3CAE@ zS214~5O3;{LvQGS>n?%`s%lEjK1ta_fOn07Vy#`uq|GGSip@IZb+S|Ie_Mm@9G0z_?Sblalf{Z<1xgv;d*wSwSF{}=m^u$ zx4KxDARtSM5rzY&9Yd>sC-tbkGY7_+pdBmaZ&PEOMNpsc(@pRj;-{a5I#bFHlosOI zyYB3(|KW}TKlLW0%KgDfT#kF%HMyZls#G~^P4*jh(oGH z^L@d1%V{3{gi=u7<$0yX^SkuF01BnO9-vUDh?7xiK+wrLmvG&8E|iGh>{5suHl&D4 z)GqC6-40-(yw|0Fpam>~wC?hVX2g-@B_L@_>80-G;|2Ha?*meC|?r#WD3AgK)7Br8Lcc=6EC@~0HKC7 zplqnO0|Ul0%d`OM3C}%03S3Ob{!`n?&AzM7&n@0pr~Fs7vN#tV%3@hAnfP z{fXK0h0!o~jDolIJ{;6OS%kGZ%-s{lMrHW*uTz}s-rJBYG0IFA5M|S;z$uJA*^x_r zV;FaheN#^6a(Axv(7S`r?-ysf`gq6?D2N-u_3hT^ENm&Ro9c`9=!9oX;Zpjek&0rr zNUv#=oR+6Q#)*6ki=NSHS^Oc0TZkp!V`CP>u7*xRu55(6{+z&9WU;z~a8lA_)m`4# z+d}p%t_7jj7oEM+ND{*wRUL&Oi{NdD$>Hyf>@S-67gy5W3JgzjV^Zk3*0=95vAL0r zOs#P9f(#{$j}K58$NinapMd>?PV_ywBPBhCHduY{DPAspW`(UHvpwuIE&SzM#XZ30 z>1I$5b3}%u#n^Md)Qn~^fOyw^in(VCo?6CH^gu3K{a+r6(l@|EDR2HoC8?wWCQg!G zdo;SCwp%KgYUytf`f74}zfU7ycK!8GxcLqGwPy8Wc&=80rioH3E}sYiEPbB;@ldQj zALqUGUPQ=xq=<*dwY-;4&*@~uz7L#o;gT!@MfW*dHkWx5w3J)bJepX_!Z{sB%gQPh z;!I;F_g3QG{vQq{O4w)nKOBmc7g{a)3=8VJ6$xWPRG_UH_iu)Ic-*bkTGe~yQAQv( z=FI06#yAgjv_Ua#<{YscH-``TVV(E77)7YV;W6eDUnBzP{u#bDxwrqYpfj#X=>EC5 zdeNwlL8lZkBQMO&?DKW|$W#GWb}E*Ue>oH`UT@%R#C{b)8mL%;%MGdZ&f@FDv7X-l z^-zX0{`FAG-w*RUU2zC{ZIuRiD4v#CzS3TgR-l!w+nAYDkvLy`e^6r?-XgXgKzO1R6oyh zN}213th0pa2WUQCz3A1y9!fDVMFrW4Tn9Xq9$XbCZ|MZydLti(Re1ZQ6m*T|s6m|0 zGsf&Wn{@(-CR)e&Y1cBZv)b$F2GAU4SL3*5Zv94i9Z?-7ojj@!FY*+U*-3uQboD~( z30F@Ag0_Ifr-#i%Bmi{*>c1e0MrSBTJ0Wu1`7el~Ls!!H%xH|pWOD^`K!N`509K`#YO>(%{GV& z-QSp+{rnK#KX!si&U&)SK*B#f!DxRT{XZfK9vh*U6q7Jbr*%*xf-&AEU9(x`;aa0U zb?_e2I_yLx@;!qD9ie`T8!&1O)tARSnI~R9gdvXfB`{qGC^$3$IYZ3~B%{PBdrs>` zgFS`x6RCdlw6qg-KjtXmm~;N*{Ug4?5PmCQ5B2Uhp5u?{X?oYoAA@Bn5*_UotscTv zQwIMSFcd-*TxOZG%@dcUFK4~Oz6onFe*JOX0;o150kHNBBL+AA9|A@H8$>~Sj^%Hj z9X!y_k?{9zMd5v4>C)kPonyZi!!^f^`_r})E~@=)1t6-Bsq{^r!sU)Ib<;gP=C>*8KNSogh=4zeE;Ky8V}H*3!N;AV2JS@(P3$=^%u->;xVAk0!Q z08=29cADx2Q&;Q1vFRF>nM^fw*Slvbz-fV!{*x|98=P?CFmOoY?{0l-0Y$4F1ZK%z z4|yRAglxYWJMIv{%;XZc^sIAPD?tjEv@Lflz&%@?svZR%dDFq{$9E%n24iJ!{0pLt z$BFk+0U!!*C+ZH?)jYbB(@}dDxneKA5&J(N3d}Il5q{Vc#tCHF+8xRi|M6C zsZI=YCW(|~ouC~uNdi3LzamP)R(}@JL;hz_!p75^pLT5D7(;&r9w!LW0>Za5rq-@S zvs?Ptl{*`048#xr8$_9FsRUUj5Rq3f`|b{2(02-ok1sBWF3^tGOXMR_9P`*%hg=Ecjge%lS&PjF#P%~ zqXJD_;I)80ExnK^#jvSc8s%7Tthkr3gS$NBQ4c7KAKed6-@j|?C*4{Y3!^)Q+@(xB zC(^8NoFp?jqyv$|+d5-muZ9(AO6FrY`iUx zCmN9?5X5U*G*XFNU-01Lf;Qowe%2E6YY@zvx^_iU=co(Wa7KFd8Bf>mjhB|cJg+Ja z)*y*b?7anq2pt0+dQ1LST?<#W zgaW=MB1|;!q~*4Rqn+bJmT%_)wnvAlqckJ5d7c z!1#;Vab|Wx=>Kh^%uGqc5wg%TU09mv>8I7;cF2pgWs#fjzHgL|qY5Ey#wzRbToZRbo186MFcT7iz%94}w`q9iIz^Dl`KTb zAt#ZqbpdAZ0EnPvS9o>UuIS5@bycy}=)WWiE=u?TFr(b}9Jf;i8yne2FrZaz&rnmIPLHHNGzEX4A|QK%a_pkm+h0>E67rCQkn& zqNGm!Y^5m$CBz()b+_nOwfJHcP+jP!yt+$&Nt8#!*WLn(R!xFVbRdKM?_Ea%G4X|u z%G0dZ{0d?IDug1z1vtwLk;z$Gw(i|`Yd(s*x6_aG-8Y%f^gHs2Mr0MJp z*#=()q+Ntcv=#ciiQovH;T&|ud}*FUM4oFH%H5S$?2ohf-`@0of|A23}vNIZI= z)cIn9H_+V4w(-j}L+lrKD)!-Pm(qqaxT?D2g?ohDt{GN+T=iRql!0dF@E8qcWTUOx zt^BxaTk9WmU7VYF+It~BP;i$i{_FEtbZQka{Hxom>J|E@fFj3UKbo)57s_lYg>Tqp zzFwey5yoO5oez#~WD#A=b<4jm=kLbUXlV)kZ4<-aRisux0dOeM5yI8&%WrF>zhT;h zH06BerAvTT)GyAEn>~8J`jUJ`<;-4>t9KdB5}h_QcFo6Yq4Cn`t>gQ~3IB&fX>xsv zK|#p1$_X;>{&FZ4(dR?9DK)}l4YU1@qAnK?^bSz7zlyjodvF{6d~f`fN@l;VNJ#)P z9OdYDkLY8pDWj<0$W~`Bb@buV)UYDtDBnTW90itlYL=o0&ec7yA?n zbaR6c_KP8qB`g{78jWucGGH-mE-i@k2~3Yo-o{35qc?k+LQCS+^c~6`5^qE(|Q2{{s-O|yi!TtKXHWk2cC!XYv2?cs-$}{LZ$<9M^XU=|5bMUckQ;J4OkgKy{JrhyvIO{dt$~_%68CG+ zA&HhL%>pDFXo2Q{q0T_5H>~0Do9?I~zuL+f4}kk<{P`7MJ`3W3e&H-~vq+&9S{qZmD>oA8e>cavAjI9v6sp|V zKK!|`N!8t5ST4PnE*1WHA60lG0+Xjw&DnhRPse!?>)ehXr-da)9yKv_1}6H2wrP|0Q5Sx=I;GMz4fRRaL7>;2vq;f#Y(Dj`%_>~$ENt)X9K7qPWjTlCZ_U63Opr6V zmcCh8E&Segcy@nELcxUJ?ZYX-DSdOLKbu&x#pfFye!UVuqmylTLbSR!SFUU+C!Q7W z)=PCgX+nin*(4|E)=qRFB4*cV98nL zoWqrWBA|CI0#yfWS5Bir)7R(mB`v7<$V{}wQbDeVd8uzdjNu^evgOG#+~owNW4)Zj z>x!MoN1rROJFWLTzaH+V*(i}tqTsA@C_V90ZbiQ~p?)(={d8Voin`H$r z2_a(b@G*%!#ri@^!qqgz?H(p{w|B=DMFkx*o|`F<#<62}%2J8uc^W$nca%2JE#(`3 zcyi5EMoy|Dnc6_KDD z9griLM(<<`r6u?43t&&j_)$v#_`CNc0H7%MfQW4vN+!l#HaiHTP#M#L`icVfAeNMG zZR){EBKpy`ytNVXB{NhOdkwaSNYt*4{=l0JF&3x)nkaXj5uqK*5e8ljlz32m{0z0+ zt7%01GH1xTn)h_?6$fF%`|~6juG*r-3>w64U)8fBiwW2I+lI`;U}+Ev*;<{4 zP$PlV;$qhG{?NQiVI8^?^F-yuC0=Pcwec$2Ti^a;qL?AYi=aP)e$o{+cM_ zOn*%j{b*)%ZM$ZA4~ohjDTRu6G#tq9T3>^3C_gh8l;g=2E1rSaS#M}?!|ac$?9yjX z=}O~KMW7F9=u~A#t$^cIcWGi8*8s+wrXmPfTXSxBk)n^&M#_(u^#57s}O* zvYjw5_z#L=6#>1l+KmTX_N#qJ)9xhQ=!lYCNT2LUc-4AlRRG@vL|Vx-i&zR;%{X9+ z*@SG>f3GW)|5F`MEn(*t%&RF@7z2j)0$a$$VHadjSC)2%nuj;o-CVy)5C}3_bkk!g z5~#qDLszseVBlU)X0;(?ei0+ggLyt)72N0rts0C;K9qQ7$eRgoteH+)gnK3I)gkeT;#olk0DD?aN|m-@6hB^I_-k zgCW{YSZa*?WVM`d{U{)?jEjiv0LF8sG*^ zP9eGzmaBDDpM5kYEi5)l{&76RZvLfFasyJpJC2EC^pxg3xO#i<79*-J3bpQbAP@fh z-eny+ZF~s7H!hq>?yrsF5I>VUSPR~Gfl;8H_n6*%(zq?u%C2M!ZrnVkp=F>YSG-%^3?UJr>u%iYf85B`?c5vqh`;RzFy1G(nE zG|En=8VL!$^ovqkZNau9G=-Axc+jSfSYmTh1+(Z~;tKWNIr1N}gW3>&SqA+7T&%QK-OQ;TjkNmnPe!*cu z2c$941Z32!oVuMcM3m|WE+aaN8(z?0o)KO)07g+Lan~m`Bj1bdDZYd97)R>(2qNoq(87qQ4lOK!QxQc6n7Q39gtn#o^+7bo~NY^ z7fTAA-TMkfZo*HC116r9i>{!X=Ocwh-$1~h$ zJg3NMI#c~$80Bhrtgr)f$6f7()XCG+ZB8>`9J;qmLg+z@&~rel7ix=Bd2Gl$4f9B44eH%sfGyCWc@PtYkT%r_3R^}t=N!=H!d2}>}&{MUlq z^Yl(F>xk3U&`x9{Z5ZT(*{;yU@^q2SOy;sfL&+D!J(Z?#aTec`#(&i4a8u9~lA^)c zE~#L;e7hvGd++w^`xgIT2RPAe_Sv09I&{pwhC0073XcY+Bz|qm5(=R%)0j_ztBh>2 zQ%*DUA&}g9S)b8F{-GA_Ie2T0Fr9U+HIr(WC%5ltCsGnquhI235-}Qq|53~rex5Ou zeO^WlMyWD=+c?7K9AJlION=OMR9gWV#nqSE#O!R+psScDJMpO$1pgL1yz}8o8CTMN zRkFJUL2)IiD4%kYPR=^&uZ$AZo%dPK#mE8=CSFSl_L0wk`Hq$v^0E7Q1xFLL->YT~^0CRBe3&Biz!E%oU}tA96?2tbz%P&YcQ1s;~2C2Q?)G9_N_ zkwD7y2)BbzpE8RHZKUgmW`4iIqBPUDzQ=rvef4f{DCcET_D1#f5$RIU@>U)IqpYcO z4NS*j!a^X9#K8dkSZgxPZN>?A`8}P*$ZA&gX%nT7FX=^V?pdK_ zO5f%~w%oJ}6n;+dC9%P_YCRuvJzH8%`k5!&Y>v)6qVG=#MsnEn*V#7mVW@gG6r%@~ zQ|xqY#%)_a`U-#BNc<7#z;z4k6H-1qF zQ2h#2*#&5ntBipyBcmRq0C}25A&v5$r`YRm7>YMtoG(hP^&d*X>*g&|f!p4rk4g;! z5FUlwpu)d2%7GV|j<43|A5T@7s9I5jn|)&SM{&y6MW)ABMJ00n1EaW~_iL71tfQwm z86rYpxtr^{bW~9UQ1o6^f0zHo8S`GjF|XoR38j9a-s8v*<@H2dY+^aVbIB1qkueV~ zNw}(={aeRJ>uT(ZUZwb?-je#~;ewDvxn>kc<1-=jerylS-s@PC{4js@H_ZO$e8k9* z1}>&xS9Q#=%`+O467WQrx#FQ*A8u(YHv(W$zG!t%Dbi*kEZ!fWngA80p)<^L>0O5? z)8$uA(EC4E!jW`Jrj|Bt#QQCjjTmXmu>qOKJwChGHaU zv>#hKQoPlRTK&f;K``GaK6+ltu2es&u(z9?nr!%A6b0DjrDUg+&X0QaI;oF!%IICO zWdhS_v66R0x*xaM6@GL&ov#7agBg;Xte-1@chU4BC0{8#W3QGWHrKesHyTMKQ0c{N z|6JDHm8o^1I-KuoZ~qU9q9wB0a`o-Wq)7{lXO=PnAU~SVwUTCT{}UaNz{r#h|y#1??S^l-*U9(D)(J zMl=1*#1%C+gcFn&-G>nG)sI$8$&;K}O|Mf5y;7k#P?nQVg)Desnf3_iqUX)35HdZX zjX{8lB5atdB5_P1Zs+VOZm=PoZ&_FPdUIn{Vzt2v(UYLw#sazX%*~m>Z2Bw{(h$Z| z{djCVi^vhgG0brpMOeuH7?_`Nbt!JWP@Ga$4;$j`tMVYbt4V3)y>!0mRRMq9kwmX26h6j?4@5D1V%IEtUo^m)M_tK=HKeRnXceua&TF-Hse)N2H?s z>sH-{@HrMki$E`2Ri?!W>Yj!((dCYHDd>&-CeR|xw7ke2ys3$MDh!?NFHb0 zf@Qce5U+`RBara}b&;^?Zw_8L%=~LifjYceeTV%m6%pmRPGedMrZq$^F!C79Ez9Cv z8l_mRh>V=3rV(QPOQPs^G`dU5MP{`=VzET`fGk7)B~eOZ^|^lmB#P`{9$2F_*^_x# zSmKe#(oLi!UTq%fxi9Dg^W_5WTwRToft|YrkdTZ%;&>YCS%2)J(g10M09t=?c%|YD9W3#&7oZ-l zl-%)5`A(VOepb3P#AasV>H=EhqO<){YS{-NHeJo!w@3{15Clw=sOfHqF8yhL3{49J zk)XG>;Wdz1{jDf8qH}8qWB0_8CW6#I41HBO&oxL(=k9>^94)YBDhzjCm$JwHYobh6 zxliqK&93#l1$T{LtCc?%J+eTpafd^L?A#!7bOaPcGZFG47LLj6`o4$C0btJzvAO3AI)sqJw{3u^UMXSr{g3}*cZYn#g6HLOD|YDD)w35XL$&yQ(7LFo9a z4=O7aaTr@Wb)^9)iqgL*3YpG-P!y*I9VD&Ys&0DmN2Qmn*J8`Y>wQeTv>Z!yCN{i{ zsyEyZIX%YUO=CYb%tEds4a;ZA%qk_?P!T7~^U4F&oeC}Qh_a9S<37InMBo){)tA;* z$cEw+in&aA4L*fHQq})8QOHktWx0iiLuIZ@3cYG2S#=T$uYlW#KEsYQyAbk{M2w)= zL$JWsXpx}*OCuYzMEA+UXMM1Z3@btIOu?|5VQO`?dFTAMyKqm}Yr zx2bcLm1vDxB&iC@P#+iAtbZ>A%oh?EL_(DnEi}B7op^1W^RI~#h_QrM4<)d4^yosS zln2F%M9c#8_FhiC{%tEMSKbDvzS&^8{;{uha=B)i;<~oM3*+^iS39~ILRqFzo%(5% z>9~-g#FCjK>iMi(?r!I^r{VTPeuzs(Eg3j|B5JID68N76;aq+T}L&nm6&vM#0Pe3c=XKH0tfUy0aF6z^D%VHZu z;sI3?Exq+`5To?_f}u^7fpQNkn_bk=>L=-OYA&ts)Sv1CS{1n$RNrV%i$M88UVg{C zE-IPvmPEdAdgnX;1_hqI%~62lK7V?1`k)W;6c>CD?Yv_j%V+IDlk#lXQ-|Pin5{*) z{a#bZv+hPbm{08|lea%^XWdiuCRSp$Hg_o8e#7keZO=)%d%WQA%T9cmEl1Go*tYdp zlkaX0Jg-)+D8eIUa5$+GF;zS&^!_xLlF2+dK)W36SWsy9>#vAX%(bs6?8d{ zBKFUk+$#mDPjQTS8$)Mz$jWz*Bij5W3myU^>Q~}XXoz(gXrGOem{*GIW?qWRiVtE^ z{W4z$T3_Bo3JMUBAE_1`h8fui_P+#YQ90F5>sE0erao(e$%cl-Pip-nA@WT2^!?f5b}~enKh|!B%cAFg&U7lJ zz+790UQ6s5O>F`W{QglT#RDrdDENLEhutTy@BfRhzlv%z?Ak`{mIB2oQrz7wxVuZC zxEFUQ?v&zg#ob+lySo%Z2<}qc3C`mEpXdF)f9tAPHP7=n{d$g=X{_GG zK0UvJRM#2FW2ewV#o<(57L4J`WuucPbtuLroav# zcGp!V*%mb8cobOqObh5%kM33&69jV6gL~5npKFs&l)J6uj$OM=PhA88YZAvi>edkT z^YvD$;beUW#RUrRGQMz#jrUg5~59#>A0g>*KS*={Zy5sThzyeF9 zvONvk#A2b#IpM$mG!QE*^sx#VT50N_0~q83KXxX#iPg-ndy-)r?UWR!KG|XtoV8^4 zIThT`{WE*2Xw*3B9AT1yW|%3u*2U{4T%OPJ=*)1jM)DQkNH|4` z;wqnyegEAa-?o>Eem7CZejnL+H^pm|+8eL#_c$p}L(rCO4PBqsG<=eA#x};G4->$5 z69rYGC*iG3WfO@}y^TUueIe2Hz0+)I#eMPDR%%Tj$C32FbdEmONc2MncGj(&3_7Kz zd32C4Be5U1d73Tz_=bTbVWFq>DNP##&U*b}Vobwvm4S=H?)olJZLd?u=V{j#FzyDT zA0yvsl703P>Ns9S=;A%sco^)O_0lzPIUfR+soEwUeQ%;ki0#c#HxaC5VQv@Ud7Yax zOfJ~lwA*a;UoCuGn@(P8qcK+n=XO_9@JvmarHT}0ikQN`5k*~)`#j>6SA5@Tj%!sn?B>ilZ699*EOp=fCZ-!2Gy+vXwG9;_ zj?q?M9R!3bueQM-PnK>fAlNnCq%0tv=l zbtKNa(8gRGWL_))tl$p4n?mNR#+2gJt8tT1)2c+!Lmz%8b$Q zulcmZthReqLmfGqUGj(MP;E>k||?v#?+SA+n*d0XShgB z_)S1*70-ZyPluJb$jCtB@$@bqW9d~+FVtW2|AHvG{})8z*OE&yuaS$Z$W0Di;leY0 zPa4OhMxz7;Oxxui<63`L*yfgfeyG3q;6g6GT&V9_IMn$YtHjdqV%{Cy^|KXRC#z!jE-(Zy(VY~DK;EW4{XZ;=f zlr3z0U;6L9<(a)dHu6^q9CvUGjWb+z8)W1yq_=C;j!jaTfGTzO{ohAjb)GM-o;C)> zJZu56zLqylU47p4FCH^NT14-6uCPux`G?Ik9w9MYVriy^-lHd(7UHd2YCI=ML$D|#Mr*D}$15f{gZX#bD?tSNY$Z_dkFJM}=A4OrYCQe;N<3P4fF@|R1#^PZbk_vZMPIWt(u6+6$KBdUk;93`?Ox8=#|dFg^Sai;Ue>C z6(gaq_3>dlh{?@Kh>`YE7=>}&^5cX|Mp>$cB$~3%LVl880|IL<-ynNcH}!#Z>? z%MxGo6UWAR8z!?niEX7ml~!Qz*Z>)3R*Vn_Hjn?;L^&2~T&RF;2z}Q=1U{Y>e?L_STbhc?}Ps4Z5(|4 z6)^i$2PqnI{6PbcTO!l(qT8x_UKIcqd#pmVY_L`OR+wV>3%B-6^Pt!u*#TnVJ#%L- z9+#!m(F-Q9O*HT@BLjJEuvBa6#aGVN6xP!ihz>5bk}AbquV*z$Lpy8SbbVCI)_?9a z$KLQ2TJFZMl{Hfd#}4+$ec$-f^c;%t{zWll&D??%dzF8<4*1M?c+O?qwBM07YueCb zgt{J`?&iN#+%XYmRipr)$KFp`0$WTCU2UxXGOv^h2-F77 z{$!rkX2DDyL!qCWltiP$Fvy_#{9CG3>+w@#P^b; z>T4iKa9WN6!1e^x;!pB*(z0Ts7ii~6Af{O@x9j^`Q&KdnV4KRXQtG$Ql#g#|V{w1H@UsP5YspolCB6G;-loBFf8J_I z%NoPl!$;%2kHt<@03xX~rvImzEU$&{-iMLQS&;u>QAAM9htlZ< z7R&&m2FqNtj$Z#^QKTg1JI5oH1&+d}do-V8B}@K-8`jx&>{r_ej%2HlW`EU2SeV~J z22|841`eR?)?h_}qmDVarFU(?Jo|!cOY~qeZ2tJEMyy!>YxZFda8%p*Fg%B{-_2Kv z#;3w)u@JAdu5=_(TVhEo98mzIn72SRQE5AXn6AiECI45*M2W%nQBmPNkAo;()Ad=u zlkFdo5q726@RIfrWFJ-m&h0M1wNNut^DW^23q?`<(@Ib z0_+SvkvNQR=y@jn@av+(bHQf!KMirNL6%bTeVnSu8erLc#QQ%e3hsYU6heeQg5UpR zqBQ-FiGtde|F!pQNN8vrm-I>8&?7sY- z){LlYR57>jTcUcLodT(U%t+nGvywXL#4NlibhW(-p(QS}?$qX3*i!S7?-sC4R&+ zm&>w2e>XOV66yQIG87Cr_P{{$goJz?>bx+n`niT}?UicKq?S_;IEBn-rewaV$$B*3 z>I6CRCYRM7zsMM3Rxdo)TyYL*P-{f}kB5@>Uk_z@e>o_5D(2loF;Dqm)J&7yO~(&g zM?*X{%@{qs4{j=7x&426D2w=?++5O6nt^2~iydtQ3`hUrP-tsOtLZ!1E6M?$4}-L) zTU9*Sb{&mA%9~8$@1o{xiu;0&-{BW^PNPiwB^T}z|9$J-+jkBH&}{1~O=8`rlUzl# zACt9HPem*@jE-t)2Q>O;f|C}-kMeB!9}NZhT|)^0REB`4exNC2zC|s+%Uhh`&a&z$lCMljHTT?WEBD# zoF@V`J9x2&6bE(cu(WXTo2YD(E*nm7trK>vSF2hd&B=AaKWxQg8VQx?tlqDRQ}{fs zS75Sq-0m{-_7r@sH~1CHu8ZxF4`LNu0kQ3K&sBnj3shFRemga3&A8Ljdt7{Lb;l)a zpiX&ovKkioQ=HFZ9}P3I3!53X)-|=t;SD!9YcqgHeU->67sXLy-3dNkop8Ake^XhU z*WhAaCV| z6spxq9^W*!N{}1`S&#QU6yA`~O+%LI7)9?02(TtqaMBQ55rhQKrgYJ;|8QeY>B!9P zn-V!Zql-x`8ScU_pAtl3=6d5=_7nDJ>dUZ=(eW~+r_3?O|6=6+A`Rs9XT&fxu${Y@ z&WvcYWEo>y$_3}x46L9r`HnkcWdGC0k~C&H5i0MZ$!8il=9e&4M$|BbfJkDv|4K-nB z&3qR`7vm_BYti<)tjj2#eioBs6)i$&zabHA4L>c`y-Z`>1CF_@bzkQWQ{0zBWA$oh zH*ZjVqU}9$q8To7?Y+SQjHfLe>wXs1X%3bbBpsK%%#?;305oTfVJtU4%0|w0n#;o6 z>!M|6xz50b786e3kwzc3>0u5(l2&+ACBw4**D1zh^Gcx`T|1jA{xQX-78%MNKTV!5 z`u`D8FwC16Gzr`4j?CVJcBZ@@)#m?hDk&4+XR$<6sSBbkh!efS<7RiYeE69!Qo6mh zY|;ZM?<5K&=YL2P-2aj&{>jNGP$R74D3=w%L1h z(%Blc1k=>{8kxWkPj3HzB+4CkZ?r;O$#&Jt^z`@m?8>>>EItJ~$G?S|Ne~mA6u+h7 z+2o)N`H`E>+Rq9KJ4Z-k0Eqg50%573=6T<{D#-WBZN;pluf23ajd}5RdsxAic^|%dx+9_%uJXFSdbz6al~ry~-9$~ULE0?I$BNxa zE5p_>|KY4UTefUncZM%2R-2M{JDH`*@0QXFF3Zrl*ko7fP^NwQ6bgzUdP=YG5T74;sDI#vC8)f zReKd&W6^Z3u`Jel0K;*fwJQIxTQECAJfAp2;i-@cI3!@WL~}=Pyn@)Q2eiI|v%)K@0CG?JLKQ3g@0f1y>yL4pxP&c8a7t*I%Z); zQNi1Djdu+Y507Sp<)*pIGXoqK90VmJEE&`pn&Ve|cYe_01F`}gi_(|()neE8kx#kI z3RtOeM8U&LF~?*PNb}u--4d|-rtM1O`|h($EVtOB80gr}p-5Im;C9tI^kcmjFqI;; zGM1V?G61#DY)vdgjSOzy^xj<*A6%GH5t4CKNpZh1p4UC!t|clciy<%M`udr(KSCvMaxn$Y&YE=mg)>uX%Kz_B%z zH5ArgBp2p(H4DQs)Y51ja4u`X$cAkJSeY9ArGtvcc3etI(GTVj`ZG^`Q+be!k&p?( zUy{py{rKzX|K6SmqVGwx)3hL(|dOa)i?1d4RzA9PaKrtpzAy*MXBg9FJWl*+&= z>k))hoA+D1$$sK;yiXXK1Dxb`nd5zewxrY)zoJyd#nl0vktV4xbCPp@8xvkv{8=wq$GCHx4s)8Pgfv)WFk2<-cU0lwtn50;UYj z%%8aN;zj)>A#}@FWT!Oxx&kcOpCqFiBI30^x!3HIr09dh`xgiTpMgG~P1UfKxUT5l zEwkmEnePY>hvJw_D~MiWp5T6cH=S^!m`?&Y^leHM}<3^VT)<1mWPTZGAo<} ztN)Qmv!TWchsdi*yoQkj^ps{8$nb2~;iMAp?%aV3%>Ykbc53!o>vHsnVq9tz3Px!p z7V>d-A-@&PTk_NkyGccf4=rC!2 ztHYy?H?HRlYqTji1QF88{u`BIms+h1iIA>F370kz7NQbo_9c+!sIUoDCHxsvL_r=* zH6%{gq=rYUJV-hhme8O*^ot zP;pwlHuv|Iv=ZV0>|>fRb)XH5*xd5Z$g;!D8#?K_9H!+8JFc)Gtlu_98FYhV&e37X6pxSoG?Aj$|M$0!KZr zQP=7ZnYI#sOa;D_4Le0)oke6BGiq=7+8H%I;{LloLr`-7#;QOE^@lJn3Erqd|wmOVP2-Nzd zwW*5>Lo?Jp7^27jdzpfIvN4no>vyDT{6i{uOc!81tUdi8m7Mmclpzg_GTDS@+79N7 z0+_R_@@%C@E2A-0$n~y9Hzl$o+M;3+d#&Q3hlWa5^HACQCPpufBaB8;r&%_$ zmBP)(AUQZZS_TFV{f(K6Ob;)c)K&`n%s*pQFI&tcT|@ym7h<9*Aeo)BD^Zk^0N3FZ zgjtdE;P!fVN*748)3C=L&c@mp^4NZ}u;GezEm!(P{+*oywBU-_t`wF%CN@Vxg)p_? z_ysI3O*P&Wjo7A3#iwUW@XM7y)e%7xS&Epk=_zrDGoHhu3N?c`xkt-{p#mFA@(Yvn z5mJ*f29{UG@HbFF=%zYoFj3GYQ{#w!^si+VNeW_LFyPUA8ZT|=&+5g<_2!L`9u7l4 zI4SX!i1W)*WC(c~$hOb_bxIn|(4Uy%_)qCgObVDfQn0Q}(!pa~gf`p!wzpW7(|Z0| zxNI|b%3`$ie=>GOs*jsd>qu^GhC)7d##(4%;L$BBA$*?X&-h@;fHN!$hM|9*3`r!1 z|Ei=sFP%4;986Xpye7nJL%HOiEUGG%S5z<=smh2b#}tJ~W=1YK^+%V6P8ju5iHR5z zN;xAl+;JCpyLH;s#?6rP0lm zTDy_gWT1WFim3pmk`G}fELv3gQ^M8Fr_GxDM$lEvCIXfWBmmPWfflv`ibd51#?rTm zIMcAq!xiQB{83{umUiW3VSE?RacoeY2@*-*P_!U*6kIw?OCy!M{4A&Zj!6~K_-Q=P zewj4vl46WiMhPrUEkh{T&@VRK8Bh|3|LSZBPli%butn{+9^0bNHtgud@itc0hD?0v zp2N$7_8hcR|5Eddt)`jk@nC7+?S;ARRb`fVhW;jE@vC&(E)%gnfZEe(6$*bL!1Mvw zNh%}sQnfdVVlSlf(f%o=FeCXW(Ph*`{Nq*J3$uQo+wiMmRJ&j0{9FeL)3BA*0u#vV zF0FzfayI7+&YfK{z116A^S6?7)hgo+vJe6W!fRGCY3{a+m@(oWMdHISU3 zHve$uQMd}z=)>d`D&w0QJi5=&fM4^`=cu{@Vu8#pxGut!a%3BL;v?Vb@YxSDR&Kq$Lz3UcY_Y88 z5@8a;hk}2@R;GXOVRz$Vja|=bH2kA-3k893TE|#l1!(6(e^F$s_naD8)+c0n% z7)2uJ{P`n_6v)r3Wg?xLyKs9mA%aw@sX-pOK&k;>SFnYxDThGGXbu0Po-=>YWcn<} zCDT0OHr*O7p1i-hS=CbJozt4RiwZoi>hF-zDE6>8kP+n({YHk*o61g@M)Ve z%kJn8{i!i>8+`57rm3&xtNobDSyF4@tVp=JMqwH&oPoEHnsRl;^x~TiI>47VzT$jS zF0MOn@oiUT>5nl)_^P^TvTY`bMKa{!n^`33Cz||84q1j%YWDp5Y#5sr<1DkGi62!_ z*{J-Nt3b6a>6qid((QBkkL2qX9H`+HA3w;lBbiR)+d>-4B-smx(%8H3A~7^gCmQcC zsLBhNmEw`K=fQtF3A|dd0Tv}T1;&a)uwq=g{DL2={jcDE_ym8>`dy&@8~!Cou{g#X z2Vg+8+%hQZ@D$m=_tix$lx}#MiSN|IiUOAl0q(Jz1QmlWKz|3s{Lz|$w}YjJ5yr%s z-K_twiD<9d7r!33gatTSv^qJWfFI;$uXXSXpb5eY z#sNIq)7eLepte_|yc#9q>t6pg-0M)+;AC5A)1qj~;QNJ(>_kmpVnVMuDfqX(SSh=@ z!c5+iomTADq5yB`H&vFct^tKE|C~@!Sx02EJkRX{X>lIY{u!te?;B@v3b%*NjusS{ywBVup?kvWEx0a*i11)(f8Y>Q23jWIYYz9=NApE^pq zfItJ;?V<;oCa$bp5nz?Ug@g2d?3IDu#el6(CJ3# zw_=oLHr9!i$!Z|g>5d`Us49X5cSls;+V(MUs(ZrmIF1D3E%q6@rgI6k*~N^*O``K> zC+EwO^9!5nFpK`BX2eTMGgDD9?2DIc4^Y8G8{r^`?}GSNE^ZnoVO7-2EvDTfFqAPw z?w+n|-?({rpn?y0sBbTjp@j4)0fKZl>h@FRMzfx&NP%) z4MJ_a4Wn1c;ii|>RW9UnRM#5M;=S9$--kzF6QoD?(8&MA_4@f1($4A@8|AoZ<*Vzj z&9AF3BKY`n3%Xv17-cf1+WPqJs=nGgTtXhU{R8%F*-J-S6GwU`e&fj0`8dJ(jdxr( zT~`7-{4Echpttum0c{@PTC}cp9?q@a0)o27IVU}C{FOcpkPU+@0qqWaPu%u{bCuE- zkDxv9(B-wNp&&EUAjni#nPj7#l`=!$)$Y*y;ppYg*)nb+hqiD61WG=*?MjU*1Ovf4 z#mZ0<(`k|voE#C79qTQVIcRb;iHLsI#uKGX?K{duo4qnU^1JMugk)>tSd3xg1`Vnb zmT6bZn(OJ>(eCQi)(C6{x(d>U4aA+j8upt)w-4uvEf4DN1a4ds&gC8=vn#@qBu4gbB53z7H{0gx-q)QSKZUec1Q&S)g);+&`~*k^ zS%i9K*H;bRj?ABqT%ecFr``uAmv^Q+W`uFO4FO-XlctCET6vbeecyQT&PmU@?K=6A za*eu9wui=^O`)#WKTV&ux@visz#}tl*E?OAF_|xr%Ihsl4$-%IpH|NGk?Goj%d6+d zEA#Vez!A}U+_Z)v)Q-cD;AHJ#_TYIc>CROtr+sB5%!k*X-=Ap4Pk7Cd#6c+qzVP-^ z_3dAKfCxW6$!;HbXJD>xZWID7zMh?(UZ0(lVac}3B8g6oEf0Vu)-_)>Wacu)HDea8 zk8SOMRv-E;tL~(``bHi>@CL>n54X4b&#NjUEdm2kQ!}@e)AntvXLdELM$gKIFoXt% zt2cLO!X#Q}Ev%tkPuE*oxbV;pRu>mQfyS6)AJOL0?k zNoz@4yytavn2w!1`3{HHYFmtuecJrn+gci*y4!s&>3yJ|Ek}adCXQd4P>HJ7h3$p> zs|NgLrUP<~9CLh$vU61032_S{$BPoAh5=wy+_Q5-+_n{?wKkH$Q>`!`;&a#Gr$QHj z*MCMc_PuuxIAeFWPOAKcYt`3Hm&+p~6Njgp(D8_vv$*;I0qy1CzTVKJ^^5&xD6F8j z_BeI!Ab7}4ru%N>_U!c(JaN4G`fTj)_h#pFerCUz{-?|LWr!$b$k+89a;iWzakGESok{^P<;x?+p=cu)k~o|# zGt+=_$FTW_lktP2qg7+qPQI*`u;b(h$k10_&woNy=pwN@4y}64{|=tPuTMMmeUG%s zH6pcd!g%Mma4BcLMR7gu){RezNjI14_ikq<4=;z%C`ET%Gzc^f*PYwvv-dNfPN%MS zyWz+g$mz**&-CY&>!+P-a8%P;He{Wv$56lLZvSVPNEj4%hPG73$Mt#`;*x#OZ`@w^ z(qwe4K-!YjGPVr1e{*~CY<+I%S@7!;_}BeR(k|Ln<#ic*`6N{wCp8Kzk*+H*P3(fYtFamSMA2c z&ndgzP5iZ0Z~FRQhc4{GXqE_1Is;xjde}rVR)hrugmpZ32D&;9F8dF}0`i|)0~(u_ z*9K0n6YNKi9XkwKkD!k3M>=K)P=gi`f00fSVP=+Uvh-JefsGYIVw6Y0uz{e#osKXt zP`mr(BKh@c0_@ZspmGg;YBA-TdkC7!E`iNr*9)>1 znc64z7EU#w{|92CY_?m?)B{Ic75;(jrs9p|kr?2V(%Dsz1CgSp1N!4wI(oeqP+>7~7$_3GQbe_Sn! zD(yU2EBb+|j>mt7*Y+|O4RwtcJ6q4sV*Z)ELe5@i=bpFq?RxB80}P-v*-<|a>X`nW zmU#SJjq95_+d79#f#ZaUy6oL|?0kD!36Vdet30*Pr|K;&`7GWG<|nNWtuK%4yyBxB zpoP`a`t+P$yZ`WIOj;M!YS%V3EYz3ihBF@Co+N>dA6^Gmv5c+gf4vM!`F=5e(ZXGi z%d%Kx&#OWibwPbJ(lh2$TM0P9*;Hdtzu8Q;5Op~FGIC6u+NwjMOU8pI)oUoFRC#3b zvuNGv#%)4+{}`lT>9OTy(ALoi@QsJWJj0rGPoT@=p;U5;yNwj4=0teOgp<1%jM%MS zL|JgklD7S^({1Al8!)|ny&Wi{(3%hZyrb^WUNFW;R3_xxJ;&`pvy)?J*WQ(sq?}|G z_i2{2#ul+Fo9>Z)RnGB=sQc{blgIP$ptliI20eWu?|y}bPo(Y-}5Z$P~Su178|B`{yMC#O2?-inrEnMTsT?w5YSXKTeEBUf;<9duJ5P6tFSmYv50b(j#$ zzXVz7!XPNGx6&#_=U=U9m0aL)gg;zNL#6X~+P>fafPik$%AFlV^ZIsU=aSOl@-t~j zbS*sDumk^aKqJCA;XFUogRu3AXGPW6ms6&83a#ajJkE;gmJm5Y1`UHxfwB3U%{9?xYH zd(P6vo21foUWw%LXq;V}$0h;tSfl*a>{8@d7XqE_*t z#_8s`8AlA5?Q>MuT%$cRj=|^Jr@Ig*xcE{4+}f{RXkj`Jyjc8F?%e_wv)fnhpWjh$ zBw_YV(6hLf6?R{;5ZL1MC?l3^G~L-5+W^luMA-2WuW`p^yPX z-y1kE(mpE1&J+1WacRDFlkj|0Z(QWh+D*OHxx)roRax-}|7fYJNQ8 zH{Zw39Q3V2{A`|KSl9>s+|HVF6<^IIQXDAf_AJ0-t1?O}&NC;*WqLn{buDBJx@)qw zWS<;^mGpSN&#(F6SsZ$K7p~Vo(;0O^&cif}xawFK$us)i?o*0GT}7znw7Ow-zIcKKsN8 zE$R|w)mIe0D@#>Lz@-T11J@OAyP)?oa)y8M?n;5$kuyJfTb`IZ)#o`|N8c>v`Usx% zRI#y#6Zv=e$E##b$Z~d55JkgGPPEe4MazKuzPXk}(LZEmC3tbMNk~ToNri{**#Ud1 zgu-GO1@5T{<M4ue~!SFEcV9-9CUO=dq5TtzE)jOH2GDEG|N2*P=(mB+B?furOfc zpeEg&7*t4H{wq@UT*?VQf;jc!R54_1(j)BpCJW!`isV=GOsJ@D*@KS~jQKtarsU!U z(0%&|GgwW847@)L&}imNy((-=B#{-fq;E%Y_Vlk)o^9QyN9!U%tQ10bzkVr7{5{vGxH%2r~(TL zc<<`nWD^kK{L{|oRjQ6+N~Ni+`t?P!q3=reat;OwzrkO+TY22%y_fRTkonbeuai@1ul#q} zwWM7WgX@Wx@#|h-MXPEg;%C+*yF{c25>)bjw$%jS-K-gSTto^4P;rNQm=2K8gk=f< zyqE^$$ASBw2mj_}_R#qPWKsTwXQ(*y=k3M%1Ng2P3jDS_ZDEl{({tMH{^&}`k(SGY zu!ss>tgG}xru~i1{^cNk7c7T349{=FkkNH=ytKeDw2_F&(h<&7i&Ex}JIEF+Dz zRt;a;S7Ht?bB7VLGbl9{Eg@mXOia2pzvqZ?wtr!EE-e7zT_yE-=2KyYRconD?>77U z)Pr-%2q)JphrSeS(M5(uW16rqJ$^-P{etr77K!l_?&43!FC{Av?ZGXD@S6!&pSuD6 zfwnXUUfAhgN9d;rMGa!JRk=}Dm2{)HIVZCtr4=Q9ctg$&a*FehXt<*2Er3cej2P5w zWUpqPqfFO_Q69JRy|nE%Zy7h=LJB}6Z9+FbI;Je;V|Z?k&DzSp*o${w7NWkX5US?G zVZmML_vdu(=T4l1wb6t+Z+yu<`p&xgM%8Cq-jxO%;j4wZ)*yBy34nNU^(ZXvsdC!_ z{-#=TX|PseIf1F!Jhzpr_tyfab%7_ofI?U;9^1Or4+lz6db$;@#!!SvRQGi-Yv7OS z*KaVi3DURl6xI>~pXGix#t>0aZz-Or!`c@O(J#nj7=G?xw?HlgqGCP)SrUyxh_iKOh(YxjOuaR+PBTvP>m8s~OxXwqI= z_zt0LY<*I_y&{eplnyzSxr5s@$qJ~i{*FL7B}i=0Jn0kHCM2mq_Z5NFAx%f*dk{iQ z!s-%Q<3cJ2pI;~q=4dyg+UOUaBY5nEkM9J{(ZQ@zkBFeyUe9Jy<42e^H#rk1!!q3f zK;(BbRn*Wef?$JQi2Ri@ictpnXNzGKbAN&zmYPp>roaK3kZeaQ1p4B|6r3hll{Fvi3wpWOB`9pdjNk1TsaJV1;jQEmOgmO$;<~c5p(nej|<66Ts>Cr>ujQP z)_2oL5(H#Pck z#dx3fgqg_aDu}b!q^eY>Y>xfk^-XHV6Na3*#YvZ!zwr zqwMi)Sl$Kw%ad34!m<7QXI;z_(_8sbk!VAS57DtrZ7YL5KHN;6j+~$&x}+)CbD~UQ zBj-(uPnnK4eiOc9Kx5b+Po|nkgcqBitcj2f57QUxx_U*o2_OLS(NG70(?c)(hOuz- zoaB4KVI$kJ1eV>za-;B=ll7}L_^VIj`#z!<6%|UmMcC@d5&PzBy$$+#tvsxQ3r{nw zP~jsrxSk7E0{Cdjw9V1`pyW(CStM0Ra@@jN@*Jfm;oUbqi7G~=80@yx`rZx7lOl*L zlLEH}8;g*C%6!MCVw*Ecv~m;_d7BdoLEY_$RwpvbJ)~4PL~Fo<^!Pgv3Bf+!$AgEDXtpG;WUHso56W_E^I8CF#q9j! z@o)do=tnA!h+0o({dF;s1gd2=I8+o|5JdFaW?0eV`6?$?$fO)FCL zSz6x{<21aAO;k>`vdvVvWap$T7=yn*S70}+jy&YC?t>+7rHARu0EEqUZ3UJ%-tC;) z9YYw)uQVEQ!cutX(@fQkC#mT^=()k;tKlSIq34h zLTuj6;-AhHD^ELG20yxF{o5Lr0y2c$w1e0<0z@Q4WOuSGI&en{6FQxPdiq*Q^g4ax2Dl{{zjh~$i8`?-wrcAm=jWU}Ierr5_1SZF48FT@iU0GKOxnz8 z)R5AX>_1O_QX&kb{Qem8YG6Uzk`ymZnPT*Jmeu2|ToIVR9o7X8XG|&sX%H&IlUTNw zZH8@+?hI%uB}qC^?$I=DVNWA!uIK_eZ!t$P!%0vXCoXyX$q^VK?$l8#k3)uCN&Mxy z-I!GVfWT$w!;#p@XiZIF7Po1XQn8+JT|QL;;>APsuWfaTleWAvg^V(^$@}zBQ4nFG zUX&Y|OWH`=jC3xL=DgH_XVZ>^`q9U=xU=Uak=rjvA4$V65d{BT?_tofdrzikONS2- zL@}u;kKteVFH@$!)_kcP$di-*YC4&4GpZ@_4`jpyt?~#p|3&qgk;IvePer0# z9eQ9|{$jwoi+fVC6J0JjD@aH~*gGdwE&V0l5KGZUr<5`M{}OI;Ncj1(RQk6_&{{0}MFhl~dC8R_ z05W^fJ|*6SV9rXN;OMizck!%>t13G)SkUlcUG&ioFhyDy5&o}hYYSBAxTv~i0IS=s=3$QgDf;q~ zbehjs_7pj#gqMKN?>lnnfOWK8POd6zaxp>{BT_?ollz_IpJb+Y>1 zb=@Jg%`%BGBoEXs;X78;|E8_!t<=g)A=UhQOPeV@4VKaB-quA%k0VH8>p^tu-@W6j z-ECNZMRmRIow3dj%7hKFi$iG~uAxiC46aQ@bBjw0l(maTHXsniNaraAO7I zK(%>5*7G5*xEQn@J;UA%6oTS{(&U)tX6)lRSL#Vwa+{qSWcRSBK#!I=#L4Rv^lZ{c z#=|P&?C{|*QUXS7$RInAW^3+Vi)e;H)0~2!rSZU#dwo(s?-F}PlIMiuDW{a|5&KBU zbiz}GkA6|&et^vQUW$35yBjn;w&_BsVm*eGuJJ;CprMUL${v#!bn!cKx2p}E^*O_M zTc0y}h@0spmx=5x6IZlH`RFtE)2A*$=ls~aRWXC%a6$KQ+RK{|`3&?a1B5uIl33Jm zo&H?m;uA~OaZeeNAQtq?wCp#S9ULp&T=R#j)_R_x@$Mrnj{fMKCADVM09@7rJ!YL@ z+p~1m4&fgzzQr?47Jx7L%vvfRzc=`42G*ymCNl>?$VJq=8Wfg3Gt0YLV0Rk_Au{J| zCwZ1I_5Sp(3VkPa^M}PmiPT;E=`>L}2|t07*c$zetbrv!192Ef}3I zwddaasB4=QBD|i;w5}sphHLz@?DbJqFgYe(WZ&9yfO>1u!9MmV73DOqtv)&1Qt-VB}@j5(vEQ%7yF`4?UI3 zK&@6Z;_8fD{5^fR%?j-p2W!*mmHbU*3!d|0r~OsN72R(z_Tr21MR8iB{`m@`z1k#4=gyx)W;Y?E>#YT6s!h`h384Z*gSciJ|y+J$Nc~B?qdOL~TaO3X~h0Uj;2W4ol9y zE$Nr-?xoDKsyjdrH5Tx?EC=&R>TZ>+c} zz2U5gH1o=T5+vu^cVy5}fWj%(B|AbG`~R!FjUUiaQ_2(sL4}7Fy>mLs2SXk=zeDEt zGQ%V`3RZZSc5Gvp^Kas>%?s`2NyR6FEV9EgDH{j|n^ggbPA9kQ1y8#@nXz?sJ9O_oFK2Ndjo zN$5yhB95>2Joc|UWh-1`UydzsC+l=gZr^BYdu?wzwNi|esy(+83fw*kNl zrUt{8Cc{>b-f6?ZBi4=XlB;GPGktcLbA8FUF9qPhZ~tt>8t>yfsC)%mjY%=vE#GVY zryfIj~BTba8ezt)nj2ZXF%`~1ClkqkPpqDT7?4jR+$5!eeS zvoSI(N9v9F0LFiN6n3TeZHBu$e!}C~tT|!?pY?9EOJQN)=o3Ld`iPpZ3z<^n&4O3a zq1xTeG#6hxToXl{2@xQ?;6K3}CTaZHyz5#fjQoA?_gX{r_4bx%c723SucDnG4^!CZ zwLI)(#>v;gk%Tw`LfZ~*A@v3zW2orj@x!crQI8Qr0y>W@xE4ao#@^n8M^bWaF7dyE zV3N|XvGR2Qc&4gzR$I}>Okq{9+_i>Z7)SFwv;=W8FBBG+^{s=Pd0 z=;T86!5NAmk~({BurEgFZ%Z;KilSHAO?`0b7M-TUeH84rW-dV2I!s<)%?8Ha3OH7N z$~vJtNkS^FBE$L(;%IJzW_-lVV`bRN5dsW{e2i;Ri{FO~whMMS7*U7k?mjV08f=e#ik z-g4e!CeUs8Q|?sSrt%)?<0D<+hB%VXKH)b6q=X}LvyHXhHNK9Q@jFyuoKi1%>GU;y z%N%z+hnjU|J7EUYo~#u%hAGp~p?Yz8M0_qivALL28wK{WEcwqm?#nLn=n0vY!(yt2q5E^ibb+4`uC@X@PZ&~U4ayDaY@-l?iAFisrhUaaK zjCdvI%@?mP!F*NCy<^=Y$m7lZ#l{#AGv6~HkL+=Fx`!HN-0W6ab05+J&mBuxsQUMn zhKGNXA)e<#=FMp3ukUU!3F*%&Wox`YorXRs()4#GFo+qv^Utedh-3e>MI0r(FU@!F= zao&=p6E5-sF%DJq1gDc`Qi^LcFANrP@HJk{%3JWA+i5jY_cL&yke)gZEbo$E|u3 zpT^|U8Hg1whf*Yi z`?^jJDGfzH&;4!MgJO3hFwDcc03fvWL&u!dwO z0T+CZZl@k0`N5vTXXd_rQNfFN1Xu`$ST&UBm;HiaP~ApFyUo(Y2j)poiqXz@LjsBlqGv4q93w!p3dy$6qTF$yR&O>n6pyk9MF?lW@%k ztCAM>xBRcKu{;lR_HlEtKiN~3(@nz5M0&&wqmqsd@(ty85xeofq%hYyiF+S$ANj)e zSiRSIkj)c#1+Ofi(oD#2leqp}z8bxo&wPL1z6L34{=5WZaBEEx9Gq_w)<2Z-Z%^K zI79GT=CiXnRMmTmRwSA|kNJ%ajvoHz>LKY5&?+L*^FjWU0+ls&I)Q=%d8B5@uQ_~F z&n|as2^=8y53QJ$5br&6BSKiAhG0bPpY*A8nt@|h+=y^Q)j1}4HoR_x> z{KAYz2cnxz`m0ijZbXv?`xk>A6LZaW;HqS)peA-JBV05WtGD4n?Vueqe)XEK0t2zi z08hr;UTmQ1k-jk@B3il#rjrW$q0G_W=R$3cHoJ{8nT8D#{+J#g?$(Lb`05_7OIdDL z&bUxyeTY2qP0Ijgq<_i`(xl^aCwYb8gfyq_mlTBT|<$FN?Z`A72&ZF-xA5 z$oxud5Em=3!V>*CG?@kNuiAwHQ;(|N^}k1BM3-|s7<06?;3E*G)uo;upP}-*@JPB$ zNX2I2l;eErC%O90n@UZ zLUnx%{@#Hoaqqp-{*z3BA^XYaP(h^c`l_}{z#vHN_fRMjCr6I7Yq-Io2{r}^xR6tb zE8^$l2Z|aX{p@pGCVX{XbsH0$bQPt04j;E&qObH|6bB8*4PJq&uP>_vKd(1&KP{xf zFdTi0!{g$f_s(f{gXl0u=x8s-rw#9obf4-7t-D#Op1|VfH#T2Pw&; z!;fbQ0~5l;;C+{#%IMz_WmCXM@bC>m0hz}<9VJ`JsQ=!?Yg^t#ufURw9ayiN0 z&7Hh@hlY0gSkvh5x&G+@bpX|QZ2Z4%&;+7_Bw|Kb+)g^roGAoaSE>;?$@b&!epfJ(2>=qqNd zRu6mH@BYXkw&KYJpWcKYqutWjqP_vV`nM&DKtvT zZ8}govEDzB=|a449Bi@tMhcRot17zhaXaOua$|m=@XwM`xA1;{ zkb~MD&f!f!*>L9myF^4f+meRGNYv~;k;&$FY*Cw23sZkW%v`~y$5OnBf>I)bWhM$! zX!F=gw#3Z84>zFHiyC(b|K&Px`D?a~r`Hl9#Ahu1vj%_RC25kP&6)8k^FHnu#dWfg zVVS%ZAkj0Ve$SI(5&;G5&AVLk-!hZ0D5>}MF3!&%H6Hw9*-d^Z4rWO8>fAQ(h9wOX7xA76IKJX0BWvcg zVd>i@%wE!_U#}qb7O&lN>Nc^Tx=Q*F0On1et@)hEvMo#~_eWliTm`d>)B_%7ZQ?Ow zlHSgRSgC&5tLe3P72 zOWWstUvm$hUiQ{9Xmq+NnY~wL7XQm{$4;5T?mWu0hyb!o)^=wH?fVB0BQ!K_dflQz#Op*q zHCYp5FXs@^LDNKZkF3!-41BHoo5mv21!g>3wN_``k;= z{4hxV3BXmqHb$*zmj+2pHtHx=Z;6H>TnRE$dX&6H+oD65v1U)e}r7|Aj9n5 zSAo^>VpX+Nt=I{XQ$*CO`{AK!CR`tv?MwKnf!% z%KpZCyp7NIeZN>PXI8gFdFagCh%dpz_+b(%jrL{Xt)(2$F@-A&ct3#=Ea3Rj$rd6< z653ydt-^APu6E{~q$fwlop}$b*SWL@*Tt^RDr>n6_=H0i*UjF~h()abp;&l-WZ0S85tGjZ4 zqgP;q*6m>Ik;ukdzhHezO?aEd;}c>U(bLz?xdHxY1^S+JY-PRDxc%uCD6u595d(hb z@4s&g^mi`xvcX9h8v?1qO8ruU@(|&er8JCiJdH2H?Q*2WJa> zSB!k>SV^&bP1@++PPf7sd0vO3I=|7;1Pp9!(*+x?CNea=5kO|AcO4NZ#Q z)>AydsMaI1p6a5&FNAnn>L*ny_T4*~BwmMxuI%LBwb>~)|l$qP#Zoa4W*ZTM%HR5h7o{A-l%9$K%v)Uh$1vqG@ z(2>{_diWi^ejXoK!q&^LzXyizGjA3%K!0s@%&)|zhvw+;FA4Hb8RIS6lUxTo?)SWY z-+)M4m@vqmkLv>7&Ty{}gOG1semATxj9$Ot#FghhG~8;4J!Q~9kC?nJ3)ZNH3jn(2 zhC|u`V)f_!`6l2ne4czOQHQ&-o8U>9P-UT)!X3fbhLZuf$&p?zU$;Kb}LS3AaQZamzQVmg$M@OOtAtV?=5B00V@v~xHL zMP{m2;qOiH3V*#Kmgdg445ecWba^ZCZA*c0aH)RT=gV8fr%dt|ZS4l`MB|a%CJd=Q z&HX4Kh4Q~ymj(Nkay_u&nNE(5iNe#I9X*!q2>AlZ9_^3Ef0)f6Ubh5M?4byw7BS*> zkKv5D1_dl_CfcF6ow}eV(kra=Gml*koCmr&j%C~f6uGZXyPO^YsLM?wub423<{cv1 zHG+lMY*r^=R-)&bONxBertnjM`nK7y^IC0pXUCGmXrC>&xsz2M+DNbisKH*v!IxQQ zL$W)8fw}~Zb`iw}^AvMT*6IEtB%?zwO?zElQQ4>7oaw;Cs7Tms_vA*%=tp|F2FYv{ zysQZJuJnwbKiu>9O>N|PP!74{k5>m?St&@%S-F&;&Z_lRSsur4lhp+zx?RinFYam*jn+`cAc560*Q&aI$<+AP1oJ;;ET;M8DBY5!XlS;o){+c5hf4bv zbWnMUI@eBgj{qJ9AK1IzrWWvmT~j_9YCEk7se$Kf`~KP}ZCC7eFyks2MP~aoI6>J4 zKVZMa^|aEpRn*hcYpa=YH1L=7Vt&RAwx@@!1-&~WZNuc94B<5>-7{1uOZJ9%q(44B z4h1TEoiS5cd1gC(d`*ax{>N1WkdOW2YAJWu=(?_x7kk6rA#Z1bw>KL4H$EebLYGn( ztJB_bho(RW=wo|+s9{6MU(`7P5Z)RP1h*_3JXA;m*+vrLV3@*Q=G`4vPyOKKMl3tM z8CP~_ASH>!4pE(!-ZPRPGAUM*m7C_cEQf{#q)#w7e2)C2qk3}u`>>IsP8btX+H{p=y zsfG-#5zJT&mEJ(q&bpBG>Xkz_D5W-H4o!=DU!aIKW#52TKWWzOq0ZRxe4RczAj%og z$zGQ0O55~6w4VX#*Q~AXE+>MsyKQu4c5XZ(UL$+PMVCgG92+<$9d4iordZ?yU;S*i zH=nig%OKO<=-S(Jq4b77lKMos8K?|$v~m7Jn%i}hFMOCCh~O@-z?XJ3x#iT_M2N3v zcOJ0^%Fe{&>l3XQ~@V(?GsYIwLK&u$#Lj3=Z2$0nP~-BP-|E1 zd`)z|#-K-ED(Ct**fW?xveP{Za604BVrDwTV8~u1e`0!4*`emXVTP_5)}y#1l5ilM zzKxNhe%-@G{Oxt&ukwg9MI0u%I=#TKppxHF1S<5%o1@2`cJ_SDRg{bHnNNtxxnn*D z#5P~xoWIR_rYYp0q~AyS+vWb16Vh`gD6gBmx~(6G>Y9$of-G1MbwN1MC{7@q;4~5+@Nxr_pq1mC$an~ z8^Om7B&wt8b)hM8fOLO76w1Y#3ALKJc<#-+q+G?D@0L3+Rep^&9!Ig8qwQgO=-I1c z7+>KgN-+vY8RUB0{{pxHG<5Tx zG&+IM)^XTytmb5ZdEc>y?in!d_MA0@5heUC``*!KYg+crZv>Z^J@=SG4UvhzSHckfO&6jRt{rO z$=`{W{uuw7;`$;;)5_n=PmV^9VWMiL^3G=s)H+=zxp;1u2?mHAKC*Yexvx9lZR0Ghx|7w{#FkeC4Nmom1hsv4Kycwj!OSdi}9p8w6=9*5Rt7b{x zanamautpNz7aXSct?wo@dFy3eQVs9qzxG3_ikCvb?W3nGbbmTVC$~Zv-3JqxZod`K zz#|8|L4rZvhpx`90yc3wnIvD5lG=wkhUc!!fZVn^6Eu=03pAN9K`M!_nErUiqAQ>) z@KBWr?svtP(pEH)MZtR7EAqlh<$!IQ=&!hWbN4m+k2kKbIe&K(CU=_b*+O~JleL{O z^t&fu{C`+qSZv^ujz8Y`p1Xvmv5e#@`Qm8!btedf#Kzs`YN<1Sw3t{o2fThC^K70k ziW`ox1L^@1vu2uxC~LLtt^e-HT+Qba#2~w@i3E3uDF%uE;~^5d;fjs8nrts7#o2b3 z3v>y_zDBbt@RPy4U7>H3-~$$=1|_HXxZQB$@5_Csf5!w{p*F=uF0+Q?lg+E%kO-{b zZ+Do~sfEJs$o+=d09-}6fTWH7Ca+$$AEmK`eS8=swC>d6=?gP1?{%{fUEV60%bCU^6pUAM37}Z@c7L;L@D1XtbEYI!JvI-!B&Uv z8#q*-C{u9JCnsy3Gz$s-=3?+CZ9Ib5fvj`ElI+U!TgP7G9?`vZe9&j9nsFp5w+$QK`QezF<_mrhy*P@@ji2a=ws*=YDdGY6U7&`5QdB(z$gJcYO7xN1 zguXl+KW_s^?R??R-#X+@4F0AwHG;&SL%FX5GyVZ^UtNF2@ffH_Ej<nw6;jY(_TafaF__WVj|sVE;2ktvMad+-z5;BfQ05Aweo z$^^ejy=>Q3XWmO2eyU@DQmr)aP5H{xYEtYrINggds+;W3)lrb)=&~mIOANW)8# zU_^v=fF$po;tbHYkUizJ-{vlH)AvN2df+c|hGjSvEVX1qh|&=hF98wW9)0JuF^kt`2{rTHh~saTh>J^;h_~m&4Jo zY)!otYjVACnmvvG4$j1I0$Fe^;b$t?)Q zi}dX-$z(@+YM*|<0ujAm=~J#Wsv+)d!&?hz6{+--nxaK^_t)ZH(M|?~G>RD~8W> z6fz+xf?sj*#JH-M?GI#rIE<-{&MO&ISr@4)zh)+d3Gkg1b#Dgr+s4hu6f=cte?xw{ zG>}HQ3bfeVBfQDhNiJs$-O0g68a(~R0{C0YEpUfq4ke$)3h-|OcybK3m|D5o%6>Id zoCAg}#(goI4$VZ&MrYcax6qCaBClh5XB&ig>tSXT_1|&nWWJdJfTltt!*^UB#B_mP z9sY3&*gma;{7mPn{(~Z^Z1P0;Ez$TC+DI5{?aGFUDXx$x4shUwN7MY8%RE_k%i`IbeU$Y!U&A0J4 z`US`B>wS`&9YixNRXAaP7@&{bW?+2kMQG{1@HbXxBTG-8%#_p~>~?j567t2zfEJ)w z@e?9xb-^NxtTyG}mGM))nq)p1>Qw{Kfe~g%2SH4d;jjG>w`V}NtI%q=)lsuY}h zHE9CL83VOim++;d-NVCZ{)#Ivq7|XP^H1`fVfT8obpl4FWLGwTa?DiF{668bO|^hd z#$BRhFeO4XPp!+-GD!P?7JnbjmAfmAiQ?$6DNdD6xqpTN53(Kw&KnCeEd0n9cA zAoj@5ZsAgcVzT^cchRTFg89iYA4GN*OHbx03fj^|5nmXE;=5vSmKqtX^{9iKLo$Z- zMLhtgpNzS8fyAAY0wFD|w>lOhm5mG&8EzW?HwRCNf9uwYUJsTOnPk+Lt4|56q={1X z97b|xxK;K;JBcg|44_c#hv)8$X zI-zyMdk;zR{5(d|X*LUOzWqy}$!`S<(B!SPL2jrxcsuQ8LXA7JY2$o!rh6HA z^HMdEN&WpiBIB|NazV^m?ao@wFD)LY3nHnK3BByV9u7>#`%`~+5QXOjgKV8EeS-#6 zI%jNwsir|KQD#7pK74{u20b&=X*iqyWt$26*4whDm!Qt7*W3gyFr2z_4jWG(M7rho zIfmHSZfz`wbKZcpsop=6PKdZBOWzJ*`axT`*G{Iw!06Rvq3L0hm)+E}*Z{TJYRr;(MaR76|8w@kI9oAgdoZn>32C}J+Cs~cj^QBd`+MsPwe5vLFI$VQs!WxUuMS# zcz?TJk@HOqLc0Nte%2W1K)}A$;=1$mszs!2XtK^*J<*ynaX7K*5*r#={4=>eHcYM@S zkn(($I+}N!c`~g7^J+jLO6!e`_-m>Cc;A=C4$mxRVfIY$cKL$ogTYB|<*zgbK{%%j zoz}7{>fLbtS0lXr;K&0ZGMl2altBY0B;V=h#k;xC^X~8u3_a)4Wu_zIK%f22Vech= zz|UMxah*~Z7^-vG>7k3%Hke>2K$a{u=eHh3@TOn1G4Wl;|85U!+*0;rx`~6;7Y0I# zSFJg;1IOJ^v{pSFFx`UOmMN+eHS&6x+Z|v(w@>z)PU(eniblFN_#a?AX!_1l+jhfW zU=!kyJofAFvX3n#B3Qo@9$`SUnWUwqxuuO-0CmD_?GkiPME0^$4Sk!ZFL$JBv8dE= zRC|<9`Y_sqr=TZU_joAq={UtTGXDlf4w%e_OkZ}40Ae_W_d)TU&UqLG8k5hHF1hy5 zAUMAKq>_=Fe_44ZlirYJeYzET;;9kTh*;(~wLoeDylwu2t^vq4aFF@d5pIg_@6ESa z8b6x1Tuqsh#WP$BXjmi}pEJ_^(b62q-&pmXUJMilB?)zB6FLDVzq=Vg!6!LVMIv%% z=|2|OE@l~~-kDH{y-u1$p4nboT_bN0G@ZlndMuw4w#3VqNK>k>f@0N!d%IN}@P>ZN z$t}t6aw^&*yh~~GewF%>I9*SN1pkUK@^g90v0Ckk%h})-e5Xs5{v%CyMFiP0n+4IUvm15OZokr@6xc+@UmJM?lMMQ&86mF8 ztI8DY7~X_pKh>VoL6Im;_*_3A(lFi`Rp+KDl+__`>qLtkc@v^#n`5 zMX%i~+0E+BKFw-~3?9i*lV_+=$+Mo+yJ@X{#{qU%&E6XKUfC>?^SRiTSY4j-DIbM& zKAiKUulxZ>F(nNz(lUDhTrt4kgPx^>l1o7DC9p?bnu;i+) zl2ZRHcgnevVlsLY!a>2Np`Q7Lk|80PV?qg+gG7tp{Vp+G^BTlV`b9vr7OM~vl~+Pl zVBX;iY2=Y0!QDNYiiuuSw_U_THZr?1oIgcb9;wHal+`R&q5+n6lcL3ox}Nx`h!pNf zk?qNv-)Deb#64Zl7YgS`R+CDrRL2%=DQW)6$`_XRC~y91Yib7EGWIJX zJwd`xG@|SLom(#;i4^1Zx#8kMFj2Dj(=~?r6fGV}{q%W}#5b>qT}|mSKa^WgfT&xH6BypehZirf+b=OnWsn-^{do$f%)HyRW{AG->a1%m=KJmzH& zY{E`;0sE~#xq(8L_PoJYH9~bxf6hG=`f4_L0SEkI^`~rid4kH9Pf{7rh0h8$y8!rr zqt=}w<%&Pep?M=h2A-tr`>pRBtx2O*GGU)Bc8&1^IT_^)7$_6V4ubmi`Xw!n>#0W( zxiCG>hDte0rO-WD(ERhk(~!+Ao2Ow zH>XC=Ttoo^e8b`XlpgmB$hUhI=MPaw2cK!pt}gJ!P)wQ?Z*r7SzQJaol8VIeU4ljy z!bu7XeNCYFFvZL31+XF~TW?3BBLhl3Fq%H{J;NF)GjH$1zn+%tBzAS3FVOAowQ9BG zl>Mv~^u>qyR5JS-Wc3ooppA&YMme?y#RtaD1NXTl)-X9P6_W!Ywh(t4oX!S?NZ}~$ zZWU4H(Y1Zh#3WUNpIL~Mu|m9`oI3YYfZX#CA0hqAOH(!oW@h?@vAJh({XxDQ{V99=>x;uFf|ER0^DR<1|Nl zL%0Pr1>1QDqr0$j;UwcQR3#Eascv?H00+H&2(iQo2T%J7!;f2c|`vBM% ze^G6&%(r&_sM{C$+z+6e>QsW^Z9i&_j4t<~Jp@YQ?%nYjcldy_ zj=Y&;m=4-n1xWLOU)9kKsO=3`CBv^q@tWGvE?|UgvN~dk%5@jE3*$d$Vsp~g^~QB0 z!0vpVpPu$QHEuiAX^{aST><~@@F(l%5$e##8EMP{Ap^8iDQQnxsip%@bi(l9^&fyR^Lz@CUQ~ny%61(4AN)mY^K=%p3!^a^T5^gyMLq{cFG563dT6$FZo=6 zG$jP{ILu}lKg}S17mbpQ%89^rK`ys9quZSUMfp74gB&GJ%zR+ug8t-uy+d@v8{+j8V@-!_TQNo5=%PJ3C@IQe>#ht?L{7%?hTDSA?}8K!DLq&aep2OE zLAq}}xjk5T%Y@isv&P^OB@^XA&(wM#w=R{doe7rK+d@W;F<>!oY_}>BAudN>3CDCm z;!xF4z1tn!?K8aZiq~`VM-VO=c(PZ=!)nvD;epAnB#n`h__|;ZgD*gUlYEnT-(9yj ztn~(o3X(AgO6Ay4@s-wUO|df|DuND6pBX>j6tBL`?`KzAL~2g`By*@?r|Kz(_Y9yj z8q({|@Gru8OB|R?&)s>P+LMk~)0dEb5!t5I7!o38gBJJtmrUY%jm zEg94!U`t?%iKClwV&QKJC@xZFit>1Mhnh?u*-__{U|Ops;<~y)RFLmhQV;%HKUp*i zuE39QA=r()YZ=hx5^XP(12dae8SkqXiM1@0XU(UKo`45NKqpM_?~FP$Cy*l$yUP2+ zh41hQQK-Wh+LI@9(H2`80!~zW8!07$4g5AD_z+IIOYZ1h!d+KBXXk`}ttOw{lS?|w zs0z3m4qB{l$Sc?S$|~P_6XKhhs3+j@1xXEPJs@g%bOQ;>?aki#qz>M<{sEKukfWcN zL0xD#@%%N_))5op+wlf_{(kZKNZ8p9Tjch3Y~V%c*-ol(rePYI;MvY*zRJDJd}v3R z4u(41^D;eQTf)-_zo5#?@E?OjnJto;T$hI02?U4@Fo0e-`P^N(s@`(dWv)qjuHbgM z3a4vVtatYc66zE=_Y>J5k}bD*d^3bP1iLa-oF*<0K8X1nj1Rzt)!j}qKlcx1Mjm%Q za`9#D@ZGJn1mf&_O}Q0r)T}CTHc!6|kBVx%HRN-*G)n7?Y~i!^{ApSM@fvrW{_;B^ z3Zr%$lzKTRW6ADir?=p~`gM4GzqNnRQmLXc4|NwxEHIh&2*^KDY1Qj^~}*e6oR*(`#`;|=c@lIz2~+SriL}pzZq}KmNdAm-J=)ni6H%k z+o^QVc6|@f6Cigzb{=?b`}7z_!)U;iTO*oxxvk(JCYgcsRRjW|T^)SKuXlK%q)i|= z$q}0=qWL9b7Hvt4OyL0Nc|1`5uv&6@d;H){A(=EQo3yJu|15iR5j^RUmSOwRpoW?B zPU(Wvsr%2_qDSLXnc-`FZfS)9cZtB@saSL)RJ@2$JVm)08_P?m#=P!Mt4VIHUN9d& z>4_Vc)lNxM*~~mY1l$_JjxK9npIM0e9iYwKWe}LvOHy2J(eaHjqGl-F{qd8PxM``H zqg@$O@W^1qq4nssMb7zo!ls%}I2rXz<4<_#x`V%N%Moxs$ropj( z3L<*{V{K9y*h`CNZ36w_k8)E}>-}7@W zpBpks3B4r(y)1N&#h-cWBPsGR@%`MJaFynU;9RF0^6K#NQ1ygISQbAm0ak$vO4}Y^ z2@@g%S3|CrToR1{%Y-#1;DXWK;z*f7WETqDW#Z=1i`9f=T;&diO{U!`pFrOAloYXS z$I2j+#}Sa74%Pm*OS)i0{OKYUF25~bTC%uP?Rn?$J(N#et2~dANti0-Hr*BxHaDCe zvhr-}ksCXhA%J{obVz+>qhHHTCPx&OLeHEfQ0f+NcdNFu_Y=p0T0HYw2Inzuf^4NUD7q+lVvNDaQXYjGQ06XtS928IOz9k7y?#fDF*0#K zZbt@<3kXbA_R^tEJZH*6;)o6j(Mp2&Mel&e4luNfMTY@fF@ zxH`bjaPh;Ng(BNfj9Q2=PtScGVwx^8mUW;v3*C0Obm&BGH&m_&*gj=Ww@1(Xq zhDr^C2So(H5rdv7zDL9H!eiAIW|`Z&O9-hd^TeT9-InsDFxd1iCIk_`zW2L+MXD%W zx)3{9e01}{Y+m_r9)NfC6f*U=qNS%^)z0m@*F%*02F$>Yrnzv^eivc1a~K~I*%7sP zz?+j1X27!FCifFd98_?2;RXWyN_C}ES)c(?{Aea;%VVl&xvz!p^8aKO#^H)qSh9^+V6X-cD*j#b5 zxi91Hajxm;%ESqYd)z3^6AuVCRH6udR|9AM^!`-3(JV<8iFCoWJ!S&Hw@19;U`pD& zN^1H%hslsk8@GCXe#(3v#GJ@E?3<8D!<}7SntDVXmPvU{scCDO+`AmZcWHz^1jwht zOnB_x-dxDO?lN217_WMnK-UJFA##TdJi911cdu(@LN^Z~{K1R}*1h8M;K~!sM_W+c ztN{%mP+ia}O{2i4M>?zGG?6;WvRCikKW`ZdyMio&?lB%UBc#e`yDnlb1+txpFq&avGetw=d=5jHVLXN77g>VltE*LkNZ0?}Kjyr?xM) z-|t^B&HpRZ`P0wD7#jYo!sy>A%kBzs}{K z)nos0cK@8&KV|jL8Ktk#|G#7s{V(S7*B>|u}~|2O#3_huOQ(nW`_pTGV^ zTvEVanfXg|`77Cu6Ucw?c5XY8BuR4pmB79&kaU<{&5Vov7=q*jNnmHNm;a}Tn0s{A zWY;_-23bHO>Uf0T#nnVr&8z>JTlo6F#?3Ki?$Q79AOHF9fBAp^`%nKr!K;cl`>%gN zQ48PvaYE0M?9unx{Pi#Y=imPGKmPTf_;<^`yy~MMn4G}8Vg_-|4fHGb{HVIx8#t~G z`>4KRt(V2R=ES=5vMyj>+c$C71lBb+evBV=0ORt;mT@~*>NqUy%B+vZDf-KNW8>?i z?eb~Bd9BzV?UzLZ`x@mR9oMh|CVrK~JvPv<8uO!Z*tUS2J zZ1Zybdg81WsIKB+tgChc13Qk7#(~ZN@&G>OxT+h3W5rQTyNcT$Jh_kQShGM=XFLNZ z0xJA8KW1XT`|NkbH5be$0YSWQtqls?2|bvO z1ovVNEU9aGyl|tS?~VQ0eobg?^#^WKa@D}zK^r#)t)6bo|s`5LS*2 zgc$H`FZ?Khby=47+Km;ssIS6q8P{_GAq;506RK(8#+ml3osa4Vl{tOC+OD<+Qd{}z zaYZj+;5_%Mc!mkAYs7pNx7a{lyVSl5`!>TOeAWJ{!XY>i2c5vYBC#`v0sE&%DM_FRt)rfWnMW!P|)aCLOKQND>lfl%m&VLne0k!X!E(&K_o)Z!V0Nj z;}v`+HV`_fdIb(=Eg&piWmH@}w?=2s!HP?v6etv@xI=*!E$%QyTih9326uNW6nA$S z+}+*X-Ftbzb^knTC)r8P%1N?zY(KY^TmB;sgcX0v)PHDT`j$9*-DUTU={Wq04L$88 zB7V;^`6k*W{JPrQ?~mP9Hak#EKD(9h(?@1A4De$S&T>Uz9@jTjIE#Y7G%BVqr+#1ER+{fKGKdbc2lU-`zh{7@8Xxgs{nm93^{I z(f&e==LKG$I?#yA%M-SnKa^(T{Px5zRN=kd_2)n>r$nQ3qGh$&;404o-~jyVgVqTN(P6@QBSR}45vNWJ3{r}m9YwEs}mE8TDC#B4~@oqjv8;d1he6!ml1 zew>~7nXi-i4a-Mo4dr_Udk}vZZrpS#_1+1U3%32lgJY6W60%W8JO;j8YJejm=KdE? z5TA73*;TZNMPYc`Sf`KwR_q07wRa7+#1{9ar_l92;mR7(t8V&e=EMQv*}og4Q6lQ) zFmVz-Tq^>Nsw<8(C#N%d{`M@8G)z~`^F-o|?-BA4PM6VCiKHZaSyg9Lvb{&nm)o!9 zBqSZc#o#S(**`H`c}1?B=Y(MS^IGfD58#{m>xb=qY;t`z9T~ypWi-2g-Qn$PoXQlj zP&akA$CTw6wm9Wu{q-@ZE=aB$0+&c-gv4*UTdp4c}y7sHZE zhy=xjC(LEQRrv>RI7M4Z5cxx+vHO=4(A+zb-KfTFA$4GSOC#b=i2ew0muNNq<}gp% zJ9g32arM>t=gNcGC;Px>gX6!JYitt zeFe(%=#ILflvM!(=%>tV?mKocLz%?ZswHK$ELcCxew9zj8}EB= zQzWTeC#``XSO-QG^2+0*a&PI1@QwS$@=xy=%8fNg;TW*2@?KhxMsKx86z@>y{V5`W zCvF$__)Xkm))=s=gfo~8cV7MH%7`?D z{_Ly4M@Q_0GQdM;dOr+yG9z0l0)US;i%zos($6pIzjdxo)oD5YcLQ)Ei!Ft+BEtAR zLwaGRO;nBaYvM+Ew;n-I;VhDzIX07l_aOP#Vymog7P-XV-~%jK8?HhXL7%k90>B8P zJ);NJ!@o4DGzF1Ix?l4u8;}n1vpV2*{{H$wg)2L$k=46m_u~XJdn#jX=I2Wo=xR*% zR{K+qVS$=d_<8b4bl`4>DsHJ9RnK&t`4M0yfgVekgBg*&rB9y|_nQ{7Nre-lBc6WVKDyuE-4Bl`A`zVuj2x6Z)?clXx>BJbW!OYN7Gi6_H{IC= z2LT%P@N}8tn_8p|3Kv;_h>nZH{Lu^?;h?o9l#Xb!WJF#1VVGv!{M4hB-sqPeeKK2) z2cq$K#a!c>#U?G}fXxGBdcuN(Ki`^3c`E6Y|7K9C-GtO|&-%HOF4=Ac!;91Uc)hzr z4-MIQIYV=N4g2xreA5b*lR+nw^cIkp3P{-MVs(>8AYG9jhfihN_FACHR5 zp$C~CWI*Yr4KP7|Dm>_c9{Pzy^{G?zxbbh1$C5WGJ2C}ukYQo8)J`9&BT-U-H%Ft8 z^Jjj^Cwy!EYv?$o4L3-mWVj=HMI z`?!X8!XBQp;YXD2*JWVj7|9Jgh+%DJ|CKo0^Lu<-hBrl*+qalT)y2j%9hu+Mj(D; z_&!EvRZ&(nAM>%Z&TmWfBAAx8wG>u>-PQ9Mf25jD{n--~H1IrbF%+prtA5I0R9r?%9eBtfSA3sZJe|LQqm0~HIVUJ=0Id{2 z5cqxBF-nEAjA5{DMEI2PVFH|jQ}tfCv!MDUHo|D~{z4EE`#viYzaIkJRTvy3$=}sHH3!7}% zlz`(iuEx2%Tc<&U+P00E5s>OTf)!^efqA#9$7$@ovzh!>(oNXx(tb0Q(04aMOk2wI zwHDIN0m)@85XQ_-YOaYJcel3f#+PoqaGofS!@#G&rZ5Fzvi+ix%z%59Ewk$tTyD-X zvlYRMX4@Nwo|%TK=#I%Uy3g5Hry+*QjK;h9W%mYK41#B6_eOg~hX)}*es%lp6@2|; zozk}EP0ECGQlrCF=3CTbt5C#z15@UkN&=_d@^bMB=lCWs$-*Orcr*wDI%hg zu^XY=H5Czz*lv%5(|r7ji^eagEXpM1vt%u~Vv$BdKmwW>1hNo` z{NU1nr;0c@Cxi>$nZ~daC6B*+iGo4bsVM>VEgv5OtbX$^tH@R>%5bK zcdf`Oz$RaB_RT!mRBEf(a{@_bN1jaFNfO9N^Id_4B6yb<1gc}Y;TcW>-{jWVFRaE* z^uMh1LSAHjW4uzb(l+RA4Fz^S42zDio!4r6B&g7e;Z^n``SW2+_sLS88BhH9N*qNM zXM|K;>D}+?Zzp)-`Ar-h4Jm63 zG{7c-CE0)hP#|6L$Q8Zs^c~}TNiJkGeD{lTiRE@YQ z6$ks9Gj8_^X~Rrs{-3PbPpzKx`tn)&zhwvWkw5LzC0BAg=f3d}(^Q)QCkYSJ{)sA; zW=0Aa|>ggyK zT6OnJ#_Gl}oEaEdl;i5W zB%HkWq;dmDnL=b&2L+f;i{h+DzW@{#zr2;>$;uMP{B+FEjo46SdzfshS&>(3I7~A$ zu50h!g<`64VuyJI{k|a?=DI`pjEt;2?Ra^rlh14n%3!4O=9Of$ITCP0zZD$J;1f!) z)pr?lL^v8?VZEg{8DWRbo6gCU+pHTxIqR5%AzEiNi=TgxA8 zolxlnRjxli!^)5IeyGcQj0;H097Tcduu3!;@fcx+rFfMZO29-HO!pwJv;FIA`uAwNXUba>df)7d(Bo-0_Cl z5wrPE+&=^2Za!$4u{?A^$}eFxXrIJugPRv>{N)wCNXM>VahiwhbNNVc;^c7u;J^vO z&yO}I=sq~yiirLzXII-8JJX6l3!)2}z&vioy4cLFQ~6$45*!MY@8YlY{NW~2D;unt zW%M)c%aS)EhwKQMHeSDJY+RdY>TL?o9N)}ekF&=6ie6B!kP?27eI|-_x0OtlGHGo8 zY@yA-XkplBU70gndL*T7Oj7D-Vm3$RwCM98pq+m5HCZRW_w1yE#i?OaNCM18d-(kQ zUL$o|&d+ZpQ)X|8vVX4=VMk`nm~L~*FS}6b_$k5GarCIfUO8XO#PI$p0Sg88R2m4Y zcqAD5;rjAvfCwZJlgzs}*e>yF0JOuxUaOY-j8iqShe~7remNooeo2JUicTI#^Jz^X z^6tv`8o<2%1Vgv#_j36Hy{x*cCKafA@T|(=UCH429-99efqGA7+3AqQaYg_#81HI@ zhFf)ddIU?Z;hQ~&{b=9T)ek^?a10q+0P5AJ0s&L&TQ}t2+LN6>z@;54e3IG6G}=uc zqzd}esO}s9kFoxo25s0i%J@hliWfHszTQa~+E?zq__Df5_hehh9t8b#F&4{1gPp47 zI9UXDNp=<4ZC;pr=9zDTSFrh#-T<$;;g#=L*7Nky169Q%eV=+%wzi1wr;38t&38I& z!Izqc?Nnz4Vf)YTZ!ouOvM50cZ`6U01IFoyE`q^j#q9A4B*$M+>drnA7tpgRpq&g& zJ3Nxaw-wJm64&lpyDo>&_bx=F9xi7!O!}=NGmfmPF0lGs+jdqVR8`5cmmNxuNgdUf zc)JpZCxsTMhh>n&aEjyVQ(B~mJ1Q9bfOI#RHcG_0XWno5ZJ_=lVdrwpr+@TgGVu3R zkQEEVbDOmCTBH*)EedT3F+jNG6@MVgT8;mhV7Sy1^)*C`a^_o*P!MVC6{?2)P9;(!ZX11{`lMK zqZ%gkICD?+yem_q$0c=dEzQ9)q=+d`T}C7yXf$H~C|b~NmcrB8meHE?KQFvLJ}BpW z->oXP*yHntm%+cB5YzFu_|;AI?=oJ=Me3r^f|wo=>_?FG7zWegC?1dr@hTxmMA{{& z8Bv-(zkdv1>Vf%$frQy;QO5LMbf+9j9J^}VJdk6saF6ZXmTg$m5;))r;fTrPoQHVo z`+ASzHF1JuMz`k^abnY`&;iHn?D}?FhdUZwQYNa2cn+t4gs|M*pntOgIFhnnUx zcJ+BilvcB}Y#1OLil)j3_RFAtFCF>oF zkrTMf=?nBS^TR3jR^t4^RAWxY%5>P?3DH3F*y4GtVXJNWcfN?*gd1&kdt7z zzH?a)p|kv+GhvdiBdb&}kAL^#q3?+q>zJueK9U^O(uevY-*=Dfc9#!oG#A|v#~`Tr zCmCcCnW!S_QS0_;E-%`X!wc1F{fwq73Iku_ucRf3Y#pvpxnn@tpY7y1q2dlt|Aw)! zA>S56l-e;kyXAx+!=4yxkC$x0L)+Wcl5&E zvAH57M)-TFoNemJ^BsS9sc4?`4ZaAU81}nE5Jm)SeN(6-qGADza_SOs-C?t!8^BEaRU<#n z0ZRB@k@dvZr?RXqaL^1Yb7bF`47Ej(+{FRjlOfhOU#`+sGZCrRE|K%7Os{X;erg?D zeN1UhLe{%yJoj7XCd!-zb3VYr8kBo1oq=?qXtKe?NKPYx0_C*~RHp`dpn~IPuiA*U z8QYhzh^xERdLF;Az9;#Meh)W&L=LLt`lobo-oMBPraXsgt1E4A0zJjm5_l`UairXb zD&tmv*&1_p>angJQ;#Rx^_WFt3f}4o-RS(N@6{K*#p-DZe7x9?nE^h2+@7gN=3<=U zr;7ZCY(MvO(Y_8F2RhZN#9$(LJ)a?U>D@QIltbw_v@eLzmlKOgJha!lKM3vH9-nd9 zd^_!XwW_$PeO-E$XHCU^daG{N+|Of4|JcBCaewJGhOYd+RpIvbizzhU?P(o>P&|&& zhLp7uA`E4lcZqE)-g)5AIxW}o?2Egc^x$PP_KB?y%1HWfyX-80Y9mtig7l8{Dx(2W zI*7&-ISxQ7gik5|V?yZDK?^iQL+uKc!8q*r3iJuHw{Eu$QQAAXc)NUTs~&OiH97U1 z2J1l!6EcT>eObkN^hI0^WeET`v_;E=;Vmv=%)m?^(p$ZdHy=4zce&sf9@}#{<+A5Z9|Joeu zI-Q(bmpP0WB*UhCoOaaZBQ(c<_3iPN?JaIOs%))L%9m| z^=_`m`PiSE=a{o$=r$Fc2v!8&yDRrNGOyX5_{C$T&6|1dW)aPYx^u?x_=;h@iw!0* z0pw2Rtca%RFpntGX01)KJ=B$ue626T*M52B9ItLZ;or+N`Z*)XHPT4t9E#|fSp>6i znCrgx_DtUK#C)@{+jdzBBv}ryS2su{#fX;l)y|#WX1Zl6TLk0xb+5u(>EQn>OFA;` zPHV@vFW9W|STmrVGd8JD!W^z->#n4QeEv($mMYD>a#27`h9)63YJ|V*62nlSI|y%6p)jbSv-V0(|i%|B<&$v=}p18U_ke_mm+bCS#O8Y0%Y_S&2PW#CRx z?|}!ZE~Bf_m?=Dml851*`*}M?Ot$C*Gu6$C*X%%QA3Z|+;e}@+(_j+cgNN`+T;$$F z?SYkO`?NfrQT=T)3bf_OH1YDC8>T%Z7I{UN?UG&{m7rGg;bP^r_^W4P-hT(F-@aED zCK^lfM&XmTe#*h+3@lNWS&I$oDNLln<-43uajRFcK+33SO_A|2wIb(esrA96DuC!Y z_sFF`sKI;40w-09yjMj9rk0&9ClOsRMm8Uo0n-v<7ikKF&8SU^3~_kBX?2mW>o7Bh zojRDCb6VXv*b>7h7|7(f8p?_gsvq{(uO#_jr!Z7`OGTYVW~11akhx0sz{g@sU6*jQ zhSv+!@xStogmPfRW3)*LJ+ONnBZ4i02H5=H;t~Ke>$v6<^6m@g6gChDfj*&euts3l z7|o5s&(muSa9guR;*j;e9y#wcdr7t(6}z{G(IxcA&}6F9AFqhyN59LD4d+(1Sg~`7 zcdXKvVFmvDsSrC-tpuK~`ir@1nmj)O^IXg%j-!N}D-Xl7bH&q@c$lmtevHdOIsNn3jCnJVbjarhx3PTKSK2)t5*AgRyfwelxQLy(`>ms_}V z>=l>eT`TLb?D35!kEt_-gC*hE_0o$a1drn43{`_vfC=9zIG%D^&00qF*lpS4<|o)s zAQNnAs4rmV6Uz->62O@xcfO=P9B`~_?}e#yh|)xi&qN^sT12oZsw-lRBbBA6OA7Y# zO~0iWjytGuEGTWuUbXZt2{taG_B{yTPBOlE7pb?NTh(l~7Ha7*g9BsCv|?4!lM$Hg zC`|cdwr3CJwOLcJ;25ueJm^YIU!P#lqP**|e;{AL98Ri=JW}kc-V0aeI;LpE6{> z!Gos4e~5=kjN1$=AL!K+-U2QA$g6*Njn;4RQeg5+H-08>lZEiHktBkf0S9EmEqwL+r8QCukoVrD&xAGd;ypp?k?C}rmr2Y5#Ai7KSL@CpJZY0xT0k5@ep%)#3C(`kX%0o)jqq{E%V;tpSDFwJva;&no@Vv1lJ}8ac&B4Uj zupVBY^-jBu@mX9`tnR+BJNM|6aASByg879x+{nc-Y*eQb~f&fmzd1rK%@ z^}LeD(ez#Of8vMGj|+<~?82ds1ed8D?>AI93q?3Y4<_X+Jb!fU|;T@`1N!v25DieH_?J3eWw=1w5 zkD}5J17g1`r9i658g}|=RFQ=rFVdEYpi|T_^^fA@ z&a{OrX0ja3@hZIzr7kO$5)mWQLe=r2`ON}kr{1qN%gE*H*Orxcg(kJ~J@JTzSo=!V z2@8B2B9(q2I>ygFC@i|$UL#f8U@|65;`;_L*>)rGv&^A8@Bg&pjYTcwA#kbcpr&y1rCOU`SIb#Rtn{WYO9D$5^sJ&< zsa?W)UKxlG))Z)}uS5Q@`_c@f8bQAO(e}nOXJ!>z>L44}6<~s;MyB#4k6><K%HcR@@=- zd4bOH(QkZ|K8ACbvoY0UvvY$5Z2`G--=<1;XnI!~&tN>Zbu?2)i%`5-ATmMao-T=1 zV|`pT?yZxJ%`u+3g-vDJKV9Ovv3{O^5n)5uA|b~9E~Z5k#L#ffU24PgtUY{nGCXc4 zA$CBuD5o`Xy^gl2drYOQ_A%}*61yAsA8p?q5i4T;`FSK)BaB|0xK`sdH^n-G_WXqz z&vzJqVg2<*rYtvQ>ejZoP-r@wE%pJ6&abVSQn!U1gWA$o3VdMF%Iw28qTz-@T_N_- zt8$`|tF}5j>!;{Za*_g;gM;J9Zsu`%V?q9OKD{(0?a zadj^B&8U@5*(AYhfskxQGh3$?!+JhM4_g|Cj0_B*=78Oud{TWhj(68-t{iWPpPP?Q z25CT_S>0v;YRQ0MN-rKn9+n}%q!sk0hOr8R$isOUH&ww#=Odau^pFd{!gQ6a(d%T8 zR%VE-K_HbDT?C871*s#yE{UxQza7P!LeAJE7^lOW|Ck>6{|Ke86E#7siN`+uy>8Sj z(h`G_drXs|243EnCZDZRf_Ln=Pv+S}03v)3$sxtK`5WBImDJS`T1rdQo~k@7p5pYi zf0aoNYDRKL@xW-oILRn;v5cJIsvu^8H*D7)N}7!Z=%3$AL6x7sOYH-2r!HM{)eW4z(0 zAAzMX2D$eXGSwo2Ru+`X0WWfFOOYR4?Vr6?M;RNVsZp~DV`^1xK8z=d%ng_ z10@3cEzd49@RonrKjuni zXpoCSi))tcSak@4(ZhlXYAX0qdMI48LwN`m*y}}O@-HmO3**6vYW-_0J`uE`FS zl0|7~E9b=)rO4o_#T{h^)1V-VTf?}0kU7h+6LymcTX$R2eU%eG3ZmV-1uAtD&(iX) zsD)5>p)cy%gz7G=r*_wn6h*hXv3sQdxIWdGvWe$u9w4^d%Xqa87Mfq;!ZL`|+=X>O zENAHS0ltYJS}>4!A13fjnQg=BFp)Gku9w7uy6l#K6`v2ZZ$)*a0^CE|D8%L$ zm$XL4e%<6ZoZhg&rCqy$nPKJzh_*4Af63t|mw0Nf9NXA0*x%a&xaxJMh#nD7SU5A{;Y#6**EVagyN}qfUa`=8u`z zkLBF71YGpZnR=9(nVjrHv|~(9R?WjQI-ofhn?xe$dt~=i5+o^R1TV?Xn7+BI%)I6LO!y~~C<(ZJToKbtbtc+^vkn_W zNy_xUWoq$K?%#Tw58BZ+t=fzPMANCF=ijzfPNFM)mwrcv;g{#fhXIKutM%AH=ibML zLqsjpgEoU29synTVKCRS_^^S(z_EnNSzcoScCOm8TP8!t$#=UYk|}0s(Fsc{vemr| zRC9m67YA4K{oW*@F{&C8vY`5`K$_!+k;eEhK59vjTt72jsk-U+WJ%mItOQ_5l^S3# z(}!5Fu`_9VA{?T}2Vxz=XCcPJD>~5b1-}LyOZ0NpJpVOXhV_p8T#G5S9)x&E_6kcn zZV4gtD0i8byN|@;Lo%1=AUgysX(M{`#bd`UCd4f6r7o;^ZMU6Wv*@OzEEd)6=Q~^F zZgx|H=)GZtR@LOgd-tvz7Uj#2KI2EvPu7}?^a;hp51quXopXcG{2C{_P$$+e8eT(J zTIMg{**yIRv!nIDxh~4>x5*-9y6uN|^8Ao%=tK88v~bR|f>s%%7ZOaN)+2-!KyTlp z+Q(U%D4fK35}WAyk%A)JvJVIZmSXK5T-&maC11?BjfR$Qfpaiu?Jk?m#gtHqJ-X_^gZTUM8p2%wmFX*9!}4 zIayy%8-XoHU6*COaQN1F;ne6ZM%q=-Vzp}&KJXA3q|g;(xUu@)#GWiJaYmT)eY{;a z`sIEOj(Gq-hp{-MTRT_S&u)P&k=<^ZgW4E{lLX6wW?g46n_D22NEkG>JqJ;9 zz@@d_)dtJ*G}e(q?a-EdxKfRuhxm{p%v6M;U*%lCzD4^l$V31F78d?fOTe=lZ|5mF zcu^cDmufH2&dSTCSnwMB`2{`SOp|ox_ojY9VJ3^i&PNK_k&UC(r%CX@0ebSqA?b`T z&MK%*T(2_U2c)KVxK39gP)4ugs_}xiC8E}&0HR%ZBR7wLCgWDK)P?rG-X!E*b%LBC zEGUK(SFk9;bg}gKkS>2(KTA*??-45MPAMfrfvI62HMf`DmHwNuus&0xXT!gDW-%a; zzcrmU+5YjSu!aYe^|{`YvP*U4vLQiM z_`U4b7p&QYG-!C?IbqwbPk4?ru$s@RyuPMKU|Z}L`9fGj8~+4+i_>DsI%~T9tljPGSuP+z+I0^lw|ftydun^@0Lv7! z^p=)n79@u5jeBTLdlV%qoiLP@R!cSXAH%UPW9PB8LoeVNEWH(T<=Z2$q53wA&vXZz zzU6KsNESK+7YF3?w^^-9dAqYV5ck-1h!A31!PX$eL-gUTnYMu}0deJb)AKz7^TZ(( zX%_uL5Gz7Ezz=J*MPWRIMHZ^{2Tc2lN=k={6k043{-0#Se&d9+vEwckJ~xu@=X`HE zq4>n)!(;P=PRNo#{(K)SlgUx6*@Nx!`r~-ZB>|H6MnHT2VIGYo4J@_7ll9z$%0Rlk zjekva0*w!?lxD09YB9!S84AoIE@t*>n9!d-DEKeUSQk0#ZKsUMq$dz14 zc%R;yNCpn#*+sVe&`Xvkpt%hWz_DeOTN0RWkUs_QKVc`96-rtH6<*b_@&@=d<9DEl z!V0_0k+I3}2VN^zH$RC&5zc^DSpkTe9;ra{%oSJ|>LToxX+Nw-Y}+=pk!X%WVAM}4 z{R$U&Waw2fJ58}nxq9QOKx?%~s75{2wW!OBCBOUDTQdG#lx19TxW3Y$3H$>9yWXeu zvpcxkni9=m%~JIN#a)lK?{8S zlGS7MRy(m?DP4j66oJ3XCt-}yB`mkKk;B4em&glH+ZuC z$GeZr5j!(FnVS<*oOAq1_@QQHnMw&|4>Lv0ZK2imD|##$mZ!I_HWe9lOGiC=t9-5@ z)n~VlseM{3CpTY06QyeBn&(~LG;B)_%dj?nl`b9yLKaGHU8_LA^4mvjx7E?65)Kw) z*V;Mmi+;WksTu?4IjnOqZF$pC>ime6p>A5Dy4wr(U8R*FQ_62suhzg>V>K_2pryB6 z&P;>`M&=^`@0MG{N8`k(|_8D>*(InY!`r@s3IDRy4tL1)I(ng>>TG4 zBQgO`leRZ=ccmML<<6^KM-3#$ZuE^L$4kr7WgxfDG-m`)mGL@ExBml6bCX1^4=g#~ZQ`6X6oGZygfgv?CJeK=`r zO>euYO-GJ-iHeGX1&z}jjU_RUeH>;7GUo8gXU+9kI*w;8ILo=a&3iNE5Y@M5PIZm7 zdI(%V#|K)VX5j6cbD}IwJU89tQot=j0se0{u);FGjp!Bn{xIgLkDzTPx`o16x_QKs z8F;KGrA7c_-l}mmgjGQfw{sbG~ z+ZKwEBC9NlEtnIGg)Yr}{{l;YpLF;UH?P+0yIAwA3~+OV-WD9QXRB6kV0m#F=qE!glnrnXI# zsdy9#TRw6QglHTOw3M1uOi+ge^2E`6;+*@n`iXOlWaKm38BAaUu5kbETm6W~_E-9a zTa8t<%`-a6F53N^arKTm;x3wer<`$j`w*-hOLAy>YkKZh${=a(mSD7L zeuO#0m~am3>#7HwT|XtOZ+%?{<_X~7yu zY+0ZlS`hKrC30_7um;E`Io#vI-rTh$4KgdpToO?c_gDiUShzo0BUWl3Dj+I)+|*(E zHE^zhvRx1RoUmt<+sV5NG9D|*yRC{?fNU^V_Y6=r-;w`9FeuCpdq%~2N#r>1jXSJ3 z@A2e)QU2k5N+o6G z1a>LdPBx8=isO)^HZyRPZMEGxRrX8g{0h5^%{Q(xSjlD5h&g|nZLU_+%K975Q?TNX zMRS4|d(7uKejd6^Y^LMoxnBI{{JGe(+e#~IeVcIS_j^N!6U^5WT@8>8jI`1XgzF^PNl2@2IZ?gbZdCl%kxpbR^ zIlier#k^zM+7lpKpJd*4-9Gtd^9{XO=H`<$vlrEfEgIMerlk$-M6EL+hn{ERp&NPlHPxTxy1aYm??|1oWLV zY3){))d1~4>lS6Vt;B!H!)h|1j)ql(*%-v1daX`me<8c8Z(kIid%b9jy;-9wf&Z+a zu7XzC3`Y}xt49j5iuhT(A;R-mV()&U%N98n^l+C|PC)hrY-;1i!b2p|mg~vFLn+U6 zKk17&UR1(Pqk1vla7XF@HcV4~!t~DLoL{uAKs4KH{x9^0{Oh8%O`p8^tS1!B&tT;V zQzS)k?FjSTY|AX^@Y433+7V`*47aDfij+ODSgzofwEJYxblMXUk?shq zcFlX4nB=VlI1bj()-|}29lP4~EUQ8$-P$$E9sQ|WPiV77N?V8VBvjG#KQ(^Hv@aqe zkjD%L)Af^m4{i&TBA&QSfi}0qlyZ@UJ!+MSGdwk4>SjitDOBotz?s9~$Emgy*AB#w zGiui@%Co^LkndphVKF$-H3 zo*T+KJW{xI?B{C%%&g$w|00Q3~FfW8sGj}P*v?(!{H7O0cr|PBw*O@RCbmntKG~zFn2V7Uq}DTC>jm}z zlKkO{y9_W((tm?b_q4#Jx5c1w_z2;;v5*^f%fd@X^b=hqnN3Hn5}yZJw{(Ifm_Qu< za3Zd9i-E6;IeQm}-SSv_*}xbdOC1_qdMidt-s9)_hUNCrP|OM?prf7z5cvMg5p3Zd zJK)X7TIchSQVj|_S^r}c4hkzB323Q19G-{wEr-16vu^nVP8a3ZWuGrViy%>}XNlS1 zN>r}p=#u3aNU54sFT#wgl2mU3ze$-*CTS{qn(S~f{qz!&vnQ{rasd>$r+GN8;iW$O zO3e1}-BEnpA3{u?9Qa;PnEJ05YR%z0n{tuQ z=4{!jS)Ar@Kw2eyAfi zn$hcKJ~dz(FGDGI`fy9PA2MXll5G>F>W1SSHe=3WfVWqB_hD7Q{!F3^FQD3%f((VJB)c9?X?vemKAOe%I(X%kbA*npx%_4xILVTZ zC(K%h56#m1a6N$#0vPHcb=v$gYuTE|AC+A_+=Fp6!Vkg4nd4&BKv!1ue{ouw9 z=)f?!{mkhHVZ*XT-D`aN-_Fs3Z0bxbgKx2y+2nRJr`gL?>L<)3{QC%f6iH034|vVZ>8OkJH6#z`$?$ra7^yx!w*^2L7%H8Yb+~mZSHqoM&?=(Pjhpg0JV5a zdp=9~%-zeb&v;?9=*h)EOlEtNOMv!osED=8%yskx(;+ogYI!V*=g6TLuC?ur1lmvc z5|;z3ed1lImHi#Plh1(mmT6SVBW_!=YgoIBJX@O!)m)?758&C_&vZ!)y0vyDLF%XR z95+Tz>n$S(L_`2~@mbx4y!sgPUbHtyNpA6ob&e~ee7=i;Ckj-yGC zTfi(pk#!78;><-K$YV#JI8CQ$rLC~e*%6?wSDQW5lYnQzm==QfSG@WNIq8;kVDFY$ zZz4`MMF{qqcHBIR-AtOq_l4~XvQ-OIqxkBbvLA%R<=jW_&cQ>=y%3L>%;p@hJJ>>R zH3Yjy3bEiE&;56nb42XU^s^hzNocSKnN zwAlP%bS#L+(}56bri^A{jHnO+W%Y> zw(AT%jXplQ1`|vxXVD)8mkE+$P#rnPPQeNF-g(PnpG;XhV8f_MFE@a^7cABpPUD&K zZ|AzI9FG09O}S_dRfplW)XLOCuz`CVcd2)3oWraD+V!3Y?h0{zuyq_cQ75SCYMsdD z@*K<>Xg8!JVcH9rVa%haRiks}DH92H(XpDj43ifevK7_^4$T-77+nm2|JEz+5F$2r) zUt|VE$ZzyMfLQ+>;yR(atdm&2`w>elA~~ulW(5vF(-fmEj?xoT6U!fY-RIHhm1V)q z$K}g0v(WBiQ!Z<8zyRG6#z$e6FfE;-y-f=JSNdW8+%#HMj1t#<>w9n)%`90`VWUX4}WDV z-nw!)1(S(E^@d5+wbTwZN$S&%(!j1ej zMF-7qyZ6~7O)0mmOs%FO%kOTDFC?4A8RPu*zQe;Qvz=sXYjiBO_89{JDma=WcqC#+ z_Xi@cMYshQ>a1RxM!A(8f9w%d%?`F-`-*;a9)}dh8ic`d1R+g+_s)|1R8dO~Ht*t{ zj}ubf`xKoM`W62YR){aJk|zhmGCA!SFvYmnOMSrK;=WM~!#NwA6{cQ#kJvnCjeYJ* zi@1DhRX+Xe!@Ys7jDYs9Z%z`voI?PL6a_2-%V3N(!XIu;Fuq=>4nEvJ25)>`0w; znOM;C!87^CR8I^>c%Q&!+wrzGrIk zQto{qChi+!7b5o<;DMF2NewhW7fJ-*6KgXpsIfb-?kv@Zg>QaL2n#<{?tj~%$xo6z zXt2Ae4^u}}LU@U;R7@bI*@E9i?0!3=NXxolGUR-FM2J-%XUStk@OFkE=-!iqc=6rB zqnN1Wm-2i3RQX|g9J~X}x*-0BGjW#pR7+{Ds@mOrURGMc5N}RDjSsYanaj8UQKPwe zTz~@cbxcKX#}Xqd;=?pcm+qTSQq8$FcEFaYt)w@hm)qL#b}Ao5=EQ|{Ps`b^+6j<& zC5h~RRGZnAdl4<9{XYO|K$X8|Z7KlMKO30SWe%qLs)2bnFl&QAh_Mm%a;q-Q`|}!S zgMjx*5!xkADQeHr0<*m2;HA|{T4%nh8Q2Xx{P;=L&uIC_&`$4ziVbNAWRS4H{07VY9*8Y^y$KFx`re*5 zA(@+~w;)7zWxWLr+^SO87&U{hJ&w5F23@;azuyACOA(f_-vY3DkDs?7l|i;|NtXBC zg7ul8Wd0PC#MI2PoJ5$6 zoC(cdx6~p-b-r2$>WFFJy;)F)*z^ewofVoo;E-%=MHdebHN7qnAGN8{h0O%(0}E#E zML3PfbdBr&d1)`V$`?K+m`S4rR^zUCj1F%6b%E7Eqtb=z7K6SE%wB;h&PDFH4%RNV z1?CRHeNW|xRlmsPU>f8G=6K!B^8#OV3E-yrATaY?@vfNtGh+U^2Bpp@CCtnRSYrTS zKId=Sy~gf<>R@$bfc-W+Nr3@PpKh6pk>Do#q=;g=A|2oUXR(b~9Z|Z&ppYC~NliwO z6i%HZuUyY+;KcO>E|WhPVkS7$$*PP`n_vzikl9?g^HHqDhXNpv1W$&i3V<$OU^-he zVqSV4ZK*IYH3e*tlmj{RO@^B7j(<8)W9LBn+p0=T<(+V?KGZXn@uHv1{PqlaQ#kn< z;rtLBe3L#{jcsa~%L!(Iu7kB;Ts(S!VTl8%BQ$`@;fcFC7nrXBs>lmu)n)1KcV2zq z8Uv~>o;_8@Gf+UlOGP|iVom1LXyp(t{$q9eb+AVL!O7IPI0rd+WAPjfY^<-;3t;8G zN_nDau1a1u6Za0pk7&ZV8kl7y;9w*GG+Y+?HGob3KiHX~W^iH8dC%z9>IGh#O;fyn zrEo=p8MHJo4~`)>{)WhUw7JBVV#@&@%-W0H7C50_zj-EDYbxuO6B@_0I=n>8m#JQ> zygA1`+}!M41&_}txc}O&8cKb|T(ZD@7?=T%9I$67@f8u^VApz`Pqn}rs{`w+4Xoo% zz^=_M_Xd~%=iX!|gVp^`f7NuFbs}?k3#`J70+kj(Ib)!lFnBztRoQazZm(t^JOS}#)u(HojHYw9uJZo~;aGC8S*Eh{}^j1G6sR+mnK|V!k}-tWo0icv2gU z;j=i`oqfvak0(|3X`Ys}GEiBT)WM7Gwc@EsVM;&u_p(w@4CwSI`NzWoih zv(N&EwCyawgCnZjS%9?%^syGE6v}oMK&KVm)&i_={ugUulwA0>7GUkk{xTO=Q&-Ys zF7%z?+g*S=6Z_j;fOVqV<1Tb2VLh22htW&{)OHuFoLKv^7rg9V_5w)5n8L~GqUi*K z@)rYa;3;--KvBY2Al{?w)b<%V2rnOx;TqB29-~UM2WJlkVDdKqp8-fgmwoy6G9d5`JEwKt>Qhh5=9m7 zktZK3JKj?}SMRd|J_B>u`75D3LLFVv){gnWU2auD)&x!t^H;nV>gl@Hj`zs=Y*oBx zU>)97@!kY88(Tg~G2g;9x_PUZkG%LQE8e@eF7%4_CdgUsuV{~)++bhPo`VO&x;xyf zQ4HVZErookaSZncR%QiEFV-sFGcfb<2~KbW55^DQzMtQea(+h2@#}%h`46Qy4M;(? zfAD743EB;&tWQmj&7#`=yG9B-0D53WTb&eB3nPF-3*x8Yfd*P?4B-ldrvS~O zjpWB?bF8agv!HdPk-08&gu*PsLY zP@lR%s%vDaISj~;CGaj-y0**d9EEi`iw3g7OBr&Y@f)P6S8D?O{*Wl*b}&tafgL}A zQ05#!JPAWF zuBumxGXmVzd7nYekr`p=n_SmI;WyvbDPAD;5`o&+v0c~AL)^8oSc9>P9K54AdIM{| zRy?l>ZtTpjJNiA{5=t$LBglM$2}gjEkrXhPss}q~Ud6_Lu2+)cY+$FA9OB^}%m=xY zp=;`=@>Gp0^?_gDU~{C{7TIv!#S!F-!G~r9U ze97{}ikoN15@jTqPX&`>%2jL)tOl!h#k@Wv=J~sr70={sTg+gmD7Towsc>S8+0;|< zh#9vSadx#bL20J-H{MfF*7o?z$K{FXDA)@7?1 zs1poNH7lfP%O5qH>ae9|5W};+)eKH4t<(%2oJ=V-lbL4@a@ErtlzOV!aLp-^t>)T6 zk)>v`rg=-v_wy{UHWnoEY~ zFlrVEsi1DzX;J3xYEw(n>-T2N}%x6iTz z>SUwcneM=)e!Fo2?>n;;0>dN!GF@f!Vf5(0J0mijDgq9m(d(?5x6KR4_ubSH5HnP5&v;wv#T@`IjnFLk*-Qi4{a>5#*8H+AxTn*?7nkPL2D3uDC+CBli z8z^RHECA$N1RPrNP{lEAzLk&IBd2mfGvi&U`e&s2Q{0w!noMI#aV;>b+y?HfYKrG- zUb(Fv6$n;j2IiS@2_AO`HWLcDz!bfKCnQ=)2-CwwHIFpl;xh%v4+0>3T!XCVi)5pJ&QNmR6_4d$ei{-?J=MeBRh+p8m|}uMUl5vk><&%_`Cz8T zJ6ZWHA2js~%uOK)hCoLD=Dyy1RNrh}88XfV4r0^Auq-K!jTrEqs61v`d9(dnE4p4ug*F=RMolxW-@rP(LiIYgxU+TcV67Dc>m&>?XOJFYT$GAQ&;9K?y{FNmEmCKjLFW{hi?zFH#NLIqv0PTpw~|!nAQCbR#_fw%ou@p z+1_jYswUvT!7oFwY6X>u2UhWN*ROncJe*d)Wq z!YC~3+g*S;K4oIXk-T2EblVHlk@Iug3$W4Al)ac>S4dR$0<5s*wiiU2;=bJln4g6# zXW=UDjah%qau=q6&cO8KKn729n+q@t6Qj(<0Q1Xfev5|RQ?q?00BS!3KsBGW^pINP zwgYW}sp@WEj@;DBtKPu0>A&j2&|X<(z71P?t1qmF^#Lux)X+GHT0CzY=T)~f?I zjvj$^`Utq@WS0)|1}hPHfB9R2na2sRF|`g>#R=?+4AmN)rDpo@WinnK)eJcE-l3g9 z`i9$gWjB5Kuj(;q^X}to1IQ8>vHiIXSEPZAz5g^^N-(H6D7K?pCc&zI+=aY8!JV%O z%zQJDZ?5g47MR}UZ5jJ#Wc>4iffuFpkH$Xk(<>XHhXeSSbB3SsLhn;qdNme1lixsvEX0-l&eH1$L1@vG zrRUNlb$Tj#X^pt*urA$}MiAsIDrl2#uK=Ffn#xm*t|+~UmK$i@hn8^S2&nV8jcJOQ z1IWw)5WZBHIu}$^Aq}WB9dTK;Tm|zC88ZFT$!xa@Fde^=yY1V-5(5T1i??O^C!FCo zx9X=Gc712VzVp;hXxCKWH^jLonCUn&ZOz;MtCixp9Zdhp!J7L7=9WwG8XG)mDS>xu zB-SZK)Y@Do`!5)d&Wqm!Si@_?nGR;@%guWxn712{+j;|wm2_f7+2w}~u(DdR|8~pg zaxI)|QfU*fEHImcfzBp5;G$(L_9!r2x|`<+*?-e+uIYC+gc$TSI~kHVeS?W|+@A1}a6$8E4Gg5~Fg0hz4}ptc5h)BFIlwZc{KG9JGs!PcJD z>VlU?arDmYS={qSJ56od!6iE-qg!!V0a?PeHqdCIfte>+U|xI%#`;b$&3a+20&+N8 zK1n&O%dgGl;JAxuXdA~A*H}G|v=hEo;N;2v>rDG>H~V+IHM{;HewIubRmaarRUJM9 zNw@C_pJ}G(e!^$Dl-cU=8F6Pl;j`2bmOFeV12QXLqh~TAZJgkljL0=Qc;+%9eF06$ z7zuvO6FVdBHacih^1Iqk;7mQj)-ki90Xe&r;e^fRq6_y#%_eW#e1c|Ere(*>RN9mC zgv?ailPf!71~lGfCs?N1o+nl&)9W~@d3Vt+emL)7*`hI4V?VJnH3{twm2JtO40~c_ z#XGDzRCZ7II7Uc@Os{J^QL=KWvcC?@DUA^Obg%k%_Nx6uYSl{-(vw&dHzObj4HY@}uL z$*ZdR`^l>kv+BvKGWj3&l2}!?-#fEv!1n370TM5OrPf6y)a&F`iJ7DGs`)S4SSPDW znA3sxp+@^E{3WZpxKzG6t6Fq$BkIYjCLOEjtm-7LK}^+}HDzil-i`9vx3+eHTD-&C(|a7 z(Kzp9nu9gWLT|2wTBkHd%ucCou{cxTim&{Vtqq|@lv z-v)l?)Jnm^%d2y03p`mwbaHB7ekXVPLxQ-Gy;Ev&iy1k&Q)(*4ijz(Q`_qN4Xswvl=?HRQJx@9U%nf9nj+kIp1$=zf zeaFeL`rDHFkU0cka&yQS+M~(@UNa65yq>lAPcgQ#*kp&O8$O5?`pD((m7jkc6WdL1HqjSE%DdsNXSf`j<=%<)FNjdGM znA^Fus%yFN&b%h_)N&JTuCC<{VtRHh_afHVPc64}J5Mcl62l9~*G)WGaIch?rH&cz zT5e&~?pp35*0QeU=1hFvSY69anjJ@0uaKJZyOKMIIeT!nhSf8R_)^F{xs)F_&V+ww zv%WQGUw?qsP+OS(txfOFTl%)T5`P`&AMVur z&Q6VgkR&j_6$aY!1g4FiEfvH%qoo+qN>l%1JUn;1KKq*M}j+^MNzKv$+?50naGRrNe6e3W8VxMxWPad)PQwaBI+>(2>e zHMq3PfZZp-_gpSYPL8L<;#nu@_N*rSX zmGmT}Wew?oe$9Yh<|Ge{>fB6$LMS>aARt)Ee1mk6`YLVa|`urmjECC%mD#66uvsHqNXin^Q zQH>jGmEc9pHC|MLwPZ6}C73=D-NjZ3-o$myTO~M2kb}IunW(xyPVgVdb0(W2lQ&_}2|I3}$a==R;(~lak0p-iR3iZom`7~#g-|c9uSD}qYi?xXA0Cu;Do(bX{_31C_I~H-g zvxqgDU{C!30m5M`7?*>#+Ha*aV8U5JQcyt{W&QT+ zuAyQ2K(xmOE&RD8%{r+rBic1VwhhFGbb~mWL~|E#Uu&#@C|7_=e>Y&j(_=9Gd76W= z`pMR_rj^S@a~ddof}Ejmkk=B;ZKRwasVS1eMQem;gH(=7`nX&n|9uwk&t2F%@L0P4 zZU6Znnt8tQpI-YftocYr?Vq*(9{hK{;=);d{vFotpLOi|=!g7{#rIZd-`2j1&K1-> z*muAy+8%$9qMtv|{2|(2^Mx$NLv&ZNv*?jTiEKrQ!P_MTcK#trwWXf4sk@iNBC%ypW~8&{(f<hS~DI%ZAV+h}YV{Qu0!lSqRM*ao7SfZ`YSu3CGXN%oOI;T^54tDp2?asZv^( znSp|8KDx|8PVNfw1CDa^zAGW2eafvp9#Ef>pe9W z%3RheQM*w^o$V|oaM5GGouvRyEN^1=x6$pD@|6M@d;)G?X#$;AKXF|N99$+w8c@F@ zqVX)W%>sNN{>buXlcNM!tTG|Y9-7Unz@@*AOiEqr~za{SP`!UGSzd* zO)4O>{3g5{$eBi@3jEu_Jv)R~KYQcxqgE{-c4svPZ~{%Z3z$Gs`2YpTgk?YnwwnaP z$GUx_2^c*1i6ch8FF)A2U5t;nXntpl#=9+g=@GkqmkA6eF^E1lFnQ+_M}Q_fj^z{C z2C|Yzr~^uMvxAruwDDr3xa{Bbd-{&e_Exo<{hxbw+y=w|z=`YtgH9uH7EuDh9Tfsn z_29&efJFx!D3eL;XLEPB3CKNa#MyrMV5Napq5>2rJmo=TCy3B&0P$X;F%ral#1kiD z1z$wnQM3u1g`^ zGJh!yccA(hPPD$uX*-q=OwEB(q+b^gmZ(L2rvegGdM_mk25?h)j~Mu(hbo#k@tOuS zh02tMD4=r(5iLO+TV;0!V*q)i2Qm8&7;AA~b_N8<%JhBGBP_bjvQD17JkOuUVb^!; z+_!4gckztm7uP7@;8P1uiE^stZUAM40-dEy;u#an1IxjSnHDh5`7PeVz%(3})FHEn z%&;$Swt}R7ztXif@u~sd>I_gN%f@@SgjKZ^P_aY` zfBpbKQ;JvJzNQi+Dc4q^ky2h(Ww;+-KNIFrBIWa)?c>%>-7zW3kQ+tjR&*%zd9@ zmf%foNw5rHaYWuH*>-W&=(DUO9e*YR>Ok9CS{{9vk=fti;LWE*oOAYZR^q*)&$D^d z>p$Jh`JK)D))F-dx@H*f1UVr&UF;TMt_#zKJeWC!YY-U&c5&?~hiJ_WcC{hOeXMWfCuk$u!JSR{IPBxV}VmC zFmXFkbF%ALOXdMCjhz>lgEwz+u`AxlT-3aI4lswU-MERtu%tLffHja$e9De(E$*;h zd%}q~hkv?_zvC$UAC#Vl*spA<=j=-RA_eyhuH7C3RcsSv)4tfNdJAzbHMch2khZi)|gH=e9l` zrRTOzqLrQpSo`QmJ-2c5@maRNvkB@S3U~T6?#i7$tnH}6iF3wLg%gjoqYBrTfpztc z(69Z7!s$9$`&AUKuN*(3aD62`qHuj>t*+p)zS8m$h0~1}bwuIBqvj(Dr(1LES5>&a zS?7_3)4e=h1}|drv2Aak#c023Q|KY->Hra56t~ zA5k)~d9*CqZ1d$&h7*rvM;We7pnPifsz#ehc9h}TjPfH()@IhD3?~kce~&C#)_0tZ zcUsB6PGu|lZGR4J4f)9e!+3G z2Uz#8codKU_QtWmi?<$`ui#Rx$+;bsxV9A6KG|T&(ew=)V5cJ^UIQ3%s{4KhtE&6C z!d+YKX0HXNKU89yU?ub(6X8h#*Q_=pmXf*Q$I2kfe-keo;6?XaoU_0zNI1N~=w-&mAo#oWWM*DOpf5&5bE1&%H2k2tE z4Q6RV7u!wY+}_o8C5|<~a+t&x*7bHFzOL$my98hN3CP#s;R_EU8SE*cG|>`pw#Jau#4!h94O0E zgeT6(Q-voUI!#U`p6=tdeqGNW?&I$`OYiiPf4O@KNT-R{8h1oG&hNm$YVs0iEb!v1 zc-!otbm@2OcT9SvXx=@v9hhGICGCz%Pq9~m`EP~G1Bf^5O|UyGJ;gDq1Jg^q@(xU= z_a5uW^hmNoNheX^Wm;R~4o&CT#v9B_*Til>jaw4VvA~-)gm^0eP20oHgVgcq636QJ z^cJoT!z)O=y`R(qYuK{bW_5^qiPHvHnc#C6bdY-XVX?sqFN-Z49BgV4N6(m1tU96( zqyRIoCEVkO$Nc$e{2gEEt$OmZyU!p?or}vE+IVE#R{#UZ-y<;T4^j0{dvZ;N{(%E+ zxQj;XXq80#UAIb1mpM&A?I}8X!o?BF8%v=o%2NM0Fg5w5lpK8|>MPjXApu8&nOb+Q zf~^n~-tgofH3pZ@l-_nT8d+GJtqVE*ep~v_3rj;5z~+k+r53b}k1+7oyS&>rfvzml zrcqMBP;Us+J{d&Soo%Iqfhl!*R`8Vrr3|9?-b~_7NnsAAk*>jmLA=KVs}c{aVOwAY z-@)wcCeyGgscl{bWP=7tX86$K7GMp{26J}N24icssWE73=hRy5kImrkcy(_Dk~0+U z2rmiCO79KCZ<|!*QoU7gg=6o)udw{MgeeU~mV5qHp(%>~m+`iCyEq}Q(hr!bV!7I49Li^ zD1CPiZ;8#07?UYLSuM#>Da>i7i&t!BPaCh~3)k&kxC^r*SKZ93wUODKya84T;OXTR z$F)u~ulO>1x_MJ2Fh`nci_M;XUNDd7XQl{!5Us`aboGLh2gzya6=&|#(<>fkr>Pel zcblfUs)M?EeEO~Ho<^pq; zvx(zwpx9gFdjgGp!8doKL)8!)S^Fu(m;Sv3UcgM7c1VdqAlFjmy88-3xD2SY!p+HD z$JeXG;Tv3dz1hkYQ}UVOVFPU3GT=N7zG}p>PGNBCNea@1Sph5#5EJ_bN~c0Nc%HcI z7clPMr=K5FfE7bDHVZu_1eYPr4Ia_fhSW~~2co)#vg4oXjnSR=N zRDcu9H@ld-(4I$4wcxeIaq^$^1M57iV471mPfMjt%bP2}i{8&U55QYN7jY>)I`=$> z3D~6;D~{;=r%aD?Ac2>H%HlPDoo63zSAhFk@xAjl=-cqjqtv1PAL`!73{TPhAo+ zLxZfsck!A5-ZX5$vh=%9>0(|%YkLo{$?cLMJb`>_6U-aK!AWmOyeh$}HvtDb3c>UV zhj_hQBoV0Pkd>{sxB@s6-{e3aO+s*_y8Q47z#|95( zVA>(+>L0d2`f8^o!N~^Nc4`VNy;gBmfQ#o+J4LQiohw3Ip9Ws%^&PkGor3gVe**B( zF(?yi0-fHjuzZ7+)dw>}4rB_Ds5=f!Cw+oLqj3g zyw2Qwli%-K&cjij+3gWtHF=4gk&!OT_(GX_wRLUE;m z`2bsc91i9VpW=wE;P1#3FP|OVm2Px{Sz2yh&= zaj@C|dO(`+TGbQMI=VbsZTv)^kI;Arr~PF{TF0-)5gP|<7q{4Wf+d%E#Kt>7?ni7~ zJoav}aqsZ@Xr=K4+nHF~YU9}f`W71(4PTGgIA1+?i;XkSpzr(<8xKWE_YoThuNEU$ zCA)YW)uk32=cn=gh>dqtYJI&$OU5!G_z*@=;8RhIxOPTwjn&Qq}y zEAhyUEAL{}DlZ#ctRDV#ZhW|xzvElI6>{E;pEHi1Doo$(Ukjq{W5?uE61(nS%= zPU<=4LHl#IeOxBqr#~U?aWbJ2a|0XQ0C3V+0S99};^{7X*rtOi)MKCS$3Rs=KVtw)acd@~e0&fq1+FpG+TvPV% zjL_*}dw?bLCteFkBXt9L!2?+b5W;mCm?q)`o3^Va?T?%1b?jg75zEeJ4xHd6jtQpA zY$dLJ8@w449Cu4Waf=DpRlxHBlM`jZ+zwlOuJ2KF@Lg-QT=wm9^3;PY`?j`tUQ;G+ z_;N&gb8vyZJj3&ilIl*Yf%S4q6s3^7^j5^2qDcKYEqdm(d?dF1@F|dEN39CxGk`<3NOtOZ*e$1+d}@Vz16fwQfYPhh$DpQx z4J^g2oW_(5G1c)lmB9v1Rl4yQG6OEfaHh#}yTucbnN~|6a4V?IN1Y$VE-W+0y(R$L zrjvfu1Szd3sU0H#rr^)I@Zvz{Y_MhYtwEvsK%P|B0H!>JrP@;9)P`M?PqvT=aC$5b zT2FeHo_g@DO1;0`;S&ruv7W>fMQ3%ssYWHo0u9x6R`QR^iI#44ph+H@uKGn}Z~tHk zN;>F{H~hASKHZ}Eoh|wgli&L%cyyJ)%8VUdW&H-?=qmT`=g;i-P#R*N;qT(>41Xu8 zUh_yQ_qUQS^E&h2`@4Mxz=NkO=pF$t9_eQWeD51OL*T*6l0H-5wdsZotTPF| z_vJGLUP=4C&JcLuXU7_#n-Ge2ENaWd{I`;`$!qn}QYMSwq7@>RRF|pwqzy@>~Z_enUb_2NzzaIBY5}6vM>XA0RYJT}vw_ zn9a$;+76s}CDZ;JVBYg39#fNU%u;A;gPmPWV&4O-$-?63FqF}-^`*6}1>Q8O#1luT zO@>@kykdcwn;7C64xUPqiq`XDz$&%?>lKXk?MKr9Y>HI3rU7_hgZ`9Q zRyEciNdw<3O?woU!Nr)~BWd8wi9Cu1K$-+`6b-=2dA7hZIlw;!mVHZ-;|MH+4ZK=l z*}wz*2rPq@O?m{Dojyid3oH*XKjIW`FYuy;^dhjlur~3UM_?JuRC((wPhikDJNn9C zXVwYK2d==HxpM@T!HTDg_hn!v()@?Ovcz(7gHts+>TDbHC@h2Z59o6w8;00c1_Uuvd>d4ShzK@O^#iQY+ z$dVOUop9ojepI|VI^{>ktD{$ObiBk@y(-^#xV;L@r~eL+oxrh2$Ip(ISBWiv99hs2 zIBP90a`9noF|Q@QJdT2QYMx?XXj9lCK_-77jGvcRl7IT4eV_A;T~LgHSF z%=K3Hst(8uur7CTY%*SLKS7<-gBx>n;AgeWSBU+R$VO{*Y3@kNe1$mX0w=h{my;Jb z?$}f-ecd!t@7Qu*6KmXM8|?f9V)F$)pHdwmt@m}a@e?T1-k~+W1;5I~e(hHLDsY|I z7%lsi9l~3!`xW5D+o*-VZnlh8{yHJTpJ&>~hjM;rFSqaa(_EIJcHb&%5N8%}s$J1| zuMsJFA*{^%$^tPZci(563Y9Ed>ML&&SM`O+!XM2+)O}gj<{X0>eWfO`aslHG@Tvcz z?_)Nr;^Um_nw_KSGSrQ3gILpnrH;SB3}KrCcoJwM&9)Z0!jJPzjzNK)NM|x{d!vlF zcL47r)-|9B82Vd{#TdZUdFYyH+4c?}0UBCu4Y52F2Vk_Z)Tc9ZoNZ1~M~<1IHnuot zfFXvq$5_q{%r@6}S!m9dtU0E(_;j_c$5WNnZNR+GZ5CX$rHDiRS0L)+t@<6$?wu0z zFN5By?;^4ln9fA=2=G+&{&5)Y@}5)PF6w>!9A%SS8LBP5Y=d?DwtHvb$xS3)kzo2# zTb%puX|Q_v#) zz8YhL2Us|miQb?9UVpNlp`jsKyJmv(+`MT6=zIm!zUx77Cj9(%{G~Fik(gK2_J8YM zew$~aTJwwI!I@TD+NloGc9-@pLlI24ZM%Z>Z&biEC{z2QW@>@&N#A4jXvV#(kOwZ4a%@ zRbUD#0@wY2$phVl<<--2c5mhR=~m9~Y~{DAZAy!tW4UzOuW)g!C1W6SidRl>P{#yJ z3n{@oG?v&3%r3^}^aa-3ZSgu*m#329F=RZpLXnBh3#=*j;-iPOubbxtP8I6mM}*1}4*Yz;BZY_K{hZr%Y-deP!J$<7XX@iMYxv^6OdD_dAFx;?jl;vI@OrX0$t~(@G{m zi6>~$c?M}Gf|GwMo}$1^07rq_w_uv`#u)*Wcurs14tAb@;@k$N z5NGtopNipFPH}cX#Y^%)Z9EJxBT8gi@C9alxQlBfmf1&NFpD^=Z78`LRcDf#P6`*1Js@9gDw9?Q>%5y*g8y*#T5=l*$?Z+G zzKTZ=k(EYAMIWpaoUDBpS3204(Gjl!9PFqQW^PSIz1+m!Q&j63V!fq@GH`t@Jbi*5 z=jzzti~by0&#W2U=M+Dp5Vge?K&24+;z}?-(gwR~6m3WVOq^cNZ20O6&}xDCR_nPy zO&4vR3l@CIPz$ZsFTd%t%^c$^o7vyi%4Mp<#a3xjfp~yRN3Yl`!9(MX#J<6Fw{EtT zVAXz$#~xq}9Ti_2n3AZu-;%wfSemTTAo3NgjtlWz0cMeWi1S~(RPEX#zsMXV8scjQ z*i=%S>KSn`15d&^0?5$4wzk$h3TwaVXOJ0+moU;Prgij!YP}S8%rTRrr znIhoDBMZy}Ily<+t}jb4p9%*TeJ8NGH^Hn%BJ(20-%sxP1Zylf7_X;|WpCMteh(=J z%d`^jF~N&x7+8H};N*k}a4;zcX7Gy4&pg3&G6Osrd#Q zCtF^?ybJ6v&i|*I_&YA&JE87hkD(@?+5)rq0~jyUT{>;VNs|Js26ixPbnjXX z2QrP7;xPtTx&U1dlA6cr&N;0C4yxXQhh{L>>f@B*`6fNbCmHr9ZH z9X$IjRkVY(;9G(D(>gdcBPoYm9Izxre;sBY?&R;deDBrBalP!eD;8*8yRC{z@^#x3 z|HIq4B{`DgSad7BfcbFZL4y0=*xY*w`lMAv)|koK6d#>^Tu~v(9VGF_4pMn*6b4#R zAY~bY%3GT#z;*|u!tgAFw^kzpH1?1Z(XIr^Yikh`l;%f^7zSEnwGJ^s+xF2Q@a$%^6!ZYi8LcnG ze{{sRrjVdm)_TGO?Z=Or0N)F?$0SXP6sQcq58z!P#_5c$BurwBRuMq_?pHfVVy$ts z1Bf{Pv3-;Sypg6`M{i2=Q(^p$&Gy@{@qc^)V(ta(7Nep5AKFxnRKCuZsv#jv_5hX) zA!-p(y{87T{OqVIk!M_}H`Mn37dx7t{j{98>+GhgXg?W!mP&n7yNS`8DXkG28@-ph zqD*`AURuOG9Jn=~k^!30o9JzVqK*LCM`iV$XqTTtIAc~_@1lcNDmUTYM3ZR;WA`Sy zfRG?3Lei9Uu;Xl=T(8Xfud{dFX4ITpfW3FcTPw6er-|&eQRWP#@4WcZW9|%tE*u z{+Qs&Iux<02URCOI)qZaA5xq54zq0Vpr=4Q+}POEJ4REi&&|C$gagcT7fS`)yic}7 zBUSgCa{wQOclN{I?FdrdeyuinspPiim+&RTK~}ButusQar2n)IyFL|R|BeX%FvNZ= z!C-+Vu~bwU#(RIPunAPnOdDd#<*_l^4g=yA2u(7gWS#}|W5Mud7Er2k8)9-c$_^`P zQOwt9GmJ_X#ks98>ax`KfThmYY9tUqYPg}st19Sg#{*9TZwm}ahi?Ln&+hhCoo2cO z7cpOWNL-FUO4T*KR7O@0F{#%~%I>wiph|FsdmCQB&A?dOT*bPv+yUIL=SI`RR7-K+}=Kh`3*i3$H?Cix^U4O6^>QwNyA(wt??d?*Edo=68hk z-)g?32#wiEx)ZEsIi19t;)?7gEPR06{eGJB3(OHs1teHOlLPubYJI zr;@&Nl!bfSO<@KX-B+FFoZzj7(l-rS+Q=@jj2!W*ylK?ZPvRu~b*lAIQbyQK#THkG zexI?ys*1kp++fB+?52B**Q}ck4oy8&Z}QihrCv2-J5ua-vm~$eO~rF^E+vQ zG5=b`Z~YDOwkhaun756A*!S&n&^IV=Cj_zO+bN;%adanzC4M>yp_?t}F>QN$G3YVw z+p8hOR^#?^XfcS}??L>;c>6&}l-_m`z_^V_Z%c`m#(Y~&NLrV5ONx1aCX6Sf0$Trxp(PQ*1qf&cH*L zVgv2}3bl!Ye*G@v25SGkHQu&2m(r;KPvNubj{xls(Fy0{!jb1=K~9GG<6 zcVRj(_;I^z9q0=Es;J%N)Yx6|E_i(WSpauHh`$nVTa$ddXuka;`;jOlw9>jO`l8^w1GnB7>5rwTB*htY-NZv^_4fEUCUEC3bRQ61n>KEr5V5VieMG><=X(2$h%@W< zArX(7w^s>RCAhbji8zKtv)i5M(qp$9N`jRPaJ!|5?TOn>MOObRyWLjAo^d;}fJ=5k zcWe>I?628fUEGx*cbmR|aXtO^gb_bQ9!H~hRr}nYGU73I_nj$l$`tFqG~!|HCF|Zb zXGD|V-ZtWA&+dIgrdoYl;|L#LKTh2brP;qD&Gs+tQY>j946)AzX1RrRK_=PhVGs|Z zW;Jv@=LGZDtZP04%n(J0O|P@E#lc3g($rBs^|z{2#nTpKMe1y7ygc}HXgh;Qt&3JS zSgD=u&L`8D+~P4E%;W+xt9F1>E<66*+F6?rq_?&2wo6^gXW!Y`1BuHw1^T&Id_0+j)FtGFb- zp2WJ+o41UsrFWk)t~`QU_GcNFWOt8K#uY8P*=1ZUxz%M{Ex7ZPae)jpZWWiLwydkT zT4497;v({c`5#qWl34ey;%b4duHq7Ikb|R{X|X>pFaHC*C)KGq=icSQN$G9q0a17>$1xqLg6 zG+T8ClXdu6-Q{G8ZAEuMsl!fYqfp^Ee#dU4V&|F_SO>58nd5E5;(>oF-$pIs+sZ{$ z&$_K%#OsOM3Pzk=sn^|NbS>7~O-Aey-E2l^&$_*6$ofFtt_ECGk8V2~@rv8+Mwp#5 z&<$~P%`0!e9P!xk_S2E4U95gP;#KSR;}PfFw`Y&oBW_P0@i>hdy6?})L#UbE6=;g* z@Y^*=>>0PKkoc+iVH$lV%`Cm;j~PR(a8r@;#Jv&r-%3UE=-**2?nN*U+CpPTK!j+y7G03Z~3)~V{NoJ zdKb_75!bxMwO5?yExx_dev5POYPbcw;@o5znBq?SyhXrw)!iat@qSB)MHRQi_^#-# zKo$;LZ;`UN<}G5rdqx*IH!ppFE`+}OPIjSmvsD*TH;4V$*FF?x|Bf)*zoe6yMw^Vo z!@%^FIaqZw;7y@E9Qb_=>oIYy4VGtDyfztkKMqeZ1X!}HOId+SK^sCG3DkxlH2oI} zRfva?sU;3D2UQqYfnc&WZe@d~i*rmcgy*JT_P8}=kel!s3+QSWrJ2_O45}8why_kA z5AkraX4~CXn_zZTFmcQQ=5WsYj#QZWI~+w2-OdxADjo{0*u|!yvdQZp>eVHRIl&qT z`Zg3bX$am8M-x2d5xNaYja!Do8*k52i{h~&mVv7E*ey@-GIb4`KWzLDB{{z%$^SI$ zhPMERE^Dwti*Sm3wFHN-t^f;1M9Z(xELwbpZr0N4#PB+jYlE1}j^vK}&da=IcM)rQ zi>}g$AT~V`iDZ>6x09I9I$|4xxT0EO@g>wUvn6&Ct*j-sy>Ti9ZJ{k<)ohuqQ$?RG zva_q`C9(BbSJAhyu3JSfS*yt=KK^06e=4NwJ3{(v2rlK5*N|%8#9RTCI!m+y$$JG-N}4HD z&;qf5Y#wSyTqclXE+)|`fI$yF@!>7kDBXEQQw}TU!93oQ3RJUsN%8;{r)9RB12?xJ zqU(&nQ@Cryf%L5kM-WX;lDoe6e&+9b^odKs)(XOB11J7<;9b0*KG6N02l|_3bI%4n z(GW&dKhZ5-VS1+Po;&?W@2PYjsW`{`Oz+9o4^_Cs|9q(TaO|gQV%ubmTNFq3bDhGh z><63obnYkX;w6^b{GRUpZ0&u^9rpp-;mUrxuLjYNcl^*WK6}RX9fg1WqVWH4dUh+= z4q4q!u|US%>UNUtco#6=@}85EZ+V$ z7WUq~ZsTFaL3?t;ZBFbeW?9|5*gKLsy18+JgF=3rAB%U|+aOt?+PU8b%8KN!x4&`+ zdZilN9?TsJj&9LB#Cy%|;M_svx50DAnC(Y0(1*h8-w|f}muZi-Cu>~3JAw(l{Df}$b)~m6W@V@G*scE;;aG0zjtWUnQuM9nJ7r~Ie;uk5Do{?js^`X zTR;SGL`$?-3q?#Hz@j-o^yxrpoMq_p_el{CRfTdRuDkjIIFwKDuFt|H)v^#X7SO525_cLfR12fU@4%GO ztF2)JRsXDgV}hvPi|S^BxHwwh^$~Bf#Ebzp{wrQ<_i*zN?_qcTIk-9qug@YL@A!0~<-X(9 z#h$CDuM2zNM2~0JrSx}vyLgUwy1Q`Iod7Rh{tk#2*1qH8#pUmK`NN$&bw|+a+O9jI zUc5)$3HCz2zU{_Ox8406yRCk)+kSk5Gx6G*dm#3@U%!WDo4EEJs$GZI=$YGj*zZhk z6R$hUTywkkeM&voTdb$pbHBwm2-z>Ezmvno@eURjdhVV(E;OOWl8d|3Tu&~4#q>@# zzhc~j&xNbTosE81!JVBhjvaTl`dvwP_PV&+#rJsjyBgo|?Y&y_j(5MS`Hp}WN8}w5 zFSf8dLjG=3nf#AKH4)yB3Gn zI}f`h?9R&;hg;9n?t~+|Be#X|4&=5}wBioz7JEpt-l5*6p5UX0euvmH?@(|s-Nkl? zhKono9V`x3mf9UWPL|m8U~+J({Vsp*@N&!Gvbw{~#TErNDve;5TH3SG#ZTm&pAP0t z$~#{jOjTjs`Rn3V?R!Rh`5^gXmrU^1bcOsTcdmo?}lA4GqXUI#=0J8182>$Oc(3nB>ijkL zS!x|u`EVy%OyE#I-(&s?cRBGH8;C8sZ>14kg@L-20Sqaax|PJFk#+7R2twX79&|f# zg>}aH4`0WpcXEH{PX1z7{Mfa|v+3#*TLPCd@1=p{05jhNI9L$|mQ_(a9k$TVM#Q1vuqr^eQ?a#LI6wtg@Qg6FkB6Iv$?Gz>LjaPcnJX{1ykz zbtU(QxYhy}gD35+4)A0=M?CA!uTfz@d%P!D4erD-4NSjMip#fBW=G8Sr~?-_d|@sF z6 z)25nhao@DPT1(efZLrLhPF^Rg&xqJ#fVtO)cs}!oU*tn^_V0-EZzhE1Z!PZ~cz~DE zDWq502CHnp_09oSd|JG#z--NMbypzIH*3|F-fN9X5bqmqQ~R$x+OaS2Vy<3m&k5!V znqmbmS)0(Rw}JRrqt){PW=+Bt*Eoa8vaHqn);Q=(%GoA>fmzlqoUwqxE;4OFB$!LN z#N`W2!SuF5x^R3g@QG%}(3UCA72u^0jQ_oka(2&OywtvQY7p6Gl7Sgl4e{Cq=C0qS zmV=+7LsVRAfEh`Wo#uN1lkYFy<94)BSyP*OK%PfaxP5}3-XUZJ{n*t$6y*GlAjjVW z@~u|70`m3P(L8O6ZTV45J3_x~gS9<~$K0*e4lqyP0Be4~_<6{D=wD_j_5y1P zVQbYP9x=dj$bqRG9JTx*s_gb??RI!X>+}&|JHa~so4enVjhXUT1#^p^0St;HkfPZJ zg;D}?M4KEAX4?4ST|hNY1?pH3D_AJEW`TJuGl8!O< z$FjV>Bg?-S7(c#&I%3Yzij;u^Y~m`i`raKiY}^)^*;-mBP1FQCoxNbXU9OJj?-Xg9 z)oS1Xt8}h(`+qwfbsBO zCD@f|@l>nG14y$v#d`*r?k#eMa8&z#b?^xePJ(Y0y|?0N+Uupn_tcFwQoJ(248R4r zg)2AH7u!NeFqife?>WKDnrsszfC=$!3uFQvQqu-XpG9e`%xWXXz>L1dv2l1`)oJ!v zK)`>T&z}nO{*Ex$-#hGfq;njOeL|hS58Lcm=M;No2Rq}i?T&U1v1NhPtWi8xhdcF< zb?KSeG0y>BY-Z8{&lK0_faeg-td4l5IQEHn3jA3e@H{-8*%8kKtD>hvp4snDW$1)G zYYAgGIH`t+N9+!JCRk%7#e17L*93EaF0oCr8U}+ydD#kmwkL_#a@UD}#ul6J4uB4@ zGrg;$pTbxj{j?H4YjpTCz^s8Kt0F^eBRc>(`YqY$-#ZNIV%xLhpacBKdRHXW>&FTG znJABM*nasuzu10#o_l+KQoPn`*UxT!pv1dgouQpSDb7uHnengAVWG%N>m=>}(dl>f zmi7WoaXsEXpnF&6aRSAsH`Tv$Q|+&c+x-G9HPIP6v!!Zv%8s|xW#{a8OXljVox?M& z^LA!SHaR-9+`?a-ytBkLS7+`7n7`VYJ8_p*r|#rkex1AX$MTG)m+tE9oq3n`&EI)< zhmkjjM;Ie+0*_dKO~!|?_D$g-t0D}nfpuaRFNRLUu{(<=@7~sFJoQc~uQ!*+?)KP; zJgc|Qo5>U6v4HB%dpBUPqUB=uPUZ1~mCEI547<5Jvh?o}&9J;Z~zTx!M!^C3^kSlSfZkcioqBD3NMSh~=%#5Krq5`L64^q%LcThh7hkNRVEXzQD=UeX!Dq#MSEv*E&T^Q})ipvI(R_ zhH!*Q6oo}&gxL8vv^rdpnNNz%B$Va`RKq**&H|sb^A1wJjqpZo32Hn8eC(^_QCvXh z_AD-U@soK3H$tkI8!%;spV8({?sx2+DEX{}PoxCdk2Tiw(|E1;ms?vi@rwFXkk@wv zdHzdh!wNQK1(s?^E9uoHO7d!+;7IRXBbFsmsY83So*4$co0`${kceu*QNcvp(^nP4V%+Tk=Xr(PYb0IHPdzNP$VC*(4lw|K9Q z6^Z>F(XHP^m)j*`jj0y@L}goXPsr1uvalOvp1mO`KZCf|mK$?II8%l<(AB>?r2znG zY6w@Yw?QUPuPeJTE9zh#a#vIpVmWOY>#i2?X(#ZmD5^$z7o2d% zVZF*ddGvAxvN6rOn5EPIvDAm!9Q4EO-9T#nn7vs5jp5h3oq(OY%)8s1#*~LG$@C?keYEB%aq4yT z9^_m0ZXUX}AM4GY%p3Ne1>m6e_Cx3SP?r5Wvi#TJM=!-b%O|0>_i+zo!15{sK-V*E zU4gi3Urj=Nn&+!$&>i(SQPWZ8ybgj^R0c1VZQ$8Zq%^Kq)tRcEYE5VX`@NRDT1tV* zSB+ZoTfJJAycJgm6Yj3OX)SG;3N@v}L4%>#m%nNrSD1Ngfty&ffF|F^N^X{~4!Ncx zn^(nT8sMSj1(J}zIx7FTDqCMQc5N>BSIaHh)*)O$s-0Iqu0cmMNfX!P=JZ#&E~m#* zm=Qqr-ubE3d@8B=9Z8M9HTZ82PzI33@L{i|e*bPj8g>a(XHc8uSl ze6!;TZHtDNM%RH1TT1iuYZ=GrgqZ*&Pjs%;kCk7{cM9cMnC?VM_E(?=TRf$(>uJs zbBBM?gMS#I(mrQ_<%hk>Y0FrMA6w#jTD`5^Vme#<9WBPz%JJcHZSAc;k6sGi>h)PE zvz2eZE2&lU2}~{o@nfSGql1f$QhKqHmHpj|8OXz6^;&QL2bGY!8#s{rRDd_v57_Bs z6zdR`x3IUH2^>H>+fk1lcS~_)o!0Zu>g~+mqyk&Jw>$^Sb`;OrU{0Bf-ZBlGoQEUU z%dDO4P1k`G^}8vPHGxI^#$Jv4#5mhJmBPU|@)Xx_a4~7DPlf3D$xFOH-Yon(#)kc3 zZ2Z{n#wo!TKe@rwiH=KVy3odGk4=CXn>4V-Zhodo z5DzmjuV?$5Qaoa|Uy4i-0n!0%Ks6Z@n@{mbYp+-JThcJJ_KYnhC6)`HaH7rYR#T4R zoTHs?oA}IXznmt}L>+u8nX)ohn$5zXu`eLr{b935y$wOIKJ!Y2xJ~xK7(j;98CAR6?IWE-IMS~OmbY_ik(S%>UClw9vD&-kEuZcDn!<5?V?~TLfX2)Rp%+lThnCQG zyy;8-m!x!kM@oOS4vLjjr?wk zd_O_FL9CH>mP#=z0r>EpgpO=dMUM5dF^LhZGIz0Mf){@e%uK2UrV@X6EC&ZZA{lq^ z-sO-IrE8CV$4)zlQ=R({cgLr4yuTyI_5WJAQd_f#wGCKYp2xMgg!TZHuyB;t*u-7c zI&1qD14vbNwQo^q5y!WvbGH>%JHEwgebtU{@v5tFe2cBE&h{-N;-4LGmf5V(z1!F8LH6 zkyVmv+R;wuaVPc%2q{+bD8|uG^EecZWaXsVeza3N4#i3G%;QfydZ`_6;v&V`q@786 zmAVhbGQML^`LEUQMnn5#3j_EN0PV2YnAl~&XmX3YD11z&F6oNL0<$sQ;it%|!Z^L}Y=Dijy_spr4tlt~fMf)V z=O#}UporrcZ_}yD(6wi8FlDnl@e$R`gea$_{?l~v;7+%hhQGi?H59BhC5}D8ScRgI z1;UE$T=2UzDT8*d#SHMEGg3UB0zY(xgC`FGb*0)_VqY7q0D<^<5Ea!J*`4_9~hl?&~HF&flsmmnU_zbWp}zXos#*uLxogI3b#8(wqpj@)P?PD!0Be?h{rNP#>YS<_Qj##faA~u-Zno&fT?y z8#3G1mK9j>@mAYYLrBb)c=`mh-~Ltm9Xx4ciPH?6O#c_}EU>COk6}^ORhkg|Ha4^i z@S#+jCTB=Vy{1cmiy@shZN`sn?L%Q+-x20tjJJQTMh*C!QyhU7Jy0mT3#?89+*naK{1~6C%1aYJxRZ zKx|`cRKYT##{w236XKX;HOm%f$L`dEv~+1!0iDHR;#C_wC>G+X06+A^i1&hiMSa-| z3^~Z|{S;d~tiY)xS#g)ItC#CM*DMRn+Sm~La4^KX#^DLBOTnEjLagiX zB5R<-;XBf#l=h-)`D`$UTOS<2W5OLa`&5kgcf|M?+wI3UIBk-4GjLM>z26@k++yxM z0z2)Edk?|Nq&*y9hM>X@KX))qF)imlCot25^Y938ayXsXa)Y}!cgw<=5!P%4rV?PU zES>&5@yeRsGZ!Sit~`QS>fz$Gf!vm^Gy~O3L7Zh^mY&tSAS^cPgT)?Xj?M|O8F1nY zi0;{MLD$Ic6htTsOCL*KtHlnX`ZmS8#uw|Jz3lL=70pCs6!jSJtt zTy8Wfdp|N|O8MQb{xp?772^Dkr5Dd%TSLjy9oyQCBz&F$WF--qu1}$t3!gE;Jb4#5 zxTeKEw)in1C4}gFS!`9}r<;(=5v7z&4Bx_FV1nPO-~N=D?vgUB;G8p7QEQ2845Ft48TSUtVIuUsiB3?O$kyQB z;|sGvv^Z#y43?}L%ZoaJ5NYQ^s3AJ?1!ED$Lt=>MBs9+{jJ=4D9UM?V6ctM#WA?jq zqlKA4jDFjx)GB)JbABqX{vCO>zdC+HPWZK!c+4&KHNp6|hP?87nH<4Wlrurf%odM4 z{N%bhpI~L~i2e2S;vTl^em@CLI)}wkCVo=PzXgu72w0zE1$IW;#iPB+wH&N5^x`pv zZt*&oBTsH?m4h{xTpYf|&zvV5u#fZE%f%UFHT)4j+r^I;Sd%Kji#Duyv^?@8F;~!F znebUlXt}`IF$MWnz+9Jy-9kLHj44=TXVh8jHNeKmI=FNb@uO=#bt!BC2X|&LBPNGO zr8s7QpVPotXVd=2&h@D%=XXRo{yOM+DnhorZ9OqwnG|r#x4)n^M;bu(B7# zxeA=zUc|N*IF8hqGO*jT0jym!7$Rc`Q$(_$4?PJ`sBXo!#w(j}I_Eu7T;w+2Fy37h*RP z4_n}Xxb+sVn5FAla*wagPa`%rInOe?*m9B=Z=*P>z>^k$c#I)_Ji(?&j^chL^yov4 z>hO&t<_0^hL~+gn8$HtEvEs+3_Mt4V@5u7}t1cX;o^cge#eK~aOoenFo*O)=fF8~Q z_wUA#VqD7(8_?)r6V^`fpdbHmH>xs59=4rpespJ_DPG&al+1%sK>Ez4cHDIPJw>d7R2a)I;s z27RmEfj??AGdh!I2G}X8WE~}%L@b)=AnHsZPTp53EW)smCT_LFE=3w2sClfTnLo9~ zPYbq1p6oNtU>)FKZK`-J12Y-&@U;3=koR{4`4^+^$2YKGUcliXQbBZ~+XB;Hw8aCc ze%B>@p0+-852+|SSoXGfE|WE4A&hIPdme>Gzgpmc8ffC-30BuOFdc9cJQyStuM9Bn z))r@$?30=)_FUj%{6qXU{b6Z@UO_OvtkU|^1Akn`f)aYCdl(UhF$(IZ+Dj)Nv>-PctZUk{*&{c*wtEMRvX*9 zE)IMS{LpB8a+R|(lMx}248`A{G`epfFAM9deS>wKIF->ldL76<(2;TNs9Di%c5TB0Nak`}UVWs$%W4~p+W<89yh-+j*oQ{FfmfdvgTn9T@Hqf>* zfJ?1&Om_!)^P=O-HTD-uy0lms&{TR{n2S{LJshrekU^m>lF3OqMaSoTDrWk7#Mvcx zxS_}M8r#Xn9$lg5fmkGomttd1n7??>@9&?5GCqwfRTYawihw{0WwLRC9+=O$q4~G@@T^CdYh?T`(lRYk8DkkviI?KIG?<3~=z+kX*a;rVd!x15Ir+4gVm=SDS?>D3xd9O;lh+ zD_#}@r`trjWD^|<#^mNfNKLt%7jA*)2Yiw!U>@HTi-Ouh4z4->CNT8uzmzTOo5F$2 ze3Lv09<47qAY}74MHHZuctZ|~*1riRO!4BAe*)vJ_jVdw7}C_A2I~Ayp!Q$N8(1wF zXTM~g0FT_|r^is~jn1r(pnZ#s)H1QF(|=r$LnE~doS9dF`^Oa>y#SwS z&Jyev->5JW`6Wl|QEln1z(@y~q2v8#_NDfg7|LU>_NMpmBQqGJ9x{C{4{M1mcLixv zU>yayRR(+2KIJ#4QX!_L@xSpe)wje@Ym*`U4}NJHDM|Ls7T_)gB@oglz^MXxCw3@) z#bt7_$E_WPj8HI-eJQ~OZXp)0pN6XaPN?eN_85pj`}R5dm}u{I>!-KPM3+BKf+kdI zvu)htu^?%Mm~=|EX+Ji3w$%|s9q3T^5o++u692nY6qP~C0NECq>=GbV22>Z)%-Jko zLwYnQ(qxRHvp)8WilM?^zp|4F4GQw15Sn8;?3(E;jdkdLGZt|`eG z=uGV^J10!hXiOvBaR2&@P?-+8H94nnJ9~FsVg)v!*`v!P4)-RrNp)(n5tTXrmw_6; z6R6)7Ti=S^`xXZ@p>nwESf!J$q)L#&4a+ifKi39D3goP+6EgtPO~E7fX- z#Y^G0JXQy2p=5O7&ViaBZ5mV?kb%qR2pf5v6pf9;`-iz){1T~&p>vXq;q46WkN)m_ z=zcVF&@@QZe~KRoCE}nSCC|IXB7Kj(flk$z!&7iaMu?Num%)xzQc3F~vv^~N`jZZ* zF(l6##(i?ga!^eEoN$yo7JWY>{WMbRcOo_anyl3~&yHO$78pLeoNTad*PCZ&@w3ZO z(ly>{RiUDMt4>(B?@D(-Gsep*x%sCq14`yrZO|0LeZ;n?1Ezy@IiU3mm@Nxo zNGvYj=49O6ddo_3mF`<~@+&_OOHx--uU;kpG}6Oc%(ANz-9ndK`D_);F0{VZ$?A@r z=&NQcGG^Zp6H`~|_Ns6ySMItsy17!%D`Rv1wp^NXLscd|UiGi^Dx0hSEfHcQ&ZmGF zSEl{Si=$T(TYRj4f-?gaCPS~=j&G_%Y5a$LvQ8@orXr{GU<|w2wd9Vo&kwt1J9Q zezUP1PYzYzkUA4KwZ@du8*HL27vD$tU|Hrr!2)j}8 zqQkdU#jh%7d&K1`yI-3NA-X*bsbQDACaHV$-V&-M-@*9INskj7F}!1l)}d3ia#M3Dl@>MKPR>814cY`~R@ zVJK9{sQ}08l0DCxGQ13&2Eaaj`3gwNggMz+VD=Sm)Y(Mk70!V`Bu~8@ncO6&_25(r zc?|F4GKEHjn(miC%}YT}32e1XoMZhZU!5EuuskoB0)1)QJ?oBR7QKmGvR#?_jVs=M z10{cXqOSF_#zSU07*&@WgvdBQwhI`}+ua;TNHHkCK2(rd!XIC*>v!Tb|N2zK?b_|3 zU6P*qd;;6^tE5KKwL8~e4pQGBzIkw0AcEN)z$J6DcZVSEb$t3A`eTsX&agI&x z*(kP0KfV>ge;CH|J7L`4!+0AL;$1GbZ9ySZHa5(m+_vpupqTB6XsEYgBHqPoyD1bh zs8KqBY8x@)LN}yz5Udyo+g^@%SJLhDC@B2(fuy`E@HUB16<5jPDWh`ROY|xQYQ!wm zz3nM|Rk<opc)Xnd#b^5< zO_7ogj$biX&f9{F3f-HA9%TZI)XRfk_-;57G7g!>YdnX<^WCkayf?h6z&c6#QQqxj zO&)2maxT%Z#ogd^ic~eQH7>ao!n?;xNE-)x_p0KZ=2`C+tt3MS94Yd2ygR(|J>t>? zoG?=A-5r*F$rz%ig;xFCU8dKDEdSnp#u+Wg^bN)7OQu)%9yX^{gAS={ENo!Mhd@g; z9g^2vYwj&{MxQAWYX5Ud^x3wcl*5nqQn&Hw&AhJ8qb8VR zq>a6ta6N{Ct@?O2ogAb(G(MD+zD)GLFMY;ezB(RHf@yu3Nbob&P4qFK@-e$#j@-#e z1-p&(O|Ltpy~%f8ia8_}7>cyZ;FXvOd?ouhm`$a|%l#+mmSByMYR$TV4|!~>3V!L_ zc)sJ)2Ed^hd4&lfEeecOQp8_T!!OYfW?<%H9)0x?BhAQ4Ax}6LELAt8DwR2H4%CMZF5$kTD9*$e(YiWea@1U#q?n zV3TSMW*F&KuX;FSYJipTiKeYQl2ZY8e*$r9mVaVXySA!Hy1lYzQIYzJqL0}PW;NNz zSWvYg=k%6a_wd?ctUr!}v;7*MLo}J>CDmWC*C;yzrsQMjD-=JCLFG=mz6$f{M{lr8 zAJblSy7rYn=cJzoYW+^2ep^3%TLA9WB43+`?!}}*A1BidoSx66X!}ISItdP`NFA_G zWLehWbbq}PvQ5MwZu8^1mr;97B16`Z*CZl)4JN~kOtaS}GJE|_Ffz!n?GpKV`NvQm z-w8szE|DZ#6wKJUMZ6}FB=fP3@4RGQlZcXj6s$C|YF?K}e4X`RsCCFV@w!Bu>~L^C zGpg+oAwvtCdhC$bBQiTv3-*YlkX{1f9ezI_{WMPJcjEN#w^0?Yk|&h3!^-lUUNDm=xugjAxYP19>Hl!&p;|lY$EvQ9I1BS^ZE;EpyqC5=L-r9f{I<+t) zVWgh`kAj#m1?SZxq-BB?$=XQ=luDRU-dC)eK<1PQ#0_u0pNoDPr}jH>`uAI(_6-P= z8YPfSQVN*O1)nJadQ(yXrOc&bqgAjXNU;HXt^|MReH&adap+9G?@KQc3$ouRdE7xi z$s|okf?-#P1=~m=Jp`>ko;zAT!U8EStaT9nRg5MLtkSsUV{ih=HW={WYl z@FYcM4<6>GqM%wG-NSBQnETvfXg06)IdGM<*u&ah4h&EcLS4xzX3VllYavAi^nBU1 zhylZOGkV417*9q&KAFbv1nIXW)VHg_B`)XzN>MU}h5w|yK8i80;?YLIu)a)u6rib- z3CI~j4>uF;`7~t&G6ERNGSY284<%1RYOmR&4LT=D6Tw=cS}&2mR4^jQr~*xkR7r3v zUvH<|U^{DPk#QVMb5eo?1O+cZGDy$lcFNkMXn{Fb2cHh)L3t{)*X)u&hW;$Q#11S5S>d2Zu7b%A2;I25J3HkbYY}eLKoX zH)`|>g%+|hNSy-PoVoMT2InX#@tAdq`PC(o&(x8mK2bV`>obPL-v)eLke;A)9-}YW zDhb*dQas3L=Kdoa^y4fJ%uwExi;^2G-T3!oBy>oP$4piovdBC_o_RF8WCD#$5Df&> z5atb)#3eV`CO5l)A!+3hY9IJ}L?vaY0HLK<}@pLQZ% z!+$o1;-_IczZ0hYw+%ASo=c0(LNTAYH!0;{^=mAuP;h!kd#eEOf z8h(kyq=DW+dJ0(fDBiLTP+ujz}hkI^!~s6nJxkBHar#P4cvY5q^p3yMfh0 zn(vf^9e$Gmsty_L;68zzLwW>5S#qg3=)fMz)!%HX$)f|B+9ldR6$~p<4XW3I*qYEJ z<$}r#d#=8plYSbh_B)ZPf9+akHnh9R>;m%y*&d*&UkctWc>Ga{_l;IQnkVQTWT=9A zimc=4;+bvv#!&ZQDC4zApN6c0(sED$_N61DG|8+2BZTaBP-`v?0SBIwAlJSKu${4C zC@e7K8Dyn^GD*%{8jgZXM+z9sq&x$%ak5T>qD4+5x}-YolDnXR%Ot4KSd$6xg0P&A5}mNf3!wId{Q4{z^tcE$f`*d@@$7ahl00h*2LqGahx=3P(>g6 z($VWqx*M2A#i7ifvNr1vvLW3$HT?6+B^dE~=z*lEE=7HzN61Mik6sOGMxcq264240 z6hGuHPNXHY%Y6)Z2}UHHjAqfJtH?TJjFN2*+DURUz@x$wh@hBKR)pGs9!^^OB^JZq zPewnD(fXYj&HvBYG;s7OY3<5>y+qEl^IKaI(&TnL|c5Xl-A< zG{w-FB8{bz7DB_JP$eYQbBAO@%?P{(@>q?3Ds|_sc%^e(uyn{@{EFB@h&zZpvr&@^W=6Mq{e`C{9VRI zK=&X^6O{HZm%-pex>QL$17_|uv>+Q2kq?R~$sCa)yF{uM__=T^U}j_`dD6aI_!G7N znjlRA40ZBMgBrHe3bqkU3z^kmohH2;baPTGKuPMbJ)ztGo$Cxn@-$T^KrHKfLn)|ZB9C@DdH(nNEGvbIramx9|& zNPDyp^2jA>0Oa1W%psXKWW4ty#ULN*m{Vk`pFHp1t}?DB`Da=5JX?wx60#B) zf&;lY6$ORJEBz>xtIP&V^iwqgTav73aMW0Fx<6xs-IszCM#S}1tQyh?Y9v9ct#v8n z{W$Glekqe(mi89W0_;#SO2MiAQiS7e({hqb6;Q2S4bMr-Av2*kw&g!Eoyq~K=2Z=k zf+Hjods2G=`Lf?)VPW^v7>(bFQU7aoUp7Xen1Uidhp2)+MwU@(dvrHwkz^;Se@+aK z+V8X>kYs&1uNa5U?3pLQ6Grl-_I!1J!26BJZXx$X*FcBwX)sBlQVgo>FXzxVq(fFI zn4^0RevBf=jMUikw}UaClY5ZaWLA-`@4}Fjez|ZMNA|*!fVaNOj!;=tjFIu@ibcAT zl|p{G)`8mO*i(E-^7|XIpT=kXPJDh_L4A7zTgT|fAhY$cw*-=;1=&IQr+VUK_|{g6 z%p&tB+4`k2^S*JSvIu=;ogmz(F(tDv^Gl>`wTMi8%nCAkD@~81Uu#htrCY3e%*Po8 zTei$KRQMLb5}YGssgeKI&&0N{rtfI;FQvD@kjU2Nn#v|)Ak}$Qy`)B|(g7`U3xW;0 zI@uZI_|_5y#Kh*?Rr041I=>U4e{bUJcL}IZYYli($yR@tklv=81gjo9ptRX;o&w`2 z*&U!|ZzoWJYVoC4Xx?QnwwuV`g|WzK0XyUpM-o|D+ohyno*<(F^v-Q?8qjjc^a3^P zOM_HmNL=+>mn8Uqo%2}HV2NL1 z3Py%DnW><;Z@*}Rl0rr`cCeZLx7*YPBYlL7<6vr#Qwlo7R#r%>$dLkhaBUl`;1Zi; z7g;%<7FsZme{HhGko%_#7t$KCB|yNxGacmog4Yd2S?`NZ* z2C4l{kbYYxO7=)v#@ufv7F=S)gMCG8Ql6({= zH;^L7p*sG$v(A8CO=b(IVXv<%3OqU>C*|r0tS^0Gf}!Zz&ann9n~WhPgq-3231hJx zX;7(9H3G(&ZDtElr^!4HVqcH%r=y>SYWz;9`rq~=>)G-Ih|Bn^UkF)kpof#A3YPWd z;G5aH2r1p5ogz&Xj8W3f!QM<1h9b5kLuD%HA!HR))>M~lwTGOXPbtWPyWno2h!h{N zhf>q6Fnu=dHW7??&SM8y@#qm-z#>BiG+S1KX;hj+qfhOxXeMOofU!G*a;Pv;;{i$v zwe?h=*s9#46=+qDsbJ z6Mu#CCL;>8ak7TYluPEEz|ki4PrZI$ne$i-c_vwBz_Q2Dd>sLGndtEbwT8U^fe}iE z57?Syd9x4U2sv(`{dw1Tq6vpGlr(8@jEe1nAhHtlPO`nh%D8NH|FOH`QK~`HN3#Tx zGW&i$`e~%j??h_<{e=1|6GECLn4zRpgJVt}iC6ak`Qd>+k68&;85yshqJ&9-W?#Ru zSB}a3QWfkrvbB@hK*L?}+RaZQEOpT0)6oX2|1_|p#w_8GFI!AZYF zM8BnhP&or?f9b?5jJOM#rC^@eMot5(s5EMp!|Aw37o zGLq<$Pp|K;UdajvwYE)|@=`M9vnc-3(%1jHX{y`rMC!K{)%OVuNxABi7+7MDuj?U+ z?f`Y_F%^t?vVywh@x*Jk_&Q<3h-Ws|D;6WE!r6TuObvaQ-w#<9A~8+fwS=K}NdFTP+URnxIZ^ zORnxplT0(PR9-u;2{@LdtM3w)Y#}Y@Yp?Jwfyw9u`!qQjTteISAuFWuSmL19e0rF{ zIzhS@IA&y@dCU5*9nznLKN$+8Ce;NsP;6#mPT?_PKr`O*?T zo9K8=<04>Kk)Z=t3)$|QM%i|BQY%PL0Yjavbg;^{(Op03oA0ZUpN4AvPN?Sp>|r_M z25RUfYfgqlNnc^g1eMPfii85j@k<1pgPLI6VF8cMW%3X(tao<<_r$l&p(wp<%oIV3 zt3kC25_3MzM&62NR4;|4(HF1eBpLg7o1Owq>=Larkm!5i;%!S@Z<$^)_XL*rB}(T8 zMuLU61={#!BXbL?+U1~g8$8i`VvQ>ofm2t4qY^Ba_tK57e2hfTl_9kUy4$5A&_N(@ zN(CgrduTa%Ae0HPRGsr4W_`-Qs=4H|ufVNI$?!=j7zs~uNJ)JryPgWb9>UASS1Lnkg9 z!~0UP>IHrB61@#g@~21@K7M+Auu4Y7w$K2kEn9$)*QL_7|eQKb7Nx2Gn9%9N+REM&{btpB?%c%R=n z8~xWuccB@E9g8wejWidZR+pG8515r?2I*3lI5Z%Mfw(mf z?B}rjB1vF_fNV_F-OxS*A{mm%Ts&9p>5-^hi%V$$65SgEp2HIj!#>a)n16KuS$!=p z!kZD`0wQNxfvP^09eEp9h{_nmC=Bb4l4UDQdIL7~L}8?#+qq0zsSHqWJ(26Q0IQEg z4<`M&;WMR zL_w$#*t92NHNyZFqB(d#-Z9S!y2(=gB^!Ncqqo>HG!i@F?!&IKwVI%-m1~CffmOF^U z6R1@uMhLJN(3#?eN#{Wv;y|m1q5}(ZK~&9%iZ8~5IMKy`qZ)^5@e0%~vvK?j+xzPU z8Gg8Y{?p}mQ&azXz1>{$+>76~R~Ikj1^>Iv$Hp=-S+Ck_cRoG)TaeM z2UxlzPl%P)moU;y+~dh!tya5N_^8|Ki>sUbJ>T8k z^5yMjcP^0P>2)aj_+`!x^^V#x@8j%V6|Fx!I}`5N+M3T!-90-qjIZ8G+&{I= ztGr?P08^Qrx|^TMvj12FLd)H=6My>1#m|dRZ+!acXi*lDKg+>QIBIF1cfq3td_1XH zbyUGKn#ZFhH|rX((~n2y>8uXsEa4rQsU21A@y}jTQ=53t&ylE#rPd)7^R9tI(@{eC z2#fpZg+U>0RqV+>Uty=)^0Wqgw%*LO?Wmbu!@piHwKDIe@T1Ex=`E&L{nz!AQj1b3y;*6_=x!gwI-RUhdT+Da z=+RnuRA+{lCvz1eZr{D$oNwN5-d7@)_R_vvE<{V&OUCE8$N4HemZPDx&9{o>tASq zDt&#M-dw5c)nWeX*H`_+Q>~VVmId{!fd<9hLawZBuzzqPg(K)e0J#m+@vx2Ef}jj zkdNP=A_awDFn*W2l{>aSY;V%v^|O8ZcE3s?)-%TThfka2{!Z}pa=Y2?&c69;{;*7P zL=iB4b~1lJH{7q==8vR1_PSrp$MJYe1+;i(VX!_|>D)KG|qA506Io{G$=0eIONH=a1k` zq_2*Yd1+pX^CsG_j+FW0Na=B;097znm^}43T!6ZBJ3ME+zA#kazB*KI^XG>QZIkoX zhfinv2dS;_Q0TgEi_JZuBM#l=$Mczu%7XTced?Ue<7d}>wF*3#$A$cP`OSO#K$vv; zk@zh>W^T2F59ohsUs{oV00yBMN1>u`*PFv?SKs6UH7VY#E>rW1&E4YDem0C*c?APH z_RZVX-xjy~{d#fz*UfEK_n<=V&+^sk!+LSZbucQUwT7dhHDid+pL<_ADA+kX9KYHfX6%ltncd-@-5pOpaX*Wn>;rxZ&+exu zEJdEhL+)M=MXjIRLr=4GdOi>N2Rww&?xCmJ0bmckn0MP1`LBN4q}wxDeps*Wcu(Wa zqPP2Iaka_}cRs7tNPX~TyIZby?UBo$(W6?g@J7ub4xQHixt5>r-z}EgyAId z*QqC`O(dfJj6|;(EPh6$>m+^VS?BA}BK>}KSS%NZ1xK|Z7|6~VRWIM3{okwCeGPGW zdG^ok?qAIOoxtMF_BL6S->GuT%d;+p7l$9$?^CS0-OE3xO~e;-elQX~e7ac`fYr90 zSZOym{r7&|y)^&FVZGV>+%+<+)8^ICR)26m(wElJ{O#(;rN%l-PWtv6uK&I}D$}}G-2h9_-%rq4<-v5*3wTfni1Fl?5gaI6 zkzq>;y=}0=nBa>9qw+`v_R8DzAc3HqEnw`r6f&q4AQsRnV{C0sE9ZR&qei8{*XB$Q z11bYhU_;79SEQY?Ru?M_D2Pv)P*4~`Q{f_J&?;@AfL1}YRj*bNFvI8+cvoQ3 z%0kRAVS=kPl8VL`X;2QU6{rNom*eUXX9cqddo)j2l=L5#9 z0?BchYzI28JYgSF6N+Bzl(*0)fQ}W`1srCG2o!nSYY zU$_hxhnfO=6@1866zBT_8|4gQtYM-8g7RcBmXHRWL5d0q2MG`|j6tE*$LRuy4Cmyc zq6Ae^SF;loR%rr-d7zb)#R6)D+GH>)(p7I%&eHK<0N}xZ05XgUFpia6)IsUFL5r~s zUp6g)b*S56H+W+3-03zw4SW$8CabiG?9iN@b%HYN{G_{1Wx!z~jCI-@gftE&Ny`Zk zcuK9QWqIx_6R_sw%D$+RHS~!HI>9`xbIMi>gxxw=%n1iQSFF?kKZ6$?WcBc6TznlfdqvC3g2RyOYfBB(uAd*&QWz z4-&f@nca=d?kKZ6$n5SVb|;D5qs;CkvpdP`9%Od661$_o?ncY(9%XhXncYcdca+#2 z1a>DavwM))J&5d1T4r~U*c~NyCz;(zX7?zvyU{Ycqr~o3V)r1kJIU-$GP_5a-AQ71 zFR?qw?2eyf_aL)-kk}n0b`LVU8;RY6#O^_6_aL#mk=Q-R><$vU3l=2s3)p?SSue3W z>Iu7Rtz3ZdlJKIy=n8C=buk;MM@(Ws2Acv5)L^t!$7%%E=p~p?K||O;U-PZ3zNo=y zb>$~(p{+g32)UQ5cCb$e6fCgI~v#e7g_Mr2=f{sihI305rWEcYUW|39~i&m|y zuOO&^)dC+C257MMv7bsq<3~#&gP?+SZAqL2s{&MxdX6Tev#eL>uraA~=5ydhhRO7> z1zTk)=mwG{1}FSHgslp($)Yh0w9!{Kh!GoTH1-4^(6-fgv{(r~`kvrHXRR(Mi~WvF zBv%w97%_}DYVu?gO#==R>QIOn?f4ajg_GkxMKcu)!L1jY4Cf zK$*k}nAD9oP%dN`Oi<)>12M)7I_1IkpvieKhU-du3~Cjvn}XW6E_AtW`$@i*r5$Jc z0y-6;RTd-iEMqEYBQ+2UGs!SouOexl=O}|w5jvg| zYZvkata<*lH4ik!@l1=>B>i+eD`TF3k!SGY1Eav%!CWtbwF{&?*%60i5H*h31`VpH z>4=$f6>lsti=NgCB8zY0CMd z`ap(}g7Ptps}7{7tjA%6!fO*fu4eLPzwv$D6N&<@g0);DRVQLpG1$JIqAZIhwLn~X z;pf1M3|q2X(S<6j!8OoA(MrlX!*yb{0HO-sa!r{V1Dni3u0A1ypkg#!shX;wYXP{b zja3%Rp#C)t#Lz%rMxzXODHXKtD{!wX=#AxSy`*xU%Pqr|0#Jdc5h#@VU%So-;yS}m z*BMMmfXry28&7@=g9j$0%qInuDUo3tTP4U^!I%jpGFbD+L_CtEIMtd!nG)mFTGq<_ z5_}-6fGu&~BB+RQ3`5YorZl_&5uL+u))liXYeh|hX%%c^!^C4*60{~zc8*{zYvq0k zKKQ!Kj9N>XY0SNusRzCbtxRATJPk{wU}FL0%w*W>a5bc4+7=<-;W{8VcK zW#{{;wXBuxHpX67?zCQ6xU;l9k&X5@VGVGM(h+;wcrWG~HFBiNA&WfO$8f)!>g z2FnSCws0g%Fx8qs+4(TFmbG%f1RqG5Idl#x6JQKOfMKj-fC9>y3Bw#RCOe0u;ajF$jCKQI*TGq<_5`6IJ%xt&+r9_+@0fGaiwQY3hBi(=A01CWs+2Ony zoV|qcm4u57Lkvwfnt-u@IyTUv#VAOB#pLrC}@EpCQzI){@ z3=gFE(AG_rP;*&pk`IJqf5wlYuWy|7bxCWr?N#J>3ch#>pU263;+@jEzqDg1%IBmo zNDx=y=7i~0sz&AAaG?eh0mcjh*#;VuK-r3id)xniVaopSK+oN@fH5(LsBQLJsD!PkCb)91UCd5N4pqCaM>hBKhRn^!xJ4@P+*J=w!t-7FbyO_Q&7iH6)2>XFsPZ9UmgO!m$on4N9m$$F)tW%b0*2Yz>hN*DgeW{kp1VnvFuwXT-Y#|6?{+$< zSATqPtpEgrbqmy>ZR-_BG&qok;gw82kjBxKOz{>mA4u~)u6#fFKf2fyp2Ulj>SJ=b z4v(iyE~6LEJcd&S-NwU+6;;vuiXl-~7v;Fa>GsN?qX~&<=^2~_R4YT+KH_T*M_67U=#r!J$ VQGUIc??0qp{|4_ZlaP%`008}xCc6Lt literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/archive-extract.svgz b/isis/appdata/images/icons/svg/archive-extract.svgz new file mode 100644 index 0000000000000000000000000000000000000000..3f0de142799b4da5c5697139bfbae52fa1d90659 GIT binary patch literal 6812 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 K#??d;ga81v4pMOd literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/archive-insert-directory.svgz b/isis/appdata/images/icons/svg/archive-insert-directory.svgz new file mode 100755 index 0000000000000000000000000000000000000000..4d125b8a7b67611cd8c03482b9dcbcf8024b12aa GIT binary patch literal 115956 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

pN$pbk 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 b$f{|ndW=Hng#jL)7ey{!2sJ2ECL{Y7A+r#E literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/blockdevice.svgz b/isis/appdata/images/icons/svg/blockdevice.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ea3d15696af9cd5e114d0fccb64f04491fa2776b GIT binary patch literal 3120 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/configure.svgz b/isis/appdata/images/icons/svg/configure.svgz new file mode 100644 index 0000000000000000000000000000000000000000..4057e8d5c07d40f7b5fbf7124c3adda4ccdb1913 GIT binary patch literal 4630 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 M503j-7laCh9DeODz17A3m|=){O$+Mp;5 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 literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/dialog-ok-apply.svgz b/isis/appdata/images/icons/svg/dialog-ok-apply.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e62b4d0afec10c3e11feba0c3c98b0d5aca0611e GIT binary patch literal 3480 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 GO#lE=>a8CD literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/dialog-warning.svgz b/isis/appdata/images/icons/svg/dialog-warning.svgz new file mode 100644 index 0000000000000000000000000000000000000000..94faed909f8e5efee7e0cdbd42eb4e5ad579c3b3 GIT binary patch literal 4805 zcmV;$5<2Z4iwFP!000000PS6EZyU*x{+?gKQ@+GFs#WhV+I0?hStJOshXXDN?&EvbZ=|&d)C1zCQTdU;lU*2a~Jy>|#DUUtTO;A6zUC{_Xd_`SxE94<~0g(YPT0x z$Mcid2iy9W*Q@ic-u&cfalUxJxL98uVZoz=zWPaD{lnr-SuL)X*Q=9F^Cu^}HCOY~ zTD2d^2kt6iW*z|@5gpbVhgY92*0Ya?7gxXC5v>Cp6D0sRs%3r6ht)d%cwTAv>|nam z-QFwpm-W9}fg7M~=6YHs7v*BHKKkyj-`y4-LYc4UJI&lM-wHf(6V zJb5#_s>42dw|u`in$Lbbn;$JdetNsOI9ji+FMc?xt)9=`oG*^5R<5tFj;`L%&d-mC zJ`&w)s?M=CH9xDm`}Xj|Y;{q!y42DCG#ujcdVP7l{@=yN_2ObPu1ZkP)~2|Vy9I|0 zEIwW?SL?&mv-3sm@-d^oGq%f%x1%k8oL^RrKrLe7I$Gt^u*&aiop0xh)2sTuUAA^7 zT|q6XYPXoJ{?^sdpa*{k*Pa(ms@ zV*Tm7veCf9+TwC`{9EWg-*nKjs^8iA(=mQ?(90}OPp=lWW9YEH*CrvFc`!M8cyCPY z?@n(co#9w#26)@qw@1TS|KcoS@*`M0Jv|YSr?QBtJ&RB54Ze9OjhOy|G#WmN#`bwK zjmD3pv3;IQqv;FMNcwU#lD{O4lrKjkSiBgG;P8Spg3}AqsP-rt=X!64c`%C_k7hCR z4vP;a(cr~M_lWEj=K^g@fL8Hvc{s9`Lx%@}=_H-IWorA+GWGbqsAq9c zXEsXI{?0gPq_Y>(MUt2EjASqA8R;cW8vJoI+DSZ_MrgtCV|#ltjrfAv7{)KQ!G!4x zZZKi~f;8%*!X2LRQ$ueKeO$D&m4!-DGJfzv}Pgc8QQIE<;52oYd!H&_^1h+}$)P>>Wb>!nv& zQNmaE`uW?%*}5K|UtcX&e`!b1|8?=Vt3|&aJ!`)h^P#w3&Ao31E5}kSG+b}dPZbp_ z<`_zST^g-hQG~{FBtC5N4_gXAC$cHjzj}uj2G$lvf;hEaa!EkU%6Vn;`Sdu9_v*3T z)#HHzhZY29!#fJx-;P#lnk$9f0P#U|QCKR(4PAsn%vCR=ut{jU^AHC1w8bCyNHJ$-0%QNn=P1~$i70v%9)F`I*u&JuWIbD+X( zQLiY)-E;~?BG5fvJ*)ppf&F=)4gFV^B+T>ymk3gvJO)$-6edNX0hQ#1)CKIzxUXj> zQ}-*T!H`TUE)$gD6b4A>m2TT!7Rj$rgF*a_2d@8o^B6PlI`0K7AKEf6jugUOp0 zj1-H(w1}cdQah5R;P+t@0V;x!k)CX71ewO^WW>0*B?RdS7z$c>qOT zgoIhBqeu#?qfj+5!7ilZ8lVwcQC7?6-u>#-4xu20dhciYCk+a9_>R_e^?_0$u=ip8 zvj_z=0Zm5sR{?mA{S}H!$Gz^|VFh4hhkY*n6Hwcue*#7W{Ua&>lI8<7M4(>nMr)l8 zYc*ZelBvLC575PIOOK*bwXZ}9cr#D~3=XYVX#tG2lq3phBu){dq%+6ERr3q7{L5{U zhhtnFj*-P~g)PztTs`w*KQGM|duevt=S&Gprhx48sC}hDQc(!Q^&zXX*>Db#3JW7u z?kT2}T*Q+3h1@8hC)tP>1=diy>qQ+EFx^JHC<+6NI#C3A7AMN;VPdr3i6Y2|6aB~X zE+1Lk3jheaJF^~LgN zLDgqjPjLbe%%53L^%vad(Quz@MDu}b6fLBzLkFo)LR`dpk2qHKbWnA0YWT1u4-LR= z3Wd`IL)-QhOlYQ4Dxl!RI%O`R8N@aJixS|;{%bfVOz^#yN{F${E=l4Z%{N$VXGzMwD3yuN zP33szxR*+Yf?{g1htEN!QBt3AmrUMk>zTuo5GkgdZUeI;D9IT~L$jlTmaIN7JCrQo zsbAjDiRNBEXTZa`Q|F3uF!i8fqGkh+Gg6hhSRzT)eQc?5^_ai&BYvSB;$S9jGN1M^p9zmm_s68d}^DUNG3w=Q>mo6)~3B8*J(Lp-Q`M zuQYU5w{Ly4_b=u@o-ID~?>)Sk-D=e3?Cqla`M56QY4_O{yjia1i`7k$b)P}e_7~>< zm6gVNO}&=qi>jL^i&_8xw?)@y^TnWSTd;id_sYyjNzYyz<85zHM$50>&F0Gw)%)Bn z{AszYHX_g;E{ei}pP%aiN&7S`eQMyoDA-jlmtty+ci*{4ONt^2}OY493R zlN%fQ1~Eo(Y5JHK7lhAiG+ZUt)nyCeN@c2W5{+z!em zK2zalh|ctx8g-QLnWDB_TRr{u{bD_v&(^bE3vUoVxCs;Hr^o;O-5+nw>g443f0nBs zdP`^(W^b0)bv&KSw%+{YxOu|a`uAt=t17g&&HlB%^!4pgUofb={&cyhz@XWiH|NIQ zzN`Pgr*op*Z_0#{lrT`gmSG3To_%jwON=2lCz>#AXu%#lnu0EStL=gNh6`FO%bV( z8f%rVr4gCn71aWSl#^O4fSOVGZlx`_C!#T;RmxZ0*e0Yu+Wtcc`1F)LvSXl;Q! zm=Z@9?Wf6LGi{2?!F&t$yH-{EW^&cdo}8Rqb^lJbMmMhUH>v}L10>wzo8AcSoe%ue z2>xjVzak?L)O?Z=JWS@k(Iv+}wd?<}c8z;ROhv-PZ$29yq}bQs86UV4=;yZpF#7to z0Ky``WHQvDLXPf26>aKb#GRR0M3`Ddy|`gU#WDh!n)*Y*2-iszboLP0YIP@^Re%It zH|md0+N{h$IEF?R9-=ffvM8CJAOmz{?4zC#WMp-RHB5%IG$Tte&jBsX2!VrgKubf7 zka|`+hzXN>RyNkkMzPCE=M=_vbd74Up{kHqL z$#F>jBa@3S6tTH^m`w>wct%(=Oe$g+hz(8kK%E#C3Xlp>ab>k^Tdz@2RADZeVz@Ca zB&N3effQCjYI^BKm;yGMZpKO*jM=19baFG_NQ;?OEQ*GTH|Z#Wn#SD*7AcGqf&xjg zH3`d%&VF4GWD5o5R(&OeyhmG;;3Z5Ydhyma3dwFS-4(MBhSMaJv>)~jqSjAuE2?Nc z5p^`?g&82Q=dAK=#ehttk!uKTgElQh;u&oXJPF-LSL^#xbUcf}2L*7Sjo{W}zlSNL zDBt`ZCaK~&rQ&8B-7jOF7%KHZ_rZ2#UxOXBAyuKx4EpE9U){H_bPt)5H2q=Rn3sxY za05+Qq*<4si}{qaup|mM^YUb2oRSq`Y1sEo?-9FW^R!}-9-Vz<5e-qCrk7w**+LmK z%`7AmmYpzxcE$;XBb#wH)PsPjqF9ufV?tB_cw=%@h+Qkjg-I=Fiy1{{UsBA4chP2F zS~3k}N4~Qc^z^=;4hv7o!H7C*6NKHdZ!y(=ik)ykWY5LM#0X3+d)_uSrU+u(7$#zu zY&M38X`9u7FvhVJ`+fu*4-6H><@6eDzR|i6s!&_{L)jm;vJSP^pl5)GLaT z%w&Ammsm-nV4Xx1jL4Y$`-C=_*o2FctL6kISpS+!0e3W=KBW3s>p$IB=BA)Gk|U*6 z{cd}>Uwl%9ZyFydt->ZF=KzV%qL7Jq6q1U983*N;SI8kX&3)8g=2j0qUQFuJXxl&h6HBrbmcF&z^h)`V7c(*ykBIYE+ zj^WhszneP=Va9?(| zKd0ND5bn<=zkIGczK>7=^90?7=9WUt-n|9ED%uVN)CxG6@v8@>Xwqe9MBjWqT4#KU zvb=mgM)wXqWy)C+(6aeGEFL?E!BntV==Peo`1kG3scqAiscvT(Gvxgt|! zG|UK-qhTrGKD8{_xsQ5bK*C*0XB7dO zXcPva&|9p@Dl`oP=N(k2UL`{`3=9&Y#YmzaUEl-|3cLxN7%HlF^V1Y3!`%cG3#u^M zFhO--Gae?WP|}1LhY6}NY4|Wh#YhJmMl@E^g_Z9{G?E!gjbM+=q(-m{g>M%^z{XZ= fJfJ~++yh469=)yqbBg*fZT$9N&6=MJZD-%cP literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/document-edit.svgz b/isis/appdata/images/icons/svg/document-edit.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ba96fde00b36e17c06c2a0db9c29d24b5fa7cc05 GIT binary patch literal 11441 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 H&qe?MI}*2P literal 0 HcmV?d00001 diff --git a/isis/appdata/images/icons/svg/document-open.svgz b/isis/appdata/images/icons/svg/document-open.svgz new file mode 100644 index 0000000000000000000000000000000000000000..0f271f93aa72f8cdb29ad44c0f8c876b236be331 GIT binary patch literal 210035 zcmV(qK<~dFiwFP!000000KB_bv-9Yc9(q5&0;hdr7u-Tlnvq?|frtbM5V$#o3?fG& z{CeYSNu!oW<5BDQ40r7+@=a^KD?Sgn_rLtlqicb0J};l4|HDtn@8F++yibSh)0cnv z>E%g3(?0>r8uwY;4t@TIpZeja|M@@u>0kbzpMM7UIgi&o1NP5a0czhYX*}k@f34Pa z{5=Hi`~JJnp9X(7%q8^SfS-T-=@03jZ=McaH}uOdJNxCo{A%%>75}>Whc-L*%OZqf7zjoo z6#e;L@$+)_Ykd6t*IREL|JGI%hGFQQ`^(C|Z`JRQ_BO@8tIRL6zm|TRf4qPHb;F+r zezy$UoaV*7Gyh$muaMvg|2p|I{JU(;es#>Bt^ZeY|H>tO+~vy{r}+Z?dHk3C`zKqg zI~q{>mycEcDXaA_pFi0je!B06{_^2hv4i|^_D?7M{$FR{-{JJ{5MX8~68>e$pH=>S zHl#mv_`^^4o9&0ke;&rX|J{A~_19n5BHmNfrjHO z^Zw^gddCBF?`z|v&7nA5Kfergaoa*Tec&|o*W$*${F~B_Y`lGdV8q{?J^yNUS~rh*$3?%ApAK!Cr?)@ic8|~Hr+-~=pYzvSF`D@Eq4%-NI*fl_`>zWB82tG@ zahQMqUtk!===h(185-`e_^jvek$?W_FMEcfSn^vi{Hw8Fg5lnA%OZaQp#N{u;J+me z`PQ|8BY8*lf1Vk!-%=d^R_^=;Gh)B3IQ~1C`uCa<`$vo8KVn82`weEyk~}Za zf7pyP@te%}x1{|BGt$)mwH`wf|8D8~RrJ%py@en#fzZ^yG3bBXK}Zt*?Hz=qm^_F7 zH);Qgv4;LOJcDIa@(;%v`djhLzm@hIVh#PjhiAy&)MnvdUjML_eq)=(a1y5f@xu0> z+Gb(;H< za*zLiHAe8iM`QRdswjgXx3(xw;wZ+@|NZA*z5mq;^mpX_`b{^veU~;rv~q84f&cnP zb^qI6>HD|t@n`yu5`VG!pBVnHhyEn>)qmFI4?k^7KD$324Osna$^ViEKOX$JdEB-6 zvH)v-tlOLe<2-ynS)KvO2}pCE|9OG;$NA-V>CpZ1^ygQH=$|z2m;Cp@pC9A^e|nMw z+{hH#d3+$PeVCCjmn z%BnkCv#bE2J14NLc#r*kzrf$Skad(l9{zvluz!2_&azLQ6-Cx@1lCnqfUWL{L*yXZ zVHJmE*;4(Z^k2QWGL`uI-W=O->=zPQQN35H_t5Je6Z!jOiQPpNVE32Iu_?#yr7xB2 zTXWQ>#D~4=y+TchB=HilXW6)p?*|V_LL$$>pGa0kU4~X+?Eg?gcEno=4xt+u(oL#Je?M@b9dZhzc)ROn2o*^Tmu*sNgy zbr+tB-!Y!4zU?t7YH0Q|#`cI4Pek=Khdn2B5k%QzW6f0HUO@4opIE8gZSJ8z9*{z!pc0UUu2jfVP$;}YBdn1?>iD*A6^d1s zCFp_%m3>Y}CjEZCKu+YoziJ!lx*vmgDV52Wp4Lg{^^j$OD*L4-KubV-X0`Op5s~a2 zO_ycu?p(K9DG*S<3m1Mq&(H(pAVM?sQk$k2U6WlC)&IQr4O`%yPK)lT%hYbm9dDbm ziv|HsC^=Mycgfbxq8|wjXW%l*y$;a@9(dW|LvBvSWYE9~aV7B_3Pq;Uuz2L+<$mM% zh~{g?fmo0qVrA{|4Yyc3XIVpr@b8B*4MrjSK?4UM$KZLf+h9N!jXf&$!=aT)5RxIP z3Bgx$n5MYnKXz4`G|I%6XfHZs7@*Q-Lz*K4(?dgHCJ907zCaRd(bXsuwSe5B=3{kM z(1OKE#_g$S$;$dHJH=9V4dXtUxw3m$Gjr2O1cZT5=9&>4z;8_z5dDn+KHPzBzm;KA zvK3vxyC=y-Rg}oDRhmtYMU4$BRt!;!x0k*oFGYYx}XybccH& zM1d?=;t7N*VzysEVtlph*m$V1+R}V$EZqivvG%m7J*y>tgbL~f4AQamQ9%tywjq3_ zNH%E0ZXo`#Ch92muer<61etBz6V0y;St8)K$%EUx_+D5+8Xly308SYzhIM z5XQ{xB@OkxXm-y}ITFwB6*d$HzB7ns0egm`S9<9_S;Vtb`nr!@mjH#nvat#g=iGx2 z2WfxTCavA2)ml%Xq8jPJufu7cpNs35%4sKGNG2XAiW(G{PZ2&J)3F={qDdZa8cqGB z;4?gR)m~%Q4Yt&=(t+F+7=ImTlXXqBjM`&oecEZ9gBXrO%Ya_jKbtjD&I`-li^`+l z>Otx9qGH)~jH4awdqr)JmzlhR(0S`>qzHFTU0K=^9gtv>w}=h!bu!0zM5jneSg^NlM_qgV z-6>T;RF3o%S+=?k&ecl7h3nZ`au+Zz|BWv&pXY;^wTS(gjh#DtZj~qEVUCn4q&?mrj$M?& zDT<&B>M^=D0(Uhcr_2Q!C%D|eDN3a{fO4SYC_Q}JG?d@M1mar59}SHv)b8uyV{<>2 zu!TO7f0bhxvN944`#KnERjpk1K2%3jNyl=dw;@RU1}P~4&;o(Ze_MK(SUMN{6`o`Rxprn*jaC-{tm zENh<-5VUqKLTk{hGa>B5T_uRMt>Es|!zpVXuR6?;9igq$ZiQ;cnWQ(T!Y(hvZw5X3 z6ikv0B?s-Y&QJg`UrBEQnx#+qbdc4K#FWRG zEnA+ScBsvo*DNsQoT9);;Qi@^X$itqgx`~xMD4rIVY-^O*bNL*oV~I_3PW|EJY4S* zgxBlLa@=)iBL480waE>cy~{0>W9|$TQ5!sI6OB;kVGv3!%la|K#5+1==V0Frwrh{s zd(K&oH~8>fXOpxfIHtTvDC+4*O*rN95Kl}$(g54&WEAx?`+PE$$3Eh{P2{S+`!CKx zGo^7o!UXjzTtVzc29%RESM&`{2p5t;C{=z^&1L0OnDVJ75XKvyTI6e7*K$Wp?}%nX zci_4hB3=ePHSg>jr!7lgMi{pQ)j(X|g3lmSC>Y2d>?iSxzi(W&8}tpt5@DT6wr8z~ zfTs{}dHVPgVLs&YE=$WEc1CxV1oNhF1>g0UtIcor&RLXY3!1AC;oE$I#;!E8^npjR zJen}=TPa6HJWVD#2qZ`drFAc)Oj!{6AV@u8m<-U!h-P1XXs`7iN*~685wwk+_*!vVd-v;p7TXn zV|9|Cn>aMUPHKwew!8684KVNI!TP8)v}%!GL}TvWfk(KVkwsN2-3;xVN%MI@JrxFG z@A58__Gk)Ipu8`6MxS4_4aP{1lxjnOax@bZ?qD-SYK>s`wZeqvQwWyg>WPJ(%XuT% zYkg|27hNLs1r=BX+1D0SW9(F&m<=A)Xb;y}$qGnC(+;&*3D4xcqOEXeva>V(4l`wd z&TGN!hxYAne2Md%5MA`MxREi)98vUjWY;7g&*aA9ci#~F9cZ>BI%)w47wOWR=wW?6 zkue5nFDC>{qXYqRWbFHC-#?(w=2(!{z27=#Ou+-O;IqSybw&yt(?D4V)=|Z%n$kX} zY+VFH+AERcw^0NtJ z3?tMR3<25Wl)hD6CzSy+)%8dfuJ2f0!0ek@bjtvBSY3eZph2Zh7y0W@zMi-1+v(dC zWXw%Gx)ck_yYWCd00z$^aTKDA0-`LwtTInUL=jIs?XF@Da%RIgkS!Go+%q$Ln${M? z*W+W!kG$(Le!xz~r7avE>thGfP3BFUF^+~;yw#XChdCc$Kbt{)F!IxTY>3t{0hYk^ z%WOAOo#^C^4r&{#;<-+Kb+Zt3d@^14_yYDL9S0mT43225*y&Ol!!_{BLfmMgoO08n z!r>Uuu||A&)o^GmCF4aO{F38pV=9AJ`X8Pn22>${nllXfeF$A>d?qmAED!5H)DwKn zPt+mVyU5V&C@maKOJt|RFtth=I=_+r#l>?H@n~ZxJkQh061{=;tZtZngY)Y9N!OVy zEQfN~fg+A}bjS;0O)8|IA*)X%9w$LDMaE8hAfO`BkCL z?%hy#$frB5s#1O5(5{)H@fN1Eve9NsH0dbd zCrYmxmUIx}a$t(`&1r-4AsKeFjqS0`H2B^7h1`+CYs#8P%%A*CT>vrla_aSX(Y+kWgzWW@vHY!=<| zXszYPYke6j7+zl-$ZmGE<(~&VC;MHQ=lm2Q7gYQ^%aO<39dY?b5(pFJ9d2RoI#W?8 zh~8mz5N;EFa+H|R(b)RWN<0A439zXA=;=$??*ykU%TcC!rYi#~*V4l}vL0rxx30;!=MQPeceWL_cG)E-^YQtOe-!=c$)?-oKcYi4~9C zu+K*!{Zji-TA(vnj?v_I@VJV(aqIpey2sXXbi_LncE;_ZDcbv;3R`u)3}8*-S! zO9Dy}MxvBQjS-wgeYPDe*C|$^Hvj|G9>38&yW0oaBdBf+?IjE7V7ifkYSN4j0@xBj z5hl3(mUq+^9T=*EaqCI%Sd}(zKhE9b$6ji={Klu@1N&xt@zO(d1isja_Z1kYCfTwPD`5EfUz-nU4DEZ%yJ z&j==hwhSD~&(C;Ttu01`7PL-4PfB0-U?y(A2*VqkJc_r6Y)2Z{96Ph{@7(F?oBs@` zn9Dc5*mr`fVItjDl9Ga|>7I#-ZZL?)Z31W#YMqc&-8J3NNLbpwL`%yGp9o+$-35R0 zUZ;>b!x~I%SfihWS1fkWZ!yqC4imZEy5if~D(3V8hWsY(AC!+1ww50xSEz4K zyoCA(AXavvk2!)G1g_IpH}q~KMR5lW!MK>gs?Q0Ap1!5Ku#A95*k8w-u@@T@a`~pG z$GyB?-F1k|9fVZT^zXKg?b9VFH$a`~XQYh?IdEPb#9@HL7;nx$GQIZ87^$H>%%qeoId{X+zplO?FqqPJ; z<-eM;dQbVTpV(`Xo4|ZOlvtpQYLj-m=DrR0U8k-1KE7iSouR#b5^DQi33@{w$4^Ui0=8PdAMJ|dHJesxYo$akqB9@SHbnh~&Cxn&5WDqrG6*15TP2^3iKgL#Gb!Qj&pr=8BRgS&V8iqs z4x{XjQPKs>UJ}nWd@B+u`!DnzKg=wvE5oCwyQ3Mi1=Imd*|i1!=I;6!%k>7<5UXw|%iZw?5lvg_Aw4R$f~y7iSMbc5*YTReFWrO> zCbbaKd4b_`r*6n+;WF27Wm3*Ax0Y9}^x_Sa6}oT=8@&6?c`DAp2Uuasb$Hv1BOfm~ zLmm7Q*YagncG`F_(+HjHhEBD=EG{#xIX(>u^tc<%a2G{G6kFb4W-`}Peh7Z4B+r76 zfMz%}6k16-5OHlJmsysQ!VvUqw*>9@mI(_!zFgJ5Tcs``v;0^kbQ6ja&-gM-tnkRv zcHj0UG@=@CNeO3=uF62}{cPJv8=5-LG(+g+$f4Yn*cKyQ@}Nles~1F8KJzXMvhp1j zlXSkQR+P1pjUeFtmsBju?)MBeu#B(ZDB{rCze_MG zlr}i;!k8>=>A;9mF|a|prn3{k_LemZDbN@{XBkmGB!Rp%rtx(3cIFPAuS_6fAwb&h z@j@>HWhzVP5t>Uz27F)4Gc%|!`I!ZTnuX>rvehw*BD57N^w2xp+a?R!U<63L^ znoOyNdZSK-?fthZE2G?Xwpa0-Zrk_D_6c>ww%OOAWrNtpl7R$#!o$6Z$j5tDc&H^c zO!t<{rT!NuaQ)@I{b^p{2@|x6hrWbPa6cZB9FV_5O;5a&k5A;3!lEdQ#0v2E@%Rk; zFqP=v@crh0g{oNZAz}2)qszKOsyP4p*2%WZP1RNwm5vJ&tg~Up%*#Dp8^B;WTB7j9 z63FLUck8Q>X97=!3!>MwMW&c9wgL-ur!^HXJ+P=ZXwDfsA z(MBf^wOMJvcnXs96l?7;9KMfi;V9p)o;k9V z!Cp7|iA2~%63>r_=>pygPJSWPdTSxtL)x-Yn|Wzjqv>B(<4_(IB$sTLM7HmQwhe*W z@wAzH(CPKaqQ6IHfRsfV#j#=nu;0zTs9^g2&U*_-N5L40hvHMRv02Y`sl1LqVrTw- za-0Lhcc=si)%vdZXmf=hq?Y#2*vN2?8f*+8I1pm3viCZY07rpqWhXXyi7MiXqh(e*skHgBXWv6QjOS;IF&q;NdqufZLRFfF^%yIoqe%F7C3d&Xh&waBte!b9k$a`v zjWQvcZ6tj^_udoX&?Lajcc^0m%hxCi8*l{&k=>SBheP^5{1~fzm9Mvf@1He za#yh1J0k^*sNW0lvALbQBmt3fUrX>Q|JqP4RE;b|eyfmbsHYHz6UDSK`|-qLm6g zx0tTBwWE$6B03v;^U^vs6}40M6IT;$K7gcN$#hSH`l8naK8<`B-AK^XcqEwX{lKY1 zf*tEtgeMAChSn2*69x`2<^WBVZJf{&5pkVf0I3YNBq-OJeTcunGt3;mz3~ zb?Miw-`Z5|Z6EmwrX-I{n4$udx%PePD@Ut(LY!`_yl?zwi7Z~x(e`{tiwE=->jX0$2mEKE!s~&5)2rug z3b;|AQ!L8saSliG+VVi3=$ws?yM1AuKtH?gW$p5C=d?xH-c!nT{4O3wOt{kXgSN)GT+Kg1$8SVMz+OJM_VS z`uDDwbD>!Mr9an7fj$l)hI2sx?W?Ua|VdAIc?6nITrWEP{L zQveF^^jO1u^wm@1}Xgj+rhziJTLfwWyCUAMzG!|M3~;=oRp@CEV+9@lVeI57 zMV5)&nhjx9BdbsCZSg7Q>m0L|ybt$Go}Wf~ zTgD@d=q1K?jl_AWo}=^ByNQsg;Xm^5t+MN;Yp7CnB2-Z?bfl66()#1QTnx3HH3Jp<-SKw7{+>Hs z%a8aqj=er>%MI)U%Qar2o-}$Cr7$ZUv|_8_8XhX#X;?VWew+$P<2qRLk+Fkaf;p59MN_vC7Yo3^-kKGd<@}15YMB; z6F$Flm}N}}K!vgQJ9;LQ79Fa-o6tTQE#2R9A6 zv)d!#)m8RL*k#=|zY&h#DQ21_K!(2e?ZRqd3Du`m*Y#U6LDuS~WTRP#L%58P#1d&S z8rEqH`S~b3#HVM*jZ4bBj<*~@pvc(5adH4#tkB@ikJEEaqiV62_&LtvWlG!xH&s_P zkqe8D=SVs0M-75)gM|qnL%6v+H6;&sWy+niMz6~IYQRzTw7`A2g?=ONb-~|sxo^tS zog#B~&nUhdPQ$C`;b+xn2n*V`l#8dTdrQx_%~?oiVJXQ~gSQKSyBSEFjX%dy3CqY6 zkYRh%i5)#j{IKy*K*;s*$Y;#C@)yT9{_ZiNv?0=iwtMa<4`B~7+V!FZzYi;h;=bq+ z*KEJZuXPy~!Dx`WD_uXbgeq=N9+(#cc^90z(uPhSNoNUas9dTc6y0F&F(KEzwxeQJ_Y`;G?3a-d zS~y!LYS1lnefNumWOcL3L>dgB^ClUu$_#8x}5RFBq z^+bznA~Y_#G$)(Vt($7)pU}>)d>?F8lt8;waHwyS2r<-EB`d(gz8}>p*wNb}Xikm? ziyq+%G_%X&n&!HpH&sqVlJ{moJ8890ZwsRs++dOb^QNb;Du(bNi{r6ZBk=K!2Cfz3 zj;Y{%ye|)awVlW`M)8!^a&>TahFI3p;|p>QgNU^Yns=qRpl4t&Prc+}D{o{;H$mA2 z!~^cNH{wPQAI#Hc;SxjEdX1y6_2C?Sc*mfQgZoqCQ}E6Fpoui}LD#3`UF!I>H^*pB z=aEc~qlduC*B&xhr1JQXHTk{ivcVEnVrUdw-E}4v!J7CO2Gd0y*FhWwmbam}iz-c* zUiLjO&O5?|qnlV<1gZzPE={?F?J9X63{~EEx+|&K-&CK7LdK<<&}ZSGG=kK&6jt6- z&MvJ&Vd9!s-;Y|&gX~&cBOZJJi`v;f*OzT}jj_Ed%G|KpyV^WbPg=+4gNB;yt{Bg@ zn(R(uZxk=K*a-R3NKLez`{fKFpVZib<6@I?$P;=eEG*>AP zrII0B@kKWFd*8UJFf-=23hw$ci(O2FYm5oZ88X@@;3C-Lrc%LEh)g-oE6DJ3m~Xis zU!nN0bs1ucEv?e;(nj6cZWwQJ)x)t>4mhBUyNbH;LiWU?n|B0QmGQV4#L?#+zTv@- zZ|&Bb)1emUW7uG&fSc`NsogEuf9$FmR96 zahccLC=0h68aTL!v{uyQVSI($Y(#1v`kPqxtp4z<4a<;y;9x;s_Eo-UXW7Jijs9r> zIk0U=NACjn6jSBY_4x4>7VZ^J8`aC-=qzQoMqw}|hLp^O~syThQHcV}O^W(dQro-oGnOs#(Q-F{JH)$fSes)Wgtl#G#8Nv>} z6BSBIi-0>}mcK@`h|K%(fh=rI$HEG!77P$!OmTSxL#}iXEkPv+2tBSseb8myW}$td zCTh(XL0M6`>vLOhU8B!c2#&X0{5(JJGQL5+Slk#J3e>x}o8y~HKjk~3Z-@`1A45t; zwNOA+8+A2(dwGxDBpOvb>?o>UgY;LCGIOjO`Mc6kLwUV3tUsWTwclq*zltd0G->WS za{$Kg_QxN96g3p< zrOqH<*61QT1Rk?3S;d_4bcaQFp`fSYGj)0t%5fO!-o1I{wk^RgJa-8RUv3!EO>kYX z5d+%ai)K-dBPDHvm$wISeT3@kiU(3y3eqyw!IPqLbzd{&lPFYr1DCx%ClE=fBY4%% zqlSnEN}gqU(#nx8o^_>&9qa}t%s__KKfWZT_rm@J)db^3YWg%?us5(!X>RY46E{v{ zhH9JiV*3X4i$Y;5HqfdoneM``1lgSaH@ci0-~(xdf=e1+bt=9_G)dQeggiNPh(6~P z7XN`)Q>nWwo$j7+tMSFmfM0}j9G+j&70w^vm~g4^4ijKx)HB{P5=srK64ik_K1cGp zZFO^*=pd@;m6Yp*IEd;?gP4i_|dTYC~8P0S4=elLNvXHthye+z;xyq z4K44ld?7!qyQ*&_p{*NS&h_@rY)+l^%^u;S>rou7Uk!mjKmPc7eJUIa0?KTYA!k2& zRv5rJ8Y>+O=#6N-o%GJK4d~J{q|L9CZ-vWhK0KRL&ED0Xf;EQX>r9;w(u}IByB0cO za~qMNENe}o1i-t}EyQrWPuO)o9HlN&qh`e?O*X08V ztLMUY={44+7vD-iue&(j$cVKsy08JrN&QWCDaXHrWuCyaAxsq&V_l{9L|G8wp(c_v zH|I_2lT3(2^;RRVubpPBxrj+c!V9G=O^xkn8-@{

TRUE @@ -581,6 +598,8 @@ End
  • MaximumIncidence
  • MinimumLocalTime
  • MaximumLocalTime
  • +
  • MinimumObliqueResolution
  • +
  • MaximumObliqueResolution
  • diff --git a/isis/src/base/apps/caminfo/main.cpp b/isis/src/base/apps/caminfo/main.cpp index 4fae601794..75d78ba34d 100644 --- a/isis/src/base/apps/caminfo/main.cpp +++ b/isis/src/base/apps/caminfo/main.cpp @@ -63,6 +63,12 @@ void IsisMain() { Process p; Cube *incube = p.SetInputCube("FROM"); + if (incube->hasGroup("Mapping")) { + QString msg = "Caminfo expects a level 1 input cube. For more information, see:\n" + "https://isis.astrogeology.usgs.gov/documents/Glossary/Glossary.html#Level1"; + throw IException(IException::Unknown, msg, _FILEINFO_); + } + // General data gathering general = new QList< QPair >; general->append(MakePair("Program", caminfo_program)); @@ -113,6 +119,10 @@ void IsisMain() { cg = camPvl.findGroup("LocalSolarTime", Pvl::Traverse); camstats->append(MakePair("LocalTimeMinimum", cg["localsolartimeMinimum"][0])); camstats->append(MakePair("LocalTimeMaximum", cg["localsolartimeMaximum"][0])); + + cg = camPvl.findGroup("ObliqueResolution", Pvl::Traverse); + camstats->append(MakePair("ObliqueResolutionMinimum", cg["ObliqueResolutionMinimum"][0])); + camstats->append(MakePair("ObliqueResolutionMaximum", cg["ObliqueResolutionMaximum"][0])); } // Compute statistics for entire cube @@ -248,7 +258,7 @@ void IsisMain() { bandGeom->setMaxEmission(maxema); } } - + bandGeom->collect(*cam, *incube, doGeometry, doPolygon, getFootBlob, precision); // Check if the user requires valid image center geometry @@ -427,7 +437,7 @@ void GenerateCSVOutput(Cube *incube, if (not appending) { keys.remove(QRegExp(delim + "$")); // Get rid of the extra delim char (",") outFile << keys << endl; - } + } values.remove(QRegExp(delim + "$")); // Get rid of the extra delim char (",") outFile << values << endl; outFile.close(); diff --git a/isis/src/base/apps/caminfo/tsts/csv/Makefile b/isis/src/base/apps/caminfo/tsts/csv/Makefile index 13215661ca..6a2a706440 100644 --- a/isis/src/base/apps/caminfo/tsts/csv/Makefile +++ b/isis/src/base/apps/caminfo/tsts/csv/Makefile @@ -7,9 +7,11 @@ commands: $(APPNAME) FROM=$(OUTPUT)/input.cub \ TO=$(OUTPUT)/temp.txt FORMAT=flat APPEND=false \ STATISTICS=true CAMSTATS=true GEOMETRY=true spice=true > /dev/null; + # Remove the trailing decimal place on numbers + # Replace the caminfo,version number | date with "caminfo,version | date" cat $(OUTPUT)/temp.txt | \ sed 's/\([0-9]*\.[0-9]\{4\}\)\([0-9]*\)/\1/g' | \ - sed 's/\([a-z]*\,\)\([0-9]\.[0-9]*\.[0-9]*\.[A-Za-z0-9]* [a-z]* | [0-9]\{4\}\-[0-9]\{2\}\-[0-9]\{2\}\)/\1/g' \ + sed 's/\([a-z]*\,\)\([0-9]\.[0-9]*\.[0-9]*.*| [0-9]\{4\}\-[0-9]\{2\}\-[0-9]\{2\}\)/\1version | date/g' \ > $(OUTPUT)/truth.txt; $(RM) $(OUTPUT)/temp.txt; $(RM) $(OUTPUT)/input.cub; diff --git a/isis/src/base/apps/campt/campt.cpp b/isis/src/base/apps/campt/campt.cpp new file mode 100644 index 0000000000..ade95bd3e3 --- /dev/null +++ b/isis/src/base/apps/campt/campt.cpp @@ -0,0 +1,268 @@ +#include "campt.h" + +#include +#include + +#include "Brick.h" +#include "Camera.h" +#include "CameraPointInfo.h" +#include "CSVReader.h" +#include "Distance.h" +#include "IException.h" +#include "iTime.h" +#include "Longitude.h" +#include "Progress.h" +#include "PvlGroup.h" +#include "SpecialPixel.h" +#include "TProjection.h" + +using namespace std; +using namespace Isis; + +namespace Isis{ + + QList< QPair > getPoints(const UserInterface &ui, bool usePointList); + QList getCameraPointInfo(const UserInterface &ui, + QList< QPair > points, + CameraPointInfo &campt); + void writePoints(const UserInterface &ui, QList camPoints, Pvl *log); + + void campt(UserInterface &ui, Pvl *log) { + Cube *cube = new Cube(ui.GetFileName("FROM"), "r"); + campt(cube, ui, log); + } + + void campt(Cube *cube, UserInterface &ui, Pvl *log) { + // Setup our input cube + CameraPointInfo campt; + + QString fileFormat = ui.GetString("FORMAT"); + if(fileFormat=="PVL") + campt.SetCSVOutput(false); + else + campt.SetCSVOutput(true); + + campt.SetCube(cube->fileName()); + + // Grab the provided points (coordinates) + QList< QPair > points = getPoints(ui, ui.WasEntered("COORDLIST")); + + // Get the camera point info for coordiante + QList camPoints = getCameraPointInfo(ui, points, campt); + + writePoints(ui, camPoints, log); + } + + + // We can grab our coordinates, either from the ui position parameters or the coordlist parameter + // This method returns a list of double pairs (i.e. a list of coordinates) + QList< QPair > getPoints(const UserInterface &ui, bool usePointList) { + double point1 = 0.0; + double point2 = 0.0; + QList< QPair > points; + QString pointType = ui.GetString("TYPE"); + + // Check if the provided coordinate list is valid, i.e. a Samp/Line or Lat/Long coordinate per row + if (usePointList) { + + CSVReader reader; + reader.read(FileName(ui.GetFileName("COORDLIST")).expanded()); + + if (!reader.isTableValid(reader.getTable()) || reader.columns() != 2) { + QString msg = "Coordinate file formatted incorrectly.\n" + "Each row must have two columns: a sample,line or a latitude,longitude pair."; + throw IException(IException::User, msg, _FILEINFO_); + } + + for (int row = 0; row < reader.rows(); row++) { + point1 = toDouble(reader.getRow(row)[0]); + point2 = toDouble(reader.getRow(row)[1]); + points.append(QPair(point1, point2)); + } + + } + // Grab the coordinate from the ui position parameters if no coordinate list is provided + else { + if (pointType == "IMAGE") { + if (ui.WasEntered("SAMPLE")) + point1 = ui.GetDouble("SAMPLE"); + if (ui.WasEntered("LINE")) + point2 = ui.GetDouble("LINE"); + } + else { + point1 = ui.GetDouble("LATITUDE"); + point2 = ui.GetDouble("LONGITUDE"); + } + points.append(QPair(point1, point2)); + } + + return points; + } + + + // Gets the camera information for each point (coordinate). + // Passed in a list of coordinates, passed in by reference a CameraPointInfo object. + // Returns a list of PvlGroup pointers - these groups contain the camera info for each coordinate. + QList getCameraPointInfo(const UserInterface &ui, + QList< QPair > points, + CameraPointInfo &campt) { + // Setup our parameters from ui and variables + QList cameraPoints; + bool usePointList = ui.WasEntered("COORDLIST"); + bool allowOutside = ui.GetBoolean("ALLOWOUTSIDE"); + QString type; + if (ui.WasEntered("COORDLIST")) { + type = ui.GetString("COORDTYPE"); + } + else { + type = ui.GetString("TYPE"); + } + PvlGroup *camPoint = NULL; + + // Depending on what type is selected, set values accordingly + for (int i = 0; i < points.size(); i++) { + + QPair pt = points[i]; + if (type == "GROUND") { + camPoint = campt.SetGround(pt.first, pt.second, allowOutside, usePointList); + } + else { + if (usePointList) { + camPoint = campt.SetImage(pt.first, pt.second, allowOutside, usePointList); + } + else { + if (ui.WasEntered("SAMPLE") && ui.WasEntered("LINE")) { + camPoint = campt.SetImage(pt.first, pt.second, allowOutside); + } + else { + if (ui.WasEntered("SAMPLE")) { + camPoint = campt.SetSample(pt.first, allowOutside); + } + else if (ui.WasEntered("LINE")) { + camPoint = campt.SetLine(pt.second, allowOutside); + } + else { + camPoint = campt.SetCenter(allowOutside); + } + } + } + } + cameraPoints.append(camPoint); + } + camPoint = NULL; + return cameraPoints; + } + + + // Write our point coordinates to std out in pvl format, or to a pvl or some type of flat file + void writePoints(const UserInterface &ui, QList camPoints, Pvl *log) { + // Progress should increment for each point we process + Progress prog; + prog.SetMaximumSteps(camPoints.size()); + QString outFile; + // Get user params from ui + if (ui.WasEntered("TO")) { + outFile = FileName(ui.GetFileName("TO")).expanded(); + } + bool append = ui.GetBoolean("APPEND"); + QString fileFormat = ui.GetString("FORMAT"); + PvlGroup *point = NULL; + + for (int p = 0; p < camPoints.size(); p++) { + bool fileExists = FileName(outFile).fileExists(); + + prog.CheckStatus(); + point = camPoints[p]; + + // Remove units on look direction vectors + point -> findKeyword("LookDirectionBodyFixed").setUnits(""); + point -> findKeyword("LookDirectionJ2000").setUnits(""); + point -> findKeyword("LookDirectionCamera").setUnits(""); + + // write to output file + if (ui.WasEntered("TO")) { + // Write the pvl group out to the file + if (fileFormat == "PVL") { + Pvl temp; + temp.setTerminator(""); + temp.addGroup((*point)); + + // we don't want to overwrite successive points in outfile + if (append || p > 0) { + temp.append(outFile); + } + else { + temp.write(outFile); + } + } + // Create a flatfile from PVL data + // The flatfile is comma delimited and can be imported into Excel + else { + ofstream os; + bool writeHeader = false; + if (append || p > 0) { + os.open(outFile.toLatin1().data(), ios::app); + if (!fileExists) { + writeHeader = true; + } + } + else { + os.open(outFile.toLatin1().data(), ios::out); + writeHeader = true; + } + + if (writeHeader) { + for (int i = 0; i < (*point).keywords(); i++) { + if ((*point)[i].size() == 3) { + os << (*point)[i].name() << "X," + << (*point)[i].name() << "Y," + << (*point)[i].name() << "Z"; + } + else { + os << (*point)[i].name(); + } + + if (i < point->keywords() - 1) { + os << ","; + } + } + os << endl; + } + + + + for (int i = 0; i < (*point).keywords(); i++) { + if ((*point)[i].size() == 3) { + os << (QString)(*point)[i][0] << "," + << (QString)(*point)[i][1] << "," + << (QString)(*point)[i][2]; + } + else { + os << (QString)(*point)[i]; + } + + if (i < (*point).keywords() - 1) { + os << ","; + } + } + os << endl; + } + } + + // No output file specified + else { + // don't log data - + if (ui.GetString("FORMAT") == "FLAT") { + string msg = "Flat file must have a name."; + throw IException(IException::User, msg, _FILEINFO_); + } + } + + // we still want to output the results + log->addGroup((*point)); + delete point; + point = NULL; + } + prog.CheckStatus(); + } +} diff --git a/isis/src/base/apps/campt/campt.h b/isis/src/base/apps/campt/campt.h new file mode 100644 index 0000000000..7e31d95a97 --- /dev/null +++ b/isis/src/base/apps/campt/campt.h @@ -0,0 +1,12 @@ +#ifndef campt_h +#define campt_h + +#include "Pvl.h" +#include "UserInterface.h" + +namespace Isis{ + extern void campt(Cube *cube, UserInterface &ui, Pvl *log); + extern void campt(UserInterface &ui, Pvl *log); +} + +#endif diff --git a/isis/src/base/apps/campt/main.cpp b/isis/src/base/apps/campt/main.cpp index 897b4742c2..7ebd2b3188 100644 --- a/isis/src/base/apps/campt/main.cpp +++ b/isis/src/base/apps/campt/main.cpp @@ -1,266 +1,27 @@ #include "Isis.h" -#include -#include +#include "campt.h" -#include "Brick.h" -#include "Camera.h" -#include "CameraPointInfo.h" -#include "CSVReader.h" -#include "Distance.h" -#include "IException.h" -#include "iTime.h" -#include "Longitude.h" -#include "Progress.h" -#include "PvlGroup.h" -#include "SpecialPixel.h" -#include "TProjection.h" +#include "Application.h" +#include "Pvl.h" using namespace std; using namespace Isis; -QList< QPair > getPoints(const UserInterface &ui, bool usePointList); -QList getCameraPointInfo(const UserInterface &ui, - QList< QPair > points, - CameraPointInfo &campt); -void writePoints(const UserInterface &ui, QList camPoints); - - - - void IsisMain() { UserInterface &ui = Application::GetUserInterface(); - - // Setup our input cube - CameraPointInfo campt; - - QString fileFormat = ui.GetString("FORMAT"); - if(fileFormat=="PVL") - campt.SetCSVOutput(false); - else - campt.SetCSVOutput(true); - - campt.SetCube( ui.GetFileName("FROM") + "+" + ui.GetInputAttribute("FROM").toString() ); - - // Grab the provided points (coordinates) - QList< QPair > points = getPoints(ui, ui.WasEntered("COORDLIST")); - - // Get the camera point info for coordiante - - QList camPoints = getCameraPointInfo(ui, points, campt); - - writePoints(ui, camPoints); -} - - -// We can grab our coordinates, either from the ui position parameters or the coordlist parameter -// This method returns a list of double pairs (i.e. a list of coordinates) -QList< QPair > getPoints(const UserInterface &ui, bool usePointList) { - double point1 = 0.0; - double point2 = 0.0; - QList< QPair > points; - QString pointType = ui.GetString("TYPE"); - - // Check if the provided coordinate list is valid, i.e. a Samp/Line or Lat/Long coordinate per row - if (usePointList) { - - CSVReader reader; - reader.read(FileName(ui.GetFileName("COORDLIST")).expanded()); - - if (!reader.isTableValid(reader.getTable()) || reader.columns() != 2) { - QString msg = "Coordinate file formatted incorrectly.\n" - "Each row must have two columns: a sample,line or a latitude,longitude pair."; - throw IException(IException::User, msg, _FILEINFO_); - } - - for (int row = 0; row < reader.rows(); row++) { - point1 = toDouble(reader.getRow(row)[0]); - point2 = toDouble(reader.getRow(row)[1]); - points.append(QPair(point1, point2)); - } - + Pvl appLog; + try { + campt(ui, &appLog); } - // Grab the coordinate from the ui position parameters if no coordinate list is provided - else { - if (pointType == "IMAGE") { - if (ui.WasEntered("SAMPLE")) - point1 = ui.GetDouble("SAMPLE"); - if (ui.WasEntered("LINE")) - point2 = ui.GetDouble("LINE"); - } - else { - point1 = ui.GetDouble("LATITUDE"); - point2 = ui.GetDouble("LONGITUDE"); + catch (...) { + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } - points.append(QPair(point1, point2)); - } - - return points; -} - - -// Gets the camera information for each point (coordinate). -// Passed in a list of coordinates, passed in by reference a CameraPointInfo object. -// Returns a list of PvlGroup pointers - these groups contain the camera info for each coordinate. -QList getCameraPointInfo(const UserInterface &ui, - QList< QPair > points, - CameraPointInfo &campt) { - // Setup our parameters from ui and variables - QList cameraPoints; - bool usePointList = ui.WasEntered("COORDLIST"); - bool allowOutside = ui.GetBoolean("ALLOWOUTSIDE"); - QString type; - if (ui.WasEntered("COORDLIST")) { - type = ui.GetString("COORDTYPE"); + throw; } - else { - type = ui.GetString("TYPE"); - } - PvlGroup *camPoint = NULL; - - // Depending on what type is selected, set values accordingly - for (int i = 0; i < points.size(); i++) { - - QPair pt = points[i]; - if (type == "GROUND") { - camPoint = campt.SetGround(pt.first, pt.second, allowOutside, usePointList); - } - else { - if (usePointList) { - camPoint = campt.SetImage(pt.first, pt.second, allowOutside, usePointList); - } - else { - if (ui.WasEntered("SAMPLE") && ui.WasEntered("LINE")) { - camPoint = campt.SetImage(pt.first, pt.second, allowOutside); - } - else { - if (ui.WasEntered("SAMPLE")) { - camPoint = campt.SetSample(pt.first, allowOutside); - } - else if (ui.WasEntered("LINE")) { - camPoint = campt.SetLine(pt.second, allowOutside); - } - else { - camPoint = campt.SetCenter(allowOutside); - } - } - } - } - cameraPoints.append(camPoint); - } - camPoint = NULL; - return cameraPoints; -} - - -// Write our point coordinates to std out in pvl format, or to a pvl or some type of flat file -void writePoints(const UserInterface &ui, QList camPoints) { - // Progress should increment for each point we process - Progress prog; - prog.SetMaximumSteps(camPoints.size()); - QString outFile; - // Get user params from ui - if (ui.WasEntered("TO")) { - outFile = FileName(ui.GetFileName("TO")).expanded(); - } - bool append = ui.GetBoolean("APPEND"); - QString fileFormat = ui.GetString("FORMAT"); - PvlGroup *point = NULL; - - for (int p = 0; p < camPoints.size(); p++) { - bool fileExists = FileName(outFile).fileExists(); - - prog.CheckStatus(); - point = camPoints[p]; - - // Remove units on look direction vectors - point -> findKeyword("LookDirectionBodyFixed").setUnits(""); - point -> findKeyword("LookDirectionJ2000").setUnits(""); - point -> findKeyword("LookDirectionCamera").setUnits(""); - - // write to output file - if (ui.WasEntered("TO")) { - // Write the pvl group out to the file - if (fileFormat == "PVL") { - Pvl temp; - temp.setTerminator(""); - temp.addGroup((*point)); - - // we don't want to overwrite successive points in outfile - if (append || p > 0) { - temp.append(outFile); - } - else { - temp.write(outFile); - } - } - // Create a flatfile from PVL data - // The flatfile is comma delimited and can be imported into Excel - else { - ofstream os; - bool writeHeader = false; - if (append || p > 0) { - os.open(outFile.toLatin1().data(), ios::app); - if (!fileExists) { - writeHeader = true; - } - } - else { - os.open(outFile.toLatin1().data(), ios::out); - writeHeader = true; - } - - if (writeHeader) { - for (int i = 0; i < (*point).keywords(); i++) { - if ((*point)[i].size() == 3) { - os << (*point)[i].name() << "X," - << (*point)[i].name() << "Y," - << (*point)[i].name() << "Z"; - } - else { - os << (*point)[i].name(); - } - - if (i < point->keywords() - 1) { - os << ","; - } - } - os << endl; - } - - - - for (int i = 0; i < (*point).keywords(); i++) { - if ((*point)[i].size() == 3) { - os << (QString)(*point)[i][0] << "," - << (QString)(*point)[i][1] << "," - << (QString)(*point)[i][2]; - } - else { - os << (QString)(*point)[i]; - } - - if (i < (*point).keywords() - 1) { - os << ","; - } - } - os << endl; - } - } - - // No output file specified - else { - // don't log data - - if (ui.GetString("FORMAT") == "FLAT") { - string msg = "Flat file must have a name."; - throw IException(IException::User, msg, _FILEINFO_); - } - } - - // we still want to output the results - Application::Log((*point)); - delete point; - point = NULL; + + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } - prog.CheckStatus(); -} +} \ No newline at end of file diff --git a/isis/src/base/apps/campt/tsts/default/Makefile b/isis/src/base/apps/campt/tsts/default/Makefile deleted file mode 100644 index dce682b213..0000000000 --- a/isis/src/base/apps/campt/tsts/default/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - cp $(INPUT)/output.txt $(OUTPUT)/camptTruth1.pvl; - $(APPNAME) \ - from=$(INPUT)/ab102401.cub \ - to=$(OUTPUT)/camptTruth1.pvl \ - > /dev/null; diff --git a/isis/src/base/apps/campt/tsts/errors/Makefile b/isis/src/base/apps/campt/tsts/errors/Makefile deleted file mode 100644 index 96d38794ec..0000000000 --- a/isis/src/base/apps/campt/tsts/errors/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# test for exceptions thrown -# the coordinate list is invalid if number of rows and columns don't match -# the coordinate list is invalid if there are not 2 columns -# no output file is provided when specifying the FORMAT as FLAT -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - -$(APPNAME) from=$(INPUT)/ab102401.cub \ - to=$(OUTPUT)/output.pvl \ - coordlist=$(INPUT)/badlist.csv \ - coordtype=IMAGE 2> $(OUTPUT)/errorsTruth.txt > /dev/null; - -$(APPNAME) from=$(INPUT)/ab102401.cub \ - to=$(OUTPUT)/output.pvl \ - coordlist=$(INPUT)/badcolumns.csv \ - coordtype=IMAGE 2>> $(OUTPUT)/errorsTruth.txt > /dev/null; - -$(APPNAME) from=$(INPUT)/ab102401.cub \ - format=FLAT 2>> $(OUTPUT)/errorsTruth.txt > /dev/null; diff --git a/isis/src/base/apps/campt/tsts/flat/Makefile b/isis/src/base/apps/campt/tsts/flat/Makefile deleted file mode 100644 index 10348e1008..0000000000 --- a/isis/src/base/apps/campt/tsts/flat/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from= $(INPUT)/ab102401.cub \ - to=$(OUTPUT)/camptTruthTemp.txt \ - format=FLAT \ - type=ground \ - latitude=34.444196777709 \ - longitude=223.84999971295 > /dev/null; - cut -d , -f 2- $(OUTPUT)/camptTruthTemp.txt >& $(OUTPUT)/camptTruth2.txt; - rm $(OUTPUT)/camptTruthTemp.txt; - cat $(OUTPUT)/camptTruth2.txt | \ - sed 's/\([0-9]*\.[0-9]\{7\}\)[0-9]*/\1/g' \ - > $(OUTPUT)/camptTruth3.txt; - $(MV) $(OUTPUT)/camptTruth3.txt $(OUTPUT)/camptTruth2.txt; diff --git a/isis/src/base/apps/campt/tsts/no_sample_line/Makefile b/isis/src/base/apps/campt/tsts/no_sample_line/Makefile deleted file mode 100644 index 167265bacb..0000000000 --- a/isis/src/base/apps/campt/tsts/no_sample_line/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# test for not providing a sample or line value (defaults to center) -# also tests for not providing a value to the TO parameter -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - > $(OUTPUT)/noSampleLineTruth.txt; - cat $(OUTPUT)/noSampleLineTruth.txt | \ - $(SED) 's/\([0-9]*\.[0-9]\{5\}\)[0-9]*/\1/g' | \ - $(SED) '/Filename.*/ { N; N; N; N; s/-\n[ ]*//g; }' | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/' \ - >& $(OUTPUT)/noSampleLineTruthtmp.txt; - $(MV) $(OUTPUT)/noSampleLineTruthtmp.txt \ - $(OUTPUT)/noSampleLineTruth.txt; diff --git a/isis/src/base/apps/campt/tsts/pointlist_append/Makefile b/isis/src/base/apps/campt/tsts/pointlist_append/Makefile deleted file mode 100644 index c24d460a92..0000000000 --- a/isis/src/base/apps/campt/tsts/pointlist_append/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - to=$(OUTPUT)/pointlistAppendTruth.pvl \ - coordtype=IMAGE > /dev/null; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - to=$(OUTPUT)/pointlistAppendTruth.pvl \ - coordtype=IMAGE > /dev/null; - cat $(OUTPUT)/pointlistAppendTruth.pvl | \ - $(SED) '/Filename.*/ { N; N; N; N; s/-\n[ ]*//g; }' | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/g' \ - > $(OUTPUT)/pointlistAppendTruthtmp.pvl; - $(MV) $(OUTPUT)/pointlistAppendTruthtmp.pvl \ - $(OUTPUT)/pointlistAppendTruth.pvl; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - format=FLAT coordtype=IMAGE \ - to=$(OUTPUT)/pointlistAppendTruth.csv > /dev/null; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - format=FLAT coordtype=IMAGE \ - to=$(OUTPUT)/pointlistAppendTruth.csv > /dev/null; - cat $(OUTPUT)/pointlistAppendTruth.csv | \ - $(SED) 's/^.*\(ab102401.cub\)\(.*\)/\1\2/g' \ - > $(OUTPUT)/pointlistAppendTruthtmp.csv; - $(MV) $(OUTPUT)/pointlistAppendTruthtmp.csv \ - $(OUTPUT)/pointlistAppendTruth.csv; diff --git a/isis/src/base/apps/campt/tsts/pointlist_error/Makefile b/isis/src/base/apps/campt/tsts/pointlist_error/Makefile deleted file mode 100644 index 2f0454dd0e..0000000000 --- a/isis/src/base/apps/campt/tsts/pointlist_error/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image_error.lis \ - to=$(OUTPUT)/pointlistErrorTruth.pvl \ - append=false coordtype=IMAGE > /dev/null; - cat $(OUTPUT)/pointlistErrorTruth.pvl | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/g' \ - > $(OUTPUT)/pointlistErrorTruthtmp.pvl; - $(MV) $(OUTPUT)/pointlistErrorTruthtmp.pvl \ - $(OUTPUT)/pointlistErrorTruth.pvl; diff --git a/isis/src/base/apps/campt/tsts/pointlist_flat/Makefile b/isis/src/base/apps/campt/tsts/pointlist_flat/Makefile deleted file mode 100644 index 7360cf45e9..0000000000 --- a/isis/src/base/apps/campt/tsts/pointlist_flat/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - to=$(OUTPUT)/pointlistFlatTruth.csv \ - format=FLAT coordtype=IMAGE \ - append=false > /dev/null; - cat $(OUTPUT)/pointlistFlatTruth.csv | \ - $(SED) 's/^.*\(ab102401.cub\)\(.*\)/\1\2/g' \ - > $(OUTPUT)/pointlistFlatTruthtmp.csv; - $(MV) $(OUTPUT)/pointlistFlatTruthtmp.csv \ - $(OUTPUT)/pointlistFlatTruth.csv; diff --git a/isis/src/base/apps/campt/tsts/pointlist_ground/Makefile b/isis/src/base/apps/campt/tsts/pointlist_ground/Makefile deleted file mode 100644 index 3ca35bba6d..0000000000 --- a/isis/src/base/apps/campt/tsts/pointlist_ground/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/ground.lis \ - to=$(OUTPUT)/pointlistGroundTruth.pvl \ - append=false coordtype=GROUND > /dev/null; - cat $(OUTPUT)/pointlistGroundTruth.pvl | \ - $(SED) '/Filename.*/ { N; N; N; N; s/-\n[ ]*//g; }' | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/g' \ - > $(OUTPUT)/pointlistGroundTruthtmp.pvl; - $(MV) $(OUTPUT)/pointlistGroundTruthtmp.pvl \ - $(OUTPUT)/pointlistGroundTruth.pvl; diff --git a/isis/src/base/apps/campt/tsts/pointlist_no_append/Makefile b/isis/src/base/apps/campt/tsts/pointlist_no_append/Makefile deleted file mode 100644 index 04f6789648..0000000000 --- a/isis/src/base/apps/campt/tsts/pointlist_no_append/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - to=$(OUTPUT)/pointlistNoAppendTruth.pvl \ - coordtype=IMAGE append=FALSE > /dev/null; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - to=$(OUTPUT)/pointlistNoAppendTruth.pvl \ - coordtype=IMAGE append=FALSE > /dev/null; - cat $(OUTPUT)/pointlistNoAppendTruth.pvl | \ - $(SED) '/Filename.*/ { N; N; N; N; s/-\n[ ]*//g; }' | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/g' \ - > $(OUTPUT)/pointlistNoAppendTruthtmp.pvl; - $(MV) $(OUTPUT)/pointlistNoAppendTruthtmp.pvl \ - $(OUTPUT)/pointlistNoAppendTruth.pvl; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - format=FLAT coordtype=IMAGE \ - to=$(OUTPUT)/pointlistNoAppendTruth.csv \ - append=FALSE > /dev/null; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - coordlist=$(INPUT)/image.lis \ - format=FLAT coordtype=IMAGE \ - to=$(OUTPUT)/pointlistNoAppendTruth.csv \ - append=FALSE > /dev/null; - cat $(OUTPUT)/pointlistNoAppendTruth.csv | \ - $(SED) 's/^.*\(ab102401.cub\)\(.*\)/\1\2/g' \ - > $(OUTPUT)/pointlistNoAppendTruthtmp.csv; - $(MV) $(OUTPUT)/pointlistNoAppendTruthtmp.csv \ - $(OUTPUT)/pointlistNoAppendTruth.csv; diff --git a/isis/src/base/apps/campt/tsts/setSL/Makefile b/isis/src/base/apps/campt/tsts/setSL/Makefile deleted file mode 100644 index f0be2cc9b9..0000000000 --- a/isis/src/base/apps/campt/tsts/setSL/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - to=$(OUTPUT)/output.pvl \ - sample=25 line=25 \ - append=false \ - > /dev/null; - cat $(OUTPUT)/output.pvl | \ - sed 's/\([0-9]*\.[0-9]\{9\}\)\([0-9]*\)/\1/g' \ - > $(OUTPUT)/temp.txt; - $(MV) $(OUTPUT)/temp.txt $(OUTPUT)/output.pvl; diff --git a/isis/src/base/apps/campt/tsts/set_sample_or_line/Makefile b/isis/src/base/apps/campt/tsts/set_sample_or_line/Makefile deleted file mode 100644 index f480412afd..0000000000 --- a/isis/src/base/apps/campt/tsts/set_sample_or_line/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# test setting either SAMPLE or LINE, not both together -APPNAME = campt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/ab102401.cub \ - to=$(OUTPUT)/onlySampleTruth.pvl \ - sample=10 > /dev/null; - cat $(OUTPUT)/onlySampleTruth.pvl | \ - $(SED) 's/\([0-9]*\.[0-9]\{5\}\)[0-9]*/\1/g' | \ - $(SED) '/Filename.*/ { N; N; N; N; s/-\n[ ]*//g; }' | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/' \ - > $(OUTPUT)/onlySampleTruthtmp.pvl; - $(MV) $(OUTPUT)/onlySampleTruthtmp.pvl \ - $(OUTPUT)/onlySampleTruth.pvl; - $(APPNAME) from=$(INPUT)/ab102401.cub \ - to=$(OUTPUT)/onlyLineTruth.pvl \ - line=10 > /dev/null; - cat $(OUTPUT)/onlyLineTruth.pvl | \ - $(SED) 's/\([0-9]*\.[0-9]\{5\}\)[0-9]*/\1/g' | \ - $(SED) '/Filename.*/ { N; N; N; N; s/-\n[ ]*//g; }' | \ - $(SED) 's/\(.*= \).*\(ab102401.cub\)/\1\2/' \ - > $(OUTPUT)/onlyLineTruthtmp.pvl; - $(MV) $(OUTPUT)/onlyLineTruthtmp.pvl \ - $(OUTPUT)/onlyLineTruth.pvl; diff --git a/isis/src/base/apps/camstats/camstats.cpp b/isis/src/base/apps/camstats/camstats.cpp new file mode 100644 index 0000000000..18d7635a81 --- /dev/null +++ b/isis/src/base/apps/camstats/camstats.cpp @@ -0,0 +1,227 @@ + +#include "camstats.h" +#include "Camera.h" +#include "CameraStatistics.h" +#include "Cube.h" +#include "Distance.h" +#include "IString.h" +#include "UserInterface.h" +#include "Process.h" +#include "Progress.h" +#include "Statistics.h" + + +using namespace std; +using namespace Isis; + +namespace Isis { + //function to build stats data + void buildStats(Camera *cam, int &sample, int &line); + void writeFlat(ofstream &os, const Statistics *s); + string valueToString(const double &value); + + /** + * Outputs camera statistics for a cube specified in ui parameters. + * + * @param ui UserInterface object containing camstats parameters + * @param(out) log the Pvl that camstat results log to + */ + void camstats(UserInterface &ui, Pvl *log) { + Process p; + + CubeAttributeInput cai; + Cube *icube = p.SetInputCube(ui.GetFileName("FROM"), cai, ReadWrite); + camstats(icube, ui, log); + + p.EndProcess(); + } + + + void camstats(Cube *icube, UserInterface &ui, Pvl *log) { + Process p; + p.SetInputCube(icube); + Camera *cam = icube->camera(); + + + QString from = icube->fileName(); + int sinc = ui.GetInteger("SINC"); + int linc = ui.GetInteger("LINC"); + CameraStatistics camStats(cam, sinc, linc, from); + + // Send the Output to the log area + Pvl statsPvl = camStats.toPvl(); + for (int i = 0; i < statsPvl.groups(); i++) { + log->addGroup(statsPvl.group(i)); + } + + if(ui.WasEntered("TO")) { + QString outfile = FileName(ui.GetFileName("TO")).expanded(); + bool exists = FileName(outfile).fileExists(); + bool append = ui.GetBoolean("APPEND"); + + // If the user chose a format of PVL, then write to the output file ("TO") + if(ui.GetString("FORMAT") == "PVL") { + (append) ? statsPvl.append(outfile) : statsPvl.write(outfile); + } + else { + // Create a flatfile of the data with columhn headings the flatfile is + // comma-delimited and can be imported in to spreadsheets + ofstream os; + bool writeHeader = true; + if(append) { + os.open(outfile.toLatin1().data(), ios::app); + if(exists) { + writeHeader = false; + } + } + else { + os.open(outfile.toLatin1().data(), ios::out); + } + + // if new file or append and no file exists then write header + if(writeHeader) { + os << "Filename," << + "LatitudeMinimum," << + "LatitudeMaximum," << + "LatitudeAverage," << + "LatitudeStandardDeviation," << + "LongitudeMinimum," << + "LongitudeMaximum," << + "LongitudeAverage," << + "LongitudeStandardDeviation," << + "SampleResolutionMinimum," << + "SampleResolutionMaximum," << + "SampleResolutionAverage," << + "SampleResolutionStandardDeviation," << + "LineResolutionMinimum," << + "LineResolutionMaximum," << + "LineResolutionAverage," << + "LineResolutionStandardDeviation," << + "ResolutionMinimum," << + "ResolutionMaximum," << + "ResolutionAverage," << + "ResolutionStandardDeviation," << + "AspectRatioMinimum," << + "AspectRatioMaximum," << + "AspectRatioAverage," << + "AspectRatioStandardDeviation," << + "PhaseMinimum," << + "PhaseMaximum," << + "PhaseAverage," << + "PhaseStandardDeviation," << + "EmissionMinimum," << + "EmissionMaximum," << + "EmissionAverage," << + "EmissionStandardDeviation," << + "IncidenceMinimum," << + "IncidenceMaximum," << + "IncidenceAverage," << + "IncidenceStandardDeviation," << + "LocalSolarTimeMinimum," << + "LocalSolarTimeMaximum," << + "LocalSolarTimeAverage," << + "LocalSolarTimeStandardDeviation," << + "LocalRadiusMaximum," << + "LocalRadiusMaximum," << + "LocalRadiusAverage," << + "LocalRadiusStandardDeviation," << + "NorthAzimuthMinimum," << + "NorthAzimuthMaximum," << + "NorthAzimuthAverage," << + "NorthAzimuthStandardDeviation," << + "ObliqueResolutionMinimum," << + "ObliqueResolutionMaximum," << + "ObliqueResolutionAverage," << + "ObliqueResolutionStandardDeviation," << + "ObliqueLineResolutionMinimum," << + "ObliqueLineResolutionMaximum," << + "ObliqueLineResolutionAverage," << + "ObliqueLineResolutionStandardDeviation," << + "ObliqueSampleResolutionMinimum," << + "ObliqueSampleResolutionMaximum," << + "ObliqueSampleResolutionAverage," << + "ObliqueSampleResolutionStandardDeviation," << endl; + + + } + os << FileName(from).expanded() << ","; + //call the function to write out the values for each group + writeFlat(os, camStats.getLatStat()); + writeFlat(os, camStats.getLonStat()); + writeFlat(os, camStats.getSampleResStat()); + writeFlat(os, camStats.getLineResStat()); + writeFlat(os, camStats.getResStat()); + writeFlat(os, camStats.getAspectRatioStat()); + writeFlat(os, camStats.getPhaseStat()); + writeFlat(os, camStats.getEmissionStat()); + writeFlat(os, camStats.getIncidenceStat()); + writeFlat(os, camStats.getLocalSolarTimeStat()); + writeFlat(os, camStats.getLocalRaduisStat()); + writeFlat(os, camStats.getNorthAzimuthStat()); + writeFlat(os,camStats.getObliqueResStat()); + writeFlat(os,camStats.getObliqueLineResStat()); + writeFlat(os,camStats.getObliqueSampleResStat()); + os << endl; + } + } + + if(ui.GetBoolean("ATTACH")) { + QString cam_name = "CameraStatistics"; + + //Creates new CameraStatistics Table + TableField fname("Name", Isis::TableField::Text, 45); + TableField fmin("Minimum", Isis::TableField::Double); + TableField fmax("Maximum", Isis::TableField::Double); + TableField favg("Average", Isis::TableField::Double); + TableField fstd("StandardDeviation", Isis::TableField::Double); + + TableRecord record; + record += fname; + record += fmin; + record += fmax; + record += favg; + record += fstd; + + Table table(cam_name, record); + + // Place all the gathered camera statistics in a table and attach it to the + // cube. Skip "User Parameters" group. + for (int i = 1; i < statsPvl.groups(); i++) { + PvlGroup &group = statsPvl.group(i); + + int entry = 0; + record[entry] = group.name(); + entry++; + for (int j = 0; j < group.keywords(); j++) { + record[entry] = toDouble(group[j][0]); + entry++; + } + table += record; + } + + icube->reopen("rw"); + icube->write(table); + p.WriteHistory(*icube); + icube->close(); + } + } + + + //function to write the stats values to flat file + void writeFlat(ofstream &os, const Statistics *s) { + os << valueToString(s->Minimum()) << "," << + valueToString(s->Maximum()) << "," << + valueToString(s->Average()) << "," << + valueToString(s->StandardDeviation()) << ","; + } + + + string valueToString(const double &value) { + if(IsSpecial(value)) { + return (string("NULL")); + } + else { + return ((string) IString(value)); + } + } +} diff --git a/isis/src/base/apps/camstats/camstats.h b/isis/src/base/apps/camstats/camstats.h new file mode 100644 index 0000000000..87c752bfa3 --- /dev/null +++ b/isis/src/base/apps/camstats/camstats.h @@ -0,0 +1,12 @@ +#ifndef camstats_h +#define camstats_h + +#include "Pvl.h" +#include "UserInterface.h" + +namespace Isis{ + extern void camstats(UserInterface &ui, Pvl *log); + extern void camstats(Cube *icube, UserInterface &ui, Pvl *log); +} + +#endif diff --git a/isis/src/base/apps/camstats/main.cpp b/isis/src/base/apps/camstats/main.cpp index dbdb39781b..9dce944739 100644 --- a/isis/src/base/apps/camstats/main.cpp +++ b/isis/src/base/apps/camstats/main.cpp @@ -1,211 +1,27 @@ #include "Isis.h" -#include "Camera.h" -#include "CameraStatistics.h" -#include "Cube.h" -#include "Distance.h" -#include "IString.h" -#include "UserInterface.h" -#include "Process.h" -#include "Progress.h" -#include "Statistics.h" +#include "camstats.h" +#include "Application.h" +#include "Pvl.h" using namespace std; using namespace Isis; -//function to build stats data -void buildStats(Camera *cam, int &sample, int &line); -void writeFlat(ofstream &os, const Statistics *s); -string valueToString(const double &value); - - void IsisMain() { - Process p; - Cube *icube = p.SetInputCube("FROM"); - Camera *cam = icube->camera(); - UserInterface &ui = Application::GetUserInterface(); - - QString from = ui.GetFileName("FROM"); - int sinc = ui.GetInteger("SINC"); - int linc = ui.GetInteger("LINC"); - CameraStatistics camStats(cam, sinc, linc, from); - - // Send the Output to the log area - Pvl statsPvl = camStats.toPvl(); - for (int i = 0; i < statsPvl.groups(); i++) { - Application::Log(statsPvl.group(i)); + Pvl appLog; + try { + camstats(ui, &appLog); } - - if(ui.WasEntered("TO")) { - QString outfile = FileName(ui.GetFileName("TO")).expanded(); - bool exists = FileName(outfile).fileExists(); - bool append = ui.GetBoolean("APPEND"); - - // If the user chose a format of PVL, then write to the output file ("TO") - if(ui.GetString("FORMAT") == "PVL") { - (append) ? statsPvl.append(outfile) : statsPvl.write(outfile); - } - else { - // Create a flatfile of the data with columhn headings the flatfile is - // comma-delimited and can be imported in to spreadsheets - ofstream os; - bool writeHeader = true; - if(append) { - os.open(outfile.toLatin1().data(), ios::app); - if(exists) { - writeHeader = false; - } - } - else { - os.open(outfile.toLatin1().data(), ios::out); - } - - // if new file or append and no file exists then write header - if(writeHeader) { - os << "Filename," << - "LatitudeMinimum," << - "LatitudeMaximum," << - "LatitudeAverage," << - "LatitudeStandardDeviation," << - "LongitudeMinimum," << - "LongitudeMaximum," << - "LongitudeAverage," << - "LongitudeStandardDeviation," << - "SampleResolutionMinimum," << - "SampleResolutionMaximum," << - "SampleResolutionAverage," << - "SampleResolutionStandardDeviation," << - "LineResolutionMinimum," << - "LineResolutionMaximum," << - "LineResolutionAverage," << - "LineResolutionStandardDeviation," << - "ResolutionMinimum," << - "ResolutionMaximum," << - "ResolutionAverage," << - "ResolutionStandardDeviation," << - "AspectRatioMinimum," << - "AspectRatioMaximum," << - "AspectRatioAverage," << - "AspectRatioStandardDeviation," << - "PhaseMinimum," << - "PhaseMaximum," << - "PhaseAverage," << - "PhaseStandardDeviation," << - "EmissionMinimum," << - "EmissionMaximum," << - "EmissionAverage," << - "EmissionStandardDeviation," << - "IncidenceMinimum," << - "IncidenceMaximum," << - "IncidenceAverage," << - "IncidenceStandardDeviation," << - "LocalSolarTimeMinimum," << - "LocalSolarTimeMaximum," << - "LocalSolarTimeAverage," << - "LocalSolarTimeStandardDeviation," << - "LocalRadiusMaximum," << - "LocalRadiusMaximum," << - "LocalRadiusAverage," << - "LocalRadiusStandardDeviation," << - "NorthAzimuthMinimum," << - "NorthAzimuthMaximum," << - "NorthAzimuthAverage," << - "NorthAzimuthStandardDeviation," << - "ObliqueResolutionMinimum," << - "ObliqueResolutionMaximum," << - "ObliqueResolutionAverage," << - "ObliqueResolutionStandardDeviation," << - "ObliqueLineResolutionMinimum," << - "ObliqueLineResolutionMaximum," << - "ObliqueLineResolutionAverage," << - "ObliqueLineResolutionStandardDeviation," << - "ObliqueSampleResolutionMinimum," << - "ObliqueSampleResolutionMaximum," << - "ObliqueSampleResolutionAverage," << - "ObliqueSampleResolutionStandardDeviation," << endl; - - - } - os << FileName(from).expanded() << ","; - //call the function to write out the values for each group - writeFlat(os, camStats.getLatStat()); - writeFlat(os, camStats.getLonStat()); - writeFlat(os, camStats.getSampleResStat()); - writeFlat(os, camStats.getLineResStat()); - writeFlat(os, camStats.getResStat()); - writeFlat(os, camStats.getAspectRatioStat()); - writeFlat(os, camStats.getPhaseStat()); - writeFlat(os, camStats.getEmissionStat()); - writeFlat(os, camStats.getIncidenceStat()); - writeFlat(os, camStats.getLocalSolarTimeStat()); - writeFlat(os, camStats.getLocalRaduisStat()); - writeFlat(os, camStats.getNorthAzimuthStat()); - writeFlat(os,camStats.getObliqueResStat()); - writeFlat(os,camStats.getObliqueLineResStat()); - writeFlat(os,camStats.getObliqueSampleResStat()); - os << endl; + catch (...) { + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } + throw; } - if(ui.GetBoolean("ATTACH")) { - - QString cam_name = "CameraStatistics"; - - //Creates new CameraStatistics Table - TableField fname("Name", Isis::TableField::Text, 45); - TableField fmin("Minimum", Isis::TableField::Double); - TableField fmax("Maximum", Isis::TableField::Double); - TableField favg("Average", Isis::TableField::Double); - TableField fstd("StandardDeviation", Isis::TableField::Double); - - TableRecord record; - record += fname; - record += fmin; - record += fmax; - record += favg; - record += fstd; - - Table table(cam_name, record); - - // Place all the gathered camera statistics in a table and attach it to the - // cube. Skip "User Parameters" group. - for (int i = 1; i < statsPvl.groups(); i++) { - PvlGroup &group = statsPvl.group(i); - - int entry = 0; - record[entry] = group.name(); - entry++; - for (int j = 0; j < group.keywords(); j++) { - record[entry] = toDouble(group[j][0]); - entry++; - } - table += record; - } - - icube->reopen("rw"); - icube->write(table); - p.WriteHistory(*icube); - icube->close(); - } -} - - -//function to write the stats values to flat file -void writeFlat(ofstream &os, const Statistics *s) { - os << valueToString(s->Minimum()) << "," << - valueToString(s->Maximum()) << "," << - valueToString(s->Average()) << "," << - valueToString(s->StandardDeviation()) << ","; -} - - -string valueToString(const double &value) { - if(IsSpecial(value)) { - return (string("NULL")); - } - else { - return ((string) IString(value)); + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } } diff --git a/isis/src/base/apps/camstats/tsts/default/Makefile b/isis/src/base/apps/camstats/tsts/default/Makefile deleted file mode 100644 index 2943d9690c..0000000000 --- a/isis/src/base/apps/camstats/tsts/default/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -APPNAME = camstats - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/input.cub TO=$(OUTPUT)/output.pvl > /dev/null; - $(CP) $(INPUT)/input.cub $(OUTPUT)/attached.cub; - $(APPNAME) FROM=$(OUTPUT)/attached.cub ATTACH=true > /dev/null; diff --git a/isis/src/base/apps/ckwriter/CkSpiceSegment.cpp b/isis/src/base/apps/ckwriter/CkSpiceSegment.cpp index cf69304475..192671dff1 100644 --- a/isis/src/base/apps/ckwriter/CkSpiceSegment.cpp +++ b/isis/src/base/apps/ckwriter/CkSpiceSegment.cpp @@ -222,12 +222,9 @@ void CkSpiceSegment::import(Cube &cube, const QString &tblname) { _endTime = _times[size(_times)-1]; // Load necessary kernels (IAK for Cassini, mainly) - _kernels.Load("FK,SCLK,LSK,IAK"); - -// _kernels.Load("FK,SCLK,LSK,IAK,SPK"); -// QStringList loaded = _kernels.getLoadedList(); -// cout << "\nKernels prior to conversion...\n" << loaded.join("\n"); + _kernels.Load("CK,FK,SCLK,LSK,IAK"); + _kernels.getLoadedList(); // Here's where all the heavy lifting occurs. SMatSeq lmats, rmats; @@ -263,11 +260,7 @@ void CkSpiceSegment::import(Cube &cube, const QString &tblname) { _utcStartTime = toUTC(startTime()); _utcEndTime = toUTC(endTime()); - _kernels.UnLoad("FK,SCLK,LSK,IAK"); - -// _kernels.UnLoad("FK,SCLK,LSK,IAK,SPK"); -// loaded = _kernels.getLoadedList(); -// cout << "\nKernels after unloading...\n" << loaded.join("\n"); + _kernels.UnLoad("CK,FK,SCLK,LSK,IAK"); } catch ( IException &ie ) { ostringstream mess; @@ -498,8 +491,6 @@ CkSpiceSegment::SMatrix CkSpiceSegment::computeStateRotation(const QString &fram double etTime) const { SMatrix state(6,6); NaifStatus::CheckErrors(); -// cout << "StateRotations for frame1 = " << frame1 -// << " to frame2 = " << frame2 << "\n"; try { // Get pointing w/AVs @@ -548,7 +539,6 @@ CkSpiceSegment::SMatrix CkSpiceSegment::computeChainRotation( SpiceInt fromId = chain[i]; QString CfromId = getFrameName(fromId); QString CtoId = getFrameName(toId); -// cout << "FromFrame: " << CfromId << ", ToFrame: " << CtoId << "\n"; SMatrix left = computeStateRotation(CtoId, CfromId, etTime); NaifStatus::CheckErrors(); mxmg_c(left[0], state[0], 6, 6, 6, state[0]); @@ -587,8 +577,6 @@ void CkSpiceSegment::getRotationMatrices(Cube &cube, Camera &camera, Table &tabl // Set CK instrument code _instCode = leftId; - // Load SPICE and extract necessary contents - Spice mySpice(cube, true); // load w/out tables _instFrame = getFrameName(leftId); _refFrame = getFrameName(rightId); diff --git a/isis/src/base/apps/ckwriter/CkSpiceSegment.h b/isis/src/base/apps/ckwriter/CkSpiceSegment.h index e25a40589d..7bb0c001dc 100644 --- a/isis/src/base/apps/ckwriter/CkSpiceSegment.h +++ b/isis/src/base/apps/ckwriter/CkSpiceSegment.h @@ -83,6 +83,9 @@ class PvlObject; * * @history 2015-07-21 Kristin Berry - Added NaifStatus::CheckErrors() to see if any NAIF errors * were signaled. References #2248. + * + * @history 2019-12-05 Adam Paquette - Changed how kernels are loaded so CkSpiceSegment + * no longer needs to use the Spice class. */ class CkSpiceSegment { public: diff --git a/isis/src/base/apps/ckwriter/ckwriter.xml b/isis/src/base/apps/ckwriter/ckwriter.xml index 970ea64b57..a6232b87c1 100644 --- a/isis/src/base/apps/ckwriter/ckwriter.xml +++ b/isis/src/base/apps/ckwriter/ckwriter.xml @@ -244,7 +244,7 @@ Segment (by file) Summary ckwriter on MESSENGER MDIS images that are covered in the kernel:
    
     ckwriter from=EN0131771668M.cub to=EN0131771668M.bc
    -set extra = ls -1t $ISIS3DATA/messenger/kernels/ck/*_mdis_pivot_pvtres.bc | head -1
    +set extra = ls -1t $ISISDATA/messenger/kernels/ck/*_mdis_pivot_pvtres.bc | head -1
     spiceinit from=EN0131771668M.cub ck=EN0131771668M.bc extra=$extra        
             
    Note that this form of the spiceinit command can only be used on diff --git a/isis/src/base/apps/ckwriter/tsts/lronac/Makefile b/isis/src/base/apps/ckwriter/tsts/lronac/Makefile index 4d8658120a..9a30c4acb8 100644 --- a/isis/src/base/apps/ckwriter/tsts/lronac/Makefile +++ b/isis/src/base/apps/ckwriter/tsts/lronac/Makefile @@ -1,35 +1,56 @@ APPNAME = ckwriter -BASES = $(basename $(notdir $(wildcard $(INPUT)/*.cub))) - include $(ISISROOT)/make/isismake.tsts -.PHONY: commands - -commands: $(BASES) - $(RM) $(OUTPUT)/lrock.bc - -# Only use 12 digits in the output of tabledump due to precision issues -$(BASES): $(OUTPUT)/lrock.bc - $(CP) $(INPUT)/$@.cub $(OUTPUT) - $(RM) $(OUTPUT)/extra.ck - getkey from=$(INPUT)/$@.cub objnam=isiscube grpname=Kernels keyword=InstrumentPointing keyindex=2 > $(OUTPUT)/extra.ck; - spiceinit from=$(OUTPUT)/$@.cub ck=$(OUTPUT)/lrock.bc extra=`cat $(OUTPUT)/extra.ck` > /dev/null; - tabledump from=$(OUTPUT)/$@.cub to=$(OUTPUT)/$@.dat \ - name=InstrumentPointing > /dev/null; - cat $(OUTPUT)/$@.dat \ - | sed 's/\([0-9][0-9]*\.[0-9]\{12\}\)\([0-9][0-9]*\)/\1/g' \ - > $(OUTPUT)/$@.txt; - $(RM) $(OUTPUT)/$@.cub - $(RM) $(OUTPUT)/$@.dat - $(RM) $(OUTPUT)/extra.ck - -ck: $(OUTPUT)/lrock.bc - -$(OUTPUT)/lrock.bc: - mkdir -p $(OUTPUT); - ls -1 $(INPUT)/*.cub > $(OUTPUT)/files.lis; - $(APPNAME) FROMLIST=$(OUTPUT)/files.lis TO=$@ > /dev/null; +commands: + # Steup and create output CK from ckwriter + $(CP) $(INPUT)/*.cub $(OUTPUT) + ls -1 $(OUTPUT)/*.cub > $(OUTPUT)/files.lis; + + # It is necessary to spiceinit the input cubes fixing all the kernels except for the sclks. + # All but the last 10 sclks are cleaned up from the kernels area, and a changing sclk + # is unlikely to affect the resulting position / pointing (unlike the other kernels, which + # are fixed for the purposes of this test.) + spiceinit from=$(OUTPUT)/M103189611LE.cub \ + ls='$$base/kernels/lsk/naif0012.tls' \ + pck='($$base/kernels/pck/pck00009.tpc,$$lro/kernels/pck/moon_080317.tf,$$lro/kernels/pck/moon_assoc_me.tf)' \ + tspk='($$lro/kernels/tspk/moon_pa_de421_1900-2050.bpc,$$lro/kernels/tspk/de421.bsp)' \ + ik='$$lro/kernels/ik/lro_lroc_v18.ti' \ + ck='($$lro/kernels/ck/lrolc_2009181_2009213_v10.bc, $$lro/kernels/ck/moc42r_2009181_2009213_v14.bc)' \ + spk='$$lro/kernels/spk/fdf29r_2009182_2009213_v01.bsp' \ + fk='$$lro/kernels/fk/lro_frames_2014049_v01.tf' \ + iak='$$lro/kernels/iak/lro_instrumentAddendum_v04.ti' \ + shape=user \ + model='$$base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub' >/dev/null 2>&1; + + spiceinit from=$(OUTPUT)/M136241759RE.cub \ + ls='$$base/kernels/lsk/naif0012.tls' \ + pck='($$base/kernels/pck/pck00009.tpc,$$lro/kernels/pck/moon_080317.tf,$$lro/kernels/pck/moon_assoc_me.tf)' \ + tspk='($$lro/kernels/tspk/moon_pa_de421_1900-2050.bpc,$$lro/kernels/tspk/de421.bsp)' \ + ik='$$lro/kernels/ik/lro_lroc_v18.ti' \ + ck='($$lro/kernels/ck/lrolc_2010212_2010244_v03.bc,$$lro/kernels/ck/moc42r_2010212_2010244_v04.bc)' \ + spk='$$lro/kernels/spk/fdf29r_2010213_2010244_v50.bsp' \ + fk='$$lro/kernels/fk/lro_frames_2014049_v01.tf' \ + iak='$$lro/kernels/iak/lro_instrumentAddendum_v04.ti' \ + shape=user \ + model='$$base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub' >/dev/null 2>&1; + + $(APPNAME) FROMLIST=$(OUTPUT)/files.lis TO=$(OUTPUT)/lroc.bc > /dev/null; $(RM) $(OUTPUT)/files.lis + frmdiff -t basic -k $(INPUT)/naif0012.tls $(INPUT)/lro_clkcor_2019331_v00.tsc $(INPUT)/lro_frames_2014049_v01.tf -s 1 $(OUTPUT)/lroc.bc $(INPUT)/lroc.bc > $(OUTPUT)/diff_output.txt + echo "Group=Tolerance" >> $(OUTPUT)/tolerance.pvl + echo -n " Max=" >> $(OUTPUT)/tolerance.pvl + egrep -o "[-+]*[0-9]*\.[0-9]*E[-+][0-9]*" $(OUTPUT)/diff_output.txt | head -n 1 >> $(OUTPUT)/tolerance.pvl + echo -n " Average=" >> $(OUTPUT)/tolerance.pvl + egrep -o "[-+]*[0-9]*\.[0-9]*E[-+][0-9]*" $(OUTPUT)/diff_output.txt | tail -n 1 >> $(OUTPUT)/tolerance.pvl + echo "End_Group" >> $(OUTPUT)/tolerance.pvl + echo "End" >> $(OUTPUT)/tolerance.pvl + + $(RM) $(OUTPUT)/M103189611LE.cub; + $(RM) $(OUTPUT)/M136241759RE.cub; + $(RM) $(OUTPUT)/diff_output.txt; + $(RM) $(OUTPUT)/lroc.bc; + $(RM) $(OUTPUT)/extra.ck; + diff --git a/isis/src/base/apps/ckwriter/tsts/messenger/Makefile b/isis/src/base/apps/ckwriter/tsts/messenger/Makefile index 6dbc9b10c1..44dc61ecab 100644 --- a/isis/src/base/apps/ckwriter/tsts/messenger/Makefile +++ b/isis/src/base/apps/ckwriter/tsts/messenger/Makefile @@ -1,6 +1,6 @@ APPNAME = ckwriter BASES = $(basename $(notdir $(wildcard $(INPUT)/*.cub))) -EXTRA = $(shell ls -1t $(ISIS3DATA)/messenger/kernels/ck/*_mdis_gm040819_150430v1.bc | head -1) +EXTRA = $(shell ls -1t $(ISISDATA)/messenger/kernels/ck/*_mdis_gm040819_150430v1.bc | head -1) include $(ISISROOT)/make/isismake.tsts diff --git a/isis/src/base/apps/crop/crop.cpp b/isis/src/base/apps/crop/crop.cpp index 0c7a9d0209..a2e58b8fd1 100644 --- a/isis/src/base/apps/crop/crop.cpp +++ b/isis/src/base/apps/crop/crop.cpp @@ -3,208 +3,231 @@ #include "crop.h" using namespace std; -using namespace Isis; - -PvlGroup crop(UserInterface &ui) { - // Globals and prototypes - int ss, sl, sb; - int ns, nl, nb; - int sinc, linc; - - Cube *cube = NULL; - LineManager *in = NULL; - - // Line processing routine - auto cropProccess = [&](Buffer &out)->void { - // Read the input line - int iline = sl + (out.Line() - 1) * linc; - in->SetLine(iline, sb); - cube->read(*in); - - // Loop and move appropriate samples - for(int i = 0; i < out.size(); i++) { - out[i] = (*in)[(ss - 1) + i * sinc]; - } - if(out.Line() == nl) sb++; - }; - - ProcessByLine p; - - // Open the input cube - QString from = ui.GetAsString("FROM"); - CubeAttributeInput inAtt(from); - cube = new Cube(); - cube->setVirtualBands(inAtt.bands()); - from = ui.GetFileName("FROM"); - cube->open(from); - - // Determine the sub-area to extract - ss = ui.GetInteger("SAMPLE"); - sl = ui.GetInteger("LINE"); - sb = 1; - - int origns = cube->sampleCount(); - int orignl = cube->lineCount(); - int es = cube->sampleCount(); - if (ui.WasEntered("NSAMPLES")) es = ss + ui.GetInteger("NSAMPLES") - 1; - int el = cube->lineCount(); - if (ui.WasEntered("NLINES")) el = sl + ui.GetInteger("NLINES") - 1; - int eb = cube->bandCount(); - - sinc = ui.GetInteger("SINC"); - linc = ui.GetInteger("LINC"); - - // Make sure starting positions fall within the cube - if (ss > cube->sampleCount()) { - cube->close(); - QString msg = "[SAMPLE] exceeds number of samples in the [FROM] cube"; - throw IException(IException::User, msg, _FILEINFO_); +namespace Isis { + + + + /** + * Crop a cube along a line, sample range. This is the programmatic interface to + * the ISIS3 stats application. + * + * @param ui The User Interface to parse the parameters from + */ + PvlGroup crop(UserInterface &ui) { + Cube *icube = new Cube(); + icube->open(ui.GetFileName("FROM")); + return crop(icube, ui); } - if (sl > cube->lineCount()) { - cube->close(); - QString msg = "[LINE] exceeds number of lines in the [FROM] cube"; - throw IException(IException::User, msg, _FILEINFO_); - } + + /** + * Compute the stats for an ISIS cube. This is the programmatic interface to + * the ISIS3 stats application. + * + * @param cube input cube to be cropped + * @param ui The User Interface to parse the parameters from + */ + PvlGroup crop(Cube *cube, UserInterface &ui) { + // Globals and prototypes + int ss, sl, sb; + int ns, nl, nb; + int sinc, linc; + + LineManager *in = NULL; + + // Line processing routine + auto cropProccess = [&](Buffer &out)->void { + // Read the input line + int iline = sl + (out.Line() - 1) * linc; + in->SetLine(iline, sb); + cube->read(*in); + + // Loop and move appropriate samples + for(int i = 0; i < out.size(); i++) { + out[i] = (*in)[(ss - 1) + i * sinc]; + } - // Make sure the number of elements do not fall outside the cube - if (es > cube->sampleCount()) { - cube->close(); - QString msg = "[SAMPLE+NSAMPLES-1] exceeds number of "; - msg += "samples in the [FROM] cube"; - throw IException(IException::User, msg, _FILEINFO_); - } + if(out.Line() == nl) sb++; + }; + + ProcessByLine p; + + // Open the input cube + QString from = ui.GetAsString("FROM"); + CubeAttributeInput inAtt(from); + cube = new Cube(); + cube->setVirtualBands(inAtt.bands()); + from = ui.GetFileName("FROM"); + cube->open(from); + + // Determine the sub-area to extract + ss = ui.GetInteger("SAMPLE"); + sl = ui.GetInteger("LINE"); + sb = 1; + + int origns = cube->sampleCount(); + int orignl = cube->lineCount(); + int es = cube->sampleCount(); + if (ui.WasEntered("NSAMPLES")) es = ss + ui.GetInteger("NSAMPLES") - 1; + int el = cube->lineCount(); + if (ui.WasEntered("NLINES")) el = sl + ui.GetInteger("NLINES") - 1; + int eb = cube->bandCount(); + + sinc = ui.GetInteger("SINC"); + linc = ui.GetInteger("LINC"); + + // Make sure starting positions fall within the cube + if (ss > cube->sampleCount()) { + cube->close(); + QString msg = "[SAMPLE] exceeds number of samples in the [FROM] cube"; + throw IException(IException::User, msg, _FILEINFO_); + } - if (el > cube->lineCount()) { - cube->close(); - QString msg = "[LINE+NLINES-1] exceeds number of "; - msg += "lines in the [FROM] cube"; - throw IException(IException::User, msg, _FILEINFO_); - } + if (sl > cube->lineCount()) { + cube->close(); + QString msg = "[LINE] exceeds number of lines in the [FROM] cube"; + throw IException(IException::User, msg, _FILEINFO_); + } - // Determine the size of the output cube and then set the output image size - ns = ceil((double)(es - ss + 1) / sinc); - nl = ceil((double)(el - sl + 1) / linc); - nb = eb; - //if (ns == 0) ns = 1; - //if (nl == 0) nl = 1; - es = ss + (ns - 1) * sinc; - el = sl + (nl - 1) * linc; - - // Allocate the output file and make sure things get propogated nicely - p.SetInputCube("FROM"); - p.PropagateTables(false); - Cube *ocube = p.SetOutputCube("TO", ns, nl, nb); - p.ClearInputCubes(); - - // propagate tables manually - Pvl &inLabels = *cube->label(); - - // Loop through the labels looking for object = Table - for(int labelObj = 0; labelObj < inLabels.objects(); labelObj++) { - PvlObject &obj = inLabels.object(labelObj); - - if(obj.name() != "Table") continue; - - // If we're not propagating spice data, dont propagate the following tables... - if(!ui.GetBoolean("PROPSPICE")) { - if((IString)obj["Name"][0] == "InstrumentPointing") continue; - if((IString)obj["Name"][0] == "InstrumentPosition") continue; - if((IString)obj["Name"][0] == "BodyRotation") continue; - if((IString)obj["Name"][0] == "SunPosition") continue; + // Make sure the number of elements do not fall outside the cube + if (es > cube->sampleCount()) { + cube->close(); + QString msg = "[SAMPLE+NSAMPLES-1] exceeds number of "; + msg += "samples in the [FROM] cube"; + throw IException(IException::User, msg, _FILEINFO_); } - // Read the table into a table object - Table table(obj["Name"], from); - - // We are not going to bother with line/sample associations; they apply - // only to the alpha cube at this time. I'm leaving this code here for the - // equations in case we try our hand at modifying these tables at a later date. - - /* Deal with associations, sample first - if(table.IsSampleAssociated()) { - int numDeleted = 0; - for(int samp = 0; samp < cube->sampleCount(); samp++) { - // This tests checks to see if we would include this sample. - // samp - (ss-1)) / sinc must be a whole number less than ns. - if((samp - (ss-1)) % sinc != 0 || (samp - (ss-1)) / sinc >= ns || (samp - (ss-1)) < 0) { - table.Delete(samp-numDeleted); - numDeleted ++; - } - } + if (el > cube->lineCount()) { + cube->close(); + QString msg = "[LINE+NLINES-1] exceeds number of "; + msg += "lines in the [FROM] cube"; + throw IException(IException::User, msg, _FILEINFO_); } - // Deal with line association - if(table.IsLineAssociated()) { - int numDeleted = 0; - for(int line = 0; line < cube->lineCount(); line++) { - // This tests checks to see if we would include this line. - // line - (sl-1)) / linc must be a whole number less than nl. - if((line - (sl-1)) % linc != 0 || (line - (sl-1)) / linc >= nl || (line - (sl-1)) < 0) { - table.Delete(line-numDeleted); - numDeleted ++; - } + // Determine the size of the output cube and then set the output image size + ns = ceil((double)(es - ss + 1) / sinc); + nl = ceil((double)(el - sl + 1) / linc); + nb = eb; + //if (ns == 0) ns = 1; + //if (nl == 0) nl = 1; + es = ss + (ns - 1) * sinc; + el = sl + (nl - 1) * linc; + + // Allocate the output file and make sure things get propogated nicely + p.SetInputCube("FROM"); + p.PropagateTables(false); + Cube *ocube = p.SetOutputCube("TO", ns, nl, nb); + p.ClearInputCubes(); + + // propagate tables manually + Pvl &inLabels = *cube->label(); + + // Loop through the labels looking for object = Table + for(int labelObj = 0; labelObj < inLabels.objects(); labelObj++) { + PvlObject &obj = inLabels.object(labelObj); + + if(obj.name() != "Table") continue; + + // If we're not propagating spice data, dont propagate the following tables... + if(!ui.GetBoolean("PROPSPICE")) { + if((IString)obj["Name"][0] == "InstrumentPointing") continue; + if((IString)obj["Name"][0] == "InstrumentPosition") continue; + if((IString)obj["Name"][0] == "BodyRotation") continue; + if((IString)obj["Name"][0] == "SunPosition") continue; } - }*/ - // Write the table - ocube->write(table); - } + // Read the table into a table object + Table table(obj["Name"], from); + + // We are not going to bother with line/sample associations; they apply + // only to the alpha cube at this time. I'm leaving this code here for the + // equations in case we try our hand at modifying these tables at a later date. + + /* Deal with associations, sample first + if(table.IsSampleAssociated()) { + int numDeleted = 0; + for(int samp = 0; samp < cube->sampleCount(); samp++) { + // This tests checks to see if we would include this sample. + // samp - (ss-1)) / sinc must be a whole number less than ns. + if((samp - (ss-1)) % sinc != 0 || (samp - (ss-1)) / sinc >= ns || (samp - (ss-1)) < 0) { + table.Delete(samp-numDeleted); + numDeleted ++; + } + } + } - Pvl &outLabels = *ocube->label(); - if(!ui.GetBoolean("PROPSPICE") && outLabels.findObject("IsisCube").hasGroup("Kernels")) { - PvlGroup &kerns = outLabels.findObject("IsisCube").findGroup("Kernels"); + // Deal with line association + if(table.IsLineAssociated()) { + int numDeleted = 0; + for(int line = 0; line < cube->lineCount(); line++) { + // This tests checks to see if we would include this line. + // line - (sl-1)) / linc must be a whole number less than nl. + if((line - (sl-1)) % linc != 0 || (line - (sl-1)) / linc >= nl || (line - (sl-1)) < 0) { + table.Delete(line-numDeleted); + numDeleted ++; + } + } + }*/ - QString tryKey = "NaifIkCode"; - if(kerns.hasKeyword("NaifFrameCode")) { - tryKey = "NaifFrameCode"; + // Write the table + ocube->write(table); } - if(kerns.hasKeyword(tryKey)) { - PvlKeyword ikCode = kerns[tryKey]; - kerns = PvlGroup("Kernels"); - kerns += ikCode; + Pvl &outLabels = *ocube->label(); + if(!ui.GetBoolean("PROPSPICE") && outLabels.findObject("IsisCube").hasGroup("Kernels")) { + PvlGroup &kerns = outLabels.findObject("IsisCube").findGroup("Kernels"); + + QString tryKey = "NaifIkCode"; + if(kerns.hasKeyword("NaifFrameCode")) { + tryKey = "NaifFrameCode"; + } + + if(kerns.hasKeyword(tryKey)) { + PvlKeyword ikCode = kerns[tryKey]; + kerns = PvlGroup("Kernels"); + kerns += ikCode; + } } - } - // Create a buffer for reading the input cube - in = new LineManager(*cube); - - // Crop the input cube - p.StartProcess(cropProccess); - - delete in; - in = NULL; - - // Construct a label with the results - PvlGroup results("Results"); - results += PvlKeyword("InputLines", toString(orignl)); - results += PvlKeyword("InputSamples", toString(origns)); - results += PvlKeyword("StartingLine", toString(sl)); - results += PvlKeyword("StartingSample", toString(ss)); - results += PvlKeyword("EndingLine", toString(el)); - results += PvlKeyword("EndingSample", toString(es)); - results += PvlKeyword("LineIncrement", toString(linc)); - results += PvlKeyword("SampleIncrement", toString(sinc)); - results += PvlKeyword("OutputLines", toString(nl)); - results += PvlKeyword("OutputSamples", toString(ns)); - - // Update the Mapping, Instrument, and AlphaCube groups in the output - // cube label - SubArea *s; - s = new SubArea; - s->SetSubArea(orignl, origns, sl, ss, el, es, linc, sinc); - s->UpdateLabel(cube, ocube, results); - delete s; - s = NULL; - - // Cleanup - p.EndProcess(); - cube->close(); - delete cube; - cube = NULL; - - // Write the results to the log - return results; + // Create a buffer for reading the input cube + in = new LineManager(*cube); + + // Crop the input cube + p.StartProcess(cropProccess); + + delete in; + in = NULL; + + // Construct a label with the results + PvlGroup results("Results"); + results += PvlKeyword("InputLines", toString(orignl)); + results += PvlKeyword("InputSamples", toString(origns)); + results += PvlKeyword("StartingLine", toString(sl)); + results += PvlKeyword("StartingSample", toString(ss)); + results += PvlKeyword("EndingLine", toString(el)); + results += PvlKeyword("EndingSample", toString(es)); + results += PvlKeyword("LineIncrement", toString(linc)); + results += PvlKeyword("SampleIncrement", toString(sinc)); + results += PvlKeyword("OutputLines", toString(nl)); + results += PvlKeyword("OutputSamples", toString(ns)); + + // Update the Mapping, Instrument, and AlphaCube groups in the output + // cube label + SubArea *s; + s = new SubArea; + s->SetSubArea(orignl, origns, sl, ss, el, es, linc, sinc); + s->UpdateLabel(cube, ocube, results); + delete s; + s = NULL; + + // Cleanup + p.EndProcess(); + cube->close(); + delete cube; + cube = NULL; + + // Write the results to the log + return results; + } } diff --git a/isis/src/base/apps/crop/crop.h b/isis/src/base/apps/crop/crop.h index d6142d72bb..c3786b952b 100644 --- a/isis/src/base/apps/crop/crop.h +++ b/isis/src/base/apps/crop/crop.h @@ -13,6 +13,9 @@ #include "SubArea.h" #include "UserInterface.h" -extern Isis::PvlGroup crop(Isis::UserInterface &ui); +namespace Isis { + extern PvlGroup crop(Cube* cube, UserInterface &ui); + extern PvlGroup crop(UserInterface &ui); +} #endif diff --git a/isis/src/base/apps/cubeit/cubeit.xml b/isis/src/base/apps/cubeit/cubeit.xml index 139d378463..0afa2df4f4 100644 --- a/isis/src/base/apps/cubeit/cubeit.xml +++ b/isis/src/base/apps/cubeit/cubeit.xml @@ -105,7 +105,7 @@ helperButtonLog View file in log area This helper button will display the input file in the log area - $ISIS3DATA/base/icons/view_text.png + $ISISROOT/appdata/images/icons/view_text.png diff --git a/isis/src/base/apps/cubeit/tsts/badinputs/Makefile b/isis/src/base/apps/cubeit/tsts/badinputs/Makefile index b63017beaf..8adf12650b 100644 --- a/isis/src/base/apps/cubeit/tsts/badinputs/Makefile +++ b/isis/src/base/apps/cubeit/tsts/badinputs/Makefile @@ -35,7 +35,7 @@ commands: fi; # Remove Paths - $(SED) "s/\/.*\/data/data/" $(OUTPUT)/error_temp.txt > $(OUTPUT)/error_temp2.txt; + $(SED) "s+\[.*/\(.*\.cub]\)+\[\1+" $(OUTPUT)/error_temp.txt > $(OUTPUT)/error_temp2.txt; $(SED) 's+\[/.*/input/+\[input/+' $(OUTPUT)/error_temp2.txt > $(OUTPUT)/error_temp3.txt; $(SED) 's+\[/.*/output/+\[output/+' $(OUTPUT)/error_temp3.txt > $(OUTPUT)/error.txt; diff --git a/isis/src/base/apps/ddd2isis/ddd2isis.xml b/isis/src/base/apps/ddd2isis/ddd2isis.xml index 19548a0aff..bd072e3cc0 100644 --- a/isis/src/base/apps/ddd2isis/ddd2isis.xml +++ b/isis/src/base/apps/ddd2isis/ddd2isis.xml @@ -41,6 +41,10 @@ bands. Removed the internal default of the output parameter set to None so that an output file is now requried. Fixes #703. + + Updated the dataTypes QMap with a new mapping (32, 4) to handle ingesting + the updated uvflat files from malin. Fixes #3715. + diff --git a/isis/src/base/apps/ddd2isis/main.cpp b/isis/src/base/apps/ddd2isis/main.cpp index efae0dc7aa..ec6121a2e4 100644 --- a/isis/src/base/apps/ddd2isis/main.cpp +++ b/isis/src/base/apps/ddd2isis/main.cpp @@ -100,6 +100,7 @@ void IsisMain() { dataTypes.insert(1450903360, 8); dataTypes.insert(8, 1); dataTypes.insert(16, 2); + dataTypes.insert(32, 4); dataTypes.insert(48, 2); // Read bytes 16-19 to get the bit type @@ -130,6 +131,12 @@ void IsisMain() { nOffset = 1024; } + if (dataTypeBytes == 0) { + string msg = "The value totalBandBits [" + to_string(totalBandBits) + "] does not map " + + "to any byte size in the dataTypes table."; + throw IException(IException::Programmer, msg, _FILEINFO_); + } + fin.close(); PvlGroup results("FileInfo"); diff --git a/isis/src/base/apps/ddd2isis/tsts/badBandBit/Makefile b/isis/src/base/apps/ddd2isis/tsts/badBandBit/Makefile new file mode 100644 index 0000000000..5dea576ab3 --- /dev/null +++ b/isis/src/base/apps/ddd2isis/tsts/badBandBit/Makefile @@ -0,0 +1,24 @@ +APPNAME = ddd2isis + +include $(ISISROOT)/make/isismake.tsts + +commands: + # TEST: Throws an error when trying to open the file + if [ `$(APPNAME) \ + FROM=$(INPUT)/bad_flat.ddd \ + TO=$(OUTPUT)/bad_flat.cub \ + 2> $(OUTPUT)/temp.txt > /dev/null` ]; \ + then true; \ + fi; + + # TEST: Throws an error when trying to read from a cub instead of ddd + if [ `$(APPNAME) \ + FROM=$(INPUT)/bad_flat.cub \ + TO=$(OUTPUT)/bad_flat.cub \ + 2>> $(OUTPUT)/temp.txt > /dev/null` ]; \ + then true; \ + fi; + + # Removes input file path up until input + $(SED) 's+\[.*/input+[input+' $(OUTPUT)/temp.txt > $(OUTPUT)/errorTruth.txt; + $(RM) $(OUTPUT)/temp.txt diff --git a/isis/src/base/apps/enlarge/enlarge.xml b/isis/src/base/apps/enlarge/enlarge.xml index 550fce2b76..1e8b82bb32 100644 --- a/isis/src/base/apps/enlarge/enlarge.xml +++ b/isis/src/base/apps/enlarge/enlarge.xml @@ -74,6 +74,15 @@ Fixed issue 0000280 - enlarge fails when run with a batchlist + + The SetOutputCube method from Process we were originally using called + Application::GetUserInterface(), but this became a problem when trying to + call enlarge(), or run the application, programmatically since we are no + longer using Application in the application's cpp file. Changed the call + to the one that takes in a CubeAttribute object. Also, removed the check + to see if an invalid interpolation method was passed in since the UserInterface + class checks and throws the exception and it was unreachable code. + diff --git a/isis/src/base/apps/enlarge/enlarge_app.cpp b/isis/src/base/apps/enlarge/enlarge_app.cpp new file mode 100644 index 0000000000..4769b7bc29 --- /dev/null +++ b/isis/src/base/apps/enlarge/enlarge_app.cpp @@ -0,0 +1,100 @@ +#include "enlarge_app.h" + +#include "CubeAttribute.h" +#include "Enlarge.h" +#include "IException.h" +#include "ProcessRubberSheet.h" + +using namespace std; +using namespace Isis; +namespace Isis{ + + void enlarge(UserInterface &ui, Pvl *log) { + Cube icube; + CubeAttributeInput inAtt = ui.GetInputAttribute("FROM"); + if (inAtt.bands().size() != 0) { + icube.setVirtualBands(inAtt.bands()); + } + icube.open(ui.GetFileName("FROM")); + enlarge(&icube, ui, log); + } + + void enlarge(Cube *icube, UserInterface &ui, Pvl *log) { + ProcessRubberSheet p; + p.SetInputCube(icube); + + // Input number of samples, lines, and bands + int ins = icube->sampleCount(); + int inl = icube->lineCount(); + int inb = icube->bandCount(); + + // Output samples and lines + int ons, onl; + + // Scaling factors + double sampleScale, lineScale; + + if(ui.GetString("MODE") == "SCALE") { + // Retrieve the provided scaling factors + sampleScale = ui.GetDouble("SSCALE"); + lineScale = ui.GetDouble("LSCALE"); + + // Calculate the output size. If there is a fractional pixel, round up + ons = (int)ceil(ins * sampleScale); + onl = (int)ceil(inl * lineScale); + } + else { + // Retrieve the provided sample/line dimensions in the output + ons = ui.GetInteger("ONS"); + onl = ui.GetInteger("ONL"); + + // Calculate the scaling factors + sampleScale = (double)ons / (double)ins; + lineScale = (double)onl / (double)inl; + } + + // Ensure that the calculated number of output samples and lines is greater + // than the input + if(ons < ins || onl < inl) { + string msg = "Number of output samples/lines must be greater than or equal"; + msg = msg + " to the input samples/lines."; + throw IException(IException::User, msg, _FILEINFO_); + } + + // Set up the interpolator + Interpolator *interp; + if(ui.GetString("INTERP") == "NEARESTNEIGHBOR") { + interp = new Interpolator(Interpolator::NearestNeighborType); + } + else if(ui.GetString("INTERP") == "BILINEAR") { + interp = new Interpolator(Interpolator::BiLinearType); + } + else { // CUBICCONVOLUTION + interp = new Interpolator(Interpolator::CubicConvolutionType); + } + + // Allocate the output file, the number of bands does not change in the output + QString outputFileName = ui.GetFileName("TO"); + CubeAttributeOutput &att = ui.GetOutputAttribute("TO"); + Cube *ocube = p.SetOutputCube(outputFileName, att, ons, onl, inb); + + // Set up the transform object with the calculated scale and number of + // output pixels + //Transform *transform = new Enlarge(icube, sampleScale, lineScale); + Enlarge *transform = new Enlarge(icube, sampleScale, lineScale); + p.StartProcess(*transform, *interp); + PvlGroup resultsGrp = transform->UpdateOutputLabel(ocube); + + // Cleanup + icube->close(); + ocube->close(); + p.EndProcess(); + + delete transform; + delete interp; + + // Write the results to the log + log->addGroup(resultsGrp); + } +} + diff --git a/isis/src/base/apps/enlarge/enlarge_app.h b/isis/src/base/apps/enlarge/enlarge_app.h new file mode 100644 index 0000000000..32206da6e9 --- /dev/null +++ b/isis/src/base/apps/enlarge/enlarge_app.h @@ -0,0 +1,14 @@ +#ifndef enlarge_app_h +#define enlarge_app_h + + +#include "Cube.h" +#include "Pvl.h" +#include "UserInterface.h" + +namespace Isis{ + extern void enlarge(Cube *icube, UserInterface &ui, Pvl *log); + extern void enlarge(UserInterface &ui, Pvl *log); +} + +#endif diff --git a/isis/src/base/apps/enlarge/main.cpp b/isis/src/base/apps/enlarge/main.cpp index 7e005121b8..5277bd14d0 100644 --- a/isis/src/base/apps/enlarge/main.cpp +++ b/isis/src/base/apps/enlarge/main.cpp @@ -1,93 +1,27 @@ #include "Isis.h" -#include "Enlarge.h" -#include "IException.h" -#include "ProcessRubberSheet.h" +#include "enlarge_app.h" + +#include "Application.h" +#include "Pvl.h" using namespace std; using namespace Isis; void IsisMain() { - ProcessRubberSheet p; - - // Open the input cube - Cube *icube = p.SetInputCube("FROM"); - - // Input number of samples, lines, and bands - int ins = icube->sampleCount(); - int inl = icube->lineCount(); - int inb = icube->bandCount(); - - // Output samples and lines - int ons, onl; - - // Scaling factors - double sampleScale, lineScale; - UserInterface &ui = Application::GetUserInterface(); - if(ui.GetString("MODE") == "SCALE") { - // Retrieve the provided scaling factors - sampleScale = ui.GetDouble("SSCALE"); - lineScale = ui.GetDouble("LSCALE"); - - // Calculate the output size. If there is a fractional pixel, round up - ons = (int)ceil(ins * sampleScale); - onl = (int)ceil(inl * lineScale); - } - else { - // Retrieve the provided sample/line dimensions in the output - ons = ui.GetInteger("ONS"); - onl = ui.GetInteger("ONL"); - - // Calculate the scaling factors - sampleScale = (double)ons / (double)ins; - lineScale = (double)onl / (double)inl; - } - - // Ensure that the calculated number of output samples and lines is greater - // than the input - if(ons < ins || onl < inl) { - string msg = "Number of output samples/lines must be greater than or equal"; - msg = msg + " to the input samples/lines."; - throw IException(IException::User, msg, _FILEINFO_); - } - - // Set up the interpolator - Interpolator *interp; - if(ui.GetString("INTERP") == "NEARESTNEIGHBOR") { - interp = new Interpolator(Interpolator::NearestNeighborType); + Pvl appLog; + try { + enlarge(ui, &appLog); } - else if(ui.GetString("INTERP") == "BILINEAR") { - interp = new Interpolator(Interpolator::BiLinearType); + catch (...) { + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); + } + throw; } - else if(ui.GetString("INTERP") == "CUBICCONVOLUTION") { - interp = new Interpolator(Interpolator::CubicConvolutionType); + + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } - else { - QString msg = "Unknown value for INTERP [" + - ui.GetString("INTERP") + "]"; - throw IException(IException::Programmer, msg, _FILEINFO_); - } - - // Allocate the output file, the number of bands does not change in the output - Cube *ocube = p.SetOutputCube("TO", ons, onl, inb); - - // Set up the transform object with the calculated scale and number of - // output pixels - //Transform *transform = new Enlarge(icube, sampleScale, lineScale); - Enlarge *transform = new Enlarge(icube, sampleScale, lineScale); - p.StartProcess(*transform, *interp); - PvlGroup resultsGrp = transform->UpdateOutputLabel(ocube); - - // Cleanup - icube->close(); - ocube->close(); - p.EndProcess(); - - delete transform; - delete interp; - - // Write the results to the log - Application::Log(resultsGrp); -} - +} \ No newline at end of file diff --git a/isis/src/base/apps/enlarge/tsts/default/Makefile b/isis/src/base/apps/enlarge/tsts/default/Makefile deleted file mode 100644 index f44b1aae9c..0000000000 --- a/isis/src/base/apps/enlarge/tsts/default/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -APPNAME = enlarge - -peaks2.cub.TOLERANCE = 16 - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/peaks.cub \ - to=$(OUTPUT)/peaks.cub \ - sscale=1.0 \ - lscale=1.5 \ - interp=bilinear > /dev/null; - lowpass from=$(OUTPUT)/peaks.cub samples=1 lines=5 \ - to=$(OUTPUT)/peaks2.cub > /dev/null; - $(RM) $(OUTPUT)/peaks.cub diff --git a/isis/src/base/apps/enlarge/tsts/total/Makefile b/isis/src/base/apps/enlarge/tsts/total/Makefile deleted file mode 100644 index 2c9aadfcf8..0000000000 --- a/isis/src/base/apps/enlarge/tsts/total/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -APPNAME = enlarge - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/isisTruth.cub \ - to=$(OUTPUT)/total.cub \ - mode=total \ - ons=126 \ - onl=189 \ - interp=nearestneighbor > /dev/null; - $(APPNAME) from=$(INPUT)/isisTruth.cub \ - to=$(OUTPUT)/scale.cub \ - sscale=1.0 \ - lscale=1.5 \ - interp=nearestneighbor > /dev/null; - cubediff from=$(OUTPUT)/total.cub \ - from2=$(OUTPUT)/scale.cub \ - to=$(OUTPUT)/comparisonTruth.txt > /dev/null; - rm -f $(OUTPUT)/total.cub; - rm -f $(OUTPUT)/scale.cub; diff --git a/isis/src/base/apps/findimageoverlaps/findimageoverlaps.cpp b/isis/src/base/apps/findimageoverlaps/findimageoverlaps.cpp new file mode 100644 index 0000000000..0dceee8578 --- /dev/null +++ b/isis/src/base/apps/findimageoverlaps/findimageoverlaps.cpp @@ -0,0 +1,93 @@ +#include "findimageoverlaps.h" + +#include "Application.h" +#include "FileList.h" +#include "ImageOverlapSet.h" +#include "Pvl.h" +#include "SerialNumber.h" +#include "SerialNumberList.h" + +using namespace std; + +namespace Isis { + + void findimageoverlaps(UserInterface &ui, Pvl *log) { + FileList images(ui.GetFileName("FROMLIST")); + + findimageoverlaps(images, ui, log); + } + + void findimageoverlaps(FileList &images, UserInterface &ui, Pvl *log) { + // list of sns/filenames sorted by serial number + SerialNumberList serialNumbers(true); + + vector< pair > sortedList; + + if (images.size() == 1) { + throw IException(IException::User, "The list [" + ui.GetFileName("FROMLIST") + + "] only contains one image.", _FILEINFO_); + } + + // We want to sort the input data by serial number so that the same + // results are produced every time this program is run with the same + // images. This is a modified insertion sort. + for (int image = 0; image < images.size(); image++) { + unsigned int insertPos = 0; + QString sn = SerialNumber::Compose(images[image].toString()); + for (insertPos = 0; insertPos < sortedList.size(); insertPos++) { + if (sn.compare(sortedList[insertPos].first) < 0) break; + } + pair newPair = pair(sn, images[image].toString()); + sortedList.insert(sortedList.begin() + insertPos, newPair); + } + + // Add the serial numbers in sorted order now + for (unsigned int i = 0; i < sortedList.size(); i++) { + serialNumbers.add(sortedList[i].second); + } + + // Now we want the ImageOverlapSet to calculate our overlaps + ImageOverlapSet overlaps(true); + + // Use multi-threading to create the overlaps + overlaps.FindImageOverlaps(serialNumbers, + FileName(ui.GetFileName("OVERLAPLIST")).expanded()); + + // This will only occur when "CONTINUE" is true, so we can assume "ERRORS" was + // an entered parameter. + if (overlaps.Errors().size() != 0 && ui.WasEntered("ERRORS")) { + Pvl outFile; + + bool filenamesOnly = !ui.GetBoolean("DETAILED"); + + vector errorList = overlaps.Errors(); + + for (unsigned int err = 0; err < errorList.size(); err++) { + if (!filenamesOnly) { + outFile += errorList[err]; + } + else if (errorList[err].hasKeyword("FileNames")) { + PvlGroup origError = errorList[err]; + PvlGroup err("ImageOverlapError"); + + for (int keyword = 0; keyword < origError.keywords(); keyword++) { + if (origError[keyword].name() == "FileNames") { + err += origError[keyword]; + } + } + + outFile += err; + } + } + + outFile.write(FileName(ui.GetFileName("ERRORS")).expanded()); + } + + PvlGroup results("Results"); + results += PvlKeyword("ErrorCount", toString((BigInt)overlaps.Errors().size())); + + if (log) { + log->addGroup(results); + } + } +} diff --git a/isis/src/base/apps/findimageoverlaps/findimageoverlaps.h b/isis/src/base/apps/findimageoverlaps/findimageoverlaps.h new file mode 100644 index 0000000000..d8ca4a1932 --- /dev/null +++ b/isis/src/base/apps/findimageoverlaps/findimageoverlaps.h @@ -0,0 +1,14 @@ +#ifndef findimageoverlaps_h +#define findimageoverlaps_h + +#include "FileList.h" +#include "Pvl.h" +#include "UserInterface.h" + +namespace Isis { + extern void findimageoverlaps(UserInterface &ui, Pvl *log=nullptr); + + extern void findimageoverlaps(FileList &images, UserInterface &ui, Pvl *log=nullptr); +} + +#endif diff --git a/isis/src/base/apps/findimageoverlaps/main.cpp b/isis/src/base/apps/findimageoverlaps/main.cpp index 9d540f04f8..620564ba61 100644 --- a/isis/src/base/apps/findimageoverlaps/main.cpp +++ b/isis/src/base/apps/findimageoverlaps/main.cpp @@ -1,83 +1,27 @@ #include "Isis.h" -#include "FileList.h" -#include "ImageOverlapSet.h" -#include "SerialNumber.h" -#include "SerialNumberList.h" +#include "findimageoverlaps.h" + +#include "UserInterface.h" using namespace std; using namespace Isis; void IsisMain() { UserInterface &ui = Application::GetUserInterface(); - SerialNumberList serialNumbers(true); - - FileList images(ui.GetFileName("FROMLIST")); - // list of sns/filenames sorted by serial number - - vector< pair > sortedList; + Pvl appLog; - if (images.size() == 1) { - throw IException(IException::User, "The list [" + ui.GetFileName("FROMLIST") + - "] only contains one image.", _FILEINFO_); + try { + findimageoverlaps(ui, &appLog); } - - // We want to sort the input data by serial number so that the same - // results are produced every time this program is run with the same - // images. This is a modified insertion sort. - for (int image = 0; image < images.size(); image++) { - unsigned int insertPos = 0; - QString sn = SerialNumber::Compose(images[image].toString()); - for (insertPos = 0; insertPos < sortedList.size(); insertPos++) { - if (sn.compare(sortedList[insertPos].first) < 0) break; + catch (...) { + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } - pair newPair = pair(sn, images[image].toString()); - sortedList.insert(sortedList.begin() + insertPos, newPair); + throw; } - - // Add the serial numbers in sorted order now - for (unsigned int i = 0; i < sortedList.size(); i++) { - serialNumbers.add(sortedList[i].second); - } - - // Now we want the ImageOverlapSet to calculate our overlaps - ImageOverlapSet overlaps(true); - - // Use multi-threading to create the overlaps - overlaps.FindImageOverlaps(serialNumbers, - FileName(ui.GetFileName("OVERLAPLIST")).expanded()); - - // This will only occur when "CONTINUE" is true, so we can assume "ERRORS" was - // an entered parameter. - if (overlaps.Errors().size() != 0 && ui.WasEntered("ERRORS")) { - Pvl outFile; - - bool filenamesOnly = !ui.GetBoolean("DETAILED"); - - vector errorList = overlaps.Errors(); - - for (unsigned int err = 0; err < errorList.size(); err++) { - if (!filenamesOnly) { - outFile += errorList[err]; - } - else if (errorList[err].hasKeyword("FileNames")) { - PvlGroup origError = errorList[err]; - PvlGroup err("ImageOverlapError"); - for (int keyword = 0; keyword < origError.keywords(); keyword++) { - if (origError[keyword].name() == "FileNames") { - err += origError[keyword]; - } - } - - outFile += err; - } - } - - outFile.write(FileName(ui.GetFileName("ERRORS")).expanded()); + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } - - PvlGroup results("Results"); - results += PvlKeyword("ErrorCount", toString((BigInt)overlaps.Errors().size())); - Application::Log(results); -} \ No newline at end of file +} diff --git a/isis/src/base/apps/findimageoverlaps/tsts/nooverlap/Makefile b/isis/src/base/apps/findimageoverlaps/tsts/nooverlap/Makefile deleted file mode 100644 index bb1bbf9c13..0000000000 --- a/isis/src/base/apps/findimageoverlaps/tsts/nooverlap/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# This tests to make sure that the proper exception is -# thrown if no overlaps are present in the data set -APPNAME = findimageoverlaps - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(LS) $(INPUT)/*.cub > $(OUTPUT)/cubes.lis; - - if [[ `$(APPNAME) \ - FROM=$(OUTPUT)/cubes.lis \ - OVERLAPLIST=$(OUTPUT)/overlaps.txt \ - 2>> $(OUTPUT)/errors.txt \ - > /dev/null` ]]; \ - then \ - true; \ - fi; - - $(RM) $(OUTPUT)/cubes.lis; diff --git a/isis/src/base/apps/findrx/findrx.xml b/isis/src/base/apps/findrx/findrx.xml index 8d4f3ff770..be7603115e 100644 --- a/isis/src/base/apps/findrx/findrx.xml +++ b/isis/src/base/apps/findrx/findrx.xml @@ -44,6 +44,10 @@ Updated to use new SearchChip SubchipValidPercent value from the template. + + Added method writeHistory() to add an entry to the history blob of the input cube. + Updated code up to coding standards. + @@ -75,7 +79,7 @@ *.def - $base/templates/AutoReg/findrx.def + $ISISROOT/appdata/templates/autoreg/findrx.def diff --git a/isis/src/base/apps/findrx/main.cpp b/isis/src/base/apps/findrx/main.cpp index 5269596e34..5f5e2aec51 100644 --- a/isis/src/base/apps/findrx/main.cpp +++ b/isis/src/base/apps/findrx/main.cpp @@ -1,17 +1,22 @@ #include "Isis.h" -#include "PvlGroup.h" -#include "UserInterface.h" -#include "Cube.h" -#include "Chip.h" -#include "Progress.h" -#include "IException.h" + +#include "Application.h" #include "AutoReg.h" #include "AutoRegFactory.h" #include "Brick.h" +#include "Chip.h" +#include "Cube.h" +#include "History.h" +#include "IException.h" +#include "Progress.h" +#include "PvlGroup.h" +#include "UserInterface.h" using namespace std; using namespace Isis; +void writeHistory(Cube &cube); + void IsisMain() { // Import cube data & PVL information Cube cube; @@ -19,29 +24,29 @@ void IsisMain() { cube.open(ui.GetFileName("FROM"), "rw"); Pvl *regdef; // If regdef was supplied by the user, use it. else, use the template. - if(ui.WasEntered("REGDEF")) { + if (ui.WasEntered("REGDEF")) { regdef = new Pvl(ui.GetFileName("REGDEF")); } else { - regdef = new Pvl("$base/templates/autoreg/findrx.def"); + regdef = new Pvl("$ISISROOT/appdata/templates/autoreg/findrx.def"); } PvlGroup &reseaus = cube.label()->findGroup("Reseaus", Pvl::Traverse); // If the Keyword sizes don't match up, throw errors. int nres = reseaus["Line"].size(); - if(nres != reseaus["Sample"].size()) { + if (nres != reseaus["Sample"].size()) { QString msg = "Sample size incorrect [Sample size " + toString(reseaus["Sample"].size()) + " != " + " Line size " + toString(reseaus["Line"].size()) + "]"; throw IException(IException::Unknown, msg, _FILEINFO_); } - if(nres != reseaus["Type"].size()) { + if (nres != reseaus["Type"].size()) { QString msg = "Type size incorrect [Type size " + toString(reseaus["Type"].size()) + " != " + " Line size " + toString(reseaus["Line"].size()) + "]"; throw IException(IException::Unknown, msg, _FILEINFO_); } - if(nres != reseaus["Valid"].size()) { + if (nres != reseaus["Valid"].size()) { QString msg = "Valid size incorrect [Valid size " + toString(reseaus["Valid"].size()) + " != " + " Line size " + toString(reseaus["Line"].size()) + "]"; @@ -62,7 +67,7 @@ void IsisMain() { //If the mark reseaus option is set...then create a brick. Brick *white = NULL; - if(ui.GetBoolean("MARK") == true) { + if (ui.GetBoolean("MARK") == true) { white = new Brick(1, 1, 1, Isis::UnsignedByte); (*white)[0] = Isis::Hrs; } @@ -71,19 +76,19 @@ void IsisMain() { double subsearchValidPercent = ar->SubsearchValidPercent(); // And the loop... - for(int res = 0; res < nres; ++res) { + for (int res = 0; res < nres; ++res) { // Output chips ar->SearchChip()->TackCube(toDouble(reseaus["Sample"][res]), toDouble(reseaus["Line"][res])); ar->SearchChip()->Load(cube); ar->PatternChip()->Load(pattern, 0, 1.0, res + 1); int type = toInt(reseaus["Type"][res]); // If the reseaus is in the center (type 5) use full percent value - if(type == 5) { + if (type == 5) { ar->SetPatternValidPercent(patternValidPercent); ar->SetSubsearchValidPercent(subsearchValidPercent); } // else if the reseaus is on an edge (type 2,4,6, or 8) use half percent value - else if(type % 2 == 0) { + else if (type % 2 == 0) { ar->SetPatternValidPercent(patternValidPercent / 2.0); ar->SetSubsearchValidPercent(subsearchValidPercent / 2.0); } @@ -95,7 +100,7 @@ void IsisMain() { ar->Register(); - if(ar->Success()) { + if (ar->Success()) { reseaus["Sample"][res] = toString(ar->CubeSample()); reseaus["Line"][res] = toString(ar->CubeLine()); reseaus["Valid"][res] = "1"; @@ -105,7 +110,7 @@ void IsisMain() { } // And if the reseaus are to be marked...mark em - if(white != NULL) { + if (white != NULL) { double line = toDouble(reseaus["Line"][res]); double sample = toDouble(reseaus["Sample"][res]); white->SetBasePosition(int(sample), int(line), 1); @@ -119,5 +124,32 @@ void IsisMain() { reseaus["Status"] = "Refined"; pattern.close(); + writeHistory(cube); cube.close(); } + + +/** + * Writes out the History blob to a cube + * + * @param cube Cube to add History blob to + */ +void writeHistory(Cube &cube) { + bool addedHist = false; + Isis::Pvl *inlabel = cube.label(); + for (int i = 0; i < inlabel->objects(); i++) { + if (inlabel->object(i).isNamed("History") && Isis::iApp != NULL) { + Isis::History h( (QString)inlabel->object(i)["Name"] ); + cube.read(h); + h.AddEntry(); + cube.write(h); + addedHist = true; + } + } + + if (!addedHist && Isis::iApp != NULL) { + Isis::History h("IsisCube"); + h.AddEntry(); + cube.write(h); + } +} diff --git a/isis/src/base/apps/footprintinit/footprintinit.cpp b/isis/src/base/apps/footprintinit/footprintinit.cpp new file mode 100644 index 0000000000..feae162da5 --- /dev/null +++ b/isis/src/base/apps/footprintinit/footprintinit.cpp @@ -0,0 +1,157 @@ +#include "footprintinit.h" + +#include "Application.h" +#include "IException.h" +#include "ImagePolygon.h" +#include "PolygonTools.h" +#include "Process.h" +#include "Progress.h" +#include "PvlGroup.h" +#include "SerialNumber.h" +#include "Target.h" +#include "TProjection.h" + + +using namespace std; + +namespace Isis { + + void footprintinit(UserInterface &ui, Pvl *log) { + Cube cube; + cube.open(ui.GetFileName("FROM"), "rw"); + + footprintinit(&cube, ui, log); + cube.close(); + } + + void footprintinit(Cube *cube, UserInterface &ui, Pvl *log) { + bool testXY = ui.GetBoolean("TESTXY"); + + // Make sure cube has been run through spiceinit + try { + cube->camera(); + } + catch (IException &e) { + if (!cube->projection()) { + string msg = "Spiceinit must be run before initializing the polygon"; + throw IException(e, IException::User, msg, _FILEINFO_); + } + testXY = false; + } + + Progress prog; + prog.SetMaximumSteps(1); + prog.CheckStatus(); + + QString sn = SerialNumber::Compose(*cube); + + ImagePolygon poly; + if (ui.WasEntered("MAXEMISSION")) { + poly.Emission(ui.GetDouble("MAXEMISSION")); + } + if (ui.WasEntered("MAXINCIDENCE")) { + poly.Incidence(ui.GetDouble("MAXINCIDENCE")); + } + if (ui.GetString("LIMBTEST") == "ELLIPSOID") { + poly.EllipsoidLimb(true); + } + + int sinc = 1; + int linc = 1; + IString incType = ui.GetString("INCTYPE"); + if (incType.UpCase() == "VERTICES") { + poly.initCube(*cube); + sinc = linc = (int)(0.5 + (((poly.validSampleDim() * 2) + + (poly.validLineDim() * 2) - 3.0) / + ui.GetInteger("NUMVERTICES"))); + if (sinc < 1.0 || linc < 1.0) + sinc = linc = 1.0; + } + else if (incType.UpCase() == "LINCSINC"){ + sinc = ui.GetInteger("SINC"); + linc = ui.GetInteger("LINC"); + } + else { + string msg = "Invalid INCTYPE option[" + incType + "]"; + throw IException(IException::Programmer, msg, _FILEINFO_); + } + + bool precision = ui.GetBoolean("INCREASEPRECISION"); + try { + poly.Create(*cube, sinc, linc, 1, 1, 0, 0, 1, precision); + } + catch (IException &e) { + QString msg = "Cannot generate polygon for [" + ui.GetFileName("FROM") + "]"; + throw IException(e, IException::User, msg, _FILEINFO_); + } + + if (testXY) { + Pvl map(ui.GetFileName("MAP")); + PvlGroup &mapGroup = map.findGroup("MAPPING"); + + Pvl cubeLab(ui.GetFileName("FROM")); + // This call adds TargetName, EquatorialRadius and PolarRadius to mapGroup + mapGroup = Target::radiiGroup(cubeLab, mapGroup); + // add/replace the rest of the keywords + mapGroup.addKeyword( PvlKeyword("LatitudeType", "Planetocentric"), + PvlContainer::Replace ); + mapGroup.addKeyword( PvlKeyword("LongitudeDirection", "PositiveEast"), + PvlContainer::Replace ); + mapGroup.addKeyword( PvlKeyword("LongitudeDomain", "360"), + PvlContainer::Replace ); + mapGroup.addKeyword( PvlKeyword("CenterLatitude", "0.0"), + PvlContainer::Replace ); + mapGroup.addKeyword( PvlKeyword("CenterLongitude", "0.0"), + PvlContainer::Replace); + + sinc = poly.getSinc(); + linc = poly.getLinc(); + bool polygonGenerated = false; + while (!polygonGenerated) { + TProjection *proj = NULL; + geos::geom::MultiPolygon *xyPoly = NULL; + + try { + proj = (TProjection *) ProjectionFactory::Create(map, true); + xyPoly = PolygonTools::LatLonToXY(*poly.Polys(), proj); + + polygonGenerated = true; + } + catch (IException &e) { + if (precision && sinc > 1 && linc > 1) { + sinc = sinc * 2 / 3; + linc = linc * 2 / 3; + poly.Create(*cube, sinc, linc); + } + else { + delete proj; + delete xyPoly; + e.print(); // This should be a NAIF error + QString msg = "Cannot calculate XY for ["; + msg += ui.GetFileName("FROM") + "]"; + throw IException(e, IException::User, msg, _FILEINFO_); + } + } + + delete proj; + delete xyPoly; + } + } + + cube->deleteBlob("Polygon", sn); + cube->write(poly); + + if (precision) { + PvlGroup results("Results"); + results.addKeyword(PvlKeyword("SINC", toString(sinc))); + results.addKeyword(PvlKeyword("LINC", toString(linc))); + log->addGroup(results); + } + + Process p; + p.SetInputCube(cube); + p.WriteHistory(*cube); + + prog.CheckStatus(); + } +} diff --git a/isis/src/base/apps/footprintinit/footprintinit.h b/isis/src/base/apps/footprintinit/footprintinit.h new file mode 100644 index 0000000000..2d887f2c64 --- /dev/null +++ b/isis/src/base/apps/footprintinit/footprintinit.h @@ -0,0 +1,9 @@ +#include "Cube.h" +#include "Pvl.h" +#include "UserInterface.h" + +namespace Isis { + extern void footprintinit(UserInterface &ui, Pvl *log=nullptr); + + extern void footprintinit(Cube *cube, UserInterface &ui, Pvl *log=nullptr); +} diff --git a/isis/src/base/apps/footprintinit/footprintinit.xml b/isis/src/base/apps/footprintinit/footprintinit.xml index 2ede9c6a53..323ca2ef96 100644 --- a/isis/src/base/apps/footprintinit/footprintinit.xml +++ b/isis/src/base/apps/footprintinit/footprintinit.xml @@ -368,8 +368,8 @@ File containing mapping parameters - $base/templates/maps - $base/templates/maps/sinusoidal.map + $ISISROOT/appdata/templates/maps + $ISISROOT/appdata/templates/maps/sinusoidal.map A file containing the desired XY mapping parameters. This file can be a simple label file, hand produced or created via @@ -385,7 +385,7 @@ This helper button will cat out the mapping group of the given mapfile to the session log of the application - $ISIS3DATA/base/icons/labels.png + $ISISROOT/appdata/images/icons/labels.png diff --git a/isis/src/base/apps/footprintinit/main.cpp b/isis/src/base/apps/footprintinit/main.cpp index ae32feba06..e07886fc4d 100644 --- a/isis/src/base/apps/footprintinit/main.cpp +++ b/isis/src/base/apps/footprintinit/main.cpp @@ -1,5 +1,7 @@ #include "Isis.h" +#include "footprintinit.h" + #include "IException.h" #include "ImagePolygon.h" #include "PolygonTools.h" @@ -16,136 +18,18 @@ using namespace Isis; void IsisMain() { UserInterface &ui = Application::GetUserInterface(); - Cube cube; - cube.open(ui.GetFileName("FROM"), "rw"); - bool testXY = ui.GetBoolean("TESTXY"); - - // Make sure cube has been run through spiceinit - try { - cube.camera(); - } - catch (IException &e) { - if (!cube.projection()) { - string msg = "Spiceinit must be run before initializing the polygon"; - throw IException(e, IException::User, msg, _FILEINFO_); - } - testXY = false; - } - - Progress prog; - prog.SetMaximumSteps(1); - prog.CheckStatus(); - - QString sn = SerialNumber::Compose(cube); - - ImagePolygon poly; - if (ui.WasEntered("MAXEMISSION")) { - poly.Emission(ui.GetDouble("MAXEMISSION")); - } - if (ui.WasEntered("MAXINCIDENCE")) { - poly.Incidence(ui.GetDouble("MAXINCIDENCE")); - } - if (ui.GetString("LIMBTEST") == "ELLIPSOID") { - poly.EllipsoidLimb(true); - } - - int sinc = 1; - int linc = 1; - IString incType = ui.GetString("INCTYPE"); - if (incType.UpCase() == "VERTICES") { - poly.initCube(cube); - sinc = linc = (int)(0.5 + (((poly.validSampleDim() * 2) + - (poly.validLineDim() * 2) - 3.0) / - ui.GetInteger("NUMVERTICES"))); - if (sinc < 1.0 || linc < 1.0) - sinc = linc = 1.0; - } - else if (incType.UpCase() == "LINCSINC"){ - sinc = ui.GetInteger("SINC"); - linc = ui.GetInteger("LINC"); - } - else { - string msg = "Invalid INCTYPE option[" + incType + "]"; - throw IException(IException::Programmer, msg, _FILEINFO_); - } - - bool precision = ui.GetBoolean("INCREASEPRECISION"); + Pvl appLog; try { - poly.Create(cube, sinc, linc, 1, 1, 0, 0, 1, precision); - } - catch (IException &e) { - QString msg = "Cannot generate polygon for [" + ui.GetFileName("FROM") + "]"; - throw IException(e, IException::User, msg, _FILEINFO_); + footprintinit(ui, &appLog); } - - if (testXY) { - - Pvl map(ui.GetFileName("MAP")); - PvlGroup &mapGroup = map.findGroup("MAPPING"); - - Pvl cubeLab(ui.GetFileName("FROM")); - // This call adds TargetName, EquatorialRadius and PolarRadius to mapGroup - mapGroup = Target::radiiGroup(cubeLab, mapGroup); - // add/replace the rest of the keywords - mapGroup.addKeyword( PvlKeyword("LatitudeType", "Planetocentric"), - PvlContainer::Replace ); - mapGroup.addKeyword( PvlKeyword("LongitudeDirection", "PositiveEast"), - PvlContainer::Replace ); - mapGroup.addKeyword( PvlKeyword("LongitudeDomain", "360"), - PvlContainer::Replace ); - mapGroup.addKeyword( PvlKeyword("CenterLatitude", "0.0"), - PvlContainer::Replace ); - mapGroup.addKeyword( PvlKeyword("CenterLongitude", "0.0"), - PvlContainer::Replace); - - sinc = poly.getSinc(); - linc = poly.getLinc(); - bool polygonGenerated = false; - while (!polygonGenerated) { - TProjection *proj = NULL; - geos::geom::MultiPolygon *xyPoly = NULL; - - try { - proj = (TProjection *) ProjectionFactory::Create(map, true); - xyPoly = PolygonTools::LatLonToXY(*poly.Polys(), proj); - - polygonGenerated = true; - } - catch (IException &e) { - if (precision && sinc > 1 && linc > 1) { - sinc = sinc * 2 / 3; - linc = linc * 2 / 3; - poly.Create(cube, sinc, linc); - } - else { - delete proj; - delete xyPoly; - e.print(); // This should be a NAIF error - QString msg = "Cannot calculate XY for ["; - msg += ui.GetFileName("FROM") + "]"; - throw IException(e, IException::User, msg, _FILEINFO_); - } - } - - delete proj; - delete xyPoly; + catch (...) { + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } + throw; } - cube.deleteBlob("Polygon", sn); - cube.write(poly); - - if (precision) { - PvlGroup results("Results"); - results.addKeyword(PvlKeyword("SINC", toString(sinc))); - results.addKeyword(PvlKeyword("LINC", toString(linc))); - Application::Log(results); + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } - - Process p; - p.SetInputCube("FROM"); - p.WriteHistory(cube); - - cube.close(); - prog.CheckStatus(); } diff --git a/isis/src/base/apps/footprintmerge/main.cpp b/isis/src/base/apps/footprintmerge/main.cpp index 6086e6b958..8c2df1a96d 100644 --- a/isis/src/base/apps/footprintmerge/main.cpp +++ b/isis/src/base/apps/footprintmerge/main.cpp @@ -91,7 +91,7 @@ void IsisMain() { // Create union poly geos::geom::GeometryCollection *polyCollection = - Isis::globalFactory.createGeometryCollection(allPolys); + Isis::globalFactory->createGeometryCollection(allPolys); geos::geom::Geometry *unionPoly = polyCollection->buffer(0); diff --git a/isis/src/base/apps/getkey/getkey.xml b/isis/src/base/apps/getkey/getkey.xml index 153b663381..8a36c64600 100644 --- a/isis/src/base/apps/getkey/getkey.xml +++ b/isis/src/base/apps/getkey/getkey.xml @@ -82,7 +82,7 @@ helperButtonLog View file in log area This helper button will display the input file in the log area - $ISIS3DATA/base/icons/view_text.png + $ISISROOT/appdata/images/icons/view_text.png diff --git a/isis/src/base/apps/getsn/getsn.cpp b/isis/src/base/apps/getsn/getsn.cpp new file mode 100644 index 0000000000..be2f5edb68 --- /dev/null +++ b/isis/src/base/apps/getsn/getsn.cpp @@ -0,0 +1,94 @@ +#include "getsn.h" + +#include +#include +#include + +#include "Blob.h" +#include "Cube.h" +#include "History.h" +#include "ObservationNumber.h" +#include "Preference.h" +#include "Pvl.h" +#include "SerialNumber.h" +#include "SessionLog.h" +#include "TextFile.h" + +using namespace Isis; +using namespace std; + + +namespace Isis { + + void getsn( UserInterface &ui, Pvl *log ) { + // Open the input cube + Cube *cube = new Cube( ui.GetFileName("FROM"), "r"); + + getsn( cube, ui, log ); + + } + + + void getsn( Cube *cube, UserInterface &ui, Pvl *log ) { + + // Determine if output should be written base on parameters + bool WriteFile = ui.GetBoolean("FILE"); + bool WriteSN = ui.GetBoolean("SN"); + bool WriteObservation = ui.GetBoolean("OBSERVATION"); + + QString from = cube->fileName(); + QString format = ui.GetString("FORMAT"); + bool pvl; + if (format == "PVL") { + pvl = true; + } + else { + pvl = false; + } + + // Extract label from cube file + Pvl *label = cube->label(); + + PvlGroup sn("Results"); + + if (WriteFile) sn += PvlKeyword("Filename", from); + if (WriteSN) sn += PvlKeyword( "SerialNumber", SerialNumber::Compose( *label, ui.GetBoolean("DEFAULT") ) ); + if (WriteObservation) sn += PvlKeyword( "ObservationNumber", ObservationNumber::Compose( *label, ui.GetBoolean("DEFAULT") ) ); + + if ( ui.WasEntered("TO") ) { + // PVL option + if (pvl) { + // Create a serial number and observation number for this cube & put it in a pvlgroup for output + Pvl pvl; + pvl.addGroup(sn); + if ( ui.GetBoolean("APPEND") ) + pvl.append( ui.GetFileName("TO") ); + else + pvl.write( ui.GetFileName("TO") ); + } + // FLAT option + else { + bool append = ui.GetBoolean("APPEND"); + // Open in append or overwrite + TextFile txt(ui.GetFileName("TO"), append ? "append" : "overwrite"); + + // Build QString + QString line = ""; + for (int i = 0; i < sn.keywords(); i++) { + if (i != 0) + line += ","; + line += sn[i][0]; + } + txt.PutLine(line); + } + + } + else { + for (int i = 0; i < sn.keywords(); i++) { + cout << sn[i][0] << endl; + } + } + + log->addGroup(sn); + } +} diff --git a/isis/src/base/apps/getsn/getsn.h b/isis/src/base/apps/getsn/getsn.h new file mode 100644 index 0000000000..3244d973cb --- /dev/null +++ b/isis/src/base/apps/getsn/getsn.h @@ -0,0 +1,13 @@ +#ifndef getsn_h +#define getsn_h + +#include "UserInterface.h" +#include "Pvl.h" +#include "Cube.h" + +namespace Isis { + extern void getsn( Cube *cube, UserInterface &ui, Pvl *log ); + extern void getsn( UserInterface &ui, Pvl *log ); +} + +#endif diff --git a/isis/src/base/apps/getsn/main.cpp b/isis/src/base/apps/getsn/main.cpp index 3d1d30e1a3..dbdc050db2 100644 --- a/isis/src/base/apps/getsn/main.cpp +++ b/isis/src/base/apps/getsn/main.cpp @@ -1,93 +1,40 @@ #include "Isis.h" -#include -#include -#include +#include "getsn.h" +#include "PvlGroup.h" +#include "Pvl.h" #include "Blob.h" #include "Cube.h" #include "History.h" #include "ObservationNumber.h" #include "Preference.h" -#include "Pvl.h" + #include "SerialNumber.h" #include "SessionLog.h" #include "TextFile.h" + using namespace Isis; using namespace std; void IsisMain() { + // Set Preferences to always turn off Terminal Output PvlGroup &grp = Isis::Preference::Preferences().findGroup("SessionLog", Isis::Pvl::Traverse); grp["TerminalOutput"].setValue("Off"); - // Open the input cube UserInterface &ui = Application::GetUserInterface(); - Cube cube; - QString from = ui.GetFileName("FROM"); - cube.open(from, "r"); - - // Determine if output should be written base on parameters - bool WriteFile = ui.GetBoolean("FILE"); - bool WriteSN = ui.GetBoolean("SN"); - bool WriteObservation = ui.GetBoolean("OBSERVATION"); - - QString format = ui.GetString("FORMAT"); - bool pvl; - if (format == "PVL") { - pvl = true; - } - else { - pvl = false; - } - - // Extract label from cube file - Pvl *label = cube.label(); - - PvlGroup sn("Results"); + Pvl appLog; - if (WriteFile) sn += PvlKeyword("Filename", from); - if (WriteSN) sn += PvlKeyword( "SerialNumber", SerialNumber::Compose( *label, ui.GetBoolean("DEFAULT") ) ); - if (WriteObservation) sn += PvlKeyword( "ObservationNumber", ObservationNumber::Compose( *label, ui.GetBoolean("DEFAULT") ) ); + getsn(ui, &appLog); - if ( ui.WasEntered("TO") ) { - // PVL option - if (pvl) { - // Create a serial number and observation number for this cube & put it in a pvlgroup for output - Pvl pvl; - pvl.addGroup(sn); - if ( ui.GetBoolean("APPEND") ) - pvl.append( ui.GetFileName("TO") ); - else - pvl.write( ui.GetFileName("TO") ); - } - // FLAT option - else { - bool append = ui.GetBoolean("APPEND"); - // Open in append or overwrite - TextFile txt(ui.GetFileName("TO"), append ? "append" : "overwrite"); + PvlGroup results = appLog.findGroup("Results"); - // Build QString - QString line = ""; - for (int i = 0; i < sn.keywords(); i++) { - if (i != 0) - line += ","; - line += sn[i][0]; - } - txt.PutLine(line); - } - - // Construct a label with the results - if ( ui.IsInteractive() ) { - Application::GuiLog(sn); - } - } - else { - for (int i = 0; i < sn.keywords(); i++) { - cout << sn[i][0] << endl; - } + if( ui.WasEntered("TO") && ui.IsInteractive() ) { + Application::GuiLog(results); } - // Write the results to the log but not the terminal - SessionLog::TheLog().AddResults(sn); + + SessionLog::TheLog().AddResults(results); + } diff --git a/isis/src/base/apps/getsn/tsts/ConsoleOutput/Makefile b/isis/src/base/apps/getsn/tsts/ConsoleOutput/Makefile deleted file mode 100644 index ca18c6c526..0000000000 --- a/isis/src/base/apps/getsn/tsts/ConsoleOutput/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -APPNAME = getsn - -peaks.txt.IGNORELINES = Filename -hirise.txt.IGNORELINES = Filename - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/peaks.cub \ - FILE=false OBSERVATION=false \ - >& $(OUTPUT)/peaks.txt; - $(APPNAME) FROM=$(INPUT)/hirise.cub \ - FILE=FALSE OBSERVATION=TRUE >& $(OUTPUT)/hirise.txt; diff --git a/isis/src/base/apps/getsn/tsts/default/Makefile b/isis/src/base/apps/getsn/tsts/default/Makefile deleted file mode 100644 index 531f669de4..0000000000 --- a/isis/src/base/apps/getsn/tsts/default/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -APPNAME = getsn - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/peaks.cub \ - TO=$(OUTPUT)/peaks.pvl FILE=FALSE OBSERVATION=TRUE SN=FALSE \ - APPEND=false; - $(APPNAME) FROM=$(INPUT)/peaks.cub \ - TO=$(OUTPUT)/peaks.pvl FILE=TRUE OBSERVATION=FALSE SN=TRUE \ - APPEND=TRUE; - $(APPNAME) FROM=$(INPUT)/hirise.cub \ - TO= $(OUTPUT)/hirise.pvl FILE=TRUE OBSERVATION=TRUE \ - APPEND=false; diff --git a/isis/src/base/apps/getsn/tsts/flat/Makefile b/isis/src/base/apps/getsn/tsts/flat/Makefile deleted file mode 100644 index c94d514afa..0000000000 --- a/isis/src/base/apps/getsn/tsts/flat/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -APPNAME = getsn - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/voy.cub \ - TO=$(OUTPUT)/output.txt \ - FILE=TRUE \ - OBSERVATION=TRUE \ - FORMAT=FLAT > /dev/null; - sed s:.*/isis:isis:g $(OUTPUT)/output.txt > $(OUTPUT)/output2.txt; - rm -f $(OUTPUT)/output.txt > /dev/null; diff --git a/isis/src/base/apps/hist/hist.xml b/isis/src/base/apps/hist/hist.xml index 7a122450ba..e0d4171a04 100644 --- a/isis/src/base/apps/hist/hist.xml +++ b/isis/src/base/apps/hist/hist.xml @@ -66,7 +66,7 @@ Histogram object no longer has SetRange, updated to use SetValidRange - Removed references to CubeInfo + Removed references to CubeInfo Changed the plot window to the new HistogramToolWindow @@ -79,7 +79,17 @@ Changed the application to fail immediately if the TO argument is not entered from the commandline. Fixes #3914. - + + + Updated logic such that min/max values are no longer calculated from .cub + if values are provided by the user. Fixes #3881. + + + Added "Pixels Below Min" and "Pixels Above Max" to the CSV output and changed how the data is + outputted. Originally, the CSV output and the GUI histogram would use the DN value in the + middle of a bin to represent that bin. That is, the CSV output used to have a "DN" value that + was the bin's middle pixel DN. This was not intuitive to users. Removed the "DN" value and added "MinInclusive" and "MaxExclusive" to the CSV so that bins are represented by their min/max values. These changes were also reflected in the histrogram creation. The x-axis is now based off of the min value of a bin instead of the middle value. These changes were made alongside changes made to Histogram and cnethist. + diff --git a/isis/src/base/apps/hist/main.cpp b/isis/src/base/apps/hist/main.cpp index 0cdb3458f9..2b078ea2ee 100644 --- a/isis/src/base/apps/hist/main.cpp +++ b/isis/src/base/apps/hist/main.cpp @@ -23,20 +23,42 @@ void IsisMain() { Cube *icube = p.SetInputCube("FROM"); UserInterface &ui = Application::GetUserInterface(); - if(!ui.WasEntered("TO") && !ui.IsInteractive()) { + if (!ui.WasEntered("TO") && !ui.IsInteractive()) { QString msg = "The [TO] parameter must be entered"; throw IException(IException::User, msg, _FILEINFO_); } - - // Setup the histogram - Histogram hist(*icube, 1, p.Progress() ); - if(ui.WasEntered("MINIMUM") ) { - hist.SetValidRange(ui.GetDouble("MINIMUM"),ui.GetDouble("MAXIMUM") ); - } - if(ui.WasEntered("NBINS")) { - hist.SetBins(ui.GetInteger("NBINS")); + Histogram *hist; + if (ui.WasEntered("MINIMUM") && ui.WasEntered("MAXIMUM")){ + int nbins = 0; + + if (ui.WasEntered("NBINS")){ + nbins = ui.GetInteger("NBINS"); + } + else { + // Calculate bins based on data type. + // Bin calculations are based on logic in Histogram::InitializeFromCube + if (icube->pixelType() == UnsignedByte) { + nbins = 256; + } + else if (icube->pixelType() == SignedWord || + icube->pixelType() == UnsignedWord || + icube->pixelType() == UnsignedInteger || + icube->pixelType() == SignedInteger || + icube->pixelType() == Real) { + nbins = 65536; + } + else { + IString msg = "Unsupported pixel type"; + throw IException(IException::Programmer, msg, _FILEINFO_); + } + } + hist = new Histogram(ui.GetDouble("MINIMUM"), ui.GetDouble("MAXIMUM"), nbins); + } + else { + hist = new Histogram(*icube, 1, p.Progress()); } + // Setup the histogram // Loop and accumulate histogram p.Progress()->SetText("Gathering Histogram"); @@ -44,54 +66,61 @@ void IsisMain() { p.Progress()->CheckStatus(); LineManager line(*icube); - for(int i = 1; i <= icube->lineCount(); i++) { + for (int i = 1; i <= icube->lineCount(); i++) { line.SetLine(i); icube->read(line); - hist.AddData(line.DoubleBuffer(), line.size()); + hist->AddData(line.DoubleBuffer(), line.size()); p.Progress()->CheckStatus(); } - if(!ui.IsInteractive() || ui.WasEntered("TO") ) { + if (!ui.IsInteractive() || ui.WasEntered("TO") ) { // Write the results QString outfile = ui.GetFileName("TO"); ofstream fout; fout.open(outfile.toLatin1().data()); - fout << "Cube: " << ui.GetFileName("FROM") << endl; - fout << "Band: " << icube->bandCount() << endl; - fout << "Average: " << hist.Average() << endl; - fout << "Std Deviation: " << hist.StandardDeviation() << endl; - fout << "Variance: " << hist.Variance() << endl; - fout << "Median: " << hist.Median() << endl; - fout << "Mode: " << hist.Mode() << endl; - fout << "Skew: " << hist.Skew() << endl; - fout << "Minimum: " << hist.Minimum() << endl; - fout << "Maximum: " << hist.Maximum() << endl; + fout << "Cube: " << ui.GetFileName("FROM") << endl; + fout << "Band: " << icube->bandCount() << endl; + fout << "Average: " << hist->Average() << endl; + fout << "Std Deviation: " << hist->StandardDeviation() << endl; + fout << "Variance: " << hist->Variance() << endl; + fout << "Median: " << hist->Median() << endl; + fout << "Mode: " << hist->Mode() << endl; + fout << "Skew: " << hist->Skew() << endl; + fout << "Minimum: " << hist->Minimum() << endl; + fout << "Maximum: " << hist->Maximum() << endl; fout << endl; - fout << "Total Pixels: " << hist.TotalPixels() << endl; - fout << "Valid Pixels: " << hist.ValidPixels() << endl; - fout << "Null Pixels: " << hist.NullPixels() << endl; - fout << "Lis Pixels: " << hist.LisPixels() << endl; - fout << "Lrs Pixels: " << hist.LrsPixels() << endl; - fout << "His Pixels: " << hist.HisPixels() << endl; - fout << "Hrs Pixels: " << hist.HrsPixels() << endl; + fout << "Total Pixels: " << hist->TotalPixels() << endl; + fout << "Valid Pixels: " << hist->ValidPixels() << endl; + fout << "Pixels Below Min: " << hist->UnderRangePixels() << endl; + fout << "Pixels Above Max: " << hist->OverRangePixels() << endl; + fout << "Null Pixels: " << hist->NullPixels() << endl; + fout << "Lis Pixels: " << hist->LisPixels() << endl; + fout << "Lrs Pixels: " << hist->LrsPixels() << endl; + fout << "His Pixels: " << hist->HisPixels() << endl; + fout << "Hrs Pixels: " << hist->HrsPixels() << endl; // Write histogram in tabular format fout << endl; fout << endl; - fout << "DN,Pixels,CumulativePixels,Percent,CumulativePercent" << endl; + fout << "MinInclusive,MaxExclusive,Pixels,CumulativePixels,Percent,CumulativePercent" << endl; Isis::BigInt total = 0; double cumpct = 0.0; + double low; + double high; - for(int i = 0; i < hist.Bins(); i++) { - if(hist.BinCount(i) > 0) { - total += hist.BinCount(i); - double pct = (double)hist.BinCount(i) / hist.ValidPixels() * 100.; + for (int i = 0; i < hist->Bins(); i++) { + if (hist->BinCount(i) > 0) { + total += hist->BinCount(i); + double pct = (double)hist->BinCount(i) / hist->ValidPixels() * 100.; cumpct += pct; - fout << hist.BinMiddle(i) << ","; - fout << hist.BinCount(i) << ","; + hist->BinRange(i, low, high); + + fout << low << ","; + fout << high << ","; + fout << hist->BinCount(i) << ","; fout << total << ","; fout << pct << ","; fout << cumpct << endl; @@ -100,10 +129,10 @@ void IsisMain() { fout.close(); } // If we are in gui mode, create a histogram plot - if(ui.IsInteractive()) { + if (ui.IsInteractive()) { // Set the title for the dialog QString title; - if(ui.WasEntered("TITLE") ) { + if (ui.WasEntered("TITLE") ) { title = ui.GetString("TITLE"); } else { @@ -116,19 +145,19 @@ void IsisMain() { ui.TheGui()); // Set the xaxis title if they entered one - if(ui.WasEntered("XAXIS") ) { + if (ui.WasEntered("XAXIS") ) { QString xaxis(ui.GetString("XAXIS")); plot->setAxisLabel(QwtPlot::xBottom, xaxis.toLatin1().data()); } // Set the yLeft axis title if they entered one - if(ui.WasEntered("FREQAXIS") ) { + if (ui.WasEntered("FREQAXIS") ) { QString yaxis(ui.GetString("FREQAXIS")); plot->setAxisLabel(QwtPlot::yRight, yaxis.toLatin1().data()); } // Set the yRight axis title if they entered one - if(ui.WasEntered("PERCENTAXIS") ) { + if (ui.WasEntered("PERCENTAXIS") ) { QString y2axis(ui.GetString("PERCENTAXIS") ); plot->setAxisLabel(QwtPlot::yLeft, y2axis.toLatin1().data()); } @@ -137,13 +166,16 @@ void IsisMain() { QVector binCountData; QVector cumPctData; double cumpct = 0.0; - for(int i = 0; i < hist.Bins(); i++) { - if(hist.BinCount(i) > 0) { - binCountData.append(QPointF(hist.BinMiddle(i), hist.BinCount(i) ) ); - - double pct = (double)hist.BinCount(i) / hist.ValidPixels() * 100.; + double low; + double high; + for (int i = 0; i < hist->Bins(); i++) { + if (hist->BinCount(i) > 0) { + hist->BinRange(i, low, high); + binCountData.append(QPointF(low, hist->BinCount(i) ) ); + + double pct = (double)hist->BinCount(i) / hist->ValidPixels() * 100.0; cumpct += pct; - cumPctData.append(QPointF(hist.BinMiddle(i), cumpct) ); + cumPctData.append(QPointF(low, cumpct) ); } } @@ -162,21 +194,13 @@ void IsisMain() { cdfCurve->setYAxis(QwtPlot::yLeft); cdfCurve->setPen(*pen); - //These are all variables needed in the following for loop. - //---------------------------------------------- QVector intervals(binCountData.size() ); -// double maxYValue = DBL_MIN; -// double minYValue = DBL_MAX; -// // --------------------------------------------- -// - for(int y = 0; y < binCountData.size(); y++) { + for (int y = 0; y < binCountData.size(); y++) { intervals[y].interval = QwtInterval(binCountData[y].x(), - binCountData[y].x() + hist.BinSize()); + binCountData[y].x() + hist->BinSize()); intervals[y].value = binCountData[y].y(); -// if(values[y] > maxYValue) maxYValue = values[y]; -// if(values[y] < minYValue) minYValue = values[y]; } QPen percentagePen(Qt::red); @@ -189,23 +213,19 @@ void IsisMain() { plot->add(histCurve); plot->add(cdfCurve); -// plot->fillTable(); - -// plot->setScale(QwtPlot::yLeft, 0, maxYValue); -// plot->setScale(QwtPlot::xBottom, hist.Minimum(), hist.Maximum()); - - QLabel *label = new QLabel(" Average = " + QString::number(hist.Average()) + '\n' + - "\n Minimum = " + QString::number(hist.Minimum()) + '\n' + - "\n Maximum = " + QString::number(hist.Maximum()) + '\n' + - "\n Stand. Dev.= " + QString::number(hist.StandardDeviation()) + '\n' + - "\n Variance = " + QString::number(hist.Variance()) + '\n' + - "\n Median = " + QString::number(hist.Median()) + '\n' + - "\n Mode = " + QString::number(hist.Mode()) + '\n' + - "\n Skew = " + QString::number(hist.Skew()), plot); + + QLabel *label = new QLabel(" Average = " + QString::number(hist->Average()) + '\n' + + "\n Minimum = " + QString::number(hist->Minimum()) + '\n' + + "\n Maximum = " + QString::number(hist->Maximum()) + '\n' + + "\n Stand. Dev.= " + QString::number(hist->StandardDeviation()) + '\n' + + "\n Variance = " + QString::number(hist->Variance()) + '\n' + + "\n Median = " + QString::number(hist->Median()) + '\n' + + "\n Mode = " + QString::number(hist->Mode()) + '\n' + + "\n Skew = " + QString::number(hist->Skew()), plot); plot->getDockWidget()->setWidget(label); plot->showWindow(); } - + delete hist; p.EndProcess(); } diff --git a/isis/src/base/apps/isis2ascii/isis2ascii.cpp b/isis/src/base/apps/isis2ascii/isis2ascii.cpp new file mode 100644 index 0000000000..20f3d20759 --- /dev/null +++ b/isis/src/base/apps/isis2ascii/isis2ascii.cpp @@ -0,0 +1,126 @@ +#include "isis2ascii.h" + +using namespace std; + +namespace Isis { + // Global declarations + void isis2ascii(Buffer &in); + ofstream fout; + /** + * @brief The SpecialPixelFunctor class + * + * This class is used to convert ISIS cubes into ascii format with + * specified values for the special pixels in the cube. The main purpose + * for the class was to reduce global variables. + * + * @author 2016-06-15 Adam Paquette + * + * @internal + * @history 2016-06-15 Adam Paquette - Original Version + * @history 2020-06-10 Adam Paquette - Added delimiter variable to use in + * output file and removed static spacing + * + */ + + class SpecialPixelFunctor{ + + public: + explicit SpecialPixelFunctor(QString null, + QString hrs, + QString his, + QString lrs, + QString lis, + QString delimiter) : + null(null), hrs(hrs), his(his), lrs(lrs), lis(lis), delimiter(delimiter) {} + + void operator() (Buffer &in) const { + for(int i = 0; i < in.size(); i++) { + if(IsSpecial(in[i])) { + if(IsNullPixel(in[i])) fout << null; + if(IsHrsPixel(in[i])) fout << hrs; + if(IsHisPixel(in[i])) fout << his; + if(IsLrsPixel(in[i])) fout << lrs; + if(IsLisPixel(in[i])) fout << lis; + } + else { + fout << in[i]; + } + if (i != in.size() - 1) { + fout << delimiter; + } + } + fout << endl; + } + private: + QString null; + QString hrs; + QString his; + QString lrs; + QString lis; + QString delimiter; + }; + + void isis2ascii(UserInterface &ui) { + Cube icube; + icube.open(ui.GetFileName("FROM")); + + isis2ascii(&icube, ui); + } + + void isis2ascii(Cube *icube, UserInterface &ui) { + // Create a process by line object + QString null; + QString hrs; + QString his; + QString lrs; + QString lis; + + ProcessByLine p; + + // Get the size of the cube + p.SetInputCube(icube); + + // Open output text file + QString to = ui.GetFileName("TO", "txt"); + fout.open(to.toLatin1().data()); + + QString delimiter = ui.GetString("DELIMITER"); + if (delimiter.isEmpty()) { + delimiter = " "; + } + + // Print header if needed + if(ui.GetBoolean("HEADER")) { + fout << "Input_Cube" << delimiter << icube->fileName() << endl; + fout << "Samples" << delimiter << icube->sampleCount() << endl; + fout << "Lines" << delimiter << icube->lineCount() << endl; + fout << "Bands" << delimiter << icube->bandCount() << endl; + } + + //Determine special pixel values + if (ui.GetBoolean("SETPIXELVALUES")) { + null = ui.GetString("NULLVALUE"); + hrs = ui.GetString("HRSVALUE"); + his = ui.GetString("HISVALUE"); + lrs = ui.GetString("LRSVALUE"); + lis = ui.GetString("LISVALUE"); + } + else { + null = "NULL"; + hrs = "HRS"; + his = "HIS"; + lrs = "LRS"; + lis = "LIS"; + } + + SpecialPixelFunctor isis2ascii(null, hrs, his, lrs, lis, delimiter); + + fout << std::setprecision(7); + + // List the cube + p.ProcessCubeInPlace(isis2ascii, false); + p.EndProcess(); + + fout.close(); + } +} diff --git a/isis/src/base/apps/isis2ascii/isis2ascii.h b/isis/src/base/apps/isis2ascii/isis2ascii.h new file mode 100644 index 0000000000..e88349f310 --- /dev/null +++ b/isis/src/base/apps/isis2ascii/isis2ascii.h @@ -0,0 +1,17 @@ +#ifndef isis2ascii_h +#define isis2ascii_h + +#include + +#include "FileName.h" +#include "ProcessByLine.h" +#include "SpecialPixel.h" +#include "UserInterface.h" +#include "Cube.h" + +namespace Isis { + extern void isis2ascii(Cube *icube, UserInterface &ui); + extern void isis2ascii(UserInterface &ui); +} + +#endif diff --git a/isis/src/base/apps/isis2ascii/isis2ascii.xml b/isis/src/base/apps/isis2ascii/isis2ascii.xml index 457c10e77c..fd7b4e9cff 100644 --- a/isis/src/base/apps/isis2ascii/isis2ascii.xml +++ b/isis/src/base/apps/isis2ascii/isis2ascii.xml @@ -4,9 +4,9 @@ This program converts sn ISIS cube to ASCII file format. Special pixels such as - NULL, LIS, LRS, HIS and HRS - have predetermined pixel values. You may opt to assign a range of pixel values to - the individual Special Pixels using the SETPIXELVALUES parameter. Bands in the cube + NULL, LIS, LRS, HIS and HRS + have predetermined pixel values. You may opt to assign a range of pixel values to + the individual Special Pixels using the SETPIXELVALUES parameter. Bands in the cube will be output in band sequential format.

    @@ -63,7 +63,7 @@ Documentation fixes - Removed references to CubeInfo + Removed references to CubeInfo Increased precision of the DNs in the output text file from 6 to 7 @@ -71,6 +71,14 @@ Added the ability for a user to specify the special pixel values + + Changed the formatting of the header to be easier to parse using + a space delimited CSV reader. + + + Changed output formatting to use a delimiter that is placed after each + entry, rather than depending on a set width. + @@ -108,41 +116,52 @@ YES + + string + Output Delimiter + + Sets the value to place between entries in the output file. This will + default to a space if nothing is entered. + + + + + boolean - - NO - - User defined output for special pixels - - Determine whether the user would like a - specific output for the special pixels in the image. - - - NULLVALUE - LRSVALUE - LISVALUE - HISVALUE - HRSVALUE - + + NO + + User defined output for special pixels + + Determine whether the user would like a + specific output for the special pixels in the image. + + + NULLVALUE + LRSVALUE + LISVALUE + HISVALUE + HRSVALUE + - + - string - - NULL - - Value to set to any null pixel - - Value that will replace any null pixel within a cub with - the number entered. Defaults to NULL if nothing is entered. - - - SETPIXELVALUES - + string + + NULL + + Value to set to any null pixel + + Value that will replace any null pixel within a cub with + the number entered. Defaults to NULL if nothing is entered. + + + SETPIXELVALUES + @@ -215,12 +234,12 @@ Header default - + Demonstrate the isis2ascii application with header f=../IN/f332s28.cub t=OUT/isis2ascii.txt - + Convert Viking ISIS image to ascii file. Let header default to yes. @@ -237,7 +256,7 @@ Example output ascii text from isis2ascii run - + This is the output ascii text file isis2ascii.txt with the header. diff --git a/isis/src/base/apps/isis2ascii/main.cpp b/isis/src/base/apps/isis2ascii/main.cpp index 27303ae021..c0816923b5 100644 --- a/isis/src/base/apps/isis2ascii/main.cpp +++ b/isis/src/base/apps/isis2ascii/main.cpp @@ -1,113 +1,12 @@ #include "Isis.h" -#include - -#include "FileName.h" -#include "ProcessByLine.h" -#include "SpecialPixel.h" +#include "isis2ascii.h" +#include "Application.h" using namespace std; using namespace Isis; -// Global declarations -void isis2ascii(Buffer &in); -ofstream fout; -/** - * @brief The SpecialPixelFunctor class - * - * This class is used to convert ISIS cubes into ascii format with - * specified values for the special pixels in the cube. The main purpose - * for the class was to reduce global variables. - * - * @author 2016-06-15 Adam Paquette - * - * @internal - * @history 2016-06-15 Adam Paquette - Original Version - * - */ - -class SpecialPixelFunctor{ - -public: - explicit SpecialPixelFunctor(QString null, - QString hrs, - QString his, - QString lrs, - QString lis) : - null(null), hrs(hrs), his(his), lrs(lrs), lis(lis) {} - - void operator() (Buffer &in) const { - for(int i = 0; i < in.size(); i++) { - fout.width(13); // Width must be set everytime - if(IsSpecial(in[i])) { - if(IsNullPixel(in[i])) fout << null; - if(IsHrsPixel(in[i])) fout << hrs; - if(IsHisPixel(in[i])) fout << his; - if(IsLrsPixel(in[i])) fout << lrs; - if(IsLisPixel(in[i])) fout << lis; - } - else { - fout << in[i]; - } - } - fout << endl; - } -private: - QString null; - QString hrs; - QString his; - QString lrs; - QString lis; -}; - void IsisMain() { - // Create a process by line object - QString null; - QString hrs; - QString his; - QString lrs; - QString lis; - - ProcessByLine p; - - // Get the size of the cube - Cube *icube = p.SetInputCube("FROM"); - - // Open output text file UserInterface &ui = Application::GetUserInterface(); - QString to = ui.GetFileName("TO", "txt"); - fout.open(to.toLatin1().data()); - - // Print header if needed - if(ui.GetBoolean("HEADER")) { - fout << "Input Cube: " << icube->fileName() << endl; - fout << "Samples:Lines:Bands: " << icube->sampleCount() << ":" << - icube->lineCount() << ":" << icube->bandCount() << endl; - } - - //Determine special pixel values - if (ui.GetBoolean("SETPIXELVALUES")) { - null = ui.GetString("NULLVALUE"); - hrs = ui.GetString("HRSVALUE"); - his = ui.GetString("HISVALUE"); - lrs = ui.GetString("LRSVALUE"); - lis = ui.GetString("LISVALUE"); - } - else { - null = "NULL"; - hrs = "HRS"; - his = "HIS"; - lrs = "LRS"; - lis = "LIS"; - } - - SpecialPixelFunctor isis2ascii(null, hrs, his, lrs, lis); - - fout << std::setprecision(7); - - // List the cube - p.ProcessCubeInPlace(isis2ascii, false); - p.EndProcess(); - - fout.close(); + isis2ascii(ui); } diff --git a/isis/src/base/apps/isis2ascii/tsts/case01/Makefile b/isis/src/base/apps/isis2ascii/tsts/case01/Makefile deleted file mode 100644 index edc204a3eb..0000000000 --- a/isis/src/base/apps/isis2ascii/tsts/case01/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -APPNAME = isis2ascii - -include $(ISISROOT)/make/isismake.tsts - -isis2asciiTruth.txt.SKIPLINES = 1 - -commands: - $(APPNAME) from=$(INPUT)/isisTruth.cub \ - to=$(OUTPUT)/isis2asciiTruth.txt > /dev/null; diff --git a/isis/src/base/apps/isis2ascii/tsts/caselarge/Makefile b/isis/src/base/apps/isis2ascii/tsts/caselarge/Makefile deleted file mode 100644 index 1abb5be9ef..0000000000 --- a/isis/src/base/apps/isis2ascii/tsts/caselarge/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -APPNAME = isis2ascii - -include $(ISISROOT)/make/isismake.tsts -vesta64ascii.txt.SKIPLINES = 1 - - -commands: - $(APPNAME) from = $(INPUT)/vesta64_dtm_top.cub \ - to = $(OUTPUT)/vesta64ascii.txt > /dev/null; diff --git a/isis/src/base/apps/isis2ascii/tsts/casesmall/Makefile b/isis/src/base/apps/isis2ascii/tsts/casesmall/Makefile deleted file mode 100644 index 3ee832f082..0000000000 --- a/isis/src/base/apps/isis2ascii/tsts/casesmall/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -APPNAME = isis2ascii - -include $(ISISROOT)/make/isismake.tsts -vikcalascii.txt.SKIPLINES = 1 - - -commands: - $(APPNAME) from = $(INPUT)/vikcalTruth.cub \ - to = $(OUTPUT)/vikcalascii.txt > /dev/null; diff --git a/isis/src/base/apps/isis2ascii/tsts/caseuser/Makefile b/isis/src/base/apps/isis2ascii/tsts/caseuser/Makefile deleted file mode 100644 index ca8f7a3928..0000000000 --- a/isis/src/base/apps/isis2ascii/tsts/caseuser/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -APPNAME = isis2ascii - -include $(ISISROOT)/make/isismake.tsts -vesta64ascii.txt.SKIPLINES = 1 - - -commands: - $(APPNAME) from = $(INPUT)/isisTruth.cub \ - to = $(OUTPUT)/isisTruthAsciiUser_temp.txt setpixelvalues = yes \ - nullvalue = 0 lrsvalue = 0 lisvalue = 0 hisvalue = 255 \ - hrsvalue = 255 > /dev/null; - $(SED) 's+/.*/input/+input/+' $(OUTPUT)/isisTruthAsciiUser_temp.txt > $(OUTPUT)\ - /isisTruthAsciiUser.txt; - $(RM) $(OUTPUT)/isisTruthAsciiUser_temp.txt; \ No newline at end of file diff --git a/isis/src/base/apps/isisminer/PdsTableFormatStrategy.cpp b/isis/src/base/apps/isisminer/PdsTableFormatStrategy.cpp index 43e42198c3..3f54c34ceb 100644 --- a/isis/src/base/apps/isisminer/PdsTableFormatStrategy.cpp +++ b/isis/src/base/apps/isisminer/PdsTableFormatStrategy.cpp @@ -107,7 +107,7 @@ namespace Isis { QString keyfmt = translateKeywordArgs("KeywordFormatFile", getGlobals(m_parameters, globals), - "$base/translations/pdsExportRootGen.typ"); + "$ISISROOT/appdata/translations/pdsExportRootGen.typ"); // Remake new columns each time diff --git a/isis/src/base/apps/isisminer/isisminer.xml b/isis/src/base/apps/isisminer/isisminer.xml index 5da3f9cf44..8b379eb297 100644 --- a/isis/src/base/apps/isisminer/isisminer.xml +++ b/isis/src/base/apps/isisminer/isisminer.xml @@ -3068,7 +3068,7 @@ EndObject Name of a file containing individual PDS keyword file formatting directives. Provides user with customization options. Defaults to - $base/translations/pdsExportRootGen.typ. + $ISISROOT/appdata/translations/pdsExportRootGen.typ. diff --git a/isis/src/base/apps/kernfilter/kernfilter.xml b/isis/src/base/apps/kernfilter/kernfilter.xml index 3f61ed020f..ecf17cdddc 100644 --- a/isis/src/base/apps/kernfilter/kernfilter.xml +++ b/isis/src/base/apps/kernfilter/kernfilter.xml @@ -115,7 +115,7 @@ filename input - $base/templates/kernels/ + $ISISROOT/appdata/templates/kernels/ The kernel that describes the filter to be applied diff --git a/isis/src/base/apps/makeflat/main.cpp b/isis/src/base/apps/makeflat/main.cpp index 18b94ce0da..4ffa66e562 100644 --- a/isis/src/base/apps/makeflat/main.cpp +++ b/isis/src/base/apps/makeflat/main.cpp @@ -498,7 +498,7 @@ void IsisMain() { PvlGroup excludedFiles("ExcludedFiles"); for(currImage = 0; currImage < inList.size(); currImage++) { if(Excluded(currImage)) { - excludedFiles += PvlKeyword("File", inList[currImage].toString()); + excludedFiles += PvlKeyword("File", inList[currImage].original()); } } diff --git a/isis/src/base/apps/map2cam/main.cpp b/isis/src/base/apps/map2cam/main.cpp index 8e91db4554..6135727f18 100644 --- a/isis/src/base/apps/map2cam/main.cpp +++ b/isis/src/base/apps/map2cam/main.cpp @@ -1,122 +1,12 @@ #include "Isis.h" - -#include "Camera.h" -#include "ProcessRubberSheet.h" -#include "TProjection.h" - +#include "Application.h" #include "map2cam.h" using namespace std; using namespace Isis; -// Global variables -Cube *mcube; -Camera *outcam; -void BandChange(const int band); void IsisMain() { - // Open the input camera cube that we will be matching and create - // the camera object UserInterface &ui = Application::GetUserInterface(); - FileName match = FileName(ui.GetFileName("MATCH")); - - Process p; - mcube = p.SetInputCube("MATCH"); - outcam = mcube->camera(); - - // Open the input projection cube and get the projection information - ProcessRubberSheet rub; - Cube *icube = rub.SetInputCube("FROM"); - TProjection *inmap = (TProjection *) icube->projection(); - - // Set up for rubbersheeting - Transform *transform = new map2cam(icube->sampleCount(), - icube->lineCount(), - inmap, - mcube->sampleCount(), - mcube->lineCount(), - outcam); - - // Allocate the output cube but don't propogate any labels from the map - // file. Instead propagate from the camera file - rub.PropagateLabels(false); - rub.SetOutputCube("TO", transform->OutputSamples(), - transform->OutputLines(), - icube->bandCount()); - rub.PropagateLabels(match.expanded()); - rub.PropagateTables(match.expanded()); - - // Set up the interpolator - Interpolator *interp = NULL; - if(ui.GetString("INTERP") == "NEARESTNEIGHBOR") { - interp = new Interpolator(Interpolator::NearestNeighborType); - } - else if(ui.GetString("INTERP") == "BILINEAR") { - interp = new Interpolator(Interpolator::BiLinearType); - } - else if(ui.GetString("INTERP") == "CUBICCONVOLUTION") { - interp = new Interpolator(Interpolator::CubicConvolutionType); - } - - // See if the camera is band dependent and account for it - if(!outcam->IsBandIndependent()) { - rub.BandChange(BandChange); - } - - // Warp the cube - rub.StartProcess(*transform, *interp); - rub.EndProcess(); - - // Cleanup - delete transform; - delete interp; -} - -// Transform object constructor -map2cam::map2cam(const int inputSamples, const int inputLines, - TProjection *inmap, - const int outputSamples, const int outputLines, - Camera *outcam) { - p_inputSamples = inputSamples; - p_inputLines = inputLines; - p_inmap = inmap; - - p_outputSamples = outputSamples; - p_outputLines = outputLines; - p_outcam = outcam; -} - -// Transform method mapping output line/samps to lat/lons to input line/samps -bool map2cam::Xform(double &inSample, double &inLine, - const double outSample, const double outLine) { - // See if the output image coordinate converts to lat/lon - if(!p_outcam->SetImage(outSample, outLine)) return false; - - // Get the universal lat/lon and see if it can be converted to input line/samp - double lat = p_outcam->UniversalLatitude(); - double lon = p_outcam->UniversalLongitude(); - if(!p_inmap->SetUniversalGround(lat, lon)) return false; - - // Make sure the point is inside the input image - if(p_inmap->WorldX() < 0.5) return false; - if(p_inmap->WorldY() < 0.5) return false; - if(p_inmap->WorldX() > p_inputSamples + 0.5) return false; - if(p_inmap->WorldY() > p_inputLines + 0.5) return false; - - // Everything is good - inSample = p_inmap->WorldX(); - inLine = p_inmap->WorldY(); - return true; -} - -int map2cam::OutputSamples() const { - return p_outputSamples; -} - -int map2cam::OutputLines() const { - return p_outputLines; -} - -void BandChange(const int band) { - outcam->SetBand(mcube->physicalBand(band)); + map2cam_f(ui); } diff --git a/isis/src/base/apps/map2cam/map2cam.cpp b/isis/src/base/apps/map2cam/map2cam.cpp new file mode 100644 index 0000000000..c67f0c4de9 --- /dev/null +++ b/isis/src/base/apps/map2cam/map2cam.cpp @@ -0,0 +1,132 @@ +#include "Camera.h" +#include "ProcessRubberSheet.h" +#include "TProjection.h" +#include "UserInterface.h" + +#include "map2cam.h" + +using namespace std; + +namespace Isis{ + + // Global variables + Cube *mcube; + Camera *outcam; + + + void map2cam_f(UserInterface &ui) { + + // Open the input camera cube that we will be matching and create + // the camera object + FileName match = FileName(ui.GetFileName("MATCH")); + + Process p; + QString fname = ui.GetFileName("MATCH"); + Isis::CubeAttributeInput &inputAtt = ui.GetInputAttribute("MATCH"); + mcube = p.SetInputCube(fname, inputAtt); + outcam = mcube->camera(); + + // Open the input projection cube and get the projection information + ProcessRubberSheet rub; + fname = ui.GetFileName("FROM"); + inputAtt = ui.GetInputAttribute("FROM"); + Cube *icube = rub.SetInputCube(fname, inputAtt); + TProjection *inmap = (TProjection *) icube->projection(); + + // Set up for rubbersheeting + Transform *transform = new map2cam(icube->sampleCount(), + icube->lineCount(), + inmap, + mcube->sampleCount(), + mcube->lineCount(), + outcam); + + // Allocate the output cube but don't propagate any labels from the map + // file. Instead propagate from the camera file + rub.PropagateLabels(false); + fname = ui.GetFileName("TO"); + Isis::CubeAttributeOutput &outputAtt = ui.GetOutputAttribute("TO"); + rub.SetOutputCube(fname, outputAtt, + transform->OutputSamples(), + transform->OutputLines(), + icube->bandCount()); + rub.PropagateLabels(match.expanded()); + rub.PropagateTables(match.expanded()); + + // Set up the interpolator + Interpolator *interp = NULL; + if(ui.GetString("INTERP") == "NEARESTNEIGHBOR") { + interp = new Interpolator(Interpolator::NearestNeighborType); + } + else if(ui.GetString("INTERP") == "BILINEAR") { + interp = new Interpolator(Interpolator::BiLinearType); + } + else if(ui.GetString("INTERP") == "CUBICCONVOLUTION") { + interp = new Interpolator(Interpolator::CubicConvolutionType); + } + + // See if the camera is band dependent and account for it + if(!outcam->IsBandIndependent()) { + rub.BandChange(BandChange); + } + + // Warp the cube + rub.StartProcess(*transform, *interp); + rub.EndProcess(); + + // Cleanup + delete transform; + delete interp; + + p.EndProcess(); + } + + // Transform object constructor + map2cam::map2cam(const int inputSamples, const int inputLines, + TProjection *inmap, + const int outputSamples, const int outputLines, + Camera *outcam) { + p_inputSamples = inputSamples; + p_inputLines = inputLines; + p_inmap = inmap; + + p_outputSamples = outputSamples; + p_outputLines = outputLines; + p_outcam = outcam; + } + + // Transform method mapping output line/samps to lat/lons to input line/samps + bool map2cam::Xform(double &inSample, double &inLine, + const double outSample, const double outLine) { + // See if the output image coordinate converts to lat/lon + if(!p_outcam->SetImage(outSample, outLine)) return false; + + // Get the universal lat/lon and see if it can be converted to input line/samp + double lat = p_outcam->UniversalLatitude(); + double lon = p_outcam->UniversalLongitude(); + if(!p_inmap->SetUniversalGround(lat, lon)) return false; + + // Make sure the point is inside the input image + if(p_inmap->WorldX() < 0.5) return false; + if(p_inmap->WorldY() < 0.5) return false; + if(p_inmap->WorldX() > p_inputSamples + 0.5) return false; + if(p_inmap->WorldY() > p_inputLines + 0.5) return false; + + // Everything is good + inSample = p_inmap->WorldX(); + inLine = p_inmap->WorldY(); + return true; + } + + int map2cam::OutputSamples() const { + return p_outputSamples; + } + + int map2cam::OutputLines() const { + return p_outputLines; + } + + void BandChange(const int band) { + outcam->SetBand(mcube->physicalBand(band)); + } +} diff --git a/isis/src/base/apps/map2cam/map2cam.h b/isis/src/base/apps/map2cam/map2cam.h index 8e7ff8d1ef..f50c8e3dd1 100644 --- a/isis/src/base/apps/map2cam/map2cam.h +++ b/isis/src/base/apps/map2cam/map2cam.h @@ -1,8 +1,10 @@ -#ifndef cam2map_h -#define cam2map_h +#ifndef map2cam_h +#define map2cam_h +#include "Camera.h" #include "Transform.h" - +#include "TProjection.h" +#include "UserInterface.h" /** * @author ????-??-?? Unknown * @@ -10,28 +12,32 @@ * @history 2012-11-06 Debbie A. Cook - Changed to use TProjection instead of Projection. * References #775. */ -class map2cam : public Isis::Transform { - private: - Isis::Camera *p_outcam; - Isis::TProjection *p_inmap; - int p_inputSamples; - int p_inputLines; - int p_outputSamples; - int p_outputLines; +namespace Isis { + class map2cam : public Isis::Transform { + private: + Isis::Camera *p_outcam; + Isis::TProjection *p_inmap; + int p_inputSamples; + int p_inputLines; + int p_outputSamples; + int p_outputLines; - public: - // constructor - map2cam(const int inputSamples, const int inputLines, Isis::TProjection *inmap, - const int outputSamples, const int outputLines, Isis::Camera *outcam); + public: + // constructor + map2cam(const int inputSamples, const int inputLines, Isis::TProjection *inmap, + const int outputSamples, const int outputLines, Isis::Camera *outcam); - // destructor - ~map2cam() {}; + // destructor + ~map2cam() {}; - // Implementations for parent's pure virtual members - bool Xform(double &inSample, double &inLine, - const double outSample, const double outLine); - int OutputSamples() const; - int OutputLines() const; -}; + // Implementations for parent's pure virtual members + bool Xform(double &inSample, double &inLine, + const double outSample, const double outLine); + int OutputSamples() const; + int OutputLines() const; + }; + extern void map2cam_f(UserInterface &ui); + extern void BandChange(const int band); +} #endif diff --git a/isis/src/base/apps/map2map/map2map.xml b/isis/src/base/apps/map2map/map2map.xml index 92b5209610..35007bd769 100644 --- a/isis/src/base/apps/map2map/map2map.xml +++ b/isis/src/base/apps/map2map/map2map.xml @@ -167,8 +167,8 @@ File containing mapping parameters - $base/templates/maps - $base/templates/maps/sinusoidal.map + $ISISROOT/appdata/templates/maps + $ISISROOT/appdata/templates/maps/sinusoidal.map A file containing the desired output mapping parameters in PVL. This file can be a simple label file, hand produced or created via @@ -184,7 +184,7 @@ This helper button will cat out the mapping group of the given mapfile to the session log of the application - $ISIS3DATA/base/icons/labels.png + $ISISROOT/appdata/images/icons/labels.png @@ -324,7 +324,7 @@ DEFAULTRANGE = MAP, this will copy the latitudes/longitudes from the map files and calculate the unfound ones from the input cube. - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png diff --git a/isis/src/base/apps/mappt/main.cpp b/isis/src/base/apps/mappt/main.cpp index 0997ba4e08..8f3fbb6a98 100644 --- a/isis/src/base/apps/mappt/main.cpp +++ b/isis/src/base/apps/mappt/main.cpp @@ -2,17 +2,10 @@ #include "Isis.h" -#include -#include +#include "mappt.h" -#include "Brick.h" -#include "FileName.h" -#include "IException.h" -#include "IString.h" -#include "Process.h" -#include "TProjection.h" -#include "ProjectionFactory.h" -#include "SpecialPixel.h" +#include "Application.h" +#include "Pvl.h" using namespace std; using namespace Isis; @@ -25,325 +18,26 @@ map GuiHelpers() { return helper; } -void IsisMain() { - // Use a regular Process - Process p; - - // Open the input cube and initialize the projection - Cube *icube = p.SetInputCube("FROM"); - TProjection *proj = (TProjection *) icube->projection(); - // Get the coordinate +void IsisMain() { UserInterface &ui = Application::GetUserInterface(); - bool outsideAllowed = ui.GetBoolean("ALLOWOUTSIDE"); - int cubeLineLimit = icube->lineCount() + .5; - int cubeSampleLimit = icube->sampleCount() + .5; - - // Get the sample/line position if we have an image point - if(ui.GetString("TYPE") == "IMAGE") { - double samp = ui.GetDouble("SAMPLE"); - double line = ui.GetDouble("LINE"); - if (!outsideAllowed) { - if (samp < .5 || line < .5 || samp > cubeSampleLimit || line > cubeLineLimit) { - QString error = "Requested line,sample is not on the image"; - throw IException(IException::Unknown, error, _FILEINFO_); - } - } - proj->SetWorld(samp, line); - } - - // Get the lat/lon position if we have a ground point - else if(ui.GetString("TYPE") == "GROUND") { - double lat = ui.GetDouble("LATITUDE"); - double lon = ui.GetDouble("LONGITUDE"); - - // Make sure we have a valid latitude value - if(fabs(lat) > 90.0) { - QString msg = "Invalid value for LATITUDE [" - + toString(lat) + "] outside range of "; - msg += "[-90,90]"; - throw IException(IException::User, msg, _FILEINFO_); - } - - IString coordsys = ui.GetString("COORDSYS"); - coordsys.UpCase(); - - // All of these ifs will finish by setting the ground in the projection, - // there are 4 options, Universal, InputFileSystem, Mapfile, and - // Userdefined. - - // Positive East, 0-360, Planetocentric - if(coordsys == "UNIVERSAL") { - proj->SetUniversalGround(lat, lon); - } - - // Use the coordinate system of the input file - else if(coordsys == "INPUTFILESYS") { - proj->SetGround(lat, lon); - } - - // Use the mapping group from a given file - else if(coordsys == "MAP") { - FileName mapFile = ui.GetFileName("MAP"); - - // Does it exist? - if(!mapFile.fileExists()) { - QString msg = "Filename [" + ui.GetFileName("MAP") + "] does not exist"; - throw IException(IException::User, msg, _FILEINFO_); - } - - // Load it up into a new projection - Pvl mapPvl; - mapPvl.read(mapFile.expanded()); - TProjection *altmap = (TProjection *) ProjectionFactory::CreateFromCube(mapPvl); - - // Set lat and lon in its system - altmap->SetGround(lat, lon); - - // Set universal in input cube from universal from given - // mapping/projection - proj->SetUniversalGround( - altmap->UniversalLatitude(), altmap->UniversalLongitude()); - - // I think this is right, no cube owns it, and the factory doesn't. - delete altmap; - altmap = NULL; - } - - // User defined coordinate system, 8 possible combinations - // we only have to make changes for some of them. - // Convert from given system to universal and then set. - else if(coordsys == "USERDEFINED") { - double lat2 = lat; - double lon2 = lon; - - if(ui.GetString("LATTYPE") == "PLANETOGRAPHIC") { - lat2 = proj->ToPlanetocentric(lat); - } - - if(ui.GetString("LONDOM") == "180") { - lon2 = proj->To360Domain(lon); - } - - if(ui.GetString("LONDIR") == "POSITIVEWEST") { - // Use lon2, we know its already in 0-360 - lon2 = proj->ToPositiveEast(lon2, 360); - } - - proj->SetUniversalGround(lat2, lon2); - } - } - - // Get the x/y position if we have a projection point - else { - double x = ui.GetDouble("X"); - double y = ui.GetDouble("Y"); - proj->SetCoordinate(x, y); - } - - PvlGroup results("Results"); - if (proj->WorldX() < .5 || proj->WorldY() < .5 || proj->WorldX() > cubeSampleLimit || - proj->WorldY() > cubeLineLimit) { - if (!outsideAllowed) { - QString error = "Resulting line,sample is not on the image"; - throw IException(IException::Unknown, error, _FILEINFO_); - } - else { - results += PvlKeyword("OutsideOfImage", "Requested point falls outside of image boundaries"); - } + Pvl appLog; + try { + mappt(ui, &appLog); } - - // Create Brick on samp, line to get the dn value of the pixel - Brick b(1, 1, 1, icube->pixelType()); - int intSamp = (int)(proj->WorldX() + 0.5); - int intLine = (int)(proj->WorldY() + 0.5); - b.SetBasePosition(intSamp, intLine, 1); - icube->read(b); - - // Log the position - if(proj->IsGood()) { - results += PvlKeyword("Filename", - FileName(ui.GetFileName("FROM")).expanded()); - results += PvlKeyword("Sample", toString(proj->WorldX())); - results += PvlKeyword("Line", toString(proj->WorldY())); - results += PvlKeyword("PixelValue", PixelToString(b[0])); - results += PvlKeyword("X", toString(proj->XCoord())); - results += PvlKeyword("Y", toString(proj->YCoord())); - - // Put together all the keywords for different coordinate systems. - PvlKeyword centLat = - PvlKeyword("PlanetocentricLatitude", toString(proj->UniversalLatitude())); - - PvlKeyword graphLat = - PvlKeyword("PlanetographicLatitude", - toString(proj->ToPlanetographic(proj->UniversalLatitude()))); - - PvlKeyword pE360 = - PvlKeyword("PositiveEast360Longitude", toString(proj->UniversalLongitude())); - - PvlKeyword pW360 = - PvlKeyword("PositiveWest360Longitude", - toString(proj->ToPositiveWest(proj->UniversalLongitude(), 360))); - - PvlKeyword pE180 = - PvlKeyword("PositiveEast180Longitude", - toString(proj->To180Domain(proj->UniversalLongitude()))); - - PvlKeyword pW180 = - PvlKeyword("PositiveWest180Longitude", - toString(proj->To180Domain(proj->ToPositiveEast( - proj->UniversalLongitude(), 360)))); - - // Input map coordinate system location - // Latitude - if(proj->IsPlanetocentric()) { - centLat.addComment("Input map coordinate system"); - results += centLat; - } - else { - graphLat.addComment("Input map coordinate system"); - results += graphLat; - } - - // Longitude - if(proj->IsPositiveEast()) { - if(proj->Has360Domain()) { - results += pE360; - } - else { - results += pE180; - } - } - else { - if(proj->Has360Domain()) { - results += pW360; - } - else { - results += pW180; - } - } - - // Non input corrdinate system locations - // Latitude - if(proj->IsPlanetocentric()) { - graphLat.addComment("Location in other coordinate systems"); - results += graphLat; - } - else { - centLat.addComment("Location in other coordinate systems"); - results += centLat; - } - - // Longitude - if(proj->IsPositiveEast()) { - if(proj->Has360Domain()) { - results += pW360; - results += pE180; - results += pW180; - } - else { - results += pE360; - results += pW360; - results += pW180; - } - } - else { - if(proj->Has360Domain()) { - results += pE360; - results += pE180; - results += pW180; - } - else { - results += pE360; - results += pE180; - results += pW360; - } - } - - Application::Log(results); - - // Write an output label file if necessary - if(ui.WasEntered("TO")) { - // Get user params from ui - QString outFile = FileName(ui.GetFileName("TO")).expanded(); - bool exists = FileName(outFile).fileExists(); - bool append = ui.GetBoolean("APPEND"); - - // Write the pvl group out to the file - if(ui.GetString("FORMAT") == "PVL") { - Pvl temp; - temp.addGroup(results); - if(append) { - temp.append(outFile); - } - else { - temp.write(outFile); - } - } - - // Create a flatfile of the same data - // The flatfile is comma delimited and can be imported into Excel - else { - ofstream os; - bool writeHeader = false; - if(append) { - os.open(outFile.toLatin1().data(), ios::app); - if(!exists) { - writeHeader = true; - } - } - else { - os.open(outFile.toLatin1().data(), ios::out); - writeHeader = true; - } - - // Rearrange the order of the lat/lons for the csv - results.deleteKeyword( pE360.name() ); - results.deleteKeyword( pE180.name() ); - results.deleteKeyword( pW360.name() ); - results.deleteKeyword( pW180.name() ); - results.deleteKeyword( centLat.name() ); - results.deleteKeyword( graphLat.name() ); - //Correct order. - results += centLat; - results += graphLat; - results += pE360; - results += pE180; - results += pW360; - results += pW180; - - if(writeHeader) { - for(int i = 0; i < results.keywords(); i++) { - os << results[i].name(); - - if(i < results.keywords() - 1) { - os << ","; - } - } - os << endl; - } - - for(int i = 0; i < results.keywords(); i++) { - os << (QString)results[i]; - - if(i < results.keywords() - 1) { - os << ","; - } - } - os << endl; - } - } - else if(ui.GetString("FORMAT") == "FLAT") { - QString msg = "Flat file must have a name."; - throw IException(IException::User, msg, _FILEINFO_); + catch (...) { + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } + throw; } - else { - QString msg = "Could not project requested position"; - throw IException(IException::Unknown, msg, _FILEINFO_); + + for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) { + Application::Log(*grpIt); } } + // Helper function to print out mapfile to session log void PrintMap() { UserInterface &ui = Application::GetUserInterface(); diff --git a/isis/src/base/apps/mappt/mappt.cpp b/isis/src/base/apps/mappt/mappt.cpp new file mode 100644 index 0000000000..e9a231bf19 --- /dev/null +++ b/isis/src/base/apps/mappt/mappt.cpp @@ -0,0 +1,422 @@ +#include +#include + +#include "Brick.h" +#include "FileName.h" +#include "IException.h" +#include "IString.h" +#include "Process.h" +#include "TProjection.h" +#include "ProjectionFactory.h" +#include "SpecialPixel.h" +#include "CSVReader.h" + +#include "mappt.h" + +using namespace std; + + +namespace Isis { + +QList< QPair > getMapPoints(const UserInterface &ui, bool usePointList); +PvlGroup getProjPointInfo(Cube *icube, QPair point, UserInterface &ui, Pvl *log); + +void mappt(UserInterface &ui, Pvl *log) { + Cube *cube = new Cube(); + CubeAttributeInput inAtt = ui.GetInputAttribute("FROM"); + + if (inAtt.bands().size() != 0) { + cube->setVirtualBands(inAtt.bands()); + } + + cube->open(ui.GetFileName("FROM"), "r"); + mappt(cube, ui, log, &inAtt); +} + +void mappt(Cube *icube, UserInterface &ui, Pvl *log, CubeAttributeInput* inAtt) { + // Open the input cube and initialize the projection + + QList> points = getMapPoints(ui, ui.WasEntered("COORDLIST")); + + if(log) { + for(int i = 0; i < points.size(); i++) { + log->addGroup(getProjPointInfo(icube, points[i], ui, log)); + } + } + + // Write an output label file if necessary + if(ui.WasEntered("TO")) { + // Get user params from ui + QString outFile = FileName(ui.GetFileName("TO")).expanded(); + bool exists = FileName(outFile).fileExists(); + bool append = ui.GetBoolean("APPEND"); + + // Write the pvl group out to the file + if(ui.GetString("FORMAT") == "PVL") { + if(append) { + log->append(outFile); + } + else { + log->write(outFile); + } + } + + // Create a flatfile of the same data + // The flatfile is comma delimited and can be imported into Excel + else { + ofstream os; + bool writeHeader = false; + if(append) { + os.open(outFile.toLatin1().data(), ios::app); + if(!exists) { + writeHeader = true; + } + } + else { + os.open(outFile.toLatin1().data(), ios::out); + writeHeader = true; + } + + PvlGroup fResult = log->group(0); + + if(writeHeader) { + for(int i = 0; i < fResult.keywords(); i++) { + os << fResult[i].name(); + + if(i < fResult.keywords() - 1) { + os << ","; + } + } + os << endl; + } + + for(int i = 0; i < log->groups(); i++) { + PvlGroup group = log->group(i); + for(int j = 0; j < group.keywords(); j++) { + os << (QString)group[j]; + if(j < group.keywords() - 1) { + os << ","; + } + } + os << endl; + } // end of keyword loop + } // end of group loop + + } + else if(ui.GetString("FORMAT") == "FLAT") { + QString msg = "Flat file must have a name."; + throw IException(IException::User, msg, _FILEINFO_); + } +} + + +PvlGroup getProjPointInfo(Cube *icube, QPair point, UserInterface &ui, Pvl *log) { + // Get the coordinate + bool outsideAllowed = ui.GetBoolean("ALLOWOUTSIDE"); + int cubeLineLimit = icube->lineCount() + .5; + int cubeSampleLimit = icube->sampleCount() + .5; + + TProjection *proj = (TProjection *) icube->projection(); + // Get the sample/line position if we have an image point + if(ui.GetString("TYPE") == "IMAGE") { + double samp = point.first; + double line = point.second; + + if (!outsideAllowed) { + if (samp < .5 || line < .5 || samp > cubeSampleLimit || line > cubeLineLimit) { + QString error = "Requested line,sample is not on the image"; + throw IException(IException::Unknown, error, _FILEINFO_); + } + } + proj->SetWorld(samp, line); + } + + // Get the lat/lon position if we have a ground point + else if(ui.GetString("TYPE") == "GROUND") { + double lat = point.first; + double lon = point.second; + + // Make sure we have a valid latitude value + if(fabs(lat) > 90.0) { + QString msg = "Invalid value for LATITUDE [" + + toString(lat) + "] outside range of "; + msg += "[-90,90]"; + throw IException(IException::User, msg, _FILEINFO_); + } + + IString coordsys = ui.GetString("COORDSYS"); + coordsys.UpCase(); + + // All of these ifs will finish by setting the ground in the projection, + // there are 4 options, Universal, InputFileSystem, Mapfile, and + // Userdefined. + + // Positive East, 0-360, Planetocentric + if(coordsys == "UNIVERSAL") { + proj->SetUniversalGround(lat, lon); + } + + // Use the coordinate system of the input file + else if(coordsys == "INPUTFILESYS") { + proj->SetGround(lat, lon); + } + + // Use the mapping group from a given file + else if(coordsys == "MAP") { + FileName mapFile = ui.GetFileName("MAP"); + + // Does it exist? + if(!mapFile.fileExists()) { + QString msg = "Filename [" + ui.GetFileName("MAP") + "] does not exist"; + throw IException(IException::User, msg, _FILEINFO_); + } + + // Load it up into a new projection + Pvl mapPvl; + mapPvl.read(mapFile.expanded()); + TProjection *altmap = (TProjection *) ProjectionFactory::CreateFromCube(mapPvl); + + // Set lat and lon in its system + altmap->SetGround(lat, lon); + + // Set universal in input cube from universal from given + // mapping/projection + proj->SetUniversalGround( + altmap->UniversalLatitude(), altmap->UniversalLongitude()); + + // I think this is right, no cube owns it, and the factory doesn't. + delete altmap; + altmap = NULL; + } + + // User defined coordinate system, 8 possible combinations + // we only have to make changes for some of them. + // Convert from given system to universal and then set. + else if(coordsys == "USERDEFINED") { + double lat2 = lat; + double lon2 = lon; + + if(ui.GetString("LATTYPE") == "PLANETOGRAPHIC") { + lat2 = proj->ToPlanetocentric(lat); + } + + if(ui.GetString("LONDOM") == "180") { + lon2 = proj->To360Domain(lon); + } + + if(ui.GetString("LONDIR") == "POSITIVEWEST") { + // Use lon2, we know its already in 0-360 + lon2 = proj->ToPositiveEast(lon2, 360); + } + + proj->SetUniversalGround(lat2, lon2); + } + } + + // Get the x/y position if we have a projection point + else { + double x = point.first; + double y = point.second; + proj->SetCoordinate(x, y); + } + + PvlGroup results("Results"); + if (proj->WorldX() < .5 || proj->WorldY() < .5 || proj->WorldX() > cubeSampleLimit || + proj->WorldY() > cubeLineLimit) { + if (!outsideAllowed) { + QString error = "Resulting line,sample is not on the image"; + throw IException(IException::Unknown, error, _FILEINFO_); + } + else { + results += PvlKeyword("OutsideOfImage", "Requested point falls outside of image boundaries"); + } + } + + // Create Brick on samp, line to get the dn value of the pixel + Brick b(1, 1, 1, icube->pixelType()); + int intSamp = (int)(proj->WorldX() + 0.5); + int intLine = (int)(proj->WorldY() + 0.5); + + b.SetBasePosition(intSamp, intLine, 1); + icube->read(b); + + QString filterName = "Null"; + + if ( icube->label()->findObject("IsisCube").hasGroup("BandBin")) { + PvlGroup bandBin = icube->label()->findObject("IsisCube").findGroup("BandBin"); + if (bandBin.hasKeyword("FilterName")) { + filterName = bandBin.findKeyword("FilterName")[0]; + } + } + + // Log the position + if(proj->IsGood()) { + results += PvlKeyword("Filename", + FileName(icube->fileName()).expanded()); + results += PvlKeyword("Sample", toString(proj->WorldX())); + results += PvlKeyword("Line", toString(proj->WorldY())); + results += PvlKeyword("Band", toString(icube->physicalBand(1))); + results += PvlKeyword("FilterName", filterName); + results += PvlKeyword("PixelValue", PixelToString(b[0])); + results += PvlKeyword("X", toString(proj->XCoord())); + results += PvlKeyword("Y", toString(proj->YCoord())); + + // Put together all the keywords for different coordinate systems. + PvlKeyword centLat = + PvlKeyword("PlanetocentricLatitude", toString(proj->UniversalLatitude())); + + PvlKeyword graphLat = + PvlKeyword("PlanetographicLatitude", + toString(proj->ToPlanetographic(proj->UniversalLatitude()))); + + PvlKeyword pE360 = + PvlKeyword("PositiveEast360Longitude", toString(proj->UniversalLongitude())); + + PvlKeyword pW360 = + PvlKeyword("PositiveWest360Longitude", + toString(proj->ToPositiveWest(proj->UniversalLongitude(), 360))); + + PvlKeyword pE180 = + PvlKeyword("PositiveEast180Longitude", + toString(proj->To180Domain(proj->UniversalLongitude()))); + + PvlKeyword pW180 = + PvlKeyword("PositiveWest180Longitude", + toString(proj->To180Domain(proj->ToPositiveEast( + proj->UniversalLongitude(), 360)))); + + + // Input map coordinate system location + // Latitude + if(proj->IsPlanetocentric()) { + centLat.addComment("Input map coordinate system"); + results += centLat; + } + else { + graphLat.addComment("Input map coordinate system"); + results += graphLat; + } + + // Longitude + if(proj->IsPositiveEast()) { + if(proj->Has360Domain()) { + results += pE360; + } + else { + results += pE180; + } + } + else { + if(proj->Has360Domain()) { + results += pW360; + } + else { + results += pW180; + } + } + + // Non input corrdinate system locations + // Latitude + if(proj->IsPlanetocentric()) { + graphLat.addComment("Location in other coordinate systems"); + results += graphLat; + } + else { + centLat.addComment("Location in other coordinate systems"); + results += centLat; + } + + // Longitude + if(proj->IsPositiveEast()) { + if(proj->Has360Domain()) { + results += pW360; + results += pE180; + results += pW180; + } + else { + results += pE360; + results += pW360; + results += pW180; + } + } + else { + if(proj->Has360Domain()) { + results += pE360; + results += pE180; + results += pW180; + } + else { + results += pE360; + results += pE180; + results += pW360; + } + } + + if (ui.GetString("FORMAT") == "FLAT") { + // Rearrange the order of the lat/lons for the csv + results.deleteKeyword( pE360.name() ); + results.deleteKeyword( pE180.name() ); + results.deleteKeyword( pW360.name() ); + results.deleteKeyword( pW180.name() ); + results.deleteKeyword( centLat.name() ); + results.deleteKeyword( graphLat.name() ); + //Correct order. + results += centLat; + results += graphLat; + results += pE360; + results += pE180; + results += pW360; + results += pW180; + } + } + + return results; +} + + +QList< QPair > getMapPoints(const UserInterface &ui, bool usePointList) { + double point1 = 0.0; + double point2 = 0.0; + QList< QPair > points; + QString pointType = ui.GetString("TYPE"); + + // Check if the provided coordinate list is valid, i.e. a Samp/Line or Lat/Long coordinate per row + if (usePointList) { + + CSVReader reader; + reader.read(FileName(ui.GetFileName("COORDLIST")).expanded()); + + if (!reader.isTableValid(reader.getTable()) || reader.columns() != 2) { + QString msg = "Coordinate file formatted incorrectly.\n" + "Each row must have two columns: a sample,line or a latitude,longitude pair."; + throw IException(IException::User, msg, _FILEINFO_); + } + for (int row = 0; row < reader.rows(); row++) { + point1 = toDouble(reader.getRow(row)[0]); + point2 = toDouble(reader.getRow(row)[1]); + points.append(QPair(point1, point2)); + } + } + // Grab the coordinate from the ui position parameters if no coordinate list is provided + else { + if (pointType == "IMAGE") { + if (ui.WasEntered("SAMPLE")) + point1 = ui.GetDouble("SAMPLE"); + if (ui.WasEntered("LINE")) + point2 = ui.GetDouble("LINE"); + } + else if (pointType == "GROUND") { + point1 = ui.GetDouble("LATITUDE"); + point2 = ui.GetDouble("LONGITUDE"); + } + else { + // Projection type selected + point1 = ui.GetDouble("X"); + point2 = ui.GetDouble("Y"); + } + points.append(QPair(point1, point2)); + } + + return points; +} +} diff --git a/isis/src/base/apps/mappt/mappt.h b/isis/src/base/apps/mappt/mappt.h new file mode 100644 index 0000000000..d368c74655 --- /dev/null +++ b/isis/src/base/apps/mappt/mappt.h @@ -0,0 +1,12 @@ +#ifndef mappt_h +#define mappt_h + +#include "Pvl.h" +#include "UserInterface.h" + +namespace Isis{ + extern void mappt(Cube *cube, UserInterface &ui, Pvl *log=nullptr, CubeAttributeInput* inAtt = nullptr); + extern void mappt(UserInterface &ui, Pvl *log= nullptr); +} + +#endif diff --git a/isis/src/base/apps/mappt/mappt.xml b/isis/src/base/apps/mappt/mappt.xml index 40cf9430cf..54f9a4eefa 100644 --- a/isis/src/base/apps/mappt/mappt.xml +++ b/isis/src/base/apps/mappt/mappt.xml @@ -178,10 +178,6 @@ This option interprets the coordinate as sample/line and will compute latitude/longitude and x/y
    - - SAMPLE - LINE - LATITUDE LONGITUDE @@ -200,11 +196,6 @@ This option interprets the coordinate as latitude/longitude and will compute sample/line and x/y - - LATITUDE - LONGITUDE - COORDSYS - SAMPLE LINE @@ -218,10 +209,6 @@ This option interprets the coordinate as x/y and will compute sample/line and latitude/longitude - - X - Y - SAMPLE LINE @@ -308,6 +295,75 @@ + + boolean + FALSE + + Enable coordinate list parameters in the GUI + + + Selecting this parameter will enable the 'COORDLIST' parameter in the + GUI. +

    + Note that this parameter is optional when running mappt on the + command line. +

    +
    + + COORDLIST + TYPE + + + TYPE + SAMPLE + X + Y + LINE + LATITUDE + LONGITUDE + +
    + + + filename + input + + Input comma-delimited file of image or ground coordinates + + None + + An input comma-delimited flatfile of image, ground or projection coordinates. + This allows the program to process multiple coordinates in a single run of mappt, + and output the results to the specified output file. +

    + Expected order for image coordinates: sample, line
    + Expected order for ground coordinates: latitude, longitude + Expected order for projection coordinates: X, Y +

    +

    + The "Error" keyword will only appear when using a coordinate list. The value of "Error" + will then be NULL unless an error occurs during the processing of a coordinate in the + coordinate list. Then, the value of this keyword will be the error message. This allows + for mappt to continue processing the remaining coordinates in the coordinate + list. +

    +

    + For the input of Latitude and Longitude, mappt expects + Planetocentric Latitude (within -90 to 90 boundary) and + Positive East Longitude (with 0-360 boundary) to find the location in the + input camera image. +

    +
    + + SAMPLE + LINE + X + Y + LATITUDE + LONGITUDE + +
    + boolean @@ -438,7 +494,7 @@ This helper button will cat out the mapping group of the given mapfile to the session log of the application - $ISIS3DATA/base/icons/labels.png + $ISISROOT/appdata/images/icons/labels.png diff --git a/isis/src/base/apps/mappt/tsts/Makefile b/isis/src/base/apps/mappt/tsts/Makefile deleted file mode 100644 index 46d84c74c2..0000000000 --- a/isis/src/base/apps/mappt/tsts/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -BLANKS = "%-6s" -LENGTH = "%-40s" - -include $(ISISROOT)/make/isismake.tststree diff --git a/isis/src/base/apps/mappt/tsts/allowoutside/Makefile b/isis/src/base/apps/mappt/tsts/allowoutside/Makefile deleted file mode 100644 index 7f66567277..0000000000 --- a/isis/src/base/apps/mappt/tsts/allowoutside/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -APPNAME = mappt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/mola_clon0.cub \ - append=false \ - type=ground \ - latitude=17 \ - longitude=10 > $(OUTPUT)/mappt.pvl; diff --git a/isis/src/base/apps/mappt/tsts/coordsys/Makefile b/isis/src/base/apps/mappt/tsts/coordsys/Makefile deleted file mode 100644 index b6102915a7..0000000000 --- a/isis/src/base/apps/mappt/tsts/coordsys/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -APPNAME = mappt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/I00824006RDR.lev2.cub \ - to=$(OUTPUT)/mappt.pvl \ - append=false \ - type=ground \ - coordsys=userdefined \ - lattype=planetographic \ - londir=positivewest \ - londom=180 \ - latitude=-1.527843650235 \ - longitude=7.8016320748916 \ - > /dev/null; diff --git a/isis/src/base/apps/mappt/tsts/flatOutput/Makefile b/isis/src/base/apps/mappt/tsts/flatOutput/Makefile deleted file mode 100644 index ebebde6744..0000000000 --- a/isis/src/base/apps/mappt/tsts/flatOutput/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -APPNAME = mappt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/I00824006RDR.lev2.cub \ - to=$(OUTPUT)/tmp.csv \ - format=flat \ - append=false \ - type=ground \ - coordsys=userdefined \ - lattype=planetographic \ - londir=positivewest \ - londom=180 \ - latitude=-1.527843650235 \ - longitude=7.8016320748916 \ - > /dev/null; \ - `sed 's/\(^Filename\,\)//g' $(OUTPUT)/tmp.csv > $(OUTPUT)/tmp2.csv`; \ - `sed 's/\(^.*\/I00824006RDR\.lev2\.cub\,\)//g' $(OUTPUT)/tmp2.csv > $(OUTPUT)/mappt.csv` \ - $(RM) $(OUTPUT)/tmp.csv; \ - $(RM) $(OUTPUT)/tmp2.csv; diff --git a/isis/src/base/apps/mappt/tsts/ground/Makefile b/isis/src/base/apps/mappt/tsts/ground/Makefile deleted file mode 100644 index c233de220c..0000000000 --- a/isis/src/base/apps/mappt/tsts/ground/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -APPNAME = mappt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/I00824006RDR.lev2.cub \ - to=$(OUTPUT)/mappt2.pvl \ - append=false \ - type=ground \ - latitude=-1.7798488125312 \ - longitude=352.13074447388 > /dev/null; diff --git a/isis/src/base/apps/mappt/tsts/image/Makefile b/isis/src/base/apps/mappt/tsts/image/Makefile deleted file mode 100644 index b85a2b6999..0000000000 --- a/isis/src/base/apps/mappt/tsts/image/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -APPNAME = mappt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/I00824006RDR.lev2.cub \ - append=false \ - type=image \ - sample=41 \ - line=181 > $(OUTPUT)/mappt1.pvl; diff --git a/isis/src/base/apps/mappt/tsts/projection/Makefile b/isis/src/base/apps/mappt/tsts/projection/Makefile deleted file mode 100644 index 4ba3c0fb23..0000000000 --- a/isis/src/base/apps/mappt/tsts/projection/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -APPNAME = mappt - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) from=$(INPUT)/I00824006RDR.lev2.cub \ - to=$(OUTPUT)/mappt3.pvl \ - append=false \ - type=projection \ - x=-51500 \ - y=-105500 > /dev/null; diff --git a/isis/src/base/apps/maptemplate/maptemplate.xml b/isis/src/base/apps/maptemplate/maptemplate.xml index 3cc31004f5..9f5209b181 100644 --- a/isis/src/base/apps/maptemplate/maptemplate.xml +++ b/isis/src/base/apps/maptemplate/maptemplate.xml @@ -46,7 +46,7 @@ To convert a raw instrument/camera cube (Level1) to a map projected image (Level2) the user must (1) create a custom PVL formatted text file, (2) use this maptemplate application to produce one, or (3) use - the automated, projection-specific Map File Template in $ISIS3DATA/base/templates/maps. + the automated, projection-specific Map File Template in $ISISROOT/templates/appdata/maps. Whichever method that you choose, the Map File Template should contain the necessary keywords to project an image.

    @@ -91,7 +91,7 @@ it requires keywords that are not defined in the program.

  • - Templates in $ISIS3DATA/base/templates/maps: the template contains all the + Templates in $ISISROOT/templates/appdata/maps: the template contains all the parameters necessary to project an image, and only the Projection name is "uncommented" in the file. This is because some projections only require that you enter a projection name, and the default values are computed for @@ -434,7 +434,7 @@ Group = Mapping This Help button will display the current map file in the log area - $ISIS3DATA/base/icons/view_text.png + $ISISROOT/appdata/images/icons/view_text.png helperButtonLoadMap @@ -443,7 +443,7 @@ Group = Mapping This Help button will take the values currently in the map file and load them into their correct locations in the GUI - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png @@ -917,9 +917,6 @@ Group = Mapping filename - - $ISIS3DATA/base/templates/targets/ - Name of the Map File @@ -935,7 +932,7 @@ Group = Mapping helperButtonLogTargDef View MAP file contents in log area This Help button will display the selected map file contents in the log area - $ISIS3DATA/base/icons/view_text.png + $ISISROOT/appdata/images/icons/view_text.png helperButtonLoadTargDef @@ -944,7 +941,7 @@ Group = Mapping This Help button will take the values in the map file and load them into their correct locations in the GUI. - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png @@ -1073,7 +1070,7 @@ Group = Mapping This button will display the system radii values for the target name in the log area - $ISIS3DATA/base/icons/view_text.png + $ISISROOT/appdata/images/icons/view_text.png @@ -1123,7 +1120,7 @@ Group = Mapping The ranges will be calculated using the target information in the GUI. If no target information is entered, then the camera defaults will be used. - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png @@ -1247,7 +1244,7 @@ Group = Mapping the FROMLIST. The result of this calculation will be in meters/pixel and defined as the PixelResolution in the map file. - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png diff --git a/isis/src/base/apps/mosrange/mosrange.xml b/isis/src/base/apps/mosrange/mosrange.xml index 6d05637f2e..6828eb93f8 100644 --- a/isis/src/base/apps/mosrange/mosrange.xml +++ b/isis/src/base/apps/mosrange/mosrange.xml @@ -137,7 +137,7 @@ End filename input - $base/templates/maps + $ISISROOT/appdata/templates/maps None *.map *.cub diff --git a/isis/src/base/apps/mosrange/tsts/default/Makefile b/isis/src/base/apps/mosrange/tsts/default/Makefile index 969cf3c723..fd4016ca30 100644 --- a/isis/src/base/apps/mosrange/tsts/default/Makefile +++ b/isis/src/base/apps/mosrange/tsts/default/Makefile @@ -11,7 +11,7 @@ include $(ISISROOT)/make/isismake.tsts commands: $(LS) $(INPUT)/*.cub > $(OUTPUT)/files.lis; $(APPNAME) FROMLIST=$(OUTPUT)/files.lis \ - MAP=$(ISIS3DATA)/base/templates/maps/equirectangular.map \ + MAP=$(ISISROOT)/appdata/templates/maps/equirectangular.map \ TO=$(OUTPUT)/mosrange_equi.map PRECISION=4 > /dev/null; /bin/mv $(OUTPUT)/mosrange_equi.map $(OUTPUT)/mosrange_equi.txt $(RM) $(OUTPUT)/files.lis; diff --git a/isis/src/base/apps/nocam2map/nocam2map.xml b/isis/src/base/apps/nocam2map/nocam2map.xml index 98dda7ac31..56fd742d07 100644 --- a/isis/src/base/apps/nocam2map/nocam2map.xml +++ b/isis/src/base/apps/nocam2map/nocam2map.xml @@ -346,8 +346,8 @@ File containing mapping parameters - $base/templates/maps - $base/templates/maps/sinusoidal.map + $ISISROOT/appdata/templates/maps + $ISISROOT/appdata/templates/maps/sinusoidal.map A file containing the desired output mapping parameters in PVL form. This file can be a simple hand produced label @@ -363,7 +363,7 @@ This helper button will cat out the mapping group of the given map file to the session log of the application - $ISIS3DATA/base/icons/labels.png + $ISISROOT/appdata/images/icons/labels.png @@ -390,7 +390,7 @@ Compute Pixel Resolution This helper button will compute the pixel resolution from the input - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png LoadMapRes @@ -524,7 +524,7 @@ Compute Input Ground range This helper button will load the default ground range from the input - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png LoadMapRange diff --git a/isis/src/base/apps/noproj/main.cpp b/isis/src/base/apps/noproj/main.cpp index 68fc53fd92..671ab73fd7 100644 --- a/isis/src/base/apps/noproj/main.cpp +++ b/isis/src/base/apps/noproj/main.cpp @@ -72,8 +72,7 @@ void IsisMain() { specs = ui.GetFileName("SPECS"); } else { - specs = "$base/applications/noprojInstruments???.pvl"; - specs = specs.highestVersion(); + specs = "$ISISROOT/appdata/templates/noproj/noprojInstruments.pvl"; } Pvl idealSpecs(specs.expanded()); PvlObject obSpecs = idealSpecs.findObject("IdealInstrumentsSpecifications"); diff --git a/isis/src/base/apps/noproj/noproj.xml b/isis/src/base/apps/noproj/noproj.xml index fa2480ce92..8dc3884b9d 100644 --- a/isis/src/base/apps/noproj/noproj.xml +++ b/isis/src/base/apps/noproj/noproj.xml @@ -125,13 +125,13 @@ This file contains the specifications for the "ideal" camera based on the original instrument. If no value is entered, the default - specs file will be read from "$base/applications/noprojInstruments???.pvl", where ??? indicates the highest version of the file. + specs file will be read from "$ISISROOT/appdata/templates/noproj/noprojInstruments.pvl" *.pvl - $base/applications/ + $ISISROOT/appdata/templates/noproj/ @@ -164,7 +164,7 @@ LoadMatchSummingMode Load Output Summing Mode from Match file This helper button will load the default summing mode from the match camera - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png LoadInputSummingMode diff --git a/isis/src/base/apps/pds2isis/pds2isis.xml b/isis/src/base/apps/pds2isis/pds2isis.xml index 0f88247503..b203439a73 100644 --- a/isis/src/base/apps/pds2isis/pds2isis.xml +++ b/isis/src/base/apps/pds2isis/pds2isis.xml @@ -8,55 +8,68 @@ xsi:noNamespaceSchemaLocation=

    - This program converts a PDS or ISIS2 formatted file to an ISIS3 - cube format. The standard PDS image is defined in - the "FROM" parameter, and not the "IMAGE" parameter. If the PDS file has - a detached label file and an image file, both are required to exist in the - working directory. If the label is detached, the detached label filename + This program converts a PDS or ISIS2 formatted file to an ISIS3 + cube format. The standard PDS image is defined in + the "FROM" parameter, and not the "IMAGE" parameter. If the PDS file has + a detached label file and an image file, both are required to exist in the + working directory. If the label is detached, the detached label filename is defined as the input file for the "FROM" parameter. The "IMAGE" parameter - does not need to be defined, unless the program fails to find the image file + does not need to be defined, unless the program fails to find the image file specifed in the label file upon the program's execution. - - The default settings normally work for most PDS products, but occasionally - the user may need to modify the default values in order to obtain an image + + The default settings normally work for most PDS products, but occasionally + the user may need to modify the default values in order to obtain an image that meets their specific requirements.

    - The incoming special pixel values in the - PDS file are assigned equivalent values for special pixels in ISIS3. The - order of precedence for special pixels in ISIS from highest to lowest - priority is the following: + The incoming special pixel values in the + PDS file are assigned equivalent values for special pixels in ISIS3. The + order of precedence for special pixels in ISIS from highest to lowest + priority is the following:

      -
    1. NULL
    2. -
    3. HRS
    4. -
    5. LRS
    6. +
    7. NULL
    8. +
    9. HRS
    10. +
    11. LRS
    12. HIS
    13. LIS
    -
    - If any incoming pixel value falls within - two different special pixel types, the special - pixel with the higher priority is assigned. The user may also + + If any incoming pixel value falls within + two different special pixel types, the special + pixel with the higher priority is assigned. The user may also specify a range of pixel values to be assigned to the different special pixels. - If the range of pixel values defined by the user for the different special - pixels overlap, the special pixel with the highest priority is assigned. For - example, if NULLMIN=0.0, NULLMAX=3.0, LISMIN=3.0, and LISMAX=5.0, the actual - raw value 3.0 can be assigned as a NULL or LIS, but is translated to NULL because - NULL has a higher priority than LIS. The conversion of images from ISIS2 to - ISIS3 follows the same rules as PDS images, except that the label information + If the range of pixel values defined by the user for the different special + pixels overlap, the special pixel with the highest priority is assigned. For + example, if NULLMIN=0.0, NULLMAX=3.0, LISMIN=3.0, and LISMAX=5.0, the actual + raw value 3.0 can be assigned as a NULL or LIS, but is translated to NULL because + NULL has a higher priority than LIS. +

    +

    + It should be noted if any incoming pixel values + are equal to one of the ISIS special pixel + values for the corresponding bit type, those pixels will be special in the + output cube. The special pixel values for each bit type can be found + here. + This is most commonly an issue with 8-bit data. If you are working with + an 8-bit image and need either 0 or 255, either convert the data to 16-bit + or use Stretch after ingestion. +

    +

    + The conversion of images from ISIS2 to ISIS3 + follows the same rules as PDS images, except that the label information is propagated to the output file.

    - The best option to convert files from ISIS2 to ISIS3 is to maintain all the - input file settings, and do not change the bit type - or change any incoming pixel values to special pixels. When an ISIS2 - Level1 image is imported into ISIS3, it is important to note the - label information is not propagated from the ISIS2 to the ISIS3 cube file. - For an ISIS2 Level2 image or mosaic file, a limited set of label - information is transferred to the ISIS3 labels that include the "Instrument," - "BandBin," and "Mapping" - groups. + The best option to convert files from ISIS2 to ISIS3 is to maintain all the + input file settings, and do not change the bit type + or change any incoming pixel values to special pixels. + When an ISIS2 Level1 image is imported into ISIS3, it is + important to note the label information is not propagated from the ISIS2 to + the ISIS3 cube file. For an ISIS2 Level2 image or mosaic file, + a limited set of label information is transferred to the ISIS3 labels that + include the "Instrument," "BandBin," and + "Mapping" groups.

    @@ -89,8 +102,8 @@ xsi:noNamespaceSchemaLocation= Added LatitudeType2 group to translation table to handle CTX cubes. - Additonal changes to projection translation tables for other possible - values for Longitude direction, latitude type. If the min or max + Additonal changes to projection translation tables for other possible + values for Longitude direction, latitude type. If the min or max longitude values are greater than 180, change longitude domain to 360. Only call TranslateIsis2Labels if pds file is an Isis2 cube. @@ -112,7 +125,7 @@ xsi:noNamespaceSchemaLocation= NIMS RDR products fixes #1029. - Improve the documentation, document capability to import ISIS2 images, + Improve the documentation, document capability to import ISIS2 images, fixes #1172. @@ -125,10 +138,10 @@ xsi:noNamespaceSchemaLocation= References: #2368. - Added conditional to check whether default offsets and multipliers where changed from their + Added conditional to check whether default offsets and multipliers where changed from their default values and log them if so. - + @@ -148,7 +161,7 @@ xsi:noNamespaceSchemaLocation= Specify a PDS file, PDS label file, or ISIS2 cube file. If the input file is a PDS detached label file and the companion image - file is not in the same directory, use the parameter "IMAGE" to + file is not in the same directory, use the parameter "IMAGE" to define the location and filename of the image, otherwise just enter the label file name. @@ -161,7 +174,7 @@ xsi:noNamespaceSchemaLocation= filename input - Detached image file + Detached image file Use this parameter if the pointer to the image data in the @@ -202,14 +215,14 @@ xsi:noNamespaceSchemaLocation= If this option is set to "yes" or "true", a range of input raw pixels defined by the NULLMIN and NULLMAX parameters are converted to NULL - pixels. All other valid pixels that do not fall within the ranges - specified for LIS, LRS, HIS, and HRS pixels are transferred to the output file - unchanged. If the bit type of the input - file is changed, the NULL and HRS special - pixels may be incorrectly set to valid pixel values. For example, - if a raw 8-bit file is output to 16 or 32-bit, the pixel values "0" - and "255" may be converted to actual values instead of retaining the - special pixel property. If the output file remains as 8-bit, then "0" + pixels. All other valid pixels that do not fall within the ranges + specified for LIS, LRS, HIS, and HRS pixels are transferred to the output file + unchanged. If the bit type of the input + file is changed, the NULL and HRS special + pixels may be incorrectly set to valid pixel values. For example, + if a raw 8-bit file is output to 16 or 32-bit, the pixel values "0" + and "255" may be converted to actual values instead of retaining the + special pixel property. If the output file remains as 8-bit, then "0" stays as NULL and "255" stays as HRS. @@ -249,14 +262,14 @@ xsi:noNamespaceSchemaLocation= If this option is set to "yes" or "true", a range of input raw pixels defined by the HRSMIN and HRSMAX parameters are converted to HRS - pixels. All other valid pixels that do not fall within the ranges - specified for LIS, LRS, HIS, and NULL pixels are transferred to the output file - unchanged. If the bit type of the input - file is changed, the NULL and HRS special - pixels may be incorrectly set to valid pixel values. For example, - if a raw 8-bit file is output to 16 or 32-bit, the pixel values "0" - and "255" may be converted to actual values instead of retaining the - special pixel property. If the output file remains as 8-bit, then "0" + pixels. All other valid pixels that do not fall within the ranges + specified for LIS, LRS, HIS, and NULL pixels are transferred to the output file + unchanged. If the bit type of the input + file is changed, the NULL and HRS special + pixels may be incorrectly set to valid pixel values. For example, + if a raw 8-bit file is output to 16 or 32-bit, the pixel values "0" + and "255" may be converted to actual values instead of retaining the + special pixel property. If the output file remains as 8-bit, then "0" stays as NULL and "255" stays as HRS. @@ -296,9 +309,9 @@ xsi:noNamespaceSchemaLocation= If this option is set to "yes" or "true", a range of input raw pixels defined by the HISMIN and HISMAX parameters are converted to HIS - pixels. All other valid pixels that do not fall within the ranges - specified for LIS, LRS, HRS, and NULL pixels are transferred to the - output file unchanged. + pixels. All other valid pixels that do not fall within the ranges + specified for LIS, LRS, HRS, and NULL pixels are transferred to the + output file unchanged. HISMIN @@ -337,8 +350,8 @@ xsi:noNamespaceSchemaLocation= If this option is set to "yes" or "true", a range of input raw pixels defined by the LRSMIN and LRSMAX parameters are converted to LRS - pixels. All other valid pixels that do not fall within the ranges - specified for LIS, HIS, HRS, and NULL pixels are transferred to the + pixels. All other valid pixels that do not fall within the ranges + specified for LIS, HIS, HRS, and NULL pixels are transferred to the output file unchanged. @@ -378,8 +391,8 @@ xsi:noNamespaceSchemaLocation= If this option is set to "yes" or "true", a range of input raw pixels defined by the LISMIN and LISMAX parameters are converted to LIS - pixels. All other valid pixels that do not fall within the ranges - specified for LRS, HIS, HRS, and NULL pixels are transferred to the + pixels. All other valid pixels that do not fall within the ranges + specified for LRS, HIS, HRS, and NULL pixels are transferred to the output file unchanged. @@ -421,17 +434,17 @@ xsi:noNamespaceSchemaLocation= The example ingests a PDS formatted file, and outputs an ISIS3 cube file - using the default settings for the program. + using the default settings for the program. from=input.img to=out.cub - This example shows the use of pds2isis to create an ISIS3 cube file. + This example shows the use of pds2isis to create an ISIS3 cube file. - + @@ -458,14 +471,14 @@ xsi:noNamespaceSchemaLocation= FROM - + The ISIS3 output cube file - This screenshot displays the ouput of the pds2isis application. + This screenshot displays the ouput of the pds2isis application. diff --git a/isis/src/base/apps/phocube/main.cpp b/isis/src/base/apps/phocube/main.cpp index 1b40cd7eb5..da7c93e2ed 100644 --- a/isis/src/base/apps/phocube/main.cpp +++ b/isis/src/base/apps/phocube/main.cpp @@ -16,46 +16,10 @@ using namespace std; using namespace Isis; -// Global variables -Camera *cam; -TProjection *proj; -int nbands; -bool noCamera; - -bool dn; -bool phase; -bool emission; -bool incidence; -bool localEmission; -bool localIncidence; -bool latitude; -bool longitude; -bool pixelResolution; -bool lineResolution; -bool sampleResolution; -bool detectorResolution; -bool obliqueDetectorResolution; -bool northAzimuth; -bool sunAzimuth; -bool spacecraftAzimuth; -bool offnadirAngle; -bool subSpacecraftGroundAzimuth; -bool subSolarGroundAzimuth; -bool morphologyRank; -bool albedoRank; -bool ra; -bool declination; -bool bodyFixedX; -bool bodyFixedY; -bool bodyFixedZ; - -void phocubeDN(Buffer &in, Buffer &out); -void phocube(Buffer &out); - // Function to create a keyword with same values of a specified count -template PvlKeyword makeKey(const QString &name, - const int &nvals, +template PvlKeyword makeKey(const QString &name, + const int &nvals, const T &value); // Structure containing new mosaic planes @@ -68,11 +32,9 @@ struct MosData { // Computes the special MORPHOLOGYRANK and ALBEDORANK planes MosData *getMosaicIndicies(Camera &camera, MosData &md); // Updates BandBin keyword -void UpdateBandKey(const QString &keyname, PvlGroup &bb, const int &nvals, +void UpdateBandKey(const QString &keyname, PvlGroup &bb, const int &nvals, const QString &default_value = "Null"); - - void IsisMain() { UserInterface &ui = Application::GetUserInterface(); @@ -80,6 +42,8 @@ void IsisMain() { // projection information Process p1; Cube *icube = p1.SetInputCube("FROM", OneBand); + + bool noCamera; if (ui.GetString("SOURCE") == "CAMERA") { noCamera = false; } @@ -87,6 +51,8 @@ void IsisMain() { noCamera = true; } + Camera *cam; + TProjection *proj; if(noCamera) { try { proj = (TProjection *) icube->projection(); @@ -95,7 +61,7 @@ void IsisMain() { QString msg = "Mosaic files must contain mapping labels"; throw IException(e, IException::User, msg, _FILEINFO_); } - } + } else { try { cam = icube->camera(); @@ -111,29 +77,32 @@ void IsisMain() { ProcessByBrick p; // Find out which bands are to be created - nbands = 0; - phase = false; - emission = false; - incidence = false; - localEmission = false; - localIncidence = false; - lineResolution = false; - sampleResolution = false; - detectorResolution = false; - obliqueDetectorResolution = false; - sunAzimuth = false; - spacecraftAzimuth = false; - offnadirAngle = false; - subSpacecraftGroundAzimuth = false; - subSolarGroundAzimuth = false; - morphologyRank = false; - albedoRank = false; - northAzimuth = false; - ra = false; - declination = false; - bodyFixedX = false; - bodyFixedY = false; - bodyFixedZ = false; + int nbands = 0; + bool phase = false; + bool emission = false; + bool incidence = false; + bool localEmission = false; + bool localIncidence = false; + bool lineResolution = false; + bool sampleResolution = false; + bool detectorResolution = false; + bool obliqueDetectorResolution = false; + bool sunAzimuth = false; + bool spacecraftAzimuth = false; + bool offnadirAngle = false; + bool subSpacecraftGroundAzimuth = false; + bool subSolarGroundAzimuth = false; + bool morphologyRank = false; + bool albedoRank = false; + bool northAzimuth = false; + bool ra = false; + bool declination = false; + bool bodyFixedX = false; + bool bodyFixedY = false; + bool bodyFixedZ = false; + bool localSolarTime = false; + int raBandNum = 0; // 0 based, if RA is 5th band, raBandNum will be 4 + if (!noCamera) { if ((phase = ui.GetBoolean("PHASE"))) nbands++; if ((emission = ui.GetBoolean("EMISSION"))) nbands++; @@ -149,27 +118,36 @@ void IsisMain() { if ((offnadirAngle = ui.GetBoolean("OFFNADIRANGLE"))) nbands++; if ((subSpacecraftGroundAzimuth = ui.GetBoolean("SUBSPACECRAFTGROUNDAZIMUTH"))) nbands++; if ((subSolarGroundAzimuth = ui.GetBoolean("SUBSOLARGROUNDAZIMUTH"))) nbands++; - if ((morphologyRank = ui.GetBoolean("MORPHOLOGYRANK"))) nbands++; - if ((albedoRank = ui.GetBoolean("ALBEDORANK"))) nbands++; - if ((northAzimuth = ui.GetBoolean("NORTHAZIMUTH"))) nbands++; + if ((morphologyRank = ui.GetBoolean("MORPHOLOGYRANK"))) nbands++; + if ((albedoRank = ui.GetBoolean("ALBEDORANK"))) nbands++; + if ((northAzimuth = ui.GetBoolean("NORTHAZIMUTH"))) nbands++; if ((ra = ui.GetBoolean("RADEC"))) nbands++; if ((declination = ui.GetBoolean("RADEC"))) nbands++; if ((bodyFixedX = ui.GetBoolean("BODYFIXED"))) nbands++; if ((bodyFixedY = ui.GetBoolean("BODYFIXED"))) nbands++; if ((bodyFixedZ = ui.GetBoolean("BODYFIXED"))) nbands++; + if ((localSolarTime = ui.GetBoolean("LOCALTIME"))) nbands++; } - if((dn = ui.GetBoolean("DN"))) nbands++; - if((latitude = ui.GetBoolean("LATITUDE"))) nbands++; - if((longitude = ui.GetBoolean("LONGITUDE"))) nbands++; - if((pixelResolution = ui.GetBoolean("PIXELRESOLUTION"))) nbands++; - if(nbands < 1) { + bool dn; + if ((dn = ui.GetBoolean("DN"))) nbands++; + + bool latitude; + if ((latitude = ui.GetBoolean("LATITUDE"))) nbands++; + + bool longitude; + if ((longitude = ui.GetBoolean("LONGITUDE"))) nbands++; + + bool pixelResolution; + if ((pixelResolution = ui.GetBoolean("PIXELRESOLUTION"))) nbands++; + + if (nbands < 1) { QString message = "At least one photometry parameter must be entered" "[PHASE, EMISSION, INCIDENCE, LATITUDE, LONGITUDE...]"; throw IException(IException::User, message, _FILEINFO_); } - // If outputting a a dn band, retrieve the orignal values for the filter name from the input cube, + // If outputting a dn band, retrieve the orignal values for the filter name from the input cube, // if it exists. Otherwise, the default will be "DN" QString bname = "DN"; if ( dn && icube->hasGroup("BandBin") ) { @@ -184,280 +162,359 @@ void IsisMain() { // Create a bandbin group for the output label PvlKeyword name("Name"); - if (dn) name += bname; - if (phase) name += "Phase Angle"; - if (emission) name += "Emission Angle"; - if (incidence) name += "Incidence Angle"; - if (localEmission) name += "Local Emission Angle"; - if (localIncidence) name += "Local Incidence Angle"; - if (latitude) name += "Latitude"; - if (longitude) name += "Longitude"; - if (pixelResolution) name += "Pixel Resolution"; - if (lineResolution) name += "Line Resolution"; - if (sampleResolution) name += "Sample Resolution"; - if (detectorResolution) name += "Detector Resolution"; - if (obliqueDetectorResolution) name += "Oblique Detector Resolution"; - if (northAzimuth) name += "North Azimuth"; - if (sunAzimuth) name += "Sun Azimuth"; - if (spacecraftAzimuth) name += "Spacecraft Azimuth"; - if (offnadirAngle) name += "OffNadir Angle"; - if (subSpacecraftGroundAzimuth) name += "Sub Spacecraft Ground Azimuth"; - if (subSolarGroundAzimuth) name += "Sub Solar Ground Azimuth"; - if (morphologyRank) name += "Morphology Rank"; - if (albedoRank) name += "Albedo Rank"; - if (ra) name += "Right Ascension"; - if (declination) name += "Declination"; - if (bodyFixedX) name += "Body Fixed X"; - if (bodyFixedY) name += "Body Fixed Y"; - if (bodyFixedZ) name += "Body Fixed Z"; - - - // Create the output cube. Note we add the input cube to expedite propagation - // of input cube elements (label, blobs, etc...). It will be cleared - // prior to systematic processing only if the DN option is not selected. - // If DN is chosen by the user, then we propagate the input buffer with a - // different function - one that accepts both input and output buffers. - (void) p.SetInputCube("FROM", OneBand); - Cube *ocube = p.SetOutputCube("TO", icube->sampleCount(), - icube->lineCount(), nbands); - p.SetBrickSize(64, 64, nbands); - if (dn) { - // Process with input and output buffers - p.StartProcess(phocubeDN); + name += bname; + raBandNum++; + } + if (phase) { + name += "Phase Angle"; + raBandNum++; + } + if (emission) { + name += "Emission Angle"; + raBandNum++; } - else { - // Toss the input file as stated above - p.ClearInputCubes(); - - // Start the processing - p.StartProcess(phocube); + if (incidence) { + name += "Incidence Angle"; + raBandNum++; } - - // Add the bandbin group to the output label. If a BandBin group already - // exists, remove all existing keywords and add the keywords for this app. - // Otherwise, just put the group in. - PvlObject &cobj = ocube->label()->findObject("IsisCube"); - if(!cobj.hasGroup("BandBin")) { - cobj.addGroup(PvlGroup("BandBin")); + if (localEmission) { + name += "Local Emission Angle"; + raBandNum++; } - - PvlGroup &bb = cobj.findGroup("BandBin"); - bb.addKeyword(name, PvlContainer::Replace); - int nvals = name.size(); - UpdateBandKey("Center", bb, nvals, "1.0"); - - if ( bb.hasKeyword("OriginalBand") ) { - UpdateBandKey("OriginalBand", bb, nvals, "1.0"); + if (localIncidence) { + name += "Local Incidence Angle"; + raBandNum++; } - - if ( bb.hasKeyword("Number") ) { - UpdateBandKey("Number", bb, nvals, "1.0"); + if (latitude) { + name += "Latitude"; + raBandNum++; } - - UpdateBandKey("Width", bb, nvals, "1.0"); - - - - p.EndProcess(); -} - - -// This propagates the input plane to the output plane, then passes it off to -// the general routine -void phocubeDN(Buffer &in, Buffer &out) { - for (int i = 0 ; i < in.size() ; i++) { - out[i] = in[i]; + if (longitude) { + name += "Longitude"; + raBandNum++; } - phocube(out); -} - - -// Computes all the geometric properties for the output buffer. Certain -// knowledge of the buffers size is assumed below, so ensure the buffer -// is still of the expected size. -void phocube(Buffer &out) { - - - // If the DN option is selected, it is already added by the phocubeDN - // function. We must compute the offset to start at the second band. - int skipDN = (dn) ? 64 * 64 : 0; - - for(int i = 0; i < 64; i++) { - for(int j = 0; j < 64; j++) { - - MosData mosd, *p_mosd(0); // For special mosaic angles - - int index = i * 64 + j + skipDN; - double samp = out.Sample(index); - double line = out.Line(index); + if (pixelResolution) { + name += "Pixel Resolution"; + raBandNum++; + } + if (lineResolution) { + name += "Line Resolution"; + raBandNum++; + } + if (sampleResolution) { + name += "Sample Resolution"; + raBandNum++; + } + if (detectorResolution) { + name += "Detector Resolution"; + raBandNum++; + } + if (obliqueDetectorResolution) { + name += "Oblique Detector Resolution"; + raBandNum++; + } + if (northAzimuth) { + name += "North Azimuth"; + raBandNum++; + } + if (sunAzimuth) { + name += "Sun Azimuth"; + raBandNum++; + } + if (spacecraftAzimuth) { + name += "Spacecraft Azimuth"; + raBandNum++; + } + if (offnadirAngle) { + name += "OffNadir Angle"; + raBandNum++; + } + if (subSpacecraftGroundAzimuth) { + name += "Sub Spacecraft Ground Azimuth"; + raBandNum++; + } + if (subSolarGroundAzimuth) { + name += "Sub Solar Ground Azimuth"; + raBandNum++; + } + if (morphologyRank) { + name += "Morphology Rank"; + raBandNum++; + } + if (albedoRank) { + name += "Albedo Rank"; + raBandNum++; + } + if (ra) { + name += "Right Ascension"; + } + if (declination) { + name += "Declination"; + } + if (bodyFixedX) { + name += "Body Fixed X"; + } + if (bodyFixedY) { + name += "Body Fixed Y"; + } + if (bodyFixedZ) { + name += "Body Fixed Z"; + } + if (localSolarTime) { + name += "Local Solar Time"; + } + bool specialPixels = ui.GetBoolean("SPECIALPIXELS"); + + /** + * Computes all the geometric properties for the output buffer. Certain + * knowledge of the buffers size is assumed below, so ensure the buffer + * is still of the expected size. + * + * @param in The input cube buffer. + * @param out The output cube buffer. + */ + auto phocube = [&](Buffer &in, Buffer &out)->void { + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 64; j++) { + + MosData mosd, *p_mosd(0); // For special mosaic angles + + int index = i * 64 + j; + int inIndex = index; + + if (dn) { + out[index] = in[index]; + index += 64 * 64; + } - bool isGood=false; - if (noCamera) { - isGood = proj->SetWorld(samp, line); - } - else { - isGood = cam->SetImage(samp, line); - } + // If dn is true, make sure to not overwrite the original pixels with NULL for the dn band + if (!specialPixels && IsSpecial(in[inIndex])) { + for (int band = (dn) ? 1 : 0; band < nbands; band++) { + out[index] = Isis::Null; + index += 64 * 64; + } - if (isGood) { - if(phase) { - out[index] = cam->PhaseAngle(); - index += 64 * 64; + continue; } - if(emission) { - out[index] = cam->EmissionAngle(); - index += 64 * 64; + + // Checks to see if the point is off the body + double samp = out.Sample(index); + double line = out.Line(index); + bool isGood = false; + if (noCamera) { + isGood = proj->SetWorld(samp, line); } - if(incidence) { - out[index] = cam->IncidenceAngle(); - index += 64 * 64; + else { + isGood = cam->SetImage(samp, line); } - if(localEmission || localIncidence) { - Angle phase; - Angle incidence; - Angle emission; - bool success; - cam->LocalPhotometricAngles(phase, incidence, emission, success); - - if (localEmission) { - out[index] = emission.degrees(); + + if (isGood) { + + if (phase) { + out[index] = cam->PhaseAngle(); index += 64 * 64; } - - if (localIncidence) { - out[index] = incidence.degrees(); + if (emission) { + out[index] = cam->EmissionAngle(); index += 64 * 64; } - } - if(latitude) { - if(noCamera) { - out[index] = proj->UniversalLatitude(); + if (incidence) { + out[index] = cam->IncidenceAngle(); + index += 64 * 64; } - else { - out[index] = cam->UniversalLatitude(); + if (localEmission || localIncidence) { + Angle phase; + Angle incidence; + Angle emission; + bool success; + cam->LocalPhotometricAngles(phase, incidence, emission, success); + + if (localEmission) { + out[index] = emission.degrees(); + index += 64 * 64; + } + + if (localIncidence) { + out[index] = incidence.degrees(); + index += 64 * 64; + } } - index += 64 * 64; - } - if(longitude) { - if(noCamera) { - out[index] = proj->UniversalLongitude(); + if (latitude) { + if (noCamera) { + out[index] = proj->UniversalLatitude(); + } + else { + out[index] = cam->UniversalLatitude(); + } + index += 64 * 64; } - else { - out[index] = cam->UniversalLongitude(); + if (longitude) { + if (noCamera) { + out[index] = proj->UniversalLongitude(); + } + else { + out[index] = cam->UniversalLongitude(); + } + index += 64 * 64; } - index += 64 * 64; - } - if(pixelResolution) { - if(noCamera) { - out[index] = proj->Resolution(); + if (pixelResolution) { + if (noCamera) { + out[index] = proj->Resolution(); + } + else { + out[index] = cam->PixelResolution(); + } + index += 64 * 64; } - else { - out[index] = cam->PixelResolution(); + if (lineResolution) { + out[index] = cam->LineResolution(); + index += 64 * 64; + } + if (sampleResolution) { + out[index] = cam->SampleResolution(); + index += 64 * 64; + } + if (detectorResolution) { + out[index] = cam->DetectorResolution(); + index += 64 * 64; + } + if (obliqueDetectorResolution) { + out[index] = cam->ObliqueDetectorResolution(); + index += 64 * 64; + } + if (northAzimuth) { + out[index] = cam->NorthAzimuth(); + index += 64 * 64; + } + if (sunAzimuth) { + out[index] = cam->SunAzimuth(); + index += 64 * 64; + } + if (spacecraftAzimuth) { + out[index] = cam->SpacecraftAzimuth(); + index += 64 * 64; + } + if (offnadirAngle) { + out[index] = cam->OffNadirAngle(); + index += 64 * 64; + } + if (subSpacecraftGroundAzimuth) { + double ssplat, ssplon; + ssplat = ssplon = 0.0; + cam->subSpacecraftPoint(ssplat, ssplon); + out[index] = cam->GroundAzimuth(cam->UniversalLatitude(), + cam->UniversalLongitude(), ssplat, ssplon); + index += 64 * 64; + } + if (subSolarGroundAzimuth) { + double sslat, sslon; + sslat = sslon = 0.0; + cam->subSolarPoint(sslat,sslon); + out[index] = cam->GroundAzimuth(cam->UniversalLatitude(), + cam->UniversalLongitude(), sslat, sslon); + index += 64 * 64; } - index += 64 * 64; - } - if(lineResolution) { - out[index] = cam->LineResolution(); - index += 64 * 64; - } - if(sampleResolution) { - out[index] = cam->SampleResolution(); - index += 64 * 64; - } - if(detectorResolution) { - out[index] = cam->DetectorResolution(); - index += 64 * 64; - } - if(obliqueDetectorResolution) { - out[index] = cam->ObliqueDetectorResolution(); - index += 64 * 64; - } - if(northAzimuth) { - out[index] = cam->NorthAzimuth(); - index += 64 * 64; - } - if(sunAzimuth) { - out[index] = cam->SunAzimuth(); - index += 64 * 64; - } - if(spacecraftAzimuth) { - out[index] = cam->SpacecraftAzimuth(); - index += 64 * 64; - } - if(offnadirAngle) { - out[index] = cam->OffNadirAngle(); - index += 64 * 64; - } - if(subSpacecraftGroundAzimuth) { - double ssplat, ssplon; - ssplat = ssplon = 0.0; - cam->subSpacecraftPoint(ssplat, ssplon); - out[index] = cam->GroundAzimuth(cam->UniversalLatitude(), - cam->UniversalLongitude(), ssplat, ssplon); - index += 64 * 64; - } - if(subSolarGroundAzimuth) { - double sslat, sslon; - sslat = sslon = 0.0; - cam->subSolarPoint(sslat,sslon); - out[index] = cam->GroundAzimuth(cam->UniversalLatitude(), - cam->UniversalLongitude(), sslat, sslon); - index += 64 * 64; - } - // Special Mosaic indexes - if (morphologyRank) { - if (!p_mosd) { p_mosd = getMosaicIndicies(*cam, mosd); } - out[index] = mosd.m_morph; - index += 64 * 64; - } + // Special Mosaic indexes + if (morphologyRank) { + if (!p_mosd) { + p_mosd = getMosaicIndicies(*cam, mosd); + } + out[index] = mosd.m_morph; + index += 64 * 64; + } - if (albedoRank) { - if (!p_mosd) { p_mosd = getMosaicIndicies(*cam, mosd); } - out[index] = mosd.m_albedo; - index += 64 * 64; - } - - if (ra) { - out[index] = cam->RightAscension(); - index += 64 * 64; - } - - if (declination) { - out[index] = cam->Declination(); - index += 64 * 64; - } - - - if (!noCamera) { - double pB[3]; - cam->Coordinate(pB); - if (bodyFixedX) { - out[index] = pB[0]; - index += 64 * 64; + if (albedoRank) { + if (!p_mosd) { + p_mosd = getMosaicIndicies(*cam, mosd); + } + out[index] = mosd.m_albedo; + index += 64 * 64; } - - if (bodyFixedY) { - out[index] = pB[1]; + + if (ra) { + out[index] = cam->RightAscension(); index += 64 * 64; } - if (bodyFixedZ) { - out[index] = pB[2]; + + if (declination) { + out[index] = cam->Declination(); + index += 64 * 64; + } + + if (!noCamera) { + double pB[3]; + cam->Coordinate(pB); + if (bodyFixedX) { + out[index] = pB[0]; + index += 64 * 64; + } + + if (bodyFixedY) { + out[index] = pB[1]; + index += 64 * 64; + } + if (bodyFixedZ) { + out[index] = pB[2]; + index += 64 * 64; + } + } + if (localSolarTime) { + out[index] = cam->LocalSolarTime(); index += 64 * 64; } } - - } - // Trim outerspace - else { - for(int b = (skipDN) ? 1 : 0; b < nbands; b++) { - out[index] = Isis::NULL8; - index += 64 * 64; + + // Trim outer space except RA and dec bands + else { + for (int band = (dn) ? 1 : 0; band < nbands; band++) { + if(ra && band == raBandNum) { + out[index] = cam->RightAscension(); + } + else if (declination && band == raBandNum + 1) { + out[index] = cam->Declination(); + } + else { + out[index] = Isis::Null; + } + index += 64 * 64; + } } } } + }; + + (void) p.SetInputCube("FROM", OneBand); + Cube *ocube = p.SetOutputCube("TO", icube->sampleCount(), + icube->lineCount(), nbands); + p.SetBrickSize(64, 64, nbands); + p.StartProcess(phocube); + + // Add the bandbin group to the output label. If a BandBin group already + // exists, remove all existing keywords and add the keywords for this app. + // Otherwise, just put the group in. + PvlObject &cobj = ocube->label()->findObject("IsisCube"); + if (!cobj.hasGroup("BandBin")) { + cobj.addGroup(PvlGroup("BandBin")); } + + PvlGroup &bb = cobj.findGroup("BandBin"); + bb.addKeyword(name, PvlContainer::Replace); + int nvals = name.size(); + UpdateBandKey("Center", bb, nvals, "1.0"); + + if ( bb.hasKeyword("OriginalBand") ) { + UpdateBandKey("OriginalBand", bb, nvals, "1.0"); + } + + if ( bb.hasKeyword("Number") ) { + UpdateBandKey("Number", bb, nvals, "1.0"); + } + + UpdateBandKey("Width", bb, nvals, "1.0"); + + p.EndProcess(); } @@ -525,4 +582,3 @@ void UpdateBandKey(const QString &keyname, PvlGroup &bb, const int &nvals, bb.addKeyword(makeKey(keyname, nvals, defVal), PvlContainer::Replace); return; } - diff --git a/isis/src/base/apps/phocube/phocube.xml b/isis/src/base/apps/phocube/phocube.xml index a04dc72ffe..d0ddc110fc 100644 --- a/isis/src/base/apps/phocube/phocube.xml +++ b/isis/src/base/apps/phocube/phocube.xml @@ -10,21 +10,21 @@ xsi:noNamespaceSchemaLocation=

    - This program, phocube, creates backplane bands that contain photometric, geometric, and + This program, phocube, creates backplane bands that contain photometric, geometric, and spacecraft instrument information for an image file. The parameter options - range from photometric angles (incidence, emission, and phase) to various - azimuth angles, and options based on spatial + range from photometric angles (incidence, emission, and phase) to various + azimuth angles, and options based on spatial (latitude, longitude, and resolution) information. This program will - not work on Level1 images without a camera model, or on mosaics. - The input image pixels are not propagated to the output file unless the - user selects the "DN" option. The following is a partial list of how users have made use of + not work on Level1 images without a camera model, or on mosaics. + The input image pixels are not propagated to the output file unless the + user selects the "DN" option. The following is a partial list of how users have made use of band output:

      -
    • Evaluate the individual bands in order to establish subsequent - image processing steps
    • +
    • Evaluate the individual bands in order to establish subsequent + image processing steps
    • Specify as input to other ISIS3 programs such as fx and photomet
    • Demonstrate the result of each selected option
    • -
    • Determine how the images are mosaicked together after the +
    • Determine how the images are mosaicked together after the Level2 images are created from the Level1 images with backplanes

    @@ -37,32 +37,32 @@ xsi:noNamespaceSchemaLocation=

    - There are instances where the local emission angle and the local incidence angle will have - values over 90 degrees. ISIS allows the computation of emission and incidence angles greater - than 90 degrees. This feature allows representation of viewing and illumination conditions - where there is actual target body surface data beyond the limb or deep terminator boundary - areas. Applications such as photomet that applies photometric functions honor the 90-degree - boundary. Applications such as photrim can be applied to the phocube output to replace the - angle values above 90 degrees to NULL. There are certain processes that need these data, - therefore it is allowed. + There are instances where the local emission angle and the local incidence angle will have + values over 90 degrees. ISIS allows the computation of emission and incidence angles greater + than 90 degrees. This feature allows representation of viewing and illumination conditions + where there is actual target body surface data beyond the limb or deep terminator boundary + areas. Applications such as photomet that applies photometric functions honor the 90-degree + boundary. Applications such as photrim can be applied to the phocube output to replace the + angle values above 90 degrees to NULL. There are certain processes that need these data, + therefore it is allowed.

    - This program requires a Level1 file that has a successful - "spiceinit" applied to it, or a Level2 image - cube file. For every valid input pixel, an output pixel is computed - based on either the SPICE information, or the - map projected spatial information, - or a pre-defined equation. + This program requires a Level1 file that has a successful + "spiceinit" applied to it, or a Level2 image + cube file. For every valid input pixel, an output pixel is computed + based on either the SPICE information, or the + map projected spatial information, + or a pre-defined equation.

    -

    +

    The parameters "morphologyRank" and "albedoRank" are specifically designed to be used - by the ISIS3 mosaic programs. A mosaic program will automatically compare - two pixel values to determine how each pixel is mosaicked into an output - file, which depends on whether a morphology-based or an albedo-based - product is desired. The program computes a - DN value for every input pixel based on - the formulas listed below and outputs the value to a backplane band. - These backplane bands are used by the ISIS3 mosaic programs. The following are + by the ISIS3 mosaic programs. A mosaic program will automatically compare + two pixel values to determine how each pixel is mosaicked into an output + file, which depends on whether a morphology-based or an albedo-based + product is desired. The program computes a + DN value for every input pixel based on + the formulas listed below and outputs the value to a backplane band. + These backplane bands are used by the ISIS3 mosaic programs. The following are equations for "morphologyRank" and "albedoRank" options:

    @@ -73,41 +73,42 @@ xsi:noNamespaceSchemaLocation= (1/cos(IncidenceAngle))]
    -

    +

    - All the options in phocube are applicable if the input file is a Level1 - image and has a camera model associated with the file. If the input file - is a map-projected Level2 image, only a few options are appropriate + All the options in phocube are applicable if the input file is a Level1 + image and has a camera model associated with the file. If the input file + is a map-projected Level2 image, only a few options are appropriate and available for selection.

    - + The following options are available for Level1 images that contain a camera model:

      - +
    • DN
    • -
    • EMISSION
    • +
    • EMISSION
    • INCIDENCE
    • PHASE
    • OFFNADIRANGLE
    • - +
    • LOCALEMISSION
    • LOCALINCIDENCE
    • - -
    • LATITUDE
    • + +
    • LATITUDE
    • LONGITUDE
    • -
    • DETECTORRESOLUTION
    • +
    • DETECTORRESOLUTION
    • OBLIQUEDETECTORRESOLUTION
    • PIXELRESOLUTION
    • LINERESOLUTION
    • -
    • SAMPLERESOLUTION
    • -
    • NORTHAZIMUTH
    • +
    • SAMPLERESOLUTION
    • +
    • NORTHAZIMUTH
    • SUNAZIMUTH
    • -
    • SPACECRAFTAZIMUTH
    • +
    • SPACECRAFTAZIMUTH
    • SUBSPACECRAFTGROUNDAZIMUTH
    • SUBSOLARGROUNDAZIMUTH
    • MORPHOLOGYRANK
    • ALBEDORANK
    • -
    • RADEC (Right Ascension, Declination )
    • BODYFIXED
    • +
    • RADEC (Right Ascension, Declination )
    • +
    • LOCALTIME
    The following options are available for Level2 images:
      @@ -118,26 +119,26 @@ xsi:noNamespaceSchemaLocation=

    - The BandBin group keywords are updated in the labels of the output cube + The BandBin group keywords are updated in the labels of the output cube file. The keyword "Name" within the BandBin group, - shown below, is populated with the name of each option selected by the - user as bands. These bands can be referenced by their names in - applications such as + shown below, is populated with the name of each option selected by the + user as bands. These bands can be referenced by their names in + applications such as "mapmos" - and - "qview." + and + "qview."

         Example:
    -    
    +
         phocube from=EW0131773041G_cal.cub to=EW0131773041G_cal.pho.cub morph=true dn=true
    -     
    +
         Sample of image label:
    -    
    +
         Group = Dimensions
           Samples = 1024
           Lines   = 1024
    -      Bands   = 7   
    +      Bands   = 7 
         End_Group
         
         Group = BandBin
    @@ -148,7 +149,7 @@ xsi:noNamespaceSchemaLocation=
           Width  = (5.1, 5.1, 5.1, 5.1, 5.1, 5.1, 5.1)
         End_Group
         
    -    
    +
         Note:  The first band retained the BandBin Name value from the input file.
         The program has "Phase Angle," "Emission Angle," "Incidence Angle,"
         "Latitude," and "Longitude" options pre-selected.
    @@ -156,14 +157,14 @@ xsi:noNamespaceSchemaLocation=
        

    - If the backplane bands generated by phocube are used in the mosaic - programs and the mosaic requires the input image pixel, the "DN" - parameter name must be set to "true" in phocube. When backplane + If the backplane bands generated by phocube are used in the mosaic + programs and the mosaic requires the input image pixel, the "DN" + parameter name must be set to "true" in phocube. When backplane bands are used in the - "fx" - or - "photomet" - program, it is not necessary to propagate the input image to the output + "fx" + or + "photomet" + program, it is not necessary to propagate the input image to the output file.

    @@ -202,7 +203,7 @@ xsi:noNamespaceSchemaLocation= Modified filename parameters to be cube parameters where necessary. - Fixed problem where the program threw an error when it tried to propagate + Fixed problem where the program threw an error when it tried to propagate the pixel type from the input file. @@ -225,19 +226,19 @@ xsi:noNamespaceSchemaLocation= Added new parameters: PIXELRESOLUTION, LINERESOLUTION, - SAMPLERESOLUTION, DETECTORRESOLUTION, NORTHAZIMUTH, + SAMPLERESOLUTION, DETECTORRESOLUTION, NORTHAZIMUTH, SUNAZIMUTH, SPACECRAFTAZIMUTH, OFFNADIRANGLE. Fixed a bug that occurred when processing band-dependent cubes. - Added the propagation of the input cube labels, objects, blobs, etc..., so + Added the propagation of the input cube labels, objects, blobs, etc..., so the pedigree of the input source is retained. Set the defaults for PIXELRESOLUTION, LINERESOLUTION, - SAMPLERESOLUTION, DETECTORRESOLUTION, NORTHAZIMUTH, + SAMPLERESOLUTION, DETECTORRESOLUTION, NORTHAZIMUTH, SUNAZIMUTH, SPACECRAFTAZIMUTH, and OFFNADIRANGLE to FALSE. @@ -249,21 +250,21 @@ xsi:noNamespaceSchemaLocation= Added the option to propagate the input pixel value (DN) - as the first band (however, this, by default, will not be invoked as default so as to - preserve pre-existing behavior). Ensure the Center, OriginalBand, Name, and - Width BandBin keyword values are populated properly and propagated to - the output label (should support camera models). Added MORPHOLOGY and + as the first band (however, this, by default, will not be invoked as default so as to + preserve pre-existing behavior). Ensure the Center, OriginalBand, Name, and + Width BandBin keyword values are populated properly and propagated to + the output label (should support camera models). Added MORPHOLOGY and ALBEDO backplane options for special mosaic options. Added the capability to run this program on image files where the camera - information is missing. The ability to generate lat/lon bands for + information is missing. The ability to generate lat/lon bands for image files is highly useful when performing fx operations on the files. Other bands that can be created for a mosaic file include: Dn and PixelResolution. A new parameter, SOURCE, was added so that the user can specify if their image does not contain a camera model. This will result in the - appropriate parameter choices being greyed out. If the user does not specify - that their file does not contain a camera model, then they will receive an error + appropriate parameter choices being greyed out. If the user does not specify + that their file does not contain a camera model, then they will receive an error if they choose to create a band that cannot be created for the file. @@ -285,14 +286,14 @@ xsi:noNamespaceSchemaLocation= Fixes mantis ticket #1525. - The error thrown when the input is a projected image was misleading. It has been fixed to + The error thrown when the input is a projected image was misleading. It has been fixed to be more helpful for the user. Fixes #923. Updated documentation. Fixes #1001. - Added Ra/Dec and Body Fixed Coordinates options to help create new camera models and help + Added Ra/Dec and Body Fixed Coordinates options to help create new camera models and help with mission team operations. References #2277. @@ -302,6 +303,19 @@ xsi:noNamespaceSchemaLocation= Renamed albedo to albedoRank, and morph (or morphology) to morphRank (or MorphologyRank). Ref #4008. + + Allowed RA and DEC to be exported regardless if the pixel is off body. Fixes #4446. + + + Added SPECIALPIXELS parameter to allow users to skip calculations on special pixels, excluding + RA and DEC. This changed merged the two process functions, which were created to speed up + the application when copying over DN values. After a few time tests, it doesn't look like the + merge causes the application to run longer. Changed the process function to be a lambda function + to get rid of global variables. + + + Added the LOCALTIME parameter to output a band with the local solar time for each pixel. Fixes #3850 + @@ -319,7 +333,7 @@ xsi:noNamespaceSchemaLocation= This is the input filename. The input image cube can be a Level1 - or Level2 file. For a Level1 image, spiceinit + or Level2 file. For a Level1 image, spiceinit must be successfully applied before running phocube. @@ -336,9 +350,9 @@ xsi:noNamespaceSchemaLocation= This is the output file name. The cube file will contain a band for - each of the selected options. The BandBin Group in the image labels - of the output cube file will be updated with the "Name" keyword - containing the output band names (options) in the order that they are + each of the selected options. The BandBin Group in the image labels + of the output cube file will be updated with the "Name" keyword + containing the output band names (options) in the order that they are stacked within the cube. @@ -349,28 +363,28 @@ xsi:noNamespaceSchemaLocation= CAMERA Specifies whether the geometric information will be obtained from the - camera model or from the map projection. If this parameter is set to CAMERA, - all band options are available for the user to select. If this - parameter is set to PROJECTION, then only DN, LATITUDE, LONGITUDE, and - PIXELRESOLUTION band options are available and all other options - will be greyed out. If the user sets this parameter to CAMERA and - the input file does not contain a camera model or SPICE information, + camera model or from the map projection. If this parameter is set to CAMERA, + all band options are available for the user to select. If this + parameter is set to PROJECTION, then only DN, LATITUDE, LONGITUDE, and + PIXELRESOLUTION band options are available and all other options + will be greyed out. If the user sets this parameter to CAMERA and + the input file does not contain a camera model or SPICE information, then an error message will occur. @@ -400,15 +415,24 @@ xsi:noNamespaceSchemaLocation= + + boolean + TRUE + Include special pixels in the ouptut image + + If this parameter is true, calculations will be done on special pixels. + If this parameter is false, special pixels will be skipped and set to NULL in the output image for all bands selected. + + boolean FALSE Propagate the input pixel to the output file - This parameter specifies whether the input image pixel value - (DN) will be propagated to - the output file. The DN parameter must be set to "true," - if the output product created is expected to contain the input + This parameter specifies whether the input image pixel value + (DN) will be propagated to + the output file. The DN parameter must be set to "true," + if the output product created is expected to contain the input image information. @@ -417,8 +441,8 @@ xsi:noNamespaceSchemaLocation= TRUE Create a phase angle band - If this parameter is true, the Phase Angle will be - computed for every pixel and placed in a band in the output cube. + If this parameter is true, the Phase Angle will be + computed for every pixel and placed in a band in the output cube. The output cube labels will contain "Phase Angle" in the BandBin group, in band sequence of the output file. Phase angles are in degrees. @@ -428,11 +452,11 @@ xsi:noNamespaceSchemaLocation= TRUE Create an emission angle band - If this parameter is true, the Emission Angle will be - computed for every pixel and placed in a band in the output cube. + If this parameter is true, the Emission Angle will be + computed for every pixel and placed in a band in the output cube. The output cube labels will contain "Emission Angle" in the BandBin - group, in band sequence of the output file. Emission angles are in degrees. There are - certain cases where the emission angle is over 90 degrees. This is allowed as there + group, in band sequence of the output file. Emission angles are in degrees. There are + certain cases where the emission angle is over 90 degrees. This is allowed as there are processes that need these data. See main description for details. @@ -441,11 +465,11 @@ xsi:noNamespaceSchemaLocation= TRUE Create an incidence angle band - If this parameter is true, the Incidence Angle will be - computed for every pixel and placed in a band in the output cube. + If this parameter is true, the Incidence Angle will be + computed for every pixel and placed in a band in the output cube. The output cube labels will contain "Incidence Angle" in the BandBin - group, in band sequence of the output file. Incidence angles are in degrees. There are - certain cases where the incidence angle is over 90 degrees. This is allowed as there + group, in band sequence of the output file. Incidence angles are in degrees. There are + certain cases where the incidence angle is over 90 degrees. This is allowed as there are processes that need these data. See main description for details. @@ -455,11 +479,11 @@ xsi:noNamespaceSchemaLocation= Create a local emission angle band If this parameter is true, the Local Emission Angle will be computed for every pixel - and placed in a band in the output cube. The output cube labels + >Local Emission Angle will be computed for every pixel + and placed in a band in the output cube. The output cube labels will contain "Local Emission Angle" in the BandBin group, in band sequence of the output file. LocalEmissionAngle is in degrees. There are certain - cases where the local emission angle is over 90 degrees. This is allowed as there + cases where the local emission angle is over 90 degrees. This is allowed as there are processes that need these data. See main description for details. @@ -468,12 +492,12 @@ xsi:noNamespaceSchemaLocation= FALSE Create a local incidence angle band - If this parameter is true, the Local - Incidence Angle will be computed for every pixel and placed in - a band in the output cube. The output cube labels will contain - "Local Incidence Angle" in the BandBin group, in band sequence + If this parameter is true, the Local + Incidence Angle will be computed for every pixel and placed in + a band in the output cube. The output cube labels will contain + "Local Incidence Angle" in the BandBin group, in band sequence of the output file. LocalIncidenceAngle is in degrees. There are certain - cases where the local incidence angle is over 90 degrees. This is allowed as there + cases where the local incidence angle is over 90 degrees. This is allowed as there are processes that need these data. See main description for details. @@ -482,8 +506,8 @@ xsi:noNamespaceSchemaLocation= TRUE Create a latitude band - If this parameter is true, the latitude value will be computed for - every pixel and placed in a band in the output cube. The output cube + If this parameter is true, the latitude value will be computed for + every pixel and placed in a band in the output cube. The output cube labels will contain "Latitude" in the BandBin group, in band sequence of the output file. Latitude is in degrees. @@ -493,9 +517,9 @@ xsi:noNamespaceSchemaLocation= TRUE Create a longitude band - If this parameter is true, the longitude value will be computed for - every pixel placed in a band in the output cube. The output cube - labels will contain "Longitude" in the BandBin group, in band + If this parameter is true, the longitude value will be computed for + every pixel placed in a band in the output cube. The output cube + labels will contain "Longitude" in the BandBin group, in band sequence of the output file. Longitude is in degrees. @@ -505,9 +529,9 @@ xsi:noNamespaceSchemaLocation= Create a pixel resolution band If this parameter is true, the Pixel Resolution - will be computed for every pixel and placed in a band in the output - cube. The output cube labels will contain "Pixel Resolution" in the - BandBin group, in band sequence of the output file. PixelResolution + will be computed for every pixel and placed in a band in the output + cube. The output cube labels will contain "Pixel Resolution" in the + BandBin group, in band sequence of the output file. PixelResolution is in meters. @@ -516,9 +540,9 @@ xsi:noNamespaceSchemaLocation= FALSE Create a line resolution band - If this parameter is true, the Line Resolution will be - computed for every pixel and placed in a band in the output cube. - The output cube labels will contain "Line Resolution" in the BandBin + If this parameter is true, the Line Resolution will be + computed for every pixel and placed in a band in the output cube. + The output cube labels will contain "Line Resolution" in the BandBin group, in band sequence of the output file. LineResolution is in meters. @@ -527,10 +551,10 @@ xsi:noNamespaceSchemaLocation= FALSE Create a sample resolution band - If this parameter is true, the Sample Resolution will be - computed for every pixel and placed in a band in the output cube. - The output cube labels will contain "Sample Resolution" in the - BandBin group, in band sequence of the output file. SampleResolution + If this parameter is true, the Sample Resolution will be + computed for every pixel and placed in a band in the output cube. + The output cube labels will contain "Sample Resolution" in the + BandBin group, in band sequence of the output file. SampleResolution is in meters. @@ -539,10 +563,10 @@ xsi:noNamespaceSchemaLocation= FALSE Create a detector resolution band - If this parameter is true, the Detector Resolution will be - computed for every pixel and placed in a band in the output cube. The - output cube labels will contain "Detector Resolution" in the BandBin - group, in band sequence of the output file. DetectorResolution is + If this parameter is true, the Detector Resolution will be + computed for every pixel and placed in a band in the output cube. The + output cube labels will contain "Detector Resolution" in the BandBin + group, in band sequence of the output file. DetectorResolution is in millimeters. @@ -565,8 +589,8 @@ xsi:noNamespaceSchemaLocation= FALSE Create a north azimuth band - If this parameter is true, the North Azimuth will be - computed for every pixel and placed in a band in the output cube. The + If this parameter is true, the North Azimuth will be + computed for every pixel and placed in a band in the output cube. The output cube labels will contain "North Azimuth" in the BandBin group, in band sequence of the output file. NorthAzimuth is in degrees. @@ -576,9 +600,9 @@ xsi:noNamespaceSchemaLocation= FALSE Create a sun azimuth band - If this parameter is true, the Sun Azimuth will be computed - for every pixel and placed in a band in the output cube. The output - cube labels will contain "Sun Azimuth" in the BandBin group, in band + If this parameter is true, the Sun Azimuth will be computed + for every pixel and placed in a band in the output cube. The output + cube labels will contain "Sun Azimuth" in the BandBin group, in band sequence of the output file. SunAzimuth is in degrees. @@ -587,10 +611,10 @@ xsi:noNamespaceSchemaLocation= FALSE Create a spacecraft azimuth band - If this parameter is true, the Spacecraft Azimuth will - be computed for every pixel and placed in a band in the output cube. - The output cube labels will contain "Spacecraft Azimuth" in the - BandBin group, in band sequence of the output file. SpacecraftAzimuth + If this parameter is true, the Spacecraft Azimuth will + be computed for every pixel and placed in a band in the output cube. + The output cube labels will contain "Spacecraft Azimuth" in the + BandBin group, in band sequence of the output file. SpacecraftAzimuth is in degrees. @@ -599,10 +623,10 @@ xsi:noNamespaceSchemaLocation= FALSE Create an offNadir angle band - If this parameter is true, the Off Nadir Angle will be - computed for every pixel and placed in a band in the output cube. - The output cube labels will contain "OffNadir Angle" in the BandBin - group, in band sequence of the output file. OffNadirAngle is + If this parameter is true, the Off Nadir Angle will be + computed for every pixel and placed in a band in the output cube. + The output cube labels will contain "OffNadir Angle" in the BandBin + group, in band sequence of the output file. OffNadirAngle is in degrees. @@ -612,9 +636,9 @@ xsi:noNamespaceSchemaLocation= Create a sub spacecraft ground azimuth band If this parameter is true, the Spacecraft Ground Azimuth - will be computed for every pixel and placed in a band in the output + will be computed for every pixel and placed in a band in the output cube. The output cube labels will contain "Sub Spacecraft Ground - Azimuth" in the BandBin group, in band sequence of the output file. + Azimuth" in the BandBin group, in band sequence of the output file. SubSpacecraftGround Azimuth is in degrees. @@ -624,9 +648,9 @@ xsi:noNamespaceSchemaLocation= Create a sub solar ground azimuth band If this parameter is true, the SubSolar Ground Azimuth - will be computed for every pixel and placed in a band in the output - cube. The output cube labels will contain "Sub Solar Ground Azimuth" - in the BandBin group, in band sequence of the output file. + will be computed for every pixel and placed in a band in the output + cube. The output cube labels will contain "Sub Solar Ground Azimuth" + in the BandBin group, in band sequence of the output file. SubSolarGroundAzimuth is in degrees. @@ -637,14 +661,14 @@ xsi:noNamespaceSchemaLocation=

    This band is computed from the pixel resolution - and emission angle using the following formula:
    + and emission angle using the following formula:

    MorphologyRank = PixelResolution / cos(EmissionAngle)

    - The resulting output band can be used by automos to create a - morphology-based mosaic product. This option uses the + The resulting output band can be used by automos to create a + morphology-based mosaic product. This option uses the local emission angle if the input file - is initialized (spiceinit) with an elevation model (DEM); otherwise, it - uses the default calculation (from the ellipsoid). All computed cosines are - tested for zero. If the result is zero, then the value is set to a constant + is initialized (spiceinit) with an elevation model (DEM); otherwise, it + uses the default calculation (from the ellipsoid). All computed cosines are + tested for zero. If the result is zero, then the value is set to a constant value very close to zero.

    @@ -655,7 +679,7 @@ xsi:noNamespaceSchemaLocation=

    priority=band type=keyword keyname=Name keyvalue=morphologyRank criteria=lesser.
    - + See automos documentation for further details.

    @@ -666,17 +690,17 @@ xsi:noNamespaceSchemaLocation= Create an albedo rank band, used for ranking images based on favorable emission and incidence angles.

    - This band is computed from the pixel resolution, - incidence angle and emission angle - using the following formula:

    + This band is computed from the pixel resolution, + incidence angle and emission angle + using the following formula:

    AlbedoRank = PixelResolution * [(1 / cos(EmissionAngle)) + (1 / cos(IncidenceAngle))]

    The resulting output band can be used by automos to create an albedo-based - mosaic product. This option always uses the - local emission angle and + mosaic product. This option always uses the + local emission angle and local incidence angle if the input file - is initialized (spiceinit) with an elevation model (DEM); otherwise, it - uses the default calculation (from the ellipsoid). All computed cosines are - tested for zero. If the result is zero, then the value is set to a constant + is initialized (spiceinit) with an elevation model (DEM); otherwise, it + uses the default calculation (from the ellipsoid). All computed cosines are + tested for zero. If the result is zero, then the value is set to a constant value very close to zero.

    @@ -685,10 +709,10 @@ xsi:noNamespaceSchemaLocation= Append the following parameters to the automos command line to utilize this backplane band:

    - priority=band type=keyword keyname=Name keyvalue=albedoRank - criteria=lesser. + priority=band type=keyword keyname=Name keyvalue=albedoRank + criteria=lesser.
    - + See automos documentation for further details.

    @@ -698,10 +722,10 @@ xsi:noNamespaceSchemaLocation= FALSE Create bands for Right Ascension and Declination - If this parameter is true, the Right Ascension, and the + If this parameter is true, the Right Ascension, and the Declination will be calculated for every pixel and each will be placed into - their respective bands in the output cube. The output cube labels will contain - "Right Ascension" and "Declination" in the BandBin group, in the band sequence of the + their respective bands in the output cube. The output cube labels will contain + "Right Ascension" and "Declination" in the BandBin group, in the band sequence of the output file. Right Ascension and Declination are in degrees. @@ -711,34 +735,44 @@ xsi:noNamespaceSchemaLocation= Create bands for the X, Y, and Z Body Fixed Coordinates If this parameter is true, the Body Fixed Coordinates will be calculated for - every pixel and the values for X, Y, and Z will each be placed into their own bands in - the output cube. The output cube labels will contain "Body Fixed X", "Body Fixed Y", - and "Body Fixed Z" in the BandBin group, in the band sequence of the output file. + every pixel and the values for X, Y, and Z will each be placed into their own bands in + the output cube. The output cube labels will contain "Body Fixed X", "Body Fixed Y", + and "Body Fixed Z" in the BandBin group, in the band sequence of the output file. Body Fixed Coordinates are in kilometers. + + boolean + FALSE + Create a band with local solar time + + If this parameter is true, the Local Solar Time will be calculated for + every pixel in the output cube. The output cube label will contain "Local Solar Time" + in the BandBin group. Local Solar Time is in hours. + +
    - + Create latitude and morphologyRank backplane bands - Within this example, phocube creates an output file with two bands - that contain latitude information and computed morphologyRank - values, which are shown below as separate snapshots under "Output - Images." The input image file shown below under "Input Image" was - not propagated to the phocube output file because DN is set to - false. If the phocube output file is projected and mosaicked, - the mosaic file will contain the latitude information for the first - band and the "morphologyRank" values for the second band, but no image - information from the input image will be included. The "DN" - parameter must be set to "true" if the output product is expected + Within this example, phocube creates an output file with two bands + that contain latitude information and computed morphologyRank + values, which are shown below as separate snapshots under "Output + Images." The input image file shown below under "Input Image" was + not propagated to the phocube output file because DN is set to + false. If the phocube output file is projected and mosaicked, + the mosaic file will contain the latitude information for the first + band and the "morphologyRank" values for the second band, but no image + information from the input image will be included. The "DN" + parameter must be set to "true" if the output product is expected to contain the input image. - from=EW0131773041G_cal.cub to=EW0131773041G_cal.pho.cub phase=no emission=no incidence=no + from=EW0131773041G_cal.cub to=EW0131773041G_cal.pho.cub phase=no emission=no incidence=no longitude=no morphologyRank=yes Run phocube to create latitude and morphologyRank bands. @@ -749,9 +783,9 @@ xsi:noNamespaceSchemaLocation= Example GUI Screenshot of GUI version of the application.
    For this example, - only "LATITUDE" and "MORPHOLOGYRANK" are selected. The pre-selected - options "PHASE," "EMISSION," "INCIDENCE," and "LONGITUDE" are - deselected to avoid creating these unwanted backplanes. + only "LATITUDE" and "MORPHOLOGYRANK" are selected. The pre-selected + options "PHASE," "EMISSION," "INCIDENCE," and "LONGITUDE" are + deselected to avoid creating these unwanted backplanes.
    @@ -761,7 +795,7 @@ xsi:noNamespaceSchemaLocation= Input file - Screenshot of the input cube file. + Screenshot of the input cube file. @@ -772,9 +806,9 @@ xsi:noNamespaceSchemaLocation= Output file band 1 (Latitude) - + Screenshot of the first band in the output file. This file contains the - latitude information with -72.2 degree as the minimum, and 6.27 degree + latitude information with -72.2 degree as the minimum, and 6.27 degree as the maximum value. @@ -784,9 +818,9 @@ xsi:noNamespaceSchemaLocation= Output file band 2 (MorphologyRank) - + Screenshot of the second band in the output file. This file contains the - computed morphologyRank values with 0.0 as the minimum, and 15.0 as the maximum + computed morphologyRank values with 0.0 as the minimum, and 15.0 as the maximum value. The minimum and maximum values were manually selected to brighten the image for visual presentation. The actual range is between 2.8 and 41.5 DN values. @@ -797,6 +831,6 @@ xsi:noNamespaceSchemaLocation=
    - + diff --git a/isis/src/base/apps/phocube/tsts/allbands/Makefile b/isis/src/base/apps/phocube/tsts/allbands/Makefile index 38711ba743..46b47d58ab 100644 --- a/isis/src/base/apps/phocube/tsts/allbands/Makefile +++ b/isis/src/base/apps/phocube/tsts/allbands/Makefile @@ -30,4 +30,6 @@ commands: morphology=true \ albedo=true \ radec=true \ - bodyfixed=true> /dev/null; + bodyfixed=true \ + localtime=true > /dev/null; + diff --git a/isis/src/base/apps/phocube/tsts/ignore_special_pixels/Makefile b/isis/src/base/apps/phocube/tsts/ignore_special_pixels/Makefile new file mode 100644 index 0000000000..5b9c8610f9 --- /dev/null +++ b/isis/src/base/apps/phocube/tsts/ignore_special_pixels/Makefile @@ -0,0 +1,13 @@ +# Tests that special pixels in the input are set to null for all bands. +APPNAME = phocube + +include $(ISISROOT)/make/isismake.tsts + +commands: + $(APPNAME) from=$(INPUT)/ab102401.cropped.lvl2.cub \ + to=$(OUTPUT)/output.cub \ + specialpixels=false \ + dn=true \ + radec=true > /dev/null; + catlab from=$(OUTPUT)/output.cub \ + to=$(OUTPUT)/output.pvl > /dev/null; diff --git a/isis/src/base/apps/phocube/tsts/off_body/Makefile b/isis/src/base/apps/phocube/tsts/off_body/Makefile new file mode 100644 index 0000000000..19e792ae73 --- /dev/null +++ b/isis/src/base/apps/phocube/tsts/off_body/Makefile @@ -0,0 +1,12 @@ +# Tests RA and declination bands to make sure values are displayed even if not on the planet. +APPNAME = phocube + +include $(ISISROOT)/make/isismake.tsts + +commands: + $(APPNAME) from=$(INPUT)/EW0131773041G.cal.cub \ + to=$(OUTPUT)/radec_bands.cub \ + pixelresolution=true \ + radec=true > /dev/null; + catlab from= $(OUTPUT)/radec_bands.cub \ + to=$(OUTPUT)/output.pvl > /dev/null; diff --git a/isis/src/base/apps/phoempglobal/phoempglobal.xml b/isis/src/base/apps/phoempglobal/phoempglobal.xml index be8640f286..ae35f7fb6d 100644 --- a/isis/src/base/apps/phoempglobal/phoempglobal.xml +++ b/isis/src/base/apps/phoempglobal/phoempglobal.xml @@ -318,7 +318,7 @@ Tomasko, M.G., et al., 1999, Properties of Dust in the Martian Atmosphere from contain a description of how the output file will be used and the input parameter settings that were used to derive the values for the empirical photometric function. See - "$ISIS3DATA/base/templates/photometry/marsred.pvl" for an example. + "$ISISROOT/appdata/templates/photometry/marsred.pvl" for an example.
    diff --git a/isis/src/base/apps/photemplate/photemplate.xml b/isis/src/base/apps/photemplate/photemplate.xml index bc733fe19b..666ceda277 100644 --- a/isis/src/base/apps/photemplate/photemplate.xml +++ b/isis/src/base/apps/photemplate/photemplate.xml @@ -101,7 +101,7 @@ PhtName = MinnaertEmpirical # The numbers below are entered on a single line in the text file for each - # parameter name (see $ISIS3DATA/base/templates/photometry/marsred.pvl). + # parameter name (see $ISISROOT/appdata/templates/photometry/marsred.pvl). PhaseList = "0.,10.,20.,30.,40.,50.,60.,70.,80.,90.,100.,110.,120.,130., 140.,150.,160.,170.,180." @@ -259,7 +259,7 @@ See photomet documetation for additional information. Input PVL file with photometric parameters - $base/templates/photometry + $ISISROOT/appdata/templates/photometry None Specified Use this parameter to select an existing PVL filename that contains a @@ -277,7 +277,7 @@ See photomet documetation for additional information. PVL file to the session log of the application, see text box at the bottom of the GUI. - $ISIS3DATA/base/icons/labels.png + $ISISROOT/appdata/images/icons/labels.png
    LoadPvl @@ -286,7 +286,7 @@ See photomet documetation for additional information. This helper button will take the values in the FROMPVL file and load them into their correct locations in the GUI. - $ISIS3DATA/base/icons/exec.png + $ISISROOT/appdata/images/icons/exec.png @@ -851,7 +851,7 @@ See photomet documetation for additional information. The Minnaert Empirical and Lunar Lambert Empirical function phase angle list entered as a comma delimited string describing how the parameters of the empirical function vary with phase angle. - See "$ISIS3DATA/base/templates/photometry/marsred.pvl" for an example. + See "$ISISROOT/appdata/templates/photometry/marsred.pvl" for an example. No List @@ -868,7 +868,7 @@ See photomet documetation for additional information. The Minnaert Empirical function exponent list of limb darkening values entered as a comma delimited string that describes how the parameters of the empirical function vary with phase angle. - See "$ISIS3DATA/base/templates/photometry/marsred.pvl" for an example. + See "$ISISROOT/appdata/templates/photometry/marsred.pvl" for an example. No List @@ -885,7 +885,7 @@ See photomet documetation for additional information. The Lunar Lambert Empirical function parameter list of limb darkening values entered as a comma delimited string that describes how the parameters of the empirical function vary with phase angle. See - "$ISIS3DATA/base/templates/photometry/marsred.pvl" for an example. + "$ISISROOT/appdata/templates/photometry/marsred.pvl" for an example. No List @@ -902,7 +902,7 @@ See photomet documetation for additional information. The Minnaert Empirical or Lunar Lambert Empirical function phase curve list of brightness values corresponding to a set of phase angles defined in the PHASELIST parameter. See - "$ISIS3DATA/base/templates/photometry/marsred.pvl" for an example. + "$ISISROOT/appdata/templates/photometry/marsred.pvl" for an example. No List diff --git a/isis/src/base/apps/photomet/main.cpp b/isis/src/base/apps/photomet/main.cpp index 242e085be0..33154c8da8 100644 --- a/isis/src/base/apps/photomet/main.cpp +++ b/isis/src/base/apps/photomet/main.cpp @@ -1758,6 +1758,12 @@ void IsisMain() { // determine how photometric angles should be calculated angleSource = ui.GetString("ANGLESOURCE"); + if ((normName == "TOPO" || normName == "MIXED") && angleSource == "DEM") { + QString message = "The " + normName + " Normalized model is not recommended for use with the " + angleSource + " Angle Source option"; + PvlGroup warning("Warnings"); + warning.addKeyword(PvlKeyword("Warning",message)); + Application::Log(warning); + } // Get camera information if needed if (angleSource == "ELLIPSOID" || angleSource == "DEM" || angleSource == "CENTER_FROM_IMAGE") { @@ -1939,7 +1945,7 @@ void photomet(Buffer &in, Buffer &out) { trimInc = cam->IncidenceAngle(); trimEma = cam->EmissionAngle(); } - + if(trimInc > maxinc || trimEma > maxema) { out[i] = NULL8; } diff --git a/isis/src/base/apps/photomet/photomet.xml b/isis/src/base/apps/photomet/photomet.xml index 7448d3d5f3..c324975533 100644 --- a/isis/src/base/apps/photomet/photomet.xml +++ b/isis/src/base/apps/photomet/photomet.xml @@ -5,198 +5,198 @@ Perform photometric corrections on a cube - +

    This program performs photometric correction on image pixels acquired under - different illumination and viewing geometries by adjusting the brightness - and contrast such that the resulting image appears as if obtained under uniform + different illumination and viewing geometries by adjusting the brightness + and contrast such that the resulting image appears as if obtained under uniform conditions. The photometric correction is applied to each pixel by computing - a photometric model based on local photometric angles and a set of parameters - that defines the model. Currently, no default values are assigned for any + a photometric model based on local photometric angles and a set of parameters + that defines the model. Currently, no default values are assigned for any parameter names in the ISIS3 version of photomet.

    -

    +

    Photometric angles can be computed from the following:

      -
    • +
    • SPICE information stored in the image labels
    • User-entered values for parameter names
    • - Incidence angle, emission angle, and + Incidence angle, emission angle, and phase angle backplanes
    • Photometric angle files generated by the user
    • -
    - This program sets all pixels that have an incidence angle and/or emission angle - greater than or equal to 90 degrees to NULL pixel values, regardless of the - photometric angles resulting from using a topographic model. + + This program sets all pixels that have an incidence angle and/or emission angle + greater than or equal to 90 degrees to NULL pixel values, regardless of the + photometric angles resulting from using a topographic model.

    -

    - The user must select a photometric model and a normalization model, with the - option of adding an atmospheric model. Each of these models has a set of - parameters that specifies its operation, which the user must provide. The - different models can be mixed and matched to produce variations of the - photometric correction. +

    + The user must select a photometric model and a normalization model, with the + option of adding an atmospheric model. Each of these models has a set of + parameters that specifies its operation, which the user must provide. The + different models can be mixed and matched to produce variations of the + photometric correction.

    • - You may enter the desired parameters by using the program GUI, which is - recommended + You may enter the desired parameters by using the program GUI, which is + recommended
    • - A PVL file containing the photometric parmeters may be used if you opt - to use the "frompvl" parameter + A PVL file containing the photometric parmeters may be used if you opt + to use the "frompvl" parameter
    • - Within the GUI you may select a PVL file, and in addition, select the + Within the GUI you may select a PVL file, and in addition, select the "frompvl" drop-down menu and photomet will load the values from the PVL - file into the appropriate parameter names in the GUI for you. + file into the appropriate parameter names in the GUI for you. Note, if more than one model type for phtname, atmname, or normname parameters - are in the PVL file, then the parameter values for the first model type - encountered by the program are loaded. Review the parameter values to make - sure the correct options are selected and have correct values before executing + are in the PVL file, then the parameter values for the first model type + encountered by the program are loaded. Review the parameter values to make + sure the correct options are selected and have correct values before executing the program.
    • -
    • +
    • Values also can be entered manually at the command line
    - Note: If any parameter names are entered into the GUI after specifying - "frompvl", the new values entered into the GUI will take precedence - over the values entered in the PVL file. + Note: If any parameter names are entered into the GUI after specifying + "frompvl", the new values entered into the GUI will take precedence + over the values entered in the PVL file.

    - There are three aspects of a photometric correction that should be + There are three aspects of a photometric correction that should be considered when running the photomet program:

    1. The surface photometric function model type that describes the planetary - surface. Any one of the surface photometric functions can be used in - combination with any of the normalization type models and optionally an - atmospheric photometric model. + surface. Any one of the surface photometric functions can be used in + combination with any of the normalization type models and optionally an + atmospheric photometric model.
    2. - The atmospheric photometric function model type used when atmospheric - scattering is present. The models that end with "1" use a first order - scattering approximation, and those that end with "2" use a second order - approximation; the second order has slower processing time because it - uses more iterations and a quadratic equation versus fewer iterations and + The atmospheric photometric function model type used when atmospheric + scattering is present. The models that end with "1" use a first order + scattering approximation, and those that end with "2" use a second order + approximation; the second order has slower processing time because it + uses more iterations and a quadratic equation versus fewer iterations and a linear equation used in the first order approximation.
    3. The type of normalization applied to the image to equalize the albedo - or the topographic contrasts, or a combination of the two. One of - the available modes must be selected. + or the topographic contrasts, or a combination of the two. One of + the available modes must be selected.

    - The intent of topographic normalization is to correct for the variation in - incidence, emission, and phase angles within and between images. Topographic - normalization involves both a multiplicative correction that adjusts the - contrast for a unit slope to reference conditions, and an additive correction - to keep the average brightness uniform. + The intent of topographic normalization is to correct for the variation in + incidence, emission, and phase angles within and between images. Topographic + normalization involves both a multiplicative correction that adjusts the + contrast for a unit slope to reference conditions, and an additive correction + to keep the average brightness uniform.

    - In practice, the albedo may be nonuniform, so a multistep process is used: + In practice, the albedo may be nonuniform, so a multistep process is used:

    1. - Photomet is run in albedo mode, which decreases the brightness variations across - the individual image and removes any additive atmospheric contribution. + Photomet is run in albedo mode, which decreases the brightness variations across + the individual image and removes any additive atmospheric contribution.
    2. - The output image in step 1 is divided by a low-pass-filtered version of itself, - which removes the albedo variations if they have broader spatial scales than + The output image in step 1 is divided by a low-pass-filtered version of itself, + which removes the albedo variations if they have broader spatial scales than the topographic shading as is often the case.
    3. - And finally, photomet is run again in topography mode on the output image from - step 2, which reverses the albedo normalization of the first pass and then applies + And finally, photomet is run again in topography mode on the output image from + step 2, which reverses the albedo normalization of the first pass and then applies the topographic normalization.
    4. -
    - In the absence of an atmosphere, the "albedo mode" is very simple: the image - is divided by the photometric model evaluated at the actual angles and then - multiplied by the model at a reference geometry. If an atmosphere is present, - the additive component of the atmospheric scattering is subtracted at the real - conditions before a multiplicative step, and added back as calculated for the - standard conditions at the end. The "mixed mode" of normalization is used for - images that span very large ranges of incidence - angles. In the mixed mode, the - albedo correction is applied at small incidence angles where albedo variations - dominate topographic shading, and the topographic normalization is performed - at large incidence angles where the reverse is true. A user-specified + + In the absence of an atmosphere, the "albedo mode" is very simple: the image + is divided by the photometric model evaluated at the actual angles and then + multiplied by the model at a reference geometry. If an atmosphere is present, + the additive component of the atmospheric scattering is subtracted at the real + conditions before a multiplicative step, and added back as calculated for the + standard conditions at the end. The "mixed mode" of normalization is used for + images that span very large ranges of incidence + angles. In the mixed mode, the + albedo correction is applied at small incidence angles where albedo variations + dominate topographic shading, and the topographic normalization is performed + at large incidence angles where the reverse is true. A user-specified parameter "incmat" controls the incidence angle at which a smooth transition from one type of normalization to the other takes place.

    - The normalization models that use an atmospheric correction are albedoatm, shadeatm, - and topoatm. If using the GUI interface photomet will automatically exclude - all atmospheric models for normaliztion types that do not require an atmospheric - correction.
    + The normalization models that use an atmospheric correction are albedoatm, shadeatm, + and topoatm. If using the GUI interface photomet will automatically exclude + all atmospheric models for normaliztion types that do not require an atmospheric + correction.

    - Question: What happens if the normalization model I chose does not perform - an atmospheric correction although I have an atmospheric model defined in my PVL - file? + Question: What happens if the normalization model I chose does not perform + an atmospheric correction although I have an atmospheric model defined in my PVL + file?
    - Answer: If you have chosen a normalization model that does not - perform atmospheric correction, then the image is normalized without applying - the atmospheric correction. + Answer: If you have chosen a normalization model that does not + perform atmospheric correction, then the image is normalized without applying + the atmospheric correction.

    New Developments

    - A new parameter name "chngpar" was added to photomet to allow the user to enter - a string consisting of parameter names and values outside of the PVL files. This - string replaces any parameter already defined. This is useful when one or two - parameter values change for each image but all the other parameter values remain - the same. -

    + A new parameter name "chngpar" was added to photomet to allow the user to enter + a string consisting of parameter names and values outside of the PVL files. This + string replaces any parameter already defined. This is useful when one or two + parameter values change for each image but all the other parameter values remain + the same. +

    The parameter name "ZEROB0STANDARD" was shortened to "ZEROB0ST," but the longer - name will still work for backward compatibility. The default is to get the - user setting for "ZEROB0ST" from the PVL file. If no PVL file exists and the + name will still work for backward compatibility. The default is to get the + user setting for "ZEROB0ST" from the PVL file. If no PVL file exists and the user does not specify a "FALSE" or "TRUE" option, the program will automatically default to "TRUE" to follow the default setting in previous photomet versions. PLEASE NOTE: This change was actually not added because the ability to support aliases (or deprecated) values has not been fully implemented in ISIS. As a result, you - must use the full ZEROB0STANDARD parameter name. + must use the full ZEROB0STANDARD parameter name.

    - The parameter name "INCMAT" is no longer required when the "ALBEDO" normalization + The parameter name "INCMAT" is no longer required when the "ALBEDO" normalization model is selected. The parameter name will still appear in the GUI for backward - compatibility, but does not need to be defined by the user in the GUI or on the + compatibility, but does not need to be defined by the user in the GUI or on the command line.

    -

    - A set of photomet PVL templates for Mars and other planetary bodies - developed in ISIS2 are now available in $ISIS3DATA/base/templates/photometry/ - directory. There are also additional examples of PVL files for different - photometric models under "Example PVL files," later in this document. +

    + A set of photomet PVL templates for Mars and other planetary bodies + developed in ISIS2 are now available in $ISISROOT/appdata/templates/photometry/ + directory. There are also additional examples of PVL files for different + photometric models under "Example PVL files," later in this document.

    - Note: The NoNormalization model has been removed because it duplicated - the functionality of the shade model. Use shade with incref=0 and + Note: The NoNormalization model has been removed because it duplicated + the functionality of the shade model. Use shade with incref=0 and albedo=1.0 instead.

    - The program photemplate can be used to set up the PVL file - containing the selected options for photomet. + The program photemplate can be used to set up the PVL file + containing the selected options for photomet.

    - The tables below show the models and their related parameter requirements - along with the ISIS2 default values. The ISIS2 default values are only meant - to serve as possible initial values to test backward compatibility since there + The tables below show the models and their related parameter requirements + along with the ISIS2 default values. The ISIS2 default values are only meant + to serve as possible initial values to test backward compatibility since there are no default values defined in ISIS3.

    @@ -214,42 +214,42 @@ Name Required parameter names - + Hapkehen B0, hg1, hg2, hh, theta, wh - + Hapkeleg Theta, wh, bh, ch, hh, b0, zerob0st Lambert None - + LommelSeeliger None - + LunarLambert L - + LunarLambertEmpirical Phaselist, llist, phasecurvelist - + LunarLambertMcEwen None - + Minnaert K - + MinnaertEmpirical Phaselist, klist, phasecurvelist - +

    @@ -391,7 +391,7 @@ incidence and emission angles, respective Function model name Required parameters - + Anisotropic1 Bha, hnorm, nulneg, tau, tauref, wha @@ -467,7 +467,7 @@ incidence and emission angles, respective 0.0 0 <= value - + Wha Single scattering albedo of atmospheric particles @@ -491,7 +491,7 @@ incidence and emission angles, respective Function name Normalization function type Required parameter names - + Albedo Albedo contrasts uniform @@ -631,11 +631,11 @@ incidence and emission angles, respective
    -
    +
    Example PVL files:
         Example 1:
    -  
    +
         Object = PhotometricModel
           Group = Algorithm
             PhtName = Lambert
    @@ -648,10 +648,10 @@ incidence and emission angles, respective
     	Albedo = 1.0
           EndGroup
         EndObject
    -  
    +
         --------------------------------
         Example 2:
    -  
    +
         Object = PhotometricModel
           Group = Algorithm
             PhtName = Minnaert
    @@ -667,10 +667,10 @@ incidence and emission angles, respective
     	Thresh = 30.0
           EndGroup
         EndObject
    -  
    +
         --------------------------------
         Example 3:
    -  
    +
         Object = PhotometricModel
           Group  = Algorithm
             PhtName = Hapkehen
    @@ -701,7 +701,7 @@ incidence and emission angles, respective
     
         --------------------------------
         Example 4 (Used to process Clementine UVVIS filter "a" data):
    -  
    +
         Object = PhotometricModel
           Group  = Algorithm
             PhtName = LunarLambertMcEwen
    @@ -721,10 +721,10 @@ incidence and emission angles, respective
             Xb2 = 1.0
           EndGroup
         EndObject
    -  
    +
         --------------------------------
         Example 5 (Used to process Clementine UVVIS filter "b" data):
    -  
    +
         Object = PhotometricModel
           Group  = Algorithm
             PhtName = LunarLambertMcEwen
    @@ -744,10 +744,10 @@ incidence and emission angles, respective
             Xb2 = 1.0
           EndGroup
         EndObject
    -  
    +
         --------------------------------
         Example 6 (Used to process Clementine UVVIS filter "cde" data):
    -  
    +
         Object = PhotometricModel
           Group  = Algorithm
             PhtName = LunarLambertMcEwen
    @@ -770,11 +770,11 @@ incidence and emission angles, respective
     
         --------------------------------
         Example 7 (Used for Mars red filter data to apply empirical photometric models):
    -    
    +
         Object = PhotometricModel
         # For Mars red filter images
    -    # The phase angles at which the coefficient values for the Lunar Lambert 
    -    # Empirical (LunarLambertEmpirical) L and the Minnaert Empirical K approximation are 
    +    # The phase angles at which the coefficient values for the Lunar Lambert
    +    # Empirical (LunarLambertEmpirical) L and the Minnaert Empirical K approximation are
         # calculated, along with the brightness (phase curve) values at those
         # points (ALL ON ONE LINE!)
     
    @@ -795,30 +795,30 @@ incidence and emission angles, respective
     	PhaseCurveList = "0.1574,0.1582,0.1546,0.1470,0.1375,0.1273,0.1174,0.1077,0.09797,0.08750,
     	   0.07594,0.06466,0.05471,0.04665,0.03935,0.03339,0.02642,0.01482,0."
           EndGroup
    -    EndObject 
    +    EndObject
     
     
       References:
     
       Chandrasekhar, S., 1960.  Radiative Transfer. Dover, 393 pp.
    -  Hapke, B. W., 1981. Bidirectional reflectance spectroscopy 1: Theory. J. 
    +  Hapke, B. W., 1981. Bidirectional reflectance spectroscopy 1: Theory. J.
          Geophys. Res., pp. 86,3039-3054.
    -  Hapke, B., 1984. Bidirectional reflectance spectroscopy3: Corrections for 
    +  Hapke, B., 1984. Bidirectional reflectance spectroscopy3: Corrections for
          macroscopic roughness. Icarus, 59, pp. 41-59.
    -  Hapke, B., 1986. Bidirectional reflectance spectroscopy 4: The extinction 
    +  Hapke, B., 1986. Bidirectional reflectance spectroscopy 4: The extinction
          coefficient and the opposition effect. Icarus, 67, pp. 264-280.
    -  Johnson, J. R., et al., 1999, Preliminary Results on Photometric Properties of 
    +  Johnson, J. R., et al., 1999, Preliminary Results on Photometric Properties of
          Materials at the Sagan Memorial Station, Mars, J. Geophys. Res., 104, 8809.
    -  Kirk, R. L., Thompson, K. T., Becker, T. L., and Lee, E. M., 2000. 
    -     Photometric modelling for planetary cartography. Lunar Planet. Sci., XXXI, 
    +  Kirk, R. L., Thompson, K. T., Becker, T. L., and Lee, E. M., 2000.
    +     Photometric modelling for planetary cartography. Lunar Planet. Sci., XXXI,
          Abstract #2025, Lunar and Planetary Institute, Houston (CD-ROM).
    -  Kirk, R. L., Thompson, K. T., and Lee, E. M., 2001. Photometry of the martian 
    +  Kirk, R. L., Thompson, K. T., and Lee, E. M., 2001. Photometry of the martian
          atmosphere:  An improved practical model for cartography and photoclinometry.
    -     Lunar Planet. Sci., XXXII, Abstract #1874, Lunar and Planetary Institute, 
    +     Lunar Planet. Sci., XXXII, Abstract #1874, Lunar and Planetary Institute,
          Houston (CD-ROM).
    -  McEwen, A. S., 1991. Photometric functions for photoclinometry and other 
    +  McEwen, A. S., 1991. Photometric functions for photoclinometry and other
          applications.  Icarus, 92, pp. 298-311.
    -  Thorpe, T. E., 1973, Mariner 9 Photometric Observations of Mars from November 
    +  Thorpe, T. E., 1973, Mariner 9 Photometric Observations of Mars from November
          1971 through March 1972, Icarus, 20, 482.
       Tomasko, M. G., et al., 1999, Properties of Dust in the Martian Atmosphere from
          the Imager on Mars Pathfinder, J. Geophys. Res., 104, 8987.
    @@ -833,7 +833,7 @@ incidence and emission angles, respective
       
         
           Original version - based on Tammy Becker's
    -      photom/photompr programs which were later 
    +      photom/photompr programs which were later
           converted to Randy Kirk's photomet
         
         
    @@ -842,12 +842,12 @@ incidence and emission angles, respective
           the MoonAlbedo normalization method.
         
         
    -      Removed references to CubeInfo 
    +      Removed references to CubeInfo
         
         
    -      Added MAXEMISSION and MAXINCIDENCE parameters.  Modified code to set 
    +      Added MAXEMISSION and MAXINCIDENCE parameters.  Modified code to set
           off-target pixels to NULL.  Added appTests for new parameters.  Added user
    -      documentation examples. 
    +      documentation examples.
         
         
           Added USEDEM parameter.
    @@ -857,7 +857,7 @@ incidence and emission angles, respective
           the DEM and the local photometric angles are requested.
         
         
    -      Added capability to use both ellipsoid and DEM photometric angles in 
    +      Added capability to use both ellipsoid and DEM photometric angles in
           atmospheric corrections. This provides the ability to do shading using a
           DEM surface.
         
    @@ -868,7 +868,7 @@ incidence and emission angles, respective
         
         
           The CENTER option of the ANGLESOURCE parameter has been removed and the
    -      CENTER_FROM_IMAGE, CENTER_FROM_LABEL and CENTER_FROM_USER options have been 
    +      CENTER_FROM_IMAGE, CENTER_FROM_LABEL and CENTER_FROM_USER options have been
           added. This allows the user to determine where the center photometric angles
           will come from.
         
    @@ -894,7 +894,7 @@ incidence and emission angles, respective
              through the PVL, the GUI, or a combination of both. If you provide a FROMPVL
              file, then you need to use the GUI to specify which model(s) to use from that
              file. If you change any of the model-specific parameters in the GUI, then they
    -         will override the values in the FROMPVL file. 
    +         will override the values in the FROMPVL file.
           5) The BHAREF, HGAREF, and WHAREF parameters have been removed because they were
              obsolete.
           6) The NONORMALIZATION model was removed because it duplicated the functionality
    @@ -924,7 +924,7 @@ incidence and emission angles, respective
           update of photomet during the last release. This parameter is responsible for
           determining if the Hapke opposition surge component B0 is set to zero when
           calculations are based on standard conditions. This parameter has been added
    -      to the new interface to photomet. 
    +      to the new interface to photomet.
         
         
           The program was fixed to make it backwards compatible with older PVL files. If
    @@ -932,20 +932,20 @@ incidence and emission angles, respective
           following error message "A Normalization model must be specified before running
           this program." This message would have occurred even if you had a Normalization
           model specified in your FROMPVL file. This problem has been fixed. If your FROMPVL
    -      file specifies a Normalization model, then you aren't required to specify one through 
    +      file specifies a Normalization model, then you aren't required to specify one through
           the program interface as well.
         
         
           A new BACKPLANE option was added to ANGLESOURCE. This BACKPLANE option allows you
    -      to input photometric angle information using separate ISIS cube files. Files 
    +      to input photometric angle information using separate ISIS cube files. Files
           containing geometric, photometric, etc. information pixel by pixel for the input
           image file are normally referred to as backplanes. This option was added to support
    -      image data that does not have a camera model associated with it. If you have a 
    +      image data that does not have a camera model associated with it. If you have a
           way to generate the photometric angles for such data, then you will be able to
           do photometric correction on it. This option is also very useful for speeding up
           the processing done by photomet. If you have all the photometric information
           pre-computed, then this information no longer needs to be generated every time
    -      the program is run. You can input photometric information using a combination of 
    +      the program is run. You can input photometric information using a combination of
           files and photometric angle constants. For example, if you have a file containing
           the phase angle for every pixel, a file containing the incidence angle for every
           pixel, and you know that the emission angle is 0.0 for every pixel, then you can
    @@ -982,12 +982,12 @@ incidence and emission angles, respective
           6) Changed the ZEROB0STANDARD parameter name to ZEROB0ST. This was to help prevent the
              user from needing to resize the GUI each time they opened it because the parameter
              name was too long. We are maintaining backwards compatibility by supporting both
    -         ZEROB0STANDARD and ZEROB0ST in the photomet code. This will allow you to run a 
    +         ZEROB0STANDARD and ZEROB0ST in the photomet code. This will allow you to run a
              script with the old parameter name without any problems.
         
         
    -      PLEASE NOTE (in reference to change made on 2012-10-24): The backwards compatibility for 
    -      the shorter ZEROB0ST parameter name has not been fully implemented in ISIS. As a result, 
    +      PLEASE NOTE (in reference to change made on 2012-10-24): The backwards compatibility for
    +      the shorter ZEROB0ST parameter name has not been fully implemented in ISIS. As a result,
           this change has been removed and the full ZEROB0STANDARD parameter name must be used.
           Support for aliases (deprecated values) must be fully implemented in ISIS before the shorter
           parameter name (ZEROB0ST) will be available. Fixes #1288.
    @@ -1003,17 +1003,21 @@ incidence and emission angles, respective
           value warnings on OS X
         
         
    -      Decoupled ANGLESOURCE and USEDEM parameters. They were working incorrectly before 
    +      Decoupled ANGLESOURCE and USEDEM parameters. They were working incorrectly before
           and were tangled together a bit. They are separated now and working as expected.
           Anglesource DEM makes the photometric calculations based on the DEM of the image
    -      if it exists. Anglesource ELLIPSOID makes the photometric calculations based on the radius 
    -      obtained from the DEM shape model. Usedem true trims the image using the photometric 
    -      calculations on the radius obtained from the DEM shape model. Usedem false trims the image 
    -      using the from the IAU/NAIF target body file, which is defined within the cube's kernel group 
    +      if it exists. Anglesource ELLIPSOID makes the photometric calculations based on the radius
    +      obtained from the DEM shape model. Usedem true trims the image using the photometric
    +      calculations on the radius obtained from the DEM shape model. Usedem false trims the image
    +      using the from the IAU/NAIF target body file, which is defined within the cube's kernel group
           as the TargetAttitudeShape. Fixes #4180.
         
    +    
    +      Added a warning when the 'DEM' angle source option is used with 'mixed'
    +      or 'topo' normalization method. Fixes #3451 and #3452.
    +    
       
    -  
    +
       
         Radiometric and Photometric Correction
         Cameras
    @@ -1050,7 +1054,7 @@ incidence and emission angles, respective
               Output cube file
             
             
    -          This output file will contain the results of the photometric 
    +          This output file will contain the results of the photometric
               correction.
             
           
    @@ -1060,7 +1064,7 @@ incidence and emission angles, respective
             
               Input PVL file
             
    -        $base/templates/photometry
    +        $ISISROOT/appdata/templates/photometry
             None Specified
             
               This text file contains the parameter names and values to be used
    @@ -1071,11 +1075,11 @@ incidence and emission angles, respective
                 PrintPvl
                 View Input PVL File
                 
    -              This helper button will extract the contents of the input PVL 
    +              This helper button will extract the contents of the input PVL
                   file and display the information to the session log of the application,
                   see text box in bottom portion of GUI
                  
    -            $ISIS3DATA/base/icons/labels.png
    +	     $ISISROOT/appdata/images/icons/labels.png
               
               
                 LoadPvl
    @@ -1084,7 +1088,7 @@ incidence and emission angles, respective
                   This helper button will take the values in the FROMPVL file and
                   load them into their correct locations in the GUI
                  
    -             $ISIS3DATA/base/icons/exec.png
    +	     $ISISROOT/appdata/images/icons/exec.png
               
              
             
    @@ -1103,7 +1107,7 @@ incidence and emission angles, respective
             None
             
               Chngpar is used to enter a string of parameter names and values enclosed in
    -          quotes that will be added to or replaces the pre-defined parameter values. 
    +          quotes that will be added to or replaces the pre-defined parameter values.
               PLEASE NOTE: Any parameter names used in the CHNGPAR string input MUST be
               spelled out completely and without any errors. Otherwise, they will be ignored
               by the program.
    @@ -1120,7 +1124,7 @@ incidence and emission angles, respective
             double
             Maximum emisson angle to trim image
             
    -          The maximum number of degrees allowed for the 
    +          The maximum number of degrees allowed for the
               emission angle in
               order to retain the data.  This number must be between 0.0 and 90.0.
             
    @@ -1132,7 +1136,7 @@ incidence and emission angles, respective
             double
             Maximum incidence angle to trim image
             
    -          The maximum number of degrees allowed for the 
    +          The maximum number of degrees allowed for the
               incidence angle in
               order to retain the data.  This number must be between 0.0 and 90.0.
             
    @@ -1150,25 +1154,25 @@ incidence and emission angles, respective
             
             
               

    - This specifies if the image will be trimmed based on the photometric - angles obtained from the ellipsoid (default) or the DEM surface. + This specifies if the image will be trimmed based on the photometric + angles obtained from the ellipsoid (default) or the DEM surface.

    - The ellipsoid is retrieved from the IAU/NAIF target body file, - which is defined within the cube's kernel group as the TargetAttitudeShape. - If this parameter is set to false, then the photometric angles will be obtained + The ellipsoid is retrieved from the IAU/NAIF target body file, + which is defined within the cube's kernel group as the TargetAttitudeShape. + If this parameter is set to false, then the photometric angles will be obtained from the ellipsoidal surface.

    The photometric angles obtained from the DEM surface (shape model) - for each pixel are obtained using an ellipsoid + for each pixel are obtained using an ellipsoid defined by the radius obtained from the DEM shape model. Note that photomet does not trim using local slopes.

    - + combo @@ -1178,58 +1182,58 @@ incidence and emission angles, respective Source of photometric angles: ELLIPSOID, DEM, CENTER, or FILE - The incidence, emission, and phase angles are determined based on - the source defined by the user. The available options are listed + The incidence, emission, and phase angles are determined based on + the source defined by the user. The available options are listed below:
    ELLIPSOID (default)
    - The photometric angles for each pixel are obtained using an ellipsoid + The photometric angles for each pixel are obtained using an ellipsoid defined by the radius obtained from the DEM shape model.
    DEM
    The photometric angles for each pixel are obtained using the DEM shape - model (if one is defined in the image labels). The surface roughness - is taken into account to calculate a surface normal, which is used to + model (if one is defined in the image labels). The surface roughness + is taken into account to calculate a surface normal, which is used to calculate the photometric angles. i.e. slope, local emission, local incidence.
    CENTER_FROM_IMAGE
    The photometric angles are obtained from the center of the input image using the ellipsoid shape model. These angles are applied to every - pixel in the input file. This option is best for images where the - photometric angles do not vary much and when faster processing is desired. + pixel in the input file. This option is best for images where the + photometric angles do not vary much and when faster processing is desired.
    CENTER_FROM_LABEL
    - The photometric angle keywords are obtained from the label of the input - image, and applied to every pixel in the file. The keywords - "IncidenceAngle," "EmissionAngle," and "PhaseAngle" must be in the image - labels. This option is best for images where the photometric angles do - not vary much and when faster processing is desired. + The photometric angle keywords are obtained from the label of the input + image, and applied to every pixel in the file. The keywords + "IncidenceAngle," "EmissionAngle," and "PhaseAngle" must be in the image + labels. This option is best for images where the photometric angles do + not vary much and when faster processing is desired.
    CENTER_FROM_USER
    - The photometric angles are obtained from the values defined for - IncidenceAngle, EmissionAngle, and PhaseAngle parameter names. These - angles are applied to every pixel in the file. This option is best - for images where the photometric angles do not vary much and when faster + The photometric angles are obtained from the values defined for + IncidenceAngle, EmissionAngle, and PhaseAngle parameter names. These + angles are applied to every pixel in the file. This option is best + for images where the photometric angles do not vary much and when faster processing is desired.
    BACKPLANE
    - The photometric angles are obtained from separate cube files, which - contain the information for each pixel in the input file. These angles - are applied to every pixel in the file. This option is best for images - that will be processed through the same steps many times with different - photometric settings because the photometric angles are not recomputed - each time for every pixel. This option is also used for images that + The photometric angles are obtained from separate cube files, which + contain the information for each pixel in the input file. These angles + are applied to every pixel in the file. This option is best for images + that will be processed through the same steps many times with different + photometric settings because the photometric angles are not recomputed + each time for every pixel. This option is also used for images that do not have a camera model associated with them. If no camera model is - available, then create files that contain the photometric angle - information for each pixel in the input file with fx or another - program. It is very important that the new files have the same + available, then create files that contain the photometric angle + information for each pixel in the input file with fx or another + program. It is very important that the new files have the same number of samples and lines as the input file.
    @@ -1239,7 +1243,7 @@ incidence and emission angles, respective
    @@ -1365,7 +1369,7 @@ incidence and emission angles, respective Emission angle cube file - This file must contain the emission + This file must contain the emission angle information for the input cube. @@ -1387,7 +1391,7 @@ incidence and emission angles, respective Center incidence angle - The center incidence angle to use + The center incidence angle to use if the CENTER_FROM_USER option is chosen. 0.0 @@ -1400,7 +1404,7 @@ incidence and emission angles, respective Center emission angle - The center emission angle to use + The center emission angle to use if the CENTER_FROM_USER option is chosen. 0.0 @@ -1408,7 +1412,7 @@ incidence and emission angles, respective 0.0
    - + combo @@ -1421,29 +1425,29 @@ incidence and emission angles, respective
    FROMPVL
    - Gets the photometric model from the PVL file. If the - required parameter names and values are missing from the PVL file, - either add them to the PVL file, or enter the values at the command + Gets the photometric model from the PVL file. If the + required parameter names and values are missing from the PVL file, + either add them to the PVL file, or enter the values at the command line or use the GUI to enter the values. -
    +
    LAMBERT
    - A simple photometric model which predicts that light incident on a - surface is scattered uniformly in all directions; the total amount - of reflected light depends on the incidence angle of the illumination. + A simple photometric model which predicts that light incident on a + surface is scattered uniformly in all directions; the total amount + of reflected light depends on the incidence angle of the illumination. This function does not depend upon the outgoing light direction. -
    +
    HAPKEHEN
    - Derive model albedo using the complete Hapke model with Henyey-Greenstein - single-particle phase function whose coefficients are hg1 and hg2, - plus single scattering albedo wh, opposition surge parameters hh and + Derive model albedo using the complete Hapke model with Henyey-Greenstein + single-particle phase function whose coefficients are hg1 and hg2, + plus single scattering albedo wh, opposition surge parameters hh and b0, and macroscopic roughness theta. For a smooth model with opposition effect use theta=0.

    - The table below shows the Hapke parameters for Mars from Johnson et + The table below shows the Hapke parameters for Mars from Johnson et al. (1999) for IMP data of Photometry Flats (soil) and may be reasonably - representative of Mars as a whole. Note that (hg1, hg2=1.0) is + representative of Mars as a whole. Note that (hg1, hg2=1.0) is equivalent to (-hg1, hg2=0.0).

    @@ -1481,14 +1485,14 @@ incidence and emission angles, respective
    1.0
    -
    +
    HAPKELEG
    - Derive model albedo using complete Hapke model with Henyey Legendre - two-term Legendre polynomial phase function whose coefficients are bh - and ch, plus single scattering albedo wh, opposition surge parameters + Derive model albedo using complete Hapke model with Henyey Legendre + two-term Legendre polynomial phase function whose coefficients are bh + and ch, plus single scattering albedo wh, opposition surge parameters hh and b0, and macroscopic roughness theta. -
    +
    LOMMELSEELIGER
    This model takes into account the radiance that results from @@ -1497,25 +1501,25 @@ incidence and emission angles, respective scattering (scattering of diffuse light which has made its way indirectly to the same position by being scattered one or more times). This model depends on the incidence and emission angles. -
    +
    LUNARLAMBERTMCEWEN
    This model was developed specifically for use with the Moon, and designed to be used in conjunction with the MoonAlbedo normalization model. -
    -
    LUNARLAMBERTEMPIRICAL, LUNARLAMBERT, + +
    LUNARLAMBERTEMPIRICAL, LUNARLAMBERT, MINNAERTEMPIRICAL, and MINNAERT
    These models combine a weighted sum of the LommelSeeliger and Lambert models. Given a suitable value for the LunarLambert - function weight, L, these models fit the true + function weight, L, these models fit the true reflectance behavior of many planetary surfaces equally well as the Hapke model. These models also depend on the incidence and emission angles. -
    -
    + +
    @@ -1527,8 +1531,8 @@ incidence and emission angles, respective