Repository: UW-SASWE/RAT (language: python)

Issue:
Merge SM-Main-PyPi 
Introduces:
- RAT CLI - allows for initialization and running of RAT from the command line.
  - rat init - initialize 
- Ability to install using conda.


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 68eac364..a7feba65 100644
--- a/.gitignore
+++ b/.gitignore
@@ -205,8 +205,13 @@ backend/scripts/_send_files.py
 .DS_Store
 backend/scripts/data_processing/_download_data.py
 
-backend/params/routing/DRT_FDR_ARCfmt.tif
 
-backend/params/secrets/
-
-backend/params/vic/params_all_mekong.nc
+#SM
+data/*
+global_data/*
+trial_notebooks/*
+params/*
+models/*
+*dask-worker-space/*
+!src/params/rat_mekong.yml
+src/RAT/ee_utils/ee_config.py
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index f288702d..e72bfdda 100644
--- a/LICENSE
+++ b/LICENSE
@@ -671,4 +671,4 @@ into proprietary programs.  If your program is a subroutine library, you
 may consider it more useful to permit linking proprietary applications with
 the library.  If this is what you want to do, use the GNU Lesser General
 Public License instead of this License.  But first, please read
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
\ No newline at end of file
diff --git a/backend/params/j3_meta.txt b/backend/params/j3_meta.txt
deleted file mode 100644
index 0acdeb50..00000000
--- a/backend/params/j3_meta.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-216
\ No newline at end of file
diff --git a/backend/params/metsim/domain.nc b/backend/params/metsim/domain.nc
deleted file mode 100644
index f33dbc7f..00000000
Binary files a/backend/params/metsim/domain.nc and /dev/null differ
diff --git a/backend/params/metsim/params.yaml b/backend/params/metsim/params.yaml
deleted file mode 100644
index f2644124..00000000
--- a/backend/params/metsim/params.yaml
+++ /dev/null
@@ -1,61 +0,0 @@
-MetSim:
-    # Time step in minutes
-    time_step: 360
-    # Forcings begin here (year-month-day)
-    start: 2001-4-1
-    # Forcings end at this date (year-month-day)
-    stop: 2021-6-10
-    # Input and output directories
-    forcing: '/houston2/pritam/rat_mekong_v3/backend/data/metsim_inputs/metsim_inputs.nc'
-    domain: '/houston2/pritam/rat_mekong_v3/backend/params/metsim/domain.nc'
-    state: '/houston2/pritam/rat_mekong_v3/backend/params/metsim/state.nc'
-    forcing_fmt: 'netcdf'
-    in_format: 'netcdf'
-    out_dir: '/houston2/pritam/rat_mekong_v3/backend/data/metsim_results'
-    out_prefix: '6H_VIC'
-#     out_prefix: 'yaml_output'
-#     prec_type: 'triangle'
-#     utc_offset: True
-    calendar: 'proleptic_gregorian'
-    # time_grouper: 'Y'
-
-out_vars:
-    temp:
-        out_name: 'temp'
-    prec:
-        out_name: 'prec'
-    shortwave:
-        out_name: 'shortwave'
-    longwave:
-        out_name: 'longwave'
-    air_pressure:
-        out_name: 'air_pressure'
-    vapor_pressure:
-        out_name: 'vapor_pressure'
-    wind:
-        out_name: 'wind'
-
-chunks:
-    lat: 30
-    lon: 20
-
-forcing_vars:
-    # Format is metsim_name: input_name
-    prec  : 'precip'
-    t_max : 'tmax'
-    t_min : 'tmin'
-    wind  : 'wind'
-
-state_vars:
-    # Format is metsim_name: input_name
-    prec  : 'precip'
-    t_max : 'tmax'
-    t_min : 'tmin'
-    wind  : 'wind'
-
-domain_vars:
-    # Format is metsim_name: input_name
-    lat  : 'lat'
-    lon  : 'lon'
-    mask : 'mask'
-    elev : 'elev'
diff --git a/backend/params/rat_mekong.yml b/backend/params/rat_mekong.yml
deleted file mode 100644
index 8e8477bb..00000000
--- a/backend/params/rat_mekong.yml
+++ /dev/null
@@ -1,89 +0,0 @@
-GLOBAL:
-  project_dir: /houston2/pritam/rat_mekong_v3
-  conda_hook: /houston2/pritam/activate_conda.sh
-  # MetSim requires 90 days of spin up data, so data starting from `begin` to `begin`+90 will be used as spin up data
-  begin: 2001-01-01
-  end: 2022-02-18
-  previous_end: 2022-02-14
-  multiprocessing: 32                    # How many cores to use
-
-METSIM:
-  metsim_env: /houston2/pritam/conda/envs/metsim
-  metsim_param_file: /houston2/pritam/rat_mekong_v3/backend/params/metsim/params.yaml
-  metsim_workspace: /houston2/pritam/rat_mekong_v3/backend/data/metsim_workspace            # Logs and Parameter file will be saved here for each run
-  # metsim_results: /houston2/pritam/rat_mekong_v3/backend/data/metsim_results_conf/6H_VIC_20010401-20210722.nc  # optional
-  out_dir: /houston2/pritam/rat_mekong_v3/backend/data/metsim_results/
-
-VIC:
-  # VIC Runner specific parameters
-  vic_env: /houston2/pritam/rat_mekong_v3/backend/models/vic_env
-  vic_param_file: /houston2/pritam/rat_mekong_v3/backend/params/vic/vic_params.txt              # Default parameter file. OPTIONAL. If passed, this file will be used to initialize, but will be overriden by any options specified in this config file. If not passed, all necessary options must be specified here.
-  vic_workspace: /houston2/pritam/rat_mekong_v3/backend/data/vic_workspace                      # Logs and Parameter file will be saved here for each run
-  vic_forcings_dir: /houston2/pritam/rat_mekong_v3/backend/data/forcings
-
-##---- VIC Parameters (Optional; must match the option names of [global parameter file of VIC](https://vic.readthedocs.io/en/master/Documentation/Drivers/Image/GlobalParam/)).
-##---- If not provided, then the parameter file defined by `vic_param_file` will be used as the 
-##---- parameter file
-VIC PARAMETERS:
-  ## VIC Simulation start date. Since metsim requires 90 days of data to spin up, the vic inputs start 
-  ##   at `begin`+91 days. So, just add 3 months to start date of the RAT-Mekong model
-  ## If not specified, VIC Start date will be calculated as `begin + timedelta(days=90)`
-  ## and VIC End date will be calcualted from this config file
-  # STARTYEAR: '2001'                     # Alternatively, the start date and end date can
-  # STARTMONTH: '04'                      #   overridden by specifying these 6 parameters
-  # STARTDAY: '02'         
-  # ENDYEAR: '2021'
-  # ENDMONTH: '04'
-  # ENDDAY: '01'
-
-  # # Any other option goes here
-  # DOMAIN_TYPE:
-  #   LAT: lat
-  #   LON: lon
-  #   MASK: mask
-  #   AREA: area
-  #   FRAC: frac
-  #   YDIM: lat
-  #   XDIM: lon
-  # FORCING1: /houston2/pritam/rat_mekong_v3/backend/data/forcings/forcing_
-  # FORCE_TYPE:
-  #   AIR_TEMP: temp
-  #   PREC: prec
-  #   PRESSURE: air_pressure
-  #   SWDOWN: shortwave
-  #   LWDOWN: longwave
-  #   VP: vapor_pressure
-  #   WIND: wind
-  # OUTVAR:             # Specify as list
-  #   - OUT_PREC
-  #   - OUT_EVAP
-  #   - OUT_RUNOFF
-  #   - OUT_BASEFLOW
-  RESULT_DIR: /houston2/pritam/rat_mekong_v3/backend/data/vic_results
-
-ROUTING:
-  # Directories
-  # route_param_dir: /houston2/pritam/rat_mekong_v3/backend/params/routing
-  route_input_dir: /houston2/pritam/rat_mekong_v3/backend/data/rout_input   # can be set equal to vic output directory later TODO
-  # route_result_dir: /houston2/pritam/rat_mekong_v3/backend/data/rout_results_conf
-  route_inflow_dir: /houston2/pritam/rat_mekong_v3/backend/data/inflow
-  route_workspace: /houston2/pritam/rat_mekong_v3/backend/data/route_workspace
-
-  # Parameter files
-  route_param_file: /houston2/pritam/rat_mekong_v3/backend/params/routing/route_param.txt  # Will be used to initialize. If not passed, every option must be specified in `ROUTING PARAMETERS` section
-  station_latlon_path: /houston2/pritam/rat_mekong_v3/backend/data/ancillary/stations_latlon.csv  # In lat lon format
-  route_model: /houston2/pritam/rat_mekong_v3/backend/models/route_model/rout
-
-ROUTING PARAMETERS:  # (Optional; if passed, will override the `route_param_file` options)
-  flow_direction_file: /houston2/pritam/rat_mekong_v3/backend/params/routing/DRT_FDR_VIC.asc
-  velocity: 1.5
-  diff: 800
-  xmask: 5000
-  fraction: 1
-  # station_file: null        # Will be generated automatically from `station_file`
-  # input_files_prefix: null  # Will be generated automatically based on vic output
-  input_file_precision: 2     # Default. Hardcoded. Works fine for 0.0625° grid.
-  # start_date: null
-  # end_date: null
-  output_dir: /houston2/pritam/rat_mekong_v3/backend/data/rout_results
-  uh: /houston2/pritam/rat_mekong_v3/backend/params/routing/uh.txt
\ No newline at end of file
diff --git a/backend/params/routing/DRT_FDR_VIC.asc b/backend/params/routing/DRT_FDR_VIC.asc
deleted file mode 100644
index 599c1e15..00000000
--- a/backend/params/routing/DRT_FDR_VIC.asc
+++ /dev/null
@@ -1,394 +0,0 @@
-ncols        237
-nrows        388
-xllcorner    93.875
-yllcorner    9.5625
-cellsize     0.0625
-NODATA_value  0
- 0 0 0 0 0 0 0 0 0 5 5 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 5 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 4 5 7 6 7 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 4 5 5 6 5 7 6 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 3 4 5 5 7 6 7 6 7 5 6 5 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 2 3 4 7 6 5 7 7 8 5 6 4 4 4 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 1 2 1 5 5 5 7 5 6 7 7 4 4 3 4 5 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 4 5 3 3 5 6 5 7 4 5 7 3 5 5 5 6 7 7 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 5 4 5 4 5 5 4 4 5 4 5 7 5 6 5 5 7 3 4 7 7 1 8 7 3 3 4 4 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 4 4 4 4 5 4 3 4 3 3 3 4 5 3 5 6 6 6 5 5 4 7 7 7 7 5 4 3 3 5 3 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 3 3 3 3 3 3 3 2 1 5 3 3 3 3 4 5 7 5 6 5 6 7 7 4 5 5 3 3 4 5 6 4 5 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 3 1 7 1 1 1 3 1 3 3 1 7 1 8 3 3 4 4 5 5 7 6 5 3 5 5 5 3 3 4 5 5 3 5 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 1 0 1 1 1 3 8 2 2 1 3 1 8 2 3 5 3 5 5 7 7 7 4 3 5 5 7 1 3 5 7 3 5 3 5 6 6 5 6 1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 5 3 1 8 1 1 7 2 1 3 2 5 7 5 4 5 6 4 5 7 6 3 4 3 3 3 4 5 7 7 7 3 4 5 8 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 4 5 2 3 3 1 3 3 3 3 2 3 3 3 4 3 5 5 5 5 7 6 7 3 3 5 3 3 3 5 7 5 3 5 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 3 3 3 3 2 7 1 1 2 1 7 3 2 1 1 3 3 3 4 7 7 5 3 3 4 4 5 6 3 3 4 3 4 5 5 6 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 2 1 1 8 7 5 3 4 5 3 4 5 5 6 3 1 1 8 5 5 7 3 5 5 3 4 5 6 7 1 7 4 4 4 5 7 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 7 5 3 4 3 4 5 5 5 3 4 5 6 7 6 7 1 4 3 4 5 5 7 3 3 4 5 6 7 2 3 3 4 5 5 6 1 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 8 7 5 3 3 3 3 3 2 1 3 4 5 1 7 5 4 4 3 3 3 4 5 4 1 3 5 7 8 7 7 1 3 5 7 7 8 8 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 3 5 3 5 6 2 1 2 2 3 3 3 3 4 7 5 7 4 5 3 1 3 4 5 5 4 5 5 3 4 5 3 4 4 7 8 5 7 7 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 5 3 4 3 3 3 3 1 7 5 2 1 1 3 2 3 5 5 6 3 3 4 3 3 3 3 3 3 3 3 4 5 5 6 7 3 4 5 4 8 8 3 3 5 6 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 3 3 3 3 3 3 1 7 1 8 7 3 4 3 2 3 3 2 3 4 7 7 6 1 1 7 7 1 1 3 8 7 3 4 3 5 7 1 8 3 4 5 5 7 4 4 5 6 5 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 2 1 3 8 1 5 8 8 7 1 3 2 2 1 3 2 3 4 1 5 1 1 1 8 5 3 1 1 8 7 3 3 5 7 7 4 1 3 4 4 5 5 3 4 5 5 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 6 5 3 3 3 1 7 4 4 3 3 3 3 2 3 2 3 5 6 7 7 2 1 4 5 3 5 8 8 7 3 4 5 5 6 4 5 7 4 5 5 7 7 3 3 5 3 4 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 3 2 4 2 1 8 3 3 2 1 3 1 2 2 3 2 3 4 5 4 5 6 1 4 5 4 5 3 4 5 3 5 7 7 3 3 4 5 6 7 7 7 7 5 5 7 5 3 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 3 3 1 8 7 2 1 1 7 4 3 3 1 8 3 3 3 4 5 6 7 6 1 4 5 5 7 7 3 3 4 7 5 7 5 3 4 4 7 1 7 7 4 5 7 4 5 5 7 7 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 4 8 8 8 3 2 1 4 3 2 1 1 6 3 3 2 1 4 5 5 7 6 3 3 4 5 5 3 1 3 4 5 5 5 5 3 3 4 5 5 5 3 6 5 7 5 5 7 1 8 4 5 7 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 3 3 1 7 1 8 7 3 3 1 1 5 3 4 3 5 7 7 5 4 4 5 4 2 1 3 3 4 5 5 4 5 6 7 7 5 6 7 7 6 5 7 7 5 7 7 7 4 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 8 8 7 7 1 2 1 2 1 7 1 3 2 5 5 1 4 5 3 4 3 1 8 7 5 5 3 5 3 5 7 7 7 6 7 1 8 7 7 7 5 6 7 6 3 4 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 8 8 3 4 5 2 3 8 1 4 1 3 4 5 5 5 5 6 5 1 8 5 3 3 3 3 4 5 1 1 7 7 7 7 1 7 1 8 7 7 5 5 2 1 3 5 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 3 3 3 2 7 3 3 3 3 3 3 4 5 7 3 4 7 6 3 1 1 2 1 5 7 7 1 1 7 7 3 8 1 3 8 7 6 4 5 5 5 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 7 2 7 3 3 3 5 5 1 3 3 5 6 3 3 5 1 2 1 8 7 3 5 7 7 3 3 1 7 7 3 1 3 3 8 7 3 4 7 2 3 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 5 6 1 2 1 3 3 3 5 3 4 5 4 2 4 5 5 7 6 4 5 4 5 8 7 4 5 8 6 3 3 2 1 1 7 2 1 5 7 4 4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 5 7 1 7 5 1 5 5 5 6 3 3 3 3 4 5 7 4 5 6 3 3 4 5 8 7 4 5 7 5 1 3 3 3 8 7 5 5 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 5 5 5 3 3 3 4 4 5 7 1 7 1 3 1 3 4 5 6 6 7 4 3 5 7 7 1 4 5 6 5 1 3 2 1 8 3 5 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 1 7 7 3 4 5 1 5 5 1 2 7 3 4 7 5 6 3 2 4 5 7 5 1 5 7 5 7 7 3 1 0 0 4 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 6 1 1 5 8 5 3 3 4 5 7 7 1 4 5 3 5 7 7 7 5 3 5 5 5 5 6 7 5 7 7 5 1 8 0 0 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 5 5 6 1 7 3 5 7 5 3 3 3 4 5 7 8 3 3 4 7 7 7 7 7 5 5 6 0 0 0 0 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 5 5 5 4 5 5 6 5 1 3 4 5 6 4 5 3 5 1 8 1 7 7 7 7 3 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 3 4 5 3 3 5 5 6 3 1 4 5 6 4 5 6 7 7 3 1 7 5 6 0 0 0 0 0 0 0 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 8 3 3 5 5 5 7 1 7 4 4 5 7 3 5 1 1 2 2 1 7 7 7 0 0 0 0 0 0 5 8 8 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 1 3 3 5 7 5 3 3 3 3 4 5 5 7 7 5 7 1 1 8 7 7 0 0 0 0 0 0 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 8 4 4 5 5 2 2 3 1 3 5 6 5 5 4 7 5 1 6 7 6 7 0 0 0 0 0 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 3 3 4 7 7 2 1 3 4 5 3 5 3 5 5 5 5 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 1 8 3 4 5 5 5 2 3 3 4 7 7 3 5 6 5 7 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 5 5 3 1 3 4 7 7 1 8 3 5 7 3 4 5 5 7 3 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 5 5 5 3 5 7 5 3 5 5 6 7 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 3 3 3 3 4 5 7 5 5 3 5 7 8 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 1 3 5 7 5 6 7 5 7 6 7 7 5 6 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 3 4 4 7 5 4 5 7 7 3 5 1 8 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 5 4 7 7 7 7 6 6 5 5 7 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 3 3 3 4 5 1 8 7 7 3 5 6 5 6 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 3 5 3 1 1 8 7 5 7 7 7 8 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 4 5 5 2 1 1 8 7 1 7 8 7 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 5 6 3 1 8 8 7 6 1 8 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 3 4 5 5 8 1 8 5 7 3 8 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 3 1 5 3 5 6 1 7 7 1 1 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 3 4 4 3 4 7 7 5 8 7 5 6 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 5 3 5 7 5 5 8 7 7 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 5 4 7 7 5 1 8 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 3 5 3 5 5 4 5 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 5 3 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 3 5 6 4 5 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 3 3 5 6 6 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 2 1 5 7 7 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 3 3 4 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 1 3 5 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 4 4 5 3 5 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 5 4 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 3 3 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 1 2 5 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 1 3 4 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 5 6 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 6 3 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 5 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 4 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 3 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 5 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 5 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 7 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 8 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 5 8 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 6 8 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 7 3 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 5 6 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 7 1 7 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 7 3 8 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 6 3 1 8 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 5 7 5 3 1 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 7 7 3 1 8 7 6 0 0 0 0 3 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 1 8 2 1 1 8 7 5 0 0 4 5 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 7 5 7 5 3 1 4 5 7 5 3 3 5 6 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 5 7 5 5 7 3 5 7 4 5 3 5 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 7 8 4 5 6 3 4 5 7 4 5 6 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 6 7 5 3 6 7 5 1 5 5 1 5 7 8 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 7 5 5 6 7 5 3 5 7 3 5 7 5 6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 6 6 7 5 4 5 6 3 4 5 5 6 7 5 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 7 5 3 5 6 7 5 3 5 5 7 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 7 5 5 5 7 7 3 2 3 6 3 4 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 7 3 4 5 5 7 7 3 3 4 5 3 3 3 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 5 3 5 7 7 6 1 3 3 5 7 2 1 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 3 5 1 1 6 4 4 3 5 7 3 8 1 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 7 5 6 4 5 6 3 3 3 5 1 1 7 4 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 3 5 7 4 5 7 2 3 3 4 5 6 3 3 5 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 5 7 3 4 5 6 6 2 3 5 7 3 1 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 7 3 5 8 3 4 7 4 5 3 4 5 7 3 4 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 5 6 4 4 5 6 7 5 6 3 4 5 7 3 5 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 1 5 3 3 3 3 5 6 5 3 5 7 6 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 4 5 7 4 5 6 2 3 5 7 4 5 7 8 7 1 1 8 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 5 5 3 3 5 6 3 1 3 3 3 5 5 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 7 7 3 5 7 6 3 1 1 4 5 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 7 7 3 4 7 7 3 2 4 5 5 7 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 8 7 3 4 1 5 3 3 5 6 7 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 8 7 3 4 5 4 3 5 7 1 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 4 5 3 5 3 2 4 5 3 1 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 5 7 7 3 5 6 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 7 8 7 3 4 5 5 6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 6 8 5 3 3 3 3 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 7 1 3 3 1 8 5 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 7 4 5 6 1 1 3 5 7 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 6 3 4 4 7 5 5 6 5 4 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 7 7 1 3 3 3 3 3 2 1 3 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 5 5 5 8 3 2 1 5 5 3 4 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 3 4 5 2 7 8 5 6 3 1 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 1 3 4 5 5 5 5 5 3 4 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 6 6 3 3 3 3 3 3 3 1 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 6 3 2 7 1 7 1 3 5 6 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 3 2 1 3 1 7 5 3 5 6 5 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 2 1 0 0 5 6 3 4 3 4 5 3 6 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 7 0 0 0 0 0 4 5 1 3 5 3 5 6 7 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 4 5 3 5 5 7 1 7 4 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 5 7 7 5 1 7 5 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 5 5 7 6 3 3 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 6 7 7 5 3 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 6 7 7 3 5 7 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 4 3 6 7 1 5 5 7 7 5 7 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 3 5 6 1 8 5 7 5 7 3 5 5 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 6 0 0 3 5 7 7 5 6 7 4 5 7 5 7 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 6 7 7 3 5 6 6 0 5 5 6 1 6 7 7 7 5 5 3 6 8 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 6 1 8 5 4 5 7 7 4 5 5 7 6 7 7 7 7 3 4 5 6 6 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 5 7 8 7 4 5 6 7 8 3 3 5 7 7 5 8 8 8 7 3 6 7 7 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 7 5 3 4 5 5 7 7 5 3 5 6 5 3 2 7 6 4 5 6 7 7 5 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 5 5 5 5 3 5 7 7 1 3 3 5 7 5 3 2 1 7 5 6 7 7 6 5 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 1 3 3 3 3 3 6 7 5 6 3 3 5 5 6 3 1 8 3 5 7 1 1 3 3 5 7 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 2 1 5 1 5 7 7 5 4 2 3 6 7 7 8 1 5 1 4 5 6 3 3 3 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 7 3 1 8 3 3 3 3 3 3 3 4 5 5 3 5 6 7 2 3 5 7 7 3 3 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 8 3 1 7 7 7 3 1 7 6 1 3 5 5 4 5 6 7 4 5 6 5 5 5 6 7 1 1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 1 8 7 3 3 1 7 7 7 4 4 5 3 5 5 7 3 4 5 5 6 7 7 7 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 3 1 7 7 5 3 3 3 4 5 5 6 6 1 3 6 7 5 6 6 5 6 7 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 1 8 8 3 4 3 1 3 5 7 7 3 3 5 7 5 3 6 7 7 7 7 7 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 5 7 3 5 2 1 2 4 5 5 6 5 5 6 6 7 2 1 6 1 1 3 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 5 4 2 1 1 2 3 5 7 7 6 7 7 1 7 1 7 7 3 3 4 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 5 3 2 5 2 1 3 5 7 1 1 8 1 7 7 5 5 8 3 4 3 3 4 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 4 5 4 5 4 5 3 4 7 7 5 8 5 8 7 7 5 7 3 3 1 5 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 3 3 4 3 3 3 3 3 4 7 5 5 5 1 1 7 4 5 7 2 1 3 5 3 5 0 0 0 0 0 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 4 5 6 3 1 1 1 8 7 3 4 3 6 7 7 7 7 3 4 5 3 3 3 4 3 4 7 0 0 0 0 0 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 6 3 5 6 7 1 3 8 7 3 2 1 1 4 5 5 4 1 8 3 3 4 7 7 5 5 2 3 5 5 0 0 0 0 0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 6 7 3 5 7 7 7 1 1 8 7 3 4 4 5 6 7 3 5 1 5 1 3 5 3 5 5 7 3 5 7 6 7 5 6 8 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 7 7 3 5 7 5 8 7 5 5 4 5 3 3 3 5 7 2 5 3 6 2 1 5 7 3 5 6 6 6 7 7 3 5 7 1 4 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 3 5 7 5 3 3 4 5 5 7 4 5 4 5 4 1 3 5 6 7 7 7 6 6 5 4 4 5 5 7 7 7 1 7 3 3 5 6 7 3 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 6 7 3 2 3 5 5 6 6 4 5 3 3 3 3 3 4 5 5 6 4 5 6 3 3 3 6 7 4 5 2 1 4 7 5 6 3 2 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 5 7 6 4 3 5 6 7 7 3 2 7 1 8 4 5 5 7 5 7 5 5 7 5 7 7 6 4 5 6 3 3 5 5 6 6 5 4 4 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 7 7 7 6 4 5 6 1 8 8 5 1 8 7 8 4 4 5 8 7 7 3 4 5 7 8 6 6 5 5 5 6 2 4 5 7 7 3 3 3 4 5 6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 6 1 8 8 1 3 5 7 7 5 3 3 1 7 4 4 5 3 4 5 8 7 7 3 5 6 5 7 7 5 6 5 3 3 4 5 7 5 5 3 3 3 5 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 5 4 5 6 5 5 7 3 5 7 5 4 5 7 4 8 5 3 5 3 5 4 5 1 3 3 3 3 4 8 5 6 7 6 6 1 3 3 3 3 2 2 3 3 3 5 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 4 5 7 3 4 5 5 5 5 6 7 3 3 3 3 3 3 3 2 3 3 4 7 5 6 3 5 5 4 5 1 5 7 5 3 3 3 1 8 2 1 5 5 3 5 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 3 6 4 5 6 5 6 3 3 6 7 7 4 2 1 1 1 1 1 3 2 2 1 3 5 5 7 3 3 3 5 7 5 6 7 6 7 2 1 5 5 5 7 5 7 5 5 7 7 6 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 6 7 7 7 7 7 3 4 5 7 1 1 1 5 1 7 7 7 1 3 4 2 2 3 3 5 7 5 7 7 7 7 7 8 5 5 6 3 3 3 3 4 5 7 6 7 1 7 5 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 5 1 1 7 7 8 5 3 5 7 5 4 5 7 2 1 7 4 5 4 5 1 3 1 1 3 5 7 7 5 6 5 4 5 5 5 7 3 2 1 3 3 3 4 5 6 1 3 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 3 5 7 3 8 7 7 5 3 3 3 4 5 7 7 5 1 6 3 3 4 3 3 4 3 3 2 4 5 6 5 5 7 7 4 5 6 7 3 5 5 3 3 3 3 5 7 6 5 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 1 2 1 5 5 4 3 3 1 1 6 5 6 7 4 5 3 5 3 2 1 3 2 1 3 3 5 7 5 7 7 7 3 5 1 7 3 4 5 3 2 3 3 4 7 6 6 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 3 3 3 3 3 2 7 7 5 7 6 7 7 3 3 5 3 2 1 7 2 1 7 3 3 5 6 7 1 6 7 3 5 7 7 7 5 5 3 3 2 3 3 4 7 6 7 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 4 5 5 5 1 1 8 3 4 5 7 5 6 5 3 3 3 1 7 6 7 7 5 5 5 6 3 1 7 7 1 3 6 7 7 3 5 4 5 2 3 2 3 3 5 5 6 4 5 3 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 3 3 4 5 6 7 3 1 4 5 7 5 5 3 1 1 5 5 7 5 6 4 5 6 7 5 1 5 7 3 5 6 8 7 3 4 3 5 3 1 3 2 3 5 6 7 1 5 6 0 0 0 0 5 5 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 7 1 3 4 5 7 4 4 5 3 3 3 3 4 5 3 3 5 5 5 5 5 7 7 3 2 1 8 7 7 7 7 7 7 5 1 3 3 2 7 6 1 3 5 1 4 5 5 7 0 0 0 3 5 6 8 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 7 7 3 1 4 5 3 3 2 7 1 1 5 3 3 2 1 5 7 5 7 7 8 7 3 1 1 6 5 6 1 1 1 7 3 3 3 1 7 4 3 3 2 5 5 6 5 7 0 0 3 5 6 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 7 5 6 2 4 3 2 7 1 1 7 5 4 3 2 5 3 6 7 7 8 7 1 8 2 7 1 6 7 7 7 7 1 7 1 8 3 1 3 3 2 1 3 3 4 5 6 7 0 0 5 6 7 7 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 8 7 7 3 1 1 7 7 4 5 4 3 5 1 7 4 5 6 7 7 1 7 1 3 1 6 1 7 5 5 6 7 3 8 7 6 1 7 3 3 1 5 1 1 5 5 6 4 4 5 5 7 4 3 1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 8 1 7 5 6 5 5 1 8 5 5 4 3 5 6 7 5 5 7 5 7 7 7 3 2 1 7 3 5 5 6 7 6 5 1 4 5 5 7 3 4 3 5 5 6 3 5 7 7 1 5 7 7 3 2 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 3 5 3 6 7 5 4 3 3 3 3 3 4 5 5 7 8 7 5 3 5 6 6 5 8 3 3 5 6 7 5 6 7 4 5 7 6 5 3 3 3 3 4 5 3 3 5 5 7 7 5 7 1 3 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 5 7 5 3 3 3 3 2 7 3 3 5 7 7 7 1 5 6 6 7 1 7 5 3 3 5 7 6 7 7 7 3 3 3 3 4 5 1 1 1 3 3 1 3 3 3 5 5 6 5 6 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 6 1 4 5 5 4 5 6 7 3 1 7 1 5 3 6 7 8 6 7 7 7 1 1 8 5 3 3 4 5 7 7 8 4 4 5 6 5 1 3 5 3 1 1 3 1 7 5 3 3 4 7 7 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 7 5 3 3 4 5 6 7 5 6 4 5 4 5 4 3 5 7 7 8 1 7 7 7 7 3 5 4 3 4 7 5 6 3 5 7 6 7 3 4 4 2 1 3 2 5 3 3 2 4 5 6 6 7 3 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 7 3 3 3 4 3 3 5 7 4 5 3 3 5 6 7 7 7 7 6 7 5 5 5 5 7 3 3 3 3 3 5 7 5 5 6 7 7 5 6 3 3 1 7 5 4 5 3 3 2 5 7 7 7 7 5 5 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 7 5 3 3 5 2 1 4 5 5 5 5 6 7 7 1 7 1 8 7 1 8 7 7 7 7 3 2 1 3 5 6 7 7 7 7 6 7 4 7 3 1 2 3 3 3 6 1 6 3 5 3 1 1 7 3 4 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 3 5 3 2 1 5 5 5 6 3 3 3 3 6 7 7 3 5 3 1 7 7 7 3 1 7 6 6 7 1 3 3 4 5 5 5 6 7 7 7 4 3 2 1 3 2 3 4 5 5 7 1 5 7 7 1 5 6 5 7 1 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 6 7 7 7 7 3 4 4 3 5 2 1 1 5 6 8 3 3 3 2 1 5 5 6 2 1 8 7 7 5 6 5 3 3 5 7 6 7 7 7 3 3 2 1 1 3 3 2 3 5 5 7 3 6 6 6 5 6 7 5 1 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 6 7 5 1 1 8 7 3 3 4 3 5 7 3 5 5 5 2 1 3 1 7 7 7 5 6 3 3 3 8 7 5 3 5 3 6 7 7 7 7 7 3 3 1 5 5 6 1 2 3 3 3 3 6 7 7 7 4 5 5 7 6 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 6 5 3 5 4 5 8 5 4 3 4 5 7 3 6 5 6 7 3 1 2 1 3 5 7 7 7 7 1 1 7 3 5 5 5 7 8 8 4 5 6 5 1 5 7 5 7 3 2 2 1 1 5 6 8 7 7 5 7 6 7 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 5 7 3 4 3 5 5 4 5 3 3 5 5 5 6 4 5 7 6 7 5 6 5 6 7 7 6 7 7 7 3 5 3 3 6 7 7 7 6 5 6 6 3 5 7 6 3 3 2 6 3 5 6 7 7 7 3 5 7 7 7 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 3 5 7 3 3 3 3 3 2 1 5 3 4 5 3 3 4 7 6 7 7 7 7 7 6 7 7 8 4 3 5 3 6 7 7 5 5 7 5 7 6 7 3 3 6 7 3 3 4 4 5 6 7 1 7 5 5 6 7 1 5 6 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 3 5 7 5 5 1 1 7 5 3 3 2 3 5 3 2 6 4 5 1 5 7 8 7 7 5 6 7 5 2 3 6 7 7 7 7 7 8 6 7 7 1 2 5 6 5 6 3 3 3 5 7 7 1 7 5 6 7 7 4 5 7 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 5 6 3 4 4 5 5 3 2 3 3 5 2 1 7 3 5 6 5 6 3 5 7 7 7 7 3 3 6 7 7 7 7 5 3 6 7 7 5 6 5 6 7 3 3 2 1 5 6 8 8 7 3 5 5 5 3 3 5 7 6 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 5 5 7 7 3 3 3 3 3 2 2 3 2 1 8 7 3 3 5 5 7 3 5 7 3 8 7 7 7 7 7 6 6 5 6 6 7 5 7 6 3 5 1 3 2 3 1 5 6 7 7 5 6 7 6 7 5 6 3 5 7 6 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 5 7 8 7 5 3 2 3 2 1 2 2 1 5 6 8 3 2 3 3 5 6 6 1 6 7 3 1 7 7 7 7 4 4 5 7 3 3 4 5 3 3 3 2 5 6 5 5 6 5 5 5 6 7 7 7 7 5 5 7 7 7 7 5 5 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 5 3 5 8 5 7 3 3 3 2 5 4 2 1 1 7 4 3 2 1 2 7 5 7 1 7 7 7 7 7 1 3 8 1 5 6 7 7 3 2 1 2 1 5 7 6 3 4 5 7 5 6 7 7 3 8 3 3 1 7 7 1 8 7 3 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 4 5 3 3 3 4 4 7 5 6 3 3 1 6 7 4 4 5 2 1 1 8 5 7 1 1 8 8 6 6 6 5 5 5 6 7 7 4 5 7 5 6 2 3 3 2 1 1 5 5 7 7 8 3 6 5 5 6 1 1 3 1 7 7 3 3 6 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 3 2 1 7 5 3 3 3 4 5 5 3 1 7 5 3 3 2 6 3 1 4 5 3 5 5 6 6 7 5 4 5 6 7 7 7 5 5 6 4 3 3 3 2 5 5 4 5 6 7 7 7 7 7 7 7 7 4 3 3 2 1 7 4 5 5 1 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 8 7 4 5 6 1 5 3 3 3 2 1 3 5 3 5 1 7 2 7 5 5 7 3 3 4 4 7 4 4 5 1 6 4 5 3 4 5 3 2 1 8 3 4 4 5 6 7 7 1 6 8 1 1 8 5 5 2 1 3 5 6 3 5 7 8 5 6 5 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 1 6 8 3 5 6 4 3 3 3 2 2 3 2 3 5 2 7 5 1 5 3 5 3 2 7 7 3 3 3 3 3 3 3 3 3 3 3 2 1 7 5 3 4 5 6 7 7 1 7 5 5 7 7 4 4 5 3 6 7 7 7 7 7 7 8 7 7 7 3 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 8 7 7 5 5 7 5 4 2 7 3 1 2 1 5 2 7 5 6 4 3 2 2 2 1 8 8 0 4 5 3 3 1 7 1 3 1 7 3 8 7 3 2 5 6 1 4 2 1 6 7 7 7 5 5 6 7 7 7 7 1 8 6 2 5 1 3 3 8 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 1 7 7 5 4 4 3 3 3 1 5 5 1 5 4 3 1 7 6 7 5 4 2 7 5 0 0 0 0 0 2 1 3 8 8 7 7 7 3 2 3 5 5 5 6 7 7 3 1 8 7 6 5 7 7 7 7 3 1 7 3 3 8 7 7 6 7 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 4 5 3 5 2 1 2 1 5 5 4 5 3 3 1 7 7 5 7 3 1 8 7 0 0 0 0 0 3 1 7 7 1 8 8 7 2 1 3 4 5 6 1 5 3 2 3 2 7 7 7 8 1 8 7 7 7 5 1 1 1 5 6 7 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 5 3 4 2 1 7 3 3 3 2 3 5 2 1 1 7 1 7 7 7 1 1 8 0 0 0 0 0 0 1 6 8 7 1 3 5 6 5 3 3 5 6 5 3 3 3 2 7 8 7 1 3 3 1 7 7 7 5 4 3 5 7 1 8 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 1 7 7 2 3 3 1 3 5 6 5 1 8 1 7 7 7 1 8 0 0 0 0 0 0 0 0 0 0 3 3 3 3 4 5 2 3 5 7 6 2 1 3 1 7 7 7 3 2 2 1 7 5 6 7 3 4 5 7 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 7 0 6 2 2 6 5 4 3 2 2 3 1 8 7 8 7 0 0 0 0 0 0 0 0 0 0 0 0 1 3 1 3 5 6 3 4 8 7 1 7 7 3 1 3 8 7 1 5 1 5 5 5 6 2 5 7 8 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 7 0 0 1 4 5 6 3 2 1 8 3 1 1 7 7 7 0 0 0 0 0 0 0 0 0 0 3 4 5 5 4 5 5 7 3 1 5 7 7 1 8 1 1 2 7 6 5 4 3 4 5 7 7 7 7 3 1 8 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 7 0 0 3 3 5 7 5 8 3 8 7 5 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 3 5 3 3 3 3 4 5 6 6 6 1 8 6 5 6 5 5 7 3 3 2 3 4 7 7 1 8 7 1 5 6 4 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 8 0 0 3 3 5 5 3 1 7 1 7 4 5 7 5 6 7 0 0 0 0 0 0 0 0 0 0 3 3 3 2 1 2 3 5 5 5 7 7 4 5 3 5 5 6 6 6 3 1 8 3 5 6 6 7 5 3 4 4 5 5 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 3 1 0 0 3 3 4 3 2 1 7 1 4 5 6 7 6 7 7 0 0 0 0 0 0 0 0 0 0 5 1 3 4 5 3 3 4 5 7 4 7 1 6 3 5 7 7 7 7 6 1 8 5 5 7 7 5 4 5 3 3 4 5 7 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 1 0 0 0 3 3 2 1 7 7 3 3 5 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 3 1 3 5 3 2 1 1 5 7 3 6 7 4 5 6 7 5 5 5 6 1 4 3 4 5 7 5 6 3 4 3 5 5 7 3 5 1 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 3 0 0 0 3 2 1 8 8 4 4 5 6 1 8 1 8 7 5 0 0 0 0 0 0 0 0 0 0 1 2 3 5 1 7 3 5 7 5 7 4 5 7 1 5 4 5 6 7 7 3 3 5 5 6 6 7 3 3 2 3 5 6 5 7 5 7 5 5 0 0 0 0 0 3 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3 1 8 1 7 3 3 6 7 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 5 1 5 3 5 7 5 5 3 5 6 5 7 7 5 6 8 5 3 5 5 5 7 7 8 2 1 3 3 3 4 5 7 5 6 3 5 0 0 0 0 7 4 5 6 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 1 7 1 5 6 5 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 3 5 5 3 3 5 7 5 7 6 4 5 6 3 5 5 7 5 3 4 5 5 7 7 5 7 5 5 2 5 7 4 5 6 3 4 5 6 7 5 5 6 5 3 5 7 5 3 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 3 6 7 5 7 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 2 1 1 5 6 7 5 7 5 7 6 5 3 4 5 5 6 3 3 5 7 5 6 5 5 3 3 5 3 3 6 7 3 5 4 5 5 7 5 7 3 3 5 6 7 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 8 7 0 0 0 0 0 0 0 0 0 0 0 0 2 6 2 1 7 1 7 5 4 5 6 7 3 5 7 3 3 3 5 7 7 7 2 4 5 7 7 5 5 6 6 3 3 4 5 6 5 5 3 3 5 7 7 3 5 2 1 5 7 1 8 5 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 8 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 3 5 5 4 5 5 6 7 3 3 4 5 7 4 7 6 5 5 6 7 3 5 6 5 7 7 7 7 2 3 3 5 3 4 5 4 4 5 7 4 5 4 5 2 5 6 6 1 8 4 4 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 6 3 5 6 7 3 3 5 1 7 3 1 3 4 5 3 6 5 3 5 7 7 5 6 7 7 1 4 5 5 6 4 3 4 5 3 5 4 4 5 5 8 3 4 5 3 5 7 7 5 6 5 3 3 4 5 7 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 7 3 5 7 8 5 4 5 7 3 4 3 2 3 4 3 5 5 5 5 6 5 6 7 5 5 5 4 5 5 7 5 1 4 3 3 5 3 4 5 8 7 3 6 3 3 5 8 7 5 6 2 3 2 3 5 5 7 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 6 5 1 5 6 5 6 7 4 1 2 1 3 1 2 3 3 5 5 5 6 7 3 5 7 3 6 7 5 6 5 5 6 1 3 5 3 5 7 5 4 5 7 4 5 4 5 4 5 7 7 5 7 2 5 7 7 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 3 5 7 5 5 5 3 5 7 8 5 5 1 1 3 5 2 1 4 4 5 7 7 7 7 7 7 7 7 7 5 7 7 7 3 5 4 3 5 5 7 4 5 4 5 3 5 5 4 5 5 7 5 7 7 5 4 5 5 7 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 2 3 3 3 5 5 5 7 7 7 3 4 5 5 6 5 6 7 3 4 4 5 1 1 7 3 3 4 5 6 4 5 7 5 3 4 7 5 5 6 6 4 5 5 3 5 5 5 7 1 5 7 7 7 1 3 3 3 5 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 2 1 1 3 5 6 5 1 8 1 4 3 4 5 4 7 3 1 4 5 5 7 1 1 5 2 1 3 4 5 4 3 3 3 3 3 3 4 5 7 5 4 4 5 5 5 6 7 6 6 8 6 7 7 4 5 5 4 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 2 1 5 6 7 4 5 7 5 3 1 8 5 1 5 2 1 3 3 5 6 6 7 7 3 3 3 3 2 3 2 1 7 3 5 5 1 3 3 4 5 3 5 6 5 6 8 7 7 1 7 5 3 5 6 7 5 6 7 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 3 6 7 3 3 5 3 3 2 1 1 5 6 5 3 3 4 3 4 5 1 7 5 5 1 1 3 2 3 3 8 1 2 3 5 5 2 1 1 2 1 4 5 8 4 5 1 3 8 7 5 6 6 7 7 7 7 5 6 7 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 6 5 7 4 5 5 7 3 2 5 3 3 5 5 3 1 1 3 3 5 6 5 4 3 4 5 6 3 2 2 7 1 1 3 5 6 4 4 5 1 7 3 4 5 3 6 6 6 6 1 8 7 7 7 7 3 5 5 6 5 6 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 4 5 6 3 4 3 5 5 5 5 3 2 3 4 4 5 3 3 2 2 3 3 3 3 2 1 3 3 2 1 1 5 3 5 5 5 7 7 3 5 7 8 5 3 5 5 7 7 5 6 5 5 7 1 8 7 7 4 5 5 5 7 7 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 5 7 3 4 3 6 5 6 3 2 7 2 1 4 4 3 4 3 2 1 7 1 1 1 7 1 2 1 8 7 4 5 4 4 4 5 7 3 5 7 1 7 3 4 5 7 5 7 5 6 7 5 7 7 8 1 7 5 7 7 1 5 7 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 3 1 5 7 5 3 5 3 3 3 2 1 1 1 5 3 3 4 3 2 1 6 4 3 3 4 5 5 2 1 1 7 7 4 3 3 3 5 6 6 3 4 5 8 2 3 4 5 8 5 5 7 8 8 7 7 5 6 1 8 6 5 5 6 6 6 3 6 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 6 1 5 7 3 4 5 2 7 1 7 1 5 6 3 1 6 5 3 3 3 5 6 3 2 3 3 3 2 1 1 8 4 3 3 1 7 3 4 4 5 7 5 6 8 7 3 5 7 3 4 5 4 5 3 8 0 7 3 1 6 7 6 5 7 5 6 7 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 7 3 4 5 5 3 3 1 8 1 7 1 4 3 3 1 3 4 5 5 4 5 7 3 2 2 7 3 1 7 5 5 3 3 1 1 2 1 3 3 5 4 4 7 4 5 7 4 7 7 5 5 4 5 1 1 0 0 4 1 5 6 7 7 6 5 6 5 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 5 6 2 3 3 3 1 1 7 6 3 8 1 7 2 3 1 7 3 3 2 3 4 2 1 8 1 7 3 3 8 7 7 4 3 1 7 1 8 3 1 3 3 5 5 6 4 7 1 4 5 6 4 5 5 7 5 3 5 6 1 8 7 7 6 7 5 5 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 5 6 7 4 5 3 1 1 8 8 7 1 1 1 3 3 2 1 8 3 2 7 2 1 1 1 3 1 7 3 3 1 8 5 3 2 7 2 1 1 1 5 2 1 3 3 5 3 4 5 5 4 5 3 5 5 7 0 7 0 7 7 3 1 8 7 5 6 6 6 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 5 6 3 3 3 2 1 1 8 7 7 1 8 1 2 1 1 5 5 5 1 7 1 3 1 3 3 1 7 3 2 1 7 3 3 1 8 6 6 1 3 2 1 1 4 5 3 3 4 5 4 5 4 5 4 5 7 1 8 7 5 8 5 6 5 8 7 7 5 6 7 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 4 5 3 2 1 7 8 7 2 1 4 5 1 5 7 3 4 5 5 2 1 7 1 2 3 3 2 1 8 7 3 1 7 3 1 3 1 7 7 4 5 3 4 5 4 3 1 1 3 3 3 5 3 4 5 5 8 8 0 0 3 5 8 4 5 7 8 7 6 7 6 7 5 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 3 3 1 7 1 8 3 4 4 1 4 7 5 4 5 3 5 3 3 1 1 1 7 2 3 2 1 7 5 5 3 1 7 2 5 3 1 8 7 3 4 3 3 4 3 2 1 3 3 1 7 3 2 1 3 4 1 7 4 5 3 0 5 6 4 5 6 8 5 8 3 8 7 5 3 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 7 3 2 1 8 1 7 4 4 3 1 5 6 5 7 6 3 3 2 2 1 1 7 3 5 1 5 8 5 3 3 2 1 3 1 2 1 1 7 3 2 3 2 1 1 2 1 3 2 7 1 8 2 1 2 1 1 4 5 5 5 7 7 4 5 6 4 5 6 4 5 5 6 3 6 7 7 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 1 1 7 6 7 6 1 3 3 1 7 7 5 5 7 3 3 1 1 7 8 1 3 3 3 3 3 3 3 1 3 1 1 3 1 6 1 8 1 7 4 4 5 6 1 7 5 1 8 5 6 5 3 1 1 1 3 4 7 7 7 7 4 3 5 6 7 7 7 7 7 7 7 5 6 8 7 1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 7 7 7 4 5 3 1 5 7 5 4 5 6 5 5 1 8 4 3 3 2 1 1 1 1 7 5 3 1 7 3 1 7 1 8 1 8 3 3 3 4 5 3 5 3 8 7 7 2 1 1 1 3 4 5 5 1 7 3 4 3 4 7 7 5 3 4 5 5 1 8 7 4 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 1 3 1 7 8 1 3 3 2 1 7 7 7 7 4 4 5 3 1 1 7 3 2 1 3 1 1 1 8 3 2 1 7 3 1 1 3 3 2 1 1 3 3 3 3 3 2 3 1 7 2 1 1 3 4 5 3 3 5 7 8 7 5 3 6 7 7 7 7 7 7 7 3 1 1 7 4 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 8 7 8 0 3 4 5 3 8 1 7 1 3 3 3 5 5 1 5 3 3 8 7 1 1 5 5 5 1 1 5 2 7 7 5 2 3 2 1 2 1 1 2 1 7 4 5 1 6 5 5 6 1 2 1 5 5 8 7 5 3 5 6 5 6 8 2 1 7 8 7 1 7 1 3 4 5 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 1 8 1 7 3 2 5 3 3 3 5 5 7 3 1 3 3 2 3 4 5 5 6 7 7 7 8 7 3 2 1 2 1 7 5 2 7 8 4 4 7 7 6 4 5 5 3 4 5 5 3 5 6 5 6 7 7 1 8 7 1 7 7 5 6 1 8 7 7 5 7 7 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 3 1 8 6 4 5 3 5 3 3 4 5 2 1 1 3 3 3 3 3 5 7 1 1 7 7 5 5 1 5 3 1 8 7 7 3 1 3 3 3 4 5 3 3 5 5 1 5 5 7 5 7 5 7 5 5 7 2 4 7 5 7 6 7 7 6 1 8 7 7 8 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 2 4 4 5 3 5 5 5 5 3 5 7 1 7 7 5 3 3 3 3 5 7 5 5 5 5 6 5 6 7 1 2 1 1 8 7 3 3 1 8 7 4 5 6 4 5 5 3 6 5 6 7 7 7 7 7 5 6 7 7 7 4 5 5 8 7 7 5 4 5 6 7 8 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 1 1 3 3 3 3 4 4 5 3 5 7 4 1 7 4 5 2 1 3 5 5 4 5 5 5 7 4 5 8 8 1 1 1 8 5 5 1 3 1 3 3 5 3 5 6 5 5 5 7 7 7 1 1 1 8 7 7 1 5 1 8 7 7 7 6 7 5 6 6 7 5 7 8 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 6 4 5 1 5 1 5 4 4 5 3 6 5 3 5 6 5 5 6 3 2 3 3 3 4 7 5 6 5 7 5 7 7 3 3 8 3 3 3 2 7 3 1 3 3 3 3 4 5 5 6 1 7 1 7 2 7 5 5 5 5 6 5 5 8 7 7 3 5 7 5 7 7 7 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 7 7 5 7 5 3 4 3 3 5 5 7 7 3 5 5 6 5 5 3 3 1 1 2 1 3 4 5 5 6 6 6 7 3 3 2 7 1 2 4 5 3 1 1 1 1 1 3 5 7 7 6 1 7 5 3 4 4 5 5 6 7 5 6 6 8 7 7 4 5 6 7 1 5 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 4 3 3 3 3 2 3 3 2 4 4 5 5 3 5 5 6 5 7 7 5 3 1 7 6 3 3 5 6 6 6 7 5 5 7 1 8 5 3 3 3 4 5 5 5 4 4 5 5 7 7 7 7 5 7 5 1 3 5 6 7 7 5 7 6 7 5 7 3 3 5 7 5 5 7 6 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 3 2 1 5 4 3 3 2 1 3 3 3 3 3 3 4 5 5 5 7 6 6 5 5 5 1 3 4 5 6 6 7 7 5 6 6 4 5 5 4 2 1 3 3 5 3 3 4 5 7 7 1 8 7 7 3 3 5 7 6 1 5 5 7 5 6 5 6 5 3 4 5 3 6 7 7 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 1 6 5 5 3 3 3 1 8 4 3 1 1 3 1 3 3 5 6 8 7 7 4 5 4 5 4 3 5 7 7 7 7 5 5 7 5 6 7 6 1 1 1 3 3 3 4 5 5 6 5 7 1 8 4 5 3 5 7 7 7 5 6 8 7 7 4 5 5 6 1 3 5 7 7 8 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 3 3 3 3 4 5 6 2 1 3 3 2 1 5 2 1 2 1 4 5 6 5 6 5 6 3 4 4 3 5 7 3 1 5 4 5 7 5 7 8 7 1 1 1 4 5 5 1 4 5 7 7 7 5 4 5 4 5 5 7 7 4 5 6 7 5 5 1 5 7 7 3 5 7 7 7 7 5 6 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 4 3 3 1 3 3 5 6 5 3 5 5 2 5 5 1 5 3 4 3 5 6 6 7 5 7 3 3 3 3 6 5 6 6 5 3 3 5 6 5 5 7 1 5 4 3 3 3 3 4 5 5 6 7 7 1 3 3 5 6 6 3 5 5 7 5 6 6 5 5 6 5 6 6 7 5 5 1 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 3 5 1 3 3 3 3 4 3 4 5 4 5 3 3 1 4 5 3 3 4 7 5 5 6 4 5 1 2 3 5 5 5 5 7 2 1 3 5 5 7 5 7 4 3 4 5 1 1 3 4 5 7 1 8 3 4 5 5 7 7 5 6 6 7 5 7 7 5 6 7 7 5 6 7 4 5 1 8 5 7 8 7 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 3 3 4 5 5 4 3 3 3 3 3 3 3 1 2 1 3 4 5 4 3 5 6 7 7 5 5 5 5 4 5 6 5 6 7 7 2 4 4 7 6 7 7 3 3 3 4 5 6 1 1 4 5 7 6 6 3 3 5 8 3 5 7 7 5 5 6 5 5 6 7 5 4 5 6 3 5 5 6 5 6 1 7 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 2 1 3 5 3 3 5 5 3 2 1 3 2 1 7 1 4 5 4 5 5 4 5 5 5 5 5 5 4 5 5 5 5 7 5 4 5 3 4 5 7 7 8 6 3 3 3 4 5 5 5 3 4 5 5 5 7 4 5 7 5 7 1 8 3 5 7 3 5 1 4 5 4 7 6 5 6 7 5 6 1 1 8 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 6 5 5 5 3 4 3 3 2 3 1 3 2 1 8 5 3 1 3 1 3 3 3 4 7 3 5 5 3 3 3 3 3 4 7 6 6 7 5 5 6 6 7 7 7 2 5 5 3 3 3 3 3 3 4 5 7 7 3 3 5 6 7 5 5 5 6 5 6 6 5 5 7 5 7 7 7 7 1 7 7 6 5 1 1 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 3 5 6 5 3 3 1 1 7 3 2 1 1 8 4 5 3 5 3 1 2 3 1 4 7 5 3 5 5 5 1 5 3 5 5 7 5 3 5 7 7 8 1 7 5 3 5 6 2 1 2 1 2 3 5 5 6 3 1 5 7 5 7 6 5 7 7 7 7 7 7 8 8 1 7 8 7 1 3 1 7 5 6 1 8 7 7 7 3 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 3 6 7 7 1 7 7 5 5 5 5 6 5 4 5 5 3 2 7 1 2 1 3 3 3 3 3 3 3 3 3 3 3 4 5 5 5 5 6 7 5 5 4 5 2 3 5 1 5 1 2 1 3 4 5 7 7 4 4 5 7 8 1 7 7 7 3 1 7 7 6 1 1 1 7 7 1 2 7 8 7 1 8 7 1 8 7 5 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 5 7 5 3 1 8 5 5 3 5 5 7 3 4 4 2 1 7 8 7 1 3 2 1 3 1 8 3 3 1 2 1 1 3 4 7 3 5 7 7 6 7 4 4 5 5 5 5 7 7 4 5 3 4 5 5 6 5 3 4 5 6 7 1 1 7 1 1 3 8 7 7 6 6 8 7 6 7 5 1 1 8 7 8 1 8 5 6 7 8 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 3 5 7 5 6 1 3 5 6 3 4 5 3 5 3 3 1 1 8 7 8 3 2 1 1 2 3 1 3 1 1 1 3 1 8 1 4 5 4 5 5 7 6 4 5 7 3 5 6 5 5 3 4 2 3 3 4 4 5 7 7 7 7 7 5 1 1 1 8 8 1 8 8 7 6 7 1 1 8 3 1 7 7 5 6 6 1 5 7 6 5 6 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 4 3 5 5 5 6 7 1 5 3 3 1 4 4 2 1 1 1 1 8 7 7 1 1 8 4 5 1 8 1 8 1 3 2 3 3 4 4 5 1 5 5 7 7 4 5 7 3 5 6 6 7 7 3 2 1 2 3 3 3 3 4 5 6 5 7 6 5 1 7 7 3 1 7 4 5 8 1 7 7 1 3 8 7 6 5 7 6 6 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 3 4 7 7 5 6 3 5 5 4 5 4 3 1 7 2 1 2 1 7 8 5 4 5 3 5 6 1 5 6 1 4 2 1 1 5 4 3 5 5 7 8 7 5 5 5 5 7 7 7 8 3 3 1 1 3 3 2 5 4 5 7 7 7 7 7 3 1 7 4 5 1 3 3 5 6 7 7 6 3 1 1 8 3 4 5 7 1 7 7 1 1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 3 3 5 5 4 5 3 4 5 6 7 3 3 2 7 3 1 8 1 1 6 5 5 3 5 3 3 5 5 5 6 5 3 4 5 3 2 1 2 4 7 5 7 5 5 6 3 5 7 5 6 5 7 5 6 5 3 1 3 4 5 5 6 7 7 7 8 7 7 7 7 6 7 7 5 4 5 5 8 1 1 1 5 5 5 3 6 7 1 1 8 3 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 4 4 3 3 4 3 5 7 3 5 5 4 3 3 1 5 5 4 5 6 5 7 3 5 3 6 7 3 3 4 5 5 4 5 6 2 4 4 4 5 4 4 5 6 6 3 5 5 6 5 7 7 5 5 5 5 7 6 5 3 3 3 4 5 5 5 8 4 5 8 7 8 1 8 7 7 7 5 7 7 5 6 3 4 5 6 7 7 1 1 7 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 3 4 5 3 3 4 5 4 3 3 4 3 3 2 1 8 7 3 3 5 6 6 7 4 5 6 5 1 3 3 4 4 5 4 5 4 5 3 3 3 3 3 5 7 3 4 4 5 7 7 5 4 4 7 5 4 5 5 6 6 1 3 3 4 4 5 7 6 4 5 7 5 5 5 6 5 6 7 7 5 5 6 5 3 5 6 5 5 7 1 1 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 1 3 2 2 3 4 3 4 5 1 2 2 7 1 7 5 3 1 4 5 7 5 4 5 6 5 5 5 6 1 5 5 3 3 4 5 7 5 1 3 4 4 5 5 5 3 5 7 3 5 5 3 5 5 5 6 6 7 7 3 3 2 3 1 3 5 6 3 4 5 4 5 7 7 7 7 8 1 7 7 7 6 3 3 4 7 6 7 1 1 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 2 1 3 2 1 2 1 3 2 7 7 1 5 6 4 7 2 3 4 5 5 3 4 5 5 3 4 5 4 3 3 4 5 1 5 5 5 5 5 3 1 4 7 3 4 4 5 3 3 3 4 5 7 5 5 6 6 5 6 1 7 1 5 1 5 7 7 3 5 6 7 1 1 7 1 1 8 1 1 8 7 7 1 5 7 7 8 6 8 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 4 5 5 1 3 2 7 3 3 1 7 8 3 3 5 6 5 5 4 3 5 5 3 5 4 4 5 4 4 3 3 3 3 3 3 3 4 3 5 6 6 5 3 5 4 5 3 4 5 1 4 5 3 5 6 5 5 6 3 5 3 6 3 4 5 5 5 5 5 7 7 1 8 1 8 1 8 1 1 7 3 8 7 7 5 7 7 7 7 6 7 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 3 3 4 7 2 1 1 8 1 1 7 5 3 3 4 5 5 4 4 5 4 4 4 4 3 5 5 3 3 3 2 1 2 1 5 2 1 3 3 3 5 7 6 4 5 4 4 3 4 5 3 3 3 3 5 5 7 7 3 4 5 7 6 3 3 5 7 3 5 7 7 8 1 1 7 2 7 1 1 7 2 1 4 5 5 7 3 8 8 7 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 3 3 2 7 8 7 1 3 1 7 5 4 3 3 3 4 3 3 3 3 1 3 5 4 5 3 4 4 4 3 5 3 3 4 5 3 4 4 5 5 5 7 5 4 5 3 5 5 3 5 1 3 1 3 4 5 6 7 3 5 5 5 5 7 5 6 7 5 7 5 5 6 7 8 7 8 8 1 8 3 5 3 5 7 1 7 1 7 5 3 3 3 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 1 1 1 1 3 5 7 5 4 4 5 3 2 2 3 2 3 4 3 4 3 2 3 4 5 6 3 3 2 2 2 1 1 2 2 1 3 3 4 7 7 4 3 3 5 4 5 5 5 5 5 6 5 5 5 7 6 3 4 5 4 5 6 7 7 8 5 6 7 7 7 7 1 2 7 2 1 4 4 3 2 4 5 7 1 5 8 7 6 5 3 3 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 4 5 5 6 4 4 3 3 4 5 5 6 3 3 2 3 2 3 2 3 2 1 8 3 3 3 3 4 3 5 5 3 3 2 1 3 3 2 3 3 4 3 3 3 4 3 4 5 4 3 5 7 3 3 4 7 4 5 5 3 5 3 4 4 7 5 5 6 7 7 7 1 8 8 1 7 3 1 3 4 3 5 7 7 6 6 6 8 7 5 5 3 5 5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 5 3 3 4 5 5 4 7 4 3 4 5 3 4 3 2 2 2 7 1 3 1 2 1 1 3 1 1 7 2 3 3 2 1 3 1 1 3 2 1 1 3 4 5 5 3 2 3 4 5 4 7 5 6 3 3 3 3 5 3 3 3 1 1 3 5 5 5 7 7 1 7 7 6 1 1 8 5 6 8 3 3 4 7 7 7 7 7 5 4 4 5 2 5 6 1 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 4 3 5 3 4 3 4 5 3 5 3 3 3 2 2 1 1 1 3 2 1 1 4 3 3 1 3 2 2 7 8 1 7 1 8 3 3 1 7 1 2 1 3 5 5 6 7 5 4 3 3 3 2 1 4 3 1 3 2 7 1 7 4 3 4 3 5 7 1 8 5 6 7 7 1 4 3 4 5 6 5 3 5 7 7 7 5 5 6 6 5 6 6 1 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 1 3 2 3 3 3 4 5 3 2 3 2 2 3 2 1 3 1 8 6 1 1 7 3 1 2 1 3 3 1 7 1 1 7 1 4 5 3 1 7 1 5 4 4 3 3 3 3 3 3 2 7 7 6 3 3 1 1 3 1 3 1 8 3 3 3 4 5 7 5 8 7 6 7 7 3 4 4 4 4 5 3 2 4 5 6 5 4 5 4 5 5 6 7 8 8 8 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 2 1 1 1 4 3 3 2 1 3 4 3 1 1 1 1 3 1 8 7 7 1 3 3 2 1 7 5 3 1 7 2 1 8 7 3 3 2 1 7 5 3 3 1 2 3 1 7 3 2 1 8 8 2 1 1 8 3 1 1 2 1 7 1 1 1 3 4 5 6 6 7 1 6 6 5 3 3 4 3 2 1 8 3 5 6 7 5 4 5 5 7 7 7 1 8 8 5 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 4 5 5 1 2 1 3 1 3 3 2 1 1 1 7 1 2 1 8 7 1 5 3 3 1 8 3 4 1 7 7 1 7 4 3 3 3 1 8 3 2 2 7 1 3 1 3 5 1 8 1 8 3 1 1 7 7 1 7 1 1 5 7 3 1 2 3 5 5 7 7 7 6 5 4 5 6 5 7 1 7 1 8 5 7 5 5 6 3 5 1 7 7 1 4 5 2 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 5 5 3 3 3 3 2 2 1 7 1 7 8 3 3 1 3 8 6 3 3 2 1 3 3 1 1 6 8 1 7 4 2 3 3 2 3 2 1 1 2 1 2 3 2 2 1 3 1 3 2 7 1 8 7 1 3 1 1 8 8 5 3 5 7 3 6 5 7 7 7 5 5 5 5 5 7 1 7 7 1 5 7 7 5 7 6 7 1 8 7 5 4 5 3 5 7 7 4 5 6 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 5 5 3 5 3 3 2 1 1 3 8 1 7 3 1 7 1 3 3 2 1 1 7 3 2 3 1 3 2 3 1 7 7 7 3 3 2 3 2 3 2 1 8 1 2 1 3 2 7 1 8 2 1 2 1 3 5 1 7 7 2 1 7 7 7 4 5 5 7 5 6 6 7 1 8 5 5 4 5 5 3 1 7 7 5 6 7 1 5 5 7 8 5 6 8 5 3 4 4 5 1 8 3 5 5 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 2 1 3 1 7 4 5 4 1 7 1 8 8 6 2 3 2 5 1 6 2 2 1 4 5 3 2 1 8 8 5 3 2 1 1 1 3 8 1 7 1 1 3 2 1 7 1 7 6 7 1 3 4 2 7 8 7 3 1 7 7 3 4 4 5 5 4 5 5 7 7 5 7 4 5 5 6 7 1 1 5 6 5 5 6 6 7 7 7 5 7 5 5 5 6 3 6 7 5 6 3 6 3 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 1 1 8 3 1 3 5 5 4 3 1 2 1 8 7 7 1 3 3 2 1 7 1 1 5 5 3 2 1 8 1 7 3 2 2 2 2 1 2 1 1 8 8 1 2 1 1 7 1 8 7 6 3 3 3 1 8 7 7 3 1 8 7 3 4 3 5 2 1 5 7 4 5 5 6 5 5 4 5 5 6 5 5 7 8 7 7 7 1 7 4 5 7 4 5 7 7 4 5 6 6 4 5 7 5 0 5 3 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 8 7 2 3 4 4 3 3 3 3 3 1 1 3 1 1 7 7 2 2 1 1 8 3 4 3 3 2 7 5 7 1 1 2 2 1 1 1 8 3 1 1 1 7 4 2 7 7 2 1 1 7 5 5 2 3 2 1 8 7 3 2 1 7 3 3 3 5 5 5 6 7 3 3 3 5 5 4 3 5 7 5 6 7 8 7 3 8 7 7 7 7 7 7 7 7 7 1 7 5 4 5 3 6 3 5 3 5 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 7 1 7 7 3 3 2 1 3 3 2 1 1 1 1 1 8 3 3 1 2 1 1 3 4 3 2 2 1 7 8 1 1 2 3 3 1 1 8 2 2 1 1 1 7 1 1 7 1 1 1 7 3 3 3 3 1 1 1 7 1 2 1 7 3 3 3 3 5 5 7 1 3 2 1 3 5 5 6 7 5 6 6 7 1 8 8 1 1 1 1 7 2 1 7 7 5 4 3 3 4 5 5 7 7 4 5 5 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 7 1 3 5 3 2 7 3 1 3 1 5 7 6 2 1 2 1 3 1 1 3 1 3 3 2 2 1 8 1 7 1 1 3 2 2 7 1 8 3 1 8 1 8 8 2 1 8 6 2 1 8 2 1 1 1 1 3 1 1 7 1 8 8 3 2 1 3 3 5 1 7 2 1 3 3 5 5 6 5 7 7 3 8 7 1 5 5 5 6 6 1 1 1 8 5 7 3 1 5 3 5 7 5 6 3 5 5 5 7 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 8 5 4 3 2 6 3 1 8 3 1 7 7 7 7 2 1 1 2 7 1 1 8 2 2 3 2 1 1 8 8 1 3 2 1 1 7 2 3 1 1 1 2 1 3 1 3 8 3 2 7 1 1 7 7 1 1 3 1 8 7 1 8 7 5 3 3 2 3 5 5 2 1 5 5 1 3 5 5 7 8 3 2 1 7 5 6 7 7 1 7 7 5 7 1 5 5 5 6 4 5 5 6 6 5 6 5 6 6 7 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 8 3 3 3 2 7 7 2 1 3 3 1 1 7 7 7 5 5 3 1 8 1 2 1 1 3 2 2 1 7 1 7 1 1 1 8 1 8 1 3 1 1 2 1 8 2 1 2 1 3 1 8 7 1 1 8 3 3 2 7 7 7 3 1 5 5 7 4 1 3 5 7 3 1 5 4 5 4 5 7 1 1 7 1 8 8 7 1 7 1 7 1 5 5 6 7 7 3 5 5 1 5 5 7 6 6 5 5 7 1 8 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 5 0 1 7 1 8 0 8 3 1 3 2 1 8 8 3 3 3 2 1 1 7 1 3 2 1 2 1 8 7 1 8 5 6 6 1 1 1 2 1 1 1 7 1 1 3 1 2 7 5 1 5 5 1 1 1 1 1 8 8 1 2 1 5 6 7 3 3 5 5 7 7 4 4 3 5 4 5 8 1 1 8 7 7 1 8 8 8 5 7 5 5 5 6 1 5 5 6 7 4 5 5 5 5 7 5 7 6 1 1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 8 0 0 0 0 2 7 5 1 8 3 2 1 7 1 1 2 7 8 1 1 7 7 1 1 5 7 4 5 3 5 6 5 5 6 1 5 1 5 5 5 6 6 4 5 5 5 6 5 6 4 5 6 3 1 1 5 5 5 4 5 6 5 6 7 3 5 7 6 3 4 5 4 5 6 7 6 6 7 1 7 1 1 1 5 3 5 6 5 7 5 4 5 6 7 8 7 4 5 7 7 7 7 7 7 7 1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 2 1 3 2 1 8 7 7 7 1 8 1 1 8 7 5 5 5 5 5 5 7 5 5 3 5 5 5 5 6 5 6 6 7 7 5 5 5 4 5 3 5 3 4 5 5 2 7 5 5 5 3 4 5 6 5 5 7 3 5 7 7 3 3 3 3 3 5 7 5 6 1 6 1 4 5 6 4 1 4 5 5 6 5 3 5 3 8 5 6 4 5 6 1 1 1 5 1 8 1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 7 8 3 1 1 1 3 3 4 3 1 1 8 5 3 4 4 4 5 5 5 5 5 7 3 5 4 5 5 6 7 7 7 7 3 3 4 5 7 4 5 6 7 5 5 7 7 1 5 3 5 4 3 4 5 5 5 4 7 5 5 3 5 1 2 1 3 4 5 6 7 5 6 6 5 6 5 3 3 3 5 5 6 6 5 5 1 8 5 7 7 7 5 3 2 1 7 7 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 1 5 1 7 1 2 1 5 5 2 1 8 5 5 3 5 4 3 5 5 5 5 6 5 6 4 5 6 7 7 7 1 8 8 1 2 1 4 5 3 5 7 7 4 4 7 3 5 7 3 4 5 5 3 3 4 4 3 5 5 7 8 4 5 5 4 4 5 6 7 7 5 7 7 4 5 5 5 5 6 5 5 7 7 5 7 5 3 5 6 1 8 8 7 8 1 6 7 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 3 3 3 3 5 5 5 6 3 3 3 3 4 5 5 5 6 7 3 6 6 1 2 1 7 1 7 5 5 3 3 3 5 5 5 6 3 3 5 6 7 7 1 3 3 3 2 7 3 3 3 4 5 6 5 3 3 4 3 4 5 6 5 7 6 6 7 6 5 7 5 5 6 7 7 7 7 5 6 5 5 6 5 7 1 7 7 6 1 7 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 3 4 4 3 3 5 5 6 5 2 1 1 5 5 6 5 7 5 6 7 7 7 1 3 8 7 7 3 5 6 2 1 3 5 7 7 5 5 5 7 7 7 7 4 2 2 1 8 5 5 3 3 4 5 6 5 4 5 3 5 6 7 7 8 7 7 6 7 5 6 7 7 7 8 7 1 8 4 5 6 7 7 5 5 7 7 8 7 1 5 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 7 4 3 3 2 4 3 5 6 7 5 3 6 4 5 6 6 7 7 7 7 8 5 5 5 6 5 3 4 5 5 4 3 4 7 5 4 5 6 6 1 8 7 5 5 7 5 5 3 5 7 3 3 3 5 7 6 3 5 5 7 6 1 3 1 8 7 6 7 7 1 7 1 8 1 8 7 3 5 7 1 8 7 7 7 6 3 2 1 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 4 5 4 5 5 5 4 5 5 5 5 4 5 6 7 7 5 8 7 8 6 5 7 5 6 7 1 4 3 4 3 3 3 4 5 6 5 7 6 5 1 7 5 5 3 3 3 5 4 5 5 7 3 5 6 7 4 3 5 8 7 1 2 4 5 5 7 7 5 6 3 2 1 1 7 6 3 5 7 7 5 1 1 8 7 7 1 5 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 5 5 3 4 7 3 3 4 5 5 4 4 5 5 7 5 6 5 5 7 5 7 7 7 7 7 7 6 7 3 3 3 3 3 3 2 3 3 3 3 4 5 6 7 4 5 7 6 3 2 3 3 3 5 4 4 5 7 4 5 5 7 6 5 5 5 3 5 7 7 8 7 6 1 2 2 1 1 7 7 6 5 7 7 5 6 5 7 6 5 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 5 7 4 4 4 5 5 3 5 5 6 4 3 5 5 5 5 7 7 5 7 7 8 1 1 8 7 1 7 4 3 3 1 1 2 2 1 5 6 3 1 4 5 5 6 5 6 7 3 1 3 2 1 2 3 3 5 6 7 5 5 7 7 7 4 3 5 7 1 7 8 7 7 2 1 8 3 1 1 8 7 7 5 5 6 5 6 6 7 4 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 5 6 4 4 3 4 5 5 5 5 4 5 4 5 5 7 7 5 7 5 6 1 5 7 5 7 4 5 5 1 2 1 7 2 7 1 7 1 2 1 3 5 7 5 7 7 1 2 1 1 5 5 3 3 3 4 5 7 5 7 8 3 5 5 6 7 5 6 7 7 7 5 7 5 3 3 1 1 5 8 7 5 5 5 6 6 7 7 3 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 3 2 3 4 5 3 4 5 3 4 5 6 5 5 6 5 5 5 1 5 6 6 6 7 6 5 5 7 8 3 4 4 5 6 1 3 5 1 1 1 8 5 4 5 4 5 6 7 8 5 7 5 4 4 4 4 4 5 5 5 5 6 7 5 5 6 7 7 7 7 7 7 6 5 5 5 5 5 4 5 5 6 4 5 5 6 5 7 7 5 5 4 3 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 2 2 3 3 3 3 4 3 3 3 4 5 6 7 5 7 5 5 6 5 5 5 5 6 5 7 7 7 5 3 4 5 6 6 7 3 5 7 5 5 7 5 3 3 5 7 1 7 7 7 4 5 5 3 3 3 5 5 7 6 6 7 5 7 7 5 5 1 8 1 8 5 5 7 6 6 6 6 5 6 5 5 7 7 7 7 5 7 6 7 5 6 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 1 3 3 4 3 3 2 3 3 3 5 5 6 4 5 5 6 6 6 6 7 7 5 5 6 1 7 5 3 4 5 7 8 3 3 5 5 6 7 3 3 1 4 5 7 7 8 5 3 5 3 4 1 5 5 6 7 7 7 1 8 7 5 5 7 7 7 5 6 5 6 5 5 5 5 6 5 3 5 6 5 6 5 5 7 5 6 7 6 3 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 3 2 1 3 3 1 3 1 3 3 3 5 6 5 5 5 4 5 4 5 6 7 4 5 6 5 5 3 3 4 5 5 5 6 5 4 5 7 6 5 3 1 3 5 7 7 7 5 6 3 5 3 3 3 5 6 8 1 8 2 3 8 7 7 7 8 6 7 7 5 7 7 7 5 7 5 4 5 5 7 7 7 6 5 7 5 6 7 7 5 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 2 1 3 3 2 2 7 2 2 1 1 5 4 7 3 5 5 3 4 5 7 7 5 4 5 5 6 5 6 5 5 5 5 7 3 5 5 5 7 7 3 3 3 3 5 6 7 7 5 7 5 3 4 3 5 5 7 7 7 6 1 3 2 1 8 6 1 1 3 1 8 7 8 8 7 7 5 3 5 6 7 6 6 7 6 6 7 7 6 7 7 7 7 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 5 4 5 3 2 2 2 1 3 5 3 4 3 3 5 3 3 5 6 4 5 6 7 3 5 6 6 7 5 7 5 6 7 7 5 3 3 6 7 7 5 1 1 3 5 6 7 5 3 5 4 5 3 4 3 5 5 5 6 7 7 2 7 1 8 7 1 8 1 1 1 8 3 1 7 7 6 7 5 5 6 7 6 6 7 7 4 5 1 1 7 1 3 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 3 3 3 3 4 3 2 1 3 2 1 3 5 2 4 4 5 3 5 5 6 5 3 5 5 6 7 5 5 7 5 7 7 5 6 5 4 5 7 6 5 7 3 5 5 5 7 7 5 5 6 3 3 3 3 4 5 6 5 5 5 7 7 6 1 2 1 1 1 2 1 8 3 3 8 8 1 1 8 7 7 7 7 7 7 7 5 7 7 7 5 1 2 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 5 1 1 3 3 2 1 3 3 3 3 3 2 3 3 3 3 2 3 4 5 7 7 7 7 7 5 5 5 6 5 7 7 5 6 5 5 5 5 5 5 3 5 3 5 7 5 8 4 5 7 5 1 2 1 3 4 5 6 5 6 6 5 5 7 7 6 7 1 2 1 1 2 1 1 1 8 6 1 7 7 7 7 1 1 7 7 7 1 1 7 7 7 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 5 5 5 2 1 2 1 3 5 3 2 1 2 1 3 2 1 3 3 3 5 7 7 7 1 7 5 5 6 1 5 5 6 6 5 5 5 6 4 5 4 5 5 4 5 7 7 5 6 5 7 5 7 4 5 2 5 6 5 6 7 7 7 8 7 7 7 5 6 7 3 3 3 2 7 3 1 3 1 8 1 1 7 1 8 1 7 7 8 7 7 7 8 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 5 3 3 4 3 3 3 1 3 3 3 3 1 1 3 2 1 3 3 2 1 5 5 7 7 7 7 7 7 7 5 6 7 5 5 5 6 6 5 5 6 5 7 4 4 3 5 7 5 4 3 4 5 7 7 3 4 5 5 3 6 5 5 6 5 5 5 1 7 7 7 7 3 3 3 1 7 2 1 2 1 8 7 7 8 7 1 3 8 7 8 6 6 6 5 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 2 5 1 1 1 3 1 1 1 2 1 3 2 1 2 1 1 1 3 3 5 7 7 1 8 8 1 5 5 6 5 7 5 6 6 7 5 5 5 5 6 3 4 5 6 5 5 3 5 3 5 5 6 3 3 4 5 5 6 7 7 7 5 6 5 5 6 5 6 6 6 3 3 1 2 1 3 1 1 1 7 7 6 5 6 2 1 8 7 7 7 7 4 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 5 3 2 1 7 1 7 2 3 2 2 1 1 3 2 3 3 3 3 2 3 3 5 7 7 7 7 7 5 5 5 7 3 6 7 7 6 7 5 7 5 6 5 4 5 7 6 7 7 5 3 5 7 4 3 5 3 5 6 7 7 1 7 7 7 7 7 5 7 6 6 7 3 2 1 2 1 2 7 1 2 1 8 7 7 5 7 6 8 1 5 7 1 4 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 3 3 1 7 1 8 1 8 4 2 1 1 3 1 3 2 1 3 3 1 5 3 1 3 4 7 7 7 7 4 5 6 6 6 7 1 1 7 5 5 5 7 7 5 5 6 5 5 6 5 4 5 6 3 3 3 5 5 6 7 7 7 1 8 1 1 8 7 7 7 7 7 8 2 1 8 8 8 1 8 7 3 1 1 8 1 8 7 5 6 7 7 7 5 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 1 3 3 3 3 3 3 3 2 1 3 3 2 3 2 1 3 2 1 2 1 3 3 4 5 6 5 7 7 5 4 4 5 7 5 5 6 5 6 5 7 7 7 7 5 6 7 5 5 6 4 5 4 5 5 1 8 7 7 4 5 5 1 1 1 1 7 1 7 2 1 8 1 1 1 1 8 3 1 8 1 3 1 8 7 7 5 7 5 7 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 1 1 3 1 3 3 2 1 1 1 2 3 2 1 1 2 2 1 8 5 1 1 2 1 7 5 7 7 1 5 6 7 4 5 5 6 5 7 7 5 6 1 7 6 6 7 7 3 5 7 7 3 3 3 4 5 6 7 6 8 4 5 6 6 7 7 1 1 5 6 7 1 1 7 1 1 1 8 2 1 1 3 2 2 1 8 1 8 8 7 7 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 2 1 1 7 3 1 3 1 2 2 3 3 3 1 7 2 1 3 2 1 4 4 7 7 7 7 5 7 5 5 6 1 6 7 5 5 6 3 5 6 5 7 5 6 4 7 7 2 1 1 4 5 7 6 7 6 5 6 7 5 5 5 7 5 7 5 5 6 1 1 8 1 8 1 1 1 1 1 1 1 1 1 8 7 5 8 7 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 7 1 2 1 1 2 3 2 2 1 8 3 3 1 8 2 3 2 7 3 3 1 5 7 4 7 5 5 5 6 1 8 7 1 3 5 7 5 5 5 7 6 4 5 5 6 6 3 5 5 4 5 7 6 7 5 6 7 5 5 6 6 5 6 7 5 6 7 7 7 8 1 1 7 1 3 1 8 2 1 5 3 1 7 7 6 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 3 1 1 7 1 2 2 3 1 3 2 3 2 7 7 1 1 3 2 2 2 3 3 4 5 6 6 6 7 7 5 8 5 5 6 5 6 7 7 7 1 3 4 4 5 7 6 4 3 4 5 7 7 8 7 7 5 6 6 7 7 6 5 1 7 7 7 7 7 1 7 1 2 1 1 3 1 1 8 3 2 1 7 8 7 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 1 1 1 3 3 3 3 2 1 2 3 2 1 7 8 7 3 2 1 7 1 2 1 1 3 3 4 5 4 8 3 3 5 7 5 7 7 6 7 7 7 5 3 5 7 8 7 3 3 3 5 7 5 6 5 6 5 7 7 1 8 7 6 7 7 1 7 8 6 1 8 2 1 1 1 3 1 1 3 1 2 1 7 5 7 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 6 6 2 3 3 1 7 7 7 1 2 3 8 1 3 2 1 1 8 1 1 1 7 2 1 3 4 5 5 3 3 5 6 7 6 8 7 1 7 1 7 7 7 7 6 6 3 3 2 3 5 7 6 7 7 5 7 6 6 5 1 7 8 8 7 8 7 7 6 7 1 1 1 3 2 1 5 3 2 1 5 8 7 6 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 4 5 1 1 1 8 5 5 6 2 7 3 1 8 2 1 7 7 1 1 8 1 1 3 1 4 5 3 2 5 6 1 7 7 6 6 1 2 1 1 8 8 5 7 5 5 5 3 5 8 7 7 7 7 8 7 7 6 5 6 7 1 8 7 7 8 7 6 5 1 8 2 1 3 2 1 3 2 2 1 8 7 7 7 3 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 5 3 3 4 5 6 3 3 4 4 5 3 2 7 3 1 1 1 8 3 3 3 3 2 2 3 1 5 7 5 5 7 6 8 1 7 1 3 1 7 5 6 5 5 5 3 4 5 3 5 7 3 1 8 7 7 6 5 5 7 5 6 7 6 7 7 7 1 7 0 2 1 7 1 3 1 3 4 3 1 7 1 8 8 7 7 5 3 6 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 2 3 3 2 1 3 1 3 3 2 1 1 7 1 1 2 1 2 2 1 1 8 2 1 8 4 5 5 7 5 6 7 7 6 6 1 1 8 4 5 6 7 7 7 7 7 7 7 5 6 1 5 5 3 6 7 7 7 5 6 6 7 6 6 5 0 0 0 0 2 3 0 0 2 1 3 1 1 8 7 7 7 7 1 5 5 6 7 7 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 8 1 5 0 8 3 3 1 1 3 1 7 8 7 5 1 3 1 3 1 1 2 2 1 7 3 3 4 5 8 1 7 7 7 7 4 5 3 3 5 5 7 7 6 1 1 8 5 6 7 3 5 7 7 7 7 5 5 6 7 6 7 6 7 0 0 0 0 0 0 0 0 0 0 0 2 1 1 3 4 8 6 5 6 7 7 3 8 7 8
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 1 5 0 0 0 8 1 8 2 3 1 8 1 8 7 6 2 1 2 1 2 1 3 1 3 1 1 5 6 6 3 1 1 7 7 6 5 5 5 5 6 6 8 7 1 8 1 7 7 6 5 6 7 4 1 8 7 7 7 7 7 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 3 1 7 7 7 2 1 2 5 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 3 3 2 1 1 7 1 7 3 1 1 8 3 4 3 2 3 1 3 3 5 5 7 1 1 5 6 3 5 3 3 3 6 7 7 3 8 5 8 7 1 7 5 4 5 6 3 1 7 7 5 7 6 7 8 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 8 7 8 5 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 8 1 8 5 6 6 1 3 3 3 3 2 1 2 1 5 5 7 5 5 5 6 7 5 6 1 5 7 7 8 3 1 5 7 1 1 8 7 5 7 7 5 6 8 7 7 5 6 8 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 8 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 8 8 7 1 7 5 7 4 5 2 3 3 3 4 5 3 5 5 7 7 6 7 5 8 7 7 3 6 7 7 5 2 1 7 7 7 1 3 1 7 7 7 7 7 7 1 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 5 8 5 5 3 5 3 2 3 3 3 3 3 5 6 1 5 7 7 6 8 7 7 7 7 8 4 5 5 0 0 7 5 8 2 3 8 1 1 7 5 7 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 3 3 5 5 5 4 4 5 5 4 5 4 3 3 5 4 5 6 6 7 7 5 6 3 1 8 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 5 4 4 5 3 3 3 4 5 3 3 2 1 4 5 5 5 6 6 5 7 7 7 1 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 3 3 5 6 5 4 5 5 3 2 3 3 3 3 5 6 5 6 5 6 7 8 7 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 2 4 5 6 3 3 4 5 3 5 4 5 2 4 5 6 5 5 7 3 5 5 6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 3 3 3 4 5 5 3 1 4 5 4 3 3 1 1 4 3 3 5 4 5 5 6 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 1 3 4 4 5 5 1 4 5 2 1 3 3 4 3 4 3 4 7 5 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 3 2 5 3 4 3 3 3 3 3 4 3 3 3 3 5 3 4 4 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 2 1 2 1 1 1 2 1 2 1 3 5 6 5 1 5 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 1 1 3 1 7 2 1 8 3 4 3 3 4 2 3 5 3 5 4 5 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 1 7 5 5 5 1 3 1 5 3 1 3 5 3 5 3 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 4 4 5 5 4 5 3 4 5 3 2 5 3 4 5 6 1 7 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 3 4 5 5 4 5 3 3 4 5 5 5 5 7 7 5 5 6 5 6 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 2 3 3 3 3 3 3 3 5 5 5 4 5 6 6 5 7 6 3 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 3 3 4 5 3 4 5 3 5 5 5 6 6 7 4 5 3 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 3 3 3 5 7 3 5 5 7 7 5 5 4 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 5 1 3 3 4 5 5 4 7 5 6 3 3 3 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 1 5 5 5 5 4 7 6 7 3 1 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 5 3 5 6 3 4 5 7 8 2 1 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 4 5 3 5 7 1 2 5 6 5 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 2 1 3 5 7 5 7 5 3 5 6 6 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 4 5 3 4 5 5 4 7 5 7 7 1 8 3 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 2 1 3 5 3 3 5 5 4 3 2 1 6 2 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 1 3 6 7 4 7 7 4 5 3 2 1 7 3 5 3 2 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 1 4 5 6 2 1 4 5 3 3 4 5 1 1 4 5 4 5 3 2 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 5 6 3 4 5 1 7 4 5 5 7 6 4 5 5 3 3 3 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 3 2 3 4 7 4 3 3 3 3 4 3 3 4 3 4 5 3 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 2 3 4 3 5 2 5 6 1 3 3 5 3 3 5 3 3 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 1 3 4 4 5 4 7 5 7 3 4 5 6 4 5 7 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 5 4 5 5 4 5 3 3 3 2 1 3 4 5 3 4 5 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 7 3 3 5 3 4 4 5 7 1 1 7 3 4 5 3 4 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 5 5 5 2 3 4 5 6 6 1 8 3 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 5 6 2 5 4 5 7 3 3 2 1 5 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 7 6 5 7 5 6 7 4 5 5 3 4 3 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 7 5 6 7 3 5 7 7 4 5 5 6 3 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 6 7 7 8 3 5 7 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 7 5 1 1 6 4 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 3 6 5 6 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/backend/params/routing/route_param.txt b/backend/params/routing/route_param.txt
deleted file mode 100644
index 2eea701f..00000000
--- a/backend/params/routing/route_param.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# INPUT FILE FOR THE OHIO BASIN.   
-# NAME OF FLOW DIRECTION FILE   
-/houston2/pritam/rat_mekong_v3/backend/params/routing/DRT_FDR_VIC.asc
-# NAME OF VELOCITY FILE   
-.false.
-1.5   
-# NAME OF DIFF FILE   
-.false.   
-800   
-# NAME OF XMASK FILE   
-.false.   
-5000
-# NAME OF FRACTION FILE   
-.false.   
-1
-# NAME OF STATION FILE   
-/houston2/pritam/rat_mekong_v3/backend/params/routing/stations_xy.txt 
-# PATH OF INPUT FILES AND PRECISION
-/houston2/pritam/rat_mekong_v3/backend/data/rout_input/fluxes_
-2
-# PATH OF OUTPUT FILES   
-/houston2/pritam/rat_mekong_v3/backend/data/rout_results/
-# START AND END YEAR, MONTH AND DAY OF VIC OUTPUT
-2001 04 01
-2021 06 10
-# NAME OF UNIT HYDROGRAPH FILE   
-/houston2/pritam/rat_mekong_v3/backend/params/routing/uh.txt
\ No newline at end of file
diff --git a/backend/params/routing/stations_xy.txt b/backend/params/routing/stations_xy.txt
deleted file mode 100644
index 8d85d95e..00000000
--- a/backend/params/routing/stations_xy.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-1	Chaing_Sean	100	172	-9999
-NONE
-1	Chiang_Khan	125	134	-9999
-NONE
-1	"Nong_Khai"	142	134	-9999
-NONE
-1	"Nakhon_Phanom"	175	126	-9999
-NONE
-1	Mukdahan	174	113	-9999
-NONE
-1	Khong_Chiam	186	93	-9999
-NONE
-0	Battambang_1	145	52	-9999
-NONE
-0	Lower_Sesan_2	199	64	-9999
-NONE
-0	Phumi_Svay_Chrum	199	48	-9999
-NONE
-0	"Nam_Ngum_1"	139	144	-9999
-NONE
-0	"Nam_Theun_2"	178	135	-9999
-NONE
-0	Xe_Kaman_1	213	87	-9999
-NONE
-0	Lam_Pao	154	113	-9999
-NONE
-0	Siridhorn	185	91	-9999
-NONE
-0	Ubol_Ratana	140	116	-9999
-NONE
-0	Sesan_4	218	71	-9999
-NONE
-0	Sre_Pok_4	224	52	-9999
-NONE
-0	Yali	224	75	-9999
-NONE
diff --git a/backend/params/routing/uh.txt b/backend/params/routing/uh.txt
deleted file mode 100644
index f40429a8..00000000
--- a/backend/params/routing/uh.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-0   0.01
-1   0.24
-2   0.33
-3   0.18
-4   0.12
-5   0.05
-6   0.02
-7   0.01
-8   0.01
-9   0.01
-10  0.01
-11  0.01
\ No newline at end of file
diff --git a/backend/params/vic/domain.nc b/backend/params/vic/domain.nc
deleted file mode 100644
index 37641b29..00000000
Binary files a/backend/params/vic/domain.nc and /dev/null differ
diff --git a/backend/params/vic/vic_params.txt b/backend/params/vic/vic_params.txt
deleted file mode 100644
index 1036352c..00000000
--- a/backend/params/vic/vic_params.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-## Derived from global_params_v2.txt
-##
-MODEL_STEPS_PER_DAY   4
-SNOW_STEPS_PER_DAY    4
-RUNOFF_STEPS_PER_DAY  4
-
-STARTYEAR	2001
-STARTMONTH	04
-STARTDAY	01
-ENDYEAR 	2021
-ENDMONTH	06
-ENDDAY		10
-CALENDAR    PROLEPTIC_GREGORIAN
-
-FULL_ENERGY FALSE
-QUICK_FLUX  TRUE
-FROZEN_SOIL	FALSE
-
-# AERO_RESIST_CANSNOW AR_406
-# CONTINUEONERROR FALSE
-
-DOMAIN         /houston2/pritam/rat_mekong_v3/backend/params/vic/domain.nc
-DOMAIN_TYPE    LAT     lat
-DOMAIN_TYPE    LON     lon
-DOMAIN_TYPE    MASK    mask
-DOMAIN_TYPE    AREA    area
-DOMAIN_TYPE    FRAC    frac
-DOMAIN_TYPE    YDIM    lat
-DOMAIN_TYPE    XDIM    lon
-
-##INIT_STATE ${VIC_STATE_DIR}/image/WalnutGulch/states.WalnutGulch.L2015_YYYYMMDD_SSSSS.nc # Initial state path/file, where YYYY = year, MM = month, DD = day, SSSSS = seconds, for example 20080111_00000
-#STATENAME ${VIC_STATE_DIR}/image/WalnutGulch/states.WalnutGulch.L2015  # Output state file path/prefix. The time (STATEYEAR,STATEMONTH,STATEDAY,STATESEC) will be appended to the prefix automatically in the format yyyymmdd.
-#STATEYEAR   2008    # year to save model state
-#STATEMONTH  1  # month to save model state
-#STATEDAY    11  # day to save model state
-#STATESEC    0  # second to save model state
-#STATE_FORMAT NETCDF4_CLASSIC  # State file format, valid options:
-#NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET, NETCDF4_CLASSIC, NETCDF4
-
-FORCING1      /houston2/pritam/rat_mekong_v3/backend/data/forcings/forcing_
-FORCE_TYPE    AIR_TEMP 	   temp
-FORCE_TYPE    PREC         prec
-FORCE_TYPE    PRESSURE 	   air_pressure
-FORCE_TYPE    SWDOWN       shortwave
-FORCE_TYPE    LWDOWN 	   longwave
-FORCE_TYPE    VP           vapor_pressure
-FORCE_TYPE    WIND         wind
-WIND_H        10.0
-
-PARAMETERS      /houston2/pritam/rat_mekong_v3/backend/params/vic/params_all_mekong.nc
-LAI_SRC         FROM_VEGPARAM
-FCAN_SRC        FROM_DEFAULT
-ALB_SRC         FROM_VEGPARAM
-NODES           2
-SNOW_BAND       FALSE
-
-RESULT_DIR  /houston2/pritam/rat_mekong_v3/backend/data/vic_results_conf/
-LOG_DIR     /houston2/pritam/rat_mekong_v3/backend/data/vic_logs_conf/
-OUTFILE     nc_fluxes
-COMPRESS    FALSE
-OUT_FORMAT  NETCDF4
-AGGFREQ     NDAYS 1
-
-# Only those required for routing
-OUTVAR OUT_PREC
-OUTVAR OUT_EVAP
-OUTVAR OUT_RUNOFF
-OUTVAR OUT_BASEFLOW
-OUTVAR OUT_WDEW
-OUTVAR OUT_SOIL_LIQ
-OUTVAR OUT_SOIL_MOIST
-OUTVAR OUT_EVAP_CANOP
-OUTVAR OUT_TRANSP_VEG
-OUTVAR OUT_EVAP_BARE
-OUTVAR OUT_SNOW_CANOPY
-OUTVAR OUT_SWE
-OUTVAR OUT_SOIL_TEMP
-OUTVAR OUT_SURF_TEMP
-OUTVAR OUT_AIR_TEMP
-OUTVAR OUT_LAI
-OUTVAR OUT_FCANOPY
-OUTVAR OUT_ALBEDO
-
-# For Evaporation calcuation
-# Net Radiation at surface [W/m2] = R_N
-OUTVAR OUT_R_NET
-# Vapor Pressure [kPa] = e_a
-OUTVAR OUT_VP
-# Wind speed [m/s] = v_a
-OUTVAR OUT_WIND
-# Air Pressure [kPa] = P
-OUTVAR OUT_PRESSURE
diff --git a/backend/scripts/core/forecast_metsim.py b/backend/scripts/core/forecast_metsim.py
deleted file mode 100644
index 26086e53..00000000
--- a/backend/scripts/core/forecast_metsim.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import xarray as xr
-import numpy as np
-import argparse
-import os
-import pandas as pd
-
-from utils.metsim_param_reader import MSParameterFile
-
-
-def generate_state_and_inputs_forecast(forcings_startdate, forcings_enddate, hindcast_datapath, forecast_datapath, out_dir):
-    """Similar to the `generate_state_and_inputs` function in `metsim_input_processing.py` as of 20th April, 2022. 
-    It will generate the state and forcings for metsim for the froecast period.
-
-    Args:
-        forcings_startdate (string): start date in YYYY-MM-DD format.
-        forcings_enddate (string): end date in YYYY-MM-DD format.
-        hindcast_datapath (string): path to the combined netcdf file containing hindcast data.
-        forecast_datapath (string): path to the combined netcdf file containing forecast data.
-        out_dir (string): path of directory to save the state and inputs
-    """
-    # Since we need 3 months of prior data, we'll have to get the hindcast data as well
-    hindcast_data = xr.open_dataset(hindcast_datapath)
-    forecast_data = xr.open_dataset(forecast_datapath)
-
-    forcings_startdate = pd.to_datetime(forcings_startdate, format='%Y-%m-%d')
-    forcings_enddate = pd.to_datetime(forcings_enddate, format='%Y-%m-%d')
-
-    state_startdate = forcings_startdate - pd.DateOffset(90)
-    state_enddate = forcings_startdate - pd.DateOffset(1)
-
-    hindcast_subset = hindcast_data.sel(time=slice(state_startdate, state_enddate))
-    combined_data = xr.combine_by_coords([hindcast_subset, forecast_data]).resample(time='1D').ffill()
-
-    state_ds = combined_data.sel(time=slice(state_startdate, state_enddate))
-    state_outpath = os.path.join(out_dir, 'state.nc')
-    state_ds.to_netcdf(state_outpath)
-
-    # Generate the metsim input
-    forcings_ds = combined_data.sel(time=slice(forcings_startdate, forcings_enddate))
-    forcings_outpath = os.path.join(out_dir, "metsim_input.nc")
-    forcings_ds.to_netcdf(forcings_outpath)
-
-    return state_outpath, forcings_outpath
-
-
-def main():
-    generate_state_and_inputs_forecast('2022-04-22', '2022-05-06', 'data/combined/combined_data.nc', 'data/forecast/2022-04-22.nc', 'data/metsim_inputs_forecast')
-
-
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/core/generate_plots.py b/backend/scripts/core/generate_plots.py
deleted file mode 100644
index 6e51e039..00000000
--- a/backend/scripts/core/generate_plots.py
+++ /dev/null
@@ -1,407 +0,0 @@
-from matplotlib.pyplot import plot
-import plotly.graph_objs as go
-from plotly.subplots import make_subplots
-import os
-import pandas as pd
-from datetime import datetime
-import numpy as np
-import bs4
-
-import geopandas as gpd
-
-from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.convert_for_website import convert_v2_frontend
-
-log = getLogger(f"{LOG_NAME}.{__name__}")
-
-
-def plot_reservoir(inflow_fn, outflow_fn, dels_fn, sarea_fn, reservoir_name, save_fn):
-    """Plots the fluxes of the reservoirs using `plotly`
-
-    Args:
-        inflow_fn (str): path of the inflow file
-        outflow_fn (str): path of the outflow file
-        dels_fn (str): path of the dels file
-        sarea_fn (str): path of the sarea file
-        reservoir_name (str): name of the reservoir. Will be used as title
-        save_fn (str): path where to save the file
-    """
-    log.debug(f"Plotting: {reservoir_name} -> {save_fn}")
-    inflow = pd.read_csv(inflow_fn, parse_dates=['date'])
-    inflow['streamflow'] = inflow['streamflow'] * (24*60*60)        # convert from m3/s to m3/d
-    inflow["streamflow"] = inflow['streamflow'] * 1e-6              # convert from m3/d to million m3/d
-    dels = pd.read_csv(dels_fn, parse_dates=['date'])[['date', 'dS', 'days_passed']]
-    dels['dS'] = dels['dS'] * 1e3                                   # converting from billion m3 to million m3
-    outflow = pd.read_csv(outflow_fn, parse_dates=['date'])[['date', 'outflow_rate']]
-    outflow.loc[outflow['outflow_rate']<0, 'outflow_rate'] = 0
-    outflow['outflow_rate'] = outflow['outflow_rate'] * (24*60*60)  # convert from m3/s to m3/d
-    outflow['outflow_rate'] = outflow['outflow_rate'] * 1e-6        # converting from m3/d to million m3/d
-
-    sarea = pd.read_csv(sarea_fn, parse_dates=['date'])[['date', 'area']]
-
-    all_min = np.min([outflow.loc[outflow.date>'2019-01-01', 'outflow_rate'].min(), inflow.loc[inflow.date>'2019-01-01', 'streamflow'].min(), dels.loc[dels.date>'2019-01-01', 'dS'].min()])
-    all_max = np.max([outflow.loc[outflow.date>'2019-01-01', 'outflow_rate'].max(), inflow.loc[inflow.date>'2019-01-01', 'streamflow'].max(), dels.loc[dels.date>'2019-01-01', 'dS'].max()])
-
-    fig = make_subplots(
-        rows=2, cols=1,
-        row_heights=[0.3, 0.7],
-        shared_xaxes=True,
-        vertical_spacing=0.05,
-        specs=[
-            [{"secondary_y": False}],
-            [{"secondary_y": True}],
-        ]
-    )
-
-    # Surface Area
-    fig.add_trace(
-        go.Scatter(
-            x=list(sarea['date']),
-            y=list(sarea['area']),
-            name="Surface Area",
-            showlegend=True,
-            mode='markers+lines',
-            hovertemplate=r'%{y:.3f}',
-            line=dict(color='black'),
-            yaxis='y'
-        ),
-        row=1, col=1,
-    )
-
-    # Inflow
-    fig.add_trace(
-        go.Scatter(
-            x=list(inflow.date), 
-            y=list(inflow.streamflow), 
-            name="Inflow", 
-            showlegend=True,
-            hovertemplate=r'%{y:.3f}',
-            line=dict(color='#4427B0'),
-            yaxis='y2'
-        ),
-        row=2, col=1,
-    )
-
-    # delta S
-    fig.add_trace(
-        go.Scatter(
-            x=list(dels['date']),
-            y=list(dels['dS']),
-            name="∆S",
-            showlegend=True,
-            mode='markers+lines',
-            hovertemplate=r'%{y:.3f}',
-            line=dict(color='#72C401'),
-            yaxis='y3'
-        ),
-        row=2, col=1,
-        secondary_y=True,
-    )
-
-    # Outflow
-    fig.add_trace(
-        go.Scatter(
-            x=list(outflow['date']),
-            y=list(outflow['outflow_rate']),
-            name="Outflow",
-            showlegend=True,
-            mode='markers+lines',
-            hovertemplate=r'%{y:.3f}',
-            line=dict(color='#D81A6D'),
-            yaxis='y2'
-        ),
-        row=2, col=1,
-
-    )
-
-    # Update Layout
-    fig['layout'].update(
-        # Styling
-        autosize=False, 
-        height=400, 
-        width=800,
-        margin={
-            'b': 10,
-            'l': 10,
-            'r': 10,
-            't': 50
-        },
-        title=dict(
-            text=reservoir_name,
-            y=0.98,
-            x=0.5,
-            xanchor='center',
-            yanchor='top'
-        ),
-        hovermode='x unified',
-        xaxis1=dict(
-            rangeselector=dict(
-                buttons=list([
-                    dict(count=6, label='6 Months', step="month", stepmode="backward"),
-                    dict(count=1, label='1 Year', step="year", stepmode="backward"),
-                    dict(count=1, label='This Year', step="year", stepmode="todate"),
-                    dict(label='All', step="all")
-                ])
-            ),
-        ),
-        xaxis2=dict(
-            type="date",
-            rangeslider=dict(
-                visible=True
-            ),
-            range=['2019-01-01', datetime.today().strftime('%Y-%m-%d')]
-        ),
-        yaxis=dict(
-            anchor="x",
-            title="Area (km²)"
-        ),
-        yaxis2=dict(
-            anchor="x",
-            title="Flux (×10⁶ m³/day)", #+ r"$\times 10^6 m^3/day$"
-            rangemode='normal',
-            range=[all_min, all_max],
-            scaleratio=1,
-        ),
-        yaxis3=dict(
-            anchor="x",
-            title="∆S Volume (×10⁶ m³)", 
-            rangemode='normal',
-            range=[all_min, all_max],
-            scaleanchor='y2',
-            scaleratio=1,
-        ),
-        legend=dict(
-            orientation='h',
-            yanchor='bottom',
-            xanchor='right',
-            y=1,
-            x=1
-        ),
-    )
-    fig.update_xaxes(showspikes=True, spikemode='across', spikesnap='cursor')
-
-    fig.write_html(save_fn, include_plotlyjs='cdn', include_mathjax='cdn')
-
-
-def generate_plots(reservoir_db_fn, project_dir):
-    """Calls `plot_reservoir` to generate the html plots for all reservoirs mapped in RAT.
-
-    Args:
-        reservoir_db_fn (str): Path to a geojson file containing reservoir locations as points.
-            db must have column named `RAT_ID` referring to the internal ID that'll be used in RAT.
-            db must have column named `NAME` correspondign to the name of the reservoir.
-    """
-    reservoirs = gpd.read_file(reservoir_db_fn).set_index('RAT_ID', drop=False).sort_index()
-
-    # Temporarily use these dictionaries to map IDs to their corresponding flux file names 
-    sarea_fns = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "Nam_Ngum_1",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "Ubol_Ratana",
-        11: "Lam_Pao",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "Sirindhorn",
-        20: "5797",
-        21: "Nam_Theun_2",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "Xe_Kaman_1",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "Sesan_4",
-        33: "7232",
-        34: "7284",
-        35: "Lower_Sesan_2",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-
-    inflow_fns = {
-        1: "Sre_P",
-        2: "Phumi",
-        3: "Batta",
-        4: "5117 ",
-        5: "Nam_N",
-        6: "5138 ",
-        7: "5143 ",
-        8: "5147 ",
-        9: "5148 ",
-        10: "Ubol_",
-        11: "Lam_P",
-        12: "5151 ",
-        13: "5152 ",
-        14: "5155 ",
-        15: "5156 ",
-        16: "5160 ",
-        17: "5162 ",
-        18: "5795 ",
-        19: "Sirid",
-        20: "5797 ",
-        21: "Nam_T",
-        22: "7000 ",
-        23: "7001 ",
-        24: "7002 ",
-        25: "Xe_Ka",
-        26: "7004 ",
-        27: "7037 ",
-        28: "7159 ",
-        29: "7164 ",
-        30: "7181 ",
-        31: "7201 ",
-        32: "Sesan",
-        33: "7232 ",
-        34: "7284 ",
-        35: "Lower",
-        36: "Yali ",
-        37: "NamTo",
-    }
-
-    dels_outflow_fns = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "Nam_Ngum_1",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "Ubol_Ratana",
-        11: "Lam_Pao",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "Sirindhorn",
-        20: "5797",
-        21: "Nam_Theun_2",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "Xe_Kaman_1",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "Sesan_4",
-        33: "7232",
-        34: "7284",
-        35: "Lower_Sesan_2",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-
-    # using `project_dir` determine the directories of fluxes
-    inflow_dir = os.path.join(project_dir, "backend/data/inflow")
-    outflow_dir = os.path.join(project_dir, "backend/data/outflow")
-    dels_dir = os.path.join(project_dir, "backend/data/dels")
-    sarea_dir = os.path.join(project_dir, "backend/data/sarea_tmsos")
-
-    for RAT_ID in reservoirs['RAT_ID']:
-        inflow_fn = os.path.join(inflow_dir, inflow_fns[RAT_ID] + ".csv")
-        dels_fn = os.path.join(dels_dir, dels_outflow_fns[RAT_ID] + ".csv")
-        outflow_fn = os.path.join(outflow_dir, dels_outflow_fns[RAT_ID] + ".csv")
-        sarea_fn = os.path.join(sarea_dir, sarea_fns[RAT_ID] + ".csv")
-        name = reservoirs.loc[RAT_ID, 'NAME']
-        save_fn = os.path.join(project_dir, f"backend/data/website_plots/{RAT_ID}.html")
-
-        if inflow_fns[RAT_ID] and dels_outflow_fns[RAT_ID] and sarea_fns[RAT_ID]:
-            # Plot
-            log.debug(f"Plotting: {name}")
-            plot_reservoir(inflow_fn, outflow_fn, dels_fn, sarea_fn, name, save_fn)
-
-            # Convert for v2-frontend
-            log.debug(f"Converting to v2-website format: {name}")
-            convert_v2_frontend(project_dir, name, inflow_fn, sarea_fn, dels_fn, outflow_fn)
-
-            # Inject html
-            log.debug(f"Injecting download links: {name}")
-            inject_download_links(save_fn, name)
-
-
-def inject_download_links(html_fn, res_name, prefix="../"):
-    """Injects download links at the end of the html file.
-
-    Args:
-        html_fn (str): path of the html file whgere links will be injected
-        res_name (str): name of reservoir (assumed to be the name of the file for downloading)
-        prefix (str; default: "data"): prefix to use for obtaining the relative path that will be delivered as downloadable link 
-    """
-    with open(html_fn) as src:
-        txt = src.read()
-        soup = bs4.BeautifulSoup(txt)
-
-    # Create Paragraph
-    p_tag = soup.new_tag("p")
-
-    # Create unordered list
-    ul_tag = soup.new_tag("ul")
-
-    # Heading text
-    strong_title = soup.new_tag("strong")
-    strong_title.string = "Download Data"
-    ul_tag.append(strong_title)
-
-    # link to Inflow data
-    inflow_link = soup.new_tag("a", href=f"{prefix}/inflow/{res_name}.csv")
-    inflow_link.string = "Inflow"
-    li_inflow_link = soup.new_tag('li')
-    li_inflow_link.append(inflow_link)
-
-    # link to Surface Area data
-    sarea_link = soup.new_tag("a", href=f"{prefix}/sarea_tmsos/{res_name}.csv")
-    sarea_link.string = "Surface Area (TMS-OS)"
-    li_sarea_link = soup.new_tag('li')
-    li_sarea_link.append(sarea_link)
-
-    # link to dels data
-    dels_link = soup.new_tag("a", href=f"{prefix}/dels/{res_name}.csv")
-    dels_link.string = "Storage Change"
-    li_dels_link = soup.new_tag('li')
-    li_dels_link.append(dels_link)
-
-    # link to Outflow data
-    outflow_link = soup.new_tag("a", href=f"{prefix}/outflow/{res_name}.csv")
-    outflow_link.string = "Outflow"
-    li_outflow_link = soup.new_tag('li')
-    li_outflow_link.append(outflow_link)
-
-    # add the links to the unordered list
-    ul_tag.append(li_inflow_link)
-    ul_tag.append(li_outflow_link)
-    ul_tag.append(li_sarea_link)
-    ul_tag.append(li_dels_link)
-
-    # add the list to the paragraph
-    p_tag.append(ul_tag)
-
-    # add the paragraph to the end of the body
-    soup.body.append(p_tag)
-
-    # save the file
-    with open(html_fn, "w") as dst:
-        dst.write(str(soup))
\ No newline at end of file
diff --git a/backend/scripts/core/run_altimetry.py b/backend/scripts/core/run_altimetry.py
deleted file mode 100644
index f157e4e8..00000000
--- a/backend/scripts/core/run_altimetry.py
+++ /dev/null
@@ -1,74 +0,0 @@
-import configparser
-import os
-import argparse
-
-from data_processing import altimetry as alt
-
-
-def altimeter_routine(reservoirpath, j3tracks, user, password, metafile, project_dir, geoidpath):
-    resname = reservoirpath.split(os.sep)[-1].split('.')[0]
-
-    j3_pass = alt.get_j3_tracks(reservoirpath, j3tracks)
-    print(j3_pass)
-
-    if j3_pass is None:
-        return None
-
-    # savedir = os.path.join(project_dir, 'backend/data/altimetry', resname, 'raw')
-    savedir = os.path.join(project_dir, 'backend/data/altimetry', 'raw')
-    if not os.path.isdir(savedir):
-        os.makedirs(savedir)
-    # extracteddir = os.path.join(project_dir, 'backend/data/altimetry', resname, 'extracted')
-    extracteddir = os.path.join(project_dir, 'backend/data/altimetry', 'extracted', resname)
-    if not os.path.isdir(extracteddir):
-        os.makedirs(extracteddir)
-    
-    resultsdir = os.path.join(project_dir, 'backend/data/altimetry_timeseries')
-    savepath = os.path.join(resultsdir, f'{resname}.csv')
-
-    tracks = j3_pass['tracks']
-    lat_ranges = j3_pass['lat_range']
-
-    for track, lat_range in zip(tracks, lat_ranges):
-        latest_cycle = alt.get_latest_cycle(user, password, metafile)
-        print(f"Latest cycle: {latest_cycle}")
-
-        alt.download_data(user, password, savedir, track, 1, latest_cycle, 3)
-        extractedf = alt.extract_data(savedir + f'/j3_{track:03}', extracteddir, lat_range[0], lat_range[1], track, 3)
-
-        alt.generate_timeseries(extractedf, savepath, lat_range[0], lat_range[1], geoidpath)
-
-def run_altimetry(project_dir):
-    reservoirs_dir = os.path.join(project_dir, 'backend/data/ancillary/reservoirs')
-
-    to_process = ['7003', 'Xe_Kaman_1', 'Siridhorn', '5796', 'Lam_Pao']
-
-    reservoirs = [os.path.join(reservoirs_dir, f) for f in os.listdir(reservoirs_dir) if f.endswith(".shp") and f.split('.')[0] in to_process]
-
-    secrets = configparser.ConfigParser()
-    secrets.read(os.path.join(project_dir, 'backend/params/secrets.ini'))
-    username = secrets["aviso"]["username"]
-    pwd = secrets["aviso"]["pwd"]
-
-    metafile = os.path.join(project_dir, 'backend/params/j3_meta.txt')
-    
-    j3_tracks = os.path.join(project_dir, 'backend/data/ancillary/j3_tracks.geojson')
-
-    geoidpath = os.path.join(project_dir, 'backend/data/ancillary/geoidegm2008grid.mat')
-
-    for reservoir in reservoirs:
-        print(f"Processing {reservoir}")
-        # if reservoir.split('/')[-1].startswith("Siri"):
-        altimeter_routine(reservoir, j3_tracks, username, pwd, metafile, project_dir, geoidpath)
-
-
-def main():
-    parser = argparse.ArgumentParser()
-    parser.add_argument('proj_dir')
-
-    args = parser.parse_args()
-    run_altimetry(args.proj_dir)
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/core/run_postprocessing.py b/backend/scripts/core/run_postprocessing.py
deleted file mode 100644
index 723694db..00000000
--- a/backend/scripts/core/run_postprocessing.py
+++ /dev/null
@@ -1,504 +0,0 @@
-import os
-import datetime
-import subprocess
-import pandas as pd
-import numpy as np
-import xarray as xr
-import geopandas as gpd
-import warnings
-
-warnings.filterwarnings("ignore")
-
-
-from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import run_command
-from utils.science import penman
-
-log = getLogger(f"{LOG_NAME}.{__name__}")
-
-
-# def sarea_postprocessor(dfpath, savepath):
-    # df = pd.read_csv(dfpath, parse_dates=['date'])
-
-    # # Filter out drastic changes
-    # df['std'] = df['area'].rolling(5).std()
-    # df['mean'] = df['area'].rolling(5).mean()
-    # df = df[(df['area'] <= df['mean']+1.68*df['std']) & (df['area'] >= df['mean']-1.68*df['std'])]
-
-    # log.debug(f"Filtering out spikes from {dfpath}; Saving at -> {savepath}")
-    # df.to_csv(savepath, index=False)
-
-
-def calc_dels(aecpath, sareapath, savepath):
-    aec = pd.read_csv(aecpath)
-    df = pd.read_csv(sareapath, parse_dates=['date'])
-
-    df = df.drop_duplicates('date')
-
-    get_elev = lambda area: np.interp(area, aec['CumArea'], aec['Elevation'])
-
-    df['wl (m)'] = df['area'].apply(get_elev)
-
-    # Even after filtering, use the rolling mean
-    # df['wl (m)'] = df['wl (m)'].rolling(5).mean()
-    # df['area'] = df['area'].rolling(5).mean()
-
-    # Convert area from km^2 to m^2
-    df['area'] = df['area'] * 1e6
-
-    A0 = df['area'].iloc[:-1]
-    A1 = df['area'].iloc[1:]
-
-    h0 = df['wl (m)'].iloc[:-1]
-    h1 = df['wl (m)'].iloc[1:]
-
-    S = (h1.values - h0.values)*(A1.values + A0.values)/2
-    S = np.insert(S, 0, np.nan)
-
-    S =  S * 1e-9                               # Convert to BCM
-
-    df['dS'] = S
-
-    df.to_csv(savepath, index=False)
-
-def calc_E(res_path, forcings_path, vic_res_path, sarea_path, savepath):
-    ds = xr.open_dataset(vic_res_path)#.load()
-    forcings_ds = xr.open_mfdataset(forcings_path, engine='netcdf4')
-
-    res_name = res_path.split(os.sep)[-1]
-
-    res = gpd.read_file(res_path)
-    # create buffer to get required bounds
-    res_buf = res.buffer(0.1)
-
-    minx, miny, maxx, maxy = res_buf.iloc[0].bounds
-
-    log.debug(f"Bounds: {res_buf.iloc[0].bounds}")
-    log.debug("Clipping forcings")
-    forcings_ds_clipped = forcings_ds['air_pressure'].sel(lon=slice(minx, maxx), lat=slice(maxy, miny))
-    forcings = forcings_ds_clipped.load()
-    
-    log.debug("Clipping VIC results")
-    ds_clipped = ds.sel(lon=slice(minx, maxx), lat=slice(maxy, miny))#.isel(time=slice(100, 200))
-    reqvars_clipped = ds_clipped[['OUT_EVAP', 'OUT_R_NET', 'OUT_VP', 'OUT_WIND', 'OUT_AIR_TEMP']]
-    reqvars = reqvars_clipped.load()
-
-    # get sarea
-    log.debug("Getting surface areas")
-    sarea = pd.read_csv(sarea_path, parse_dates=['date']).rename({'date': 'time'}, axis=1)[['time', 'area']]
-    sarea = sarea.set_index('time')
-    upsampled_sarea = sarea.resample('D').mean()
-    sarea_interpolated = upsampled_sarea.interpolate(method='linear')
-    
-    log.debug("Checking if grid cells lie inside reservoir")
-    last_layer = reqvars.isel(time=-1).to_dataframe().reset_index()
-    temp_gdf = gpd.GeoDataFrame(last_layer, geometry=gpd.points_from_xy(last_layer.lon, last_layer.lat))
-
-    res_geom = res.iloc[0].geometry
-    points_within = temp_gdf[temp_gdf.within(res_geom)]['geometry']
-
-    if len(points_within) == 0:
-        log.debug("No points inside reservoir, using nearest point to centroid")
-        centroid = res_geom.centroid
-
-        data = reqvars.sel(lat=centroid.y, lon=centroid.x, method='nearest')
-        data = data.to_dataframe().reset_index()[1:].set_index('time')
-
-        P = forcings.sel(lat=centroid.y, lon=centroid.x, method='nearest')
-        P = P.to_dataframe().reset_index().set_index('time')['air_pressure'].resample('1D').mean()[1:]
-        P.head()
-
-    else:
-        # print(f"[!] {len(points_within)} Grid cells inside reservoir found, averaging their values")
-        data = reqvars.sel(lat=points_within.y, lon=points_within.x, method='nearest').to_dataframe().reset_index().groupby('time').mean()[1:]
-
-        # res_geom = res.iloc[0].geometry
-        P = forcings.sel(lat=points_within.y, lon=points_within.x, method='nearest').resample({'time':'1D'}).mean().to_dataframe().groupby('time').mean()[1:]
-
-    data['area'] = sarea_interpolated['area']
-    data['P'] = P
-    data = data.dropna()
-    data['penman_E'] = data.apply(lambda row: penman(row['OUT_R_NET'], row['OUT_AIR_TEMP'], row['OUT_WIND'], row['OUT_VP'], row['P'], row['area']), axis=1)
-    data = data.reset_index()
-
-    # Save 
-    data[['time', 'penman_E']].rename({'penman_E': 'OUT_EVAP'}, axis=1).to_csv(savepath, index=False)
-
-
-def calc_outflow(inflowpath, dspath, epath, area, savepath):
-    inflow = pd.read_csv(inflowpath, parse_dates=["date"])
-    E = pd.read_csv(epath, parse_dates=['time'])
-
-    if isinstance(dspath, str):
-        df = pd.read_csv(dspath, parse_dates=['date'])
-    else:
-        df = dspath
-    
-    inflow = inflow[inflow['date']>=df['date'].iloc[0]]
-    inflow = inflow[inflow['date']<=df['date'].iloc[-1]]
-    inflow = inflow.set_index('date')
-
-    inflow['streamflow'] = inflow['streamflow'] * (60*60*24)
-
-    E = E[E['time']>=df['date'].iloc[0]]
-    E = E[E['time']<=df['date'].iloc[-1]]
-    E = E.set_index('time')
-
-    E['OUT_EVAP'] = E['OUT_EVAP'] * (0.001 * area * 1000*1000)  # convert mm to m3. E in mm, area in km2
-
-    last_date = df['date'][:-1]
-    df = df.iloc[1:,:]
-    
-    df['last_date'] = last_date.values
-    
-    df['inflow_vol'] = df.apply(lambda row: inflow.loc[row['last_date']:row['date'], 'streamflow'].sum(), axis=1)
-    df['evap_vol'] = df.apply(lambda row: E.loc[(E.index > row['last_date'])&(E.index <= row['date']), 'OUT_EVAP'].sum(), axis=1)
-    df['outflow_vol'] = df['inflow_vol'] - (df['dS']*1e9)# - df['evap_vol']
-    df['days_passed'] = (df['date'] - df['last_date']).dt.days
-    df['outflow_rate'] = df['outflow_vol']/(df['days_passed']*24*60*60)   # cumecs
-
-    df.to_csv(savepath, index=False)
-
-
-def run_postprocessing(project_dir):
-    # read file defining mapped resrvoirs
-    reservoirs_fn = os.path.join(project_dir, 'backend/data/ancillary/RAT-Reservoirs.geojson')
-    reservoirs = gpd.read_file(reservoirs_fn)
-    ids = reservoirs['RAT_ID'].tolist()
-
-    # define mappings according to RAT_ID
-    aec_names = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "5136",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "5149",
-        11: "5150",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "5796",
-        20: "5797",
-        21: "6999",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "7003",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "7203",
-        33: "7232",
-        34: "7284",
-        35: "7303",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-    sarea_names = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "Nam_Ngum_1",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "Ubol_Ratana",
-        11: "Lam_Pao",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "Sirindhorn",
-        20: "5797",
-        21: "Nam_Theun_2",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "Xe_Kaman_1",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "Sesan_4",
-        33: "7232",
-        34: "7284",
-        35: "Lower_Sesan_2",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-    dels_names = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "Nam_Ngum_1",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "Ubol_Ratana",
-        11: "Lam_Pao",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "Sirindhorn",
-        20: "5797",
-        21: "Nam_Theun_2",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "Xe_Kaman_1",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "Sesan_4",
-        33: "7232",
-        34: "7284",
-        35: "Lower_Sesan_2",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-    res_shp_names = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "Nam_Ngum_1",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "Ubol_Ratana",
-        11: "Lam_Pao",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "Siridhorn",
-        20: "5797",
-        21: "Nam_Theun_2",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "Xe_Kaman_1",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "Sesan_4",
-        33: "7232",
-        34: "7284",
-        35: "Lower_Sesan_2",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-    outflow_names = {
-        1: "Sre_Pok_4",
-        2: "Phumi_Svay_Chrum",
-        3: "Battambang_1",
-        4: "5117",
-        5: "Nam_Ngum_1",
-        6: "5138",
-        7: "5143",
-        8: "5147",
-        9: "5148",
-        10: "Ubol_Ratana",
-        11: "Lam_Pao",
-        12: "5151",
-        13: "5152",
-        14: "5155",
-        15: "5156",
-        16: "5160",
-        17: "5162",
-        18: "5795",
-        19: "Sirindhorn",
-        20: "5797",
-        21: "Nam_Theun_2",
-        22: "7000",
-        23: "7001",
-        24: "7002",
-        25: "Xe_Kaman_1",
-        26: "7004",
-        27: "7037",
-        28: "7159",
-        29: "7164",
-        30: "7181",
-        31: "7201",
-        32: "Sesan_4",
-        33: "7232",
-        34: "7284",
-        35: "Lower_Sesan_2",
-        36: "Yali",
-        37: "Nam_Ton"
-    }
-    areas = {                   # Areas in km2, from GRAND if available, or calcualted
-        1: 3.4,
-        2: 0.7,
-        3: 15,
-        4: 36.91,
-        5: 436.93,
-        6: 9.23,
-        7: 38.44,
-        8: 73.22,
-        9: 15.79,
-        10: 313.38,
-        11: 202.51,
-        12: 6.96,
-        13: 1.84,
-        14: 4.78,
-        15: 26.89,
-        16: 9.69,
-        17: 11.57,
-        18: 86.9,
-        19: 235.58,
-        20: 31,
-        21: 414.34,
-        22: 10.4,
-        23: 93.77,
-        24: 4.42,
-        25: 101.43,
-        26: 4.12,
-        27: 20.46,
-        28: 6.82,
-        29: 12.85,
-        30: 24.91,
-        31: 43.95,
-        32: 53.08,
-        33: 246.16,
-        34: 154.34,
-        35: 332.96,
-        36: 45,
-        37: 7.5
-    }
-    inflow_names = {
-        1: "Sre_P",
-        2: "Phumi",
-        3: "Batta",
-        4: "5117 ",
-        5: "Nam_N",
-        6: "5138 ",
-        7: "5143 ",
-        8: "5147 ",
-        9: "5148 ",
-        10: "Ubol_",
-        11: "Lam_P",
-        12: "5151 ",
-        13: "5152 ",
-        14: "5155 ",
-        15: "5156 ",
-        16: "5160 ",
-        17: "5162 ",
-        18: "5795 ",
-        19: "Sirid",
-        20: "5797 ",
-        21: "Nam_T",
-        22: "7000 ",
-        23: "7001 ",
-        24: "7002 ",
-        25: "Xe_Ka",
-        26: "7004 ",
-        27: "7037 ",
-        28: "7159 ",
-        29: "7164 ",
-        30: "7181 ",
-        31: "7201 ",
-        32: "Sesan",
-        33: "7232 ",
-        34: "7284 ",
-        35: "Lower",
-        36: "Yali ",
-        37: "NamTo"
-    }
-
-    # SArea
-    sarea_raw_dir = os.path.join(project_dir, "backend/data/sarea_tmsos")
-
-    # DelS
-    log.debug("Calculating ∆S")
-    dels_savedir = os.path.join(project_dir, "backend/data/dels")
-    aec_dir = os.path.join(project_dir, "backend/data/aec")
-
-    for RAT_ID in ids:
-        sarea_path = os.path.join(sarea_raw_dir, sarea_names[RAT_ID] + ".csv")
-        savepath = os.path.join(dels_savedir, dels_names[RAT_ID] + ".csv")
-        aecpath = os.path.join(aec_dir, aec_names[RAT_ID] + ".txt")
-
-        log.debug(f"Calculating ∆S for {sarea_names[RAT_ID]}, saving at: {savepath}")
-        calc_dels(aecpath, sarea_path, savepath)
-
-    # Evaporation
-    log.debug("Retrieving Evaporation")
-    evap_datadir = os.path.join(project_dir, "backend/data/E")
-    res_dir = os.path.join(project_dir, "backend/data/ancillary/reservoirs")
-    vic_results_path = os.path.join(project_dir, "backend/data/vic_results/nc_fluxes.2001-04-01.nc")
-    sarea_dir = os.path.join(project_dir, "backend/data/sarea_tmsos")
-    forcings_path = os.path.join(project_dir, "backend/data/forcings/*.nc")
-
-    for RAT_ID in ids:
-        respath = os.path.join(res_dir, res_shp_names[RAT_ID] + ".shp")
-        _, resname = os.path.split(respath)
-        sarea_path = os.path.join(sarea_dir, resname.replace(".shp", ".csv"))
-        e_path = os.path.join(evap_datadir, resname.replace(".shp", '.csv'))
-        
-        if os.path.isfile(sarea_path):
-            log.debug(f"Calculating Evaporation for {resname}")
-            # calc_E(e_path, respath, vic_results_path)
-            calc_E(respath, forcings_path, vic_results_path, sarea_path, e_path)
-        else:
-            log.debug(f"{sarea_path} not found; skipping")
-
-    # Outflow
-    log.debug("Calculating Outflow")
-    outflow_savedir = os.path.join(project_dir, "backend/data/outflow")
-    inflow_dir = os.path.join(project_dir, "backend/data/inflow")
-
-    for RAT_ID in ids:
-        respath = os.path.join(res_dir, res_shp_names[RAT_ID] + ".csv")
-        deltaS = os.path.join(dels_savedir, dels_names[RAT_ID] + ".csv")
-        _, resname = os.path.split(deltaS)
-        inflowpath = os.path.join(inflow_dir, inflow_names[RAT_ID] + ".csv")
-        epath = os.path.join(evap_datadir, resname)
-        a = areas[RAT_ID]
-
-        savepath = os.path.join(outflow_savedir, outflow_names[RAT_ID] + ".csv")
-        log.debug(f"Calculating Outflow for {resname} saving at: {savepath}")
-        calc_outflow(inflowpath, deltaS, epath, a, savepath)
-
-def main():
-    pass
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/core/run_sarea.py b/backend/scripts/core/run_sarea.py
deleted file mode 100644
index 441796e4..00000000
--- a/backend/scripts/core/run_sarea.py
+++ /dev/null
@@ -1,129 +0,0 @@
-import os
-import datetime
-import subprocess
-
-from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-
-from core.sarea.sarea_cli_s2 import sarea_s2
-from core.sarea.sarea_cli_l8 import sarea_l8
-from core.sarea.sarea_cli_l9 import sarea_l9
-from core.sarea.sarea_cli_sar import sarea_s1
-from core.sarea.TMS import TMS
-
-log = getLogger(f"{LOG_NAME}.{__name__}")
-
-grand_areas = {                   # Areas in km2, from GRAND if available, or calcualted
-    "Nam_Ngum_1": 436.9299,
-    "Ubol_Ratana": 313.38,
-    "Lam_Pao": 202.51,
-    "Sirindhorn": 235.58,
-    "Nam_Theun_2": 414.34,
-    "Xe_Kaman_1": 101.43,
-    "Lower_Sesan_2": 53.08,  # GRAND ID 7203
-    "Sesan_4": 53.08,
-    "Sre_Pok_4": 3.7,
-    # "7303": 332.96,
-    "5117": 36.91,
-    "5138": 9.23,
-    "5143": 38.43999,
-    "5147": 73.22,
-    "5148": 15.79,
-    "5151": 6.96,
-    "5152": 1.84,
-    "5155": 4.78,
-    "5156": 26.89,
-    "5160": 9.69,
-    "5162": 11.57,
-    "5795": 86.9,
-    "5797": 31,
-    "7000": 10.4,
-    "7001": 93.77,
-    "7002": 4.42,
-    "7004": 4.12,
-    "7037": 20.46,
-    # "7087": 9.64,
-    "7158": 31.76,
-    "7159": 6.82,
-    "7164": 12.85,
-    "7181": 24.91,
-    "7201": 43.95,
-    "7232": 246.16,
-    "7284": 154.34,
-    "7303": 332.96,
-    "Phumi_Svay_Chrum": 0.8,
-    "Battambang_1": 15,
-    "Kaptai": 600,
-    "Yali": 50,
-    "Nam_Ton": 7.5
-}
-
-def run_sarea(start_date, end_date, datadir):
-    reservoirs =[
-        "Battambang_1", "Lam_Pao", "Lower_Sesan_2", "Nam_Ngum_1", 
-        "Phumi_Svay_Chrum", "Sesan_4", "Sirindhorn", "Sre_Pok_4", "Ubol_Ratana", "Xe_Kaman_1", 
-        "Yali", "5117", "5138", "5143", "5147", "5148", "5151", "5152", "5155", "5156", "5160",
-        "5162", "5795", "5797", "7000", "7001", "7002", "7004", "7037", "7087", "7158", "7159",
-        "7164", "7181", "7201", "7232", "7284", "7303", "Nam_Theun_2", "Phumi_Svay_Chrum", "Nam_Ton"
-    ]
-    
-    for reservoir in reservoirs:
-        if reservoir in grand_areas.keys():
-            print("TMS-OS running for reservoir: ", reservoir)
-            run_sarea_for_res(reservoir, start_date, end_date, datadir)
-
-
-def run_sarea_for_res(reservoir, start_date, end_date, datadir):
-    # Obtain surface areas
-    # Sentinel-2
-    log.debug(f"Reservoir: {reservoir}; Downloading Sentinel-2 data from {start_date} to {end_date}")
-    sarea_s2(reservoir, start_date, end_date, os.path.join(datadir, 's2'))
-    s2_dfpath = os.path.join(datadir, 's2', reservoir+'.csv')
-
-    # Landsat-8
-    log.debug(f"Reservoir: {reservoir}; Downloading Landsat-8 data from {start_date} to {end_date}")
-    sarea_l8(reservoir, start_date, end_date, os.path.join(datadir, 'l8'))
-    l8_dfpath = os.path.join(datadir, 'l8', reservoir+'.csv')
-    
-    # Landsat-9
-    log.debug(f"Reservoir: {reservoir}; Downloading Landsat-9 data from {start_date} to {end_date}")
-    sarea_l9(reservoir, start_date, end_date, os.path.join(datadir, 'l9'))
-    l9_dfpath = os.path.join(datadir, 'l9', reservoir+'.csv')
-
-    # Sentinel-1
-    log.debug(f"Reservoir: {reservoir}; Downloading Sentinel-1 data from {start_date} to {end_date}")
-    s1_dfpath = sarea_s1(reservoir, start_date, end_date, os.path.join(datadir, 'sar'))
-
-    tmsos = TMS(reservoir, grand_areas[reservoir])
-    result = tmsos.tms_os(l8_dfpath, s2_dfpath, l9_dfpath, s1_dfpath)
-
-    tmsos_savepath = os.path.join(datadir, reservoir+'.csv')
-    log.debug(f"Saving surface area of {reservoir} at {tmsos_savepath}")
-    result.reset_index().rename({'index': 'date', 'filled_area': 'area'}, axis=1).to_csv(tmsos_savepath, index=False)
-
-TE_areas = {
-    "4464_Tabqa": 636.77,
-    "4461_Mosul": 346.9
-}
-
-def check_hotfix(res_fn):
-    prefix = "/Users/pdas47/phd/rat_v2/extras/2023_01_13-hotfix_weekly_delta/data/sarea_tmsos_te"
-    s2_dfpath = os.path.join(prefix, 's2', res_fn+'.csv')
-    l8_dfpath = os.path.join(prefix, 'l8', res_fn+'.csv')
-    l9_dfpath = os.path.join(prefix, 'l9', res_fn+'.csv')
-    s1_dfpath = os.path.join(prefix, 'sar', res_fn+'_12d_sar.csv')
-
-    tmsos = TMS(res_fn, TE_areas[res_fn])
-    result = tmsos.tms_os(l8_dfpath, s2_dfpath, l9_dfpath, s1_dfpath)
-    
-    tmsos_savepath = os.path.join(prefix, res_fn+'.csv')
-    log.debug(f"Saving surface area of {res_fn} at {tmsos_savepath}")
-    result.reset_index().rename({'index': 'date', 'filled_area': 'area'}, axis=1).to_csv(tmsos_savepath, index=False)
-
-def main():
-    # run_sarea("2019-01-01", "2022-09-01", datadir='backend/data/sarea_tmsos')
-    check_hotfix("4461_Mosul")
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/core/run_sarea_old.py b/backend/scripts/core/run_sarea_old.py
deleted file mode 100644
index fdedb3a6..00000000
--- a/backend/scripts/core/run_sarea_old.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# import geemap as gee
-import ee
-from datetime import datetime, timedelta
-import pandas as pd
-import time
-import os
-from random import randint
-
-from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import create_directory, run_command
-from utils.vic_param_reader import VICParameterFile
-
-log = getLogger(LOG_NAME)
-
-def sarea_runner(reservoir, start, end):
-    pass
-
-
-def main():
-    pass
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/core/sarea/sarea_cli_l8.py b/backend/scripts/core/sarea/sarea_cli_l8.py
deleted file mode 100644
index 8539ba62..00000000
--- a/backend/scripts/core/sarea/sarea_cli_l8.py
+++ /dev/null
@@ -1,487 +0,0 @@
-# import geemap as gee
-import ee
-from datetime import datetime, timedelta, timezone
-import pandas as pd
-import time
-import os
-from random import randint
-import argparse
-from itertools import zip_longest
-import pprint
-
-from utils.logging import LOG_NAME, NOTIFICATION
-from logging import getLogger
-
-log = getLogger(f"{LOG_NAME}.{__name__}")
-
-
-def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
-    "Collect data into non-overlapping fixed-length chunks or blocks"
-    # grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
-    # grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError
-    # grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF
-    args = [iter(iterable)] * n
-    if incomplete == 'fill':
-        return zip_longest(*args, fillvalue=fillvalue)
-    if incomplete == 'strict':
-        return zip(*args, strict=True)
-    if incomplete == 'ignore':
-        return zip(*args)
-    else:
-        raise ValueError('Expected fill, strict, or ignore')
-
-ee.Initialize()
-
-# L8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
-# gswd = ee.Image("JRC/GSW1_3/GlobalSurfaceWater").select("occurrence")
-# Threshold = 0.0
-
-# NEW STUFF
-l8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
-gswd = ee.Image("JRC/GSW1_3/GlobalSurfaceWater")
-reservoir_geom_prefix = "users/saswegee/pritam/RAT-Mekong/"
-reservoir = ee.FeatureCollection("users/pdas47/RAT/Sirindhorn")
-rgb_vis_params = {"bands":["B4","B3","B2"],"min":0,"max":0.4}
-
-NDWI_THRESHOLD = 0.3
-SMALL_SCALE = 30
-MEDIUM_SCALE = 120
-LARGE_SCALE = 500
-BUFFER_DIST = 500
-CLOUD_COVER_LIMIT = 90
-start_date = ee.Date('2019-01-01')
-end_date = ee.Date('2019-02-01')
-TEMPORAL_RESOLUTION = 16
-RESULTS_PER_ITER = 5
-
-AOI = reservoir.geometry().simplify(100).buffer(500)
-
-
-# s2_subset = s2.filterBounds(AOI).filterDate(start_date, end_date)
-
-##############################################
-##       Defining necessary functions       ##
-##############################################
-
-
-##########################
-## Dealing with Cloud   ##
-##########################
-
-def preprocess(im):
-    clipped = im   # clipping adds processing overhead, setting clipped = im
-    
-    # clipped = ee.Image(ee.Algorithms.If('BQA' in clipped.bandNames(), preprocess_image_mask(im), clipped.updateMask(ee.Image.constant(1))))
-    # Mask appropriate QA bits
-    QA = im.select(['QA_PIXEL'])
-    
-    cloudShadowBitMask = 1 << 3
-    cloudsBitMask = 1 << 4
-    
-    cloud = (QA.bitwiseAnd(cloudsBitMask).neq(0)).Or(QA.bitwiseAnd(cloudShadowBitMask).neq(0)).rename("cloud")
-    
-    clipped = clipped.updateMask(cloud.eq(0).select("cloud"))
-    
-    # SR scaling
-    clipped = clipped.select('SR_B.').multiply(0.0000275).add(-0.2)
-    clipped = clipped.addBands(cloud)
-    
-    clipped = clipped.set('system:time_start', im.get('system:time_start'))
-    clipped = clipped.set('system:time_end', im.get('system:time_end'))
-    # clipped = clipped.set('cloud_area', cloud_area)
-    
-    return clipped
-
-
-##########################################################/
-## Processing individual images - water classification   ##
-##########################################################/
-
-def identify_water_cluster(im):
-    im = ee.Image(im)
-    mbwi = im.select('MBWI')
-
-    max_cluster_value = ee.Number(im.select('cluster').reduceRegion(
-        reducer = ee.Reducer.max(),
-        geometry = AOI,
-        scale = LARGE_SCALE,
-        maxPixels =  1e10
-    ).get('cluster'))
-
-    clusters = ee.List.sequence(0, max_cluster_value)
-
-    def calc_avg_mbwi(cluster_val):
-        cluster_val = ee.Number(cluster_val)
-        avg_mbwi = mbwi.updateMask(im.select('cluster').eq(ee.Image(cluster_val))).reduceRegion(
-            reducer = ee.Reducer.mean(),
-            scale = MEDIUM_SCALE,
-            geometry = AOI,
-            maxPixels = 1e10
-        ).get('MBWI')
-        return avg_mbwi
-
-    avg_mbwis = ee.Array(clusters.map(calc_avg_mbwi))
-
-    max_mbwi_index = avg_mbwis.argmax().get(0)
-
-    water_cluster = clusters.get(max_mbwi_index)
-
-    return water_cluster
-
-
-def cordeiro(im):
-    band_subset = ee.List(['NDWI', 'MNDWI', 'SR_B7'])   # using NDWI, MNDWI and B7 (SWIR)
-    sampled_pts = im.select(band_subset).sample(
-        region = AOI,
-        scale = SMALL_SCALE,
-        numPixels = 5e3-1  ## limit of 5k points
-    )
-    
-    ## Agglomerative Clustering isn't available, using Cascade K-Means Clustering based on
-    ##  calinski harabasz's work
-    ## https:##developers.google.com/earth-engine/apidocs/ee-clusterer-wekacascadekmeans
-    clusterer = ee.Clusterer.wekaCascadeKMeans(
-        minClusters = 2,
-        maxClusters = 7,
-        init = True
-    ).train(sampled_pts)
-    
-    classified = im.select(band_subset).cluster(clusterer)
-    im = im.addBands(classified)
-    
-    water_cluster = identify_water_cluster(im)
-    water_map = classified.select('cluster').eq(ee.Image.constant(water_cluster)).select(['cluster'], ['water_map_cordeiro'])
-    im = im.addBands(water_map)
-
-    return im
-
-
-def process_image(im):
-    ## FOR SENTINEL-2
-    # im = im.select(['B3', 'B12', 'B2', 'B4', 'B8', 'B11', 'cloud'])
-    ndwi = im.normalizedDifference(['SR_B5', 'SR_B6']).rename('NDWI')
-    im = im.addBands(ndwi)
-    mndwi = im.normalizedDifference(['SR_B3', 'SR_B6']).rename('MNDWI')
-    im = im.addBands(mndwi)
-    mbwi = im.expression("MBWI = 3*SR_B3-SR_B4-SR_B5-SR_B6-SR_B7", {
-        'SR_B3': im.select('SR_B3'),
-        'SR_B4': im.select('SR_B4'),
-        'SR_B5': im.select('SR_B5'),
-        'SR_B6': im.select('SR_B6'),
-        'SR_B7': im.select('SR_B7')
-    })
-    im = im.addBands(mbwi)
-
-    cloud_area = AOI.area().subtract(im.select('cloud').Not().multiply(ee.Image.pixelArea()).reduceRegion(
-        reducer = ee.Reducer.sum(),
-        geometry = AOI,
-        scale = SMALL_SCALE,
-        maxPixels = 1e10
-    ).get('cloud'))
-    cloud_percent = cloud_area.multiply(100).divide(AOI.area())
-    
-    cordeiro_will_run_when = cloud_percent.lt(CLOUD_COVER_LIMIT)
-
-    # Clusting based
-    im = im.addBands(ee.Image(ee.Algorithms.If(cordeiro_will_run_when, cordeiro(im), ee.Image.constant(-1e6))))  # run cordeiro only if cloud percent is < 90%
-
-    water_area_cordeiro = ee.Number(ee.Algorithms.If(cordeiro_will_run_when,
-        ee.Number(im.select('water_map_cordeiro').eq(1).multiply(ee.Image.pixelArea()).reduceRegion(
-            reducer = ee.Reducer.sum(), 
-            geometry = AOI, 
-            scale = SMALL_SCALE, 
-            maxPixels = 1e10
-        ).get('water_map_cordeiro')),
-        ee.Number(-1e6)
-    ))
-    non_water_area_cordeiro = ee.Number(ee.Algorithms.If(cordeiro_will_run_when,
-        ee.Number(im.select('water_map_cordeiro').neq(1).multiply(ee.Image.pixelArea()).reduceRegion(
-            reducer = ee.Reducer.sum(), 
-            geometry = AOI, 
-            scale = SMALL_SCALE, 
-            maxPixels = 1e10
-        ).get('water_map_cordeiro')),
-        ee.Number(-1e6)
-    ))
-
-    # NDWI based
-    im = im.addBands(ndwi.gte(NDWI_THRESHOLD).select(['NDWI'], ['water_map_NDWI']))
-    water_area_NDWI = ee.Number(im.select('water_map_NDWI').eq(1).multiply(ee.Image.pixelArea()).reduceRegion(
-        reducer = ee.Reducer.sum(), 
-        geometry = AOI, 
-        scale = SMALL_SCALE, 
-        maxPixels = 1e10
-    ).get('water_map_NDWI'))
-    non_water_area_NDWI = ee.Number(im.select('water_map_NDWI').neq(1).multiply(ee.Image.pixelArea()).reduceRegion(
-        reducer = ee.Reducer.sum(), 
-        geometry = AOI, 
-        scale = SMALL_SCALE, 
-        maxPixels = 1e10
-    ).get('water_map_NDWI'))
-    
-    im = im.set('cloud_area', cloud_area.multiply(1e-6))
-    im = im.set('cloud_percent', cloud_percent)
-    im = im.set('water_area_cordeiro', water_area_cordeiro.multiply(1e-6))
-    im = im.set('non_water_area_cordeiro', non_water_area_cordeiro.multiply(1e-6))
-    im = im.set('water_area_NDWI', water_area_NDWI.multiply(1e-6))
-    im = im.set('non_water_area_NDWI', non_water_area_NDWI.multiply(1e-6))
-    
-    return im
-
-
-def postprocess_wrapper(im, bandName, raw_area):
-    im = ee.Image(im)
-    bandName = ee.String(bandName)
-    date = im.get('to_date')
-
-    def postprocess():
-        gswd_masked = gswd.updateMask(im.select(bandName).eq(1))
-        
-        hist = ee.List(gswd_masked.reduceRegion(
-            reducer = ee.Reducer.autoHistogram(minBucketWidth = 1),
-            geometry = AOI,
-            scale = SMALL_SCALE,
-            maxPixels = 1e10
-        ).get('occurrence'))
-        
-        counts = ee.Array(hist).transpose().toList()
-        
-        omega = ee.Number(0.17)
-        count_thresh = ee.Number(counts.map(lambda lis: ee.List(lis).reduce(ee.Reducer.mean())).get(1)).multiply(omega)
-        
-        count_thresh_index = ee.Array(counts.get(1)).gt(count_thresh).toList().indexOf(1)
-        occurrence_thresh = ee.Number(ee.List(counts.get(0)).get(count_thresh_index))
-
-        water_map = im.select([bandName], ['water_map'])
-        gswd_improvement = gswd.clip(AOI).gte(occurrence_thresh).updateMask(water_map.mask().Not()).select(["occurrence"], ["water_map"])
-        
-        improved = ee.ImageCollection([water_map, gswd_improvement]).mosaic().select(['water_map'], ['water_map_zhao_gao'])
-        
-        corrected_area = ee.Number(improved.select('water_map_zhao_gao').multiply(ee.Image.pixelArea()).reduceRegion(
-            reducer = ee.Reducer.sum(), 
-            geometry = AOI, 
-            scale = SMALL_SCALE, 
-            maxPixels = 1e10
-        ).get('water_map_zhao_gao'))
-        
-        improved = improved.set("corrected_area", corrected_area.multiply(1e-6))
-        return improved
-
-    def dont_post_process():
-        improved = ee.Image.constant(-1)
-        improved = improved.set("corrected_area", -1)
-        return improved
-
-    condition = ee.Number(im.get('cloud_percent')).lt(CLOUD_COVER_LIMIT).And(ee.Number(raw_area).gt(0))
-    improved = ee.Image(ee.Algorithms.If(condition, postprocess(), dont_post_process()))
-    
-    improved = improved.set("to_date", date)
-    
-    return improved
-
-
-############################################################/
-## Code from here takes care of the time-series generation   ##
-############################################################/
-def calc_ndwi(im):
-    return im.addBands(im.normalizedDifference(['SR_B5', 'SR_B6']).rename('NDWI'))
-
-def process_date(date):
-    date = ee.Date(date)
-    from_date = date
-    to_date = date.advance(TEMPORAL_RESOLUTION - 1, 'day')
-    l8_subset = l8.filterDate(from_date, to_date).filterBounds(AOI).map(preprocess)
-
-    # im = ee.Image(ee.Algorithms.If(s2_subset.size().neq(0), s2_subset.map(process_image).qualityMosaic('NDWI'), ee.Image.constant(0)))
-    im = ee.Image(ee.Algorithms.If(l8_subset.size().neq(0), l8_subset.map(calc_ndwi).qualityMosaic('NDWI'), ee.Image.constant(0)))
-    
-    im = ee.Image(ee.Algorithms.If(l8_subset.size().neq(0), process_image(im), ee.Image.constant(0)))
-
-    ## im = ee.Algorithms.If(im.bandNames process_image(im))
-    im = im.set('from_date', from_date.format("YYYY-MM-dd"))
-    im = im.set('to_date', to_date.format("YYYY-MM-dd"))
-    im = im.set('l8_images', l8_subset.size())
-    
-    # im = ee.Algorithms.If(im.bandNames().size().eq(1), ee.Number(0), im)
-    
-    return ee.Image(im)
-
-
-def generate_timeseries(dates):
-    raw_ts = dates.map(process_date)
-    # raw_ts = raw_ts.removeAll([0])
-    imcoll = ee.ImageCollection.fromImages(raw_ts)
-
-    return imcoll
-
-def get_first_obs(start_date, end_date):
-    first_im = l8.filterBounds(AOI).filterDate(start_date, end_date).first()
-    str_fmt = 'YYYY-MM-dd'
-    return ee.Date.parse(str_fmt, ee.Date(first_im.get('system:time_start')).format(str_fmt))
-
-def run_process_long(res_name, start, end, datadir):
-    fo = start
-    enddate = end
-
-    reservoir = ee.FeatureCollection(reservoir_geom_prefix + res_name)
-    
-    fo = get_first_obs(start, end).format('YYYY-MM-dd').getInfo()
-    first_obs = datetime.strptime(fo, '%Y-%m-%d')
-
-    global AOI
-    AOI = reservoir.geometry().buffer(BUFFER_DIST)
-
-    scratchdir = os.path.join(datadir, "_scratch")
-
-    # flag = True
-    num_runs = 0
-
-    # If data already exists, only get new data starting from the last one
-    savepath = os.path.join(datadir, f"{res_name}.csv")
-    
-    if os.path.isfile(savepath):
-        temp_df = pd.read_csv(savepath, parse_dates=['mosaic_enddate']).set_index('mosaic_enddate')
-
-        last_date = temp_df.index[-1].to_pydatetime()
-        fo = (last_date - timedelta(days=TEMPORAL_RESOLUTION*2)).strftime("%Y-%m-%d")
-        to_combine = [savepath]
-        print(f"Existing file found - Last observation ({TEMPORAL_RESOLUTION*2} day lag): {last_date}")
-
-        # If 16 days have not passed since last observation, skip the processing
-        days_passed = (datetime.strptime(end, "%Y-%m-%d") - last_date).days
-        print(f"No. of days passed since: {days_passed}")
-        if days_passed < TEMPORAL_RESOLUTION:
-            print(f"No new observation expected. Quitting early")
-            return None
-    else:
-        to_combine = []
-    
-    savedir = os.path.join(scratchdir, f"{res_name}_l8_cordeiro_zhao_gao_{fo}_{enddate}")
-    if not os.path.isdir(savedir):
-        os.makedirs(savedir)
-    
-    print(f"Extracting SA for the period {fo} -> {enddate}")
-
-    dates = pd.date_range(fo, enddate, freq=f'{TEMPORAL_RESOLUTION}D')
-    grouped_dates = grouper(dates, RESULTS_PER_ITER)
-
-    # # redo the calculations part and see where it is complaining about too many aggregations
-    # subset_dates = next(grouped_dates)
-    # dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
-
-    # print(subset_dates)
-    # res = generate_timeseries(dates).filterMetadata('s2_images', 'greater_than', 0)
-    # pprint.pprint(res.aggregate_array('s2_images').getInfo())
-
-    # uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'water_area_NDWI', 'non_water_area_NDWI', 'cloud_area', 's2_images']
-    # uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
-    # uncorrected_final_data = uncorrected_final_data_ee.getInfo()
-    
-
-    for subset_dates in grouped_dates:
-        try:
-            print(subset_dates)
-            dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
-            
-            res = generate_timeseries(dates).filterMetadata('l8_images', 'greater_than', 0)
-            # pprint.pprint(res.getInfo())
-
-            uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'cloud_area', 'l8_images']
-            uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
-            uncorrected_final_data = uncorrected_final_data_ee.getInfo()
-            print("Uncorrected", uncorrected_final_data)
-
-            res_corrected_cordeiro = res.map(lambda im: postprocess_wrapper(im, 'water_map_cordeiro', im.get('water_area_cordeiro')))
-            corrected_columns_to_extract = ['to_date', 'corrected_area']
-            corrected_final_data_cordeiro_ee = res_corrected_cordeiro \
-                                                .filterMetadata('corrected_area', 'not_equals', None) \
-                                                .reduceColumns(
-                                                    ee.Reducer.toList(
-                                                        len(corrected_columns_to_extract)), 
-                                                        corrected_columns_to_extract
-                                                        ).get('list')
-            corrected_final_data_cordeiro = corrected_final_data_cordeiro_ee.getInfo()
-            print("Corrected - Cordeiro", corrected_final_data_cordeiro)
-
-            # res_corrected_NDWI = res.map(lambda im: postprocess_wrapper(im, 'water_map_NDWI', im.get('water_area_NDWI')))
-            # corrected_final_data_NDWI_ee = res_corrected_NDWI \
-            #                                     .filterMetadata('corrected_area', 'not_equals', None) \
-            #                                     .reduceColumns(
-            #                                         ee.Reducer.toList(
-            #                                             len(corrected_columns_to_extract)), 
-            #                                             corrected_columns_to_extract
-            #                                             ).get('list')
-            
-            # corrected_final_data_NDWI = corrected_final_data_NDWI_ee.getInfo()
-            
-            # print(uncorrected_final_data, corrected_final_data_cordeiro)
-            if len(uncorrected_final_data) == 0:
-                continue
-            uncorrected_df = pd.DataFrame(uncorrected_final_data, columns=uncorrected_columns_to_extract)
-            corrected_cordeiro_df = pd.DataFrame(corrected_final_data_cordeiro, columns=corrected_columns_to_extract).rename({'corrected_area': 'corrected_area_cordeiro'}, axis=1)
-            # corrected_NDWI_df = pd.DataFrame(corrected_final_data_NDWI, columns=corrected_columns_to_extract).rename({'corrected_area': 'corrected_area_NDWI'}, axis=1)
-            # corrected_df = pd.merge(corrected_cordeiro_df, corrected_NDWI_df, 'left', 'to_date')
-            df = pd.merge(uncorrected_df, corrected_cordeiro_df, 'left', 'to_date')
-
-            df['from_date'] = pd.to_datetime(df['from_date'], format="%Y-%m-%d")
-            df['to_date'] = pd.to_datetime(df['to_date'], format="%Y-%m-%d")
-            df['mosaic_enddate'] = df['to_date'] - pd.Timedelta(1, unit='day')
-            df = df.set_index('mosaic_enddate')
-            print(df.head(2))
-
-            fname = os.path.join(savedir, f"{df.index[0].strftime('%Y%m%d')}_{df.index[-1].strftime('%Y%m%d')}_{res_name}.csv")
-            df.to_csv(fname)
-
-            s_time = randint(20, 30)
-            print(f"Sleeping for {s_time} seconds")
-            time.sleep(randint(20, 30))
-
-            if (datetime.strptime(enddate, "%Y-%m-%d")-df.index[-1]).days < TEMPORAL_RESOLUTION:
-                print(f"Quitting: Reached enddate {enddate}")
-                break
-            elif df.index[-1].strftime('%Y-%m-%d') == fo:
-                print(f"Reached last available observation - {fo}")
-                break
-            elif num_runs > 1000:
-                print("Quitting: Reached 1000 iterations")
-                break
-        except Exception as e:
-            log.error(e)
-            continue
-
-
-    # Combine the files into one database
-    to_combine.extend([os.path.join(savedir, f) for f in os.listdir(savedir) if f.endswith(".csv")])
-
-    files = [pd.read_csv(f, parse_dates=["mosaic_enddate"]).set_index("mosaic_enddate") for f in to_combine]
-    data = pd.concat(files).drop_duplicates().sort_values("mosaic_enddate")
-
-    data.to_csv(savepath)
-
-    return savepath
-
-# User-facing wrapper function
-def sarea_l8(reservoir, start, end, datadir):
-    return run_process_long(reservoir, start, end, datadir)
-
-def main():
-    # Setup argument parser
-    parser = argparse.ArgumentParser(description="Generate Reservoir Surface area time series")
-
-    parser.add_argument("reservoir")
-    parser.add_argument("start_date")
-    parser.add_argument("end_date")
-
-    args = parser.parse_args()
-
-    reservoir = args.reservoir
-    start = args.start_date
-    end = args.end_date
-
-    # print(f"{reservoir = }, {start = }, {end = }")
-    run_process_long(reservoir, start, end, "data/l8")
-
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/data_processing/GFS_Download.py b/backend/scripts/data_processing/GFS_Download.py
deleted file mode 100644
index 2fcd17f9..00000000
--- a/backend/scripts/data_processing/GFS_Download.py
+++ /dev/null
@@ -1,357 +0,0 @@
-import argparse
-from email import parser
-from multiprocessing import process
-import pandas as pd
-from datetime import datetime
-import numpy as np
-from tempfile import TemporaryDirectory
-import os
-import subprocess
-import xarray as xr
-import sys
-import shutil
-from data_processing.newdata import run_command
-from data_processing.metsim_input_processing import ForcingsNCfmt
-from collections import OrderedDict
-
-
-
-def aggregate_ncs(ncs, fn, var=None):
-    """Will return a single dataset same as ncs[0] with the underlying values being equal to the result of the `fn` aggregation function
-
-    Args:
-        ncs (list[DataArray/DataSet]): List of datarrays or datasets to aggregate. If a dataset is passed, `var` must be passed
-        fn (function): Aggregation function
-        var (str): Variable name 
-    """
-    if isinstance(ncs[0], xr.Dataset):
-        ncs_dataarrays = [nc[var] for nc in ncs]
-    else:
-        ncs_dataarrays = ncs
-    
-    res = ncs_dataarrays[0].copy()
-
-    res.values = fn([nc.values for nc in ncs_dataarrays], axis=0)
-
-    return res
-
-
-def extract_gribs(fps, datadir):
-    fps = fps['fp']
-    filepaths = fps.values
-    
-    varnames = {
-        "tmax": "TMAX_P8_L103_GLL0_max6h",
-        "tmin": "TMIN_P8_L103_GLL0_min6h",
-        "precip": "PRATE_P0_L1_GLL0",
-        "uwnd": "UGRD_P0_L103_GLL0,lv_HTGL2",
-        "vwnd": "VGRD_P0_L103_GLL0,lv_HTGL2"
-    }
-    extracted_dir = {
-        "tmax": os.path.join(datadir, f"extracted/tmax"),
-        "tmin": os.path.join(datadir, f"extracted/tmin"),
-        "precip": os.path.join(datadir, f"extracted/precipitation"),
-        "uwnd": os.path.join(datadir, f"extracted/uwnd"),
-        "vwnd": os.path.join(datadir, f"extracted/vwnd")
-    }
-
-    extraction = {
-        "precip": lambda ds: (ds['PRATE_P0_L1_GLL0']*24*60*60).rename('precip').rename({'lat_0': 'lat', 'lon_0': 'lon'}),
-        "tmax": lambda ds: (ds['TMAX_P8_L103_GLL0_max6h']-273.15).rename('tmax').rename({'lat_0': 'lat', 'lon_0': 'lon'}),
-        "tmin": lambda ds: (ds['TMIN_P8_L103_GLL0_min6h']-273.15).rename('tmin').rename({'lat_0': 'lat', 'lon_0': 'lon'}),
-        "uwnd": lambda ds: ds['UGRD_P0_L103_GLL0'].sel(lv_HTGL2=10).rename('uwnd').rename({'lat_0': 'lat', 'lon_0': 'lon'}),
-        "vwnd": lambda ds: ds['VGRD_P0_L103_GLL0'].sel(lv_HTGL2=10).rename('vwnd').rename({'lat_0': 'lat', 'lon_0': 'lon'}),
-    }
-    
-    extracted_fps = {
-        "tmax": [],
-        "tmin": [],
-        "precip": [],
-        "uwnd": [],
-        "vwnd": []
-    }
-
-    for fn in filepaths:
-        date = pd.to_datetime(fn.split('_')[-2].split('.')[0], format='%Y%m%d')
-        hour = fn.split('_')[-1].split('.')[0]
-        name = date.strftime('%Y%m%d')
-        for var in varnames.keys():
-            nc_var = varnames[var]
-            arg = ["ncl_convert2nc", fn, '-v', nc_var]
-
-            savedir = extracted_dir[var]
-            if not os.path.isdir(savedir):
-                os.makedirs(savedir)
-
-            # (0) Convert from GRIB to NC uncleanly
-            res = subprocess.run(arg, cwd=savedir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-            print(f"{name} ({hour} hours) - {var} - (0) Converted GRIB file to NC")
-            extracted_nc_fn = os.path.join(savedir, fn.split(os.sep)[-1].replace('grib2', 'nc'))
-
-            # (1) Read in with xarray and only save the bare minimum
-            ds = xr.open_dataset(extracted_nc_fn, engine="netcdf4")
-            modified = extraction[var](ds)
-            ds.close()
-
-            savep = os.path.join(savedir, f"{name}_{hour}") + '.nc'
-            modified.to_netcdf(savep)
-            print(f"{name} ({hour} hours) - {var} - (1) Subsetted nc file")
-            # if os.path.isfile(extracted_nc_fn):
-            #     os.remove(extracted_nc_fn)
-            extracted_fps[var].append(savep)
-
-    # Now that all the GRIB2 files have been converted to NC files, we'll have to combine them
-    save_dirs = {
-        "tmax": os.path.join(datadir, f"raw/tmax"),
-        "tmin": os.path.join(datadir, f"raw/tmin"),
-        "precip": os.path.join(datadir, f"raw/precipitation"),
-        "uwnd": os.path.join(datadir, f"raw/uwnd"),
-        "vwnd": os.path.join(datadir, f"raw/vwnd")
-    }
-    agg_func = {
-        "tmax": np.max,
-        "tmin": np.min,
-        "precip": np.mean,
-        "uwnd": np.mean,
-        "vwnd": np.mean
-    }
-    save_paths = {
-        "tmax": None,
-        "tmin": None,
-        "precip": None,
-        "uwnd": None,
-        "vwnd": None
-    }
-
-    for var in ['tmax', 'tmin', 'precip', 'uwnd', 'vwnd']:
-        extracted_ncs = extracted_fps[var]
-
-        print(f"Merging: {var}")
-
-        datasets = []
-        times = []
-        for extracted_nc in extracted_ncs:
-            datasets.append(xr.open_dataset(extracted_nc))
-            times.append(pd.to_datetime(extracted_nc.split(os.sep)[-1].split('.')[0], format='%Y%m%d_%H'))
-
-        merged = aggregate_ncs(datasets, agg_func[var], var)
-        # time_index = pd.DatetimeIndex(times, name='time')
-
-        # merged = xr.concat(datasets, time_index)
-        # merged = merged.apply(agg_func[var], axis=2)
-
-        if not os.path.isdir(save_dirs[var]):
-            os.makedirs(save_dirs[var])
-        savep = os.path.join(save_dirs[var], times[0].strftime("%Y%m%d") + ".nc")
-        save_paths[var] = savep
-        merged.to_netcdf(savep)
-
-    return pd.Series(save_paths)
-
-
-def process_GFS_file(fn, datadir):
-    date = pd.to_datetime(fn.split(os.sep)[-1].split('.')[0], format='%Y%m%d')
-    name = date.strftime('%Y%m%d')
-    var = fn.split(os.sep)[-2]
-    if var == 'precipitation':
-        var = 'precip'    # :) quick and easy way patch
-
-    # folder structure
-    # raw_savedirs = {
-    #     "tmax": os.path.join(datadir, f"raw/tmax"),
-    #     "tmin": os.path.join(datadir, f"raw/tmin"),
-    #     "precip": os.path.join(datadir, f"raw/precipitation"),
-    #     "uwnd": os.path.join(datadir, f"raw/uwnd"),
-    #     "vwnd": os.path.join(datadir, f"raw/vwnd")
-    # }
-    
-    processed_savedirs = {
-        "tmax": os.path.join(datadir, f"processed/tmax"),
-        "tmin": os.path.join(datadir, f"processed/tmin"),
-        "precip": os.path.join(datadir, f"processed/precipitation"),
-        "uwnd": os.path.join(datadir, f"processed/uwnd"),
-        "vwnd": os.path.join(datadir, f"processed/vwnd")
-    }
-
-    suffix = {
-        "tmax": f"_TMAX",
-        "tmin": f"_TMIN",
-        "precip": f"_IMERG",
-        "uwnd": f"_UWND",
-        "vwnd": f"_VWND"
-    }
-
-    out_paths = {
-        "tmax": None,
-        "tmin": None,
-        "precip": None,
-        "uwnd": None,
-        "vwnd": None
-    }
-
-    # (2) Convert to GTiff
-    in_fn = fn
-    out_fn = fn.replace('.nc', '_converted_1.tif')
-    cmd = ['gdal_translate', '-of', 'Gtiff', '-a_ullr', "0", "90", "360", "-90", in_fn, out_fn]
-    res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    print(f"{name} - {var} - (2) Converted to Geotiff")
-
-    # (3)Change scale and clip
-    in_fn = out_fn
-    out_fn = in_fn.replace('_converted_1.tif', '_clipped_2.tif')
-    cmd = ['gdalwarp', '-dstnodata', '-9999.0', '-tr', '0.0625', '0.0625', '-te', "93.875", "9.5625", "108.6875", "33.8125", "-of", "GTiff", "-overwrite", in_fn, out_fn]
-    res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    print(f"{name} - {var} - (3) Scaled and clipped")
-
-    # (4) Change format to AAIgrid
-    in_fn = out_fn
-    # outdir = os.path.join(datadir, f'processed/{var}')
-    outdir = processed_savedirs[var]
-    if not os.path.isdir(outdir):
-        os.makedirs(outdir)
-    # out_fn = os.path.join(outdir, fn.split('_')[-1].split('.')[0] + suffix[var] + '.asc')
-    out_fn = os.path.join(outdir, date.strftime('%Y-%m-%d') + suffix[var] + '.asc')
-    cmd = ['gdal_translate','-of', 'aaigrid', in_fn, out_fn]
-    res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    print(f"{name} - {var} - (4) Converted to .asc")
-
-    # # (5) Create wind
-    # vwnd_fn = os.path.join(datadir, f"raw/vwnd/{fn.split('_')[-1].split('.')[0]}_clipped_2.tif")
-    # uwnd_fn = os.path.join(datadir, f"raw/uwnd/{fn.split('_')[-1].split('.')[0]}_clipped_2.tif")
-    # outdir = os.path.join(datadir,f"raw/wind" )
-    # if not os.path.isdir(outdir):
-    #     os.makedirs(outdir)
-    # outpath = os.path.join(outdir, f"{fn.split('_')[-1].split('.')[0]}.tif")
-    # cmd = ["gdal_calc.py", "-A", uwnd_fn, "-B", vwnd_fn, f"--calc=\"numpy.sqrt(numpy.power(A, 2) + numpy.power(B, 2))\"", '--overwrite', f"--outfile={outpath}", "--NoDataValue=-9999", "--format=GTiff"]
-    # res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    # print(f"{name} - wind - (5) Created wind file")
-
-    # # (4) Change format of wind to AAIgrid
-    # in_fn = outpath
-    # outdir = os.path.join(datadir, f'processed/wind')
-    # if not os.path.isdir(outdir):
-    #     os.makedirs(outdir)
-    # out_fn = os.path.join(outdir, date.strftime('%Y-%m-%d') + suffix[var] +'.asc')
-    # cmd = ['gdal_translate','-of', 'aaigrid', in_fn, out_fn]
-    # res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    # print(f"{name} - wind - (6) Converted wind file to .asc")
-
-
-def process_GFS_files(fns, datadir):
-    """Extracts only the required meteorological variables and converts from GRIB2 format to netcdf
-
-    Args:
-        fns (string): Path of GRIB2 GFS file
-    """
-    download_dir = fns[0].split(os.sep)[0]
-    base_date = pd.to_datetime(fns[0].split(os.sep)[-1].split('_')[0], format="%Y%m%d")
-    forecasted_dates = [pd.to_datetime("_".join(fn.split(os.sep)[-1].split('.')[0].split('_')[1:]), format="%Y%m%d_%H") for fn in fns]
-    processing_df_6h = pd.DataFrame({
-        'fp': fns,
-        'time': forecasted_dates
-    }).set_index('time')
-
-    # Extract these files and combine into a single nc file for the day
-    # processing_df_6h[['precip', 'tmin', 'tmax', 'uwnd', 'vwnd']] = processing_df_6h.resample('1D').agg(lambda grouped: extract_gribs(grouped, datadir), )
-    processing_df_1d = processing_df_6h.groupby(pd.Grouper(freq='1D')).apply(lambda grouped: extract_gribs(grouped, datadir))
-
-    print(processing_df_1d)
-
-    for idx, row in processing_df_1d.iterrows():
-        process_GFS_file(row['tmax'], datadir)
-        process_GFS_file(row['tmin'], datadir)
-        process_GFS_file(row['uwnd'], datadir)
-        process_GFS_file(row['vwnd'], datadir)
-        process_GFS_file(row['precip'], datadir)
-
-
-
-def download_GFS_files(links, savefns, wget_path='/usr/bin/wget'):
-    # Using parallel subprocesses
-    processes = []
-    logs = []
-    for link, savefn in zip(links, savefns):
-        log_fn = f"{savefn}.log"
-        print(f"Downloading {savefn}")
-        p = subprocess.Popen([wget_path, link, "-O", savefn, '-o', log_fn], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
-        processes.append((p, savefn))
-        # logs.append(log_fn)
-    
-    for p, savefn in processes:
-        p.wait()
-        print(f"Downloaded {savefn}")
-
-
-def combine_processed(start, end, processed_dir, basin_grid, savefn):
-    ForcingsNCfmt(
-        start,
-        end,
-        processed_dir,
-        basin_grid,
-        savefn
-    )
-    return savefn
-
-
-def get_forecast(start_date, basin_file_fn, data_dir='./data', savedir="./data/forecast", lead_time=15):
-    """Downloads, processes and combines forecast data from GFS
-
-    Args:
-        start_date (string): Start date for data download in %Y-%m-%d format. Usually today's date 
-            will be `today`.
-        data_dir (string, default: ./data): Path of directory that'll be used to store the data. Temporary 
-            directories will be created in this directory while processing. 
-        lead_time (int, default: 15): Number of days in the future to download data for. Max: 16
-    """
-    assert lead_time <= 16, f"Maximum possible lead time is 16 days, and {lead_time} was passed"
-    fmt = '%Y-%m-%d'
-    aws_fmt = '%Y%m%d'
-    date = pd.to_datetime(start_date, format=fmt)
-
-    aws_date_str = date.strftime(aws_fmt)
-    hours = np.arange(12, 24*lead_time, 6)
-    dates = np.array([date + pd.DateOffset(hours=int(h)) for h in hours])
-
-    # with TemporaryDirectory(dir=data_dir, delete=False) as td:
-    td = "/houston2/pritam/rat_mekong_v3/extras/2022_04_12-forecasting/data/temp_dir_mock"
-    if isinstance(td, TemporaryDirectory):
-        td_name = td.name
-    else:
-        td_name = td
-
-    # links = [f"https://noaa-gfs-bdp-pds.s3.amazonaws.com/gfs.{aws_date_str}/00/atmos/gfs.t00z.pgrb2.0p25.f{h:03}" for h in hours]
-    links = [f"https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=gfs.t00z.pgrb2.0p25.f{h:03}&all_lev=on&lev_10_m_above_ground=on&lev_2_m_above_ground=on&lev_surface=on&var_PRATE=on&var_TMAX=on&var_TMIN=on&var_UGRD=on&var_VGRD=on&dir=%2Fgfs.20220418%2F00%2Fatmos" for h in hours]
-    if not os.path.isdir(os.path.join(td_name, 'downloaded')):
-        os.makedirs(os.path.join(td, 'downloaded'))
-    raw_savefns = [f"{os.path.join(td_name, 'downloaded', aws_date_str)}_{d.strftime('%Y%m%d_%H')}.grib2" for d in dates]
-
-    # # download
-    # download_GFS_files(links, raw_savefns)
-
-    # # process
-    # process_GFS_files(raw_savefns, td)
-
-    # combine and save
-    savep = os.path.join(savedir, date.strftime(fmt) + '.nc')
-    if not os.path.isdir(savedir):
-        os.makedirs(savedir)
-    start = pd.to_datetime(dates[0].strftime('%Y%m%d'), format='%Y%m%d')
-    end = pd.to_datetime(dates[-1].strftime('%Y%m%d'), format='%Y%m%d')
-    print(f"Combining data - {savep} from {start} to {end}")
-    combine_processed(start, end, os.path.join(td_name, 'processed'), basin_file_fn, savep)
-
-
-def main():
-    parser = argparse.ArgumentParser(description='Download and process forecasted meteorological variables from GFS')
-    parser.add_argument('start_date', type=str, help='Start date for data download in YYYY-MM-DD format. Usually today\'s date')
-    parser.add_argument('basin_grid', type=str, help='Path of the basin\'s grid file. It is the "mask" file, a raster containing the mask of the basin')
-    parser.add_argument('--lead_time', type=int, default=15, help='Number of days in the future to download data for. Default: 15 days, Max: 16 days')
-    parser.add_argument('--data_dir', default='./data', help='Path of directory that\'ll be used to store the data. Temporary directories will be created in this directory while processing.')
-
-    args = parser.parse_args()
-
-    get_forecast(args.start_date, args.basin_grid, args.data_dir, os.path.join(args.data_dir, 'forecast'), args.lead_time)
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/data_processing/altimetry.py b/backend/scripts/data_processing/altimetry.py
deleted file mode 100644
index 07730538..00000000
--- a/backend/scripts/data_processing/altimetry.py
+++ /dev/null
@@ -1,793 +0,0 @@
-import geopandas as gpd
-from osgeo import gdal, ogr
-import matplotlib.pyplot as plt
-import numpy as np
-import pandas as pd
-from scipy.fft import fft
-from shapely.geometry.linestring import LineString
-import netCDF4 
-import os
-
-def get_j3_tracks(respath, trackspath):
-    """Returns a list of Jason-3 ground tracks and the min-max latitudes of intersection
-
-    Args:
-        respath (str): Path to the reservoir shapefile
-        trackspath (str): Path to the shapefile containing tracks; Should contains 'track' column 
-            containing the track numbers, and a geometry column containing linestrings of the path
-    
-    Returns:
-        (dict) if overlapping tracks are found. 
-            {'tracks': (list) of tracks that overlap with reservoir
-             'lat_range': (list) of (tuples) of minimum and maximum latitudes for each track}
-        (None) if no overlapping tracks are found
-    """
-    gdf = gpd.read_file(trackspath, driver='GeoJSON')
-    res = gpd.read_file(respath)
-
-    resname = respath.split(os.sep)[-1].split('.')[0]
-    res_geom = res['geometry'].unary_union
-
-
-    predetermined_tracks = {
-        'Lam_Pao': [179]
-    }
-    if resname in predetermined_tracks.keys():
-        tracks = predetermined_tracks[resname]
-    else:
-        tracks = gdf[gdf.intersects(res_geom)]['track'].unique()
-
-    minmax_lats = []
-
-    ranges = {
-        'Siridhorn': (14.88, 14.895),
-        '5796': (14.88, 14.895),
-        'Lam_Pao': (16.912, 16.918)
-    }
-
-    if resname in ranges.keys():
-        minmax_lats.append(ranges[resname])
-    else:
-        for track in tracks:
-            track_geom = gdf[gdf['track']==track]#.geometry
-            intersect = gpd.clip(track_geom, res)
-            minx, miny, maxx, maxy = intersect.geometry.unary_union.bounds
-
-            minmax_lats.append((miny, maxy))
-    
-    if len(tracks) == 0:
-        return_data = None
-    else:
-        return_data = {'tracks': tracks, 'lat_range' : minmax_lats}
-    
-    return return_data
-
-
-import netCDF4
-import zipfile
-import os
-import os, sys
-import os.path
-import numpy as np
-import pandas as pd
-from netCDF4 import Dataset
-from datetime import datetime
-from ftplib import FTP
-from tqdm import tqdm
-import glob
-import time
-from numpy import empty
-from numpy import loadtxt
-import math
-import statistics
-from scipy import io
-from scipy import stats
-from scipy import interpolate
-from scipy.cluster.vq import kmeans2
-import matplotlib.pyplot as plt
-from sklearn.cluster import KMeans
-from tqdm import tqdm
-
-import configparser
-from datetime import timedelta, datetime
-
-
-def _get_suffix():
-    return datetime.today().strftime("%Y%m%d_%H_%M_%S")
-
-
-def _convert_partial_year(number):
-    is_leap = lambda y: True if y % 400 == 0 else False if y % 100 == 0 else True if y % 4 == 0 else False
-
-    year = int(number)
-    d = timedelta(days=(number - year)*(365 + is_leap(year)))
-    day_one = datetime(year,1,1)
-    date = d + day_one
-    return date
-
-
-def download_data(username, password, savedir, passnum, startcycle, endcycle, series):
-    """Downloads Jason data
-
-    Args:
-        username (str): Username of the AVISO account that'll be used to download data
-        password (str): Password of the AVISO account that'll be used to download data
-        savedir (str): Directory where to save data
-        passnum (int): Which pass-number to download? - analogous to location/space
-        startcycle (int): Start of the cycle - analogous to start time of required data
-        endcycle (int): End of cycle - analogous to end time of required data
-        series (int): Which Jason series of data to download? (1, 2, 3)
-    """
-    username = username
-    PW = password
-    if series == 3:
-        # Jason3
-        if len(str(passnum)) == 1:
-            passnum2 = "00" + str(passnum)
-        elif len(str(passnum)) == 2:
-            passnum2 = "0" + str(passnum)
-        else:
-            passnum2 = str(passnum)
-
-        count = 0
-        for cycle in range(startcycle, endcycle + 1):
-            count = count + 1
-            if len(str(cycle)) == 1:
-                cycle2 = "00" + str(cycle)
-            elif len(str(cycle)) == 2:
-                cycle2 = "0" + str(cycle)
-            else:
-                cycle2 = str(cycle)
-
-            savepath = savedir + "/j%s_%s/gdr_f/cycle_%s/" % (
-                str(series),
-                str(passnum2),
-                str(cycle2),
-            )
-            try:
-                os.makedirs(os.path.dirname(savepath))
-            except FileExistsError:
-                print(f"Existing data found {os.path.dirname(savepath).split(os.sep)[-1]}; Skipping")
-                continue
-            os.chdir(savepath)
-
-            ftp = FTP("ftp-access.aviso.altimetry.fr")
-            ftp.login(user=str(username), passwd=str(PW))
-            ftp.cwd(
-                "geophysical-data-record/jason-%s/gdr_f/cycle_%s"
-                % (str(series), str(cycle2))
-            )
-
-            if cycle < 22:
-                fnbase = "JA%s_GPN_2PfP%s_%s_" % (
-                    str(series),
-                    str(cycle2),
-                    str(passnum2),
-                )
-            else:
-                fnbase = "JA%s_GPN_2PfP%s_%s_" % (
-                    str(series),
-                    str(cycle2),
-                    str(passnum2),
-                )
-            if cycle < 167:
-                filesineed = [filename for filename in ftp.nlst() if fnbase in filename]
-                for filename in filesineed:
-                    local_filename = os.path.join(os.getcwd(), filename)
-                    with open(local_filename, "wb") as f:
-                        ftp.retrbinary("RETR %s" % filename, f.write)
-                        print("cycle_%s downloaded" % (str(cycle2)))
-            else:
-                fnbase2 = "JA%s_GPN_2PfP%s_%s_" % (
-                    str(series),
-                    str(cycle2),
-                    str(passnum2),
-                )
-                filesineed2 = [
-                    filename2 for filename2 in ftp.nlst() if fnbase2 in filename2
-                ]
-                for filename2 in filesineed2:
-                    local_filename2 = os.path.join(os.getcwd(), filename2)
-                    with open(local_filename2, "wb") as f2:
-                        ftp.retrbinary("RETR %s" % filename2, f2.write)
-                        print("cycle_%s downloaded" % (str(cycle2)))
-    else:
-        if len(str(passnum)) == 1:
-            passnum3 = "00" + str(passnum)
-        elif len(str(passnum)) == 2:
-            passnum3 = "0" + str(passnum)
-        else:
-            passnum3 = str(passnum)
-
-        count = 0
-        for cycle in range(startcycle, endcycle + 1):
-            count = count + 1
-            if len(str(cycle)) == 1:
-                cycle3 = "00" + str(cycle)
-            elif len(str(cycle)) == 2:
-                cycle3 = "0" + str(cycle)
-            else:
-                cycle3 = str(cycle)
-
-            ftp = FTP("ftp-access.aviso.altimetry.fr")
-            ftp.login(user=str(username), passwd=str(PW))
-            ftp.cwd(
-                "geophysical-data-record/jason-%s/gdr_d/cycle_%s"
-                % (str(series), str(cycle3))
-            )
-            fnbase3 = "JA%s_GPN_2PdP%s_%s_" % (str(series), str(cycle3), str(passnum3))
-            savepath2 = savedir + "/j%s_%s/gdr_d/cycle_%s/" % (
-                str(series),
-                str(passnum3),
-                str(cycle3),
-            )
-            os.makedirs(os.path.dirname(savepath2))
-            os.chdir(savepath2)
-            filesineed3 = [
-                filename3 for filename3 in ftp.nlst() if fnbase3 in filename3
-            ]
-            for filename3 in filesineed3:
-                local_filename3 = os.path.join(os.getcwd(), filename3)
-                with open(local_filename3, "wb") as f3:
-                    ftp.retrbinary("RETR %s" % filename3, f3.write)
-                    print("cycle_%s downloaded" % (str(cycle3)))
-    print("Data Download complete")
-
-
-def extract_data(datadir, savedir, minlat, maxlat, passnum, series, suffix="auto"):
-    """Extract and process Jason data
-
-    Args:
-        datadir (str):  Directory of raw data
-        savedir (str):  Directory where to save processed data
-        minlat (float): minimum latitude of ROI
-        maxlat (float): maximum latitude of ROI
-        passnum (int):  pass number of data
-        series (int):   Which Jason series is the data from?
-        suffix (str, optional): Suffix of directory where data will be saved. If left at "auto", 
-                        the time of run will be used. Defaults to "auto".
-    """
-    directory = datadir
-    lat_range = [minlat, maxlat]
-    directory2 = "/%s/" % (directory)
-
-    if suffix == "auto":
-        suffix = _get_suffix()
-
-    wgs84_to_tp = 0.7
-
-    if len(str(passnum)) == 1:
-        passnum22 = "00" + str(passnum)
-    elif len(str(passnum)) == 2:
-        passnum22 = "0" + str(passnum)
-    else:
-        passnum22 = str(passnum)
-
-    filename = "j%s_gdr_p%s_%s_%s_%s_info" % (
-        str(series),
-        str(passnum22),
-        str(suffix),
-        str(minlat),
-        str(maxlat),
-    )
-    savepath11 = savedir + "/j%s_%s/extract_%s/" % (
-        str(series),
-        str(passnum22),
-        str(suffix),
-    )
-    os.makedirs(os.path.dirname(savepath11))
-    completename = os.path.join(savepath11, filename + ".txt")
-    text_file = open(completename, "w")
-
-    ##Scale Factors & FillValues & Read Data Record
-    if series == 3:
-        pattern = os.path.join(datadir, "gdr_f", "cycle_*", "*.nc")
-        allpath = glob.glob(pattern)
-        for fn in range(len(allpath)):
-            allpath1 = str(allpath[fn])
-            allpath11 = os.path.basename(allpath1)
-            data = netCDF4.Dataset(allpath1)
-            cycno2 = allpath11[12:15]
-            ###-- 1Hz record --
-            iono_corr_gim_ku_sc = 0.0001
-            iono_corr_gim_ku_FV = 32767 * iono_corr_gim_ku_sc
-            solid_earth_tide_sc = 0.0001
-            solid_earth_tide_FV = 32767 * solid_earth_tide_sc
-            pole_tide_sc = 0.0001
-            pole_tide_FV = 32767 * pole_tide_sc
-            ### -- 20Hz record --
-            alt_20hz_sc = 0.0001
-            alt_20hz_add = 1300000
-            alt_20hz_FV = 2147483647 * alt_20hz_sc + alt_20hz_add
-            lat_20hz_sc = 0.000001
-            lat_20hz_FV = 2147483647 * lat_20hz_sc
-            lon_20hz_sc = 0.000001
-            lon_20hz_FV = 2147483647 * lon_20hz_sc
-            model_dry_tropo_corr_sc = 0.0001
-            model_dry_tropo_corr_FV = 32767 * model_dry_tropo_corr_sc
-            model_wet_tropo_corr_sc = 0.0001
-            model_wet_tropo_corr_FV = 32767 * model_wet_tropo_corr_sc
-            ice_range_20hz_ku_sc = 0.0001
-            ice_range_20hz_ku_add = 1300000
-            ice_range_20hz_ku_FV = (
-                2147483647 * ice_range_20hz_ku_sc + ice_range_20hz_ku_add
-            )
-            ice_sig0_20hz_ku_sc = 0.01
-            ice_sig0_20hz_ku_FV = 32767 * ice_sig0_20hz_ku_sc
-            # percent = 100 * (fn + 1) / (len(allpath) + 1)
-            # print("%1.3f percent complete" % (percent))
-            ###-- 1Hz record --
-            alt_state_band_status_flag = (
-                data.groups["data_01"]
-                .groups["ku"]
-                .variables["alt_state_band_status_flag"][:]
-            )
-            iono_corr_gim_ku = (
-                data.groups["data_01"].groups["ku"].variables["iono_cor_gim"][:]
-            )  # *iono_corr_gim_ku_sc
-            solid_earth_tide = data.groups["data_01"].variables["solid_earth_tide"][
-                :
-            ]  # *solid_earth_tide_sc
-            pole_tide = data.groups["data_01"].variables["pole_tide"][
-                :
-            ]  # *pole_tide_sc
-
-            ### -- 20Hz record --
-            indx_20hzIn01hz = data.groups["data_20"].variables["index_1hz_measurement"][
-                :
-            ]
-            alt_20hz = data.groups["data_20"].variables["altitude"][
-                :
-            ]  # *alt_20hz_sc+alt_20hz_add
-            lat_20hz = data.groups["data_20"].variables["latitude"][:]  # *lat_20hz_sc
-            lon_20hz = data.groups["data_20"].variables["longitude"][:]  # *lon_20hz_sc
-            time_20hz = data.groups["data_20"].variables["time"][:]
-            model_dry_tropo_corr = data.groups["data_20"].variables[
-                "model_dry_tropo_cor_measurement_altitude"
-            ][
-                :
-            ]  # *model_dry_tropo_corr_sc
-            model_wet_tropo_corr = data.groups["data_20"].variables[
-                "model_wet_tropo_cor_measurement_altitude"
-            ][
-                :
-            ]  # *model_wet_tropo_corr_sc
-            ice_range_20hz_ku = (
-                data.groups["data_20"].groups["ku"].variables["range_ocog"][:]
-            )  # *ice_range_20hz_ku_sc+ice_range_20hz_ku_add
-            ice_sig0_20hz_ku = (
-                data.groups["data_20"].groups["ku"].variables["sig0_ocog"][:]
-            )  # *ice_sig0_20hz_ku_sc
-            ice_qual_flag_20hz_ku = (
-                data.groups["data_20"].groups["ku"].variables["ocog_qual"][:]
-            )
-
-            for p in range(len(alt_20hz)):
-                if lat_20hz[p] < lat_range[0] or lat_20hz[p] > lat_range[1]:
-                    continue
-                if model_dry_tropo_corr[p] == model_dry_tropo_corr_FV:
-                    dry_count = 1
-                else:
-                    dry_count = 0
-
-                if model_wet_tropo_corr[p] == model_wet_tropo_corr_FV:
-                    wet_count = 1
-                else:
-                    wet_count = 0
-
-                if iono_corr_gim_ku[indx_20hzIn01hz[p]] == iono_corr_gim_ku_FV:
-                    iono_count = 1
-                else:
-                    iono_count = 0
-
-                if solid_earth_tide[indx_20hzIn01hz[p]] == solid_earth_tide_FV:
-                    sTide_count = 1
-                else:
-                    sTide_count = 0
-
-                if pole_tide[indx_20hzIn01hz[p]] == pole_tide_FV:
-                    pTide_count = 1
-                else:
-                    pTide_count = 0
-
-                if alt_state_band_status_flag[indx_20hzIn01hz[p]] != 0:
-                    kFlag_count = 1
-                else:
-                    kFlag_count = 0
-
-                if lat_20hz[p] == lat_20hz_FV:
-                    lat_count = 1
-                else:
-                    lat_count = 0
-
-                if ice_qual_flag_20hz_ku[p] != 0:
-                    ice_count = 1
-                else:
-                    ice_count = 0
-
-                media_corr = (
-                    model_dry_tropo_corr[p]
-                    + model_wet_tropo_corr[p]
-                    + iono_corr_gim_ku[indx_20hzIn01hz[p]]
-                    + solid_earth_tide[indx_20hzIn01hz[p]]
-                    + pole_tide[indx_20hzIn01hz[p]]
-                )
-                mjd_20hz = time_20hz[p] * 1 / 86400 + 51544
-                icehgt_20hz = (
-                    alt_20hz[p] - (media_corr + ice_range_20hz_ku[p]) + wgs84_to_tp
-                )
-
-                Flags = (
-                    dry_count
-                    + wet_count
-                    + iono_count
-                    + sTide_count
-                    + pTide_count
-                    + kFlag_count
-                    + lat_count
-                    + ice_count
-                )
-                text_file.write(
-                    "%4s %4s %4s %4s %3s %4s %4s %4s %4s %4s %20.6f %20.6f %20.6f %20.6f %20.6f %10.3f\n"
-                    % (
-                        dry_count,
-                        wet_count,
-                        iono_count,
-                        sTide_count,
-                        pTide_count,
-                        kFlag_count,
-                        lat_count,
-                        ice_count,
-                        Flags,
-                        cycno2,
-                        mjd_20hz,
-                        lon_20hz[p],
-                        lat_20hz[p],
-                        icehgt_20hz,
-                        ice_sig0_20hz_ku[p],
-                        ice_qual_flag_20hz_ku[p],
-                    )
-                )
-
-    else:
-        allpath = glob.glob(savedir + directory2 + "gdr_d/" + "cycle_*" + "\\*.nc")
-        for fn in range(len(allpath)):
-            allpath1 = str(allpath[fn])
-            allpath11 = os.path.basename(allpath1)
-            cycno2 = allpath11[12:15]
-            data = netCDF4.Dataset(allpath1)
-            ### -- 20Hz record --
-            lat_20hz_sc = 0.000001
-            lat_20hz_FV = 2147483647 * lat_20hz_sc
-            lat_20hz = data.variables["lat_20hz"][:]
-            lon_20hz_sc = 0.000001
-            lon_20hz_FV = 2147483647 * lon_20hz_sc
-            lon_20hz = data.variables["lon_20hz"][:]
-            time_20hz = data.variables["time_20hz"][:]
-            time_20hz_FV = 1.8446744073709552e19
-            ice_range_20hz_ku_sc = 0.0001
-            ice_range_20hz_ku_add = 1300000
-            ice_range_20hz_ku_FV = (
-                2147483647 * ice_range_20hz_ku_sc + ice_range_20hz_ku_add
-            )
-            ice_range_20hz_ku = data.variables["ice_range_20hz_ku"][
-                :
-            ]  # *ice_range_20hz_ku_sc+ice_range_20hz_ku_add
-            ice_qual_flag_20hz_ku = data.variables["ice_qual_flag_20hz_ku"][:]
-            ice_qual_flag_20hz_ku_FV = 127
-            ice_sig0_20hz_ku_sc = 0.01
-            ice_sig0_20hz_ku_FV = 32767 * ice_sig0_20hz_ku_sc
-            ice_sig0_20hz_ku = data.variables["ice_sig0_20hz_ku"][:]
-            alt_20hz_sc = 0.0001
-            alt_20hz_add = 1300000
-            alt_20hz_FV = 2147483647 * alt_20hz_sc + alt_20hz_add
-            alt_20hz = data.variables["alt_20hz"][:]  # *alt_20hz_sc+alt_20hz_add
-            ### -- 1Hz record --
-            alt_state_flag_ku_band_status_FV = 127
-            alt_state_flag_ku_band_status = data.variables[
-                "alt_state_flag_ku_band_status"
-            ][:]
-            lat_sc = 0.000001
-            lat = data.variables["lat"][:]  # *lat_sc
-            lon_sc = 0.000001
-            lon = data.variables["lon"][:]  # *lon_sc
-            model_dry_tropo_corr_sc = 0.0001
-            model_dry_tropo_corr_FV = 32767
-            model_dry_tropo_corr = data.variables["model_dry_tropo_corr"][
-                :
-            ]  # *model_dry_tropo_corr_sc
-            model_wet_tropo_corr_sc = 0.0001
-            model_wet_tropo_corr_FV = 32767
-            model_wet_tropo_corr = data.variables["model_wet_tropo_corr"][
-                :
-            ]  # *model_wet_tropo_corr_sc
-            iono_corr_gim_ku_sc = 0.0001
-            iono_corr_gim_ku_FV = 32767
-            iono_corr_gim_ku = data.variables["iono_corr_gim_ku"][
-                :
-            ]  # *iono_corr_gim_ku_sc
-            solid_earth_tide_sc = 0.0001
-            solid_earth_tide_FV = 32767
-            solid_earth_tide = data.variables["solid_earth_tide"][
-                :
-            ]  # *solid_earth_tide_sc
-            pole_tide_sc = 0.0001
-            pole_tide_FV = 32767
-            pole_tide = data.variables["pole_tide"][:] * pole_tide_sc
-            percent = 100 * (fn + 1) / (len(allpath) + 1)
-            print("%1.3f percent complete" % (percent))
-            for p in range(len(lat)):
-                if str(lat[p]) < lat_range[0] or str(lat[p]) > lat_range[1]:
-                    continue
-                if model_dry_tropo_corr[p] == model_dry_tropo_corr_FV:
-                    continue
-                    dry_count = 1
-                else:
-                    dry_count = 0
-                if model_wet_tropo_corr[p] == model_wet_tropo_corr_FV:
-                    wet_count = 1
-                else:
-                    wet_count = 0
-
-                if iono_corr_gim_ku[p] == iono_corr_gim_ku_FV:
-                    iono_count = 1
-                else:
-                    iono_count = 0
-
-                if solid_earth_tide[p] == solid_earth_tide_FV:
-                    sTide_count = 1
-                else:
-                    sTide_count = 0
-
-                if pole_tide[p] == pole_tide_FV:
-                    pTide_count = 1
-                else:
-                    pTide_count = 0
-
-                if alt_state_flag_ku_band_status[p] != 0:
-                    kFlag_count = 1
-                else:
-                    kFlag_count = 0
-
-                media_corr = (
-                    model_dry_tropo_corr[p]
-                    + model_wet_tropo_corr[p]
-                    + iono_corr_gim_ku[p]
-                    + solid_earth_tide[p]
-                    + pole_tide[p]
-                )
-                for q in range(len(lat_20hz[0, :])):
-                    if lat_20hz[p, q] == lat_20hz_FV:
-                        lat_count = 1
-                    else:
-                        lat_count = 0
-                    if ice_qual_flag_20hz_ku[p, q] != 0:
-                        ice_count = 1
-                    else:
-                        ice_count = 0
-
-                    mjd_20hz = time_20hz[p, q] * 1 / 86400 + 51544
-                    icehgt_20hz = alt_20hz[p, q] - (
-                        media_corr + ice_range_20hz_ku[p, q]
-                    )
-                    Flags = (
-                        dry_count
-                        + wet_count
-                        + iono_count
-                        + sTide_count
-                        + pTide_count
-                        + kFlag_count
-                        + lat_count
-                        + ice_count
-                    )
-                    if Flags == 0:
-                        text_file.write(
-                            "%4s %4s %4s %4s %3s %4s %4s %4s %4s %4s %20.6f %20.6f %20.6f %20.6f %20.6f %10.3f\n"
-                            % (
-                                dry_count,
-                                wet_count,
-                                iono_count,
-                                sTide_count,
-                                pTide_count,
-                                kFlag_count,
-                                lat_count,
-                                ice_count,
-                                Flags,
-                                cycno2,
-                                mjd_20hz,
-                                lon_20hz[p, q],
-                                lat_20hz[p, q],
-                                icehgt_20hz,
-                                ice_sig0_20hz_ku[p, q],
-                                ice_qual_flag_20hz_ku[p, q],
-                            )
-                        )
-    print("NetCDF Extraction Complete")
-    return savepath11
-
-
-def generate_timeseries(extracteddir, savepath, minlat, maxlat, geoiddata):
-    import warnings
-    warnings.filterwarnings("ignore")
-    lat_range=[minlat, maxlat]
-    # directory2="/%s/" %(directory)
-    # directory4='%s/' %(directory3)
-
-    #load geoid
-    lonbp=io.loadmat(geoiddata)['lonbp']
-    latbp=io.loadmat(geoiddata)['latbp']
-    grid=io.loadmat(geoiddata)['grid']
-
-    #Import Data
-    extracted_file_pattern = os.path.join(extracteddir, '*.txt')
-    extracted_files = glob.glob(extracted_file_pattern)
-    
-    for i in range(len(extracted_files)):
-        filepath = str(extracted_files[i])
-        alldata = np.loadtxt(filepath)
-        pathname = extracted_files[i]
-        base=os.path.basename(str(extracted_files))
-
-    # If there is no data, return 
-    if len(alldata) == 0:
-        return
-
-    latitude = alldata[:, 12]
-    ind = []
-    for j in range(len(alldata)):
-        if latitude[j] > minlat and latitude[j] < maxlat:
-            ind.append(j)
-
-    alldata_info = alldata[ind,9:15]
-    cycno2 = alldata_info[:,0]
-    time = alldata_info[:,1]
-    lon = alldata_info[:,2]
-    lat = alldata_info[:,3]
-    hgt = alldata_info[:,4]
-    sig = alldata_info[:,5]
-    hgt = hgt[~np.isnan(hgt)]
-
-    # IQ Range for hgt
-    IQR = stats.iqr(hgt,interpolation = 'midpoint')
-    Lower_Lim_All = np.quantile(hgt,0.25)-(1.5*IQR)
-    Upper_Lim_All = np.quantile(hgt,0.75)+(1.5*IQR)
-    indx_limit_All = []
-    for i in range(len(hgt)):
-        if hgt[i]>Lower_Lim_All and hgt[i]<Upper_Lim_All and ~any(np.isnan(alldata[i,:])):
-            indx_limit_All.append(i)
-    Data_Seg_IQR=alldata_info[indx_limit_All,:]
-
-    # Uncertainty function
-    def uncertainty(h):
-        if len(h)==0:
-            rmse=0
-        else:
-            e=abs(h-np.mean(h))
-            sigma2=(sum(e**2)/(len(h)-1))
-            rmse=math.sqrt((sigma2/len(h)))
-        return rmse
-
-    # Altimetry Outlier
-    count2=0
-    cycle2=np.unique(Data_Seg_IQR[:,0])
-    timeseries_report=np.zeros([len(cycle2),9])
-    for k in range(len(cycle2)): 
-        count2=count2+1
-        cycN=cycle2[k]
-        indy=np.where(Data_Seg_IQR[:,0]==cycle2[k])
-        cyc_Pass=Data_Seg_IQR[indy,:][0]
-        cyc_Pass=cyc_Pass[~np.isnan(cyc_Pass).any(axis=1)]
-        ini_sampl=len(cyc_Pass)
-        out_mean=np.mean(cyc_Pass[:,4])
-        out_stdev=np.std(cyc_Pass[:,4])
-        out_err=cyc_Pass[:,4]-out_mean
-        Range=max(cyc_Pass[:,4])-min(cyc_Pass[:,4])
-        cyc=cyc_Pass[:,4]
-
-        while Range > 5:
-                kmeans = KMeans(n_clusters=2,random_state=0).fit(cyc.reshape(-1,1))
-                indx=kmeans.labels_
-                cyc_Pass=pd.DataFrame(cyc_Pass)
-                cyc_Pass=np.array(cyc_Pass.loc[indx==stats.mode(indx).mode])
-                Range=max(cyc_Pass[:,4])-min(cyc_Pass[:,4])
-                break
-        out_mean=np.mean(cyc_Pass[:,4])
-        out_stdev=np.std(cyc_Pass[:,4])
-        out_err=cyc_Pass[:,4]-out_mean
-        stdhgt_cyc=uncertainty(cyc_Pass[:,4])
-        while out_stdev > 0.3:
-                out_err=cyc_Pass[:,4]-out_mean
-                locate=np.where((abs(out_err)==max(abs(out_err))))
-                cyc_Pass=np.delete(cyc_Pass,locate[0],axis=0)
-                out_stdev=np.std(cyc_Pass[:,4])
-                continue
-                break
-        final_sampl=len(cyc_Pass)
-        avgmjd=np.mean(cyc_Pass[:,1])
-        Julyr=(avgmjd+2108-50000)/365.25 +1990
-        Hgt_WGS =np.mean(cyc_Pass[:,4])
-        if((len(cyc_Pass[:,4])!=0)):
-            timeseries_report[count2-1,:]=[cycN, Julyr, statistics.mean(cyc_Pass[:,2]), statistics.mean(cyc_Pass[:,3]), Hgt_WGS,  uncertainty(cyc_Pass[:,4]), np.std(cyc_Pass[:,4]), statistics.mean(cyc_Pass[:,5]), final_sampl*100/ini_sampl]
-
-
-    # IQ range for timeseries_report
-    IQR2=stats.iqr(timeseries_report[:,4],interpolation = 'midpoint')
-    Lower_Lim=np.quantile(timeseries_report[:,4],0.25)-(1.5*IQR2)
-    Upper_Lim=np.quantile(timeseries_report[:,4],0.75)+(1.5*IQR2)
-
-    indx_limit=[]
-    for i2 in range(len(timeseries_report)):
-        if timeseries_report[i2,4]>Lower_Lim and timeseries_report[i2,4]<Upper_Lim and ~any(np.isnan(timeseries_report[i2,:])):
-            indx_limit.append(i2)
-    FinalSeries=timeseries_report[indx_limit,:]
-    ip=interpolate.interp2d(lonbp,latbp,grid,kind='linear')
-    N=ip(FinalSeries[:,2],FinalSeries[:,3])
-    Hgt_Datum=FinalSeries[:,4]-N[0]-0.7
-    FinalSeries[:,4]=Hgt_Datum
-
-    BB=FinalSeries[:,[0,4,5,1]]
-    
-    # np.savetxt(savepath, BB)
-    df = pd.DataFrame(data=BB, columns=['cycle_num', 'H [m w.r.t. EGM2008 Geoid]', 'Uncertainty [m]', 'year_frac'])
-    df = df[df['cycle_num'] != 0]
-    df['date'] = df['year_frac'].apply(_convert_partial_year)
-    # df['date'] = df['year_frac'].apply(lambda x: netCDF4.num2year(x, only_use_python_datetimes=True))
-    df.to_csv(savepath, index=False)
-
-
-def get_latest_cycle(username, password, metafile, series=3):
-    with open(metafile, 'r') as meta:
-        lastcycle = int(meta.readlines()[0])
-        nextcycle = lastcycle + 1
-
-    ftp = FTP("ftp-access.aviso.altimetry.fr")
-    ftp.login(user=str(username), passwd=str(password))
-    try:
-        ftp.cwd(f"geophysical-data-record/jason-{series}/gdr_f/cycle_{nextcycle}")
-
-        # If no errors, new data exists. Write to file and return true
-        with open(metafile, 'w') as meta:
-            meta.writelines([str(nextcycle)])
-
-        latest_cycle = nextcycle
-    except:
-        latest_cycle = lastcycle
-    
-    return latest_cycle
-
-
-def main():
-    secrets = configparser.ConfigParser()
-    secrets.read("../secrets/secrets.ini")
-
-    username = secrets["aviso"]["username"]
-    pwd = secrets["aviso"]["pwd"]
-    
-    startcycle = 1
-    endcycle = 300
-    series = 3
-    
-    savedir = "/Users/pdas47/phd/rat_mekong_v3/extras/2022_01_07-altimetry_operaionalization/data/sirindhorn_operational/raw"
-    extracteddir = "/Users/pdas47/phd/rat_mekong_v3/extras/2022_01_07-altimetry_operaionalization/data/sirindhorn_operational/extracted"
-
-    # temporarily try to download data for sirindhorn
-    sirin_minlat = 14.837451
-    sirin_maxlat = 14.934604
-    sirin_passnum = 1
-
-    latest_cycle = get_latest_cycle(username, pwd, "./meta.txt")
-
-    print("Downloading data")
-    download_data(username, pwd, savedir, sirin_passnum, startcycle, latest_cycle, series)
-
-    print("Extracting data")
-    extractedf = extract_data(savedir + '/j3_001', extracteddir, sirin_minlat, sirin_maxlat, sirin_passnum, 3)
-
-    print("Creating Time-series")
-    ts_savepath = "/Users/pdas47/phd/rat_mekong_v3/extras/2022_01_07-altimetry_operaionalization/data/sirindhorn_operational/sirindhorn.txt"
-    geoiddata = "/Users/pdas47/phd/rat_mekong_v3/extras/2022_01_07-altimetry_operaionalization/data/ancillary/geoidegm2008grid.mat"
-    
-    generate_timeseries(extractedf, ts_savepath, sirin_minlat, sirin_maxlat, geoiddata)
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/data_processing/image_to_ascii.py b/backend/scripts/data_processing/image_to_ascii.py
deleted file mode 100644
index e8a1abcc..00000000
--- a/backend/scripts/data_processing/image_to_ascii.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import geopandas as gpd
-import matplotlib.pyplot as plt
-import numpy as np
-import rasterio as rio
-import xarray as xr
-from tqdm import tqdm
-import csv
-import math
-import os
-import pandas as pd
-import time
-
-
-fluxes = xr.open_dataset("/houston2/pritam/rat_mekong_v3/backend/data/vic_results/nc_fluxes.2001-04-01.nc").load()
-
-fluxes_subset = fluxes[['OUT_PREC', 'OUT_EVAP', 'OUT_RUNOFF', 'OUT_BASEFLOW', 'OUT_WDEW', 'OUT_SOIL_LIQ', 'OUT_SOIL_MOIST']]
-fluxes_subset
-
-# fluxes_subset['lat'] = fluxes_subset.lat.values.round(2)
-# fluxes_subset['lon'] = fluxes_subset.lon.values.round(2)
-
-mask = fluxes_subset.OUT_PREC.isel(time=0)
-mask.plot()
-
-
-d = "/houston2/pritam/rat_mekong_v3/backend/data/rout_input"
-
-YEAR = np.array([int(pd.to_datetime(t).strftime("%Y")) for t in fluxes_subset.time.values])
-MONTH = np.array([int(pd.to_datetime(t).strftime("%m")) for t in fluxes_subset.time.values])
-DAY = np.array([int(pd.to_datetime(t).strftime("%d")) for t in fluxes_subset.time.values])
-
-
-nonnans = fluxes_subset.OUT_PREC.isel(time=0).values.flatten()
-nonnans = nonnans[~np.isnan(nonnans)]
-total = len(nonnans)
-i = 1
-
-# VIC Routing doesn't round, it truncates the lat long values. Important for file names.
-lats_vicfmt = np.array(list(map(lambda x: math.floor(x * 10 ** 2) / 10 ** 2, fluxes_subset.lat.values)))
-lons_vicfmt = np.array(list(map(lambda x: math.floor(x * 10 ** 2) / 10 ** 2, fluxes_subset.lon.values)))
-
-with tqdm(total=total) as pbar:
-    for lat in range(len(fluxes_subset.lat)):
-        for lon in range(len(fluxes_subset.lon)):
-            if not math.isnan(fluxes_subset.OUT_PREC.isel(time=0, lat=lat, lon=lon).values):
-                s = time.time()
-                fname = os.path.join(d, f"fluxes_{lats_vicfmt[lat]:.2f}_{lons_vicfmt[lon]:.2f}")
-                pbar.set_description(f"{fname}")
-
-                da = fluxes_subset.isel(lat=lat, lon=lon, nlayer=0).to_dataframe().reset_index()
-                # da['time'] = da['time'].apply(lambda x: x.strftime("%Y\t%m\t%d"))
-
-                da.to_csv(fname, sep=' ', header=False, index=False, float_format="%.5f", quotechar="", quoting=csv.QUOTE_NONE, date_format="%Y %m %d", escapechar=" ")
-                # print(f"{lat}, {lon} - in {time.time()-s:.3f} seconds. {total-i} remaining")
-                # i += 1
-                # csv.to_csv(da, fname, nogil=True, sep='\t', header=False, index=False, date_format="%Y\t%m\t%d", float_format="%.5f", quoting=False)
-
-                # # print(TIME.apply(lambda x: x.strftime("%Y\t%m\t%d")))
-                # OUT_PREC = fluxes_subset.OUT_PREC.isel(lat=lat, lon=lon).values
-                # OUT_EVAP = fluxes_subset.OUT_EVAP.isel(lat=lat, lon=lon).values
-                # OUT_RUNOFF = fluxes_subset.OUT_RUNOFF.isel(lat=lat, lon=lon).values
-                # OUT_BASEFLOW = fluxes_subset.OUT_BASEFLOW.isel(lat=lat, lon=lon).values
-                # OUT_WDEW = fluxes_subset.OUT_WDEW.isel(lat=lat, lon=lon).values
-                # OUT_SOIL_LIQ = fluxes_subset.OUT_SOIL_LIQ.isel(lat=lat, lon=lon).values
-                # OUT_SOIL_MOIST = fluxes_subset.OUT_SOIL_MOIST.isel(lat=lat, lon=lon).values
-                # 
-                # data = np.array([YEAR, MONTH, DAY, OUT_PREC, OUT_EVAP, OUT_RUNOFF, OUT_BASEFLOW, OUT_WDEW, OUT_SOIL_LIQ, OUT_SOIL_MOIST])
-                # print(data)
-                # with open(fname, "w") as f:
-                #     np.savetxt(f, data )
-                # input()
-                pbar.update(1)
diff --git a/backend/scripts/data_processing/metsim_input_processing.py b/backend/scripts/data_processing/metsim_input_processing.py
deleted file mode 100644
index b95292d4..00000000
--- a/backend/scripts/data_processing/metsim_input_processing.py
+++ /dev/null
@@ -1,377 +0,0 @@
-import xarray as xr
-import datetime
-import os
-from logging import getLogger
-from tqdm import tqdm
-import configparser
-import numpy as np
-import rasterio as rio
-import numpy as np
-import xarray as xr
-import os
-from tqdm import tqdm
-import itertools
-import pandas as pd
-import shutil
-
-from utils.logging import LOG_NAME, NOTIFICATION
-
-log = getLogger(LOG_NAME)
-
-
-class ForcingsNCfmt:
-    def __init__(self, start, end, datadir, basingridpath, outputdir, climatological_data=None, z_lim=3):
-        """
-        Parameters:
-            start: Start date in YYYY-MM-DD format
-            :
-            :
-            datadir: Directory path of ascii format files
-            climatological_data: Path to daily historical precipitation. This data will be used to
-                see if the precipitation data is deviating from climatology too much. The dataset
-                should have daily precipitation in mm in a variable named `tp`.
-            z_lim: z-score limit to use for classifying erroneous data; default: 3
-        """
-        log.debug("Started combining forcing data for MetSim processing")
-        self._start = start
-        self._end = end
-        self._total_days = (self._end - self._start).days
-        self._datadir = datadir
-        self._outputpath = outputdir
-
-        self._rast = rio.open(basingridpath)
-        self._ar = self._rast.read(1, masked=True)
-        self._gridvalue = self._ar.flatten()
-
-        self._longitudes1d, self._latitudes1d = self._get_lat_long_1d()
-        self._latitudes, self._longitudes = self._get_lat_long_meshgrid()
-
-        self.precips = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
-        self.tmaxes = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
-        self.tmins = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
-        self.winds = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
-        self.dates = pd.date_range(start, end)
-
-        self._read()
-        self._write()
-        # If climatological data is passed, then run the climatological data correction
-        if climatological_data:
-            self._climatological_data = climatological_data
-            self._z_lim = z_lim
-            log.debug(f"Running climatological corection of satellite precipitation")
-            self.satellite_precip_correction()
-
-
-    def _get_lat_long_1d(self):
-        x_res, y_res = self._rast.res
-        r_lon_0, r_lat_0 = self._rast.xy(self._rast.height-1, 0)
-        longitudes1d = (np.arange(0, self._rast.shape[1])*x_res + r_lon_0).round(5)
-        latitudes1d = (np.arange(0, self._rast.shape[0])*y_res + r_lat_0).round(5)
-
-        return (longitudes1d, latitudes1d)
-    
-    def _get_lat_long_meshgrid(self):
-        xy = np.meshgrid(self._latitudes1d, self._longitudes1d, indexing='ij')
-        longitudes, latitudes = xy[1].flatten(), xy[0].flatten()
-        # Need to flip latutudes on horizontal axis
-        latitudes = np.flip(latitudes, 0)
-        
-        return latitudes, longitudes
-
-    def _read(self):
-        # with tqdm(total=len(self.dates)) as pbar:
-        for day, date in enumerate(self.dates):
-            fileDate = date
-            reqDate = fileDate.strftime("%Y-%m-%d")
-            log.debug("Combining data: %s", reqDate)
-            # pbar.set_description(reqDate)
-            
-            precipfilepath = os.path.join(self._datadir, f'precipitation/{reqDate}_IMERG.asc')
-            precipitation = rio.open(precipfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)#.flatten()[self.gridvalue==0.0]
-            
-            #Reading Maximum Temperature ASCII file contents
-            tmaxfilepath = os.path.join(self._datadir, f'tmax/{reqDate}_TMAX.asc')
-            tmax = rio.open(tmaxfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)#.flatten()[self.gridvalue==0.0]
-
-            #Reading Minimum Temperature ASCII file contents
-            tminfilepath = os.path.join(self._datadir, f'tmin/{reqDate}_TMIN.asc')
-            tmin = rio.open(tminfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)#.flatten()[self.gridvalue==0.0]
-
-            #Reading Average Wind Speed ASCII file contents
-            uwndfilepath = os.path.join(self._datadir, f'uwnd/{reqDate}_UWND.asc')
-            uwnd = rio.open(uwndfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)
-            
-            # #Reading Average Wind Speed ASCII file contents
-            vwndfilepath = os.path.join(self._datadir, f'vwnd/{reqDate}_VWND.asc')
-            vwnd = rio.open(vwndfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)
-            wind = (0.75*np.sqrt(uwnd**2 + vwnd**2))#.flatten()[self.gridvalue==0.0]
-            
-            # self.dates.append(fileDate)
-            self.precips[day, :, :] = precipitation
-            self.tmaxes[day, :, :] = tmax
-            self.tmins[day, :, :] = tmin
-            self.winds[day, :, :] = wind
-            # pbar.update(1)
-
-    def _write(self):
-        precip_da = xr.DataArray(
-            data = self.precips,
-            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
-            dims=['time', 'lat', 'lon']
-        )
-
-        tmax_da = xr.DataArray(
-            data = self.tmaxes,
-            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
-            dims=['time', 'lat', 'lon']
-        )
-
-        tmin_da = xr.DataArray(
-            data = self.tmins,
-            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
-            dims=['time', 'lat', 'lon']
-        )
-
-        wind_da = xr.DataArray(
-            data = self.winds,
-            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
-            dims=['time', 'lat', 'lon']
-        )
-
-        extent_da = xr.DataArray(
-            data = self._ar,
-            coords=[np.flip(self._latitudes1d), self._longitudes1d],
-            dims=['lat', 'lon']
-        )
-
-        ds = xr.Dataset(
-            data_vars=dict(
-                precip = precip_da,
-                tmax = tmax_da,
-                tmin = tmin_da,
-                wind = wind_da,
-                extent = extent_da
-            )
-        )
-
-        if os.path.isfile(self._outputpath):
-            log.debug(f"Found existing file at {self._outputpath} -- Updating in-place")
-            # Assuming the existing file structure is same as the one generated now. Basically
-            #   assuming that the previous file was also created by MetSimRunner
-            existing = xr.open_dataset(self._outputpath, engine='netcdf4').load()
-            existing.close()
-            # xr.merge([existing, ds]).to_netcdf(self._outputpath)
-            # xr.merge([existing, ds], compat='override', join='outer').to_netcdf(self._outputpath)
-            # xr.concat([existing, ds], dim='time').to_netcdf(self._outputpath)
-            # existing.combine_first(ds).to_netcdf(self._outputpath)
-            last_existing_time = existing.time[-1]
-            log.debug("Existing data: %s", last_existing_time)
-            ds = ds.sel(time=slice(last_existing_time, ds.time[-1]))
-            ds = ds.isel(time=slice(1, None))
-            xr.merge([existing, ds]).to_netcdf(self._outputpath)
-            ds.close()
-            existing.close()
-        else:
-            log.debug(f"Creating new file at {self._outputpath}")
-            ds.to_netcdf(self._outputpath)
-            ds.close()
-        # log.debug(f"Saving {len(paths)} files at {self._outputdir}")
-        # xr.save_mfdataset(datasets, paths)
-    
-    def satellite_precip_correction(self):
-        # from https://github.com/pritamd47/2022_05_04-extreme_precip/blob/1baa1319513abbecfb89f7a7269a1214b50cdca0/notebooks/Extreme-Precip.ipynb
-        daily_precip = xr.open_dataset(self._climatological_data)
-        log_precip = daily_precip.copy()
-        # Take the natural log to convert to normal from log-normal distribution
-        log_precip['tp'] = np.log(log_precip['tp'], where=log_precip['tp']>0)
-
-        weekly_log_precip_mean = log_precip.groupby(log_precip['time'].dt.isocalendar().week).mean()
-        weekly_log_precip_std = log_precip.groupby(log_precip['time'].dt.isocalendar().week).std()
-        
-        forcings = xr.open_dataset(self._outputpath)
-        forcings_precip = forcings[['precip']]
-
-        log_forcings_precip = forcings_precip.copy()
-        log_forcings_precip['precip'] = np.log(forcings_precip['precip'], where=forcings_precip['precip']>0)
-        
-        # Align both the datasets, so that the final z-scores, means and std devs can be calculated and compared easily.
-        weekly_log_precip_mean_sampled = weekly_log_precip_mean.sel(longitude=log_forcings_precip.lon, latitude=log_forcings_precip.lat, method='nearest')
-        weekly_log_precip_std_sampled = weekly_log_precip_std.sel(longitude=log_forcings_precip.lon, latitude=log_forcings_precip.lat, method='nearest')
-
-        log_forcings_precip['weekly_mean_precip'] = weekly_log_precip_mean_sampled['tp']
-        log_forcings_precip['weekly_std_precip'] = weekly_log_precip_std_sampled['tp']
-
-        # build daily clim precip
-        times = []
-        clim_precip_mean = []
-        clim_precip_std = []
-
-        for t in log_forcings_precip.time:
-            time = pd.to_datetime(t.values)
-            times.append(time)
-            # clim_precip_std.append(log_forcings_precip['weekly_std_precip'].sel(week=time.weekofyear))
-            clim_precip_mean.append(log_forcings_precip['weekly_mean_precip'].sel(week=time.weekofyear).values)
-            clim_precip_std.append(log_forcings_precip['weekly_std_precip'].sel(week=time.weekofyear).values)
-
-        mean = xr.DataArray(np.array(clim_precip_mean), coords=({'time': times, 'lon': log_forcings_precip.lon, 'lat': log_forcings_precip.lat}), dims=["time", "lat", "lon"])
-        std = xr.DataArray(np.array(clim_precip_std), coords=({'time': times, 'lon': log_forcings_precip.lon, 'lat': log_forcings_precip.lat}), dims=["time", "lat", "lon"])
-
-        log_forcings_precip['climatological_precip_mean'] = mean
-        log_forcings_precip['climatological_precip_std'] = std
-        
-        # calculate z-scores
-        z_scores = (log_forcings_precip['precip'] - log_forcings_precip['climatological_precip_mean'])/log_forcings_precip['climatological_precip_std']
-        
-        high_precip = log_forcings_precip['climatological_precip_mean']
-        precip_extremes_handled = np.where((z_scores.data>self._z_lim)|(z_scores.data<-self._z_lim), high_precip.data, log_forcings_precip['precip'].data)
-        log_forcings_precip['precip'].data = precip_extremes_handled
-        forcings['precip'].data = np.exp(log_forcings_precip['precip'].data)  # Convert to precipitation 
-        forcings.attrs['precip_filtering'] = f">{self._z_lim}sigma | <-{self._z_lim}sigma"
-
-        forcings.to_netcdf(self._outputpath.replace(".nc", "_precip_handled.nc"))
-        forcings.close()
-        daily_precip.close()
-        shutil.move(self._outputpath.replace(".nc", "_precip_handled.nc"), self._outputpath)
-
-
-def date_range(start, end):
-    # start = datetime.datetime.strptime(start,strfmt)
-    # end = datetime.datetime.strptime(end,strfmt)
-
-    start_year = start.year
-    end_year = end.year
-    
-    if not start_year == end_year:
-        res = [(start, datetime.datetime(start_year, 12, 31))]
-
-        for year in range(start_year+1, end_year):
-            res.append((datetime.datetime(year, 1, 1), datetime.datetime(year, 12, 31)))
-        
-        res.append((datetime.datetime(end_year, 1, 1), end))
-    else:
-        res = [(start, end)]
-
-    return res
-
-
-def generate_state_and_inputs(forcings_startdate, forcings_enddate, combined_datapath, out_dir):
-    # Generate state. Assuming `nc_fmt_data` contains all the data, presumably containing enough data
-    # to create state file (upto 90 days prior data from forcings_startdate)
-    combined_data = xr.open_dataset(combined_datapath)
-
-    state_startdate = forcings_startdate - datetime.timedelta(days=91)
-    state_enddate = forcings_startdate - datetime.timedelta(days=1)
-
-    state_ds = combined_data.sel(time=slice(state_startdate, state_enddate))
-    state_outpath = os.path.join(out_dir, "state.nc")
-    log.debug(f"Saving state at: {state_outpath}")
-    state_ds.to_netcdf(state_outpath)
-
-    # Generate the metsim input
-    forcings_ds = combined_data.sel(time=slice(forcings_startdate, forcings_enddate))
-    forcings_outpath = os.path.join(out_dir, "metsim_input.nc")
-    log.debug(f"Saving forcings: {forcings_outpath}")
-    forcings_ds.to_netcdf(forcings_outpath)
-
-    return state_outpath, forcings_outpath
-
-
-# def metsim_input_processing(project_base, start, end):
-#     basingridfile = os.path.join(project_base, "data", "ancillary", "MASK.tif")
-#     datadir = os.path.join(project_base, "data", "processed")
-#     nc_outputdir = os.path.join(project_base, "data", "nc")
-#     metsim_inputdir = os.path.join(project_base, "data", "metsim_inputs")
-#     # state_dir = os.path.join(project_base, "data", "metsim_inputs", "state")
-
-#     startdate = start
-#     enddate = end
-
-#     startdate_str = start.strftime("%Y-%m-%d")
-#     enddate_str = end.strftime("%Y-%m-%d")
-
-#     log.log(NOTIFICATION, "Starting metsim input processing from %s to %s", startdate_str, enddate_str)
-
-#     # ForcingsNCfmt(startdate, enddate, datadir, basingridfile, os.path.join(nc_outputdir, "forcings_all.nc"))
-
-#     # nc_fmt_data = xr.open_dataset(os.path.join(nc_outputdir, "forcings_all.nc")).load()
-#     # state_outpath, forcings_outpath = generate_state_and_inputs(startdate, enddate, nc_fmt_data, metsim_inputdir)
-
-#     # ## Create State file
-#     # # Take first year's forcing file, and section off 90 days of data as state.nc
-#     # forcings_dspath = os.path.join(metsim_inputdir, "forcings_all.nc")
-#     # log.debug('Creating statefile from: %s', forcings_dspath)
-
-#     # first_year_ds = xr.open_dataset(forcings_dspath).load()   # Load to read off of disk. Allows for writing back to same name https://github.com/pydata/xarray/issues/2029#issuecomment-377572708
-#     # state_startdate = startdate - datetime.timedelta(days=90)
-#     # state_enddate = startdate - datetime.timedelta(days=1)
-#     # forcings_startdate = startdate
-#     # forcings_enddate = pd.to_datetime(first_year_ds.time[-1].values).to_pydatetime()
-
-#     # log.debug("Creating state file using data from %s to %s", startdate, state_enddate.strftime('%Y-%m-%d'))
-#     # log.debug("Creating MS input file using data from %s to %s", forcings_startdate.strftime('%Y-%m-%d'), forcings_enddate.strftime('%Y-%m-%d'))
-    
-#     # state_ds = first_year_ds.sel(time=slice(startdate, state_enddate))
-#     # stateoutpath = os.path.join(metsim_inputdir, "state.nc")
-#     # log.debug(f"Saving state at: {stateoutpath}")
-#     # state_ds.to_netcdf(stateoutpath)
-
-#     # # Save rest of the file as forcing file
-#     # forcing_ds = first_year_ds.sel(time=slice(forcings_startdate, forcings_enddate))
-#     # first_year_ds.close()
-
-#     # outpath = os.path.join(metsim_inputdir, f"{forcings_startdate.strftime('%Y')}.nc")
-#     # log.debug(f"Saving forcings: {outpath}")
-
-#     # ms_input_path = os.path.join(metsim_inputdir, f"{forcings_startdate.strftime('%Y')}.nc")
-#     # forcing_ds.to_netcdf(ms_input_path)
-
-#     return (state_outpath, forcings_outpath)
-
-
-def main():
-    project_base = "/houston2/pritam/rat_mekong_v3/backend"
-
-    basingridfile = os.path.join(project_base, "data", "ancillary", "MASK.tif")
-    datadir = os.path.join(project_base, "data", "processed")
-    nc_outputdir = os.path.join(project_base, "data", "nc")
-    metsim_inputdir = os.path.join(project_base, "data", "metsim_inputs")
-    state_dir = os.path.join(project_base, "data", "metsim_inputs", "state")
-    # vicfmt_outputdir = os.path.join(project_base, "data", "forcings")
-
-    startdate = datetime.datetime.strptime("2001-01-01", "%Y-%m-%d")
-    enddate = datetime.datetime.strptime("2001-12-31", "%Y-%m-%d")
-
-    dateranges = date_range(startdate, enddate)
-    log.debug(dateranges)
-    # for start, end in tqdm(dateranges):
-    #     ForcingsNCfmt(start, end, datadir, basingridfile, os.path.join(metsim_inputdir, f"{start.year}.nc"))
-
-    ## Create State file
-    # Take first year's forcing file, and section off 90 days of data as state.nc
-    first_year_dspath = os.path.join(metsim_inputdir, f"{startdate.year}.nc")
-    log.debug(f"Modifying {first_year_dspath}")
-
-    first_year_ds = xr.open_dataset(first_year_dspath).load()   # Load to read off of disk. Allows for writing back to same name https://github.com/pydata/xarray/issues/2029#issuecomment-377572708
-    log.debug(first_year_ds)
-    state_enddate = startdate + datetime.timedelta(days=89)
-    forcings_startdate = startdate + datetime.timedelta(days=90)
-    
-    state_ds = first_year_ds.sel(time=slice(startdate, state_enddate))
-    log.debug(state_ds)
-    stateoutpath = os.path.join(state_dir, "state.nc")
-    log.debug(f"Saving state at: {stateoutpath}")
-    state_ds.to_netcdf(stateoutpath)
-
-    # Save rest of the file as forcing file
-    forcings_enddate = first_year_ds.time[-1]
-    forcing_ds = first_year_ds.sel(time=slice(forcings_startdate, forcings_enddate))
-    first_year_ds.close()
-
-    outpath = os.path.join(metsim_inputdir, f"{forcings_startdate.strftime('%Y')}.nc")
-    log.debug(f"Saving forcings: {outpath}")
-
-    forcing_ds.to_netcdf(os.path.join(metsim_inputdir, f"{forcings_startdate.strftime('%Y')}.nc"))
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/data_processing/newdata.py b/backend/scripts/data_processing/newdata.py
deleted file mode 100644
index f0a5c470..00000000
--- a/backend/scripts/data_processing/newdata.py
+++ /dev/null
@@ -1,470 +0,0 @@
-import subprocess
-import yaml
-from datetime import datetime, timedelta
-from tqdm import tqdm
-import os
-import shutil
-import tempfile
-import xarray as xr
-from logging import getLogger
-import pandas as pd
-
-from utils.logging import LOG_NAME, NOTIFICATION
-import configparser
-
-log = getLogger(LOG_NAME)
-
-def run_command(cmd):
-    """Safely runs a command, and returns the returncode silently in case of no error. Otherwise,
-    raises an Exception
-    """
-    res = subprocess.run(cmd, check=True, capture_output=True)
-    
-    if res.returncode != 0:
-        log.error(f"Error with return code {res.returncode}")
-        raise Exception
-    return res.returncode
-
-def determine_precip_version(date):
-    """Determines which version of IMERG to download. Most preferred is IMERG Late, followed by
-    IMERG Early. IMERG-Final has some issues. Currently only running using IMERG Early and Late
-    """
-    version = None
-    # if date < (datetime.today() - timedelta(days=4*30)):
-    #     version = "IMERG-FINAL"
-    # elif date < (datetime.today() - timedelta(days=10)):
-    #     version = "IMERG-LATE"
-    # else:
-    #     version = "IMERG-EARLY"
-    if date < (datetime.today() - timedelta(days=2)):
-        version = "IMERG-LATE"
-    else:
-        version = "IMERG-EARLY"
-    return version
-
-def download_precip(date, version, outputpath, secrets):
-    """
-    Parameters:
-        date: datetime object that defines the date for which data is required
-        version: which version of data to download - IMERG-LATE or IMERG-EARLY
-        outputpath: path where the data should be downloaded
-    =======
-    TODO: Add ability to select either CHIRPS or IMERG data
-    """
-    if version == "IMERG-FINAL":
-        link = f"ftp://arthurhou.pps.eosdis.nasa.gov/gpmdata/{date.strftime('%Y')}/{date.strftime('%m')}/{date.strftime('%d')}/gis/3B-DAY-GIS.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S000000-E235959.0000.V06A.tif"
-    elif version == "IMERG-LATE":
-        if date >= datetime(2022, 5, 8):  # Version was changed from V06B to V06C
-            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-L.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06C.1day.tif"
-        else:
-            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-L.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06B.1day.tif"
-    else:
-        if date >= datetime(2022, 5, 8):  # Version was changed from V06B to V06C
-            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/early/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-E.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06C.1day.tif"
-        else:
-            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/early/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-E.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06B.1day.tif"
-
-    # Define the command (different for FINAL, same for EARLY and LATE)
-    if version == "IMERG-FINAL":
-        cmd = [
-            "curl",
-            '-o',
-            outputpath,
-            '--ssl-reqd',
-            '-u',
-            f'{secrets["imerg"]["username"]}:{secrets["imerg"]["pwd"]}',
-            link
-        ]
-    else:
-        cmd = [
-            "wget",
-            "-O",
-            outputpath,
-            "--user",
-            f'{secrets["imerg"]["username"]}',
-            '--password',
-            f'{secrets["imerg"]["pwd"]}',
-            link,
-            '--no-proxy'
-        ]
-    log.debug("Downloading precipitation file: %s (%s)", date.strftime('%Y-%m-%d'), version)
-    return run_command(cmd)
-
-def download_tmax(year, outputpath):
-    """
-    Parameters:
-        year: year for which data is to be downloaded, as a string
-        outputpath: path where the data has to be saved
-    """
-    cmd = [
-        'wget', 
-        '-O', 
-        f'{outputpath}', 
-        f'ftp://ftp.cdc.noaa.gov/Datasets/cpc_global_temp/tmax.{year}.nc'
-    ]
-    log.debug("Downloading tmax: %s", year)
-    return run_command(cmd)
-
-def download_tmin(year, outputpath):
-    """
-    Parameters:
-        year: year for which data is to be downloaded, as a string
-        outputpath: path where the data has to be saved
-    """
-    cmd = [
-        'wget', 
-        '-O', 
-        f'{outputpath}', 
-        f'ftp://ftp.cdc.noaa.gov/Datasets/cpc_global_temp/tmin.{year}.nc'
-    ]
-    log.debug("Downloading tmin: %s", year)
-    return run_command(cmd)
-
-def download_uwnd(year, outputpath):
-    """
-    Parameters:
-        year: year for which data is to be downloaded, as a string
-        outputpath: path where the data has to be saved
-    """
-    cmd = [
-        'wget', 
-        '-O', 
-        f'{outputpath}', 
-        f'ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis/surface_gauss/uwnd.10m.gauss.{year}.nc'
-    ]
-    log.debug("Downloading uwnd: %s", year)
-    return run_command(cmd)
-
-def download_vwnd(year, outputpath):
-    """
-    Parameters:
-        year: year for which data is to be downloaded, as a string
-        outputpath: path where the data has to be saved
-    """
-    cmd = [
-        'wget', 
-        '-O', 
-        f'{outputpath}', 
-        f'ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis/surface_gauss/vwnd.10m.gauss.{year}.nc']
-    log.debug("Downloading vwnd: %s", year)
-    return run_command(cmd)
-
-def download_data(begin, end, datadir, secrets):
-    """Downloads the data between dates defined by begin and end
-
-    Parameters:
-        begin: Data will start downloading from this date, including this date
-        end: Data will be downloaded until this date, including this date
-        datedir: Base directory for downloading data
-    """
-
-    # Obtain list of dates to be downloaded
-    # required_dates = [begin+timedelta(days=n) for n in range((end-begin).days)]
-    required_dates = pd.date_range(begin, end)
-    required_years = list(set([d.strftime("%Y") for d in required_dates]))
-
-    # Download Precipitation
-    log.debug("Downloading Precipitation")
-    # with tqdm(required_dates) as pbar:
-    for date in required_dates:
-        # determine what kind of data is required
-        data_version = determine_precip_version(date)
-        outputpath = os.path.join(datadir, "precipitation", f"{date.strftime('%Y-%m-%d')}_IMERG.tif")
-        # pbar.set_description(f"{date.strftime('%Y-%m-%d')} ({data_version})")
-        download_precip(date, data_version, outputpath, secrets)
-        # pbar.update(1)
-    
-    # Download other forcing data
-    log.debug("Downloading TMax, TMin, UWnd, and VWnd")
-    # with tqdm(required_years, total=len(required_years)*4) as pbar:
-    for year in required_years:
-        # pbar.set_description(f"{year} (TMax)")
-        download_tmax(year, os.path.join(datadir, "tmax", year+'.nc'))
-        # pbar.update(1)
-
-        # pbar.set_description(f"{year} (TMin)")
-        download_tmin(year, os.path.join(datadir, "tmin", year+'.nc'))
-        # pbar.update(1)
-
-        # pbar.set_description(f"{year} (UWnd)")
-        download_uwnd(year, os.path.join(datadir, "uwnd", year+'.nc'))
-        # pbar.update(1)
-
-        # pbar.set_description(f"{year} (VWnd)")
-        download_vwnd(year, os.path.join(datadir, "vwnd", year+'.nc'))
-        # pbar.update(1)
-
-def process_precip(srcpath, dstpath, temp_datadir=None):
-    """For any IMERG Precipitation file located at `srcpath` is clipped, scaled and converted to
-    ASCII grid file and saved at `dstpath`. All of this is done in a temporarily created directory
-    which can be controlled by the `datadir` path
-    """
-    if temp_datadir is not None and not os.path.isdir(temp_datadir):
-        raise Exception(f"ERROR: {temp_datadir} directory doesn't exist")
-    
-    log.debug("Processing Precipitation file: %s", srcpath)
-
-    with tempfile.TemporaryDirectory(dir=temp_datadir) as tempdir:
-        clipped_temp_file = os.path.join(tempdir, 'clipped.tif')
-        cmd = [
-            "gdalwarp",
-            "-dstnodata", 
-            "-9999.0",
-            "-tr",
-            "0.0625",
-            "0.0625",
-            "-te",
-            "93.875",
-            "9.5625",
-            "108.6875",
-            "33.8125",
-            '-of',
-            'GTiff',
-            '-overwrite', 
-            f'{srcpath}',
-            clipped_temp_file
-        ]
-        run_command(cmd)
-
-        # Scale down (EARLY)
-        scaled_temp_file = os.path.join(tempdir, 'scaled.tif')
-        cmd = [
-            "gdal_calc.py", 
-            "-A", 
-            clipped_temp_file, 
-            f"--calc=A*0.1", 
-            f"--outfile={scaled_temp_file}", 
-            "--NoDataValue=-9999", 
-            "--format=GTiff"
-        ]
-        run_command(cmd)
-
-        # Change format, and save as processed file
-        aai_temp_file = os.path.join(tempdir, 'processed.tif')
-        cmd = [
-            'gdal_translate',
-            '-of', 
-            'aaigrid', 
-            scaled_temp_file, 
-            aai_temp_file
-        ]
-        run_command(cmd)
-
-        # Move to destination
-        shutil.move(aai_temp_file, dstpath)
-
-def process_nc(date, srcpath, dstpath, temp_datadir=None):
-    """For TMax, TMin, UWnd and VWnd, the processing steps are same, and can be performed using
-    this function.
-
-    Parameters:
-        date: Datetime object of the date of data
-        srcpath: path of the nc file
-        dstpath: path where the final ascii file will be saved
-        temp_datadir: directory where the temporary data will be stored
-    """
-    if temp_datadir is not None and not os.path.isdir(temp_datadir):
-        raise Exception(f"ERROR: {temp_datadir} directory doesn't exist")
-    
-    log.debug("Processing NC file: %s for date %s", srcpath, date.strftime('%Y-%m-%d'))
-
-    with tempfile.TemporaryDirectory(dir=temp_datadir) as tempdir:
-        # Convert from NC to Tif
-        band = date.strftime("%-j")   # required band number is defined by `day of year`
-        converted_tif_temp_file = os.path.join(tempdir, "converted.tif")
-
-        cmd = ["gdal_translate", "-of", "Gtiff", "-b", band, srcpath, converted_tif_temp_file]
-        run_command(cmd)
-
-        # Change resolution
-        scaled_temp_file = os.path.join(tempdir, "scaled.tif")
-        cmd = [
-            "gdalwarp",
-            "-dstnodata", 
-            "-9999.0",
-            "-tr",
-            "0.0625",
-            "0.0625",
-            "-te",
-            "93.875",
-            "9.5625",
-            "108.6875",
-            "33.8125",
-            '-of',
-            'GTiff',
-            '-overwrite',  
-            converted_tif_temp_file, 
-            scaled_temp_file]
-        run_command(cmd)
-
-        # Convert GeoTiff to AAI
-        aai_temp_file = os.path.join(tempdir, "final_aai.tif")
-        cmd = ["gdal_translate", "-of", "aaigrid", scaled_temp_file, aai_temp_file]
-        run_command(cmd)
-
-        # Move file to destination
-        shutil.move(aai_temp_file, dstpath)
-
-def process_data(raw_datadir, processed_datadir, begin, end, temp_datadir):
-    if not os.path.isdir(temp_datadir):
-        os.makedirs(temp_datadir)
-
-    #### Process precipitation ####
-    log.debug("Processing Precipitation")
-    raw_datadir_precip = os.path.join(raw_datadir, "precipitation")
-    processed_datadir_precip = os.path.join(processed_datadir, "precipitation")
-
-
-    # with tqdm(os.listdir(raw_datadir_precip)) as pbar:
-    ds = pd.date_range(begin, end)
-    for srcname in os.listdir(raw_datadir_precip):
-        if datetime.strptime(srcname.split(os.sep)[-1].split("_")[0], "%Y-%m-%d") in ds:
-            srcpath = os.path.join(raw_datadir_precip, srcname)
-            dstpath = os.path.join(processed_datadir_precip, srcname.replace("tif", "asc"))
-
-            # pbar.set_description(f"Precipitation: {srcname.split('_')[0]}")
-            process_precip(srcpath, dstpath, temp_datadir)
-            # pbar.update(1)
-
-    #### Process NC files ####
-    # required_dates = [begin+timedelta(days=n) for n in range((end-begin).days)]
-    required_dates = pd.date_range(begin, end)
-    #### Process TMAX ####
-    log.debug("Processing TMAX")
-    raw_datadir_tmax = os.path.join(raw_datadir, "tmax")
-    processed_datadir_tmax = os.path.join(processed_datadir, "tmax")
-
-    # with tqdm(required_dates) as pbar:
-    for date in required_dates:
-        srcpath = os.path.join(raw_datadir_tmax, date.strftime('%Y')+'.nc')
-        dstpath = os.path.join(processed_datadir_tmax, f"{date.strftime('%Y-%m-%d')}_TMAX.asc")
-
-        # pbar.set_description(f"TMAX: {date.strftime('%Y-%m-%d')}")
-        process_nc(date, srcpath, dstpath, temp_datadir)
-        # pbar.update(1)
-    
-    #### Process TMin ####
-    log.debug("Processing TMIN")
-    raw_datadir_tmin = os.path.join(raw_datadir, "tmin")
-    processed_datadir_tmin = os.path.join(processed_datadir, "tmin")
-
-    # with tqdm(required_dates) as pbar:
-    for date in required_dates:
-        srcpath = os.path.join(raw_datadir_tmin, date.strftime('%Y')+'.nc')
-        dstpath = os.path.join(processed_datadir_tmin, f"{date.strftime('%Y-%m-%d')}_TMIN.asc")
-
-        # pbar.set_description(f"TMIN: {date.strftime('%Y-%m-%d')}")
-        process_nc(date, srcpath, dstpath, temp_datadir)
-        # pbar.update(1)
-
-    #### Process UWND ####
-    log.debug("Processing UWND")
-    raw_datadir_uwnd = os.path.join(raw_datadir, "uwnd")
-    daily_datadir_uwnd = os.path.join(raw_datadir, "uwnd_daily")
-    processed_datadir_uwnd = os.path.join(processed_datadir, "uwnd")
-
-    uwnd_files = [os.path.join(raw_datadir_uwnd, f) for f in os.listdir(raw_datadir_uwnd)]
-
-    for uwnd_f in uwnd_files:
-        xr.open_dataset(uwnd_f).resample(time='1D').mean().to_netcdf(os.path.join(daily_datadir_uwnd, uwnd_f.split(os.sep)[-1]))
-        # xr.open_dataset(vwnd_f).resample(time='1D').mean().to_netcdf(os.path.join(vwnd_outdir, vwnd_f.split(os.sep)[-1]))
-
-    # with tqdm(required_dates) as pbar:
-    for date in required_dates:
-        srcpath = os.path.join(daily_datadir_uwnd, date.strftime('%Y')+'.nc')
-        dstpath = os.path.join(processed_datadir_uwnd, f"{date.strftime('%Y-%m-%d')}_UWND.asc")
-
-        # pbar.set_description(f"UWND: {date.strftime('%Y-%m-%d')}")
-        process_nc(date, srcpath, dstpath, temp_datadir)
-        # pbar.update(1)
-
-    #### Process VWND ####
-    log.debug("Processing VWND")
-    raw_datadir_vwnd = os.path.join(raw_datadir, "vwnd")
-    daily_datadir_vwnd = os.path.join(raw_datadir, "vwnd_daily")
-    processed_datadir_vwnd = os.path.join(processed_datadir, "vwnd")
-
-    vwnd_files = [os.path.join(raw_datadir_vwnd, f) for f in os.listdir(raw_datadir_vwnd)]
-
-    for vwnd_f in vwnd_files:
-        xr.open_dataset(vwnd_f).resample(time='1D').mean().to_netcdf(os.path.join(daily_datadir_vwnd, vwnd_f.split(os.sep)[-1]))
-
-    # with tqdm(required_dates) as pbar:
-    for date in required_dates:
-        srcpath = os.path.join(daily_datadir_vwnd, date.strftime('%Y')+'.nc')
-        dstpath = os.path.join(processed_datadir_vwnd, f"{date.strftime('%Y-%m-%d')}_VWND.asc")
-
-        # pbar.set_description(f"VWND: {date.strftime('%Y-%m-%d')}")
-        process_nc(date, srcpath, dstpath, temp_datadir)
-        # pbar.update(1)
-
-
-def get_newdata(project_base, startdate, enddate, download=True, process=True):
-    datadir = os.path.join(project_base, "data")
-    raw_datadir = os.path.join(datadir, "raw")
-    processed_datadir = os.path.join(datadir, "processed")
-    temp_datadir = os.path.join(datadir, "temp")
-
-    secrets = configparser.ConfigParser()
-    secrets_path = os.path.join(project_base, 'params/secrets.ini')
-    secrets.read(secrets_path)  # assuming there's a secret ini file with user/pwd
-
-    enddate = enddate
-
-    startdate_str = startdate.strftime("%Y-%m-%d")
-    enddate_str = enddate.strftime("%Y-%m-%d")
-
-    log.log(NOTIFICATION, "Started Downloading and Processing data from %s -> %s", startdate_str, enddate_str)
-    log.debug("Raw data directory: %s", raw_datadir)
-    log.debug("Processed data directory: %s", processed_datadir)
-
-    #### DATA DOWNLOADING ####
-    if download:
-        download_data(startdate, enddate, raw_datadir, secrets)
-
-    #### DATA PROCESSING ####
-    if process:
-        process_data(raw_datadir, processed_datadir, startdate, enddate, temp_datadir)
-
-
-
-def main():
-    #### INITIALIZATION ####
-    try:
-        project_base = os.environ["PROJECT_BASE"]
-    except:
-        project_base = "/houston2/pritam/rat_mekong_v3/backend"
-
-    # metapath = os.path.join(project_base, "metadata.yml")
-    # meta = yaml.load(open(metapath).read(), yaml.SafeLoader)
-
-    # startdate = datetime.strptime(meta['lastran'], "%Y-%m-%d") + timedelta(days=1)
-    # enddate = datetime.strptime(meta['enddate'], "%Y-%m-%d")
-
-    # log.debug(f"We need data from {startdate} to {enddate}")
-    
-    datadir = os.path.join(project_base, "data")
-    raw_datadir = os.path.join(datadir, "raw")
-    processed_datadir = os.path.join(datadir, "processed")
-    temp_datadir = os.path.join(datadir, "temp")
-    
-    
-    #### OPTIONALLY OVERRIDE START ####
-    # raw_datadir = os.path.join(project_base, "temp", "data", "imerg_early_raw")
-    # processed_datadir = os.path.join(project_base, "temp", "data", "imerg_early_processed")
-
-    startdate = datetime.strptime("2001-01-01", "%Y-%m-%d")
-    enddate = datetime.strptime("2021-06-14", "%Y-%m-%d")
-    #### OPTIONALLY OVERRIDE END   ####
-
-
-    # # #### DATA DOWNLOADING ####
-    # download_data(startdate, enddate, raw_datadir)
-
-    # #### DATA PROCESSING ####
-    # process_data(raw_datadir, processed_datadir, startdate, enddate, temp_datadir)
-
-
-
-if __name__ == '__main__':
-    main()
diff --git a/backend/scripts/run_rat.py b/backend/scripts/run_rat.py
deleted file mode 100644
index f47274d1..00000000
--- a/backend/scripts/run_rat.py
+++ /dev/null
@@ -1,178 +0,0 @@
-import yaml
-import os
-import datetime
-import argparse
-
-from core.run_vic import VICRunner
-from utils.logging import init_logger, NOTIFICATION
-from core.run_metsim import MetSimRunner
-from core.run_routing import RoutingRunner
-from core.run_sarea import run_sarea
-from core.run_postprocessing import run_postprocessing
-from core.run_altimetry import run_altimetry
-from core.generate_plots import generate_plots
-
-from utils.vic_param_reader import VICParameterFile
-from utils.route_param_reader import RouteParameterFile
-from utils.metsim_param_reader import MSParameterFile
-
-from data_processing.newdata import get_newdata
-from data_processing.metsim_input_processing import generate_state_and_inputs
-from data_processing.metsim_input_processing import ForcingsNCfmt
-# from utils.temp_postprocessing import run_old_model, copy_generate_inflow, run_postprocess, publish
-from utils.convert_for_website import convert_dels_outflow, convert_sarea, convert_inflow, convert_altimeter
-
-def main():
-    #------ Initialize Argument Parser ------#
-    parser = argparse.ArgumentParser(description="Welcome to RAT-2.0")
-    parser.add_argument('param_file', help='Absolute path to a rat-paramter file (format: yml)')
-    args = parser.parse_args()
-    param_path = args.param_file
-    #------ Initialize Argument Parser ------#
-
-
-    #--------- Define Variables -------------#
-    # read parameter file
-    config = yaml.safe_load(open(param_path, 'r'))
-
-    # strip datetimes to remove the "time" component and only keep date
-    config['GLOBAL']['begin'] = datetime.datetime.combine(config['GLOBAL']['begin'], datetime.time.min)
-    config['GLOBAL']['end'] = datetime.datetime.combine(config['GLOBAL']['end'], datetime.time.min)
-    config['GLOBAL']['previous_end'] = datetime.datetime.combine(config['GLOBAL']['previous_end'], datetime.time.min)
-    #--------- Define Variables -------------#
-
-
-    #--------- Initialize Log file ----------#
-    log = init_logger(
-        "/houston2/pritam/rat_mekong_v3/backend/logs",
-        verbose=True,
-        # notify=True,
-        notify=False,
-        log_level='DEBUG'
-    )
-    #--------- Initialize Log file ----------#
-
-
-    #--------- Download Data Begin ----------#
-    get_newdata(
-        os.path.join(config['GLOBAL']['project_dir'], 'backend'),
-        config['GLOBAL']['previous_end'],
-        config['GLOBAL']['end']
-    )
-    #---------- Download Data End -----------#
-
-
-    combined_datapath = os.path.join(config['GLOBAL']['project_dir'], 'backend', 'data', 'nc', 'combined_data.nc')
-    #----------- Process Data Begin -----------#
-    processed_datadir = os.path.join(config['GLOBAL']['project_dir'], 'backend', 'data', 'processed')
-    basingridfile = os.path.join(config['GLOBAL']['project_dir'], 'backend', 'data', 'ancillary', 'MASK.tif')
-    ForcingsNCfmt(
-        config['GLOBAL']['previous_end'],
-        config['GLOBAL']['end'],
-        processed_datadir,
-        basingridfile,
-        combined_datapath,
-        config['GLOBAL']['climatological_data']
-    )
-    #------------ Process Data End ------------#
-
-
-    #------ MetSim Data Processing Begin ------#
-    # Process data to metsim format
-    metsim_inputs_dir = os.path.join(config['GLOBAL']['project_dir'], 'backend', 'data', 'metsim_inputs')
-    ms_state, ms_input_data = generate_state_and_inputs(
-        config['GLOBAL']['previous_end'],
-        config['GLOBAL']['end'],
-        combined_datapath, 
-        metsim_inputs_dir
-    )
-    #------- MetSim Data Processing End -------#
-
-
-    #-------------- Metsim Begin --------------#
-    with MSParameterFile(
-        config['METSIM']['metsim_workspace'], 
-        config['GLOBAL']['previous_end'],
-        config['GLOBAL']['end'],
-        config['METSIM']['metsim_param_file'], 
-        ms_input_data, 
-        ms_state
-        ) as m:
-        
-        ms = MetSimRunner(
-            m.ms_param_path,
-            config['METSIM']['metsim_env'],
-            config['GLOBAL']['conda_hook'],
-            m.results,
-            config['GLOBAL']['multiprocessing']
-        )
-        log.log(NOTIFICATION, f'Starting metsim from {config["GLOBAL"]["previous_end"].strftime("%Y-%m-%d")} to {config["GLOBAL"]["end"].strftime("%Y-%m-%d")}')
-        ms.run_metsim()
-        # # prefix = ms.diasgg_results(config['VIC']['vic_forcings_dir'])
-        prefix = ms.convert_to_vic_forcings(config['VIC']['vic_forcings_dir'])
-    #--------------- Metsim End ---------------#
-
-
-    # --------------- VIC Begin ----------------# 
-    with VICParameterFile(config) as p:
-        vic = VICRunner(
-            config['VIC']['vic_env'],
-            p.vic_param_path,
-            p.vic_result_file,
-            config['ROUTING']['route_input_dir'],
-            config['GLOBAL']['conda_hook']
-        )
-        vic.run_vic(np=config['GLOBAL']['multiprocessing'])
-        vic.disagg_results()
-        vic_startdate = p.vic_startdate
-        vic_enddate = p.vic_enddate
-    #---------------- VIC End -----------------#
-
-    # vic_startdate = config['GLOBAL']['begin'] + datetime.timedelta(days=90)
-    # vic_enddate = config['GLOBAL']['end']
-    #------------- Routing Being --------------#
-    with RouteParameterFile(config, vic_startdate, vic_enddate, clean=False) as r:
-        route = RoutingRunner(    
-            config['GLOBAL']['project_dir'], 
-            r.params['output_dir'], 
-            # "extras/vic_cal_route_res/",
-            config['ROUTING']['route_inflow_dir'], 
-            config['ROUTING']['route_model'],
-            r.route_param_path, 
-            # 'extras/vic_cal_route_res/route_param.txt',
-            r.params['flow_direction_file'], 
-            config['ROUTING']['station_latlon_path'],
-            r.params['station']
-        )
-        route.create_station_file()
-        route.run_routing()
-        route.generate_inflow()
-    #-------------- Routing End ---------------#
-
-    #----------- Remote Sensing Begin -----------#
-    # Get Sarea
-    run_sarea("2019-01-01", config['GLOBAL']['end'].strftime("%Y-%m-%d"), os.path.join(config['GLOBAL']['project_dir'], "backend/data/sarea_tmsos"))
-
-    # Altimeter
-    run_altimetry("/houston2/pritam/rat_mekong_v3")
-    #----------- Remote Sensing End -----------#
-
-    #---------- Postprocessing Begin ----------#
-    run_postprocessing(config['GLOBAL']['project_dir'])
-
-    # Convert to format that is expected by the website
-    convert_sarea(config['GLOBAL']['project_dir'])
-    convert_inflow(config['GLOBAL']['project_dir'])
-    convert_dels_outflow(config['GLOBAL']['project_dir'])
-    convert_altimeter(config['GLOBAL']['project_dir'])
-    # ----------- Postprocessing End -----------#
-
-    # ---------- Create Visualization ----------#
-    generate_plots(config['GLOBAL']['reservoirs_db_fn'], config['GLOBAL']['project_dir'])
-    # ---------- Create Visualization ----------#
-
-    # Publish from .sh file
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/run_rat.sh b/backend/scripts/run_rat.sh
deleted file mode 100755
index 94ca6ff9..00000000
--- a/backend/scripts/run_rat.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-# Run model - 
-d=$(date +'%Y-%m-%d')
-echo "Analysis Date: $(date)"
-
-cd /houston2/pritam/rat_mekong_v3
-
-source /houston2/pritam/activate_conda.sh
-conda activate /houston2/pritam/rat_mekong_v3/.condaenv
-echo "Activated Environment: "$CONDA_DEFAULT_ENV
-
-# First checkout the version of code to use
-git checkout v0.3.15
-git status
-
-python /houston2/pritam/rat_mekong_v3/backend/scripts/utils/update_meta.py
-
-python /houston2/pritam/rat_mekong_v3/backend/scripts/run_rat.py "/houston2/pritam/rat_mekong_v3/backend/params/rat_mekong.yml"
-
-# PUBLISH
-echo "Publishing Results"
-conda activate /houston2/pritam/rat_mekong_v3/.paramiko
-echo "Activated Environment: "$CONDA_DEFAULT_ENV
-python /houston2/pritam/rat_mekong_v3/backend/scripts/_send_files.py
\ No newline at end of file
diff --git a/backend/scripts/utils/convert_for_website.py b/backend/scripts/utils/convert_for_website.py
deleted file mode 100644
index 44cad27f..00000000
--- a/backend/scripts/utils/convert_for_website.py
+++ /dev/null
@@ -1,245 +0,0 @@
-import os
-import datetime
-import pandas as pd
-import numpy as np
-
-
-def convert_sarea(project_dir):
-    sarea_dir = os.path.join(project_dir, "backend/data/sarea_tmsos")
-    website_v_dir = os.path.join(project_dir, "backend/data/sarea_tmsos/website_version")
-
-    sarea_paths = [os.path.join(sarea_dir, f) for f in os.listdir(sarea_dir) if f.endswith(".csv")]
-
-    for sarea_path in sarea_paths:
-        res_name = os.path.splitext(os.path.split(sarea_path)[-1])[0]
-
-        savepath = os.path.join(website_v_dir, f"{res_name}.txt")
-
-        df = pd.read_csv(sarea_path)
-        df = df[['date', 'area']]
-        df['area'] = np.round(df['area'], 3)
-
-        print(f"Converting [Surface Area]: {res_name}")
-        df.to_csv(savepath, index=False)
-
-
-def convert_inflow(project_dir):
-    inflow_dir = os.path.join(project_dir, "backend/data/inflow")
-    website_v_dir = os.path.join(inflow_dir, "website_version")
-
-    names_to_ids = {
-        "Nam_N":"Nam_Ngum_1",
-        "Ubol_":"Ubol_Ratana",
-        "Lam_P":"Lam_Pao",
-        "Sirid":"Sirindhorn",
-        "Nam_T":"Nam_Theun_2",
-        "Xe_Ka":"Xe_Kaman_1",
-        "Sesan":"Sesan_4",
-        "Lower":"Lower_Sesan_2",
-        "Batta":"Battambang_1",
-        "Phumi":"Phumi_Svay_Chrum",
-        "Sesan":"Sesan_4",
-        "Sre_P":"Sre_Pok_4",
-        "NamTo": "Nam_Ton",
-        "Yali ":"Yali",
-        "5117 ":"5117",
-        "5138 ":"5138",
-        "5143 ":"5143",
-        "5147 ":"5147",
-        "5148 ":"5148",
-        "5151 ":"5151",
-        "5152 ":"5152",
-        "5155 ":"5155",
-        "5156 ":"5156",
-        "5160 ":"5160",
-        "5162 ":"5162",
-        "5795 ":"5795",
-        "5797 ":"5797",
-        "7000 ":"7000",
-        "7001 ":"7001",
-        "7002 ":"7002",
-        "7004 ":"7004",
-        "7037 ":"7037",
-        "7087 ":"7087",
-        "7158 ":"7158",
-        "7159 ":"7159",
-        "7164 ":"7164",
-        "7181 ":"7181",
-        "7201 ":"7201",
-        "7232 ":"7232",
-        "7284 ":"7284",
-        "7303 ":"7303"
-    }
-
-    inflow_paths = [os.path.join(inflow_dir, f) for f in os.listdir(inflow_dir) if f.endswith(".csv")]
-
-    for inflow_path in inflow_paths:
-        res_name = os.path.splitext(os.path.split(inflow_path)[-1])[0]
-
-        if res_name in names_to_ids.keys():
-            savename = names_to_ids[res_name]
-            savepath = os.path.join(website_v_dir, f"{savename}.txt")
-
-            df = pd.read_csv(inflow_path)
-            print(f"Converting [Inflow]: {res_name}")
-            df.to_csv(savepath, index=False)
-            print(df.tail())
-        else:
-            print(f"Currently not displayed in website: {res_name}")
-
-def convert_dels_outflow(project_dir):
-    mapping = {
-        # 'Battambang_1': '99999',
-        'Lam_Pao': '5150',
-        'Lower_Sesan_2': '7303',
-        'Nam_Ngum_1': '5136', 
-        # 'Phumi_Svay_Chrum': '99999',
-        'Sesan_4': '7203',
-        'Sirindhorn': '5796',
-        # 'Sre_Pok_4': '99999',
-        'Ubol_Ratana': '5149',
-        'Nam_Theun_2': '6999',
-        'Xe_Kaman_1': '7003'
-    }
-
-    # Delta S
-    dels_dir = os.path.join(project_dir, "backend/data/dels")
-    dels_paths = [os.path.join(dels_dir, f) for f in os.listdir(dels_dir) if f.endswith(".csv")]
-
-    for dels_path in dels_paths:
-        res_name = os.path.splitext(os.path.split(dels_path)[-1])[0]
-
-        if res_name in mapping:
-            savename = mapping[res_name]
-        else:
-            savename = res_name
-
-        savepath = os.path.join(dels_dir, f"website_version/{savename}.txt")
-
-        df = pd.read_csv(dels_path)
-        df = df[['date', 'dS']]
-        df['dS'] = np.round(df['dS'], 2)
-
-        print(f"Converting [∆S]: {res_name}, {savepath}")
-        df.to_csv(savepath, index=False, header=False)
-    
-    # Outflow
-    outflow_dir = os.path.join(project_dir, "backend/data/outflow")
-    outflow_paths = [os.path.join(outflow_dir, f) for f in os.listdir(outflow_dir) if f.endswith(".csv")]
-
-    for outflow_path in outflow_paths:
-        res_name = os.path.splitext(os.path.split(outflow_path)[-1])[0]
-
-        if res_name in mapping:
-            savename = mapping[res_name]
-        else:
-            savename = res_name
-
-        savepath = os.path.join(outflow_dir, f"website_version/{savename}.txt")
-
-        df = pd.read_csv(outflow_path)
-        df = df[['date', 'outflow_rate']].rename({
-            'date': 'Date',
-            'outflow_rate': 'Streamflow'
-        }, axis=1)
-        df['Streamflow'] = np.round(df['Streamflow'], 2)
-        df.loc[df['Streamflow']<0, 'Streamflow'] = 0
-
-        print(f"Converting [Outflow]: {res_name}, {savepath}")
-        df.to_csv(savepath, index=False)
-
-def convert_altimeter(project_dir):
-    mapping = {
-        # 'Battambang_1': '99999',
-        'Lam_Pao': '5150',
-        # 'Lower_Sesan_2': '7303',
-        # 'Nam_Ngum_1': '5136', 
-        # 'Phumi_Svay_Chrum': '99999',
-        # 'Sesan_4': '7203',
-        'Siridhorn': '5796',
-        # 'Sre_Pok_4': '99999',
-        # 'Ubol_Ratana': '5149',
-        # 'Nam_Theun_2': '6999',
-        'Xe_Kaman_1': '7003'
-    }
-
-    # Delta S
-    altimeter_ts_dir = os.path.join(project_dir, "backend/data/altimetry_timeseries")
-    altimeter_tses = [os.path.join(altimeter_ts_dir, f) for f in os.listdir(altimeter_ts_dir) if f.endswith(".csv")]
-
-    for altimeter_ts_path in altimeter_tses:
-        res_name = os.path.splitext(os.path.split(altimeter_ts_path)[-1])[0]
-
-        if not res_name.isnumeric():
-            grandid = mapping[res_name]
-        else:
-            grandid = res_name
-
-        savepath = os.path.join(altimeter_ts_dir, f"website_version/{grandid}.txt")
-
-        df = pd.read_csv(altimeter_ts_path, parse_dates=['date'])
-        df = df[['date', 'H [m w.r.t. EGM2008 Geoid]']]
-        df['date'] = df['date'].dt.strftime("%Y-%m-%d")
-        df['H [m w.r.t. EGM2008 Geoid]'] = np.round(df['H [m w.r.t. EGM2008 Geoid]'], 2)
-
-        print(f"Converting [Heights]: {res_name}")
-        df.to_csv(savepath, index=False, header=False)
-
-def convert_v2_frontend(project_dir, res_name, inflow_src, sarea_src, dels_src, outflow_src):
-    """Converts the files according to the newer version of the frontend (v2).
-
-    Args:
-        project_dir (str): path of project directory
-        res_name (str): name of reservoir
-        inflow_src (str): source .csv file containing inflow in cumecs
-        sarea_src (str): source .csv file containing surface area estiamted by TMS-OS
-        dels_src (str): source .csv file containing delta-S estimates
-        outflow_src (str): source .csv file containing outflow estimates
-    """
-    # inflow
-    inflow = pd.read_csv(inflow_src, parse_dates=['date'])
-    inflow['inflow (m3/d)'] = inflow['streamflow'] * (24*60*60)        # indicate units, convert from m3/s to m3/d
-    inflow_dst_dir = os.path.join(project_dir, "backend/data/inflow/v2_website_version")
-    if not os.path.isdir(inflow_dst_dir):
-        os.makedirs(inflow_dst_dir)
-    inflow_dst = os.path.join(inflow_dst_dir, f"{res_name}.csv")
-    inflow = inflow[['date', 'inflow (m3/d)']]
-    inflow.to_csv(inflow_dst, index=False)
-    
-    # sarea
-    sarea = pd.read_csv(sarea_src, parse_dates=['date'])[['date', 'area']]
-    sarea['area (km2)'] = sarea['area']                                     # indicate units
-    sarea_dst_dir = os.path.join(project_dir, "backend/data/sarea_tmsos/v2_website_version")
-    if not os.path.isdir(sarea_dst_dir):
-        os.makedirs(sarea_dst_dir)
-    sarea_dst = os.path.join(sarea_dst_dir, f"{res_name}.csv")
-    sarea = sarea[['date', 'area (km2)']]
-    sarea.to_csv(sarea_dst, index=False)
-    
-    # dels
-    dels = pd.read_csv(dels_src, parse_dates=['date'])[['date', 'dS', 'days_passed']]
-    dels['dS (m3)'] = dels['dS'] * 1e9                                     # indicate units, convert from BCM to m3
-    dels_dst_dir = os.path.join(project_dir, "backend/data/dels/v2_website_version")
-    if not os.path.isdir(dels_dst_dir):
-        os.makedirs(dels_dst_dir)
-    dels_dst = os.path.join(dels_dst_dir, f"{res_name}.csv")
-    dels = dels[['date', 'dS (m3)']]
-    dels.to_csv(dels_dst, index=False)
-    
-    # outflow
-    outflow =  pd.read_csv(outflow_src, parse_dates=['date'])[['date', 'outflow_rate']]
-    outflow.loc[outflow['outflow_rate']<0, 'outflow_rate'] = 0
-    outflow['outflow (m3/d)'] = outflow['outflow_rate'] * (24*60*60)        # indicate units, convert from m3/s to m3/d
-    outflow_dst_dir = os.path.join(project_dir, "backend/data/outflow/v2_website_version")
-    if not os.path.isdir(outflow_dst_dir):
-        os.makedirs(outflow_dst_dir)
-    outflow_dst = os.path.join(outflow_dst_dir, f"{res_name}.csv")
-    outflow = outflow[['date', 'outflow (m3/d)']]
-    outflow.to_csv(outflow_dst, index=False)
-
-
-def main():
-    pass
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/backend/scripts/utils/temp_postprocessing.py b/backend/scripts/utils/temp_postprocessing.py
deleted file mode 100644
index 9bfb9b10..00000000
--- a/backend/scripts/utils/temp_postprocessing.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import subprocess
-import os
-import pandas as pd
-import shutil
-
-from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import run_command
-
-log = getLogger(LOG_NAME)
-
-# Temporarily use this script to run the old model
-def run_old_model():
-    log.debug(f"Running RAT-V1.0")
-    run_command(r"bash /houston2/pritam/mekong_rat/automate.sh > /houston2/pritam/mekong_rat/cronlogs/`date +\%Y\%m\%d`-from_ratv3.log", shell=True)
-
-def copy_generate_inflow():
-    log.debug(f"Copying RAT-V3 inflows over")
-    paths = {
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Nam_N.csv":"/houston2/pritam/mekong_rat/backend/Inflow/5136.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Ubol_.csv":"/houston2/pritam/mekong_rat/backend/Inflow/5149.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Lam_P.csv":"/houston2/pritam/mekong_rat/backend/Inflow/5150.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Sirid.csv":"/houston2/pritam/mekong_rat/backend/Inflow/5796.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Nam_T.csv":"/houston2/pritam/mekong_rat/backend/Inflow/6999.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Xe_Ka.csv":"/houston2/pritam/mekong_rat/backend/Inflow/7003.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Sesan.csv":"/houston2/pritam/mekong_rat/backend/Inflow/7203.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/Lower.csv":"/houston2/pritam/mekong_rat/backend/Inflow/7303.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5117 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5117.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5138 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5138.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5143 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5143.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5147 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5147.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5148 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5148.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5151 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5151.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5152 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5152.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5155 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5155.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5156 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5156.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5160 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5160.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5162 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5162.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5795 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5795.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/5797 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/5797.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7000 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7000.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7001 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7001.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7002 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7002.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7004 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7004.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7037 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7037.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7087 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7087.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7158 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7158.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7159 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7159.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7164 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7164.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7181 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7181.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7201 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7201.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7232 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7232.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7284 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7284.txt",
-        "/houston2/pritam/rat_mekong_v3/backend/data/inflow/7303 .csv":"/houston2/pritam/mekong_rat/backend/Inflow/7303.txt"
-    }
-
-    for p in paths:
-        log.debug(f"Copying {p} to {paths[p]}")
-        shutil.copy2(p, paths[p])
-
-def run_postprocess():
-    log.debug(f"Running old Postprocessing")
-    run_command("bash postprocess.sh", cwd='/houston2/pritam/mekong_rat/backend/Postprocessing', shell=True)
-
-def publish():
-    log.debug(f"Pushing results - Inflow")
-    run_command("sshpass -v -p 'SECRET' scp -o stricthostkeychecking=no /houston2/pritam/mekong_rat/backend/Inflow/* SECRET:path/at/server/data/inflow/", shell=True)
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/backend/scripts/utils/update_meta.py b/backend/scripts/utils/update_meta.py
deleted file mode 100644
index 2bd33241..00000000
--- a/backend/scripts/utils/update_meta.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import os
-import argparse
-import re
-import datetime
-import yaml
-
-
-def main():
-    config_path = "/houston2/pritam/rat_mekong_v3/backend/params/rat_mekong.yml"
-
-    config = yaml.safe_load(open(config_path, 'r'))
-
-    lag_of_days = 3
-
-    previous_end = (config['GLOBAL']['end'] - datetime.timedelta(days=lag_of_days)).strftime('%Y-%m-%d')
-    new_end = (datetime.datetime.now() - datetime.timedelta(days=lag_of_days)).strftime('%Y-%m-%d')
-
-
-    lines = []
-    with open(config_path, 'r') as f:
-        lines = f.readlines()
-    
-    resulting_lines = []
-    for line in lines:
-        if line.startswith('  end:'):
-            line = f"  end: {new_end}\n"
-        if line.startswith('  previous_end:'):
-            line = f"  previous_end: {previous_end}\n"
-        resulting_lines.append(line)
-    
-    with open(config_path, 'w') as dst:
-        dst.writelines(resulting_lines)
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/env.yml b/env.yml
deleted file mode 100644
index eb18f3ef..00000000
--- a/env.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: /houston2/pritam/rat_mekong_v3/.condaenv
-channels:
-  - conda-forge
-  - bioconda
-  - defaults
-dependencies:
-  - rasterio
-  - xarray
-  - jupyterlab
-  - numpy
-  - matplotlib
-  - netcdf4
-  - dask
-  - scipy
-  - ipywidgets
-  - yaml
-  - wget
-  - pandas
-  - scikit-learn
-  - conda-build
-  - ca-certificates
-  - certifi
-  - openssl
-  - ncl
-  - gdal
-  - fiona
-  - rtree
-  - bokeh
-  - python=3.9
-  - ipython
-  - jupyter
-  - geopandas
-  - julia
-  - earthengine-api
-  - google-cloud-sdk
-prefix: /houston2/pritam/rat_mekong_v3/.condaenv
diff --git a/environment.yml b/environment.yml
new file mode 100644
index 00000000..61660015
--- /dev/null
+++ b/environment.yml
@@ -0,0 +1,264 @@
+name: rat_env
+channels:
+  - conda-forge
+  - defaults
+dependencies:
+  - _libgcc_mutex=0.1
+  - _openmp_mutex=4.5
+  - affine=2.3.1
+  - aiohttp=3.8.3
+  - aiosignal=1.2.0
+  - async-timeout=4.0.2
+  - attrs=22.1.0
+  - beautifulsoup4=4.11.1
+  - blosc=1.21.1
+  - bokeh=2.4.3
+  - boost-cpp=1.78.0
+  - branca=0.5.0
+  - brotli=1.0.9
+  - brotli-bin=1.0.9
+  - brotlipy=0.7.0
+  - bzip2=1.0.8
+  - c-ares=1.18.1
+  - ca-certificates=2022.9.24
+  - cachetools=4.2.4
+  - cairo=1.16.0
+  - certifi=2022.9.24
+  - cffi=1.15.1
+  - cfitsio=4.1.0
+  - cftime=1.6.2
+  - chardet=5.0.0
+  - charset-normalizer=2.1.1
+  - click=8.0.4
+  - click-plugins=1.1.1
+  - cligj=0.7.2
+  - cloudpickle=2.2.0
+  - colorama=0.4.5
+  - conda=22.9.0
+  - conda-build=3.22.0
+  - conda-package-handling=1.9.0
+  - configparser=5.3.0
+  - contourpy=1.0.5
+  - cryptography=37.0.1
+  - curl=7.85.0
+  - cycler=0.11.0
+  - cytoolz=0.12.0
+  - dask=2022.3.0
+  - dask-core=2022.3.0
+  - distributed=2022.3.0
+  - earthengine-api=0.1.327
+  - expat=2.4.9
+  - filelock=3.8.0
+  - fiona=1.8.22
+  - folium=0.13.0
+  - font-ttf-dejavu-sans-mono=2.37
+  - font-ttf-inconsolata=3.000
+  - font-ttf-source-code-pro=2.038
+  - font-ttf-ubuntu=0.83
+  - fontconfig=2.14.0
+  - fonts-conda-ecosystem=1
+  - fonts-conda-forge=1
+  - fonttools=4.37.4
+  - freetype=2.12.1
+  - freexl=1.0.6
+  - frozenlist=1.3.1
+  - fsspec=2022.8.2
+  - future=0.18.2
+  - gdal=3.5.2
+  - geopandas=0.11.1
+  - geopandas-base=0.11.1
+  - geos=3.11.0
+  - geotiff=1.7.1
+  - gettext=0.21.1
+  - giflib=5.2.1
+  - glob2=0.7
+  - google-api-core=1.31.5
+  - google-api-python-client=1.12.8
+  - google-auth=1.35.0
+  - google-auth-httplib2=0.1.0
+  - google-cloud-core=2.3.1
+  - google-cloud-storage=2.5.0
+  - google-crc32c=1.1.2
+  - google-resumable-media=2.4.0
+  - googleapis-common-protos=1.56.4
+  - grpc-cpp=1.48.1
+  - grpcio=1.48.1
+  - hdf4=4.2.15
+  - hdf5=1.12.2
+  - heapdict=1.0.1
+  - httplib2=0.20.4
+  - httplib2shim=0.0.3
+  - icu=70.1
+  - idna=3.4
+  - importlib-metadata=4.11.4
+  - importlib_metadata=4.11.4
+  - iniconfig=1.1.1
+  - jinja2=3.1.2
+  - joblib=1.2.0
+  - jpeg=9e
+  - json-c=0.16
+  - kealib=1.4.15
+  - keyutils=1.6.1
+  - kiwisolver=1.4.4
+  - krb5=1.19.3
+  - lcms2=2.12
+  - ld_impl_linux-64=2.39
+  - lerc=4.0.0
+  - libabseil=20220623.0
+  - libarchive=3.5.2
+  - libblas=3.9.0
+  - libbrotlicommon=1.0.9
+  - libbrotlidec=1.0.9
+  - libbrotlienc=1.0.9
+  - libcblas=3.9.0
+  - libcrc32c=1.1.2
+  - libcurl=7.85.0
+  - libdap4=3.20.6
+  - libdeflate=1.14
+  - libedit=3.1.20191231
+  - libev=4.33
+  - libffi=3.4.2
+  - libgcc-ng=12.2.0
+  - libgdal=3.5.2
+  - libgfortran-ng=12.2.0
+  - libgfortran5=12.2.0
+  - libglib=2.74.0
+  - libgomp=12.2.0
+  - libiconv=1.17
+  - libkml=1.3.0
+  - liblapack=3.9.0
+  - liblief=0.12.2
+  - libnetcdf=4.8.1
+  - libnghttp2=1.47.0
+  - libnsl=2.0.0
+  - libopenblas=0.3.21
+  - libpng=1.6.38
+  - libpq=14.5
+  - libprotobuf=3.21.7
+  - librttopo=1.1.0
+  - libspatialindex=1.9.3
+  - libspatialite=5.0.1
+  - libsqlite=3.39.4
+  - libssh2=1.10.0
+  - libstdcxx-ng=12.2.0
+  - libtiff=4.4.0
+  - libuuid=2.32.1
+  - libwebp-base=1.2.4
+  - libxcb=1.13
+  - libxml2=2.9.14
+  - libzip=1.9.2
+  - libzlib=1.2.13
+  - locket=1.0.0
+  - lz4=4.0.0
+  - lz4-c=1.9.3
+  - lzo=2.10
+  - mapclassify=2.4.3
+  - markupsafe=2.1.1
+  - matplotlib-base=3.6.1
+  - msgpack-python=1.0.4
+  - multidict=6.0.2
+  - munch=2.5.0
+  - munkres=1.1.4
+  - ncurses=6.3
+  - netcdf4=1.6.1
+  - networkx=2.8.7
+  - nspr=4.32
+  - nss=3.78
+  - numpy=1.23.3
+  - openjpeg=2.5.0
+  - openssl=3.0.5
+  - packaging=21.3
+  - pandas=1.5.0
+  - partd=1.3.0
+  - patch=2.7.6
+  - patchelf=0.15.0
+  - pcre=8.45
+  - pcre2=10.37
+  - pillow=9.2.0
+  - pip=22.3
+  - pixman=0.40.0
+  - pkginfo=1.8.3
+  - pluggy=1.0.0
+  - poppler=22.04.0
+  - poppler-data=0.4.11
+  - postgresql=14.5
+  - proj=9.0.1
+  - protobuf=4.21.7
+  - psutil=5.9.2
+  - pthread-stubs=0.4
+  - py=1.11.0
+  - py-lief=0.12.2
+  - pyasn1=0.4.8
+  - pyasn1-modules=0.2.7
+  - pycosat=0.6.3
+  - pycparser=2.21
+  - pyopenssl=22.0.0
+  - pyparsing=3.0.9
+  - pyproj=3.4.0
+  - pysocks=1.7.1
+  - pytest=7.1.3
+  - python=3.9.13
+  - python-dateutil=2.8.2
+  - python-libarchive-c=4.0
+  - python_abi=3.9
+  - pytz=2022.4
+  - pyu2f=0.1.5
+  - pyyaml=6.0
+  - rasterio=1.3.2
+  - re2=2022.06.01
+  - readline=8.1.2
+  - requests=2.28.1
+  - rioxarray=0.12.2
+  - ripgrep=13.0.0
+  - rsa=4.9
+  - rtree=1.0.1
+  - ruamel_yaml=0.15.80
+  - scikit-learn=1.1.2
+  - scipy=1.9.1
+  - setuptools=65.5.0
+  - shapely=1.8.5
+  - simplejson=3.17.6
+  - six=1.16.0
+  - snappy=1.1.9
+  - snuggs=1.4.7
+  - sortedcontainers=2.4.0
+  - soupsieve=2.3.2.post1
+  - sqlite=3.39.4
+  - tblib=1.7.0
+  - threadpoolctl=3.1.0
+  - tiledb=2.11.3
+  - tk=8.6.12
+  - toml=0.10.2
+  - tomli=2.0.1
+  - toolz=0.12.0
+  - tornado=6.1
+  - tqdm=4.64.1
+  - typing-extensions=4.4.0
+  - typing_extensions=4.4.0
+  - tzcode=2022e
+  - tzdata=2022e
+  - unicodedata2=14.0.0
+  - uritemplate=3.0.1
+  - urllib3=1.26.11
+  - wheel=0.37.1
+  - xarray=2022.3.0
+  - xerces-c=3.2.3
+  - xorg-kbproto=1.0.7
+  - xorg-libice=1.0.10
+  - xorg-libsm=1.2.3
+  - xorg-libx11=1.7.2
+  - xorg-libxau=1.0.9
+  - xorg-libxdmcp=1.1.3
+  - xorg-libxext=1.3.4
+  - xorg-libxrender=0.9.10
+  - xorg-renderproto=0.11.1
+  - xorg-xextproto=7.3.0
+  - xorg-xproto=7.0.31
+  - xyzservices=2022.9.0
+  - xz=5.2.6
+  - yaml=0.2.5
+  - yarl=1.7.2
+  - zict=2.2.0
+  - zipp=3.9.0
+  - zlib=1.2.13
+  - zstd=1.5.2
diff --git a/meta.yaml b/meta.yaml
new file mode 100644
index 00000000..57b00514
--- /dev/null
+++ b/meta.yaml
@@ -0,0 +1,49 @@
+{% set name = "rat" %}
+{% set version = "2.1" %}
+
+package:
+  name: {{ name|lower }}
+  version: {{ version }}
+
+# source:
+#   url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/rat-{{ version }}.tar.gz
+#   sha256: b3a5045caa0a80ee4b01765350d049bfd6e3f2d63a02893df76aa4b342f00cf2
+# source:
+#   git_url: https://github.com/UW-SASWE/RAT.git
+#   git_branch: sm-main-pypi
+source:
+  path: ./
+
+build:
+  noarch: python
+  script: {{ PYTHON }} -m pip install . -vv
+  number: 1
+  entry_points:
+    - rat = rat.cli.rat_cli:main
+
+requirements:
+  host:
+    - git
+    - python >=3.6
+    - pip
+  run:
+    - python >=3.6
+    - pandas
+    - numpy
+    - xarray
+    - geopandas
+    - rasterio
+
+test:
+  requires:
+    - pytest
+
+about:
+  home: https://pypi.org/project/rat/
+  summary: Resevoir Monitoring using Satellite Remote Sensing
+  license: GPL-3.0
+  license_file: LICENSE
+
+extra:
+  recipe-maintainers:
+    - Pritam28877
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000..c8b411df
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,24 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "rat"
+version = "2.1"
+authors = [
+  { name="Pritam Das", email="pdas47@uw.edu" },
+  { name="Sanchit Minocha", email="msanchit@uw.edu" },
+]
+description = "Resevoir Monitoring using Satellite Remote Sensing"
+requires-python = ">=3.6"
+readme = "README.md"
+license = {file = "LICENSE"}
+classifiers = [
+    "Programming Language :: Python :: 3",
+    "License :: OSI Approved :: MIT License",
+    "Operating System :: OS Independent",
+]
+
+[project.urls]
+"Homepage" = "https://github.com/UW-SASWE/RAT"
+"Bug Tracker" = "https://github.com/UW-SASWE/RAT/issues"
\ No newline at end of file
diff --git a/setup.py b/setup.py
new file mode 100644
index 00000000..43cec53b
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,9 @@
+from setuptools import setup, find_packages
+
+
+setup(
+    name = "rat",
+    version = "2.1",
+    license = "GPL-3.0",
+    package_dir = {"": "src"}
+)
\ No newline at end of file
diff --git a/backend/scripts/__init__.py b/src/rat/__init__.py
similarity index 100%
rename from backend/scripts/__init__.py
rename to src/rat/__init__.py
diff --git a/src/rat/cli/rat_cli.py b/src/rat/cli/rat_cli.py
new file mode 100644
index 00000000..742d679f
--- /dev/null
+++ b/src/rat/cli/rat_cli.py
@@ -0,0 +1,201 @@
+import argparse
+import os
+from pathlib import Path
+import subprocess
+import shutil
+import requests, zipfile, io
+import yaml
+import ruamel.yaml as ryaml
+
+
+def init_func(args):
+    print("Initializing RAT using: ", args)
+
+    #### Directory creation
+    if args.project_dir is None:
+        project_dir_input = input(f"Enter path of RAT project directory: ")
+        project_dir = Path(project_dir_input).resolve()
+    else:
+        project_dir = Path(args.project_dir).resolve()
+    
+    try:
+        project_dir.mkdir(exist_ok=True)
+    except Exception as e:
+        print(f"Failed creating RAT project directory: {e}")
+        raise e
+    
+    if args.global_data is None:
+        global_data = str(input(f"Do you want to download global data? (y/N) : ")).capitalize()
+    else:
+        global_data = args.global_data
+    global_data_dir = project_dir.joinpath("global_data")
+
+    # create additional directories
+    data_dir = project_dir.joinpath('data')
+    data_dir.mkdir(exist_ok=True)
+    models_dir = project_dir.joinpath('models')
+    models_dir.mkdir(exist_ok=True)
+    params_dir = project_dir.joinpath('params')
+    params_dir.mkdir(exist_ok=True)
+
+    #### Model installation
+    # install metsim
+    metsim_path = models_dir.joinpath('metsim')
+    cmd = f"conda create -p {metsim_path} -c conda-forge metsim -y".split(" ")
+    print(f"Installing Metsim: {' '.join(cmd)}")
+    subprocess.run(cmd)
+    
+    # install vic
+    vic_path = models_dir.joinpath('vic')
+    cmd = f"conda create -p {vic_path} -c conda-forge vic -y".split(" ")
+    print(f"Installing VIC: {' '.join(cmd)}")
+    subprocess.run(cmd)
+    
+    # import download links
+    from rat_init_config import DOWNLOAD_LINKS
+
+    # install route
+    print(f"Downloading source code of routing model")
+    route_model_src_dl_path = DOWNLOAD_LINKS["route_model"]
+    r = requests.get(route_model_src_dl_path)
+    z = zipfile.ZipFile(io.BytesIO(r.content))
+    z.extractall(models_dir)
+    route_model = models_dir.joinpath("routing")
+    cmd = f"make"
+    print(f"Installing VIC-Route using make in directory: {route_model}")
+    subprocess.run(cmd, cwd=route_model)
+
+    #### download params
+    params_template_dl_path = DOWNLOAD_LINKS["params"]
+    r = requests.get(params_template_dl_path)
+    z = zipfile.ZipFile(io.BytesIO(r.content))
+    z.extractall(project_dir)
+
+    #### download global data
+    global_data_dl_path = DOWNLOAD_LINKS["global_data"]
+    global_vic_params_dl_path = DOWNLOAD_LINKS["global_vic_params"]
+    
+    if global_data == 'Y':
+        r = requests.get(global_data_dl_path)
+        z = zipfile.ZipFile(io.BytesIO(r.content))
+        z.extractall(project_dir)  # saved as the `global_data` value naturally
+
+        # extract inner zips
+        [zipfile.ZipFile(inner_z, 'r').extractall(global_data_dir) for inner_z in global_data_dir.glob("*.zip")]
+
+        # download and extract vic params in the global data dir
+        r = requests.get(global_vic_params_dl_path)
+        z = zipfile.ZipFile(io.BytesIO(r.content))
+        z.extractall(global_data_dir)
+
+        # extract inner inner zips (vic params)
+        [zipfile.ZipFile(inner_z, 'r').extractall(global_data_dir.joinpath('global_vic_params')) for inner_z in global_data_dir.joinpath('global_vic_params').glob("*.zip")]
+
+        # cleanup
+        [p.unlink() for p in global_data_dir.glob("**/*.zip")]
+
+    ## cleanup
+    # delete all __MACOSX folders
+    [shutil.rmtree(junk_dir) for junk_dir in project_dir.glob("**/__MACOSX/")]
+
+    # determine how many cores are available
+    n_cores = None
+    try:
+        from multiprocessing import cpu_count
+        n_cores = cpu_count()
+    except Exception as e:
+        print(f"Failed to determine number of cores: {e}")
+        print("Leaving GLOBAL:Multiprocessing empty in config file. Please update manually if needed.")
+
+    #### update params
+    update_param_file(
+        project_dir,
+        global_data == 'Y',
+        n_cores
+    )
+
+
+def update_param_file(
+        project_dir: Path,
+        global_data_downloaded: bool = False, # if global data was downloaded, then we can use the global_data dir
+        n_cores: int = None
+    ):
+
+    config_template_path = (project_dir / 'params' / 'rat_config_template.yml')
+    config_path = (project_dir / 'params' / 'rat_config.yml')
+
+    ryaml_client = ryaml.YAML()
+    config_template = ryaml_client.load(config_template_path.read_text())
+    
+    # read suffixes file
+    from rat.cli.rat_init_config import SUFFIXES_GLOBAL, SUFFIXES_NOTGLOBAL
+
+    # if global data was downloaded, update the suffixes of the config file's contents by prepending the project dir path
+    if global_data_downloaded:
+        for k1, v1 in SUFFIXES_GLOBAL.items():
+            for k2, v2 in v1.items():
+                config_template[k1][k2] = str(project_dir.joinpath(v2))
+    else:
+        for k1, v1 in SUFFIXES_NOTGLOBAL.items():
+            for k2, v2 in v1.items():
+                config_template[k1][k2] = str(project_dir.joinpath(v2))
+
+    # update the number of cores
+    config_template['GLOBAL']['multiprocessing'] = n_cores
+
+    ryaml_client.dump(config_template, config_path.open('w'))
+
+
+def run_func(args):
+    from rat.run_rat import run_rat
+
+    run_rat(args.param)
+
+def main():
+    ## CLI interface
+    p = argparse.ArgumentParser(description='Reservoir Assessment Tool')
+
+    # Treat the different commands, such as `init`, and `run` as different sub parsers
+    command_parsers = p.add_subparsers()
+
+    # Init command
+    init_parser = command_parsers.add_parser('init', help='Initialize RAT')
+
+    # options for init parser
+    init_parser.add_argument(
+        '-d', '--dir', 
+        help='Specify RAT project directory', 
+        action='store',
+        dest='project_dir',
+        required=False
+    )
+    init_parser.add_argument(
+        '-g', '--global_data', 
+        help='Flag to download global data will be downloaded',
+        action='store_true',
+        dest='global_data',
+        required=False,
+        default=None
+    )
+
+    init_parser.set_defaults(func=init_func)
+
+    # Run command
+    run_parser = command_parsers.add_parser('run', help='Run RAT')
+
+    run_parser.add_argument(
+        '-p', '--param',
+        help='RAT Parameter file',
+        action='store',
+        dest='param',
+        required=True
+    )
+    
+    run_parser.set_defaults(func=run_func)
+
+    args = p.parse_args()
+    args.func(args)
+
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/src/rat/cli/rat_init_config.py b/src/rat/cli/rat_init_config.py
new file mode 100644
index 00000000..3aa6c02e
--- /dev/null
+++ b/src/rat/cli/rat_init_config.py
@@ -0,0 +1,75 @@
+DOWNLOAD_LINKS = {
+    'route_model': "https://www.dropbox.com/s/9jwep2g5pyj8sni/routing.zip?dl=1",
+    'params': "https://www.dropbox.com/s/9n6b1pn73fgl0y9/params.zip?dl=1",
+    'global_data': "https://www.dropbox.com/s/u8vc3oxujmaak97/global_data.zip?dl=1",
+    'global_vic_params': "https://www.dropbox.com/s/jsg2wu62qi2ltwz/global_vic_params.zip?dl=1"
+}
+
+SUFFIXES_GLOBAL = {
+    'GLOBAL': {
+        'project_dir': '',
+        'data_dir': 'data',
+        'basin_shpfile': 'global_data/global_basin_data/shapefiles/mrb_basins.json',
+        'elevation_tif_file': 'global_data/global_elevation_data/World_e-Atlas-UCSD_SRTM30-plus_v8.tif',
+        'basins_metadata': 'params/basins_metadata.csv'
+    },
+
+    'METSIM':{
+        'metsim_env': 'models/metsim',
+        'metsim_param_file': 'params/metsim/params.yaml'
+    },
+
+    'VIC': {
+        'vic_env': 'models/vic',
+        'vic_param_file': 'params/vic/vic_params.txt',
+        'vic_global_param_dir': 'global_data/global_vic_params'
+    },
+
+    'ROUTING': {
+        'route_model': 'models/routing/rout',
+        'route_param_file': 'params/routing/route_param.txt',
+        'global_flow_dir_tif_file': 'global_data/global_drt_flow_file/global_drt_flow_16th.tif',
+        'stations_vector_file': 'global_data/global_dam_data/GRanD_dams_v1_3_filtered.shp'
+    },
+
+    'ROUTING PARAMETERS':{
+        'uh': 'params/routing/uh.txt'
+    },
+
+    'GEE': {
+        'reservoir_vector_file': 'global_data/global_reservoir_data/GRanD_reservoirs_v1_3.shp'
+    },
+
+    'ALTIMETER': {
+        'altimeter_tracks': 'global_data/global_altimetry/j3_tracks.geojson',
+        'geoid_grid': 'global_data/global_altimetry/geoidegm2008grid.mat'
+    },
+}
+
+SUFFIXES_NOTGLOBAL = {
+    'GLOBAL': {
+        'project_dir': '',
+        'data_dir': 'data',
+        'basins_metadata': 'params/basins_metadata.csv'
+    },
+
+    'METSIM':{
+        'metsim_env': 'models/metsim',
+        'metsim_param_file': 'params/metsim/params.yaml'
+    },
+
+    'VIC': {
+        'vic_env': 'models/vic',
+        'vic_param_file': 'params/vic/vic_params.txt',
+    },
+
+    'ROUTING': {
+        'route_model': 'models/routing/rout',
+        'route_param_file': 'params/routing/route_param.txt',
+    },
+
+    'ROUTING PARAMETERS':{
+        'uh': 'params/routing/uh.txt'
+    }
+}
+
diff --git a/src/rat/core/run_altimetry.py b/src/rat/core/run_altimetry.py
new file mode 100644
index 00000000..f2e5d5e1
--- /dev/null
+++ b/src/rat/core/run_altimetry.py
@@ -0,0 +1,125 @@
+import configparser
+import os
+import pandas as pd
+import geopandas as gpd
+from rat.utils.utils import create_directory
+from rat.data_processing import altimetry as alt
+
+
+def altimeter_routine(reservoir_df, reservoir_column_dict, j3tracks, custom_reservoir_range_dict,
+                                         user, password, lastcycle_no, basin_name, basin_data_dir, geoidpath, save_dirpath):
+    resname = str(reservoir_df[reservoir_column_dict['unique_identifier']])
+    latest_cycle = lastcycle_no         # for initializing latest cycle number
+
+    j3_pass = alt.get_j3_tracks(reservoir_df, reservoir_column_dict, j3tracks, custom_reservoir_range_dict)
+    print(j3_pass)
+
+    if j3_pass is None:
+        return (None, latest_cycle)
+
+    # Directory to save raw downloaded altimetry data
+    savedir = create_directory(os.path.join(basin_data_dir,'altimetry','raw',resname), True)
+
+    # Directory to save extracted altimetry data from 
+    extracteddir = create_directory(os.path.join(basin_data_dir,'altimetry','extracted',resname), True)
+    
+    # Directory to save altimetry time-series for different reservoirs 
+    resultsdir = create_directory(save_dirpath, True)
+    savepath = os.path.join(resultsdir, f'{resname}.csv')
+
+    tracks = j3_pass['tracks']
+    lat_ranges = j3_pass['lat_range']
+
+    for track, lat_range in zip(tracks, lat_ranges):
+        latest_cycle = alt.get_latest_cycle(user, password, lastcycle_no)
+        print(f"Latest cycle: {latest_cycle}")
+
+        ## Getting the starting cycle for downloading data
+        starting_cycle = 1
+        cycles_downloaded = []
+        ## Replace 'gdr_f' with 'gdr_d' if downloading other than jason 3 data
+        if os.path.exists(os.path.join(savedir, f'j3_{track:03}','gdr_f')):
+            for f in os.listdir(os.path.join(savedir, f'j3_{track:03}','gdr_f')):
+                if(f.startswith('cycle_')):
+                    cycles_downloaded.append(int(f[-3:]))
+            if(cycles_downloaded):
+                starting_cycle = max(cycles_downloaded)
+
+        print(f"Downloading data from cycle {starting_cycle} to {latest_cycle}")
+        alt.download_data(user, password, savedir, track, starting_cycle, latest_cycle, 3)
+        extractedf = alt.extract_data(savedir + f'/j3_{track:03}', extracteddir, lat_range[0], lat_range[1], track, 3, starting_cycle, latest_cycle, '_app_mod')
+
+    ## One-reservoir has one time-series from all tracks
+    print("Gathering extracted data to create time-series")
+    alt.generate_timeseries(extracteddir, savepath, lat_range[0], lat_range[1], geoidpath)
+    
+    return (resname,latest_cycle)
+
+def run_altimetry(config, section, res_shpfile, res_shpfile_column_dict, basin_name, basin_data_dir, save_dir):
+    reservoirs_gdf = gpd.read_file(res_shpfile) 
+    
+    ## Declaring variables to see if only certain reservoirs needs to be processed or certain range of a reservoir is available
+    to_process = None
+    reservoir_latlon_ranges_dict = None
+
+    reservoirs_csv_file_path_default = os.path.join(basin_data_dir,'altimetry','altimetry_basin_params',
+                                                                            'reservoir_altimetry_basins.csv')
+    if(config[section].get('reservoirs_csv_file')):
+        reservoirs_csv_file_path = config[section].get('reservoirs_csv_file')
+    elif(os.path.exists(reservoirs_csv_file_path_default)):
+        reservoirs_csv_file_path = reservoirs_csv_file_path_default
+    else:
+        reservoirs_csv_file_path = None
+
+    if(reservoirs_csv_file_path):
+        ## Reading specific list of reservoirs to process
+        basin_alt_reservoirs = pd.read_csv(reservoirs_csv_file_path)
+        if not (config[section].get('only_for_range')):
+            to_process = basin_alt_reservoirs['reservoir_uni_id'].astype(str).to_list()
+
+        ## Reading min and max latitude if specified for any reservoir
+        basin_alt_reservoirs_latrange = basin_alt_reservoirs.dropna()
+        if not basin_alt_reservoirs_latrange.empty:
+            reservoir_latlon_ranges_dict = basin_alt_reservoirs_latrange.set_index('reservoir_uni_id')[['min_lat','max_lat']].apply(
+                                                                                                        tuple,axis=1).to_dict()
+
+    secrets = configparser.ConfigParser()
+    secrets.read(config['CONFIDENTIAL']['secrets'])
+    username = secrets["aviso"]["username"]
+    pwd = secrets["aviso"]["pwd"]
+
+    lastcycle_no = config[section]['last_cycle_number']
+    latest_cycle = lastcycle_no  # for initializing latest cycle number
+    
+    j3_tracks = config[section]['altimeter_tracks']
+    j3_tracks_gdf = gpd.read_file(j3_tracks, driver='GeoJSON')
+
+    geoidpath = config[section]['geoid_grid']
+    
+    if(to_process != None):
+        for reservoir_no,reservoir in reservoirs_gdf.iterrows():
+            # Reading reservoir information
+            reservoir_name = str(reservoir[res_shpfile_column_dict['unique_identifier']])
+            if (reservoir_name in to_process):
+                print(f"Processing {reservoir_name}")
+                output_res_name, latest_cycle = altimeter_routine(reservoir, res_shpfile_column_dict, j3_tracks_gdf, reservoir_latlon_ranges_dict, 
+                                    username, pwd, lastcycle_no, 
+                                    basin_name, basin_data_dir, geoidpath, save_dir)
+    else:
+        res_names_for_altimetry = []
+        for reservoir_no,reservoir in reservoirs_gdf.iterrows():
+            # Reading reservoir information
+            reservoir_name = str(reservoir[res_shpfile_column_dict['unique_identifier']])
+            print(f"Processing {reservoir_name}")
+            output_res_name, latest_cycle = altimeter_routine(reservoir, res_shpfile_column_dict, j3_tracks_gdf, reservoir_latlon_ranges_dict, 
+                                username, pwd, lastcycle_no, 
+                                basin_name, basin_data_dir, geoidpath, save_dir)
+            if output_res_name is not None:
+                res_names_for_altimetry.append(output_res_name)
+        altimetry_res_names_df = pd.DataFrame(data={'reservoir_uni_id':res_names_for_altimetry})
+        altimetry_res_names_df['min_lat'] = ''
+        altimetry_res_names_df['max_lat'] = ''
+        create_directory(os.path.join(basin_data_dir,'altimetry','altimetry_basin_params',''))
+        altimetry_res_names_df.to_csv(reservoirs_csv_file_path_default,index=False)
+    
+    return latest_cycle
diff --git a/backend/scripts/core/run_metsim.py b/src/rat/core/run_metsim.py
similarity index 57%
rename from backend/scripts/core/run_metsim.py
rename to src/rat/core/run_metsim.py
index 47bb02e5..432b352d 100644
--- a/backend/scripts/core/run_metsim.py
+++ b/src/rat/core/run_metsim.py
@@ -1,15 +1,16 @@
+from http.server import executable
 from logging import getLogger
-import yaml
+import numpy as np
 import os
 import xarray as xr
-
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import run_command
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.run_command import run_command
+from rat.utils.utils import create_directory
 
 log = getLogger(f"{LOG_NAME}.{__name__}")
 
 class MetSimRunner():
-    def __init__(self, param_path, metsim_env, conda_hook, results_path, multiprocessing) -> None:
+    def __init__(self, param_path, metsim_env, results_path, multiprocessing, conda_hook=None) -> None:
         self._param_path = param_path
         self._metsim_env = metsim_env
         self._conda_hook = conda_hook
@@ -17,21 +18,12 @@ def __init__(self, param_path, metsim_env, conda_hook, results_path, multiproces
         self._mp = multiprocessing
 
     def run_metsim(self):
-        args = f'source {self._conda_hook} && conda activate {self._metsim_env} && ms -n {self._mp} {self._param_path}'
+        if not self._conda_hook:
+            args = f'source activate {self._metsim_env} && ms -n {self._mp} {self._param_path}'
+        else:
+            args = f'source {self._conda_hook} && conda activate {self._metsim_env} && ms -n {self._mp} {self._param_path}'
         # print("will run: ", args)
-        ret_code = run_command(args, shell=True)
-    
-    def diasgg_results(self, forcings_dir):
-        log.debug("Disaggregating metsim results to forcings. Forcings dir: %s", forcings_dir)
-        ds = xr.open_dataset(self.results_path).load()
-
-        years, datasets = zip(*ds.groupby('time.year'))
-        paths = [os.path.join(forcings_dir, f'forcing_{y}.nc') for y in years]
-
-        log.debug("Will disaggregate to %s files: %s", len(paths), ', '.join(paths))
-        xr.save_mfdataset(datasets, paths)
-
-        return "_".join(paths[0].split("_")[:-1]) + "_"
+        ret_code = run_command(args, metsim=True, shell=True, executable="/bin/bash")
     
     def convert_to_vic_forcings(self, forcings_dir):
         # The results have to be converted to VIC readable yearly netcdf files.
@@ -40,6 +32,9 @@ def convert_to_vic_forcings(self, forcings_dir):
         years, dataset = zip(*ds.groupby('time.year'))
         paths = [os.path.join(forcings_dir, f'forcing_{y}.nc') for y in years]
 
+        #Create directory if doesn't exist
+        create_directory(forcings_dir)
+
         log.debug(f"Will create {len(years)} forcing files")
         for year, ds, p in zip(years, dataset, paths):
             if os.path.isfile(p):
@@ -51,11 +46,9 @@ def convert_to_vic_forcings(self, forcings_dir):
                 # xr.concat([existing, ds], dim='time').to_netcdf(p)
                 last_existing_time = existing.time[-1]
                 log.debug("Existing data: %s", last_existing_time)
-                ds = ds.sel(time=slice(last_existing_time, ds.time[-1]))
-                ds = ds.isel(time=slice(1, None))
+                ds = ds.sel(time=slice(last_existing_time + np.timedelta64(6,'h'), ds.time[-1]))
+                #ds = ds.isel(time=slice(1, None))
                 xr.merge([existing, ds]).to_netcdf(p)
             else:
                 log.debug(f"Writing file for year {year}: {p} -- Updating new")
-                ds.to_netcdf(p)
-        
-        return "_".join(paths[0].split("_")[:-1]) + "_"
\ No newline at end of file
+                ds.to_netcdf(p)
\ No newline at end of file
diff --git a/src/rat/core/run_postprocessing.py b/src/rat/core/run_postprocessing.py
new file mode 100644
index 00000000..45b7a121
--- /dev/null
+++ b/src/rat/core/run_postprocessing.py
@@ -0,0 +1,251 @@
+import os
+import pandas as pd
+import numpy as np
+import xarray as xr
+import geopandas as gpd
+import warnings
+
+warnings.filterwarnings("ignore")
+
+from logging import getLogger
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.science import penman
+
+log = getLogger(f"{LOG_NAME}.{__name__}")
+
+
+def calc_dels(aecpath, sareapath, savepath):
+    aec = pd.read_csv(aecpath)
+    df = pd.read_csv(sareapath, parse_dates=['date'])
+
+    df = df.drop_duplicates('date')
+
+    get_elev = lambda area: np.interp(area, aec['CumArea'], aec['Elevation'])
+
+    df['wl (m)'] = df['area'].apply(get_elev)
+
+    # Even after filtering, use the rolling mean
+    # df['wl (m)'] = df['wl (m)'].rolling(5).mean()
+    # df['area'] = df['area'].rolling(5).mean()
+
+    # Convert area from km^2 to m^2
+    df['area'] = df['area'] * 1e6
+
+    A0 = df['area'].iloc[:-1]
+    A1 = df['area'].iloc[1:]
+
+    h0 = df['wl (m)'].iloc[:-1]
+    h1 = df['wl (m)'].iloc[1:]
+
+    S = (h1.values - h0.values)*(A1.values + A0.values)/2
+    S = np.insert(S, 0, np.nan)
+
+    S =  S * 1e-9                               # Convert to BCM
+
+    df['dS'] = S
+
+    df.to_csv(savepath, index=False)
+
+def calc_E(res_data, start_date, end_date, forcings_path, vic_res_path, sarea_path, savepath):
+    ds = xr.open_dataset(vic_res_path)
+    forcings_ds = xr.open_mfdataset(forcings_path, engine='netcdf4')
+    ## Slicing the latest run time period
+    ds = ds.sel(time=slice(start_date, end_date))
+    forcings_ds = forcings_ds.sel(time=slice(start_date, end_date))
+
+    # create buffer to get required bounds
+    res_geom = res_data.geometry
+    res_buf = res_geom.buffer(0.1)
+
+    minx, miny, maxx, maxy = res_buf.bounds
+
+    log.debug(f"Bounds: {res_buf.bounds}")
+    log.debug("Clipping forcings")
+    forcings_ds_clipped = forcings_ds['air_pressure'].sel(lon=slice(minx, maxx), lat=slice(maxy, miny))
+    forcings = forcings_ds_clipped.load()
+    
+    log.debug("Clipping VIC results")
+    ds_clipped = ds.sel(lon=slice(minx, maxx), lat=slice(maxy, miny))
+    reqvars_clipped = ds_clipped[['OUT_EVAP', 'OUT_R_NET', 'OUT_VP', 'OUT_WIND', 'OUT_AIR_TEMP']]
+    reqvars = reqvars_clipped.load()
+
+    # get sarea
+    log.debug("Getting surface areas")
+    sarea = pd.read_csv(sarea_path, parse_dates=['date']).rename({'date': 'time'}, axis=1)[['time', 'area']]
+    sarea = sarea.set_index('time')
+    upsampled_sarea = sarea.resample('D').mean()
+    sarea_interpolated = upsampled_sarea.interpolate(method='linear')
+    
+    ## Slicing the latest run time period
+    sarea_interpolated = sarea_interpolated[start_date:end_date]
+    
+    log.debug("Checking if grid cells lie inside reservoir")
+    last_layer = reqvars.isel(time=-1).to_dataframe().reset_index()
+    temp_gdf = gpd.GeoDataFrame(last_layer, geometry=gpd.points_from_xy(last_layer.lon, last_layer.lat))
+    points_within = temp_gdf[temp_gdf.within(res_geom)]['geometry']
+
+    if len(points_within) == 0:
+        log.debug("No points inside reservoir, using nearest point to centroid")
+        centroid = res_geom.centroid
+
+        data = reqvars.sel(lat=centroid.y, lon=centroid.x, method='nearest')
+        data = data.to_dataframe().reset_index()[1:].set_index('time')
+
+        P = forcings.sel(lat=centroid.y, lon=centroid.x, method='nearest')
+        P = P.to_dataframe().reset_index().set_index('time')['air_pressure'].resample('1D').mean()[1:]
+        P.head()
+
+    else:
+        # print(f"[!] {len(points_within)} Grid cells inside reservoir found, averaging their values")
+        data = reqvars.sel(lat=points_within.y, lon=points_within.x, method='nearest').to_dataframe().reset_index().groupby('time').mean()[1:]
+
+        P = forcings.sel(lat=points_within.y, lon=points_within.x, method='nearest').resample({'time':'1D'}).mean().to_dataframe().groupby('time').mean()[1:]
+
+    data['area'] = sarea_interpolated['area']
+    data['P'] = P
+    data = data.dropna()
+    if (data.empty):
+        print('After removal of NAN values, no data left to calculate evaporation.')
+        return None
+    else:
+        data['penman_E'] = data.apply(lambda row: penman(row['OUT_R_NET'], row['OUT_AIR_TEMP'], row['OUT_WIND'], row['OUT_VP'], row['P'], row['area']), axis=1)
+        data = data.reset_index()
+
+        # Save (Writing new file if not exist otherwise append)
+        if os.path.isfile(savepath):
+            existing_data = pd.read_csv(savepath, parse_dates=['time'])
+            new_data = data[['time', 'penman_E']].rename({'penman_E': 'OUT_EVAP'}, axis=1)
+            # Concat the two dataframes into a new dataframe holding all the data (memory intensive):
+            complement = pd.concat([existing_data, new_data], ignore_index=True)
+            # Remove all duplicates:
+            complement.drop_duplicates(subset=['time'],inplace=True, keep='first')
+            complement.to_csv(savepath, index=False)
+        else:
+            data[['time', 'penman_E']].rename({'penman_E': 'OUT_EVAP'}, axis=1).to_csv(savepath, index=False)
+
+
+def calc_outflow(inflowpath, dspath, epath, area, savepath):
+    inflow = pd.read_csv(inflowpath, parse_dates=["date"])
+    E = pd.read_csv(epath, parse_dates=['time'])
+
+    if isinstance(dspath, str):
+        df = pd.read_csv(dspath, parse_dates=['date'])
+    else:
+        df = dspath
+    
+    inflow = inflow[inflow['date']>=df['date'].iloc[0]]
+    inflow = inflow[inflow['date']<=df['date'].iloc[-1]]
+    inflow = inflow.set_index('date')
+
+    inflow['streamflow'] = inflow['streamflow'] * (60*60*24)
+
+    E = E[E['time']>=df['date'].iloc[0]]
+    E = E[E['time']<=df['date'].iloc[-1]]
+    E = E.set_index('time')
+
+    E['OUT_EVAP'] = E['OUT_EVAP'] * (0.001 * area * 1000*1000)  # convert mm to m3. E in mm, area in km2
+
+    last_date = df['date'][:-1]
+    df = df.iloc[1:,:]
+    
+    df['last_date'] = last_date.values
+    
+    df['inflow_vol'] = df.apply(lambda row: inflow.loc[row['last_date']:row['date'], 'streamflow'].sum(), axis=1)
+    df['evap_vol'] = df.apply(lambda row: E.loc[(E.index > row['last_date'])&(E.index <= row['date']), 'OUT_EVAP'].sum(), axis=1)
+    df['outflow_vol'] = df['inflow_vol'] - (df['dS']*1e9)# - df['evap_vol']
+    df['days_passed'] = (df['date'] - df['last_date']).dt.days
+    df['outflow_rate'] = df['outflow_vol']/(df['days_passed']*24*60*60)   # cumecs
+
+    df.to_csv(savepath, index=False)
+
+
+def run_postprocessing(basin_name, basin_data_dir, reservoir_shpfile, reservoir_shpfile_column_dict, aec_dir_path, start_date, end_date,
+                            evap_datadir, dels_savedir, outflow_savedir, vic_status, routing_status, gee_status):
+    # read file defining mapped resrvoirs
+    # reservoirs_fn = os.path.join(project_dir, 'backend/data/ancillary/RAT-Reservoirs.geojson')
+    reservoirs = gpd.read_file(reservoir_shpfile)
+    start_date_str = start_date.strftime("%Y-%m-%d")
+    end_date_str = end_date.strftime("%Y-%m-%d")
+    # Defining flags
+    EVAP_STATUS = 0
+    DELS_STATUS = 0
+    OUTFLOW_STATUS = 0
+
+    # SArea
+    sarea_raw_dir = os.path.join(basin_data_dir,'gee', "gee_sarea_tmsos")
+
+    # DelS
+    if(gee_status):
+        log.debug("Calculating ∆S")
+        aec_dir = aec_dir_path
+
+        for reservoir_no,reservoir in reservoirs.iterrows():
+            # Reading reservoir information
+            reservoir_name = str(reservoir[reservoir_shpfile_column_dict['unique_identifier']])
+            sarea_path = os.path.join(sarea_raw_dir, reservoir_name + ".csv")
+            savepath = os.path.join(dels_savedir, reservoir_name + ".csv")
+            aecpath = os.path.join(aec_dir, reservoir_name + ".csv")
+
+            if os.path.isfile(sarea_path):
+                log.debug(f"Calculating ∆S for {reservoir_name}, saving at: {savepath}")
+                calc_dels(aecpath, sarea_path, savepath)
+            else:
+                log.debug(f"{sarea_path} not found; skipping ∆S calculation")
+        DELS_STATUS=1
+    else:
+        log.debug("Cannot Calculate ∆S because GEE Run Failed.")
+        
+
+    # Evaporation
+    if(vic_status and gee_status):
+        log.debug("Retrieving Evaporation")
+        vic_results_path = os.path.join(basin_data_dir,'vic', "vic_outputs/nc_fluxes."+start_date_str+".nc")
+        forcings_path = os.path.join(basin_data_dir,'vic', "vic_inputs/*.nc")
+
+        for reservoir_no,reservoir in reservoirs.iterrows():
+            # Reading reservoir information
+            reservoir_name = str(reservoir[reservoir_shpfile_column_dict['unique_identifier']])
+            sarea_path = os.path.join(sarea_raw_dir, reservoir_name + ".csv")
+            e_path = os.path.join(evap_datadir, reservoir_name + ".csv")
+            
+            if os.path.isfile(sarea_path):
+                log.debug(f"Calculating Evaporation for {reservoir_name}")
+                # calc_E(e_path, respath, vic_results_path)
+                calc_E(reservoir, start_date_str, end_date_str, forcings_path, vic_results_path, sarea_path, e_path)
+            else:
+                log.debug(f"{sarea_path} not found; skipping evaporation calculation")
+        EVAP_STATUS = 1
+    elif((not vic_status) and (not gee_status)):
+        log.debug("Cannot Retrieve Evaporation because both VIC and GEE Run Failed.")
+    elif(vic_status):
+        log.debug("Cannot Retrieve Evaporation because VIC Run Failed.")
+    else:
+        log.debug("Cannot Retrieve Evaporation because GEE Run Failed.")
+
+    # Outflow
+    if((routing_status) and (EVAP_STATUS) and (DELS_STATUS)):
+        log.debug("Calculating Outflow")
+        inflow_dir = os.path.join(basin_data_dir,'ro', "rout_inflow")
+
+        for reservoir_no,reservoir in reservoirs.iterrows():
+            # Reading reservoir information
+            reservoir_name = str(reservoir[reservoir_shpfile_column_dict['unique_identifier']])
+            deltaS = os.path.join(dels_savedir, reservoir_name + ".csv")
+            inflowpath = os.path.join(inflow_dir, reservoir_name[:5] + ".csv")  ## Routing model keeps only first 5 letters of the reservoir name as file name
+            epath = os.path.join(evap_datadir, reservoir_name + ".csv")
+            a = float(reservoir[reservoir_shpfile_column_dict['area_column']])
+
+            savepath = os.path.join(outflow_savedir, reservoir_name + ".csv")
+            log.debug(f"Calculating Outflow for {reservoir_name} saving at: {savepath}")
+            calc_outflow(inflowpath, deltaS, epath, a, savepath)
+        OUTFLOW_STATUS = 1
+    else:
+        log.debug("Cannot Calculate Outflow because either evaporation, ∆S or Inflow is missing.")
+    
+    return (DELS_STATUS, EVAP_STATUS, OUTFLOW_STATUS)
+def main():
+    pass
+
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/backend/scripts/core/run_routing.py b/src/rat/core/run_routing.py
similarity index 63%
rename from backend/scripts/core/run_routing.py
rename to src/rat/core/run_routing.py
index ebc0514d..c02f0550 100644
--- a/backend/scripts/core/run_routing.py
+++ b/src/rat/core/run_routing.py
@@ -1,13 +1,12 @@
-import logging
+from http.server import executable
 import pandas as pd
 import rasterio as rio
 import os
 import datetime
-import subprocess
 
 from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import run_command
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.run_command import run_command
 
 log = getLogger(LOG_NAME)
 
@@ -31,7 +30,11 @@ def __init__(self, project_dir, result_dir, inflow_dir, model_path, param_path,
         log.debug("Station file (X-Y): %s", self.station_path_xy)
 
         self.fdr = self._read_fdr(fdr_path)
-        self.stations = self._read_stations(station_path_latlon)
+        if os.path.exists(station_path_latlon):
+            self.stations = self._read_stations(station_path_latlon)
+            self.station_file_creation = True
+        else:
+            self.station_file_creation = False
 
     def _read_fdr(self, fdr_path) -> rio.DatasetReader:
         log.debug("Reading Flow Direction file from: %s", fdr_path)
@@ -55,30 +58,33 @@ def _read_stations(self, station_path) -> pd.DataFrame:
         return stations
 
     def create_station_file(self):
-        log.debug("Creating station file (X-Y) at: %s", self.station_path_xy)
-
-        self.stations[['y', 'x']] = self.stations.apply(
-            lambda row: pd.Series(
-                    self._get_xy(row['lat'], row['lon']), 
-                    index=['x', 'y']), 
-                    axis=1
-                )
-        self.stations[['run', 'name', 'x', 'y', 'filler']].to_csv(
-            self.station_path_xy, 
-            sep='\t', 
-            header=False, 
-            index=False, 
-            line_terminator='\nNONE\n'
-        )
+        if(self.station_file_creation):
+            log.debug("Creating station file (X-Y) at: %s", self.station_path_xy)
+
+            self.stations[['y', 'x']] = self.stations.apply(
+                lambda row: pd.Series(
+                        self._get_xy(row['lat'], row['lon']), 
+                        index=['x', 'y']), 
+                        axis=1
+                    )
+            self.stations[['run', 'name', 'x', 'y', 'filler']].to_csv(
+                self.station_path_xy, 
+                sep='\t', 
+                header=False, 
+                index=False, 
+                line_terminator='\nNONE\n'
+            )
 
     def run_routing(self):
         # TODO parse the output of routing model to to remove logs, keep a track of files stations
         #   and their generated output files
         log.log(NOTIFICATION, "Running Routing model")
 
-        args = [self.model_path, self.param_path]
+        # args = self.model_path, self.param_path]
+        args = f'cd {self.project_dir} && {self.model_path} {self.param_path}'
         log.debug("Running: %s", " ".join(args))
-        ret_code = run_command(args)
+        # ret_code = run_command(['cd',self.project_dir])
+        ret_code = run_command(args,shell=True, executable="/bin/bash")
 
         # clean up
         log.debug("Cleaning up routing files")
@@ -100,7 +106,18 @@ def generate_inflow(self):
         for f in files:
             outpath= os.path.join(self.inflow_dir, f.split(os.sep)[-1]).replace('.day', '.csv')
             log.debug("Converting %s, writing to %s", f, outpath)
-            self._convert_streamflow(f).to_csv(outpath, index=False)
+            ## Appending data if files exists otherwise creating new
+            if os.path.isfile(outpath):
+                existing_data = pd.read_csv(outpath, parse_dates=['date'])
+                new_data = self._convert_streamflow(f)
+                # Concat the two dataframes into a new dataframe holding all the data (memory intensive):
+                complement = pd.concat([existing_data, new_data], ignore_index=True)
+                # Remove all duplicates:
+                complement.drop_duplicates(subset=['date'],inplace=True, keep='first')
+                complement.sort_values(by='date', inplace=True)
+                complement.to_csv(outpath, index=False)
+            else:
+                self._convert_streamflow(f).to_csv(outpath, index=False)
 
 
     def _convert_streamflow(self, df_path) -> pd.DataFrame:
@@ -112,7 +129,7 @@ def _convert_streamflow(self, df_path) -> pd.DataFrame:
             parse_dates=[['year', 'month', 'day']]
         ).rename({"year_month_day": "date"}, axis=1)
         
-        df['streamflow'] = df['streamflow'] * 0.028316847
+        df['streamflow'] = df['streamflow'] * 0.028316847 # Imperial unit to SI units
 
         log.log(NOTIFICATION, "Converting streamflow: %s - %s", df_path, df.tail())
 
diff --git a/src/rat/core/run_sarea.py b/src/rat/core/run_sarea.py
new file mode 100644
index 00000000..1b4f7b4e
--- /dev/null
+++ b/src/rat/core/run_sarea.py
@@ -0,0 +1,49 @@
+import os
+import geopandas as gpd
+
+from logging import getLogger
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+
+from rat.core.sarea.sarea_cli_s2 import sarea_s2
+from rat.core.sarea.sarea_cli_l8 import sarea_l8
+from rat.core.sarea.sarea_cli_sar import sarea_s1
+from rat.core.sarea.TMS import TMS
+
+log = getLogger(f"{LOG_NAME}.{__name__}")
+
+
+def run_sarea(start_date, end_date, datadir, reservoirs_shpfile, shpfile_column_dict):
+    reservoirs_polygon = gpd.read_file(reservoirs_shpfile)
+    
+    for reservoir_no,reservoir in reservoirs_polygon.iterrows():
+        # Reading reservoir information
+        reservoir_name = str(reservoir[shpfile_column_dict['unique_identifier']])
+        reservoir_area = float(reservoir[shpfile_column_dict['area_column']])
+        reservoir_polygon = reservoir.geometry
+        run_sarea_for_res(reservoir_name, reservoir_area, reservoir_polygon, start_date, end_date, datadir)
+
+
+def run_sarea_for_res(reservoir_name, reservoir_area, reservoir_polygon, start_date, end_date, datadir):
+
+    # Obtain surface areas
+    # Sentinel-2
+    log.debug(f"Reservoir: {reservoir_name}; Downloading Sentinel-2 data from {start_date} to {end_date}")
+    sarea_s2(reservoir_name, reservoir_polygon, start_date, end_date, os.path.join(datadir, 's2'))
+    s2_dfpath = os.path.join(datadir, 's2', reservoir_name+'.csv')
+
+    # Landsat-8
+    log.debug(f"Reservoir: {reservoir_name}; Downloading Landsat-8 data from {start_date} to {end_date}")
+    sarea_l8(reservoir_name, reservoir_polygon, start_date, end_date, os.path.join(datadir, 'l8'))
+    l8_dfpath = os.path.join(datadir, 'l8', reservoir_name+'.csv')
+
+    # Sentinel-1
+    log.debug(f"Reservoir: {reservoir_name}; Downloading Sentinel-1 data from {start_date} to {end_date}")
+    s1_dfpath = sarea_s1(reservoir_name, reservoir_polygon, start_date, end_date, os.path.join(datadir, 'sar'))
+    s1_dfpath = os.path.join(datadir, 'sar', reservoir_name+'_12d_sar.csv')
+
+    tmsos = TMS(reservoir_name, reservoir_area)
+    result = tmsos.tms_os(l8_dfpath=l8_dfpath, s2_dfpath=s2_dfpath, s1_dfpath=s1_dfpath)
+
+    tmsos_savepath = os.path.join(datadir, reservoir_name+'.csv')
+    log.debug(f"Saving surface area of {reservoir_name} at {tmsos_savepath}")
+    result.reset_index().rename({'index': 'date', 'filled_area': 'area'}, axis=1).to_csv(tmsos_savepath, index=False)
diff --git a/backend/scripts/core/run_vic.py b/src/rat/core/run_vic.py
similarity index 50%
rename from backend/scripts/core/run_vic.py
rename to src/rat/core/run_vic.py
index f5dda222..abf471e6 100644
--- a/backend/scripts/core/run_vic.py
+++ b/src/rat/core/run_vic.py
@@ -1,3 +1,4 @@
+from http.server import executable
 import pandas as pd
 import rasterio as rio
 import os
@@ -7,17 +8,19 @@
 import csv
 import time
 import math
+import datetime
 
 from logging import getLogger
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import create_directory, run_command
-from utils.vic_param_reader import VICParameterFile
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import create_directory
+from rat.utils.run_command import run_command
+from rat.utils.vic_param_reader import VICParameterFile
 
 log = getLogger(LOG_NAME)
 
 
 class VICRunner():
-    def __init__(self, vic_env, param_file, vic_result_file, rout_input_dir, conda_hook) -> None:
+    def __init__(self, vic_env, param_file, vic_result_file, rout_input_dir, conda_hook = None) -> None:
         self.vic_env = vic_env
         self.param_file = param_file
         self.vic_result = vic_result_file
@@ -28,16 +31,40 @@ def __init__(self, vic_env, param_file, vic_result_file, rout_input_dir, conda_h
     def run_vic(self, np=16, cd=None):
         log.log(NOTIFICATION, "Running VIC Model using %s cores", np)
 
-        if cd:
-            arg = f"source {self.conda_hook} && conda activate {self.vic_env} && cd {cd} && mpiexec -n  {np} {self.model_path} -g {self.param_file}"
+        if not self.conda_hook:
+            arg = f'source activate {self.vic_env} && mpiexec -n {np} {self.model_path} -g {self.param_file}'
         else:
             arg = f"source {self.conda_hook} && conda activate {self.vic_env} && mpiexec -n  {np} {self.model_path} -g {self.param_file}"
 
-        ret_code = run_command(arg, shell=True)
-
-    def disagg_results(self):
+        ret_code = run_command(arg, shell=True, executable="/bin/bash")
+
+    def generate_routing_input_state(self, ndays, rout_input_state_file, save_path):
+        if os.path.isfile(rout_input_state_file):
+            print('Routing input state fle exists at '+rout_input_state_file)
+            prev_vic_output = xr.open_mfdataset(rout_input_state_file).load()
+            last_existing_time = prev_vic_output.time[-1]
+            
+            try:
+                prev_new_combine_vic_output = xr.open_mfdataset([rout_input_state_file,self.vic_result],{'time':365})
+                save_vic_output = prev_new_combine_vic_output.sel(time=slice(last_existing_time - np.timedelta64(ndays,'D') , None))
+            except:
+                ## In case routing state file has dates matching with the vic output file. 
+                print('Rout input state has same dates as vic_output_dates')
+                starting_date_routing_file = prev_vic_output.time[0].values.astype('datetime64[us]').astype(datetime.datetime)
+                prev_vic_output.close()
+                return starting_date_routing_file
+            prev_vic_output.close()
+        else:
+            new_vic_output = xr.open_mfdataset(self.vic_result,{'time':365})
+            save_vic_output = new_vic_output[dict(time=slice(-ndays,None))]
+            new_vic_output.close()
+        vic_output_start_date = save_vic_output.time[0].values.astype('datetime64[us]').astype(datetime.datetime)
+        save_vic_output.to_netcdf(save_path)
+        return vic_output_start_date
+
+    def disagg_results(self, rout_input_state_file):
         log.log(NOTIFICATION, "Started disaggregating VIC results")
-        fluxes = xr.open_dataset(self.vic_result).load()
+        fluxes = xr.open_dataset(rout_input_state_file).load()
 
         fluxes_subset = fluxes[['OUT_PREC', 'OUT_EVAP', 'OUT_RUNOFF', 'OUT_BASEFLOW', 'OUT_WDEW', 'OUT_SOIL_LIQ', 'OUT_SOIL_MOIST']]
 
@@ -50,8 +77,8 @@ def disagg_results(self):
         create_directory(self.rout_input)
 
         # VIC Routing doesn't round, it truncates the lat long values. Important for file names.
-        lats_vicfmt = np.array(list(map(lambda x: math.floor(x * 10 ** 2) / 10 ** 2, fluxes_subset.lat.values)))
-        lons_vicfmt = np.array(list(map(lambda x: math.floor(x * 10 ** 2) / 10 ** 2, fluxes_subset.lon.values)))
+        lats_vicfmt = (np.floor(np.abs(fluxes_subset.lat.values)*100)/100)*np.sign(fluxes_subset.lat.values)
+        lons_vicfmt = (np.floor(np.abs(fluxes_subset.lon.values)*100)/100)*np.sign(fluxes_subset.lon.values)
 
         # with tqdm(total=total) as pbar:  # tqdm doesn't work elegantly with logging
         s = time.time()
diff --git a/backend/scripts/core/sarea/TMS.py b/src/rat/core/sarea/TMS.py
similarity index 98%
rename from backend/scripts/core/sarea/TMS.py
rename to src/rat/core/sarea/TMS.py
index ac537e19..031c2bdc 100644
--- a/backend/scripts/core/sarea/TMS.py
+++ b/src/rat/core/sarea/TMS.py
@@ -6,21 +6,18 @@
 import os
 warnings.filterwarnings('ignore')
 
-from utils.utils import clip_ts
+from rat.utils.utils import clip_ts
 
 
 class TMS():
     def __init__(self, reservoir_name, area=None, AREA_DEVIATION_THRESHOLD_PCNT=5):
         """_summary_
-
         Args:
             reservoir_name (_type_): _description_
             area (_type_, optional): _description_
             AREA_DEVIATION_THRESHOLD_PCNT (float, optional): _description_. Defaults to 5.
-
         Raises:
             Exception: _description_
-
         Returns:
             _type_: _description_
         """
@@ -30,15 +27,15 @@ def __init__(self, reservoir_name, area=None, AREA_DEVIATION_THRESHOLD_PCNT=5):
         self.AREA_DEVIATION_THRESHOLD = self.area * AREA_DEVIATION_THRESHOLD_PCNT/100
 
     def tms_os(self,
-            l8_dfpath: str, 
-            s2_dfpath: str, 
-            l9_dfpath: str, 
-            s1_dfpath: str, 
+            l8_dfpath: str = "", 
+            s2_dfpath: str = "", 
+            l9_dfpath: str = "", 
+            s1_dfpath: str = "", 
             CLOUD_THRESHOLD: float = 90.0,
             MIN_DATE: str = '2019-01-01'
         ):
+        ## TODO: add conditional, S1 required, any one of optical datasets required
         """Implements the TMS-OS methodology
-
         Args:
             l8_dfpath (string): Path of the surface area dataframe obtained using `sarea_cli_l8.py` - Landsat derived surface areas
             s2_dfpath (string): Path of the surface area dataframe obtained using `sarea_cli_s2.py` - Sentinel-2 derived surface areas
@@ -247,7 +244,6 @@ def sar_data_statistical_fix(sar_df, nominal_area, threshold_percentage=15):
 
 def deviation_from_sar(optical_areas, sar_areas, DEVIATION_THRESHOLD = 20, LOW_STD_LIM=2, HIGH_STD_LIM=2):
     """Filter out points based on deviations from SAR reported areas after correcting for bias in SAR water areas. Remove NaNs beforehand.
-
     Args:
         optical_areas (pd.Series): Time-series of areas obtained using an optical sensor (S2, L8, etc) on which the filtering will be applied. Must have `pd.DatetimeIndex` and corresponding areas in a column named `area`.
         sar_areas (pd.Series): Time-series of S1 surface areas. Must have `pd.DatetimeIndex` and corresponding areas in a column named `area`.
@@ -333,12 +329,10 @@ def sign_based_correction(area, AREA_COL_NAME='corrected_areas_1', TREND_COL_NAM
 
 def filled_by_trend(filtered_area, sar_trend, days_passed) -> pd.Series:
     """Fills in `np.nan` values of optically obtained surface area time series using SAR based time-series.
-
     Args:
         filtered_area (pd.Series): Optical sensor based surface areas containing `np.nan` values that will be filled in.
         sar_trend (pd.Series): SAR based surface area trends.
         days_passed (pd.Series): Days sicne last observation of optical sensor observed surface areas.
-
     Returns:
         pd.Series: Filled nan values
     """
@@ -355,7 +349,6 @@ def filled_by_trend(filtered_area, sar_trend, days_passed) -> pd.Series:
 # Trend based correction function
 def trend_based_correction(area, sar, AREA_DEVIATION_THRESHOLD=25, TREND_DEVIATION_THRESHOLD = 10):
     """Apply trend based correction on a time-series
-
     Args:
         area (pd.DataFrame): Pandas dataframe containing date as pd.DatetimeIndex and areas in column named `area`
         sar (pd.DataFrame): Pandas dataframe containing surface area time-series obtained from Sentinel-1 (SAR). Same format as `area`
diff --git a/backend/scripts/core/sarea/sarea_cli_l9.py b/src/rat/core/sarea/sarea_cli_l8.py
old mode 100755
new mode 100644
similarity index 57%
rename from backend/scripts/core/sarea/sarea_cli_l9.py
rename to src/rat/core/sarea/sarea_cli_l8.py
index 00fd66f6..7e301d9e
--- a/backend/scripts/core/sarea/sarea_cli_l9.py
+++ b/src/rat/core/sarea/sarea_cli_l8.py
@@ -5,16 +5,16 @@
 import time
 import os
 from random import randint
-import argparse
 from itertools import zip_longest
-import pprint
+from rat.ee_utils.ee_utils import poly2feature
 
-from utils.logging import LOG_NAME, NOTIFICATION
+from rat.ee_utils.ee_utils import poly2feature
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import days_between
 from logging import getLogger
 
 log = getLogger(f"{LOG_NAME}.{__name__}")
 
-
 def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
     "Collect data into non-overlapping fixed-length chunks or blocks"
     # grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
@@ -30,17 +30,14 @@ def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
     else:
         raise ValueError('Expected fill, strict, or ignore')
 
-ee.Initialize()
 
-# l9 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
+# L8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
 # gswd = ee.Image("JRC/GSW1_3/GlobalSurfaceWater").select("occurrence")
 # Threshold = 0.0
 
 # NEW STUFF
-l9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2")
+l8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
 gswd = ee.Image("JRC/GSW1_3/GlobalSurfaceWater")
-reservoir_geom_prefix = "users/saswegee/pritam/RAT-Mekong/"
-reservoir = ee.FeatureCollection("users/pdas47/RAT/Sirindhorn")
 rgb_vis_params = {"bands":["B4","B3","B2"],"min":0,"max":0.4}
 
 NDWI_THRESHOLD = 0.3
@@ -54,10 +51,8 @@ def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
 TEMPORAL_RESOLUTION = 16
 RESULTS_PER_ITER = 5
 
-AOI = reservoir.geometry().simplify(100).buffer(500)
-
 
-# s2_subset = s2.filterBounds(AOI).filterDate(start_date, end_date)
+# s2_subset = s2.filterBounds(aoi).filterDate(start_date, end_date)
 
 ##############################################
 ##       Defining necessary functions       ##
@@ -103,7 +98,7 @@ def identify_water_cluster(im):
 
     max_cluster_value = ee.Number(im.select('cluster').reduceRegion(
         reducer = ee.Reducer.max(),
-        geometry = AOI,
+        geometry = aoi,
         scale = LARGE_SCALE,
         maxPixels =  1e10
     ).get('cluster'))
@@ -115,7 +110,7 @@ def calc_avg_mbwi(cluster_val):
         avg_mbwi = mbwi.updateMask(im.select('cluster').eq(ee.Image(cluster_val))).reduceRegion(
             reducer = ee.Reducer.mean(),
             scale = MEDIUM_SCALE,
-            geometry = AOI,
+            geometry = aoi,
             maxPixels = 1e10
         ).get('MBWI')
         return avg_mbwi
@@ -132,7 +127,7 @@ def calc_avg_mbwi(cluster_val):
 def cordeiro(im):
     band_subset = ee.List(['NDWI', 'MNDWI', 'SR_B7'])   # using NDWI, MNDWI and B7 (SWIR)
     sampled_pts = im.select(band_subset).sample(
-        region = AOI,
+        region = aoi,
         scale = SMALL_SCALE,
         numPixels = 5e3-1  ## limit of 5k points
     )
@@ -172,13 +167,13 @@ def process_image(im):
     })
     im = im.addBands(mbwi)
 
-    cloud_area = AOI.area().subtract(im.select('cloud').Not().multiply(ee.Image.pixelArea()).reduceRegion(
+    cloud_area = aoi.area().subtract(im.select('cloud').Not().multiply(ee.Image.pixelArea()).reduceRegion(
         reducer = ee.Reducer.sum(),
-        geometry = AOI,
+        geometry = aoi,
         scale = SMALL_SCALE,
         maxPixels = 1e10
     ).get('cloud'))
-    cloud_percent = cloud_area.multiply(100).divide(AOI.area())
+    cloud_percent = cloud_area.multiply(100).divide(aoi.area())
     
     cordeiro_will_run_when = cloud_percent.lt(CLOUD_COVER_LIMIT)
 
@@ -188,7 +183,7 @@ def process_image(im):
     water_area_cordeiro = ee.Number(ee.Algorithms.If(cordeiro_will_run_when,
         ee.Number(im.select('water_map_cordeiro').eq(1).multiply(ee.Image.pixelArea()).reduceRegion(
             reducer = ee.Reducer.sum(), 
-            geometry = AOI, 
+            geometry = aoi, 
             scale = SMALL_SCALE, 
             maxPixels = 1e10
         ).get('water_map_cordeiro')),
@@ -197,7 +192,7 @@ def process_image(im):
     non_water_area_cordeiro = ee.Number(ee.Algorithms.If(cordeiro_will_run_when,
         ee.Number(im.select('water_map_cordeiro').neq(1).multiply(ee.Image.pixelArea()).reduceRegion(
             reducer = ee.Reducer.sum(), 
-            geometry = AOI, 
+            geometry = aoi, 
             scale = SMALL_SCALE, 
             maxPixels = 1e10
         ).get('water_map_cordeiro')),
@@ -208,13 +203,13 @@ def process_image(im):
     im = im.addBands(ndwi.gte(NDWI_THRESHOLD).select(['NDWI'], ['water_map_NDWI']))
     water_area_NDWI = ee.Number(im.select('water_map_NDWI').eq(1).multiply(ee.Image.pixelArea()).reduceRegion(
         reducer = ee.Reducer.sum(), 
-        geometry = AOI, 
+        geometry = aoi, 
         scale = SMALL_SCALE, 
         maxPixels = 1e10
     ).get('water_map_NDWI'))
     non_water_area_NDWI = ee.Number(im.select('water_map_NDWI').neq(1).multiply(ee.Image.pixelArea()).reduceRegion(
         reducer = ee.Reducer.sum(), 
-        geometry = AOI, 
+        geometry = aoi, 
         scale = SMALL_SCALE, 
         maxPixels = 1e10
     ).get('water_map_NDWI'))
@@ -239,7 +234,7 @@ def postprocess():
         
         hist = ee.List(gswd_masked.reduceRegion(
             reducer = ee.Reducer.autoHistogram(minBucketWidth = 1),
-            geometry = AOI,
+            geometry = aoi,
             scale = SMALL_SCALE,
             maxPixels = 1e10
         ).get('occurrence'))
@@ -253,13 +248,13 @@ def postprocess():
         occurrence_thresh = ee.Number(ee.List(counts.get(0)).get(count_thresh_index))
 
         water_map = im.select([bandName], ['water_map'])
-        gswd_improvement = gswd.clip(AOI).gte(occurrence_thresh).updateMask(water_map.mask().Not()).select(["occurrence"], ["water_map"])
+        gswd_improvement = gswd.clip(aoi).gte(occurrence_thresh).updateMask(water_map.mask().Not()).select(["occurrence"], ["water_map"])
         
         improved = ee.ImageCollection([water_map, gswd_improvement]).mosaic().select(['water_map'], ['water_map_zhao_gao'])
         
         corrected_area = ee.Number(improved.select('water_map_zhao_gao').multiply(ee.Image.pixelArea()).reduceRegion(
             reducer = ee.Reducer.sum(), 
-            geometry = AOI, 
+            geometry = aoi, 
             scale = SMALL_SCALE, 
             maxPixels = 1e10
         ).get('water_map_zhao_gao'))
@@ -290,17 +285,17 @@ def process_date(date):
     date = ee.Date(date)
     from_date = date
     to_date = date.advance(TEMPORAL_RESOLUTION - 1, 'day')
-    l9_subset = l9.filterDate(from_date, to_date).filterBounds(AOI).map(preprocess)
+    l8_subset = l8.filterDate(from_date, to_date).filterBounds(aoi).map(preprocess)
 
     # im = ee.Image(ee.Algorithms.If(s2_subset.size().neq(0), s2_subset.map(process_image).qualityMosaic('NDWI'), ee.Image.constant(0)))
-    im = ee.Image(ee.Algorithms.If(l9_subset.size().neq(0), l9_subset.map(calc_ndwi).qualityMosaic('NDWI'), ee.Image.constant(0)))
+    im = ee.Image(ee.Algorithms.If(l8_subset.size().neq(0), l8_subset.map(calc_ndwi).qualityMosaic('NDWI'), ee.Image.constant(0)))
     
-    im = ee.Image(ee.Algorithms.If(l9_subset.size().neq(0), process_image(im), ee.Image.constant(0)))
+    im = ee.Image(ee.Algorithms.If(l8_subset.size().neq(0), process_image(im), ee.Image.constant(0)))
 
     ## im = ee.Algorithms.If(im.bandNames process_image(im))
     im = im.set('from_date', from_date.format("YYYY-MM-dd"))
     im = im.set('to_date', to_date.format("YYYY-MM-dd"))
-    im = im.set('l9_images', l9_subset.size())
+    im = im.set('l8_images', l8_subset.size())
     
     # im = ee.Algorithms.If(im.bandNames().size().eq(1), ee.Number(0), im)
     
@@ -315,34 +310,38 @@ def generate_timeseries(dates):
     return imcoll
 
 def get_first_obs(start_date, end_date):
-    first_im = l9.filterBounds(AOI).filterDate(start_date, end_date).first()
+    first_im = l8.filterBounds(aoi).filterDate(start_date, end_date).first()
     str_fmt = 'YYYY-MM-dd'
     return ee.Date.parse(str_fmt, ee.Date(first_im.get('system:time_start')).format(str_fmt))
 
-def run_process_long(res_name, start, end, datadir):
+def run_process_long(res_name, res_polygon, start, end, datadir):
     fo = start
     enddate = end
 
-    reservoir = ee.FeatureCollection(reservoir_geom_prefix + res_name)
+    # Extracting reservoir geometry 
+    global aoi
+    aoi = poly2feature(res_polygon,BUFFER_DIST).geometry()
+    ## Checking if time interval is small then the image collection should not be empty in GEE
+    if (days_between(start,end) < 30):     # less than a month difference
+        number_of_images = l8.filterBounds(aoi).filterDate(start, end).size().getInfo()
+    else:
+        number_of_images = 1     # more than a month difference simply run, so no need to calculate number_of_images
     
-    fo = get_first_obs(start, end).format('YYYY-MM-dd').getInfo()
-    first_obs = datetime.strptime(fo, '%Y-%m-%d')
-
-    global AOI
-    AOI = reservoir.geometry().buffer(BUFFER_DIST)
+    if(number_of_images):
+        fo = get_first_obs(start, end).format('YYYY-MM-dd').getInfo()
+        first_obs = datetime.strptime(fo, '%Y-%m-%d')
 
-    scratchdir = os.path.join(datadir, "_scratch")
+        scratchdir = os.path.join(datadir, "_scratch")
 
-    # flag = True
-    num_runs = 0
+        # flag = True
+        num_runs = 0
 
-    # If data already exists, only get new data starting from the last one
-    savepath = os.path.join(datadir, f"{res_name}.csv")
-    
-    if os.path.isfile(savepath):
-        temp_df = pd.read_csv(savepath, parse_dates=['mosaic_enddate']).set_index('mosaic_enddate')
+        # If data already exists, only get new data starting from the last one
+        savepath = os.path.join(datadir, f"{res_name}.csv")
+        
+        if os.path.isfile(savepath):
+            temp_df = pd.read_csv(savepath, parse_dates=['mosaic_enddate']).set_index('mosaic_enddate')
 
-        if not len(temp_df) == 0:
             last_date = temp_df.index[-1].to_pydatetime()
             fo = (last_date - timedelta(days=TEMPORAL_RESOLUTION*2)).strftime("%Y-%m-%d")
             to_combine = [savepath]
@@ -356,140 +355,115 @@ def run_process_long(res_name, start, end, datadir):
                 return None
         else:
             to_combine = []
-    else:
-        to_combine = []
-    
-    savedir = os.path.join(scratchdir, f"{res_name}_l9_cordeiro_zhao_gao_{fo}_{enddate}")
-    if not os.path.isdir(savedir):
-        os.makedirs(savedir)
-    
-    print(f"Extracting SA for the period {fo} -> {enddate}")
+        
+        savedir = os.path.join(scratchdir, f"{res_name}_l8_cordeiro_zhao_gao_{fo}_{enddate}")
+        if not os.path.isdir(savedir):
+            os.makedirs(savedir)
+        
+        print(f"Extracting SA for the period {fo} -> {enddate}")
 
-    dates = pd.date_range(fo, enddate, freq=f'{TEMPORAL_RESOLUTION}D')
-    grouped_dates = grouper(dates, RESULTS_PER_ITER)
+        dates = pd.date_range(fo, enddate, freq=f'{TEMPORAL_RESOLUTION}D')
+        grouped_dates = grouper(dates, RESULTS_PER_ITER)
 
-    # # redo the calculations part and see where it is complaining about too many aggregations
-    # subset_dates = next(grouped_dates)
-    # dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
+        # # redo the calculations part and see where it is complaining about too many aggregations
+        # subset_dates = next(grouped_dates)
+        # dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
 
-    # print(subset_dates)
-    # res = generate_timeseries(dates).filterMetadata('s2_images', 'greater_than', 0)
-    # pprint.pprint(res.aggregate_array('s2_images').getInfo())
+        # print(subset_dates)
+        # res = generate_timeseries(dates).filterMetadata('s2_images', 'greater_than', 0)
+        # pprint.pprint(res.aggregate_array('s2_images').getInfo())
 
-    # uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'water_area_NDWI', 'non_water_area_NDWI', 'cloud_area', 's2_images']
-    # uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
-    # uncorrected_final_data = uncorrected_final_data_ee.getInfo()
-    
-
-    for subset_dates in grouped_dates:
-        try:
-            print(subset_dates)
-            dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
-            
-            res = generate_timeseries(dates).filterMetadata('l9_images', 'greater_than', 0)
-            # pprint.pprint(res.getInfo())
-
-            uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'cloud_area', 'l9_images']
-            uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
-            uncorrected_final_data = uncorrected_final_data_ee.getInfo()
-            print("Uncorrected", uncorrected_final_data)
-
-            res_corrected_cordeiro = res.map(lambda im: postprocess_wrapper(im, 'water_map_cordeiro', im.get('water_area_cordeiro')))
-            corrected_columns_to_extract = ['to_date', 'corrected_area']
-            corrected_final_data_cordeiro_ee = res_corrected_cordeiro \
-                                                .filterMetadata('corrected_area', 'not_equals', None) \
-                                                .reduceColumns(
-                                                    ee.Reducer.toList(
-                                                        len(corrected_columns_to_extract)), 
-                                                        corrected_columns_to_extract
-                                                        ).get('list')
-            corrected_final_data_cordeiro = corrected_final_data_cordeiro_ee.getInfo()
-            print("Corrected - Cordeiro", corrected_final_data_cordeiro)
-
-            # res_corrected_NDWI = res.map(lambda im: postprocess_wrapper(im, 'water_map_NDWI', im.get('water_area_NDWI')))
-            # corrected_final_data_NDWI_ee = res_corrected_NDWI \
-            #                                     .filterMetadata('corrected_area', 'not_equals', None) \
-            #                                     .reduceColumns(
-            #                                         ee.Reducer.toList(
-            #                                             len(corrected_columns_to_extract)), 
-            #                                             corrected_columns_to_extract
-            #                                             ).get('list')
-            
-            # corrected_final_data_NDWI = corrected_final_data_NDWI_ee.getInfo()
-            
-            # print(uncorrected_final_data, corrected_final_data_cordeiro)
-            if len(uncorrected_final_data) == 0:
+        # uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'water_area_NDWI', 'non_water_area_NDWI', 'cloud_area', 's2_images']
+        # uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
+        # uncorrected_final_data = uncorrected_final_data_ee.getInfo()
+        
+        for subset_dates in grouped_dates:
+            try:
+                print(subset_dates)
+                dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
+                
+                res = generate_timeseries(dates).filterMetadata('l8_images', 'greater_than', 0)
+                # pprint.pprint(res.getInfo())
+
+                uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'cloud_area', 'l8_images']
+                uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
+                uncorrected_final_data = uncorrected_final_data_ee.getInfo()
+                print("Uncorrected", uncorrected_final_data)
+
+                res_corrected_cordeiro = res.map(lambda im: postprocess_wrapper(im, 'water_map_cordeiro', im.get('water_area_cordeiro')))
+                corrected_columns_to_extract = ['to_date', 'corrected_area']
+                corrected_final_data_cordeiro_ee = res_corrected_cordeiro \
+                                                    .filterMetadata('corrected_area', 'not_equals', None) \
+                                                    .reduceColumns(
+                                                        ee.Reducer.toList(
+                                                            len(corrected_columns_to_extract)), 
+                                                            corrected_columns_to_extract
+                                                            ).get('list')
+                corrected_final_data_cordeiro = corrected_final_data_cordeiro_ee.getInfo()
+                print("Corrected - Cordeiro", corrected_final_data_cordeiro)
+
+                # res_corrected_NDWI = res.map(lambda im: postprocess_wrapper(im, 'water_map_NDWI', im.get('water_area_NDWI')))
+                # corrected_final_data_NDWI_ee = res_corrected_NDWI \
+                #                                     .filterMetadata('corrected_area', 'not_equals', None) \
+                #                                     .reduceColumns(
+                #                                         ee.Reducer.toList(
+                #                                             len(corrected_columns_to_extract)), 
+                #                                             corrected_columns_to_extract
+                #                                             ).get('list')
+                
+                # corrected_final_data_NDWI = corrected_final_data_NDWI_ee.getInfo()
+                
+                # print(uncorrected_final_data, corrected_final_data_cordeiro)
+                if len(uncorrected_final_data) == 0:
+                    continue
+                uncorrected_df = pd.DataFrame(uncorrected_final_data, columns=uncorrected_columns_to_extract)
+                corrected_cordeiro_df = pd.DataFrame(corrected_final_data_cordeiro, columns=corrected_columns_to_extract).rename({'corrected_area': 'corrected_area_cordeiro'}, axis=1)
+                # corrected_NDWI_df = pd.DataFrame(corrected_final_data_NDWI, columns=corrected_columns_to_extract).rename({'corrected_area': 'corrected_area_NDWI'}, axis=1)
+                # corrected_df = pd.merge(corrected_cordeiro_df, corrected_NDWI_df, 'left', 'to_date')
+                df = pd.merge(uncorrected_df, corrected_cordeiro_df, 'left', 'to_date')
+
+                df['from_date'] = pd.to_datetime(df['from_date'], format="%Y-%m-%d")
+                df['to_date'] = pd.to_datetime(df['to_date'], format="%Y-%m-%d")
+                df['mosaic_enddate'] = df['to_date'] - pd.Timedelta(1, unit='day')
+                df = df.set_index('mosaic_enddate')
+                print(df.head(2))
+
+                fname = os.path.join(savedir, f"{df.index[0].strftime('%Y%m%d')}_{df.index[-1].strftime('%Y%m%d')}_{res_name}.csv")
+                df.to_csv(fname)
+
+                s_time = randint(20, 30)
+                print(f"Sleeping for {s_time} seconds")
+                time.sleep(randint(20, 30))
+
+                if (datetime.strptime(enddate, "%Y-%m-%d")-df.index[-1]).days < TEMPORAL_RESOLUTION:
+                    print(f"Quitting: Reached enddate {enddate}")
+                    break
+                elif df.index[-1].strftime('%Y-%m-%d') == fo:
+                    print(f"Reached last available observation - {fo}")
+                    break
+                elif num_runs > 1000:
+                    print("Quitting: Reached 1000 iterations")
+                    break
+            except Exception as e:
+                log.error(e)
                 continue
-            uncorrected_df = pd.DataFrame(uncorrected_final_data, columns=uncorrected_columns_to_extract)
-            corrected_cordeiro_df = pd.DataFrame(corrected_final_data_cordeiro, columns=corrected_columns_to_extract).rename({'corrected_area': 'corrected_area_cordeiro'}, axis=1)
-            # corrected_NDWI_df = pd.DataFrame(corrected_final_data_NDWI, columns=corrected_columns_to_extract).rename({'corrected_area': 'corrected_area_NDWI'}, axis=1)
-            # corrected_df = pd.merge(corrected_cordeiro_df, corrected_NDWI_df, 'left', 'to_date')
-            df = pd.merge(uncorrected_df, corrected_cordeiro_df, 'left', 'to_date')
-
-            df['from_date'] = pd.to_datetime(df['from_date'], format="%Y-%m-%d")
-            df['to_date'] = pd.to_datetime(df['to_date'], format="%Y-%m-%d")
-            df['mosaic_enddate'] = df['to_date'] - pd.Timedelta(1, unit='day')
-            df = df.set_index('mosaic_enddate')
-            print(df.head(2))
-
-            fname = os.path.join(savedir, f"{df.index[0].strftime('%Y%m%d')}_{df.index[-1].strftime('%Y%m%d')}_{res_name}.csv")
-            df.to_csv(fname)
-
-            s_time = randint(20, 30)
-            print(f"Sleeping for {s_time} seconds")
-            time.sleep(randint(20, 30))
-
-            if (datetime.strptime(enddate, "%Y-%m-%d")-df.index[-1]).days < TEMPORAL_RESOLUTION:
-                print(f"Quitting: Reached enddate {enddate}")
-                break
-            elif df.index[-1].strftime('%Y-%m-%d') == fo:
-                print(f"Reached last available observation - {fo}")
-                break
-            elif num_runs > 1000:
-                print("Quitting: Reached 1000 iterations")
-                break
-        except Exception as e:
-            log.error(e)
-            continue
-
-
-    # Combine the files into one database
-    to_combine.extend([os.path.join(savedir, f) for f in os.listdir(savedir) if f.endswith(".csv")])
-
-    files = [pd.read_csv(f, parse_dates=["mosaic_enddate"]).set_index("mosaic_enddate") for f in to_combine]
-    try:
-        data = pd.concat(files).drop_duplicates().sort_values("mosaic_enddate")
-        data.to_csv(savepath)
-        return savepath
-    except ValueError as e:
-        return -1
-    except Exception as e:
-        raise e
-
-
-
-# User-facing wrapper function
-def sarea_l9(reservoir, start, end, datadir):
-    return run_process_long(reservoir, start, end, datadir)
-
-def main():
-    # Setup argument parser
-    parser = argparse.ArgumentParser(description="Generate Reservoir Surface area time series")
-
-    parser.add_argument("reservoir")
-    parser.add_argument("start_date")
-    parser.add_argument("end_date")
+        
 
-    args = parser.parse_args()
 
-    reservoir = args.reservoir
-    start = args.start_date
-    end = args.end_date
+        # Combine the files into one database
+        to_combine.extend([os.path.join(savedir, f) for f in os.listdir(savedir) if f.endswith(".csv")])
 
-    # print(f"{reservoir = }, {start = }, {end = }")
-    run_process_long(reservoir, start, end, "/houston2/pritam/rat_mekong_v3/backend/data/sarea_tmsos/l9")
+        files = [pd.read_csv(f, parse_dates=["mosaic_enddate"]).set_index("mosaic_enddate") for f in to_combine]
+        data = pd.concat(files).drop_duplicates().sort_values("mosaic_enddate")
 
+        data.to_csv(savepath)
 
+        return savepath
+    
+    else:
+        print(f"No observation observed between {start} and {end}. Quitting!")
+        return None
 
-if __name__ == '__main__':
-    main()
\ No newline at end of file
+# User-facing wrapper function
+def sarea_l8(res_name,res_polygon, start, end, datadir):
+    return run_process_long(res_name,res_polygon, start, end, datadir)
diff --git a/backend/scripts/core/sarea/sarea_cli_s2.py b/src/rat/core/sarea/sarea_cli_s2.py
similarity index 52%
rename from backend/scripts/core/sarea/sarea_cli_s2.py
rename to src/rat/core/sarea/sarea_cli_s2.py
index 4f5da2ba..45dec1df 100644
--- a/backend/scripts/core/sarea/sarea_cli_s2.py
+++ b/src/rat/core/sarea/sarea_cli_s2.py
@@ -1,22 +1,21 @@
-# import geemap as gee
-from asyncio.log import logger
+
 import ee
 from datetime import datetime, timedelta, timezone
 import pandas as pd
+import numpy as np
 import time
 import os
 from random import randint
-import argparse
 from itertools import zip_longest
-import pprint
-import numpy as np
+from rat.ee_utils.ee_utils import poly2feature
 
-from utils.logging import LOG_NAME, NOTIFICATION
+from rat.ee_utils.ee_utils import poly2feature
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import days_between
 from logging import getLogger
 
 log = getLogger(f"{LOG_NAME}.{__name__}")
 
-
 def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
     "Collect data into non-overlapping fixed-length chunks or blocks"
     # grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
@@ -32,17 +31,9 @@ def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
     else:
         raise ValueError('Expected fill, strict, or ignore')
 
-ee.Initialize()
-
-# L8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
-# gswd = ee.Image("JRC/GSW1_3/GlobalSurfaceWater").select("occurrence")
-# Threshold = 0.0
-
 # NEW STUFF
 s2 = ee.ImageCollection("COPERNICUS/S2_SR")
 gswd = ee.Image("JRC/GSW1_3/GlobalSurfaceWater")
-reservoir_geom_prefix = "users/saswegee/pritam/RAT-Mekong/"
-reservoir = ee.FeatureCollection("users/pdas47/RAT/Sirindhorn")
 rgb_vis_params = {"bands":["B4","B3","B2"],"min":0,"max":0.4}
 
 NDWI_THRESHOLD = 0.3;
@@ -56,10 +47,9 @@ def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
 TEMPORAL_RESOLUTION = 5
 RESULTS_PER_ITER = 5
 
-# AOI = reservoir.geometry().simplify(100).buffer(500);
-
+# aoi = reservoir.geometry().simplify(100).buffer(500);
 
-# s2_subset = s2.filterBounds(AOI).filterDate(start_date, end_date)
+# s2_subset = s2.filterBounds(aoi).filterDate(start_date, end_date)
 
 ##############################################
 ##       Defining necessary functions       ##
@@ -72,6 +62,12 @@ def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
 
 def scl_cloud_mask(im):
     cloudmask = im.expression("cloud = (SCL==3)|(SCL==8)|(SCL==9)|(SCL==10)", {'SCL': im.select('SCL')})
+    # cloud_area = cloudmask.reduceRegion(
+    #     reducer = ee.Reducer.sum(),
+    #     geometry = aoi,
+    #     scale = SMALL_SCALE,
+    #     maxPixels = 1e10
+    # ).get('')
     im = im.addBands(cloudmask)
     return im.updateMask(cloudmask.select('cloud').Not())
 
@@ -89,13 +85,14 @@ def preprocess(im):
 
     return im
 
+
 def identify_water_cluster(im):
     im = ee.Image(im)
     mbwi = im.select('MBWI')
 
     max_cluster_value = ee.Number(im.select('cluster').reduceRegion(
         reducer = ee.Reducer.max(),
-        geometry = AOI,
+        geometry = aoi,
         scale = LARGE_SCALE,
         maxPixels =  1e10
     ).get('cluster'))
@@ -107,7 +104,7 @@ def calc_avg_mbwi(cluster_val):
         avg_mbwi = mbwi.updateMask(im.select('cluster').eq(ee.Image(cluster_val))).reduceRegion(
             reducer = ee.Reducer.mean(),
             scale = MEDIUM_SCALE,
-            geometry = AOI,
+            geometry = aoi,
             maxPixels = 1e10
         ).get('MBWI')
         return avg_mbwi
@@ -120,10 +117,11 @@ def calc_avg_mbwi(cluster_val):
 
     return water_cluster
 
+
 def clustering(im):
     band_subset = ee.List(['NDWI', 'B12'])
     sampled_pts = im.select(band_subset).sample(
-        region = AOI,
+        region = aoi,
         scale = SMALL_SCALE,
         numPixels = 4999  ## limit of 5k points, staying at 4k
     )
@@ -149,6 +147,7 @@ def clustering(im):
 
 def process_image(im):
     # Process Image
+    
     ndwi = im.normalizedDifference(['B3', 'B8']).rename('NDWI');
     im = im.addBands(ndwi);
     mndwi = im.normalizedDifference(['B3', 'B12']).rename('MNDWI');
@@ -161,13 +160,14 @@ def process_image(im):
         'B12': im.select('B12')
     })
     im = im.addBands(mbwi);
-    cloud_area = AOI.area().subtract(im.select('cloud').Not().multiply(ee.Image.pixelArea()).reduceRegion(
+    
+    cloud_area = aoi.area().subtract(im.select('cloud').Not().multiply(ee.Image.pixelArea()).reduceRegion(
         reducer = ee.Reducer.sum(),
-        geometry = AOI,
+        geometry = aoi,
         scale = SMALL_SCALE,
         maxPixels = 1e10
     ).get('cloud'))
-    cloud_percent = cloud_area.multiply(100).divide(AOI.area())
+    cloud_percent = cloud_area.multiply(100).divide(aoi.area())
     
     CLOUD_LIMIT_SATISFIED = cloud_percent.lt(CLOUD_COVER_LIMIT)
 
@@ -187,7 +187,7 @@ def process_image(im):
             CLOUD_LIMIT_SATISFIED,
             ee.Number(im.select('water_map_clustering').eq(1).multiply(ee.Image.pixelArea()).reduceRegion(
                 reducer = ee.Reducer.sum(), 
-                geometry = AOI, 
+                geometry = aoi, 
                 scale = SMALL_SCALE, 
                 maxPixels = 1e10
             ).get('water_map_clustering')),
@@ -199,7 +199,7 @@ def process_image(im):
             CLOUD_LIMIT_SATISFIED,
             ee.Number(im.select('water_map_clustering').neq(1).multiply(ee.Image.pixelArea()).reduceRegion(
                 reducer = ee.Reducer.sum(), 
-                geometry = AOI, 
+                geometry = aoi, 
                 scale = SMALL_SCALE, 
                 maxPixels = 1e10
             ).get('water_map_clustering')),
@@ -220,7 +220,7 @@ def postprocess(im, bandName='water_map_clustering'):
     
     hist = ee.List(gswd_masked.reduceRegion(
         reducer = ee.Reducer.autoHistogram(minBucketWidth = 1),
-        geometry = AOI,
+        geometry = aoi,
         scale = SMALL_SCALE,
         maxPixels = 1e10
     ).get('occurrence'))
@@ -234,13 +234,13 @@ def postprocess(im, bandName='water_map_clustering'):
     occurrence_thresh = ee.Number(ee.List(counts.get(0)).get(count_thresh_index))
 
     water_map = im.select([bandName], ['water_map'])
-    gswd_improvement = gswd.clip(AOI).gte(occurrence_thresh).updateMask(water_map.mask().Not()).select(["occurrence"], ["water_map"])
+    gswd_improvement = gswd.clip(aoi).gte(occurrence_thresh).updateMask(water_map.mask().Not()).select(["occurrence"], ["water_map"])
     
     improved = ee.ImageCollection([water_map, gswd_improvement]).mosaic().select(['water_map'], ['water_map_zhao_gao'])
     
     corrected_area = ee.Number(improved.select('water_map_zhao_gao').multiply(ee.Image.pixelArea()).reduceRegion(
         reducer = ee.Reducer.sum(), 
-        geometry = AOI, 
+        geometry = aoi, 
         scale = SMALL_SCALE, 
         maxPixels = 1e10
     ).get('water_map_zhao_gao'))
@@ -278,7 +278,7 @@ def process_date(date):
     date = ee.Date(date)
     to_date = date.advance(1, 'day')
     from_date = date.advance(-(TEMPORAL_RESOLUTION-1), 'day')
-    s2_subset = s2.filterDate(from_date, to_date).filterBounds(AOI).map(preprocess)
+    s2_subset = s2.filterDate(from_date, to_date).filterBounds(aoi).map(preprocess)
 
     ENOUGH_IMAGES = s2_subset.size().neq(0)
     im = ee.Image(
@@ -320,167 +320,168 @@ def generate_timeseries(dates):
     return imcoll
 
 def get_first_obs(start_date, end_date):
-    first_im = s2.filterBounds(AOI).filterDate(start_date, end_date).first()
+    first_im = s2.filterBounds(aoi).filterDate(start_date, end_date).first()
     str_fmt = 'YYYY-MM-dd'
     return ee.Date.parse(str_fmt, ee.Date(first_im.get('system:time_start')).format(str_fmt))
 
-def run_process_long(res_name, start, end, datadir):
+def run_process_long(res_name,res_polygon, start, end, datadir):
     fo = start
     enddate = end
 
-    reservoir = ee.FeatureCollection(reservoir_geom_prefix + res_name)
-    global AOI
-    AOI = reservoir.geometry().buffer(BUFFER_DIST)
-    
-    fo = get_first_obs(start, end).format('YYYY-MM-dd').getInfo()
-    first_obs = datetime.strptime(fo, '%Y-%m-%d')
-
-    scratchdir = os.path.join(datadir, "_scratch")
-
-    # flag = True
-    num_runs = 0
-
-    # If data already exists, only get new data starting from the last one
-    savepath = os.path.join(datadir, f"{res_name}.csv")
-    
-    if os.path.isfile(savepath):
-        temp_df = pd.read_csv(savepath, parse_dates=['date']).set_index('date')
-
-        last_date = temp_df.index[-1].to_pydatetime()
-        fo = (last_date - timedelta(days=TEMPORAL_RESOLUTION*2)).strftime("%Y-%m-%d")
-        to_combine = [savepath]
-        print(f"Existing file found - Last observation ({TEMPORAL_RESOLUTION*2} day lag): {last_date}")
-
-        # If 16 days have not passed since last observation, skip the processing
-        days_passed = (datetime.strptime(end, "%Y-%m-%d") - last_date).days
-        print(f"No. of days passed since: {days_passed}")
-        if days_passed < TEMPORAL_RESOLUTION:
-            print(f"No new observation expected. Quitting early")
-            return None
+    # Extracting reservoir geometry 
+    global aoi
+    aoi = poly2feature(res_polygon,BUFFER_DIST).geometry()
+     ## Checking if time interval is small then the image collection should not be empty in GEE
+    if (days_between(start,end) < 30):     # less than a month difference
+        number_of_images = s2.filterBounds(aoi).filterDate(start, end).size().getInfo()
     else:
-        to_combine = []
+        number_of_images = 1     # more than a month difference simply run, so no need to calculate number_of_images
     
-    savedir = os.path.join(scratchdir, f"{res_name}_s2_cordeiro_zhao_gao_{fo}_{enddate}")
-    if not os.path.isdir(savedir):
-        os.makedirs(savedir)
-    
-    print(f"Extracting SA for the period {fo} -> {enddate}")
-
-    dates = pd.date_range(fo, enddate, freq=f'{TEMPORAL_RESOLUTION}D')
-    grouped_dates = grouper(dates, RESULTS_PER_ITER)
-
-    for subset_dates in grouped_dates:
-        try:
-            print(subset_dates)
-            dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
-            
-            ts_imcoll = generate_timeseries(dates)
-            postprocessed_ts_imcoll = ts_imcoll.map(postprocess_wrapper)
-
-            # Download the data locally
-            ts_imcoll_L = ts_imcoll.getInfo()
-            postprocessed_ts_imcoll_L = postprocessed_ts_imcoll.getInfo()
-
-            # Parse the data to create dataframe
-            PROCESSING_STATUSES = []
-            POSTPROCESSING_STATUSES = []
-            cloud_areas = []
-            cloud_percents = []
-            from_dates = []
-            to_dates = []
-            obs_dates = []
-            non_water_areas = []
-            water_areas = []
-            water_areas_zhaogao = []
-            for f, f_postprocessed in zip(ts_imcoll_L['features'], postprocessed_ts_imcoll_L['features']):
-                PROCESSING_STATUS = f['properties']['PROCESSING_SUCCESSFUL']
-                PROCESSING_STATUSES.append(PROCESSING_STATUS)
-                POSTPROCESSING_STATUS = f_postprocessed['properties']['POSTPROCESSING_SUCCESSFUL']
-                POSTPROCESSING_STATUSES.append(POSTPROCESSING_STATUS)
-                obs_dates.append(pd.to_datetime(f['properties']['system:time_start']))
-                from_dates.append(pd.to_datetime(f['properties']['from_date']))
-                to_dates.append(pd.to_datetime(f['properties']['to_date']))
-                if PROCESSING_STATUS:
-                    water_areas.append(f['properties']['water_area_clustering'])
-                    non_water_areas.append(f['properties']['non_water_area_clustering'])
-                    cloud_areas.append(f['properties']['cloud_area'])
-                    cloud_percents.append(f['properties']['cloud_percent'])
-                else:
-                    water_areas.append(np.nan)
-                    non_water_areas.append(np.nan)
-                    cloud_areas.append(np.nan)
-                    cloud_percents.append(np.nan)
-                if POSTPROCESSING_STATUS:
-                    water_areas_zhaogao.append(f_postprocessed['properties']['corrected_area'])
-                else:
-                    water_areas_zhaogao.append(np.nan)
-            
-            df = pd.DataFrame({
-                'date': obs_dates,
-                'PROCESSING_STATUS': PROCESSING_STATUSES,
-                'POSTPROCESSING_STATUS': POSTPROCESSING_STATUSES,
-                'from_date': from_dates,
-                'to_date': to_dates,
-                'cloud_area': cloud_areas,
-                'cloud_percent': cloud_percents,
-                'water_area_uncorrected': water_areas,
-                'non_water_area': non_water_areas,
-                'water_area_corrected': water_areas_zhaogao
-            }).set_index('date')
-
-            fname = os.path.join(savedir, f"{df.index[0].strftime('%Y%m%d')}_{df.index[-1].strftime('%Y%m%d')}_{res_name}.csv")
-            df.to_csv(fname)
-            print(df.tail())
-
-            s_time = randint(5, 10)
-            print(f"Sleeping for {s_time} seconds")
-            time.sleep(s_time)
-
-            if (datetime.strptime(enddate, "%Y-%m-%d")-df.index[-1]).days < TEMPORAL_RESOLUTION:
-                print(f"Quitting: Reached enddate {enddate}")
-                break
-            elif df.index[-1].strftime('%Y-%m-%d') == fo:
-                print(f"Reached last available observation - {fo}")
-                break
-            elif num_runs > 1000:
-                print("Quitting: Reached 1000 iterations")
-                break
-        except Exception as e:
-            log.error(e)
-            continue
-
-    # Combine the files into one database
-    to_combine.extend([os.path.join(savedir, f) for f in os.listdir(savedir) if f.endswith(".csv")])
-
-    files = [pd.read_csv(f, parse_dates=["date"]).set_index("date") for f in to_combine]
-    data = pd.concat(files).drop_duplicates().sort_values("date")
-
-    data.to_csv(savepath)
+    if(number_of_images):
+        fo = get_first_obs(start, end).format('YYYY-MM-dd').getInfo()
+        first_obs = datetime.strptime(fo, '%Y-%m-%d')
+
+        scratchdir = os.path.join(datadir, "_scratch")
+
+        # flag = True
+        num_runs = 0
+
+        # If data already exists, only get new data starting from the last one
+        savepath = os.path.join(datadir, f"{res_name}.csv")
+        
+        if os.path.isfile(savepath):
+            temp_df = pd.read_csv(savepath, parse_dates=['date']).set_index('date')
+
+            last_date = temp_df.index[-1].to_pydatetime()
+            fo = (last_date - timedelta(days=TEMPORAL_RESOLUTION*2)).strftime("%Y-%m-%d")
+            to_combine = [savepath]
+            print(f"Existing file found - Last observation ({TEMPORAL_RESOLUTION*2} day lag): {last_date}")
+
+            # If 16 days have not passed since last observation, skip the processing
+            days_passed = (datetime.strptime(end, "%Y-%m-%d") - last_date).days
+            print(f"No. of days passed since: {days_passed}")
+            if days_passed < TEMPORAL_RESOLUTION:
+                print(f"No new observation expected. Quitting early")
+                return None
+        else:
+            to_combine = []
+        
+        savedir = os.path.join(scratchdir, f"{res_name}_s2_cordeiro_zhao_gao_{fo}_{enddate}")
+        if not os.path.isdir(savedir):
+            os.makedirs(savedir)
+        
+        print(f"Extracting SA for the period {fo} -> {enddate}")
+
+        dates = pd.date_range(fo, enddate, freq=f'{TEMPORAL_RESOLUTION}D')
+        grouped_dates = grouper(dates, RESULTS_PER_ITER)
+
+        # # redo the calculations part and see where it is complaining about too many aggregations
+        # subset_dates = next(grouped_dates)
+        # dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
+
+        # print(subset_dates)
+        # res = generate_timeseries(dates).filterMetadata('s2_images', 'greater_than', 0)
+        # pprint.pprint(res.aggregate_array('s2_images').getInfo())
+
+        # uncorrected_columns_to_extract = ['from_date', 'to_date', 'water_area_cordeiro', 'non_water_area_cordeiro', 'water_area_NDWI', 'non_water_area_NDWI', 'cloud_area', 's2_images']
+        # uncorrected_final_data_ee = res.reduceColumns(ee.Reducer.toList(len(uncorrected_columns_to_extract)), uncorrected_columns_to_extract).get('list')
+        # uncorrected_final_data = uncorrected_final_data_ee.getInfo()
+        
+
+
+        for subset_dates in grouped_dates:
+            try:
+                print(subset_dates)
+                dates = ee.List([ee.Date(d) for d in subset_dates if d is not None])
+                
+                ts_imcoll = generate_timeseries(dates)
+                postprocessed_ts_imcoll = ts_imcoll.map(postprocess_wrapper)
+
+                # Download the data locally
+                ts_imcoll_L = ts_imcoll.getInfo()
+                postprocessed_ts_imcoll_L = postprocessed_ts_imcoll.getInfo()
+
+                # Parse the data to create dataframe
+                PROCESSING_STATUSES = []
+                POSTPROCESSING_STATUSES = []
+                cloud_areas = []
+                cloud_percents = []
+                from_dates = []
+                to_dates = []
+                obs_dates = []
+                non_water_areas = []
+                water_areas = []
+                water_areas_zhaogao = []
+                for f, f_postprocessed in zip(ts_imcoll_L['features'], postprocessed_ts_imcoll_L['features']):
+                    PROCESSING_STATUS = f['properties']['PROCESSING_SUCCESSFUL']
+                    PROCESSING_STATUSES.append(PROCESSING_STATUS)
+                    POSTPROCESSING_STATUS = f_postprocessed['properties']['POSTPROCESSING_SUCCESSFUL']
+                    POSTPROCESSING_STATUSES.append(POSTPROCESSING_STATUS)
+                    obs_dates.append(pd.to_datetime(f['properties']['system:time_start']))
+                    from_dates.append(pd.to_datetime(f['properties']['from_date']))
+                    to_dates.append(pd.to_datetime(f['properties']['to_date']))
+                    if PROCESSING_STATUS:
+                        water_areas.append(f['properties']['water_area_clustering'])
+                        non_water_areas.append(f['properties']['non_water_area_clustering'])
+                        cloud_areas.append(f['properties']['cloud_area'])
+                        cloud_percents.append(f['properties']['cloud_percent'])
+                    else:
+                        water_areas.append(np.nan)
+                        non_water_areas.append(np.nan)
+                        cloud_areas.append(np.nan)
+                        cloud_percents.append(np.nan)
+                    if POSTPROCESSING_STATUS:
+                        water_areas_zhaogao.append(f_postprocessed['properties']['corrected_area'])
+                    else:
+                        water_areas_zhaogao.append(np.nan)
+                
+                df = pd.DataFrame({
+                    'date': obs_dates,
+                    'PROCESSING_STATUS': PROCESSING_STATUSES,
+                    'POSTPROCESSING_STATUS': POSTPROCESSING_STATUSES,
+                    'from_date': from_dates,
+                    'to_date': to_dates,
+                    'cloud_area': cloud_areas,
+                    'cloud_percent': cloud_percents,
+                    'water_area_uncorrected': water_areas,
+                    'non_water_area': non_water_areas,
+                    'water_area_corrected': water_areas_zhaogao
+                }).set_index('date')
+
+                fname = os.path.join(savedir, f"{df.index[0].strftime('%Y%m%d')}_{df.index[-1].strftime('%Y%m%d')}_{res_name}.csv")
+                df.to_csv(fname)
+                print(df.tail())
+
+                s_time = randint(5, 10)
+                print(f"Sleeping for {s_time} seconds")
+                time.sleep(s_time)
+
+                if (datetime.strptime(enddate, "%Y-%m-%d")-df.index[-1]).days < TEMPORAL_RESOLUTION:
+                    print(f"Quitting: Reached enddate {enddate}")
+                    break
+                elif df.index[-1].strftime('%Y-%m-%d') == fo:
+                    print(f"Reached last available observation - {fo}")
+                    break
+                elif num_runs > 1000:
+                    print("Quitting: Reached 1000 iterations")
+                    break
+            except Exception as e:
+                log.error(e)
+                continue
+
+        # Combine the files into one database
+        to_combine.extend([os.path.join(savedir, f) for f in os.listdir(savedir) if f.endswith(".csv")])
+
+        files = [pd.read_csv(f, parse_dates=["date"]).set_index("date") for f in to_combine]
+        data = pd.concat(files).drop_duplicates().sort_values("date")
+
+        data.to_csv(savepath)
+    else:
+        print(f"No observation observed between {start} and {end}. Quitting!")
+        return None
 
     return savepath
 
 # User-facing wrapper function
-def sarea_s2(reservoir, start, end, datadir):
-    return run_process_long(reservoir, start, end, datadir)
-
-
-def main():
-    # Setup argument parser
-    parser = argparse.ArgumentParser(description="Generate Reservoir Surface area time series")
-
-    parser.add_argument("reservoir")
-    parser.add_argument("start_date")
-    parser.add_argument("end_date")
-
-    args = parser.parse_args()
-
-    reservoir = args.reservoir
-    start = args.start_date
-    end = args.end_date
-
-    run_process_long(reservoir, start, end, "data/s2")
-
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
+def sarea_s2(res_name, res_polygon, start, end, datadir):
+    return run_process_long(res_name,res_polygon, start, end, datadir)
\ No newline at end of file
diff --git a/backend/scripts/core/sarea/sarea_cli_sar.py b/src/rat/core/sarea/sarea_cli_sar.py
similarity index 58%
rename from backend/scripts/core/sarea/sarea_cli_sar.py
rename to src/rat/core/sarea/sarea_cli_sar.py
index f2006495..a73b15b3 100644
--- a/backend/scripts/core/sarea/sarea_cli_sar.py
+++ b/src/rat/core/sarea/sarea_cli_sar.py
@@ -1,23 +1,15 @@
-from core.sarea.sarea_cli_s2 import TEMPORAL_RESOLUTION
 import ee
 import numpy as np
 import pandas as pd
-import argparse
 import os
 from datetime import datetime, timedelta
-from scipy.stats import zscore
 
-ee.Initialize()
-
-
-reservoir = "Lam_Pao"
+from rat.core.sarea.sarea_cli_s2 import TEMPORAL_RESOLUTION
+from rat.ee_utils.ee_utils import poly2feature
+from rat.utils.utils import days_between
 
 s1 = ee.ImageCollection("COPERNICUS/S1_GRD")
-reservoir_geom_prefix = "users/saswegee/pritam/RAT-Mekong/"
-# ROI = ee.FeatureCollection(f"users/pdas47/RAT/{reservoir}")
 
-start_date = '2018-07-01'
-end_date = '2022-01-01'
 # definitions
 ANGLE_THRESHOLD_1 = ee.Number(45.4);
 ANGLE_THRESHOLD_2 = ee.Number(31.66)
@@ -113,7 +105,7 @@ def ee_get_data(ee_Date_Start, ee_Date_End):
     return df
 
 def retrieve_sar(start_date, end_date, res='ys'):
-    date_ranges = list(pd.date_range(start_date, end_date, freq=res).strftime("%Y-%m-%d").tolist()) + [end_date]
+    date_ranges = list((pd.date_range(start_date, end_date, freq=res).union([pd.to_datetime(start_date), pd.to_datetime(end_date)])).strftime("%Y-%m-%d").tolist()) 
     print(date_ranges)
     dfs = []
     # for begin, end in zip(date_ranges[:-1], date_ranges.shift(1)[:-1]):
@@ -130,75 +122,53 @@ def retrieve_sar(start_date, end_date, res='ys'):
 
 # data.to_csv(f"../data/sar/{reservoir}_12d_sar.csv")
 
-def sarea_s1(reservoir, start_date, end_date, datadir):
+def sarea_s1(reservoir, reservoir_polygon ,start_date, end_date, datadir):
+    
+    # Extracting reservoir geometry 
     global ROI 
-    # reservoir_ee = ee.FeatureCollection(f"users/pdas47/RAT/{reservoir}")
-    reservoir_ee = ee.FeatureCollection(reservoir_geom_prefix + reservoir)
-    ROI = reservoir_ee.geometry().buffer(BUFFER_DIST)
+    ROI = poly2feature(reservoir_polygon,BUFFER_DIST).geometry()
     TEMPORAL_RESOLUTION = 12
 
-    savepath = os.path.join(datadir, f"{reservoir}_12d_sar.csv")
-    if os.path.isfile(savepath):
-        existing_df = pd.read_csv(savepath, parse_dates=['time']).set_index('time')
-
-        last_date = existing_df.index[-1].to_pydatetime()
-        start_date = (last_date - timedelta(days=TEMPORAL_RESOLUTION*2)).strftime("%Y-%m-%d")
-        to_combine = [existing_df.reset_index()]
-        print(f"Existing file found - Last observation ({TEMPORAL_RESOLUTION*2} day lag): {last_date}")
-
-        # If <TEMPORAL RESOLUTION> days have not passed since last observation, skip the processing
-        days_passed = (datetime.strptime(end_date, "%Y-%m-%d") - last_date).days
-        print(f"No. of days passed since: {days_passed}")
-        if days_passed < TEMPORAL_RESOLUTION:
-            print(f"No new observation expected. Quitting early")
-            return savepath
+    ## Checking if time interval is small then the image collection should not be empty in GEE
+    if (days_between(start_date,end_date) < 30):     # less than a month difference
+        number_of_images = s1.filterDate(start_date,end_date) \
+            .filterBounds(ROI) \
+            .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV')) \
+            .filter(ee.Filter.eq('instrumentMode', 'IW')).size().getInfo()
     else:
-        to_combine = []
-
-    results = retrieve_sar(start_date, end_date, res='6MS')
-    to_combine.append(results)
-    data = pd.concat(to_combine).drop_duplicates().sort_values("time")
-
-    # z-score based filtering to filter out highly improbably sarea values
-    ZSCORE_THRESHOLD = 2
-
-    zscore_values = zscore(data['sarea'])
-    condition = (zscore_values < -ZSCORE_THRESHOLD)|(zscore_values > ZSCORE_THRESHOLD)
-    data.loc[condition.values, 'sarea'] = np.nan
-
-    data.loc[:, 'sarea'] = data.set_index('time')['sarea'].interpolate(method='from_derivatives').values
-    
-    if not os.path.isdir(datadir):
-        os.makedirs(datadir)
-    data.to_csv(savepath, index=False)
-
-    return savepath
-
-
-def main():
-    # Setup argument parser
-    parser = argparse.ArgumentParser(description="Generate Reservoir Surface area time series - Sentinel-1")
-
-    parser.add_argument("reservoir")
-    parser.add_argument("start_date")
-    parser.add_argument("end_date")
-
-    args = parser.parse_args()
-
-    reservoir = args.reservoir
-    start = args.start_date
-    end = args.end_date
+        number_of_images = 1     # more than a month difference simply run, so no need to calculate number_of_images
     
-    print(f"{reservoir = }, {start = }, {end = }")
-    
-    global ROI 
-    reservoir_ee = ee.FeatureCollection(f"users/pdas47/RAT/{reservoir}")
-    ROI = reservoir_ee.geometry().buffer(BUFFER_DIST)
-
-    results = retrieve_sar(start, end, res='6MS')
-    savepath = f"backend/data/sar/{reservoir}_12d_sar.csv"
-    results.to_csv(savepath, index=False)
+    if(number_of_images):
+        savepath = os.path.join(datadir, f"{reservoir}_12d_sar.csv")
+        if os.path.isfile(savepath):
+            existing_df = pd.read_csv(savepath, parse_dates=['time']).set_index('time')
+
+            last_date = existing_df.index[-1].to_pydatetime()
+            start_date = (last_date - timedelta(days=TEMPORAL_RESOLUTION*2)).strftime("%Y-%m-%d")
+            to_combine = [existing_df.reset_index()]
+            print(f"Existing file found - Last observation ({TEMPORAL_RESOLUTION*2} day lag): {last_date}")
+
+            # If <TEMPORAL RESOLUTION> days have not passed since last observation, skip the processing
+            days_passed = (datetime.strptime(end_date, "%Y-%m-%d") - last_date).days
+            print(f"No. of days passed since: {days_passed}")
+            if days_passed < TEMPORAL_RESOLUTION:
+                print(f"No new observation expected. Quitting early")
+                return savepath
+        else:
+            to_combine = []
+
+        results = retrieve_sar(start_date, end_date, res='6MS')
+        to_combine.append(results)
+        data = pd.concat(to_combine).drop_duplicates().sort_values("time")
+        
+        if not os.path.isdir(datadir):
+            os.makedirs(datadir)
+        data.to_csv(savepath, index=False)
+
+        return savepath
 
+    else:
+        print(f"No observation observed between {start_date} and {end_date}. Quitting!")
+        return None
 
-if __name__ == '__main__':
-    main()
\ No newline at end of file
+    return savepath
diff --git a/backend/scripts/data_processing/__init__.py b/src/rat/data_processing/__init__.py
similarity index 100%
rename from backend/scripts/data_processing/__init__.py
rename to src/rat/data_processing/__init__.py
diff --git a/src/rat/data_processing/altimetry.py b/src/rat/data_processing/altimetry.py
new file mode 100644
index 00000000..adc2c241
--- /dev/null
+++ b/src/rat/data_processing/altimetry.py
@@ -0,0 +1,789 @@
+import geopandas as gpd
+import numpy as np
+import pandas as pd
+import netCDF4 
+from rat.utils.utils import round_up
+
+
+def get_j3_tracks(reservoir, reservoir_column_dict, tracks_df, custom_reservoir_range_dict):
+    """Returns a list of Jason-3 ground tracks and the min-max latitudes of intersection
+
+    Args:
+        reservoir (geopandas dataframe): Geodataframe object of reservoir having only one row
+        tracks_df (geopandas dataframe): Geodataframe object of altimeter tracks; Should contains 'track' column 
+            containing the track numbers, and a geometry column containing linestrings of the path
+    
+    Returns:
+        (dict) if overlapping tracks are found. 
+            {'tracks': (list) of tracks that overlap with reservoir
+             'lat_range': (list) of (tuples) of minimum and maximum latitudes for each track}
+        (None) if no overlapping tracks are found
+    """
+    gdf = tracks_df
+    
+    res = reservoir
+    
+    res_name = str(res[reservoir_column_dict['unique_identifier']])
+    res_geom = res['geometry'] #.unary_union
+    tracks = gdf[gdf.intersects(res_geom)]['track'].unique()
+
+    minmax_lats = []
+    if(custom_reservoir_range_dict):
+        if res_name in custom_reservoir_range_dict.keys():
+            minmax_lats.append(custom_reservoir_range_dict[res_name])
+        else:
+            for track in tracks:
+                track_geom = gdf[gdf['track']==track] #.geometry
+                intersect = gpd.clip(track_geom, res_geom)
+                minx, miny, maxx, maxy = intersect.geometry.unary_union.bounds
+
+                minmax_lats.append((round_up(miny,6), round_up(maxy,6)))
+    else:
+        for track in tracks:
+            track_geom = gdf[gdf['track']==track] #.geometry
+            intersect = gpd.clip(track_geom, res_geom)
+            minx, miny, maxx, maxy = intersect.geometry.unary_union.bounds
+
+            minmax_lats.append((round_up(miny,6), round_up(maxy,6)))
+    
+    if len(tracks) == 0:
+        return_data = None
+    else:
+        return_data = {'tracks': tracks, 'lat_range' : minmax_lats}
+    
+    return return_data
+
+
+import netCDF4
+import zipfile
+import os
+import os, sys
+import os.path
+import numpy as np
+import pandas as pd
+from netCDF4 import Dataset
+from datetime import datetime
+from ftplib import FTP
+from tqdm import tqdm
+import glob
+import time
+from numpy import empty
+from numpy import loadtxt
+import math
+import statistics
+from scipy import io
+from scipy import stats
+from scipy import interpolate
+from scipy.cluster.vq import kmeans2
+import matplotlib.pyplot as plt
+from sklearn.cluster import KMeans
+from tqdm import tqdm
+
+import configparser
+from datetime import timedelta, datetime
+
+
+def _get_suffix():
+    return datetime.today().strftime("%Y%m%d_%H_%M_%S")
+
+
+def _convert_partial_year(number):
+    is_leap = lambda y: True if y % 400 == 0 else False if y % 100 == 0 else True if y % 4 == 0 else False
+
+    year = int(number)
+    d = timedelta(days=(number - year)*(365 + is_leap(year)))
+    day_one = datetime(year,1,1)
+    date = d + day_one
+    return date
+
+
+def download_data(username, password, savedir, passnum, startcycle, endcycle, series):
+    """Downloads Jason data
+
+    Args:
+        username (str): Username of the AVISO account that'll be used to download data
+        password (str): Password of the AVISO account that'll be used to download data
+        savedir (str): Directory where to save data
+        passnum (int): Which pass-number to download? - analogous to location/space
+        startcycle (int): Start of the cycle - analogous to start time of required data
+        endcycle (int): End of cycle - analogous to end time of required data
+        series (int): Which Jason series of data to download? (1, 2, 3)
+    """
+    username = username
+    PW = password
+    if series == 3:
+        # Jason3
+        if len(str(passnum)) == 1:
+            passnum2 = "00" + str(passnum)
+        elif len(str(passnum)) == 2:
+            passnum2 = "0" + str(passnum)
+        else:
+            passnum2 = str(passnum)
+
+        count = 0
+        for cycle in range(startcycle, endcycle + 1):
+            count = count + 1
+            if len(str(cycle)) == 1:
+                cycle2 = "00" + str(cycle)
+            elif len(str(cycle)) == 2:
+                cycle2 = "0" + str(cycle)
+            else:
+                cycle2 = str(cycle)
+
+            savepath = savedir + "/j%s_%s/gdr_f/cycle_%s/" % (
+                str(series),
+                str(passnum2),
+                str(cycle2),
+            )
+            # try:
+            os.makedirs(os.path.dirname(savepath), exist_ok=True)  # will not skip if empty directory exists, coz sometimes empty directory will be created and we don't want to skip it
+            # except FileExistsError:
+            #     print(f"Existing data found {os.path.dirname(savepath).split(os.sep)[-1]}; Skipping")
+            #     continue
+            os.chdir(savepath)
+
+            ftp = FTP("ftp-access.aviso.altimetry.fr")
+            ftp.login(user=str(username), passwd=str(PW))
+            ftp.cwd(
+                "geophysical-data-record/jason-%s/gdr_f/cycle_%s"
+                % (str(series), str(cycle2))
+            )
+
+            if cycle < 22:
+                fnbase = "JA%s_GPN_2PfP%s_%s_" % (
+                    str(series),
+                    str(cycle2),
+                    str(passnum2),
+                )
+            else:
+                fnbase = "JA%s_GPN_2PfP%s_%s_" % (
+                    str(series),
+                    str(cycle2),
+                    str(passnum2),
+                )
+            if cycle < 167:
+                filesineed = [filename for filename in ftp.nlst() if fnbase in filename]
+                for filename in filesineed:
+                    local_filename = os.path.join(os.getcwd(), filename)
+                    if not (os.path.exists(local_filename)):       # Will not download if the file already exists
+                        with open(local_filename, "wb") as f:
+                            ftp.retrbinary("RETR %s" % filename, f.write)
+                        print(f"Downloaded file for cycle {cycle} - {filename}")
+                    else:
+                        print(f"Existing file found for cycle {cycle} - {filename}")
+            else:
+                fnbase2 = "JA%s_GPN_2PfP%s_%s_" % (
+                    str(series),
+                    str(cycle2),
+                    str(passnum2),
+                )
+                filesineed2 = [
+                    filename2 for filename2 in ftp.nlst() if fnbase2 in filename2
+                ]
+                for filename2 in filesineed2:
+                    local_filename2 = os.path.join(os.getcwd(), filename2)
+                    if not (os.path.exists(local_filename2)):            # Will not download if the file already exists
+                        with open(local_filename2, "wb") as f2:
+                            ftp.retrbinary("RETR %s" % filename2, f2.write)
+                        print(f"Downloaded file for cycle {cycle} - {filename2}")
+                    else:
+                        print(f"Existing file found for cycle {cycle} - {filename2}")
+            
+            print("Finished downloading cycle_%s" % (str(cycle2)))
+    else:
+        if len(str(passnum)) == 1:
+            passnum3 = "00" + str(passnum)
+        elif len(str(passnum)) == 2:
+            passnum3 = "0" + str(passnum)
+        else:
+            passnum3 = str(passnum)
+
+        count = 0
+        for cycle in range(startcycle, endcycle + 1):
+            count = count + 1
+            if len(str(cycle)) == 1:
+                cycle3 = "00" + str(cycle)
+            elif len(str(cycle)) == 2:
+                cycle3 = "0" + str(cycle)
+            else:
+                cycle3 = str(cycle)
+
+            ftp = FTP("ftp-access.aviso.altimetry.fr")
+            ftp.login(user=str(username), passwd=str(PW))
+            ftp.cwd(
+                "geophysical-data-record/jason-%s/gdr_d/cycle_%s"
+                % (str(series), str(cycle3))
+            )
+            fnbase3 = "JA%s_GPN_2PdP%s_%s_" % (str(series), str(cycle3), str(passnum3))
+            savepath2 = savedir + "/j%s_%s/gdr_d/cycle_%s/" % (
+                str(series),
+                str(passnum3),
+                str(cycle3),
+            )
+            os.makedirs(os.path.dirname(savepath2))
+            os.chdir(savepath2)
+            filesineed3 = [
+                filename3 for filename3 in ftp.nlst() if fnbase3 in filename3
+            ]
+            for filename3 in filesineed3:
+                local_filename3 = os.path.join(os.getcwd(), filename3)
+                if not (os.path.exists(local_filename3)):            # Will not download if the file already exists
+                    with open(local_filename3, "wb") as f3:
+                        ftp.retrbinary("RETR %s" % filename3, f3.write)
+                    print(f"Downloaded file for cycle {cycle} - {filename3}")
+                else:
+                    print(f"Existing file found for cycle {cycle} - {filename3}")
+            
+            print("Finished downloading cycle_%s" % (str(cycle3)))
+    print("Data Download complete")
+
+
+def extract_data(datadir, savedir, minlat, maxlat, passnum, series, startcycle, endcycle, suffix="auto"):
+    """Extract and process Jason data
+
+    Args:
+        datadir (str):  Directory of raw data
+        savedir (str):  Directory where to save processed data
+        minlat (float): minimum latitude of ROI
+        maxlat (float): maximum latitude of ROI
+        passnum (int):  pass number of data
+        series (int):   Which Jason series is the data from?
+        startcycle (int): Start of the cycle - analogous to start time of required data
+        endcycle (int): End of cycle - analogous to end time of required data
+        suffix (str, optional): Suffix of directory where data will be saved. If left at "auto", 
+                        the time of run will be used. Defaults to "auto".
+    """
+    directory = datadir
+    lat_range = [minlat, maxlat]
+    directory2 = "/%s/" % (directory)
+
+    if suffix == "auto":
+        suffix = _get_suffix()
+
+    wgs84_to_tp = 0.7
+
+    if len(str(passnum)) == 1:
+        passnum22 = "00" + str(passnum)
+    elif len(str(passnum)) == 2:
+        passnum22 = "0" + str(passnum)
+    else:
+        passnum22 = str(passnum)
+
+    filename = "j%s_gdr_p%s_%s_%s_%s_info" % (
+        str(series),
+        str(passnum22),
+        str(suffix),
+        str(minlat),
+        str(maxlat),
+    )
+    savepath11 = savedir + "/j%s_%s/extract_%s/" % (
+        str(series),
+        str(passnum22),
+        str(suffix),
+    )
+    os.makedirs(os.path.dirname(savepath11),exist_ok=True)
+    completename = os.path.join(savepath11, filename + ".txt")
+
+    # Extract complete data if file not exists otherwise append to the existing file
+    if not os.path.exists(completename):
+        extract_condition = True
+        text_file = open(completename, "w")
+        print(f"Creating a new extract file - {filename}")
+    else:
+        extract_condition = False
+        text_file = open(completename, "r+")
+        file_lines = text_file.readlines()
+        text_file.seek(0,2)
+        print(f"Appending to extract file - {filename}")
+
+    ##Scale Factors & FillValues & Read Data Record
+    if series == 3:
+        pattern = os.path.join(datadir, "gdr_f", "cycle_*", "*.nc")
+        allpath = glob.glob(pattern)
+        for fn in range(len(allpath)):
+            dir_cycle_no = int(os.path.basename(os.path.dirname(allpath[fn]))[-3:])
+            # Extract data only if raw file downloaded in current run or if the file does not exist
+            
+            if(extract_condition or (dir_cycle_no>= startcycle and dir_cycle_no<= endcycle)):
+                print(f"Extracting data from raw netcdf file for cycle: {dir_cycle_no}")
+                allpath1 = str(allpath[fn])
+                allpath11 = os.path.basename(allpath1)
+                data = netCDF4.Dataset(allpath1)
+                cycno2 = allpath11[12:15]
+                ###-- 1Hz record --
+                iono_corr_gim_ku_sc = 0.0001
+                iono_corr_gim_ku_FV = 32767 * iono_corr_gim_ku_sc
+                solid_earth_tide_sc = 0.0001
+                solid_earth_tide_FV = 32767 * solid_earth_tide_sc
+                pole_tide_sc = 0.0001
+                pole_tide_FV = 32767 * pole_tide_sc
+                ### -- 20Hz record --
+                alt_20hz_sc = 0.0001
+                alt_20hz_add = 1300000
+                alt_20hz_FV = 2147483647 * alt_20hz_sc + alt_20hz_add
+                lat_20hz_sc = 0.000001
+                lat_20hz_FV = 2147483647 * lat_20hz_sc
+                lon_20hz_sc = 0.000001
+                lon_20hz_FV = 2147483647 * lon_20hz_sc
+                model_dry_tropo_corr_sc = 0.0001
+                model_dry_tropo_corr_FV = 32767 * model_dry_tropo_corr_sc
+                model_wet_tropo_corr_sc = 0.0001
+                model_wet_tropo_corr_FV = 32767 * model_wet_tropo_corr_sc
+                ice_range_20hz_ku_sc = 0.0001
+                ice_range_20hz_ku_add = 1300000
+                ice_range_20hz_ku_FV = (
+                    2147483647 * ice_range_20hz_ku_sc + ice_range_20hz_ku_add
+                )
+                ice_sig0_20hz_ku_sc = 0.01
+                ice_sig0_20hz_ku_FV = 32767 * ice_sig0_20hz_ku_sc
+                # percent = 100 * (fn + 1) / (len(allpath) + 1)
+                # print("%1.3f percent complete" % (percent))
+                ###-- 1Hz record --
+                alt_state_band_status_flag = (
+                    data.groups["data_01"]
+                    .groups["ku"]
+                    .variables["alt_state_band_status_flag"][:]
+                )
+                iono_corr_gim_ku = (
+                    data.groups["data_01"].groups["ku"].variables["iono_cor_gim"][:]
+                )  # *iono_corr_gim_ku_sc
+                solid_earth_tide = data.groups["data_01"].variables["solid_earth_tide"][
+                    :
+                ]  # *solid_earth_tide_sc
+                pole_tide = data.groups["data_01"].variables["pole_tide"][
+                    :
+                ]  # *pole_tide_sc
+
+                ### -- 20Hz record --
+                indx_20hzIn01hz = data.groups["data_20"].variables["index_1hz_measurement"][
+                    :
+                ]
+                alt_20hz = data.groups["data_20"].variables["altitude"][
+                    :
+                ]  # *alt_20hz_sc+alt_20hz_add
+                lat_20hz = data.groups["data_20"].variables["latitude"][:]  # *lat_20hz_sc
+                lon_20hz = data.groups["data_20"].variables["longitude"][:]  # *lon_20hz_sc
+                time_20hz = data.groups["data_20"].variables["time"][:]
+                model_dry_tropo_corr = data.groups["data_20"].variables[
+                    "model_dry_tropo_cor_measurement_altitude"
+                ][
+                    :
+                ]  # *model_dry_tropo_corr_sc
+                model_wet_tropo_corr = data.groups["data_20"].variables[
+                    "model_wet_tropo_cor_measurement_altitude"
+                ][
+                    :
+                ]  # *model_wet_tropo_corr_sc
+                ice_range_20hz_ku = (
+                    data.groups["data_20"].groups["ku"].variables["range_ocog"][:]
+                )  # *ice_range_20hz_ku_sc+ice_range_20hz_ku_add
+                ice_sig0_20hz_ku = (
+                    data.groups["data_20"].groups["ku"].variables["sig0_ocog"][:]
+                )  # *ice_sig0_20hz_ku_sc
+                ice_qual_flag_20hz_ku = (
+                    data.groups["data_20"].groups["ku"].variables["ocog_qual"][:]
+                )
+
+                for p in range(len(alt_20hz)):
+                    if lat_20hz[p] < lat_range[0] or lat_20hz[p] > lat_range[1]:
+                        continue
+                    if model_dry_tropo_corr[p] == model_dry_tropo_corr_FV:
+                        dry_count = 1
+                    else:
+                        dry_count = 0
+
+                    if model_wet_tropo_corr[p] == model_wet_tropo_corr_FV:
+                        wet_count = 1
+                    else:
+                        wet_count = 0
+
+                    if iono_corr_gim_ku[indx_20hzIn01hz[p]] == iono_corr_gim_ku_FV:
+                        iono_count = 1
+                    else:
+                        iono_count = 0
+
+                    if solid_earth_tide[indx_20hzIn01hz[p]] == solid_earth_tide_FV:
+                        sTide_count = 1
+                    else:
+                        sTide_count = 0
+
+                    if pole_tide[indx_20hzIn01hz[p]] == pole_tide_FV:
+                        pTide_count = 1
+                    else:
+                        pTide_count = 0
+
+                    if alt_state_band_status_flag[indx_20hzIn01hz[p]] != 0:
+                        kFlag_count = 1
+                    else:
+                        kFlag_count = 0
+
+                    if lat_20hz[p] == lat_20hz_FV:
+                        lat_count = 1
+                    else:
+                        lat_count = 0
+
+                    if ice_qual_flag_20hz_ku[p] != 0:
+                        ice_count = 1
+                    else:
+                        ice_count = 0
+
+                    media_corr = (
+                        model_dry_tropo_corr[p]
+                        + model_wet_tropo_corr[p]
+                        + iono_corr_gim_ku[indx_20hzIn01hz[p]]
+                        + solid_earth_tide[indx_20hzIn01hz[p]]
+                        + pole_tide[indx_20hzIn01hz[p]]
+                    )
+                    mjd_20hz = time_20hz[p] * 1 / 86400 + 51544
+                    icehgt_20hz = (
+                        alt_20hz[p] - (media_corr + ice_range_20hz_ku[p]) + wgs84_to_tp
+                    )
+
+                    Flags = (
+                        dry_count
+                        + wet_count
+                        + iono_count
+                        + sTide_count
+                        + pTide_count
+                        + kFlag_count
+                        + lat_count
+                        + ice_count
+                    )
+                    write_line = "%4s %4s %4s %4s %3s %4s %4s %4s %4s %4s %20.6f %20.6f %20.6f %20.6f %20.6f %10.3f\n" % (
+                            dry_count,
+                            wet_count,
+                            iono_count,
+                            sTide_count,
+                            pTide_count,
+                            kFlag_count,
+                            lat_count,
+                            ice_count,
+                            Flags,
+                            cycno2,
+                            mjd_20hz,
+                            lon_20hz[p],
+                            lat_20hz[p],
+                            icehgt_20hz,
+                            ice_sig0_20hz_ku[p],
+                            ice_qual_flag_20hz_ku[p],
+                        )
+                    if not extract_condition:
+                        if write_line not in file_lines:
+                            text_file.write(write_line)
+                        else:
+                            print("Nothing new to append")
+                    else:
+                        text_file.write(write_line)
+
+    else:
+        allpath = glob.glob(savedir + directory2 + "gdr_d/" + "cycle_*" + "\\*.nc")
+        for fn in range(len(allpath)):
+            dir_cycle_no = int(os.path.basename(os.path.dirname(allpath[fn]))[-3:])
+             # Extract data only if raw file downloaded in current run or if the file does not exist
+            if((dir_cycle_no <= endcycle and dir_cycle_no >= startcycle) or (not os.path.exists(completename))):
+                print(f"Extracting data from raw file for cycle: {dir_cycle_no}")
+                allpath1 = str(allpath[fn])
+                allpath11 = os.path.basename(allpath1)
+                cycno2 = allpath11[12:15]
+                data = netCDF4.Dataset(allpath1)
+                ### -- 20Hz record --
+                lat_20hz_sc = 0.000001
+                lat_20hz_FV = 2147483647 * lat_20hz_sc
+                lat_20hz = data.variables["lat_20hz"][:]
+                lon_20hz_sc = 0.000001
+                lon_20hz_FV = 2147483647 * lon_20hz_sc
+                lon_20hz = data.variables["lon_20hz"][:]
+                time_20hz = data.variables["time_20hz"][:]
+                time_20hz_FV = 1.8446744073709552e19
+                ice_range_20hz_ku_sc = 0.0001
+                ice_range_20hz_ku_add = 1300000
+                ice_range_20hz_ku_FV = (
+                    2147483647 * ice_range_20hz_ku_sc + ice_range_20hz_ku_add
+                )
+                ice_range_20hz_ku = data.variables["ice_range_20hz_ku"][
+                    :
+                ]  # *ice_range_20hz_ku_sc+ice_range_20hz_ku_add
+                ice_qual_flag_20hz_ku = data.variables["ice_qual_flag_20hz_ku"][:]
+                ice_qual_flag_20hz_ku_FV = 127
+                ice_sig0_20hz_ku_sc = 0.01
+                ice_sig0_20hz_ku_FV = 32767 * ice_sig0_20hz_ku_sc
+                ice_sig0_20hz_ku = data.variables["ice_sig0_20hz_ku"][:]
+                alt_20hz_sc = 0.0001
+                alt_20hz_add = 1300000
+                alt_20hz_FV = 2147483647 * alt_20hz_sc + alt_20hz_add
+                alt_20hz = data.variables["alt_20hz"][:]  # *alt_20hz_sc+alt_20hz_add
+                ### -- 1Hz record --
+                alt_state_flag_ku_band_status_FV = 127
+                alt_state_flag_ku_band_status = data.variables[
+                    "alt_state_flag_ku_band_status"
+                ][:]
+                lat_sc = 0.000001
+                lat = data.variables["lat"][:]  # *lat_sc
+                lon_sc = 0.000001
+                lon = data.variables["lon"][:]  # *lon_sc
+                model_dry_tropo_corr_sc = 0.0001
+                model_dry_tropo_corr_FV = 32767
+                model_dry_tropo_corr = data.variables["model_dry_tropo_corr"][
+                    :
+                ]  # *model_dry_tropo_corr_sc
+                model_wet_tropo_corr_sc = 0.0001
+                model_wet_tropo_corr_FV = 32767
+                model_wet_tropo_corr = data.variables["model_wet_tropo_corr"][
+                    :
+                ]  # *model_wet_tropo_corr_sc
+                iono_corr_gim_ku_sc = 0.0001
+                iono_corr_gim_ku_FV = 32767
+                iono_corr_gim_ku = data.variables["iono_corr_gim_ku"][
+                    :
+                ]  # *iono_corr_gim_ku_sc
+                solid_earth_tide_sc = 0.0001
+                solid_earth_tide_FV = 32767
+                solid_earth_tide = data.variables["solid_earth_tide"][
+                    :
+                ]  # *solid_earth_tide_sc
+                pole_tide_sc = 0.0001
+                pole_tide_FV = 32767
+                pole_tide = data.variables["pole_tide"][:] * pole_tide_sc
+                percent = 100 * (fn + 1) / (len(allpath) + 1)
+                print("%1.3f percent complete" % (percent))
+                for p in range(len(lat)):
+                    if str(lat[p]) < lat_range[0] or str(lat[p]) > lat_range[1]:
+                        continue
+                    if model_dry_tropo_corr[p] == model_dry_tropo_corr_FV:
+                        continue
+                        dry_count = 1
+                    else:
+                        dry_count = 0
+                    if model_wet_tropo_corr[p] == model_wet_tropo_corr_FV:
+                        wet_count = 1
+                    else:
+                        wet_count = 0
+
+                    if iono_corr_gim_ku[p] == iono_corr_gim_ku_FV:
+                        iono_count = 1
+                    else:
+                        iono_count = 0
+
+                    if solid_earth_tide[p] == solid_earth_tide_FV:
+                        sTide_count = 1
+                    else:
+                        sTide_count = 0
+
+                    if pole_tide[p] == pole_tide_FV:
+                        pTide_count = 1
+                    else:
+                        pTide_count = 0
+
+                    if alt_state_flag_ku_band_status[p] != 0:
+                        kFlag_count = 1
+                    else:
+                        kFlag_count = 0
+
+                    media_corr = (
+                        model_dry_tropo_corr[p]
+                        + model_wet_tropo_corr[p]
+                        + iono_corr_gim_ku[p]
+                        + solid_earth_tide[p]
+                        + pole_tide[p]
+                    )
+                    for q in range(len(lat_20hz[0, :])):
+                        if lat_20hz[p, q] == lat_20hz_FV:
+                            lat_count = 1
+                        else:
+                            lat_count = 0
+                        if ice_qual_flag_20hz_ku[p, q] != 0:
+                            ice_count = 1
+                        else:
+                            ice_count = 0
+
+                        mjd_20hz = time_20hz[p, q] * 1 / 86400 + 51544
+                        icehgt_20hz = alt_20hz[p, q] - (
+                            media_corr + ice_range_20hz_ku[p, q]
+                        )
+                        Flags = (
+                            dry_count
+                            + wet_count
+                            + iono_count
+                            + sTide_count
+                            + pTide_count
+                            + kFlag_count
+                            + lat_count
+                            + ice_count
+                        )
+                        if Flags == 0:
+                            write_line = "%4s %4s %4s %4s %3s %4s %4s %4s %4s %4s %20.6f %20.6f %20.6f %20.6f %20.6f %10.3f\n" % (
+                                    dry_count,
+                                    wet_count,
+                                    iono_count,
+                                    sTide_count,
+                                    pTide_count,
+                                    kFlag_count,
+                                    lat_count,
+                                    ice_count,
+                                    Flags,
+                                    cycno2,
+                                    mjd_20hz,
+                                    lon_20hz[p, q],
+                                    lat_20hz[p, q],
+                                    icehgt_20hz,
+                                    ice_sig0_20hz_ku[p, q],
+                                    ice_qual_flag_20hz_ku[p, q],
+                                )
+                            if not extract_condition:
+                                if write_line not in file_lines:
+                                    text_file.write(write_line)
+                                else:
+                                    print("Nothing new to append")
+                            else:
+                                text_file.write(write_line)
+    print("NetCDF Extraction Complete")
+    return savepath11
+
+
+def generate_timeseries(extracteddir, savepath, minlat, maxlat, geoiddata):
+    import warnings
+    warnings.filterwarnings("ignore")
+    lat_range=[minlat, maxlat]
+    # directory2="/%s/" %(directory)
+    # directory4='%s/' %(directory3)
+
+    #load geoid
+    lonbp=io.loadmat(geoiddata)['lonbp']
+    latbp=io.loadmat(geoiddata)['latbp']
+    grid=io.loadmat(geoiddata)['grid']
+
+    #Import Data from multiple tracks for a reservoir to get one time-series
+    extracted_file_pattern = os.path.join(extracteddir,'j*', 'extract_*', '*.txt')
+    extracted_files = glob.glob(extracted_file_pattern)
+
+    alldata = [] ## Initialising in case the code doesn't enter loop, alldata will be defined
+    for i in range(len(extracted_files)):
+        filepath = str(extracted_files[i])
+        alldata = np.loadtxt(filepath)
+        pathname = extracted_files[i]
+        base=os.path.basename(str(extracted_files))
+
+    # If there is no data, return 
+    if len(alldata) == 0:
+        print(f"No data found to generate time-series - {os.path.basename(savepath)}")
+        return
+
+    latitude = alldata[:, 12]
+    ind = []
+    for j in range(len(alldata)):
+        if latitude[j] > minlat and latitude[j] < maxlat:
+            ind.append(j)
+
+    alldata_info = alldata[ind,9:15]
+    cycno2 = alldata_info[:,0]
+    time = alldata_info[:,1]
+    lon = alldata_info[:,2]
+    lat = alldata_info[:,3]
+    hgt = alldata_info[:,4]
+    sig = alldata_info[:,5]
+    hgt = hgt[~np.isnan(hgt)]
+
+    # IQ Range for hgt
+    IQR = stats.iqr(hgt,interpolation = 'midpoint')
+    Lower_Lim_All = np.quantile(hgt,0.25)-(1.5*IQR)
+    Upper_Lim_All = np.quantile(hgt,0.75)+(1.5*IQR)
+    indx_limit_All = []
+    for i in range(len(hgt)):
+        if hgt[i]>Lower_Lim_All and hgt[i]<Upper_Lim_All and ~any(np.isnan(alldata[i,:])):
+            indx_limit_All.append(i)
+    Data_Seg_IQR=alldata_info[indx_limit_All,:]
+
+    # Uncertainty function
+    def uncertainty(h):
+        if len(h)==0:
+            rmse=0
+        else:
+            e=abs(h-np.mean(h))
+            sigma2=(sum(e**2)/(len(h)-1))
+            rmse=math.sqrt((sigma2/len(h)))
+        return rmse
+
+    # Altimetry Outlier
+    count2=0
+    cycle2=np.unique(Data_Seg_IQR[:,0])
+    timeseries_report=np.zeros([len(cycle2),9])
+    for k in range(len(cycle2)): 
+        count2=count2+1
+        cycN=cycle2[k]
+        indy=np.where(Data_Seg_IQR[:,0]==cycle2[k])
+        cyc_Pass=Data_Seg_IQR[indy,:][0]
+        cyc_Pass=cyc_Pass[~np.isnan(cyc_Pass).any(axis=1)]
+        ini_sampl=len(cyc_Pass)
+        out_mean=np.mean(cyc_Pass[:,4])
+        out_stdev=np.std(cyc_Pass[:,4])
+        out_err=cyc_Pass[:,4]-out_mean
+        Range=max(cyc_Pass[:,4])-min(cyc_Pass[:,4])
+        cyc=cyc_Pass[:,4]
+
+        while Range > 5:
+                kmeans = KMeans(n_clusters=2,random_state=0).fit(cyc.reshape(-1,1))
+                indx=kmeans.labels_
+                cyc_Pass=pd.DataFrame(cyc_Pass)
+                cyc_Pass=np.array(cyc_Pass.loc[indx==stats.mode(indx).mode])
+                Range=max(cyc_Pass[:,4])-min(cyc_Pass[:,4])
+                break
+        out_mean=np.mean(cyc_Pass[:,4])
+        out_stdev=np.std(cyc_Pass[:,4])
+        out_err=cyc_Pass[:,4]-out_mean
+        stdhgt_cyc=uncertainty(cyc_Pass[:,4])
+        while out_stdev > 0.3:
+                out_err=cyc_Pass[:,4]-out_mean
+                locate=np.where((abs(out_err)==max(abs(out_err))))
+                cyc_Pass=np.delete(cyc_Pass,locate[0],axis=0)
+                out_stdev=np.std(cyc_Pass[:,4])
+                continue
+                break
+        final_sampl=len(cyc_Pass)
+        avgmjd=np.mean(cyc_Pass[:,1])
+        Julyr=(avgmjd+2108-50000)/365.25 +1990
+        Hgt_WGS =np.mean(cyc_Pass[:,4])
+        if((len(cyc_Pass[:,4])!=0)):
+            timeseries_report[count2-1,:]=[cycN, Julyr, statistics.mean(cyc_Pass[:,2]), statistics.mean(cyc_Pass[:,3]), Hgt_WGS,  uncertainty(cyc_Pass[:,4]), np.std(cyc_Pass[:,4]), statistics.mean(cyc_Pass[:,5]), final_sampl*100/ini_sampl]
+
+
+    # IQ range for timeseries_report
+    IQR2=stats.iqr(timeseries_report[:,4],interpolation = 'midpoint')
+    Lower_Lim=np.quantile(timeseries_report[:,4],0.25)-(1.5*IQR2)
+    Upper_Lim=np.quantile(timeseries_report[:,4],0.75)+(1.5*IQR2)
+
+    indx_limit=[]
+    for i2 in range(len(timeseries_report)):
+        if timeseries_report[i2,4]>Lower_Lim and timeseries_report[i2,4]<Upper_Lim and ~any(np.isnan(timeseries_report[i2,:])):
+            indx_limit.append(i2)
+    FinalSeries=timeseries_report[indx_limit,:]
+    ip=interpolate.interp2d(lonbp,latbp,grid,kind='linear')
+    N=ip(FinalSeries[:,2],FinalSeries[:,3])
+    Hgt_Datum=FinalSeries[:,4]-N[0]-0.7
+    FinalSeries[:,4]=Hgt_Datum
+
+    BB=FinalSeries[:,[0,4,5,1]]
+    
+    # np.savetxt(savepath, BB)
+    df = pd.DataFrame(data=BB, columns=['cycle_num', 'H [m w.r.t. EGM2008 Geoid]', 'Uncertainty [m]', 'year_frac'])
+    df = df[df['cycle_num'] != 0]
+    df['date'] = df['year_frac'].apply(_convert_partial_year)
+    # df['date'] = df['year_frac'].apply(lambda x: netCDF4.num2year(x, only_use_python_datetimes=True))
+    # Save (Writing new file)
+    df.to_csv(savepath, index=False)
+    print(f"Altimetry timeseries file saved successfully - {os.path.basename(savepath)}")
+
+
+def get_latest_cycle(username, password, lastcycle_no, series=3):
+    lastcycle = int(lastcycle_no)
+    nextcycle = lastcycle + 1
+
+    ftp = FTP("ftp-access.aviso.altimetry.fr")
+    ftp.login(user=str(username), passwd=str(password))
+    try:
+        ftp.cwd(f"geophysical-data-record/jason-{series}/gdr_f/cycle_{nextcycle}")
+
+        latest_cycle = nextcycle
+    except:
+        latest_cycle = lastcycle
+    
+    return latest_cycle
\ No newline at end of file
diff --git a/src/rat/data_processing/metsim_input_processing.py b/src/rat/data_processing/metsim_input_processing.py
new file mode 100644
index 00000000..184df82c
--- /dev/null
+++ b/src/rat/data_processing/metsim_input_processing.py
@@ -0,0 +1,192 @@
+import xarray as xr
+import datetime
+import os
+from logging import getLogger
+import numpy as np
+import rasterio as rio
+import numpy as np
+import xarray as xr
+import os
+import pandas as pd
+
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+
+log = getLogger(LOG_NAME)
+
+class CombinedNC:
+    def __init__(self, start, end, datadir, basingridpath, outputdir):
+        """
+        Parameters:
+            start: Start date in YYYY-MM-DD format
+            :
+            :
+            datadir: Directory path of ascii format files
+        """
+        log.debug("Started combining forcing data for MetSim processing")
+        self._start = start
+        self._end = end
+        self._total_days = (self._end - self._start).days
+        self._datadir = datadir
+        self._outputpath = outputdir
+
+        self._rast = rio.open(basingridpath)
+        self._ar = self._rast.read(1, masked=True)
+        self._gridvalue = self._ar.flatten()
+
+        self._longitudes1d, self._latitudes1d = self._get_lat_long_1d()
+        self._latitudes, self._longitudes = self._get_lat_long_meshgrid()
+
+        self.precips = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
+        self.tmaxes = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
+        self.tmins = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
+        self.winds = np.zeros((self._total_days+1, self._rast.height, self._rast.width))
+        self.dates = pd.date_range(start, end)
+
+        self._read()
+        self._write()
+
+
+    def _get_lat_long_1d(self):
+        x_res, y_res = self._rast.res
+        r_lon_0, r_lat_0 = self._rast.xy(self._rast.height-1, 0)
+        longitudes1d = (np.arange(0, self._rast.shape[1])*x_res + r_lon_0).round(5)
+        latitudes1d = (np.arange(0, self._rast.shape[0])*y_res + r_lat_0).round(5)
+
+        return (longitudes1d, latitudes1d)
+    
+    def _get_lat_long_meshgrid(self):
+        xy = np.meshgrid(self._latitudes1d, self._longitudes1d, indexing='ij')
+        longitudes, latitudes = xy[1].flatten(), xy[0].flatten()
+        # Need to flip latutudes on horizontal axis
+        latitudes = np.flip(latitudes, 0)
+        
+        return latitudes, longitudes
+
+    def _read(self):
+        # with tqdm(total=len(self.dates)) as pbar:
+        for day, date in enumerate(self.dates):
+            fileDate = date
+            reqDate = fileDate.strftime("%Y-%m-%d")
+            log.debug("Combining data: %s", reqDate)
+            # pbar.set_description(reqDate)
+            
+            precipfilepath = os.path.join(self._datadir, f'precipitation/{reqDate}_IMERG.asc')
+            precipitation = rio.open(precipfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)#.flatten()[self.gridvalue==0.0]
+            
+            #Reading Maximum Temperature ASCII file contents
+            tmaxfilepath = os.path.join(self._datadir, f'tmax/{reqDate}_TMAX.asc')
+            tmax = rio.open(tmaxfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)#.flatten()[self.gridvalue==0.0]
+
+            #Reading Minimum Temperature ASCII file contents
+            tminfilepath = os.path.join(self._datadir, f'tmin/{reqDate}_TMIN.asc')
+            tmin = rio.open(tminfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)#.flatten()[self.gridvalue==0.0]
+
+            #Reading Average Wind Speed ASCII file contents
+            uwndfilepath = os.path.join(self._datadir, f'uwnd/{reqDate}_UWND.asc')
+            uwnd = rio.open(uwndfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)
+            
+            # #Reading Average Wind Speed ASCII file contents
+            vwndfilepath = os.path.join(self._datadir, f'vwnd/{reqDate}_VWND.asc')
+            vwnd = rio.open(vwndfilepath).read(1, masked=True).astype(np.float32).filled(np.nan)
+            wind = (0.75*np.sqrt(uwnd**2 + vwnd**2))#.flatten()[self.gridvalue==0.0]
+            
+            # self.dates.append(fileDate)
+            self.precips[day, :, :] = precipitation
+            self.tmaxes[day, :, :] = tmax
+            self.tmins[day, :, :] = tmin
+            self.winds[day, :, :] = wind
+            # pbar.update(1)
+
+    def _impute_basin_missing_data(self, combined_data):
+        combine_nomiss_data = combined_data.where(combined_data['extent']==1,-9999)
+        try:
+            combine_nomiss_data = combine_nomiss_data.interpolate_na(dim="time", method="linear", fill_value="extrapolate")
+        except:
+            try:
+                combine_nomiss_data = combine_nomiss_data.interpolate_na(dim="lon", method="linear", fill_value="extrapolate")
+            except:
+                print("No inter or extra polation can be done.")
+        combine_nomiss_data = combine_nomiss_data.where(combine_nomiss_data!=-9999,combined_data)
+        return combine_nomiss_data
+
+    def _write(self):
+        precip_da = xr.DataArray(
+            data = self.precips,
+            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
+            dims=['time', 'lat', 'lon']
+        )
+
+        tmax_da = xr.DataArray(
+            data = self.tmaxes,
+            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
+            dims=['time', 'lat', 'lon']
+        )
+
+        tmin_da = xr.DataArray(
+            data = self.tmins,
+            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
+            dims=['time', 'lat', 'lon']
+        )
+
+        wind_da = xr.DataArray(
+            data = self.winds,
+            coords=[self.dates, np.flip(self._latitudes1d), self._longitudes1d],
+            dims=['time', 'lat', 'lon']
+        )
+
+        extent_da = xr.DataArray(
+            data = self._ar,
+            coords=[np.flip(self._latitudes1d), self._longitudes1d],
+            dims=['lat', 'lon']
+        )
+
+        ds = xr.Dataset(
+            data_vars=dict(
+                precip = precip_da,
+                tmax = tmax_da,
+                tmin = tmin_da,
+                wind = wind_da,
+                extent = extent_da
+            )
+        )
+
+        if os.path.isfile(self._outputpath):
+            log.debug(f"Found existing file at {self._outputpath} -- Updating in-place")
+            # Assuming the existing file structure is same as the one generated now. Basically
+            #   assuming that the previous file was also created by MetSimRunner
+            existing = xr.open_dataset(self._outputpath).load()
+            existing.close()
+            last_existing_time = existing.time[-1]
+            log.debug("Existing data: %s", last_existing_time)
+            existing_to_append = existing.sel(time=slice(ds.time[0] - np.timedelta64(120,'D') , last_existing_time))
+            ds = ds.sel(time=slice(last_existing_time + np.timedelta64(1,'D') , ds.time[-1]))
+            # ds = ds.isel(time=slice(1, None))
+            write_ds = xr.merge([existing_to_append, ds])
+            ds = self._impute_basin_missing_data(write_ds)
+        else:
+            log.debug(f"Creating new file at {self._outputpath}")
+            ds = self._impute_basin_missing_data(ds)
+        ds.to_netcdf(self._outputpath)
+        # log.debug(f"Saving {len(paths)} files at {self._outputdir}")
+        # xr.save_mfdataset(datasets, paths)
+
+def generate_state_and_inputs(forcings_startdate, forcings_enddate, combined_datapath, out_dir):
+    # Generate state. Assuming `nc_fmt_data` contains all the data, presumably containing enough data
+    # to create state file (upto 90 days prior data from forcings_startdate)
+    combined_data = xr.open_dataset(combined_datapath)
+
+    state_startdate = forcings_startdate - datetime.timedelta(days=90)
+    state_enddate = forcings_startdate - datetime.timedelta(days=1)
+
+    state_ds = combined_data.sel(time=slice(state_startdate, state_enddate))
+    state_outpath = os.path.join(out_dir, "state.nc")
+    log.debug(f"Saving state at: {state_outpath}")
+    state_ds.to_netcdf(state_outpath)
+
+    # Generate the metsim input
+    forcings_ds = combined_data.sel(time=slice(forcings_startdate, forcings_enddate))
+    forcings_outpath = os.path.join(out_dir, "metsim_input.nc")
+    log.debug(f"Saving forcings: {forcings_outpath}")
+    forcings_ds.to_netcdf(forcings_outpath)
+
+    return state_outpath, forcings_outpath
\ No newline at end of file
diff --git a/src/rat/data_processing/newdata.py b/src/rat/data_processing/newdata.py
new file mode 100644
index 00000000..f1d1aa9e
--- /dev/null
+++ b/src/rat/data_processing/newdata.py
@@ -0,0 +1,634 @@
+import subprocess
+import requests
+from datetime import datetime, timedelta
+import os
+import time
+import shutil
+import tempfile
+import rioxarray as rxr
+import xarray as xr
+from logging import getLogger
+import pandas as pd
+
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import create_directory
+import configparser
+
+log = getLogger(LOG_NAME)
+
+def run_command(cmd,shell_bool=False):
+    """Safely runs a command, and returns the returncode silently in case of no error. Otherwise,
+    raises an Exception
+    """
+    res = subprocess.run(cmd, check=True, capture_output=True,shell=shell_bool)
+    
+    if res.returncode != 0:
+        log.error(f"Error with return code {res.returncode}")
+        raise Exception
+    return res.returncode
+
+def _determine_precip_version(date):
+    """Determines which version of IMERG to download. Most preferred is IMERG Late, followed by
+    IMERG Early. IMERG-Final has some issues. Currently only running using IMERG Early and Late
+    """
+    version = None
+    # if date < (datetime.today() - timedelta(days=4*30)):
+    #     version = "IMERG-FINAL"
+    # elif date < (datetime.today() - timedelta(days=10)):
+    #     version = "IMERG-LATE"
+    # else:
+    #     version = "IMERG-EARLY"
+    if date < (datetime.today() - timedelta(days=2)):
+        version = "IMERG-LATE"
+    else:
+        version = "IMERG-EARLY"
+    return version
+
+def _determine_precip_link_and_version(date):
+    version = _determine_precip_version(date)
+    if version == "IMERG-FINAL":
+        link = f"ftp://arthurhou.pps.eosdis.nasa.gov/gpmdata/{date.strftime('%Y')}/{date.strftime('%m')}/{date.strftime('%d')}/gis/3B-DAY-GIS.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S000000-E235959.0000.V06A.tif"
+    elif version == "IMERG-LATE":
+        if date >= datetime(2022, 5, 8):  # Version was changed from V06B to V06C
+            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-L.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06C.1day.tif"
+        else:
+            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-L.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06B.1day.tif"
+    else:
+        if date >= datetime(2022, 5, 8):  # Version was changed from V06B to V06C
+            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/early/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-E.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-da.V06C.1day.tif"
+        else:
+            link = f"https://jsimpsonhttps.pps.eosdis.nasa.gov/imerg/gis/early/{date.strftime('%Y')}/{date.strftime('%m')}/3B-HHR-E.MS.MRG.3IMERG.{date.strftime('%Y%m%d')}-S233000-E235959.1410.V06B.1day.tif"
+    
+    return (link,version)
+
+def _get_cmd_precip_download(outputpath,link,version,secrets):
+    # Define the command (different for FINAL, same for EARLY and LATE)
+    if version == "IMERG-FINAL":
+        cmd = [
+            "curl",
+            '-o',
+            outputpath,
+            '--ssl-reqd',
+            '-u',
+            f'{secrets["imerg"]["username"]}:{secrets["imerg"]["pwd"]}',
+            link
+        ]
+    else:
+        cmd = [
+            "wget",
+            "-O",
+            outputpath,
+            "--user",
+            f'{secrets["imerg"]["username"]}',
+            '--password',
+            f'{secrets["imerg"]["pwd"]}',
+            link,
+            '--no-proxy'
+        ]
+    return cmd
+
+
+def download_precip(date, version, outputpath, secrets, interpolate=True):
+    """
+    Parameters:
+        date: datetime object that defines the date for which data is required
+        version: which version of data to download - IMERG-LATE or IMERG-EARLY
+        outputpath: path where the data should be downloaded
+    =======
+    TODO: Add ability to select either CHIRPS or IMERG data
+    """
+    if not(os.path.exists(outputpath)):
+        link,version_ = _determine_precip_link_and_version(date)
+        response = requests.head(link,auth=(secrets["imerg"]["username"], secrets["imerg"]["pwd"]))
+        
+        if response.status_code == 200 :  
+        # Define the command (different for FINAL, same for EARLY and LATE)
+            cmd = _get_cmd_precip_download(outputpath,link,version,secrets)
+            log.debug("Downloading precipitation 1-day file: %s (%s)", date.strftime('%Y-%m-%d'), version)
+            return run_command(cmd)
+        else:
+            if(interpolate):
+                print('Link for 1day file does not exist. Trying to interpolate data using previous and next date.')
+                pre_date = date - timedelta(days=1)
+                pre_link, pre_version = _determine_precip_link_and_version(pre_date)
+                pre_response = requests.head(pre_link,auth=(secrets["imerg"]["username"], secrets["imerg"]["pwd"]))
+
+                post_date = date + timedelta(days=1)
+                post_link, post_version = _determine_precip_link_and_version(post_date)
+                post_response = requests.head(post_link,auth=(secrets["imerg"]["username"], secrets["imerg"]["pwd"]))
+                if(pre_response.status_code==200 and post_response.status_code==200):
+                    pre_outputpath = ('').join(outputpath.split('.')[:-1])+'_pretemp.tif'
+                    pre_cmd = _get_cmd_precip_download(pre_outputpath,pre_link,pre_version,secrets)
+                    log.debug("Downloading pre-precipitation 1-day file: %s (%s)", date.strftime('%Y-%m-%d'), version)
+                    run_command(pre_cmd)
+
+                    post_outputpath = ('').join(outputpath.split('.')[:-1])+'_posttemp.tif'
+                    post_cmd = _get_cmd_precip_download(post_outputpath,post_link,post_version,secrets)
+                    log.debug("Downloading post-precipitation 1-day file: %s (%s)", date.strftime('%Y-%m-%d'), version)
+                    run_command(post_cmd)
+
+                    ## taking mean of pre and post date
+                    pre_precip = rxr.open_rasterio(pre_outputpath)
+                    post_precip = rxr.open_rasterio(post_outputpath)
+                    precip = (pre_precip+post_precip)/2 
+                    precip.rio.to_raster(outputpath)
+
+                    ## Removing pre and post date files after
+                    if os.path.isfile(pre_outputpath):
+                        os.remove(pre_outputpath)
+                    if os.path.isfile(post_outputpath):
+                        os.remove(post_outputpath)
+                    print(f"Precipitation file interpolated using previous and next date : {date.strftime('%Y-%m-%d')}")
+
+                elif (pre_response.status_code==200):
+                    pre_cmd = _get_cmd_precip_download(outputpath,pre_link,pre_version,secrets)
+                    log.debug("Being Replaced by pre-precipitation 1-day file: %s (%s)", date.strftime('%Y-%m-%d'), version)
+                    run_command(pre_cmd)
+                
+                elif (post_response.status_code==200):
+                    post_cmd = _get_cmd_precip_download(outputpath,post_link,post_version,secrets)
+                    log.debug("Being Replaced by post-precipitation 1-day file: %s (%s)", date.strftime('%Y-%m-%d'), version)
+                    run_command(post_cmd)
+                else:
+                    print(f"Precipitation file cannnot be interpolated from pre/post date. Skipping downloading: {date.strftime('%Y-%m-%d')}")
+            else:
+                print(f"Precipitation download link not found. Skipping downloading: {date.strftime('%Y-%m-%d')}")
+    else:
+        print(f"Precipitation file already exits: {date.strftime('%Y-%m-%d')}")
+
+def download_tmax(year, outputpath):
+    """
+    Parameters:
+        year: year for which data is to be downloaded, as a string
+        outputpath: path where the data has to be saved
+    """
+    ## New data will keep on coming in the year going on i.e. recent year
+    tod = datetime.now()  #today date
+    days_ago_20 = tod - timedelta(days=20)  # date 20 days back
+    today_year = str(tod.year)    # today year 
+    recent_year_20day_ago = str(days_ago_20.year)  # year for 20 days back 
+    if (not(os.path.exists(outputpath))):
+        cmd = [
+            'wget', 
+            '-O', 
+            f'{outputpath}', 
+            f'ftp://ftp.cdc.noaa.gov/Datasets/cpc_global_temp/tmax.{year}.nc'
+        ]
+        log.debug("Downloading tmax: %s", year)
+        return run_command(cmd)
+    else:
+        log.info("File already exists tmax: %s", year)
+        date_of_file_modification = time.ctime(os.path.getmtime(outputpath))
+        log.info(f"Last modified date:{date_of_file_modification}")
+        if ((year == recent_year_20day_ago) or (year == today_year)):
+            if(datetime.strptime(date_of_file_modification, "%c").date()==tod.date()):
+                log.info("No data since last modified date. No need to download.")
+            else:
+                cmd = [
+                    'wget', 
+                    '-O', 
+                    f'{outputpath}', 
+                    f'ftp://ftp.cdc.noaa.gov/Datasets/cpc_global_temp/tmax.{year}.nc'
+                ]
+                log.debug("Last modified date is not today. So, updating tmax: %s", year)
+                return run_command(cmd)
+                
+
+def download_tmin(year, outputpath):
+    """
+    Parameters:
+        year: year for which data is to be downloaded, as a string
+        outputpath: path where the data has to be saved
+    """
+    ## New data will keep on coming in the year going on i.e. recent year
+    tod = datetime.now()  #today date
+    days_ago_20 = tod - timedelta(days=20)  # date 20 days back
+    today_year = str(tod.year)    # today year 
+    recent_year_20day_ago = str(days_ago_20.year)  # year for 20 days back 
+    if (not(os.path.exists(outputpath))):
+        cmd = [
+            'wget', 
+            '-O', 
+            f'{outputpath}', 
+            f'ftp://ftp.cdc.noaa.gov/Datasets/cpc_global_temp/tmin.{year}.nc'
+        ]
+        log.debug("Downloading tmin: %s", year)
+        return run_command(cmd)
+    else:
+        log.info("File already exists tmin: %s", year)
+        date_of_file_modification = time.ctime(os.path.getmtime(outputpath))
+        log.info(f"Last modified date:{date_of_file_modification}")
+        if ((year == recent_year_20day_ago) or (year == today_year)):
+            if(datetime.strptime(date_of_file_modification, "%c").date()==tod.date()):
+                log.info("No data since last modified date. No need to download.")
+            else:
+                cmd = [
+                    'wget', 
+                    '-O', 
+                    f'{outputpath}', 
+                    f'ftp://ftp.cdc.noaa.gov/Datasets/cpc_global_temp/tmin.{year}.nc'
+                ]
+                log.debug("Last modified date is not today. So, updating tmin: %s", year)
+                return run_command(cmd)
+
+def download_uwnd(year, outputpath):
+    """
+    Parameters:
+        year: year for which data is to be downloaded, as a string
+        outputpath: path where the data has to be saved
+    """
+    ## New data will keep on coming in the year going on i.e. recent year
+    tod = datetime.now()  #today date
+    days_ago_20 = tod - timedelta(days=20)  # date 20 days back
+    today_year = str(tod.year)    # today year 
+    recent_year_20day_ago = str(days_ago_20.year)  # year for 20 days back 
+    if (not(os.path.exists(outputpath))):
+        cmd = [
+            'wget', 
+            '-O', 
+            f'{outputpath}', 
+            f'ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis/surface_gauss/uwnd.10m.gauss.{year}.nc'
+        ]
+        log.debug("Downloading uwnd: %s", year)
+        return run_command(cmd)
+    else:
+        log.info("File already exists uwnd: %s", year)
+        date_of_file_modification = time.ctime(os.path.getmtime(outputpath))
+        log.info(f"Last modified date:{date_of_file_modification}")
+        if ((year == recent_year_20day_ago) or (year == today_year)):
+            if(datetime.strptime(date_of_file_modification, "%c").date()==tod.date()):
+                log.info("No data since last modified date. No need to download.")
+            else:
+                cmd = [
+                    'wget', 
+                    '-O', 
+                    f'{outputpath}', 
+                    f'ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis/surface_gauss/uwnd.10m.gauss.{year}.nc'
+                ]
+                log.debug("Last modified date is not today. So, updating uwnd: %s", year)
+                return run_command(cmd)
+
+def download_vwnd(year, outputpath):
+    """
+    Parameters:
+        year: year for which data is to be downloaded, as a string
+        outputpath: path where the data has to be saved
+    """
+    ## New data will keep on coming in the year going on i.e. recent year
+    tod = datetime.now()  #today date
+    days_ago_20 = tod - timedelta(days=20)  # date 20 days back
+    today_year = str(tod.year)    # today year 
+    recent_year_20day_ago = str(days_ago_20.year)  # year for 20 days back 
+    if (not(os.path.exists(outputpath))):
+        cmd = [
+            'wget', 
+            '-O', 
+            f'{outputpath}', 
+            f'ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis/surface_gauss/vwnd.10m.gauss.{year}.nc']
+        log.debug("Downloading vwnd: %s", year)
+        return run_command(cmd)
+    else:
+        log.info("File already exists vwnd: %s", year)
+        date_of_file_modification = time.ctime(os.path.getmtime(outputpath))
+        log.info(f"Last modified date:{date_of_file_modification}")
+        if ((year == recent_year_20day_ago) or (year == today_year)):
+            if(datetime.strptime(date_of_file_modification, "%c").date()==tod.date()):
+                log.info("No data since last modified date. No need to download.")
+            else:
+                cmd = [
+                    'wget', 
+                    '-O', 
+                    f'{outputpath}', 
+                    f'ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis/surface_gauss/vwnd.10m.gauss.{year}.nc']
+                log.debug("Last modified date is not today. So, updating vwnd: %s", year)
+                return run_command(cmd)
+
+def download_data(begin, end, datadir, secrets):
+    """Downloads the data between dates defined by begin and end
+
+    Parameters:
+        begin: Data will start downloading from this date, including this date
+        end: Data will be downloaded until this date, including this date
+        datedir: Base directory for downloading data
+    """
+
+    # Obtain list of dates to be downloaded
+    # required_dates = [begin+timedelta(days=n) for n in range((end-begin).days)]
+    required_dates = pd.date_range(begin, end)
+    required_years = list(set([d.strftime("%Y") for d in required_dates]))
+    # Download Precipitation
+    log.debug("Downloading Precipitation")
+    # with tqdm(required_dates) as pbar:
+    for date in required_dates:
+        # determine what kind of data is required
+        data_version = _determine_precip_version(date)
+        outputpath = os.path.join(datadir, "precipitation", f"{date.strftime('%Y-%m-%d')}_IMERG.tif")
+        # pbar.set_description(f"{date.strftime('%Y-%m-%d')} ({data_version})")
+        download_precip(date, data_version, outputpath, secrets)
+        # pbar.update(1)
+    
+    # Download other forcing data
+    log.debug("Downloading TMax, TMin, UWnd, and VWnd")
+    # with tqdm(required_years, total=len(required_years)*4) as pbar:
+    for year in required_years:
+        # pbar.set_description(f"{year} (TMax)")
+        download_tmax(year, os.path.join(datadir, "tmax", year+'.nc'))
+        # pbar.update(1)
+
+        # pbar.set_description(f"{year} (TMin)")
+        download_tmin(year, os.path.join(datadir, "tmin", year+'.nc'))
+        # pbar.update(1)
+
+        # pbar.set_description(f"{year} (UWnd)")
+        download_uwnd(year, os.path.join(datadir, "uwnd", year+'.nc'))
+        # pbar.update(1)
+
+        # pbar.set_description(f"{year} (VWnd)")
+        download_vwnd(year, os.path.join(datadir, "vwnd", year+'.nc'))
+        # pbar.update(1)
+
+def process_precip(basin_bounds,srcpath, dstpath, temp_datadir=None):
+    """For any IMERG Precipitation file located at `srcpath` is clipped, scaled and converted to
+    ASCII grid file and saved at `dstpath`. All of this is done in a temporarily created directory
+    which can be controlled by the `datadir` path
+    """
+    if temp_datadir is not None and not os.path.isdir(temp_datadir):
+        raise Exception(f"ERROR: {temp_datadir} directory doesn't exist")
+    
+    if not(os.path.exists(dstpath)):
+        log.debug("Processing Precipitation file: %s", srcpath)
+
+        with tempfile.TemporaryDirectory(dir=temp_datadir) as tempdir:
+            clipped_temp_file = os.path.join(tempdir, 'clipped.tif')
+            cmd = [
+                "gdalwarp",
+                "-dstnodata", 
+                "-9999.0",
+                "-tr",
+                "0.0625",
+                "0.0625",
+                "-te",
+                str(basin_bounds[0]),
+                str(basin_bounds[1]),
+                str(basin_bounds[2]),
+                str(basin_bounds[3]),
+                '-of',
+                'GTiff',
+                '-overwrite', 
+                f'{srcpath}',
+                clipped_temp_file
+            ]
+            run_command(cmd)
+
+            # Scale down (EARLY)
+            scaled_temp_file = os.path.join(tempdir, 'scaled.tif')
+            cmd = [
+                "gdal_calc.py", 
+                "-A", 
+                clipped_temp_file, 
+                f"--calc=A*0.1", 
+                f"--outfile={scaled_temp_file}", 
+                "--NoDataValue=-9999", 
+                "--format=GTiff"
+            ]
+            run_command(cmd)
+
+            # Change format, and save as processed file
+            aai_temp_file = os.path.join(tempdir, 'processed.tif')
+            cmd = [
+                'gdal_translate',
+                '-of', 
+                'aaigrid', 
+                scaled_temp_file, 
+                aai_temp_file
+            ]
+            run_command(cmd)
+
+            # Move to destination
+            shutil.move(aai_temp_file, dstpath)
+    else:
+        print(f"Processing Precipitation file exist: {srcpath}")
+
+
+def process_nc(basin_bounds,date, srcpath, dstpath, temp_datadir=None):
+    """For TMax, TMin, UWnd and VWnd, the processing steps are same, and can be performed using
+    this function.
+
+    Parameters:
+        date: Datetime object of the date of data
+        srcpath: path of the nc file
+        dstpath: path where the final ascii file will be saved
+        temp_datadir: directory where the temporary data will be stored
+    """
+    if temp_datadir is not None and not os.path.isdir(temp_datadir):
+        raise Exception(f"ERROR: {temp_datadir} directory doesn't exist")
+    if not(os.path.exists(dstpath)):
+        log.debug("Processing NC file: %s for date %s", srcpath, date.strftime('%Y-%m-%d'))
+
+        with tempfile.TemporaryDirectory(dir=temp_datadir) as tempdir:
+            # Convert from NC to Tif
+            band = date.strftime("%-j")   # required band number is defined by `day of year`
+            converted_tif_temp_file = os.path.join(tempdir, "converted.tif")
+
+            # NC to tiff format
+            cmd = ["gdal_translate", "-of", "Gtiff", "-b", band, srcpath, converted_tif_temp_file]
+            run_command(cmd)
+
+            #warping it so that lon represents -180 to 180 rather than 0 to 360
+            warped_temp_file = os.path.join(tempdir, "warped.tif")
+            cmd = ["gdalwarp", 
+            "-s_srs",
+            "'+proj=latlong +datum=WGS84 +pm=180dW'",
+            "-dstnodata",
+            "-9999.0",
+            "-te",
+            "-180",
+            "-90",
+            "180",
+            "90",
+            "-of",
+            "GTiff",
+            "-overwrite", 
+            converted_tif_temp_file, 
+            warped_temp_file]
+            # runs and return non-zero code, so don't use run_command
+            cmd = " ".join(cmd)
+            subprocess.run(cmd,shell=True,stdout=subprocess.DEVNULL)
+            
+            
+            # Change resolution
+            scaled_temp_file = os.path.join(tempdir, "scaled.tif")
+            cmd = [
+                "gdalwarp",
+                "-dstnodata", 
+                "-9999.0",
+                "-tr",
+                "0.0625",
+                "0.0625",
+                "-te",
+                str(basin_bounds[0]),
+                str(basin_bounds[1]),
+                str(basin_bounds[2]),
+                str(basin_bounds[3]),
+                '-of',
+                'GTiff',
+                '-overwrite',  
+                warped_temp_file, 
+                scaled_temp_file]
+
+                
+            run_command(cmd)
+
+            # Convert GeoTiff to AAI
+            aai_temp_file = os.path.join(tempdir, "final_aai.tif")
+            cmd = ["gdal_translate", "-of", "aaigrid", scaled_temp_file, aai_temp_file]
+            run_command(cmd)
+
+            # Move file to destination
+            shutil.move(aai_temp_file, dstpath)
+    else:
+        print(f"Processing NC file exists: {srcpath} for date {date.strftime('%Y-%m-%d')}")
+
+
+def process_data(basin_bounds,raw_datadir, processed_datadir, begin, end, temp_datadir):
+    if not os.path.isdir(temp_datadir):
+        os.makedirs(temp_datadir)
+
+    #### Process precipitation ####
+    log.debug("Processing Precipitation")
+    raw_datadir_precip = os.path.join(raw_datadir, "precipitation")
+    processed_datadir_precip = os.path.join(processed_datadir, "precipitation")
+
+
+    # with tqdm(os.listdir(raw_datadir_precip)) as pbar:
+    ds = pd.date_range(begin, end)
+    for srcname in os.listdir(raw_datadir_precip):
+        if datetime.strptime(srcname.split(os.sep)[-1].split("_")[0], "%Y-%m-%d") in ds:
+            srcpath = os.path.join(raw_datadir_precip, srcname)
+            dstpath = os.path.join(processed_datadir_precip, srcname.replace("tif", "asc"))
+
+            # pbar.set_description(f"Precipitation: {srcname.split('_')[0]}")
+            process_precip(basin_bounds,srcpath, dstpath, temp_datadir)
+            # pbar.update(1)
+
+    #### Process NC files ####
+    # required_dates = [begin+timedelta(days=n) for n in range((end-begin).days)]
+    required_dates = pd.date_range(begin, end)
+    #### Process TMAX ####
+    log.debug("Processing TMAX")
+    raw_datadir_tmax = os.path.join(raw_datadir, "tmax")
+    processed_datadir_tmax = os.path.join(processed_datadir, "tmax")
+
+    # with tqdm(required_dates) as pbar:
+    for date in required_dates:
+        srcpath = os.path.join(raw_datadir_tmax, date.strftime('%Y')+'.nc')
+        dstpath = os.path.join(processed_datadir_tmax, f"{date.strftime('%Y-%m-%d')}_TMAX.asc")
+
+        # pbar.set_description(f"TMAX: {date.strftime('%Y-%m-%d')}")
+        process_nc(basin_bounds,date, srcpath, dstpath, temp_datadir)
+        # pbar.update(1)
+    
+    #### Process TMin ####
+    log.debug("Processing TMIN")
+    raw_datadir_tmin = os.path.join(raw_datadir, "tmin")
+    processed_datadir_tmin = os.path.join(processed_datadir, "tmin")
+
+    # with tqdm(required_dates) as pbar:
+    for date in required_dates:
+        srcpath = os.path.join(raw_datadir_tmin, date.strftime('%Y')+'.nc')
+        dstpath = os.path.join(processed_datadir_tmin, f"{date.strftime('%Y-%m-%d')}_TMIN.asc")
+
+        # pbar.set_description(f"TMIN: {date.strftime('%Y-%m-%d')}")
+        process_nc(basin_bounds,date, srcpath, dstpath, temp_datadir)
+        # pbar.update(1)
+
+    #### Process UWND ####
+    log.debug("Processing UWND")
+    raw_datadir_uwnd = os.path.join(raw_datadir, "uwnd")
+    daily_datadir_uwnd = os.path.join(raw_datadir, "uwnd_daily")
+    processed_datadir_uwnd = os.path.join(processed_datadir, "uwnd")
+
+    uwnd_files = [os.path.join(raw_datadir_uwnd, f) for f in os.listdir(raw_datadir_uwnd)]
+
+    for uwnd_f in uwnd_files:
+        xr.open_dataset(uwnd_f).resample(time='1D').mean().to_netcdf(os.path.join(daily_datadir_uwnd, uwnd_f.split(os.sep)[-1]))
+        # xr.open_dataset(vwnd_f).resample(time='1D').mean().to_netcdf(os.path.join(vwnd_outdir, vwnd_f.split(os.sep)[-1]))
+
+    # with tqdm(required_dates) as pbar:
+    for date in required_dates:
+        srcpath = os.path.join(daily_datadir_uwnd, date.strftime('%Y')+'.nc')
+        dstpath = os.path.join(processed_datadir_uwnd, f"{date.strftime('%Y-%m-%d')}_UWND.asc")
+
+        # pbar.set_description(f"UWND: {date.strftime('%Y-%m-%d')}")
+        process_nc(basin_bounds,date, srcpath, dstpath, temp_datadir)
+        # pbar.update(1)
+
+    #### Process VWND ####
+    log.debug("Processing VWND")
+    raw_datadir_vwnd = os.path.join(raw_datadir, "vwnd")
+    daily_datadir_vwnd = os.path.join(raw_datadir, "vwnd_daily")
+    processed_datadir_vwnd = os.path.join(processed_datadir, "vwnd")
+
+    vwnd_files = [os.path.join(raw_datadir_vwnd, f) for f in os.listdir(raw_datadir_vwnd)]
+
+    for vwnd_f in vwnd_files:
+        xr.open_dataset(vwnd_f).resample(time='1D').mean().to_netcdf(os.path.join(daily_datadir_vwnd, vwnd_f.split(os.sep)[-1]))
+
+    # with tqdm(required_dates) as pbar:
+    for date in required_dates:
+        srcpath = os.path.join(daily_datadir_vwnd, date.strftime('%Y')+'.nc')
+        dstpath = os.path.join(processed_datadir_vwnd, f"{date.strftime('%Y-%m-%d')}_VWND.asc")
+
+        # pbar.set_description(f"VWND: {date.strftime('%Y-%m-%d')}")
+        process_nc(basin_bounds,date, srcpath, dstpath, temp_datadir)
+        # pbar.update(1)
+
+
+def get_newdata(basin_name,basin_bounds,data_dir, basin_data_dir,startdate, enddate, secrets_file, download=True, process=True):
+    raw_datadir = os.path.join(data_dir,"raw",'')
+    processed_datadir = os.path.join(basin_data_dir,"pre_processing","processed",'')
+    temp_datadir = os.path.join(basin_data_dir,"pre_processing","temp",'')
+    
+    ####Creating the required directories####
+
+    dir_paths=[raw_datadir,processed_datadir]
+    #Creating data directory if does not exist
+    create_directory(basin_data_dir)
+
+    #Creating temp directory if does not exist
+    create_directory(temp_datadir)
+    data_vars_folder_names=['precipitation','tmax','tmin','uwnd','vwnd']
+    raw_data_vars_folder_names=['uwnd_daily','vwnd_daily']
+    
+    for dir_path in dir_paths:
+        
+        # Making directories with each name in data_vars_folder_names in dir_paths
+        for data_var_name in data_vars_folder_names:
+            temp_dir_path_var=os.path.join(dir_path,data_var_name,'')
+            create_directory(temp_dir_path_var)
+
+        # Making directories with each name in raw_data_vars_folder_names in raw_datadir
+        if(dir_path==raw_datadir):
+            for data_var_name in raw_data_vars_folder_names:
+                temp_dir_path_var=os.path.join(dir_path,data_var_name,'')
+                create_directory(temp_dir_path_var)
+    
+    secrets = configparser.ConfigParser()
+    secrets.read(secrets_file)  # assuming there's a secret ini file with user/pwd
+
+    enddate = enddate
+
+    startdate_str = startdate.strftime("%Y-%m-%d")
+    enddate_str = enddate.strftime("%Y-%m-%d")
+
+    log.log(NOTIFICATION, "Started Downloading and Processing data from %s -> %s", startdate_str, enddate_str)
+    log.debug("Raw data directory: %s", raw_datadir)
+    log.debug("Processed data directory: %s", processed_datadir)
+
+    #### DATA DOWNLOADING ####
+    if download:
+        download_data(startdate, enddate, raw_datadir, secrets)
+
+    #### DATA PROCESSING ####
+    if process:
+        process_data(basin_bounds,raw_datadir, processed_datadir, startdate, enddate, temp_datadir)
\ No newline at end of file
diff --git a/backend/scripts/utils/__init__.py b/src/rat/ee_utils/__init__.py
similarity index 100%
rename from backend/scripts/utils/__init__.py
rename to src/rat/ee_utils/__init__.py
diff --git a/src/rat/ee_utils/ee_aec_file_creator.py b/src/rat/ee_utils/ee_aec_file_creator.py
new file mode 100644
index 00000000..5fefd5f5
--- /dev/null
+++ b/src/rat/ee_utils/ee_aec_file_creator.py
@@ -0,0 +1,89 @@
+import ee
+import os
+import geopandas as gpd
+import pandas as pd
+import numpy as np
+from itertools import zip_longest,chain
+from rat.ee_utils.ee_utils import poly2feature
+
+BUFFER_DIST = 500
+DEM = ee.Image('USGS/SRTMGL1_003')
+
+def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
+    "Collect data into non-overlapping fixed-length chunks or blocks"
+    # grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
+    # grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError
+    # grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF
+    args = [iter(iterable)] * n
+    if incomplete == 'fill':
+        return zip_longest(*args, fillvalue=fillvalue)
+    if incomplete == 'strict':
+        return zip(*args, strict=True)
+    if incomplete == 'ignore':
+        return zip(*args)
+    else:
+        raise ValueError('Expected fill, strict, or ignore')
+
+def _aec(n,elev_dem,roi):
+  ii = ee.Image.constant(n).reproject(elev_dem.projection())
+  DEM141 = elev_dem.lte(ii)
+
+  DEM141Count = DEM141.reduceRegion(
+    geometry= roi,
+    scale= 30,
+    reducer= ee.Reducer.sum()
+  )
+  area=ee.Number(DEM141Count.get('elevation')).multiply(30*30).divide(1e6)
+  return area
+
+def aec_file_creator(reservoir_shpfile, shpfile_column_dict, aec_dir_path):
+  # Obtaining list of csv files in aec_dir_path
+  aec_filenames = []
+  for f in os.listdir(aec_dir_path):
+    if f.endswith(".csv"):
+        aec_filenames.append(f[:-4])
+  
+  reservoirs_polygon = gpd.read_file(reservoir_shpfile)
+  for reservoir_no,reservoir in reservoirs_polygon.iterrows():
+      # Reading reservoir information
+      reservoir_name = str(reservoir[shpfile_column_dict['unique_identifier']])
+      if reservoir_name in aec_filenames:
+        print(f"Skipping {reservoir_name} as its AEC file already exists")
+      else:
+        print(f"Creating AEC file for {reservoir_name}")
+        reservoir_polygon = reservoir.geometry
+        aoi = poly2feature(reservoir_polygon,BUFFER_DIST).geometry()
+        min_elev = DEM.reduceRegion( reducer = ee.Reducer.min(),
+                    geometry = aoi,
+                    scale = 30,
+                    maxPixels = 1e10
+                    ).get('elevation')
+        max_elev = DEM.reduceRegion( reducer = ee.Reducer.max(),
+                    geometry = aoi,
+                    scale = 30,
+                    maxPixels = 1e10
+                    ).get('elevation')
+
+        elevs = ee.List.sequence(min_elev, max_elev, 1)
+        elevs_list = elevs.getInfo()
+        grouped_elevs_list = grouper(elevs_list,5)
+
+        areas_list = []
+        for subset_elevs_tuples in grouped_elevs_list:
+          ## Removing None objects from grouped tuples and converting them to list and then ee.List and then calculating  area for that 
+          subset_elevs_list = list(filter(lambda x: x != None, subset_elevs_tuples))
+          subset_elevs = ee.List(subset_elevs_list)
+          subset_areas = subset_elevs.map(lambda elevation_i: _aec(elevation_i, DEM, aoi))
+          subset_areas_list = subset_areas.getInfo()
+          ## Appendning areas to the main list
+          areas_list.append(subset_areas_list)
+        
+        ## Converting list of lists to list
+        areas_list = list(chain(*areas_list))
+        areas_list = np.round(areas_list,3)
+        ## Preparing dataframe to write down to csv 
+        aec_df = pd.DataFrame(data = {'Elevation' :elevs_list, 'CumArea':areas_list})
+        aec_df.to_csv(os.path.join(aec_dir_path,reservoir_name+'.csv'),index=False)
+        print(f"AEC file created succesfully for {reservoir_name}")
+  print("AEC file exists for all reservoirs in this basin")
+
diff --git a/src/rat/ee_utils/ee_config.py b/src/rat/ee_utils/ee_config.py
new file mode 100644
index 00000000..4745a2fd
--- /dev/null
+++ b/src/rat/ee_utils/ee_config.py
@@ -0,0 +1,3 @@
+# Required credentials to authorize earth engine #
+service_account = "Enter your service account"
+key_file= "Enter the path to your private json key file"
diff --git a/src/rat/ee_utils/ee_utils.py b/src/rat/ee_utils/ee_utils.py
new file mode 100644
index 00000000..3eeaaf89
--- /dev/null
+++ b/src/rat/ee_utils/ee_utils.py
@@ -0,0 +1,23 @@
+import numpy as np
+import ee
+
+# Coverts a polygon geometry object to earth engine feature
+def poly2feature(polygon,buffer_distance):
+    '''
+    Returns an earth engine feature with the same geometry as the polygon object with buffer_distance added. buffer_distance is in meters.
+    '''
+    if(polygon.type=='MultiPolygon'):
+        all_cords=[]
+        for poly in polygon.geoms:
+            x,y = poly.exterior.coords.xy
+            all_cords.append(np.dstack((x,y)).tolist())
+            g=ee.Geometry.MultiPolygon(all_cords).buffer(buffer_distance)  #buffer for polygon_object in meters 
+        
+    else:  
+        x,y = polygon.exterior.coords.xy
+        cords = np.dstack((x,y)).tolist()
+        
+        g=ee.Geometry.Polygon(cords).buffer(buffer_distance)  #buffer for polygon_object in meters
+        
+    feature = ee.Feature(g)
+    return feature
\ No newline at end of file
diff --git a/src/rat/rat_basin.py b/src/rat/rat_basin.py
new file mode 100644
index 00000000..8edf8baf
--- /dev/null
+++ b/src/rat/rat_basin.py
@@ -0,0 +1,602 @@
+from datetime import datetime
+import os
+from logging import getLogger
+import datetime
+import geopandas as gpd
+import numpy as np
+import xarray as xr
+
+from rat.utils.utils import create_directory
+from rat.utils.logging import init_logger,close_logger,NOTIFICATION
+from rat.utils.files_creator import create_basingridfile, create_basin_domain_nc_file ,create_vic_domain_param_file, create_basin_grid_flow_asc
+from rat.utils.files_creator import create_basin_station_latlon_csv, create_basin_reservoir_shpfile
+from rat.utils.clean import Clean
+
+from rat.data_processing.newdata import get_newdata
+
+from rat.data_processing.metsim_input_processing import CombinedNC,generate_state_and_inputs
+from rat.utils.metsim_param_reader import MSParameterFile
+from rat.core.run_metsim import MetSimRunner
+
+from rat.utils.vic_param_reader import VICParameterFile
+from rat.core.run_vic import VICRunner
+
+from rat.utils.route_param_reader import RouteParameterFile
+from rat.core.run_routing import RoutingRunner
+
+from rat.core.run_sarea import run_sarea
+from rat.core.run_altimetry import run_altimetry
+
+from rat.ee_utils.ee_aec_file_creator import aec_file_creator
+from rat.core.run_postprocessing import run_postprocessing
+
+from rat.utils.convert_for_website import convert_sarea, convert_inflow, convert_dels, convert_evaporation, convert_outflow, convert_altimeter
+
+# Step-1: Downloading and Pre-processing of meteorolgical data
+# Step-2: Pre-processing of data and preparation of MetSim Input
+# Step-3: Preparation of MetSim Parameter Files
+# Step-4: Running MetSim & preparation of VIC input
+# Step-5: Preparation of VIC Parameter Files
+# Step-6: Running of VIC and preparation of Routing input
+# Step-7: Preparation of Routing Parameter Files
+# Step-8: Runnning Routing and generating Inflow
+# Step-9: Preparation of parameter files for Surface Area Calculation
+# Step-10: TMS-OS Surface Area Calculation from GEE 
+# Step-11: Elevation extraction from Altimeter
+# Step-12: Generating Area Elevation Curves for reservoirs
+# Step-13: Calculation of Outflow, Evaporation and Storage change
+
+#module-1 step-1,2 data_preparation_vic
+#module-2 step-3to8 inflow_vic
+#module-3 step- NA evaporation
+#module-4 step-10to12 storage_change
+#module-5 step-13 outflow
+
+def rat(config, rat_logger, steps=[1,2,3,4,5,6,7,8,9,10,11,12,13]):
+
+    rat_logger = getLogger('run_rat')
+    ##--------------------- Reading and initialising global parameters ----------------------##
+    # Defining resolution to run RAT
+    xres=0.0625
+    yres=0.0625 
+
+    # Obtaining basin related information from RAT_Runner.yml
+    basins_shapefile_path = config['GLOBAL']['basin_shpfile'] # Shapefile containg information of basin(s)- geometry and attributes
+    basins_shapefile = gpd.read_file(basins_shapefile_path)  # Reading basins_shapefile_path to get basin polygons and their attributes
+    basins_shapefile_column_dict = config['GLOBAL']['basin_shpfile_column_dict'] # Dictionary of column names in basins_shapefile, Must contain 'id' field
+    region_name = config['BASIN']['region_name']  # Major basin name used to cluster multiple basins data in data-directory
+    basin_name = config['BASIN']['basin_name']              # Basin name used to save basin related data
+    basin_id = config['BASIN']['basin_id']                  # Unique identifier for each basin used to map basin polygon in basins_shapefile
+    basin_data = basins_shapefile[basins_shapefile[basins_shapefile_column_dict['id']]==basin_id] # Getting the particular basin related information corresponding to basin_id
+    basin_bounds = basin_data.bounds                          # Obtaining bounds of the particular basin
+    basin_bounds = np.array(basin_bounds)[0]
+    basin_geometry = basin_data.geometry                      # Obtaining geometry of the particular basin
+
+    # Defining paths for RAT processing
+    project_dir = config['GLOBAL']['project_dir']    # Directory of RAT 
+    data_dir = config['GLOBAL']['data_dir']          # Data-Directory of RAT
+    region_data_dir = create_directory(os.path.join(data_dir,region_name), True) # Major Basin data-directory within the data-directory of RAT
+    basin_data_dir = create_directory(os.path.join(region_data_dir,'basins',basin_name), True)  # Basin data-directory within the major basin's data-directory 
+    log_dir = create_directory(os.path.join(region_data_dir,'logs',basin_name,''), True)  # Log directory within the major basin's data-directory
+
+    # Change datetimes format
+    #config['BASIN']['begin'] = datetime.datetime.combine(config['BASIN']['begin'], datetime.time.min)
+    config['BASIN']['start'] = datetime.datetime.combine(config['BASIN']['start'], datetime.time.min)
+    config['BASIN']['end'] = datetime.datetime.combine(config['BASIN']['end'], datetime.time.min)
+    rout_init_state_save_date = config['BASIN']['end']+datetime.timedelta(days=1)
+
+    if(not config['BASIN']['first_run']):
+        config['BASIN']['vic_init_state_date'] = datetime.datetime.combine(config['BASIN']['vic_init_state_date'], datetime.time.min)
+    
+    # Changing start date if running RAT for first time for the particular basin to give VIC and MetSim to have their spin off periods
+    if(config['BASIN']['first_run']):
+        user_given_start = config['BASIN']['start']
+        config['BASIN']['start'] = user_given_start-datetime.timedelta(days=800)  # Running RAT for extra 800 days before the user-given start date for VIC to give reliable results starting from user-given start date
+        data_download_start = config['BASIN']['start']-datetime.timedelta(days=90)    # Downloading 90 days of extra meteorological data for MetSim to prepare it's initial state
+        vic_init_state_date = None    # No initial state of VIC is present as running RAT for first time in this basin
+    else:
+        data_download_start = config['BASIN']['start']    # Downloading data from the same date as we want to run RAT from
+        vic_init_state_date = config['BASIN']['vic_init_state_date'] # Date of which initial state of VIC for the particular basin exists
+    
+    # Defining logger
+    log = init_logger(
+        log_dir= log_dir,
+        verbose= False,
+        # notify= True,
+        notify= False,
+        log_level= 'DEBUG'
+    )
+
+    # Cleaning class object for removing/deleting unwanted data
+    cleaner = Clean(basin_data_dir)
+
+    # Clearing out previous rat outputs so that the new data does not gets appended.
+    if(config['CLEAN_UP']['clean_previous_outputs']):
+        rat_logger.info("Clearing up memory space: Removal of previous rat outputs, routing inflow, extracted altimetry data and gee extracted surface area time series")
+        cleaner.clean_previous_outputs()
+
+    # Initializing Status for different models & tasks (1 for successful run & 0 for failed run)
+    NEW_DATA_STATUS = 1
+    METSIM_STATUS = 1
+    VIC_STATUS = 1
+    ROUTING_STATUS = 1
+    GEE_STATUS = 1
+    ALTIMETER_STATUS = 1
+    DELS_STATUS = 0
+    EVAP_STATUS = 0
+    OUTFLOW_STATUS = 0
+
+    ##--------------------- Read and initialised global parameters ----------------------##
+
+    rat_logger.info(f"Running RAT from {config['BASIN']['start']} to {config['BASIN']['end']}")
+
+    ######### Step-0 Mandatory Step
+    try:
+        rat_logger.info("Starting Step-0: Creating required directory structure for RAT")
+        #----------- Paths Necessary for running of METSIM  -----------#
+        # Path of directory which will contain the combined data in nc format.
+        combined_datapath = create_directory(os.path.join(basin_data_dir,'pre_processing','nc', ''), True)
+        combined_datapath = os.path.join(combined_datapath, 'combined_data.nc')
+        # Path where the processed downloaded data is present
+        processed_datadir = os.path.join(basin_data_dir,'pre_processing','processed')
+        # basingrid_file path to clip the global downloaded data
+        basingridfile_path= create_directory(os.path.join(basin_data_dir, 'basin_grid_data',''), True)
+        basingridfile_path= os.path.join(basingridfile_path, basin_name+'_grid_mask.tif')
+        #Creating metsim input directory for basin if not exist
+        metsim_inputs_dir = create_directory(os.path.join(basin_data_dir, 'metsim', 'metsim_inputs', ''),True)
+        #Defining paths for metsim input data, metsim state and metsim domain
+        ms_state = os.path.join(metsim_inputs_dir, 'state.nc')
+        ms_input_data = os.path.join(metsim_inputs_dir,'metsim_input.nc')
+        domain_nc_path = os.path.join(metsim_inputs_dir,'domain.nc')
+        #Creating metsim output directory for basin if not exist
+        metsim_output_path = create_directory(os.path.join(basin_data_dir, 'metsim', 'metsim_outputs',''), True)
+        #Creating vic input directory for basin if not exist
+        vic_input_path = create_directory(os.path.join(basin_data_dir, 'vic', 'vic_inputs',''), True)
+        #----------- Paths Necessary for running of METSIM  -----------#
+
+        #----------- Paths Necessary for running of VIC  -----------#
+        vic_input_forcing_path = os.path.join(vic_input_path,'forcing_')
+        vic_output_path = create_directory(os.path.join(basin_data_dir,'vic','vic_outputs',''), True)
+        rout_input_path = create_directory(os.path.join(basin_data_dir,'ro','in',''), True)
+        rout_input_state_folder = create_directory(os.path.join(basin_data_dir,'ro','rout_state_file',''), True)
+        rout_input_state_file = os.path.join(rout_input_state_folder,'ro_init_state_file_'+config['BASIN']['start'].strftime("%Y-%m-%d")+'.nc')
+        rout_init_state_save_file = os.path.join(rout_input_state_folder,'ro_init_state_file_'+rout_init_state_save_date.strftime("%Y-%m-%d")+'.nc')
+        #----------- Paths Necessary for running of VIC  -----------#
+
+        #----------- Paths Necessary for running of Routing  -----------#
+        # Routing_input files prefix path
+        rout_input_path_prefix = os.path.join(rout_input_path,'fluxes_')
+        # Creating routing parameter directory
+        rout_param_dir = create_directory(os.path.join(basin_data_dir,'ro','pars',''), True)
+        # Defining path and name for basin flow direction file
+        basin_flow_dir_file = os.path.join(rout_param_dir,'fl')
+        # Defining Basin station latlon file path
+        if (config['ROUTING']['station_global_data']):
+            basin_station_latlon_file = os.path.join(rout_param_dir,'basin_station_latlon.csv')
+        else:
+            basin_station_latlon_file = config['ROUTING']['station_latlon_path']
+        # Creating routing inflow directory
+        rout_inflow_dir = create_directory(os.path.join(basin_data_dir,'ro', 'rout_inflow',''), True)
+        #----------- Paths Necessary for running of Routing  -----------#
+
+        #----------- Paths Necessary for running of Surface Area Calculation and Altimetry-----------#
+        # Defining path for basin reservoir shapefile
+        basin_reservoir_shpfile_path = create_directory(os.path.join(basin_data_dir,'gee','gee_basin_params',''), True)
+        basin_reservoir_shpfile_path = os.path.join(basin_reservoir_shpfile_path,'basin_reservoirs.shp')
+        # Reading dictionary of column values for reservoir shapefile path
+        reservoirs_gdf_column_dict = config['GEE']['reservoir_vector_file_columns_dict']
+        # Adding key-value pair to Basin Reservoir Shapefile's column dictionary ### 
+        if (config['ROUTING']['station_global_data']):
+            reservoirs_gdf_column_dict['unique_identifier'] = 'uniq_id'
+        else:
+            reservoirs_gdf_column_dict['unique_identifier'] = reservoirs_gdf_column_dict['dam_name_column']
+        # Defining paths to save surface area from gee and heights from altimetry
+        sarea_savepath = create_directory(os.path.join(basin_data_dir,'gee','gee_sarea_tmsos',''), True)
+        altimetry_savepath = os.path.join(basin_data_dir,'altimetry','altimetry_timeseries')
+        #----------- Paths Necessary for running of Surface Area Calculation and Altimetry-----------#
+
+        #----------- Paths Necessary for running of Post-Processing-----------#
+        # Defining path for the Area Elevation curve
+        if (config['POST_PROCESSING'].get('aec_dir')):
+            aec_dir_path = config['POST_PROCESSING'].get('aec_dir')
+        else:
+            aec_dir_path = create_directory(os.path.join(basin_data_dir,'post_processing','post_processing_gee_aec',''), True)
+        ## Paths for storing post-processed data and in webformat data
+        evap_savedir = create_directory(os.path.join(basin_data_dir,'rat_outputs', "Evaporation"), True)
+        dels_savedir = create_directory(os.path.join(basin_data_dir,'rat_outputs', "dels"), True)
+        outflow_savedir = create_directory(os.path.join(basin_data_dir,'rat_outputs', "rat_outflow"),True)
+        web_dir_path = create_directory(os.path.join(basin_data_dir,'web_format_data',''),True)
+        ## End of defining paths for storing post-processed data and webformat data
+        #----------- Paths Necessary for running of Post-Processing-----------#
+
+
+    except:
+        rat_logger.exception("Error Executing Step-0: Downloading and Pre-processing of meteorological data")
+    else:
+        rat_logger.info("Finished Step-0: Downloading and Pre-processing of meteorological data")
+        
+
+    ######### Step-1
+    if(1 in steps):
+        try:
+            rat_logger.info("Starting Step-1: Downloading and Pre-processing of meteorological data")
+            ##----------------------- Downloading meteorological data ------------------------##
+            ##--------- Download Data Begin ----------#
+            get_newdata(
+                basin_name= basin_name,
+                basin_bounds= basin_bounds,
+                data_dir= config['GLOBAL']['data_dir'],
+                basin_data_dir= basin_data_dir,
+                startdate= data_download_start,
+                enddate= config['BASIN']['end'],
+                secrets_file= config['CONFIDENTIAL']['secrets'],
+                download= True,
+                process= True
+            )
+            ##---------- Download Data End -----------# 
+            NEW_DATA_STATUS = 1   #Data downloaded successfully
+        except:
+            rat_logger.exception("Error Executing Step-1: Downloading and Pre-processing of meteorological data")
+        else:
+            rat_logger.info("Finished Step-1: Downloading and Pre-processing of meteorological data")
+            ##----------------------- Downloaded meteorological data ------------------------##
+
+
+    ######### Step-2
+    if(2 in steps):
+        try:
+            rat_logger.info("Starting Step-2: Pre-processing of data and preparation of MetSim Input")
+            ##----------------------- Pre-processing step for METSIM ------------------------##
+            #----------- Files Necessary for creating METSIM Input Data  -----------#
+            # Creating basinggrid_file if not exists
+            if not os.path.exists(basingridfile_path):
+                create_basingridfile(basin_bounds,basin_geometry,basingridfile_path,xres,yres)
+            #----------- Created Files Necessary for creating METSIM Input Data  -----------#
+
+            #----------- Process Data Begin to combine all var data -----------#
+            CombinedNC(
+                start= data_download_start,
+                end= config['BASIN']['end'],
+                datadir= processed_datadir,
+                basingridpath= basingridfile_path,
+                outputdir= combined_datapath
+            )
+            #----------- Process Data End and combined data created -----------#
+
+            #------ MetSim Input Data Preparation Begin ------#
+            # Prepare data to metsim input format
+            ms_state, ms_input_data = generate_state_and_inputs(
+                forcings_startdate= config['BASIN']['start'],
+                forcings_enddate= config['BASIN']['end'],
+                combined_datapath= combined_datapath, 
+                out_dir= metsim_inputs_dir
+            )
+            #------- MetSim Input Data Preparation End -------#
+        except:
+            rat_logger.exception("Error Executing Step-2: Pre-processing of data and preparation of MetSim Input")
+        else:
+            rat_logger.info("Finished Step-2: Pre-processing of data and preparation of MetSim Input")
+            ##----------------------- Pre-processing step finished for METSIM ------------------------##
+
+    ######### Step-3
+    if(3 in steps):
+        try:
+            rat_logger.info("Starting Step-3: Preparation of MetSim Parameter Files")
+            ##----------------------- Preparing parameter files for METSIM ------------------------##
+            ## ---------- Creating domain.nc file for basin if not exist---------#
+            if not os.path.exists(domain_nc_path):
+                elevation_tif_filepath = config['GLOBAL']['elevation_tif_file']
+                create_basin_domain_nc_file(elevation_tif_filepath,basingridfile_path,domain_nc_path)
+            #----------domain.nc file created for basin if not exist ---------#
+        except:
+            rat_logger.exception("Error Executing Step-3: Preparation of MetSim Parameter Files")
+        else:
+            rat_logger.info("Finished Step-3: Preparation of MetSim Parameter Files")
+            ##----------------------- Prepared parameter files for METSIM ------------------------##
+
+    ######### Step-4
+    if(4 in steps):
+        try:
+            if(NEW_DATA_STATUS):
+                rat_logger.info("Starting Step-4: Running MetSim & preparation of VIC input")
+                ##-------------- Metsim Begin & Pre-processing for VIC --------------##
+                with MSParameterFile(
+                    start= config['BASIN']['start'],
+                    end= config['BASIN']['end'],
+                    init_param= config['METSIM']['metsim_param_file'],
+                    out_dir= metsim_output_path, 
+                    forcings= ms_input_data, 
+                    state= ms_state,
+                    domain= domain_nc_path
+                    ) as m:
+                    
+                    ms = MetSimRunner(
+                        param_path= m.ms_param_path,
+                        metsim_env= config['METSIM']['metsim_env'],
+                        results_path= m.results,
+                        multiprocessing= config['GLOBAL']['multiprocessing']
+                    )
+                    log.log(NOTIFICATION, f'Starting metsim from {config["BASIN"]["start"].strftime("%Y-%m-%d")} to {config["BASIN"]["end"].strftime("%Y-%m-%d")}')
+                    ms.run_metsim()
+                    ms.convert_to_vic_forcings(vic_input_path)
+                METSIM_STATUS=1    #Metsim run successfully
+            else:
+                rat_logger.info("New Data Download Failed. Skipping Step-4: Running MetSim & preparation of VIC input")
+        except:
+            rat_logger.exception("Error Executing Step-4: Running MetSim & preparation of VIC input")
+        else:
+            rat_logger.info("Finished Step-4: Running MetSim & preparation of VIC input")
+            ##--------------- Metsim End & Pre-processing for VIC done--------------##
+
+
+     ######### Step-5
+    if(5 in steps):
+        try:
+            rat_logger.info("Starting Step-5: Preparation of VIC Parameter Files")
+            ##--------------- Preparation of Vic Parameter Files begin--------------##
+            # If Vic Parameter is globally available and needs to be cropped
+            if(config['VIC']['vic_global_data']):
+                # Creating if not exist vic_basin_params dir 
+                vic_param_dir = os.path.join(basin_data_dir,'vic', 'vic_basin_params','')
+                create_directory(vic_param_dir)
+
+                # Creating vic soil param and domain file if not present
+                if not os.path.exists(os.path.join(vic_param_dir,'vic_param.nc')):
+                    global_vic_param_file = os.path.join(config['VIC']['vic_global_param_dir'],config['VIC']['vic_basin_continent_param_filename'])
+                    global_vic_domain_file = os.path.join(config['VIC']['vic_global_param_dir'],config['VIC']['vic_basin_continent_domain_filename'])
+
+                    create_vic_domain_param_file(global_vic_param_file,global_vic_domain_file,basingridfile_path,vic_param_dir)
+                
+                # Setting vic soil_param_file and domain file paths in config, will be used in vic_params produced by VICParameterFile
+                config['VIC']['vic_soil_param_file']=os.path.join(vic_param_dir,'vic_soil_param.nc')
+                config['VIC']['vic_domain_file']=os.path.join(vic_param_dir,'vic_domain.nc')
+        except:
+            rat_logger.exception("Error Executing Step-5: Preparation of VIC Parameter Files")
+        else:
+            rat_logger.info("Finished Step-5: Preparation of VIC Parameter Files")
+            ##--------------- Preparation of Vic Parameter Files end--------------##
+    
+    ######### Step-6
+    if(6 in steps):
+        try:
+            if(METSIM_STATUS):
+                rat_logger.info("Starting Step-6: Running of VIC and preparation of Routing input")
+                ##--------------- VIC Begin & Pre-processing for Routing ----------------## 
+                with VICParameterFile(
+                    config = config,
+                    basin_name = basin_name,
+                    startdate = config['BASIN']['start'],
+                    enddate = config['BASIN']['end'],
+                    vic_output_path = vic_output_path,
+                    forcing_prefix = vic_input_forcing_path,
+                    init_state_date = vic_init_state_date
+                ) as p:
+                    vic = VICRunner(
+                        vic_env= config['VIC']['vic_env'],
+                        param_file= p.vic_param_path,
+                        vic_result_file= p.vic_result_file,
+                        rout_input_dir= rout_input_path
+                    )
+                    vic.run_vic(np=config['GLOBAL']['multiprocessing'])
+                    rout_input_state_start_date = vic.generate_routing_input_state(ndays=365, rout_input_state_file=rout_input_state_file, save_path=rout_init_state_save_file) # Start date of routing state file will be returned
+                    if(config['BASIN']['first_run']):
+                        vic.disagg_results(rout_input_state_file=p.vic_result_file)       # If first run, use vic result file
+                        rout_input_state_start_date = config['BASIN']['start']            # Start date will become same as vic result file 
+                    else:
+                        vic.disagg_results(rout_input_state_file=rout_input_state_file)    # If not first run, use rout input state file
+                    vic_startdate = p.vic_startdate
+                    vic_enddate = p.vic_enddate
+                VIC_STATUS=1         #Vic run successfully
+            else:
+                rat_logger.info("MetSim Run Failed. Skipping Step-6: Running of VIC and preparation of Routing input")
+        except:
+            rat_logger.exception("Error Executing Step-6: Running of VIC and preparation of Routing input")
+        else:
+            rat_logger.info("Finished Step-6: Running of VIC and preparation of Routing input")
+            ##---------------- VIC End & Results pre-processed for Routing-----------------##
+
+
+    ######### Step-7
+    if(7 in steps):
+        try:    
+            rat_logger.info("Starting Step-7: Preparation of Routing Parameter Files")
+            ##--------------- Preparation of Routing Parameter Files begin--------------##
+            ### Basin Grid Flow Firection File
+            # Creating basin grid flow diretion file if not present
+            if (config['ROUTING'].get('global_flow_dir_tif_file')):
+                if not os.path.exists(basin_flow_dir_file):
+                    create_basin_grid_flow_asc(config['ROUTING']['global_flow_dir_tif_file'], basingridfile_path, basin_flow_dir_file[:-4],
+                                                                    config['ROUTING'].get('replace_flow_directions'))
+            ### Basin Station File
+            basin_station_latlon_file = os.path.join(rout_param_dir,'basin_station_latlon.csv')
+            if (config['ROUTING']['station_global_data']):
+                if not os.path.exists(basin_station_latlon_file):
+                    create_basin_station_latlon_csv(region_name,basin_name, config['ROUTING']['stations_vector_file'], basin_data, 
+                                                        config['ROUTING']['stations_vector_file_columns_dict'], basin_station_latlon_file)
+        except:
+            rat_logger.exception("Error Executing Step-7: Preparation of Routing Parameter Files")
+        else:    
+            rat_logger.info("Finished Step-7: Preparation of Routing Parameter Files")
+            ##--------------- Preparation of Routing Parameter Files end--------------##
+
+    ######### Step-8
+    if(8 in steps):
+        try:
+            if(VIC_STATUS):
+                rat_logger.info("Starting Step-8: Runnning Routing and generating Inflow")
+                ### Extracting routing start date ###
+                if(config['BASIN']['first_run']):
+                    rout_input_state_start_date = config['BASIN']['start']
+                else:
+                    rout_state_data = xr.open_dataset(rout_input_state_file).load()
+                    rout_input_state_start_date = rout_state_data.time[0].values.astype('datetime64[us]').astype(datetime.datetime)
+                    rout_state_data.close()
+                ### Extracted routing start date ###
+                #------------- Routing Begins and Pre processing for Mass Balance --------------#
+                with RouteParameterFile(
+                    config = config,
+                    basin_name = basin_name,
+                    start = rout_input_state_start_date,
+                    end = config['BASIN']['end'],
+                    basin_flow_direction_file = basin_flow_dir_file,
+                    clean=False,
+                    rout_input_path_prefix = rout_input_path_prefix
+                    ) as r:
+                    route = RoutingRunner(    
+                        project_dir = config['GLOBAL']['project_dir'], 
+                        result_dir = r.params['output_dir'], 
+                        inflow_dir = rout_inflow_dir, 
+                        model_path = config['ROUTING']['route_model'],
+                        param_path = r.route_param_path, 
+                        fdr_path = r.params['flow_direction_file'], 
+                        station_path_latlon = basin_station_latlon_file,
+                        station_xy = r.params['station']
+                    )
+                    route.create_station_file()
+                    route.run_routing()
+                    route.generate_inflow()
+                    basin_station_xy_path = route.station_path_xy
+                ROUTING_STATUS=1
+            else:
+                rat_logger.info("VIC Run Failed. Skipping Step-8: Runnning Routing and generating Inflow")
+        except:
+            rat_logger.exception("Error Executing Step-8: Runnning Routing and generating Inflow")
+        else:
+            rat_logger.info("Finished Step-8: Runnning Routing and generating Inflow")
+            #------------- Routing Ends and Inflow pre-processed for Mass Balance --------------#
+
+    ######### Step-9
+    if(9 in steps):
+        try:
+            rat_logger.info("Starting Step-9: Preparation of parameter files for Surface Area Calculation")
+            #------------- Selection of Reservoirs within the basin begins--------------#
+            ###### Preparing basin's reservoir shapefile and it's associated column dictionary for calculating surface area #####
+            ### Creating Basin Reservoir Shapefile, if not exists ###
+            if not os.path.exists(basin_reservoir_shpfile_path):
+                create_basin_reservoir_shpfile(config['GEE']['reservoir_vector_file'], reservoirs_gdf_column_dict, basin_station_xy_path,
+                                                                                config['ROUTING']['station_global_data'], basin_reservoir_shpfile_path)
+            ###### Prepared basin's reservoir shapefile and it's associated column dictionary #####
+        except:
+            rat_logger.exception("Error Executing Step-9: Preparation of parameter files for Surface Area Calculation")
+        else:
+            rat_logger.info("Finished Step-9: Preparation of parameter files for Surface Area Calculation")
+            #------------- Selection of Reservoirs within the basin ends--------------#
+
+    ######### Step-10
+    if(10 in steps):
+        try:
+            rat_logger.info("Starting Step-10: TMS-OS Surface Area Calculation from GEE")
+            ##----------- Remote Sensing to estimate surface area begins -----------##
+            # Get Sarea
+            run_sarea(config['BASIN']['start'].strftime("%Y-%m-%d"), config['BASIN']['end'].strftime("%Y-%m-%d"), sarea_savepath, 
+                                                                                    basin_reservoir_shpfile_path, reservoirs_gdf_column_dict)
+            GEE_STATUS = 1
+        except:
+            rat_logger.exception("Error Executing Step-10: TMS-OS Surface Area Calculation from GEE")
+        else:
+            rat_logger.info("Finished Step-10: TMS-OS Surface Area Calculation from GEE")                                                                        
+            ##----------- Remote Sensing to estimate surface area ends -----------##
+    
+    ######### Step-11
+    if(11 in steps):
+        try:
+            rat_logger.info("Starting Step-11: Elevation extraction from Altimeter")
+            ##----------- Altimeter height ectraction begins -----------##
+            # Altimeter
+            latest_altimetry_cycle = run_altimetry(config, 'ALTIMETER', basin_reservoir_shpfile_path, reservoirs_gdf_column_dict, 
+                                                                                    basin_name, basin_data_dir, altimetry_savepath)
+            ALTIMETER_STATUS = 1
+        except:
+            rat_logger.exception("Error Executing Step-11: Elevation extraction from Altimeter")
+        else:
+            rat_logger.info("Finished Step-11: Elevation extraction from Altimeter")                                                                        
+            ##----------- Altimeter height ectraction ends -----------##
+
+    ######### Step-12
+    if(12 in steps):
+        try:
+            rat_logger.info("Starting Step-12: Generating Area Elevation Curves for reservoirs")
+            ##--------------------------------Area Elevation Curves Extraction begins ------------------- ##
+            ## Creating AEC files if not present for post-processing dels calculation
+            aec_file_creator(basin_reservoir_shpfile_path,reservoirs_gdf_column_dict,aec_dir_path)
+        except:
+            rat_logger.exception("Finished Step-12: Generating Area Elevation Curves for reservoirs")
+        else:
+            rat_logger.info("Finished Step-12: Generating Area Elevation Curves for reservoirs")
+            ##--------------------------------Area Elevation Curves Extraction ends ------------------- ##
+
+    ######### Step-13
+    if(13 in steps):
+        try:
+            rat_logger.info("Starting Step-13: Calculation of Outflow, Evaporation and Storage change")
+            
+            ##---------- Mass-balance Approach begins and then post-processing ----------##
+            DELS_STATUS, EVAP_STATUS, OUTFLOW_STATUS = run_postprocessing(basin_name, basin_data_dir, basin_reservoir_shpfile_path, reservoirs_gdf_column_dict,
+                                aec_dir_path, config['BASIN']['start'], config['BASIN']['end'], evap_savedir, dels_savedir, outflow_savedir, VIC_STATUS, ROUTING_STATUS, GEE_STATUS)
+
+            # Convert to format that is expected by the website and save in web_dir
+            ## Surface Area
+            if(GEE_STATUS):
+                convert_sarea(sarea_savepath,web_dir_path)
+                rat_logger.info("Converted Surface Area to the Output Format.")
+            else:
+                rat_logger.info("Could not convert Surface Area to the Output Format as GEE run failed.")
+            
+            ## Inflow
+            if(ROUTING_STATUS):
+                convert_inflow(rout_inflow_dir, basin_reservoir_shpfile_path, reservoirs_gdf_column_dict, web_dir_path)
+                rat_logger.info("Converted Inflow to the Output Format.")
+            else:
+                rat_logger.info("Could not convert Inflow to the Output Format as Routing run failed.")
+            
+            ## Dels 
+            if(DELS_STATUS):
+                convert_dels(dels_savedir, web_dir_path)
+                rat_logger.info("Converted ∆S to the Output Format.")
+            else:
+                rat_logger.info("Could not convert ∆S to the Output Format as GEE run failed.")
+            
+            ## Evaporation
+            if(EVAP_STATUS):
+                convert_evaporation(evap_savedir, web_dir_path)
+                rat_logger.info("Converted Evaporation to the Output Format.")
+            else:
+                rat_logger.info("Could not convert Evaporation to the Output Format as either GEE or VIC run failed.")
+
+            ## Outflow
+            if(OUTFLOW_STATUS):
+                convert_outflow(outflow_savedir, web_dir_path)
+                rat_logger.info("Converted Outflow to the Output Format.")
+            else:
+                rat_logger.info("Could not convert Outflow to the Output Format as either GEE or Routing run failed resulting in failure of calculation of either Inflow, ∆S or Evaporation.")
+            
+            ## Altimeter
+            if(ALTIMETER_STATUS):
+                convert_altimeter(altimetry_savepath, web_dir_path)
+                rat_logger.info("Converted Extracted Height from Altimeter to the Output Format.")
+            else:
+                rat_logger.info("Could not convert Extracted Height from Altimeter to the Output Format as Altimeter Run failed.")
+        except:
+            rat_logger.exception("Error Executing Step-13: Calculation of Outflow, Evaporation and Storage change")
+        else:
+            rat_logger.info("Finished Step-13: Calculation of Outflow, Evaporation and Storage change")
+            ##---------- Mass-balance Approach ends and then post-processed outputs to obtain timeseries  -----------------##
+        
+        # Clearing out memory space as per user input 
+        if(config['CLEAN_UP']['clean_metsim']):
+            rat_logger.info("Clearing up memory space: Removal of metsim output files")
+            cleaner.clean_metsim()
+        if(config['CLEAN_UP']['clean_vic']):
+            rat_logger.info("Clearing up memory space: Removal of vic input, output files and previous init_state_files")
+            cleaner.clean_vic()
+        if(config['CLEAN_UP']['clean_routing']):
+            rat_logger.info("Clearing up memory space: Removal of routing input and output files")
+            cleaner.clean_routing()
+        if(config['CLEAN_UP']['clean_gee']):
+            rat_logger.info("Clearing up memory space: Removal of unwanted gee extracted small chunk files")
+            cleaner.clean_gee()
+        if(config['CLEAN_UP']['clean_altimetry']):
+            rat_logger.info("Clearing up memory space: Removal of raw altimetry downloaded data files.")
+            cleaner.clean_altimetry()
+
+    close_logger()
\ No newline at end of file
diff --git a/src/rat/run_rat.py b/src/rat/run_rat.py
new file mode 100644
index 00000000..e8999efc
--- /dev/null
+++ b/src/rat/run_rat.py
@@ -0,0 +1,73 @@
+import pandas as pd
+import yaml
+import os
+import argparse
+import configparser
+import ee
+
+from rat.utils.logging import init_logger,close_logger
+import ee_utils.ee_config as ee_configuration
+
+#------------ Define Variables ------------#
+def run_rat(config_fn):
+    """Runs RAT as per configuration defined in `config_fn`.
+
+    parameters:
+        config_fn (str): Path to the configuration file
+    """
+    config = yaml.safe_load(open(config_fn, 'r'))
+
+    log_dir = os.path.join(config['GLOBAL']['data_dir'],'runs','logs','')
+    log = init_logger(
+        log_dir,
+        verbose=False,
+        # notify=True,
+        notify=False,
+        log_level='DEBUG',
+        logger_name='run_rat',
+        for_basin=False
+    )
+    # 
+    # Tring the ee credentials given by user
+    try:
+        log.info("Checking earth engine credentials")
+        secrets = configparser.ConfigParser()
+        secrets.read(config['CONFIDENTIAL']['secrets'])
+        ee_configuration.service_account = secrets["ee"]["service_account"]
+        ee_configuration.key_file = secrets["ee"]["key_file"]
+        ee_credentials = ee.ServiceAccountCredentials(ee_configuration.service_account,ee_configuration.key_file)
+        ee.Initialize(ee_credentials)
+        log.info("Connected to earth engine succesfully.")
+    except:
+        log.info("Failed to connect to Earth engine. Wrong credentials. If you want to use Surface Area Estimations from RAT, please update the EE credentials.")
+
+    from rat.rat_basin import rat
+
+    if(not config['GLOBAL']['multiple_basin_run']):
+        log.info('############## Starting RAT for '+config['BASIN']['basin_name']+' #################')
+        rat(config, log)
+        log.info('############## Succesfully run RAT for '+config['BASIN']['basin_name']+' #################')
+    else:
+        basins_to_process = config['GLOBAL']['basins_to_process']
+        basins_metadata = pd.read_csv(config['GLOBAL']['basins_metadata'],header=[0,1])
+        for basin in basins_to_process:
+            log.info('############## Starting RAT for '+basin+' #################')
+            basin_info = basins_metadata[basins_metadata['BASIN']['basin_name']==basin]
+            # Extracting basin information and populating it in config
+            for col in basin_info.columns:
+                config[col[0]][col[1]] = basin_info[col[0]][col[1]].values[0]
+            rat(config, log)
+            log.info('############## Succesfully run RAT for '+basin+' #################')
+    # Clsoing logger
+    close_logger('rat_run')
+
+def main():
+    parser = argparse.ArgumentParser(description='Run RAT')
+    parser.add_argument('--config', type=str, required=True,
+                    help='Config file required to run RAT')
+    args = parser.parse_args()
+
+    run_rat(args.config)
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/src/rat/utils/__init__.py b/src/rat/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/rat/utils/clean.py b/src/rat/utils/clean.py
new file mode 100644
index 00000000..3add5960
--- /dev/null
+++ b/src/rat/utils/clean.py
@@ -0,0 +1,140 @@
+import shutil
+import os
+from datetime import datetime, timedelta
+
+class Clean:
+    
+    def __init__(self, basin_data_dir):
+        self.basin_data_dir = basin_data_dir
+        pass
+
+    def clean_pre_processing(self):
+        try:
+            pre_processing_path = os.path.join(self.basin_data_dir,'pre_processing','')
+            shutil.rmtree(pre_processing_path)
+        except:
+            print("No pre_processing folder to delete")
+
+    def clean_metsim(self):
+        try:
+            metsim_path = os.path.join(self.basin_data_dir,'metsim','metsim_outputs','')
+            shutil.rmtree(metsim_path)
+        except:
+            print("No metsim_outputs folder to delete")
+    
+    def clean_vic(self):
+        try:
+            vic_inputs_path = os.path.join(self.basin_data_dir,'vic','vic_inputs','')
+            shutil.rmtree(vic_inputs_path)
+        except:
+            print("No vic_inputs folder to delete")
+        
+        try:
+            vic_outputs_path = os.path.join(self.basin_data_dir,'vic','vic_outputs','')
+            shutil.rmtree(vic_outputs_path)
+        except:
+            print("No vic_outputs folder to delete")
+        
+        try:
+            vic_init_states_dir_path = os.path.join(self.basin_data_dir,'vic','vic_init_states','') 
+            days_old = 2 #n max of days
+
+            time_interval = datetime.now() - timedelta(days_old)
+            file_namelist = os.listdir(vic_init_states_dir_path)
+            
+            # deleting init_state_file path if it is older than days_old 
+            for file in file_namelist:
+                path = os.path.join(vic_init_states_dir_path, file)
+                filetime = datetime.fromtimestamp(os.path.getctime(path))
+                if filetime > time_interval:
+                    os.remove(path)
+
+        except:
+            print("No vic init_state file to delete")
+    
+    def clean_routing(self):
+        try:
+            rout_inputs_path = os.path.join(self.basin_data_dir,'ro','in','')
+            shutil.rmtree(rout_inputs_path)
+        except:
+            print("No rout_inputs folder to delete")
+        
+        try:
+            rout_outputs_path = os.path.join(self.basin_data_dir,'ro','ou','')
+            shutil.rmtree(rout_outputs_path)
+        except:
+            print("No rout_outputs folder to delete")
+
+        try:
+            rout_init_states_dir_path = os.path.join(self.basin_data_dir,'ro','rout_state_file','') 
+            days_old = 2 #n max of days
+
+            time_interval = datetime.now() - timedelta(days_old)
+            file_namelist = os.listdir(rout_init_states_dir_path)
+            
+            # deleting init_state_file path if it is older than days_old 
+            for file in file_namelist:
+                path = os.path.join(rout_init_states_dir_path, file)
+                filetime = datetime.fromtimestamp(os.path.getctime(path))
+                if filetime > time_interval:
+                    os.remove(path)
+
+        except:
+            print("No rout init_state file to delete")
+
+    def clean_gee(self):
+        try:
+            l8_scratch_path = os.path.join(self.basin_data_dir,'gee','gee_sarea_tmsos','l8','_scratch')
+            shutil.rmtree(l8_scratch_path)
+        except:
+            print("No _scratch folder to delete for landsat-8 based reserevoir area extraction")
+
+        try:
+            s2_scratch_path = os.path.join(self.basin_data_dir,'gee','gee_sarea_tmsos','s2','_scratch')
+            shutil.rmtree(s2_scratch_path)
+        except:
+            print("No _scratch folder to delete for sentinel-2 based reserevoir area extraction")
+
+    def clean_altimetry(self):
+        try:
+            raw_altimetry_path = os.path.join(self.basin_data_dir,'altimetry','raw',)
+            shutil.rmtree(raw_altimetry_path)
+        except:
+            print("No raw folder to delete in altimetry")
+
+    def clean_previous_outputs(self):
+        try:
+            rat_outputs_path = os.path.join(self.basin_data_dir,'rat_outputs')
+            shutil.rmtree(rat_outputs_path)
+        except:
+            print("No previous rat_outputs folder to delete")
+        
+        try:
+            rat_inflow_path = os.path.join(self.basin_data_dir,'ro','rout_inflow')
+            shutil.rmtree(rat_inflow_path)
+        except:
+            print("No previous rout_inflow folder to delete")
+
+        try:
+            gee_sarea_path = os.path.join(self.basin_data_dir,'gee','gee_sarea_tmsos')
+            shutil.rmtree(gee_sarea_path)
+        except:
+            print("No previous gee extracted surface area data folder to delete")
+        
+        try:
+            altimetry_timeseries_path = os.path.join(self.basin_data_dir,'altimetry','altimetry_timeseries')
+            shutil.rmtree(altimetry_timeseries_path)
+        except:
+            print("No previous altimetry_timeseries folder to delete")
+        
+        try:
+            altimetry_extracted_path = os.path.join(self.basin_data_dir,'altimetry','extracted')
+            shutil.rmtree(altimetry_extracted_path)
+        except:
+            print("No previous altimetry_extracted folder to delete")
+        
+        try:
+            web_format_data_path = os.path.join(self.basin_data_dir,'web_format_data')
+            shutil.rmtree(web_format_data_path)
+        except:
+            print("No web_format_data folder to delete with previous outputs")
diff --git a/src/rat/utils/convert_for_website.py b/src/rat/utils/convert_for_website.py
new file mode 100644
index 00000000..2054ddc2
--- /dev/null
+++ b/src/rat/utils/convert_for_website.py
@@ -0,0 +1,174 @@
+import os
+import pandas as pd
+import geopandas as gpd
+import numpy as np
+from rat.utils.utils import create_directory
+
+def convert_sarea(sarea_dir, website_v_dir):
+    # Surface Area
+    sarea_paths = [os.path.join(sarea_dir, f) for f in os.listdir(sarea_dir) if f.endswith(".csv")]
+    sarea_web_dir = create_directory(os.path.join(website_v_dir,'sarea' ),True)
+    for sarea_path in sarea_paths:
+        res_name = os.path.splitext(os.path.split(sarea_path)[-1])[0]
+
+        
+        savepath = os.path.join(sarea_web_dir, f"{res_name}.csv")
+
+        df = pd.read_csv(sarea_path, parse_dates=['date'])
+        df = df[['date', 'area']]
+        df['area'] = np.round(df['area'], 3)
+        df.rename({'area':'area (km2)'}, axis=1, inplace=True)
+        print(f"Converting [Surface Area]: {res_name}")
+        df.to_csv(savepath, index=False)
+
+
+def convert_inflow(inflow_dir, reservoir_shpfile, reservoir_shpfile_column_dict,  website_v_dir):
+    # Inflow
+    reservoirs = gpd.read_file(reservoir_shpfile)
+    reservoirs['Inflow_filename'] = reservoirs[reservoir_shpfile_column_dict['unique_identifier']].astype(str).str[:5]
+
+    inflow_paths = [os.path.join(inflow_dir, f) for f in os.listdir(inflow_dir) if f.endswith(".csv")]
+    inflow_web_dir = create_directory(os.path.join(website_v_dir,'inflow' ),True)
+
+    for inflow_path in inflow_paths:
+        res_name = os.path.splitext(os.path.split(inflow_path)[-1])[0]
+
+        if res_name in reservoirs['Inflow_filename'].tolist():
+            savename = reservoirs[reservoirs['Inflow_filename'] == res_name][reservoir_shpfile_column_dict['unique_identifier']].values[0]
+            savepath = os.path.join(inflow_web_dir ,f"{savename}.csv")
+
+            df = pd.read_csv(inflow_path, parse_dates=['date'])
+            df['inflow (m3/d)'] = df['streamflow'] * (24*60*60)        # indicate units, convert from m3/s to m3/d
+            df = df[['date', 'inflow (m3/d)']]
+
+            print(f"Converting [Inflow]: {res_name}")
+            df.to_csv(savepath, index=False)
+            print(df.tail())
+        else:
+            print(f"Currently not displayed in website: {res_name}")
+
+def convert_dels(dels_dir, website_v_dir):
+    # Delta S
+    dels_paths = [os.path.join(dels_dir, f) for f in os.listdir(dels_dir) if f.endswith(".csv")]
+    dels_web_dir = create_directory(os.path.join(website_v_dir,'dels' ),True)
+
+    for dels_path in dels_paths:
+        res_name = os.path.splitext(os.path.split(dels_path)[-1])[0]
+        savename = res_name
+
+        savepath = os.path.join(dels_web_dir , f"{savename}.csv")
+
+        df = pd.read_csv(dels_path, parse_dates=['date'])[['date', 'dS', 'days_passed']]
+        df['dS (m3)'] = df['dS'] * 1e9                                     # indicate units, convert from BCM to m3
+        df = df[['date', 'dS (m3)']]
+
+        print(f"Converting [∆S]: {res_name}, {savepath}")
+        df.to_csv(savepath, index=False)
+
+def convert_evaporation(evap_dir, website_v_dir):
+    # Evaporation
+    evap_paths = [os.path.join(evap_dir, f) for f in os.listdir(evap_dir) if f.endswith(".csv")]
+    evap_web_dir = create_directory(os.path.join(website_v_dir,'evaporation' ),True)
+
+    for evap_path in evap_paths:
+        res_name = os.path.splitext(os.path.split(evap_path)[-1])[0]
+        savename = res_name
+
+        savepath = os.path.join(evap_web_dir , f"{savename}.csv")
+
+        df = pd.read_csv(evap_path)
+        df = df[['time', 'OUT_EVAP']]
+        df.rename({'time':'date', 'OUT_EVAP':'evaporation (mm)'}, axis=1, inplace=True)
+
+        print(f"Converting [Evaporation]: {res_name}, {savepath}")
+        df.to_csv(savepath, index=False)
+    
+def convert_outflow(outflow_dir, website_v_dir):
+    # Outflow
+    outflow_paths = [os.path.join(outflow_dir, f) for f in os.listdir(outflow_dir) if f.endswith(".csv")]
+    outflow_web_dir = create_directory(os.path.join(website_v_dir,'outflow' ),True)
+
+    for outflow_path in outflow_paths:
+        res_name = os.path.splitext(os.path.split(outflow_path)[-1])[0]
+
+        savename = res_name
+
+        savepath = os.path.join(outflow_web_dir, f"{savename}.csv")
+
+        df = pd.read_csv(outflow_path, parse_dates=['date'])[['date', 'outflow_rate']]
+        df.loc[df['outflow_rate']<0, 'outflow_rate'] = 0
+        df['outflow (m3/d)'] = df['outflow_rate'] * (24*60*60)        # indicate units, convert from m3/s to m3/d
+        df = df[['date', 'outflow (m3/d)']]
+
+        print(f"Converting [Outflow]: {res_name}, {savepath}")
+        df.to_csv(savepath, index=False)
+
+def convert_altimeter(altimeter_ts_dir, website_v_dir):
+    # Altimeter
+    if os.path.exists(altimeter_ts_dir):
+        altimeter_tses = [os.path.join(altimeter_ts_dir, f) for f in os.listdir(altimeter_ts_dir) if f.endswith(".csv")]
+        altimeter_web_dir = create_directory(os.path.join(website_v_dir,'altimeter' ),True)
+
+        for altimeter_ts_path in altimeter_tses:
+            res_name = os.path.splitext(os.path.split(altimeter_ts_path)[-1])[0]
+            savename = res_name
+            savepath = os.path.join(altimeter_web_dir , f"{savename}.csv")
+
+            df = pd.read_csv(altimeter_ts_path, parse_dates=['date'])
+            df = df[['date', 'H [m w.r.t. EGM2008 Geoid]']]
+            df['date'] = df['date'].dt.strftime("%Y-%m-%d")
+            df['H [m w.r.t. EGM2008 Geoid]'] = np.round(df['H [m w.r.t. EGM2008 Geoid]'], 2)
+            df.rename({'H [m w.r.t. EGM2008 Geoid]':'height (m)'}, axis=1, inplace=True)
+
+            print(f"Converting [Heights]: {res_name}")
+            df.to_csv(savepath, index=False)
+
+def convert_v2_frontend(basin_data_dir, res_name, inflow_src, sarea_src, dels_src, outflow_src):
+    """Converts the files according to the newer version of the frontend (v2).
+
+    Args:
+        basin_data_dir (str): path of basin data directory
+        res_name (str): name of reservoir
+        inflow_src (str): source .csv file containing inflow in cumecs
+        sarea_src (str): source .csv file containing surface area estiamted by TMS-OS
+        dels_src (str): source .csv file containing delta-S estimates
+        outflow_src (str): source .csv file containing outflow estimates
+    """
+    # inflow
+    inflow = pd.read_csv(inflow_src, parse_dates=['date'])
+    inflow['inflow (m3/d)'] = inflow['streamflow'] * (24*60*60)        # indicate units, convert from m3/s to m3/d
+    inflow_dst_dir = create_directory(os.path.join(basin_data_dir, "v2_website_version",'inflow'),True)
+    inflow_dst = os.path.join(inflow_dst_dir, f"{res_name}.csv")
+    inflow = inflow[['date', 'inflow (m3/d)']]
+    inflow.to_csv(inflow_dst, index=False)
+    
+    # sarea
+    sarea = pd.read_csv(sarea_src, parse_dates=['date'])[['date', 'area']]
+    sarea['area (km2)'] = sarea['area']                                     # indicate units
+    sarea_dst_dir = create_directory(os.path.join(basin_data_dir, "v2_website_version",'sarea_tmsos'),True)
+    sarea_dst = os.path.join(sarea_dst_dir, f"{res_name}.csv")
+    sarea = sarea[['date', 'area (km2)']]
+    sarea.to_csv(sarea_dst, index=False)
+    
+    # dels
+    dels = pd.read_csv(dels_src, parse_dates=['date'])[['date', 'dS', 'days_passed']]
+    dels['dS (m3)'] = dels['dS'] * 1e9                                     # indicate units, convert from BCM to m3
+    dels_dst_dir = create_directory(os.path.join(basin_data_dir, "v2_website_version",'dels'),True)
+    dels_dst = os.path.join(dels_dst_dir, f"{res_name}.csv")
+    dels = dels[['date', 'dS (m3)']]
+    dels.to_csv(dels_dst, index=False)
+    
+    # outflow
+    outflow =  pd.read_csv(outflow_src, parse_dates=['date'])[['date', 'outflow_rate']]
+    outflow.loc[outflow['outflow_rate']<0, 'outflow_rate'] = 0
+    outflow['outflow (m3/d)'] = outflow['outflow_rate'] * (24*60*60)        # indicate units, convert from m3/s to m3/d
+    outflow_dst_dir = create_directory(os.path.join(basin_data_dir, "v2_website_version",'outflow'),True)
+    outflow_dst = os.path.join(outflow_dst_dir, f"{res_name}.csv")
+    outflow = outflow[['date', 'outflow (m3/d)']]
+    outflow.to_csv(outflow_dst, index=False)
+
+def main():
+    pass
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/src/rat/utils/files_creator.py b/src/rat/utils/files_creator.py
new file mode 100644
index 00000000..9c98ca99
--- /dev/null
+++ b/src/rat/utils/files_creator.py
@@ -0,0 +1,142 @@
+import numpy as np
+import os
+import xarray as xr
+import rioxarray as rxr
+import rasterio
+from shapely.geometry import mapping
+import geopandas as gpd
+import pandas as pd
+
+from rat.utils.utils import round_pixels,round_up
+from rat.utils.run_command import run_command
+
+
+def create_basingridfile(basin_bounds,basin_geometry,basingridfile_path,xres,yres):    
+    xmin,ymin,xmax,ymax=basin_bounds
+    nx=round_pixels((xmax-xmin)/xres)
+    ny=round_pixels((ymax-ymin)/yres)
+    Z=np.ones((ny,nx))
+    trf=rasterio.transform.from_origin(xmin, ymax, xres, yres)
+    with rasterio.open(
+        basingridfile_path[:-4]+'_boundbox.tif',
+        'w',
+        driver='GTiff',
+        height=Z.shape[0],
+        width=Z.shape[1],
+        count=1,
+        dtype=Z.dtype,
+        crs='+init=epsg:4326',
+        transform=trf
+    ) as dst:
+        dst.write(Z, 1)
+    basin_grid = rxr.open_rasterio(basingridfile_path[:-4]+'_boundbox.tif')
+    basin_grid=basin_grid.rio.clip(basin_geometry.apply(mapping),drop=False)
+    basin_grid.rio.to_raster(basingridfile_path)
+
+def create_basin_domain_nc_file(elevation_tif_filepath,basingridfile_path,output_path):
+    ele=rxr.open_rasterio(elevation_tif_filepath)
+    basin_grid=rxr.open_rasterio(basingridfile_path)
+    #Interpolating and cropping elevation xarray
+    basin_ele=ele.interp(x=basin_grid['x'].values,y=basin_grid['y'].values)
+    #Changing vars and their names in xarrays
+    basin_ele=basin_ele.drop_vars(['band','spatial_ref']).rename({'x':'lon','y':'lat'})[0]
+    basin_grid=basin_grid.drop_vars(['band','spatial_ref']).rename({'x':'lon','y':'lat'})[0]
+    #Creating a dataset from two xarrays
+    basin_domain = basin_grid.to_dataset(name = 'mask')
+    basin_domain['elev'] = basin_ele
+    basin_domain['lat']=np.array(basin_grid.lat.data).round(5)
+    basin_domain['lon']=np.array(basin_grid.lon.data).round(5)
+    #Saving dataset as netcdf
+    basin_domain.to_netcdf(output_path)
+
+def create_vic_domain_param_file(global_vic_param_file,global_vic_domain_file,basingridfile_path,output_dir_path):
+    #Reading global files
+    gl_param = xr.open_dataset(global_vic_param_file)
+    gl_domain = xr.open_dataset(global_vic_domain_file)
+
+    #Reading basing grid file
+    basin_grid=rxr.open_rasterio(basingridfile_path)
+    basin_grid=basin_grid.drop_vars(['band','spatial_ref']).rename({'y':'lat','x':'lon'})[0]
+    basin_grid=basin_grid.fillna(0)
+
+    #Inserting run_cell as mask of basin_grid in vic_param.nc
+    basin_vic_param=gl_param.interp(lon=np.array([round_up(x,5) for x in basin_grid.lon.data ]),lat=np.array([round_up(x,5) for x in basin_grid.lat.data ]),method='nearest')
+    basin_vic_param['run_cell']=(('lat','lon'),basin_grid.data.astype('int32'))
+    #Saving vic_param.nc
+    basin_vic_param.to_netcdf(os.path.join(output_dir_path,'vic_soil_param.nc'))
+
+    #Inserting run_cell as mask of basin_grid in vic_param.nc
+    basin_vic_domain=gl_domain.interp(lon=np.array([round_up(x,5) for x in basin_grid.lon.data ]),lat=np.array([round_up(x,5) for x in basin_grid.lat.data ]),method='nearest')
+    basin_vic_domain['mask']=(('lat','lon'),basin_grid.data.astype('int32'))
+    #Saving vic_domain.nc
+    basin_vic_domain.to_netcdf(os.path.join(output_dir_path,'vic_domain.nc'))
+
+def create_basin_grid_flow_asc(global_flow_grid_dir_tif, basingridfile_path, savepath, flow_direction_replace_dict = None):
+    global_flow_grid_dir=rxr.open_rasterio(global_flow_grid_dir_tif)
+    basin_grid=rxr.open_rasterio(basingridfile_path)
+    basin_flow_grid_dir = global_flow_grid_dir.interp(x=np.array([round_up(i,5) for i in basin_grid.x.data ]),
+                                                                    y=np.array([round_up(i,5) for i in basin_grid.y.data ]),method='nearest')
+    if (flow_direction_replace_dict):
+        for i in flow_direction_replace_dict:
+            basin_flow_grid_dir = basin_flow_grid_dir.where(basin_flow_grid_dir!=i, flow_direction_replace_dict[i])
+
+    basin_flow_grid_dir = basin_flow_grid_dir.rio.write_nodata(0)
+    basin_flow_grid_dir = basin_flow_grid_dir.where(basin_grid.data==1,0)
+    basin_flow_grid_dir.rio.to_raster(savepath+'.tif', dtype='int16')
+
+    # Change format, and save as asc file
+    cmd = [
+        'gdal_translate',
+        '-of', 
+        'aaigrid', 
+        savepath+'.tif', 
+        savepath+'.asc'
+    ]
+    cmd_out_code = run_command(cmd)
+
+def create_basin_station_latlon_csv(region_name, basin_name, global_station_file, basin_gpd_df, column_dict, savepath, geojson_file=True):
+    basins_station=gpd.read_file(global_station_file)
+    basin_data_crs_changed = basin_gpd_df.to_crs(basins_station.crs)
+    basins_station_spatialjoin = gpd.sjoin(basins_station, basin_data_crs_changed, "inner")[[
+                        column_dict['id_column'],
+                        column_dict['name_column'],
+                        column_dict['lon_column'],
+                        column_dict['lat_column'],
+                        'geometry']]
+    if(geojson_file):
+        basins_station_spatialjoin['regionname'] = str(region_name)
+        basins_station_spatialjoin['basinname'] = str(basin_name)
+        basins_station_spatialjoin['filename'] = basins_station_spatialjoin[column_dict['id_column']].astype(str)+'_'+ \
+                                        basins_station_spatialjoin[column_dict['name_column']].str.replace(' ','_')
+        geojson_save_path = os.path.join(os.path.dirname(savepath),basin_name+'_station.geojson')
+        basins_station_spatialjoin.to_file(geojson_save_path, driver= "GeoJSON")
+
+    basins_station_lat_lon = basins_station_spatialjoin[[
+                            column_dict['id_column'],
+                            column_dict['name_column'],
+                            column_dict['lon_column'],
+                            column_dict['lat_column']]]
+    basins_station_lat_lon['name'] = basins_station_lat_lon[column_dict['id_column']].astype(str
+                                                                )+'_'+basins_station_lat_lon[column_dict['name_column']].astype(str).str.replace(' ','_')
+    basins_station_lat_lon['run'] = 1
+    basins_station_lat_lon['lon'] = basins_station_lat_lon[column_dict['lon_column']]
+    basins_station_lat_lon['lat'] = basins_station_lat_lon[column_dict['lat_column']]
+    basins_station_lat_lon[['run','name','lon','lat']].to_csv(savepath,index=False)
+
+def create_basin_reservoir_shpfile(reservoir_shpfile,reservoir_shpfile_column_dict,station_xy_file,routing_station_global_data,savepath):
+    reservoirs = gpd.read_file(reservoir_shpfile)
+    stations_df = pd.read_csv(station_xy_file,sep='\t',header=None,names=['run','name','x','y','area']).dropna().reset_index(drop=True)
+    reservoirs_gdf_column_dict = reservoir_shpfile_column_dict
+
+    if routing_station_global_data:
+        reservoirs['uniq_id'] = reservoirs[reservoirs_gdf_column_dict['id_column']].astype(str)+'_'+ \
+                            reservoirs[reservoirs_gdf_column_dict['dam_name_column']].astype(str).str.replace(' ','_')
+        stations_df = stations_df.rename(columns={'name':'uniq_id'})                                            
+        reservoirs_gdf = reservoirs.merge(stations_df['uniq_id'], how='inner', on='uniq_id')
+    else:
+        stations_df = stations_df.rename(columns={'name':reservoirs_gdf_column_dict['dam_name_column']})
+        reservoirs_gdf = reservoirs.merge(stations_df[reservoirs_gdf_column_dict['dam_name_column']], 
+                                        how='inner', on=reservoirs_gdf_column_dict['dam_name_column'])
+    
+    reservoirs_gdf.to_file(savepath)
+
diff --git a/backend/scripts/utils/logging.py b/src/rat/utils/logging.py
similarity index 83%
rename from backend/scripts/utils/logging.py
rename to src/rat/utils/logging.py
index 188f4964..d20ab8ad 100644
--- a/backend/scripts/utils/logging.py
+++ b/src/rat/utils/logging.py
@@ -7,10 +7,10 @@
 import datetime
 import logging
 import subprocess
-
+from rat.utils.utils import create_directory
 
 # -------------------------------------------------------------------- #
-LOG_NAME = 'rat-mekong'
+LOG_NAME = 'rat-logger'
 FORMATTER = logging.Formatter('%(levelname)s:%(funcName)s>> %(message)s')
 
 NOTIFICATION = 25    # Setting level above INFO, below WARNING
@@ -46,17 +46,26 @@ def emit(self, record):
 # -------------------------------------------------------------------- #
 
 
-def init_logger(log_dir='./', log_level='DEBUG', verbose=False, notify=False):
+def init_logger(log_dir='./', log_level='DEBUG', verbose=False, notify=False, logger_name=LOG_NAME, for_basin=True):
     ''' Setup the logger '''
+    #Creating log directory if does not exist
+    create_directory(log_dir)
+
+    #Extracting basin name from the log_dir_path
+    basin_name=os.path.basename(os.path.normpath(log_dir))
 
-    logger = logging.getLogger(LOG_NAME)
+    logger = logging.getLogger(logger_name)
     logger.setLevel(log_level)
     logger.propagate = True
 
     # ---------------------------------------------------------------- #
     # create log file handler
     if log_dir:
-        log_file = os.path.join(log_dir, 'RAT-Mekong-' + strftime('%Y%m%d-%H%M%S',
+        if(for_basin):
+            log_file = os.path.join(log_dir, 'RAT-'+ basin_name + strftime('%Y%m%d-%H%M%S',
+                                gmtime()) + '.log')
+        else:
+            log_file = os.path.join(log_dir, 'RAT_run-'+ strftime('%Y%m%d-%H%M%S',
                                 gmtime()) + '.log')
         fh = logging.FileHandler(log_file)
         fh.setLevel(log_level)
@@ -92,7 +101,7 @@ def init_logger(log_dir='./', log_level='DEBUG', verbose=False, notify=False):
     sys.stderr = StreamToFile(log_level=logging.ERROR)
     # ---------------------------------------------------------------- #
 
-    logger.info('-------------------- INITIALIZED RAT-Mekong LOG ------------------')
+    logger.info('-------------------- INITIALIZED RAT-'+basin_name+' LOG ------------------')
     logger.info('TIME: %s', datetime.datetime.now())
     logger.info('LOG LEVEL: %s', log_level)
     logger.info('Logging To Console: %s', verbose)
@@ -104,9 +113,9 @@ def init_logger(log_dir='./', log_level='DEBUG', verbose=False, notify=False):
 # -------------------------------------------------------------------- #
 
 
-def close_logger():
+def close_logger(logger_name=LOG_NAME):
     '''Close the handlers of the logger'''
-    log = logging.getLogger(LOG_NAME)
+    log = logging.getLogger(logger_name)
     x = list(log.handlers)
     for i in x:
         log.removeHandler(i)
diff --git a/backend/scripts/utils/metsim_param_reader.py b/src/rat/utils/metsim_param_reader.py
similarity index 61%
rename from backend/scripts/utils/metsim_param_reader.py
rename to src/rat/utils/metsim_param_reader.py
index 6477f688..79af9881 100644
--- a/backend/scripts/utils/metsim_param_reader.py
+++ b/src/rat/utils/metsim_param_reader.py
@@ -3,14 +3,14 @@
 from logging import getLogger
 import os
 
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import create_directory
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import create_directory
 
 log = getLogger(LOG_NAME)
 
 
 class MSParameterFile:
-    def __init__(self, workspace, start, end, init_param, forcings=None, state=None, runname=None):
+    def __init__(self, start, end, init_param, out_dir, forcings=None, state=None, domain=None, workspace=None, runname=None):
         self.params = yaml.safe_load(open(init_param, 'r'))   # Initialize from a parameter file
         
         self.params['MetSim']['start'] = start.strftime("%Y-%-m-%d")
@@ -18,38 +18,38 @@ def __init__(self, workspace, start, end, init_param, forcings=None, state=None,
 
         self.start = start
         self.end = end
-        self.workspace = workspace
-        self.ms_param_path = None
         self.results = None
         self.forcings = forcings
         self.state = state
+        self.domain = domain
 
+        self.params['MetSim']['forcing'] = self.forcings
+        self.params['MetSim']['state'] = self.state
+        self.params['MetSim']['domain'] = self.domain
+
+        self.params['MetSim']['out_dir']= out_dir
+        
         if runname:
             self.runname = runname
         else:
             self.runname = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
+        
+        if workspace:
+            self.workspace = create_directory(os.path.join(workspace, f'run_{self.runname}'),True)
+            self.ms_param_path = os.path.join(self.workspace, 'metsim_params.yml')
+        else:
+            self.ms_param_path = init_param
 
         self._load()
 
     def _load(self):
-        # Date modification
-        # start = self.config['GLOBAL']['begin'] + datetime.timedelta(days=90)
-        # self.params['MetSim']['start'] = start.strftime("%Y-%-m-%d")
-        # end = self.config['GLOBAL']['end']
-        # self.params['MetSim']['stop'] = end.strftime("%Y-%-m-%d")
-
-        self.params['MetSim']['forcing'] = self.forcings
-        self.params['MetSim']['state'] = self.state
-
         self.results = os.path.join(self.params['MetSim']['out_dir'], f"{self.params['MetSim']['out_prefix']}_{self.start.strftime('%Y%m%d')}-{self.end.strftime('%Y%m%d')}.nc")
 
-        self.workspace = create_directory(os.path.join(self.workspace, f'run_{self.runname}'))
 
     def __enter__(self):
         # save params
-        self.ms_param_path = os.path.join(self.workspace, 'metsim_params.yml')
         yaml.dump(self.params, open(self.ms_param_path, 'w'))
-
+        
         return self
 
     def __exit__(self, exc_type, exc_value, exc_traceback):
diff --git a/backend/scripts/utils/route_param_reader.py b/src/rat/utils/route_param_reader.py
similarity index 52%
rename from backend/scripts/utils/route_param_reader.py
rename to src/rat/utils/route_param_reader.py
index 212baaed..24c6b132 100644
--- a/backend/scripts/utils/route_param_reader.py
+++ b/src/rat/utils/route_param_reader.py
@@ -4,13 +4,14 @@
 import yaml
 import shutil
 
-from utils.utils import create_directory
-from utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import create_directory
+from rat.utils.logging import LOG_NAME, NOTIFICATION
 
 log = getLogger(LOG_NAME)
 
 class RouteParameterFile:
-    def __init__(self, config, start, end, clean=False, runname=None, config_section='ROUTING'):
+    def __init__(self, config, basin_name, start, end, basin_flow_direction_file=None, clean=False, runname=None, rout_input_path_prefix=None,
+                                config_section='ROUTING', intermediate_files=False):
         self.params = {
             'flow_direction_file': None,
             'velocity': None,
@@ -29,6 +30,12 @@ def __init__(self, config, start, end, clean=False, runname=None, config_section
         self.workspace = None
         self.clean = clean
 
+        self.basin_name = basin_name
+        self.intermediate_files = intermediate_files
+        self.rout_input_path_prefix = rout_input_path_prefix
+        self.basin_flow_direction_file = basin_flow_direction_file
+        self.project_dir = config['GLOBAL']['project_dir']
+
         self.startdate = start
         self.enddate = end
         self.config_section = config_section
@@ -46,10 +53,10 @@ def _load_from_config(self):
         config = self.config
 
         # Calculate first
-        if self.params['start_date'] is not None:
-            self.params['start_date'] = (config['GLOBAL']['begin'] + datetime.timedelta(days=90)).strftime("%Y %m %d")
-        if self.params['end_date'] is not None:
-            self.params['end_date'] = config['GLOBAL']['end'].strftime("%Y %m %d")
+        if self.params['start_date'] is None:
+            self.params['start_date'] = (config['BASIN']['begin'] + datetime.timedelta(days=90)).strftime("%Y %m %d")
+        if self.params['end_date'] is None:
+            self.params['end_date'] = config['BASIN']['end'].strftime("%Y %m %d")
 
         # If passed as parameters, replace them
         if self.startdate:
@@ -59,21 +66,45 @@ def _load_from_config(self):
             self.params['end_date'] = self.enddate.strftime('%Y %m %d')
 
         # setup workspace
-        self.workspace = create_directory(os.path.join(config[self.config_section]['route_workspace'], f'run_{self.runname}'))
+        if (config[self.config_section].get('route_workspace')):
+            self.workspace = create_directory(os.path.join(config[self.config_section]['route_workspace'],
+                                                                 f'run_{self.runname}'))
+        else:
+            if(self.intermediate_files):
+                self.workspace = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['major_basin_name'],'basins',
+                                                                self.basin_name,'ro','rout_workspace',f'run_{self.runname}'))
         
         ## Route parameter file, this is where the parameter file will be saved
-        self.route_param_path = os.path.relpath(os.path.join(self.workspace, 'route_param.txt'))
+        if (self.intermediate_files):
+            self.route_param_path = os.path.relpath(os.path.join(self.workspace, 'route_param.txt'),self.project_dir)
+        else:
+            # Replacing the init_route_param_file
+            if(config[self.config_section].get('route_param_file')):
+                self.route_param_path = os.path.relpath(config[self.config_section].get('route_param_file'),self.project_dir)
+            # Or storing it in route basin params dir and replace it from next cycle
+            else:
+                self.route_param_path = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['major_basin_name'],
+                                                            'basins',self.basin_name,'rout_basin_params'),True)
+                self.route_param_path = os.path.relpath(os.path.join(self.route_param_path,'route_param.txt'),self.project_dir)
         
+        ## flow direction file
+        self.params['flow_direction_file'] = self.basin_flow_direction_file
+
         ## output dir
-        self.params['output_dir'] = create_directory(os.path.join(self.workspace, 'route_results'))  # TODO delete results when finished
+        self.params['output_dir'] = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['major_basin_name'],
+                                                            'basins',self.basin_name,'ro','ou'),True)
         
         ## stations
-        self.params['station'] = os.path.join(self.workspace, 'stations_xy.txt')
-
-        # self.route_input_dir = config[self.config_section]['route_input_dir']
-
-        self.params['input_files_prefix'] = os.path.join(config[self.config_section]['route_input_dir'], 'fluxes_')
+        if (self.intermediate_files):
+            self.params['station'] = os.path.join(self.workspace, 'sta_xy.txt')
+        else:
+            self.params['station'] = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['major_basin_name'],
+                                                        'basins',self.basin_name,'ro','pars'),True)
+            self.params['station'] = os.path.join(self.params['station'],'sta_xy.txt')
 
+        # Routing Input file prefix path   
+        self.params['input_files_prefix'] = self.rout_input_path_prefix
+        
         # load from config
         for key in config[f'{self.config_section} PARAMETERS']:
             val = config[f'{self.config_section} PARAMETERS'][key]
@@ -87,7 +118,7 @@ def _out_format_params(self):
         res.append(f"# ROUTE PARAMETER FILE created by RouteParameterFile() on {datetime.datetime.now().strftime('%Y-%m-%d %X')} - run_{self.runname}")
         
         res.append(f"# FLOW DIRECTION FILE")
-        res.append(f"{os.path.relpath(self.params['flow_direction_file'])}")
+        res.append(f"{os.path.relpath(self.params['flow_direction_file'],self.project_dir)}")
         
         res.append(f"# VELOCITY FILE")
         if not isinstance(self.params['velocity'], str): # if not a velocity file path
@@ -95,7 +126,7 @@ def _out_format_params(self):
             res.append(f"{self.params['velocity']}")
         else:
             res.append(f".true.")
-            res.append(f"{os.path.relpath(self.params['velocity'])}")
+            res.append(f"{os.path.relpath(self.params['velocity'],self.project_dir)}")
 
         res.append(f"# DIFFUSION FILE")
         if not isinstance(self.params['diff'], str): # if not a velocity file path
@@ -103,7 +134,7 @@ def _out_format_params(self):
             res.append(f"{self.params['diff']}")
         else:
             res.append(f".true.")
-            res.append(f"{os.path.relpath(self.params['diff'])}")
+            res.append(f"{os.path.relpath(self.params['diff'],self.project_dir)}")
 
         res.append(f"# XMASK FILE")
         if not isinstance(self.params['xmask'], str): # if not a velocity file path
@@ -111,7 +142,7 @@ def _out_format_params(self):
             res.append(f"{self.params['xmask']}")
         else:
             res.append(f".true.")
-            res.append(f"{os.path.relpath(self.params['xmask'])}")
+            res.append(f"{os.path.relpath(self.params['xmask'],self.project_dir)}")
 
         res.append(f"# FRACTION FILE")
         if not isinstance(self.params['fraction'], str): # if not a velocity file path
@@ -119,37 +150,38 @@ def _out_format_params(self):
             res.append(f"{self.params['fraction']}")
         else:
             res.append(f".true.")
-            res.append(f"{os.path.relpath(self.params['fraction'])}")
+            res.append(f"{os.path.relpath(self.params['fraction'],self.project_dir)}")
 
         res.append(f"# STATION FILE")
-        res.append(f"{os.path.relpath(self.params['station'])}")
+        res.append(f"{os.path.relpath(self.params['station'],self.project_dir)}")
 
         res.append(f"# INPUTS and PRECISION")
-        res.append(f"{os.path.relpath(self.params['input_files_prefix'])}")
+        res.append(f"{os.path.relpath(self.params['input_files_prefix'],self.project_dir)}")
         res.append(f"{self.params['input_file_precision']}")
 
         res.append(f"# OUTPUT FILES")
-        res.append(f"{os.path.relpath(self.params['output_dir'])}/")
+        res.append(f"{os.path.relpath(self.params['output_dir'],self.project_dir)}/")
 
         res.append(f"# START and END")
         res.append(f"{self.params['start_date']}")
         res.append(f"{self.params['end_date']}")
 
         res.append(f"# UH")
-        res.append(f"{os.path.relpath(self.params['uh'])}")
+        res.append(f"{os.path.relpath(self.params['uh'],self.project_dir)}")
 
         return '\n'.join(res)
 
     def _write(self):
-        with open(self.route_param_path, 'w') as f:
+        with open(os.path.join(self.project_dir,self.route_param_path), 'w') as f:
             param = self._out_format_params()
             log.debug(param)
             f.write(param)
 
     def __enter__(self):
         # Save a copy of config file for record
-        config_record_path = os.path.join(self.workspace, 'config_record.yml')
-        yaml.dump(self.config, open(config_record_path, 'w'))
+        if(self.intermediate_files):
+            config_record_path = os.path.join(self.workspace, 'config_record.yml')
+            yaml.dump(self.config, open(config_record_path, 'w'))
 
         # TODO when defined `_load_from_param`, save the file used to initialize for record
 
diff --git a/src/rat/utils/run_command.py b/src/rat/utils/run_command.py
new file mode 100644
index 00000000..e75f989b
--- /dev/null
+++ b/src/rat/utils/run_command.py
@@ -0,0 +1,30 @@
+import subprocess
+from logging import getLogger
+from rat.utils.logging import LOG_NAME
+
+def run_command(args, metsim=False, **kwargs):
+    """Safely runs a command, logs and returns the returncode silently in case of no error. 
+    Otherwise, raises an Exception
+    """
+    log = getLogger(LOG_NAME)
+    if isinstance(args, list):
+        log.debug("Running command: %s", " ".join(args))
+    else:
+        log.debug("Running command: %s", args)
+    p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kwargs)
+
+    with p.stdout:
+        for line in iter(p.stdout.readline, b''): # b'\n'-separated lines
+            log.debug("%r", line)
+        
+    exitcode = p.wait()
+
+    if exitcode == 0:
+        log.debug("Finished running command successfully: EXIT CODE %s", exitcode)
+    elif (exitcode == 1 and metsim==True):
+        log.debug("Finished running metsim successfully: EXIT CODE %s", exitcode)
+    else:
+        log.error("ERROR Occurred with exit code: %s", exitcode)
+        raise Exception
+    
+    return exitcode
\ No newline at end of file
diff --git a/backend/scripts/utils/science.py b/src/rat/utils/science.py
similarity index 100%
rename from backend/scripts/utils/science.py
rename to src/rat/utils/science.py
diff --git a/backend/scripts/utils/utils.py b/src/rat/utils/utils.py
similarity index 59%
rename from backend/scripts/utils/utils.py
rename to src/rat/utils/utils.py
index 4effbda5..98a54c71 100644
--- a/backend/scripts/utils/utils.py
+++ b/src/rat/utils/utils.py
@@ -1,41 +1,32 @@
-import subprocess
-from logging import getLogger
 import os
+import math
+from datetime import datetime
 
-from utils.logging import LOG_NAME
+def days_between(d1, d2):
+    d1 = datetime.strptime(d1, "%Y-%m-%d")
+    d2 = datetime.strptime(d2, "%Y-%m-%d")
+    return abs((d2 - d1).days)
 
-log = getLogger(LOG_NAME)
-
-
-
-def run_command(args, **kwargs):
-    """Safely runs a command, logs and returns the returncode silently in case of no error. 
-    Otherwise, raises an Exception
-    """
-    if isinstance(args, list):
-        log.debug("Running command: %s", " ".join(args))
+def round_pixels(x):
+    if((x*10)%10<5):
+        x=int(x)
     else:
-        log.debug("Running command: %s", args)
-    p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kwargs)
+        x=int(x)+1
+    return(x)
 
-    with p.stdout:
-        for line in iter(p.stdout.readline, b''): # b'\n'-separated lines
-            log.debug("%r", line)
-        
-    exitcode = p.wait()
 
-    if exitcode == 0:
-        log.debug("Finished routing successfully: EXIT CODE %s", exitcode)
-    else:
-        log.error("ERROR Occurred with exit code: %s", exitcode)
-        raise Exception
-    
-    return exitcode
-
-def create_directory(p):
+def create_directory(p,path_return=False):
     if not os.path.isdir(p):
         os.makedirs(p)
-    return p
+    if path_return:
+        return p
+
+def round_up(n, decimals=0): 
+    multiplier = 10 ** decimals 
+    if n>0:
+        return math.ceil(n * multiplier) / multiplier
+    else:
+        return -math.ceil(abs(n) * multiplier) / multiplier
 
 # https://gist.github.com/pritamd47/e7ddc49f25ae7f1b06c201f0a8b98348
 # Clip time-series
diff --git a/backend/scripts/utils/vic_param_reader.py b/src/rat/utils/vic_param_reader.py
similarity index 64%
rename from backend/scripts/utils/vic_param_reader.py
rename to src/rat/utils/vic_param_reader.py
index b27f9288..c3abe6f7 100644
--- a/backend/scripts/utils/vic_param_reader.py
+++ b/src/rat/utils/vic_param_reader.py
@@ -1,15 +1,19 @@
-import os
 import datetime
+import os
 from logging import getLogger
+
 import yaml
 
-from utils.logging import LOG_NAME, NOTIFICATION
-from utils.utils import create_directory
+from rat.utils.logging import LOG_NAME, NOTIFICATION
+from rat.utils.utils import create_directory
 
 log = getLogger(LOG_NAME)
 
 class VICParameterFile:
-    def __init__(self, config, startdate=None, enddate=None, vic_section='VIC', forcing_prefix=None, runname=None):
+    def __init__(self, config, basin_name, startdate=None, enddate=None, vic_output_path=None, vic_section='VIC',
+                                     forcing_prefix=None, runname=None, init_state_date=None, save_init_state=True,
+                                      intermediate_files= False):
+        
         self.params = {
             'steps': {
                 'MODEL_STEPS_PER_DAY'   : None,
@@ -37,6 +41,15 @@ def __init__(self, config, startdate=None, enddate=None, vic_section='VIC', forc
                     'XDIM': None
                 },
             },
+            'state_file_params': {
+                'INIT_STATE'    : None,
+                'STATENAME'     : None,
+                'STATEYEAR'     : None,
+                'STATEMONTH'    : None,
+                'STATEDAY'      : None,
+                'STATESEC'      : 0,
+                'STATE_FORMAT'  : 'NETCDF4',
+            },
             'forcings': {
                 'FORCING1'      : None,
                 'FORCE_TYPE': {
@@ -51,12 +64,15 @@ def __init__(self, config, startdate=None, enddate=None, vic_section='VIC', forc
                 'WIND_H'        : 10.0
             },
             'parameters': {
-                'PARAMETERS'    : None,
-                'LAI_SRC'       : 'FROM_VEGPARAM',
-                'FCAN_SRC'      : 'FROM_DEFAULT',
-                'ALB_SRC'       : 'FROM_VEGPARAM',
-                'NODES'         : 2,
-                'SNOW_BAND'     : 'FALSE'
+                'PARAMETERS'        : None,
+                'VEGPARAM_LAI'      : 'TRUE',
+                'LAI_SRC'           : 'FROM_VEGPARAM',
+                'VEGPARAM_FCAN'     : 'TRUE',
+                'FCAN_SRC'          : 'FROM_VEGPARAM',
+                'VEGPARAM_ALBEDO'   : 'TRUE',
+                'ALB_SRC'           : 'FROM_VEGPARAM',
+                'NODES'             :  2,
+                'SNOW_BAND'         : 'FALSE'
             },
             'results': {
                 'RESULT_DIR'    : None,
@@ -75,22 +91,33 @@ def __init__(self, config, startdate=None, enddate=None, vic_section='VIC', forc
             'extras': {}
         }
         self.config = config
+        self.basin_name = basin_name
         # self.forcing = forcing
         self.init_param_file = self.config[vic_section].get('vic_param_file', None)
+        self.workspace = self.config[vic_section].get('vic_workspace', None)
         self.vic_param_path = None
         self.vic_result_file = None
         self.vic_startdate = None
         self.vic_enddate = None
-        self.fn_param_vic_startdate = datetime.datetime.strptime(startdate, '%Y-%m-%d') if startdate else None
-        self.fn_param_vic_enddate = datetime.datetime.strptime(enddate, '%Y-%m-%d') if enddate else None
+        self.fn_param_vic_startdate = startdate if startdate else None
+        self.fn_param_vic_enddate = enddate if enddate else None
+        self.init_state_date = init_state_date if init_state_date else None
 
+        self.vic_output_path = vic_output_path
+        self.intermediate_files = intermediate_files
         self.straight_from_metsim = False
+        self.save_init_state = save_init_state
+        #VIC State Save Date
+        self.vic_init_state_save_date = config['BASIN']['end']+datetime.timedelta(days=1)
 
         if runname is None:
             self.runname = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
         else:
             self.runname = str(runname)
-        self.workspace = create_directory(os.path.join(config[vic_section]['vic_workspace'], f'run_{self.runname}'))
+        if self.workspace:
+            self.workspace = create_directory(os.path.join(self.workspace, f'run_{self.runname}'),True)
+        else :
+            self.workspace = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['region_name'],'basins',basin_name,'vic','vic_workspace',f'run_{self.runname}'),True)
 
         if self.init_param_file:
             self._load_from_vic_param()
@@ -140,6 +167,9 @@ def _load_from_vic_param(self):
             elif line[0] in self.params['domain']:
                 self.params['domain'][line[0]] = ' '.join(line[1:])
 
+            elif line[0] in self.params['state_file_params']:
+                self.params['state_file_params'][line[0]] = ' '.join(line[1:])
+
             elif line[0] in self.params['forcings']:
                 self.params['forcings'][line[0]] = ' '.join(line[1:])
 
@@ -161,24 +191,47 @@ def _load_from_config(self):
 
         # Start and End date
         # Initialize by calculating first. Will get overriden later if specified in configuration
-        self.params['dates']['STARTYEAR'] = (config['GLOBAL']['begin'] + datetime.timedelta(days=90)).strftime('%Y')
-        self.params['dates']['STARTMONTH'] = (config['GLOBAL']['begin'] + datetime.timedelta(days=90)).strftime('%m')
-        self.params['dates']['STARTDAY'] = (config['GLOBAL']['begin'] + datetime.timedelta(days=90)).strftime('%d')
-        self.params['dates']['ENDYEAR'] = config['GLOBAL']['end'].strftime('%Y')
-        self.params['dates']['ENDMONTH'] = config['GLOBAL']['end'].strftime('%m')
-        self.params['dates']['ENDDAY'] = config['GLOBAL']['end'].strftime('%d')
+        if (config['BASIN'].get('begin',None)):
+            self.params['dates']['STARTYEAR'] = (config['BASIN']['begin'] + datetime.timedelta(days=90)).strftime('%Y')
+            self.params['dates']['STARTMONTH'] = (config['BASIN']['begin'] + datetime.timedelta(days=90)).strftime('%m')
+            self.params['dates']['STARTDAY'] = (config['BASIN']['begin'] + datetime.timedelta(days=90)).strftime('%d')
+        self.params['dates']['ENDYEAR'] = config['BASIN']['end'].strftime('%Y')
+        self.params['dates']['ENDMONTH'] = config['BASIN']['end'].strftime('%m')
+        self.params['dates']['ENDDAY'] = config['BASIN']['end'].strftime('%d')
 
         # Rename forcing file
         if self.straight_from_metsim:
             self.params['forcings']['FORCING1'] = self.forcing_prefix
-
-        # Save vic run logs and parameters in `vic_workspace`
-        self.vic_param_path = os.path.join(self.workspace, 'vic_param.txt')    # Paramter file will be saved here
-        self.params['results']['LOG_DIR'] = create_directory(os.path.join(self.workspace, 'logs'))
+        
+        # Puttting the path of vic_domain and vic_soil_param NC files in global vic param file
+        self.params['parameters']['PARAMETERS'] = config['VIC']['vic_soil_param_file']
+        self.params['domain']['DOMAIN'] = config['VIC']['vic_domain_file']
+ 
+        # Save vic run logs and parameters in `vic_workspace` if intermediate_files is true 
+        # else just replacing the init_param_file if given in config or will update(or create) it in vic_basin_params 
+        # and log file will be update(or created) in data_dir/vic_logs/basin_name/
+        if (self.intermediate_files):
+            self.vic_param_path = os.path.join(self.workspace, 'vic_param.txt')    # Paramter file will be saved here
+            self.params['results']['LOG_DIR'] = create_directory(os.path.join(self.workspace, 'logs',''),True)
+            
+        else:
+            # Replacing the init_param_file if given
+            if self.init_param_file:
+                self.vic_param_path = self.init_param_file   # Paramter file will be replaced
+            # Or storing it in vic basin params dir and replace it from next cycle
+            else:
+                self.vic_param_path = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['region_name'],
+                                                            'basins',self.basin_name,'vic','vic_basin_params'),True)
+                self.vic_param_path = os.path.join(self.vic_param_path,'vic_param.txt')
+            self.params['results']['LOG_DIR'] = create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['region_name'],
+                                                             'vic_logs',self.basin_name,''),True) 
         log.debug("VIC Logs Directory: %s ", self.params['results']['LOG_DIR'])
-        if not self.params['results']['LOG_DIR'].endswith(os.sep):
-            self.params['results']['LOG_DIR'] = self.params['results']['LOG_DIR'] + f'{os.sep}'
+        # if not self.params['results']['LOG_DIR'].endswith(os.sep):
+        #     self.params['results']['LOG_DIR'] = self.params['results']['LOG_DIR'] + f'{os.sep}'
 
+            
+
+        # Reading vic parameters directly from rat_runner config file
         if config['VIC PARAMETERS'] is not None:
             if 'STARTYEAR' in config['VIC PARAMETERS']:
                 log.debug("Updating from config: %s", 'MODEL RUN PERIOD')
@@ -220,6 +273,8 @@ def _load_from_config(self):
                         self.params['dates'][key] = config['VIC PARAMETERS'][key]
                     elif key in self.params['forcings']:
                         self.params['forcings'][key] = config['VIC PARAMETERS'][key]
+                    elif key in self.params['state_file_params']:
+                        self.params['state_file_params'][key] = config['VIC PARAMETERS'][key]
                     elif key in self.params['parameters']:
                         self.params['parameters'][key] = config['VIC PARAMETERS'][key]
                     elif key in self.params['results']:
@@ -239,6 +294,30 @@ def _load_from_config(self):
             self.params['dates']['ENDYEAR'] = self.fn_param_vic_enddate.strftime('%Y')
             self.params['dates']['ENDMONTH'] = self.fn_param_vic_enddate.strftime('%m')
             self.params['dates']['ENDDAY'] = self.fn_param_vic_enddate.strftime('%d')
+        
+        # If vic_output_path is passed as constructor parameter, override it
+        if self.vic_output_path:
+            self.params['results']['RESULT_DIR'] = self.vic_output_path
+        
+        # Saving initital state file for vic's next run  if save_init_state is True else deleting STATENAME from state_file_params
+        if (self.save_init_state):
+            create_directory(os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['region_name'],'basins',self.basin_name,'vic','vic_init_states'),False)
+            self.params['state_file_params']['STATENAME'] = os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['region_name'],'basins',self.basin_name,'vic','vic_init_states','state_')
+            self.params['state_file_params']['STATEYEAR'] = self.vic_init_state_save_date.strftime('%Y')
+            self.params['state_file_params']['STATEMONTH'] = self.vic_init_state_save_date.strftime('%m')
+            self.params['state_file_params']['STATEDAY'] = self.vic_init_state_save_date.strftime('%d')
+        else:
+            del self.params['state_file_params']['STATENAME']
+
+        # Using initital state file for this run if init_state_date is not None else deleting INIT_STATE from state_file_params
+        if (self.init_state_date):
+            init_state_date_str = str(self.init_state_date.strftime('%Y'))+str(self.init_state_date.strftime('%m'))+\
+                                  str(self.init_state_date.strftime('%d'))
+            self.params['state_file_params']['INIT_STATE'] = os.path.join(config['GLOBAL']['data_dir'],config['BASIN']['region_name'],
+                                                            'basins',self.basin_name,'vic','vic_init_states',
+                                                            'state_.'+init_state_date_str+'_00000.nc')
+        else:
+            del self.params['state_file_params']['INIT_STATE']
 
     def _out_format_params(self): # return a VIC compatible string of paramters
         header = '\n'.join([
@@ -276,6 +355,25 @@ def _out_format_params(self): # return a VIC compatible string of paramters
             domain.append(f'DOMAIN_TYPE           {key}\t{val}')
         domain = '\n'.join(domain)
 
+        if self.init_state_date:
+            init_state_prefix=''
+        else:
+            init_state_prefix='#'
+        if self.save_init_state:
+            statename_prefix=''
+        else:
+            statename_prefix='#'
+        state_file_parameters = '\n'.join([
+            '# State Files and Parameters',
+            f"{init_state_prefix}INIT_STATE           {self.params['state_file_params'].get('INIT_STATE','')}",
+            f"{statename_prefix}STATENAME             {self.params['state_file_params'].get('STATENAME','')}",
+            f"STATEYEAR             {self.params['state_file_params'].get('STATEYEAR','')}",
+            f"STATEMONTH            {self.params['state_file_params'].get('STATEMONTH','')}",
+            f"STATEDAY              {self.params['state_file_params'].get('STATEDAY','')}",
+            f"STATESEC              {self.params['state_file_params'].get('STATESEC','')}",
+            f"STATE_FORMAT          {self.params['state_file_params'].get('STATE_FORMAT','')}"
+        ])
+
         forcings = '\n'.join([
             '# Forcings',
             f'FORCING1              {self.params["forcings"]["FORCING1"]}',
@@ -334,6 +432,7 @@ def _out_format_params(self): # return a VIC compatible string of paramters
             simulation_period, 
             model_decisions, 
             domain, 
+            state_file_parameters,
             forcings, 
             parameters,
             extras, 
@@ -350,14 +449,15 @@ def _write(self):
             f.write(param)
 
     def __enter__(self):
-        # Save config file used to run the program too
-        config_record_path = os.path.join(self.workspace, 'config_record.yml')
-        yaml.dump(self.config, open(config_record_path, 'w'))
-        # Save copy of global vic parameter file used to initialize parameters
-        if self.init_param_file:
-            with open(os.path.join(self.workspace, 'init_global_params.txt'), 'w') as dst:
-                with open(self.init_param_file, 'r') as src:
-                    dst.writelines(src.readlines())
+        if (self.intermediate_files):
+            # Save config file used to run the program too
+            config_record_path = os.path.join(self.workspace, 'config_record.yml')
+            yaml.dump(self.config, open(config_record_path, 'w'))
+            # Save copy of global vic parameter file used to initialize parameters
+            if self.init_param_file:
+                with open(os.path.join(self.workspace, 'init_global_params.txt'), 'w') as dst:
+                    with open(self.init_param_file, 'r') as src:
+                        dst.writelines(src.readlines())
 
         # Determine output file
         # Assuming only one file is generated
@@ -371,4 +471,4 @@ def __enter__(self):
         return self
 
     def __exit__(self, exc_type, exc_value, exc_traceback):
-        pass
\ No newline at end of file
+        pass


Test patch:
diff --git a/.github/workflows/run_tests.yaml b/.github/workflows/run_tests.yaml
new file mode 100644
index 00000000..d16a33b3
--- /dev/null
+++ b/.github/workflows/run_tests.yaml
@@ -0,0 +1,38 @@
+name: Python package
+
+on: [push]
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v4
+        with:
+          python-version: ${{ matrix.python-version }}
+      - name: Setup environment with mamba
+        uses: conda-incubator/setup-miniconda@v2
+        with:
+          mamba-version: "*"
+          auto-update-conda: true
+          channels: conda-forge,defaults
+          environment-file: environment.yml
+      - name: Install test modules
+        shell: bash -l {0}
+        run: |
+          conda info
+          conda install pytest conda-build -y
+      - name: Build RAT
+        shell: bash -l {0}
+        run: |
+          conda develop src/
+      - name: Test RAT
+        shell: bash -l {0}
+        run: |
+          conda activate test
+          pytest
diff --git a/tests/test_imports.py b/tests/test_imports.py
new file mode 100644
index 00000000..098a620a
--- /dev/null
+++ b/tests/test_imports.py
@@ -0,0 +1,5 @@
+import pytest
+
+def test_imports():
+    from rat.utils.logging import init_logger,close_logger
+    # from rat.rat_basin import rat
\ No newline at end of file