ScientiMate: EarthScience Data Analysis Library
Download
Python Version
Coming Soon 
Matlab / GNU Octave Version
Coming Soon 
Recommended Book
Book: Ocean Wave Data Analysis: Introduction to Time Series Analysis, Signal Processing, and Wave Prediction

ScientiMate Modules:
 Data Cleaning and Manipulating
 Hurricane
 Mapping
 Signal Processing
 Statistics
 SWAN
 Water Wave Data Analysis
 Water Wave Directional Analysis
 Water Wave Parametric Model
 Water Wave Properties
 Wind
Function List
Colormap:
gencolormap: Generates a colormap from input colors
seqcolormap: Generates sequential colormap for drawing lines
topocolormap: Exports a topographic colormap
Data Cleaning and Manipulating:
despike3dps: Removes spikes in the time series based on 3D phase space method by Goring and Nikora (2002)
despikediff: Removes spikes in the time series using a local difference of data respect to a moving average window
despikeenvelope: Removes spikes in the time series that are outside a defined envelope
readdatafile: Reads and extracts data from ASCII, text, Comma Separated Values (CSV), Matlab .mat file
replacemissing: Replaces missing data points in the time series
Hurricane:
hurricanebackgroundwind: Calculates and adds background wind velocity due to hurricane front motion to hurricane rotational wind velocity
hurricanedpcpt: Calculates hurricane central pressure (Pc) intensity change over time (dPc/dt)
hurricanepressureh80: Generates hurricane pressure data on given (x,y) points using method from Holland (1980)
hurricanetranslationvel: Calculates hurricane center translational velocity
hurricanewavecontourcem: Calculates hurricane wave height field (contours) on given mesh using
method from Shore Protection Manual (SPM), U.S. Army Corps of Engineers (1984), and Young (1988)
hurricanewavecontourh16: Calculates hurricane wave height and wave period field (contours) on given mesh using
method from Hwang (2016) and Hwang & Walsh (2016)
hurricanewavecontoury88: Calculates hurricane wave height field (contours) on given mesh using method from Young (1988)
hurricanewavemax: Calculates hurricane maximum wave height and wave period at a location of maximum wind
hurricanewindh08: Generates hurricane wind and pressure data on (x,y) points using method from Holland (2008)
hurricanewindh80: Generates hurricane wind and pressure data on given (x,y) points using method from Holland (1980)
hurricanewindinflowangle: Calculates hurricane velocity tangential and inflow angle and inflow velocity in x (East) and y (North) directions
hurricanewindvel: Generates hurricane wind velocity data on given (x,y) points
hurricanewindvelmax: Calculates hurricane maximum wind velocity at the surface level
hurricanewindvelmaxh08: Calculates hurricane maximum wind velocity at the gradient level using Holland (2008) method
hurricanewindvelmaxh80: Calculates hurricane maximum wind velocity at the gradient level using Holland (1980) method
readnhchurricane: Reads and extracts hurricane data from National Hurricane Center (NHC) HURDAT2 file
stormsurge1d: Calculates one dimensional storm surge using Dean Dalrymple (1991) method
Mapping:
convertdir: Converts direction from one system to another one
distancecart: Calculates distance from (x1,y1) to (x2,y2) on cartesian coordinate
distancegc: Calculates distance and azimuth (bearing) between (Latitude,Longitude) points using Great Circle
endpointcart: Finds an end point of the straight line segment from its starting point (x1,y1) and its angle on cartesian coordinate
gridgenerator: Generates 2d xy grid
gridxyz: Interpolates x (longitude), y (latitude) and z (elevation) data into a defined mesh
intersectgc: Finds intersection point between two line segments (line edges) on Great Circle
intersectlineedge: Finds intersection point between two line segments (line edges)
plotxyz: Plots x (longitude), y (latitude) and z (elevation) data into a defined mesh
plotxyzgrid: Plots gridded x (longitude), y (latitude) and z (elevation) data
pointscart: Generates points between ponit (x1,y1) and (x2,y2) on cartesian coordinate
readxyz: Reads and extracts x (longitude), y (latitude) and z (elevation) data from ASCII gridded (tabular) xyz file
reckongc: Calculates end point (Latitude,Longitude) from start point (Latitude,Longitude) and distance and azimuth (bearing) using Great Circle
waypointsgc: Generates (Latitude,Longitude) points between two (Latitude,Longitude) points using Great Circle
windfetch: Calculates a wind fecth and z (elevation) profile along a path over water for a given 2d xy domain (map, image, ...)
zprofilepath: Calculates z (elevation, ...) profile along a path over a given 2d xy domain (map, image, ...)
Signal Processing:
bandpassiirfilter: Creates bandpass or bandreject (notch) recursive (Infinite Impulse Response ,IIR) zerophase (bidirectional) filter
bandpasssincfilter: Creates bandpass or bandreject filter using windowedsinc function
bartlettpsd: Calculates power spectral density using Bartlett's method
freqresp2impresp: Calculates impulse and step response from frequency response
highpasssincfilter: Creates highpass filter using lowpass windowedsinc function
impresp2freqresp: Calculates frequency response from impulse response
inversefreqresp: Inverses input filter (frequency response), e.g. convert lowpass filter to highpass filter
inverseimpresp: Inverses input filter (impulse response), e.g. convert lowpass filter to highpass filter
lowpasssincfilter: Creates lowpass filter using windowedsinc function
periodogrampsd: Calculates power spectral density using periodogram method
psd2timeseries: Generates random wave data from a given spectrum
singlepoleiirfilter: Creates lowpass or highpass single pole recursive (Infinite Impulse Response ,IIR) zerophase (bidirectional) filter
smoothbyfilterresp: Smoothes input data using a impulse response or frequency response
smoothbywindowfun: Smoothes input data using a window function
spectrogrampsd: Calculates spectrogram following Welch's method without averaging
welchpsd: Calculates power spectral density using Welch's method
windowfun: Creates window function
windowfunfreqresp: Calculates frequency response of the window function
Statistics:
curvefit2d: Fits curve to 2 dimensinal input dataset
curvefit3d: Fits curve to 3 dimensinal input dataset
dataoverview: Displays an overview of the input data
findextremum: Finds local extremum (maximum and minimum) in data
findknn: Finds knearest neighbors using Euclidean distance
fitgoodness: Calculates goodness of fit parameters
interp2dgrid: Interpolates 2d gridded data on given scatter point(s) using nearest neighbor method
interp2dscatter: Interpolates 2d scattered data on given point(s) by downsampling the input data
levelcrossing: Calculates crossing point for a given level by using an upward zero crossing method
probability1d: Calculates 1D probability density distribution for a given dataset
probability2d: Calculates 2D (joint) probability density distribution for two given datasets
SWAN:
plotgriddomain: Plots structured (x,y,z) domain and its associated xy grid
swandepthgrid: Generates SWAN depth file and its associated xy grid file
swanvectorvarspconst: Generates SWAN file for spatially constant vector variable
swanvectorvarspvariedgrid: Generates SWAN file for spatially varied vector variable from gridded input data
swanvectorvarspvariedsct: Generates SWAN file for spatially varied vector variable from scattered input data
swanwaterlevelspconst: Generates SWAN water level file for spatially constant water level
swanwaterlevelspvariedgrid: Generates SWAN water level file for spatially varied water level from gridded input data
swanwaterlevelspvariedsct: Generates SWAN water level file for spatially varied water level from scattered input data
swanwindspconst: Generates SWAN wind file for spatially constant wind
swanwindspvariedgrid: Generates SWAN wind file for spatially varied wind from gridded input data
swanwindspvariedsct: Generates SWAN wind file for spatially varied wind from scattered input data
Water Wave Data Analysis:
diagnostictail: Replaces a spectrum tail with JONSWAP (Hasselmann et al., 1973) or TMA Spectrum (Bouws et al., 1985)
pressure2surfaceelevfft: Calculates water surface elevation time series from water pressure time series by using Fast Fourier Transform
pressure2surfaceelevzcross: Calculates water surface elevation time series from water pressure time series by using an upward zero crossing method
seaswell1d: Partitions (separates) wind sea from swell in a power spectral density using an one dimensional method
velocity2surfaceelevfft: Calculates water surface elevation time series from wave orbital velocity time series by using Fast Fourier Transform
velocity2surfaceelevzcross: Calculates wave properties from wave orbital velocity by using an upward zero crossing method
wavefrompressurepsd: Calculates wave properties from water pressure by converting it to water surface elevation power spectral density
wavefrompressurezcross: Calculates wave properties from water pressure by using an upward zero crossing method
wavefromsurfaceelevpsd: Calculates wave properties from water surface elevation power spectral density
wavefromsurfaceelevzcross: Calculates wave properties from water surface elevation by using an upward zero crossing method
wavefromvelocitypsd: Calculates wave properties from wave orbital velocity by converting it to water surface elevation power spectral density
wavefromvelocityzcross: Calculates wave properties from wave orbital velocity by using an upward zero crossing method
wavepropfrompsd: Calculates wave properties from a power spectral density
Water Wave Directional Analysis:
directionalpsd: Calculates wave directional spectrum using parametric directional spreading function such as:
Mitsuyasu et al. (1975), Hasselmann et al. (1980) and Donelan et al. (1985)
directionalpsdetauv: Calculates wave directional spectrum using water surface elevation and horizontal orbital velocity
directionalpsdpuv: Calculates wave directional spectrum using pressure and horizontal orbital velocity
enu2truenorth: Converts mathematical direction (angle) from ENU (East North Up) coordinate system to compass direction with respect to true north
wavediretauv: Calculates wave direction using water surface elevation and horizontal orbital velocity
wavedirpuv: Calculates wave direction using pressure and horizontal orbital velocity
Water Wave Parametric Model:
asymptlimit: Calculates dimensionless asymptotic limits of wind wave growth in shallow and intermediate water
equivfetchdeep: Calculates an equivalent wind fetch for duration limited wave growth in deep water
equivfetchshallow: Calculates an equivalent wind fetch for duration limited wave growth in shallow and intermediate water
fullydevwave: Calculates a fully developed condition for wind wave growth
mindurationdeep: Calculates a minimum required wind duration for wave to be fetch limited in deep water
mindurationshallow: Calculates a minimum required wind duration for wave to be fetch limited in shallow and intermediate water
parametricwavedeep: Calculates wave properties using parametric wave models in deep water
parametricwaveshallow: Calculates wave properties using parametric wave models in shallow and intermediate water
wavedim2dimless: Calculates dimensionless numbers from dimensional numbers
wavedimless2dim: Calculates dimensional numbers from dimensionless numbers
Water Wave Properties:
bretpsd: Calculates Bretschneider spectrum (power spectral density), (Bretschneider, 1959), ITTC spectrum
donelanpsd: Calculates Donelan spectrum (power spectral density), (Donelan et al. 1985)
incidentreflectedwave: Separates incident and reflected waves
jonswappsd: Calculates JONSWAP spectrum (power spectral density), (Hasselmann et al. 1973)
linearwavegenerator: Generates linear waves
linearwavesuperposition: Superpositions linear waves
pmpsd: Calculates PiersonMoskowitz spectrum (power spectral density), (Pierson and Moskowitz 1964)
pressureresponse: Calculates a pressure response factor
randomwavegenerator: Generates random water wave data from a given water wave spectrum using wave superposition
stokeswavegenerator: Generates second order stokes' waves
stokeswavesuperposition: Superpositions second order stokes' waves
tmapsd: Calculates TMA spectrum (power spectral density), (Bouws et al. 1985)
wavebedstress: Calculates the bottom shear velocity and shear stress from current velocity and wave
wavedispersion: Solves water wave dispersion relation
wavedispersionds: Solves water wave dispersion relation with presence of current (Doppler shift)
waveorbitalvelocity: Calculates maximum wave orbital velocity and maximum wave orbital excursion using linear wave theory
wavepower: Calculates wave power
wavepowerfrompsd: Calculates wave energy and wave power from power spectral density
wavevel2wlconvfactor: Calculates a water particle horizontal orbital velocity to the water surface elevation conversion factor
wind:
directionavg: Averages direction
surfaceroughness: Calculates shear velocity and surface roughness from a given velocity profile using Karimpour et al. (2012) method
sustainedwindduration: Calculates the sustained wind duration
windavg: Averages wind velocity and wind direction
winddrag: Calculates wind drag coefficient, wind shear stress, and wind shear velocity
windgustfactor: Converts wind velocity of duration t0 to t
windvelz1toz2: Converts wind velocity from first height, z1 (m), to second height, z2 (m), (e.g. 10 (m)) above surface
gencolormap: Generates a colormap from input colors
seqcolormap: Generates sequential colormap for drawing lines
topocolormap: Exports a topographic colormap
Data Cleaning and Manipulating:
despike3dps: Removes spikes in the time series based on 3D phase space method by Goring and Nikora (2002)
despikediff: Removes spikes in the time series using a local difference of data respect to a moving average window
despikeenvelope: Removes spikes in the time series that are outside a defined envelope
readdatafile: Reads and extracts data from ASCII, text, Comma Separated Values (CSV), Matlab .mat file
replacemissing: Replaces missing data points in the time series
Hurricane:
hurricanebackgroundwind: Calculates and adds background wind velocity due to hurricane front motion to hurricane rotational wind velocity
hurricanedpcpt: Calculates hurricane central pressure (Pc) intensity change over time (dPc/dt)
hurricanepressureh80: Generates hurricane pressure data on given (x,y) points using method from Holland (1980)
hurricanetranslationvel: Calculates hurricane center translational velocity
hurricanewavecontourcem: Calculates hurricane wave height field (contours) on given mesh using
method from Shore Protection Manual (SPM), U.S. Army Corps of Engineers (1984), and Young (1988)
hurricanewavecontourh16: Calculates hurricane wave height and wave period field (contours) on given mesh using
method from Hwang (2016) and Hwang & Walsh (2016)
hurricanewavecontoury88: Calculates hurricane wave height field (contours) on given mesh using method from Young (1988)
hurricanewavemax: Calculates hurricane maximum wave height and wave period at a location of maximum wind
hurricanewindh08: Generates hurricane wind and pressure data on (x,y) points using method from Holland (2008)
hurricanewindh80: Generates hurricane wind and pressure data on given (x,y) points using method from Holland (1980)
hurricanewindinflowangle: Calculates hurricane velocity tangential and inflow angle and inflow velocity in x (East) and y (North) directions
hurricanewindvel: Generates hurricane wind velocity data on given (x,y) points
hurricanewindvelmax: Calculates hurricane maximum wind velocity at the surface level
hurricanewindvelmaxh08: Calculates hurricane maximum wind velocity at the gradient level using Holland (2008) method
hurricanewindvelmaxh80: Calculates hurricane maximum wind velocity at the gradient level using Holland (1980) method
readnhchurricane: Reads and extracts hurricane data from National Hurricane Center (NHC) HURDAT2 file
stormsurge1d: Calculates one dimensional storm surge using Dean Dalrymple (1991) method
Mapping:
convertdir: Converts direction from one system to another one
distancecart: Calculates distance from (x1,y1) to (x2,y2) on cartesian coordinate
distancegc: Calculates distance and azimuth (bearing) between (Latitude,Longitude) points using Great Circle
endpointcart: Finds an end point of the straight line segment from its starting point (x1,y1) and its angle on cartesian coordinate
gridgenerator: Generates 2d xy grid
gridxyz: Interpolates x (longitude), y (latitude) and z (elevation) data into a defined mesh
intersectgc: Finds intersection point between two line segments (line edges) on Great Circle
intersectlineedge: Finds intersection point between two line segments (line edges)
plotxyz: Plots x (longitude), y (latitude) and z (elevation) data into a defined mesh
plotxyzgrid: Plots gridded x (longitude), y (latitude) and z (elevation) data
pointscart: Generates points between ponit (x1,y1) and (x2,y2) on cartesian coordinate
readxyz: Reads and extracts x (longitude), y (latitude) and z (elevation) data from ASCII gridded (tabular) xyz file
reckongc: Calculates end point (Latitude,Longitude) from start point (Latitude,Longitude) and distance and azimuth (bearing) using Great Circle
waypointsgc: Generates (Latitude,Longitude) points between two (Latitude,Longitude) points using Great Circle
windfetch: Calculates a wind fecth and z (elevation) profile along a path over water for a given 2d xy domain (map, image, ...)
zprofilepath: Calculates z (elevation, ...) profile along a path over a given 2d xy domain (map, image, ...)
Signal Processing:
bandpassiirfilter: Creates bandpass or bandreject (notch) recursive (Infinite Impulse Response ,IIR) zerophase (bidirectional) filter
bandpasssincfilter: Creates bandpass or bandreject filter using windowedsinc function
bartlettpsd: Calculates power spectral density using Bartlett's method
freqresp2impresp: Calculates impulse and step response from frequency response
highpasssincfilter: Creates highpass filter using lowpass windowedsinc function
impresp2freqresp: Calculates frequency response from impulse response
inversefreqresp: Inverses input filter (frequency response), e.g. convert lowpass filter to highpass filter
inverseimpresp: Inverses input filter (impulse response), e.g. convert lowpass filter to highpass filter
lowpasssincfilter: Creates lowpass filter using windowedsinc function
periodogrampsd: Calculates power spectral density using periodogram method
psd2timeseries: Generates random wave data from a given spectrum
singlepoleiirfilter: Creates lowpass or highpass single pole recursive (Infinite Impulse Response ,IIR) zerophase (bidirectional) filter
smoothbyfilterresp: Smoothes input data using a impulse response or frequency response
smoothbywindowfun: Smoothes input data using a window function
spectrogrampsd: Calculates spectrogram following Welch's method without averaging
welchpsd: Calculates power spectral density using Welch's method
windowfun: Creates window function
windowfunfreqresp: Calculates frequency response of the window function
Statistics:
curvefit2d: Fits curve to 2 dimensinal input dataset
curvefit3d: Fits curve to 3 dimensinal input dataset
dataoverview: Displays an overview of the input data
findextremum: Finds local extremum (maximum and minimum) in data
findknn: Finds knearest neighbors using Euclidean distance
fitgoodness: Calculates goodness of fit parameters
interp2dgrid: Interpolates 2d gridded data on given scatter point(s) using nearest neighbor method
interp2dscatter: Interpolates 2d scattered data on given point(s) by downsampling the input data
levelcrossing: Calculates crossing point for a given level by using an upward zero crossing method
probability1d: Calculates 1D probability density distribution for a given dataset
probability2d: Calculates 2D (joint) probability density distribution for two given datasets
SWAN:
plotgriddomain: Plots structured (x,y,z) domain and its associated xy grid
swandepthgrid: Generates SWAN depth file and its associated xy grid file
swanvectorvarspconst: Generates SWAN file for spatially constant vector variable
swanvectorvarspvariedgrid: Generates SWAN file for spatially varied vector variable from gridded input data
swanvectorvarspvariedsct: Generates SWAN file for spatially varied vector variable from scattered input data
swanwaterlevelspconst: Generates SWAN water level file for spatially constant water level
swanwaterlevelspvariedgrid: Generates SWAN water level file for spatially varied water level from gridded input data
swanwaterlevelspvariedsct: Generates SWAN water level file for spatially varied water level from scattered input data
swanwindspconst: Generates SWAN wind file for spatially constant wind
swanwindspvariedgrid: Generates SWAN wind file for spatially varied wind from gridded input data
swanwindspvariedsct: Generates SWAN wind file for spatially varied wind from scattered input data
Water Wave Data Analysis:
diagnostictail: Replaces a spectrum tail with JONSWAP (Hasselmann et al., 1973) or TMA Spectrum (Bouws et al., 1985)
pressure2surfaceelevfft: Calculates water surface elevation time series from water pressure time series by using Fast Fourier Transform
pressure2surfaceelevzcross: Calculates water surface elevation time series from water pressure time series by using an upward zero crossing method
seaswell1d: Partitions (separates) wind sea from swell in a power spectral density using an one dimensional method
velocity2surfaceelevfft: Calculates water surface elevation time series from wave orbital velocity time series by using Fast Fourier Transform
velocity2surfaceelevzcross: Calculates wave properties from wave orbital velocity by using an upward zero crossing method
wavefrompressurepsd: Calculates wave properties from water pressure by converting it to water surface elevation power spectral density
wavefrompressurezcross: Calculates wave properties from water pressure by using an upward zero crossing method
wavefromsurfaceelevpsd: Calculates wave properties from water surface elevation power spectral density
wavefromsurfaceelevzcross: Calculates wave properties from water surface elevation by using an upward zero crossing method
wavefromvelocitypsd: Calculates wave properties from wave orbital velocity by converting it to water surface elevation power spectral density
wavefromvelocityzcross: Calculates wave properties from wave orbital velocity by using an upward zero crossing method
wavepropfrompsd: Calculates wave properties from a power spectral density
Water Wave Directional Analysis:
directionalpsd: Calculates wave directional spectrum using parametric directional spreading function such as:
Mitsuyasu et al. (1975), Hasselmann et al. (1980) and Donelan et al. (1985)
directionalpsdetauv: Calculates wave directional spectrum using water surface elevation and horizontal orbital velocity
directionalpsdpuv: Calculates wave directional spectrum using pressure and horizontal orbital velocity
enu2truenorth: Converts mathematical direction (angle) from ENU (East North Up) coordinate system to compass direction with respect to true north
wavediretauv: Calculates wave direction using water surface elevation and horizontal orbital velocity
wavedirpuv: Calculates wave direction using pressure and horizontal orbital velocity
Water Wave Parametric Model:
asymptlimit: Calculates dimensionless asymptotic limits of wind wave growth in shallow and intermediate water
equivfetchdeep: Calculates an equivalent wind fetch for duration limited wave growth in deep water
equivfetchshallow: Calculates an equivalent wind fetch for duration limited wave growth in shallow and intermediate water
fullydevwave: Calculates a fully developed condition for wind wave growth
mindurationdeep: Calculates a minimum required wind duration for wave to be fetch limited in deep water
mindurationshallow: Calculates a minimum required wind duration for wave to be fetch limited in shallow and intermediate water
parametricwavedeep: Calculates wave properties using parametric wave models in deep water
parametricwaveshallow: Calculates wave properties using parametric wave models in shallow and intermediate water
wavedim2dimless: Calculates dimensionless numbers from dimensional numbers
wavedimless2dim: Calculates dimensional numbers from dimensionless numbers
Water Wave Properties:
bretpsd: Calculates Bretschneider spectrum (power spectral density), (Bretschneider, 1959), ITTC spectrum
donelanpsd: Calculates Donelan spectrum (power spectral density), (Donelan et al. 1985)
incidentreflectedwave: Separates incident and reflected waves
jonswappsd: Calculates JONSWAP spectrum (power spectral density), (Hasselmann et al. 1973)
linearwavegenerator: Generates linear waves
linearwavesuperposition: Superpositions linear waves
pmpsd: Calculates PiersonMoskowitz spectrum (power spectral density), (Pierson and Moskowitz 1964)
pressureresponse: Calculates a pressure response factor
randomwavegenerator: Generates random water wave data from a given water wave spectrum using wave superposition
stokeswavegenerator: Generates second order stokes' waves
stokeswavesuperposition: Superpositions second order stokes' waves
tmapsd: Calculates TMA spectrum (power spectral density), (Bouws et al. 1985)
wavebedstress: Calculates the bottom shear velocity and shear stress from current velocity and wave
wavedispersion: Solves water wave dispersion relation
wavedispersionds: Solves water wave dispersion relation with presence of current (Doppler shift)
waveorbitalvelocity: Calculates maximum wave orbital velocity and maximum wave orbital excursion using linear wave theory
wavepower: Calculates wave power
wavepowerfrompsd: Calculates wave energy and wave power from power spectral density
wavevel2wlconvfactor: Calculates a water particle horizontal orbital velocity to the water surface elevation conversion factor
wind:
directionavg: Averages direction
surfaceroughness: Calculates shear velocity and surface roughness from a given velocity profile using Karimpour et al. (2012) method
sustainedwindduration: Calculates the sustained wind duration
windavg: Averages wind velocity and wind direction
winddrag: Calculates wind drag coefficient, wind shear stress, and wind shear velocity
windgustfactor: Converts wind velocity of duration t0 to t
windvelz1toz2: Converts wind velocity from first height, z1 (m), to second height, z2 (m), (e.g. 10 (m)) above surface
License Agreement and Disclaimer
Copyright (c) 2018 Arash Karimpour
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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 OR COPYRIGHT HOLDERS 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.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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 OR COPYRIGHT HOLDERS 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.