diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java index b671c659b6..09e372328f 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java @@ -69,6 +69,8 @@ import com.raytheon.uf.viz.core.notification.NotificationMessage; * ------------ ---------- ----------- -------------------------- * 05/08/08 1127 randerso Initial Creation * 09/03/08 1448 chammack Refactored notification observer interface + * 04/23/13 1939 randerso Add separate connect method to allow application + * to complete initialization before connecting to JMS * * * @author randerso @@ -184,7 +186,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { */ protected NotificationManagerJob() { this.listeners = new HashMap(); - connect(true); Activator.getDefault().registerDisposable(this); } @@ -411,6 +412,20 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { } } + /** + * Connect to JMS + */ + public static void connect() { + getInstance().connect(true); + } + + /** + * Disconnect from JMS + */ + public static void disconnect() { + getInstance().disconnect(true); + } + private static class NotificationListener implements MessageListener { private Type type; diff --git a/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEDataDefinition.java b/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEDataDefinition.java index c811026afd..b51013c5be 100644 --- a/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEDataDefinition.java +++ b/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEDataDefinition.java @@ -20,23 +20,16 @@ package com.raytheon.uf.viz.d2d.gfe.browser; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEDataAccessUtil; -import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; -import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.viz.core.rsc.DisplayType; import com.raytheon.uf.viz.core.rsc.ResourceType; import com.raytheon.uf.viz.core.rsc.capabilities.DisplayTypeCapability; import com.raytheon.uf.viz.d2d.gfe.rsc.GFEGridResourceData; import com.raytheon.uf.viz.productbrowser.AbstractRequestableProductBrowserDataDefinition; -import com.raytheon.uf.viz.productbrowser.ProductBrowserLabel; -import com.raytheon.uf.viz.productbrowser.ProductBrowserPreference; import com.raytheon.viz.grid.rsc.GridLoadProperties; /** @@ -50,6 +43,9 @@ import com.raytheon.viz.grid.rsc.GridLoadProperties; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 9, 2011 bsteffen Initial creation + * May 02, 2013 1949 bsteffen Update GFE data access in Product + * Browser, Volume Browser, and Data Access + * Framework. * * * @@ -90,119 +86,4 @@ public class GFEDataDefinition extends return type; } - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.productbrowser. - * AbstractRequestableProductBrowserDataDefinition - * #buildProductList(java.util.List) - */ - @Override - public List buildProductList(List historyList) { - String[] parameters = queryData(GFEDataAccessUtil.PARM_ID, - getProductParameters(new String[0], null)); - List result = new ArrayList(); - for (String orderString : order) { - List labels = formatData(orderString, - parameters); - for (ProductBrowserLabel label : labels) { - if (!result.contains(label.getName())) { - result.add(label.getName()); - } - } - } - return Collections.emptyList(); - } - - @Override - public String populateInitial() { - if (!isEnabled()) { - return null; - } - String[] parameters = queryData(GFEDataAccessUtil.PARM_ID, - getProductParameters(new String[0], null)); - - if (parameters != null) { - if (parameters.length > 0) { - return displayName; - } else { - return null; - } - } else { - return null; - } - - } - - @Override - protected String[] queryData(String param, - HashMap queryList) { - return super.queryData(GFEDataAccessUtil.PARM_ID, queryList); - } - - @Override - public List formatData(String param, - String[] parameters) { - Set labels = new HashSet(); - for (String value : parameters) { - String label = value; - try { - ParmID parmId = new ParmID(value); - if (param.equals(GFEDataAccessUtil.SITE_ID)) { - label = parmId.getDbId().getSiteId(); - } else if (param.equals(GFEDataAccessUtil.MODEL_NAME)) { - label = parmId.getDbId().getModelName(); - } else if (param.equals(GFEDataAccessUtil.MODEL_TIME)) { - label = parmId.getDbId().getModelTime(); - } else if (param.equals(GFEDataAccessUtil.DB_TYPE)) { - label = parmId.getDbId().getDbType(); - } else if (param.equals(GFEDataAccessUtil.PARM_NAME)) { - label = parmId.getParmName(); - } else if (param.equals(GFEDataAccessUtil.PARM_LEVEL)) { - label = parmId.getParmLevel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - labels.add(new ProductBrowserLabel(label, label)); - } - ArrayList finalLabels = new ArrayList( - labels); - Collections.sort(finalLabels); - return finalLabels; - } - - @Override - public HashMap getProductParameters( - String[] selection, String[] order) { - if (order == null) { - order = this.order; - } - - Map parmIdComponents = new HashMap(); - if (selection.length > 1) { - String[] usedSelection = realignSelection(selection); - for (int i = 0; i < usedSelection.length; i++) { - parmIdComponents.put(order[i], usedSelection[i]); - } - } - - HashMap queryList = new HashMap(); - queryList.put(PLUGIN_NAME, new RequestConstraint(productName)); - - queryList.put(GFEDataAccessUtil.PARM_ID, - GFEDataAccessUtil.createParmIdConstraint(parmIdComponents)); - return queryList; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.productbrowser.xml.IProductBrowserPreferences# - * configurePreferences() - */ - @Override - public List configurePreferences() { - return super.configurePreferences(); - } } diff --git a/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEVbDataCatalog.java b/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEVbDataCatalog.java index 40df6f91b5..1b0b2e7786 100644 --- a/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEVbDataCatalog.java +++ b/cave/com.raytheon.uf.viz.d2d.gfe/src/com/raytheon/uf/viz/d2d/gfe/browser/GFEVbDataCatalog.java @@ -28,14 +28,18 @@ import java.util.Map; import javax.measure.unit.UnitFormat; import com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEDataAccessUtil; +import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.catalog.CatalogQuery; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.requests.ThriftClient; import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; import com.raytheon.uf.viz.core.rsc.AbstractResourceData; import com.raytheon.uf.viz.core.rsc.DisplayType; @@ -66,6 +70,9 @@ import com.raytheon.viz.volumebrowser.vbui.VBMenuBarItemsMgr.ViewMenu; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 9, 2011 bsteffen Initial creation + * May 02, 2013 1949 bsteffen Update GFE data access in Product + * Browser, Volume Browser, and Data Access + * Framework. * * * @@ -80,7 +87,7 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { public IDataCatalogEntry getCatalogEntry(SelectedData selectedData) { HashMap queryList = new HashMap(); queryList.put(GFEDataAccessUtil.PLUGIN_NAME, new RequestConstraint("gfe")); - queryList.put(GFEDataAccessUtil.PARM_ID, getParmIdConstraint(selectedData)); + queryList.putAll(getParmIdConstraint(selectedData)); try { String[] result = CatalogQuery.performQuery(GFEDataAccessUtil.PARM_ID, queryList); @@ -103,7 +110,7 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { List gfeSources = null; if (selectedSources != null && selectedSources.length != 0) { - gfeSources = new ArrayList(); + gfeSources = new ArrayList(selectedSources.length); for (String selectedSource : selectedSources) { String gfeSource = VbGFEMapping.getGfeSource(selectedSource); if (gfeSource != null) { @@ -117,7 +124,7 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { List gfeFields = null; if (selectedFields != null && selectedFields.length != 0) { - gfeFields = new ArrayList(); + gfeFields = new ArrayList(selectedFields.length); for (String selectedField : selectedFields) { String gfeParam = VbGFEMapping.getGfeParam(selectedField); if (gfeParam != null) { @@ -131,7 +138,7 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { List gfePlanes = null; if (selectedPlanes != null && selectedPlanes.length != 0) { - gfePlanes = new ArrayList(); + gfePlanes = new ArrayList(selectedPlanes.length); for (String selectedPlane : selectedPlanes) { String gfePlane = VbGFEMapping.getGfeLevel(selectedPlane); if (gfePlane != null) { @@ -143,40 +150,56 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { } } - for (String parmIdStr : getParmIds()) { - ParmID parmId = new ParmID(parmIdStr); + DbQueryRequest dbRequest = new DbQueryRequest(); + dbRequest.setEntityClass(GFERecord.class); + dbRequest.addRequestField(GFEDataAccessUtil.MODEL_NAME); + dbRequest.addRequestField(GFEDataAccessUtil.PARM_NAME); + dbRequest.addRequestField(GFEDataAccessUtil.PARM_LEVEL); + DbQueryResponse dbResponse = null; + try { + dbResponse = (DbQueryResponse) ThriftClient.sendRequest(dbRequest); + } catch (VizException e) { + statusHandler + .handle(Priority.PROBLEM, + "Unable to load availability for GFE in the Volume Browser", + e); + return; + } + + for (Map row : dbResponse.getResults()) { + String modelName = row.get(GFEDataAccessUtil.MODEL_NAME).toString(); + String parmName = row.get(GFEDataAccessUtil.PARM_NAME).toString(); + String parmLevel = row.get(GFEDataAccessUtil.PARM_LEVEL).toString(); boolean source = true; boolean field = true; boolean plane = true; - if (gfeSources != null - && !gfeSources.contains(parmId.getDbId().getModelName())) { + if (gfeSources != null && !gfeSources.contains(modelName)) { field = false; plane = false; } - if (gfeFields != null && !gfeFields.contains(parmId.getParmName())) { + if (gfeFields != null && !gfeFields.contains(parmName)) { source = false; plane = false; } - if (gfePlanes != null && !gfePlanes.contains(parmId.getParmLevel())) { + if (gfePlanes != null && !gfePlanes.contains(parmLevel)) { source = false; field = false; } if (source) { - String vbSource = VbGFEMapping.getVbSource(parmId.getDbId() - .getModelName()); + String vbSource = VbGFEMapping.getVbSource(modelName); if (vbSource != null) { request.addAvailableSource(vbSource); } } if (field) { - String vbParam = VbGFEMapping.getVbParam(parmId.getParmName()); + String vbParam = VbGFEMapping.getVbParam(parmName); if (vbParam != null) { request.addAvailableField(vbParam); } } if (plane) { - String vbLevel = VbGFEMapping.getVbLevel(parmId.getParmLevel()); + String vbLevel = VbGFEMapping.getVbLevel(parmLevel); if (vbLevel != null) { request.addAvailablePlane(vbLevel); } @@ -188,13 +211,24 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { @Override public List getSupportedSources() { List results = new ArrayList(); - for (String parmIdStr : getParmIds()) { - ParmID parmId = new ParmID(parmIdStr); - String vbSource = VbGFEMapping.getVbSource(parmId.getDbId() - .getModelName()); - if (vbSource != null) { - results.add(vbSource); + + DbQueryRequest dbRequest = new DbQueryRequest(); + dbRequest.setEntityClass(GFERecord.class); + dbRequest.setDistinct(true); + dbRequest.addRequestField(GFEDataAccessUtil.MODEL_NAME); + try { + DbQueryResponse dbResponse = (DbQueryResponse) ThriftClient + .sendRequest(dbRequest); + for (String modelName : dbResponse.getFieldObjects( + GFEDataAccessUtil.MODEL_NAME, String.class)) { + String vbSource = VbGFEMapping.getVbSource(modelName); + if (vbSource != null) { + results.add(vbSource); + } } + } catch (VizException e) { + statusHandler.handle(Priority.PROBLEM, + "Unable to load any GFE sources in the Volume Browser", e); } return results; } @@ -207,18 +241,8 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { @Override protected void addProductParameters(IDataCatalogEntry catalogEntry, HashMap productParameters) { - productParameters.put(GFEDataAccessUtil.PARM_ID, - getParmIdConstraint(catalogEntry.getSelectedData())); - } - - private String[] getParmIds() { - HashMap queryList = new HashMap(); - queryList.put(GFEDataAccessUtil.PLUGIN_NAME, new RequestConstraint("gfe")); - try { - return CatalogQuery.performQuery(GFEDataAccessUtil.PARM_ID, queryList); - } catch (VizException e) { - throw new RuntimeException(e); - } + productParameters.putAll(getParmIdConstraint(catalogEntry + .getSelectedData())); } @Override @@ -249,63 +273,61 @@ public class GFEVbDataCatalog extends AbstractDataCatalog { @Override protected String getDisplayUnit(IDataCatalogEntry catalogEntry, DisplayType displayType) { - if (catalogEntry instanceof GFECatalogEntry) { - ParmID sampleId = ((GFECatalogEntry) catalogEntry).getSampleId(); - ParamLevelMatchCriteria criteria = GFEGridResource - .getMatchCriteria(sampleId); - StyleRule sr = null; - try { + ParmID sampleId = ((GFECatalogEntry) catalogEntry).getSampleId(); + ParamLevelMatchCriteria criteria = GFEGridResource + .getMatchCriteria(sampleId); + StyleRule sr = null; + try { - StyleManager.StyleType styleType = StyleManager.StyleType.CONTOUR; + StyleManager.StyleType styleType = StyleManager.StyleType.CONTOUR; - if (displayType.equals(DisplayType.IMAGE)) { - styleType = StyleManager.StyleType.IMAGERY; - } - - if (displayType.equals(DisplayType.BARB)) { - styleType = StyleManager.StyleType.ARROW; - } - - sr = StyleManager.getInstance().getStyleRule(styleType, - criteria); - } catch (VizStyleException e) { - statusHandler - .handle(Priority.PROBLEM, - "Unable to obtain a style rule for" - + catalogEntry.getSelectedData() - .getUniqueKey(), e); + if (displayType.equals(DisplayType.IMAGE)) { + styleType = StyleManager.StyleType.IMAGERY; } - if (sr != null) { - return sr.getPreferences().getDisplayUnitLabel(); - } else { - try { - return UnitFormat.getUCUMInstance().format( - GFEDataAccessUtil.getGridParmInfo(sampleId).getUnitObject()); - } catch (Exception e) { - statusHandler.handle(Priority.PROBLEM, - "Unable to obtain a unit information for" + + if (displayType.equals(DisplayType.BARB)) { + styleType = StyleManager.StyleType.ARROW; + } + + sr = StyleManager.getInstance().getStyleRule(styleType, + criteria); + } catch (VizStyleException e) { + statusHandler + .handle(Priority.PROBLEM, + "Unable to obtain a style rule for" + catalogEntry.getSelectedData() .getUniqueKey(), e); - return ""; - } - } + } + if (sr != null) { + return sr.getPreferences().getDisplayUnitLabel(); } else { - return super.getDisplayUnit(catalogEntry, displayType); + try { + return UnitFormat.getUCUMInstance().format( + GFEDataAccessUtil.getGridParmInfo(sampleId).getUnitObject()); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Unable to obtain a unit information for" + + catalogEntry.getSelectedData() + .getUniqueKey(), e); + return ""; + } } } - private RequestConstraint getParmIdConstraint(SelectedData selectedData) { + private Map getParmIdConstraint(SelectedData selectedData) { String parmName = VbGFEMapping.getGfeParam(selectedData.getFieldsKey()); String parmLevel = VbGFEMapping .getGfeLevel(selectedData.getPlanesKey()); String modelName = VbGFEMapping.getGfeSource(selectedData .getSourcesKey()); - Map parmIdComponents = new HashMap(); - parmIdComponents.put(GFEDataAccessUtil.PARM_NAME, parmName); - parmIdComponents.put(GFEDataAccessUtil.PARM_LEVEL, parmLevel); - parmIdComponents.put(GFEDataAccessUtil.MODEL_NAME, modelName); - return GFEDataAccessUtil.createParmIdConstraint(parmIdComponents); + Map result = new HashMap(); + result.put(GFEDataAccessUtil.PARM_NAME, new RequestConstraint(parmName)); + result.put(GFEDataAccessUtil.PARM_LEVEL, new RequestConstraint( + parmLevel)); + result.put(GFEDataAccessUtil.MODEL_NAME, new RequestConstraint( + modelName)); + return result; } private static class GFECatalogEntry extends DataCatalogEntry { diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/FFMPMonitor.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/FFMPMonitor.java index b9b598e24a..e74baa8077 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/FFMPMonitor.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/FFMPMonitor.java @@ -4,7 +4,6 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -29,7 +28,6 @@ import com.raytheon.uf.common.dataplugin.ffmp.FFMPAggregateRecord; import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasin; import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasinData; import com.raytheon.uf.common.dataplugin.ffmp.FFMPGuidanceBasin; -import com.raytheon.uf.common.dataplugin.ffmp.FFMPGuidanceInterpolation; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord.FIELDS; import com.raytheon.uf.common.dataplugin.ffmp.FFMPTemplates; @@ -55,7 +53,6 @@ import com.raytheon.uf.common.monitor.xml.SourceXML; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.viz.core.HDF5Util; import com.raytheon.uf.viz.core.VizApp; @@ -101,6 +98,7 @@ import com.raytheon.uf.viz.monitor.listeners.IMonitorListener; * Mar 6, 2013 1769 dhladky Changed threading to use count down latch. * Apr 9, 2013 1890 dhladky Fixed the broken cache file load * Apr 16, 2013 1912 bsteffen Initial bulk hdf5 access for ffmp + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * * @@ -111,21 +109,18 @@ import com.raytheon.uf.viz.monitor.listeners.IMonitorListener; public class FFMPMonitor extends ResourceMonitor { private static long SECONDS_PER_HOUR = 60 * 60; - /** boolean for initialization **/ - public static boolean isInitialized = false; - /** Singleton instance of this class */ private static FFMPMonitor monitor = null; /** Array of scan listeners **/ - private ArrayList resourceListeners = new ArrayList(); + private List resourceListeners = new ArrayList(); - public FFMPSplash ffmpSplash; + private FFMPSplash ffmpSplash; private String wfo = null; /** Pattern for dates in radar */ - public static ThreadLocal datePattern = new ThreadLocal() { + private static ThreadLocal datePattern = new ThreadLocal() { @Override protected SimpleDateFormat initialValue() { @@ -138,16 +133,11 @@ public class FFMPMonitor extends ResourceMonitor { private FFMPSiteDataContainer siteDataMap = new FFMPSiteDataContainer(); - // Interpolation Guidance Sources - public FFMPGuidanceInterpolation interpolation = null; + /** config manager **/ + private FFMPSourceConfigurationManager fscm = null; /** config manager **/ - public FFMPSourceConfigurationManager fscm = null; - - /** config manager **/ - public FFMPConfig ffmpConfig = null; - - public ArrayList dataTimes = null; + private FFMPConfig ffmpConfig = null; private FFMPTimeWindow qpfWindow = null; @@ -246,7 +236,6 @@ public class FFMPMonitor extends ResourceMonitor { public static synchronized FFMPMonitor getInstance() { if (monitor == null) { monitor = new FFMPMonitor(); - isInitialized = true; } return monitor; @@ -274,7 +263,6 @@ public class FFMPMonitor extends ResourceMonitor { public FFMPSourceConfigurationManager getSourceConfig() { if (fscm == null) { fscm = FFMPSourceConfigurationManager.getInstance(); - fscm.readConfigXml(); } return fscm; @@ -329,15 +317,8 @@ public class FFMPMonitor extends ResourceMonitor { * @return * @throws VizException */ - public void populateFFMPRecord(ProductXML product, String siteKey, - String dataKey, String source, Date ptime, String phuc, - boolean retrieveNew) { - - boolean isProductLoad = false; - if (product != null) { - isProductLoad = true; - } - + public void populateFFMPRecord(String siteKey, String dataKey, + String source, Date ptime, String phuc, boolean retrieveNew) { if (source != null) { boolean dupOverride = false; @@ -357,7 +338,7 @@ public class FFMPMonitor extends ResourceMonitor { || !getLoadedUris(siteKey, source, phuc) .contains(uri)) { try { - populateFFMPRecord(isProductLoad, siteKey, + populateFFMPRecord(siteKey, new FFMPRecord(uri), source, phuc); } catch (Exception e) { statusHandler.handle(Priority.PROBLEM, @@ -381,12 +362,11 @@ public class FFMPMonitor extends ResourceMonitor { * @return * @throws VizException */ - public FFMPRecord populateFFMPRecord(boolean isProductLoad, String uri, - String siteKey, String source, String phuc) throws Exception { + public FFMPRecord populateFFMPRecord(String uri, String siteKey, + String source, String phuc) throws Exception { try { - populateFFMPRecord(isProductLoad, siteKey, new FFMPRecord(uri), - source, phuc); + populateFFMPRecord(siteKey, new FFMPRecord(uri), source, phuc); } catch (VizException e) { statusHandler.handle(Priority.INFO, "FFMP Can't retrieve FFMP URI, " + uri, e); @@ -455,10 +435,10 @@ public class FFMPMonitor extends ResourceMonitor { * @param phuc * @throws Exception */ - public void populateFFMPRecord(boolean isProductLoad, String siteKey, + public void populateFFMPRecord(String siteKey, FFMPRecord ffmpRec, String source, String phuc) throws Exception { - FFMPLoadRecord flr = new FFMPLoadRecord(isProductLoad, siteKey, + FFMPLoadRecord flr = new FFMPLoadRecord(siteKey, ffmpRec, source, phuc); flr.run(); } @@ -481,8 +461,8 @@ public class FFMPMonitor extends ResourceMonitor { if (!uris.contains(dataUri)) { try { SourceXML sourceXML = fscm.getSource(source); - FFMPRecord ffmpRec = populateFFMPRecord(true, dataUri, - siteKey, source, phuc); + FFMPRecord ffmpRec = populateFFMPRecord(dataUri, siteKey, + source, phuc); File loc = HDF5Util.findHDF5Location(ffmpRec); IDataStore dataStore = DataStoreFactory.getDataStore(loc); @@ -734,8 +714,6 @@ public class FFMPMonitor extends ResourceMonitor { FFMPRecord record = siteDataMap.get(siteKey).getSourceData(sourceName) .getRecord(); - String guidSrc = FFMPConfig.getInstance().getFFMPConfigData() - .getGuidSrc(); if ((record != null) && (record.getBasinData(phuc).getBasins().size() > 0)) { @@ -754,7 +732,8 @@ public class FFMPMonitor extends ResourceMonitor { ProductRunXML productRun = getRunConfig().getProduct( siteKey); - + String guidSrc = FFMPConfig.getInstance() + .getFFMPConfigData().getGuidSrc(); for (SourceXML source : productRun.getGuidanceSources( product, guidSrc)) { if (siteDataMap.get(siteKey) @@ -762,7 +741,7 @@ public class FFMPMonitor extends ResourceMonitor { .hasLoadedAnyUris()) { continue; } else { - populateFFMPRecord(product, siteKey, dataKey, + populateFFMPRecord(siteKey, dataKey, source.getSourceName(), ptime, phuc, retrieveNew); } @@ -771,8 +750,8 @@ public class FFMPMonitor extends ResourceMonitor { // FFG is the primary if if (!siteDataMap.get(siteKey).getSourceData(sourceName) .hasLoadedAnyUris()) { - populateFFMPRecord(product, siteKey, dataKey, - sourceName, ptime, phuc, retrieveNew); + populateFFMPRecord(siteKey, dataKey, sourceName, ptime, + phuc, retrieveNew); } } @@ -780,8 +759,8 @@ public class FFMPMonitor extends ResourceMonitor { .getRecord(); } else { - populateFFMPRecord(product, siteKey, dataKey, sourceName, - ptime, phuc, retrieveNew); + populateFFMPRecord(siteKey, dataKey, sourceName, ptime, phuc, + retrieveNew); } } else { // must populate for a different huc for all possible times @@ -801,20 +780,22 @@ public class FFMPMonitor extends ResourceMonitor { .getSourceType() .equals(FFMPSourceConfigurationManager.SOURCE_TYPE.GUIDANCE .getSourceType())) { + String guidSrc = FFMPConfig.getInstance() + .getFFMPConfigData().getGuidSrc(); for (SourceXML ffgSource : productRun .getGuidanceSources(product, guidSrc)) { - populateFFMPRecord(product, siteKey, dataKey, + populateFFMPRecord(siteKey, dataKey, ffgSource.getSourceName(), ptime, phuc, retrieveNew); } } else { - populateFFMPRecord(product, siteKey, dataKey, + populateFFMPRecord(siteKey, dataKey, sourceName, ptime, phuc, retrieveNew); } } } else { - populateFFMPRecord(product, siteKey, dataKey, sourceName, + populateFFMPRecord(siteKey, dataKey, sourceName, ptime, phuc, retrieveNew); } } else { @@ -828,8 +809,8 @@ public class FFMPMonitor extends ResourceMonitor { SOURCE_TYPE.GUIDANCE.getSourceType())) { sourceName = sourcexml.getDisplayName(); } else { - populateFFMPRecord(product, siteKey, dataKey, sourceName, - ptime, phuc, retrieveNew); + populateFFMPRecord(siteKey, dataKey, sourceName, ptime, + phuc, retrieveNew); } } @@ -842,21 +823,6 @@ public class FFMPMonitor extends ResourceMonitor { } - /** - * Sort by DataTime - * - * @author dhladky - * - */ - public class SortByDataTime implements Comparator { - - @Override - public int compare(DataTime o1, DataTime o2) { - - return o1.compareTo(o2); - } - } - /** * gets the wfo * @@ -883,21 +849,13 @@ public class FFMPMonitor extends ResourceMonitor { */ public FIELDS getField(String sourceName) { - String sfield = getSourceConfig().getSourceType(sourceName) - .getSourceType().toLowerCase(); - FIELDS myField = null; - if (sfield.equals(FFMPRecord.FIELDS.QPE.getFieldName())) { - myField = FFMPRecord.FIELDS.QPE; - } else if (sfield.equals(FFMPRecord.FIELDS.RATE.getFieldName())) { - myField = FFMPRecord.FIELDS.RATE; - } else if (sfield.equals(FFMPRecord.FIELDS.QPF.getFieldName())) { - myField = FFMPRecord.FIELDS.QPF; - } else if (sfield.equals(FFMPRecord.FIELDS.GUIDANCE.getFieldName())) { - myField = FFMPRecord.FIELDS.GUIDANCE; - } else if (sfield.equals("gage")) { - myField = FFMPRecord.FIELDS.VIRTUAL; + String sourceType = getSourceConfig().getSource(sourceName) + .getSourceType(); + if (sourceType.equalsIgnoreCase(SOURCE_TYPE.GAGE.name())) { + return FFMPRecord.FIELDS.VIRTUAL; + } else { + return FFMPRecord.FIELDS.valueOf(sourceType); } - return myField; } /** @@ -933,10 +891,7 @@ public class FFMPMonitor extends ResourceMonitor { } - public void launchSplash(String siteKey) { - - final String fsiteKey = siteKey; - + public void launchSplash(final String siteKey) { VizApp.runAsync(new Runnable() { @Override public void run() { @@ -948,7 +903,7 @@ public class FFMPMonitor extends ResourceMonitor { ffmpSplash.open(); // latch int count = 0; - while (!getTemplates(fsiteKey).done) { + while (!getTemplates(siteKey).done) { try { count++; @@ -1110,7 +1065,7 @@ public class FFMPMonitor extends ResourceMonitor { System.gc(); } - public ArrayList getResourceListenerList() { + public List getResourceListenerList() { return resourceListeners; } @@ -1327,13 +1282,13 @@ public class FFMPMonitor extends ResourceMonitor { * @param retrieveNew * @return */ - public HashMap getGuidanceRecords(ProductXML product, + public Map getGuidanceRecords(ProductXML product, String siteKey, Date date, String phuc, boolean retrieveNew) { - HashMap guidRecs = new HashMap(); + Map guidRecs = new HashMap(); ProductRunXML productRun = FFMPRunConfigurationManager.getInstance() .getProduct(siteKey); - ArrayList guidTypes = productRun.getGuidanceTypes(product); + List guidTypes = productRun.getGuidanceTypes(product); for (String type : guidTypes) { @@ -1520,9 +1475,8 @@ public class FFMPMonitor extends ResourceMonitor { * @param sourceName * @return */ - public long getSourceTimeWindow(String sourceName, String siteKey) { - return getSourceConfig().getSource(sourceName).getExpirationMinutes( - siteKey) * 60 * 1000; + private long getSourceTimeWindow(SourceXML source, String siteKey) { + return source.getExpirationMinutes(siteKey) * 60 * 1000; } /** @@ -1531,10 +1485,10 @@ public class FFMPMonitor extends ResourceMonitor { * @param sourceName * @return */ - public FFMPTimeWindow getTimeWindow(String sourceName, Date date, + public FFMPTimeWindow getTimeWindow(SourceXML source, Date date, String siteKey) { FFMPTimeWindow window = new FFMPTimeWindow(); - long lwindow = getSourceTimeWindow(sourceName, siteKey); + long lwindow = getSourceTimeWindow(source, siteKey); window.setAfterTime(new Date(date.getTime() - lwindow)); window.setBeforeTime(new Date(date.getTime() + lwindow)); @@ -1730,11 +1684,11 @@ public class FFMPMonitor extends ResourceMonitor { * @param barrierTime * @param phuc */ - public void processUri(boolean isProductLoad, String uri, String siteKey, + public void processUri(String uri, String siteKey, String sourceName, Date barrierTime, String phuc) { if (uri != null) { try { - FFMPRecord record = populateFFMPRecord(isProductLoad, uri, + FFMPRecord record = populateFFMPRecord(uri, siteKey, sourceName, phuc); if (record != null) { record.getBasinData(phuc).loadNow(); @@ -1759,10 +1713,8 @@ public class FFMPMonitor extends ResourceMonitor { * @param sourceName */ public void processUris(NavigableMap> uriMap, - boolean isProductLoad, String siteKey, String sourceName, - Date barrierTime, String phuc) { - - FFMPProcessUris processor = new FFMPProcessUris(uriMap, isProductLoad, + String siteKey, String sourceName, Date barrierTime, String phuc) { + FFMPProcessUris processor = new FFMPProcessUris(uriMap, siteKey, sourceName, barrierTime, phuc); processor.run(); } @@ -2226,8 +2178,8 @@ public class FFMPMonitor extends ResourceMonitor { final String fsiteKey; - public FFMPLoadRecord(boolean isProductLoad, String siteKey, - FFMPRecord ffmpRec, String source, String huc) throws Exception { + public FFMPLoadRecord(String siteKey, FFMPRecord ffmpRec, + String source, String huc) throws Exception { this.fffmpRec = ffmpRec; this.fsource = source; this.fsiteKey = siteKey; @@ -2318,7 +2270,6 @@ public class FFMPMonitor extends ResourceMonitor { final NavigableMap> furiMap; - final boolean fisProductLoad; final String fsiteKey; @@ -2329,13 +2280,10 @@ public class FFMPMonitor extends ResourceMonitor { final String fhuc; public FFMPProcessUris(NavigableMap> uriMap, - boolean isProductLoad, String siteKey, String sourceName, - Date barrierTime, String phuc) { - + String siteKey, String sourceName, Date barrierTime, String phuc) { this.furiMap = uriMap; this.fsiteKey = siteKey; this.fbarrierTime = barrierTime; - this.fisProductLoad = isProductLoad; this.fsourceName = sourceName; this.fhuc = phuc; @@ -2363,8 +2311,8 @@ public class FFMPMonitor extends ResourceMonitor { .after(fbarrierTime) || isGuidance) { try { - record = populateFFMPRecord(fisProductLoad, - uri, fsiteKey, fsourceName, fhuc); + record = populateFFMPRecord(uri, fsiteKey, + fsourceName, fhuc); if (record != null) { populatedRecords.add(record); if (source != null) { diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FFMPConfig.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FFMPConfig.java index 992245534c..183d18dec8 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FFMPConfig.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FFMPConfig.java @@ -21,7 +21,10 @@ package com.raytheon.uf.viz.monitor.ffmp.ui.dialogs; import java.io.File; import java.util.ArrayList; +import java.util.EnumMap; import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.xml.bind.JAXB; @@ -57,6 +60,7 @@ import com.raytheon.uf.viz.monitor.ffmp.xml.FFMPTableColumnXML; * getting ColorCell and ReverseFilter * Apr 12, 2013 1902 mpduff Speed up cell coloring. * Apr 15. 2013 1890 dhladky Added Mikes fix for singleton. + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * * @@ -111,14 +115,16 @@ public class FFMPConfig { private final Color vgbColor = new Color(Display.getDefault(), 196, 137, 250); - private final String defaultConfigXml = "DefaultFFMPconfig_basin.xml"; + private static final String DEFAULT_CONFIG_XML = "ffmp" + + IPathManager.SEPARATOR + "guiConfig" + IPathManager.SEPARATOR + + "DefaultFFMPconfig_basin.xml"; /** * Used for looking up data - NOT for editing. */ - private HashMap threshMgrMap; + private Map threshMgrMap; - private HashMap thresholdLookup; + private Map thresholdLookup; private AttributesDlgData attrData = null; @@ -133,7 +139,8 @@ public class FFMPConfig { } private void init() { - threshMgrMap = new HashMap(); + threshMgrMap = new EnumMap( + ThreshColNames.class); thresholdLookup = new HashMap(); @@ -141,7 +148,7 @@ public class FFMPConfig { thresholdLookup.put(threshColName.name(), threshColName); } - readDefaultFFMPConfigBasin(defaultConfigXml); + readDefaultFFMPConfigBasin(); } public boolean isThreshold(String colName) { @@ -182,7 +189,7 @@ public class FFMPConfig { } public void loadDefaultConfig() { - readDefaultFFMPConfigBasin(defaultConfigXml); + readDefaultFFMPConfigBasin(); } private void readNewFFMPConfigBasin(LocalizationFile xmlFileName) { @@ -198,19 +205,14 @@ public class FFMPConfig { } } - private void readDefaultFFMPConfigBasin(String xmlFileName) { + private void readDefaultFFMPConfigBasin() { ffmpCfgBasin = null; - String fs = String.valueOf(File.separatorChar); try { IPathManager pm = PathManagerFactory.getPathManager(); - String path = null; - File file = pm.getStaticFile("ffmp" + fs + "guiConfig" + fs - + xmlFileName); - if (file != null) { - path = file.getAbsolutePath(); - } else { + File file = pm.getStaticFile(DEFAULT_CONFIG_XML); + if (file == null) { // Should never get here since there is a baseline version of // the file. statusHandler.handle(Priority.ERROR, @@ -218,9 +220,9 @@ public class FFMPConfig { return; } - System.out.println("Path Config FFMP: " + path); + System.out.println("Path Config FFMP: " + file.getAbsolutePath()); - ffmpCfgBasin = JAXB.unmarshal(new File(path), + ffmpCfgBasin = JAXB.unmarshal(file, FFMPConfigBasinXML.class); createThresholdManager(); @@ -333,15 +335,15 @@ public class FFMPConfig { private void createThresholdManager() { threshMgrMap.clear(); - ArrayList tableColData = ffmpCfgBasin + List tableColData = ffmpCfgBasin .getTableColumnData(); - for (ThreshColNames threshName : ThreshColNames.values()) { - for (FFMPTableColumnXML tcXML : tableColData) { - if (threshName.name().compareTo(tcXML.getColumnName()) == 0) { - ThresholdManager threshMgr = new ThresholdManager(tcXML); - threshMgrMap.put(threshName, threshMgr); - } + for (FFMPTableColumnXML tcXML : tableColData) { + ThreshColNames colNames = thresholdLookup + .get(tcXML.getColumnName()); + if (colNames != null) { + ThresholdManager threshMgr = new ThresholdManager(tcXML); + threshMgrMap.put(colNames, threshMgr); } } } diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java index 42fda1468e..2cdba78f0d 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java @@ -117,6 +117,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * Feb 28, 2013 1729 dhladky Adjusted the way in which the dialog load thread rejoins the main GUI thread. * Mar 01, 2013 13228 gzhang Adding field rowName for VGB in County * Mar 24, 2013 1818 mpduff Fixed Attributes dialog on multiple opens, needed an isDisposed check. + * Apr 25, 2013 1902 mpduff Fixed Thresholds dialog on multiple opens, needed an isDisposed check. * * * @author lvenable @@ -319,8 +320,8 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements dataLoadFont.dispose(); timeDurFont.dispose(); - //FFMPConfig.getInstance().disposeResources(); - //FFMPConfig.unloadConfig(); + // FFMPConfig.getInstance().disposeResources(); + // FFMPConfig.unloadConfig(); if (refreshColor != null) { refreshColor.dispose(); @@ -1313,18 +1314,18 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements attributeDlg = new AttributesDlg(shell, resource, attrData, this); attributeDlg.open(); } else { - attributeDlg.bringToTop(); + attributeDlg.bringToTop(); } } private void displayThresholdsDialog(ThreshColNames colName) { - if (attrThreshDlg == null) { + if (attrThreshDlg == null || attrThreshDlg.isDisposed()) { attrThreshDlg = new AttributeThresholdDlg(shell, colName, this); attrThreshDlg.open(); } else { - attrThreshDlg.bringToTop(); + attrThreshDlg.bringToTop(); } - + attrThreshDlg.newThreshold(colName); } @@ -2110,17 +2111,17 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements shell.pack(); } - String prefix = null; + String prefix = null; - if (status.getLoaderType() == LOADER_TYPE.SECONDARY) { - prefix = " Secondary Data Load: "; - } else if (status.getLoaderType() == LOADER_TYPE.TERTIARY) { - prefix = " Tertiary Data Load: "; - } else if (status.getLoaderType() == LOADER_TYPE.GENERAL) { - prefix = " General Data Load: "; - } else { - prefix = " Tertiary Data Load: "; - } + if (status.getLoaderType() == LOADER_TYPE.SECONDARY) { + prefix = " Secondary Data Load: "; + } else if (status.getLoaderType() == LOADER_TYPE.TERTIARY) { + prefix = " Tertiary Data Load: "; + } else if (status.getLoaderType() == LOADER_TYPE.GENERAL) { + prefix = " General Data Load: "; + } else { + prefix = " Tertiary Data Load: "; + } if (status.isDone() == false) { dataLoadingLbl.setText(prefix + status.getMessage()); diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPColorUtils.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPColorUtils.java index 3d70cc4fc4..779a939b99 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPColorUtils.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPColorUtils.java @@ -20,6 +20,7 @@ package com.raytheon.uf.viz.monitor.ffmp.ui.rsc; import java.util.ArrayList; +import java.util.List; import java.util.TreeMap; import org.eclipse.swt.graphics.RGB; @@ -50,6 +51,8 @@ import com.raytheon.viz.core.style.image.ImagePreferences; * ------------ ---------- ----------- -------------------------- * 08/29/09 2152 D. Hladky Initial release * 05/21/12 DR 14833 G. Zhang Error handling for invalid cmap + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. + * * * * @author dhladky @@ -155,18 +158,15 @@ public class FFMPColorUtils { * @return */ private static RGB convert(Color color) { - int blue; - int green; - int red; - RGB returnColor = null; + if (color != null) { - blue = new Float(color.getBlue() * 255.0).intValue(); - green = new Float(color.getGreen() * 255.0).intValue(); - red = new Float(color.getRed() * 255.0).intValue(); - returnColor = new RGB(red, green, blue); + int blue = (int) (color.getBlue() * 255.0f); + int green = (int) (color.getGreen() * 255.0f); + int red = (int) (color.getRed() * 255.0f); + return new RGB(red, green, blue); } - return returnColor; + return null; } /** @@ -186,37 +186,31 @@ public class FFMPColorUtils { return rgb; } - double val2 = (Math.round(valueArg * 100.0)) / 100.0; - Double value = val2; + double value = (Math.round(valueArg * 100.0)) / 100.0; - if (value < 0.005 && field != FIELDS.DIFF) { - ret = 0; - } else if (field == FIELDS.DIFF) { - - Color color = colormapparams.getColorByValue(value.floatValue()); + + if (field == FIELDS.DIFF) { + Color color = colormapparams.getColorByValue((float) value); rgb = convert(color); return rgb; - } else { - if (value < 0.0) { - ret = 0; - } else { - Color color = colormapparams - .getColorByValue(value.floatValue()); + } else if (value >= 0.005) { + Color color = colormapparams.getColorByValue((float) value); rgb = convert(color); return rgb; - } } - if (ret >= getColorMap().getColors().size()) { - ret = getColorMap().getColors().size() - 1; + List colors = getColorMap().getColors(); + + if (ret >= colors.size()) { + ret = colors.size() - 1; } if (ret < 0) { ret = 0; } - rgb = convert(getColorMap().getColors().get(ret)); + rgb = convert(colors.get(ret)); return rgb; } diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java index ed4b16d20c..ac41468f79 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java @@ -20,9 +20,11 @@ package com.raytheon.uf.viz.monitor.ffmp.ui.rsc; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map; import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasin; import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasinData; @@ -37,7 +39,6 @@ import com.raytheon.uf.common.dataplugin.ffmp.FFMPVirtualGageBasin; import com.raytheon.uf.common.dataplugin.ffmp.FFMPVirtualGageBasinMetaData; import com.raytheon.uf.common.monitor.config.FFFGDataMgr; import com.raytheon.uf.common.monitor.config.FFMPRunConfigurationManager; -import com.raytheon.uf.common.monitor.config.FFMPSourceConfigurationManager; import com.raytheon.uf.common.monitor.xml.DomainXML; import com.raytheon.uf.common.monitor.xml.ProductRunXML; import com.raytheon.uf.common.monitor.xml.ProductXML; @@ -72,9 +73,11 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FfmpTableConfigData; * feb 20, 2013 1635 dhladky Fixed multi guidance displays * Feb 28, 2013 1729 dhladky General enhancements for speed. * Apr 12, 2013 1902 mpduff Code Cleanup. - * Apr 15, 2013 1890 dhladky Added another constant fix. - * Apr 15, 2013 1911 dhladky Fixed forced FFG for centered aggregates. - * Apr 24, 2013 1946 mpduff Fixed FFFG value for ALL when an aggregate is forced + * Apr 15, 2013 1890 dhladky Added another constant fix. + * Apr 15, 2013 1911 dhladky Fixed forced FFG for centered aggregates. + * Apr 24, 2013 1946 mpduff Fixed FFFG value for ALL when an aggregate is forced + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. + * * * * @author dhladky @@ -87,83 +90,59 @@ public class FFMPDataGenerator { private static final IUFStatusHandler statusHandler = UFStatus .getHandler(FFMPDataGenerator.class); - private final String ALL = FFMPRecord.ALL; + private static final String ALL = FFMPRecord.ALL; - private final String NA = "NA"; + private static final String NA = "NA"; private final String siteKey; - private final String dataKey; - - private final ProductXML product; - private final Date paintRefTime; - private final Date tableTime; private final Object centeredAggregationKey; private final String huc; - private final ArrayList domains; private final double sliderTime; private boolean isWorstCase = false; - FFMPConfig ffmpCfg = FFMPConfig.getInstance(); + private FFMPTemplates ft = null; - FFMPTemplates ft = null; + private FFMPResource resource = null; - FFMPResource resource = null; + private FFMPMonitor monitor = null; - FFMPMonitor monitor = null; + private FFMPBasinData qpeBasin = null; - FFMPBasinData qpeBasin = null; + private FFMPBasinData qpfBasin = null; - FFMPBasinData qpfBasin = null; + private FFMPBasinData rateBasin = null; - FFMPBasinData rateBasin = null; + private Map guidBasins = null; - HashMap guidBasins = null; + private FFMPBasinData virtualBasin = null; - FFMPBasinData virtualBasin = null; + private Map guidRecords = null; - FFMPRecord rateRecord = null; + private FFMPRecord baseRec = null; - FFMPRecord qpeRecord = null; + private boolean isRate = false; - FFMPRecord qpfRecord = null; - - HashMap guidRecords = null; - - FFMPRecord virtualRecord = null; - - FFMPRecord baseRec = null; - - SourceXML primarySource = null; - - FFFGDataMgr dman = null; - - boolean isRate = false; - - long expirationTime = 0l; + private long expirationTime = 0l; private String[] cwaArr = null; - private HashMap forceUtils = null; + private Map forceUtils = null; private FfmpTableConfigData ffmpTableCfgData = null; public FFMPDataGenerator(FFMPMonitor monitor, FFMPResource resource) { siteKey = resource.getSiteKey(); - dataKey = resource.getDataKey(); - product = resource.getProduct(); paintRefTime = resource.getPaintTime().getRefTime(); - tableTime = resource.getTableTime(); centeredAggregationKey = resource.centeredAggregationKey; huc = resource.getHuc(); - domains = resource.getDomains(); sliderTime = resource.getTime(); isWorstCase = resource.isWorstCase(); @@ -171,10 +150,11 @@ public class FFMPDataGenerator { this.resource = resource; this.monitor = monitor; this.ft = monitor.getTemplates(siteKey); - this.primarySource = resource.getResourceData().getPrimarySourceXML(); + SourceXML primarySource = resource.getResourceData() + .getPrimarySourceXML(); this.isRate = primarySource.isRate(); - this.expirationTime = primarySource.getExpirationMinutes(resource - .getSiteKey()) * TimeUtil.MILLIS_PER_MINUTE; + this.expirationTime = primarySource.getExpirationMinutes(siteKey) + * TimeUtil.MILLIS_PER_MINUTE; ffmpTableCfgData = tableConfig.getTableConfigData(siteKey); } @@ -195,94 +175,53 @@ public class FFMPDataGenerator { try { FIELDS field = getBaseField(); - if (field != null) { - if (baseRec != null) { - FFMPBasinData fbd = null; - if (centeredAggregationKey != null) { - fbd = baseRec.getBasinData(ALL); - } else { - fbd = baseRec.getBasinData(huc); - } + if (field == null || baseRec == null) { + return tData; + } + FFMPBasinData fbd = null; + if (centeredAggregationKey != null) { + fbd = baseRec.getBasinData(ALL); + } else { + fbd = baseRec.getBasinData(huc); + } - if (!fbd.getBasins().isEmpty()) { - if ((centeredAggregationKey == null) || huc.equals(ALL)) { - // System.out.println(fbd.getBasins().keySet().size() - // + " rows in the table"); - for (Long key : fbd.getBasins().keySet()) { - if (huc.equals(ALL)) { - for (DomainXML domain : domains) { + List domains = resource.getDomains(); + if (!fbd.getBasins().isEmpty()) { + if ((centeredAggregationKey == null) || huc.equals(ALL)) { + // System.out.println(fbd.getBasins().keySet().size() + // + " rows in the table"); + for (Long key : fbd.getBasins().keySet()) { + if (huc.equals(ALL)) { + FFMPBasinMetaData fmdb = ft.getBasin(siteKey, key); + if (fmdb == null) { + continue; + } - FFMPBasinMetaData fmdb = ft.getBasin( - siteKey, key); - String cwa = domain.getCwa(); + for (DomainXML domain : domains) { + String cwa = domain.getCwa(); - if (fmdb == null) { - continue; - } - - if ((cwa.equals(fmdb.getCwa())) - || (domain.isPrimary() && fmdb - .isPrimaryCwa())) { - try { - setFFMPRow(fbd.get(key), tData, - false, cwa); - } catch (Exception e) { - statusHandler.handle( - Priority.PROBLEM, + if ((cwa.equals(fmdb.getCwa())) + || (domain.isPrimary() && fmdb + .isPrimaryCwa())) { + try { + setFFMPRow(fbd.get(key), tData, false, + cwa); + } catch (Exception e) { + statusHandler + .handle(Priority.PROBLEM, "Couldn't create table row" + e); - } - if (virtualBasin != null) { - for (Long id : ft - .getVirtualGageBasinLookupIds( - siteKey, - key, - huc, - resource.basinTableDlg - .getRowName())) { - try { - setFFMPRow( - virtualBasin - .get(id), - tData, true, - domain.getCwa()); - } catch (Exception e) { - statusHandler - .handle(Priority.PROBLEM, - "Couldn't create table row" - + e); - } - } - } - } } - - } else { - /* - * make sure at least one basin in the agg - * is in the CWA - */ - - ArrayList pfafs = ft - .getAggregatePfafs(key, siteKey, - huc); - - boolean isVGB = false; - if (ft.checkVGBsInAggregate(key, siteKey, - huc)) { - isVGB = true; - } - - if (!pfafs.isEmpty()) { - - FFMPBasinMetaData fmdb = ft - .getBasinInDomains(siteKey, - domains, pfafs); - - if (fmdb != null) { + if (virtualBasin != null) { + for (Long id : ft + .getVirtualGageBasinLookupIds( + siteKey, key, huc, + resource.basinTableDlg + .getRowName())) { try { - setFFMPRow(fbd.get(key), tData, - isVGB, null); + setFFMPRow( + virtualBasin.get(id), + tData, true, cwa); } catch (Exception e) { statusHandler.handle( Priority.PROBLEM, @@ -293,77 +232,99 @@ public class FFMPDataGenerator { } } } - } - // show pfafs in aggregation - else { - for (Long key : resource - .getCenteredAggregatePfafs()) { - FFMPBasinMetaData fmdb = ft.getBasin(siteKey, - key); + } else { + /* + * make sure at least one basin in the agg is in the + * CWA + */ + + List pfafs = ft.getAggregatePfafs(key, + siteKey, huc); + + boolean isVGB = false; + if (ft.checkVGBsInAggregate(key, siteKey, huc)) { + isVGB = true; + } + + if (!pfafs.isEmpty()) { + + FFMPBasinMetaData fmdb = ft.getBasinInDomains( + siteKey, domains, pfafs); if (fmdb != null) { - for (DomainXML domain : domains) { + try { + setFFMPRow(fbd.get(key), tData, isVGB, + null); + } catch (Exception e) { + statusHandler + .handle(Priority.PROBLEM, + "Couldn't create table row" + + e); + } + } + } + } + } + } + // show pfafs in aggregation + else { + for (Long key : resource.getCenteredAggregatePfafs()) { - if ((domain.getCwa().equals(fmdb - .getCwa())) - || (domain.isPrimary() && fmdb - .isPrimaryCwa())) { + FFMPBasinMetaData fmdb = ft.getBasin(siteKey, key); - setFFMPRow(fbd.get(key), tData, - false, null); + if (fmdb != null) { + for (DomainXML domain : domains) { - if (virtualBasin != null) { - for (Long id : ft - .getVirtualGageBasinLookupIds( - siteKey, - key, - huc, - resource.basinTableDlg - .getRowName())) { - try { - setFFMPRow( - virtualBasin - .get(id), - tData, true, - null); - } catch (Exception e) { - statusHandler - .handle(Priority.PROBLEM, - "Couldn't create table row" - + e); - } - } + if ((domain.getCwa().equals(fmdb.getCwa())) + || (domain.isPrimary() && fmdb + .isPrimaryCwa())) { + + setFFMPRow(fbd.get(key), tData, false, null); + + if (virtualBasin != null) { + for (Long id : ft + .getVirtualGageBasinLookupIds( + siteKey, key, huc, + resource.basinTableDlg + .getRowName())) { + try { + setFFMPRow( + virtualBasin.get(id), + tData, true, null); + } catch (Exception e) { + statusHandler.handle( + Priority.PROBLEM, + "Couldn't create table row" + + e); } } } } } } - tData.sortData(); } } + tData.sortData(); } } catch (Exception e) { statusHandler.handle(Priority.PROBLEM, "Failed to load FFMP table data!", e); } - return tData; } private void setFFMPRow(FFMPBasin cBasin, FFMPTableData tData, boolean isVGB, String domain) { try { + String pfafToTest = null; if (cBasin instanceof FFMPVirtualGageBasin) { - if (tData.containsPfaf(((FFMPVirtualGageBasin) cBasin).getLid() - .toString())) { - return; - } + pfafToTest = ((FFMPVirtualGageBasin) cBasin).getLid(); } else { - if (tData.containsPfaf(cBasin.getPfaf().toString())) { - return; - } + pfafToTest = cBasin.getPfaf().toString(); + } + if (tData.containsPfaf(pfafToTest)) { + return; } } catch (Exception e) { return; @@ -386,31 +347,28 @@ public class FFMPDataGenerator { } if (cBasin instanceof FFMPVirtualGageBasin) { - rowField = FIELDS.VIRTUAL; - String lid = ((FFMPVirtualGageBasin) cBasin).getLid(); + FFMPVirtualGageBasin vgBasin = (FFMPVirtualGageBasin) cBasin; + + String lid = vgBasin.getLid(); if (lid != null) { StringBuilder sb = new StringBuilder(lid); // in this special case it is actually the LID - trd.setPfaf(((FFMPVirtualGageBasin) cBasin).getLid()); + trd.setPfaf(lid); FFMPVirtualGageBasinMetaData fvgmbd = ft - .getVirtualGageBasinMetaData(siteKey, - ((FFMPVirtualGageBasin) cBasin).getLid()); + .getVirtualGageBasinMetaData(siteKey, lid); FFMPBasinMetaData metabasin = ft.getBasin(siteKey, fvgmbd.getParentPfaf()); Long parentBasinPfaf = fvgmbd.getParentPfaf(); - if (fvgmbd != null) { + mouseOverText = metabasin.getBasinId() + "\n" + lid + "-" + + fvgmbd.getName(); - mouseOverText = metabasin.getBasinId() + "\n" - + fvgmbd.getLid() + "-" + fvgmbd.getName(); - - if (!huc.equals(ALL)) { - sb.append("-").append(fvgmbd.getName()); - } + if (!huc.equals(ALL)) { + sb.append("-").append(fvgmbd.getName()); } trd.setTableCellData(0, @@ -421,29 +379,29 @@ public class FFMPDataGenerator { || (centeredAggregationKey != null)) { if (!cBasin.getValues().isEmpty()) { - rate = ((FFMPVirtualGageBasin) cBasin) - .getValue(paintRefTime); - } - trd.setTableCellData(1, new FFMPTableCellData(FIELDS.RATE, - rate)); - - if (!cBasin.getValues().isEmpty()) { + rate = vgBasin.getValue(paintRefTime); if (sliderTime > 0.00) { - qpe = cBasin.getAccumValue(monitor.getQpeWindow() - .getAfterTime(), monitor.getQpeWindow() - .getBeforeTime(), expirationTime, isRate); + FFMPTimeWindow window = monitor.getQpeWindow(); + qpe = cBasin.getAccumValue(window.getAfterTime(), + window.getBeforeTime(), expirationTime, + isRate); } else { qpe = 0.0f; } } + + trd.setTableCellData(1, new FFMPTableCellData(FIELDS.RATE, + rate)); trd.setTableCellData(2, new FFMPTableCellData(FIELDS.QPE, qpe)); - if ((qpfBasin != null) - && (qpfBasin.get(parentBasinPfaf) != null)) { - qpf = qpfBasin.get(parentBasinPfaf).getAverageValue( - monitor.getQpfWindow().getAfterTime(), - monitor.getQpfWindow().getBeforeTime()); + if (qpfBasin != null) { + FFMPBasin basin = qpfBasin.get(parentBasinPfaf); + if (basin != null) { + FFMPTimeWindow window = monitor.getQpfWindow(); + qpf = basin.getAverageValue(window.getAfterTime(), + window.getBeforeTime()); + } } trd.setTableCellData(3, new FFMPTableCellData(FIELDS.QPF, qpf)); @@ -451,113 +409,23 @@ public class FFMPDataGenerator { // run over each guidance type int i = 0; for (String guidType : guidBasins.keySet()) { - List pfafList = new ArrayList(); - List forcedPfafs = new ArrayList(); guidance = Float.NaN; - boolean forced = false; - Float diffValue = Float.NaN; - Float ratioValue = Float.NaN; FFFGForceUtil forceUtil = forceUtils.get(guidType); forceUtil.setSliderTime(sliderTime); - FFMPBasinData guidBasin = guidBasins.get(guidType); - - if ((guidBasin != null) - && ((FFMPGuidanceBasin) guidBasin - .get(parentBasinPfaf) != null)) { - FFMPGuidanceBasin ffmpGuidBasin = ((FFMPGuidanceBasin) guidBasin - .get(parentBasinPfaf)); - - // If aggregate, get basins within the aggregate - if (cBasin.getAggregated()) { - if (domain == null) { - pfafList = ft.getAggregatePfafs( - cBasin.getPfaf(), siteKey, huc); - } else if (!domain.equals(NA)) { - if (!huc.equals(ALL)) { - pfafList = ft - .getAggregatePfafsByDomain( - parentBasinPfaf, - siteKey, domain, huc); - } - } else { - pfafList = ft.getAggregatePfafsByDomain( - parentBasinPfaf, siteKey, domain, - huc); - pfafList.add(ft.getAggregatedPfaf( - cBasin.getPfaf(), siteKey, huc)); - } - } - - FFFGDataMgr fdm = FFFGDataMgr.getInstance(); - - if (fdm.isForcingConfigured()) { - FFMPBasin parentBasin = baseRec.getBasinData( - ALL).get(parentBasinPfaf); - forceUtil.calculateForcings(domain, ft, - parentBasin); - forcedPfafs = forceUtil.getForcedPfafList(); - forced = forceUtil.isForced(); - } - - if ((!forcedPfafs.isEmpty()) && forced - && centeredAggregationKey == null - && !pfafList.isEmpty()) { - // Recalculate the guidance using the forced - // value(s) - guidance = guidRecords - .get(guidType) - .getBasinData(ALL) - .getAverageGuidanceValue( - pfafList, - resource.getGuidanceInterpolators() - .get(guidType), - guidance, - forcedPfafs, - resource.getGuidSourceExpiration(guidType)); - } else if (!forcedPfafs.isEmpty() - && centeredAggregationKey == null - && !pfafList.isEmpty()) { - guidance = guidRecords - .get(guidType) - .getBasinData(ALL) - .getAverageGuidanceValue( - pfafList, - resource.getGuidanceInterpolators() - .get(guidType), - Float.NaN, - forcedPfafs, - resource.getGuidSourceExpiration(guidType)); - forced = true; - } else if (!pfafList.isEmpty() - && centeredAggregationKey == null) { - guidance = guidRecords - .get(guidType) - .getBasinData(ALL) - .getAverageGuidanceValue( - pfafList, - resource.getGuidanceInterpolators() - .get(guidType), - Float.NaN, - forcedPfafs, - resource.getGuidSourceExpiration(guidType)); - } else { - guidance = resource.getGuidanceValue( - ffmpGuidBasin, paintRefTime, guidType); - - if (guidance < 0.0f) { - guidance = Float.NaN; - } - } - - trd.setTableCellData(i + 4, new FFMPTableCellData( - FIELDS.GUIDANCE, guidance, forced)); + FFMPTableCellData guidCellData = getGuidanceCellData( + cBasin, domain, guidType, parentBasinPfaf); + if (guidCellData == null) { + guidCellData = new FFMPTableCellData( + FIELDS.GUIDANCE, Float.NaN); } else { - trd.setTableCellData(i + 4, new FFMPTableCellData( - FIELDS.GUIDANCE, Float.NaN)); + guidance = guidCellData.getValueAsFloat(); } + trd.setTableCellData(i + 4, guidCellData); + float ratioValue = Float.NaN; + float diffValue = Float.NaN; // If guidance is NaN then it cannot be > 0 if (!qpe.isNaN() && (guidance > 0.0f)) { ratioValue = FFMPUtils.getRatioValue(qpe, guidance); @@ -581,167 +449,73 @@ public class FFMPDataGenerator { displayName = getDisplayName(cBasin); if (displayName != null) { - String cbasinPfaf = cBasin.getPfaf().toString(); - StringBuilder sb = new StringBuilder(cbasinPfaf); + long cBasinPfaf = cBasin.getPfaf(); + String cBasinPfafStr = Long.toString(cBasinPfaf); + StringBuilder sb = new StringBuilder(cBasinPfafStr); sb.append("\n").append(displayName); - trd.setPfaf(cbasinPfaf); + trd.setPfaf(cBasinPfafStr); trd.setTableCellData(0, new FFMPTableCellData(rowField, displayName, sb.toString())); if (!isWorstCase || huc.equals(ALL) || (centeredAggregationKey != null)) { - if ((rateBasin != null) - && (rateBasin.get(cBasin.getPfaf()) != null)) { - rate = rateBasin.get(cBasin.getPfaf()).getValue( - paintRefTime); + if (rateBasin != null) { + FFMPBasin basin = rateBasin.get(cBasinPfaf); + if (basin != null) { + rate = basin.getValue(paintRefTime); + } } trd.setTableCellData(1, new FFMPTableCellData(FIELDS.RATE, rate)); - if ((qpeBasin != null) - && (qpeBasin.get(cBasin.getPfaf()) != null)) { - qpe = qpeBasin.get(cBasin.getPfaf()).getAccumValue( - monitor.getQpeWindow().getAfterTime(), - monitor.getQpeWindow().getBeforeTime(), - expirationTime, isRate); + if (qpeBasin != null) { + FFMPBasin basin = qpeBasin.get(cBasinPfaf); + if (basin != null) { + FFMPTimeWindow window = monitor.getQpeWindow(); + qpe = basin.getAccumValue(window.getAfterTime(), + window.getBeforeTime(), expirationTime, + isRate); + } } + trd.setTableCellData(2, new FFMPTableCellData(FIELDS.QPE, qpe)); - if ((qpfBasin != null) - && (qpfBasin.get(cBasin.getPfaf()) != null)) { - - qpf = qpfBasin.get(cBasin.getPfaf()).getAverageValue( - monitor.getQpfWindow().getAfterTime(), - monitor.getQpfWindow().getBeforeTime()); - // qpf = getQPFValue(false, cBasin.getPfaf(), - // new ArrayList());/* DR13839 */ + if (qpfBasin != null) { + FFMPBasin basin = qpfBasin.get(cBasinPfaf); + if (basin != null) { + FFMPTimeWindow window = monitor.getQpfWindow(); + qpf = basin.getAverageValue(window.getAfterTime(), + window.getBeforeTime()); + } } + trd.setTableCellData(3, new FFMPTableCellData(FIELDS.QPF, qpf)); // run over each guidance type int i = 0; - Float ratioValue; - Float diffValue; for (String guidType : guidBasins.keySet()) { - List pfafList = new ArrayList(); - List forcedPfafs = new ArrayList(); guidance = Float.NaN; - boolean forced = false; - ratioValue = Float.NaN; - diffValue = Float.NaN; - FFFGForceUtil forceUtil = forceUtils.get(guidType); forceUtil.setSliderTime(sliderTime); - - FFMPBasinData guidBasin = guidBasins.get(guidType); - - if ((guidBasin != null) - && ((FFMPGuidanceBasin) guidBasin.get(cBasin - .getPfaf()) != null)) { - FFMPGuidanceBasin ffmpGuidBasin = ((FFMPGuidanceBasin) guidBasin - .get(cBasin.getPfaf())); - - // If aggregate, get basins within the aggregate - if (cBasin.getAggregated()) { - if (domain == null) { - pfafList = ft.getAggregatePfafs( - cBasin.getPfaf(), siteKey, huc); - } else if (!domain.equals(NA)) { - if (!huc.equals(ALL)) { - pfafList = ft - .getAggregatePfafsByDomain( - cBasin.getPfaf(), - siteKey, domain, huc); - } - } else { - pfafList = ft.getAggregatePfafsByDomain( - cBasin.getPfaf(), siteKey, domain, - huc); - pfafList.add(ft.getAggregatedPfaf( - cBasin.getPfaf(), siteKey, huc)); - } - } - - FFFGDataMgr fdm = FFFGDataMgr.getInstance(); - - if (fdm.isForcingConfigured()) { - forceUtil.calculateForcings(domain, ft, cBasin); - forcedPfafs = forceUtil.getForcedPfafList(); - forced = forceUtil.isForced(); - } - - if ((!forcedPfafs.isEmpty()) && forced - && centeredAggregationKey == null - && !pfafList.isEmpty()) { - // Recalculate the guidance using the forced - // value(s) - guidance = guidRecords - .get(guidType) - .getBasinData(ALL) - .getAverageGuidanceValue( - pfafList, - resource.getGuidanceInterpolators() - .get(guidType), - guidance, - forcedPfafs, - resource.getGuidSourceExpiration(guidType)); - } else if (!forcedPfafs.isEmpty() - && centeredAggregationKey == null - && !pfafList.isEmpty()) { - guidance = guidRecords - .get(guidType) - .getBasinData(ALL) - .getAverageGuidanceValue( - pfafList, - resource.getGuidanceInterpolators() - .get(guidType), - Float.NaN, - forcedPfafs, - resource.getGuidSourceExpiration(guidType)); - forced = true; - } else if (!pfafList.isEmpty() - && centeredAggregationKey == null) { - guidance = guidRecords - .get(guidType) - .getBasinData(ALL) - .getAverageGuidanceValue( - pfafList, - resource.getGuidanceInterpolators() - .get(guidType), - Float.NaN, - forcedPfafs, - resource.getGuidSourceExpiration(guidType)); - if (!forcedPfafs.isEmpty()) { - forced = true; - } - } else { - guidance = resource.getGuidanceValue( - ffmpGuidBasin, monitor.getQpeWindow() - .getBeforeTime(), guidType); - - if (guidance < 0.0f) { - guidance = Float.NaN; - } - } - - trd.setTableCellData(i + 4, new FFMPTableCellData( - FIELDS.GUIDANCE, guidance, forced)); - } else { + FFMPTableCellData guidCellData = getGuidanceCellData( + cBasin, domain, guidType, cBasinPfaf); + if (guidCellData == null) { // check for forcing even if no data are available guidance = getForcedAvg(forceUtil, domain, cBasin, guidType); - if (!guidance.isNaN()) { - forced = true; - } else { - forced = false; - } - - trd.setTableCellData(i + 4, new FFMPTableCellData( - FIELDS.GUIDANCE, guidance, forced)); + boolean forced = !guidance.isNaN(); + guidCellData = new FFMPTableCellData( + FIELDS.GUIDANCE, guidance, forced); + } else { + guidance = guidCellData.getValueAsFloat(); } + trd.setTableCellData(i + 4, guidCellData); + + float ratioValue = Float.NaN; + float diffValue = Float.NaN; // If guidance is NaN then it cannot be > 0 if (!qpe.isNaN() && (guidance > 0.0f)) { ratioValue = FFMPUtils.getRatioValue(qpe, guidance); @@ -763,6 +537,70 @@ public class FFMPDataGenerator { } } + private FFMPTableCellData getGuidanceCellData(FFMPBasin cBasin, + String domain, String guidType, Long parentBasinPfaf) { + long cBasinPfaf = cBasin.getPfaf(); + + FFMPBasinData guidBasin = guidBasins.get(guidType); + + FFMPGuidanceBasin ffmpGuidBasin = null; + if (guidBasin != null) { + ffmpGuidBasin = (FFMPGuidanceBasin) guidBasin.get(cBasinPfaf); + } + + if (ffmpGuidBasin == null) { + return null; + } + List pfafList = Collections.emptyList(); + List forcedPfafs = Collections.emptyList(); + boolean forced = false; + Float guidance = Float.NaN; + FFFGForceUtil forceUtil = forceUtils.get(guidType); + + // If aggregate, get basins within the aggregate + if (cBasin.getAggregated()) { + if (domain == null) { + pfafList = ft.getAggregatePfafs(cBasinPfaf, siteKey, huc); + } else if (!domain.equals(NA)) { + if (!huc.equals(ALL)) { + pfafList = ft.getAggregatePfafsByDomain(parentBasinPfaf, + siteKey, domain, huc); + } + } else { + pfafList = ft.getAggregatePfafsByDomain(parentBasinPfaf, + siteKey, domain, huc); + pfafList.add(ft.getAggregatedPfaf(cBasinPfaf, siteKey, huc)); + } + } + + if (FFFGDataMgr.getInstance().isForcingConfigured()) { + FFMPBasin parentBasin = cBasin; + if (cBasinPfaf != parentBasinPfaf.longValue()) { + parentBasin = baseRec.getBasinData(ALL).get(parentBasinPfaf); + } + forceUtil.calculateForcings(domain, ft, parentBasin); + forcedPfafs = forceUtil.getForcedPfafList(); + forced = forceUtil.isForced(); + } + + if (!forcedPfafs.isEmpty() || !pfafList.isEmpty() && centeredAggregationKey == null) { + FFMPBasinData basinData = guidRecords.get(guidType).getBasinData( + ALL); + guidance = basinData.getAverageGuidanceValue(pfafList, resource + .getGuidanceInterpolators().get(guidType), guidance, + forcedPfafs, resource.getGuidSourceExpiration(guidType)); + forced = !forcedPfafs.isEmpty(); + } else { + guidance = resource.getGuidanceValue(ffmpGuidBasin, paintRefTime, + guidType); + if (guidance < 0.0f) { + guidance = Float.NaN; + } + } + + return new FFMPTableCellData(FIELDS.GUIDANCE, guidance, forced); + } + private float getForcedAvg(FFFGForceUtil forceUtil, String domain, FFMPBasin cBasin, String guidType) { FFFGDataMgr fdm = FFFGDataMgr.getInstance(); @@ -1146,17 +984,19 @@ public class FFMPDataGenerator { */ private FIELDS getBaseField() { + String dataKey = resource.getDataKey(); + ProductXML product = resource.getProduct(); + Date tableTime = resource.getTableTime(); + FIELDS field = null; String localHuc = null; - dman = FFFGDataMgr.getInstance(); FfmpTableConfigData ffmpTableCfgData = FfmpTableConfig.getInstance() .getTableConfigData(siteKey); String qpfType = ffmpTableCfgData.getQpfType(); ProductRunXML productRun = FFMPRunConfigurationManager.getInstance() .getProduct(siteKey); - String qpfSource = productRun.getQpfSources(product, qpfType).get(0) - .getSourceName(); + SourceXML qpfSource = productRun.getQpfSources(product, qpfType).get(0); FFMPConfig config = FFMPConfig.getInstance(); String includedCWAs = config.getFFMPConfigData().getIncludedCWAs(); @@ -1167,41 +1007,33 @@ public class FFMPDataGenerator { if (resource.isSplit()) { // hack off the QPF duration for the table values of QPE (Split // Window) - double duration = FFMPSourceConfigurationManager.getInstance() - .getSource(qpfSource).getDurationHour(); + double duration = qpfSource.getDurationHour(); qpeTime = new Date( (long) (qpeTime.getTime() - (duration * TimeUtil.MILLIS_PER_HOUR))); } monitor.setQpeWindow(new FFMPTimeWindow(tableTime, qpeTime)); + if (isWorstCase || (centeredAggregationKey != null)) { // make sure that "ALL" is loaded localHuc = ALL; - rateRecord = monitor.getRateRecord(product, siteKey, dataKey, - product.getRate(), paintRefTime, localHuc, true); - qpeRecord = monitor.getQPERecord(product, siteKey, dataKey, - product.getQpe(), tableTime, localHuc, true); - qpfRecord = monitor.getQPFRecord(product, siteKey, dataKey, null, - paintRefTime, localHuc, true); - guidRecords = monitor.getGuidanceRecords(product, siteKey, - tableTime, localHuc, true); + } else { + localHuc = huc; + } + + FFMPRecord rateRecord = monitor.getRateRecord(product, siteKey, + dataKey, product.getRate(), paintRefTime, localHuc, true); + FFMPRecord qpeRecord = monitor.getQPERecord(product, siteKey, dataKey, + product.getQpe(), tableTime, localHuc, true); + FFMPRecord qpfRecord = monitor.getQPFRecord(product, siteKey, dataKey, + null, paintRefTime, localHuc, true); + guidRecords = monitor.getGuidanceRecords(product, siteKey, tableTime, + localHuc, true); + FFMPRecord virtualRecord = null; + if (localHuc.equals(ALL)) { virtualRecord = monitor.getVirtualRecord(product, siteKey, dataKey, product.getVirtual(), tableTime, localHuc, true); - } else { - rateRecord = monitor.getRateRecord(product, siteKey, dataKey, - product.getRate(), paintRefTime, huc, true); - qpeRecord = monitor.getQPERecord(product, siteKey, dataKey, - product.getQpe(), tableTime, huc, true); - qpfRecord = monitor.getQPFRecord(product, siteKey, dataKey, null, - paintRefTime, huc, true); - guidRecords = monitor.getGuidanceRecords(product, siteKey, - tableTime, huc, true); - if (huc.equals(ALL)) { - virtualRecord = monitor.getVirtualRecord(product, siteKey, - dataKey, product.getVirtual(), tableTime, huc, true); - } - localHuc = huc; } try { diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataLoader.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataLoader.java index e4a6d77c36..79c025cc12 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataLoader.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataLoader.java @@ -71,6 +71,7 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.listeners.FFMPLoaderEvent; * Mar 6, 2013 1769 dhladky Changed threading to use count down latch. * Apr 9, 2013 1890 dhladky removed loading of phantom Virtual template and cache file processing. * Apr 18, 2013 1912 bsteffen Increase bulk requests to pypies. + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * * @@ -96,7 +97,7 @@ public class FFMPDataLoader extends Thread { private String dataKey = null; - private ArrayList hucsToLoad = null; + private List hucsToLoad = null; private String wfo = null; @@ -109,8 +110,7 @@ public class FFMPDataLoader extends Thread { private CountDownLatch latch; public FFMPDataLoader(FFMPResourceData resourceData, Date timeBack, - Date mostRecentTime, LOADER_TYPE loadType, - ArrayList hucsToLoad) { + Date mostRecentTime, LOADER_TYPE loadType, List hucsToLoad) { this.product = resourceData.getProduct(); this.siteKey = resourceData.siteKey; @@ -172,9 +172,8 @@ public class FFMPDataLoader extends Thread { .getSourceConfig(); ProductRunXML productRun = runner.getProduct(siteKey); - ArrayList qpfSources = new ArrayList(); + List qpfSources = new ArrayList(); String layer = config.getFFMPConfigData().getLayer(); - boolean isProductLoad = true; String rateURI = null; if (loadType != LOADER_TYPE.GENERAL) { @@ -278,8 +277,8 @@ public class FFMPDataLoader extends Thread { fireLoaderEvent(loadType, "Processing " + product.getRate(), isDone()); for (String phuc : hucsToLoad) { - monitor.processUri(isProductLoad, rateURI, siteKey, - product.getRate(), timeBack, phuc); + monitor.processUri(rateURI, siteKey, product.getRate(), + timeBack, phuc); } fireLoaderEvent(loadType, product.getRate(), isDone()); } @@ -305,8 +304,8 @@ public class FFMPDataLoader extends Thread { if (!qpeURIs.isEmpty()) { for (String phuc : hucsToLoad) { if (phuc.equals(layer) || phuc.equals(FFMPRecord.ALL)) { - monitor.processUris(qpeURIs, isProductLoad, siteKey, - product.getQpe(), timeBack, phuc); + monitor.processUris(qpeURIs, siteKey, product.getQpe(), + timeBack, phuc); } } } @@ -338,8 +337,8 @@ public class FFMPDataLoader extends Thread { if (!qpfURIs.isEmpty()) { for (String phuc : hucsToLoad) { if (phuc.equals(layer) || phuc.equals(FFMPRecord.ALL)) { // old - monitor.processUris(qpfURIs, isProductLoad, - siteKey, product.getQpf(i), timeBack, phuc); + monitor.processUris(qpfURIs, siteKey, + product.getQpf(i), timeBack, phuc); } } } @@ -353,8 +352,8 @@ public class FFMPDataLoader extends Thread { isDone()); // process virtual all for all only, never uses cache files if (!virtualURIs.isEmpty()) { - monitor.processUris(virtualURIs, isProductLoad, siteKey, - product.getVirtual(), timeBack, FFMPRecord.ALL); + monitor.processUris(virtualURIs, siteKey, product.getVirtual(), + timeBack, FFMPRecord.ALL); } fireLoaderEvent(loadType, product.getVirtual(), isDone()); @@ -373,7 +372,7 @@ public class FFMPDataLoader extends Thread { "Processing " + guidSource.getSourceName(), isDone()); - monitor.processUris(iguidURIs, isProductLoad, siteKey, + monitor.processUris(iguidURIs, siteKey, guidSource.getSourceName(), timeBack, FFMPRecord.ALL); diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDrawable.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDrawable.java index 6873331472..6d85109748 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDrawable.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDrawable.java @@ -32,7 +32,6 @@ import org.eclipse.swt.graphics.RGB; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord.FIELDS; import com.raytheon.uf.common.monitor.xml.DomainXML; import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FFMPTableData; /** @@ -46,6 +45,8 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FFMPTableData; * ------------ ---------- ----------- -------------------------- * 04/23/10 4494 D. Hladky Initial release * 02/01/13 1569 D. Hladky Added constants + * Apr 25, 2013 1954 bsteffen Skip extent checking for FFMP shape + * generation. * * * @@ -79,15 +80,10 @@ public class FFMPDrawable { private DataTime time = null; - private PixelExtent ext = null; - private double dtime = 0.0; protected HashMap worstCaseHash = new HashMap(); - private ConcurrentMap> basins = new ConcurrentHashMap>( - 10, 0.75f, 5); - private String guidType = null; public FFMPDrawable(Collection domains) { @@ -95,7 +91,7 @@ public class FFMPDrawable { } public void setValidDomains(Collection domains) { - Set cwasToRemove = new HashSet(basins.keySet()); + Set cwasToRemove = new HashSet(colorMaps.keySet()); for (DomainXML domain : domains) { cwasToRemove.remove(domain.getCwa()); } @@ -124,7 +120,7 @@ public class FFMPDrawable { * Disposes of currently drawn shapes. */ public void disposeImage() { - for (String cwa : basins.keySet()) { + for (String cwa : colorMaps.keySet()) { disposeCwa(cwa); } } @@ -135,8 +131,6 @@ public class FFMPDrawable { colorMap.clear(); colorMap = null; } - - basins.remove(cwa); // tableData.clear(); worstCaseHash.clear(); } @@ -225,22 +219,6 @@ public class FFMPDrawable { this.isWorstCase = isWorstCase; } - public PixelExtent getExt() { - return ext; - } - - public void setExt(PixelExtent ext) { - this.ext = ext; - } - - public Set getBasins(String cwa) { - return basins.get(cwa); - } - - public void setBasins(String cwa, Set basins) { - this.basins.put(cwa, basins); - } - public void setTableData(String thuc, FFMPTableData tData) { tableData.put(thuc, tData); } diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResource.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResource.java index 347a23d10d..d2831220b8 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResource.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResource.java @@ -41,10 +41,10 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; -import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.TransformException; @@ -63,7 +63,6 @@ import com.raytheon.uf.common.dataplugin.ffmp.FFMPUtils; import com.raytheon.uf.common.dataplugin.ffmp.FFMPVirtualGageBasin; import com.raytheon.uf.common.dataplugin.ffmp.FFMPVirtualGageBasinMetaData; import com.raytheon.uf.common.dataplugin.ffmp.HucLevelGeometriesFactory; -import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.geospatial.ReferencedCoordinate; import com.raytheon.uf.common.localization.IPathManager; import com.raytheon.uf.common.localization.LocalizationContext; @@ -84,6 +83,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.util.ITimer; import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.viz.core.DrawableLine; import com.raytheon.uf.viz.core.DrawableString; import com.raytheon.uf.viz.core.IDisplayPaneContainer; import com.raytheon.uf.viz.core.IGraphicsTarget; @@ -102,7 +102,6 @@ import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormapShadedShapeExtension; import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormapShadedShapeExtension.IColormapShadedShape; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.map.IMapDescriptor; import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.IInputHandler; @@ -139,7 +138,6 @@ import com.raytheon.viz.core.rsc.jts.JTSCompiler.PointStyle; import com.raytheon.viz.ui.input.EditableManager; import com.raytheon.viz.ui.input.InputAdapter; import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Point; @@ -166,6 +164,10 @@ import com.vividsolutions.jts.geom.Point; * Apr 9, 2013 1890 dhladky General cleanup. * Apr 10, 2013 1896 bsteffen Make FFMPResource work better with D2D * time matcher. + * Apr 25, 2013 1954 bsteffen Skip extent checking for FFMP shape + * generation. + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. + * * * * @author dhladky @@ -349,9 +351,6 @@ public class FFMPResource extends // complete reset public boolean isQuery = true; - /** the last extent **/ - private PixelExtent lastExtent; - /** * FFMP basin table dialog. */ @@ -459,14 +458,15 @@ public class FFMPResource extends } else { previousMostRecentTime = tok.get(0); } - - updateTimeOrderedkeys(ffmpRec.getDataTime().getRefTime()); + Date refTime = ffmpRec.getDataTime().getRefTime(); + + updateTimeOrderedkeys(refTime); if (getResourceData().tableLoad) { setTableTime(); } - setRecord(ffmpRec); + resourceData.populateRecord(ffmpRec); statusHandler.handle(Priority.INFO, "Updating : Previous: " + previousMostRecentTime + " New: " @@ -475,8 +475,7 @@ public class FFMPResource extends if (getResourceData().tableLoad) { if (loader == null) { - startLoader(previousMostRecentTime, ffmpRec - .getDataTime().getRefTime(), + startLoader(previousMostRecentTime, refTime, LOADER_TYPE.GENERAL); } else { try { @@ -486,8 +485,7 @@ public class FFMPResource extends e.getLocalizedMessage(), e); } - startLoader(previousMostRecentTime, ffmpRec - .getDataTime().getRefTime(), + startLoader(previousMostRecentTime, refTime, LOADER_TYPE.GENERAL); try { loader.waitFor(); @@ -497,7 +495,7 @@ public class FFMPResource extends } } - purge(ffmpRec.getDataTime().getRefTime()); + purge(refTime); } resetRecords(); @@ -1063,16 +1061,6 @@ public class FFMPResource extends return null; } - /** - * Set the Record straight. - * - * @throws VizException - * - */ - protected void setRecord(FFMPRecord ffmpRecord) throws VizException { - getResourceData().populateRecord(getProduct(), ffmpRecord, getHuc()); - } - @Override protected void disposeInternal() { IDisplayPaneContainer container = getResourceContainer(); @@ -1153,7 +1141,7 @@ public class FFMPResource extends } // DR 14522: use Display.getDefault().asyncExec() for GUI thread. - org.eclipse.swt.widgets.Display.getDefault().asyncExec(new Runnable() { + Display.getDefault().asyncExec(new Runnable() { @Override public void run() { @@ -1209,246 +1197,208 @@ public class FFMPResource extends @Override protected void paintInternal(IGraphicsTarget aTarget, PaintProperties paintProps) throws VizException { + if (getTimeOrderedKeys() == null || getTimeOrderedKeys().isEmpty() + || getDomains() == null) { + return; + } - // clear the screen aTarget.clearClippingPlane(); - if ((getTimeOrderedKeys() != null) && (getTimeOrderedKeys().size() > 0) - && (getDomains() != null)) { + paintTime = paintProps.getDataTime(); + paintProps.setAlpha(getCapability(ImagingCapability.class).getAlpha()); - paintTime = paintProps.getDataTime(); - paintProps.setAlpha(getCapability(ImagingCapability.class) - .getAlpha()); + FFMPDrawable drawable = null; - boolean isShaded = true; - FFMPDrawable drawable = null; + if (paintTime != null) { + if (loader != null && !loader.isDone() + && loader.loadType == LOADER_TYPE.GENERAL) { + return; + } + if (!drawables.containsKey(paintTime)) { - if (paintTime != null) { - if (loader != null && !loader.isDone() - && loader.loadType == LOADER_TYPE.GENERAL) { - return; - } - if (!drawables.containsKey(paintTime)) { + drawable = new FFMPDrawable(getDomains()); + drawables.put(paintTime, drawable); + } else { + // we found it! + drawable = drawables.get(paintTime); + // System.out.println("Found the drawable"); - drawable = new FFMPDrawable(getDomains()); - drawables.put(paintTime, drawable); - } else { - // we found it! - drawable = drawables.get(paintTime); - // System.out.println("Found the drawable"); - - if (!paintTime.equals(drawable.getTime())) { - drawable.setDirty(true); - } - - if ((lastExtent == null) - || !lastExtent.getEnvelope().contains( - drawable.getExt().getEnvelope())) { - drawable.setDirty(true); - } - - // auto refresh state - if (isQuery) { - drawable.setDirty(true); - } + if (!paintTime.equals(drawable.getTime())) { + drawable.setDirty(true); } - if (getResourceData().tableLoad - && !paintTime.getRefTime().equals(getMostRecentTime())) { - setMostRecentTime(paintTime.getRefTime()); - setTableTime(); - // if (isLinkToFrame && loader != null && loader.loadType != - // LOADER_TYPE.GENERAL) { - if (isLinkToFrame) { - updateDialog(); + // auto refresh state + if (isQuery) { + drawable.setDirty(true); + } + } + + if (getResourceData().tableLoad + && !paintTime.getRefTime().equals(getMostRecentTime())) { + setMostRecentTime(paintTime.getRefTime()); + setTableTime(); + // if (isLinkToFrame && loader != null && loader.loadType != + // LOADER_TYPE.GENERAL) { + if (isLinkToFrame) { + updateDialog(); + } + } + } else { + getResourceData().getMonitor().forceKillFFMPSplash(); + } + + if ((drawable != null) && drawable.isDirty()) { + // only need to do the query if extent changed, pfafs may be + // fine + if (!isFirst || queryJob.getState() == Job.NONE) { + queryJob.request(aTarget, drawable, paintTime); + } + } + + if (drawable != null && isFfmpDataToggle()) { + IColormapShadedShapeExtension ext = aTarget + .getExtension(IColormapShadedShapeExtension.class); + ImagingCapability imageCap = getCapability(ImagingCapability.class); + float brightness = imageCap.getBrightness(); + float alpha = imageCap.getAlpha(); + for (DomainXML domain : getDomains()) { + String cwa = domain.getCwa(); + IColormapShadedShape shape = shadedShapes.getDrawableShape(cwa, + drawable.getShadedHuc()); + Map colorMap = drawable.getColorMap(cwa); + if (shape != null && colorMap != null) { + ext.drawColormapShadedShape(shape, colorMap, alpha, + brightness); + } + } + } + + boolean isAllHuc = getHuc().equals(FFMPRecord.ALL); + if (getResourceData().tableLoad) { + + int mapWidth = getDescriptor().getMapWidth() / 1000; + double zoom = getDescriptor().getRenderableDisplay().getZoom(); + + // determine whether or not to draw the small guys + if ((mapWidth * zoom) > 250.0) { + if (isSmallBasins) { + isSmallBasins = false; + refresh(); + } + + } else if ((mapWidth * zoom) < 250.0) { + if (!isSmallBasins) { + isSmallBasins = true; + if (smallBasinOverlayShape == null) { + drawable.setDirty(true); + } else { + refresh(); + } + } + } + + if (isSmallBasins && this.isBasinToggle()) { + OutlineCapability lineCap = getCapability(OutlineCapability.class); + if ((smallBasinOverlayShape != null) + && smallBasinOverlayShape.isDrawable()) { + + if (basinBoundaryColor == null) { + basinBoundaryColor = getCapability( + ColorableCapability.class).getColor(); + } + + aTarget.drawWireframeShape(smallBasinOverlayShape, + basinBoundaryColor, lineCap.getOutlineWidth(), + lineCap.getLineStyle()); + } else if ((smallBasinOverlayShape == null) + && lineCap.isOutlineOn()) { + issueRefresh(); + } + } + + // the product string + if (isFfmpDataToggle() && fieldDescString != null) { + paintProductString(aTarget, paintProps); + } + } + // re-centered ? + if (centeredAggregationKey != null) { + vgbDrawables.clear(); + // create pixelCoverages for the VGB's + if (isAllHuc) { + for (DomainXML domain : getDomains()) { + for (Long pfaf : monitor.getTemplates(getSiteKey()) + .getMap(getSiteKey(), domain.getCwa(), getHuc()) + .keySet()) { + List fvgmdList = monitor + .getTemplates(getSiteKey()) + .getVirtualGageBasinMetaData(getSiteKey(), + domain.getCwa(), pfaf); + if (fvgmdList != null) { + for (FFMPVirtualGageBasinMetaData fvgmd : fvgmdList) { + vgbDrawables.put( + fvgmd.getLid(), + getPixelCoverage(fvgmd.getCoordinate(), + paintProps)); + } + } } } } else { - if (getResourceData().getMonitor().ffmpSplash != null) { - getResourceData().getMonitor().ffmpSplash.close(); - getResourceData().getMonitor().ffmpSplash = null; - } - } - - if ((drawable != null) && drawable.isDirty()) { - // only need to do the query if extent changed, pfafs may be - // fine - PixelExtent expandedExtent = getExpandedExtent((PixelExtent) paintProps - .getView().getExtent()); - drawable.setExt(expandedExtent); - queryJob.request(aTarget, descriptor, isShaded, drawable, - expandedExtent, paintTime); - lastExtent = expandedExtent; - } - - boolean isAllHuc = getHuc().equals(FFMPRecord.ALL); - for (DomainXML domain : getDomains()) { - String cwa = domain.getCwa(); - if (isShaded) { - if (drawable != null) { - IColormapShadedShape shape = shadedShapes - .getDrawableShape(cwa, drawable.getShadedHuc()); - Map colorMap = drawable.getColorMap(cwa); - - if (this.isFfmpDataToggle() && (shape != null) - && (colorMap != null)) { - - aTarget.getExtension( - IColormapShadedShapeExtension.class) - .drawColormapShadedShape( - shape, - colorMap, - paintProps.getAlpha(), - getCapability( - ImagingCapability.class) - .getBrightness()); - } - } - } - - if (getResourceData().tableLoad) { - - int mapWidth = getDescriptor().getMapWidth() / 1000; - double zoom = getDescriptor().getRenderableDisplay() - .getZoom(); - - // determine whether or not to draw the small guys - if ((mapWidth * zoom) > 250.0) { - if (isSmallBasins) { - isSmallBasins = false; - refresh(); - } - - } else if ((mapWidth * zoom) < 250.0) { - if (!isSmallBasins) { - isSmallBasins = true; - if (smallBasinOverlayShape == null) { - drawable.setDirty(true); - } else { - refresh(); - } - } - } - - if ((lowestCenter == ZOOM.AGGREGATE) - || (lowestCenter == ZOOM.BASIN) || isAllHuc - || this.isBasinToggle() || isSmallBasins) { - - if (isSmallBasins && this.isBasinToggle()) { - if ((smallBasinOverlayShape != null) - && smallBasinOverlayShape.isDrawable()) { - - if (basinBoundaryColor == null) { - basinBoundaryColor = getCapability( - ColorableCapability.class) - .getColor(); - } - - aTarget.drawWireframeShape( - smallBasinOverlayShape, - basinBoundaryColor, - getCapability(OutlineCapability.class) - .getOutlineWidth(), - getCapability(OutlineCapability.class) - .getLineStyle()); - } else if ((smallBasinOverlayShape == null) - && getCapability(OutlineCapability.class) - .isOutlineOn()) { - aTarget.setNeedsRefresh(true); - } - } - } - - // the product string - if (isFfmpDataToggle() && fieldDescString != null) { - paintProductString(aTarget, paintProps); - } - } - } - // re-centered ? - if (centeredAggregationKey != null) { - vgbDrawables.clear(); - // create pixelCoverages for the VGB's - if (isAllHuc) { - for (DomainXML domain : getDomains()) { - for (Long pfaf : monitor + if (lowestCenter == FFMPRecord.ZOOM.AGGREGATE) { + for (Long pfaf : monitor.getTemplates(getSiteKey()) + .getAllAggregatePfafs(centeredAggregationKey, + getHuc())) { + List fvgmdList = monitor .getTemplates(getSiteKey()) - .getMap(getSiteKey(), domain.getCwa(), getHuc()) - .keySet()) { - ArrayList fvgmdList = monitor - .getTemplates(getSiteKey()) - .getVirtualGageBasinMetaData(getSiteKey(), - domain.getCwa(), pfaf); - if (fvgmdList != null) { - for (FFMPVirtualGageBasinMetaData fvgmd : fvgmdList) { - vgbDrawables.put( - fvgmd.getLid(), - getPixelCoverage( - fvgmd.getCoordinate(), - paintProps)); - } + .getVirtualGageBasinMetaData(getSiteKey(), + null, pfaf); + if (fvgmdList != null) { + for (FFMPVirtualGageBasinMetaData fvgmd : fvgmdList) { + vgbDrawables.put( + fvgmd.getLid(), + getPixelCoverage(fvgmd.getCoordinate(), + paintProps)); } } } } else { - if (lowestCenter == FFMPRecord.ZOOM.AGGREGATE) { - for (Long pfaf : monitor.getTemplates(getSiteKey()) - .getAllAggregatePfafs(centeredAggregationKey, - getHuc())) { - ArrayList fvgmdList = monitor - .getTemplates(getSiteKey()) - .getVirtualGageBasinMetaData(getSiteKey(), - null, pfaf); - if (fvgmdList != null) { - for (FFMPVirtualGageBasinMetaData fvgmd : fvgmdList) { - vgbDrawables.put( - fvgmd.getLid(), - getPixelCoverage( - fvgmd.getCoordinate(), - paintProps)); - } - } - } - } else { - for (DomainXML domain : getDomains()) { - for (Entry entry : monitor - .getTemplates(getSiteKey()) - .getVirtualGageBasins(getSiteKey(), - domain.getCwa()).entrySet()) { - if (entry.getValue() != null) { - vgbDrawables.put( - entry.getKey(), - getPixelCoverage(entry.getValue() - .getCoordinate(), - paintProps)); - } + for (DomainXML domain : getDomains()) { + for (Entry entry : monitor + .getTemplates(getSiteKey()) + .getVirtualGageBasins(getSiteKey(), + domain.getCwa()).entrySet()) { + if (entry.getValue() != null) { + vgbDrawables.put( + entry.getKey(), + getPixelCoverage(entry.getValue() + .getCoordinate(), paintProps)); } } } } - - paintCenter(aTarget, paintProps); - paintVGBs(aTarget, paintProps); } - // draw or clear the colorMap - if (!isFfmpDataToggle()) { // clear if ffmpDataToggle is false - getCapability(ColorMapCapability.class).setColorMapParameters( - null); - } else if (getColorUtil().getColorMapParameters() != null) { - // restore if null - getCapability(ColorMapCapability.class).setColorMapParameters( - getColorUtil().getColorMapParameters()); - } - - // draw stream trace? - if (isShowStream() && isStreamFollow()) { - paintUpAndDownStream(aTarget, paintProps, isShaded); - } - - // always reset - isQuery = false; + paintCenter(aTarget, paintProps); + paintVGBs(aTarget, paintProps); } + + // draw or clear the colorMap + if (!isFfmpDataToggle()) { // clear if ffmpDataToggle is false + getCapability(ColorMapCapability.class).setColorMapParameters(null); + } else if (getColorUtil().getColorMapParameters() != null) { + // restore if null + getCapability(ColorMapCapability.class).setColorMapParameters( + getColorUtil().getColorMapParameters()); + } + + // draw stream trace? + if (isShowStream() && isStreamFollow()) { + paintUpAndDownStream(aTarget, paintProps); + } + + // always reset + isQuery = false; } /** @@ -1497,7 +1447,7 @@ public class FFMPResource extends * @throws VizException */ private void paintUpAndDownStream(IGraphicsTarget target, - PaintProperties paintProps, boolean isShaded) throws VizException { + PaintProperties paintProps) throws VizException { if (basinTraceColor == null) { basinTraceColor = getCapability(ColorableCapability.class) @@ -1505,7 +1455,7 @@ public class FFMPResource extends } if (isShowStream() && (streamShadedShape != null) - && streamShadedShape.isDrawable() && isShaded) { + && streamShadedShape.isDrawable()) { target.drawShadedShape(streamShadedShape, paintProps.getAlpha()); } if (isShowStream() && (streamOutlineShape != null) @@ -1834,10 +1784,8 @@ public class FFMPResource extends if (stream.equals(FFMPRecord.CLICK_TYPE.TREND)) { monitor.basinTrend(newPfaf); - } - - // only re-draw the screen for UP/DOWN - if (!stream.equals(FFMPRecord.CLICK_TYPE.TREND)) { + } else { + // only re-draw the screen for UP/DOWN nextStreamPfaf = newPfaf; dirty(); } @@ -2111,29 +2059,16 @@ public class FFMPResource extends */ private void drawSquare(PixelCoverage pc, IGraphicsTarget target) throws VizException { - - // target.drawLine(lines) - target.drawLine(pc.getLl().x, pc.getLl().y, 0.0, pc.getUl().x, pc - .getUl().y, 0.0, getCapability(ColorableCapability.class) - .getColor(), getCapability(OutlineCapability.class) - .getOutlineWidth(), getCapability(OutlineCapability.class) - .getLineStyle()); - target.drawLine(pc.getUl().x, pc.getUl().y, 0.0, pc.getUr().x, pc - .getUr().y, 0.0, getCapability(ColorableCapability.class) - .getColor(), getCapability(OutlineCapability.class) - .getOutlineWidth(), getCapability(OutlineCapability.class) - .getLineStyle()); - target.drawLine(pc.getUr().x, pc.getUr().y, 0.0, pc.getLr().x, pc - .getLr().y, 0.0, getCapability(ColorableCapability.class) - .getColor(), getCapability(OutlineCapability.class) - .getOutlineWidth(), getCapability(OutlineCapability.class) - .getLineStyle()); - target.drawLine(pc.getLr().x, pc.getLr().y, 0.0, pc.getLl().x, pc - .getLl().y, 0.0, getCapability(ColorableCapability.class) - .getColor(), getCapability(OutlineCapability.class) - .getOutlineWidth(), getCapability(OutlineCapability.class) - .getLineStyle()); - + DrawableLine line = new DrawableLine(); + line.lineStyle = getCapability(OutlineCapability.class).getLineStyle(); + line.width = getCapability(OutlineCapability.class).getOutlineWidth(); + line.basics.color = getCapability(ColorableCapability.class).getColor(); + line.addPoint(pc.getLl().x, pc.getLl().y); + line.addPoint(pc.getUl().x, pc.getUl().y); + line.addPoint(pc.getUr().x, pc.getUr().y); + line.addPoint(pc.getLr().x, pc.getLr().y); + line.addPoint(pc.getLl().x, pc.getLl().y); + target.drawLine(line); } /** @@ -2198,23 +2133,6 @@ public class FFMPResource extends } } - /** - * See if you are in the coverage of this feature - * - * @param c - * @return - */ - private boolean contains(PixelCoverage pc, Coordinate c) { - boolean inside = false; - double[] center = descriptor.worldToPixel(new double[] { c.x, c.y }); - - if ((center[0] > pc.getMinX()) && (center[0] < pc.getMaxX()) - && (center[1] > pc.getMinY()) && (center[1] < pc.getMaxY())) { - inside = true; - } - return inside; - } - /** * Set the center * @@ -2363,56 +2281,6 @@ public class FFMPResource extends } } - /** - * Gets the VGB value when querried - * - * @param pfaf - * @return - */ - private float getVGBValue(Long pfaf, Date recentTime) { - float value = 0.0f; - if (getField() == FIELDS.RATE) { - value = getVirtualRecord().getBasinsMap().get(FFMPRecord.ALL) - .get(pfaf).getValue(recentTime); - } else if (getField() == FIELDS.QPE) { - value = getVirtualRecord() - .getBasinsMap() - .get(FFMPRecord.ALL) - .get(pfaf) - .getAccumValue(getTableTime(), getMostRecentTime(), - getQpeSourceExpiration(), isRate()); - } else if (getField() == FIELDS.RATIO) { - float qpe = getVirtualRecord() - .getBasinsMap() - .get(FFMPRecord.ALL) - .get(pfaf) - .getAccumValue(getTableTime(), getMostRecentTime(), - getQpeSourceExpiration(), isRate()); - float guidance = getGuidanceValue( - ((FFMPGuidanceBasin) getGuidanceRecord().getBasinsMap() - .get(FFMPRecord.ALL).get(pfaf)), recentTime, - getFFGName()); - value = FFMPUtils.getRatioValue(qpe, guidance); - } else if (getField() == FIELDS.DIFF) { - float qpe = getVirtualRecord() - .getBasinsMap() - .get(FFMPRecord.ALL) - .get(pfaf) - .getAccumValue(getTableTime(), getMostRecentTime(), - getQpeSourceExpiration(), isRate()); - float guidance = getGuidanceValue( - ((FFMPGuidanceBasin) getGuidanceRecord().getBasinsMap() - .get(FFMPRecord.ALL).get(pfaf)), recentTime, - getFFGName()); - value = FFMPUtils.getDiffValue(qpe, guidance); - } else if (getField() == FIELDS.GUIDANCE) { - value = getGuidanceValue(((FFMPGuidanceBasin) getGuidanceRecord() - .getBasinsMap().get(FFMPRecord.ALL).get(pfaf)), recentTime, - getFFGName()); - } - return value; - } - private class FFMPDataRetrievalJob extends Job { private static final int QUEUE_LIMIT = 1; @@ -2430,98 +2298,31 @@ public class FFMPResource extends IGraphicsTarget target; - IMapDescriptor descriptor; - - boolean shaded; - FFMPDrawable drawable; - PixelExtent extent; - DataTime time; - Request(IGraphicsTarget target, IMapDescriptor descriptor, - boolean shaded, FFMPDrawable drawable, PixelExtent extent, - DataTime time) { + Request(IGraphicsTarget target, FFMPDrawable drawable, DataTime time) { this.target = target; - this.descriptor = descriptor; - this.shaded = shaded; this.drawable = drawable; - this.extent = extent; this.time = time; } } - public void request(IGraphicsTarget target, IMapDescriptor descriptor, - boolean shaded, FFMPDrawable drawable, PixelExtent extent, + public void request(IGraphicsTarget target, FFMPDrawable drawable, DataTime time) { if (drawable != null) { if (requestQueue.size() == QUEUE_LIMIT) { requestQueue.poll(); } - Request req = new Request(target, descriptor, shaded, drawable, - extent, time); + Request req = new Request(target, drawable, + time); requestQueue.add(req); this.schedule(); } } - /** - * Determines the area basins. Return true if they have changed, false - * otherwise. - * - * @param req - * @param templates - * @param aggrHuc - * @return - * @throws VizException - */ - private Set getAreaBasins(String cwa, Request req, String phuc) { - FFMPTemplates templates = monitor.getTemplates(getSiteKey()); - FFMPDrawable drawable = req.drawable; - Set cwaBasins = drawable.getBasins(cwa); - if (cwaBasins == null) { - cwaBasins = new HashSet(); - drawable.setBasins(cwa, cwaBasins); - } - if ((cwaBasins.size() == 0) - || !req.extent.equals(drawable.getExt()) - || !phuc.equals(drawable.getHuc()) || restoreTable) { - Envelope env = null; - try { - Envelope e = req.descriptor.pixelToWorld(req.extent, - req.descriptor.getCRS()); - ReferencedEnvelope ref = new ReferencedEnvelope(e, - req.descriptor.getCRS()); - env = ref.transform(MapUtil.LATLON_PROJECTION, true); - } catch (Exception e) { - System.out.println("Error transforming extent"); - } - - cwaBasins.clear(); - - try { - // use the envelopes from HUC0 to speed processing - // if necessary - Map envMap = hucGeomFactory.getEnvelopes( - templates, getSiteKey(), cwa, phuc); - for (Entry entry : envMap.entrySet()) { - - if (env.intersects(entry.getValue()) - || env.contains(entry.getValue())) { - // add the individual basins - cwaBasins.add(entry.getKey()); - } - } - } catch (Exception e) { - statusHandler.handle(Priority.DEBUG, "Domain: " + cwa - + " Outside of site: " + getSiteKey() + " area..."); - } - } - return cwaBasins; - } - /* * (non-Javadoc) * @@ -2543,14 +2344,13 @@ public class FFMPResource extends } }); - + String siteKey = getSiteKey(); Request req = requestQueue.poll(); while (req != null) { try { // long t0 = System.currentTimeMillis(); FFMPDrawable drawable = req.drawable; - FFMPTemplates templates = monitor - .getTemplates(getSiteKey()); + FFMPTemplates templates = monitor.getTemplates(siteKey); String phuc = getHuc(); boolean isAllPhuc = phuc.equals(FFMPRecord.ALL); @@ -2564,8 +2364,6 @@ public class FFMPResource extends boolean globalRegen = !(phuc.equals(drawable.getHuc()) && field.equals(drawable.getField()) - && lastExtent.getEnvelope().contains( - drawable.getExt().getEnvelope()) && req.time.equals(drawable.getTime()) && ((centeredAggregationKey == null) || !centeredAggregationKey .equals(drawable.getCenterAggrKey())) @@ -2577,7 +2375,6 @@ public class FFMPResource extends if (globalRegen) { resetRecords(); } - for (DomainXML domain : getDomains()) { String cwa = domain.getCwa(); @@ -2591,8 +2388,8 @@ public class FFMPResource extends // + " Table:" // + resourceData.tableLoad); // get base aggr basins that are in screen area - Set cwaPfafs = null; - cwaPfafs = getAreaBasins(cwa, req, phuc); + Set cwaPfafs = templates.getMap(getSiteKey(), + cwa, phuc).keySet(); Set pfafsToProcess = null; Long centeredAggr = null; @@ -2608,7 +2405,7 @@ public class FFMPResource extends centeredAggr = templates .findAggregatedVGB( (String) centeredAggregationKey, - getSiteKey(), phuc); + siteKey, phuc); } else { centeredAggr = (Long) drawable .getCenterAggrKey(); @@ -2617,7 +2414,7 @@ public class FFMPResource extends centeredAggr = templates .findAggregatedVGB( (String) centeredAggregationKey, - getSiteKey(), + siteKey, phuc); } } @@ -2632,7 +2429,7 @@ public class FFMPResource extends centeredAggr = templates .getAggregatedPfaf( (Long) centeredAggregationKey, - getSiteKey(), + siteKey, phuc); } } @@ -2659,16 +2456,17 @@ public class FFMPResource extends // long t1 = System.currentTimeMillis(); if ((pfafsToProcess != null) - && (pfafsToProcess.size() > 0)) { + && (!pfafsToProcess.isEmpty())) { - HashMap colorMap = new HashMap(); + HashMap colorMap = new HashMap( + pfafsToProcess.size(), 1); String shadedHuc = null; if (!isAllPhuc) { Map geomMap = hucGeomFactory - .getGeometries(templates, - getSiteKey(), cwa, phuc); + .getGeometries(templates, siteKey, + cwa, phuc); for (Long pfaf : pfafsToProcess) { @@ -2679,12 +2477,12 @@ public class FFMPResource extends if (isParent()) { allPfafs = templates.getMap( - getSiteKey(), cwa, + siteKey, cwa, FFMPRecord.ALL) .keySet(); } else { allPfafs = (List) (templates - .getMap(getSiteKey(), + .getMap(siteKey, cwa, phuc) .get(centeredAggr)); } @@ -2693,7 +2491,7 @@ public class FFMPResource extends Map allGeomMap = hucGeomFactory .getGeometries( templates, - getSiteKey(), + siteKey, cwa, FFMPRecord.ALL); IColormapShadedShape shape = shadedShapes @@ -2718,7 +2516,7 @@ public class FFMPResource extends && pfaf.equals(centeredAggr)) { Collection allPfafs = templates - .getMap(getSiteKey(), cwa, + .getMap(siteKey, cwa, FFMPRecord.ALL) .keySet(); @@ -2727,7 +2525,7 @@ public class FFMPResource extends Map allGeomMap = hucGeomFactory .getGeometries( templates, - getSiteKey(), + siteKey, cwa, FFMPRecord.ALL); @@ -2765,26 +2563,19 @@ public class FFMPResource extends } } } else { + Map allGeomMap = hucGeomFactory + .getGeometries(templates, siteKey, + cwa, FFMPRecord.ALL); + IColormapShadedShape shape = shadedShapes + .getShape(cwa, FFMPRecord.ALL, + req.target, descriptor); - if (pfafsToProcess != null) { - - Map allGeomMap = hucGeomFactory - .getGeometries(templates, - getSiteKey(), cwa, - FFMPRecord.ALL); - - IColormapShadedShape shape = shadedShapes - .getShape(cwa, FFMPRecord.ALL, - req.target, descriptor); - - shadedHuc = FFMPRecord.ALL; - - for (Long allPfaf : pfafsToProcess) { - generateShapes(templates, - FFMPRecord.ALL, allPfaf, - allGeomMap, req, shape, - colorMap); - } + shadedHuc = FFMPRecord.ALL; + for (Long allPfaf : pfafsToProcess) { + generateShapes(templates, + FFMPRecord.ALL, allPfaf, + allGeomMap, req, shape, + colorMap); } } @@ -2817,7 +2608,6 @@ public class FFMPResource extends if (lowestCenter != ZOOM.BASIN) { drawable.setCenterAggrKey(centeredAggregationKey); } - drawable.setExt(req.extent); drawable.setField(field); drawable.setHuc(phuc); drawable.setMaintainLayer(isMaintainLayer()); @@ -2856,7 +2646,6 @@ public class FFMPResource extends req = requestQueue.poll(); } - VizApp.runSync(new Runnable() { @Override @@ -2901,7 +2690,7 @@ public class FFMPResource extends if (color != null) { if (!shape.getColorKeys().contains(pfaf)) { - shape.addGeometry((Geometry) g.clone(), pfaf); + shape.addGeometry(g, pfaf); } colorMap.put(pfaf, color); @@ -2952,10 +2741,8 @@ public class FFMPResource extends // create the frames/shaded shapes here localWireframeShape = req.target.createWireframeShape(false, descriptor, 0.0f); - if (req.shaded) { - localShadedShape = req.target.createShadedShape(false, - descriptor.getGridGeometry(), true); - } + localShadedShape = req.target.createShadedShape(false, + descriptor.getGridGeometry(), true); JTSCompiler jtsCompiler2 = new JTSCompiler(localShadedShape, localWireframeShape, descriptor, PointStyle.CROSS); @@ -3001,7 +2788,7 @@ public class FFMPResource extends } } - if (req.shaded && (localShadedShape != null)) { + if (localShadedShape != null) { localShadedShape.compile(); localShadedShape.setFillPattern(FFMPUtils.STREAM_FILL); if (streamShadedShape != null) { @@ -3718,7 +3505,7 @@ public class FFMPResource extends * * @return list of Domains */ - public ArrayList getDomains() { + public List getDomains() { return getResourceData().getDomains(); } @@ -3803,11 +3590,7 @@ public class FFMPResource extends SortedSet keys = monitor.getAvailableUris(getSiteKey(), getDataKey(), getPrimarySource(), oldestTime).keySet(); - - for (Date date : keys) { - timeOrderedKeys.add(date); - } - + timeOrderedKeys.addAll(keys); } catch (VizException e) { statusHandler.handle(Priority.PROBLEM, "No available times for the FFMPResource"); @@ -3921,33 +3704,27 @@ public class FFMPResource extends basin.getPfaf()); basin.setCountyFips(fips); + FFMPGuidanceInterpolation interp = getGuidanceInterpolation(guidType); + long sourceExpiration = getGuidSourceExpiration(guidType); if (getResourceData().tableLoad) { // interpolating - if (getGuidanceInterpolation(guidType).isInterpolate()) { + if (interp.isInterpolate()) { // Interpolating between sources - String source1 = getGuidanceInterpolation(guidType) - .getSource1(); - String source2 = getGuidanceInterpolation(guidType) - .getSource2(); + String source1 = interp.getSource1(); + String source2 = interp.getSource2(); dvalue = basin.getInterpolatedValue(source1, source2, - getGuidanceInterpolation(guidType) - .getInterpolationOffset(), - getGuidanceInterpolation(guidType), - getGuidSourceExpiration(guidType)); + interp.getInterpolationOffset(), interp, + sourceExpiration); } else { - dvalue = basin.getValue(getGuidanceInterpolation(guidType) - .getStandardSource(), - getGuidanceInterpolation(guidType), - getGuidSourceExpiration(guidType)); + dvalue = basin.getValue(interp.getStandardSource(), interp, + sourceExpiration); } - if (dvalue == FFMPUtils.MISSING) { return Float.NaN; } } else { - dvalue = basin.getValue(getPrimarySource(), recentTime, - getGuidanceInterpolation(guidType), - getGuidSourceExpiration(guidType)); + dvalue = basin.getValue(getPrimarySource(), recentTime, interp, + sourceExpiration); } } @@ -4271,7 +4048,7 @@ public class FFMPResource extends */ public FFMPDrawable getDrawable(DataTime time) { FFMPDrawable drawable = null; - if (drawables != null) { + if (drawables != null && time != null) { drawable = drawables.get(time); } return drawable; diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResourceData.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResourceData.java index 7145ea6a1b..7077b1f71d 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResourceData.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResourceData.java @@ -20,7 +20,6 @@ package com.raytheon.uf.viz.monitor.ffmp.ui.rsc; import java.util.ArrayList; -import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.NavigableMap; @@ -35,11 +34,7 @@ import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord.FIELDS; import com.raytheon.uf.common.dataplugin.ffmp.FFMPTemplates; -import com.raytheon.uf.common.localization.IPathManager; -import com.raytheon.uf.common.localization.LocalizationContext; import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; -import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; -import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.monitor.config.FFMPRunConfigurationManager; import com.raytheon.uf.common.monitor.config.FFMPSourceConfigurationManager.SOURCE_TYPE; import com.raytheon.uf.common.monitor.xml.DomainXML; @@ -54,6 +49,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.localization.LocalizationManager; import com.raytheon.uf.viz.core.rsc.AbstractNameGenerator; import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; @@ -78,6 +74,7 @@ import com.raytheon.uf.viz.monitor.ffmp.xml.FFMPConfigBasinXML; * Feb 10, 2013 1584 mpduff Add performance logging. * Feb 28, 2013 1729 dhladky Got rid of thread sleeps * Mar 6, 2013 1769 dhladky Changed threading to use count down latch. + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * * @@ -134,7 +131,7 @@ public class FFMPResourceData extends AbstractRequestableResourceData { protected FFMPMonitor monitor = null; /** County Warning Area (Domain) for which to display **/ - protected ArrayList domains = null; + protected List domains = null; /** Product Displayed **/ private ProductXML product = null; @@ -177,10 +174,7 @@ public class FFMPResourceData extends AbstractRequestableResourceData { protected AbstractVizResource constructResource( LoadProperties loadProperties, PluginDataObject[] objects) throws VizException { - IPathManager pm = PathManagerFactory.getPathManager(); - LocalizationContext context = pm.getContext( - LocalizationType.COMMON_STATIC, LocalizationLevel.SITE); - this.wfo = context.getContextName(); + this.wfo = LocalizationManager.getContextName(LocalizationLevel.SITE); FFMPMonitor monitor = getMonitor(); monitor.setWfo(wfo); this.field = monitor.getField(sourceName); @@ -192,8 +186,8 @@ public class FFMPResourceData extends AbstractRequestableResourceData { DataTime[] availableTimes = this.getAvailableTimes(); // no data available; if (availableTimes.length != 0) { - if (getMonitor().getProductXML(sourceName) != null) { - setProduct(getMonitor().getProductXML(sourceName)); + product = monitor.getProductXML(sourceName); + if (product != null) { monitor.launchSplash(siteKey); FFMPTemplates templates = monitor.getTemplates(siteKey); @@ -227,11 +221,12 @@ public class FFMPResourceData extends AbstractRequestableResourceData { FFMPConfig ffmpConfig = monitor.getConfig(); FFMPConfigBasinXML cfgBasinXML = ffmpConfig.getFFMPConfigData(); String[] sdomains = cfgBasinXML.getIncludedCWAs().split(","); - ArrayList defaults = new ArrayList(); + List defaults = new ArrayList( + sdomains.length); for (String domain : sdomains) { - if (domain.length() == 0) { + if (domain.isEmpty()) { defaults.add(monitor.getRunConfig().getDomain(wfo)); break; } @@ -247,26 +242,18 @@ public class FFMPResourceData extends AbstractRequestableResourceData { this.domains = defaults; - DataTime mostRecentTime = availableTimes[availableTimes.length - 1]; + Date mostRecentTime = availableTimes[availableTimes.length - 1] + .getRefTime(); this.timeBack = new Date( - (long) (mostRecentTime.getRefTime().getTime() - (cfgBasinXML + (long) (mostRecentTime.getTime() - (cfgBasinXML .getTimeFrame() * TimeUtil.MILLIS_PER_HOUR))); - ArrayList hucsToLoad = monitor.getTemplates(siteKey) + List hucsToLoad = monitor.getTemplates(siteKey) .getTemplateMgr().getHucLevels(); // goes back X hours and pre populates the Data Hashes FFMPDataLoader loader = new FFMPDataLoader(this, timeBack, - mostRecentTime.getRefTime(), LOADER_TYPE.INITIAL, + mostRecentTime, LOADER_TYPE.INITIAL, hucsToLoad); - loader.start(); - - // make the table load wait for finish of initial data load - try { - loader.waitFor(); - } catch (InterruptedException e) { - statusHandler.handle(Priority.INFO, - "Data Loader thread interrupted, dying!", e); - } - + loader.run(); } else { /* * This appears completely un-orthodox for anything in D2D. But @@ -305,7 +292,7 @@ public class FFMPResourceData extends AbstractRequestableResourceData { NavigableMap> sourceURIs = getMonitor() .getAvailableUris(siteKey, dataKey, sourceName, standAloneTime); - getMonitor().processUris(sourceURIs, false, siteKey, + monitor.processUris(sourceURIs, siteKey, sourceName, standAloneTime, FFMPRecord.ALL); } } @@ -405,50 +392,14 @@ public class FFMPResourceData extends AbstractRequestableResourceData { * * @param record */ - public void populateRecord(ProductXML product, FFMPRecord precord, - String phuc) throws VizException { + public void populateRecord(FFMPRecord precord) + throws VizException { try { - boolean isProductLoad = false; - if (product != null) { - isProductLoad = true; - } - - getMonitor().populateFFMPRecord(isProductLoad, siteKey, precord, - precord.getSourceName(), phuc); + getMonitor().populateFFMPRecord(siteKey, precord, + precord.getSourceName(), huc); } catch (Exception e) { throw new VizException("Failed to populate ffmp record " - + precord.getDataURI() + " for huc " + phuc); - } - } - - /** - * Sort by Date - * - * @author dhladky - * - */ - public class SortByDate implements Comparator { - - @Override - public int compare(FFMPRecord o1, FFMPRecord o2) { - - return o1.getDataTime().getRefTime() - .compareTo(o2.getDataTime().getRefTime()); - } - } - - /** - * Sort by DataTime - * - * @author dhladky - * - */ - public class SortByDataTime implements Comparator { - - @Override - public int compare(DataTime o1, DataTime o2) { - - return o1.compareTo(o2); + + precord.getDataURI() + " for huc " + huc); } } @@ -488,7 +439,7 @@ public class FFMPResourceData extends AbstractRequestableResourceData { this.domains = domains; } - public ArrayList getDomains() { + public List getDomains() { return domains; } @@ -548,7 +499,7 @@ public class FFMPResourceData extends AbstractRequestableResourceData { * @param pfield * @return */ - public ArrayList getSourceName(FIELDS pfield) { + public List getSourceName(FIELDS pfield) { ArrayList sourceNames = null; ProductXML product = getProduct(); ProductRunXML productRun = FFMPRunConfigurationManager.getInstance() diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanMonitor.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanMonitor.java index 335b752604..baa16586f7 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanMonitor.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanMonitor.java @@ -111,6 +111,7 @@ import com.vividsolutions.jts.io.WKBReader; * Jan 29, 2009 dhladky Initial creation * Apr 18, 2013 1926 njensen Changed inner data maps to have Long key * to avoid !TimeStamp.equals(Date) issue + * Apr 26, 2013 1926 njensen Optimized getAvailableUris() * * * @author dhladky @@ -445,34 +446,6 @@ public class ScanMonitor extends ResourceMonitor implements IScanDialogListener return scanRec; } - /** - * Get list of records - * - * @param type - * @param interval - * @return - */ - public ScanRecord[] getScanRecords(ScanTables type, String icao) - throws VizException { - List recordList = new ArrayList(); - String[] uriList = getAvailableUris(type, icao); - - for (String uri : uriList) { - Map vals = new HashMap(); - vals.put("pluginName", "scan"); - vals.put("dataURI", uri); - - ScanRecord scanRec = (ScanRecord) Loader.loadData(vals); - File loc = HDF5Util.findHDF5Location(scanRec); - IDataStore dataStore = DataStoreFactory.getDataStore(loc); - if (scanRec != null) { - scanRec.retrieveMapFromDataStore(dataStore); - recordList.add(scanRec); - } - } - return recordList.toArray(new ScanRecord[recordList.size()]); - } - /** * Return the tilt angle at which the table is currently at * @@ -1277,41 +1250,40 @@ public class ScanMonitor extends ResourceMonitor implements IScanDialogListener return uri; } - public String[] getAvailableUris(ScanTables type, String icao) { - List uriList = new ArrayList(); - SimpleDateFormat datef = new SimpleDateFormat(datePattern); - datef.setTimeZone(TimeZone.getTimeZone("Zulu")); - String addedSQL = ""; + public List getAvailableUris(ScanTables type, String icao) { + List uriList = null; + String sql = null; if (type == ScanTables.DMD) { - addedSQL = "' and lastelevationangle = 't'"; + sql = "(select datauri from scan where type = '" + + type.name() + + "' and icao = '" + + icao + + "' and lastelevationangle ='t')" + + " union (select datauri from scan where type = '" + + type.name() + + "' and icao = '" + + icao + + "' and lastelevationangle = 'f' order by reftime desc, tilt desc limit 1)"; } else { - addedSQL = "'"; + sql = "(select datauri from scan where type = '" + type.name() + + "' and icao = '" + icao + "')"; } - String sql = "(select datauri from scan where type = '" - + type.name() - + "' and icao = '" - + icao - + addedSQL - + " order by reftime desc) " - + "union (select datauri from scan where type = '" - + type.name() - + "' and icao = '" - + icao - + "' and lastelevationangle = 'f' order by reftime desc, tilt desc limit 1)"; + try { List results = DirectDbQuery.executeQuery(sql, "metadata", QueryLanguage.SQL); + uriList = new ArrayList(results.size()); if (results.size() > 0) { for (Object[] ob : results) { uriList.add((String) ob[0]); } } } catch (VizException e) { - e.printStackTrace(); + statusHandler.error("Error retrieving scan uris", e); } - return uriList.toArray(new String[uriList.size()]); + return uriList; } /** diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanStarterJob.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanStarterJob.java index 9201d1f1f7..196c8d9f1b 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanStarterJob.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/ScanStarterJob.java @@ -26,6 +26,7 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; +import com.raytheon.uf.common.monitor.scan.config.SCANConfig; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; import com.raytheon.uf.viz.core.VizApp; @@ -76,6 +77,8 @@ public class ScanStarterJob extends Job { scan.setup(icao); } + SCANConfig.getInstance(); + VizApp.runAsync(new Runnable() { @Override diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanDrawer.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanDrawer.java index 643aa2c78c..4a06c56d0b 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanDrawer.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanDrawer.java @@ -238,7 +238,6 @@ public class ScanDrawer { circle.radius = size * (SIN_HEX_ANGLE); circle.lineWidth = outlineWidth; circle.basics.color = color; - aTarget.drawCircle(circle); if (isNew(ctdr)) { DrawableCircle innerCircle = new DrawableCircle(); @@ -247,7 +246,9 @@ public class ScanDrawer { innerCircle.radius = size / 2 * (SIN_HEX_ANGLE); innerCircle.lineWidth = outlineWidth; innerCircle.basics.color = color; - aTarget.drawCircle(innerCircle); + aTarget.drawCircle(circle, innerCircle); + } else { + aTarget.drawCircle(circle); } } } @@ -831,7 +832,7 @@ public class ScanDrawer { double dir, double length) { double[] earAngles = new double[] { 10, -10 }; - List coords = new ArrayList(); + List coords = new ArrayList(earAngles.length); for (double earAngle : earAngles) { @@ -969,15 +970,13 @@ public class ScanDrawer { if (sdc.getPastTracks()) { if (ctdr.getPastCoordinates() != null) { - for (Date date : ctdr.getPastCoordinates().keySet()) { dates.add(date); } - Collections.sort(dates); count = dates.size(); - double[] point = null; + double[] point = null; for (int i = dates.size() - 1; i >= 0; i--) { Coordinate coor = ctdr.getPastCoordinates().get( dates.get(i)); @@ -1014,45 +1013,34 @@ public class ScanDrawer { } } - // Draw data + // draw the past points if (pastPoints.size() > 0) { - double cirRadius = 2.0 / screenToWorldRatio; - DrawableCircle[] pastCircles = new DrawableCircle[pastPoints.size()]; - for (int i = 0; i < pastPoints.size(); i++) { - DrawableCircle pc = new DrawableCircle(); - double[] point = pastPoints.get(i); - pc.setCoordinates(point[0], point[1], 0); - pc.basics.color = getResourceColor(); - pc.radius = cirRadius; - pc.filled = true; - pastCircles[i] = pc; - } - aTarget.drawCircle(pastCircles); + aTarget.drawPoints(pastPoints, getResourceColor(), PointStyle.DISC, + 0.7f); } - if (pastPoints.size() > 1) { - DrawableLine line = new DrawableLine(); - line.points = pastPoints; - line.width = outlineWidth; - line.basics.color = getResourceColor(); - aTarget.drawLine(line); - } - - if (pastPoints.size() > 0) { - double[] oldPoint = pastPoints.get(0); - aTarget.drawLine(oldPoint[0], oldPoint[1], 0.0, center[0], - center[1], 0.0, getResourceColor(), outlineWidth); - } - drawX(center); + // draw the X + aTarget.drawPoint(center[0], center[1], 0.0, getResourceColor(), + PointStyle.X, 1.3f); + // draw the future points if (futurePoints.size() > 0) { aTarget.drawPoints(futurePoints, getResourceColor(), PointStyle.CROSS, 1.3f); } - if (futurePoints.size() > 1) { - DrawableLine line = new DrawableLine(); - line.points = futurePoints; + // draw the track line + DrawableLine line = new DrawableLine(); + for (int i = pastPoints.size() - 1; i > -1; i--) { + double[] pt = pastPoints.get(i); + line.addPoint(pt[0], pt[1]); + } + line.addPoint(center[0], center[1]); + for (double[] pt : futurePoints) { + line.addPoint(pt[0], pt[1]); + } + + if (line.points.size() > 1) { line.width = outlineWidth; line.basics.color = getResourceColor(); aTarget.drawLine(line); diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResource.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResource.java index 1b6d291335..e0ba40b028 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResource.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResource.java @@ -21,7 +21,6 @@ package com.raytheon.uf.viz.monitor.scan.resource; import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -177,16 +176,12 @@ public class ScanResource extends PluginDataObject[] pdos = (PluginDataObject[]) object; ScanRecord scan = null; - List uris = Arrays.asList(getScan().getAvailableUris( - getTable(), resourceData.icao)); for (PluginDataObject pdo : pdos) { try { scan = (ScanRecord) pdo; - if (uris.contains(scan.getDataURI())) { - if (scan.getType().equals(getTable().name())) { - addRecord(scan); - } - } + if (scan.getIcao().equals(resourceData.icao) + && scan.getType().equals(getTable().name())) + addRecord(scan); } catch (Exception e) { statusHandler.handle(Priority.PROBLEM, "Error updating SCAN resource", e); diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResourceData.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResourceData.java index 9a7103b1bf..b79ed605c4 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResourceData.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/resource/ScanResourceData.java @@ -21,7 +21,6 @@ package com.raytheon.uf.viz.monitor.scan.resource; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -97,8 +96,8 @@ public class ScanResourceData extends AbstractRequestableResourceData { protected AbstractVizResource constructResource( LoadProperties loadProperties, PluginDataObject[] objects) throws VizException { - List uris = Arrays.asList(getScan().getAvailableUris( - ScanTables.valueOf(tableType), icao)); + List uris = getScan().getAvailableUris( + ScanTables.valueOf(tableType), icao); try { long t0 = System.currentTimeMillis(); // Forces ScanMonitor to grab data back for one extra hour 1/2 past diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/AbstractTableDlg.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/AbstractTableDlg.java index 2e0e577380..fb8761ba29 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/AbstractTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/AbstractTableDlg.java @@ -50,6 +50,7 @@ import org.eclipse.swt.widgets.Shell; import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.monitor.scan.config.SCANConfig; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; +import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.alerts.AlertMessage; import com.raytheon.uf.viz.monitor.IMonitor; import com.raytheon.uf.viz.monitor.Monitor; @@ -74,6 +75,7 @@ import com.raytheon.uf.viz.monitor.scan.commondialogs.LoadSaveConfigDlg.DialogTy * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 21, 2009 #3039 lvenable Initial creation + * Apr 26, 2013 #1945 lvenable Some code cleanup. * * * @@ -179,14 +181,10 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, initData(); - // fileButtonTipText = "Current Config:\n" + - // scanCfg.getCurrentConfigFileName(scanTable); - setShellText(); setTableType(); initComponents(); - shellCloseAction(); shellDisposeAction(); shell.pack(); @@ -260,7 +258,6 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, } // Loop and close all of the open dialogs; - Set keys = dialogsMap.keySet(); for (ICommonDialogAction icda : keys) { @@ -476,6 +473,29 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, fileBtn.setToolTipText(fileButtonTipText); } + /** + * Get the scan time. If link to frame is turned on then get that time with + * the displayed frame otherwise get the latest time. + * + * @param scanMonitor + * The scan monitor. + * @return The scan time. + */ + protected Date getScanTime(ScanMonitor scanMonitor) { + Date time = null; + if (getLinkToFrame(scanTable.name())) { + time = scanMonitor.getScanTime(scanTable, site); + } else { + DataTime dt = scanMonitor.getMostRecent(scanMonitor, + scanTable.name(), site); + + if (dt != null) { + time = dt.getRefTime(); + } + } + return time; + } + @Override public void addMonitorControlListener(IMonitor monitor) { getMonitorControlListeners().add(monitor); @@ -491,6 +511,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, public void fireConfigUpdate(IMonitorConfigurationEvent imce) { final IMonitorConfigurationEvent fimce = imce; Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -504,6 +525,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, @Override public void fireKillMonitor() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -518,6 +540,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, public void fireThresholdUpdate(IMonitorThresholdEvent imte) { final IMonitorThresholdEvent fimte = imte; Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -534,8 +557,8 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, * @param ident * @param type */ - public TrendGraphData getTrendGraphData(ScanTables type, - String field, String ident) { + public TrendGraphData getTrendGraphData(ScanTables type, String field, + String ident) { TrendGraphData tgd = null; Iterator iter = getMonitorControlListeners().iterator(); while (iter.hasNext()) { @@ -572,6 +595,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, final ScanTables ftype = type; final String ficao = icao; Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -590,6 +614,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, */ public void fireScanPaint() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -612,10 +637,8 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, } // TODO: What needs to be done here is to grab the current selected - // trend set - // and fire a trend set for the passed in ID and table + // trend set and fire a trend set for the passed in ID and table // this will mean firing a get graphData Event back to the monitor - System.out.println("Trend Set requested: " + type + " : " + ident); } @Override @@ -635,6 +658,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, @Override public void fireDialogShutdown(IMonitorListener iml) { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -646,8 +670,8 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, } @Override - public TrendGraphData requestTrendGraphData(ScanTables type, - String field, String ident) { + public TrendGraphData requestTrendGraphData(ScanTables type, String field, + String ident) { return getTrendGraphData(type, field, ident); } @@ -683,6 +707,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, * used to notify updates of data to display elements from classes that * implement the IMonitor interface. */ + @Override public void fireMonitorEvent() { return; } @@ -694,6 +719,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, * listener class as an argument that can be used for targeted * notifications. */ + @Override public void fireMonitorEvent(String type) { return; } @@ -703,6 +729,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, * used to notify updates of data to display elements from classes that * implement the IMonitor interface. */ + @Override public void fireMonitorEvent(Monitor monitor) { return; } @@ -712,6 +739,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, * * @param pluginName */ + @Override public void initObserver(String pluginName, Monitor monitor) { return; } @@ -722,6 +750,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, * @param type * @return */ + @Override public ArrayList getTimeOrderedKeys(IMonitor monitor, String type) { return monitor.getTimeOrderedKeys(monitor, type); } @@ -742,6 +771,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, /* * Abstract methods to be implemented by classes extending this class. */ + @Override public abstract void notify(IMonitorEvent me); public abstract void displayTrendSetGraphs(String ident); @@ -750,12 +780,8 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, protected abstract void initComponents(); - // protected abstract void update(); - protected abstract void setShellText(); - protected abstract void shellCloseAction(); - protected abstract void shellDisposeAction(); protected abstract void updateAfterConfigLoad(); @@ -766,7 +792,7 @@ public abstract class AbstractTableDlg extends Dialog implements IMonitor, public abstract void updateThresh(String attr); - public abstract void turnOffAlarm(); + public abstract void turnOffAlarm(); - public abstract void turnOnAlarm(); + public abstract void turnOnAlarm(); } diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableComp.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableComp.java index d0456a67a9..4f8443d2b1 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableComp.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableComp.java @@ -44,6 +44,7 @@ import com.raytheon.uf.viz.monitor.scan.commondialogs.IRequestTrendGraphData; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 3, 2009 #3039 lvenable Initial creation + * Apr 29, 2013 #1945 lvenable Code cleanup for SCAN performance. * * * @@ -59,13 +60,28 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { private static final String UNWARNED_SVR_TOOLTIP = "\nA storm meeting Severe " + "Weather warning\ncriteria is outside any SVR warning polygon."; - // private Point mouseMovePt = new Point(0, 0); - // - // private Point mouseDownPt = new Point(0, 0); - // - // private Point prevMousePt = new Point(-9999, -9999); + /** Radius interpolation column name. */ + private String radVarColName = ""; - public SCANCellTableComp(Composite parent, SCANTableData tableData, ITableAction tableActionCB, + /** Clutter control column name. */ + private String clutterCoName = ""; + + /** + * Constructor. + * + * @param parent + * Parent composite. + * @param tableData + * Table data. + * @param tableActionCB + * Table action callback + * @param requestDataCallback + * Request data callback + * @param site + * The site. + */ + public SCANCellTableComp(Composite parent, SCANTableData tableData, + ITableAction tableActionCB, IRequestTrendGraphData requestDataCallback, String site) { super(parent, tableData, tableActionCB, requestDataCallback, site); @@ -105,22 +121,24 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { if (colIndex == 0) { tableIndex = rowIndex; if ((tableIndex >= 0) || (tableIndex > table.getItemCount())) { - tableActionCB.centerByStormId(table.getItem(tableIndex).getText()); + tableActionCB.centerByStormId(table.getItem(tableIndex) + .getText()); redrawTable(); } } else { String name = (String) table.getColumn(colIndex).getData(); if (scanCfg.canViewTrend(scanTable, name) == true) { - String ident = tableData.getTableRows().get(rowIndex).getTableCellData(0).getCellText(); + String ident = tableData.getTableRows().get(rowIndex) + .getTableCellData(0).getCellText(); - System.out.println("Display trend graph dialog for " + ident); displayTrendGraphDialog(ident, name); } } } else if (event.button == 3) { if (colIndex == 0) { - String ident = tableData.getTableRows().get(rowIndex).getTableCellData(0).getCellText(); + String ident = tableData.getTableRows().get(rowIndex) + .getTableCellData(0).getCellText(); displayTrendSetsGraphDialog(ident); } } @@ -141,10 +159,10 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { } Rectangle rect; - // rect = item.getBounds(table.getColumnCount() - 1); rect = item.getBounds(scanCfg.getCountyColumnIndex(scanTable)); - if (scanCfg.showTips(scanTable) == false && rect.contains(mouseMovePt) == false) { + if (scanCfg.showTips(scanTable) == false + && rect.contains(mouseMovePt) == false) { prevMousePt.x = -9999; prevMousePt.y = -9999; table.setToolTipText(null); @@ -162,17 +180,22 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { prevMousePt.x = mouseMovePt.x; prevMousePt.y = mouseMovePt.y; - String toolTip = toolTipMgr.getTableCellTip(scanTable, (String) table.getColumn(i).getData()); + String toolTip = toolTipMgr.getTableCellTip(scanTable, + (String) table.getColumn(i).getData()); if (i == 0) { - WARN_TYPE wt = tableData.getTableRows().get(table.indexOf(item)).getTableCellData(0).getWarnType(); + WARN_TYPE wt = tableData.getTableRows() + .get(table.indexOf(item)).getTableCellData(0) + .getWarnType(); if (wt == WARN_TYPE.SEVERE) { toolTip = toolTip.concat(UNWARNED_SVR_TOOLTIP); } else if (wt == WARN_TYPE.TVS) { toolTip = toolTip.concat(UNWARNED_TOR_TOOLTIP); } - } else if (((String) table.getColumn(i).getData()).equals(CELLTable.COUNTY.getColName())) { - toolTip = tableData.getTableRows().get(table.indexOf(item)).getTableCellData(i).getCellText(); + } else if (((String) table.getColumn(i).getData()) + .equals(CELLTable.COUNTY.getColName())) { + toolTip = tableData.getTableRows().get(table.indexOf(item)) + .getTableCellData(i).getCellText(); } table.setToolTipText(toolTip); @@ -191,6 +214,17 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { */ @Override protected void setColumnImages() { + + /* + * If the Radius Interpolation, Clutter Control, or sort column hasn't + * changed then return because the images will not change. + */ + if (scanCfg.isRadVar(scanTable, radVarColName) + && scanCfg.isClutterControl(scanTable, clutterCoName) + && lastSortColIndex == sortedColumnIndex) { + return; + } + TableColumn[] tCols = table.getColumns(); for (int i = 0; i < tCols.length; i++) { @@ -215,13 +249,16 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { */ if (scanCfg.isRadVar(scanTable, colName) == true) { + radVarColName = colName; gc.setBackground(scanCfg.getScanColor(ScanColors.RadVar)); } // Set the foreground color to the clutter control color if the // column is a clutter control. if (scanCfg.isClutterControl(scanTable, colName) == true) { - gc.setForeground(scanCfg.getScanColor(ScanColors.ClutterControl)); + clutterCoName = colName; + gc.setForeground(scanCfg + .getScanColor(ScanColors.ClutterControl)); } // Set the background color to the sort color if that column is @@ -237,12 +274,12 @@ public class SCANCellTableComp extends SCANTableTrendGraphLayer { gc.setBackground(scanCfg.getScanColor(ScanColors.Sort)); } + lastSortColIndex = sortedColumnIndex; + gc.fillRectangle(0, 0, imageWidth, imageHeight); int colNameExt = gc.stringExtent(colName).x; - // int xCoord = (imageWidth / 2) - (colName.length() * textWidth / - // 2); int xCoord = (imageWidth / 2) - (colNameExt / 2); gc.drawText(colName, xCoord, 3, true); diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableDlg.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableDlg.java index 3f3a10758d..2701c085a2 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANCellTableDlg.java @@ -54,6 +54,7 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfig; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.MESOTable; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanColors; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; +import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.monitor.IMonitor; import com.raytheon.uf.viz.monitor.events.IMonitorConfigurationEvent; import com.raytheon.uf.viz.monitor.events.IMonitorEvent; @@ -87,6 +88,8 @@ import com.raytheon.viz.ui.EditorUtil; * Nov 21, 2009 #3039 lvenable Initial creation * * 03/15/2012 13939 Mike Duff For a SCAN Alarms issue + * Apr 26, 2013 #1945 lvenable Improved SCAN performance, reworked + * some bad code, and some code cleanup. * * * @@ -99,7 +102,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements private boolean killDialog = false; /* - * Action button at the top of the dialog. + * Action buttons at the top of the dialog. */ private Button configBtn; @@ -180,6 +183,10 @@ public class SCANCellTableDlg extends AbstractTableDlg implements private SCANAlarmsDlg alarmDlg = null; + /** Date format for the time label. */ + private SimpleDateFormat dateFmt = new SimpleDateFormat( + "E MMM dd HH:mm yyyy"); + /** * Constructor. * @@ -209,6 +216,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements */ @Override protected void initComponents() { + dateFmt.setTimeZone(TimeZone.getTimeZone("GMT")); createTopControls(); createCellTable(); createFilePopupMenu(); @@ -231,7 +239,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements } /** - * + * Add an alarm timer. */ private void addAlarmTimer() { if (scanTableComp.timer != null) { @@ -239,6 +247,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements @Override public void run() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { if (shell.isDisposed()) { scanTableComp.timer.cancel(); @@ -437,11 +446,16 @@ public class SCANCellTableDlg extends AbstractTableDlg implements vertChk.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); vertChk.setSelection(cellCfgMgr.getScanCellCfgXML().getFilterOption()); vertChk.setLayoutData(gd); - vertChk.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - } - }); + + /* + * The vertical table is a techblocked DR. This selection listener will + * be commented out until it is needed. + */ + // vertChk.addSelectionListener(new SelectionAdapter() { + // @Override + // public void widgetSelected(SelectionEvent e) { + // } + // }); setupButtonMouseListeners(vertChk); gd = new GridData(); @@ -475,7 +489,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements alarmDlg.open(); if (!alarmBtn.isDisposed() && (mgr.getAlertedAlarmCount(site, scanTable) == 0)) { - turnOffAlarm(); + turnOffAlarm(); } } }); @@ -489,52 +503,19 @@ public class SCANCellTableDlg extends AbstractTableDlg implements @Override public void turnOffAlarm() { - if (alarmBtn != null && !alarmBtn.isDisposed()) { - alarmBtn.setVisible(false); - } + if (alarmBtn != null && !alarmBtn.isDisposed()) { + alarmBtn.setVisible(false); + } mgr.setRing(false); - } + } @Override public void turnOnAlarm() { - if (alarmBtn != null && !alarmBtn.isDisposed()) { - alarmBtn.setVisible(true); - } + if (alarmBtn != null && !alarmBtn.isDisposed()) { + alarmBtn.setVisible(true); + } mgr.setRing(true); - } - - // private void resetButtonForegroundColor(Button btn) - // { - // btn.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); - // } - - // private void setupButtonMouseListeners(final Button btn) - // { - // btn.addMouseMoveListener(new MouseMoveListener() - // { - // @Override - // public void mouseMove(MouseEvent e) - // { - // btn.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); - // } - // - // }); - // - // btn.addMouseTrackListener(new MouseTrackAdapter() - // { - // @Override - // public void mouseExit(MouseEvent e) - // { - // btn.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); - // } - // - // @Override - // public void mouseEnter(MouseEvent e) - // { - // btn.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); - // } - // }); - // } + } /** * Create the CELL table. @@ -605,19 +586,6 @@ public class SCANCellTableDlg extends AbstractTableDlg implements } }); - // new MenuItem(filePopupMenu, SWT.SEPARATOR); - // - // MenuItem exitMI = new MenuItem(filePopupMenu, SWT.NONE); - // exitMI.setText("Exit"); - // exitMI.addSelectionListener(new SelectionAdapter() - // { - // @Override - // public void widgetSelected(SelectionEvent e) - // { - // shellDisposeDialog(); - // } - // }); - fileBtn.setMenu(filePopupMenu); } @@ -903,6 +871,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements */ private void displayMesoTableDialog() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -921,6 +890,7 @@ public class SCANCellTableDlg extends AbstractTableDlg implements */ private void displayTvsTableDialog() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { Iterator iter = getMonitorControlListeners() .iterator(); @@ -943,8 +913,6 @@ public class SCANCellTableDlg extends AbstractTableDlg implements return; } - SimpleDateFormat dateFmt = new SimpleDateFormat("E MMM dd HH:mm yyyy"); - dateFmt.setTimeZone(TimeZone.getTimeZone("GMT")); timeLbl.setText(dateFmt.format(currentTime)); } @@ -1012,144 +980,6 @@ public class SCANCellTableDlg extends AbstractTableDlg implements mb.open(); } - // /** - // * Retrieve the default configuration. - // */ - // private void retrieveDefaultConfig() - // { - // /* - // * TODO : when loading the default config, the controls on the dialog - // * needs to be updated and a new table data should be loaded - // */ - // scanCfg.loadDefaultConfigFileName(scanTable); - // - // updateAfterConfigLoad(); - // } - // - // /** - // * Retrieve an existing configuration. - // */ - // private void retrieveExistingConfig() - // { - // /* - // * TODO : when loading an existing config, the controls on the dialog - // * needs to be updated and a new table data should be loaded - // */ - // - // if (closedOpenDialogs() == false) - // { - // return; - // } - // - // LoadSaveConfigDlg loadDlg = new LoadSaveConfigDlg(shell, DialogType.OPEN, - // scanTable); - // LocalizationFile fileName = loadDlg.open(); - // - // if (fileName == null) - // { - // System.out.println("FileName is null..."); - // return; - // } - // - // scanCfg.loadNewConfigFileName(scanTable, fileName.getFile().getName()); - // - // System.out.println(fileName.getFile().getAbsolutePath()); - // - // updateAfterConfigLoad(); - // - // } - // - // /** - // * Save the current configuration. - // */ - // private void saveCurrentConfiguration() - // { - // /* - // * TODO : save the current configuration... - // * - // * do not need to update the display... - // * - // * call to configuration manager to save the config... - // */ - // - // /* - // * check if the user is trying to save the default config - // */ - // - // if (scanCfg.currentConfigIsDefault(scanTable) == true) - // { - // MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK | - // SWT.CANCEL); - // mb.setText("Overwrite"); - // mb.setMessage("Saving will overwrite the default configuration.\n" + - // "Do you wish to continue?"); - // int result = mb.open(); - // - // // If the user selected Cancel then return. - // if (result == SWT.CANCEL) - // { - // return; - // } - // } - // - // scanCfg.saveCurrentConfigurationFile(scanTable); - // } - // - // /** - // * Save the current configuration as a different name. - // */ - // private void saveConfigurationAs() - // { - // /* - // * TODO : launch the save dialog and then get a name to save the - // configuration. - // * - // * do not need to update the display... - // */ - // String defCfgName = scanCfg.getDefaultConfigName(scanTable); - // - // - // - // LoadSaveConfigDlg loadDlg = new LoadSaveConfigDlg(shell, - // DialogType.SAVE_AS, scanTable); - // LocalizationFile fileName = loadDlg.open(); - // - // if (fileName == null) - // { - // System.out.println("FileName is null..."); - // return; - // } - // - // if (defCfgName.compareTo(fileName.getFile().getName()) == 0) - // { - // MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK | - // SWT.CANCEL); - // mb.setText("Overwrite"); - // mb.setMessage("The Save As name is the same as the default configuration name. Saving " - // + - // "will overwrite the default configuration.\n" + - // "Do you wish to continue?"); - // int result = mb.open(); - // - // // If the user selected Cancel then return. - // if (result == SWT.CANCEL) - // { - // return; - // } - // } - // - // scanCfg.saveConfigurationFileAs(scanTable, fileName.getFile().getName()); - // } - - /** - * Shell closed action. - */ - @Override - protected void shellCloseAction() { - // TODO : this method may be deleted from the abstract - // class if it is not needed - } - /** * Shell dispose action. */ @@ -1164,7 +994,6 @@ public class SCANCellTableDlg extends AbstractTableDlg implements @Override public void shellClosed(ShellEvent e) { e.doit = killDialog; - // unregisterDialog(); } }); } @@ -1186,6 +1015,22 @@ public class SCANCellTableDlg extends AbstractTableDlg implements shell.setText(this.site + " CELL Table"); } + /** + * Update the table with new data. + * + * @param scan + * Scan Monitor. + * @param time + * The new time. + * @param sdg + * Scan Data Generator. + */ + private void updateTable(ScanMonitor scan, Date time, ScanDataGenerator sdg) { + tableData = sdg.generateCellData(scan.getTableData(scanTable, site, + time)); + scanTableComp.setTableData(tableData); + } + /** * Notify when the table data needs to be updated. */ @@ -1193,18 +1038,15 @@ public class SCANCellTableDlg extends AbstractTableDlg implements public void notify(IMonitorEvent me) { if (me.getSource() instanceof IMonitor) { ScanMonitor scan = (ScanMonitor) me.getSource(); - Date time = null; - try { - if (getLinkToFrame(scanTable.name())) { - time = scan.getScanTime(scanTable, site); - } else { - time = scan.getMostRecent(scan, scanTable.name(), site) - .getRefTime(); - } - } catch (Exception e) { + + // If scan is null return since nothing will be done. + if (scan == null) { + return; } - if ((time != null) && (scan != null)) { + Date time = getScanTime(scan); + + if ((time != null)) { ScanDataGenerator sdg = new ScanDataGenerator(site); @@ -1218,21 +1060,18 @@ public class SCANCellTableDlg extends AbstractTableDlg implements sdg.setUnwarnedCells(warnings); } - tableData = sdg.generateCellData((scan).getTableData(scanTable, - site, time)); - - scanTableComp.setTableData(tableData); - - setShellText(); - if (getLinkToFrame(scanTable.name())) { - - currentTime = (scan).getDialogTime(scanTable, site); - + currentTime = scan.getDialogTime(scanTable, site); + updateTimeLabel(); + updateTable(scan, time, sdg); } else { - currentTime = time; + if (currentTime == null || !currentTime.equals(time)) { + currentTime = time; + updateTimeLabel(); + updateTable(scan, time, sdg); + } } - updateTimeLabel(); + scan.fireMonitorEvent(SCANMesoTableDlg.class.getName()); scan.fireMonitorEvent(SCANTvsTableDlg.class.getName()); @@ -1242,11 +1081,10 @@ public class SCANCellTableDlg extends AbstractTableDlg implements // closes the alarm dialog if new data comes in or user switches // frame Date scanMostRecentTime = null; - try { - scanMostRecentTime = scan.getMostRecent(scan, - scanTable.name(), site).getRefTime(); - } catch (NullPointerException npe) { - // scan has been turned off + DataTime dataTime = scan.getMostRecent(scan, scanTable.name(), + site); + if (dataTime != null) { + scanMostRecentTime = dataTime.getRefTime(); } if (scanMostRecentTime != null) { @@ -1265,13 +1103,14 @@ public class SCANCellTableDlg extends AbstractTableDlg implements scanTableComp.checkBlink(sdg, scanMostRecentTime); if (mgr.getAlertedAlarms(site, scanTable).size() > 0) { boolean displayAlarmBtn = false; - for (AlertedAlarms alarm: mgr.getAlertedAlarms(site, scanTable)) { + for (AlertedAlarms alarm : mgr.getAlertedAlarms( + site, scanTable)) { if (!alarm.cleared) { displayAlarmBtn = true; break; } } - + alarmBtn.setVisible(displayAlarmBtn); addAlarmTimer(); } else { diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableComp.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableComp.java index 8f3ab0f83f..1afdb641e1 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableComp.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableComp.java @@ -27,7 +27,6 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableColumn; @@ -55,6 +54,8 @@ import com.raytheon.uf.viz.monitor.scan.commondialogs.TimeHeightDlg; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 3, 2009 #3039 lvenable Initial creation + * Apr 26, 2013 #1945 lvenable Improved SCAN performance, reworked + * some bad code, and some code cleanup. * * * @@ -63,16 +64,14 @@ import com.raytheon.uf.viz.monitor.scan.commondialogs.TimeHeightDlg; */ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements IRequestTimeHeightData { - private Point mouseMovePt = new Point(0, 0); - - private Point mouseDownPt = new Point(0, 0); - - private Point prevMousePt = new Point(-9999, -9999); private TimeHeightDlg timeHeightDlg = null; private IRequestTimeHeightData timeHeightCB; + /** Clutter control column name. */ + private String clutterColName = ""; + public SCANDmdTableComp(Composite parent, SCANTableData tableData, ITableAction tableActionCB, IRequestTrendGraphData requestDataCallback, @@ -85,6 +84,15 @@ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements @Override protected void setColumnImages() { + /* + * If the clutter control & sort column hasn't changed then return + * because the images will not change. + */ + if (scanCfg.isClutterControl(scanTable, clutterColName) + && lastSortColIndex == sortedColumnIndex) { + return; + } + TableColumn[] tCols = table.getColumns(); for (int i = 0; i < tCols.length; i++) { @@ -100,9 +108,9 @@ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements gc.setBackground(this.getDisplay().getSystemColor(SWT.COLOR_BLACK)); // Set the foreground color to the clutter control color if the - // column - // is a clutter control. + // column is a clutter control. if (scanCfg.isClutterControl(scanTable, colName) == true) { + clutterColName = colName; gc.setForeground(scanCfg .getScanColor(ScanColors.ClutterControl)); } @@ -120,12 +128,12 @@ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements gc.setBackground(scanCfg.getScanColor(ScanColors.Sort)); } + lastSortColIndex = sortedColumnIndex; + gc.fillRectangle(0, 0, imageWidth, imageHeight); int colNameExt = gc.stringExtent(colName).x; - // int xCoord = (imageWidth / 2) - (colName.length() * textWidth / - // 2); int xCoord = (imageWidth / 2) - (colNameExt / 2); gc.drawText(colName, xCoord, 3, true); @@ -201,12 +209,6 @@ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements @Override protected void tableMouseMoveAction(MouseEvent event) { - // if (scanCfg.showTips(scanTable) == false) { - // prevMousePt.x = -9999; - // prevMousePt.y = -9999; - // table.setToolTipText(null); - // return; - // } mouseMovePt.x = event.x; mouseMovePt.y = event.y; @@ -219,7 +221,6 @@ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements } Rectangle rect; - // rect = item.getBounds(table.getColumnCount() - 2); rect = item.getBounds(scanCfg.getCountyColumnIndex(scanTable)); if ((scanCfg.showTips(scanTable) == false) @@ -282,9 +283,9 @@ public class SCANDmdTableComp extends SCANTableTrendGraphLayer implements public void redrawTimeHeightGraph() { if ((timeHeightDlg == null) || timeHeightDlg.isDisposed()) { return; - } else { - timeHeightDlg.redrawGraph(); } + + timeHeightDlg.redrawGraph(); } public boolean timeHeightDisplayed() { diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableDlg.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableDlg.java index 64f217a003..4f1867796b 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANDmdTableDlg.java @@ -57,7 +57,6 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanColors; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.monitor.IMonitor; import com.raytheon.uf.viz.monitor.events.IMonitorConfigurationEvent; import com.raytheon.uf.viz.monitor.events.IMonitorEvent; @@ -90,6 +89,8 @@ import com.raytheon.viz.ui.EditorUtil; * Apr 29, 2010 lvenable Initial creation * * 03/15/2012 13939 Mike Duff For a SCAN Alarms issue + * Apr 29, 2013 #1945 lvenable Improved SCAN performance, reworked + * some bad code, and some code cleanup. * * * @@ -315,6 +316,7 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements @Override public void run() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { if (shell.isDisposed()) { dmdTableComp.timer.cancel(); @@ -473,11 +475,16 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements vertChk.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); vertChk.setSelection(dmdConfigMgr.getScanDmdCfgXML().getFilterOption()); vertChk.setLayoutData(gd); - vertChk.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - } - }); + + /* + * The vertical table is a techblocked DR. This will be commented out + * until that is addressed. + */ + // vertChk.addSelectionListener(new SelectionAdapter() { + // @Override + // public void widgetSelected(SelectionEvent e) { + // } + // }); setupButtonMouseListeners(vertChk); gd = new GridData(); @@ -514,7 +521,7 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements alarmsDlg.open(); if (!alarmBtn.isDisposed() && mgr.getAlertedAlarms(site, scanTable).isEmpty()) { - turnOffAlarm(); + turnOffAlarm(); } } }); @@ -522,8 +529,7 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements gd = new GridData(SWT.DEFAULT, SWT.CENTER, false, true); gd.widthHint = 135; elevationLbl = new Label(controlComp, SWT.CENTER | SWT.BORDER); - elevationLbl.setText("* No Elevation *"); // TODO - need to add - // elevation + elevationLbl.setText("* No Elevation *"); elevationLbl.setBackground(elevationLabelColor); elevationLbl.setLayoutData(gd); @@ -677,53 +683,6 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements configBtn.setMenu(configPopupMenu); } - /** - * Create the Rank popup menu. - */ - // private void createRankPopupMenu() { - // rankPopupMenu = new Menu(rankBtn); - - /* - * TODO : need to handle default ranking in the list... DMD -- stRank not - * really clear on how the legacy system handle this. - */ - - /* - * Default menu item - */ - // MenuItem defaultMI = new MenuItem(rankPopupMenu, SWT.NONE); - // defaultMI.setText(SCANConfig.getInstance().getDefaultName()); - // defaultMI.setData(SCANConfig.getInstance().getDefaultName()); - // defaultMI.setEnabled(false); - // defaultMI.addSelectionListener(new SelectionAdapter() - // { - // @Override - // public void widgetSelected(SelectionEvent event) - // { - // handleRankMenuEvent(event); - // } - // }); - // - /* - * Create the remaining rank menus from the configuration - */ - // String[] ranks = SCANConfig.getInstance().getRankColumns(scanTable); - // - // for (String rankStr : ranks) { - // MenuItem mi = new MenuItem(rankPopupMenu, SWT.NONE); - // mi.setText(rankStr); - // mi.setData(rankStr); - // mi.addSelectionListener(new SelectionAdapter() { - // @Override - // public void widgetSelected(SelectionEvent event) { - // handleRankMenuEvent(event); - // } - // }); - // } - // - // rankBtn.setMenu(rankPopupMenu); - // } - /** * Display the Create/Edit trend dialog. */ @@ -893,9 +852,6 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements linkToFrameChk.getSelection()); IMonitorConfigurationEvent imce = new IMonitorConfigurationEvent(this); this.fireConfigUpdate(imce); - - // System.out.println("######## Link to frame is : " + - // linkToFrameChk.getSelection()); } /** @@ -925,15 +881,6 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements } } - /** - * Shell close action. - */ - @Override - protected void shellCloseAction() { - // TODO Auto-generated method stub - - } - /** * Shell dispose action. */ @@ -970,7 +917,6 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements @Override protected void setShellText() { shell.setText(this.site + " DMD Table"); - } /** @@ -994,19 +940,14 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements public void notify(IMonitorEvent me) { if (me.getSource() instanceof IMonitor) { ScanMonitor scan = (ScanMonitor) me.getSource(); - Date time = null; - try { - if (getLinkToFrame(scanTable.name())) { - time = (scan).getScanTime(scanTable, site); - } else { - time = (scan).getMostRecent(scan, scanTable.name(), site) - .getRefTime(); - } - } catch (Exception e) { - statusHandler.handle(Priority.ERROR, "Unable to retrieve time", - e); + + // If scan is null return since nothing will be done. + if (scan == null) { + return; } + Date time = getScanTime(scan); + if ((time != null) && scan.isInstantiated()) { ScanDataGenerator sdg = new ScanDataGenerator(site); ScanTableData data = null; @@ -1070,7 +1011,9 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements && currentTime.equals(scan.getMostRecent(scan, scanTable.name(), site).getRefTime()) && !scanCfg.getAlarmsDisabled(scanTable)) { - dmdTableComp.checkBlink(sdg, scan.getMostRecent(scan, scanTable.name(), site).getRefTime()); + dmdTableComp.checkBlink(sdg, + scan.getMostRecent(scan, scanTable.name(), site) + .getRefTime()); if (mgr.getAlertedAlarms(site, scanTable).size() > 0) { alarmBtn.setVisible(true); addAlarmTimer(); @@ -1298,19 +1241,21 @@ public class SCANDmdTableDlg extends AbstractTableDlg implements dmdTableComp.alarmSelection(ident); } - - public void turnOffAlarm() { - if (alarmBtn != null && !alarmBtn.isDisposed()) { - alarmBtn.setVisible(false); - } - mgr.setRing(false); - } + @Override + public void turnOffAlarm() { + if (alarmBtn != null && !alarmBtn.isDisposed()) { + alarmBtn.setVisible(false); + } + mgr.setRing(false); + } + + @Override public void turnOnAlarm() { - if (alarmBtn != null && !alarmBtn.isDisposed()) { - alarmBtn.setVisible(true); - } + if (alarmBtn != null && !alarmBtn.isDisposed()) { + alarmBtn.setVisible(true); + } mgr.setRing(true); - } + } } diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableComp.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableComp.java index 6d6f5df076..35aa8612bb 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableComp.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableComp.java @@ -20,7 +20,6 @@ package com.raytheon.uf.viz.monitor.scan.tables; import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableItem; @@ -38,6 +37,7 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 2, 2009 #3039 lvenable Initial creation + * Apr 29, 2013 #1945 lvenable Code cleanup for SCAN performance. * * * @@ -45,11 +45,6 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; * @version 1.0 */ public class SCANMesoTableComp extends SCANTable { - // private Point mouseMovePt = new Point(0, 0); - - private Point mouseDownPt = new Point(0, 0); - - // private Point prevMousePt = new Point(-9999, -9999); /** * Constructor. @@ -68,49 +63,6 @@ public class SCANMesoTableComp extends SCANTable { init(); } - /** - * Set the column images for the table columns. - */ - // @Override - // protected void setColumnImages() { - // TableColumn[] tCols = table.getColumns(); - // - // for (int i = 0; i < tCols.length; i++) { - // String colName = (String) tCols[i].getData(); - // Image img = new Image(this.getDisplay(), imageWidth, imageHeight); - // - // GC gc = new GC(img); - // gc.setFont(columnFont); - // - // // Set the initial foreground and background colors. - // gc.setForeground(this.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - // gc.setBackground(this.getDisplay().getSystemColor(SWT.COLOR_BLACK)); - // - // // Set the background color to the sort color if that column is - // // sorted. - // if (sortedColumnIndex == -1) { - // scanCfg.getDefaultName(); - // String sortColName = scanCfg.getDefaultRank(this.scanTable); - // int colIndex = scanCfg.getColumnIndex(scanTable, sortColName); - // sortedColumnIndex = colIndex; - // } - // if (table.indexOf(tCols[i]) == sortedColumnIndex) { - // gc.setBackground(scanCfg.getScanColor(ScanColors.Sort)); - // } - // - // gc.fillRectangle(0, 0, imageWidth, imageHeight); - // - // int xCoord = (imageWidth / 2) - (colName.length() * textWidth / 2); - // - // gc.drawText(colName, xCoord, 3, true); - // - // gc.dispose(); - // tCols[i].setImage(img); - // - // img.dispose(); - // } - // } - @Override protected void tableMouseDownAction(MouseEvent event) { mouseDownPt.x = event.x; @@ -154,13 +106,4 @@ public class SCANMesoTableComp extends SCANTable { } } } - - // @Override - // protected void tableMouseMoveAction(MouseEvent event) { - // /* - // * The legacy system has tool tip text indicating trend dialogs can be - // * launched but that is not the case. There should not be tool tip text - // * at this time. - // */ - // } } diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableDlg.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableDlg.java index e837e49f45..a2dead5a7b 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANMesoTableDlg.java @@ -60,9 +60,29 @@ import com.raytheon.uf.viz.monitor.scan.commondialogs.SCANAttributesDlg; import com.raytheon.uf.viz.monitor.scan.commondialogs.SCANColorThreshDlg; import com.raytheon.uf.viz.monitor.scan.data.ScanDataGenerator; +/** + * + * Scan dialog for the MESO table. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 29, 2013 #1945      lvenable    Code cleanup for SCAN performance.
+ * 
+ * 
+ * + * @author lvenable + * @version 1.0 + */ public class SCANMesoTableDlg extends AbstractTableDlg implements IAttributeUpdate, IThresholdUpdate { + /* + * Buttons at the top of the dialog and the popup menus. + */ private Button configBtn; private Button rankBtn; @@ -96,6 +116,16 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements private Date currentTime = null; + /** + * Constructor. + * + * @param parentShell + * Parent shell. + * @param site + * Site name. + * @param tableData + * Data to be displayed in the table. + */ public SCANMesoTableDlg(Shell parentShell, String site, SCANTableData tableData) { super(parentShell); @@ -221,11 +251,16 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements vertChk.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); vertChk.setSelection(mesoCfgMgr.getScanMesoCfgXML().getFilterOption()); vertChk.setLayoutData(gd); - vertChk.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - } - }); + + /* + * The vertical table is a techblocked DR. This selection listener will + * be commented out until it is needed. + */ + // vertChk.addSelectionListener(new SelectionAdapter() { + // @Override + // public void widgetSelected(SelectionEvent e) { + // } + // }); setupButtonMouseListeners(vertChk); gd = new GridData(); @@ -353,47 +388,6 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements configBtn.setMenu(configPopupMenu); } - // private void createRankPopupMenu() { - // rankPopupMenu = new Menu(rankBtn); - - // TODO : need to handle default ranking in the list... MESO -- mdaSR - - /* - * Default menu item - */ - // MenuItem defaultMI = new MenuItem(rankPopupMenu, SWT.NONE); - // defaultMI.setText(SCANConfig.getInstance().getDefaultName()); - // defaultMI.setData(SCANConfig.getInstance().getDefaultName()); - // defaultMI.setEnabled(false); - // defaultMI.addSelectionListener(new SelectionAdapter() - // { - // @Override - // public void widgetSelected(SelectionEvent event) - // { - // handleRankMenuEvent(event); - // } - // }); - // - /* - * Create the remaining rank menus from the configuration - */ - // String[] ranks = SCANConfig.getInstance().getRankColumns(scanTable); - // - // for (String rankStr : ranks) { - // MenuItem mi = new MenuItem(rankPopupMenu, SWT.NONE); - // mi.setText(rankStr); - // mi.setData(rankStr); - // mi.addSelectionListener(new SelectionAdapter() { - // @Override - // public void widgetSelected(SelectionEvent event) { - // handleRankMenuEvent(event); - // } - // }); - // } - // - // rankBtn.setMenu(rankPopupMenu); - // } - private void displayAttributesDialog() { if ((attributeDlg == null) || (attributeDlg.getParent().isDisposed() == true)) { @@ -459,12 +453,6 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements this.fireDialogShutdown(this); } - @Override - protected void shellCloseAction() { - // TODO : this method may be deleted from the abstract - // class if it is not needed - } - @Override protected void shellDisposeAction() { shell.addDisposeListener(new DisposeListener() { @@ -474,16 +462,6 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements unregisterDialogFromMonitor(); } }); - - // shell.addShellListener(new ShellAdapter() - // { - // @Override - // public void shellClosed(ShellEvent e) - // { - // System.out.println("MESO dialog SHELL CLOSED"); - // unregisterDialog(); - // } - // }); } @Override @@ -506,36 +484,29 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements @Override public void notify(IMonitorEvent me) { if (me.getSource() instanceof IMonitor) { - // System.out.println("SCAN MESO Table Notify Event Received"); ScanMonitor scan = (ScanMonitor) me.getSource(); - Date time = null; - try { - if (getLinkToFrame(scanTable.name())) { - time = scan.getScanTime(scanTable, site); - } else { - time = scan.getMostRecent(scan, scanTable.name(), site) - .getRefTime(); - } - } catch (Exception e) { + + // If scan is null return since nothing will be done. + if (scan == null || scanTableComp.isDisposed()) { + return; } + + Date time = getScanTime(scan); + if (time != null) { ScanDataGenerator sdg = new ScanDataGenerator(site); - // scanTableComp.setTableData(sdg.generateMesoData(scan - // .getTableData(ScanTables.MESO, time))); ScanTableData data = scan.getTableData(ScanTables.MESO, site, time); - if (!scanTableComp.isDisposed()) { - scanTableComp.setTableData(sdg.generateMesoData(data)); - setShellText(); - if (getLinkToFrame(scanTable.name())) { - currentTime = scan.getDialogTime(scanTable, site); - } else { - currentTime = time; - } - updateTimeLabel(); + scanTableComp.setTableData(sdg.generateMesoData(data)); + + if (getLinkToFrame(scanTable.name())) { + currentTime = scan.getDialogTime(scanTable, site); + } else { + currentTime = time; } + updateTimeLabel(); } } } @@ -647,14 +618,14 @@ public class SCANMesoTableDlg extends AbstractTableDlg implements return false; } - @Override - public void turnOffAlarm() { - mgr.setRing(false); - } + @Override + public void turnOffAlarm() { + mgr.setRing(false); + } - @Override - public void turnOnAlarm() { - mgr.setRing(true); - } + @Override + public void turnOnAlarm() { + mgr.setRing(true); + } } diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTable.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTable.java index 2ed9667086..88a5372425 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTable.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTable.java @@ -62,15 +62,26 @@ import com.raytheon.uf.viz.monitor.scan.ScanMonitor; import com.raytheon.uf.viz.monitor.scan.data.ScanDataGenerator; import com.raytheon.uf.viz.monitor.scan.tables.SCANAlarmAlertManager.AlertedAlarms; -/* Modification History: - * Date Ticket# Name Change - * ------------ ---------- ------------ -------------------------- - * 02/23/2012 14538 Xiaochuan Fix TVS table default rank. +/** * - * 03/15/2012 13939 Mike Duff For a SCAN Alarms issue - * + * Abstract scan table class used for the CELL, DMD, MESO, and TVS tables.. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 02/23/2012   14538      Xiaochuan   Fix TVS table default rank.
+ * 03/15/2012   13939      Mike Duff   For a SCAN Alarms issue
+ * Apr 29, 2013 #1945      lvenable    Improved SCAN performance, reworked
+ *                                     some bad code, and some code cleanup.
+ * 
+ * 
+ * + * @author lvenable + * @version 1.0 */ - public abstract class SCANTable extends Composite { protected Table table; @@ -140,6 +151,24 @@ public abstract class SCANTable extends Composite { protected Point prevMousePt = new Point(-9999, -9999); + /** + * Last sorted column index. This is set to -2 because sortedColumnIndex is + * set to -1 and they should not have the same initial value at start up. + */ + protected int lastSortColIndex = -2; + + /** + * Constructor. + * + * @param parent + * Parent composite. + * @param tableData + * Data to be display into the table. + * @param tableActionCB + * Callback when the table is clicked. + * @param site + * Site name. + */ public SCANTable(Composite parent, SCANTableData tableData, ITableAction tableActionCB, String site) { super(parent, 0); @@ -176,8 +205,6 @@ public abstract class SCANTable extends Composite { createTableItems(); - // packColumns(); - sortedColumnIndex = -1; sortTableUsingConfig(); @@ -185,6 +212,7 @@ public abstract class SCANTable extends Composite { showHideTableColumns(); this.addDisposeListener(new DisposeListener() { + @Override public void widgetDisposed(DisposeEvent arg0) { if ((scanTable == ScanTables.CELL) || (scanTable == ScanTables.DMD)) { @@ -209,11 +237,6 @@ public abstract class SCANTable extends Composite { gd.heightHint = 175; gd.widthHint = scanCfg.getDefaultTableWidth(scanTable); - // ********************************************************** - // ********************************************************** - // ********************************************************** - // ********************************************************** - boolean[] visCols = scanCfg.getVisibleColumns(scanTable); int tableWidth = 0; @@ -223,17 +246,6 @@ public abstract class SCANTable extends Composite { } } - System.out.println("widthHint = " + gd.widthHint); - System.out.println("tableWidth = " + tableWidth); - - // ********************************************************** - // ********************************************************** - // ********************************************************** - // ********************************************************** - // ********************************************************** - - // table = new Table(this, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL - // | SWT.FULL_SELECTION); table = new Table(this, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); table.setLayoutData(gd); table.setHeaderVisible(true); @@ -243,13 +255,9 @@ public abstract class SCANTable extends Composite { gc.dispose(); table.addListener(SWT.PaintItem, new Listener() { + @Override public void handleEvent(Event event) { - // if (scanTable != ScanTables.CELL) { - // // System.out.println("scanTable = " + scanTable.name()); - // // System.out.println("in paintListener"); - // } - if (tableData.getTableRows().size() != 0) { table.deselectAll(); event.gc.setForeground(lineColor); @@ -262,10 +270,7 @@ public abstract class SCANTable extends Composite { rect.height); // Draw an extra line on the edges of the table cell to hide - // the - // white lines - // dividing the columns; - // event.gc.setLineWidth(2); + // the white lines dividing the columns; event.gc.drawLine(rect.x + rect.width - 2, rect.y - 1, rect.x + rect.width - 2, rect.y - 1 + rect.height); @@ -284,9 +289,6 @@ public abstract class SCANTable extends Composite { } } else { - // System.out.println("scanTable = " + scanTable.name()); - // System.out.println("event.index = " + event.index); - if ((event.index >= 0) || (event.index <= 6)) { int offset = 0; @@ -299,7 +301,6 @@ public abstract class SCANTable extends Composite { event.gc.setForeground(getParent().getShell() .getDisplay().getSystemColor(SWT.COLOR_GREEN)); - // event.gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); int y = event.y + (event.height - extent.y) / 2; event.gc.drawString(noDataStr, event.x - offset, y); @@ -357,7 +358,6 @@ public abstract class SCANTable extends Composite { @Override public void widgetSelected(SelectionEvent event) { tableColumnSelectAction(event); - } }); @@ -380,13 +380,6 @@ public abstract class SCANTable extends Composite { } setColumnImages(); - - // - // TODO : Rank is default so we have to sort by the default - fix this - // - // TableColumn stc = table.getColumn(0); - - // TODO : Will need to fix with the default ranking sortedColumnIndex = -1; } @@ -545,15 +538,14 @@ public abstract class SCANTable extends Composite { tableData = td; if ((tableData == null) || (tableData.getTableRows().size() == 0)) { - // System.out.println("*** no data"); - // table.setEnabled(true); + table.removeAll(); /* * This TableItem is needed to draw "No Detections" on. Do not * remove it. */ - TableItem item = new TableItem(table, SWT.NONE); + new TableItem(table, SWT.NONE); table.setBackground(getParent().getShell().getDisplay() .getSystemColor(SWT.COLOR_BLACK)); @@ -629,10 +621,10 @@ public abstract class SCANTable extends Composite { return; } - if( scanTable == ScanTables.TVS && sortedIndex == -1) - { + if (scanTable == ScanTables.TVS && sortedIndex == -1) { sortedIndex = TVSTable.valueOf("IDENT").ordinal(); } + // get the ident, if a row is outlined in blue if (tableIndex >= 0) { SCANTableRowData stdr = tableData.getTableRows().get(tableIndex); @@ -670,12 +662,9 @@ public abstract class SCANTable extends Composite { } else { tableData.sortDefault(); } + createTableItems(); - // packColumns(); - - showHideTableColumns(); - if (timer != null) { timer.cancel(); } @@ -684,11 +673,14 @@ public abstract class SCANTable extends Composite { } ScanDataGenerator sdg = new ScanDataGenerator(site); - if ((scanTable == ScanTables.CELL) || ((scanTable == ScanTables.DMD) - && !mgr.getAlertedAlarms(site, scanTable).isEmpty())) { + if ((scanTable == ScanTables.CELL) + || ((scanTable == ScanTables.DMD) && !mgr.getAlertedAlarms( + site, scanTable).isEmpty())) { ScanMonitor monitor = ScanMonitor.getInstance(); if (monitor.getMostRecent(monitor, scanTable.name(), site) != null) { - checkBlink(sdg, monitor.getMostRecent(monitor, scanTable.name(), site).getRefTime()); + checkBlink(sdg, + monitor.getMostRecent(monitor, scanTable.name(), site) + .getRefTime()); } } @@ -753,7 +745,6 @@ public abstract class SCANTable extends Composite { private void packSingleColumn(TableColumn tc, int index) { tc.pack(); - // tCols[i].setWidth(table.getColumn(i).getWidth() + 5); tc.setWidth(table.getColumn(index).getWidth() + 2); if (tc.getWidth() > defaultColWidth) { @@ -791,20 +782,11 @@ public abstract class SCANTable extends Composite { maxTextLength = colNames[i].length(); } - // System.out.println("--- column name = " + colNames[i]); - // System.out.println("--- extent = " + - // gc.stringExtent(colNames[i])); - if (gc.stringExtent(colNames[i]).x > maxColNameExtent) { maxColNameExtent = gc.stringExtent(colNames[i]).x; } } - // System.out.println("maxColNameExtent = " + maxColNameExtent + " - " - // + scanTable.name()); - - // imageWidth = maxTextLength * textWidth + 6; - // imageWidth = maxColNameExtent + 2; imageWidth = maxColNameExtent; imageHeight = textHeight + 4; @@ -812,6 +794,9 @@ public abstract class SCANTable extends Composite { image.dispose(); } + /** + * Update the column tooltip text. + */ public void updateColumnTips() { if (scanCfg.showTips(scanTable) == false) { TableColumn[] tCols = table.getColumns(); @@ -827,8 +812,6 @@ public abstract class SCANTable extends Composite { (String) tCols[i].getData())); } } - - // TODO - need the column tool tip text to be set } /** @@ -919,6 +902,7 @@ public abstract class SCANTable extends Composite { @Override public void run() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { runTimerTask(); } @@ -932,6 +916,7 @@ public abstract class SCANTable extends Composite { @Override public void run() { Display.getDefault().asyncExec(new Runnable() { + @Override public void run() { // Fail-safe check to determine if the we have no @@ -966,9 +951,7 @@ public abstract class SCANTable extends Composite { private void runTimerTask() { // Fail-safe check to determine if the we have - // no - // data - // in the table data. + // no data in the table data. if ((timer != null) && (tableData != null)) { if (tableData.getTableRows().size() == 0) { if (timer != null) { @@ -986,27 +969,26 @@ public abstract class SCANTable extends Composite { boolean allClear = true; ArrayList points = new ArrayList(); - Set alarmList = mgr.getAlertedAlarms(site, scanTable); - for (int i = 0; i < tableData - .getNumberOfDataRows(); i++) { + Set alarmList = mgr.getAlertedAlarms(site, + scanTable); + for (int i = 0; i < tableData.getNumberOfDataRows(); i++) { TableItem ti = table.getItem(i); if (ti == null) { continue; } if ((alarmList != null) && (alarmList.size() > 0)) { - for (AlertedAlarms alarm: alarmList) { - if (tableData.getTableRows().get(i).getIdent().equals(alarm.ident)) { + for (AlertedAlarms alarm : alarmList) { + if (tableData.getTableRows().get(i).getIdent() + .equals(alarm.ident)) { if (alarm.cleared == false) { ti.setBackground(alarm.col, blinkColor); allClear = false; // handle the beep while // looking at // all the cells - if (SCANConfig - .getInstance() - .getAlarmBell( - scanTable)) { + if (SCANConfig.getInstance().getAlarmBell( + scanTable)) { mgr.setRing(true); } } else { @@ -1016,10 +998,9 @@ public abstract class SCANTable extends Composite { } } } - + for (int i = 0; i < points.size(); i++) { - updateThresholds(points.get(i).x, - points.get(i).y); + updateThresholds(points.get(i).x, points.get(i).y); } // checks if there are no more alarms @@ -1030,9 +1011,9 @@ public abstract class SCANTable extends Composite { timer.purge(); } } - } + } } - + public Timer getBlinkTimer() { if (timer == null) { timer = new Timer(); @@ -1056,6 +1037,9 @@ public abstract class SCANTable extends Composite { blinkColor = Display.getDefault().getSystemColor(blinkColorInt); } + /** + * Redraw the table. + */ public void redrawTable() { table.redraw(); } @@ -1066,6 +1050,14 @@ public abstract class SCANTable extends Composite { * DMD do this). */ protected void setColumnImages() { + /* + * If the sort column hasn't changed then return because the images will + * not change. + */ + if (lastSortColIndex == sortedColumnIndex) { + return; + } + TableColumn[] tCols = table.getColumns(); for (int i = 0; i < tCols.length; i++) { @@ -1082,13 +1074,16 @@ public abstract class SCANTable extends Composite { // Set the background color to the sort color if that column is // sorted. - // sortedColumnIndex=-1 is default sort + // sortedColumnIndex=-1 is default sort if (sortedColumnIndex == -1) { scanCfg.getDefaultName(); String sortColName = scanCfg.getDefaultRank(this.scanTable); int colIndex = scanCfg.getColumnIndex(scanTable, sortColName); sortedColumnIndex = colIndex; } + + lastSortColIndex = sortedColumnIndex; + if (table.indexOf(tCols[i]) == sortedColumnIndex) { gc.setBackground(scanCfg.getScanColor(ScanColors.Sort)); } @@ -1124,7 +1119,6 @@ public abstract class SCANTable extends Composite { } Rectangle rect; - // rect = item.getBounds(table.getColumnCount() - 1); rect = item.getBounds(scanCfg.getCountyColumnIndex(scanTable)); if ((scanCfg.showTips(scanTable) == false) @@ -1229,5 +1223,4 @@ public abstract class SCANTable extends Composite { * Mouse event. */ protected abstract void tableMouseDownAction(MouseEvent event); - } diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableComp.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableComp.java index 0b694e0471..b0efbdd72f 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableComp.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableComp.java @@ -20,7 +20,6 @@ package com.raytheon.uf.viz.monitor.scan.tables; import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableItem; @@ -38,6 +37,7 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 3, 2009 #3039 lvenable Initial creation + * Apr 29, 2013 #1945 lvenable Code cleanup for SCAN performance. * * * @@ -45,12 +45,19 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; * @version 1.0 */ public class SCANTvsTableComp extends SCANTable { - private Point mouseMovePt = new Point(0, 0); - - private Point mouseDownPt = new Point(0, 0); - - private Point prevMousePt = new Point(-9999, -9999); + /** + * Constructor. + * + * @param parent + * Parent composite. + * @param tableData + * Data to be displayed in the table. + * @param tableActionCB + * Callback called when the table is clicked. + * @param site + * The site name. + */ public SCANTvsTableComp(Composite parent, SCANTableData tableData, ITableAction tableActionCB, String site) { super(parent, tableData, tableActionCB, site); @@ -58,46 +65,6 @@ public class SCANTvsTableComp extends SCANTable { init(); } - // @Override - // protected void setColumnImages() { - // TableColumn[] tCols = table.getColumns(); - // - // for (int i = 0; i < tCols.length; i++) { - // String colName = (String) tCols[i].getData(); - // Image img = new Image(this.getDisplay(), imageWidth, imageHeight); - // - // GC gc = new GC(img); - // gc.setFont(columnFont); - // - // // Set the initial foreground and background colors. - // gc.setForeground(this.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - // gc.setBackground(this.getDisplay().getSystemColor(SWT.COLOR_BLACK)); - // - // // Set the background color to the sort color if that column is - // // sorted. - // if (sortedColumnIndex == -1) { - // scanCfg.getDefaultName(); - // String sortColName = scanCfg.getDefaultRank(this.scanTable); - // int colIndex = scanCfg.getColumnIndex(scanTable, sortColName); - // sortedColumnIndex = colIndex; - // } - // if (table.indexOf(tCols[i]) == sortedColumnIndex) { - // gc.setBackground(scanCfg.getScanColor(ScanColors.Sort)); - // } - // - // gc.fillRectangle(0, 0, imageWidth, imageHeight); - // - // int xCoord = (imageWidth / 2) - (colName.length() * textWidth / 2); - // - // gc.drawText(colName, xCoord, 3, true); - // - // gc.dispose(); - // tCols[i].setImage(img); - // - // img.dispose(); - // } - // } - @Override protected void tableMouseDownAction(MouseEvent event) { mouseDownPt.x = event.x; @@ -140,12 +107,4 @@ public class SCANTvsTableComp extends SCANTable { } } } - - // @Override - // protected void tableMouseMoveAction(MouseEvent event) { - // /* - // * TODO: Looking at the WES the TVS table is empty. Need to look at the - // * legacy code to determine if there are tool tip texts for the cells. - // */ - // } } diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableDlg.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableDlg.java index aca8b68deb..fe76b4800e 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/tables/SCANTvsTableDlg.java @@ -59,6 +59,23 @@ import com.raytheon.uf.viz.monitor.scan.commondialogs.SCANAttributesDlg; import com.raytheon.uf.viz.monitor.scan.commondialogs.SCANColorThreshDlg; import com.raytheon.uf.viz.monitor.scan.data.ScanDataGenerator; +/** + * + * Dialog for the SCAN TVS table. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 29, 2013 #1945      lvenable    Code cleanup for SCAN performance.
+ * 
+ * 
+ * + * @author lvenable + * @version 1.0 + */ public class SCANTvsTableDlg extends AbstractTableDlg implements IAttributeUpdate, IThresholdUpdate { private Button configBtn; @@ -91,6 +108,16 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements private Date currentTime = null; + /** + * Constructor. + * + * @param parentShell + * Parent shell. + * @param site + * Site name. + * @param tableData + * Tabel data. + */ public SCANTvsTableDlg(Shell parentShell, String site, SCANTableData tableData) { super(parentShell); @@ -215,11 +242,16 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements vertChk.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); vertChk.setSelection(tvsCfgMgr.getScanTvsCfgXML().getFilterOption()); vertChk.setLayoutData(gd); - vertChk.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - } - }); + + /* + * The vertical table is a techblocked DR. This selection listener will + * be commented out until it is needed. + */ + // vertChk.addSelectionListener(new SelectionAdapter() { + // @Override + // public void widgetSelected(SelectionEvent e) { + // } + // }); setupButtonMouseListeners(vertChk); gd = new GridData(); @@ -347,47 +379,6 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements configBtn.setMenu(configPopupMenu); } - // private void createRankPopupMenu() { - // rankPopupMenu = new Menu(rankBtn); - - // TODO : need to handle default ranking in the list... MESO -- mdaSR - - /* - * Default menu item - */ - // MenuItem defaultMI = new MenuItem(rankPopupMenu, SWT.NONE); - // defaultMI.setText(SCANConfig.getInstance().getDefaultName()); - // defaultMI.setData(SCANConfig.getInstance().getDefaultName()); - // defaultMI.setEnabled(false); - // defaultMI.addSelectionListener(new SelectionAdapter() - // { - // @Override - // public void widgetSelected(SelectionEvent event) - // { - // handleRankMenuEvent(event); - // } - // }); - // - /* - * Create the remaining rank menus from the configuration - */ - // String[] ranks = SCANConfig.getInstance().getRankColumns(scanTable); - // - // for (String rankStr : ranks) { - // MenuItem mi = new MenuItem(rankPopupMenu, SWT.NONE); - // mi.setText(rankStr); - // mi.setData(rankStr); - // mi.addSelectionListener(new SelectionAdapter() { - // @Override - // public void widgetSelected(SelectionEvent event) { - // handleRankMenuEvent(event); - // } - // }); - // } - // - // rankBtn.setMenu(rankPopupMenu); - // } - private void displayAttributesDialog() { if ((attributeDlg == null) || (attributeDlg.getParent().isDisposed() == true)) { @@ -451,18 +442,11 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements this.fireDialogShutdown(this); } - @Override - protected void shellCloseAction() { - // TODO : this method may be deleted from the abstract - // class if it is not needed - } - @Override protected void shellDisposeAction() { shell.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { - System.out.println("TVS dialog DISPOSED"); unregisterDialogFromMonitor(); } }); @@ -470,7 +454,6 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements shell.addShellListener(new ShellAdapter() { @Override public void shellClosed(ShellEvent e) { - System.out.println("TVS dialog SHELL CLOSED"); unregisterDialogFromMonitor(); } }); @@ -496,35 +479,47 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements @Override public void notify(IMonitorEvent me) { if (me.getSource() instanceof IMonitor) { - // System.out.println("SCAN TVS Table Notify Event Received"); ScanMonitor scan = (ScanMonitor) me.getSource(); - Date time = null; - try { - if (getLinkToFrame(scanTable.name())) { - time = scan.getScanTime(scanTable, site); - } else { - time = scan.getMostRecent(scan, scanTable.name(), site) - .getRefTime(); - } - } catch (Exception e) { - } - if (time != null && !scanTableComp.isDisposed()) { - ScanDataGenerator sdg = new ScanDataGenerator(site); - scanTableComp.setTableData(sdg.generateTVSData(scan - .getTableData(ScanTables.TVS, site, time))); - setShellText(); + // If scan is null or the scan table has been disposed then return + // since nothing will be done. + if (scan == null || scanTableComp.isDisposed()) { + return; + } + + Date time = getScanTime(scan); + + if (time != null) { + if (getLinkToFrame(scanTable.name())) { currentTime = scan.getDialogTime(scanTable, site); + updateTimeLabel(); + updateTable(scan, time); } else { - currentTime = time; + if (currentTime == null || !currentTime.equals(time)) { + currentTime = time; + updateTimeLabel(); + updateTable(scan, time); + } } - updateTimeLabel(); - // System.out.println("SCAN TVS Table Updated Time Label"); } } } + /** + * Update the table with new data. + * + * @param scan + * Scan Monitor. + * @param time + * New time. + */ + private void updateTable(ScanMonitor scan, Date time) { + ScanDataGenerator sdg = new ScanDataGenerator(site); + scanTableComp.setTableData(sdg.generateTVSData(scan.getTableData( + ScanTables.TVS, site, time))); + } + @Override public void centerByIdent(String ident) { fireRecenter(ident, ScanTables.TVS, site); @@ -590,9 +585,11 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements // NOT USED } + /* + * Update the threshold in the composite contained in this dialog for the + * desired attribute in the dialog. + */ @Override - // Update the threshold in the composite contained in this dialog for the - // desired attribute in the dialog. public void updateThresh(String attr) { this.scanTableComp.updateThresholds(attr); } @@ -610,13 +607,13 @@ public class SCANTvsTableDlg extends AbstractTableDlg implements return false; } - @Override - public void turnOffAlarm() { - mgr.setRing(false); - } + @Override + public void turnOffAlarm() { + mgr.setRing(false); + } - @Override - public void turnOnAlarm() { - mgr.setRing(true); - } + @Override + public void turnOnAlarm() { + mgr.setRing(true); + } } diff --git a/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java b/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java index 4ff2dfb379..b2552c9f0e 100644 --- a/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java +++ b/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java @@ -61,6 +61,8 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 6, 2011 bsteffen Initial creation + * May 02, 2013 1949 bsteffen Switch Product Browser from uengine to + * DbQueryRequest. * * * @@ -91,7 +93,7 @@ public class CrimssDataDefinition @Override protected String[] queryData(String param, - HashMap queryList) { + Map queryList) { if (param.equals(POINT)) { // TODO depending on how much data we have this might be way too // data to request. diff --git a/cave/com.raytheon.uf.viz.productbrowser/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.productbrowser/META-INF/MANIFEST.MF index 73fe762c86..3778a53e41 100644 --- a/cave/com.raytheon.uf.viz.productbrowser/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.uf.viz.productbrowser/META-INF/MANIFEST.MF @@ -25,7 +25,6 @@ Export-Package: com.raytheon.uf.viz.productbrowser; com.raytheon.uf.viz.productbrowser.actions;uses:="org.eclipse.core.commands", com.raytheon.uf.viz.productbrowser.bookmarks, com.raytheon.uf.viz.productbrowser.xml -Import-Package: com.raytheon.edex.scriptfactory, +Import-Package: com.raytheon.uf.common.dataplugin, com.raytheon.uf.common.message.response, - com.raytheon.uf.common.serialization, - com.raytheon.uf.viz.core.catalog + com.raytheon.uf.common.serialization diff --git a/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/AbstractRequestableProductBrowserDataDefinition.java b/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/AbstractRequestableProductBrowserDataDefinition.java index 074c8de473..147892842a 100644 --- a/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/AbstractRequestableProductBrowserDataDefinition.java +++ b/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/AbstractRequestableProductBrowserDataDefinition.java @@ -31,27 +31,29 @@ import javax.xml.bind.annotation.XmlAccessorType; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.DescriptorMap; import com.raytheon.uf.viz.core.IDisplayPaneContainer; -import com.raytheon.uf.viz.core.catalog.CatalogQuery; -import com.raytheon.uf.viz.core.catalog.DbQuery; +import com.raytheon.uf.viz.core.RecordFactory; import com.raytheon.uf.viz.core.drawables.AbstractRenderableDisplay; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.procedures.Bundle; +import com.raytheon.uf.viz.core.requests.ThriftClient; import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; import com.raytheon.uf.viz.core.rsc.ResourceProperties; import com.raytheon.uf.viz.core.rsc.ResourceType; import com.raytheon.uf.viz.productbrowser.ProductBrowserPreference.PreferenceType; -import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.BundleProductLoader; +import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.VizWorkbenchManager; import com.raytheon.viz.ui.editor.AbstractEditor; import com.raytheon.viz.ui.perspectives.AbstractVizPerspectiveManager; @@ -66,6 +68,8 @@ import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 3, 2010 mnash Initial creation + * May 02, 2013 1949 bsteffen Switch Product Browser from uengine to + * DbQueryRequest. * * * @@ -103,23 +107,23 @@ public abstract class AbstractRequestableProductBrowserDataDefinition parameters = null; + Object[] parameters = null; if (order.length >= 1) { try { - DbQuery query = new DbQuery(productName); - query.setMaxResults(1); - parameters = query.performQuery(); + DbQueryRequest request = new DbQueryRequest(); + request.setEntityClass(RecordFactory.getInstance() + .getPluginClass(productName)); + request.setLimit(1); + DbQueryResponse response = (DbQueryResponse) ThriftClient + .sendRequest(request); + parameters = response.getEntityObjects(Object.class); } catch (VizException e) { statusHandler.handle(Priority.ERROR, "Unable to populate initial product tree", e); } - if (parameters != null && !parameters.isEmpty()) { - if (parameters.get(0).length > 0) { - return displayName; - } else { - return null; - } + if (parameters != null && parameters.length != 0) { + return displayName; } else { return null; } @@ -172,9 +176,26 @@ public abstract class AbstractRequestableProductBrowserDataDefinition queryList) { + Map queryList) { try { - return CatalogQuery.performQuery(param, queryList); + DbQueryRequest request = new DbQueryRequest(); + request.setEntityClass(RecordFactory.getInstance().getPluginClass( + productName)); + request.setConstraints(queryList); + request.addRequestField(param); + request.setDistinct(true); + DbQueryResponse response = (DbQueryResponse) ThriftClient + .sendRequest(request); + Object[] paramObjs = response.getFieldObjects(param, Object.class); + if (paramObjs != null) { + String[] params = new String[paramObjs.length]; + for (int i = 0; i < params.length; i += 1) { + if (paramObjs[i] != null) { + params[i] = paramObjs[i].toString(); + } + } + return params; + } } catch (VizException e) { statusHandler .handle(Priority.PROBLEM, "Unable to perform query", e); @@ -238,16 +259,14 @@ public abstract class AbstractRequestableProductBrowserDataDefinition labels = formatData(order[i], items); if (labels != null) { for (int j = 0; j < labels.size(); j++) { historyList.add(labels.get(j).getName()); } } - } catch (VizException e) { - e.printStackTrace(); } } return historyList; diff --git a/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/ProductBrowserView.java b/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/ProductBrowserView.java index 8651e66f30..424d46635f 100644 --- a/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/ProductBrowserView.java +++ b/cave/com.raytheon.uf.viz.productbrowser/src/com/raytheon/uf/viz/productbrowser/ProductBrowserView.java @@ -79,6 +79,8 @@ import com.raytheon.uf.viz.productbrowser.xml.ProductBrowserBookmarksXML; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 3, 2010 mnash Initial creation + * May 02, 2013 1949 bsteffen Switch Product Browser from uengine to + * DbQueryRequest. * * * @@ -141,7 +143,7 @@ public class ProductBrowserView extends ViewPart { // createBookmarkTreeContextMenu(); createProductTree(fullComp); createProductBrowserContextMenu(); - createSearchBar(fullComp); + // createSearchBar(fullComp); } /** diff --git a/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientComponent.java b/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientComponent.java index f2a2ff1134..d3790c5aba 100644 --- a/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientComponent.java +++ b/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientComponent.java @@ -27,6 +27,7 @@ import java.util.List; import javax.xml.bind.JAXBException; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.application.WorkbenchAdvisor; import org.osgi.framework.Bundle; @@ -67,7 +68,8 @@ import com.raytheon.viz.ui.personalities.awips.CAVE; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Aug 4, 2011 njensen Initial creation + * Aug 4, 2011 njensen Initial creation + * Apr 23, 2013 1939 randerso Return null from initializeSerialization * * * @@ -192,6 +194,7 @@ public class ThinClientComponent extends CAVE implements IThinClientComponent { } } + @Override public void stopComponent() { // Persist caches cacheManager.storeCaches(); @@ -201,13 +204,15 @@ public class ThinClientComponent extends CAVE implements IThinClientComponent { } @Override - protected void initializeSerialization() { + protected Job initializeSerialization() { try { SerializationUtil.getJaxbContext(); } catch (JAXBException e) { statusHandler.handle(Priority.CRITICAL, "An error occured initializing Serialization", e); } + + return null; } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLShadedShapeBase.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLShadedShapeBase.java index 26776a1a4b..94c4373a16 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLShadedShapeBase.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLShadedShapeBase.java @@ -24,7 +24,6 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import javax.media.opengl.GL; @@ -48,7 +47,8 @@ import com.vividsolutions.jts.geom.LineString; /** * - * TODO Add Description + * Provides base implementation of shaded shapes in openGL that can be easily + * extended to implement IShadedShape or IColormapShadedShape. * *
  * 
@@ -57,6 +57,8 @@ import com.vividsolutions.jts.geom.LineString;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Sep 3, 2011            bsteffen     Initial creation
+ * Apr 25, 2013 1954       bsteffen    Speed up creation of      
+ *                                     GLColormapShadedShapes.
  * 
  * 
* @@ -116,32 +118,22 @@ public class GLShadedShapeBase implements IShape { for (int i = 0; i < lineString.length; i++) { buffers[i] = FloatBuffer.allocate(lineString[i].getNumPoints() * 2); for (Coordinate c : lineString[i].getCoordinates()) { - double[] loc = { c.x, c.y }; - loc = worldToPixel(loc); - buffers[i].put((float) loc[0]); - buffers[i].put((float) loc[1]); + buffers[i].put((float) c.x); + buffers[i].put((float) c.y); numVertices += 1; } + try { + float[] array = buffers[i].array(); + worldToPixel.transform(array, 0, array, 0, + lineString[i].getNumPoints()); + } catch (TransformException e) { + // Ignore... + } numContours += 1; } polygons.add(buffers); } - protected double[] worldToPixel(double[] world) { - if (worldToPixel != null) { - try { - double[] out = new double[world.length]; - worldToPixel.transform(world, 0, out, 0, 1); - return out; - } catch (TransformException e) { - // Ignore... - } - return null; - } else { - return Arrays.copyOf(world, world.length); - } - } - public synchronized void addPolygonPixelSpace(LineString[] contours) { FloatBuffer[] buffers = new FloatBuffer[contours.length]; for (int i = 0; i < contours.length; i++) { @@ -239,10 +231,10 @@ public class GLShadedShapeBase implements IShape { if (tessellate) { // This over allocates to avoid future resizing if (vertexBuffer == null) { - vertexBuffer = FloatBuffer.allocate(numVertices * 2); + vertexBuffer = FloatBuffer.allocate(numVertices * 2 * 3); } else { FloatBuffer vertexBuffer = FloatBuffer.allocate(numVertices * 2 - + this.vertexBuffer.capacity()); + * 3 + this.vertexBuffer.capacity()); this.vertexBuffer.rewind(); vertexBuffer.put(this.vertexBuffer); this.vertexBuffer = vertexBuffer; diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ClearPracticeGrids.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ClearPracticeGrids.java index 7c3f4275a2..b4839370fe 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ClearPracticeGrids.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ClearPracticeGrids.java @@ -37,9 +37,7 @@ import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.TimeRange; -import com.raytheon.viz.gfe.Activator; import com.raytheon.viz.gfe.GFEServerException; -import com.raytheon.viz.gfe.constants.StatusConstants; import com.raytheon.viz.gfe.core.DataManager; import com.raytheon.viz.gfe.core.IParmManager; import com.raytheon.viz.gfe.core.internal.IFPClient; @@ -54,14 +52,15 @@ import com.raytheon.viz.gfe.core.parm.Parm; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 10, 2010 #4475 randerso Initial creation - * + * May 02, 2013 1949 rjpeter Change ServerResponse return type. * * * @author randerso * @version 1.0 */ public class ClearPracticeGrids extends AbstractHandler { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(ClearPracticeGrids.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(ClearPracticeGrids.class); @Override public Object execute(ExecutionEvent event) throws ExecutionException { @@ -97,16 +96,15 @@ public class ClearPracticeGrids extends AbstractHandler { ServerResponse> sr = client .requestLockChange(lreq); if (!sr.isOkay()) { - ArrayList messages = sr - .getMessages(); + List messages = sr.getMessages(); StringBuilder msg = new StringBuilder( "Error attempting to remove locks."); for (ServerMsg serverMsg : messages) { msg.append("\n").append( serverMsg.getMessage()); } - statusHandler.handle(Priority.PROBLEM, msg - .toString()); + statusHandler.handle(Priority.PROBLEM, + msg.toString()); } } @@ -121,8 +119,8 @@ public class ClearPracticeGrids extends AbstractHandler { "Prac_Fcst database has been cleared."); } catch (GFEServerException e) { - statusHandler.handle( - Priority.PROBLEM, + statusHandler + .handle(Priority.PROBLEM, "Unexpected exception while attempting to clear practice grids", e); } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/FormatterlauncherAction.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/FormatterlauncherAction.java index ef0a34ad85..60bac4802b 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/FormatterlauncherAction.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/FormatterlauncherAction.java @@ -25,17 +25,23 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; +import com.raytheon.viz.gfe.core.DataManager; +import com.raytheon.viz.gfe.core.DataManagerUIFactory; import com.raytheon.viz.gfe.dialogs.FormatterLauncherDialog; /** - * TODO Add Description FormatterlauncherAction.java Apr 11, 2008 + * Displays Formatter Launcher dialog. * *
+ * 
  * SOFTWARE HISTORY
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * 	Apr 11, 2008					Eric Babin Initial Creation
- * Oct 23, 2012 1287       rferrel     Changes for non-blocking FormatterLauncherDialog.
+ * Apr 11, 2008            ebabin       Initial creation
+ * Oct 23, 2012 1287       rferrel      Changes for non-blocking FormatterLauncherDialog.
+ * Apr 24, 2013 1936       dgilling     Pass DataManager to 
+ *                                      FormatterLauncherDialog via constructor.
  * 
  * 
* @@ -60,7 +66,8 @@ public class FormatterlauncherAction extends AbstractHandler { if (dialog == null || dialog.getShell() == null || dialog.isDisposed()) { Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell(); - dialog = new FormatterLauncherDialog(shell); + DataManager dm = DataManagerUIFactory.getCurrentInstance(); + dialog = new FormatterLauncherDialog(shell, dm); dialog.setBlockOnOpen(false); dialog.open(); } else { diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/DataManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/DataManager.java index 14b15d6fed..a7df8ff665 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/DataManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/DataManager.java @@ -74,6 +74,7 @@ import com.raytheon.viz.gfe.smarttool.EditActionProcessor; import com.raytheon.viz.gfe.smarttool.GridCycler; import com.raytheon.viz.gfe.smarttool.script.SmartToolFactory; import com.raytheon.viz.gfe.smarttool.script.SmartToolUIController; +import com.raytheon.viz.gfe.textformatter.TextProductManager; /** * DataManager is the central singleton in GFE upon which other managers are @@ -93,6 +94,8 @@ import com.raytheon.viz.gfe.smarttool.script.SmartToolUIController; * 02/15/2013 1507 dgilling Force procedureInterface and * smartToolInterface to be * initialized by constructor. + * 04/24/2013 1936 dgilling Move initialization of TextProductMgr + * to GFE startup. * * * @@ -159,6 +162,8 @@ public class DataManager { private ProcedureUIController procedureInterface; + private TextProductManager textProductMgr; + private IToolController itoolInterface; private EditActionProcessor editActionProcessor; @@ -507,6 +512,8 @@ public class DataManager { statusHandler.handle(Priority.PROBLEM, "Error initializing smart tool interface", e); } + + DataManager.this.textProductMgr = new TextProductManager(); } }); } @@ -685,4 +692,8 @@ public class DataManager { return initStatus; } + public TextProductManager getTextProductMgr() { + return textProductMgr; + } + } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/AbstractGridData.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/AbstractGridData.java index 568397224a..cd6a9cf383 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/AbstractGridData.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/AbstractGridData.java @@ -69,6 +69,8 @@ import com.vividsolutions.jts.geom.Coordinate; * 02/19/2013 1637 randerso Added throws declarations to translateDataFrom * 04/15/2013 1892 randerso Adding logging to help determine what is different in the gridInfos * Changed how gridInfo is retrieved which seems to have fixed the problem + * 04/23/2013 1949 rjpeter Removed validation on copy, source is verified on store. + * * * @author chammack @@ -307,14 +309,6 @@ public abstract class AbstractGridData implements IGridData { public boolean copyGridValues(final IGridData sourceGrid) { populate(); - // ensure valid data in the source before attempting a copy - if (!sourceGrid.isValid()) { - statusHandler.handle(Priority.PROBLEM, - "Attempt to copyGridValues from invalid grid on " - + getParm().getParmID()); - return false; - } - // validate data type if (sourceGrid.getParm().getGridInfo().getGridType() != getParm() .getGridInfo().getGridType()) { @@ -326,7 +320,6 @@ public abstract class AbstractGridData implements IGridData { } // validate units same or can be converted - if (!getParm() .getGridInfo() .getUnitObject() @@ -413,16 +406,16 @@ public abstract class AbstractGridData implements IGridData { ArrayList thisGDHA = new ArrayList(); // add one by one to eliminate any duplicates - for (int i = 0; i < history.length; i++) { + for (GridDataHistory element : history) { boolean found = false; for (GridDataHistory thisGDH : thisGDHA) { - if (history[i].equals(thisGDH)) { + if (element.equals(thisGDH)) { found = true; break; } } if (!found) { - thisGDHA.add(history[i]); + thisGDHA.add(element); } } this.gridSlice.setHistory(thisGDHA @@ -567,8 +560,8 @@ public abstract class AbstractGridData implements IGridData { // If we've left the area, we're all done int x = (int) (pos.x + 0.5); // round off int y = (int) (pos.y + 0.5); // round off - if (x >= area.getXdim() || y >= area.getYdim() - || area.get(x, y) != 1) { + if ((x >= area.getXdim()) || (y >= area.getYdim()) + || (area.get(x, y) != 1)) { // We're either off the grid or out of the area edge.x = x; edge.y = y; @@ -654,7 +647,7 @@ public abstract class AbstractGridData implements IGridData { for (int i = ll.x; i <= ur.x; i++) { for (int j = ll.y; j <= ur.y; j++) { if (points.get(i, j) > 0) { - if (i == 0 || i == xMax || j == 0 || j == yMax) { + if ((i == 0) || (i == xMax) || (j == 0) || (j == yMax)) { edge.set(i, j); } else { for (int k = i - 1; k <= i + 1; k++) { @@ -729,7 +722,8 @@ public abstract class AbstractGridData implements IGridData { Point p = new Point((int) thisCoord.x, (int) thisCoord.y); // if point is in the grid - if (p.x >= 0 && p.x < gridSize.x && p.y >= 0 && p.y < gridSize.y) { + if ((p.x >= 0) && (p.x < gridSize.x) && (p.y >= 0) + && (p.y < gridSize.y)) { gridCoords.add(p); } } @@ -890,8 +884,8 @@ public abstract class AbstractGridData implements IGridData { public List getHistorySites() { GridDataHistory[] h = this.getHistory(); List sites = new ArrayList(); - for (int i = 0; i < h.length; i++) { - String site = h[i].getOriginParm().getDbId().getSiteId(); + for (GridDataHistory element : h) { + String site = element.getOriginParm().getDbId().getSiteId(); if (!sites.contains(site)) { sites.add(site); } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java index eaa89dd046..927d92ce30 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java @@ -82,7 +82,7 @@ import com.raytheon.viz.gfe.core.griddata.IGridData; * 01/21/12 #1504 randerso Cleaned up old debug logging to improve performance * 02/12/13 #1597 randerso Made save threshold a configurable value. Added detailed * logging for save performance - * + * 04/23/13 #1949 rjpeter Added logging of number of records. * * * @author chammack @@ -120,7 +120,8 @@ public class DbParm extends Parm { } } - if (this.dataManager != null && this.dataManager.getClient() != null) { + if ((this.dataManager != null) + && (this.dataManager.getClient() != null)) { this.lockTable = this.dataManager.getClient().getLockTable( this.getParmID()); } @@ -222,7 +223,7 @@ public class DbParm extends Parm { .getGridHistory(getParmID(), gridTimes); histories = (Map>) sr .getPayload(); - if (!sr.isOkay() || histories.size() != gridTimes.size()) { + if (!sr.isOkay() || (histories.size() != gridTimes.size())) { statusHandler.handle(Priority.PROBLEM, "Unable to retrieve gridded data [history] for " + getParmID() + sr); @@ -456,13 +457,13 @@ public class DbParm extends Parm { IGridData[] grids = this.getGridInventory(tr); // if only a single unmodified grid exactly matches the time range - if (grids.length == 1 && !this.isLocked(tr) + if ((grids.length == 1) && !this.isLocked(tr) && grids[0].getGridTime().equals(tr)) { List newHist = histories.get(tr); GridDataHistory[] currentHist = grids[0].getHistory(); // if current history exists and has a matching update time - if (currentHist != null + if ((currentHist != null) && currentHist[0].getUpdateTime().equals( newHist.get(0).getUpdateTime())) { // update last sent time @@ -495,7 +496,7 @@ public class DbParm extends Parm { } timer.stop(); perfLog.logDuration("Server lock change for " + this.getParmID() + " " - + lreq.size() + " time rangess", timer.getElapsedTime()); + + lreq.size() + " time ranges", timer.getElapsedTime()); timer.reset(); timer.start(); @@ -565,7 +566,9 @@ public class DbParm extends Parm { int gridCount = 0; int totalGrids = 0; long totalSize = 0; + int totalRecords = 0; long size = 0; + int recordCount = 0; for (int i = 0; i < trs.size(); i++) { // ensure we have a lock for the time period TimeRange lockTime = new TimeRange(); @@ -629,6 +632,7 @@ public class DbParm extends Parm { } totalGrids += gridCount; + totalRecords += records.size(); totalSize += size; pendingUnlocks.clear(); @@ -641,9 +645,10 @@ public class DbParm extends Parm { } // if any grids or any time not saved - if (size > 0 || saveTime.getDuration() > 0) { + if ((size > 0) || (saveTime.getDuration() > 0)) { sgr.add(new SaveGridRequest(getParmID(), saveTime, records, dataManager.clientISCSendStatus())); + recordCount = records.size(); } // if we haven't had a failure yet add to pending locks @@ -666,6 +671,7 @@ public class DbParm extends Parm { totalSize += size; totalGrids += gridCount; + totalRecords += recordCount; pendingUnlocks.clear(); } @@ -685,8 +691,8 @@ public class DbParm extends Parm { timer.stop(); perfLog.logDuration("Save Grids " + getParmID().getParmName() + ": " - + totalGrids + " grids (" + totalSize + " bytes) ", - timer.getElapsedTime()); + + totalRecords + " records, " + totalGrids + " grids (" + + totalSize + " bytes) ", timer.getElapsedTime()); return success; } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VParm.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VParm.java index 1b25d0d140..957e763714 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VParm.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VParm.java @@ -143,7 +143,7 @@ public class VParm extends Parm { @Override public void looseLocks() { // simply replace the lock table with one without any locks - this.lockTable.setLocks(new ArrayList()); + this.lockTable.setLocks(new ArrayList(0)); } } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java index e1850449a5..32001a462b 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java @@ -92,6 +92,9 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * Jul 26, 2012 15165 ryu Set default db source when formatter has no db defined. * Oct 23, 2012 1287 rferrel Changes for non-blocking dialogs and code clean up. * Nov 08, 2012 1298 rferrel Changes for non-blocking IssuanceSiteIdDlg. + * Apr 24, 2013 1936 dgilling Remove initialization of + * TextProductManager from this class, clean + * up warnings. * * * @@ -205,6 +208,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements private TextProductManager textProductMgr; + private DataManager dataMgr; + private String selectedDataSource = null; private boolean doClose = false; @@ -214,12 +219,14 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * * @param parent * Parent Shell. + * @param dataMgr + * DataManager instance. */ - public FormatterLauncherDialog(Shell parent) { + public FormatterLauncherDialog(Shell parent, DataManager dataMgr) { super(parent); setShellStyle(SWT.TITLE | SWT.MODELESS | SWT.CLOSE | SWT.RESIZE); - - textProductMgr = new TextProductManager(); + this.dataMgr = dataMgr; + this.textProductMgr = this.dataMgr.getTextProductMgr(); } @Override @@ -326,10 +333,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements // Create all the items in the Data Source dropdown menu // ------------------------------------------------------ - DataManager dm = DataManager.getCurrentInstance(); - // Get the CAVE operating mode - CAVEMode mode = dm.getOpMode(); + CAVEMode mode = dataMgr.getOpMode(); // Forecast menu item, set text based on operating mode fcstMI = new MenuItem(dataSourceMenu, SWT.RADIO); @@ -345,8 +350,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements fcstMI.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - selectedDataSource = DataManager.getCurrentInstance() - .getParmManager().getMutableDatabase().toString(); + selectedDataSource = dataMgr.getParmManager() + .getMutableDatabase().toString(); } }); @@ -382,8 +387,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements } }); } else { - selectedDataSource = DataManager.getCurrentInstance() - .getParmManager().getMutableDatabase().toString(); + selectedDataSource = dataMgr.getParmManager().getMutableDatabase() + .toString(); } } @@ -735,8 +740,9 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements ProductDefinition prodDef = textProductMgr .getProductDefinition(productName); String dataSource = (String) prodDef.get("database"); - if (dataSource == null) + if (dataSource == null) { dataSource = "Official"; + } if (dataSource.equals("ISC")) { selectedDataSource = getIscDataSource(); @@ -787,6 +793,7 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * @param tabName * Name of the tab to be removed. */ + @Override public void removeProductTab(String tabName) { TabItem[] items = tabFolder.getItems(); @@ -808,6 +815,7 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * @param tabName * Name of the tab. */ + @Override public void setTabState(ConfigData.productStateEnum state, String tabName) { TabItem[] items = tabFolder.getItems(); @@ -999,8 +1007,7 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * @return The FcstDataSource */ private String getFcstDataSource() { - return DataManager.getCurrentInstance().getParmManager() - .getMutableDatabase().toString(); + return dataMgr.getParmManager().getMutableDatabase().toString(); } /** @@ -1012,8 +1019,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * @return The ISC Data Source */ private String getIscDataSource() { - java.util.List dbs = DataManager.getCurrentInstance() - .getParmManager().getIscDatabases(); + java.util.List dbs = dataMgr.getParmManager() + .getIscDatabases(); if (dbs.size() > 0) { // Always return the last one in the list @@ -1031,8 +1038,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements private String getOfficialDataSource() { String source = null; try { - ServerResponse> sr = DataManager - .getCurrentInstance().getClient().getOfficialDBName(); + ServerResponse> sr = dataMgr.getClient() + .getOfficialDBName(); source = sr.getPayload().get(0).toString(); } catch (GFEServerException e) { statusHandler.handle(Priority.PROBLEM, diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java index 7a39b63590..339d416024 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java @@ -45,8 +45,6 @@ import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.localization.LocalizationManager; -import com.raytheon.viz.gfe.Activator; -import com.raytheon.viz.gfe.constants.StatusConstants; import com.raytheon.viz.gfe.core.DataManager; /** @@ -59,6 +57,7 @@ import com.raytheon.viz.gfe.core.DataManager; * ------------ ---------- ----------- -------------------------- * May 1, 2009 njensen Initial creation * Jan 15, 2010 3395 ryu Fix "issued by" functionality + * Apr 24, 2013 1936 dgilling Remove unused imports. * * * @@ -67,7 +66,8 @@ import com.raytheon.viz.gfe.core.DataManager; */ public class TextProductManager { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(TextProductManager.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(TextProductManager.class); private String issuedBy = ""; @@ -224,8 +224,8 @@ public class TextProductManager { try { varDict = (String) script.execute("getVarDict", map); } catch (JepException e) { - statusHandler.handle(Priority.PROBLEM, - "Exception getting VarDict", e); + statusHandler.handle(Priority.PROBLEM, "Exception getting VarDict", + e); } return varDict; diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/GridProductBrowserDataDefinition.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/GridProductBrowserDataDefinition.java index 668f13dfb7..3eac892d91 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/GridProductBrowserDataDefinition.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/GridProductBrowserDataDefinition.java @@ -73,6 +73,8 @@ import com.raytheon.viz.grid.rsc.GridResourceData; * ------------ ---------- ----------- -------------------------- * May 21, 2010 bsteffens Initial creation * May 26, 2010 mnash Used ProductBrowserLabel implementation instead of requery + * May 02, 2013 1949 bsteffen Switch Product Browser from uengine to + * DbQueryRequest. * * * @@ -175,7 +177,7 @@ public class GridProductBrowserDataDefinition extends @Override protected String[] queryData(String param, - HashMap queryList) { + Map queryList) { try { if (getInventory() == null) { return super.queryData(param, queryList); diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataJobManager.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataJobManager.java index 3046d8f8c9..3133948dff 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataJobManager.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataJobManager.java @@ -19,9 +19,6 @@ **/ package com.raytheon.viz.hydro.timeseries; -import java.util.ArrayList; -import java.util.List; - import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.QualifiedName; @@ -30,9 +27,8 @@ import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; /** - * The TimeSeriesDataJob Manager asynchronously retrieves - * Time Series Graph and Time Series Tabular Data via the - * Eclipse Job capability. + * The TimeSeriesDataJob Manager asynchronously retrieves Time Series Graph and + * Time Series Tabular Data via the Eclipse Job capability. * *
  * 
@@ -40,7 +36,8 @@ import org.eclipse.core.runtime.jobs.Job;
  * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Jan 28, 2011            bkowal     Initial creation
+ * Jan 28, 2011            bkowal      Initial creation
+ * May 06, 2013   1976     mpduff      Moved c.getDataForGraph() inside .runasync block
  * 
  * 
* @@ -71,11 +68,12 @@ public class TimeSeriesDataJobManager extends Job { TimeSeriesDisplayCanvas tsDisplayCanvas = (TimeSeriesDisplayCanvas) this .getProperty(new QualifiedName(null, "TimeSeriesDisplayCanvas")); - tsDisplayCanvas.getDataForGraph(); final TimeSeriesDisplayCanvas c = tsDisplayCanvas; tsDisplayCanvas.getDisplay().asyncExec(new Runnable() { + @Override public void run() { - if(!c.isDisposed()) { + if (!c.isDisposed()) { + c.getDataForGraph(); c.redraw(); } } diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayCanvas.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayCanvas.java index f6c324adfc..ed9cf5d060 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayCanvas.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayCanvas.java @@ -43,7 +43,6 @@ import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; @@ -60,6 +59,9 @@ import org.eclipse.swt.widgets.Shell; import com.raytheon.uf.common.dataplugin.shef.tables.Fcstheight; import com.raytheon.uf.common.ohd.AppsDefaults; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydro.timeseries.graph.TimeSeriesGraphCanvas; import com.raytheon.viz.hydro.timeseries.util.GraphData; @@ -133,18 +135,21 @@ import com.raytheon.viz.hydrocommon.util.DbUtils; * 13 Nov 2012 15416 lbousaidi added a check when the colorname is null and a call to * getGroupModeColor * 09 Jan 2012 15493 lbousaidi added code to delete data while zooming when you draw a box - * 16 Jan 2013 15695 wkwock Fix popup menu + * 16 Jan 2013 15695 wkwock Fix popup menu + * 24 Apr 2013 1921 mpduff Fix zoom reset to only reset the "active" graph + * 06 May 2013 1976 mpduff Refactored Hydro time series data access. * @author lvenable * @version 1.0 * */ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements IJobChangeListener { + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(TimeSeriesDisplayCanvas.class); + /** The maximum number of forecast traces. */ private static final int MAX_FCST_TRACES = 30; - private final String INCH = "in"; - private final String FEET = "ft"; private final String CFS = "cfs"; @@ -156,16 +161,6 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements */ private final Composite parentComp; - /** - * Flag indicating that obs data are not available. - */ - private boolean noDataAvailable = true; - - /** - * Flag indicating that forecast data are not available. - */ - private boolean noFcstDataAvailable = true; - /** * No Data Available string. */ @@ -198,7 +193,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements private Date maxDate = null; /** List of visible traces */ - private ArrayList traceArray = null; + private List traceArray = null; /** Graph data object */ private GraphData graphData = null; @@ -216,7 +211,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements private boolean groupMode = false; /** Reference to the dialog containing this class */ - private TimeSeriesDisplayDlg dialog; + private final TimeSeriesDisplayDlg dialog; /** Mouse button pressed flag */ private boolean mouseDown = false; @@ -225,10 +220,10 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements private String pointString; /** 2 decimal place number format */ - private NumberFormat twoDecimalFormat = new DecimalFormat("0.00"); + private final NumberFormat twoDecimalFormat = new DecimalFormat("0.00"); /** A reference to this class */ - private Canvas tsCanvas; + private final Canvas tsCanvas; /** * Flag to determine if Flood Category data are loaded @@ -238,17 +233,17 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /** * List of regions for a single trace */ - private ArrayList regionList = new ArrayList(); + private final ArrayList regionList = new ArrayList(); /** * List of Region Lists */ - private ArrayList> listRegionList = new ArrayList>(); + private final ArrayList> listRegionList = new ArrayList>(); /** * List of regions for points for each trace */ - private ArrayList> pointList = new ArrayList>(); + private final ArrayList> pointList = new ArrayList>(); /** * Is a point selected? @@ -278,7 +273,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /** * List of deleted indexes */ - private List deleteList = new ArrayList(); + private final List deleteList = new ArrayList(); /** * The index of the point set to missing @@ -288,7 +283,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /** * List of setMissing indexes */ - private List setMissingList = new ArrayList(); + private final List setMissingList = new ArrayList(); /** * The selected X value @@ -303,7 +298,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /** * The edited point values and the surrounding point values */ - private int[] editPts = new int[6]; + private final int[] editPts = new int[6]; /** Left axis label string */ private String labelString = ""; @@ -337,11 +332,6 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements */ private ArrayList validGraph; - /** - * Is the graph valid - */ - private boolean findGraph = false; - /** * Show Latest Forecast flag. */ @@ -351,29 +341,29 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements * record of the number of forecast traces and type source */ - private int num_of_fcstTraces = 0; - - private int num_of_fcstTs = 0; - - private Boolean inDataRetreival = Boolean.FALSE; + private volatile boolean inDataRetreival; private TimeSeriesDataJobManager tsDataJobManager = null; - - private boolean zoomed = false; - - ToggleTimeSeriesDlg ttsd =null; - /** + private boolean zoomed = false; + + ToggleTimeSeriesDlg ttsd = null; + + /** * Constructor. * + * @param dialog + * Parent dialog * @param parent - * Parent composite. - * @param lid - * Location Id - * @param pe - * Physical Element - * @param ts - * Type Source + * parent composite + * @param graphData + * Graph data object + * @param beginDate + * starting date + * @param endDate + * ending date + * @param groupMode + * groupMode */ public TimeSeriesDisplayCanvas(final TimeSeriesDisplayDlg dialog, Composite parent, GraphData graphData, Date beginDate, @@ -387,21 +377,20 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements this.dialog = dialog; this.tsDataJobManager = new TimeSeriesDataJobManager(); setDialog(dialog); + this.graphData.setBeginDate(beginDate); + this.graphData.setEndDate(endDate); lineWidth = AppsDefaults.getInstance().getInt( HydroConstants.TS_LINEWIDTH, 1); - crossHairCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_CROSS); - arrowCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_ARROW); - northSouthCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_SIZENS); - handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND); + crossHairCursor = parent.getDisplay().getSystemCursor(SWT.CURSOR_CROSS); + northSouthCursor = parent.getDisplay().getSystemCursor( + SWT.CURSOR_SIZENS); + handCursor = parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND); newRequest = true; parentComp = parent; tsCanvas = this; - white = parentComp.getDisplay().getSystemColor(SWT.COLOR_WHITE); - black = parentComp.getDisplay().getSystemColor(SWT.COLOR_BLACK); - dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); setRatingCurveExist(false); @@ -409,9 +398,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /* Handle window resizing */ final Shell parentShell = parentComp.getShell(); parentShell.addListener(SWT.Resize, new Listener() { + @Override public void handleEvent(Event e) { // Set true so new regions will be created as graph is resized - createRegions = true; resizeGraph(parentShell.getClientArea()); redraw(); @@ -420,24 +409,24 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements setupCanvas(); final TimeSeriesDisplayCanvas c = this; getDisplay().asyncExec(new Runnable() { + @Override public void run() { c.redraw(); } }); - - /* - * Add a key listener for up and down arrows - * to move up and down through the pages of - * the graph + + /* + * Add a key listener for up and down arrows to move up and down through + * the pages of the graph */ this.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.ARROW_UP) { - newRequest=true; + newRequest = true; dialog.pageUpAction(); } else if (e.keyCode == SWT.ARROW_DOWN) { - newRequest=true; + newRequest = true; dialog.pageDownAction(); } } @@ -445,7 +434,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } private void scheduleDataRetrieval() { - inDataRetreival = Boolean.TRUE; + inDataRetreival = true; tsDataJobManager.scheduleGetGraphData(this, this); } @@ -463,6 +452,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements setLayoutData(gd); addPaintListener(new PaintListener() { + @Override public void paintControl(PaintEvent e) { try { if (newRequest || getAgain) { @@ -480,12 +470,14 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements drawCanvas(e.gc); } } catch (Exception ex) { - ex.printStackTrace(); + statusHandler.handle(Priority.WARN, + "Problem Painting Graph", ex); } } }); addDisposeListener(new DisposeListener() { + @Override public void widgetDisposed(DisposeEvent e) { if ((canvasFont != null) && (canvasFont.isDisposed() == false)) { canvasFont.dispose(); @@ -522,84 +514,42 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements this.resizeGraph(bounds); } + /** + * Get the data for the lid and pe values passed in. If the graphData object + * is null, get data from IHFS else reuse the data + */ public void getDataForGraph() { try { - /* - * Get the data for the lid and pe values passed in. If the - * graphData object is null, get data from IHFS else reuse the data - */ - int start_num = 0; - int end_num = 0; - - validGraph = new ArrayList(); - for (int d = 0; d < 100; d++) - validGraph.add(false); - - ArrayList traceList = graphData.getOriginalTraces(); - if (traceList.isEmpty()) { - if (groupMode && latestFcstFlag && (num_of_fcstTraces != 0)) { - for (int g = 0; g < graphData.getNumTraces() - - (num_of_fcstTraces - num_of_fcstTs); g++) { - traceList.add(graphData.getTraceData(g)); - } - } else - traceList = graphData.getTraces(); - } - graphData.setTraces(traceList); - - // Clone the list here because we are adding to it in the - // getFcstData - @SuppressWarnings("unchecked") - ArrayList clonedList = (ArrayList) traceList - .clone(); - - start_num = clonedList.size(); - num_of_fcstTraces = 0; - num_of_fcstTs = 0; - - HashSet uniqueList = new HashSet (); + List traceList = graphData.getOriginalTraces(); graphData.setTraces(new ArrayList()); - for (int i = 0; i < clonedList.size(); i++) { - if (clonedList.get(i).isForecast()) { - TraceData td=clonedList.get(i); - String traceKey = td.getLid()+td.getPe()+td.getTs()+td.getDur()+td.getExtremum(); - if (uniqueList.contains(traceKey)) - continue; - else { - uniqueList.add(traceKey); - } + HashSet uniqueList = new HashSet(); - int return_fcst_num = getFcstData(clonedList.get(i)); + // Make a copy of the list so we can add to the original while + // iterating over it + List iterList = new ArrayList(); + for (TraceData td : traceList) { + iterList.add(td); + } - if (groupMode && !latestFcstFlag && (return_fcst_num > 1)) { - num_of_fcstTraces = num_of_fcstTraces + return_fcst_num; - num_of_fcstTs++; - } - - validGraph.set(i, noFcstDataAvailable); - - if (return_fcst_num > 1) { - end_num = start_num + (return_fcst_num - 1); - for (int k = start_num; k < end_num; k++) { - validGraph.set(k, noFcstDataAvailable); - } - start_num = end_num; + for (TraceData td : iterList) { + if (td.isForecast()) { + String traceKey = td.getLid() + td.getPe() + td.getTs() + + td.getDur() + td.getExtremum(); + if (uniqueList.contains(traceKey)) + continue; + else { + uniqueList.add(traceKey); } + getFcstData(td); } else { - graphData.addTrace(clonedList.get(i)); - getData(clonedList.get(i)); - validGraph.set(i, noDataAvailable); + getData(td); + graphData.addTrace(td); } } - - graphData.setBeginDate(beginDate); - graphData.setEndDate(endDate); } finally { - inDataRetreival = Boolean.FALSE; + inDataRetreival = false; } - // newRequest = false; - // getAgain = false; } /** @@ -611,7 +561,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements protected void drawCanvas(GC gc) { gc.setFont(canvasFont); - fontHeight = (gc.getFontMetrics().getHeight()); + if (fontHeight == -999) { + fontHeight = (gc.getFontMetrics().getHeight()); + } int fontAveWidth = gc.getFontMetrics().getAverageCharWidth(); int swtColor = SWT.COLOR_BLACK; if (this.dialog.isInverseVideo()) { @@ -678,8 +630,6 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /* Data Access Manager */ TimeSeriesDataManager dataManager = TimeSeriesDataManager.getInstance(); - // TimeSeriesDataManager dataManagerStn = TimeSeriesDataManager - // .getInstance(); try { String[] sa = dataManager.getStnRiverName(lid); if ((sa != null) && (sa[0] != null) && (sa[1] != null)) { @@ -699,8 +649,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements siteLabel = lid; } } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, + "Error retrieving river names", e); } /* Find the flood stage */ @@ -715,15 +665,14 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } /* Get the data traces */ - traceArray = graphData.getTraces(); - traceArray.trimToSize(); - /* find valid graph with data or not */ - findGraph = false; - for (int j = 0; j < traceArray.size(); j++) { - if ((validGraph != null) && !validGraph.get(j)) { - findGraph = true; + /* Is there data for the graph */ + boolean hasData = false; + + for (TraceData td : traceArray) { + if (td.getTsData() != null && td.getTsData().length > 0) { + hasData = true; break; } } @@ -731,7 +680,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /* * If no data are available then draw no data available information. */ - if (!findGraph) { + if (!hasData) { setForegroundColor(gc, SWT.COLOR_WHITE); // Draws a white border around the graph area int[] points = { GRAPHBORDER, GRAPHBORDER, @@ -746,10 +695,11 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements int tmpY = canvasHeight / 2; if (this.dialog.isInverseVideo()) { - gc.setBackground(this.white); + gc.setBackground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_WHITE)); } gc.drawString(NO_DATA_AVAILABLE, tmpX, tmpY); - gc.drawString(siteLabel +" fs=" + floodStage, GRAPHBORDER - 15, + gc.drawString(siteLabel + " fs=" + floodStage, GRAPHBORDER - 15, GRAPHBORDER - fontHeight * 2); this.dialog.getParentDialog().enableGraphButton(); @@ -762,35 +712,33 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /* Get the data traces */ traceArray = graphData.getTraces(); - traceArray.trimToSize(); setForegroundColor(gc, SWT.COLOR_CYAN); if (pointString != null) { - gc.drawString(pointString, GRAPHBORDER_LEFT - 55, fontHeight * 2); + gc.drawString(pointString, GRAPHBORDER_LEFT - 55, + fontHeight * 2); } if (this.dialog.isInverseVideo()) { - gc.setBackground(this.white); + gc.setBackground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_WHITE)); } - gc.drawString(siteLabel + " fs=" + floodStage, GRAPHBORDER_LEFT - 10, - GRAPHBORDER - fontHeight * 2); + gc.drawString(siteLabel + " fs=" + floodStage, + GRAPHBORDER_LEFT - 10, GRAPHBORDER - fontHeight * 2); int index = GRAPHBORDER_LEFT - 10; // If labels run off the right of the canvas then need to stack them boolean stackLabels = false; - int stackCount = 2; // This should start as 2 because the first stack will be above a line + int stackCount = 2; // This should start as 2 because the first + // stack will be above a line int labelStartX = 0; int labelStartY = 0; - - //store the label to be plotted on the gc legend later - ArrayList noDataLabels = new ArrayList(); - + + // store the label to be plotted on the gc legend later + List noDataLabels = new ArrayList(); + for (int j = 0; j < traceArray.size(); j++) { TraceData td = traceArray.get(j); - boolean traceValid = true; - if (validGraph.get(j)) { - traceValid = false; - } if (td.getPe().equalsIgnoreCase(HydroConstants.PP)) { /* @@ -870,7 +818,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } } } catch (Exception ex) { - ex.printStackTrace(); + statusHandler.handle(Priority.ERROR, + "Error deriving PP", ex); } } @@ -885,7 +834,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements if (traceSelected && (selectedTraceId == j) && !dialog.isCancel()) { // if in edit mode traceArray.get(selectedTraceId).setSelected(true); - gc.drawString("Active Trace: " + dataString, + gc.drawString( + "Active Trace: " + dataString, (GRAPHBORDER_LEFT + GRAPHBORDER_RIGHT + graphAreaWidth) / 2, GRAPHBORDER / 2); } @@ -911,16 +861,17 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } /* Top left point of bar */ - int x = pointArray[i].getPixelX() + GRAPHBORDER_LEFT;// - 20; + int x = pointArray[i].getPixelX() + GRAPHBORDER_LEFT; - if ((x < GRAPHBORDER_LEFT) || (x > GRAPHBORDER_LEFT + graphAreaWidth)) { + if ((x < GRAPHBORDER_LEFT) + || (x > GRAPHBORDER_LEFT + graphAreaWidth)) { continue; } int x2 = x; - x = x2pixel(graphData, pointArray[i].getX() - .getTime() - 3600000) - + GRAPHBORDER_LEFT;// - 20; + x = x2pixel(graphData, + pointArray[i].getX().getTime() - 3600000) + + GRAPHBORDER_LEFT; int y = pointArray[i].getPixelY() + GRAPHBORDER; ia[0] = x; ia[1] = y; @@ -961,8 +912,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements try { labelString = dataManager.getShefPE(pe); } catch (VizException ve) { - ve.printStackTrace(); - // TODO Log error here + statusHandler.handle(Priority.ERROR, + "Error retrieving SHEF PE data", ve); } } @@ -975,22 +926,26 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements setForegroundColor(td, j, gc); - if (graphData.getTraces().size() > 1) { - if (td.getLineData()!=null && td.getLineData().length>0) { + if (graphData.getTraces().size() > 1) { + if (td.getLineData() != null && td.getLineData().length > 0) { if (td.isTraceOn()) { - if (stackLabels || ((dataString.length() * fontAveWidth) + 50 + index > canvasWidth)) { - int[] xy = getLabelLocation(index, dataString, stackCount); - stackCount++; - labelStartX = xy[0]; - labelStartY = xy[1]; - stackLabels = true; - } else { - labelStartX = index; - labelStartY = GRAPHBORDER - fontHeight; - } + if (stackLabels + || ((dataString.length() * fontAveWidth) + + 50 + index > canvasWidth)) { + int[] xy = getLabelLocation(index, dataString, + stackCount); + stackCount++; + labelStartX = xy[0]; + labelStartY = xy[1]; + stackLabels = true; + } else { + labelStartX = index; + labelStartY = GRAPHBORDER - fontHeight; + } gc.drawString(dataString, labelStartX, labelStartY); if (!stackLabels) { - index += (dataString.length() + 2) * fontAveWidth; + index += (dataString.length() + 2) + * fontAveWidth; } } } else { @@ -1090,28 +1045,28 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } } } - - //draw no data legends + + // draw no data legends setForegroundColor(gc, SWT.COLOR_WHITE); - for (int i=0;i canvasWidth)) { - int[] xy = getLabelLocation(index, labelString, stackCount); - stackCount++; - labelStartX = xy[0]; - labelStartY = xy[1]; - stackLabels = true; - } else { - labelStartX = index; - labelStartY = GRAPHBORDER - fontHeight; - } - gc.drawString(labelString,labelStartX ,labelStartY); + for (int i = 0; i < noDataLabels.size(); i++) { + String labelString = noDataLabels.get(i); + if (stackLabels + || ((labelString.length() * fontAveWidth) + 50 + index > canvasWidth)) { + int[] xy = getLabelLocation(index, labelString, stackCount); + stackCount++; + labelStartX = xy[0]; + labelStartY = xy[1]; + stackLabels = true; + } else { + labelStartX = index; + labelStartY = GRAPHBORDER - fontHeight; + } + gc.drawString(labelString, labelStartX, labelStartY); if (!stackLabels) { - index += (labelString.length() + 2) * fontAveWidth; + index += (labelString.length() + 2) * fontAveWidth; } } - // draw X/Y axis setForegroundColor(gc, SWT.COLOR_WHITE); @@ -1141,14 +1096,14 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements this.dialog.getParentDialog().enableGraphButton(); this.dialog.getParentDialog().enableBothButton(); } - + private int[] getLabelLocation(int index, String dataString, int stackCount) { - int[] xy = new int[2]; - - xy[0] = canvasWidth - GRAPHBORDER_RIGHT - 75; - xy[1] = GRAPHBORDER - (stackCount * fontHeight); - - return xy; + int[] xy = new int[2]; + + xy[0] = canvasWidth - GRAPHBORDER_RIGHT - 75; + xy[1] = GRAPHBORDER - (stackCount * fontHeight); + + return xy; } /** @@ -1161,8 +1116,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements // Scale the data to match the graph area double yLowest = Integer.MAX_VALUE; double yHighest = Integer.MIN_VALUE; -// if (!dialog.isZoomSet()) { - if (!zoomed) { + if (!zoomed) { gd.setYmin(yLowest); gd.setYmax(yHighest); } @@ -1182,9 +1136,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements if (td != null && td.isTraceOn()) { TimeSeriesPoint[] points = null; if (zoomed) { - points = td.getZoomedTsData(); + points = td.getZoomedTsData(); } else { - points = td.getTsData(); + points = td.getTsData(); } if (points != null) { @@ -1204,10 +1158,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } /* Set missing */ - // if ((setMissingIndex != HydroConstants.MISSING_VALUE) if ((setMissingList.size() > 0) && (i == selectedTraceId)) { for (int j = 0; j < points.length; j++) { - // if (j != setMissingIndex) { if (!setMissingList.contains(j)) { pointList.add(points[j]); } @@ -1288,8 +1240,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements swapPoints(rubberBandX1, rubberBandX2, rubberBandY1, rubberBandY2); } - Date xMin = pixel2x(gd, rubberBandX1-GRAPHBORDER_LEFT); - Date xMax = pixel2x(gd, rubberBandX2-GRAPHBORDER_LEFT); + Date xMin = pixel2x(gd, rubberBandX1 - GRAPHBORDER_LEFT); + Date xMax = pixel2x(gd, rubberBandX2 - GRAPHBORDER_LEFT); gd.setXMin(xMin); gd.setXMax(xMax); @@ -1332,16 +1284,18 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /* if only rain data types then skip the flood stage */ boolean useFloodStage = false; - for (TraceData trace: gd.getTraces()) { - if (trace.getPe().startsWith("H") || trace.getPe().startsWith("h") || - trace.getPe().startsWith("Q") || trace.getPe().startsWith("q")) { + for (TraceData trace : gd.getTraces()) { + if (trace.getPe().startsWith("H") || trace.getPe().startsWith("h") + || trace.getPe().startsWith("Q") + || trace.getPe().startsWith("q")) { useFloodStage = true; break; - } + } } - + /* Add the flood stages if selected */ - if (dialog.getBatchDataAndCategoriesMI().getSelection() && useFloodStage && !zoomed) { + if (dialog.getBatchDataAndCategoriesMI().getSelection() + && useFloodStage && !zoomed) { // Get the stages double floodCatMinor = gd.getMinorStage(); double floodCatMajor = gd.getMajorStage(); @@ -1492,14 +1446,13 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements pointsbak.add(pbak); } } - noDataAvailable = false; - } else { - noDataAvailable = true; } } catch (VizException e) { - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, "Error retrieving graph data", + e); } catch (ClassNotFoundException e) { - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, "Error retrieving graph data", + e); } td.setTsData(points.toArray(new TimeSeriesPoint[points.size()])); @@ -1547,7 +1500,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements * Display the right click popup menu. */ private void popupMenu() { - ttsd = ToggleTimeSeriesDlg.getInstance(getShell(),getTraceList(),this); + ttsd = ToggleTimeSeriesDlg + .getInstance(getShell(), getTraceList(), this); ttsd.open(); } @@ -1572,64 +1526,66 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements */ private String buildPointString(int x, int y) { StringBuilder sb = new StringBuilder(); - Date xValue = pixel2x(graphData, x-GRAPHBORDER_LEFT); + Date xValue = pixel2x(graphData, x - GRAPHBORDER_LEFT); SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm'Z'"); format.setTimeZone(TimeZone.getTimeZone("GMT")); sb.append(format.format(xValue)); double yValue = pixel2y(graphData, y); String units = FEET; boolean isRiverData = true; - boolean isStage= true; - ArrayList traces = graphData.getTraces(); + boolean isStage = true; + List traces = graphData.getTraces(); for (TraceData trace : traces) { if (!trace.getPe().toUpperCase().startsWith("H") && !trace.getPe().toUpperCase().startsWith("Q")) { isRiverData = false; } if (trace.getPe().toUpperCase().startsWith("Q")) { - isStage=false; + isStage = false; } } - - if (isRiverData) { - + + if (isRiverData) { + if (isStage) { - /** - * Convert the stage to discharge for the location and stage value passed in. + /* + * Convert the stage to discharge for the location and stage + * value passed in. */ - double q = StageDischargeUtils.stage2discharge(lid, yValue); - //check for rating curve - if (q != HydroConstants.RATING_CONVERT_FAILED) { - if (q > 10000) { - units = KCFS; - q = q / 1000; - }else { - units = CFS; - } - sb.append(" value=" + twoDecimalFormat.format(yValue) - + " " + FEET + " "); - sb.append(String.format("%8.1f", q) + " " + units); - }else { - sb.append(" value=" + twoDecimalFormat.format(yValue)); - } - - }else { - /** - * Convert the discharge to stage for the location and discharge value passed in. + double q = StageDischargeUtils.stage2discharge(lid, yValue); + // check for rating curve + if (q != HydroConstants.RATING_CONVERT_FAILED) { + if (q > 10000) { + units = KCFS; + q = q / 1000; + } else { + units = CFS; + } + sb.append(" value=" + twoDecimalFormat.format(yValue) + " " + + FEET + " "); + sb.append(String.format("%8.1f", q) + " " + units); + } else { + sb.append(" value=" + twoDecimalFormat.format(yValue)); + } + + } else { + /* + * Convert the discharge to stage for the location and discharge + * value passed in. */ - double q = StageDischargeUtils.discharge2stage(lid, yValue); - //check for rating curve - if (q != HydroConstants.RATING_CONVERT_FAILED) { - sb.append(" value=" + twoDecimalFormat.format(yValue) - + " " + CFS + " "); - sb.append(String.format("%8.1f", q) + " " + FEET); - }else { - sb.append(" value=" + twoDecimalFormat.format(yValue)); - } - } - - }else { - sb.append(" value=" + twoDecimalFormat.format(yValue)); + double q = StageDischargeUtils.discharge2stage(lid, yValue); + // check for rating curve + if (q != HydroConstants.RATING_CONVERT_FAILED) { + sb.append(" value=" + twoDecimalFormat.format(yValue) + " " + + CFS + " "); + sb.append(String.format("%8.1f", q) + " " + FEET); + } else { + sb.append(" value=" + twoDecimalFormat.format(yValue)); + } + } + + } else { + sb.append(" value=" + twoDecimalFormat.format(yValue)); } return sb.toString(); @@ -1673,7 +1629,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements break; } else { pointSelected = false; - setCursor(arrowCursor); + setCursor(null); } } } else { @@ -1684,11 +1640,11 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements break; } else { pointSelected = false; - setCursor(arrowCursor); + setCursor(null); } } } - } else if ( traceSelected && dialog.isDelete()) { + } else if (traceSelected && dialog.isDelete()) { if (mouseDown) { int deleteX1 = selectedX; int deleteY1 = selectedY; @@ -1705,7 +1661,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements break; } else { pointSelected = false; - setCursor(arrowCursor); + setCursor(null); } } } else { @@ -1716,7 +1672,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements break; } else { pointSelected = false; - setCursor(arrowCursor); + setCursor(null); } } } @@ -1738,7 +1694,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements break; } else { pointSelected = false; - setCursor(arrowCursor); + setCursor(null); } } } else { @@ -1749,7 +1705,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements break; } else { pointSelected = false; - setCursor(arrowCursor); + setCursor(null); } } } @@ -1820,20 +1776,20 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements selectedTraceId = i; break; } else { - setCursor(arrowCursor); + setCursor(null); selectableTrace = false; } } } else { - int traceId=findTracePoint(e.x,e.y); - if (traceId>=0){ - setCursor(handCursor); + int traceId = findTracePoint(e.x, e.y); + if (traceId >= 0) { + setCursor(handCursor); selectableTrace = true; selectedTraceId = traceId; - }else { - setCursor(arrowCursor); + } else { + setCursor(null); selectableTrace = false; - } + } } } } @@ -1843,70 +1799,78 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /** * - * @param x : location x (of mouse pointer) - * @param y : location y (of mouse pointer) + * @param x + * : location x (of mouse pointer) + * @param y + * : location y (of mouse pointer) * @return the nearest trace. -999 if x,y is too far away */ private int findTracePoint(int x, int y) { - double distance=Double.MAX_VALUE; - int choosingTrace=-999; - ArrayList traceList=graphData.getTraces(); - - //this loop is to find the closest point/line for every trace that's on - int closePoints[] = new int[traceList.size()]; - for (int traceIndex=0; traceIndex< traceList.size(); traceIndex++) { - TraceData td= traceList.get(traceIndex); - closePoints[traceIndex]=-999; //default to not found - int[] dataPts = td.getLineData(); //dataPts stores x1,y1,x2,y2,x3... - if (td.isTraceOn() && dataPts!=null) { - for (int i = 0; i < dataPts.length - 1; i+= 2) { + double distance = Double.MAX_VALUE; + int choosingTrace = -999; + List traceList = graphData.getTraces(); + + // this loop is to find the closest point/line for every trace that's on + int closePoints[] = new int[traceList.size()]; + for (int traceIndex = 0; traceIndex < traceList.size(); traceIndex++) { + TraceData td = traceList.get(traceIndex); + closePoints[traceIndex] = -999; // default to not found + int[] dataPts = td.getLineData(); // dataPts stores + // x1,y1,x2,y2,x3... + if (td.isTraceOn() && dataPts != null) { + for (int i = 0; i < dataPts.length - 1; i += 2) { int x1 = dataPts[i]; int y1 = dataPts[i + 1]; int x2 = x1; int y2 = y1; - if (i+4 <= dataPts.length) { - x2 = dataPts[i + 2]; - y2 = dataPts[i + 3]; + if (i + 4 <= dataPts.length) { + x2 = dataPts[i + 2]; + y2 = dataPts[i + 3]; } - double curDistance=Double.MAX_VALUE; - if (x1==x2 && y1==y2) //distance from a point - curDistance=Math.sqrt(Math.pow(x-x1,2)+Math.pow(y-y1, 2)); - else {//distance from a line segment - //from http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment - double p2X=x2-x1; - double p2Y=y2-y1; + double curDistance = Double.MAX_VALUE; + // distance from a point + if (x1 == x2 && y1 == y2) { + curDistance = Math.sqrt(Math.pow(x - x1, 2) + + Math.pow(y - y1, 2)); + } else { + // distance from a line segment from + // http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment + double p2X = x2 - x1; + double p2Y = y2 - y1; - double something=p2X*p2X + p2Y*p2Y; - - double u=((x-x1)*p2X+(y-y1)*p2Y)/something; + double something = p2X * p2X + p2Y * p2Y; + + double u = ((x - x1) * p2X + (y - y1) * p2Y) + / something; if (u > 1) u = 1; else if (u < 0) u = 0; - double xx=x1+u*p2X; - double yy=y1+u*p2Y; + double xx = x1 + u * p2X; + double yy = y1 + u * p2Y; - double dx=xx-x; - double dy=yy-y; + double dx = xx - x; + double dy = yy - y; - curDistance=Math.sqrt(dx*dx+dy*dy); + curDistance = Math.sqrt(dx * dx + dy * dy); } - if (curDistance traceList) { + private void makeRegions(List traceList) { if (createRegions == true) { /* Dispose of the previous regions */ for (Region r : regionList) { @@ -2324,7 +2292,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements int[] dataPts = new int[pointArray.length * 2]; ArrayList dataPtList = new ArrayList(); int dataIndex = 0; - int zoomDataIndex=0; + int zoomDataIndex = 0; ArrayList al = new ArrayList(); for (int i = 0; i < pointArray.length; i++) { if (pointArray[i].getY() != HydroConstants.MISSING_VALUE) { @@ -2436,7 +2404,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements */ private void setForegroundColor(TraceData td, int traceIndex, GC gc) { if (dialog.isInverseVideo()) { - gc.setForeground(black); + gc.setForeground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_BLACK)); } else { if (traceSelected && (selectedTraceId == traceIndex) && !dialog.isCancel()) { // if in edit mode @@ -2447,7 +2416,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements HydroUtils.getColor(traceIndex)); gc.setForeground(currentTraceColor); } else if (groupMode) { - if (td.getColorName() != null && HydroUtils.getColor(td.getColorName()) != null) { + if (td.getColorName() != null + && HydroUtils.getColor(td.getColorName()) != null) { currentTraceColor = new Color(parentComp.getDisplay(), HydroUtils.getColor(td.getColorName())); } else { @@ -2472,7 +2442,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements */ private void setBackgroundColor(TraceData td, int traceIndex, GC gc) { if (dialog.isInverseVideo()) { - gc.setBackground(black); + gc.setBackground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_BLACK)); } else { if (traceSelected && (selectedTraceId == traceIndex) && !dialog.isCancel()) { // if in edit mode @@ -2482,13 +2453,14 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements gc.setBackground(new Color(parentComp.getDisplay(), HydroUtils .getColor(traceIndex))); } else if (groupMode) { - if (td.getColorName() != null && HydroUtils.getColor(td.getColorName()) != null) { - gc.setBackground(new Color(parentComp.getDisplay(), HydroUtils - .getColor(td.getColorName()))); - } else { - gc.setBackground(new Color(parentComp.getDisplay(), + if (td.getColorName() != null + && HydroUtils.getColor(td.getColorName()) != null) { + gc.setBackground(new Color(parentComp.getDisplay(), + HydroUtils.getColor(td.getColorName()))); + } else { + gc.setBackground(new Color(parentComp.getDisplay(), HydroUtils.getGroupModeColor(traceIndex))); - } + } } } } @@ -2573,34 +2545,41 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements } if (basisTime.getTime() != prevBasisTime.getTime()) { - if (ntraces < MAX_FCST_TRACES) { - traceData.setXmin(beginDate); - traceData.setXmax(endDate); - n = 0; /* Reset npts in new forecast trace */ - traceData.setBasistime(prevBasisTime); - ntraces++; - traceData.setTsData(points - .toArray(new TimeSeriesPoint[points - .size()])); - points = new ArrayList(); + if (!this.latestFcstFlag) { + if (ntraces < MAX_FCST_TRACES) { + traceData.setXmin(beginDate); + traceData.setXmax(endDate); + n = 0; /* Reset npts in new forecast trace */ + traceData.setBasistime(prevBasisTime); + ntraces++; + traceData.setTsData(points + .toArray(new TimeSeriesPoint[points + .size()])); + points = new ArrayList(); - if (ntraces >= 1) { - traceDataList.add(traceData); + if (ntraces >= 1) { + traceDataList.add(traceData); + } + + traceData = new TraceData(); + traceData.setForecast(true); + traceData.setDur(dur); + traceData.setExtremum(extremum); + traceData.setLid(lid); + traceData.setPe(pe); + traceData.setTs(ts); + traceData.setName(name); + traceData.setBasistime(basisTime); + traceData.setProductTime(productTime); + traceData.setTraceOn(!this.latestFcstFlag); + } else { + /* + * reached max fcst traces, break out of + * loop + */ + break; } - - traceData = new TraceData(); - traceData.setForecast(true); - traceData.setDur(dur); - traceData.setExtremum(extremum); - traceData.setLid(lid); - traceData.setPe(pe); - traceData.setTs(ts); - traceData.setName(name); - traceData.setBasistime(basisTime); - traceData.setProductTime(productTime); - traceData.setTraceOn(!this.latestFcstFlag); } else { - /* reached max fcst traces, break out of loop */ break; } } @@ -2655,13 +2634,12 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements traceDataList.add(traceData); ntraces++; } - noFcstDataAvailable = false; } else { - noFcstDataAvailable = true; - traceDataList.add(traceData);//although nothing from DB + traceDataList.add(traceData);// although nothing from DB } } catch (VizException e) { - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, "Error retrieving graph data", + e); } traceData.setTsData(points.toArray(new TimeSeriesPoint[points.size()])); @@ -2748,7 +2726,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements * * @return The trace list */ - private ArrayList getTraceList() { + private List getTraceList() { return traceArray; } @@ -2794,7 +2772,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements try { redraw(); } catch (Exception e) { - e.printStackTrace(); + statusHandler.handle(Priority.ERROR, "Error drawing graph", + e); } } }); @@ -2815,16 +2794,16 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements /** * @return the traceArray */ - public ArrayList getTraceArray() { + public List getTraceArray() { return traceArray; } - - public boolean isZoomed() { - return zoomed; - } - public void setZoomed(boolean zoomed) { - this.zoomed = zoomed; - } + public boolean isZoomed() { + return zoomed; + } + + public void setZoomed(boolean zoomed) { + this.zoomed = zoomed; + } } diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayDlg.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayDlg.java index 3ea91c8f9f..fde6e81bca 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayDlg.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDisplayDlg.java @@ -59,7 +59,6 @@ import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydro.timeseries.util.GraphData; import com.raytheon.viz.hydro.timeseries.util.GroupInfo; import com.raytheon.viz.hydro.timeseries.util.PageInfo; -import com.raytheon.viz.hydro.timeseries.util.TraceData; import com.raytheon.viz.hydro.util.LoadMaxFcst; import com.raytheon.viz.hydrocommon.HydroConstants; import com.raytheon.viz.hydrocommon.data.ForecastData; @@ -94,6 +93,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; * 22 Jan 2013 14903 lbousaidi Fix display error after save to DB. * 30 Jan 2012 15459 mpduff Redmine 1560 - Make graph canvases redraw on page up/down. * 06 Feb 2013 1578 rferrel Code cleanup for non-blocking dialogs. + * 24 Apr 2013 1921 mpduff Fix zoom reset to only reset the "active" graph * * * @@ -393,6 +393,11 @@ public class TimeSeriesDisplayDlg extends CaveSWTDialog { */ private boolean reset = false; + /** + * The selected graph canvas. + */ + private TimeSeriesDisplayCanvas selectedCanvas; + /** * Constructor. * @@ -995,10 +1000,9 @@ public class TimeSeriesDisplayDlg extends CaveSWTDialog { setZoomAction(false); setSelectZoom(false); reset = true; - for (TimeSeriesDisplayCanvas dc : canvasList) { - dc.setZoomed(false); - dc.redraw(); - } + selectedCanvas.setZoomed(false); + selectedCanvas.redraw(); + reset = false; } else { displayCanvas.resetTS(); } @@ -1356,7 +1360,6 @@ public class TimeSeriesDisplayDlg extends CaveSWTDialog { String showCat = AppsDefaults.getInstance().getToken( "timeseries_showcat"); int sc = Integer.parseInt(showCat); - System.out.println(showCat); if (sc == 1) { batchDataOnlyShowCatMI.setSelection(false); batchDataOnlyMI.setSelection(true); @@ -2347,4 +2350,14 @@ public class TimeSeriesDisplayDlg extends CaveSWTDialog { public boolean isReset() { return reset; } + + /** + * Set the selected canvas. + * + * @param selectedCanvas + * The selected canvas + */ + public void setSelectedCanvas(TimeSeriesDisplayCanvas selectedCanvas) { + this.selectedCanvas = selectedCanvas; + } } diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDlg.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDlg.java index 60bd2112a0..57bdf49c89 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDlg.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDlg.java @@ -120,6 +120,7 @@ import com.raytheon.viz.hydrocommon.util.StnClassSyncUtil; * despite start up in CAVE or standalone. * 30 Jan 2013 15264 wkwock Fix the missing group_definition.cfg file crash * 05 Feb 2013 1578 rferrel Dialog made non-blocking and a singleton. + * 06 May 2013 1976 mpduff Code cleanup. * * * @author lvenable @@ -127,7 +128,7 @@ import com.raytheon.viz.hydrocommon.util.StnClassSyncUtil; * */ public class TimeSeriesDlg extends CaveHydroSWTDialog { - private static final transient IUFStatusHandler statusHandler = UFStatus + private static final IUFStatusHandler statusHandler = UFStatus .getHandler(TimeSeriesDlg.class); /* Constants */ @@ -441,27 +442,18 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { private LIDData currLidData = new LIDData(); /** List of GroupInfo objects */ - private ArrayList groupList = new ArrayList(); - - /** Holds the Group Information */ - private GroupInfo groupInfo; + private final ArrayList groupList = new ArrayList(); /** Holds the last graphed GroupInfo object */ private GroupInfo prevGroupInfo; - /** Holds the page information */ - private PageInfo pageInfo = null; - - /** Holds the graph information */ - private GraphData graphData = null; - private String groupConfigFilePath = null; - private ArrayList siteInfoList = new ArrayList(); + private final ArrayList siteInfoList = new ArrayList(); - private ArrayList tabInfoList = new ArrayList(); + private final ArrayList tabInfoList = new ArrayList(); - private HydroDisplayManager displayManager; + private final HydroDisplayManager displayManager; private boolean openTimeSeriesDisplays = false; @@ -662,7 +654,7 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { font = new Font(shell.getDisplay(), "Monospace", 11, SWT.NORMAL); - // Initialize all of the controls and layoutsendCal + // Initialize all of the controls initializeComponents(); setCurrentData(); } @@ -1097,7 +1089,6 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { public void keyReleased(KeyEvent event) { String search = searchTF.getText(); if (!search.equals("") && !search.equals(" ")) { - /* Iterate over the location Ids in the list */ ListIterator iter = lidList.listIterator(); while (iter.hasNext()) { @@ -1119,10 +1110,8 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { } } } - } else { - // topDataList.setSelection(0); // Commented to more closely - // match legacy app } + if (topDataList.getSelectionIndex() > 0) { populateBottomList( lidList.get(topDataList.getSelectionIndex()), @@ -1276,6 +1265,7 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { bottomDataList.setLayoutData(gd); bottomDataList.setFont(font); bottomDataList.addListener(SWT.Selection, new Listener() { + @Override public void handleEvent(Event e) { correctSelections(); } @@ -1532,7 +1522,6 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { si.setTs((String) row[2]); si.setExt((String) row[3]); si.setDur((Integer) row[4]); - // siteInfoList.add(si); if (si.getPe().startsWith("H")) { if (!si.getPe().equals(prevPE)) { @@ -1617,6 +1606,14 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { } else { this.populateGroupListForStandalone(); } + + for (GroupInfo gi : this.groupList) { + for (PageInfo pi : gi.getPageInfoList()) { + for (GraphData gd : pi.getGraphDataList()) { + gd.saveTraceInfo(); + } + } + } } /** @@ -1644,7 +1641,6 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { groupDataList.removeAll(); if (this.groupConfigFilePath != null) { - this.readGroupList(); } } @@ -1653,6 +1649,10 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { * Read the Group List file. */ private void readGroupList() { + GroupInfo groupInfo = null; + PageInfo pageInfo = null; + GraphData graphData = null; + try { BufferedReader in = new BufferedReader(new FileReader( groupConfigFilePath)); @@ -1664,7 +1664,148 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { if (str.trim().equals("")) { continue; } - processGroupData(str); + + boolean showpp_flag = false; + + // Remove any leading whitespace + String line = str.replaceAll("^\\s+", ""); + + if (line.startsWith(GROUP)) { + groupInfo = new GroupInfo(); + groupInfo.setGroupSelected(true); + groupList.add(groupInfo); + } + String[] parts = line.split(":"); + + if (parts[0].equals(GROUP)) { + String[] pairs = parts[1].split(","); + for (String s : pairs) { + String[] values = s.split("=", 2); + + // make sure we have values to go with the key + if (values.length > 1) { + if ((values[0] != null) + && values[0].equalsIgnoreCase(NAME)) { + if (values[1] != null) + groupInfo.setGroupName(values[1]); + groupDataList.add(groupInfo.getGroupName()); + } else if (values[0].equalsIgnoreCase(DESCRIPT)) { + groupInfo.setDescription(values[1]); + } else if (values[0].equalsIgnoreCase(GRID)) { + if (values[1].equalsIgnoreCase("T")) { + groupInfo.setGridLines(true); + } else { + groupInfo.setGridLines(false); + } + } else if (values[0].equalsIgnoreCase(TRACEMODE)) { + groupInfo.setTraceMode(values[1]); + } else if (values[0].equalsIgnoreCase(PASTHOURS)) { + groupInfo.setPastHours(Integer + .parseInt(values[1])); + } else if (values[0].equalsIgnoreCase(FUTUREHOURS)) { + groupInfo.setFutureHours(Integer + .parseInt(values[1])); + } else { + statusHandler.warn("Invalid key/value pair: " + + s); + } + } + } + } else if (parts[0].equals(PAGE)) { + String[] values = parts[1].split("=", 2); + if (values.length > 1) { + pageInfo = new PageInfo(); + pageInfo.setTitle(values[1]); + groupInfo.addPageInfo(pageInfo); + } + } else if (parts[0].equals(GRAPH)) { + graphData = new GraphData(); + + String[] pairs = parts[1].split(","); + for (String s : pairs) { + String[] values = s.split("=", 2); + if (values.length > 1) { + if (values[0].equalsIgnoreCase(POS)) { + graphData.setGraph_pos(Integer + .parseInt(values[1])); + } else if (values[0].equalsIgnoreCase(XSIZE)) { + graphData.setXsize(Integer.parseInt(values[1])); + } else if (values[0].equalsIgnoreCase(YSIZE)) { + graphData.setYsize(Integer.parseInt(values[1])); + } else if (values[0].equalsIgnoreCase(YLINEAR)) { + graphData.setYlinear(values[1]); + } else if (values[0].equalsIgnoreCase(YSCALE)) { + graphData.setYscale(values[1]); + } else if (values[0].equalsIgnoreCase(SHOWCAT)) { + if (values[1].equalsIgnoreCase("T")) { + graphData.setShowcat(true); + } else { + graphData.setShowcat(false); + } + } else if (values[0].equalsIgnoreCase(DERIVEPP)) { + graphData.setDerivepp(values[1]); + } else if (values[0].equalsIgnoreCase(SHOWPP)) { + if (values[1].equalsIgnoreCase("T")) { + showpp_flag = true; + } else { + showpp_flag = false; + } + } else if (values[0] + .equalsIgnoreCase(LATESTFCSTONLY)) { + if (values[1].equalsIgnoreCase("T")) { + graphData.setLatestfcstonly(true); + } else { + graphData.setLatestfcstonly(false); + } + } else { + statusHandler.warn("Invalid key/value pair: " + + s); + } + } + } + + // handle the case where there isn't a page element when + // there should be + if (pageInfo == null) { + pageInfo = new PageInfo(); + groupInfo.addPageInfo(pageInfo); + } + pageInfo.addGraphData(graphData); + } else if (parts[0].equals(TRACE)) { + TraceData td = new TraceData(); + String[] pairs = parts[1].split(","); + for (String s : pairs) { + String[] values = s.split("=", 2); + if (values.length > 1) { + if (values[0].equalsIgnoreCase(STN)) { + td.setLid(values[1]); + } else if (values[0] + .equalsIgnoreCase(HydroConstants.PC)) { + td.setPc(values[1]); + if (showpp_flag == true) + graphData.setShowpp(true); + else + graphData.setShowpp(false); + } else if (values[0].equalsIgnoreCase(COLOR)) { + td.setColorName(values[1]); + } + } + } + graphData.addTrace(td); + + graphData.setBeginDate(beginDate); + graphData.setEndDate(endDate); + } else { + statusHandler + .warn("Error in Group Definition Config file: " + + line); + } + + // select the first item in the list + if (groupDataList.getItemCount() > 0) { + groupDataList.select(0); + } + } in.close(); } catch (IOException e) { @@ -1831,7 +1972,7 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { } } - // Reset the siteInfoList selections + // Reset the selections int selectedIndex = bottomDataList.getSelectionIndex(); for (int i = 0; i < siteInfoList.size(); i++) { @@ -1893,144 +2034,6 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { timeSeriesDisplayDlg.getShell().moveAbove(this.shell); } - /** - * Process the lines in the group config file. - * - * @param line - */ - private void processGroupData(String line) { - Boolean showpp_flag = false; - - // Remove any leading whitespace - line = line.replaceAll("^\\s+", ""); - - if (line.startsWith(GROUP)) { - groupInfo = new GroupInfo(); - groupInfo.setGroupSelected(true); - groupList.add(groupInfo); - } - String[] parts = line.split(":"); - - if (parts[0].equals(GROUP)) { - String[] pairs = parts[1].split(","); - for (String s : pairs) { - String[] values = s.split("=", 2); - - // make sure we have values to go with the key - if (values.length > 1) { - if ((values[0] != null) && values[0].equalsIgnoreCase(NAME)) { - if (values[1] != null) - groupInfo.setGroupName(values[1]); - groupDataList.add(groupInfo.getGroupName()); - } else if (values[0].equalsIgnoreCase(DESCRIPT)) { - groupInfo.setDescription(values[1]); - } else if (values[0].equalsIgnoreCase(GRID)) { - if (values[1].equalsIgnoreCase("T")) { - groupInfo.setGridLines(true); - } else { - groupInfo.setGridLines(false); - } - } else if (values[0].equalsIgnoreCase(TRACEMODE)) { - groupInfo.setTraceMode(values[1]); - } else if (values[0].equalsIgnoreCase(PASTHOURS)) { - groupInfo.setPastHours(Integer.parseInt(values[1])); - } else if (values[0].equalsIgnoreCase(FUTUREHOURS)) { - groupInfo.setFutureHours(Integer.parseInt(values[1])); - } else { - statusHandler.warn("Invalid key/value pair: " + s); - } - } - } - } else if (parts[0].equals(PAGE)) { - String[] values = parts[1].split("=", 2); - if (values.length > 1) { - pageInfo = new PageInfo(); - pageInfo.setTitle(values[1]); - groupInfo.addPageInfo(pageInfo); - } - } else if (parts[0].equals(GRAPH)) { - graphData = new GraphData(); - - String[] pairs = parts[1].split(","); - for (String s : pairs) { - String[] values = s.split("=", 2); - if (values.length > 1) { - if (values[0].equalsIgnoreCase(POS)) { - graphData.setGraph_pos(Integer.parseInt(values[1])); - } else if (values[0].equalsIgnoreCase(XSIZE)) { - graphData.setXsize(Integer.parseInt(values[1])); - } else if (values[0].equalsIgnoreCase(YSIZE)) { - graphData.setYsize(Integer.parseInt(values[1])); - } else if (values[0].equalsIgnoreCase(YLINEAR)) { - graphData.setYlinear(values[1]); - } else if (values[0].equalsIgnoreCase(YSCALE)) { - graphData.setYscale(values[1]); - } else if (values[0].equalsIgnoreCase(SHOWCAT)) { - if (values[1].equalsIgnoreCase("T")) { - graphData.setShowcat(true); - } else { - graphData.setShowcat(false); - } - } else if (values[0].equalsIgnoreCase(DERIVEPP)) { - graphData.setDerivepp(values[1]); - } else if (values[0].equalsIgnoreCase(SHOWPP)) { - if (values[1].equalsIgnoreCase("T")) { - showpp_flag = true; - } else { - showpp_flag = false; - } - } else if (values[0].equalsIgnoreCase(LATESTFCSTONLY)) { - if (values[1].equalsIgnoreCase("T")) { - graphData.setLatestfcstonly(true); - } else { - graphData.setLatestfcstonly(false); - } - } else { - statusHandler.warn("Invalid key/value pair: " + s); - } - } - } - // handle the case where there isn't a page element when - // there should be - if (pageInfo == null) { - pageInfo = new PageInfo(); - } - pageInfo.addGraphData(graphData); - } else if (parts[0].equals(TRACE)) { - TraceData td = new TraceData(); - String[] pairs = parts[1].split(","); - for (String s : pairs) { - String[] values = s.split("=", 2); - if (values.length > 1) { - if (values[0].equalsIgnoreCase(STN)) { - td.setLid(values[1]); - } else if (values[0].equalsIgnoreCase(HydroConstants.PC)) { - td.setPc(values[1]); - if (showpp_flag == true) - graphData.setShowpp(true); - else - graphData.setShowpp(false); - } else if (values[0].equalsIgnoreCase(COLOR)) { - td.setColorName(values[1]); - } - } - } - graphData.addTrace(td); - - graphData.setBeginDate(beginDate); - graphData.setEndDate(endDate); - - } else { - statusHandler - .warn("Error in Group Definition Config file: " + line); - } - - // select the first item in the list - if (groupDataList.getItemCount() > 0) { - groupDataList.select(0); - } - } - /** * Handle Table option when selected on the Time Series Control Dialog */ @@ -2062,7 +2065,7 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { /* Set up the GraphData objects */ if (modeCbo.getText().equals(STATION_SELECTION)) { - groupInfo = new GroupInfo(); + GroupInfo groupInfo = new GroupInfo(); groupInfo.setCurrentPage(0); /* Get the data from the station list */ @@ -2096,7 +2099,8 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { } else { /* Set the group info object */ - groupInfo = groupList.get(groupDataList.getSelectionIndex()); + GroupInfo groupInfo = groupList.get(groupDataList + .getSelectionIndex()); tabularDlg.setGroupInfo(groupInfo); for (PageInfo pi : groupInfo.getPageInfoList()) { @@ -2151,7 +2155,7 @@ public class TimeSeriesDlg extends CaveHydroSWTDialog { /* Set up the GraphData objects */ if (modeCbo.getText().equals(STATION_SELECTION)) { int numberGraphs = 1; - groupInfo = new GroupInfo(); + GroupInfo groupInfo = new GroupInfo(); groupInfo.setCurrentPage(0); /* Get the data from the station list */ diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/graph/TimeSeriesGraphCanvas.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/graph/TimeSeriesGraphCanvas.java index f38c587e1a..86ae6e1126 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/graph/TimeSeriesGraphCanvas.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/graph/TimeSeriesGraphCanvas.java @@ -64,8 +64,8 @@ import com.raytheon.viz.hydrocommon.HydroConstants; * function adjust_pcymax() * Aug. 10, 2011 10457 djingtao allow the red rubberband box to be drawn for setMissing in Edit * Jul. 24, 2012 15195 mpduff Fix x axis scales. - * 06 Nov 2012 15399 wkwock Fix refine the plot algorithm and sampling algorithm - * + * 06 Nov 2012 15399 wkwock Fix refine the plot algorithm and sampling algorithm + * May 06, 2013 1976 mpduff Code cleanup * * * @author mpduff @@ -73,1137 +73,1131 @@ import com.raytheon.viz.hydrocommon.HydroConstants; */ public class TimeSeriesGraphCanvas extends Canvas { - /** - * Font for the canvas. - */ - protected Font canvasFont; + /** + * Font for the canvas. + */ + protected Font canvasFont; - /** - * Canvas width. - */ - protected int canvasWidth = 400; + /** + * Canvas width. + */ + protected int canvasWidth = 400; - /** - * Canvas height. - */ - protected int canvasHeight = 475;// 675; + /** + * Canvas height. + */ + protected int canvasHeight = 475;// 675; - /** - * Border around the top and bottom of graph in pixels. - */ - protected static final int GRAPHBORDER = 75; - - /** Right side graph border in pixels. */ - protected static final int GRAPHBORDER_RIGHT = 70; - - /** Left side graph border in pixels. */ - protected static final int GRAPHBORDER_LEFT = 60; + /** + * Border around the top and bottom of graph in pixels. + */ + protected static final int GRAPHBORDER = 75; - /** - * Graph Area Width in pixels. - */ - protected int graphAreaWidth = canvasWidth - GRAPHBORDER_LEFT - GRAPHBORDER_RIGHT; + /** Right side graph border in pixels. */ + protected static final int GRAPHBORDER_RIGHT = 70; - /** - * Graph Area Height in pixels. - */ - protected int graphAreaHeight = canvasHeight - GRAPHBORDER * 2; + /** Left side graph border in pixels. */ + protected static final int GRAPHBORDER_LEFT = 60; - /** - * Point of the lower axis. - */ - protected int lowerAxis = canvasHeight - GRAPHBORDER; + /** + * Graph Area Width in pixels. + */ + protected int graphAreaWidth = canvasWidth - GRAPHBORDER_LEFT + - GRAPHBORDER_RIGHT; - /** - * The horizontal span of the graph Valid values are 1-6 - */ - protected int horizontalSpan = 3; + /** + * Graph Area Height in pixels. + */ + protected int graphAreaHeight = canvasHeight - GRAPHBORDER * 2; - /** - * The vertical span of the graph Valid values are 1-2 - */ - protected int verticalSpan = 2; + /** + * Point of the lower axis. + */ + protected int lowerAxis = canvasHeight - GRAPHBORDER; - /** The trace line width */ - protected int lineWidth; + /** + * The horizontal span of the graph Valid values are 1-6 + */ + protected int horizontalSpan = 3; - /** The rectangle that is the rubber band bounding box */ - protected Rectangle boundingBox; + /** + * The vertical span of the graph Valid values are 1-2 + */ + protected int verticalSpan = 2; - /** The rectangle that is delete point selection */ - protected Rectangle deleteRect = null; - - /** The rectangle that is setMissing point selection */ - protected Rectangle setMissingRect = null; - - - /** The first x coordinate of the bounding box */ - protected int rubberBandX1; - - /** The first y coordinate of the bounding box */ - protected int rubberBandY1; - - /** The second x coordinate of the bounding box */ - protected int rubberBandX2; - - /** The second y coordinate of the bounding box */ - protected int rubberBandY2; - - /** The height of the font in pixels */ - protected int fontHeight; - - /** The Cross Hair cursor */ - protected Cursor crossHairCursor; - - /** The standard arrow cursor */ - protected Cursor arrowCursor; - - /** The Hand cursor */ - protected Cursor handCursor; - - /** The North South Arrow Cursor */ - protected Cursor northSouthCursor; - - /** Flag to display the gridlines */ - protected boolean displayGridLines = true; - - /** The rectangle that is the graph area of the canvas */ - protected Rectangle graphAreaRectangle; - - /** Flag for existence of rating curve */ - protected boolean ratingCurveExist = false; - - /* Flag for selection of 1hr PC as PP */ - protected boolean showPP = false; - - protected ArrayList precipRegions = new ArrayList(); - - protected ArrayList> precipPointList = new ArrayList>(); - - protected Color white; - - protected Color black; - - protected int currentX; - - protected int currentY; - - /** - * Current trace color. - */ - protected Color currentTraceColor = null; - - /** The parent composite */ - protected Composite parentComp = null; - - /** The dialog containing this object */ - private TimeSeriesDisplayDlg parentDialog = null; - - protected int topBorder = GRAPHBORDER; - - protected int bottomBorder; - - protected int leftBorder = GRAPHBORDER_LEFT; - - protected int rightBorder; - - protected ScaleManager scalingManager = null; - - protected double yminChange = 0; - protected double ymaxChange = 0; - protected double newyminChange = 0; - protected double newymaxChange = 0; - protected double yinc = 0; - - /** - * - * @param parent - * The parent composite - * @param style - * The window style - */ - public TimeSeriesGraphCanvas(Composite parent, int style) { - super(parent, style); - parentComp = parent; - } - - /** - * Draws the Y axis (horizontal lines) - * - * @param e - * The Paint Event - * @param gd - * The Graph Data - * @param label - * The label for the axis - */ - protected void drawYAxis(GC gc, GraphData gd, String label) { - /* xoffset for left axis, xoffset2 for right axis */ - int xoffset = 40; - int xoffset2 = 10; - int swtColor = SWT.COLOR_WHITE; - if (this.parentDialog.isInverseVideo()) { - swtColor = SWT.COLOR_BLACK; - } - - double yMin = gd.getYmin(); - double yMax = gd.getYmax(); - double yDiff = (gd.getYmax() - gd.getYmin()); - - ratingCurveExist = false; - ScaleManager scale2Mgr = null; - - /* Is this PC data */ - showPP = gd.getShowpp(); - - // Right Scale - if (showPP) - { - // scale the right axis when showPP is true - scale2Mgr = new ScaleManager(0, newymaxChange - newyminChange); - } - else - scale2Mgr = new ScaleManager(0, yMax - yMin); - - /* Maximum discharge value */ - double maxDischarge = -999; - if (gd.getYmin() > 1000) { - xoffset = 50; - xoffset2 = 30; - } - - gd.setDisplayFlowUnit(false); - String pe = gd.getTraceData(0).getPe().toUpperCase(); - - /* Does a rating table exist for this site? */ - String lid = gd.getTraces().get(0).getLid(); - if (!ratingCurveExist && (pe.startsWith("H") || pe.startsWith("Q"))) { - ratingCurveExist = StageDischargeUtils.checkRatingTable(lid); - } - - if (pe.startsWith("Q")) { - xoffset = 45; - xoffset2 = 25; - maxDischarge = gd.getYmax(); - } else { - if (ratingCurveExist) { - maxDischarge = StageDischargeUtils.stage2discharge(lid, - gd.getYmax()); - } - } - - int numberTicks = scalingManager.getMajorTickCount(); - int numberTicks2 = scale2Mgr.getMajorTickCount(); - - gc.setForeground(parentComp.getDisplay().getSystemColor(swtColor)); - - double data = gd.getYmin(); - double showPPData = 0; - double inc = scalingManager.getMajorTickIncrement(); - double inc2 = scale2Mgr.getMajorTickIncrement(); - - gd.setYmax(scalingManager.getMaxScaleValue()); - gd.setYmin(scalingManager.getMinScaleValue()); - gd.setYmin2(showPPData); - gd.setYmax2(newymaxChange); - - NumberFormat formatter = new DecimalFormat("0"); - NumberFormat dischargeFormat = new DecimalFormat("0.0"); - int dx = 5; - int y = 0; - int showPPDatay = 0; - - if (yDiff < 1.0) { - formatter = new DecimalFormat("0.00"); - } else if (yDiff < 10.0) { - formatter = new DecimalFormat("0.0"); - } else if ((yDiff >= 10.0) && (yDiff <= 100.0)) { - formatter = new DecimalFormat("0.0"); - } - - for (int i = 0; i < numberTicks; i++) { - y = y2pixel(gd, data); - dx = 5; - if (displayGridLines) { - dx = 8; - int[] gridLine = { leftBorder, topBorder + y, rightBorder, - topBorder + y }; - - gc.setForeground(parentComp.getDisplay().getSystemColor( - SWT.COLOR_GRAY)); - gc.setLineStyle(SWT.LINE_DOT); - gc.drawPolyline(gridLine); - gc.setLineStyle(SWT.LINE_SOLID); - - gc.setForeground(parentComp.getDisplay().getSystemColor( - swtColor)); - } - - /* Draw the tick marks and values on left axis */ - int labelX = 0; - int labelY = 0; - int[] tick = { leftBorder, topBorder + y, leftBorder - dx, - topBorder + y }; - - labelX = leftBorder - xoffset; - labelY = topBorder + y - 8; - gc.drawPolyline(tick); - gc.drawText("" + formatter.format(data), labelX, labelY); - - /*Draw the tick marks and values on right axis for ratingCurveExist */ - if (ratingCurveExist) { - double value = 0; - if (pe.toUpperCase().startsWith("H")) { - value = StageDischargeUtils.stage2discharge(lid, data); - if ((value < 0)) { - value = 0.0; - } else if (maxDischarge >= 10000) { - value /= 1000; - } - } else if (pe.toUpperCase().startsWith("Q")) { - double stageValue = StageDischargeUtils - .getStageFromDischarge(gd, data); - if (stageValue != HydroConstants.MISSING_VALUE) { - value = stageValue; - } else { - break; - } - } - - tick = new int[4]; - tick[0] = rightBorder; - tick[1] = topBorder + y; - tick[2] = rightBorder + dx; - tick[3] = topBorder + y; - labelX = rightBorder + xoffset2; - labelY = topBorder + y - 7; - gc.drawPolyline(tick); - - gc.drawText(dischargeFormat.format(value) + "", labelX, - labelY, true); - } - - data += inc; - } - - /* draw right y axis when showPP is true */ - if (showPP) - { - for (int i = 0; i < numberTicks2; i++) - { - int labelX = 0; - int labelY = 0; - dx=5; - showPPDatay = secondaryY2pixel(gd, showPPData); - int[] tick2 = { leftBorder, topBorder + showPPDatay, leftBorder - dx, - topBorder + showPPDatay }; - tick2 = new int[4]; - tick2[0] = rightBorder; - tick2[1] = topBorder + showPPDatay; - tick2[2] = rightBorder + dx; - tick2[3] = topBorder + showPPDatay; - labelX = rightBorder + xoffset2; - labelY = topBorder + showPPDatay - 7; - - gc.drawPolyline(tick2); - gc.setForeground(parentComp.getDisplay().getSystemColor( - SWT.COLOR_YELLOW)); - - gc.drawText(dischargeFormat.format(showPPData) + "", - labelX, labelY, true); - - gc.setForeground(parentComp.getDisplay().getSystemColor( - SWT.COLOR_WHITE)); - - showPPData += inc2; - } - } - - if (ratingCurveExist) { - labelRightAxis(gc, pe, maxDischarge); - } - - labelLeftAxis(gc, pe, maxDischarge, label); - } - - /** - * adjust min/max on Y when showPP is true - */ - protected void adjust_pcymax() - { - double dminmax; - dminmax = ymaxChange - yminChange; - - if (dminmax <= 0.5) - { - newyminChange = 0.0; - newymaxChange = (int)ymaxChange + 0.5; - yinc = 0.1; - } - else if (dminmax <= 2.0) - { - newyminChange = (int)yminChange; - newymaxChange = (int)ymaxChange + 1.0; - yinc = 0.5; - } - else - { - newyminChange = (int)yminChange; - newymaxChange = (int)ymaxChange + 1.0; - yinc = 1.0; - } - - } - - /** - * Draws the X Axis - * - * @param e - * The Paint Event - * @param gd - * The Graph Data - */ - protected void drawXAxis(GC gc, GraphData gd) { - int minorTicks = 1; /* Minor ticks set 1 hour default */ - int majorTicks = 6; /* Major ticks set 6 hour default */ - - long ndays = (gd.getXMax().getTime() / HydroConstants.MILLIS_PER_MINUTE - gd - .getXMin().getTime() / HydroConstants.MILLIS_PER_MINUTE) - / HydroConstants.MINUTES_PER_DAY; - - if (ndays == 0) { - ndays = 1; - } - - boolean zHrDisplay = true; - int daysCount = 1; - int daysSkip = 1; - - if (ndays > 10) { - zHrDisplay = false; - daysSkip = (int) (ndays / 10); - majorTicks = (int) (ndays / 10) * 24; - if (majorTicks == 0) { - majorTicks = 1; - } - minorTicks = majorTicks / 2; - if (minorTicks == 0) { - minorTicks = 1; - } - daysCount = daysSkip; - } - - // Check canvas width. if small then need to skip extra days - if (this.canvasWidth < 500) { - daysSkip++; - } - - int x = -999; - int dy = 5; - int dx = 4; - long startMillis = ((long)Math.ceil(gd.getXMin().getTime()/HydroConstants.MILLIS_PER_HOUR))*HydroConstants.MILLIS_PER_HOUR; - long endMillis = gd.getXMax().getTime(); - - for (long i = startMillis; i <= endMillis; i += HydroConstants.MILLIS_PER_HOUR) { - x = x2pixel(gd, i+59000); //59 seconds for better sampling - Date d = SimulatedTime.getSystemTime().getTime(); - d.setTime(i); - dy = 5; - Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - c.setTime(d); - int hour = c.get(Calendar.HOUR_OF_DAY); - if (hour == 0) { - dy = 12; - if (daysCount++ % daysSkip == 0) { - gc.drawText("00", x - + GRAPHBORDER_LEFT - dx, bottomBorder + 22); - gc.drawText( - c.get(Calendar.MONTH) + 1 + "/" - + c.get(Calendar.DAY_OF_MONTH), x - + GRAPHBORDER_LEFT - 8, bottomBorder + 40); - - if (displayGridLines) { - gc.setLineStyle(SWT.LINE_DOT); - gc.drawLine(x + leftBorder, topBorder, x + leftBorder, - bottomBorder); - gc.setLineStyle(SWT.LINE_SOLID); - } - } else { - if (ndays < 8) { - gc.drawText("00", x - + GRAPHBORDER_LEFT - dx, bottomBorder + 22); - } - } - } else { - if (hour % majorTicks == 0) { - /* ******************** */ - /* Hour annotation */ - /* ******************** */ - dy = 10; - if (ndays < 8 && this.canvasWidth > 450) { - if (hour < 10) { - gc.drawText("0" + hour, x + leftBorder - dx, bottomBorder + 22); - } else { - gc.drawText(c.get(Calendar.HOUR_OF_DAY) + "", x - + leftBorder - dx, bottomBorder + 22); - } - } else { - if (hour == 12) { - gc.drawText(hour + "", x - + leftBorder - dx, bottomBorder + 22); - } - } - } - } - - /* ******************************** */ - /* major and minor ticks annotation */ - /* ******************************** */ - if ((c.get(Calendar.HOUR_OF_DAY) % minorTicks) == 0) { - // Don't draw minor ticks for short time periods -// if ((ndays > 10) && (dy == 10)) { -// int[] tickArray = { x + leftBorder, bottomBorder, -// x + leftBorder, bottomBorder + dy }; -// gc.drawPolyline(tickArray); -// } else { - int[] tickArray = { x + leftBorder, bottomBorder, - x + leftBorder, bottomBorder + dy }; - gc.drawPolyline(tickArray); -// } - } - } - - if (zHrDisplay) { - gc.drawText("(Z)", rightBorder + 10, bottomBorder + 22); - } - - /* ********************************************* */ - /* Draw reference vertical line at present time */ - /* ********************************************* */ - Date d = SimulatedTime.getSystemTime().getTime(); - if ((d.getTime() > gd.getXMin().getTime()) - && (d.getTime() < gd.getXMax().getTime())) { - int curTimeLoc = GRAPHBORDER_LEFT + x2pixel(gd, d.getTime()); - if ((curTimeLoc < (canvasWidth - GRAPHBORDER)) - && (curTimeLoc > GRAPHBORDER_LEFT)) { - int[] curTimeLine = { curTimeLoc, topBorder, curTimeLoc, - bottomBorder }; - gc.setLineStyle(SWT.LINE_DOT); - gc.setLineWidth(3); - gc.drawPolyline(curTimeLine); - gc.setLineStyle(SWT.LINE_SOLID); - gc.setLineWidth(1); - } - } - } - - /** - * convert real Y value to pixel value. - * - * @param gd - * The Graph Data - * @param y - * The y data value to convert - * @return The y pixel value - */ - protected int y2pixel(GraphData gd, double y) { - if (y == HydroConstants.MISSING_VALUE) { - return gd.getH() + GRAPHBORDER; - } - double yDiff = gd.getYmax() - gd.getYmin(); - double yValue = (graphAreaHeight / yDiff) * (y - gd.getYmin()); - - return (int) (graphAreaHeight - Math.round(yValue)); - } - - /** - * convert pixel value to real Y value - * - * @param gd - * The GraphData object - * @param ypix - * The y pixel value - * @return The y value - */ - protected double pixel2y(GraphData gd, int ypix) { - double yMin = gd.getYmin(); - double yMax = gd.getYmax(); - double ydiff = yMax - yMin; - double pixPerUnit = graphAreaHeight / ydiff; - - return (yMax - ((ypix - GRAPHBORDER) / pixPerUnit)); - } - - /** - * convert real X value to pixel value. - * - * @param gd - * The Graph Data - * @param x - * The X value to convert - * @return The pixel value - */ - protected int x2pixel(GraphData gd, long x) { - long xMin = gd.getXMin().getTime(); - long xMax = gd.getXMax().getTime(); - long xDiff = xMax - xMin; - - long millisPerPixel = xDiff / graphAreaWidth; - - float xValue = (x - xMin) / millisPerPixel; - - return Math.round(xValue); - } - - /** - * convert pixel value to real time value. - * - * @param gd - * The Graph Data object - * @param xpix - * The x pixel value - * @return The date value of the x pixel - */ - protected Date pixel2x(GraphData gd, int xpix) { - long xMin = gd.getXMin().getTime(); - long xMax = gd.getXMax().getTime(); - long xDiff = xMax - xMin; - double millisPerPixel = xDiff / graphAreaWidth; - long millisTime = (long)(xpix * millisPerPixel) + xMin; - - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(millisTime); - - return cal.getTime(); - } - - /** - * convert real Y value to pixel value for right axis. - * - * @param gd - * The Graph Data - * @param y - * The y data value to convert - * @return The y pixel value - */ - protected int secondaryY2pixel(GraphData gd, double y) { - if (y == HydroConstants.MISSING_VALUE) { - return gd.getH() + GRAPHBORDER; - } - - double yDiff = gd.getYmax2() - gd.getYmin2(); - double yValue = (graphAreaHeight / yDiff) * (y - gd.getYmin2()); - - return (int) (graphAreaHeight - Math.round(yValue)); - } - - /** - * Labels the left axis. - * - * @param e - * PaintEvent - * @param pe - * Physical Element - * @param maxDischarge - * Maximum Discharge - * @param label - * Label to display - */ - private void labelLeftAxis(GC gc, String pe, double maxDischarge, - String label) { - if (pe.toUpperCase().startsWith("Q")) { - if (maxDischarge >= 10000.0) { - label = "Total Discharge in KCFS"; - } else { - label = "Total Discharge in CFS"; - } - } else if (pe.toUpperCase().startsWith("H")) { - label = "River Stage in Feet"; - } else { - // label = getShefPE(pe); - // Use the label passed in - } - - int yoffset = ((graphAreaHeight + GRAPHBORDER * 2) - 10 * label - .length()) / 2; - - char[] ca = label.toCharArray(); - for (int i = 0; i < ca.length; i++) { - gc.drawText(Character.toString(ca[i]), 1, 10 * i + yoffset, true); - } - } - - /** - * Label the right axis. - * - * @param e - * PaintEvent - * @param pe - * Physical Element - * @param maxDischarge - * Maximum Discharge - */ - private void labelRightAxis(GC gc, String pe, double maxDischarge) { - int yoffset; - char[] ca = new char[0]; - String label = ""; - - if (ratingCurveExist) { - label = "River Stage in Feet"; - if (pe.toUpperCase().startsWith("H")) { - if (maxDischarge >= 10000.0) { - label = "Total Discharge in KCFS"; - } else { - label = "Total Discharge in CFS"; - } - } - - ca = label.toCharArray(); - } else if (showPP) { - //no label needed based on A1, just use different tick mark - // label = "Precipitation in"; - // ca = label.toCharArray(); - } - - yoffset = ((graphAreaHeight + GRAPHBORDER * 2) - 10 * label.length()) / 2; - - for (int i = 0; i < ca.length; i++) { - gc.drawText(Character.toString(ca[i]), graphAreaWidth + GRAPHBORDER_LEFT + - GRAPHBORDER_RIGHT - 20, 10 * i + yoffset, true); - } - } - - /** - * Resize the graph when the window size changes - * - * @param rect - * The new graph size - */ - protected void resizeGraph(Rectangle rect) { - canvasHeight = rect.height / 2 * verticalSpan; - canvasWidth = rect.width / 6 * horizontalSpan; - - graphAreaWidth = canvasWidth - GRAPHBORDER_LEFT - GRAPHBORDER_RIGHT; - graphAreaHeight = canvasHeight - GRAPHBORDER * 2; - lowerAxis = canvasHeight - GRAPHBORDER; - bottomBorder = lowerAxis; - rightBorder = canvasWidth - GRAPHBORDER_RIGHT; - } - - /** - * Draws the "rubber band" bounding box on the canvas - * - * @param e - * PaintEvent - * @param mouseDown - * Is the mouse down, true if mouse is down - */ - protected void drawRubberBand(GC gc, boolean mouseDown) { - gc.setForeground(parentComp.getDisplay().getSystemColor(SWT.COLOR_RED)); - gc.setLineWidth(2); - if ((boundingBox != null) && parentDialog.isZoomAction() && mouseDown) { - gc.drawRectangle(boundingBox); - } else if ((deleteRect != null) && mouseDown) { - gc.drawRectangle(deleteRect); - } else if ((setMissingRect != null) && mouseDown) { - gc.drawRectangle(setMissingRect); - } - } - - /** - * Display the flood category lines on the graph - * - * @param e - * PaintEvent - * @param graphData - * The GraphData object - */ - protected void displayFloodCatLines(GC gc, GraphData graphData) { - int y = 0; - - gc.setLineWidth(2); - - /* Action stage/flow */ - if ((graphData.getActionStage() >= 0) || (graphData.getActionFlow() >= 0)) { - gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils - .getColor("Yellow"))); - if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, - graphData.getActionStage())); - } else { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getActionFlow())); - } - - if ((y <= (graphData.getY() + graphData.getH())) - && (y >= graphData.getY())) { - gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT - + graphAreaWidth, y + GRAPHBORDER); - } - } - - /* Flood/Flow stage */ - if ((graphData.getFloodStage() >= 0) || (graphData.getFloodFlow() >= 0)) { - gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils - .getColor("Orange"))); - - if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getFloodStage())); - } else { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getFloodFlow())); - } - - if ((y <= (graphData.getY() + graphData.getH())) - && (y >= graphData.getY())) { - gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT - + graphAreaWidth, y + GRAPHBORDER); - } - } - - /* Minor stage/flow */ - if ((graphData.getMinorStage() >= 0) || (graphData.getMinorFlow() >= 0)) { + /** The trace line width */ + protected int lineWidth; + + /** The rectangle that is the rubber band bounding box */ + protected Rectangle boundingBox; + + /** The rectangle that is delete point selection */ + protected Rectangle deleteRect = null; + + /** The rectangle that is setMissing point selection */ + protected Rectangle setMissingRect = null; + + /** The first x coordinate of the bounding box */ + protected int rubberBandX1; + + /** The first y coordinate of the bounding box */ + protected int rubberBandY1; + + /** The second x coordinate of the bounding box */ + protected int rubberBandX2; + + /** The second y coordinate of the bounding box */ + protected int rubberBandY2; + + /** The height of the font in pixels */ + protected int fontHeight = -999; + + /** The Cross Hair cursor */ + protected Cursor crossHairCursor; + + /** The Hand cursor */ + protected Cursor handCursor; + + /** The North South Arrow Cursor */ + protected Cursor northSouthCursor; + + /** Flag to display the gridlines */ + protected boolean displayGridLines = true; + + /** The rectangle that is the graph area of the canvas */ + protected Rectangle graphAreaRectangle; + + /** Flag for existence of rating curve */ + protected boolean ratingCurveExist = false; + + /* Flag for selection of 1hr PC as PP */ + protected boolean showPP = false; + + protected ArrayList precipRegions = new ArrayList(); + + protected ArrayList> precipPointList = new ArrayList>(); + + protected int currentX; + + protected int currentY; + + /** + * Current trace color. + */ + protected Color currentTraceColor = null; + + /** The parent composite */ + protected Composite parentComp = null; + + /** The dialog containing this object */ + private TimeSeriesDisplayDlg parentDialog = null; + + protected int topBorder = GRAPHBORDER; + + protected int bottomBorder; + + protected int leftBorder = GRAPHBORDER_LEFT; + + protected int rightBorder; + + protected ScaleManager scalingManager = null; + + protected double yminChange = 0; + + protected double ymaxChange = 0; + + protected double newyminChange = 0; + + protected double newymaxChange = 0; + + protected double yinc = 0; + + /** + * + * @param parent + * The parent composite + * @param style + * The window style + */ + public TimeSeriesGraphCanvas(Composite parent, int style) { + super(parent, style); + parentComp = parent; + } + + /** + * Draws the Y axis (horizontal lines) + * + * @param e + * The Paint Event + * @param gd + * The Graph Data + * @param label + * The label for the axis + */ + protected void drawYAxis(GC gc, GraphData gd, String label) { + /* xoffset for left axis, xoffset2 for right axis */ + int xoffset = 40; + int xoffset2 = 10; + int swtColor = SWT.COLOR_WHITE; + if (this.parentDialog.isInverseVideo()) { + swtColor = SWT.COLOR_BLACK; + } + + double yMin = gd.getYmin(); + double yMax = gd.getYmax(); + double yDiff = (gd.getYmax() - gd.getYmin()); + + ratingCurveExist = false; + ScaleManager scale2Mgr = null; + + /* Is this PC data */ + showPP = gd.getShowpp(); + + // Right Scale + if (showPP) { + // scale the right axis when showPP is true + scale2Mgr = new ScaleManager(0, newymaxChange - newyminChange); + } else { + scale2Mgr = new ScaleManager(0, yMax - yMin); + } + + /* Maximum discharge value */ + double maxDischarge = -999; + if (gd.getYmin() > 1000) { + xoffset = 50; + xoffset2 = 30; + } + + gd.setDisplayFlowUnit(false); + String pe = gd.getTraceData(0).getPe().toUpperCase(); + + /* Does a rating table exist for this site? */ + String lid = gd.getTraces().get(0).getLid(); + if (!ratingCurveExist && (pe.startsWith("H") || pe.startsWith("Q"))) { + ratingCurveExist = StageDischargeUtils.checkRatingTable(lid); + } + + if (pe.startsWith("Q")) { + xoffset = 45; + xoffset2 = 25; + maxDischarge = gd.getYmax(); + } else { + if (ratingCurveExist) { + maxDischarge = StageDischargeUtils.stage2discharge(lid, + gd.getYmax()); + } + } + + int numberTicks = scalingManager.getMajorTickCount(); + int numberTicks2 = scale2Mgr.getMajorTickCount(); + + gc.setForeground(parentComp.getDisplay().getSystemColor(swtColor)); + + double data = gd.getYmin(); + double showPPData = 0; + double inc = scalingManager.getMajorTickIncrement(); + double inc2 = scale2Mgr.getMajorTickIncrement(); + + gd.setYmax(scalingManager.getMaxScaleValue()); + gd.setYmin(scalingManager.getMinScaleValue()); + gd.setYmin2(showPPData); + gd.setYmax2(newymaxChange); + + NumberFormat formatter = new DecimalFormat("0"); + NumberFormat dischargeFormat = new DecimalFormat("0.0"); + int dx = 5; + int y = 0; + int showPPDatay = 0; + + if (yDiff < 1.0) { + formatter = new DecimalFormat("0.00"); + } else if (yDiff < 10.0) { + formatter = new DecimalFormat("0.0"); + } else if ((yDiff >= 10.0) && (yDiff <= 100.0)) { + formatter = new DecimalFormat("0.0"); + } + + for (int i = 0; i < numberTicks; i++) { + y = y2pixel(gd, data); + dx = 5; + if (displayGridLines) { + dx = 8; + int[] gridLine = { leftBorder, topBorder + y, rightBorder, + topBorder + y }; + + gc.setForeground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_GRAY)); + gc.setLineStyle(SWT.LINE_DOT); + gc.drawPolyline(gridLine); + gc.setLineStyle(SWT.LINE_SOLID); + + gc.setForeground(parentComp.getDisplay().getSystemColor( + swtColor)); + } + + /* Draw the tick marks and values on left axis */ + int labelX = 0; + int labelY = 0; + int[] tick = { leftBorder, topBorder + y, leftBorder - dx, + topBorder + y }; + + labelX = leftBorder - xoffset; + labelY = topBorder + y - 8; + gc.drawPolyline(tick); + gc.drawText("" + formatter.format(data), labelX, labelY); + + /* Draw the tick marks and values on right axis for ratingCurveExist */ + if (ratingCurveExist) { + double value = 0; + if (pe.toUpperCase().startsWith("H")) { + value = StageDischargeUtils.stage2discharge(lid, data); + if ((value < 0)) { + value = 0.0; + } else if (maxDischarge >= 10000) { + value /= 1000; + } + } else if (pe.toUpperCase().startsWith("Q")) { + double stageValue = StageDischargeUtils + .getStageFromDischarge(gd, data); + if (stageValue != HydroConstants.MISSING_VALUE) { + value = stageValue; + } else { + break; + } + } + + tick = new int[4]; + tick[0] = rightBorder; + tick[1] = topBorder + y; + tick[2] = rightBorder + dx; + tick[3] = topBorder + y; + labelX = rightBorder + xoffset2; + labelY = topBorder + y - 7; + gc.drawPolyline(tick); + + gc.drawText(dischargeFormat.format(value) + "", labelX, labelY, + true); + } + + data += inc; + } + + /* draw right y axis when showPP is true */ + if (showPP) { + for (int i = 0; i < numberTicks2; i++) { + int labelX = 0; + int labelY = 0; + dx = 5; + showPPDatay = secondaryY2pixel(gd, showPPData); + int[] tick2 = { leftBorder, topBorder + showPPDatay, + leftBorder - dx, topBorder + showPPDatay }; + tick2 = new int[4]; + tick2[0] = rightBorder; + tick2[1] = topBorder + showPPDatay; + tick2[2] = rightBorder + dx; + tick2[3] = topBorder + showPPDatay; + labelX = rightBorder + xoffset2; + labelY = topBorder + showPPDatay - 7; + + gc.drawPolyline(tick2); + gc.setForeground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_YELLOW)); + + gc.drawText(dischargeFormat.format(showPPData) + "", labelX, + labelY, true); + + gc.setForeground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_WHITE)); + + showPPData += inc2; + } + } + + if (ratingCurveExist) { + labelRightAxis(gc, pe, maxDischarge); + } + + labelLeftAxis(gc, pe, maxDischarge, label); + } + + /** + * adjust min/max on Y when showPP is true + */ + protected void adjust_pcymax() { + double dminmax; + dminmax = ymaxChange - yminChange; + + if (dminmax <= 0.5) { + newyminChange = 0.0; + newymaxChange = (int) ymaxChange + 0.5; + yinc = 0.1; + } else if (dminmax <= 2.0) { + newyminChange = (int) yminChange; + newymaxChange = (int) ymaxChange + 1.0; + yinc = 0.5; + } else { + newyminChange = (int) yminChange; + newymaxChange = (int) ymaxChange + 1.0; + yinc = 1.0; + } + + } + + /** + * Draws the X Axis + * + * @param e + * The Paint Event + * @param gd + * The Graph Data + */ + protected void drawXAxis(GC gc, GraphData gd) { + int minorTicks = 1; /* Minor ticks set 1 hour default */ + int majorTicks = 6; /* Major ticks set 6 hour default */ + + long ndays = (gd.getXMax().getTime() / HydroConstants.MILLIS_PER_MINUTE - gd + .getXMin().getTime() / HydroConstants.MILLIS_PER_MINUTE) + / HydroConstants.MINUTES_PER_DAY; + + if (ndays == 0) { + ndays = 1; + } + + boolean zHrDisplay = true; + int daysCount = 1; + int daysSkip = 1; + + if (ndays > 10) { + zHrDisplay = false; + daysSkip = (int) (ndays / 10); + majorTicks = (int) (ndays / 10) * 24; + if (majorTicks == 0) { + majorTicks = 1; + } + minorTicks = majorTicks / 2; + if (minorTicks == 0) { + minorTicks = 1; + } + daysCount = daysSkip; + } + + // Check canvas width. if small then need to skip extra days + if (this.canvasWidth < 500) { + daysSkip++; + } + + int x = -999; + int dy = 5; + int dx = 4; + long startMillis = ((long) Math.ceil(gd.getXMin().getTime() + / HydroConstants.MILLIS_PER_HOUR)) + * HydroConstants.MILLIS_PER_HOUR; + long endMillis = gd.getXMax().getTime(); + + for (long i = startMillis; i <= endMillis; i += HydroConstants.MILLIS_PER_HOUR) { + x = x2pixel(gd, i + 59000); // 59 seconds for better sampling + Date d = SimulatedTime.getSystemTime().getTime(); + d.setTime(i); + dy = 5; + Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + c.setTime(d); + int hour = c.get(Calendar.HOUR_OF_DAY); + if (hour == 0) { + dy = 12; + if (daysCount++ % daysSkip == 0) { + gc.drawText("00", x + GRAPHBORDER_LEFT - dx, + bottomBorder + 22); + gc.drawText( + c.get(Calendar.MONTH) + 1 + "/" + + c.get(Calendar.DAY_OF_MONTH), x + + GRAPHBORDER_LEFT - 8, bottomBorder + 40); + + if (displayGridLines) { + gc.setLineStyle(SWT.LINE_DOT); + gc.drawLine(x + leftBorder, topBorder, x + leftBorder, + bottomBorder); + gc.setLineStyle(SWT.LINE_SOLID); + } + } else { + if (ndays < 8) { + gc.drawText("00", x + GRAPHBORDER_LEFT - dx, + bottomBorder + 22); + } + } + } else { + if (hour % majorTicks == 0) { + /* ******************** */ + /* Hour annotation */ + /* ******************** */ + dy = 10; + if (ndays < 8 && this.canvasWidth > 450) { + if (hour < 10) { + gc.drawText("0" + hour, x + leftBorder - dx, + bottomBorder + 22); + } else { + gc.drawText(c.get(Calendar.HOUR_OF_DAY) + "", x + + leftBorder - dx, bottomBorder + 22); + } + } else { + if (hour == 12) { + gc.drawText(hour + "", x + leftBorder - dx, + bottomBorder + 22); + } + } + } + } + + /* ******************************** */ + /* major and minor ticks annotation */ + /* ******************************** */ + if ((c.get(Calendar.HOUR_OF_DAY) % minorTicks) == 0) { + // Don't draw minor ticks for short time periods + // if ((ndays > 10) && (dy == 10)) { + // int[] tickArray = { x + leftBorder, bottomBorder, + // x + leftBorder, bottomBorder + dy }; + // gc.drawPolyline(tickArray); + // } else { + int[] tickArray = { x + leftBorder, bottomBorder, + x + leftBorder, bottomBorder + dy }; + gc.drawPolyline(tickArray); + // } + } + } + + if (zHrDisplay) { + gc.drawText("(Z)", rightBorder + 10, bottomBorder + 22); + } + + /* ********************************************* */ + /* Draw reference vertical line at present time */ + /* ********************************************* */ + Date d = SimulatedTime.getSystemTime().getTime(); + if ((d.getTime() > gd.getXMin().getTime()) + && (d.getTime() < gd.getXMax().getTime())) { + int curTimeLoc = GRAPHBORDER_LEFT + x2pixel(gd, d.getTime()); + if ((curTimeLoc < (canvasWidth - GRAPHBORDER)) + && (curTimeLoc > GRAPHBORDER_LEFT)) { + int[] curTimeLine = { curTimeLoc, topBorder, curTimeLoc, + bottomBorder }; + gc.setLineStyle(SWT.LINE_DOT); + gc.setLineWidth(3); + gc.drawPolyline(curTimeLine); + gc.setLineStyle(SWT.LINE_SOLID); + gc.setLineWidth(1); + } + } + } + + /** + * convert real Y value to pixel value. + * + * @param gd + * The Graph Data + * @param y + * The y data value to convert + * @return The y pixel value + */ + protected int y2pixel(GraphData gd, double y) { + if (y == HydroConstants.MISSING_VALUE) { + return gd.getH() + GRAPHBORDER; + } + double yDiff = gd.getYmax() - gd.getYmin(); + double yValue = (graphAreaHeight / yDiff) * (y - gd.getYmin()); + + return (int) (graphAreaHeight - Math.round(yValue)); + } + + /** + * convert pixel value to real Y value + * + * @param gd + * The GraphData object + * @param ypix + * The y pixel value + * @return The y value + */ + protected double pixel2y(GraphData gd, int ypix) { + double yMin = gd.getYmin(); + double yMax = gd.getYmax(); + double ydiff = yMax - yMin; + double pixPerUnit = graphAreaHeight / ydiff; + + return (yMax - ((ypix - GRAPHBORDER) / pixPerUnit)); + } + + /** + * convert real X value to pixel value. + * + * @param gd + * The Graph Data + * @param x + * The X value to convert + * @return The pixel value + */ + protected int x2pixel(GraphData gd, long x) { + long xMin = gd.getXMin().getTime(); + long xMax = gd.getXMax().getTime(); + long xDiff = xMax - xMin; + + long millisPerPixel = xDiff / graphAreaWidth; + + float xValue = (x - xMin) / millisPerPixel; + + return Math.round(xValue); + } + + /** + * convert pixel value to real time value. + * + * @param gd + * The Graph Data object + * @param xpix + * The x pixel value + * @return The date value of the x pixel + */ + protected Date pixel2x(GraphData gd, int xpix) { + long xMin = gd.getXMin().getTime(); + long xMax = gd.getXMax().getTime(); + long xDiff = xMax - xMin; + double millisPerPixel = xDiff / graphAreaWidth; + long millisTime = (long) (xpix * millisPerPixel) + xMin; + + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.setTimeInMillis(millisTime); + + return cal.getTime(); + } + + /** + * convert real Y value to pixel value for right axis. + * + * @param gd + * The Graph Data + * @param y + * The y data value to convert + * @return The y pixel value + */ + protected int secondaryY2pixel(GraphData gd, double y) { + if (y == HydroConstants.MISSING_VALUE) { + return gd.getH() + GRAPHBORDER; + } + + double yDiff = gd.getYmax2() - gd.getYmin2(); + double yValue = (graphAreaHeight / yDiff) * (y - gd.getYmin2()); + + return (int) (graphAreaHeight - Math.round(yValue)); + } + + /** + * Labels the left axis. + * + * @param e + * PaintEvent + * @param pe + * Physical Element + * @param maxDischarge + * Maximum Discharge + * @param label + * Label to display + */ + private void labelLeftAxis(GC gc, String pe, double maxDischarge, + String label) { + if (pe.toUpperCase().startsWith("Q")) { + if (maxDischarge >= 10000.0) { + label = "Total Discharge in KCFS"; + } else { + label = "Total Discharge in CFS"; + } + } else if (pe.toUpperCase().startsWith("H")) { + label = "River Stage in Feet"; + } else { + // label = getShefPE(pe); + // Use the label passed in + } + + int yoffset = ((graphAreaHeight + GRAPHBORDER * 2) - 10 * label + .length()) / 2; + + char[] ca = label.toCharArray(); + for (int i = 0; i < ca.length; i++) { + gc.drawText(Character.toString(ca[i]), 1, 10 * i + yoffset, true); + } + } + + /** + * Label the right axis. + * + * @param e + * PaintEvent + * @param pe + * Physical Element + * @param maxDischarge + * Maximum Discharge + */ + private void labelRightAxis(GC gc, String pe, double maxDischarge) { + int yoffset; + char[] ca = new char[0]; + String label = ""; + + if (ratingCurveExist) { + label = "River Stage in Feet"; + if (pe.toUpperCase().startsWith("H")) { + if (maxDischarge >= 10000.0) { + label = "Total Discharge in KCFS"; + } else { + label = "Total Discharge in CFS"; + } + } + + ca = label.toCharArray(); + } + + yoffset = ((graphAreaHeight + GRAPHBORDER * 2) - 10 * label.length()) / 2; + + for (int i = 0; i < ca.length; i++) { + gc.drawText(Character.toString(ca[i]), graphAreaWidth + + GRAPHBORDER_LEFT + GRAPHBORDER_RIGHT - 20, 10 * i + + yoffset, true); + } + } + + /** + * Resize the graph when the window size changes + * + * @param rect + * The new graph size + */ + protected void resizeGraph(Rectangle rect) { + canvasHeight = rect.height / 2 * verticalSpan; + canvasWidth = rect.width / 6 * horizontalSpan; + + graphAreaWidth = canvasWidth - GRAPHBORDER_LEFT - GRAPHBORDER_RIGHT; + graphAreaHeight = canvasHeight - GRAPHBORDER * 2; + lowerAxis = canvasHeight - GRAPHBORDER; + bottomBorder = lowerAxis; + rightBorder = canvasWidth - GRAPHBORDER_RIGHT; + } + + /** + * Draws the "rubber band" bounding box on the canvas + * + * @param e + * PaintEvent + * @param mouseDown + * Is the mouse down, true if mouse is down + */ + protected void drawRubberBand(GC gc, boolean mouseDown) { + gc.setForeground(parentComp.getDisplay().getSystemColor(SWT.COLOR_RED)); + gc.setLineWidth(2); + if ((boundingBox != null) && parentDialog.isZoomAction() && mouseDown) { + gc.drawRectangle(boundingBox); + } else if ((deleteRect != null) && mouseDown) { + gc.drawRectangle(deleteRect); + } else if ((setMissingRect != null) && mouseDown) { + gc.drawRectangle(setMissingRect); + } + } + + /** + * Display the flood category lines on the graph + * + * @param e + * PaintEvent + * @param graphData + * The GraphData object + */ + protected void displayFloodCatLines(GC gc, GraphData graphData) { + int y = 0; + + gc.setLineWidth(2); + + /* Action stage/flow */ + if ((graphData.getActionStage() >= 0) + || (graphData.getActionFlow() >= 0)) { + gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils + .getColor("Yellow"))); + if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getActionStage())); + } else { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getActionFlow())); + } + + if ((y <= (graphData.getY() + graphData.getH())) + && (y >= graphData.getY())) { + gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT + + graphAreaWidth, y + GRAPHBORDER); + } + } + + /* Flood/Flow stage */ + if ((graphData.getFloodStage() >= 0) || (graphData.getFloodFlow() >= 0)) { gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils .getColor("Orange"))); - - if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getMinorStage())); - } else { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getMinorFlow())); - } - - if ((y <= (graphData.getY() + graphData.getH())) - && (y >= graphData.getY())) { - gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT - + graphAreaWidth, y + GRAPHBORDER); - } - } - /* Moderate stage/flow */ - if ((graphData.getModerateStage() >= 0) || (graphData.getModerateFlow() >= 0)) { - gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils - .getColor("Red"))); - - if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, - graphData.getModerateStage())); - } else { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, - graphData.getModerateFlow())); - } + if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getFloodStage())); + } else { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getFloodFlow())); + } - if ((y <= (graphData.getY() + graphData.getH())) - && (y >= graphData.getY())) { - gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT - + graphAreaWidth, y + GRAPHBORDER); - } - } + if ((y <= (graphData.getY() + graphData.getH())) + && (y >= graphData.getY())) { + gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT + + graphAreaWidth, y + GRAPHBORDER); + } + } - /* Major stage/flow */ - if ((graphData.getMajorStage() >= 0) || (graphData.getMajorFlow() >= 0)) { - gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils - .getColor("Magenta"))); - if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getMajorStage())); - } else { - y = GRAPHBORDER - + graphAreaHeight - - (lowerAxis - y2pixel(graphData, graphData.getMajorFlow())); - } - - if ((y <= (graphData.getY() + graphData.getH())) - && (y >= graphData.getY())) { - gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT - + graphAreaWidth, y + GRAPHBORDER); - } - } - - gc.setLineWidth(1); - gc.setForeground(currentTraceColor); - } + /* Minor stage/flow */ + if ((graphData.getMinorStage() >= 0) || (graphData.getMinorFlow() >= 0)) { + gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils + .getColor("Orange"))); - /** - * Draw the trace on the canvas - * - * @param e - * The PaintEvent - * @param dataPts - * The data points of the trace - */ - protected void drawTrace(GC gc, int[] dataPts) { - if (parentDialog.getPointsMI().getSelection()) { - /* Draw circles at each data point */ - for (int i = 0; i < dataPts.length; i++) { - gc.drawOval(dataPts[i] - 3, dataPts[++i] - 3, lineWidth + 4, - lineWidth + 4); - } - setForegroundColor(gc, SWT.COLOR_RED); - setBackgroundColor(gc, SWT.COLOR_RED); - for (int i = 0; i < dataPts.length; i++) { - gc.fillOval(dataPts[i] - 2, dataPts[++i] - 2, lineWidth + 2, - lineWidth + 2); - } - setBackgroundColor(gc, SWT.COLOR_BLACK); - } else if (parentDialog.getLinesMI().getSelection()) { - gc.setLineWidth(lineWidth); - gc.drawPolyline(dataPts); - gc.setLineWidth(1); - } else { - gc.setLineWidth(lineWidth); - gc.drawPolyline(dataPts); - gc.setLineWidth(2); + if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getMinorStage())); + } else { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getMinorFlow())); + } - /* Draw circles at each data point */ - for (int i = 0; i < dataPts.length; i++) { - gc.drawOval(dataPts[i] - 3, dataPts[++i] - 3, lineWidth + 4, - lineWidth + 4); - } - setForegroundColor(gc, SWT.COLOR_RED); - setBackgroundColor(gc, SWT.COLOR_RED); - for (int i = 0; i < dataPts.length; i++) { - gc.fillOval(dataPts[i] - 2, dataPts[++i] - 2, lineWidth + 2, - lineWidth + 2); - } - gc.setLineWidth(1); - setBackgroundColor(gc, SWT.COLOR_BLACK); - } - } + if ((y <= (graphData.getY() + graphData.getH())) + && (y >= graphData.getY())) { + gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT + + graphAreaWidth, y + GRAPHBORDER); + } + } - /** - * Draw the 1hr PC as PP bars. - * - * @param gc - * The GC - * @param graphData - * The GraphData object - * @param td - * The TraceData object to display as bars - */ - protected void drawPcBars(GC gc, GraphData graphData, TraceData td) { - int barWidth = 7; - int barHeight = 0; - TimeSeriesPoint[] pointArray = td.getTsData(); + /* Moderate stage/flow */ + if ((graphData.getModerateStage() >= 0) + || (graphData.getModerateFlow() >= 0)) { + gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils + .getColor("Red"))); - // Set the color - Color foreground = gc.getForeground(); - Color background = gc.getBackground(); - gc.setForeground(parentComp.getDisplay().getSystemColor( - SWT.COLOR_YELLOW)); - gc.setBackground(parentComp.getDisplay().getSystemColor( - SWT.COLOR_YELLOW)); + if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getModerateStage())); + } else { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getModerateFlow())); + } - ArrayList ppointList = new ArrayList(); - - yminChange = ymaxChange = 0; - - /* calculate the yminChange and ymaxChange */ - for (int i=0; i< pointArray.length; i++) { - if (pointArray[i].getY() == HydroConstants.MISSING_VALUE) { - continue; - } - if ((i == pointArray.length - 1) - || (pointArray[i + 1].getY() == HydroConstants.MISSING_VALUE)) { - continue; - } - - double change2 = pointArray[i + 1].getY() - pointArray[i].getY(); - - if (change2 > ymaxChange) - ymaxChange = change2; - } - - //adjust the yminChange and ymaxChange to newyminChange and newymaxChange - adjust_pcymax(); - - //scale graphData Ymin2/Ymax2 with the new min/max values - graphData.setYmin2(newyminChange); - graphData.setYmax2(newymaxChange); - - for (int i = 0; i < pointArray.length; i++) { - if (pointArray[i].getY() == HydroConstants.MISSING_VALUE) { - continue; - } + if ((y <= (graphData.getY() + graphData.getH())) + && (y >= graphData.getY())) { + gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT + + graphAreaWidth, y + GRAPHBORDER); + } + } - if ((i == pointArray.length - 1) - || (pointArray[i + 1].getY() == HydroConstants.MISSING_VALUE)) { - continue; - } + /* Major stage/flow */ + if ((graphData.getMajorStage() >= 0) || (graphData.getMajorFlow() >= 0)) { + gc.setForeground(new Color(parentComp.getDisplay(), HydroUtils + .getColor("Magenta"))); + if (graphData.getTraceData(0).getPe().toUpperCase().startsWith("H")) { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getMajorStage())); + } else { + y = GRAPHBORDER + + graphAreaHeight + - (lowerAxis - y2pixel(graphData, + graphData.getMajorFlow())); + } - pointArray[i].setPixelX(x2pixel(graphData, pointArray[i].getX() - .getTime())); - // pointArray[i].setPixely(y2pixel(graphData, pointArray[i].getY())); - // pointArray[i + 1].setPixely(y2pixel(graphData, - // pointArray[i + 1].getY())); - - // pointArray[i].setPixely(secondaryY2pixel(graphData, pointArray[i].getY())); - // pointArray[i + 1].setPixely(secondaryY2pixel(graphData, - // pointArray[i + 1].getY())); - - int x = pointArray[i].getPixelX() + GRAPHBORDER_LEFT; + if ((y <= (graphData.getY() + graphData.getH())) + && (y >= graphData.getY())) { + gc.drawLine(GRAPHBORDER_LEFT, y + GRAPHBORDER, GRAPHBORDER_LEFT + + graphAreaWidth, y + GRAPHBORDER); + } + } - if ((x < 100) || (x > GRAPHBORDER_LEFT + graphAreaWidth)) { - continue; - } + gc.setLineWidth(1); + gc.setForeground(currentTraceColor); + } - int x2 = x2pixel(graphData, - pointArray[i].getX().getTime() + 3600000) + GRAPHBORDER_LEFT; + /** + * Draw the trace on the canvas + * + * @param e + * The PaintEvent + * @param dataPts + * The data points of the trace + */ + protected void drawTrace(GC gc, int[] dataPts) { + if (parentDialog.getPointsMI().getSelection()) { + /* Draw circles at each data point */ + for (int i = 0; i < dataPts.length; i++) { + gc.drawOval(dataPts[i] - 3, dataPts[++i] - 3, lineWidth + 4, + lineWidth + 4); + } + setForegroundColor(gc, SWT.COLOR_RED); + setBackgroundColor(gc, SWT.COLOR_RED); + for (int i = 0; i < dataPts.length; i++) { + gc.fillOval(dataPts[i] - 2, dataPts[++i] - 2, lineWidth + 2, + lineWidth + 2); + } + setBackgroundColor(gc, SWT.COLOR_BLACK); + } else if (parentDialog.getLinesMI().getSelection()) { + gc.setLineWidth(lineWidth); + gc.drawPolyline(dataPts); + gc.setLineWidth(1); + } else { + gc.setLineWidth(lineWidth); + gc.drawPolyline(dataPts); + gc.setLineWidth(2); - double change = pointArray[i + 1].getY() - pointArray[i].getY(); - - barHeight = graphAreaHeight - secondaryY2pixel(graphData, change); - - if (barHeight < 1) { - barHeight = 2; - } + /* Draw circles at each data point */ + for (int i = 0; i < dataPts.length; i++) { + gc.drawOval(dataPts[i] - 3, dataPts[++i] - 3, lineWidth + 4, + lineWidth + 4); + } + setForegroundColor(gc, SWT.COLOR_RED); + setBackgroundColor(gc, SWT.COLOR_RED); + for (int i = 0; i < dataPts.length; i++) { + gc.fillOval(dataPts[i] - 2, dataPts[++i] - 2, lineWidth + 2, + lineWidth + 2); + } + gc.setLineWidth(1); + setBackgroundColor(gc, SWT.COLOR_BLACK); + } + } - barWidth = x2 - x;// - 10; - if (barWidth < 1) { - barWidth = 1; - } + /** + * Draw the 1hr PC as PP bars. + * + * @param gc + * The GC + * @param graphData + * The GraphData object + * @param td + * The TraceData object to display as bars + */ + protected void drawPcBars(GC gc, GraphData graphData, TraceData td) { + int barWidth = 7; + int barHeight = 0; + TimeSeriesPoint[] pointArray = td.getTsData(); - /* Draw the bar */ - Rectangle rect = new Rectangle(x, GRAPHBORDER + graphAreaHeight, - barWidth, barHeight * -1); - gc.drawRectangle(rect); - gc.fillRectangle(rect); - } + // Set the color + Color foreground = gc.getForeground(); + Color background = gc.getBackground(); + gc.setForeground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_YELLOW)); + gc.setBackground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_YELLOW)); - precipPointList.add(ppointList); + ArrayList ppointList = new ArrayList(); - // Reset the colors - gc.setForeground(foreground); - gc.setBackground(background); - } + yminChange = ymaxChange = 0; - /** - * Swap the corner points of the bounding box if necessary - * - * @param x1 - * Corner 1 x value - * @param y1 - * Corner 1 y value - * @param x2 - * Corner 2 x value - * @param y2 - * Corner 2 y value - */ - protected void swapPoints(int x1, int y1, int x2, int y2) { - int tmp; - tmp = x1; - x1 = x2; - x2 = tmp; + /* calculate the yminChange and ymaxChange */ + for (int i = 0; i < pointArray.length; i++) { + if (pointArray[i].getY() == HydroConstants.MISSING_VALUE) { + continue; + } + if ((i == pointArray.length - 1) + || (pointArray[i + 1].getY() == HydroConstants.MISSING_VALUE)) { + continue; + } - tmp = y1; - y1 = y2; - y2 = tmp; - } + double change2 = pointArray[i + 1].getY() - pointArray[i].getY(); - /** - * Get the parent dialog containing this canvas - * - * @return the dialog - */ - public TimeSeriesDisplayDlg getDialog() { - return parentDialog; - } + if (change2 > ymaxChange) + ymaxChange = change2; + } - /** - * Set the parent dialog containing this canvas - * - * @param dialog - * the dialog to set - */ - public void setDialog(TimeSeriesDisplayDlg dialog) { - parentDialog = dialog; - } + // adjust the yminChange and ymaxChange to newyminChange and + // newymaxChange + adjust_pcymax(); - /** - * Reset the background color. - * - * @param e - * PaintEvent - */ - protected void setBackgroundColor(GC gc, int color) { - if (parentDialog.isInverseVideo()) { - gc.setBackground(white); - } else { - gc.setBackground(parentComp.getDisplay().getSystemColor(color)); - } - } + // scale graphData Ymin2/Ymax2 with the new min/max values + graphData.setYmin2(newyminChange); + graphData.setYmax2(newymaxChange); - /** - * Reset the foreground color. - * - * @param e - * PaintEvent - */ - protected void setForegroundColor(GC gc, int color) { - if (parentDialog.isInverseVideo()) { - gc.setBackground(black); - } else { - gc.setForeground(parentComp.getDisplay().getSystemColor(color)); - } - } + for (int i = 0; i < pointArray.length; i++) { + if (pointArray[i].getY() == HydroConstants.MISSING_VALUE) { + continue; + } - protected void drawCrossHairs(GC gc) { - int x1 = leftBorder; - int y1 = currentY; - int x2 = currentX; - int y2 = currentY; - setForegroundColor(gc, SWT.COLOR_WHITE); - int lineWidth = gc.getLineWidth(); - gc.setLineWidth(1); + if ((i == pointArray.length - 1) + || (pointArray[i + 1].getY() == HydroConstants.MISSING_VALUE)) { + continue; + } - // left of cross - gc.drawLine(x1, y1, x2, y2); + pointArray[i].setPixelX(x2pixel(graphData, pointArray[i].getX() + .getTime())); - x1 = currentX; - y1 = currentY; - x2 = rightBorder; - y2 = currentY; + int x = pointArray[i].getPixelX() + GRAPHBORDER_LEFT; - // Right of cross - gc.drawLine(x1, y1, x2, y2); + if ((x < 100) || (x > GRAPHBORDER_LEFT + graphAreaWidth)) { + continue; + } - x1 = currentX; - y1 = topBorder; - x2 = currentX; - y2 = currentY; + int x2 = x2pixel(graphData, + pointArray[i].getX().getTime() + 3600000) + + GRAPHBORDER_LEFT; - // Above cross - gc.drawLine(x1, y1, x2, y2); + double change = pointArray[i + 1].getY() - pointArray[i].getY(); - x1 = currentX; - y1 = currentY; - x2 = currentX; - y2 = bottomBorder; - // Below of cross - gc.drawLine(x1, y1, x2, y2); + barHeight = graphAreaHeight - secondaryY2pixel(graphData, change); - gc.setLineWidth(lineWidth); - } + if (barHeight < 1) { + barHeight = 2; + } - /** - * @param ratingCurveExist - * the ratingCurveExist to set - */ - public void setRatingCurveExist(boolean ratingCurveExist) { - this.ratingCurveExist = ratingCurveExist; - } + barWidth = x2 - x;// - 10; + if (barWidth < 1) { + barWidth = 1; + } + + /* Draw the bar */ + Rectangle rect = new Rectangle(x, GRAPHBORDER + graphAreaHeight, + barWidth, barHeight * -1); + gc.drawRectangle(rect); + gc.fillRectangle(rect); + } + + precipPointList.add(ppointList); + + // Reset the colors + gc.setForeground(foreground); + gc.setBackground(background); + } + + /** + * Swap the corner points of the bounding box if necessary + * + * @param x1 + * Corner 1 x value + * @param y1 + * Corner 1 y value + * @param x2 + * Corner 2 x value + * @param y2 + * Corner 2 y value + */ + protected void swapPoints(int x1, int y1, int x2, int y2) { + int tmp; + tmp = x1; + x1 = x2; + x2 = tmp; + + tmp = y1; + y1 = y2; + y2 = tmp; + } + + /** + * Get the parent dialog containing this canvas + * + * @return the dialog + */ + public TimeSeriesDisplayDlg getDialog() { + return parentDialog; + } + + /** + * Set the parent dialog containing this canvas + * + * @param dialog + * the dialog to set + */ + public void setDialog(TimeSeriesDisplayDlg dialog) { + parentDialog = dialog; + } + + /** + * Reset the background color. + * + * @param e + * PaintEvent + */ + protected void setBackgroundColor(GC gc, int color) { + if (parentDialog.isInverseVideo()) { + gc.setBackground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_WHITE)); + } else { + gc.setBackground(parentComp.getDisplay().getSystemColor(color)); + } + } + + /** + * Reset the foreground color. + * + * @param e + * PaintEvent + */ + protected void setForegroundColor(GC gc, int color) { + if (parentDialog.isInverseVideo()) { + gc.setBackground(parentComp.getDisplay().getSystemColor( + SWT.COLOR_BLACK)); + } else { + gc.setForeground(parentComp.getDisplay().getSystemColor(color)); + } + } + + protected void drawCrossHairs(GC gc) { + int x1 = leftBorder; + int y1 = currentY; + int x2 = currentX; + int y2 = currentY; + setForegroundColor(gc, SWT.COLOR_WHITE); + int lineWidth = gc.getLineWidth(); + gc.setLineWidth(1); + + // left of cross + gc.drawLine(x1, y1, x2, y2); + + x1 = currentX; + y1 = currentY; + x2 = rightBorder; + y2 = currentY; + + // Right of cross + gc.drawLine(x1, y1, x2, y2); + + x1 = currentX; + y1 = topBorder; + x2 = currentX; + y2 = currentY; + + // Above cross + gc.drawLine(x1, y1, x2, y2); + + x1 = currentX; + y1 = currentY; + x2 = currentX; + y2 = bottomBorder; + // Below of cross + gc.drawLine(x1, y1, x2, y2); + + gc.setLineWidth(lineWidth); + } + + /** + * @param ratingCurveExist + * the ratingCurveExist to set + */ + public void setRatingCurveExist(boolean ratingCurveExist) { + this.ratingCurveExist = ratingCurveExist; + } } \ No newline at end of file diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/GraphData.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/GraphData.java index 4be86ff1fb..b7461adeb3 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/GraphData.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/GraphData.java @@ -21,6 +21,7 @@ package com.raytheon.viz.hydro.timeseries.util; import java.util.ArrayList; import java.util.Date; +import java.util.List; import com.raytheon.viz.hydrocommon.HydroConstants; @@ -28,62 +29,68 @@ import com.raytheon.viz.hydrocommon.HydroConstants; * Object to hold the data and metadata for the time series. * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date			Ticket#		Engineer	Description
  * ------------	----------	-----------	--------------------------
- * Jun 24, 2008				mpduff	Initial creation
+ * Jun 24, 2008				mpduff	    Initial creation.
+ * May 06, 2013   1976      mpduff      Use List interface.
  * 
  * 
- * + * * @author mpduff - * @version 1.0 + * @version 1.0 */ -public class GraphData { +public class GraphData { private double x; - + /** * yMax - yMin */ private double y; - + private double y2; - + /** * Graph Area Width */ private int w; - + /** * Graph Area Height */ private int h; - + private boolean displayFlowUnit; private Date xMin; + private Date xMax; - + private double ymin = Integer.MAX_VALUE; + private double ymax = Integer.MIN_VALUE; + private double ymin2; + private double ymax2; /** * List of traces for graphing */ - private ArrayList traces = new ArrayList(); - + private List traces = new ArrayList(); + /** * List of traces for this graphing object */ - private ArrayList originalTraces = new ArrayList(); - - private ArrayList isStage = new ArrayList(); - + private final List originalTraces = new ArrayList(); + + private List isStage = new ArrayList(); + private Date beginDate = null; + private Date endDate = null; private String title = null; @@ -119,16 +126,25 @@ public class GraphData { private String showppc = null; private String latestfcstonlyc = null; - + private double actionStage = -9999; + private double floodStage = -9999; + private double minorStage = -9999; + private double moderateStage = -9999; + private double majorStage = -9999; + private double actionFlow = -9999; + private double floodFlow = -9999; + private double minorFlow = -9999; + private double moderateFlow = -9999; + private double majorFlow = -9999; /** @@ -139,7 +155,8 @@ public class GraphData { } /** - * @param x the x to set + * @param x + * the x to set */ public void setX(double x) { this.x = x; @@ -154,7 +171,9 @@ public class GraphData { /** * y = yMax - yMin - * @param y the y to set + * + * @param y + * the y to set */ public void setY(double y) { this.y = y; @@ -168,7 +187,8 @@ public class GraphData { } /** - * @param w the w to set + * @param w + * the w to set */ public void setW(int w) { this.w = w; @@ -182,7 +202,8 @@ public class GraphData { } /** - * @param h the h to set + * @param h + * the h to set */ public void setH(int h) { this.h = h; @@ -203,7 +224,8 @@ public class GraphData { } /** - * @param display_flow_unit the display_flow_unit to set + * @param display_flow_unit + * the display_flow_unit to set */ public void setDisplayFlowUnit(boolean displayFlowUnit) { this.displayFlowUnit = displayFlowUnit; @@ -217,7 +239,8 @@ public class GraphData { } /** - * @param min the xMin to set + * @param min + * the xMin to set */ public void setXMin(Date min) { xMin = min; @@ -231,68 +254,13 @@ public class GraphData { } /** - * @param max the xMax to set + * @param max + * the xMax to set */ public void setXMax(Date max) { xMax = max; } -// /** -// * @return the oldXMax -// */ -// public Date getOldXMax() { -// return oldXMax; -// } -// -// /** -// * @param oldXMax the oldXMax to set -// */ -// public void setOldXMax(Date oldXMax) { -// this.oldXMax = oldXMax; -// } -// -// /** -// * @return the oldXMin -// */ -// public Date getOldXMin() { -// return oldXMin; -// } -// -// /** -// * @param oldXMin the oldXMin to set -// */ -// public void setOldXMin(Date oldXMin) { -// this.oldXMin = oldXMin; -// } -// -// /** -// * @return the orgXMax -// */ -// public Date getOrgXMax() { -// return orgXMax; -// } -// -// /** -// * @param orgXMax the orgXMax to set -// */ -// public void setOrgXMax(Date orgXMax) { -// this.orgXMax = orgXMax; -// } -// -// /** -// * @return the orgXMin -// */ -// public Date getOrgXMin() { -// return orgXMin; -// } -// -// /** -// * @param orgXMin the orgXMin to set -// */ -// public void setOrgXMin(Date orgXMin) { -// this.orgXMin = orgXMin; -// } - /** * @return the ymin */ @@ -301,7 +269,8 @@ public class GraphData { } /** - * @param ymin the ymin to set + * @param ymin + * the ymin to set */ public void setYmin(double ymin) { this.ymin = ymin; @@ -315,7 +284,8 @@ public class GraphData { } /** - * @param ymax the ymax to set + * @param ymax + * the ymax to set */ public void setYmax(double ymax) { this.ymax = ymax; @@ -324,21 +294,22 @@ public class GraphData { /** * @return the traces */ - public ArrayList getTraces() { + public List getTraces() { return traces; } - + public TraceData getTraceData(int index) { return traces.get(index); } /** - * @param traces the traces to set + * @param traces + * the traces to set */ - public void setTraces(ArrayList traces) { + public void setTraces(List traces) { this.traces = traces; } - + public void addTrace(TraceData trace) { if (traces.size() < HydroConstants.MAX_TRACES) { if (!traces.contains(trace)) { @@ -350,12 +321,13 @@ public class GraphData { /** * @return the isStage */ - public ArrayList getIsStage() { + public List getIsStage() { return isStage; } /** - * @param isStage the isStage to set + * @param isStage + * the isStage to set */ public void setIsStage(ArrayList isStage) { this.isStage = isStage; @@ -364,7 +336,8 @@ public class GraphData { /** * Add the isStage boolean value to the list * - * @param isStage true if value is stage, false otherwise + * @param isStage + * true if value is stage, false otherwise */ public void addIsStage(boolean isStage) { if (traces.size() < HydroConstants.MAX_TRACES) { @@ -380,7 +353,8 @@ public class GraphData { } /** - * @param beginCal the beginCal to set + * @param beginCal + * the beginCal to set */ public void setBeginDate(Date beginDate) { this.beginDate = beginDate; @@ -394,7 +368,8 @@ public class GraphData { } /** - * @param endCal the endCal to set + * @param endCal + * the endCal to set */ public void setEndDate(Date endDate) { this.endDate = endDate; @@ -408,7 +383,8 @@ public class GraphData { } /** - * @param title the title to set + * @param title + * the title to set */ public void setTitle(String title) { this.title = title; @@ -422,7 +398,8 @@ public class GraphData { } /** - * @param num_traces the num_traces to set + * @param num_traces + * the num_traces to set */ public void setNum_traces(int num_traces) { this.num_traces = num_traces; @@ -436,7 +413,8 @@ public class GraphData { } /** - * @param graph_pos the graph_pos to set + * @param graph_pos + * the graph_pos to set */ public void setGraph_pos(int graph_pos) { this.graph_pos = graph_pos; @@ -450,7 +428,8 @@ public class GraphData { } /** - * @param xsize the xsize to set + * @param xsize + * the xsize to set */ public void setXsize(int xsize) { this.xsize = xsize; @@ -464,7 +443,8 @@ public class GraphData { } /** - * @param ysize the ysize to set + * @param ysize + * the ysize to set */ public void setYsize(int ysize) { this.ysize = ysize; @@ -478,7 +458,8 @@ public class GraphData { } /** - * @param yscale the yscale to set + * @param yscale + * the yscale to set */ public void setYscale(String yscale) { this.yscale = yscale; @@ -492,7 +473,8 @@ public class GraphData { } /** - * @param ylinear the ylinear to set + * @param ylinear + * the ylinear to set */ public void setYlinear(String ylinear) { this.ylinear = ylinear; @@ -506,7 +488,8 @@ public class GraphData { } /** - * @param showcat the showcat to set + * @param showcat + * the showcat to set */ public void setShowcat(boolean showcat) { this.showcat = showcat; @@ -520,7 +503,8 @@ public class GraphData { } /** - * @param derivepp the derivepp to set + * @param derivepp + * the derivepp to set */ public void setDerivepp(String derivepp) { this.derivepp = derivepp; @@ -534,7 +518,8 @@ public class GraphData { } /** - * @param showpp the showpp to set + * @param showpp + * the showpp to set */ public void setShowpp(boolean showpp) { this.showpp = showpp; @@ -548,7 +533,8 @@ public class GraphData { } /** - * @param latestfcstonly the latestfcstonly to set + * @param latestfcstonly + * the latestfcstonly to set */ public void setLatestfcstonly(boolean latestfcstonly) { this.latestfcstonly = latestfcstonly; @@ -562,7 +548,8 @@ public class GraphData { } /** - * @param ylinearc the ylinearc to set + * @param ylinearc + * the ylinearc to set */ public void setYlinearc(String ylinearc) { this.ylinearc = ylinearc; @@ -576,7 +563,8 @@ public class GraphData { } /** - * @param yscalec the yscalec to set + * @param yscalec + * the yscalec to set */ public void setYscalec(String yscalec) { this.yscalec = yscalec; @@ -590,7 +578,8 @@ public class GraphData { } /** - * @param showcatc the showcatc to set + * @param showcatc + * the showcatc to set */ public void setShowcatc(String showcatc) { this.showcatc = showcatc; @@ -604,7 +593,8 @@ public class GraphData { } /** - * @param deriveppc the deriveppc to set + * @param deriveppc + * the deriveppc to set */ public void setDeriveppc(String deriveppc) { this.deriveppc = deriveppc; @@ -618,7 +608,8 @@ public class GraphData { } /** - * @param showppc the showppc to set + * @param showppc + * the showppc to set */ public void setShowppc(String showppc) { this.showppc = showppc; @@ -632,7 +623,8 @@ public class GraphData { } /** - * @param latestfcstonlyc the latestfcstonlyc to set + * @param latestfcstonlyc + * the latestfcstonlyc to set */ public void setLatestfcstonlyc(String latestfcstonlyc) { this.latestfcstonlyc = latestfcstonlyc; @@ -651,7 +643,8 @@ public class GraphData { } /** - * @param actionStage the actionStage to set + * @param actionStage + * the actionStage to set */ public void setActionStage(double actionStage) { this.actionStage = actionStage; @@ -665,7 +658,8 @@ public class GraphData { } /** - * @param minorStage the minorStage to set + * @param minorStage + * the minorStage to set */ public void setMinorStage(double minorStage) { this.minorStage = minorStage; @@ -679,7 +673,8 @@ public class GraphData { } /** - * @param moderateStage the moderateStage to set + * @param moderateStage + * the moderateStage to set */ public void setModerateStage(double moderateStage) { this.moderateStage = moderateStage; @@ -693,7 +688,8 @@ public class GraphData { } /** - * @param majorStage the majorStage to set + * @param majorStage + * the majorStage to set */ public void setMajorStage(double majorStage) { this.majorStage = majorStage; @@ -707,7 +703,8 @@ public class GraphData { } /** - * @param actionFlow the actionFlow to set + * @param actionFlow + * the actionFlow to set */ public void setActionFlow(double actionFlow) { this.actionFlow = actionFlow; @@ -721,7 +718,8 @@ public class GraphData { } /** - * @param minorFlow the minorFlow to set + * @param minorFlow + * the minorFlow to set */ public void setMinorFlow(double minorFlow) { this.minorFlow = minorFlow; @@ -735,7 +733,8 @@ public class GraphData { } /** - * @param moderateFlow the moderateFlow to set + * @param moderateFlow + * the moderateFlow to set */ public void setModerateFlow(double moderateFlow) { this.moderateFlow = moderateFlow; @@ -749,7 +748,8 @@ public class GraphData { } /** - * @param majorFlow the majorFlow to set + * @param majorFlow + * the majorFlow to set */ public void setMajorFlow(double majorFlow) { this.majorFlow = majorFlow; @@ -763,7 +763,8 @@ public class GraphData { } /** - * @param floodStage the floodStage to set + * @param floodStage + * the floodStage to set */ public void setFloodStage(double floodStage) { this.floodStage = floodStage; @@ -777,7 +778,8 @@ public class GraphData { } /** - * @param floodFlow the floodFlow to set + * @param floodFlow + * the floodFlow to set */ public void setFloodFlow(double floodFlow) { this.floodFlow = floodFlow; @@ -791,7 +793,8 @@ public class GraphData { } /** - * @param ymin2 the ymin2 to set + * @param ymin2 + * the ymin2 to set */ public void setYmin2(double ymin2) { this.ymin2 = ymin2; @@ -805,7 +808,8 @@ public class GraphData { } /** - * @param ymax2 the ymax2 to set + * @param ymax2 + * the ymax2 to set */ public void setYmax2(double ymax2) { this.ymax2 = ymax2; @@ -819,7 +823,8 @@ public class GraphData { } /** - * @param y2 the y2 to set + * @param y2 + * the y2 to set */ public void setY2(double y2) { this.y2 = y2; @@ -828,21 +833,22 @@ public class GraphData { /** * @return the originalTraces */ - public ArrayList getOriginalTraces() { - ArrayList rtnList = new ArrayList(originalTraces.size()); - - for (TraceData td: originalTraces) { + public List getOriginalTraces() { + List rtnList = new ArrayList( + originalTraces.size()); + + for (TraceData td : originalTraces) { TraceData data = new TraceData(td); rtnList.add(data); } return rtnList; } - + /** * Generate a copy of the original trace data. */ public void saveTraceInfo() { - for (TraceData td: traces) { + for (TraceData td : traces) { TraceData data = new TraceData(td); originalTraces.add(data); } diff --git a/cave/com.raytheon.viz.lpi/src/com/raytheon/viz/lpi/LPIResource.java b/cave/com.raytheon.viz.lpi/src/com/raytheon/viz/lpi/LPIResource.java index c4ca796fe1..83471b576e 100644 --- a/cave/com.raytheon.viz.lpi/src/com/raytheon/viz/lpi/LPIResource.java +++ b/cave/com.raytheon.viz.lpi/src/com/raytheon/viz/lpi/LPIResource.java @@ -133,15 +133,16 @@ public class LPIResource extends "Label"); getCapability(LabelableCapability.class).setLabelField("Label"); - File file = new File(resourceData.getFilename()); + String filename = resourceData.getFilename(); + File file = new File(filename); if (!file.isAbsolute()) { + filename = FileUtil.join(VizApp.getMapsDir(), filename); file = PathManagerFactory.getPathManager().getStaticFile( - FileUtil.join(VizApp.getMapsDir(), - resourceData.getFilename())); + filename); } if (file == null || file.exists() == false) { throw new VizException("Could not find lpi file", - new FileNotFoundException(String.valueOf(file))); + new FileNotFoundException(filename)); } points = new ArrayList(); diff --git a/cave/com.raytheon.viz.product.awips/developer.product b/cave/com.raytheon.viz.product.awips/developer.product index 5374b87bfb..094025bf55 100644 --- a/cave/com.raytheon.viz.product.awips/developer.product +++ b/cave/com.raytheon.viz.product.awips/developer.product @@ -42,12 +42,10 @@ - jdk1.6.0 - diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AbstractTextBlock.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AbstractTextBlock.java index 97b113a4a4..5dda170c8b 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AbstractTextBlock.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AbstractTextBlock.java @@ -22,6 +22,7 @@ package com.raytheon.viz.redbook.blocks; import java.nio.ByteBuffer; import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlock; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; import com.raytheon.viz.redbook.rsc.RedbookLegend; import com.raytheon.viz.redbook.rsc.RedbookLegend.Type; @@ -33,6 +34,7 @@ import com.raytheon.viz.redbook.rsc.RedbookLegend.Type; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 18, 2010 #3260 dfriedma Initial creation + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -45,8 +47,8 @@ public abstract class AbstractTextBlock extends RedbookBlock { protected int origXPos; protected int origYPos; - public AbstractTextBlock(ByteBuffer data) { - super(data); + public AbstractTextBlock(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); } public abstract TextBlock getTextBlock(); diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AlphaNumBlock.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AlphaNumBlock.java index 33c1e5baf7..39de1a594f 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AlphaNumBlock.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/AlphaNumBlock.java @@ -24,6 +24,7 @@ import java.nio.ByteBuffer; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; import com.vividsolutions.jts.geom.Coordinate; /** @@ -34,6 +35,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 22, 2008 #1162 chammack Initial creation + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -45,8 +47,9 @@ public class AlphaNumBlock extends AbstractTextBlock { private final TextBlock textBlock; - public AlphaNumBlock(ByteBuffer data, MathTransform mt, int maxX, int maxY) { - super(data); + public AlphaNumBlock(RedbookBlockHeader header, ByteBuffer data, + MathTransform mt, int maxX, int maxY) { + super(header, data); int length = getLength(); diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotDataBlock.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotDataBlock.java index 7961cf734f..f166595a19 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotDataBlock.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotDataBlock.java @@ -24,6 +24,7 @@ import java.nio.ByteBuffer; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; import com.vividsolutions.jts.geom.Coordinate; /** @@ -37,6 +38,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 22, 2008 #1162 chammack Initial creation + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -47,8 +49,9 @@ import com.vividsolutions.jts.geom.Coordinate; public class PlotDataBlock extends AbstractTextBlock { private TextBlock textBlock; - public PlotDataBlock(ByteBuffer data, MathTransform mt, int maxX, int maxY) { - super(data); + public PlotDataBlock(RedbookBlockHeader header, ByteBuffer data, + MathTransform mt, int maxX, int maxY) { + super(header, data); /* int mode = ( */data.get() /* & 0xFF) */; diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotParametersBlock.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotParametersBlock.java index 3b1c5afde1..325da05f82 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotParametersBlock.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/PlotParametersBlock.java @@ -22,6 +22,7 @@ package com.raytheon.viz.redbook.blocks; import java.nio.ByteBuffer; import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlock; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; /** * Implements the redbook plot parameter block @@ -31,6 +32,7 @@ import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlock; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 22, 2008 #1162 chammack Initial creation + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -52,9 +54,9 @@ public class PlotParametersBlock extends RedbookBlock { private int lineWidth; - public PlotParametersBlock(ByteBuffer data) { + public PlotParametersBlock(RedbookBlockHeader header, ByteBuffer data) { - super(data); + super(header, data); // Set up some reasonable defaults this.lineWidth = 1; diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/RedbookProjectionBlock.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/RedbookProjectionBlock.java index c555f0dfaf..c017d218fa 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/RedbookProjectionBlock.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/RedbookProjectionBlock.java @@ -32,6 +32,7 @@ import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; import com.raytheon.edex.plugin.redbook.common.blocks.Block_004_017; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; import com.raytheon.uf.common.geospatial.MapUtil; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; @@ -45,6 +46,7 @@ import com.vividsolutions.jts.geom.Point; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 27, 2008 #1162 chammack Initial creation + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -58,8 +60,8 @@ public class RedbookProjectionBlock extends Block_004_017 { * * @param separator */ - public RedbookProjectionBlock(ByteBuffer data) { - super(data); + public RedbookProjectionBlock(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); } diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/ShortLongVectorsBlock.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/ShortLongVectorsBlock.java index 9c4e16add7..e4b98e3bc9 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/ShortLongVectorsBlock.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/blocks/ShortLongVectorsBlock.java @@ -26,6 +26,7 @@ import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlock; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; import com.raytheon.viz.redbook.rsc.RedbookLegend; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; @@ -40,6 +41,7 @@ import com.vividsolutions.jts.geom.LineString; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 22, 2008 #1162 chammack Initial creation + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -51,9 +53,10 @@ public class ShortLongVectorsBlock extends RedbookBlock { protected Geometry geometry; - public ShortLongVectorsBlock(java.nio.ByteBuffer data, MathTransform mt, + public ShortLongVectorsBlock(RedbookBlockHeader header, + java.nio.ByteBuffer data, MathTransform mt, int maxX, int maxY, RedbookLegend legend) { - super(data); + super(header, data); List geometries = new ArrayList(); List coords = new ArrayList(); diff --git a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/rsc/RedbookFrame.java b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/rsc/RedbookFrame.java index f321244b2a..083378ca6e 100644 --- a/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/rsc/RedbookFrame.java +++ b/cave/com.raytheon.viz.redbook/src/com/raytheon/viz/redbook/rsc/RedbookFrame.java @@ -39,6 +39,8 @@ import org.opengis.referencing.operation.TransformException; import com.raytheon.edex.plugin.redbook.common.blocks.Block_004_016; import com.raytheon.edex.plugin.redbook.common.blocks.DefaultBlock; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockBuilder; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockHeader; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.datastorage.records.ByteDataRecord; import com.raytheon.uf.common.geospatial.MapUtil; @@ -89,6 +91,7 @@ import com.vividsolutions.jts.geom.Coordinate; * May 29, 2008 #1162 chammack Initial creation * Jan 28, 2010 #4224 M. Huang Added Line Style, Line Width * menu choice + * Apr 29, 2013 1958 bgonzale New class RedbookBlockHeader. * * * @@ -160,19 +163,24 @@ public class RedbookFrame implements IRenderable { while (dataBuf.hasRemaining()) { - String currBlock = getBlockKey(dataBuf); + RedbookBlockHeader header = RedbookBlockBuilder + .getHeader(dataBuf); + String currBlock = header.blockFactoryKey; + if (currBlock.equals("005_002")) { // Block that describes plot data - PlotDataBlock pdb = new PlotDataBlock(dataBuf, mt, m, n); + PlotDataBlock pdb = new PlotDataBlock(header, dataBuf, + mt, m, n); parsedTextBlocks.add(pdb); } else if (currBlock.equals("005_001")) { // Block that describes alphanumeric data - AlphaNumBlock pdb = new AlphaNumBlock(dataBuf, mt, m, n); + AlphaNumBlock pdb = new AlphaNumBlock(header, dataBuf, + mt, m, n); parsedTextBlocks.add(pdb); } else if (currBlock.equals("004_005")) { // Block that describes the relative short/long format ShortLongVectorsBlock vb = new ShortLongVectorsBlock( - dataBuf, mt, m, n, legend); + header, dataBuf, mt, m, n, legend); try { this.compiler.handle(vb.getGeometry()); } catch (VizException e) { @@ -188,12 +196,12 @@ public class RedbookFrame implements IRenderable { } } else if (currBlock.equals("001_004")) { // Block that describes the plot parameters - new PlotParametersBlock(dataBuf); + new PlotParametersBlock(header, dataBuf); // Currently, this is not used in rendering } else if (currBlock.equals("004_017")) { // Block that describes the projection RedbookProjectionBlock vb = new RedbookProjectionBlock( - dataBuf); + header, dataBuf); String customProjection = null; try { @@ -264,7 +272,7 @@ public class RedbookFrame implements IRenderable { } } else if (currBlock.equals("004_016")) { // Block that describes the plot space - Block_004_016 vb = new Block_004_016(dataBuf); + Block_004_016 vb = new Block_004_016(header, dataBuf); // Store off the pixel space m = vb.getRefM2coord(); @@ -277,11 +285,11 @@ public class RedbookFrame implements IRenderable { || currBlock.startsWith("002_")) { // Recognized blocks that we don't do anything with - new DefaultBlock(dataBuf); + new DefaultBlock(header, dataBuf); } else { - DefaultBlock block = new DefaultBlock(dataBuf); + DefaultBlock block = new DefaultBlock(header, dataBuf); if (!currBlock.equals("")) { status.unhandledPackets = true; @@ -618,29 +626,6 @@ public class RedbookFrame implements IRenderable { } } - /** - * - * @param dataBuffer - * @return - */ - private static String getBlockKey(ByteBuffer dataBuffer) { - String blockKey = ""; - // Must have at least 4 bytes - if (dataBuffer.remaining() > MIN_REMAINING) { - dataBuffer.mark(); - // Dummy read for the flags/length - dataBuffer.getShort(); - - int mode = (dataBuffer.get() & 0xFF); - int subMode = (dataBuffer.get() & 0xFF); - - dataBuffer.reset(); - - blockKey = String.format(MODE_KEY_FMT, mode, subMode); - } - return blockKey; - } - public void dispose() { if (this.wireframeShape != null) { this.wireframeShape.dispose(); diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AbstractCAVEComponent.java b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AbstractCAVEComponent.java index 72fdcb03bc..6fed3c1335 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AbstractCAVEComponent.java +++ b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AbstractCAVEComponent.java @@ -50,6 +50,8 @@ import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.SimulatedTime; +import com.raytheon.uf.common.time.util.ITimer; +import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.viz.alertviz.SystemStatusHandler; import com.raytheon.uf.viz.alertviz.ui.dialogs.AlertVisualization; import com.raytheon.uf.viz.application.ProgramArguments; @@ -60,6 +62,7 @@ import com.raytheon.uf.viz.core.localization.CAVELocalizationNotificationObserve import com.raytheon.uf.viz.core.localization.LocalizationConstants; import com.raytheon.uf.viz.core.localization.LocalizationInitializer; import com.raytheon.uf.viz.core.localization.LocalizationManager; +import com.raytheon.uf.viz.core.notification.jobs.NotificationManagerJob; import com.raytheon.uf.viz.core.status.VizStatusHandlerFactory; import com.raytheon.viz.alerts.jobs.AutoUpdater; import com.raytheon.viz.alerts.jobs.MenuUpdater; @@ -90,6 +93,8 @@ import com.raytheon.viz.core.units.UnitRegistrar; * mode is off. * Jan 09, 2013 #1442 rferrel Changes to notify SimultedTime listeners. * Apr 17, 2013 1786 mpduff startComponent now sets StatusHandlerFactory + * Apr 23, 2013 #1939 randerso Allow serialization to complete initialization + * before connecting to JMS to avoid deadlock * * * @@ -139,7 +144,8 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { UnitRegistrar.registerUnits(); CAVEMode.performStartupDuties(); - long t0 = System.currentTimeMillis(); + ITimer timer = TimeUtil.getTimer(); + timer.start(); Display display = null; int modes = getRuntimeModes(); @@ -166,7 +172,7 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { } UFStatus.setHandlerFactory(new VizStatusHandlerFactory()); - initializeSerialization(); + Job serializationJob = initializeSerialization(); initializeDataStoreFactory(); initializeObservers(); @@ -204,12 +210,22 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { WorkbenchAdvisor workbenchAdvisor = null; // A component was passed as command line arg // launch cave normally, should cave be registered as component? - long t1 = System.currentTimeMillis(); - System.out.println("Localization time: " + (t1 - t0) + "ms"); - try { initializeSimulatedTime(); + // wait for serialization initialization to complete before + // opening JMS connection to avoid deadlock in class loaders + if (serializationJob != null) { + serializationJob.join(); + } + + // open JMS connection to allow alerts to be received + NotificationManagerJob.connect(); + + timer.stop(); + System.out.println("Initialization time: " + timer.getElapsedTime() + + "ms"); + if (cave) { workbenchAdvisor = getWorkbenchAdvisor(); } else if (!nonui) { @@ -220,6 +236,7 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { if (workbenchAdvisor instanceof HiddenWorkbenchAdvisor == false) { startInternal(componentName); } + if (workbenchAdvisor != null) { returnCode = PlatformUI.createAndRunWorkbench(display, workbenchAdvisor); @@ -239,6 +256,15 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { // catch any exceptions to ensure rest of finally block // executes } + + try { + // disconnect from JMS + NotificationManagerJob.disconnect(); + } catch (RuntimeException e) { + // catch any exceptions to ensure rest of finally block + // executes + } + if (av != null) { av.dispose(); } @@ -368,8 +394,8 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { !LocalizationManager.internalAlertServer).run(); } - protected void initializeSerialization() { - new Job("Loading Serialization") { + protected Job initializeSerialization() { + Job job = new Job("Loading Serialization") { @Override protected IStatus run(IProgressMonitor monitor) { @@ -382,7 +408,9 @@ public abstract class AbstractCAVEComponent implements IStandaloneComponent { return Status.OK_STATUS; } - }.schedule(); + }; + job.schedule(); + return job; } /** diff --git a/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/datacatalog/ModelSoundingCatalog.java b/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/datacatalog/ModelSoundingCatalog.java index 31e1987eb4..e6ab15fbba 100644 --- a/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/datacatalog/ModelSoundingCatalog.java +++ b/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/datacatalog/ModelSoundingCatalog.java @@ -51,6 +51,8 @@ import com.raytheon.viz.volumebrowser.xml.VbSourceList; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 28, 2011 mschenke Initial creation + * May 02, 2013 1949 bsteffen Force ModelSounding in Vb to play nicely + * with others. * * * @@ -167,7 +169,9 @@ public class ModelSoundingCatalog extends PointDataCatalog { String[] selectedSources = request.getSelectedSources(); if (selectedSources != null) { for (int i = 0; i < selectedSources.length; i++) { - selectedSources[i] = pluginName; + if (selectedSources[i].startsWith(pluginName)) { + selectedSources[i] = pluginName; + } } } return request; diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java index c599898769..22a24b2d9a 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java @@ -136,6 +136,7 @@ import com.vividsolutions.jts.geom.Polygon; * Feb 18, 2013 #1633 rferrel Changed checkFollowupSelection to use SimulatedTime. * Mar 28, 2013 DR 15974 D. Friedman Do not track removed GIDs. * Apr 11, 2013 1894 jsanchez Removed the ability to load/unload maps via bullet selection. This will be resolved in a follow on ticket. + * Apr 30, 2013 DR 16118 Qinglu Lin For reissue (followup NEW), called redrawFromWarned() in okPressed(). * * * @author chammack @@ -989,6 +990,11 @@ public class WarngenDialog extends CaveSWTDialog implements return; } + if (followupData != null && WarningAction.valueOf(followupData + .getAct()) == WarningAction.NEW) { + redrawFromWarned(); + } + if ((followupData == null || (WarningAction.valueOf(followupData .getAct()) == WarningAction.CON && warngenLayer .conWarnAreaChanged(followupData))) diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java index 8cc0f60e94..ad0d7e2767 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java @@ -48,6 +48,7 @@ import com.vividsolutions.jts.geom.GeometryFactory; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class. + * May 06, 2013 1930 bsteffen Check for null in WatchesResource. * * * @@ -186,16 +187,13 @@ public class WatchesResource extends AbstractWWAResource { if (record.getUgczones().size() > 0) { setGeometry(record); - if (record.getGeometry() != null) { + if (record.getGeometry() != null && record.getPhen() != null) { IShadedShape ss = target.createShadedShape(false, descriptor.getGridGeometry(), false); geo = (Geometry) record.getGeometry().clone(); JTSCompiler jtsCompiler = new JTSCompiler(ss, null, this.descriptor, PointStyle.CROSS); jtsCompiler.handle(geo, color); - if (record.getPhen() == null) { - return; - } ss.setFillPattern(FillPatterns.getGLPattern(record.getPhen() .equals("TO") ? "VERTICAL" : "HORIZONTAL")); ss.compile(); @@ -272,7 +270,7 @@ public class WatchesResource extends AbstractWWAResource { if (createShape != null) { WarningEntry entry = entryMap.get(createShape .getDataURI()); - if (entry != null) { + if (entry != null && entry.shadedShape != null) { entry.shadedShape.dispose(); } initShape(target, createShape); diff --git a/deltaScripts/13.4.1/createNewGfeTables.sql b/deltaScripts/13.4.1/createNewGfeTables.sql new file mode 100644 index 0000000000..09df353296 --- /dev/null +++ b/deltaScripts/13.4.1/createNewGfeTables.sql @@ -0,0 +1,84 @@ +-- called by normalizeGfe.sh to create new GFE tables +DROP TABLE IF EXISTS gfe_locks CASCADE; +DROP TABLE IF EXISTS gfe_parmid CASCADE; +DROP TABLE IF EXISTS gfe_dbid CASCADE; +DROP SEQUENCE IF EXISTS gfe_lock_seq; +DROP SEQUENCE IF EXISTS gfe_parmid_seq; +DROP SEQUENCE IF EXISTS gfe_dbid_seq; +DROP SEQUENCE IF EXISTS gfe_history_seq; + +CREATE TABLE gfe_dbid +( + id integer NOT NULL, + dbtype character varying(15), + format character varying(255) NOT NULL, + modelname character varying(64) NOT NULL, + modeltime character varying(13) NOT NULL, + siteid character varying(4) NOT NULL, + CONSTRAINT gfe_dbid_pkey PRIMARY KEY (id), + CONSTRAINT gfe_dbid_siteid_modelname_modeltime_dbtype_key UNIQUE (siteid, modelname, modeltime, dbtype) +) +WITH ( + OIDS=FALSE +); + +ALTER TABLE gfe_dbid + OWNER TO awips; + +CREATE TABLE gfe_parmid +( + id integer NOT NULL, + parmlevel character varying(8), + parmname character varying(100), + dbid_id integer NOT NULL, + CONSTRAINT gfe_parmid_pkey PRIMARY KEY (id), + CONSTRAINT fkbec2950012156549 FOREIGN KEY (dbid_id) + REFERENCES gfe_dbid (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT gfe_parmid_dbid_id_parmname_parmlevel_key UNIQUE (dbid_id, parmname, parmlevel) +) +WITH ( + OIDS=FALSE +); +ALTER TABLE gfe_parmid + OWNER TO awips; + +CREATE TABLE gfe_locks +( + id integer NOT NULL, + endtime timestamp without time zone NOT NULL, + starttime timestamp without time zone NOT NULL, + wsid character varying(255) NOT NULL, + parmid_id integer NOT NULL, + CONSTRAINT gfe_locks_pkey PRIMARY KEY (id), + CONSTRAINT fk92582e8f7bab05cc FOREIGN KEY (parmid_id) + REFERENCES gfe_parmid (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE, + CONSTRAINT gfe_locks_parmid_id_starttime_endtime_key UNIQUE (parmid_id, starttime, endtime) +) +WITH ( + OIDS=FALSE +); +ALTER TABLE gfe_locks + OWNER TO awips; + + +CREATE SEQUENCE gfe_lock_seq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE gfe_lock_seq + OWNER TO awips; + +CREATE SEQUENCE gfe_history_seq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE gfe_history_seq + OWNER TO awips; + +ALTER TABLE gfe ADD COLUMN parmId_id integer; diff --git a/deltaScripts/13.4.1/createScanIndexes.sh b/deltaScripts/13.4.1/createScanIndexes.sh new file mode 100644 index 0000000000..e3e69bf64f --- /dev/null +++ b/deltaScripts/13.4.1/createScanIndexes.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# DR #1926 - this update script will create a scan index + +PSQL="/awips2/psql/bin/psql" + +echo "INFO: Creating scan_icao_type_idx" +${PSQL} -U awips -d metadata -c "CREATE INDEX scan_icao_type_idx ON scan USING btree (icao COLLATE pg_catalog.\"default\", type COLLATE pg_catalog.\"default\");" + +if [ $? -ne 0 ]; then + echo "ERROR: Failed to create index." + echo "FATAL: The update has failed." + exit 1 +fi + +echo "INFO: Index created successfully!" + +exit 0 diff --git a/deltaScripts/13.4.1/determineRefTimeDirectory.py b/deltaScripts/13.4.1/determineRefTimeDirectory.py new file mode 100644 index 0000000000..9280c8820d --- /dev/null +++ b/deltaScripts/13.4.1/determineRefTimeDirectory.py @@ -0,0 +1,20 @@ +#!/awips2/python/bin/python + +import re +import sys + +# we expect the filename as a command-line argument. +hdf5file = sys.argv[1] + +matches = re.search(r'modelsounding-([0-9]+-[0-9]+-[0-9]+)-([0-9]+).h5', hdf5file, re.M|re.I) +if matches: + # extract the date + # extract the hour + date = matches.group(1) + hour = matches.group(2) + + reftimeDirName = date + "_" + hour + ":00:00.0" + print reftimeDirName +else: + print "ERROR: unrecognized file - " + hdf5file + "!" + sys.exit(-1) diff --git a/deltaScripts/13.4.1/modelsoundingFileName.py b/deltaScripts/13.4.1/modelsoundingFileName.py new file mode 100644 index 0000000000..8703284fa7 --- /dev/null +++ b/deltaScripts/13.4.1/modelsoundingFileName.py @@ -0,0 +1,20 @@ +#!/awips2/python/bin/python + +import re +import sys + +# we expect the filename, model name, and forecast hour as arguments +hdf5file = sys.argv[1] +model = sys.argv[2] +forecastHour = sys.argv[3] + +matches = re.search(r'modelsounding-([0-9]+-[0-9]+-[0-9]+-[0-9]+).h5', hdf5file, re.M|re.I) +if matches: + # extract the reftime + reftime = matches.group(1) + + newFileName = "modelsounding-" + model + "-" + reftime + "-FH-" + str(forecastHour) + ".h5" + print newFileName +else: + print "ERROR: unrecognized file - " + hdf5file + "!" + sys.exit(-1) diff --git a/deltaScripts/13.4.1/normalizeGfe.sh b/deltaScripts/13.4.1/normalizeGfe.sh new file mode 100644 index 0000000000..90696f9a36 --- /dev/null +++ b/deltaScripts/13.4.1/normalizeGfe.sh @@ -0,0 +1,104 @@ +#!/bin/bash +# Main script for updating GFE database structure + +PSQL="/awips2/psql/bin/psql" +PYTHON="/awips2/python/bin/python" + +SQL_SCRIPT="createNewGfeTables.sql" + +# ensure that the sql script is present +if [ ! -f ${SQL_SCRIPT} ]; then + echo "ERROR: the required sql script - ${SQL_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 +fi + + +echo "Creating new GFE tables" +${PSQL} -U awips -d metadata -f ${SQL_SCRIPT} +if [ $? -ne 0 ]; then + echo "FATAL: the update has failed!" + exit 1 +fi + +echo +echo "Querying GFE parmIds" +RETRIEVE_PARMIDS_SQL="SELECT distinct parmId FROM gfe order by parmID" +_parmid_list_txt=parmIdList.txt + +${PSQL} -U awips -d metadata -c "${RETRIEVE_PARMIDS_SQL}" -t -o ${_parmid_list_txt} +if [ $? -ne 0 ]; then + echo "ERROR: Failed to retrieve the list of parm ids." + echo "FATAL: The update has failed." + exit 1 +fi + +echo +echo "Parsing parmIds for insertion into new tables" +PYTHON_PARSE_SCRIPT="parseParmIds.py" +if [ ! -f ${PYTHON_PARSE_SCRIPT} ]; then + echo "ERROR: the required python script - ${PYTHON_PARSE_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 +fi +${PYTHON} ${PYTHON_PARSE_SCRIPT} ${_parmid_list_txt} +if [ $? -ne 0 ]; then + echo "ERROR: Failed to parse parm ids." + echo "FATAL: The update has failed." + exit 1 +fi + +echo +echo "Inserting db ids" +# dbIdInserts.sql generated from parseParmIds.py +${PSQL} -U awips -d metadata -q -f dbIdInserts.sql +if [ $? -ne 0 ]; then + echo "ERROR: Failed to insert database ids." + echo "FATAL: The update has failed." + exit 1 +fi + +echo +echo "Inserting parm ids" +# parmIdInserts.sql generated from parseParmIds.py +${PSQL} -U awips -d metadata -q -f parmIdInserts.sql +if [ $? -ne 0 ]; then + echo "ERROR: Failed to insert parm ids." + echo "FATAL: The update has failed." + exit 1 +fi + +echo +echo "Add gfe record reference to parm id table" +# gfeToParmIdUpdates.sql generated from parseParmIds.py +${PSQL} -U awips -d metadata -q -f gfeToParmIdUpdates.sql +if [ $? -ne 0 ]; then + echo "ERROR: Failed to add gfe to parm id mapping." + echo "FATAL: The update has failed." + exit 1 +fi + +echo +echo "Updating constraints and indexes on gfe" +SQL_SCRIPT="updateGfeConstraintsAndIndexes.sql" +${PSQL} -U awips -d metadata -f ${SQL_SCRIPT} +if [ $? -ne 0 ]; then + echo "ERROR: Failed to update constraints and indexes." + echo "FATAL: The update has failed." + exit 1 +fi + + +echo +echo "Updating dataURIs for gfe" +UPDATE_DATAURIS_SQL="UPDATE gfe SET dataURI =regexp_replace(dataURI, '(/gfe/[^/]+)/([^_]+)_([^:]+):([^_]+)_GRID_([^_]*)_([^_]+)_(\\d{8}_\\d{4})/[^/]+', '\\1/\\4/\\6/\\7/\\5/\\2/\\3') where dataURI ~ '/gfe/[^/]+/[^/]+/[^/]+';" +${PSQL} -U awips -d metadata -c "${UPDATE_DATAURIS_SQL}" +if [ $? -ne 0 ]; then + echo "ERROR: Failed to retrieve the list of parm ids." + echo "FATAL: The update has failed." + exit 1 +fi + +echo +echo "Running full vacuum for gfe" +${PSQL} -U awips -d metadata -c "VACUUM FULL VERBOSE ANALYZE gfe" diff --git a/deltaScripts/13.4.1/parseParmIds.py b/deltaScripts/13.4.1/parseParmIds.py new file mode 100644 index 0000000000..e7d5be259c --- /dev/null +++ b/deltaScripts/13.4.1/parseParmIds.py @@ -0,0 +1,53 @@ +# Called by normalizeGfe.sh to parse the distinct parmIds into table insert +import sys +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import ParmID +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import DatabaseID + +fileName = sys.argv[1] +f = open(fileName, 'r') +dbIdInsertFile = open('dbIdInserts.sql', 'w') +parmIdInsertFile = open('parmIdInserts.sql', 'w') +recordUpdateFile = open('gfeToParmIdUpdates.sql', 'w') + +dbIds={} +parmIds={} +dbIdCounter = 1 +parmIdCounter = 1 + +for parmIdString in f: + # Strip new line + parmIdString = parmIdString.strip() + + # skip last line of file that's empty + if len(parmIdString.strip()) > 0: + if not parmIds.has_key(parmIdString): + parmIds[parmIdString] = parmIdCounter + parmId = ParmID(parmIdString) + dbId = parmId.getDbId() + dbIdString = dbId.getModelId() + + if not dbIds.has_key(dbIdString): + dbIds[dbIdString] = dbIdCounter + dbIdInsertFile.write("INSERT INTO gfe_dbid (id, dbtype, format, modelname, modeltime, siteid) VALUES (" + + str(dbIdCounter) + ", '" + dbId.getDbType() + "', '" + dbId.getFormat() + "', '" + + dbId.getModelName() + "', '" + dbId.getModelTime() + "', '" + dbId.getSiteId() + "');\n") + dbIdCounter += 1 + dbIdVal = dbIds[dbIdString] + parmIdInsertFile.write("INSERT INTO gfe_parmid (id, parmlevel, parmname, dbid_id) VALUES (" + + str(parmIdCounter) + ", '" + parmId.getParmLevel() + "', '" + + parmId.getParmName() + "', " + str(dbIdVal) + ");\n") + recordUpdateFile.write("UPDATE gfe set parmId_id = " + str(parmIdCounter) + + " WHERE parmId = '" + parmIdString + "';\n") + parmIdCounter+=1 + else: + # should never happen if query feeding this is using distinct + print "Received duplicate parmId: " + parmIdString + +dbIdInsertFile.write("CREATE SEQUENCE gfe_dbid_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START " + + str((dbIdCounter / 50) + 1) + " CACHE 1;\nALTER TABLE gfe_dbid_seq OWNER TO awips;") +parmIdInsertFile.write("CREATE SEQUENCE gfe_parmid_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START " + + str((parmIdCounter / 50) + 1) + " CACHE 1;\nALTER TABLE gfe_parmid_seq OWNER TO awips;") +f.close() +dbIdInsertFile.close() +parmIdInsertFile.close() +recordUpdateFile.close() diff --git a/deltaScripts/13.4.1/updateGfeConstraintsAndIndexes.sql b/deltaScripts/13.4.1/updateGfeConstraintsAndIndexes.sql new file mode 100644 index 0000000000..2c8a0de00e --- /dev/null +++ b/deltaScripts/13.4.1/updateGfeConstraintsAndIndexes.sql @@ -0,0 +1,36 @@ +-- Called by normalizeGfe.sh to dop and add constraints + +ALTER TABLE gfe DROP CONSTRAINT gfe_datauri_key; + +DROP INDEX IF EXISTS gfeParmTime_idx; + +DROP INDEX IF EXISTS gfedatauri_idx; + +DROP INDEX IF EXISTS gfefcsttimeindex; + +ALTER TABLE gfe DROP COLUMN IF EXISTS parmname; + +ALTER TABLE gfe DROP COLUMN IF EXISTS parmlevel; + +ALTER TABLE gfe DROP COLUMN IF EXISTS dbid; + +ALTER TABLE gfe DROP COLUMN IF EXISTS parmid; + +ALTER TABLE gfe ADD CONSTRAINT fk18f667bab05cc FOREIGN KEY (parmid_id) + REFERENCES gfe_parmid (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE; + +ALTER TABLE gfe ADD CONSTRAINT gfe_parmid_id_rangestart_rangeend_reftime_forecasttime_key + UNIQUE (parmid_id, rangestart, rangeend, reftime, forecasttime); + +ALTER TABLE gfe_gridhistory DROP CONSTRAINT fk66434335e416514f; + +ALTER TABLE gfe_gridhistory RENAME COLUMN key TO id; + +ALTER TABLE gfe_gridhistory RENAME COLUMN parent to parent_id; + +ALTER TABLE gfe_gridhistory ADD CONSTRAINT fk664343359ad1f975 FOREIGN KEY (parent_id) + REFERENCES gfe (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE CASCADE; + +DROP TABLE IF EXISTS gfelocktable; diff --git a/deltaScripts/13.4.1/updateModelSoundingPaths.sh b/deltaScripts/13.4.1/updateModelSoundingPaths.sh new file mode 100644 index 0000000000..65faedfb47 --- /dev/null +++ b/deltaScripts/13.4.1/updateModelSoundingPaths.sh @@ -0,0 +1,130 @@ +#!/bin/bash + +# DR #1846 - this update script will re-arrange the existing modelsounding hdf5 files to divide them by +# model name and site. Currently, every file will be copied to every potential path that it could be +# accessed at. But, any new files that are written after the upgrade is complete, will contain only +# the minimum amount of required data. + +# ensure that we actually have modellsounding data to re-arrange +DATA_DIRECTORY="/awips2/edex/data/hdf5/modelsounding" + +if [ ! -d ${DATA_DIRECTORY} ]; then + echo "INFO: No Model Sounding Data Was Found On The System!" + echo "INFO: Update Terminated ..." + exit 0 +fi + +# determine where we are +path_to_script=`readlink -f $0` +dir=$(dirname $path_to_script) + +# first, retrieve all possible models +PSQL="/awips2/psql/bin/psql" +SQL="SELECT DISTINCT reporttype FROM awips.modelsounding ORDER BY reporttype;" +_modelslist=modelslist.txt + +echo "INFO: update started." +pushd . > /dev/null 2>&1 +cd ${DATA_DIRECTORY} + +# retrieve the models +${PSQL} -U awips -d metadata -c "${SQL}" -t -o ${_modelslist} +if [ $? -ne 0 ]; then + echo "ERROR: Failed to retrieve the list of models." + echo "FATAL: The update has failed." + exit 1 +fi + +PYTHON="/awips2/python/bin/python" +_python_script="${dir}/determineRefTimeDirectory.py" +_python_script2="${dir}/modelsoundingFileName.py" +_fcsthourslist=fcsthourslist.txt + +# now loop through the models +for model in `cat ${_modelslist}`; do + # create a directory for the model. + mkdir -p ${DATA_DIRECTORY}/${model} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to create directory - ${DATA_DIRECTORY}/${model}!" + echo "FATAL: The update has failed." + exit 1 + fi + + # retrieve the potential forecast hours for the model that we are + # currently processing. + SQL_FCST_HOUR="SELECT DISTINCT (fcstSeconds / 3600) AS forecastHour FROM modelsounding WHERE reporttype = '${model}' ORDER BY forecastHour;" + ${PSQL} -U awips -d metadata -c "${SQL_FCST_HOUR}" -t -o ${_fcsthourslist} + + # loop through the hdf5 files + for file in `ls -1 *.h5`; do + # determine which reftime directory would be associated with the file + reftimeDirectory=`${PYTHON} ${_python_script} "${file}"` + if [ $? -ne 0 ]; then + echo "FATAL: The update has failed." + exit 1 + fi + + # create the reftime directory + mkdir -p "${DATA_DIRECTORY}/${model}/${reftimeDirectory}" + if [ $? -ne 0 ]; then + echo "ERROR: Failed to create directory - ${DATA_DIRECTORY}/${model}/${reftimeDirectory}!" + echo "FATAL: The update has failed." + exit 1 + fi + + # loop through the possible forecast hours + for fcstHour in `cat ${_fcsthourslist}`; do + # determine the new name of the file + destinationFile=`${PYTHON} ${_python_script2} "${file}" "${model}" ${fcstHour}` + if [ $? -ne 0 ]; then + echo "ERROR: Failed to determine the adjusted name of file - ${file}!" + echo "FATAL: The update has failed." + exit 1 + fi + + # create a link between the files + ln ${file} ${DATA_DIRECTORY}/${model}/${reftimeDirectory}/${destinationFile} + if [ $? -ne 0 ]; then + echo "ERROR: Failed create a link for ${file} to ${DATA_DIRECTORY}/${model}/${reftimeDirectory}/${destinationFile}!" + echo "FATAL: The update has failed." + exit 1 + fi + done + done + + rm -f ${_fcsthourslist} + if [ $? -ne 0 ]; then + echo "WARNING: Failed to remove temporary file - ${_fcsthourslist}." + fi +done + +# remove the models list text file +rm -f ${_modelslist} +if [ $? -ne 0 ]; then + echo "WARNING: Failed to remove temporary file - ${_modelslist}." +fi + +# remove the hdf5 files +rm -f *.h5 +if [ $? -ne 0 ]; then + echo "ERROR: Failed to remove the obsolete hdf5 files!" + echo "WARNING: Removing the files manually is recommended." +fi + +popd > /dev/null 2>&1 + +echo "INFO: the update has completed successfully!" + +exit 0 + + + + + + + + + + + + diff --git a/deltaScripts/13.4.1/upgradeGribLocalization.sh b/deltaScripts/13.4.1/upgradeGribLocalization.sh new file mode 100644 index 0000000000..48d53b926e --- /dev/null +++ b/deltaScripts/13.4.1/upgradeGribLocalization.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# This script will update any gribParamInfo files to use the gridParamInfo tag +# and move gribModels files from common_static to edex_static and remove +# deprecated fields. +# +# This update is optional with 13.4.1 but it must be performed before grib can +# move to the futue. +# +# This update is only for edex servers which host the cave localization files + +echo "INFO: Moving all parameterInfo files to grid." + +IFS=$'\n' +gribFiles=`find /awips2/edex/data/utility/edex_static/*/*/grib/parameterInfo/ -iname '*.xml'` + +for f in $gribFiles; do + newf=${f//grib/grid} + if [ -e "$newf" ]; then + echo Cannot upgrade $f because $newf already exists + else + mkdir -p `dirname $newf` + mv $f $newf + fi +done + +echo "INFO: Upgrading all parameterInfo files." + +gridFiles=`find /awips2/edex/data/utility/edex_static/*/*/grid/parameterInfo/ -iname '*.xml'` + +for f in $gridFiles; do + sed -n 's/gribParamInfo/gridParamInfo/g;p;' -i $f +done + +echo "INFO: Moving all gribModels to edex_static." + +commonFiles=`find /awips2/edex/data/utility/common_static/*/*/grib/models/ -iname '*.xml'` + +for f in $commonFiles; do + newf=${f//common_static/edex_static} + if [ -e "$newf" ]; then + echo Cannot upgrade $f because $newf already exists + else + mkdir -p `dirname $newf` + mv $f $newf + fi +done + +echo "INFO: Cleaning all gribModel files." + +edexFiles=`find /awips2/edex/data/utility/edex_static/*/*/grib/models/ -iname '*.xml'` + +for f in $edexFiles; do + sed '/^\s*.*<\/title>\s*$/d' -i $f + sed '/^\s*<alias>.*<\/alias>\s*$/d' -i $f + sed '/^\s*<dt>.*<\/dt>\s*$/d' -i $f + sed '/^\s*<paramInfo>.*<\/paramInfo>\s*$/d' -i $f +done + +echo "INFO: The update finished successfully." +exit 0 \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/bin/setup.env b/edexOsgi/build.edex/esb/bin/setup.env index 9857aad0c5..d121cdd9d9 100644 --- a/edexOsgi/build.edex/esb/bin/setup.env +++ b/edexOsgi/build.edex/esb/bin/setup.env @@ -9,6 +9,15 @@ export IH_DB_NAME=hd_ob83oax ### end of localization variables ### +### flag to control grib deprecation ### +if [ -z "$gribMode" ]; then +# uncomment only one of the following two lines +export gribMode=deprecated +#export gribMode=future +fi + +## end of grib deprecation flag ### + # setup environment for HPE export DATA_ARCHIVE_ROOT=/tmp/sbn diff --git a/edexOsgi/build.edex/esb/conf/wrapper.conf b/edexOsgi/build.edex/esb/conf/wrapper.conf index a86819ea2d..601cb7f131 100644 --- a/edexOsgi/build.edex/esb/conf/wrapper.conf +++ b/edexOsgi/build.edex/esb/conf/wrapper.conf @@ -147,6 +147,7 @@ wrapper.java.additional.48=-Dhttp.port=${HTTP_PORT} wrapper.java.additional.49=-Dedex.arch=${EDEX_BITS}-bit wrapper.java.additional.50=-Dedex.tmp=${TEMP_DIR} wrapper.java.additional.51=-Dncf.bandwidth.manager.service=${NCF_BANDWIDTH_MANAGER_SERVICE} +wrapper.java.additional.52=-DinitializeHibernatables=true # Initial Java Heap Size (in MB) wrapper.java.initmemory=${INIT_MEM} diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java index b61ba25cf3..7f0acbd76b 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java @@ -50,6 +50,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * ------------ ---------- ----------- -------------------------- * 14Nov2008 1709 MW Fegan Initial creation. * 14Apr2011 5163 cjeanbap NWRWAVES Setting AFOS text triggers in AWIPS II + * 04/24/13 1949 rjpeter Removed @Override on delete. * </pre> * * @author mfegan @@ -90,8 +91,7 @@ public class SubscriptionDAO extends CoreDao { super(config); } - @Override - public void delete(PersistableDataObject obj) { + public void delete(PersistableDataObject<?> obj) { super.delete(obj); sendSubscriptionNotifyMessage(String.valueOf(obj.getIdentifier())); } @@ -145,7 +145,7 @@ public class SubscriptionDAO extends CoreDao { */ @SuppressWarnings("unchecked") public List<SubscriptionRecord> getSubscriptions() { - if (cachedRecords == null || dirtyRecords) { + if ((cachedRecords == null) || dirtyRecords) { List<?> retVal = getHibernateTemplate().loadAll(this.daoClass); if (retVal == null) { logger.info("Unable to perform query, 'null' result returned"); @@ -182,7 +182,7 @@ public class SubscriptionDAO extends CoreDao { synchronized (recordsMap) { rval = recordsMap.get(key); } - if (rval == null || rval.isEmpty() || rval.size() == 0) { + if ((rval == null) || rval.isEmpty()) { List<?> retVal = null; List<QueryParam> params = new ArrayList<QueryParam>(); for (Property prop : props) { diff --git a/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java b/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java index f4ef9150b3..f73c8296dc 100644 --- a/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java +++ b/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java @@ -50,8 +50,8 @@ import com.raytheon.uf.edex.database.DatabasePluginRegistry; import com.raytheon.uf.edex.database.DatabaseSessionFactoryBean; import com.raytheon.uf.edex.database.IDatabasePluginRegistryChanged; import com.raytheon.uf.edex.database.cluster.ClusterLockUtils; -import com.raytheon.uf.edex.database.cluster.ClusterTask; import com.raytheon.uf.edex.database.cluster.ClusterLockUtils.LockState; +import com.raytheon.uf.edex.database.cluster.ClusterTask; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; import com.raytheon.uf.edex.database.plugin.PluginVersion; @@ -67,6 +67,8 @@ import com.raytheon.uf.edex.database.plugin.PluginVersionDao; * 10/8/2008 1532 bphillip Initial checkin * 2/9/2009 1990 bphillip Fixed index creation * 03/20/09 njensen Implemented IPluginRegistryChanged + * Mar 02, 2013 1970 bgonzale Updated createIndexTableNamePattern to match text preceeding + * %TABLE%. * </pre> * * @author bphillip @@ -100,7 +102,7 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { .compile("^create (?:table |index |sequence )(?:[A-Za-z_0-9]*\\.)?(.+?)(?: .*)?$"); private Pattern createIndexTableNamePattern = Pattern - .compile("^create index %TABLE%.+? on (.+?) .*$"); + .compile("^create index \\w*?%TABLE%.+? on (.+?) .*$"); /** * Gets the singleton instance @@ -294,8 +296,7 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { runPluginScripts(props); String database = props.getDatabase(); PluginVersion pv = new PluginVersion(props.getPluginName(), - true, - props.getTableName(), database); + true, props.getTableName(), database); pvd.saveOrUpdate(pv); logger.info(pluginName + " plugin initialization complete!"); } else if (initialized == false) { @@ -343,9 +344,6 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { createSql.add(sql); } - // only truly want the sql for just this plugin - removeAllDependentCreateSql(props, sessFactory, createSql); - for (int i = 0; i < createSql.size(); i++) { String sql = createSql.get(i); if (sql.startsWith("create index")) { @@ -358,6 +356,9 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { } createSql.trimToSize(); + // only truly want the sql for just this plugin + removeAllDependentCreateSql(props, sessFactory, createSql); + pluginCreateSql.put(fqn, createSql); } return createSql; diff --git a/edexOsgi/com.raytheon.edex.plugin.bufrmos/src/com/raytheon/edex/plugin/bufrmos/common/BufrMosData.java b/edexOsgi/com.raytheon.edex.plugin.bufrmos/src/com/raytheon/edex/plugin/bufrmos/common/BufrMosData.java index 09afae7248..49cf78e3dd 100644 --- a/edexOsgi/com.raytheon.edex.plugin.bufrmos/src/com/raytheon/edex/plugin/bufrmos/common/BufrMosData.java +++ b/edexOsgi/com.raytheon.edex.plugin.bufrmos/src/com/raytheon/edex/plugin/bufrmos/common/BufrMosData.java @@ -23,13 +23,13 @@ import java.util.Collection; import javax.persistence.CascadeType; import javax.persistence.Embedded; -import javax.persistence.Entity; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.SequenceGenerator; -import javax.persistence.Table; import javax.persistence.Transient; -import javax.persistence.UniqueConstraint; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -59,15 +59,17 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * 20080221 862 jkorman Initial Coding. * 02/06/09 1990 bphillip removed populateDataStore method * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * May 02, 2013 1970 bgonzale Removed Table annotation, changed from Entity + * annotation to MappedSuperClass. * * </pre> * * @author jkorman * @version 1.0 */ -@Entity -@SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "bufrmosseq") -@Table(name = "bufrmos", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@MappedSuperclass +@SequenceGenerator(name = PluginDataObject.ID_GEN) +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-common.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-common.xml index fba4bf8bc1..d7e8da91d3 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-common.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-common.xml @@ -36,7 +36,7 @@ factory-method="getInstance" depends-on="commonTimeRegistered"> </bean> - <bean factory-bean="siteAwareRegistry" factory-method="register"> + <bean id="gfeSitesActive" factory-bean="siteAwareRegistry" factory-method="register"> <constructor-arg ref="gfeSiteActivation" /> </bean> diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml index 8ef903c923..a86ca47a81 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml @@ -465,9 +465,8 @@ <property name="threads" value="1"/> <property name="runningTimeOutMillis" value="300000"/> <property name="threadSleepInterval" value="5000"/> - <property name="initialDelay" value="120000"/> </bean> - <bean depends-on="gfeDbRegistered" id="sendIscSrv" class="com.raytheon.edex.plugin.gfe.isc.SendIscSrv"> + <bean depends-on="gfeDbRegistered, gfeSitesActive" id="sendIscSrv" class="com.raytheon.edex.plugin.gfe.isc.SendIscSrv"> <constructor-arg ref="iscSendSrvCfg" /> </bean> <!-- End ISC Send Beans --> diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml index 1205ac3c68..385d4d6b26 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml @@ -22,10 +22,9 @@ <property name="pendingInitMinTimeMillis" value="180000"/> <property name="runningInitTimeOutMillis" value="300000"/> <property name="threadSleepInterval" value="60000"/> - <property name="initialDelay" value="320000"/> </bean> - <bean depends-on="gfeDbRegistered" id="smartInitSrv" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitSrv"> + <bean depends-on="gfeDbRegistered, gfeSitesActive" id="smartInitSrv" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitSrv"> <constructor-arg ref="smartInitSrvCfg" /> </bean> diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java index b94ddba242..3f4ac1869a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java @@ -24,30 +24,27 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collections; +import java.util.Collection; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.regex.Pattern; +import org.hibernate.LockOptions; import org.hibernate.Query; import org.hibernate.Session; +import org.hibernate.StatelessSession; import org.hibernate.Transaction; -import org.hibernate.criterion.DetachedCriteria; -import org.hibernate.criterion.Property; +import org.hibernate.exception.ConstraintViolationException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; -import org.springframework.transaction.support.TransactionCallbackWithoutResult; import com.raytheon.edex.db.dao.DefaultPluginDao; import com.raytheon.edex.plugin.gfe.config.GFESiteActivation; import com.raytheon.edex.plugin.gfe.server.GridParmManager; import com.raytheon.edex.plugin.gfe.server.database.GridDatabase; import com.raytheon.edex.plugin.gfe.util.SendNotifications; -import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory; import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; @@ -58,16 +55,13 @@ import com.raytheon.uf.common.dataplugin.gfe.server.notify.LockNotification; import com.raytheon.uf.common.dataplugin.gfe.type.Pair; import com.raytheon.uf.common.dataplugin.gfe.util.GfeUtil; import com.raytheon.uf.common.dataplugin.persist.IPersistable; -import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.datastorage.DataStoreFactory; import com.raytheon.uf.common.datastorage.IDataStore; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.TimeRange; +import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.database.purge.PurgeLogger; -import com.raytheon.uf.edex.database.query.DatabaseQuery; /** * Data access object for manipulating GFE Records @@ -92,14 +86,15 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * 02/12/13 #1608 randerso Changed to use explicit deletes for groups and datasets * 03/15/13 #1795 njensen Added updatePublishTime() * 03/21/13 #1774 randerso Moved D2D routines into {@link com.raytheon.edex.plugin.gfe.db.dao.GFED2DDao} - * + * 04/08/13 #1949 rjpeter Normalized GFE Database. * </pre> * * @author bphillip * @version 1.0 */ public class GFEDao extends DefaultPluginDao { - private static final Pattern WIND_PATTERN = Pattern.compile("wind"); + // Number of retries on insert of a new DatabaseID + private static final int QUERY_RETRY = 2; public GFEDao() throws PluginException { super("gfe"); @@ -114,6 +109,234 @@ public class GFEDao extends DefaultPluginDao { super(pluginName); } + /** + * Returns the database row for the passed dbId. If the row does not exist, + * the row will be created. + * + * @param dbId + * @return + */ + public DatabaseID getDatabaseId(DatabaseID dbId) + throws DataAccessLayerException { + DatabaseID rval = null; + Session sess = null; + + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + int tries = 0; + Transaction tx = null; + while ((rval == null) && (tries < QUERY_RETRY)) { + try { + tx = sess.beginTransaction(); + rval = getDatabaseId(sess, dbId); + + if (rval == null) { + sess.save(dbId); + } + + tx.commit(); + + if (rval == null) { + rval = dbId; + } + } catch (ConstraintViolationException e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error( + "Error occurred rolling back transaction", + e1); + } + } + + rval = null; + // database may have been inserted on another process, redo + // the look up + if (tries < 2) { + logger.info("Constraint violation on save, attempting to look up database id again"); + } else { + throw new DataAccessLayerException( + "Unable to look up DatabaseID: " + + dbId.toString(), e); + } + } + } + } catch (Exception e) { + throw new DataAccessLayerException("Unable to look up DatabaseID: " + + dbId.toString(), e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + + return rval; + } + + /** + * Looks up a database id from database. Session must have already started a + * transaction. + * + * @param sess + * @param dbId + * @return + */ + private DatabaseID getDatabaseId(Session sess, DatabaseID dbId) { + Query query = sess + .createQuery("from DatabaseID where siteId = ? and modelName = ? and modelTime = ? and dbType = ?"); + query.setString(0, dbId.getSiteId()); + query.setString(1, dbId.getModelName()); + query.setString(2, dbId.getModelTime()); + query.setString(3, dbId.getDbType()); + return (DatabaseID) query.uniqueResult(); + } + + /** + * Retrieves all known parm ids for the given database id. + * + * @param dbId + * @return + * @throws DataAccessLayerException + */ + @SuppressWarnings("unchecked") + public List<ParmID> getParmIds(final DatabaseID dbId) + throws DataAccessLayerException { + Session sess = null; + Transaction tx = null; + + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + tx = sess.beginTransaction(); + + // reattach so dbId doesn't requery + sess.buildLockRequest(LockOptions.NONE).lock(dbId); + + Query query = sess.createQuery("FROM ParmID WHERE dbId = ?"); + query.setParameter(0, dbId); + List<ParmID> list = query.list(); + tx.commit(); + return list; + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + + throw new DataAccessLayerException( + "Unable to look up parm id inventory for database id " + + dbId, e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + } + + /** + * Returns the database row for the passed parmId. If the row does not + * exist, the row will be created. + * + * @param dbId + * @return + */ + public ParmID getParmId(final ParmID parmId) + throws DataAccessLayerException { + ParmID rval = null; + Session sess = null; + + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + + // reattach so dbId doesn't requery + sess.buildLockRequest(LockOptions.NONE).lock(parmId.getDbId()); + + int tries = 0; + Transaction tx = null; + while ((rval == null) && (tries < QUERY_RETRY)) { + try { + tx = sess.beginTransaction(); + rval = getParmId(sess, parmId); + + if (rval == null) { + sess.save(parmId); + } + + tx.commit(); + + if (rval == null) { + rval = parmId; + } + } catch (ConstraintViolationException e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error( + "Error occurred rolling back transaction", + e1); + } + } + + rval = null; + // database may have been inserted on another process, redo + // the look up + if (tries < 2) { + logger.info("Constraint violation on save, attempting to look up parm id again"); + } else { + throw new DataAccessLayerException( + "Unable to look up ParmID: " + + parmId.toString(), e); + } + } + } + } catch (Exception e) { + throw new DataAccessLayerException("Unable to look up ParmID: " + + parmId.toString(), e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + + return rval; + } + + /** + * Looks up a parm id from database. Session must have already started a + * transaction. + * + * @param sess + * @param dbId + * @return + */ + private ParmID getParmId(Session sess, ParmID parmId) { + Query query = sess + .createQuery("FROM ParmID WHERE dbId = ? AND parmName = ? AND parmLevel = ?"); + query.setParameter(0, parmId.getDbId()); + query.setString(1, parmId.getParmName()); + query.setString(2, parmId.getParmLevel()); + return (ParmID) query.uniqueResult(); + } + @Override public void purgeExpiredData() throws PluginException { Set<String> sites = GFESiteActivation.getInstance().getActiveSites(); @@ -141,53 +364,25 @@ public class GFEDao extends DefaultPluginDao { } } - @SuppressWarnings("unchecked") public int purgeDatabaseForSite(final String siteID) throws DataAccessLayerException { return (Integer) txTemplate.execute(new TransactionCallback() { @Override public Integer doInTransaction(TransactionStatus status) { - List<DatabaseID> dbs = getDatabaseInventoryForSite(siteID); - if (dbs.isEmpty()) { - return 0; - } else { - DetachedCriteria criteria = DetachedCriteria.forClass( - GFERecord.class).add( - Property.forName("dbId").in(dbs)); - List<GFERecord> list = getHibernateTemplate() - .findByCriteria(criteria); - if (!list.isEmpty()) { - getHibernateTemplate().deleteAll(list); - } - return list.size(); - } + return getHibernateTemplate().bulkUpdate( + "DELETE FROM DatabaseID WHERE siteId = ?", siteID); } }); } - private List<DatabaseID> getDatabaseInventoryForSite(String siteID) { - List<DatabaseID> dbInventory = new ArrayList<DatabaseID>(); - Object[] dbIds = executeSQLQuery("select distinct dbId from awips.gfe where dbId like '" - + siteID.toUpperCase() + "%'"); - for (Object id : dbIds) { - dbInventory.add(new DatabaseID((String) id)); - } - return dbInventory; - } - /** - * Retrieves a GFE Record * - * @param record - * the record - * @return The record, populated + * @param records + * @return */ - public GFERecord getRecord(PluginDataObject record) { - return (GFERecord) this.queryById(record); - } - - public List<GFERecord> saveOrUpdate(final List<GFERecord> records) { - List<GFERecord> failedToSave = new ArrayList<GFERecord>(); + public void save(final Collection<GFERecord> records) + throws DataAccessLayerException { + // validate fields for (GFERecord rec : records) { if (rec.getIdentifier() == null) { try { @@ -196,88 +391,30 @@ public class GFEDao extends DefaultPluginDao { e.printStackTrace(); } } + if (rec.getInsertTime() == null) { rec.setInsertTime(Calendar.getInstance()); } } - final int batchSize = 100; - - // First, try committing all of the records in batches of size - // batchSize. If a failure occurs on a batch, add that batch to be - // retried individually. If the whole commit fails, try saving them all - // individually. - Session sess = null; + StatelessSession sess = null; Transaction tx = null; - int commitPoint = 0; - int index = 0; - boolean notDone = index < records.size(); + try { - sess = getHibernateTemplate().getSessionFactory().openSession(); + sess = getHibernateTemplate().getSessionFactory() + .openStatelessSession(); tx = sess.beginTransaction(); - boolean persistIndividually = false; - String sql = "select id from awips." + pluginName - + " where dataURI=:dataURI"; - Query q = sess.createSQLQuery(sql); - - while (notDone) { - GFERecord rec = records.get(index++); - notDone = index < records.size(); - try { - q.setString("dataURI", rec.getDataURI()); - List<?> list = q.list(); - if ((list == null) || (list.size() == 0)) { - sess.save(rec); - } else { - rec.setId(((Number) list.get(0)).intValue()); - sess.update(rec); - } - if ((index % batchSize == 0) || persistIndividually - || !notDone) { - sess.flush(); - sess.clear(); - tx.commit(); - tx = null; - commitPoint = index; - if (persistIndividually && (index % batchSize == 0)) { - // batch persisted individually switch back to batch - persistIndividually = false; - } - if (notDone) { - tx = sess.beginTransaction(); - q = sess.createSQLQuery(sql); - } - } - } catch (Exception e) { - if (tx != null) { - try { - tx.rollback(); - } catch (Exception e1) { - logger.error( - "Error occurred rolling back transaction", - e1); - } - } - - if (persistIndividually) { - // log it and continue - logger.error( - "Error occurred persisting gfe record individually", - e); - failedToSave.add(rec); - } else { - // change to persistIndividually and retry from last - // commit - persistIndividually = true; - index = commitPoint; - notDone = true; - } - - tx = sess.beginTransaction(); - q = sess.createSQLQuery(sql); + for (GFERecord rec : records) { + // TODO: Update saving a record, currently causes 2 inserts and + // 2 updates to happen, 1 for the record, 1 for the history, + // updates the whole history, then updates parent reference. + sess.insert(rec); + for (GridDataHistory hist : rec.getGridHistory()) { + sess.insert(hist); } } - } finally { + tx.commit(); + } catch (Exception e) { if (tx != null) { try { tx.rollback(); @@ -285,6 +422,10 @@ public class GFEDao extends DefaultPluginDao { logger.error("Error occurred rolling back transaction", e1); } } + + throw new DataAccessLayerException("Unable to save GFERecords: " + + records, e); + } finally { if (sess != null) { try { sess.close(); @@ -294,39 +435,118 @@ public class GFEDao extends DefaultPluginDao { } } } - - return failedToSave; - - } - - @Override - public void delete(final PersistableDataObject obj) { - GFERecord rec = (GFERecord) obj; - if (rec.getDataURI() == null) { - try { - rec.constructDataURI(); - } catch (PluginException e) { - logger.error("Unable to construct dataURI for GFE record", e); - } - } - rec = this.getRecord(rec); - super.delete(rec); } /** - * Gets list of all database IDs currently being stored in the database + * Update the GFERecords. Updating a record will update insert time only on + * the record, update all existing histories, and insert all new histories. + * + * @param existingRecords + */ + public void update(final Collection<GFERecord> existingRecords) + throws DataAccessLayerException { + StatelessSession sess = null; + Transaction tx = null; + List<Integer> ids = new ArrayList<Integer>(existingRecords.size()); + for (GFERecord rec : existingRecords) { + ids.add(rec.getId()); + } + + try { + sess = getHibernateTemplate().getSessionFactory() + .openStatelessSession(); + tx = sess.beginTransaction(); + + // Update insert time + Query query = sess + .createQuery("UPDATE GFERecord SET insertTime = ? WHERE id IN (:ids)"); + query.setCalendar(0, Calendar.getInstance()); + query.setParameterList("ids", ids); + + query.executeUpdate(); + + // TODO: do smart history diffing as most cases only a few columns + // update, if done remove parent calling consolidate and just + // passing existing through + List<Integer> histToDelete = new ArrayList<Integer>(); + + // handle histories + for (GFERecord rec : existingRecords) { + for (GridDataHistory hist : rec.getGridHistory()) { + if (hist.getId() != 0) { + sess.update(hist); + } else { + sess.insert(hist); + } + } + List<GridDataHistory> oldHists = rec.getOldHistory(); + if (!CollectionUtil.isNullOrEmpty(oldHists)) { + for (GridDataHistory oldHist : oldHists) { + histToDelete.add(oldHist.getId()); + } + } + } + + if (!histToDelete.isEmpty()) { + query = sess + .createQuery("DELETE FROM GridDataHistory WHERE id in (:ids)"); + query.setParameterList("ids", histToDelete); + query.executeUpdate(); + } + + tx.commit(); + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + + throw new DataAccessLayerException("Unable to update GFERecords: " + + existingRecords, e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + } + + /** + * Gets list of all database IDs currently being stored in the database for + * a given site. + * + * @param siteId + * The siteId to look up databases for. * * @return The list of all database IDs currently being stored in the * database */ - public List<DatabaseID> getDatabaseInventory() { - List<DatabaseID> dbInventory = new ArrayList<DatabaseID>(); - - Object[] dbIds = executeSQLQuery("select distinct dbId from awips.gfe"); - for (Object id : dbIds) { - dbInventory.add(new DatabaseID((String) id)); + @SuppressWarnings("unchecked") + public List<DatabaseID> getDatabaseInventory(final String siteId) + throws DataAccessLayerException { + // TODO: Should this be done from GridParmManager? + try { + return (List<DatabaseID>) txTemplate + .execute(new TransactionCallback() { + @Override + public List<DatabaseID> doInTransaction( + TransactionStatus status) { + return getHibernateTemplate().find( + "FROM DatabaseID WHERE siteId = ?", siteId); + } + }); + } catch (Exception e) { + throw new DataAccessLayerException( + "Unable to look up database inventory for site " + siteId, + e); } - return dbInventory; } /** @@ -339,174 +559,183 @@ public class GFEDao extends DefaultPluginDao { * If errors occur during the query */ @SuppressWarnings("unchecked") - public ArrayList<GFERecord> queryByParmID(ParmID parmId) + public List<GFERecord> queryByParmID(final ParmID parmId) throws DataAccessLayerException { - return (ArrayList<GFERecord>) this.queryBySingleCriteria("parmId", - parmId.getParmId()); - } + Session sess = null; + Transaction tx = null; - public GFERecord getRecord(final ParmID parmId, final TimeRange tr) - throws DataAccessLayerException { - GFERecord retVal = (GFERecord) txTemplate - .execute(new TransactionCallback() { - @Override - @SuppressWarnings("unchecked") - public GFERecord doInTransaction(TransactionStatus status) { - DetachedCriteria criteria = DetachedCriteria - .forClass(GFERecord.class) - .add(Property.forName("parmId").eq(parmId)) - .add(Property.forName("dataTime").eq( - new DataTime(tr.getStart().getTime(), - tr))); - return ((List<GFERecord>) getHibernateTemplate() - .findByCriteria(criteria)).get(0); - } - }); - return retVal; - } + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + tx = sess.beginTransaction(); - @SuppressWarnings("unchecked") - public List<GFERecord> getRecords(final ParmID parmId, - final List<TimeRange> times) { - if (times.isEmpty()) { - return Collections.emptyList(); - } - List<GFERecord> retVal = (List<GFERecord>) txTemplate - .execute(new TransactionCallback() { - @Override - public List<GFERecord> doInTransaction( - TransactionStatus status) { - List<DataTime> dataTimes = new ArrayList<DataTime>(); - for (TimeRange tr : times) { - dataTimes.add(new DataTime(tr.getStart().getTime(), - tr)); - } + // reattach so parmId doesn't requery + sess.buildLockRequest(LockOptions.NONE).lock(parmId); - DetachedCriteria criteria = DetachedCriteria - .forClass(GFERecord.class) - .add(Property.forName("parmId").eq(parmId)) - .add(Property.forName("dataTime").in(dataTimes)); - List<GFERecord> list = getHibernateTemplate() - .findByCriteria(criteria); - return list; - } - }); - return retVal; - } - - public void deleteRecords(final ParmID parmId, final List<TimeRange> times) { - if (times.isEmpty()) { - return; - } - final List<GFERecord> recordsToDelete = getRecords(parmId, times); - final List<GridDataHistory> histories = new ArrayList<GridDataHistory>(); - for (GFERecord rec : recordsToDelete) { - histories.addAll(rec.getGridHistory()); - } - txTemplate.execute(new TransactionCallbackWithoutResult() { - @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - getHibernateTemplate().deleteAll(histories); - getHibernateTemplate().deleteAll(recordsToDelete); - statusHandler.info("Deleted " + recordsToDelete.size() - + " records from the database."); - } - }); - - Map<File, Pair<List<TimeRange>, String[]>> fileMap = GfeUtil - .getHdf5FilesAndGroups(GridDatabase.gfeBaseDataDir, parmId, - times); - for (Map.Entry<File, Pair<List<TimeRange>, String[]>> entry : fileMap - .entrySet()) { - File hdf5File = entry.getKey(); - IDataStore dataStore = DataStoreFactory.getDataStore(hdf5File); - String[] groupsToDelete = entry.getValue().getSecond(); - - try { - dataStore.deleteGroups(groupsToDelete); - - if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { - statusHandler.handle(Priority.DEBUG, - "Deleted: " + Arrays.toString(groupsToDelete) - + " from " + hdf5File.getName()); + Query query = sess.createQuery("FROM GFERecord WHERE parmId = ?"); + query.setParameter(0, parmId); + List<GFERecord> list = query.list(); + tx.commit(); + return list; + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); } - } catch (Exception e) { - statusHandler.handle( - Priority.WARN, - "Error deleting hdf5 record(s) from file: " - + hdf5File.getPath(), e); } - } - } - @SuppressWarnings("unchecked") - @Deprecated - public void updateGridHistories(ParmID parmId, - Map<TimeRange, List<GridDataHistory>> history) - throws DataAccessLayerException { - for (TimeRange range : history.keySet()) { - DatabaseQuery recordQuery = new DatabaseQuery(GFERecord.class); - recordQuery.addQueryParam("parmId", parmId); - recordQuery.addQueryParam("dataTime.validPeriod", range); - List<GFERecord> result = (List<GFERecord>) this - .queryByCriteria(recordQuery); - if (result.size() == 0) { - logger.error("No histories were updated for: " + parmId + "::" - + range); - } else if (result.size() == 1) { - GFERecord returnedRecord = result.get(0); - - List<GridDataHistory> existHist = returnedRecord - .getGridHistory(); - List<GridDataHistory> newHist = history.get(range); - consolidateHistories(existHist, newHist); - - this.update(returnedRecord); - } else { - logger.error("MORE THAN 1 RESULT WAS RETURNED: " - + result.size()); - } - } - } - - public void consolidateHistories(List<GridDataHistory> existHist, - List<GridDataHistory> newHist) { - for (int i = 0; i < newHist.size(); i++) { - if (i < existHist.size()) { - existHist.get(i).replaceValues(newHist.get(i)); - } else { - existHist.add(newHist.get(i)); - } - } - - if (existHist.size() > newHist.size()) { - // not sure if we will ever have a case where the updated - // record has fewer history records than existing record - - // log a message as this has the potential to cause orphaned - // history records - statusHandler.handle(Priority.WARN, - "Updated record has fewer history records."); - for (int i = newHist.size(); i < existHist.size(); i++) { - existHist.remove(i); + throw new DataAccessLayerException( + "Unable to look up records for parmId " + parmId, e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } } } } /** - * Gets all GFE Records with the specified DatabaseID * - * @param dbId - * The DatabaseID to query for - * @return All GFE Records with the specified DatabaseID + * @param parmId + * @param tr + * @return * @throws DataAccessLayerException - * If errors occur during the query */ @SuppressWarnings("unchecked") - public ArrayList<GFERecord> queryByDatabaseID(DatabaseID dbId) - throws DataAccessLayerException { - return (ArrayList<GFERecord>) this.queryBySingleCriteria("dbId", - dbId.toString()); + public Map<TimeRange, GFERecord> getOverlappingRecords(final ParmID parmId, + final TimeRange tr) throws DataAccessLayerException { + Session sess = null; + Transaction tx = null; + List<GFERecord> records = null; + + try { + // stateless session so we can bulk query histories instead of once + // per record via hibernate + sess = getHibernateTemplate().getSessionFactory().openSession(); + tx = sess.beginTransaction(); + + // reattach so parmId doesn't requery + sess.buildLockRequest(LockOptions.NONE).lock(parmId); + + // start and end specifically reversed as we want + // every record that has a start before our end and + // and an end after our start + Query query = sess.createQuery("FROM GFERecord WHERE parmId = ?" + + " AND dataTime.validPeriod.start < ?" + + " AND dataTime.validPeriod.end > ?"); + query.setParameter(0, parmId); + query.setTimestamp(1, tr.getEnd()); + query.setTimestamp(2, tr.getStart()); + records = query.list(); + tx.commit(); + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + + throw new DataAccessLayerException( + "Unable to look up records for parmId " + parmId + + " overlapping timeRange " + tr, e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + + Map<TimeRange, GFERecord> recordsByTimeRange = new HashMap<TimeRange, GFERecord>( + records.size(), 1); + for (GFERecord rec : records) { + recordsByTimeRange.put(rec.getTimeRange(), rec); + } + + return recordsByTimeRange; + } + + /** + * Deletes records that have the specified parmId and time range. + * + * @param parmId + * @param times + */ + public void deleteRecords(final ParmID parmId, final List<TimeRange> times) { + if (times.isEmpty()) { + return; + } + + Session sess = null; + Transaction tx = null; + + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + tx = sess.beginTransaction(); + Query query = sess + .createQuery("DELETE FROM GFERecord WHERE parmId = :parmId" + + " AND dataTime.validPeriod IN (:times)"); + query.setParameter("parmId", parmId); + query.setParameterList("times", times); + int rowsDeleted = query.executeUpdate(); + tx.commit(); + statusHandler.info("Deleted " + rowsDeleted + + " records from the database."); + + Map<File, Pair<List<TimeRange>, String[]>> fileMap = GfeUtil + .getHdf5FilesAndGroups(GridDatabase.gfeBaseDataDir, parmId, + times); + for (Map.Entry<File, Pair<List<TimeRange>, String[]>> entry : fileMap + .entrySet()) { + File hdf5File = entry.getKey(); + IDataStore dataStore = DataStoreFactory.getDataStore(hdf5File); + String[] groupsToDelete = entry.getValue().getSecond(); + + try { + dataStore.deleteGroups(groupsToDelete); + + if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { + statusHandler.handle(Priority.DEBUG, "Deleted: " + + Arrays.toString(groupsToDelete) + " from " + + hdf5File.getName()); + } + } catch (Exception e) { + statusHandler.handle(Priority.WARN, + "Error deleting hdf5 record(s) from file: " + + hdf5File.getPath(), e); + } + } + } catch (Exception e) { + statusHandler.error("Error deleting database record(s) for parmId " + + parmId + " timeRanges " + times, e); + + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } } /** @@ -517,23 +746,67 @@ public class GFEDao extends DefaultPluginDao { * @return The list of times for a given parm name and level * @throws DataAccessLayerException */ - public List<TimeRange> getTimes(ParmID parmId) + @SuppressWarnings("unchecked") + public List<TimeRange> getTimes(final ParmID parmId) throws DataAccessLayerException { - List<TimeRange> times = new ArrayList<TimeRange>(); - String timeQuery = "SELECT rangestart,rangeend from awips.gfe where parmid='" - + parmId + "' ORDER BY rangestart"; - QueryResult result = (QueryResult) executeNativeSql(timeQuery); - for (int i = 0; i < result.getResultCount(); i++) { - times.add(new TimeRange((Date) result.getRowColumnValue(i, 0), - (Date) result.getRowColumnValue(i, 1))); + try { + return (List<TimeRange>) txTemplate + .execute(new TransactionCallback() { + @Override + public List<TimeRange> doInTransaction( + TransactionStatus status) { + return getHibernateTemplate() + .find("SELECT dataTime.validPeriod FROM GFERecord WHERE parmId = ? ORDER BY dataTime.validPeriod.start", + parmId); + } + }); + } catch (Exception e) { + throw new DataAccessLayerException( + "Unabled to look up times for parm id " + parmId, e); + } + } + + /** + * Gets the list of times for a given parmId that overlap with the given + * time range. + * + * @param parmId + * The id of the parm + * @param tr + * The time range to pull time ranges for + * @return The list of times for a given parm name and level + * @throws DataAccessLayerException + */ + @SuppressWarnings("unchecked") + public List<TimeRange> getOverlappingTimes(final ParmID parmId, + final TimeRange tr) throws DataAccessLayerException { + try { + return (List<TimeRange>) txTemplate + .execute(new TransactionCallback() { + @Override + public List<TimeRange> doInTransaction( + TransactionStatus status) { + List<TimeRange> rval = getHibernateTemplate() + .find("SELECT dataTime.validPeriod" + + " FROM GFERecord WHERE parmId = ?" + + " AND dataTime.validPeriod.start < ?" + + " AND dataTime.validPeriod.end > ?", + new Object[] { parmId, tr.getEnd(), + tr.getStart() }); + return rval; + } + }); + } catch (Exception e) { + throw new DataAccessLayerException( + "Unabled to look up record inventory for parm id " + parmId, + e); } - return times; } /** * Retrieves the grid history for the specified parm and time ranges * - * @param id + * @param parmId * The parm id * @param trs * The time ranges to search for @@ -541,69 +814,110 @@ public class GFEDao extends DefaultPluginDao { * @throws DataAccessLayerException * If problems during database interaction occur */ - public Map<TimeRange, List<GridDataHistory>> getGridHistory(ParmID id, - List<TimeRange> trs) throws DataAccessLayerException { - - Map<TimeRange, List<GridDataHistory>> history = new HashMap<TimeRange, List<GridDataHistory>>(); + public Map<TimeRange, List<GridDataHistory>> getGridHistory( + final ParmID parmId, final List<TimeRange> trs) + throws DataAccessLayerException { + // TODO: This would be better of using a single time range to do the + // select on + Map<TimeRange, List<GridDataHistory>> history = new HashMap<TimeRange, List<GridDataHistory>>( + trs.size(), 1); if (trs.isEmpty()) { return history; } - List<GFERecord> records = this.getRecords(id, trs); - for (GFERecord rec : records) { - TimeRange tr = rec.getTimeRange(); - history.put(tr, rec.getGridHistory()); + + StatelessSession sess = null; + Transaction tx = null; + + try { + sess = getHibernateTemplate().getSessionFactory() + .openStatelessSession(); + tx = sess.beginTransaction(); + + Query query = sess + .createQuery("SELECT hist.parent.dataTime.validPeriod, hist " + + "FROM GridDataHistory hist WHERE hist.parent.parmId = ? AND hist.parent.dataTime.validPeriod IN (:periods) ORDER BY hist.id"); + query.setParameter(0, parmId); + query.setParameterList("periods", trs); + @SuppressWarnings("unchecked") + List<Object[]> rows = query.list(); + tx.commit(); + + for (Object[] cols : rows) { + TimeRange tr = (TimeRange) cols[0]; + List<GridDataHistory> histForTime = history.get(tr); + if (histForTime == null) { + histForTime = new ArrayList<GridDataHistory>(1); + history.put(tr, histForTime); + } + histForTime.add((GridDataHistory) cols[1]); + } + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + + throw new DataAccessLayerException( + "Unable to look up record inventory for parm id " + parmId, + e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } } + return history; } public void purgeGFEGrids(final DatabaseID dbId) { - txTemplate.execute(new TransactionCallbackWithoutResult() { - @Override - @SuppressWarnings("unchecked") - public void doInTransactionWithoutResult(TransactionStatus status) { - DetachedCriteria criteria = DetachedCriteria.forClass( - GFERecord.class).add(Property.forName("dbId").eq(dbId)); - List<GFERecord> list = getHibernateTemplate().findByCriteria( - criteria); - if (!list.isEmpty()) { - List<GridDataHistory> histories = new ArrayList<GridDataHistory>(); - for (GFERecord rec : list) { - histories.addAll(rec.getGridHistory()); - } - getHibernateTemplate().deleteAll(histories); - getHibernateTemplate().deleteAll(list); - } - } - }); + delete(dbId); } /** * Removes GridParmInfo from the HDF5 file and any data associated with that * info * - * @param parmAndLevel - * The parm and level to delete - * @param dbId - * The database to delete from + * @param parmId + * The parm to delete data for * @throws DataAccessLayerException * If errors occur */ - public void removeOldParm(String parmAndLevel, DatabaseID dbId) - throws DataAccessLayerException { - - ParmID pid = new ParmID(parmAndLevel + ":" + dbId.toString()); + public void removeParmData(ParmID parmId) throws DataAccessLayerException { try { IDataStore ds = DataStoreFactory.getDataStore(GfeUtil - .getGridParmHdf5File(GridDatabase.gfeBaseDataDir, dbId)); - ds.deleteDatasets("/GridParmInfo/" + parmAndLevel, - "/GridParmStorageInfo/" + parmAndLevel); + .getGridParmHdf5File(GridDatabase.gfeBaseDataDir, + parmId.getDbId())); + ds.deleteDatasets("/GridParmInfo/" + parmId.getCompositeName(), + "/GridParmStorageInfo/" + parmId.getCompositeName()); } catch (Exception e1) { throw new DataAccessLayerException("Error deleting data from HDF5", e1); } - List<TimeRange> trs = this.getTimes(pid); - this.deleteRecords(pid, trs); + List<TimeRange> trs = this.getTimes(parmId); + this.deleteRecords(parmId, trs); + // TODO: Remove all Locks?? + } + + /** + * Removes any data associated with a given parm and the parm itself + * + * @param parmId + * The parm to delete data for + * @throws DataAccessLayerException + * If errors occur + */ + public void removeParm(ParmID parmId) throws DataAccessLayerException { + removeParmData(parmId); + delete(parmId); } @Override @@ -612,47 +926,6 @@ public class GFEDao extends DefaultPluginDao { return null; } - public Date getLatestDbIdInsertTime(DatabaseID dbId) - throws DataAccessLayerException { - QueryResult result = (QueryResult) this - .executeNativeSql("select max(inserttime) as maxtime from awips.gfe where dbid='" - + dbId.toString() + "';"); - if (result.getResultCount() == 0) { - return null; - } else { - return (Date) result.getRowColumnValue(0, "maxtime"); - } - } - - /** - * Retrieves the latest database ID for a given a model name and site - * identifier. - * - * @param siteId - * The site's identifier (e.g., "OAX") - * @param modelName - * The name of the model run (e.g., "GFS40" or "RUC13") - * @return The DatabaseID of the latest model run for the given parameters - * or null if no copies of the given model have been ingested for - * the given site. - * @throws DataAccessLayerException - */ - public DatabaseID getLatestModelDbId(String siteId, String modelName) - throws DataAccessLayerException { - QueryResult result = (QueryResult) this - .executeNativeSql("select max(dbid) as maxdbid from awips.gfe where dbid like '" - + siteId + "!_GRID!_!_" + modelName + "!_%' escape '!'"); - if (result.getResultCount() == 0) { - return null; - } else { - String db = (String) result.getRowColumnValue(0, "maxdbid"); - if (db == null) { - return null; - } - return new DatabaseID(db); - } - } - /** * Updates the publish times in the database of all provided * GridDataHistories. Does not alter the publish times in memory. @@ -665,16 +938,10 @@ public class GFEDao extends DefaultPluginDao { */ public void updatePublishTime(List<GridDataHistory> history, Date publishTime) throws DataAccessLayerException { - StringBuilder query = new StringBuilder(); - query.append("update gfe_gridhistory set publishtime=:publishtime where key in ("); - Iterator<GridDataHistory> itr = history.iterator(); - while (itr.hasNext()) { - query.append(itr.next().getKey()); - if (itr.hasNext()) { - query.append(","); - } + List<Integer> ids = new ArrayList<Integer>(history.size()); + for (GridDataHistory hist : history) { + ids.add(hist.getId()); } - query.append(");"); Session sess = null; Transaction tx = null; @@ -682,15 +949,16 @@ public class GFEDao extends DefaultPluginDao { try { sess = getHibernateTemplate().getSessionFactory().openSession(); tx = sess.beginTransaction(); - Query q = sess.createSQLQuery(query.toString()); + Query q = sess + .createSQLQuery("UPDATE gfe_gridhistory SET publishtime=:publishtime WHERE id IN (:ids)"); q.setTimestamp("publishtime", publishTime); + q.setParameterList("ids", ids); q.executeUpdate(); tx.commit(); } catch (Exception e) { if (tx != null) { try { tx.rollback(); - tx = null; } catch (Exception e1) { logger.error("Error occurred rolling back transaction", e1); } @@ -707,4 +975,123 @@ public class GFEDao extends DefaultPluginDao { } } } + + /** + * Updates the sent time for all histories of passed parmId during the + * timeRange. The histories are then returned in a map by timeRange. + * + * @param parmId + * @param tr + * @param sentTime + * @return + */ + @SuppressWarnings("unchecked") + public Map<TimeRange, List<GridDataHistory>> updateSentTime( + final ParmID parmId, TimeRange tr, Date sentTime) + throws DataAccessLayerException { + StatelessSession sess = null; + Transaction tx = null; + List<Object[]> rows = null; + + try { + sess = getHibernateTemplate().getSessionFactory() + .openStatelessSession(); + tx = sess.beginTransaction(); + Query query = sess + .createQuery("UPDATE GridDataHistory SET lastSentTime = ?" + + " WHERE parent.parmId = ? AND parent.dataTime.validPeriod.start >= ?" + + " AND parent.dataTime.validPeriod.end >= ?"); + query.setParameter(0, parmId); + query.setTimestamp(1, tr.getStart()); + query.setTimestamp(2, tr.getEnd()); + query.executeUpdate(); + + query = sess + .createQuery("SELECT hist.parent.dataTime.validPeriod, hist " + + "FROM GridDataHistory hist" + + " WHERE hist.parent.parmId = ? AND hist.parent.dataTime.validPeriod.start >= ?" + + " AND hist.parent.dataTime.validPeriod.end >= ?"); + query.setParameter(0, parmId); + query.setTimestamp(1, tr.getStart()); + query.setTimestamp(2, tr.getEnd()); + rows = query.list(); + tx.commit(); + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + + throw new DataAccessLayerException( + "Unable to look up record inventory for parm id " + parmId, + e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + + Map<TimeRange, List<GridDataHistory>> history = new HashMap<TimeRange, List<GridDataHistory>>( + rows.size(), 1); + + for (Object[] cols : rows) { + TimeRange curTr = (TimeRange) cols[0]; + List<GridDataHistory> histForTime = history.get(curTr); + if (histForTime == null) { + histForTime = new ArrayList<GridDataHistory>(1); + history.put(curTr, histForTime); + } + histForTime.add((GridDataHistory) cols[1]); + } + + return history; + } + + public int deleteRecords(Collection<GFERecord> records) + throws DataAccessLayerException { + List<Integer> ids = new ArrayList<Integer>(records.size()); + for (GFERecord rec : records) { + ids.add(rec.getId()); + } + + Session sess = null; + Transaction tx = null; + + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + tx = sess.beginTransaction(); + Query q = sess + .createQuery("DELETE FROM GFERecord WHERE id in (:ids)"); + q.setParameterList("ids", ids); + int rowsDeleted = q.executeUpdate(); + tx.commit(); + return rowsDeleted; + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + throw new DataAccessLayerException("Error deleting records", e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); + } + } + } + } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFELockDao.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFELockDao.java index b14de30cd9..884b7ffe9c 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFELockDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFELockDao.java @@ -27,19 +27,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.hibernate.LockOptions; +import org.hibernate.Query; import org.hibernate.Session; +import org.hibernate.StatelessSession; import org.hibernate.Transaction; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.dataplugin.gfe.server.lock.Lock; import com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable; -import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand; import com.raytheon.uf.common.message.WsId; -import com.raytheon.uf.common.time.TimeRange; +import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; -import com.raytheon.uf.edex.database.query.DatabaseQuery; /** * Data access object for manipulating locks @@ -49,6 +50,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 06/17/08 #940 bphillip Initial Creation + * 04/19/13 rjpeter Normalized GFE Database. * </pre> * * @author bphillip @@ -60,89 +62,12 @@ public class GFELockDao extends CoreDao { super(DaoConfig.forClass(Lock.class)); } - /** - * Gets all locks held by a specified user - * - * @param wsId - * The workstation ID of the user - * @return All locks held by a specified user - * @throws DataAccessLayerException - * If database errors occur - */ - @SuppressWarnings("unchecked") - public List<Lock> getLocksByOwner(String wsId) - throws DataAccessLayerException { - DatabaseQuery query = new DatabaseQuery(daoClass.getName()); - query.addQueryParam("wsId", wsId); - List<Lock> locks = (List<Lock>) queryByCriteria(query); - return locks; - } - - /** - * Gets all locks in the specified time range - * - * @param parmId - * The parmId of the locks - * @param timeRange - * The time range to examine - * @return All locks in the specified time range - * @throws DataAccessLayerException - * If database errors occur - */ - @SuppressWarnings("unchecked") - public List<Lock> getLocksInRange(ParmID parmId, TimeRange timeRange) - throws DataAccessLayerException { - DatabaseQuery query = new DatabaseQuery(daoClass.getName()); - query.addQueryParam("startTime", timeRange.getStart().getTime(), - QueryOperand.GREATERTHANEQUALS); - query.addQueryParam("endTime", timeRange.getEnd().getTime(), - QueryOperand.LESSTHANEQUALS); - query.addQueryParam("parmId", parmId); - List<Lock> locks = (List<Lock>) queryByCriteria(query); - return locks; - } - - /** - * Gets a specific lock - * - * @param parmId - * The parmId of the lock - * @param timeRange - * The time range of the lock - * @param wsId - * The workstation ID of the lock holder - * @return A specific lock - * @throws DataAccessLayerException - * If database errors occur - */ - @SuppressWarnings("unchecked") - public Lock getLock(ParmID parmId, TimeRange timeRange, WsId wsId) - throws DataAccessLayerException { - DatabaseQuery query = new DatabaseQuery(daoClass.getName()); - query.addQueryParam("startTime", timeRange.getStart().getTime()); - query.addQueryParam("endTime", timeRange.getEnd().getTime()); - query.addQueryParam("parmId", parmId); - List<Lock> locks = (List<Lock>) queryByCriteria(query); - - if (locks.isEmpty()) { - logger.info("No locks returned for -- ParmID: " + parmId - + " TimeRange: " + timeRange + " wsId: " + wsId); - return null; - } else if (locks.size() > 1) { - logger.info("Duplicate locks detected for -- ParmID: " + parmId - + " TimeRange: " + timeRange + " wsId: " + wsId); - return locks.get(0); - } else { - return locks.get(0); - } - } - /** * Gets locks for the provided list of ParmIDs. The locks are retrieved, * lock tables are constructed and assigned the provided workstation ID * * @param parmIds - * The ParmIDs to get the lock tables for + * The database ParmIDs to get the lock tables for * @param wsId * The workstation ID to assign to the lock tables * @return A map of the ParmID and its associated lock table @@ -150,77 +75,114 @@ public class GFELockDao extends CoreDao { * If errors occur during database interaction */ @SuppressWarnings("unchecked") - public Map<ParmID, LockTable> getLocks(List<ParmID> parmIds, WsId wsId) + public Map<ParmID, LockTable> getLocks(final List<ParmID> parmIds, WsId wsId) throws DataAccessLayerException { - // The return variable - Map<ParmID, LockTable> lockMap = new HashMap<ParmID, LockTable>(); - - // Variable to hold the results of the lock table query - List<Lock> queryResult = null; - // Return if no parmIDs are provided if (parmIds.isEmpty()) { return Collections.emptyMap(); } - DatabaseQuery query = new DatabaseQuery(daoClass.getName()); - query.addQueryParam("parmId", parmIds, QueryOperand.IN); - queryResult = (List<Lock>) queryByCriteria(query); + // The return variable + Map<ParmID, LockTable> lockMap = new HashMap<ParmID, LockTable>( + parmIds.size(), 1); - ParmID lockParmID = null; - for (Lock lock : queryResult) { - lockParmID = lock.getParmId(); - LockTable lockTable = lockMap.get(lockParmID); - if (lockTable == null) { - lockTable = new LockTable(lockParmID, new ArrayList<Lock>(), - wsId); - lockMap.put(lockParmID, lockTable); - } - lockTable.addLock(lock); + // create a blank lock table for each parmId ensuring all parms are + // covered + for (ParmID requiredParmId : parmIds) { + lockMap.put(requiredParmId, new LockTable(requiredParmId, + new ArrayList<Lock>(), wsId)); } - /* - * Do a check to make sure all required lock tables are present in the - * map - */ - if (parmIds != null) { + + Session sess = null; + Transaction tx = null; + + try { + sess = getHibernateTemplate().getSessionFactory().openSession(); + tx = sess.beginTransaction(); + + // reattach object so any parmIds found don't requery for (ParmID requiredParmId : parmIds) { - if (!lockMap.containsKey(requiredParmId)) { - lockMap.put(requiredParmId, new LockTable(requiredParmId, - new ArrayList<Lock>(0), wsId)); + sess.buildLockRequest(LockOptions.NONE).lock(requiredParmId); + } + + Query query = sess + .createQuery("FROM Lock WHERE parmId IN (:parmIds)"); + query.setParameterList("parmIds", parmIds); + List<Lock> locks = query.list(); + tx.commit(); + + // populate Lock table + for (Lock lock : locks) { + lockMap.get(lock.getParmId()).addLock(lock); + } + + return lockMap; + } catch (Exception e) { + if (tx != null) { + try { + tx.rollback(); + } catch (Exception e1) { + logger.error("Error occurred rolling back transaction", e1); + } + } + + throw new DataAccessLayerException( + "Unable to look up locks for parmIds " + parmIds, e); + } finally { + if (sess != null) { + try { + sess.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); } } } - return lockMap; } /** - * Updates additions and deletions to the lock table in a single transaction + * Adds and removes the passed locks. * * @param locksToDelete * The locks to delete * @param locksToAdd * The locks to add */ - public void updateCombinedLocks(Collection<Lock> locksToDelete, - Collection<Lock> locksToAdd) throws DataAccessLayerException { - if (!locksToDelete.isEmpty() || !locksToAdd.isEmpty()) { - Session s = this.getHibernateTemplate().getSessionFactory() - .openSession(); - Transaction tx = s.beginTransaction(); - try { + public void addRemoveLocks(final Collection<Lock> locksToAdd, + final Collection<Integer> locksToDelete) + throws DataAccessLayerException { + StatelessSession s = null; + Transaction tx = null; + + try { + s = this.getHibernateTemplate().getSessionFactory() + .openStatelessSession(); + tx = s.beginTransaction(); + + if (!CollectionUtil.isNullOrEmpty(locksToDelete)) { + Query q = s + .createQuery("DELETE FROM Lock WHERE id IN (:locksToDelete)"); + q.setParameterList("locksToDelete", locksToDelete); + q.executeUpdate(); + } + + if (!CollectionUtil.isNullOrEmpty(locksToAdd)) { for (Lock lock : locksToAdd) { - s.save(lock); + s.insert(lock); } - for (Lock lock : locksToDelete) { - s.delete(lock); - } - tx.commit(); - } catch (Throwable e) { - tx.rollback(); - throw new DataAccessLayerException("Error combining locks", e); - } finally { - if (s != null) { + } + + tx.commit(); + } catch (Throwable e) { + tx.rollback(); + throw new DataAccessLayerException("Error combining locks", e); + } finally { + if (s != null) { + try { s.close(); + } catch (Exception e) { + statusHandler.error( + "Error occurred closing database session", e); } } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendJob.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendJob.java index be3b678d6a..d14101ffab 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendJob.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendJob.java @@ -40,7 +40,6 @@ import com.raytheon.edex.plugin.gfe.server.GridParmManager; import com.raytheon.edex.plugin.gfe.util.SendNotifications; import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory; -import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse; import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridHistoryUpdateNotification; @@ -63,7 +62,8 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; * 07/06/09 1995 bphillip Initial release * 04/06/12 #457 dgilling Move call to delete records * from queue into run(). - * + * 04/23/13 #1949 rjpeter Move setting of lastSentTime to dao + * and removed initial delay. * </pre> * * @author bphillip @@ -78,14 +78,12 @@ public class IscSendJob implements Runnable { private static final SimpleDateFormat ISC_EXTRACT_DATE = new SimpleDateFormat( "yyyyMMdd_HHmm"); - private Map<String, IscSendScript> scripts; + private final Map<String, IscSendScript> scripts; private int runningTimeOutMillis; private int threadSleepInterval; - private int initialDelay; - /** * Constructs a new IscSendJob * @@ -98,14 +96,11 @@ public class IscSendJob implements Runnable { scripts = new HashMap<String, IscSendScript>(); runningTimeOutMillis = 300000; threadSleepInterval = 30000; - initialDelay = 120000; } @Override public void run() { - long curTime = System.currentTimeMillis(); - while ((!EDEXUtil.isRunning()) - || ((System.currentTimeMillis() - curTime) < initialDelay)) { + while (!EDEXUtil.isRunning()) { try { Thread.sleep(threadSleepInterval); } catch (Throwable t) { @@ -205,6 +200,7 @@ public class IscSendJob implements Runnable { } try { + // TODO: Interact with IFPGridDatabase GFEDao dao = (GFEDao) PluginFactory.getInstance().getPluginDao( "gfe"); @@ -216,31 +212,14 @@ public class IscSendJob implements Runnable { } WsId wsId = new WsId(InetAddress.getLocalHost(), "ISC", "ISC"); - List<TimeRange> inventory = sr.getPayload(); - List<TimeRange> overlapTimes = new ArrayList<TimeRange>(); - for (TimeRange range : inventory) { - if (tr.contains(range)) { - overlapTimes.add(range); - } - } - - List<GridHistoryUpdateNotification> notifications = new ArrayList<GridHistoryUpdateNotification>(); - List<GFERecord> records = dao.getRecords(id, overlapTimes); - for (GFERecord record : records) { - List<GridDataHistory> history = record.getGridHistory(); - Map<TimeRange, List<GridDataHistory>> historyMap = new HashMap<TimeRange, List<GridDataHistory>>(); - Date now = new Date(); - for (GridDataHistory hist : history) { - hist.setLastSentTime(now); - } - historyMap.put(record.getTimeRange(), history); - dao.saveOrUpdate(record); - notifications.add(new GridHistoryUpdateNotification(id, - historyMap, wsId, siteId)); - } + List<GridHistoryUpdateNotification> notifications = new ArrayList<GridHistoryUpdateNotification>( + 1); + Map<TimeRange, List<GridDataHistory>> histories = dao + .updateSentTime(id, tr, new Date()); + notifications.add(new GridHistoryUpdateNotification(id, + histories, wsId, siteId)); SendNotifications.send(notifications); - } catch (PluginException e) { statusHandler.error("Error creating GFE dao!", e); } catch (Exception e) { @@ -268,12 +247,4 @@ public class IscSendJob implements Runnable { public void setThreadSleepInterval(int threadSleepInterval) { this.threadSleepInterval = threadSleepInterval; } - - public int getInitialDelay() { - return initialDelay; - } - - public void setInitialDelay(int initialDelay) { - this.initialDelay = initialDelay; - } } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendRecord.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendRecord.java index e5fe9f47de..6978fd2431 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendRecord.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendRecord.java @@ -78,6 +78,7 @@ public class IscSendRecord implements IPersistableDataObject, Serializable, @GeneratedValue() private int key; + // TODO: Normalize with parmId table @DynamicSerializeElement @Column(nullable = false) @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.ParmIdType") @@ -143,7 +144,7 @@ public class IscSendRecord implements IPersistableDataObject, Serializable, */ @Override public IscSendRecord clone() throws CloneNotSupportedException { - IscSendRecord rval = new IscSendRecord(this.parmID.clone(), + IscSendRecord rval = new IscSendRecord(this.parmID, this.timeRange.clone(), this.xmlDest, this.state); rval.setInsertTime((Date) this.insertTime.clone()); return rval; diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrv.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrv.java index ab661b73f6..5e703ab8c9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrv.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrv.java @@ -52,7 +52,6 @@ public class SendIscSrv { IscSendJob thread = new IscSendJob(); thread.setRunningTimeOutMillis(cfg.getRunningTimeOutMillis()); thread.setThreadSleepInterval(cfg.getThreadSleepInterval()); - thread.setInitialDelay(cfg.getInitialDelay()); executor.execute(thread); } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrvConfig.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrvConfig.java index d1742dbfcb..92e62c3ef9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrvConfig.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/SendIscSrvConfig.java @@ -30,8 +30,8 @@ import java.util.concurrent.Executor; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Oct 20, 2011 dgilling Initial creation - * + * Oct 20, 2011 dgilling Initial creation + * Apr 30, 2013 1949 rjpeter Removed initial delay. * </pre> * * @author dgilling @@ -48,8 +48,6 @@ public class SendIscSrvConfig { protected int threadSleepInterval; - protected int initialDelay; - public int getThreads() { return threads; } @@ -81,12 +79,4 @@ public class SendIscSrvConfig { public void setThreadSleepInterval(int threadSleepInterval) { this.threadSleepInterval = threadSleepInterval; } - - public int getInitialDelay() { - return initialDelay; - } - - public void setInitialDelay(int initialDelay) { - this.initialDelay = initialDelay; - } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/paraminfo/GridParamInfoLookup.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/paraminfo/GridParamInfoLookup.java index 1ea469c431..7d69119707 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/paraminfo/GridParamInfoLookup.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/paraminfo/GridParamInfoLookup.java @@ -60,6 +60,7 @@ import com.raytheon.uf.common.util.mapping.MultipleMappingException; * extension. * Mar 20, 2013 #1774 randerso Added getModelInfo, * added Dflt if no levels specified + * Apr 30, 2013 1961 bsteffen Add ability to disable grib tables. * * </pre> * @@ -73,6 +74,12 @@ public class GridParamInfoLookup { /** The singleton instance */ private static GridParamInfoLookup instance; + /** + * Temporary boolean to enable or disable loading deprecated grib + * definitions + */ + private static boolean loadGribDefs = false; + /** Parameter information map */ private Map<String, GridParamInfo> modelParamMap; @@ -88,6 +95,17 @@ public class GridParamInfoLookup { return instance; } + public static synchronized boolean enableLoadGribDefs() { + GridParamInfoLookup.loadGribDefs = true; + if(instance != null){ + System.err.println("setLoadGribDefs was called too late."); + // this will trigger a complete reload. In testing it is never + // called too late, this is paranoia code. + instance = null; + } + return GridParamInfoLookup.loadGribDefs; + } + /** * Creates a new GribParamInfoLookup instance */ @@ -172,9 +190,16 @@ public class GridParamInfoLookup { private void init() { Unmarshaller um = null; try { - JAXBContext context = JAXBContext.newInstance(ParameterInfo.class, - GridParamInfo.class, GribParamInfo.class); - um = context.createUnmarshaller(); + if (loadGribDefs) { + JAXBContext context = JAXBContext.newInstance( + ParameterInfo.class, GridParamInfo.class, + GribParamInfo.class); + um = context.createUnmarshaller(); + } else { + JAXBContext context = JAXBContext.newInstance( + ParameterInfo.class, GridParamInfo.class); + um = context.createUnmarshaller(); + } } catch (JAXBException e) { statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); return; @@ -194,33 +219,41 @@ public class GridParamInfoLookup { if (!modelParamMap.containsKey(key)) { modelParamMap.put(key, paramInfo); } + if (paramInfo instanceof GribParamInfo) { + statusHandler.info("Loaded deprecated gribParamInfo for " + + key); + } } catch (JAXBException e) { statusHandler.handle(Priority.PROBLEM, "Error unmarshalling grid parameter information", e); } } + if (loadGribDefs) { + // Deprecated grib SITE level files. + files = pm.listFiles(pm.getContext(LocalizationType.EDEX_STATIC, + LocalizationLevel.SITE), "grib" + IPathManager.SEPARATOR + + "parameterInfo", new String[] { ".xml" }, true, true); + for (LocalizationFile file : files) { + statusHandler.info("Loading deprecated paramInfo file: " + + file.getFile()); + String name = file.getFile().getName().replace(".xml", ""); + // Do not override grid files. + if (modelParamMap.get(name) != null) { + continue; + } - // Deprecated grib SITE level files. - files = pm.listFiles(pm.getContext(LocalizationType.EDEX_STATIC, - LocalizationLevel.SITE), "grib" + IPathManager.SEPARATOR - + "parameterInfo", new String[] { ".xml" }, true, true); - for (LocalizationFile file : files) { - String name = file.getFile().getName().replace(".xml", ""); - // Do not override grid files. - if (modelParamMap.get(name) != null) { - continue; - } - - try { - GridParamInfo paramInfo = (GridParamInfo) um.unmarshal(file - .getFile()); - modelParamMap.put(name, paramInfo); - } catch (JAXBException e) { - statusHandler.handle(Priority.PROBLEM, - "Error unmarshalling grid parameter information", e); + try { + GridParamInfo paramInfo = (GridParamInfo) um.unmarshal(file + .getFile()); + modelParamMap.put(name, paramInfo); + } catch (JAXBException e) { + statusHandler + .handle(Priority.PROBLEM, + "Error unmarshalling grid parameter information", + e); + } } } - for (GridParamInfo gridParamInfo : modelParamMap.values()) { for (String parmName : gridParamInfo.getParmNames()) { ParameterInfo parameterInfo = gridParamInfo diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParm.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParm.java index 4cff93fdb1..60ef84650d 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParm.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParm.java @@ -31,12 +31,12 @@ import com.raytheon.edex.plugin.gfe.db.dao.GFEDao; import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase; import com.raytheon.edex.plugin.gfe.server.database.GridDatabase; import com.raytheon.edex.plugin.gfe.server.lock.LockManager; -import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints; +import com.raytheon.uf.common.dataplugin.gfe.server.lock.Lock; import com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable; import com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable.LockMode; import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse; @@ -50,7 +50,14 @@ import com.raytheon.uf.common.dataplugin.gfe.slice.DiscreteGridSlice; import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice; import com.raytheon.uf.common.dataplugin.gfe.slice.WeatherGridSlice; import com.raytheon.uf.common.message.WsId; +import com.raytheon.uf.common.status.IPerformanceStatusHandler; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.PerformanceStatus; +import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.time.TimeRange; +import com.raytheon.uf.common.time.util.ITimer; +import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.edex.database.plugin.PluginFactory; /** @@ -64,9 +71,10 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; * ------------ ---------- ----------- -------------------------- * 04/08/08 #875 bphillip Initial Creation * 06/17/08 #940 bphillip Implemented GFE Locking - * 02/10/13 #1603 randerso Returned number of records purged from timePurge - * 03/15/13 #1795 njensen Added updatePublishTime() - * + * 02/10/13 #1603 randerso Returned number of records purged from timePurge + * 03/15/13 #1795 njensen Added updatePublishTime() + * 04/23/13 #1949 rjpeter Removed excess validation on retrieval, added + * inventory for a given time range. * </pre> * * @author bphillip @@ -74,6 +82,13 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; */ public class GridParm { + // separate logger for GFE performance logging + private final IPerformanceStatusHandler perfLog = PerformanceStatus + .getHandler("GFE:"); + + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(GridParm.class); + /** The parm ID associated with this GridParm */ private ParmID id; @@ -120,6 +135,16 @@ public class GridParm { return db.getGridInventory(id); } + /** + * Returns the grid inventory for this parameter that overlaps the given + * timeRange + * + * @return The server response containing the grid inventory + */ + public ServerResponse<List<TimeRange>> getGridInventory(TimeRange tr) { + return db.getGridInventory(id, tr); + } + /** * Returns the grid history for this parameter and specified grids through * history. Returns the status @@ -133,12 +158,6 @@ public class GridParm { return db.getGridHistory(id, trs); } - @Deprecated - public ServerResponse<?> updateGridHistory( - Map<TimeRange, List<GridDataHistory>> history) { - return db.updateGridHistory(id, history); - } - /** * Updates the publish times in the database of all provided * GridDataHistories. Does not alter the publish times in memory. @@ -228,8 +247,13 @@ public class GridParm { } // validate the data + ITimer timer = TimeUtil.getTimer(); + timer.start(); sr.addMessages(recordsOkay(saveRequest.getGridSlices(), - new ArrayList<TimeRange>())); + new ArrayList<TimeRange>(0))); + timer.stop(); + perfLog.logDuration("Validating " + saveRequest.getGridSlices().size() + + " grids for saving", timer.getElapsedTime()); if (!sr.isOkay()) { return sr; } @@ -286,45 +310,20 @@ public class GridParm { // Get current inventory List<TimeRange> reqTimes = getRequest.getTimes(); - // TODO do we really need this time range check? it's not worth much - // njensen made it only work on non-D2D databases since - // it was slowing down smart init - if (!id.getDbId().getDbType().equals("D2D")) { - List<TimeRange> trs = null; - ServerResponse<List<TimeRange>> ssr = getGridInventory(); - trs = ssr.getPayload(); - sr.addMessages(ssr); + if (!CollectionUtil.isNullOrEmpty(reqTimes)) { + // Get the data + if (getRequest.isConvertUnit() && (db instanceof D2DGridDatabase)) { + sr = ((D2DGridDatabase) db).getGridData(id, reqTimes, + getRequest.isConvertUnit()); + } else { + sr = db.getGridData(id, reqTimes); + } if (!sr.isOkay()) { - sr.addMessage("Cannot get grid data with the get inventory failure"); + sr.addMessage("Failure in retrieving grid data from GridDatabase"); return sr; } - // Ensure that all requested time ranges are in the inventory - if (!trs.containsAll(reqTimes)) { - sr.addMessage("Some of the requested time ranges are not in the inventory." - + " Inv: " - + trs - + " requestTimes: " - + getRequest.getTimes()); - return sr; - } - } - - // Get the data - if (getRequest.isConvertUnit() && (db instanceof D2DGridDatabase)) { - sr = ((D2DGridDatabase) db).getGridData(id, reqTimes, - getRequest.isConvertUnit()); } else { - sr = db.getGridData(id, reqTimes); - } - if (!sr.isOkay()) { - sr.addMessage("Failure in retrieving grid data from GridDatabase"); - return sr; - } - - // Validate the data - sr.addMessages(dataOkay(sr.getPayload(), badDataTimes)); - if (!sr.isOkay()) { - sr.addMessage("Cannot get grid data - data is not valid"); + sr.setPayload(new ArrayList<IGridSlice>(0)); } return sr; @@ -374,52 +373,49 @@ public class GridParm { // Get the lock table WsId wsId = new WsId(null, "timePurge", "EDEX"); - List<LockTable> lts = new ArrayList<LockTable>(); + List<LockTable> lts = new ArrayList<LockTable>(0); LockTableRequest lockreq = new LockTableRequest(this.id); ServerResponse<List<LockTable>> ssr2 = LockManager.getInstance() .getLockTables(lockreq, wsId, siteID); sr.addMessages(ssr2); lts = ssr2.getPayload(); - if (!sr.isOkay() || lts.size() != 1) { + if (!sr.isOkay() || (lts.size() != 1)) { sr.addMessage("Cannot timePurge since getting lock table failed"); } List<TimeRange> breakList = new ArrayList<TimeRange>(); List<TimeRange> noBreak = new ArrayList<TimeRange>(); - for (int i = 0; i < lts.get(0).getLocks().size(); i++) { - if (lts.get(0).getLocks().get(i).getTimeRange().getEnd() - .before(purgeTime) - || lts.get(0).getLocks().get(i).getTimeRange().getEnd() - .equals(purgeTime)) { - breakList.add(lts.get(0).getLocks().get(i).getTimeRange()); + LockTable myLockTable = lts.get(0); + for (Lock lock : myLockTable.getLocks()) { + if (lock.getEndTime() < purgeTime.getTime()) { + breakList.add(lock.getTimeRange()); } else { - noBreak.add(lts.get(0).getLocks().get(i).getTimeRange()); + noBreak.add(lock.getTimeRange()); } } List<TimeRange> purge = new ArrayList<TimeRange>(); - for (int i = 0; i < trs.size(); i++) { - if (trs.get(i).getEnd().before(purgeTime) - || trs.get(i).getEnd().equals(purgeTime)) { + for (TimeRange tr : trs) { + if (tr.getEnd().getTime() <= purgeTime.getTime()) { boolean found = false; - for (int j = 0; j < noBreak.size(); j++) { - if (noBreak.get(j).contains(trs.get(i))) { + for (TimeRange noBreakTr : noBreak) { + if (noBreakTr.contains(tr)) { found = true; break; } } if (!found) { - purge.add(trs.get(i)); + purge.add(tr); } } } List<LockRequest> lreqs = new ArrayList<LockRequest>(); List<LockTable> ltChanged = new ArrayList<LockTable>(); - for (int i = 0; i < breakList.size(); i++) { - lreqs.add(new LockRequest(id, breakList.get(i), LockMode.BREAK_LOCK)); + for (TimeRange tr : breakList) { + lreqs.add(new LockRequest(id, tr, LockMode.BREAK_LOCK)); } ServerResponse<List<LockTable>> lockResponse = LockManager @@ -434,25 +430,24 @@ public class GridParm { for (int i = 0; i < ltChanged.size(); i++) { lockNotifications .add(new LockNotification(ltChanged.get(i), siteID)); - // gridNotifications.add(new GridUpdateNotification(id, breakList - // .get(i), Arrays.asList, "")); } GFEDao dao = null; try { dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); - } catch (PluginException e) { - sr.addMessage("Unable to get gfe dao"); - } - dao.deleteRecords(id, purge); - for (int i = 0; i < purge.size(); i++) { - // assemble the GridUpdateNotification + dao.deleteRecords(id, purge); Map<TimeRange, List<GridDataHistory>> histories = new HashMap<TimeRange, List<GridDataHistory>>( 0); - gridNotifications.add(new GridUpdateNotification(id, purge.get(i), - histories, wsId, siteID)); + for (TimeRange tr : purge) { + // assemble the GridUpdateNotification + gridNotifications.add(new GridUpdateNotification(id, tr, + histories, wsId, siteID)); + } + sr.setPayload(new Integer(purge.size())); + } catch (Exception e) { + sr.addMessage("Failed to delete records for timePurge"); + statusHandler.error("Failed to delete records for timePurge", e); } - sr.setPayload(new Integer(purge.size())); return sr; } @@ -469,20 +464,6 @@ public class GridParm { return "ParmID: " + id; } - private ServerResponse<?> dataOkay(List<IGridSlice> gridSlices, - List<TimeRange> badDataTimes) { - - ServerResponse<?> sr = new ServerResponse<String>(); - for (IGridSlice slice : gridSlices) { - ServerResponse<?> sr1 = gridSliceOkay(slice); - sr.addMessages(sr1); - if (!sr1.isOkay()) { - badDataTimes.add(slice.getValidTime()); - } - } - return sr; - } - /** * Checks the data to ensure that it is valid. If there is a bad data slice, * then place the valid time of that grid in the badDataTimes entry. @@ -582,7 +563,7 @@ public class GridParm { .getLockTables(req, requestor, siteID); lockTables = ssr.getPayload(); sr.addMessages(ssr); - if (!sr.isOkay() || lockTables.size() != 1) { + if (!sr.isOkay() || (lockTables.size() != 1)) { sr.addMessage("Cannot verify locks due to problem with Lock Manager"); return sr; diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java index 5c447f51a7..53e5cc9059 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java @@ -69,6 +69,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.TimeRange; import com.raytheon.uf.common.time.util.ITimer; import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.database.plugin.PluginFactory; import com.raytheon.uf.edex.database.purge.PurgeLogger; @@ -89,11 +90,11 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger; * fixed a purge inefficiency, * fixed error which caused D2D purging to remove * smartInit hdf5 data - * 03/07/13 #1773 njensen Logged commitGrid() times - * 03/15/13 #1795 njensen Sped up commitGrid() - * 03/20/2013 #1774 randerso Removed dead method, changed to use new + * 03/07/13 #1773 njensen Logged commitGrid() times + * 03/15/13 #1795 njensen Sped up commitGrid() + * 03/20/2013 #1774 randerso Removed dead method, changed to use new * D2DGridDatabase constructor - * + * 04/23/2013 #1949 rjpeter Added inventory retrieval for a given time range. * </pre> * * @author bphillip @@ -174,6 +175,39 @@ public class GridParmManager { return sr; } + /** + * Returns the grid inventory overlapping timeRange for the parmId. Returns + * the status. Calls gridParm() to look up the parameter. If not found, + * returns the appropriate error. Calls the grid parm's getGridInventory() + * to obtain the inventory. + * + * @param parmId + * The parmID to get the inventory for + * @param timeRange + * The timeRange to get the inventory for + * @return The server response + */ + public static ServerResponse<List<TimeRange>> getGridInventory( + ParmID parmId, TimeRange timeRange) { + + ServerResponse<List<TimeRange>> sr = new ServerResponse<List<TimeRange>>(); + try { + GridParm gp = gridParm(parmId); + if (gp.isValid()) { + sr = gp.getGridInventory(timeRange); + } else { + sr.addMessage("Unknown Parm: " + parmId + + " in getGridInventory()"); + } + } catch (Exception e) { + sr.addMessage("Unknown Parm: " + parmId + " in getGridInventory()"); + logger.error("Unknown Parm: " + parmId + " in getGridInventory()", + e); + } + + return sr; + } + /** * Returns the grid history through "history" for the parmId and specified * grids. Returns the status. @@ -485,6 +519,9 @@ public class GridParmManager { continue; } + // TODO: No need to get inventory and then compare for history + // times, just request the history times directly + // get the source data inventory inventoryTimer.start(); ServerResponse<List<TimeRange>> invSr = sourceGP.getGridInventory(); @@ -543,14 +580,14 @@ public class GridParmManager { // if update time is less than publish time, grid has not // changed since last published, therefore only update // history, do not publish - if (gdh.getPublishTime() == null + if ((gdh.getPublishTime() == null) || (gdh.getUpdateTime().getTime() > gdh .getPublishTime().getTime()) // in service backup, times on srcHistory could // appear as not needing a publish, even though // dest data does not exist - || currentDestHistory.get(tr) == null - || currentDestHistory.get(tr).size() == 0) { + || (currentDestHistory.get(tr) == null) + || (currentDestHistory.get(tr).size() == 0)) { doPublish = true; } } @@ -778,11 +815,18 @@ public class GridParmManager { public static ServerResponse<List<DatabaseID>> getDbInventory(String siteID) { ServerResponse<List<DatabaseID>> sr = new ServerResponse<List<DatabaseID>>(); List<DatabaseID> databases = new ArrayList<DatabaseID>(); - - List<DatabaseID> gfeDbs = gfeDao.getDatabaseInventory(); + List<DatabaseID> gfeDbs = null; List<DatabaseID> singletons = null; List<DatabaseID> d2dDbs = null; + try { + gfeDbs = gfeDao.getDatabaseInventory(siteID); + } catch (DataAccessLayerException e) { + sr.addMessage("Unable to get IFP databases for site: " + siteID); + logger.error("Unable to get IFP databases for site: " + siteID, e); + return sr; + } + d2dDbs = D2DParmIdCache.getInstance().getDatabaseIDs(); try { @@ -793,6 +837,7 @@ public class GridParmManager { logger.error("Unable to get singleton databases", e); return sr; } + if (singletons != null) { for (DatabaseID singleton : singletons) { if (singleton.getSiteId().equals(siteID)) { @@ -800,11 +845,13 @@ public class GridParmManager { } } } + for (DatabaseID dbId : gfeDbs) { - if (!databases.contains(dbId) && dbId.getSiteId().equals(siteID)) { + if (!databases.contains(dbId)) { databases.add(dbId); } } + if (d2dDbs != null) { for (DatabaseID d2d : d2dDbs) { if (d2d.getSiteId().equals(siteID)) { @@ -815,9 +862,7 @@ public class GridParmManager { DatabaseID topoDbId = TopoDatabaseManager.getTopoDbId(siteID); databases.add(topoDbId); - databases.addAll(NetCDFDatabaseManager.getDatabaseIds(siteID)); - sr.setPayload(databases); return sr; } @@ -994,7 +1039,7 @@ public class GridParmManager { // process the id and determine whether it should be purged count++; - if (count > desiredVersions + if ((count > desiredVersions) && !dbId.getModelTime().equals(DatabaseID.NO_MODEL_TIME)) { deallocateDb(dbId, true); PurgeLogger.logInfo("Purging " + dbId, "gfe"); @@ -1114,7 +1159,7 @@ public class GridParmManager { * Validate the database ID. Throws an exception if the database ID is * invalid */ - if (!dbId.isValid() || dbId.getFormat() != DatabaseID.DataType.GRID) { + if (!dbId.isValid() || (dbId.getFormat() != DatabaseID.DataType.GRID)) { throw new GfeException( "Database id " + dbId @@ -1192,15 +1237,11 @@ public class GridParmManager { } public static void purgeDbCache(String siteID) { - List<DatabaseID> toRemove = new ArrayList<DatabaseID>(); for (DatabaseID dbId : dbMap.keySet()) { if (dbId.getSiteId().equals(siteID)) { - toRemove.add(dbId); + removeDbFromMap(dbId); } } - for (DatabaseID dbId : toRemove) { - removeDbFromMap(dbId); - } } private static ServerResponse<GridDatabase> getOfficialDB( diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java index b9076247f2..9abe650305 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.ListIterator; import java.util.Map; import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory; @@ -72,8 +73,9 @@ import com.raytheon.uf.common.time.TimeRange; * in the gfeBaseDataDir. * 02/10/13 #1603 randerso Moved removeFromDb, removeFromHDF5 and deleteModelHDF5 * methods down to IFPGridDatabase - * 03/15/13 #1795 njensen Added updatePublishTime() - * + * 03/15/13 #1795 njensen Added updatePublishTime() + * 04/23/13 #1949 rjpeter Added default implementations of history by time range + * and cachedParmId * </pre> * * @author bphillip @@ -348,6 +350,29 @@ public abstract class GridDatabase { */ public abstract ServerResponse<List<TimeRange>> getGridInventory(ParmID id); + /** + * Gets the inventory of time ranges currently for the specified ParmID that + * overlap the given time range. + * + * @param id + * The parmID to get the inventory for + * @return The server response + */ + public ServerResponse<List<TimeRange>> getGridInventory(ParmID id, + TimeRange tr) { + // default to prior behavior with removing the extra inventories + ServerResponse<List<TimeRange>> sr = getGridInventory(id); + List<TimeRange> trs = sr.getPayload(); + ListIterator<TimeRange> iter = trs.listIterator(trs.size()); + while (iter.hasPrevious()) { + TimeRange curTr = iter.previous(); + if (!curTr.overlaps(tr)) { + iter.remove(); + } + } + return sr; + } + /** * Retrieves a sequence gridSlices from the database based on the specified * parameters and stores them in the data parameter. TimeRanges of the grids @@ -438,12 +463,6 @@ public abstract class GridDatabase { + this.getClass().getName()); } - public ServerResponse<?> updateGridHistory(ParmID parmId, - Map<TimeRange, List<GridDataHistory>> history) { - throw new UnsupportedOperationException("Not implemented for class " - + this.getClass().getName()); - } - /** * Updates the publish times in the database of all provided * GridDataHistories. Does not alter the publish times in memory. @@ -469,4 +488,16 @@ public abstract class GridDatabase { } public abstract void updateDbs(); + + /** + * Return the internally cache'd parmID for this database implementation. + * + * @param parmID + * @return + * @throws GfeException + * If the parm does not exist for this database. + */ + public ParmID getCachedParmID(ParmID parmID) throws GfeException { + return parmID; + } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java index d33b9c7d17..6ac5804b42 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java @@ -27,17 +27,16 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.regex.Pattern; import javax.measure.converter.UnitConverter; import javax.measure.unit.Unit; -import org.springframework.dao.DataAccessException; - -import com.raytheon.edex.plugin.gfe.cache.ifpparms.IFPParmIdCache; import com.raytheon.edex.plugin.gfe.config.GridDbConfig; import com.raytheon.edex.plugin.gfe.config.IFPServerConfig; import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager; @@ -58,6 +57,7 @@ import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints; import com.raytheon.uf.common.dataplugin.gfe.discrete.DiscreteKey; import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException; +import com.raytheon.uf.common.dataplugin.gfe.exception.UnknownParmIdException; import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DByte; import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat; import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse; @@ -96,7 +96,9 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; import com.vividsolutions.jts.geom.Coordinate; /** - * GFE Grid database containing IFP Grid data. + * GFE Grid database containing IFP Grid data. All public methods that take a + * ParmID or DatabaseID must first look up the corresponding version from the + * database for use with calling private and dao methods. * * <pre> * SOFTWARE HISTORY @@ -115,7 +117,7 @@ import com.vividsolutions.jts.geom.Coordinate; * 03/07/13 #1737 njensen Logged getGridData times * 03/15/13 #1795 njensen Added updatePublishTime() * 03/20/13 #1774 randerso Cleanup code to use proper constructors - * + * 04/08/13 #1949 rjpeter Updated to work with normalized database. * </pre> * * @author bphillip @@ -150,17 +152,11 @@ public class IFPGridDatabase extends GridDatabase { private final Map<String, ParmStorageInfo> parmStorageInfo = new HashMap<String, ParmStorageInfo>(); + private final Map<String, ParmID> parmIdMap = new HashMap<String, ParmID>(); + /** The grid configuration for this database */ protected GridDbConfig gridConfig; - /** - * Creates a new IFPGridDatabase - */ - public IFPGridDatabase() { - super(); - valid = false; - } - /** * Creates a new IFPGridDatabase * @@ -171,8 +167,7 @@ public class IFPGridDatabase extends GridDatabase { super(dbId); try { this.gridConfig = IFPServerConfigManager.getServerConfig( - dbId.getSiteId()).gridDbConfig( - new DatabaseID(dbId.toString().replace("D2D", ""))); + dbId.getSiteId()).gridDbConfig(dbId); if (this.gridConfig == null) { throw new GfeException( "Server config contains no gridDbConfig for database " @@ -183,6 +178,20 @@ public class IFPGridDatabase extends GridDatabase { statusHandler.handle(Priority.PROBLEM, "Unable to get gridConfig for: " + dbId, e); } + + if (valid) { + try { + // lookup actual database id row from database + // if it doesn't exist, it will be created at this point + GFEDao dao = new GFEDao(); + this.dbId = dao.getDatabaseId(dbId); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Unable to look up database id for ifp database: " + + dbId, e); + valid = false; + } + } } /** @@ -223,6 +232,22 @@ public class IFPGridDatabase extends GridDatabase { // accommodate changes changeParmCharacteristics(toBeChangedParms, parmInfoUser, parmStorageInfoUser); + + // verify current parms are still in database - can be removed once + // gridParamInfo is in database + try { + GFEDao dao = new GFEDao(); + for (String item : parmInfo.keySet()) { + if (!parmIdMap.containsKey(item)) { + String[] nameLevel = splitNameAndLevel(item); + ParmID parmId = new ParmID(nameLevel[0], dbId, nameLevel[1]); + parmIdMap.put(item, dao.getParmId(parmId)); + } + } + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Error getting db configuration for " + this.dbId, e); + } } private void addNewParms(List<String> newParms, @@ -233,10 +258,15 @@ public class IFPGridDatabase extends GridDatabase { } statusHandler.handle(Priority.INFO, "Creating new weather elements..."); try { - List<GridParmInfo> gpis = new ArrayList<GridParmInfo>(); - List<ParmStorageInfo> psis = new ArrayList<ParmStorageInfo>(); - for (int i = 0; i < newParms.size(); i++) { - String item = newParms.get(i); + List<GridParmInfo> gpis = new ArrayList<GridParmInfo>( + newParms.size()); + List<ParmStorageInfo> psis = new ArrayList<ParmStorageInfo>( + newParms.size()); + GFEDao dao = new GFEDao(); + for (String item : newParms) { + String[] nameLevel = splitNameAndLevel(item); + ParmID parmId = new ParmID(nameLevel[0], dbId, nameLevel[1]); + parmIdMap.put(item, dao.getParmId(parmId)); statusHandler.handle(Priority.INFO, "Adding: " + item + " to the " + this.dbId + " database."); gpis.add(parmInfoUser.get(item)); @@ -395,33 +425,27 @@ public class IFPGridDatabase extends GridDatabase { */ private void changeMinMaxValues(String compositeName, GridParmInfo newGPI, ParmStorageInfo newPSI) { - GFEDao dao = null; // Make sure the specified parm is of type Scalar or Vector GridType gridType = newGPI.getGridType(); if (!(gridType.equals(GridType.SCALAR) || gridType .equals(GridType.VECTOR))) { return; } - ParmID parmId = new ParmID(this.splitNameAndLevel(compositeName)[0], - this.dbId); - try { - dao = new GFEDao(); - } catch (PluginException e) { - statusHandler - .handle(Priority.PROBLEM, - "Error changing min/max values. Unable to instantiate GFE dao", - e); - return; - } + + ParmID parmId = null; List<GFERecord> records = null; + try { + parmId = getCachedParmID(compositeName); + GFEDao dao = new GFEDao(); records = dao.queryByParmID(parmId); - } catch (DataAccessLayerException e) { + } catch (Exception e) { statusHandler.handle(Priority.PROBLEM, "Error changing min/max values. Error querying GFE table", e); return; } + List<GFERecord> updatedRecords = new ArrayList<GFERecord>(); for (GFERecord rec : records) { switch (gridType) { @@ -518,7 +542,7 @@ public class IFPGridDatabase extends GridDatabase { TimeConstraints timeConstraints) { List<String> puntList = new ArrayList<String>(); puntList.add(compositeName); - this.removeOldParms(puntList); + this.removeOldParmData(puntList); } /** @@ -558,34 +582,33 @@ public class IFPGridDatabase extends GridDatabase { this.splitNameAndLevel(compositeName)[0], this.dbId); dao = new GFEDao(); List<GFERecord> records = dao.queryByParmID(parmId); - List<GFERecord> updatedRecords = new ArrayList<GFERecord>(); - for (GFERecord rec : records) { - switch (gridType) { - case SCALAR: - FloatDataRecord scalarRecord = this.retrieveFromHDF5( - parmId, rec.getTimeRange()); - float[] convertedScalarData = this.convertData( - this.parmInfo.get(compositeName).getUnitObject(), - gpi.getUnitObject(), scalarRecord.getFloatData()); - scalarRecord.setFloatData(convertedScalarData); - rec.setMessageData(scalarRecord); - updatedRecords.add(rec); - break; - case VECTOR: - FloatDataRecord[] vectorRecord = this - .retrieveVectorFromHDF5(parmId, rec.getTimeRange()); - float[] convertedVectorData = this - .convertData(this.parmInfo.get(compositeName) - .getUnitObject(), gpi.getUnitObject(), - vectorRecord[0].getFloatData()); - vectorRecord[0].setFloatData(convertedVectorData); - rec.setMessageData(vectorRecord); - updatedRecords.add(rec); - break; + if (!records.isEmpty()) { + for (GFERecord rec : records) { + switch (gridType) { + case SCALAR: + FloatDataRecord scalarRecord = this.retrieveFromHDF5( + parmId, rec.getTimeRange()); + float[] convertedScalarData = this.convertData( + this.parmInfo.get(compositeName) + .getUnitObject(), gpi.getUnitObject(), + scalarRecord.getFloatData()); + scalarRecord.setFloatData(convertedScalarData); + rec.setMessageData(scalarRecord); + break; + case VECTOR: + FloatDataRecord[] vectorRecord = this + .retrieveVectorFromHDF5(parmId, + rec.getTimeRange()); + float[] convertedVectorData = this.convertData( + this.parmInfo.get(compositeName) + .getUnitObject(), gpi.getUnitObject(), + vectorRecord[0].getFloatData()); + vectorRecord[0].setFloatData(convertedVectorData); + rec.setMessageData(vectorRecord); + break; + } } - } - if (!updatedRecords.isEmpty()) { - this.saveGridsToHdf5(updatedRecords); + this.saveGridsToHdf5(records); } } catch (Exception e) { statusHandler.handle(Priority.PROBLEM, "Error changing units", e); @@ -642,7 +665,7 @@ public class IFPGridDatabase extends GridDatabase { ParmStorageInfo newPSI) { List<String> entries = new ArrayList<String>(); entries.add(compositeName); - removeOldParms(entries); + removeOldParmData(entries); updateParmAttributes(compositeName, newGPI, newPSI); this.parmInfo.put(compositeName, newGPI); this.parmStorageInfo.put(compositeName, newPSI); @@ -667,24 +690,54 @@ public class IFPGridDatabase extends GridDatabase { } /** - * Removes the data in the database and HDF5 repository for the list of - * parms + * Removes the parm in the database and HDF5 repository for the list of + * parms. * - * @param puntList + * @param parms * The list of parms to delete */ - private void removeOldParms(List<String> puntList) { + private void removeOldParms(List<String> parms) { try { GFEDao dao = new GFEDao(); - // Remove the grids - String item = null; - for (int i = 0; i < puntList.size(); i++) { - item = puntList.get(i); + for (String item : parms) { statusHandler.handle(Priority.INFO, "Removing: " + item + " from the " + this.dbId + " database."); try { - dao.removeOldParm(item, this.dbId); + // Remove the entire data structure for the parm + dao.removeParm(parmIdMap.get(item)); + parmIdMap.remove(item); + this.parmInfo.remove(item); + this.parmStorageInfo.remove(item); + } catch (DataAccessLayerException e) { + statusHandler.handle(Priority.PROBLEM, "Error removing: " + + item + " from the database"); + } + } + } catch (PluginException e) { + statusHandler.handle(Priority.PROBLEM, "Error removing old parms!", + e); + } + + } + + /** + * Removes the data in the database and HDF5 repository for the list of + * parms. + * + * @param parms + * The list of parms to delete + */ + private void removeOldParmData(List<String> parms) { + + try { + GFEDao dao = new GFEDao(); + for (String item : parms) { + statusHandler.handle(Priority.INFO, "Removing: " + item + + " from the " + this.dbId + " database."); + try { + // Remove the grids for the parm + dao.removeParmData(parmIdMap.get(item)); this.parmInfo.remove(item); this.parmStorageInfo.remove(item); } catch (DataAccessLayerException e) { @@ -701,13 +754,8 @@ public class IFPGridDatabase extends GridDatabase { @Override public ServerResponse<List<ParmID>> getParmList() { - List<ParmID> parmIds = new ArrayList<ParmID>(); + List<ParmID> parmIds = new ArrayList<ParmID>(parmIdMap.values()); ServerResponse<List<ParmID>> sr = new ServerResponse<List<ParmID>>(); - - // Construct ParmIDs for each entry in the grid info dictionary - if (gridConfig != null) { - parmIds = IFPParmIdCache.getInstance().getParmIds(gridConfig, dbId); - } sr.setPayload(parmIds); return sr; } @@ -715,21 +763,36 @@ public class IFPGridDatabase extends GridDatabase { @Override public ServerResponse<List<TimeRange>> getGridInventory(ParmID id) { - List<TimeRange> trs = new ArrayList<TimeRange>(); ServerResponse<List<TimeRange>> sr = new ServerResponse<List<TimeRange>>(); GFEDao dao = null; try { dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); - } catch (PluginException e1) { - statusHandler.handle(Priority.PROBLEM, "Unable to get gfe dao", e1); - } - try { - trs.addAll(dao.getTimes(id)); - } catch (DataAccessLayerException e) { + sr.setPayload(dao.getTimes(getCachedParmID(id))); + } catch (Exception e) { + sr.setPayload(new ArrayList<TimeRange>(0)); + statusHandler.handle(Priority.PROBLEM, "Unable to get times for: " + + id.getParmName() + "_" + id.getParmLevel(), e); + sr.addMessage("Unable to get times for: " + id.getParmName() + "_" + + id.getParmLevel()); + } + return sr; + } + + @Override + public ServerResponse<List<TimeRange>> getGridInventory(ParmID id, + TimeRange tr) { + ServerResponse<List<TimeRange>> sr = new ServerResponse<List<TimeRange>>(); + GFEDao dao = null; + try { + dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); + sr.setPayload(dao.getOverlappingTimes(getCachedParmID(id), tr)); + } catch (Exception e) { + sr.setPayload(new ArrayList<TimeRange>(0)); + statusHandler.handle(Priority.PROBLEM, "Unable to get times for: " + + id.getParmName() + "_" + id.getParmLevel(), e); sr.addMessage("Unable to get times for: " + id.getParmName() + "_" + id.getParmLevel()); } - sr.setPayload(trs); return sr; } @@ -740,19 +803,18 @@ public class IFPGridDatabase extends GridDatabase { GFEDao dao = null; try { dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); - } catch (PluginException e1) { - statusHandler.handle(Priority.PROBLEM, "Unable to get gfe dao", e1); - } - - try { Map<TimeRange, List<GridDataHistory>> history = dao.getGridHistory( - id, trs); + getCachedParmID(id), trs); sr.setPayload(history); } catch (DataAccessLayerException e) { sr.addMessage("Error getting grid history for: " + id + "\n" + e.getLocalizedMessage()); statusHandler.handle(Priority.PROBLEM, "Error getting grid history for: " + id, e); + } catch (PluginException e) { + statusHandler.handle(Priority.PROBLEM, "Unable to get gfe dao", e); + } catch (UnknownParmIdException e) { + statusHandler.handle(Priority.PROBLEM, "Unknown parmId: " + id, e); } return sr; @@ -786,8 +848,17 @@ public class IFPGridDatabase extends GridDatabase { public ServerResponse<?> saveGridData(ParmID id, TimeRange originalTimeRange, List<GFERecord> records, WsId requesterId) { - return this.saveGridData(id, originalTimeRange, records, requesterId, - null); + ServerResponse<?> sr = new ServerResponse<String>(); + ParmID dbParmId = null; + try { + dbParmId = getCachedParmID(id); + } catch (UnknownParmIdException e) { + sr.addMessage(e.getLocalizedMessage()); + return sr; + } + + return this.saveGridData(dbParmId, originalTimeRange, records, + requesterId, null); } /** @@ -805,115 +876,185 @@ public class IFPGridDatabase extends GridDatabase { * timeInfo array. Write the new timeInfo array to the database and return. * * @param id - * The parm ID to save + * The database parm ID to save * @param originalTimeRange * The time range to save * @param records - * The records to save + * The records to save, records are not db records at this point. * @param requesterId * who requested to save the grids * @param skipDelete * time ranges to not delete * @return The server response */ - public ServerResponse<?> saveGridData(ParmID id, - TimeRange originalTimeRange, List<GFERecord> records, + private ServerResponse<?> saveGridData(ParmID id, + TimeRange originalTimeRange, List<GFERecord> recordsToSave, WsId requesterId, List<TimeRange> skipDelete) { - ServerResponse<?> sr = dbIsValid(); if (!sr.isOkay()) { return sr; } - sr.addMessages(validGridTimes(records, originalTimeRange)); - if (!sr.isOkay()) { + long t0 = System.currentTimeMillis(); + GFEDao dao = null; + Map<TimeRange, GFERecord> existingMap = null; + + try { + dao = new GFEDao(); + + // Grab the current records for the general time range in question + existingMap = dao.getOverlappingRecords(id, originalTimeRange); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Unable to lookup existing GFE Records", e); + sr.addMessage("Unable to lookup existing GFE Records. Data not saved"); return sr; } - long t0 = System.currentTimeMillis(); - records = consolidateWithExisting(id, records); - // Figure out where the grids fit into the current inventory - List<TimeRange> timeInfo = getGridInventory(id).getPayload(); - List<TimeRange> newTimes = new ArrayList<TimeRange>(records.size()); - Map<TimeRange, List<GridDataHistory>> histories = new HashMap<TimeRange, List<GridDataHistory>>( - (int) (records.size() * 1.25) + 1); - for (GFERecord rec : records) { - newTimes.add(rec.getTimeRange()); - histories.put(rec.getTimeRange(), rec.getGridHistory()); - } - - // don't delete if record already exists - timeInfo.removeAll(newTimes); - if (skipDelete != null) { - timeInfo.removeAll(skipDelete); - } - List<GFERecord> gridsToRemove = new ArrayList<GFERecord>(); - for (TimeRange time : timeInfo) { - if (time.overlaps(originalTimeRange)) { - gridsToRemove.add(new GFERecord(id, time)); - } - } long t1 = System.currentTimeMillis(); - perfLog.logDuration("Consolidating grids", (t1 - t0)); + perfLog.logDuration("Save: Retrieve overlapping grids", (t1 - t0)); - if (!gridsToRemove.isEmpty()) { - for (GFERecord toRemove : gridsToRemove) { - removeFromDb(toRemove); - removeFromHDF5(toRemove); + // Determine records/times to delete + Set<TimeRange> timesToDelete = new HashSet<TimeRange>( + existingMap.keySet()); + if (skipDelete != null) { + timesToDelete.removeAll(skipDelete); + } + + for (GFERecord recToSave : recordsToSave) { + timesToDelete.remove(recToSave.getTimeRange()); + } + + if (!timesToDelete.isEmpty()) { + try { + List<GFERecord> recsToDelete = new ArrayList<GFERecord>( + timesToDelete.size()); + for (TimeRange timeToRemove : timesToDelete) { + recsToDelete.add(existingMap.get(timeToRemove)); + } + + dao.deleteRecords(recsToDelete); + removeFromHDF5(id, new ArrayList<TimeRange>(timesToDelete)); + existingMap.keySet().removeAll(timesToDelete); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Unable to delete existing GFE Records", e); + sr.addMessage("Unable to delete existing GFE Records. Data not saved"); + return sr; } } + long t2 = System.currentTimeMillis(); - perfLog.logDuration("Removing " + gridsToRemove.size() + perfLog.logDuration("Save: Removing " + timesToDelete.size() + " existing grids", (t2 - t1)); + // begin consolidation of new vs update + List<TimeRange> timesToBeSaved = new ArrayList<TimeRange>( + recordsToSave.size()); + for (GFERecord recToSave : recordsToSave) { + timesToBeSaved.add(recToSave.getTimeRange()); + } + + // theoretically shouldn't be needed, but skipDelete list requires it + // since the delete list may have differed + existingMap.keySet().retainAll(timesToBeSaved); + List<GFERecord> newRecords = new ArrayList<GFERecord>( + timesToBeSaved.size() - existingMap.size()); + + // track merge with existing records or add to new list + for (GFERecord recToSave : recordsToSave) { + TimeRange tr = recToSave.getTimeRange(); + GFERecord existing = existingMap.get(tr); + if (existing != null) { + existing.setMessageData(recToSave.getMessageData()); + existing.consolidateHistory(recToSave.getGridHistory()); + } else { + // set the parmId to the cache'd instance + recToSave.setParmId(id); + newRecords.add(recToSave); + } + } + boolean hdf5SaveSuccess = false; List<GFERecord> failedGrids = Collections.emptyList(); + Map<TimeRange, List<GridDataHistory>> histories = new HashMap<TimeRange, List<GridDataHistory>>( + recordsToSave.size(), 1); try { - failedGrids = saveGridsToHdf5(records); + List<GFERecord> recList = new ArrayList<GFERecord>( + existingMap.size() + newRecords.size()); + recList.addAll(newRecords); + recList.addAll(existingMap.values()); + failedGrids = saveGridsToHdf5(recList); hdf5SaveSuccess = true; } catch (GfeException e) { statusHandler.handle(Priority.PROBLEM, "Error saving to hdf5", e); sr.addMessage("Error accessing HDF5. Data not saved."); } - // Save off the individual failures (if any), and then save what we can - for (GFERecord gfeRecord : failedGrids) { - sr.addMessage("Failed to save grid to HDF5: " + gfeRecord); - } long t3 = System.currentTimeMillis(); - perfLog.logDuration("Saving " + records.size() + " " + id.getParmName() - + " grids to hdf5", (t3 - t2)); + perfLog.logDuration( + "Saving " + (existingMap.size() + newRecords.size()) + " " + + id.getParmName() + " grids to hdf5", (t3 - t2)); if (hdf5SaveSuccess) { - records.removeAll(failedGrids); + // Save off the individual failures (if any), and then save what we + // can + for (GFERecord gfeRecord : failedGrids) { + sr.addMessage("Failed to save grid to HDF5: " + gfeRecord); + GFERecord rec = existingMap.remove(gfeRecord.getTimeRange()); - try { - failedGrids = saveGridToDb(records); - for (GFERecord rec : failedGrids) { - // already logged at a lower level - String msg = "Error saving grid " + rec.toString(); - sr.addMessage(msg); - newTimes.remove(rec.getTimeRange()); - histories.remove(rec.getTimeRange()); - removeFromHDF5(rec); + if (rec == null) { + newRecords.remove(gfeRecord); + } + } + + if (!newRecords.isEmpty()) { + try { + dao.save(newRecords); + for (GFERecord rec : newRecords) { + histories.put(rec.getTimeRange(), rec.getGridHistory()); + } + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Error saving new grids to database", e); + for (GFERecord rec : newRecords) { + // already logged at a lower level + String msg = "Error saving new grid to database: " + + rec.toString(); + sr.addMessage(msg); + removeFromHDF5(rec); + } + } + } + + if (!existingMap.isEmpty()) { + try { + dao.update(existingMap.values()); + + for (GFERecord rec : existingMap.values()) { + histories.put(rec.getTimeRange(), rec.getGridHistory()); + } + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Error updating existing grids in database", e); + for (GFERecord rec : existingMap.values()) { + // already logged at a lower level + String msg = "Error updating grid in database: " + + rec.toString(); + sr.addMessage(msg); + } } - } catch (DataAccessLayerException e) { - statusHandler.handle(Priority.PROBLEM, - "Error persisting grids", e); - String msg = "General grid persistence error: " - + e.getMessage(); - sr.addMessage(msg); } } long t4 = System.currentTimeMillis(); - perfLog.logDuration("Saving " + records.size() + " " + id.getParmName() - + " grids to database", (t4 - t3)); + perfLog.logDuration( + "Saving " + (existingMap.size() + newRecords.size()) + " " + + id.getParmName() + " grids to database", (t4 - t3)); sr.addNotifications(new GridUpdateNotification(id, originalTimeRange, histories, requesterId, id.getDbId().getSiteId())); - return sr; } @@ -922,87 +1063,28 @@ public class IFPGridDatabase extends GridDatabase { TimeRange originalTimeRange, List<IGridSlice> slices, WsId requesterId, List<TimeRange> skipDelete) { ServerResponse<?> sr = new ServerResponse<String>(); + ParmID dbParmId = null; + + try { + dbParmId = getCachedParmID(parmId); + } catch (UnknownParmIdException e) { + sr.addMessage(e.getLocalizedMessage()); + return sr; + } List<GFERecord> records = new ArrayList<GFERecord>(); for (IGridSlice slice : slices) { - GFERecord rec = new GFERecord(parmId, slice.getValidTime()); - GridDataHistory[] newHistArray = new GridDataHistory[slice - .getHistory().length]; - for (int i = 0; i < slice.getHistory().length; i++) { - GridDataHistory newHist = null; - try { - newHist = slice.getHistory()[i].clone(); - newHistArray[i] = newHist; - } catch (CloneNotSupportedException e) { - statusHandler - .handle(Priority.PROBLEM, - "Unable to clone GridDataHistory for saveGridSlices operation", - e); - } - } - - rec.setGridHistory(newHistArray); + GFERecord rec = new GFERecord(dbParmId, slice.getValidTime()); + rec.setGridHistory(slice.getHistory()); rec.setMessageData(slice); records.add(rec); } - sr.addMessages(this.saveGridData(parmId, originalTimeRange, records, + + sr.addMessages(this.saveGridData(dbParmId, originalTimeRange, records, requesterId, skipDelete)); return sr; } - /** - * Determines if a record already exists for the corresponding time range. - * If so, copies the data from the new record into the existing one so the - * existing row can be used in the database. - * - * @param parmId - * @param records - * @return the consolidated records - */ - private List<GFERecord> consolidateWithExisting(ParmID parmId, - List<GFERecord> records) { - List<GFERecord> consolidated = new ArrayList<GFERecord>(records.size()); - List<TimeRange> times = new ArrayList<TimeRange>(); - for (GFERecord rec : records) { - times.add(rec.getTimeRange()); - } - - GFEDao dao = null; - try { - dao = new GFEDao(); - } catch (PluginException e1) { - statusHandler - .handle(Priority.PROBLEM, e1.getLocalizedMessage(), e1); - } - - List<GFERecord> existingList = dao.getRecords(parmId, times); - Map<TimeRange, GFERecord> map = new HashMap<TimeRange, GFERecord>( - existingList.size()); - for (GFERecord rec : existingList) { - map.put(rec.getTimeRange(), rec); - } - - // don't make a new record if record already exists with matching time - // range - for (GFERecord rec : records) { - GFERecord existing = map.get(rec.getTimeRange()); - if (existing == null) { - consolidated.add(rec); - } else { - existing.setMessageData(rec.getMessageData()); - - List<GridDataHistory> existHist = existing.getGridHistory(); - List<GridDataHistory> newHist = rec.getGridHistory(); - dao.consolidateHistories(existHist, newHist); - - consolidated.add(existing); - } - - } - - return consolidated; - } - @Override public ServerResponse<GridParmInfo> getGridParmInfo(ParmID id) { ServerResponse<GridParmInfo> sr = new ServerResponse<GridParmInfo>(); @@ -1165,7 +1247,16 @@ public class IFPGridDatabase extends GridDatabase { @Override public ServerResponse<List<IGridSlice>> getGridData(ParmID id, List<TimeRange> timeRanges) { - return this.getGridData(id, timeRanges, getGridParmInfo(id) + ParmID dbParmId = null; + try { + dbParmId = getCachedParmID(id); + } catch (UnknownParmIdException e) { + ServerResponse<List<IGridSlice>> sr = new ServerResponse<List<IGridSlice>>(); + sr.addMessage(e.getLocalizedMessage()); + return sr; + } + + return this.getGridData(dbParmId, timeRanges, getGridParmInfo(dbParmId) .getPayload().getGridLoc()); } @@ -1175,25 +1266,6 @@ public class IFPGridDatabase extends GridDatabase { return this.gridConfig.projectionData().getProjectionID(); } - @Override - @Deprecated - public ServerResponse<?> updateGridHistory(ParmID parmId, - Map<TimeRange, List<GridDataHistory>> history) { - ServerResponse<?> sr = new ServerResponse<String>(); - GFEDao dao = null; - try { - dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); - dao.updateGridHistories(parmId, history); - } catch (PluginException e1) { - statusHandler.handle(Priority.PROBLEM, "Unable to get gfe dao", e1); - } catch (DataAccessLayerException e) { - statusHandler.handle(Priority.PROBLEM, - "Unable to update grid history!!", e); - } - return sr; - - } - /** * Examines the user vs. the database projection and domains, and determines * if the database needs to be remapped to be in line with the desired @@ -1203,18 +1275,19 @@ public class IFPGridDatabase extends GridDatabase { try { IFPServerConfig serverConfig = IFPServerConfigManager - .getServerConfig(this.dbId.getSiteId()); + .getServerConfig(dbId.getSiteId()); GridLocation currentGridLocation = serverConfig.dbDomain(); if (currentGridLocation.getSiteId().equals("")) { - currentGridLocation.setSiteId(this.getDbId().getSiteId()); + currentGridLocation.setSiteId(dbId.getSiteId()); } + GFEDao gfeDao = new GFEDao(); + for (String parmNameAndLevel : parmInfo.keySet()) { GridLocation storedGridLocation = parmInfo .get(parmNameAndLevel).getGridLoc(); String parmName = parmNameAndLevel.split("_")[0]; String parmLevel = parmNameAndLevel.split("_")[1]; - ParmID currentParm = new ParmID(parmName, dbId, parmLevel); if (!storedGridLocation.equals(currentGridLocation)) { GridParmInfo gpi = gridConfig.getGridParmInfo(parmName, @@ -1226,12 +1299,11 @@ public class IFPGridDatabase extends GridDatabase { parmName, parmLevel); this.storeGridParmInfo(gpi, psi, StoreOp.REPLACE); - GFEDao gfeDao = new GFEDao(); - RemapGrid remap = new RemapGrid(storedGridLocation, currentGridLocation, true); - ArrayList<GFERecord> records = gfeDao - .queryByParmID(currentParm); + + ParmID currentParm = getCachedParmID(parmNameAndLevel); + List<GFERecord> records = gfeDao.queryByParmID(currentParm); if (!records.isEmpty()) { statusHandler.handle( Priority.WARN, @@ -1344,11 +1416,14 @@ public class IFPGridDatabase extends GridDatabase { } private void getDBConfiguration() throws GfeException { - this.parmInfo.clear(); - this.parmStorageInfo.clear(); + parmInfo.clear(); + parmStorageInfo.clear(); + parmIdMap.clear(); + if (!parmInfoInitialized) { initGridParmInfo(); } + try { IDataStore ds = DataStoreFactory.getDataStore(GfeUtil .getGridParmHdf5File(gfeBaseDataDir, this.dbId)); @@ -1365,9 +1440,16 @@ public class IFPGridDatabase extends GridDatabase { .getDataAttributes()); parmStorageInfo.put(psiRecord.getName(), psi); } + + GFEDao dao = new GFEDao(); + List<ParmID> currentIds = dao.getParmIds(dbId); + for (ParmID parmId : currentIds) { + parmIdMap.put(parmId.getCompositeName(), parmId); + } } catch (Exception e) { throw new GfeException("Error getting db configuration", e); } + } private void compareParmInfoWithDB(Map<String, GridParmInfo> parmInfoUser, @@ -1502,7 +1584,7 @@ public class IFPGridDatabase extends GridDatabase { String[] retValue = parmAndLevel.split("_"); if (retValue.length == 1) { - return new String[] { retValue[0], "SFC" }; + return new String[] { retValue[0], ParmID.defaultLevel() }; } else { return retValue; } @@ -1516,20 +1598,6 @@ public class IFPGridDatabase extends GridDatabase { return sr; } - private ServerResponse<?> validGridTimes(final List<GFERecord> grids, - final TimeRange validTR) { - ServerResponse<?> sr = new ServerResponse<String>(); - - // Make sure every grid's TR falls within the validTR - for (int j = 0; j < grids.size(); j++) { - if (!validTR.contains(grids.get(j).getTimeRange())) { - sr.addMessage("Grid times not valid"); - return sr; - } - } - return sr; - } - /** * Gets the HDF5 file containing the grid parm info. Initializes the info if * necessary @@ -2117,32 +2185,6 @@ public class IFPGridDatabase extends GridDatabase { correlationMap.put(storeDataRec, rec); } - /** - * Saves GFERecords to the database - * - * @param records - * The GFERecords to be saved - * @param requestorId - * The workstationID of the requestor - * @return failed grids - * @throws DataAccessLayerException - */ - public List<GFERecord> saveGridToDb(List<GFERecord> records) - throws DataAccessLayerException { - GFEDao dao = null; - try { - dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); - } catch (PluginException e1) { - throw new DataAccessLayerException("Unable to get gfe dao", e1); - } - try { - return dao.saveOrUpdate(records); - } catch (DataAccessException e) { - throw new DataAccessLayerException( - "Error saving GFE grid to database", e); - } - } - @Override public FloatDataRecord[] retrieveFromHDF5(ParmID parmId, List<TimeRange> times) throws GfeException { @@ -2428,24 +2470,6 @@ public class IFPGridDatabase extends GridDatabase { this.deleteModelHDF5(); } - /** - * Removes a record from the PostGres database - * - * @param record - * The record to remove - */ - private void removeFromDb(GFERecord record) { - GFEDao dao = null; - try { - dao = (GFEDao) PluginFactory.getInstance().getPluginDao("gfe"); - } catch (PluginException e) { - statusHandler.handle(Priority.PROBLEM, "Unable to get gfe dao", e); - } - dao.delete(record); - statusHandler.handle(Priority.DEBUG, "Deleted: " + record - + " from database"); - } - /** * Removes a record from the HDF5 repository. If the record does not exist * in the HDF5, the operation is ignored @@ -2476,6 +2500,40 @@ public class IFPGridDatabase extends GridDatabase { } } + /** + * Removes records from the HDF5 repository. If the records do not exist in + * the HDF5, the operation is ignored + * + * @param record + * The record to remove + */ + private void removeFromHDF5(ParmID parmId, List<TimeRange> times) { + Map<File, Pair<List<TimeRange>, String[]>> fileMap = GfeUtil + .getHdf5FilesAndGroups(GridDatabase.gfeBaseDataDir, parmId, + times); + for (Map.Entry<File, Pair<List<TimeRange>, String[]>> entry : fileMap + .entrySet()) { + File hdf5File = entry.getKey(); + IDataStore dataStore = DataStoreFactory.getDataStore(hdf5File); + String[] groupsToDelete = entry.getValue().getSecond(); + + try { + dataStore.deleteGroups(groupsToDelete); + + if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { + statusHandler.handle(Priority.DEBUG, + "Deleted: " + Arrays.toString(groupsToDelete) + + " from " + hdf5File.getName()); + } + } catch (Exception e) { + statusHandler.handle( + Priority.WARN, + "Error deleting hdf5 record(s) from file: " + + hdf5File.getPath(), e); + } + } + } + private void deleteModelHDF5() { File hdf5File = GfeUtil.getHdf5Dir(GridDatabase.gfeBaseDataDir, dbId); IDataStore ds = DataStoreFactory.getDataStore(hdf5File); @@ -2489,6 +2547,10 @@ public class IFPGridDatabase extends GridDatabase { } } + /** + * Updates the history times for the associated history objects. History + * objects must have already been retrieved from database. + */ @Override public ServerResponse<?> updatePublishTime(List<GridDataHistory> history, Date publishTime) { @@ -2507,4 +2569,27 @@ public class IFPGridDatabase extends GridDatabase { return sr; } + public ParmID getCachedParmID(String parmNameAndLevel) + throws UnknownParmIdException { + ParmID rval = parmIdMap.get(parmNameAndLevel); + + if (rval == null) { + throw new UnknownParmIdException("ParmId: " + parmNameAndLevel + + ":" + dbId.getModelId() + " doesn't exist"); + } + + return rval; + } + + @Override + public ParmID getCachedParmID(ParmID parmId) throws UnknownParmIdException { + ParmID rval = parmIdMap.get(parmId.getCompositeName()); + + if (rval == null) { + throw new UnknownParmIdException("ParmId: " + parmId.toString() + + " doesn't exist"); + } + + return rval; + } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/TopoDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/TopoDatabase.java index dad1b98beb..46ce7c430d 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/TopoDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/TopoDatabase.java @@ -61,7 +61,7 @@ import com.raytheon.uf.edex.database.DataAccessLayerException; * Jun 19, 2008 #1160 randerso Initial creation * Jul 10, 2009 #2590 njensen Support for multiple sites. * May 04, 2012 #574 dgilling Re-port to better match AWIPS1. - * + * Apr 23, 2013 #1949 rjpeter Removed unused method. * </pre> * * @author randerso @@ -70,13 +70,13 @@ import com.raytheon.uf.edex.database.DataAccessLayerException; public class TopoDatabase extends VGridDatabase { private static final TimeRange TR = TimeRange.allTimes(); - private TopoDatabaseManager topoMgr; + private final TopoDatabaseManager topoMgr; - private GridLocation gloc; + private final GridLocation gloc; - private ParmID pid; + private final ParmID pid; - private GridParmInfo gpi; + private final GridParmInfo gpi; public TopoDatabase(final IFPServerConfig config, TopoDatabaseManager topoMgr) { @@ -195,7 +195,7 @@ public class TopoDatabase extends VGridDatabase { if (!this.pid.equals(id)) { sr.addMessage("Unknown ParmID: " + id); - } else if (timeRanges.size() != 1 || !timeRanges.get(0).equals(TR)) { + } else if ((timeRanges.size() != 1) || !timeRanges.get(0).equals(TR)) { sr.addMessage("Invalid time requested"); } else { @@ -278,21 +278,6 @@ public class TopoDatabase extends VGridDatabase { // no-op } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.edex.plugin.gfe.server.database.GridDatabase#updateGridHistory - * (com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID, java.util.Map) - */ - @Override - public ServerResponse<?> updateGridHistory(ParmID parmId, - Map<TimeRange, List<GridDataHistory>> history) { - ServerResponse<?> sr = new ServerResponse<Object>(); - sr.addMessage("Can't update Grid History on TopoDatabase"); - return sr; - } - /* * (non-Javadoc) * diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetLatestDbTimeHandler.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetLatestDbTimeHandler.java deleted file mode 100644 index a991e4e934..0000000000 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetLatestDbTimeHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ - -package com.raytheon.edex.plugin.gfe.server.handler; - -import java.util.Date; - -import com.raytheon.edex.plugin.gfe.db.dao.GFEDao; -import com.raytheon.uf.common.dataplugin.gfe.request.GetLatestDbTimeRequest; -import com.raytheon.uf.common.serialization.comm.IRequestHandler; - -/** - * Handler for getting the latest insert time for a given database ID - * - * <pre> - * - * SOFTWARE HISTORY - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 8/16/2010 6349 bphillip Initial creation - * - * </pre> - * - * @author bphillip - * @version 1.0 - */ -public class GetLatestDbTimeHandler implements - IRequestHandler<GetLatestDbTimeRequest> { - - @Override - public Date handleRequest(GetLatestDbTimeRequest request) - throws Exception { - Date latestDate = new GFEDao().getLatestDbIdInsertTime(request.getDbId()); - return latestDate; - } - -} diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetLatestModelDbIdHandler.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetLatestModelDbIdHandler.java deleted file mode 100644 index 5a353c4441..0000000000 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetLatestModelDbIdHandler.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.edex.plugin.gfe.server.handler; - -import com.raytheon.edex.plugin.gfe.db.dao.GFEDao; -import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; -import com.raytheon.uf.common.dataplugin.gfe.request.GetLatestModelDbIdRequest; -import com.raytheon.uf.common.serialization.comm.IRequestHandler; - -/** - * Handler for getting the latest DatabaseID for a given model name and site ID. - * - * <pre> - * - * SOFTWARE HISTORY - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Aug 17, 2010 dgilling Initial creation - * - * </pre> - * - * @author dgilling - * @version 1.0 - */ - -public class GetLatestModelDbIdHandler implements - IRequestHandler<GetLatestModelDbIdRequest> { - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.common.serialization.comm.IRequestHandler#handleRequest - * (com.raytheon.uf.common.serialization.comm.IServerRequest) - */ - @Override - public DatabaseID handleRequest(GetLatestModelDbIdRequest request) - throws Exception { - DatabaseID dbId = new GFEDao().getLatestModelDbId(request.getSiteId(), request - .getModelName()); - return dbId; - } - -} diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/LockChangeHandler.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/LockChangeHandler.java index b50ce98ef4..e76cb1e0b3 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/LockChangeHandler.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/LockChangeHandler.java @@ -43,6 +43,7 @@ import com.raytheon.uf.common.serialization.comm.IRequestHandler; * 04/08/08 #875 bphillip Initial Creation * 06/17/08 #940 bphillip Implemented GFE Locking * 09/22/09 3058 rjpeter Converted to IRequestHandler + * 04/24/13 1949 rjpeter Added list sizing * </pre> * * @author bphillip @@ -59,8 +60,11 @@ public class LockChangeHandler implements IRequestHandler<LockChangeRequest> { if (sr.isOkay()) { try { - List<GfeNotification> notes = new ArrayList<GfeNotification>(); - for (LockTable table : sr.getPayload()) { + List<LockTable> lockTables = sr.getPayload(); + List<GfeNotification> notes = new ArrayList<GfeNotification>( + lockTables.size()); + + for (LockTable table : lockTables) { notes.add(new LockNotification(table, siteID)); } ServerResponse<?> notifyResponse = SendNotifications @@ -75,7 +79,6 @@ public class LockChangeHandler implements IRequestHandler<LockChangeRequest> { + e.getMessage()); } } - return sr; } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/SaveASCIIGridsHandler.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/SaveASCIIGridsHandler.java index f3981971ff..5bb8e905df 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/SaveASCIIGridsHandler.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/SaveASCIIGridsHandler.java @@ -59,7 +59,7 @@ import com.raytheon.uf.common.status.UFStatus; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 21, 2011 dgilling Initial creation - * + * Apr 23, 2013 1949 rjpeter Removed extra lock table look up * </pre> * * @author dgilling @@ -149,18 +149,6 @@ public class SaveASCIIGridsHandler implements // make a LockTableRequest LockTableRequest ltr = new LockTableRequest(pid); - // get the lock tables - ServerResponse<List<LockTable>> srLockTables = LockManager - .getInstance().getLockTables(ltr, - request.getWorkstationID(), siteId); - if (!srLockTables.isOkay()) { - msg = "Skipping grid storage [" + (i + 1) + " of " + ngrids - + "]. Unable to obtain lock table for " - + pid.toString() + ": " + srLockTables.message(); - sr.addMessage(msg); - continue; - } - // make the Lock Request object to lock LockRequest lrl = new LockRequest(pid, agrid.getGridSlices().get(i) .getValidTime(), LockMode.LOCK); @@ -185,8 +173,7 @@ public class SaveASCIIGridsHandler implements grid.setMessageData(agrid.getGridSlices().get(i)); grid.setGridHistory(agrid.getGridSlices().get(i).getHistory()); records.add(grid); - final List<SaveGridRequest> sgrs = new ArrayList<SaveGridRequest>(); - sgrs.clear(); + final List<SaveGridRequest> sgrs = new ArrayList<SaveGridRequest>(1); SaveGridRequest sgr = new SaveGridRequest(pid, agrid .getGridSlices().get(i).getValidTime(), records); sgrs.add(sgr); diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/lock/LockManager.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/lock/LockManager.java index 88cf65b6b0..6d9e91cbc0 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/lock/LockManager.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/lock/LockManager.java @@ -21,9 +21,12 @@ package com.raytheon.edex.plugin.gfe.server.lock; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -60,7 +63,8 @@ import com.raytheon.uf.edex.database.DataAccessLayerException; * ------------ ---------- ----------- -------------------------- * 04/08/08 #875 bphillip Initial Creation * 06/17/08 #940 bphillip Implemented GFE Locking - * + * 04/23/13 #1949 rjpeter Updated to work with Normalized Database, + * fixed inefficiencies in querying/merging * </pre> * * @author bphillip @@ -69,22 +73,21 @@ import com.raytheon.uf.edex.database.DataAccessLayerException; public class LockManager { /** The logger */ - private Log logger = LogFactory.getLog(getClass()); + private final Log logger = LogFactory.getLog(getClass()); - private LockComparator startTimeComparator = new LockComparator(); + private final LockComparator startTimeComparator = new LockComparator(); + + private final GFELockDao dao = new GFELockDao(); /** The singleton instance of the LockManager */ - private static LockManager instance; + private static LockManager instance = new LockManager(); /** * Gets the singleton instance of the LockManager * * @return The singleton instance of the LockManager */ - public synchronized static LockManager getInstance() { - if (instance == null) { - instance = new LockManager(); - } + public static LockManager getInstance() { return instance; } @@ -117,14 +120,15 @@ public class LockManager { // extract the ParmIds from the request list List<ParmID> parmIds = new ArrayList<ParmID>(); - sr.addMessages(extractParmIds(request, parmIds, siteID)); - try { - sr.setPayload(new ArrayList<LockTable>(new GFELockDao().getLocks( - parmIds, requestor).values())); - } catch (DataAccessLayerException e) { + sr.addMessages(extractParmIds(request, parmIds, siteID)); + + sr.setPayload(new ArrayList<LockTable>(dao.getLocks(parmIds, + requestor).values())); + } catch (Exception e) { + logger.error("Error getting lock tables for " + parmIds, e); sr.addMessage("Error getting lock tables for " + parmIds); - sr.setPayload(new ArrayList<LockTable>()); + sr.setPayload(new ArrayList<LockTable>(0)); } return sr; @@ -143,9 +147,7 @@ public class LockManager { */ public ServerResponse<List<LockTable>> getLockTables( LockTableRequest request, WsId wsId, String siteID) { - List<LockTableRequest> requests = new ArrayList<LockTableRequest>(); - requests.add(request); - return getLockTables(requests, wsId, siteID); + return getLockTables(Arrays.asList(request), wsId, siteID); } public ServerResponse<List<LockTable>> requestLockChange( @@ -167,9 +169,8 @@ public class LockManager { public ServerResponse<List<LockTable>> requestLockChange( LockRequest request, WsId requestor, String siteID, boolean combineLocks) throws GfeLockException { - List<LockRequest> requests = new ArrayList<LockRequest>(); - requests.add(request); - return requestLockChange(requests, requestor, siteID, combineLocks); + return requestLockChange(Arrays.asList(request), requestor, siteID, + combineLocks); } public ServerResponse<List<LockTable>> requestLockChange( @@ -191,8 +192,8 @@ public class LockManager { List<LockRequest> requests, WsId requestor, String siteID, boolean combineLocks) { - List<LockTable> lockTablesAffected = new ArrayList<LockTable>(); - List<GridUpdateNotification> gridUpdatesAffected = new ArrayList<GridUpdateNotification>(); + List<LockTable> lockTablesAffected = new LinkedList<LockTable>(); + List<GridUpdateNotification> gridUpdatesAffected = new LinkedList<GridUpdateNotification>(); ServerResponse<List<LockTable>> sr = new ServerResponse<List<LockTable>>(); sr.setPayload(lockTablesAffected); @@ -205,7 +206,7 @@ public class LockManager { // expand the request as appropriate to the time boundary requirements // and convert to all parm-type requests - List<LockRequest> req = new ArrayList<LockRequest>(); + List<LockRequest> req = new ArrayList<LockRequest>(requests.size()); sr.addMessages(adjustLockToTimeBoundaries(requests, req)); if (!sr.isOkay()) { @@ -213,85 +214,87 @@ public class LockManager { return sr; } - // extract the ParmIds from the requests - List<ParmID> parmIds = new ArrayList<ParmID>(); - sr.addMessages(extractParmIdsFromLockReq(req, parmIds, siteID)); - - // get the lock tables specific to the extracted parmIds + List<ParmID> parmIds = new LinkedList<ParmID>(); Map<ParmID, LockTable> lockTableMap; try { - lockTableMap = new GFELockDao().getLocks(parmIds, requestor); - } catch (DataAccessLayerException e) { + // extract the ParmIds from the requests + sr.addMessages(extractParmIdsFromLockReq(req, parmIds, siteID)); + + // get the lock tables specific to the extracted parmIds + lockTableMap = dao.getLocks(parmIds, requestor); + } catch (Exception e) { + logger.error("Error getting lock tables for " + parmIds, e); sr.addMessage("Error getting lock tables for " + parmIds); return sr; } // process each modified lock request, these are all parm-type requests ParmID currentParmId = null; + TimeRange currentTimeRange = null; for (LockRequest currentRequest : req) { currentParmId = currentRequest.getParmId(); + currentTimeRange = currentRequest.getTimeRange(); + // get table from sequence LockTable lt = lockTableMap.get(currentParmId); LockTable prevLT = lt.clone(); try { // Change Lock - if (!changeLock(lt, currentRequest.getTimeRange(), requestor, + if (!changeLock(lt, currentTimeRange, requestor, currentRequest.getMode(), combineLocks)) { sr.addMessage("Requested change lock failed - Lock is owned by another user - " + currentRequest + " LockTable=" + lt); - lockTablesAffected.clear(); - gridUpdatesAffected.clear(); - return sr; - + continue; } } catch (Exception e) { + logger.error("Error changing lock", e); sr.addMessage("Requested change lock failed - Exception thrown - " + currentRequest + " LockTable=" + lt + " Exception: " + e.getLocalizedMessage()); - lockTablesAffected.clear(); - gridUpdatesAffected.clear(); - return sr; + continue; } // the change lock worked, but resulted in the same lock situation if (prevLT.equals(lt)) { + // TODO: Equals not implemented, this is dead code due to clone continue; } - // add the lock table to the lockTablesAffected" if it already - // doesn't exist -- if it does exist, then replace it but don't add - // it if it really didn't change + // add the lock table to the lockTablesAffected if it already + // doesn't exist - LockTable tableToRemove = null; - for (int j = 0; j < lockTablesAffected.size(); j++) { - if (lockTablesAffected.get(j).getParmId().equals(currentParmId)) { - tableToRemove = lockTablesAffected.get(j); + boolean addTable = true; + for (LockTable ltAffected : lockTablesAffected) { + if (ltAffected.getParmId().equals(currentParmId)) { + addTable = false; break; } } - if (tableToRemove != null) { - lockTablesAffected.remove(tableToRemove); + if (addTable) { + lockTablesAffected.add(lt); } - lockTablesAffected.add(lt); - // assemble a grid update notification since the lock table has - // changed - IF this is BREAK LOCK request if (currentRequest.getMode().equals(LockTable.LockMode.BREAK_LOCK)) { + // TODO: Should be able to do in a single look up that retrieves + // the histories that intersect the time ranges instead of the + // current two stage query List<TimeRange> trs = new ArrayList<TimeRange>(); ServerResponse<List<TimeRange>> ssr = GridParmManager - .getGridInventory(currentParmId); + .getGridInventory(currentParmId, currentTimeRange); sr.addMessages(ssr); trs = ssr.getPayload(); if (!sr.isOkay()) { - lockTablesAffected.clear(); - gridUpdatesAffected.clear(); - return sr; + // unable to get payload, can't reverse the break lock, add + // a new message to our current response and keep going + sr.addMessages(ssr); + continue; } + List<TimeRange> updatedGridsTR = new ArrayList<TimeRange>(); for (int p = 0; p < trs.size(); p++) { if (trs.get(p).overlaps(currentRequest.getTimeRange())) { @@ -312,14 +315,17 @@ public class LockManager { } } - // if we made it here, then all lock requests were successful - for (int k = 0; k < lockTablesAffected.size(); k++) { - lockTablesAffected.get(k).resetWsId(requestor); + + // update the lockTables that were successful + for (LockTable lt : lockTablesAffected) { + lt.resetWsId(requestor); } + // process the break lock notifications that were successful for (GridUpdateNotification notify : gridUpdatesAffected) { sr.addNotifications(notify); } + return sr; } @@ -348,143 +354,161 @@ public class LockManager { } else if (ls.equals(LockTable.LockStatus.LOCKED_BY_ME)) { return true; } else if (ls.equals(LockTable.LockStatus.LOCKABLE)) { - GFELockDao dao = new GFELockDao(); - List<Lock> existingLocks = new ArrayList<Lock>(); try { - existingLocks = dao.getLocksInRange(lt.getParmId(), - timeRange); - if (existingLocks != null && !existingLocks.isEmpty()) { - for (Lock lock : existingLocks) { - dao.delete(lock); - lt.removeLock(lock); - } - } + Lock newLock = new Lock(lt.getParmId(), timeRange, + requestorId); + replaceLocks(lt, newLock, combineLocks); } catch (DataAccessLayerException e) { - logger.error("Error changing locks", e); + logger.error("Error adding lock", e); + throw new GfeLockException("Unable add new lock", e); } - - Lock newLock = new Lock(timeRange, requestorId); - newLock.setParmId(lt.getParmId()); - dao.persist(newLock); - try { - newLock = dao.getLock(newLock.getParmId(), - newLock.getTimeRange(), newLock.getWsId()); - } catch (DataAccessLayerException e) { - throw new GfeLockException("Unable to update new lock", e); - } - lt.addLock(newLock); } - - if (combineLocks) { - combineLocks(lt); - } - } - - else if (lockMode.equals(LockTable.LockMode.UNLOCK)) { + } else if (lockMode.equals(LockTable.LockMode.UNLOCK)) { if (ls.equals(LockTable.LockStatus.LOCKED_BY_ME)) { try { - GFELockDao dao = new GFELockDao(); - Lock newLock = dao.getLock(lt.getParmId(), timeRange, - requestorId); - if (newLock != null) { - dao.delete(newLock); - lt.removeLock(newLock); - } + deleteLocks(lt, timeRange); } catch (DataAccessLayerException e) { - throw new GfeLockException( - "Unable to retrieve lock information for: " - + lt.getParmId() + " TimeRange: " - + timeRange + " WorkstationID: " - + requestorId); + throw new GfeLockException("Unable to delete locks for: " + + lt.getParmId() + " TimeRange: " + timeRange + + " WorkstationID: " + requestorId); } - } else if (ls.equals(LockTable.LockStatus.LOCKED_BY_OTHER)) { logger.warn("Lock for time range: " + timeRange + " already owned"); } else { // Record already unlocked } - } - - else if (lockMode.equals(LockTable.LockMode.BREAK_LOCK)) { + } else if (lockMode.equals(LockTable.LockMode.BREAK_LOCK)) { try { - GFELockDao dao = new GFELockDao(); - Lock newLock = dao.getLock(lt.getParmId(), timeRange, - requestorId); - if (newLock != null) { - dao.delete(newLock); - lt.removeLock(newLock); - } + deleteLocks(lt, timeRange); } catch (DataAccessLayerException e) { - throw new GfeLockException( - "Unable to retrieve lock information for: " - + lt.getParmId() + " TimeRange: " + timeRange - + " WorkstationID: " + requestorId); + throw new GfeLockException("Unable to delete locks for: " + + lt.getParmId() + " TimeRange: " + timeRange + + " WorkstationID: " + requestorId); } } + return true; } /** - * Examines the locks contained in a given lock table and combines locks if - * possible. + * Replaces locks in the given time range with the passed lock. * * @param lt * The lock table to examine + * @param newLock + * The lock to add * @throws GfeLockException * If errors occur when updating the locks in the database */ - private void combineLocks(final LockTable lt) throws GfeLockException { + private void replaceLocks(final LockTable lt, final Lock newLock, + boolean combineLocks) throws DataAccessLayerException { + // update the locks in memory Set<Lock> added = new HashSet<Lock>(); - Set<Lock> deleted = new HashSet<Lock>(); - List<Lock> locks = null; - Lock currentLock = null; - Lock nextLock = null; - boolean lockCombined = true; - while (lockCombined) { - lockCombined = false; - lt.addLocks(added); - lt.removeLocks(deleted); - Collections.sort(lt.getLocks(), startTimeComparator); - locks = lt.getLocks(); - for (int i = 0; i < locks.size() - 1; i++) { - currentLock = locks.get(i); - nextLock = locks.get(i + 1); - if (currentLock.getEndTime() >= nextLock.getStartTime() - && currentLock.getWsId().equals(nextLock.getWsId())) { - lockCombined = true; - deleted.add(currentLock); - deleted.add(nextLock); - Lock newLock = new Lock(new TimeRange( - currentLock.getStartTime(), nextLock.getEndTime()), - lt.getWsId()); - newLock.setParmId(lt.getParmId()); - added.add(newLock); + List<Integer> removed = new ArrayList<Integer>(); + + List<Lock> locks = lt.getLocks(); + Collections.sort(locks, startTimeComparator); + long start = newLock.getStartTime(); + long end = newLock.getEndTime(); + Iterator<Lock> iter = locks.iterator(); + + while (iter.hasNext()) { + Lock lock = iter.next(); + if (start <= lock.getStartTime()) { + if (end >= lock.getEndTime()) { + removed.add(lock.getId()); + iter.remove(); + } else { + // list was sorted by start time, not need to go any further break; } } } - try { - new GFELockDao().updateCombinedLocks(deleted, added); - } catch (DataAccessLayerException e) { - throw new GfeLockException("Error combining locks", e); + + added.add(newLock); + locks.add(newLock); + + // if combineLocks, do the combine before storing the initial change to + // the db + if (combineLocks) { + Lock prevLock = null; + Lock currentLock = null; + Collections.sort(locks, startTimeComparator); + prevLock = locks.get(0); + for (int i = 1; i < locks.size(); i++) { + currentLock = locks.get(i); + if ((prevLock.getEndTime() >= currentLock.getStartTime()) + && prevLock.getWsId().equals(currentLock.getWsId())) { + // remove previous lock, checking if it was a new lock first + if (!added.remove(prevLock)) { + removed.add(prevLock.getId()); + } + + // remove currentLock, checking if it was a new lock first + if (!added.remove(currentLock)) { + removed.add(currentLock.getId()); + } + locks.remove(i); + + // replace prevLock with new Lock + prevLock = new Lock(lt.getParmId(), new TimeRange( + prevLock.getStartTime(), Math.max( + prevLock.getEndTime(), + currentLock.getEndTime())), lt.getWsId()); + + added.add(prevLock); + locks.set(i - 1, prevLock); + + // keep current position + i--; + } else { + prevLock = currentLock; + } + } + } + + // update the database + if (!added.isEmpty() || !removed.isEmpty()) { + dao.addRemoveLocks(added, removed); } } /** - * Notification that one or more databases were deleted. No lock change - * notifications are generated since all clients will already know that the - * databases have been removed. + * Deletes locks in the given time range * - * Asks the LockDatabase for the list of LockTables. Eliminate entries in - * LockTables that no longer should exist based on the sequence of database - * identifiers that were deleted. Restore the LockTables by passing them to - * the LockDatabase. - * - * @param deletions + * @param lt + * The lock table to examine + * @param tr + * The TimeRange to delete + * @throws GfeLockException + * If errors occur when updating the locks in the database */ - public void databaseDeleted(List<DatabaseID> deletions) { - // TODO: Implement database deletion + private void deleteLocks(final LockTable lt, final TimeRange tr) + throws DataAccessLayerException { + // update the locks in memory + List<Lock> locks = lt.getLocks(); + Collections.sort(locks, startTimeComparator); + long start = tr.getStart().getTime(); + long end = tr.getEnd().getTime(); + Iterator<Lock> iter = locks.iterator(); + List<Integer> locksToRemove = new LinkedList<Integer>(); + + while (iter.hasNext()) { + Lock lock = iter.next(); + if (start <= lock.getStartTime()) { + if (end >= lock.getEndTime()) { + locksToRemove.add(lock.getId()); + iter.remove(); + } else { + // list was sorted by start time, not need to go any further + break; + } + } + } + + // update the database + dao.addRemoveLocks(null, locksToRemove); } /** @@ -520,10 +544,7 @@ public class LockManager { } for (LockRequest req : requestsOut) { - List<LockRequest> reqList = new ArrayList<LockRequest>(); - reqList.add(req); - sr.addMessages(expandRequestToBoundary(reqList)); - req = reqList.get(0); + sr.addMessages(expandRequestToBoundary(req)); if (!sr.isOkay()) { return sr; } @@ -596,27 +617,27 @@ public class LockManager { * The lock requst * @return */ - private ServerResponse<?> expandRequestToBoundary(List<LockRequest> req) { + private ServerResponse<?> expandRequestToBoundary(LockRequest req) { ServerResponse<?> sr = new ServerResponse<String>(); - if (!req.get(0).isParmRequest()) { + if (!req.isParmRequest()) { logger.error("Expected parm-type request in expandRequestToBoundary"); } // If this is a break-lock request, then do not expand to time constrts - if (req.get(0).getMode().equals(LockTable.LockMode.BREAK_LOCK)) { + if (req.getMode().equals(LockTable.LockMode.BREAK_LOCK)) { return sr; } // Only expand for request lock and unlock - DatabaseID dbid = req.get(0).getParmId().getDbId(); + DatabaseID dbid = req.getParmId().getDbId(); TimeRange tr = null; switch (dbid.getFormat()) { case GRID: ServerResponse<GridParmInfo> ssr = GridParmManager - .getGridParmInfo(req.get(0).getParmId()); + .getGridParmInfo(req.getParmId()); GridParmInfo gpi = ssr.getPayload(); sr.addMessages(ssr); if (!sr.isOkay()) { @@ -624,8 +645,7 @@ public class LockManager { return sr; } // calculate the expanded time - tr = gpi.getTimeConstraints().expandTRToQuantum( - req.get(0).getTimeRange()); + tr = gpi.getTimeConstraints().expandTRToQuantum(req.getTimeRange()); if (!tr.isValid()) { sr.addMessage("Request does not match TimeConstraints " + gpi.getTimeConstraints() + " ParmReq: " + req); @@ -638,9 +658,7 @@ public class LockManager { // Update the lock request if (tr.isValid()) { - req.add(new LockRequest(req.get(0).getParmId(), tr, req.get(0) - .getMode())); - req.remove(0); + req.setTimeRange(tr); } else { sr.addMessage("TimeRange not valid in LockRequest"); } @@ -649,10 +667,10 @@ public class LockManager { } /** - * * Overloaded utility routine to extract the ParmIds for a given + * Overloaded utility routine to extract the ParmIds for a given * SeqOf<LockTableRequest>. If the request is a parm request, the ParmId * will be appended to the list ParmIds to be returned. If the request is a - * database request, all the ParmIds for the given databaseId wil be + * database request, all the ParmIds for the given databaseId will be * appended to the list of ParmIds. If the request is neither a parm nor a * database request, all the parmId for all the databaseIds are appended to * the list of ParmIds to be returned. @@ -662,22 +680,23 @@ public class LockManager { * @return The ParmIDs contained in the requests * @throws GfeException */ - private ServerResponse<?> extractParmIds(List<LockTableRequest> ltr, - List<ParmID> parmIds, String siteID) { + private ServerResponse<?> extractParmIds(List<LockTableRequest> ltrList, + List<ParmID> parmIds, String siteID) throws GfeException { ServerResponse<?> sr = new ServerResponse<String>(); // process each request - for (int i = 0; i < ltr.size(); i++) { - if (ltr.get(i).isParmRequest()) { + for (LockTableRequest ltr : ltrList) { + if (ltr.isParmRequest()) { + ParmID parmId = ltr.getParmId(); // append parm (if not already in the list) - if (!parmIds.contains(ltr.get(i).getParmId())) { - parmIds.add(ltr.get(i).getParmId()); + if (!parmIds.contains(parmId)) { + parmIds.add(GridParmManager.getDb(parmId.getDbId()) + .getCachedParmID(parmId)); } - } else if (ltr.get(i).isDatabaseRequest()) { + } else if (ltr.isDatabaseRequest()) { // get all the parmIds for that databaseId - - List<ParmID> pids = GridParmManager.getParmList( - ltr.get(i).getDbId()).getPayload(); + List<ParmID> pids = GridParmManager.getParmList(ltr.getDbId()) + .getPayload(); for (ParmID id : pids) { if (!parmIds.contains(id)) { parmIds.add(id); @@ -696,7 +715,6 @@ public class LockManager { } } } - // this only needs to be done once } } return sr; @@ -719,23 +737,24 @@ public class LockManager { * @throws GfeException * If errors occur */ - private ServerResponse<?> extractParmIdsFromLockReq(List<LockRequest> lr, - List<ParmID> parmIds, String siteID) { + private ServerResponse<?> extractParmIdsFromLockReq(List<LockRequest> lrs, + List<ParmID> parmIds, String siteID) throws GfeException { ServerResponse<?> sr = new ServerResponse<String>(); // process each request - for (int i = 0; i < lr.size(); i++) { - if (lr.get(i).isParmRequest()) { + for (LockRequest lr : lrs) { + if (lr.isParmRequest()) { + ParmID parmId = lr.getParmId(); // append parm (if not already in the list) - if (!parmIds.contains(lr.get(i).getParmId())) { - parmIds.add(lr.get(i).getParmId()); + if (!parmIds.contains(parmId)) { + parmIds.add(GridParmManager.getDb(parmId.getDbId()) + .getCachedParmID(parmId)); } - } else if (lr.get(i).isDatabaseRequest()) { - List<ParmID> pids = new ArrayList<ParmID>(); + } else if (lr.isDatabaseRequest()) { ServerResponse<List<ParmID>> ssr = GridParmManager - .getParmList(lr.get(i).getDbId()); + .getParmList(lr.getDbId()); sr.addMessages(ssr); - pids = ssr.getPayload(); + List<ParmID> pids = ssr.getPayload(); if (!sr.isOkay()) { return sr; } @@ -755,11 +774,10 @@ public class LockManager { return sr; } for (int j = 0; j < dbids.size(); j++) { - List<ParmID> pids = new ArrayList<ParmID>(); ServerResponse<List<ParmID>> ssr1 = GridParmManager .getParmList(dbids.get(j)); sr.addMessages(ssr1); - pids = ssr1.getPayload(); + List<ParmID> pids = ssr1.getPayload(); if (!sr.isOkay()) { return sr; } @@ -769,7 +787,6 @@ public class LockManager { } } } - // this only needs to be done once } } @@ -786,17 +803,16 @@ public class LockManager { */ private ServerResponse<?> officialDbLockCheck(final List<LockRequest> req, String siteID) { - ServerResponse<?> sr = new ServerResponse<String>(); + Set<DatabaseID> official = null; - List<DatabaseID> official = new ArrayList<DatabaseID>(); - List<DatabaseID> officialDbs = null; try { - officialDbs = IFPServerConfigManager.getServerConfig(siteID) - .getOfficialDatabases(); + List<DatabaseID> officialDbs = IFPServerConfigManager + .getServerConfig(siteID).getOfficialDatabases(); + official = new HashSet<DatabaseID>(officialDbs.size(), 1); - for (int j = 0; j < officialDbs.size(); j++) { - official.add(officialDbs.get(j).stripModelTime()); + for (DatabaseID offDbId : officialDbs) { + official.add(offDbId.stripModelTime()); } } catch (GfeException e) { sr.addMessage("Unable to get official databases from IFPServer config"); @@ -806,15 +822,15 @@ public class LockManager { } // process each request - extracting out the databse id w/o modeltime - for (int i = 0; i < req.size(); i++) { + for (LockRequest lr : req) { DatabaseID requestDB = null; - if (req.get(i).isDatabaseRequest()) { - requestDB = req.get(i).getDbId(); - } else if (req.get(i).isParmRequest()) { - requestDB = req.get(i).getParmId().getDbId(); + if (lr.isDatabaseRequest()) { + requestDB = lr.getDbId(); + } else if (lr.isParmRequest()) { + requestDB = lr.getParmId().getDbId(); } else { sr.addMessage("Invalid Lock Request (not parm or databse type): " - + req.get(i)); + + lr); return sr; } requestDB = requestDB.stripModelTime(); @@ -822,7 +838,7 @@ public class LockManager { // look for a match if (official.contains(requestDB)) { sr.addMessage("Request locks on official database not permitted. Request=" - + req.get(i)); + + lr); return sr; } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/IFPWE.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/IFPWE.java index 6b87a206b4..645b6f8101 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/IFPWE.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/IFPWE.java @@ -24,7 +24,9 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map.Entry; import java.util.TimeZone; import com.raytheon.edex.plugin.gfe.config.IFPServerConfig; @@ -35,7 +37,6 @@ import com.raytheon.edex.plugin.gfe.server.lock.LockManager; import com.raytheon.edex.plugin.gfe.util.SendNotifications; import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; -import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.dataplugin.gfe.discrete.DiscreteKey; @@ -77,6 +78,9 @@ import com.raytheon.uf.common.time.TimeRange; * Jan 22, 2010 4248 njensen Better error msgs * Jul 25, 2012 #957 dgilling Implement getEditArea(). * Apr 23, 2013 #1937 dgilling Implement get(). + * Apr 23, 2013 #1941 dgilling Implement put(), add methods to build + * Scalar/VectorGridSlices, refactor + * Discrete/WeatherGridSlices builders. * * </pre> * @@ -234,6 +238,76 @@ public class IFPWE { return rval; } + /** + * Stores the provided grid slices into this weather element's permanent + * storage. + * + * @param inventory + * A Map of TimeRanges to IGridSlices to be saved. Time is the + * slice's valid time. + * @param timeRangeSpan + * The replacement time range of grids to be saved. Must cover + * each individual TimeRange in inventory. + * @throws GfeException + * If an error occurs while trying to obtain a lock on the + * destination database. + */ + public void put(LinkedHashMap<TimeRange, IGridSlice> inventory, + TimeRange timeRangeSpan) throws GfeException { + statusHandler.debug("Getting lock for ParmID: " + parmId + " TR: " + + timeRangeSpan); + ServerResponse<List<LockTable>> lockResponse = LockManager + .getInstance().requestLockChange( + new LockRequest(parmId, timeRangeSpan, LockMode.LOCK), + wsId, siteId); + if (lockResponse.isOkay()) { + statusHandler.debug("LOCKING: Lock granted for: " + wsId + + " for time range: " + timeRangeSpan); + } else { + statusHandler.error("Could not lock TimeRange " + timeRangeSpan + + " for parm [" + parmId + "]: " + lockResponse.message()); + throw new GfeException("Request lock failed. " + + lockResponse.message()); + } + + List<GFERecord> records = new ArrayList<GFERecord>(inventory.size()); + for (Entry<TimeRange, IGridSlice> entry : inventory.entrySet()) { + GFERecord rec = new GFERecord(parmId, entry.getKey()); + rec.setGridHistory(entry.getValue().getHistory()); + rec.setMessageData(entry.getValue()); + records.add(rec); + } + SaveGridRequest sgr = new SaveGridRequest(parmId, timeRangeSpan, + records); + + try { + ServerResponse<?> sr = GridParmManager.saveGridData( + Arrays.asList(sgr), wsId, siteId); + if (sr.isOkay()) { + SendNotifications.send(sr.getNotifications()); + } else { + statusHandler.error("Unable to save grids for parm [" + parmId + + "] over time range " + timeRangeSpan + ": " + + sr.message()); + } + } finally { + ServerResponse<List<LockTable>> unLockResponse = LockManager + .getInstance().requestLockChange( + new LockRequest(parmId, timeRangeSpan, + LockMode.UNLOCK), wsId, siteId); + if (unLockResponse.isOkay()) { + statusHandler.debug("LOCKING: Unlocked for: " + wsId + " TR: " + + timeRangeSpan); + } else { + statusHandler.error("Could not unlock TimeRange " + + timeRangeSpan + " for parm [" + parmId + "]: " + + lockResponse.message()); + throw new GfeException("Request unlock failed. " + + unLockResponse.message()); + } + } + } + private void setItem(TimeRange time, IGridSlice gridSlice, List<GridDataHistory> gdh) throws GfeException { GFERecord rec = new GFERecord(parmId, time); @@ -373,9 +447,7 @@ public class IFPWE { public void setItemDiscrete(TimeRange time, byte[] discreteData, String keys, List<GridDataHistory> gdhList) throws GfeException { IGridSlice gridSlice = buildDiscreteSlice(time, discreteData, keys, - gpi.getGridType()); - gridSlice - .setHistory(gdhList.toArray(new GridDataHistory[gdhList.size()])); + gdhList); setItem(time, gridSlice, gdhList); } @@ -393,9 +465,7 @@ public class IFPWE { public void setItemWeather(TimeRange time, byte[] weatherData, String keys, List<GridDataHistory> gdhList) throws GfeException { IGridSlice gridSlice = buildWeatherSlice(time, weatherData, keys, - gpi.getGridType()); - gridSlice - .setHistory(gdhList.toArray(new GridDataHistory[gdhList.size()])); + gdhList); setItem(time, gridSlice, gdhList); } @@ -433,60 +503,96 @@ public class IFPWE { return keys.toArray(new String[keys.size()]); } + /** + * Builds a ScalarGridSlice to store. + * + * @param time + * The valid time of the slice. + * @param data + * A float array that corresponds to the slice's data. + * @param history + * The GridDataHistory for the new slice. + * @return A ScalarGridSlice based on the provided data, valid for the given + * time, with the provided history. + */ + public ScalarGridSlice buildScalarSlice(TimeRange time, float[] data, + List<GridDataHistory> history) { + return new ScalarGridSlice(time, gpi, history, new Grid2DFloat(gpi + .getGridLoc().getNx(), gpi.getGridLoc().getNy(), data)); + } + + /** + * Builds a VectorGridSlice to store. + * + * @param time + * The valid time of the slice. + * @param magData + * A float array that corresponds to the slice's magnitude data. + * @param dirData + * A float array that corresponds to the slice's directional + * data. + * @param history + * The GridDataHistory for the new slice. + * @return A VectorGridSlice based on the provided data, valid for the given + * time, with the provided history. + */ + public VectorGridSlice buildVectorSlice(TimeRange time, float[] magData, + float[] dirData, List<GridDataHistory> history) { + return new VectorGridSlice(time, gpi, history, new Grid2DFloat(gpi + .getGridLoc().getNx(), gpi.getGridLoc().getNy(), magData), + new Grid2DFloat(gpi.getGridLoc().getNx(), gpi.getGridLoc() + .getNy(), dirData)); + } + /** * Builds a discrete grid slice to store * * @param time - * the time of the data - * @param slice - * an Object[] { byte[], String } corresponding to discrete/wx - * types - * @param type - * the type of the data + * The valid time of the data. + * @param bytes + * A byte[] corresponding to discrete + * @param keyString + * Python encoded form of discrete keys. + * @param history + * histories for this grid. * @return - * @throws GfeException */ - private IGridSlice buildDiscreteSlice(TimeRange time, byte[] bytes, - String keyString, GridType type) throws GfeException { + public DiscreteGridSlice buildDiscreteSlice(TimeRange time, byte[] bytes, + String keyString, List<GridDataHistory> history) { List<DiscreteKey> discreteKeyList = new ArrayList<DiscreteKey>(); List<String> keys = GfeUtil.discreteKeyStringToList(keyString); for (String k : keys) { discreteKeyList.add(new DiscreteKey(siteId, k, parmId)); } - return new DiscreteGridSlice( - time, - gpi, - new GridDataHistory[] {}, - new Grid2DByte(gpi.getGridLoc().getNx(), gpi.getGridLoc() - .getNy(), bytes), - discreteKeyList.toArray(new DiscreteKey[discreteKeyList.size()])); + return new DiscreteGridSlice(time, gpi, history, new Grid2DByte(gpi + .getGridLoc().getNx(), gpi.getGridLoc().getNy(), bytes), + discreteKeyList); } /** * Builds a weather grid slice to store * * @param time - * the time of the data - * @param slice - * an Object[] { byte[], String } corresponding to weather/wx - * types - * @param type - * the type of the data + * The valid time of the data. + * @param bytes + * A byte[] corresponding to weather + * @param keyString + * Python encoded form of weather keys. + * @param history + * histories for this grid. * @return - * @throws GfeException */ - private IGridSlice buildWeatherSlice(TimeRange time, byte[] bytes, - String keyString, GridType type) throws GfeException { + public WeatherGridSlice buildWeatherSlice(TimeRange time, byte[] bytes, + String keyString, List<GridDataHistory> history) { List<WeatherKey> weatherKeyList = new ArrayList<WeatherKey>(); List<String> keys = GfeUtil.discreteKeyStringToList(keyString); for (String k : keys) { weatherKeyList.add(new WeatherKey(siteId, k)); } - return new WeatherGridSlice(time, gpi, new GridDataHistory[] {}, - new Grid2DByte(gpi.getGridLoc().getNx(), gpi.getGridLoc() - .getNy(), bytes), - weatherKeyList.toArray(new WeatherKey[weatherKeyList.size()])); + return new WeatherGridSlice(time, gpi, history, new Grid2DByte(gpi + .getGridLoc().getNx(), gpi.getGridLoc().getNy(), bytes), + weatherKeyList); } @Override diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrv.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrv.java index d80b4fd2f2..5567b535a6 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrv.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrv.java @@ -54,7 +54,7 @@ import com.raytheon.uf.edex.core.props.PropertiesFactory; * Jul 17, 2009 #2590 njensen Multiple site support * Jul 28, 2010 #6725 jdynina Manual init support * Aug 27, 2010 #3688 wkwock Find model class for a model - * + * Aug 24, 2013 #1949 rjpeter Updated start up logic * </pre> * * @author njensen @@ -63,7 +63,7 @@ import com.raytheon.uf.edex.core.props.PropertiesFactory; public class SmartInitSrv { - private Map<Long, SmartInitScript> cachedInterpreters = new HashMap<Long, SmartInitScript>(); + private final Map<Long, SmartInitScript> cachedInterpreters = new HashMap<Long, SmartInitScript>(); private static boolean enabled = true; @@ -84,7 +84,6 @@ public class SmartInitSrv { thread.pendingInitMinTimeMillis = cfg.getPendingInitMinTimeMillis(); thread.runningInitTimeOutMillis = cfg.getRunningInitTimeOutMillis(); thread.threadSleepInterval = cfg.getThreadSleepInterval(); - thread.initialDelay = cfg.getInitialDelay(); executor.execute(thread); } } @@ -99,21 +98,18 @@ public class SmartInitSrv { private final transient Log logger = LogFactory.getLog(getClass()); - private int initialDelay = 120000; - @Override public void run() { - long curTime = System.currentTimeMillis(); - while (!EDEXUtil.isRunning() - || System.currentTimeMillis() - curTime < initialDelay) { - try { - Thread.sleep(threadSleepInterval); - } catch (Throwable t) { - // ignore - } - } - try { + // Wait for server to come fully up due to route dependencies + while (!EDEXUtil.isRunning()) { + try { + Thread.sleep(threadSleepInterval); + } catch (InterruptedException e) { + // ignore + } + } + // run forever while (true) { SmartInitRecord record = SmartInitTransactions @@ -170,7 +166,7 @@ public class SmartInitSrv { LocalizationLevel.BASE); File file = pathMgr.getFile(ctx, "smartinit"); - if (file != null && file.exists()) { + if ((file != null) && file.exists()) { initScript.addSitePath(file.getPath(), pathMgr .getFile(baseCtx, "smartinit") .getPath()); @@ -178,7 +174,7 @@ public class SmartInitSrv { } file = pathMgr.getFile(ctx, FileUtil.join("config", "gfe")); - if (file != null && file.exists()) { + if ((file != null) && file.exists()) { initScript.addSitePath( file.getPath(), pathMgr.getFile(baseCtx, diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrvConfig.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrvConfig.java index 11167ac8d2..cf463847b5 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrvConfig.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/SmartInitSrvConfig.java @@ -30,7 +30,7 @@ import java.util.concurrent.Executor; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 24, 2010 #7277 rjpeter Initial creation - * + * Apr 23, 2013 #1949 rjpeter Removed initial delay * </pre> * * @author rjpeter @@ -48,8 +48,6 @@ public class SmartInitSrvConfig { protected int threadSleepInterval; - protected int initialDelay; - public int getThreads() { return threads; } @@ -90,12 +88,4 @@ public class SmartInitSrvConfig { this.threadSleepInterval = threadSleepInterval; } - public int getInitialDelay() { - return initialDelay; - } - - public void setInitialDelay(int initialDelay) { - this.initialDelay = initialDelay; - } - } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py index 5d92198fe2..0bdf4c8e9a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py @@ -32,6 +32,7 @@ import numpy import JUtil from java.util import ArrayList +from java.util import LinkedHashMap from com.raytheon.uf.common.dataplugin.gfe.grid import Grid2DFloat from com.raytheon.uf.common.dataplugin.gfe.grid import Grid2DByte from com.raytheon.uf.common.time import TimeRange @@ -74,7 +75,8 @@ from com.raytheon.uf.edex.database.cluster import ClusterTask # 07/06/09 1995 bphillip Initial Creation. # 01/17/13 15588 jdynina Fixed Publish history removal # 03/12/13 1759 dgilling Remove unnecessary command line -# processing. +# processing. +# 04/24/13 1941 dgilling Re-port WECache to match A1. # # @@ -86,53 +88,49 @@ ISC_USER="isc" class WECache(object): def __init__(self, we, tr=None): - self._grids = [] - self._hist = [] self._we = we - self._inv = [] - theKeys = self._we.getKeys() - - for i in range(0, theKeys.size()): - self._inv.append(iscUtil.transformTime(theKeys.get(i))) + self._inv = {} + self._invCache = None + javaInv = self._we.getKeys() + pyInv = [] + for i in xrange(javaInv.size()): + pyInv.append(iscUtil.transformTime(javaInv.get(i))) # Dont get grids outside of the passed in timerange. if tr: tokill = [] - for i, t in enumerate(self._inv): + for i, t in enumerate(pyInv): if not self.overlaps(tr, t): tokill.append(i) tokill.reverse() for i in tokill: - del self._inv[i] + del pyInv[i] + + javaTRs = ArrayList() + for tr in pyInv: + javaTRs.add(iscUtil.toJavaTimeRange(tr)) + gridsAndHist = self._we.get(javaTRs, True) + for idx, tr in enumerate(pyInv): + pair = gridsAndHist.get(idx) + g = self.__encodeGridSlice(pair.getFirst()) + h = self.__encodeGridHistory(pair.getSecond()) + self._inv[tr] = (g, h) def keys(self): - return tuple(self._inv) + if not self._invCache: + self._invCache = tuple(sorted(self._inv.keys(), key=lambda t: t[0])) + return self._invCache def __getitem__(self, key): - grid = self._we.getItem(iscUtil.toJavaTimeRange(key)) - history = grid.getGridDataHistory() - hist = [] - for i in range(0, history.size()): - hist.append(history.get(i)) - gridType = grid.getGridInfo().getGridType().toString() - if gridType == "SCALAR": - return (grid.__numpy__[0], hist) - elif gridType == "VECTOR": - vecGrids = grid.__numpy__ - return ((vecGrids[0], vecGrids[1]), hist) - elif gridType == "WEATHER": - keys = grid.getKeys() - keyList = [] - for theKey in keys: - keyList.append(theKey.toString()) - return ((grid.__numpy__[0], keyList), hist) - elif gridType == "DISCRETE": - keys = grid.getKey() - keyList = [] - for theKey in keys: - keyList.append(theKey.toString()) - return ((grid.__numpy__[0], keyList), hist) + try: + return self._inv[key] + except KeyError: + grid = self._we.getItem(iscUtil.toJavaTimeRange(key)) + pyGrid = self.__encodeGridSlice(grid) + history = grid.getGridDataHistory() + pyHist = self.__encodeGridHistory(history) + return (pyGrid, pyHist) def __setitem__(self, tr, value): if value is None: @@ -142,48 +140,106 @@ class WECache(object): # Remove any overlapping grids tokill = [] - for i, itr in enumerate(self._inv): + for itr in self._inv: if self.overlaps(tr, itr): - tokill.append(i) - tokill.reverse() + tokill.append(itr) for i in tokill: - del self._inv[i] + del self._inv[i] + self._invCache = None # Now add the new grid if it exists if grid is not None: - timeRange=iscUtil.toJavaTimeRange(tr) - LogStream.logDebug("iscMosaic: Saving Parm:",self._we.getParmid(),"TR:",timeRange) - gridType = self._we.getGridType() - index = bisect.bisect_left(map(lambda x : x[0], self._inv), tr[0]) - self._inv.insert(index, tr) - history = ArrayList() + self._inv[tr] = (grid, hist) + self._invCache = None - for h in hist: - dbName = self._we.getParmid().getDbId().toString() - if dbName.find('Fcst') != -1: - #strip out publish time to allow for publishing correctly - #when merging Fcst out of A1 - hh = GridDataHistory(h) - hh.setPublishTime(None) - history.add(hh) - else: - history.add(GridDataHistory(h)) - if gridType == 'SCALAR': - self._we.setItemScalar(timeRange, grid.astype(numpy.float32), history) - elif gridType == 'VECTOR': - self._we.setItemVector(timeRange, grid[0].astype(numpy.float32), grid[1].astype(numpy.float32), history) - elif gridType == 'WEATHER': - self._we.setItemWeather(timeRange, grid[0].astype(numpy.byte), str(grid[1]), history) - elif gridType == 'DISCRETE': - self._we.setItemDiscrete(timeRange, grid[0].astype(numpy.byte), str(grid[1]), history) - LogStream.logDebug("iscMosaic: Successfully saved Parm:",self._we.getParmid(),"Time:",timeRange) - + def flush(self): + """Actually writes the contents of the WECache to HDF5/DB""" + # get cache inventory in time range order + # we want to write to disk in contiguous time range blocks so we only + # overwrite what we have full sets of grids for. + inv = list(self.keys()) + # Don't believe the grid slices need to be in time order when saving + # but leaving them that way just in case. + gridsToSave = LinkedHashMap() + while inv: + # retrieve the next BATCH of grids to persist + i = inv[:BATCH_WRITE_COUNT] + # pre-compute the replacement TR for the save requests generated by + # IFPWE.put(). + # since the inventory is in order it's the start time of the + # first TR and the end time of the last TR. + gridSaveTR = iscUtil.toJavaTimeRange((i[0][0], i[-1][1])) + for tr in i: + javaTR = iscUtil.toJavaTimeRange(tr) + pyGrid, pyHist = self._inv[tr] + javaHist = self.__buildJavaGridHistory(pyHist) + javaGrid = self.__buildJavaGridSlice(javaTR, pyGrid, javaHist) + gridsToSave.put(javaTR, javaGrid) + self._we.put(gridsToSave, gridSaveTR) + # delete the persisted items from the cache and our copy of the + # inventory + gridsToSave.clear() + for tr in i: + del self._inv[tr] + self._invCache = None + inv = inv[BATCH_WRITE_COUNT:] + time.sleep(BATCH_DELAY) + def overlaps(self, tr1, tr2): if (tr1[0] >= tr2[0] and tr1[0] < tr2[1]) or \ (tr2[0] >= tr1[0] and tr2[0] < tr1[1]): return True return False + + def __encodeGridSlice(self, grid): + gridType = self._we.getGridType() + if gridType == "SCALAR": + return grid.__numpy__[0] + elif gridType == "VECTOR": + vecGrids = grid.__numpy__ + return (vecGrids[0], vecGrids[1]) + elif gridType == "WEATHER": + keys = grid.getKeys() + keyList = [] + for theKey in keys: + keyList.append(theKey.toString()) + return (grid.__numpy__[0], keyList) + elif gridType =="DISCRETE": + keys = grid.getKey() + keyList = [] + for theKey in keys: + keyList.append(theKey.toString()) + return (grid.__numpy__[0], keyList) + + def __encodeGridHistory(self, histories): + retVal = [] + for i in xrange(histories.size()): + retVal.append(histories.get(i).getCodedString()) + return tuple(retVal) + + def __buildJavaGridSlice(self, tr, grid, history): + gridType = self._we.getGridType() + if gridType == "SCALAR": + return self._we.buildScalarSlice(tr, grid.astype(numpy.float32), history) + elif gridType == "VECTOR": + return self._we.buildVectorSlice(tr, grid[0].astype(numpy.float32), grid[1].astype(numpy.float32), history) + elif gridType == "WEATHER": + return self._we.buildWeatherSlice(tr, grid[0].astype(numpy.byte), str(grid[1]), history) + elif gridType == "DISCRETE": + return self._we.buildDiscreteSlice(tr, grid[0].astype(numpy.byte), str(grid[1]), history) + + def __buildJavaGridHistory(self, histories): + retVal = ArrayList() + blankPubTime = "Fcst" in self._we.getParmid().getDbId().toString() + for histEntry in histories: + javaHist = GridDataHistory(histEntry) + # strip out publish time to allow for publishing correctly + # when merging Fcst out of A1 + if blankPubTime: + javaHist.setPublishTime(None) + retVal.add(javaHist) + return retVal class IscMosaic: @@ -549,7 +605,8 @@ class IscMosaic: # Returns tuple of (parmName, TR, #grids, #fails) if len(inTimesProc): totalTimeRange = (inTimesProc[0][0], inTimesProc[ -1][ -1] - 3600) - + self._wec.flush() + retryAttempt = retries except: retryAttempt = retryAttempt + 1 diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-common.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-common.xml new file mode 100644 index 0000000000..9a0ea1ce39 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-common.xml @@ -0,0 +1,43 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> + <bean id="gribPathProvider" class="com.raytheon.uf.common.dataplugin.grib.GribPathProvider" /> + + <bean id="gribProperties" class="com.raytheon.uf.common.dataplugin.PluginProperties"> + <property name="pluginName" value="grib" /> + <property name="pluginFQN" value="com.raytheon.uf.common.dataplugin.grib" /> + <property name="dao" value="com.raytheon.edex.plugin.grib.dao.GribDao" /> + <property name="record" value="com.raytheon.uf.common.dataplugin.grib.GribRecord" /> + <property name="dependencyFQNs"> + <list> + <value>com.raytheon.uf.common.dataplugin.level</value> + <value>com.raytheon.uf.common.parameter</value> + <value>com.raytheon.uf.common.gridcoverage</value> + </list> + </property> + <property name="pathProvider"> + <ref bean="gribPathProvider"/> + </property> + <property name="compression" value="LZF"/> + </bean> + + <bean id="gribRegistered" factory-bean="pluginRegistry" factory-method="register" + depends-on="levelRegistered,parameterRegistered,gridcoverageRegistered"> + <constructor-arg value="grib"/> + <constructor-arg ref="gribProperties"/> + </bean> + + <bean id="gfeLoadGribParamInfo" + class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <property name="targetClass"> + <value>com.raytheon.edex.plugin.gfe.paraminfo.GridParamInfoLookup</value> + </property> + <property name="targetMethod"> + <value>enableLoadGribDefs</value> + </property> + </bean> + + +</beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-decode.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-decode.xml new file mode 100644 index 0000000000..6ff7fd3c23 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-decode.xml @@ -0,0 +1,129 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> + + <bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" /> + + <bean id="ingest-grib" class="org.apache.camel.component.jms.JmsComponent"> + <constructor-arg ref="jmsIngestGribConfig" /> + <property name="taskExecutor" ref="gribThreadPool" /> + </bean> + + <bean id="jmsIngestGribConfig" class="org.apache.camel.component.jms.JmsConfiguration" + factory-bean="jmsConfig" factory-method="copy"> + </bean> + + <bean id="gribDecodeThreads" class="java.lang.Integer"> + <constructor-arg value="${grib-decode.count.threads}" /> + </bean> + + <bean id="gribThreadPool" + class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor"> + <property name="corePoolSize" ref="gribDecodeThreads" /> + <property name="maxPoolSize" ref="gribDecodeThreads" /> + </bean> + + <bean id="largeFileChecker" class="com.raytheon.edex.plugin.grib.GribLargeFileChecker" /> + + <bean id="gribSplitter" class="com.raytheon.edex.plugin.grib.GribSplitter"> + <constructor-arg value="${edex.home}/data/tmp/"/> + </bean> + + <bean id="useLatestAggregationStrategy" class="org.apache.camel.processor.aggregate.UseLatestAggregationStrategy" /> + + <bean id="largeFileLockRelease" class="com.raytheon.edex.plugin.grib.GribLockRelease" /> + + <bean id="gribDecodeCamelRegistered" factory-bean="contextManager" + factory-method="register" depends-on="persistCamelRegistered"> + <constructor-arg ref="grib-decode"/> + </bean> + + <bean id="gribPostProcessor" + class="com.raytheon.edex.plugin.grib.decoderpostprocessors.GribPostProcessor" + factory-method="getInstance" /> + + <bean id="gridToGribConverter" + class="com.raytheon.edex.plugin.grib.GridToGribConverter" factory-method="getInstance" /> + + <bean id="gribTableLookup" class="com.raytheon.edex.util.grib.GribTableLookup" + factory-method="getInstance" depends-on="gridRegistered" /> + + <bean id="gribModelLookup" + class="com.raytheon.edex.plugin.grib.util.GribModelLookup" + factory-method="getInstance" init-method="initCommonStaticModels"/> + + <bean id="gribSpatialCache" + class="com.raytheon.edex.plugin.grib.spatial.GribSpatialCache" + factory-method="getInstance" depends-on="gridcoveragelookup"/> + + <camelContext id="grib-decode" xmlns="http://camel.apache.org/schema/spring" + errorHandlerRef="errorHandler" + autoStartup="false"> + + <endpoint id="gribFileEndpoint" uri="file:${edex.home}/data/sbn/grib?noop=true&idempotent=false" /> + + <route id="gribFileConsumerRoute"> + <from ref="gribFileEndpoint" /> + <bean ref="fileToString" /> + <setHeader headerName="pluginName"> + <constant>grid</constant> + </setHeader> + <to uri="ingest-grib:queue:Ingest.Grib" /> + </route> + + <!-- Begin Grib Decode Route --> + <route id="gribIngestRoute"> + <from uri="ingest-grib:queue:Ingest.Grib?concurrentConsumers=#gribDecodeThreads&destinationResolver=#qpidDurableResolver" /> + <setHeader headerName="pluginName"> + <constant>grid</constant> + </setHeader> + <!-- strategyRef is needed because of camel bug https://issues.apache.org/activemq/browse/CAMEL-3333, + without the strategy it uses the original message in the multicast and it loses the largeFileLock header --> + <split strategyRef="useLatestAggregationStrategy"> + <method bean="gribSplitter" method="split" /> + <choice> + <when> + <simple>${header.CamelSplitSize} == 1</simple> + <doTry> + <pipeline> + <bean ref="stringToFile" /> + <bean ref="largeFileChecker" /> + <bean ref="gribDecoder" /> + <bean ref="gribSplitter" method="clean" /> + <!-- send for processing --> + <bean ref="gribPostProcessor" method="process" /> + <multicast parallelProcessing="false"> + <!-- send to persistence --> + <to uri="directvm:persistIndexAlert" /> + <!-- send to transform --> + <to uri="directvm:gridToGrib"/> + </multicast> + </pipeline> + <doCatch> + <exception>java.lang.Throwable</exception> + <to uri="log:grib?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/> + </doCatch> + <doFinally> + <bean ref="largeFileLockRelease" /> + </doFinally> + </doTry> + </when> + <otherwise> + <to uri="ingest-grib:queue:Ingest.Grib" /> + </otherwise> + </choice> + </split> + </route> + + <route id="gridToGrib"> + <from uri="directvm:gridToGrib"/> + <bean ref="gridToGribConverter" method="convert"/> + <bean ref="index" method="index"/> + <bean ref="toDataURI" method="toDataURI"/> + <to uri="vm:stageNotification"/> + </route> + + </camelContext> +</beans> diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-request.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-request.xml new file mode 100644 index 0000000000..24e5adf942 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.deprecated/grib-request.xml @@ -0,0 +1,19 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> + + <bean id="gridDataQueryHandler" class="com.raytheon.edex.plugin.grib.handler.GridDataHandler" /> + + <bean factory-bean="handlerRegistry" factory-method="register"> + <constructor-arg value="com.raytheon.uf.common.dataplugin.grib.request.GridDataRequestMessage"/> + <constructor-arg ref="gridDataQueryHandler"/> + </bean> + + <bean id="deleteAllModelDataHandler" class="com.raytheon.edex.plugin.grib.handler.DeleteAllModelDataHandler" /> + <bean factory-bean="handlerRegistry" factory-method="register"> + <constructor-arg value="com.raytheon.uf.common.dataplugin.grib.request.DeleteAllModelDataRequest"/> + <constructor-arg ref="deleteAllModelDataHandler"/> + </bean> + </beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-common.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-common.xml new file mode 100644 index 0000000000..1192c22860 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-common.xml @@ -0,0 +1,6 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> + <!-- In the future this file doesn't exist. --> + +</beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml new file mode 100644 index 0000000000..5e61d2c6ac --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml @@ -0,0 +1,113 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> + + <bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" /> + + <bean id="ingest-grib" class="org.apache.camel.component.jms.JmsComponent"> + <constructor-arg ref="jmsIngestGribConfig" /> + <property name="taskExecutor" ref="gribThreadPool" /> + </bean> + + <bean id="jmsIngestGribConfig" class="org.apache.camel.component.jms.JmsConfiguration" + factory-bean="jmsConfig" factory-method="copy"> + </bean> + + <bean id="gribDecodeThreads" class="java.lang.Integer"> + <constructor-arg value="${grib-decode.count.threads}" /> + </bean> + + <bean id="gribThreadPool" + class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor"> + <property name="corePoolSize" ref="gribDecodeThreads" /> + <property name="maxPoolSize" ref="gribDecodeThreads" /> + </bean> + + <bean id="largeFileChecker" class="com.raytheon.edex.plugin.grib.GribLargeFileChecker" /> + + <bean id="gribSplitter" class="com.raytheon.edex.plugin.grib.GribSplitter"> + <constructor-arg value="${edex.home}/data/tmp/"/> + </bean> + + <bean id="useLatestAggregationStrategy" class="org.apache.camel.processor.aggregate.UseLatestAggregationStrategy" /> + + <bean id="largeFileLockRelease" class="com.raytheon.edex.plugin.grib.GribLockRelease" /> + + <bean id="gribDecodeCamelRegistered" factory-bean="contextManager" + factory-method="register" depends-on="persistCamelRegistered"> + <constructor-arg ref="grib-decode"/> + </bean> + + <bean id="gribPostProcessor" + class="com.raytheon.edex.plugin.grib.decoderpostprocessors.GribPostProcessor" + factory-method="getInstance" /> + + <bean id="gribTableLookup" class="com.raytheon.edex.util.grib.GribTableLookup" + factory-method="getInstance" depends-on="gridRegistered" /> + + <bean id="gribModelLookup" + class="com.raytheon.edex.plugin.grib.util.GribModelLookup" + factory-method="getInstance" /> + + <bean id="gribSpatialCache" + class="com.raytheon.edex.plugin.grib.spatial.GribSpatialCache" + factory-method="getInstance" depends-on="gridcoveragelookup"/> + + <camelContext id="grib-decode" xmlns="http://camel.apache.org/schema/spring" + errorHandlerRef="errorHandler" + autoStartup="false"> + + <endpoint id="gribFileEndpoint" uri="file:${edex.home}/data/sbn/grib?noop=true&idempotent=false" /> + + <route id="gribFileConsumerRoute"> + <from ref="gribFileEndpoint" /> + <bean ref="fileToString" /> + <setHeader headerName="pluginName"> + <constant>grid</constant> + </setHeader> + <to uri="ingest-grib:queue:Ingest.Grib" /> + </route> + + <!-- Begin Grib Decode Route --> + <route id="gribIngestRoute"> + <from uri="ingest-grib:queue:Ingest.Grib?concurrentConsumers=#gribDecodeThreads&destinationResolver=#qpidDurableResolver" /> + <setHeader headerName="pluginName"> + <constant>grid</constant> + </setHeader> + <!-- strategyRef is needed because of camel bug https://issues.apache.org/activemq/browse/CAMEL-3333, + without the strategy it uses the original message in the multicast and it loses the largeFileLock header --> + <split strategyRef="useLatestAggregationStrategy"> + <method bean="gribSplitter" method="split" /> + <choice> + <when> + <simple>${header.CamelSplitSize} == 1</simple> + <doTry> + <pipeline> + <bean ref="stringToFile" /> + <bean ref="largeFileChecker" /> + <bean ref="gribDecoder" /> + <bean ref="gribSplitter" method="clean" /> + <!-- send for processing --> + <bean ref="gribPostProcessor" method="process" /> + <to uri="directvm:persistIndexAlert" /> + </pipeline> + <doCatch> + <exception>java.lang.Throwable</exception> + <to uri="log:grib?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/> + </doCatch> + <doFinally> + <bean ref="largeFileLockRelease" /> + </doFinally> + </doTry> + </when> + <otherwise> + <to uri="ingest-grib:queue:Ingest.Grib" /> + </otherwise> + </choice> + </split> + </route> + + </camelContext> +</beans> diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-request.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-request.xml new file mode 100644 index 0000000000..1192c22860 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-request.xml @@ -0,0 +1,6 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> + <!-- In the future this file doesn't exist. --> + +</beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-common.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-common.xml index 487f256ded..0026740e5f 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-common.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-common.xml @@ -1,32 +1,4 @@ -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd - http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - <bean id="gribPathProvider" class="com.raytheon.uf.common.dataplugin.grib.GribPathProvider" /> - - <bean id="gribProperties" class="com.raytheon.uf.common.dataplugin.PluginProperties"> - <property name="pluginName" value="grib" /> - <property name="pluginFQN" value="com.raytheon.uf.common.dataplugin.grib" /> - <property name="dao" value="com.raytheon.edex.plugin.grib.dao.GribDao" /> - <property name="record" value="com.raytheon.uf.common.dataplugin.grib.GribRecord" /> - <property name="dependencyFQNs"> - <list> - <value>com.raytheon.uf.common.dataplugin.level</value> - <value>com.raytheon.uf.common.parameter</value> - <value>com.raytheon.uf.common.gridcoverage</value> - </list> - </property> - <property name="pathProvider"> - <ref bean="gribPathProvider"/> - </property> - <property name="compression" value="LZF"/> - </bean> - - <bean id="gribRegistered" factory-bean="pluginRegistry" factory-method="register" - depends-on="levelRegistered,parameterRegistered,gridcoverageRegistered"> - <constructor-arg value="grib"/> - <constructor-arg ref="gribProperties"/> - </bean> - +<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> + <import resource="../spring.${gribMode}/grib-common.xml" /> </beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-decode.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-decode.xml index a4065fc62b..f9e0ee7f96 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-decode.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-decode.xml @@ -1,129 +1,4 @@ -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd - http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - <bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" /> - - <bean id="ingest-grib" class="org.apache.camel.component.jms.JmsComponent"> - <constructor-arg ref="jmsIngestGribConfig" /> - <property name="taskExecutor" ref="gribThreadPool" /> - </bean> - - <bean id="jmsIngestGribConfig" class="org.apache.camel.component.jms.JmsConfiguration" - factory-bean="jmsConfig" factory-method="copy"> - </bean> - - <bean id="gribDecodeThreads" class="java.lang.Integer"> - <constructor-arg value="${grib-decode.count.threads}" /> - </bean> - - <bean id="gribThreadPool" - class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor"> - <property name="corePoolSize" ref="gribDecodeThreads" /> - <property name="maxPoolSize" ref="gribDecodeThreads" /> - </bean> - - <bean id="largeFileChecker" class="com.raytheon.edex.plugin.grib.GribLargeFileChecker" /> - - <bean id="gribSplitter" class="com.raytheon.edex.plugin.grib.GribSplitter"> - <constructor-arg value="${edex.home}/data/tmp/"/> - </bean> - - <bean id="useLatestAggregationStrategy" class="org.apache.camel.processor.aggregate.UseLatestAggregationStrategy" /> - - <bean id="largeFileLockRelease" class="com.raytheon.edex.plugin.grib.GribLockRelease" /> - - <bean id="gribDecodeCamelRegistered" factory-bean="contextManager" - factory-method="register" depends-on="persistCamelRegistered"> - <constructor-arg ref="grib-decode"/> - </bean> - - <bean id="gribPostProcessor" - class="com.raytheon.edex.plugin.grib.decoderpostprocessors.GribPostProcessor" - factory-method="getInstance" /> - - <bean id="gridToGribConverter" - class="com.raytheon.edex.plugin.grib.GridToGribConverter" factory-method="getInstance" /> - - <bean id="gribTableLookup" class="com.raytheon.edex.util.grib.GribTableLookup" - factory-method="getInstance" depends-on="gridRegistered" /> - - <bean id="gribModelLookup" - class="com.raytheon.edex.plugin.grib.util.GribModelLookup" - factory-method="getInstance" /> - - <bean id="gribSpatialCache" - class="com.raytheon.edex.plugin.grib.spatial.GribSpatialCache" - factory-method="getInstance" depends-on="gridcoveragelookup"/> - - <camelContext id="grib-decode" xmlns="http://camel.apache.org/schema/spring" - errorHandlerRef="errorHandler" - autoStartup="false"> - - <endpoint id="gribFileEndpoint" uri="file:${edex.home}/data/sbn/grib?noop=true&idempotent=false" /> - - <route id="gribFileConsumerRoute"> - <from ref="gribFileEndpoint" /> - <bean ref="fileToString" /> - <setHeader headerName="pluginName"> - <constant>grid</constant> - </setHeader> - <to uri="ingest-grib:queue:Ingest.Grib" /> - </route> - - <!-- Begin Grib Decode Route --> - <route id="gribIngestRoute"> - <from uri="ingest-grib:queue:Ingest.Grib?concurrentConsumers=#gribDecodeThreads&destinationResolver=#qpidDurableResolver" /> - <setHeader headerName="pluginName"> - <constant>grid</constant> - </setHeader> - <!-- strategyRef is needed because of camel bug https://issues.apache.org/activemq/browse/CAMEL-3333, - without the strategy it uses the original message in the multicast and it loses the largeFileLock header --> - <split strategyRef="useLatestAggregationStrategy"> - <method bean="gribSplitter" method="split" /> - <choice> - <when> - <simple>${header.CamelSplitSize} == 1</simple> - <doTry> - <pipeline> - <bean ref="stringToFile" /> - <bean ref="largeFileChecker" /> - <bean ref="gribDecoder" /> - <bean ref="gribSplitter" method="clean" /> - <!-- send for processing --> - <bean ref="gribPostProcessor" method="process" /> - <multicast parallelProcessing="false"> - <!-- send to persistence --> - <to uri="directvm:persistIndexAlert" /> - <!-- send to transform --> - <to uri="directvm:gridToGrib"/> - </multicast> - </pipeline> - <doCatch> - <exception>java.lang.Throwable</exception> - <to uri="log:grib?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/> - </doCatch> - <doFinally> - <bean ref="largeFileLockRelease" /> - </doFinally> - </doTry> - </when> - <otherwise> - <to uri="ingest-grib:queue:Ingest.Grib" /> - </otherwise> - </choice> - </split> - </route> - - <route id="gridToGrib"> - <from uri="directvm:gridToGrib"/> - <bean ref="gridToGribConverter" method="convert"/> - <bean ref="index" method="index"/> - <bean ref="toDataURI" method="toDataURI"/> - <to uri="vm:stageNotification"/> - </route> - - </camelContext> -</beans> +<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> + <import resource="../spring.${gribMode}/grib-decode.xml" /> +</beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-request.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-request.xml index 24e5adf942..37ad36ab10 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-request.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-request.xml @@ -1,19 +1,4 @@ -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd - http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - <bean id="gridDataQueryHandler" class="com.raytheon.edex.plugin.grib.handler.GridDataHandler" /> - - <bean factory-bean="handlerRegistry" factory-method="register"> - <constructor-arg value="com.raytheon.uf.common.dataplugin.grib.request.GridDataRequestMessage"/> - <constructor-arg ref="gridDataQueryHandler"/> - </bean> - - <bean id="deleteAllModelDataHandler" class="com.raytheon.edex.plugin.grib.handler.DeleteAllModelDataHandler" /> - <bean factory-bean="handlerRegistry" factory-method="register"> - <constructor-arg value="com.raytheon.uf.common.dataplugin.grib.request.DeleteAllModelDataRequest"/> - <constructor-arg ref="deleteAllModelDataHandler"/> - </bean> - </beans> \ No newline at end of file +<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> + <import resource="../spring.${gribMode}/grib-request.xml" /> +</beans> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/util/GribModelLookup.java b/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/util/GribModelLookup.java index 3fff6f3de4..89d3434262 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/util/GribModelLookup.java +++ b/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/util/GribModelLookup.java @@ -49,6 +49,8 @@ import com.raytheon.uf.common.util.mapping.AliasList; import com.raytheon.uf.common.util.mapping.MultipleMappingException; /** + * + * Lookup a GridModel based off the information in the grib file. * * <pre> * @@ -58,13 +60,14 @@ import com.raytheon.uf.common.util.mapping.MultipleMappingException; * ------------ ---------- ----------- -------------------------- * Apr 29, 2013 DR 15715 dhuffman Near line 202; Transposed edex site and base precedence * per DR: loading was in reverse. - * + * Apr 30, 2013 bsteffen Initial javadoc + * Apr 30, 2013 1961 bsteffen Add ability to disable grib tables. + * * </pre> * - * @author + * @author unknown * @version 1.0 */ - public class GribModelLookup { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(GribModelLookup.class); @@ -216,8 +219,12 @@ public class GribModelLookup { } } - modelSet.addModels(initCommonStaticModels()); + addModels(modelSet); + long endTime = System.currentTimeMillis(); + logger.info("Grib models initialized: " + (endTime - startTime) + "ms"); + } + private void addModels(GridModelSet modelSet) { for (GridModel model : modelSet.getModels()) { modelsByName.put(model.getName(), model); for (int process : model.getProcess()) { @@ -235,8 +242,6 @@ public class GribModelLookup { } } } - long endTime = System.currentTimeMillis(); - logger.info("Grib models initialized: " + (endTime - startTime) + "ms"); } /** @@ -251,8 +256,8 @@ public class GribModelLookup { * @return * @throws GribException */ - private List<GridModel> initCommonStaticModels() { - List<GridModel> modelSet = new ArrayList<GridModel>(); + public Boolean initCommonStaticModels() { + GridModelSet modelSet = new GridModelSet(); LocalizationContext commonStaticSite = PathManagerFactory .getPathManager().getContext( LocalizationContext.LocalizationType.COMMON_STATIC, @@ -267,9 +272,11 @@ public class GribModelLookup { for (LocalizationFile modelFile : legacyFiles) { try { + logger.info("Loading deprecated gribModel file: " + + modelFile.getFile()); GridModelSet fileSet = JAXB.unmarshal(modelFile.getFile(), GridModelSet.class); - modelSet.addAll(fileSet.getModels()); + modelSet.addModels(fileSet.getModels()); ArrayList<DatasetInfo> infoList = new ArrayList<DatasetInfo>( fileSet.getModels().size()); for (GridModel model : fileSet.getModels()) { @@ -332,7 +339,10 @@ public class GribModelLookup { } } } - return modelSet; + if (modelSet.getModels() != null) { + addModels(modelSet); + } + return modelSet.getModels() != null && !modelSet.getModels().isEmpty(); } private String toKey(Integer center, Integer subcenter, String grid, diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.edex.plugin.modelsounding/META-INF/MANIFEST.MF index 335175afe0..5bbd5a3cf8 100644 --- a/edexOsgi/com.raytheon.edex.plugin.modelsounding/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.edex.plugin.modelsounding/META-INF/MANIFEST.MF @@ -12,7 +12,8 @@ Require-Bundle: com.raytheon.edex.common, org.apache.commons.logging, javax.persistence, com.raytheon.uf.common.site;bundle-version="1.12.1174", - com.raytheon.uf.common.status;bundle-version="1.12.1174" + com.raytheon.uf.common.status;bundle-version="1.12.1174", + org.apache.commons.lang;bundle-version="2.3.0" Export-Package: com.raytheon.edex.plugin.modelsounding, com.raytheon.edex.plugin.modelsounding.common, com.raytheon.edex.plugin.modelsounding.dao, diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/ModelSoundingDecoder.java b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/ModelSoundingDecoder.java index 7b6e5878ab..85281093c9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/ModelSoundingDecoder.java +++ b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/ModelSoundingDecoder.java @@ -60,6 +60,9 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader; * 20080303 1026 jkorman Initial implementation. * 20080408 1039 jkorman Added traceId for tracing data. * 11/25/08 #1684 chammack Camel Refactor + * 04/29/13 #1861 bkowal Create a separate Point Data Container for + * every record so each forecast hour will + * receive a unique hdf5 file. * * </pre> * @@ -148,9 +151,13 @@ public class ModelSoundingDecoder extends AbstractDecoder implements Iterator<BUFRDataDocument> iterator = document.iterator(); List<SoundingSite> pdoList = new ArrayList<SoundingSite>(); - PointDataContainer container = PointDataContainer - .build(pdd); while (iterator.hasNext()) { + /* + * Would it be better to cache the Point Data Container + * based on reftime and forecast hour? + */ + PointDataContainer container = PointDataContainer + .build(pdd); SoundingSite soundingData = ModelSoundingDataAdapter .createSoundingData(iterator, wmoHeader, container); diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/ModelSoundingPathProvider.java b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/ModelSoundingPathProvider.java new file mode 100644 index 0000000000..fb7851aa5f --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/ModelSoundingPathProvider.java @@ -0,0 +1,72 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.edex.plugin.modelsounding.common; + +import com.raytheon.uf.common.dataplugin.persist.DefaultPathProvider; +import com.raytheon.uf.common.dataplugin.persist.IPersistable; + +/** + * Path Provider for Model Sounding Data. + * + * <pre> + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Apr 26, 2013 bkowal Initial creation + * + * </pre> + * + * @author bkowal + * @version 1.0 + */ + +public class ModelSoundingPathProvider extends DefaultPathProvider { + private static final String FILENAME_SEPARATOR = "-"; + + private static final String FORECAST_HR_SPECIFIER = "FH"; + + /** + * + */ + public ModelSoundingPathProvider() { + } + + @Override + public String getHDFFileName(String pluginName, IPersistable persistable) { + SoundingSite soundingSite = (SoundingSite) persistable; + + long forecastHour = soundingSite.getFcstSeconds() / 3600; + + StringBuilder stringBuilder = new StringBuilder(pluginName); + stringBuilder.append(FILENAME_SEPARATOR); + stringBuilder.append(soundingSite.getReportType()); + stringBuilder.append(fileNameFormat.get().format( + soundingSite.getDataTime().getRefTime())); + stringBuilder.append(FILENAME_SEPARATOR); + stringBuilder.append(FORECAST_HR_SPECIFIER); + stringBuilder.append(FILENAME_SEPARATOR); + stringBuilder.append(Long.toString(forecastHour)); + stringBuilder.append(DefaultPathProvider.HDF5_SUFFIX); + + return stringBuilder.toString(); + } +} \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/SoundingSite.java b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/SoundingSite.java index 48f48e1eb5..e01e087a05 100644 --- a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/SoundingSite.java +++ b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/common/SoundingSite.java @@ -76,839 +76,835 @@ import com.vividsolutions.jts.geom.Geometry; * Both refTime and forecastTime are included in the refTimeIndex since * forecastTime is unlikely to be used. */ -@org.hibernate.annotations.Table( - appliesTo = "modelsounding", - indexes = { - @Index(name = "modelsounding_refTimeIndex", columnNames = { "refTime", "forecastTime" } ) - } -) +@org.hibernate.annotations.Table(appliesTo = "modelsounding", indexes = { @Index(name = "modelsounding_refTimeIndex", columnNames = { + "refTime", "forecastTime" }) }) @DynamicSerialize @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement public class SoundingSite extends PersistablePluginDataObject implements - ISpatialEnabled, IDecoderGettable, IPointData, IPersistable { - - private static final long serialVersionUID = 1L; - - // The profiler observation time. - @Column - @DynamicSerializeElement - @XmlElement - private Calendar timeObs; - - @Column - @DynamicSerializeElement - @XmlElement - private Long fcstSeconds; - - // These site ids are not strictly ICAO ids! - @Column - @DynamicSerializeElement - @XmlElement - private String siteId; - - @DataURI(position = 1) - @Column - @DynamicSerializeElement - @XmlElement - private String reportType; - - @Embedded - @DataURI(position = 2, embedded = true) - @XmlElement - @DynamicSerializeElement - private SurfaceObsLocation location; - - @Embedded - @DynamicSerializeElement - private PointDataView pointDataView; - - // Text of the WMO header - @Column - @DynamicSerializeElement - @XmlElement - private String wmoHeader; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer pressSLP; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer pressSfc; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double precipTot3Hr; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double precipConv3Hr; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer cldAmtLo; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer cldAmtMd; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer cldAmtHi; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer pressCldBase; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double uc10M; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double vc10M; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double temp2M; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double specHum2M; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer snowType; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer iceType; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer fzRainType; - - @DynamicSerializeElement - @XmlElement - @Transient - private Integer rainType; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double horzVis; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double stormUComp; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double stormVComp; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double stormRelHeli; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double totPrecip1Hr; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double precipConv1Hr; - - @DynamicSerializeElement - @XmlElement - @Transient - private Double snowWaterEquiv; - - // the level data - @Transient - private Set<SoundingLevel> soundingLevels; - - // the level data - @Transient - private Set<SoilLevel> soilLevels; - - /** - * Create an empty ProfilerObs object. - */ - public SoundingSite() { - } - - /** - * Constructor for DataURI construction through base class. This is used by - * the notification service. - * - * @param uri - * A data uri applicable to this class. - * @param tableDef - * The table definitions for this class. - */ - public SoundingSite(String uri) { - super(uri); - } - - /** - * Get the observation time for this data. - * - * @return The data observation time. - */ - public Calendar getTimeObs() { - return timeObs; - } - - /** - * Set the observation time for this data. - * - * @param timeObs - * The data observation time. - */ - public void setTimeObs(Calendar timeObs) { - this.timeObs = timeObs; - } - - /** - * @return the fcstSeconds - */ - public Long getFcstSeconds() { - return fcstSeconds; - } - - /** - * @param fcstSeconds - * the fcstSeconds to set - */ - public void setFcstSeconds(Long fcstSeconds) { - this.fcstSeconds = fcstSeconds; - } - - /** - * Get this observation's geometry. - * - * @return The geometry for this observation. - */ - public Geometry getGeometry() { - return location.getGeometry(); - } - - /** - * Get the geometry latitude. - * - * @return The geometry latitude. - */ - public double getLatitude() { - return location.getLatitude(); - } - - /** - * Get the geometry longitude. - * - * @return The geometry longitude. - */ - public double getLongitude() { - return location.getLongitude(); - } - - /** - * Get the station identifier for this observation. - * - * @return the stationId - */ - public String getStationId() { - return location.getStationId(); - } - - /** - * Get the elevation, in meters, of the observing platform or location. - * - * @return The observation elevation, in meters. - */ - public Integer getElevation() { - return location.getElevation(); - } - - /** - * Was this location defined from the station catalog? False if not. - * - * @return Was this location defined from the station catalog? - */ - public Boolean getLocationDefined() { - return location.getLocationDefined(); - } - - /** - * Set the WMOHeader of the file that contained this data. - * - * @return The wmoHeader - */ - public String getWmoHeader() { - return wmoHeader; - } - - /** - * Get the WMOHeader of the file that contained this data. - * - * @param wmoHeader - * The WMOHeader to set - */ - public void setWmoHeader(String wmoHeader) { - this.wmoHeader = wmoHeader; - } - - /** - * - * @param level - * A sounding data level to add. - */ - public void addLevel(SoundingLevel level) { - if (soundingLevels == null) { - soundingLevels = new HashSet<SoundingLevel>(); - } - soundingLevels.add(level); - } - - /** - * Get all levels contained by this object. - * - * @return the levels - */ - public Set<SoundingLevel> getLevels() { - return soundingLevels; - } - - /** - * Set the level data into this object. - * - * @param levels - * the levels to set - */ - public void setLevels(Set<SoundingLevel> levels) { - soundingLevels = levels; - } - - /** - * - * @param level - * A soil data level to add. - */ - public void addSoilLevel(SoilLevel level) { - if (soilLevels == null) { - soilLevels = new HashSet<SoilLevel>(); - } - soilLevels.add(level); - } - - /** - * @return the soilLevels - */ - public Set<SoilLevel> getSoilLevels() { - return soilLevels; - } - - /** - * @param soilLevels - * the soilLevels to set - */ - public void setSoilLevels(Set<SoilLevel> levels) { - soilLevels = levels; - } - - /** - * @return the siteId - */ - public String getSiteId() { - return siteId; - } - - /** - * @param siteId - * the siteId to set - */ - public void setSiteId(String siteId) { - this.siteId = siteId; - } - - /** - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - /** - * @param reportType - * the reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - /** - * @return the soundingLevels - */ - public Set<SoundingLevel> getSoundingLevels() { - return soundingLevels; - } - - /** - * @param soundingLevels - * the soundingLevels to set - */ - public void setSoundingLevels(Set<SoundingLevel> soundingLevels) { - this.soundingLevels = soundingLevels; - } - - /** - * @return the pressSLP - */ - public Integer getPressSLP() { - return pressSLP; - } - - /** - * @param pressSLP - * the pressSLP to set - */ - public void setPressSLP(Integer pressSLP) { - this.pressSLP = pressSLP; - } - - /** - * @return the pressSfc - */ - public Integer getPressSfc() { - return pressSfc; - } - - /** - * @param pressSfc - * the pressSfc to set - */ - public void setPressSfc(Integer pressSfc) { - this.pressSfc = pressSfc; - } - - /** - * @return the precipTot3Hr - */ - public Double getPrecipTot3Hr() { - return precipTot3Hr; - } - - /** - * @param precipTot3Hr - * the precipTot3Hr to set - */ - public void setPrecipTot3Hr(Double precipTot3Hr) { - this.precipTot3Hr = precipTot3Hr; - } - - /** - * @return the precipConv3Hr - */ - public Double getPrecipConv3Hr() { - return precipConv3Hr; - } - - /** - * @param precipConv3Hr - * the precipConv3Hr to set - */ - public void setPrecipConv3Hr(Double precipConv3Hr) { - this.precipConv3Hr = precipConv3Hr; - } - - /** - * @return the cldAmtLo - */ - public Integer getCldAmtLo() { - return cldAmtLo; - } - - /** - * @param cldAmtLo - * the cldAmtLo to set - */ - public void setCldAmtLo(Integer cldAmtLo) { - this.cldAmtLo = cldAmtLo; - } - - /** - * @return the cldAmtMd - */ - public Integer getCldAmtMd() { - return cldAmtMd; - } - - /** - * @param cldAmtMd - * the cldAmtMd to set - */ - public void setCldAmtMd(Integer cldAmtMd) { - this.cldAmtMd = cldAmtMd; - } - - /** - * @return the cldAmtHi - */ - public Integer getCldAmtHi() { - return cldAmtHi; - } - - /** - * @param cldAmtHi - * the cldAmtHi to set - */ - public void setCldAmtHi(Integer cldAmtHi) { - this.cldAmtHi = cldAmtHi; - } - - /** - * @return the pressCldBase - */ - public Integer getPressCldBase() { - return pressCldBase; - } - - /** - * @param pressCldBase - * the pressCldBase to set - */ - public void setPressCldBase(Integer pressCldBase) { - this.pressCldBase = pressCldBase; - } - - /** - * @return the uc10Meter - */ - public Double getUc10M() { - return uc10M; - } - - /** - * @param uc10Meter - * the uc10Meter to set - */ - public void setUc10M(Double uc10Meter) { - this.uc10M = uc10Meter; - } - - /** - * @return the vc10M - */ - public Double getVc10M() { - return vc10M; - } - - /** - * @param vc10M - * the vc10M to set - */ - public void setVc10M(Double vc10M) { - this.vc10M = vc10M; - } - - /** - * @return the temp2M - */ - public Double getTemp2M() { - return temp2M; - } - - /** - * @param temp2M - * the temp2M to set - */ - public void setTemp2M(Double temp2M) { - this.temp2M = temp2M; - } - - /** - * @return the specHum2M - */ - public Double getSpecHum2M() { - return specHum2M; - } - - /** - * @param specHum2M - * the specHum2M to set - */ - public void setSpecHum2M(Double specHum2M) { - this.specHum2M = specHum2M; - } - - /** - * @return the snowType - */ - public Integer getSnowType() { - return snowType; - } - - /** - * @param snowType - * the snowType to set - */ - public void setSnowType(Integer snowType) { - this.snowType = snowType; - } - - /** - * @return the iceType - */ - public Integer getIceType() { - return iceType; - } - - /** - * @param iceType - * the iceType to set - */ - public void setIceType(Integer iceType) { - this.iceType = iceType; - } - - /** - * @return the fzRainType - */ - public Integer getFzRainType() { - return fzRainType; - } - - /** - * @param fzRainType - * the fzRainType to set - */ - public void setFzRainType(Integer fzRainType) { - this.fzRainType = fzRainType; - } - - /** - * @return the rainType - */ - public Integer getRainType() { - return rainType; - } - - /** - * @param rainType - * the rainType to set - */ - public void setRainType(Integer rainType) { - this.rainType = rainType; - } - - /** - * @return the horzVis - */ - public Double getHorzVis() { - return horzVis; - } - - /** - * @param horzVis - * the horzVis to set - */ - public void setHorzVis(Double horzVis) { - this.horzVis = horzVis; - } - - /** - * @return the stormUComp - */ - public Double getStormUComp() { - return stormUComp; - } - - /** - * @param stormUComp - * the stormUComp to set - */ - public void setStormUComp(Double stormUComp) { - this.stormUComp = stormUComp; - } - - /** - * @return the stormVComp - */ - public Double getStormVComp() { - return stormVComp; - } - - /** - * @param stormVComp - * the stormVComp to set - */ - public void setStormVComp(Double stormVComp) { - this.stormVComp = stormVComp; - } - - /** - * @return the stormRelHeli - */ - public Double getStormRelHeli() { - return stormRelHeli; - } - - /** - * @param stormRelHeli - * the stormRelHeli to set - */ - public void setStormRelHeli(Double stormRelHeli) { - this.stormRelHeli = stormRelHeli; - } - - /** - * @return the totPrecip1Hr - */ - public Double getTotPrecip1Hr() { - return totPrecip1Hr; - } - - /** - * @param totPrecip1Hr - * the totPrecip1Hr to set - */ - public void setTotPrecip1Hr(Double totPrecip1Hr) { - this.totPrecip1Hr = totPrecip1Hr; - } - - /** - * @return the precipConv1Hr - */ - public Double getPrecipConv1Hr() { - return precipConv1Hr; - } - - /** - * @param precipConv1Hr - * the precipConv1Hr to set - */ - public void setPrecipConv1Hr(Double precipConv1Hr) { - this.precipConv1Hr = precipConv1Hr; - } - - /** - * @return the snowWaterEquiv - */ - public Double getSnowWaterEquiv() { - return snowWaterEquiv; - } - - /** - * @param snowWaterEquiv - * the snowWaterEquiv to set - */ - public void setSnowWaterEquiv(Double snowWaterEquiv) { - this.snowWaterEquiv = snowWaterEquiv; - } - - /** - * Get the IDecoderGettable interface implementation. This class does not - * currently support this interface. - * - * @return Returns null. - */ - @Override - public IDecoderGettable getDecoderGettable() { - return null; - } - - @Override - public SurfaceObsLocation getSpatialObject() { - return location; - } - - public SurfaceObsLocation getLocation() { - return location; - } - - public void setLocation(SurfaceObsLocation location) { - this.location = location; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.common.dataplugin.IDecoderGettable#getString(java.lang - * .String) - */ - @Override - public String getString(String paramName) { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.common.dataplugin.IDecoderGettable#getStrings(java.lang - * .String) - */ - @Override - public String[] getStrings(String paramName) { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.common.dataplugin.IDecoderGettable#getValue(java.lang - * .String) - */ - @Override - public Amount getValue(String paramName) { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.common.dataplugin.IDecoderGettable#getValues(java.lang - * .String) - */ - @Override - public Collection<Amount> getValues(String paramName) { - // TODO Auto-generated method stub - return null; - } - - @Override - public PointDataView getPointDataView() { - return this.pointDataView; - } - - @Override - public void setPointDataView(PointDataView pointDataView) { - this.pointDataView = pointDataView; - } + ISpatialEnabled, IDecoderGettable, IPointData, IPersistable { + + private static final long serialVersionUID = 1L; + + // The profiler observation time. + @Column + @DynamicSerializeElement + @XmlElement + private Calendar timeObs; + + @Column + @DynamicSerializeElement + @XmlElement + private Long fcstSeconds; + + // These site ids are not strictly ICAO ids! + @Column + @DynamicSerializeElement + @XmlElement + private String siteId; + + @DataURI(position = 1) + @Column + @DynamicSerializeElement + @XmlElement + private String reportType; + + @Embedded + @DataURI(position = 2, embedded = true) + @XmlElement + @DynamicSerializeElement + private SurfaceObsLocation location; + + @Embedded + @DynamicSerializeElement + private PointDataView pointDataView; + + // Text of the WMO header + @Column + @DynamicSerializeElement + @XmlElement + private String wmoHeader; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer pressSLP; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer pressSfc; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double precipTot3Hr; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double precipConv3Hr; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer cldAmtLo; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer cldAmtMd; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer cldAmtHi; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer pressCldBase; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double uc10M; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double vc10M; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double temp2M; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double specHum2M; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer snowType; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer iceType; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer fzRainType; + + @DynamicSerializeElement + @XmlElement + @Transient + private Integer rainType; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double horzVis; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double stormUComp; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double stormVComp; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double stormRelHeli; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double totPrecip1Hr; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double precipConv1Hr; + + @DynamicSerializeElement + @XmlElement + @Transient + private Double snowWaterEquiv; + + // the level data + @Transient + private Set<SoundingLevel> soundingLevels; + + // the level data + @Transient + private Set<SoilLevel> soilLevels; + + /** + * Create an empty ProfilerObs object. + */ + public SoundingSite() { + } + + /** + * Constructor for DataURI construction through base class. This is used by + * the notification service. + * + * @param uri + * A data uri applicable to this class. + * @param tableDef + * The table definitions for this class. + */ + public SoundingSite(String uri) { + super(uri); + } + + /** + * Get the observation time for this data. + * + * @return The data observation time. + */ + public Calendar getTimeObs() { + return timeObs; + } + + /** + * Set the observation time for this data. + * + * @param timeObs + * The data observation time. + */ + public void setTimeObs(Calendar timeObs) { + this.timeObs = timeObs; + } + + /** + * @return the fcstSeconds + */ + public Long getFcstSeconds() { + return fcstSeconds; + } + + /** + * @param fcstSeconds + * the fcstSeconds to set + */ + public void setFcstSeconds(Long fcstSeconds) { + this.fcstSeconds = fcstSeconds; + } + + /** + * Get this observation's geometry. + * + * @return The geometry for this observation. + */ + public Geometry getGeometry() { + return location.getGeometry(); + } + + /** + * Get the geometry latitude. + * + * @return The geometry latitude. + */ + public double getLatitude() { + return location.getLatitude(); + } + + /** + * Get the geometry longitude. + * + * @return The geometry longitude. + */ + public double getLongitude() { + return location.getLongitude(); + } + + /** + * Get the station identifier for this observation. + * + * @return the stationId + */ + public String getStationId() { + return location.getStationId(); + } + + /** + * Get the elevation, in meters, of the observing platform or location. + * + * @return The observation elevation, in meters. + */ + public Integer getElevation() { + return location.getElevation(); + } + + /** + * Was this location defined from the station catalog? False if not. + * + * @return Was this location defined from the station catalog? + */ + public Boolean getLocationDefined() { + return location.getLocationDefined(); + } + + /** + * Set the WMOHeader of the file that contained this data. + * + * @return The wmoHeader + */ + public String getWmoHeader() { + return wmoHeader; + } + + /** + * Get the WMOHeader of the file that contained this data. + * + * @param wmoHeader + * The WMOHeader to set + */ + public void setWmoHeader(String wmoHeader) { + this.wmoHeader = wmoHeader; + } + + /** + * + * @param level + * A sounding data level to add. + */ + public void addLevel(SoundingLevel level) { + if (soundingLevels == null) { + soundingLevels = new HashSet<SoundingLevel>(); + } + soundingLevels.add(level); + } + + /** + * Get all levels contained by this object. + * + * @return the levels + */ + public Set<SoundingLevel> getLevels() { + return soundingLevels; + } + + /** + * Set the level data into this object. + * + * @param levels + * the levels to set + */ + public void setLevels(Set<SoundingLevel> levels) { + soundingLevels = levels; + } + + /** + * + * @param level + * A soil data level to add. + */ + public void addSoilLevel(SoilLevel level) { + if (soilLevels == null) { + soilLevels = new HashSet<SoilLevel>(); + } + soilLevels.add(level); + } + + /** + * @return the soilLevels + */ + public Set<SoilLevel> getSoilLevels() { + return soilLevels; + } + + /** + * @param soilLevels + * the soilLevels to set + */ + public void setSoilLevels(Set<SoilLevel> levels) { + soilLevels = levels; + } + + /** + * @return the siteId + */ + public String getSiteId() { + return siteId; + } + + /** + * @param siteId + * the siteId to set + */ + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + /** + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + /** + * @param reportType + * the reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + /** + * @return the soundingLevels + */ + public Set<SoundingLevel> getSoundingLevels() { + return soundingLevels; + } + + /** + * @param soundingLevels + * the soundingLevels to set + */ + public void setSoundingLevels(Set<SoundingLevel> soundingLevels) { + this.soundingLevels = soundingLevels; + } + + /** + * @return the pressSLP + */ + public Integer getPressSLP() { + return pressSLP; + } + + /** + * @param pressSLP + * the pressSLP to set + */ + public void setPressSLP(Integer pressSLP) { + this.pressSLP = pressSLP; + } + + /** + * @return the pressSfc + */ + public Integer getPressSfc() { + return pressSfc; + } + + /** + * @param pressSfc + * the pressSfc to set + */ + public void setPressSfc(Integer pressSfc) { + this.pressSfc = pressSfc; + } + + /** + * @return the precipTot3Hr + */ + public Double getPrecipTot3Hr() { + return precipTot3Hr; + } + + /** + * @param precipTot3Hr + * the precipTot3Hr to set + */ + public void setPrecipTot3Hr(Double precipTot3Hr) { + this.precipTot3Hr = precipTot3Hr; + } + + /** + * @return the precipConv3Hr + */ + public Double getPrecipConv3Hr() { + return precipConv3Hr; + } + + /** + * @param precipConv3Hr + * the precipConv3Hr to set + */ + public void setPrecipConv3Hr(Double precipConv3Hr) { + this.precipConv3Hr = precipConv3Hr; + } + + /** + * @return the cldAmtLo + */ + public Integer getCldAmtLo() { + return cldAmtLo; + } + + /** + * @param cldAmtLo + * the cldAmtLo to set + */ + public void setCldAmtLo(Integer cldAmtLo) { + this.cldAmtLo = cldAmtLo; + } + + /** + * @return the cldAmtMd + */ + public Integer getCldAmtMd() { + return cldAmtMd; + } + + /** + * @param cldAmtMd + * the cldAmtMd to set + */ + public void setCldAmtMd(Integer cldAmtMd) { + this.cldAmtMd = cldAmtMd; + } + + /** + * @return the cldAmtHi + */ + public Integer getCldAmtHi() { + return cldAmtHi; + } + + /** + * @param cldAmtHi + * the cldAmtHi to set + */ + public void setCldAmtHi(Integer cldAmtHi) { + this.cldAmtHi = cldAmtHi; + } + + /** + * @return the pressCldBase + */ + public Integer getPressCldBase() { + return pressCldBase; + } + + /** + * @param pressCldBase + * the pressCldBase to set + */ + public void setPressCldBase(Integer pressCldBase) { + this.pressCldBase = pressCldBase; + } + + /** + * @return the uc10Meter + */ + public Double getUc10M() { + return uc10M; + } + + /** + * @param uc10Meter + * the uc10Meter to set + */ + public void setUc10M(Double uc10Meter) { + this.uc10M = uc10Meter; + } + + /** + * @return the vc10M + */ + public Double getVc10M() { + return vc10M; + } + + /** + * @param vc10M + * the vc10M to set + */ + public void setVc10M(Double vc10M) { + this.vc10M = vc10M; + } + + /** + * @return the temp2M + */ + public Double getTemp2M() { + return temp2M; + } + + /** + * @param temp2M + * the temp2M to set + */ + public void setTemp2M(Double temp2M) { + this.temp2M = temp2M; + } + + /** + * @return the specHum2M + */ + public Double getSpecHum2M() { + return specHum2M; + } + + /** + * @param specHum2M + * the specHum2M to set + */ + public void setSpecHum2M(Double specHum2M) { + this.specHum2M = specHum2M; + } + + /** + * @return the snowType + */ + public Integer getSnowType() { + return snowType; + } + + /** + * @param snowType + * the snowType to set + */ + public void setSnowType(Integer snowType) { + this.snowType = snowType; + } + + /** + * @return the iceType + */ + public Integer getIceType() { + return iceType; + } + + /** + * @param iceType + * the iceType to set + */ + public void setIceType(Integer iceType) { + this.iceType = iceType; + } + + /** + * @return the fzRainType + */ + public Integer getFzRainType() { + return fzRainType; + } + + /** + * @param fzRainType + * the fzRainType to set + */ + public void setFzRainType(Integer fzRainType) { + this.fzRainType = fzRainType; + } + + /** + * @return the rainType + */ + public Integer getRainType() { + return rainType; + } + + /** + * @param rainType + * the rainType to set + */ + public void setRainType(Integer rainType) { + this.rainType = rainType; + } + + /** + * @return the horzVis + */ + public Double getHorzVis() { + return horzVis; + } + + /** + * @param horzVis + * the horzVis to set + */ + public void setHorzVis(Double horzVis) { + this.horzVis = horzVis; + } + + /** + * @return the stormUComp + */ + public Double getStormUComp() { + return stormUComp; + } + + /** + * @param stormUComp + * the stormUComp to set + */ + public void setStormUComp(Double stormUComp) { + this.stormUComp = stormUComp; + } + + /** + * @return the stormVComp + */ + public Double getStormVComp() { + return stormVComp; + } + + /** + * @param stormVComp + * the stormVComp to set + */ + public void setStormVComp(Double stormVComp) { + this.stormVComp = stormVComp; + } + + /** + * @return the stormRelHeli + */ + public Double getStormRelHeli() { + return stormRelHeli; + } + + /** + * @param stormRelHeli + * the stormRelHeli to set + */ + public void setStormRelHeli(Double stormRelHeli) { + this.stormRelHeli = stormRelHeli; + } + + /** + * @return the totPrecip1Hr + */ + public Double getTotPrecip1Hr() { + return totPrecip1Hr; + } + + /** + * @param totPrecip1Hr + * the totPrecip1Hr to set + */ + public void setTotPrecip1Hr(Double totPrecip1Hr) { + this.totPrecip1Hr = totPrecip1Hr; + } + + /** + * @return the precipConv1Hr + */ + public Double getPrecipConv1Hr() { + return precipConv1Hr; + } + + /** + * @param precipConv1Hr + * the precipConv1Hr to set + */ + public void setPrecipConv1Hr(Double precipConv1Hr) { + this.precipConv1Hr = precipConv1Hr; + } + + /** + * @return the snowWaterEquiv + */ + public Double getSnowWaterEquiv() { + return snowWaterEquiv; + } + + /** + * @param snowWaterEquiv + * the snowWaterEquiv to set + */ + public void setSnowWaterEquiv(Double snowWaterEquiv) { + this.snowWaterEquiv = snowWaterEquiv; + } + + /** + * Get the IDecoderGettable interface implementation. This class does not + * currently support this interface. + * + * @return Returns null. + */ + @Override + public IDecoderGettable getDecoderGettable() { + return null; + } + + @Override + public SurfaceObsLocation getSpatialObject() { + return location; + } + + public SurfaceObsLocation getLocation() { + return location; + } + + public void setLocation(SurfaceObsLocation location) { + this.location = location; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.dataplugin.IDecoderGettable#getString(java.lang + * .String) + */ + @Override + public String getString(String paramName) { + // TODO Auto-generated method stub + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.dataplugin.IDecoderGettable#getStrings(java.lang + * .String) + */ + @Override + public String[] getStrings(String paramName) { + // TODO Auto-generated method stub + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.dataplugin.IDecoderGettable#getValue(java.lang + * .String) + */ + @Override + public Amount getValue(String paramName) { + // TODO Auto-generated method stub + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.dataplugin.IDecoderGettable#getValues(java.lang + * .String) + */ + @Override + public Collection<Amount> getValues(String paramName) { + // TODO Auto-generated method stub + return null; + } + + @Override + public PointDataView getPointDataView() { + return this.pointDataView; + } + + @Override + public void setPointDataView(PointDataView pointDataView) { + this.pointDataView = pointDataView; + } } diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/dao/ModelSoundingDAO.java b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/dao/ModelSoundingDAO.java index 368ab83401..cea1445598 100644 --- a/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/dao/ModelSoundingDAO.java +++ b/edexOsgi/com.raytheon.edex.plugin.modelsounding/src/com/raytheon/edex/plugin/modelsounding/dao/ModelSoundingDAO.java @@ -19,8 +19,10 @@ **/ package com.raytheon.edex.plugin.modelsounding.dao; +import java.io.File; import java.util.List; +import com.raytheon.edex.plugin.modelsounding.common.ModelSoundingPathProvider; import com.raytheon.edex.plugin.modelsounding.common.SoundingSite; import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.edex.database.DataAccessLayerException; @@ -35,6 +37,10 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080303 1026 jkorman Initial implementation. + * 20130426 1861 bkowal Added report type and forecast seconds as + * required keys for the hdf5 file name. Create + * a new method to generate hdf5 file names that + * will use the path provider. * * </pre> * @@ -50,6 +56,7 @@ public class ModelSoundingDAO extends PointDataPluginDao<SoundingSite> { */ public ModelSoundingDAO(String pluginName) throws PluginException { super(pluginName); + this.pathProvider = new ModelSoundingPathProvider(); } /** @@ -118,7 +125,7 @@ public class ModelSoundingDAO extends PointDataPluginDao<SoundingSite> { @Override public String[] getKeysRequiredForFileName() { - return new String[] { "dataTime.refTime" }; + return new String[] { "reportType", "dataTime.refTime", "fcstSeconds" }; } @Override @@ -130,5 +137,13 @@ public class ModelSoundingDAO extends PointDataPluginDao<SoundingSite> { public SoundingSite newObject() { return new SoundingSite(); } - + + @Override + protected String generatePointDataFileName(SoundingSite bean) { + return this.pluginName + + File.separator + + this.pathProvider.getHDFPath(this.pluginName, bean) + + File.separator + + this.pathProvider.getHDFFileName(this.pluginName, bean); + } } diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/utility/common_static/base/path/modelsoundingPathKeys.xml b/edexOsgi/com.raytheon.edex.plugin.modelsounding/utility/common_static/base/path/modelsoundingPathKeys.xml new file mode 100644 index 0000000000..31e268c1fd --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.modelsounding/utility/common_static/base/path/modelsoundingPathKeys.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<pathKeySet> + <pathKey> + <key>reportType</key> + <order>0</order> + </pathKey> + <pathKey> + <key>dataTime.refTime</key> + <order>1</order> + </pathKey> +</pathKeySet> \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/RedbookDecoder.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/RedbookDecoder.java index 3320f76d14..063938623c 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/RedbookDecoder.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/RedbookDecoder.java @@ -142,8 +142,8 @@ public class RedbookDecoder extends AbstractDecoder { + "- File is not Redbook data. Type is " + foreign.dataType); } else { - report = new RedbookParser(traceId, data, wmoHeader) - .getDecodedRecord(); + report = new RedbookParser(traceId, data, + wmoHeader).getDecodedRecord(); } if (report != null) { report.setPersistenceTime(new Date()); diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/RedbookRecord.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/RedbookRecord.java index 228bc9e39d..ac7ee888ba 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/RedbookRecord.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/RedbookRecord.java @@ -19,6 +19,7 @@ **/ package com.raytheon.edex.plugin.redbook.common; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -63,6 +64,7 @@ import com.raytheon.uf.common.time.DataTime; * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime * 20130408 1293 bkowal Removed references to hdffileid. * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * Apr 29, 2013 1958 bgonzale Added equals and hashcode. * </pre> * * @author jkorman @@ -363,4 +365,98 @@ public class RedbookRecord extends PersistablePluginDataObject return other; } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((corIndicator == null) ? 0 : corIndicator.hashCode()); + result = prime * result + + ((fcstHours == null) ? 0 : fcstHours.hashCode()); + result = prime * result + ((fileId == null) ? 0 : fileId.hashCode()); + result = prime * result + + ((originatorId == null) ? 0 : originatorId.hashCode()); + result = prime * result + + ((productId == null) ? 0 : productId.hashCode()); + result = prime * result + Arrays.hashCode(redBookData); + result = prime * result + + ((retentionHours == null) ? 0 : retentionHours.hashCode()); + result = prime * result + ((timeObs == null) ? 0 : timeObs.hashCode()); + result = prime * result + + ((wmoCCCCdt == null) ? 0 : wmoCCCCdt.hashCode()); + result = prime * result + + ((wmoTTAAii == null) ? 0 : wmoTTAAii.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + RedbookRecord other = (RedbookRecord) obj; + if (corIndicator == null) { + if (other.corIndicator != null) + return false; + } else if (!corIndicator.equals(other.corIndicator)) + return false; + if (fcstHours == null) { + if (other.fcstHours != null) + return false; + } else if (!fcstHours.equals(other.fcstHours)) + return false; + if (fileId == null) { + if (other.fileId != null) + return false; + } else if (!fileId.equals(other.fileId)) + return false; + if (originatorId == null) { + if (other.originatorId != null) + return false; + } else if (!originatorId.equals(other.originatorId)) + return false; + if (productId == null) { + if (other.productId != null) + return false; + } else if (!productId.equals(other.productId)) + return false; + if (!Arrays.equals(redBookData, other.redBookData)) + return false; + if (retentionHours == null) { + if (other.retentionHours != null) + return false; + } else if (!retentionHours.equals(other.retentionHours)) + return false; + if (timeObs == null) { + if (other.timeObs != null) + return false; + } else if (!timeObs.equals(other.timeObs)) + return false; + if (wmoCCCCdt == null) { + if (other.wmoCCCCdt != null) + return false; + } else if (!wmoCCCCdt.equals(other.wmoCCCCdt)) + return false; + if (wmoTTAAii == null) { + if (other.wmoTTAAii != null) + return false; + } else if (!wmoTTAAii.equals(other.wmoTTAAii)) + return false; + return true; + } + } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_004.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_004.java index 6f740f7561..f41a9c6694 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_004.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_004.java @@ -30,6 +30,8 @@ import java.nio.ByteBuffer; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> * @@ -39,12 +41,21 @@ import java.nio.ByteBuffer; public class Block_004_004 extends RedbookBlock { + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new Block_004_004(header, data); + } + } + /** * + * @param header * @param separator */ - public Block_004_004(ByteBuffer data) { - super(data); + public Block_004_004(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); populate(data); if(hasChkSum()) { data.getShort(); @@ -53,9 +64,7 @@ public class Block_004_004 extends RedbookBlock { private void populate(ByteBuffer data) { if(hasLength()) { - for(int i = 0;i < getLength()-2;i++) { - data.getShort(); - } + dropShortsFromTheBuffer(data); } } diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_005.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_005.java index b861a25f75..7983497b1b 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_005.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_005.java @@ -21,30 +21,42 @@ package com.raytheon.edex.plugin.redbook.common.blocks; import java.nio.ByteBuffer; -/**TODO Add Description +/** + * TODO Add Description * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public class Block_004_005 extends RedbookBlock { + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new Block_004_005(header, data); + } + } + /** * + * @param header * @param separator */ - public Block_004_005(ByteBuffer data) { - super(data); + public Block_004_005(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); populate(data); if(hasChkSum()) { data.getShort(); @@ -52,10 +64,8 @@ public class Block_004_005 extends RedbookBlock { } private void populate(ByteBuffer data) { - if(hasLength()) { - for(int i = 0;i < getLength()-2;i++) { - data.getShort(); - } + if (hasLength()) { + dropShortsFromTheBuffer(data); } } diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_016.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_016.java index 1e22839379..a913b41efc 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_016.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_016.java @@ -21,20 +21,23 @@ package com.raytheon.edex.plugin.redbook.common.blocks; import java.nio.ByteBuffer; -/**TODO Add Description +/** + * TODO Add Description * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public class Block_004_016 extends RedbookBlock { @@ -65,12 +68,21 @@ public class Block_004_016 extends RedbookBlock { private int evtMinute; + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new Block_004_016(header, data); + } + } + /** * + * @param header * @param separator */ - public Block_004_016(ByteBuffer data) { - super(data); + public Block_004_016(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); populate(data); if(hasChkSum()) { data.getShort(); diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_017.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_017.java index 4644ff528e..17ed0384c2 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_017.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/Block_004_017.java @@ -21,20 +21,23 @@ package com.raytheon.edex.plugin.redbook.common.blocks; import java.nio.ByteBuffer; -/**TODO Add Description +/** + * TODO Add Description * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public class Block_004_017 extends RedbookBlock { @@ -55,12 +58,21 @@ public class Block_004_017 extends RedbookBlock { private String projName; + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new Block_004_017(header, data); + } + } + /** * + * @param header * @param separator */ - public Block_004_017(ByteBuffer data) { - super(data); + public Block_004_017(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); populateProj(data); if(hasChkSum()) { data.getShort(); diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/DefaultBlock.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/DefaultBlock.java index 55eec5e868..38223f0ee6 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/DefaultBlock.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/DefaultBlock.java @@ -21,35 +21,44 @@ package com.raytheon.edex.plugin.redbook.common.blocks; import java.nio.ByteBuffer; -/**TODO Add Description +/** + * TODO Add Description * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public class DefaultBlock extends RedbookBlock { - + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new DefaultBlock(header, data); + } + } + /** * + * @param header * @param separator */ - public DefaultBlock(ByteBuffer data) { - super(data); + public DefaultBlock(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); if(hasLength()) { - for(int i = 0;i < getLength()-2;i++) { - data.getShort(); - } + dropShortsFromTheBuffer(data); } } @@ -58,9 +67,6 @@ public class DefaultBlock extends RedbookBlock { */ public StringBuilder toString(StringBuilder sb) { sb = super.toString(sb); - - - return sb; } } diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/EndOfProductBlock.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/EndOfProductBlock.java index 289498f7ed..4b4fcc25fa 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/EndOfProductBlock.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/EndOfProductBlock.java @@ -21,30 +21,42 @@ package com.raytheon.edex.plugin.redbook.common.blocks; import java.nio.ByteBuffer; -/**TODO Add Description +/** + * TODO Add Description * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public class EndOfProductBlock extends RedbookBlock { + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new EndOfProductBlock(header, data); + } + } + /** * + * @param header * @param separator */ - public EndOfProductBlock(ByteBuffer data) { - super(data); + public EndOfProductBlock(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); if(hasChkSum()) { data.getShort(); } @@ -63,9 +75,6 @@ public class EndOfProductBlock extends RedbookBlock { */ public StringBuilder toString(StringBuilder sb) { sb = super.toString(sb); - - - return sb; } } diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/ProductIdBlock.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/ProductIdBlock.java index 3ea0107b2f..ee784624e5 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/ProductIdBlock.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/ProductIdBlock.java @@ -24,21 +24,23 @@ import java.util.Calendar; import com.raytheon.uf.edex.decodertools.time.TimeTools; - -/**TODO Add Description +/** + * TODO Add Description * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory class. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public class ProductIdBlock extends RedbookBlock { @@ -66,12 +68,20 @@ public class ProductIdBlock extends RedbookBlock { private Integer fcstHours; + public static class Factory implements RedbookBlockFactory { + @Override + public RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data) { + return new ProductIdBlock(header, data); + } + } + /** * * @param separator */ - public ProductIdBlock(ByteBuffer data) { - super(data); + public ProductIdBlock(RedbookBlockHeader header, ByteBuffer data) { + super(header, data); int blockLen = (hasChkSum()) ? BLOCK_LEN : BLOCK_LEN - 2; if(data.remaining() >= blockLen) { diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlock.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlock.java index 1f0ce356ca..72accd5c56 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlock.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlock.java @@ -29,17 +29,20 @@ import org.apache.commons.logging.LogFactory; * * * <pre> - * + * * SOFTWARE HISTORY - * + * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080512 1131 jkorman Initial implementation. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and nested Factory interface. + * May 06, 2013 1979 bgonzale Catch Header at the end of buffer. * * </pre> - * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ public abstract class RedbookBlock { @@ -57,28 +60,28 @@ public abstract class RedbookBlock { private boolean hasChkSum = false; + private RedbookBlockHeader header; + private final int length; - private final int mode; - - private final int subMode; - + public interface RedbookBlockFactory { + public abstract RedbookBlock createBlock(RedbookBlockHeader header, + ByteBuffer data); + } + /** * * @param separator */ - public RedbookBlock(ByteBuffer data) { + public RedbookBlock(RedbookBlockHeader header, ByteBuffer data) { - int hdr = (data.getShort() & 0xFFFF); - - hasLength = (hdr & LEN_MASK) == 0; - - hasChkSum = (hdr & CHKSUM_MASK) == 0; + this.header = header; - mode = (data.get() & 0xFF); - subMode = (data.get() & 0xFF); + hasLength = ((this.header.hdr & LEN_MASK) == 0 && data.hasRemaining()); - length = (hasLength) ? (hdr & LENGTH_MASK) : -1; + hasChkSum = (this.header.hdr & CHKSUM_MASK) == 0; + + length = (hasLength) ? (this.header.hdr & LENGTH_MASK) : -1; } public boolean isEndBlock() { @@ -96,14 +99,14 @@ public abstract class RedbookBlock { * @return the mode */ public int getMode() { - return mode; + return this.header.mode; } /** * @return the subMode */ public int getSubMode() { - return subMode; + return this.header.subMode; } /** @@ -142,7 +145,7 @@ public abstract class RedbookBlock { sb.append((hasChkSum) ? 'C' : '.'); sb.append(':'); - sb.append(String.format("%05d:mode=%02X:submode=%02X",length,mode,subMode)); + sb.append(String.format("%05d:mode=%02X:submode=%02X",length,header.mode,header.subMode)); return sb; } @@ -165,5 +168,23 @@ public abstract class RedbookBlock { } return f; } - + + /** + * @return true if this is a Product Id block; false otherwise. + */ + public boolean isProductId() { + return header.isProductId(); + } + + /** + * @return true if this is a Product Id block; false otherwise. + */ + public boolean isUpperAirPlot() { + return header.isUpperAirPlot(); + } + + protected void dropShortsFromTheBuffer(ByteBuffer data) { + int newPosition = (data.position() + ((getLength() - 2) << 1)); + data.position(newPosition); + } } diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockBuilder.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockBuilder.java new file mode 100644 index 0000000000..9038facfc5 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockBuilder.java @@ -0,0 +1,143 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.edex.plugin.redbook.common.blocks; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlock.RedbookBlockFactory; +import com.raytheon.edex.plugin.redbook.decoder.RedbookFcstMap; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.util.PropertiesUtil; +import com.raytheon.uf.common.util.ReflectionException; +import com.raytheon.uf.common.util.ReflectionUtil; + +/** + * + * Build RedbookBlocks from a buffer. + * + * <pre> + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 20080516 1131 jkorman Initial Coding. + * Apr 29, 2013 1958 bgonzale Added class RedbookBlockHeader, + * and moved reflective calls to the + * mapping population method. Map now + * contains factory objects. + * + * </pre> + * + * @author jkorman + * @version 1.0 + */ +public class RedbookBlockBuilder { + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(RedbookFcstMap.class); + + private static final int MIN_REMAINING = 4; + + private static final String FACTORY_NAME = "$Factory"; + + private final Map<String, RedbookBlockFactory> blockFactoryMap = new HashMap<String, RedbookBlockFactory>(); + + public RedbookBlockBuilder() { + populateMappings(); + } + + /** + * + * @return + */ + public RedbookBlock getBlock(ByteBuffer dataBuffer) { + RedbookBlock blockInstance = null; + + if (dataBuffer != null) { + RedbookBlockHeader header = getHeader(dataBuffer); + RedbookBlockFactory factory = blockFactoryMap + .get(header.blockFactoryKey); + + if (factory == null) { + blockInstance = new DefaultBlock(header, dataBuffer); + } else { + blockInstance = factory.createBlock(header, dataBuffer); + } + } + return blockInstance; + } + + /** + * + * @param dataBuffer + * @return + */ + public static RedbookBlockHeader getHeader(ByteBuffer dataBuffer) { + RedbookBlockHeader header = null; + short rawHdr = dataBuffer.getShort(); + byte rawMode = dataBuffer.get(); + byte rawSubMode = dataBuffer.get(); + + // Must have at least MIN_REMAINING + if (dataBuffer.remaining() >= MIN_REMAINING) { + header = new RedbookBlockHeader(rawHdr, rawMode, rawSubMode); + } else { + header = RedbookBlockHeader.DEFAULT; + } + return header; + } + + /** + * + */ + private void populateMappings() { + final String redbookBlockProperties = "/res/conf/RedbookBlocks.properties"; + + try { + Properties redbookClassProps = PropertiesUtil.read(this.getClass() + .getResourceAsStream(redbookBlockProperties)); + + for (String key : redbookClassProps.stringPropertyNames()) { + String factoryClassName = redbookClassProps.get(key) + + FACTORY_NAME; + + try { + RedbookBlockFactory factory = ReflectionUtil + .newInstanceOfAssignableType( + RedbookBlockFactory.class, factoryClassName); + + blockFactoryMap.put((String) key, factory); + } catch (ReflectionException e) { + statusHandler.error("Could not instantiate " + + factoryClassName, e); + } + } + } catch (IOException e) { + statusHandler.error( + "Could not load properties from the property file " + + redbookBlockProperties, e); + } + } +} diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockFactory.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockFactory.java deleted file mode 100644 index 79c6bab565..0000000000 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockFactory.java +++ /dev/null @@ -1,193 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.edex.plugin.redbook.common.blocks; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.nio.ByteBuffer; -import java.util.Properties; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * - * TODO Add Description - * - * <pre> - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 20080516 1131 jkorman Initial Coding. - * - * </pre> - * - * @author jkorman - * @version 1.0 - */ - -public class RedbookBlockFactory { - private Log logger = LogFactory.getLog(getClass()); - - private static final String MODE_KEY_FMT = "%03d_%03d"; - - private static final String DEFAULT_KEY = "default"; - - private static final int MIN_REMAINING = 4; - - private Properties RptClassMap; - - private static RedbookBlockFactory factoryInstance = null; - - private boolean loaded = false; - - private RedbookBlockFactory() { - populateMappings(); - } - - /** - * - * @return - */ - public RedbookBlock getBlock(ByteBuffer dataBuffer) { - RedbookBlock blockInstance = null; - - if (dataBuffer != null) { - String blockId = RptClassMap.getProperty(getBlockKey(dataBuffer)); - - try { - if ((blockId != null) && (!DEFAULT_KEY.equals(blockId))) { - - Class<?> c = null; - try { - c = Class.forName(blockId); - try { - Constructor<?> con = c - .getConstructor(ByteBuffer.class); - - blockInstance = (RedbookBlock) con - .newInstance(dataBuffer); - } catch (InstantiationException e) { - logger.error("Could not instantiate " + blockId, e); - } catch (IllegalAccessException e) { - logger.error("Illegal access " + blockId, e); - } catch (SecurityException e) { - logger.error("Could not instantiate " + blockId, e); - } catch (NoSuchMethodException e) { - logger.error("Could not instantiate " + blockId, e); - } catch (IllegalArgumentException e) { - logger.error("Could not instantiate " + blockId, e); - } catch (InvocationTargetException e) { - logger.error("Could not instantiate " + blockId, e); - } - } catch (ClassNotFoundException e1) { - logger.error("No class found for " + blockId); - } - } - } finally { - if (blockInstance == null) { - blockInstance = new DefaultBlock(dataBuffer); - } - } - } - return blockInstance; - } - - /** - * @return the loaded - */ - public boolean isLoaded() { - return loaded; - } - - /** - * - * @return - */ - public static synchronized RedbookBlockFactory getInstance() { - if (factoryInstance == null) { - factoryInstance = new RedbookBlockFactory(); - } - return factoryInstance; - } - - /** - * - * @param dataBuffer - * @return - */ - private String getBlockKey(ByteBuffer dataBuffer) { - String blockKey = DEFAULT_KEY; - // Must have at least MIN_REMAINING - if (dataBuffer.remaining() >= MIN_REMAINING) { - dataBuffer.mark(); - // Dummy read for the flags/length - dataBuffer.getShort(); - - int mode = (dataBuffer.get() & 0xFF); - int subMode = (dataBuffer.get() & 0xFF); - - dataBuffer.reset(); - - blockKey = String.format(MODE_KEY_FMT, mode, subMode); - } - return blockKey; - } - - /** - * - */ - private void populateMappings() { - InputStream strm = null; - BufferedReader bf = null; - - RptClassMap = new Properties(); - try { - try { - strm = this.getClass().getResourceAsStream( - "/res/conf/RedbookBlocks.properties"); - - if (strm != null) { - bf = new BufferedReader(new InputStreamReader(strm)); - RptClassMap.load(bf); - loaded = true; - } else { - loaded = false; - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } - } finally { - if (bf != null) { - try { - bf.close(); - } catch (IOException ioe) { - ioe.printStackTrace(); - } - } - } - } -} diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockHeader.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockHeader.java new file mode 100644 index 0000000000..2dbe1f1358 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/common/blocks/RedbookBlockHeader.java @@ -0,0 +1,88 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.edex.plugin.redbook.common.blocks; + +/** + * + * RedbookBlock header mode and submode. Also contains generated key based on + * mode and submode. + * + * <pre> + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 25 APR 2013 bgonzale Initial Coding. + * + * </pre> + * + * @author bgonzale + * @version 1.0 + */ +public class RedbookBlockHeader { + private static final String DEFAULT_KEY = "default"; + + private static final String MODE_KEY_FMT = "%03d_%03d"; + + public static final RedbookBlockHeader DEFAULT = new RedbookBlockHeader(); + + public final int hdr; + + public final int mode; + + public final int subMode; + + public final String blockFactoryKey; + + /** + * @param hdr + * @param mode + * @param subMode + * @param blockKey + */ + public RedbookBlockHeader(short hdrRaw, byte modeRaw, byte subModeRaw) { + super(); + this.hdr = (hdrRaw & 0xFFFF); + this.mode = (modeRaw & 0xFF); + this.subMode = (subModeRaw & 0xFF); + this.blockFactoryKey = String.format(MODE_KEY_FMT, mode, subMode); + } + + private RedbookBlockHeader() { + super(); + this.hdr = 0; + this.mode = 0; + this.subMode = 0; + this.blockFactoryKey = DEFAULT_KEY; + } + + public static boolean isDefaultBlockId(String blockId) { + return DEFAULT_KEY.equals(blockId); + } + + public boolean isProductId() { + return (mode == 1) && (subMode == 1); + } + + public boolean isUpperAirPlot() { + return (mode == 2) && (subMode == 3); + } +} \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookFcstMap.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookFcstMap.java index d05c6aeaeb..c98d57750a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookFcstMap.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookFcstMap.java @@ -19,9 +19,7 @@ **/ package com.raytheon.edex.plugin.redbook.decoder; -import java.io.File; import java.util.HashMap; -import java.util.Properties; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -29,23 +27,30 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import com.raytheon.uf.common.localization.FileUpdatedMessage; +import com.raytheon.uf.common.localization.ILocalizationFileObserver; import com.raytheon.uf.common.localization.IPathManager; import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; /** - * Add fcsttime + * Mapping of WMO header TTAAII values to forecast hour attributes. * * <pre> * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ----------- ----------- -------------------------- * 20101022 6424 kshrestha Add fcsttime + * Apr 29, 2013 1958 bgonzale Map is loaded once, and then + * not loaded again unless the mapping + * file changes. * * </pre> * @@ -58,6 +63,8 @@ public class RedbookFcstMap implements ISerializableObject { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(RedbookFcstMap.class); + private static final String REDBOOK_FCST_MAP_XML = "redbook/redbookFcstMap.xml"; + @XmlAccessorType(XmlAccessType.FIELD) public static class MapFcstHr { @XmlElement(required = false) @@ -73,26 +80,57 @@ public class RedbookFcstMap implements ISerializableObject { public Integer binOffset; } - public HashMap<String, MapFcstHr> mapping; + private static RedbookFcstMap instance; - public static File xmlFile; + private HashMap<String, MapFcstHr> mapping; - public static Properties filesXml = new Properties(); + private RedbookFcstMap() { + } - public static RedbookFcstMap load() throws Exception { - IPathManager pathMgr = PathManagerFactory.getPathManager(); - LocalizationContext ctx = pathMgr.getContext( - LocalizationContext.LocalizationType.EDEX_STATIC, - LocalizationContext.LocalizationLevel.BASE); + private static RedbookFcstMap load(LocalizationFile xmlFile) { + RedbookFcstMap loadedMap = null; try { - xmlFile = pathMgr.getFile(ctx, "redbook/redbookFcstMap.xml"); - - RedbookFcstMap map = (RedbookFcstMap) SerializationUtil - .jaxbUnmarshalFromXmlFile(xmlFile.getAbsolutePath()); - return map; - } catch (Exception e) { + loadedMap = SerializationUtil.jaxbUnmarshalFromXmlFile( + RedbookFcstMap.class, xmlFile.getFile().getAbsolutePath()); + } catch (SerializationException e) { statusHandler.handle(Priority.PROBLEM, e.getMessage(), e); - throw e; } + return loadedMap; + } + + /** + * @param key + * @return The Map Forecast Hour attributes associated with the key; null if + * none found. + */ + public MapFcstHr get(String key) { + return this.mapping.get(key); + } + + /** + * Get the instance of the Map. + * + * @return the instance. + */ + public static synchronized RedbookFcstMap getInstance() { + if (instance == null) { + IPathManager pathMgr = PathManagerFactory.getPathManager(); + LocalizationContext ctx = pathMgr.getContext( + LocalizationContext.LocalizationType.EDEX_STATIC, + LocalizationContext.LocalizationLevel.BASE); + final LocalizationFile xmlFile = pathMgr.getLocalizationFile(ctx, + REDBOOK_FCST_MAP_XML); + + instance = load(xmlFile); + xmlFile.addFileUpdatedObserver(new ILocalizationFileObserver() { + @Override + public void fileUpdated(FileUpdatedMessage message) { + RedbookFcstMap updatedMap = load(xmlFile); + instance.mapping.clear(); + instance.mapping.putAll(updatedMap.mapping); + } + }); + } + return instance; } } diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookParser.java b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookParser.java index e4ff39dc05..c4cec2c31f 100644 --- a/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookParser.java +++ b/edexOsgi/com.raytheon.edex.plugin.redbook/src/com/raytheon/edex/plugin/redbook/decoder/RedbookParser.java @@ -32,7 +32,7 @@ import org.apache.commons.logging.LogFactory; import com.raytheon.edex.plugin.redbook.common.RedbookRecord; import com.raytheon.edex.plugin.redbook.common.blocks.ProductIdBlock; import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlock; -import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockFactory; +import com.raytheon.edex.plugin.redbook.common.blocks.RedbookBlockBuilder; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.edex.decodertools.time.TimeTools; import com.raytheon.uf.edex.wmo.message.WMOHeader; @@ -51,6 +51,7 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader; * 20080529 1131 jkorman Added traceId, implemented in logger. * 20101022 6424 kshrestha Added fcsttime * 20110516 8296 mhuang fixed fcsttime problem + * Apr 29, 2013 1958 bgonzale Refactored to improve performance. * </pre> * * @author jkorman @@ -58,6 +59,8 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader; */ public class RedbookParser { + private static final RedbookBlockBuilder blockBuilder = new RedbookBlockBuilder(); + private final Log logger = LogFactory.getLog(getClass()); // private Calendar issueDate = null; @@ -66,7 +69,7 @@ public class RedbookParser { private RedbookRecord rRecord; - private final RedbookBlockFactory blockFactory; + private RedbookFcstMap redbookFcstMap = RedbookFcstMap.getInstance(); /** * @@ -75,8 +78,6 @@ public class RedbookParser { * @param hdr */ public RedbookParser(String traceId, byte[] data, WMOHeader hdr) { - blockFactory = RedbookBlockFactory.getInstance(); - rRecord = internalParse(traceId, data, hdr); if (rRecord != null) { @@ -137,13 +138,16 @@ public class RedbookParser { ByteBuffer dataBuf = ByteBuffer.wrap(redbookMsg); + ProductIdBlock productId = null; + redbookDocument = new ArrayList<RedbookBlock>(); + while (dataBuf.hasRemaining()) { RedbookBlock currBlock = null; try { - currBlock = blockFactory.getBlock(dataBuf); + currBlock = blockBuilder.getBlock(dataBuf); redbookDocument.add(currBlock); @@ -154,7 +158,7 @@ public class RedbookParser { System.arraycopy(redbookMsg, 0, redBookData, 0, endPos); record.setRedBookData(redBookData); break; - } else if (currBlock.getMode() == 2 && currBlock.getSubMode() == 3) { + } else if (currBlock.isUpperAirPlot()) { /* * Upper air plots are malformed and require special * handling to extract the data. If we get this far, it is @@ -166,35 +170,35 @@ public class RedbookParser { break; } } + + if (currBlock.isProductId()) { + productId = (ProductIdBlock) currBlock; + } + } catch (BufferUnderflowException bue) { - logger.error(traceId + "- Out of data"); + logger.error(traceId + "- Out of data", bue); return record; } catch (Exception e) { logger.error(traceId + "- Error in parser", e); return record; } } + if (record != null) { - for (RedbookBlock block : redbookDocument) { - if ((block.getMode() == 1) && (block.getSubMode() == 1)) { - ProductIdBlock id = (ProductIdBlock) block; - record.setTimeObs(id.getProductFileTime()); - record.setRetentionHours(id.getRetentionHours()); + if (productId != null) { + record.setTimeObs(productId.getProductFileTime()); + record.setRetentionHours(productId.getRetentionHours()); - record.setFileId(id.getFileIndicator()); - record.setProductId(id.getProductId()); - record.setOriginatorId(id.getOriginatorId()); + record.setFileId(productId.getFileIndicator()); + record.setProductId(productId.getProductId()); + record.setOriginatorId(productId.getOriginatorId()); -/* record.setFcstHours(id.getFcstHours()); */ - record.setFcstHours(getForecastTime(traceId, hdr)); - - int fcstTime = this.getForecastTime(traceId, hdr); - if (fcstTime == 0) - record.setFcstHours(fcstTime); - - record.setTraceId(traceId); - } + /* record.setFcstHours(id.getFcstHours()); */ + record.setFcstHours(getForecastTime(traceId, hdr)); + + record.setTraceId(traceId); } + } else { logger.info(traceId + "- No EndOfProductBlock found"); } @@ -202,41 +206,32 @@ public class RedbookParser { return record; } - public int getForecastTime(String traceId, WMOHeader hdr) - { - RedbookFcstMap map; - try { - map = RedbookFcstMap.load(); - if (map != null){ - RedbookFcstMap.MapFcstHr xmlInfo = map.mapping.get(hdr.getTtaaii()); - if (xmlInfo != null && xmlInfo.fcstHR != null && !xmlInfo.fcstHR.isEmpty()) - return(Integer.parseInt(xmlInfo.fcstHR)); - } - return 0; - } catch (Exception e) { - logger.error(traceId + " - Error in parser - mappingFCST: ", e); + public int getForecastTime(String traceId, WMOHeader hdr) { + RedbookFcstMap.MapFcstHr xmlInfo = redbookFcstMap.get(hdr.getTtaaii()); + + if (xmlInfo != null && xmlInfo.fcstHR != null + && !xmlInfo.fcstHR.isEmpty()) { + return (Integer.parseInt(xmlInfo.fcstHR)); } - return 0; - } + return 0; + } public long getBinnedTime(String traceId, WMOHeader hdr, long timeMillis) { try { long period = 43200 * 1000; // default period is 12 hours long offset = 0; - - RedbookFcstMap map = RedbookFcstMap.load(); - if (map != null) { - RedbookFcstMap.MapFcstHr xmlInfo = map.mapping.get(hdr - .getTtaaii()); - if (xmlInfo != null) { - /* Does not support AWIPS 1 semantics of "period < 0 means - * apply offset first". - */ - if (xmlInfo.binPeriod != null && xmlInfo.binPeriod > 0) - period = (long) xmlInfo.binPeriod * 1000; - if (xmlInfo.binOffset != null) - offset = (long) xmlInfo.binOffset * 1000; - } + RedbookFcstMap.MapFcstHr xmlInfo = redbookFcstMap.get(hdr + .getTtaaii()); + + if (xmlInfo != null) { + /* + * Does not support AWIPS 1 semantics of "period < 0 means apply + * offset first". + */ + if (xmlInfo.binPeriod != null && xmlInfo.binPeriod > 0) + period = (long) xmlInfo.binPeriod * 1000; + if (xmlInfo.binOffset != null) + offset = (long) xmlInfo.binOffset * 1000; } timeMillis = (timeMillis / period) * period + offset; diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePP.java b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePP.java index a58ae43890..15a0a9cea6 100644 --- a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePP.java +++ b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePP.java @@ -51,6 +51,8 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; * routine. * 4 Dec 2012 #15569 lbousaidi fixed daily pp value when token is set to USE_REVCODE * 02 Feb 2012 #15845 lbousaidi added check for data that comes in as -999 + * 07 May 2013 #15880 lbousaidi changed pPE parameter because it was inserting to the + * wrong hour field. * </pre> * * @author mnash @@ -559,10 +561,10 @@ public class GagePP { int minute = dt.get(Calendar.MINUTE); - if (((pPE.charAt(1) == 'P' && minute >= MINUTES_PER_HOUR - - pOptions.getIntlppp())) - || (pPE.charAt(1) == 'C' && minute >= MINUTES_PER_HOUR - - pOptions.getIntpc())) { + if (rec.getPhysicalElement().getCode().charAt(1) == 'C' + && minute >= MINUTES_PER_HOUR - pOptions.getIntpc() + || (pPE.charAt(1) == 'P' + && minute >= MINUTES_PER_HOUR - pOptions.getIntlppp())) { hour++; dt.add(Calendar.HOUR_OF_DAY, 1); rec.setObsTime(dt.getTime()); diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePPWrite.java b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePPWrite.java index eb82755dba..99fc720a3d 100644 --- a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePPWrite.java +++ b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ohdlib/GagePPWrite.java @@ -52,6 +52,8 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 5, 2008 1649 snaples Initial creation + * May 7, 2013 15880 lbousaidi changed minute_offset to offset in + * in write_1_HourValue routine. * * </pre> * @@ -253,7 +255,7 @@ public final class GagePPWrite { pHid.setTs(ts); pHid.setObsdate(obsDate); pHourpc.setId(pHid); - pHourpc.setMinuteOffset(new String(minute_offset)); + pHourpc.setMinuteOffset(new String(offset)); pHourpc.setHourlyQc(new String(qc)); PrecipUtils.set_hour_slot_value(pHourpc, hr, newDataValue); rec = pHourpc; diff --git a/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java b/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java index 4c30b775cd..45976ba3a6 100644 --- a/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java +++ b/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java @@ -21,6 +21,7 @@ package com.raytheon.edex.plugin.warning.gis; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -65,10 +66,16 @@ import com.raytheon.uf.edex.database.cluster.ClusterLockUtils.LockState; import com.raytheon.uf.edex.database.cluster.ClusterTask; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; +import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.GeometryCollectionIterator; import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.LinearRing; +import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.prep.PreparedGeometry; import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; @@ -85,6 +92,7 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; * Jul 18, 2011 rjpeter Initial creation * Mar 29, 2012 #14691 Qinglu Lin Added returned value of getFeArea() of * AreaConfiguration to areaFields List. + * May 7, 2013 15690 Qinglu Lin Added convertToMultiPolygon() and updated queryGeospatialData(). * </pre> * * @author rjpeter @@ -382,6 +390,36 @@ public class GeospatialDataGenerator { SpatialQueryResult[] features = SpatialQueryFactory.create().query( areaSource, areaFields.toArray(new String[areaFields.size()]), null, map, SearchMode.WITHIN); + + // clip against County Warning Area + String cwaSource = "cwa"; + List<String> cwaAreaFields = new ArrayList<String>(Arrays.asList("wfo", "gid")); + HashMap<String, RequestConstraint> cwaMap = new HashMap<String, RequestConstraint>( + 2); + cwaMap.put("wfo", new RequestConstraint(site, ConstraintType.LIKE)); + SpatialQueryResult[] cwaFeatures = SpatialQueryFactory.create().query( + cwaSource, cwaAreaFields.toArray(new String[cwaAreaFields.size()]), + null, cwaMap, SearchMode.WITHIN); + Geometry multiPolygon = null; + Geometry clippedGeom = null; + for (int i = 0; i < features.length; i++) { + multiPolygon = null; + for (int j = 0; j < cwaFeatures.length; j++) { + clippedGeom = features[i].geometry.intersection(cwaFeatures[j].geometry); + if (clippedGeom instanceof GeometryCollection) { + GeometryCollection gc = (GeometryCollection)clippedGeom; + if (multiPolygon != null) + multiPolygon = multiPolygon.union(convertToMultiPolygon(gc)); + else + multiPolygon = convertToMultiPolygon(gc); + } + } + if (multiPolygon != null) + features[i].geometry = multiPolygon; + else if (clippedGeom != null) + features[i].geometry = clippedGeom; + } + topologySimplifyQueryResults(features); // convert to GeospatialData @@ -398,6 +436,66 @@ public class GeospatialDataGenerator { return rval; } + /** + * Convert a GeometryCollection to a MultiPolygon. + * @param gc + */ + private static MultiPolygon convertToMultiPolygon(GeometryCollection gc) { + GeometryCollectionIterator iter = new GeometryCollectionIterator(gc); + Set<Polygon> polygons = new HashSet<Polygon>(); + MultiPolygon mp = null; + iter.next(); + while (iter.hasNext()) { + Object o = iter.next(); + if (o instanceof MultiPolygon) { + if (mp == null) + mp = (MultiPolygon)o; + else + mp = (MultiPolygon)mp.union((MultiPolygon)o); + } else if (o instanceof Polygon) { + polygons.add((Polygon)o); + } else if (o instanceof LineString || o instanceof Point) { + LinearRing lr = null; + Coordinate[] coords = null; + if (o instanceof LineString) { + Coordinate[] cs = ((LineString) o).getCoordinates(); + if (cs.length < 4) { + coords = new Coordinate[4]; + for (int j = 0; j< cs.length; j++) + coords[j] = new Coordinate(cs[j]); + for (int j = cs.length; j < 4; j++) + coords[j] = new Coordinate(cs[3-j]); + } else { + coords = new Coordinate[cs.length+1]; + for (int j = 0; j < cs.length; j++) + coords[j] = new Coordinate(cs[j]); + coords[cs.length] = new Coordinate(cs[0]); + } + } else { + coords = new Coordinate[4]; + for (int i = 0; i < 4; i++) + coords[i] = ((Point)o).getCoordinate(); + } + lr = (((Geometry)o).getFactory()).createLinearRing(coords); + Polygon poly = (new GeometryFactory()).createPolygon(lr, null); + polygons.add((Polygon)poly); + } else { + statusHandler.handle(Priority.WARN, + "Unprocessed Geometry object: " + o.getClass().getName()); + } + } + if (mp == null && polygons.size() == 0) + return null; + if (polygons.size() > 0) { + Polygon[] p = polygons.toArray(new Polygon[0]); + if (mp != null) + mp = (MultiPolygon)mp.union(new MultiPolygon(p, gc.getFactory())); + else + mp = new MultiPolygon(p, gc.getFactory()); + } + return mp; + } + /** * Simplifies the overall geometries using a single collection to preserve * boundaries. Geometries are updated in place. diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPBasin.java b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPBasin.java index b619486b10..715d6ea50f 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPBasin.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPBasin.java @@ -47,6 +47,7 @@ import com.raytheon.uf.common.time.util.ImmutableDate; * Apr 22, 2013 1912 bsteffen optimized the creation of NavigableMaps * from aggregate records and delayed * TreeMap creation to the tertiary loader. + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * </pre> * @@ -175,19 +176,12 @@ public class FFMPBasin implements ISerializableObject, Cloneable { synchronized (values) { - ArrayList<Date> keys = new ArrayList<Date>(); - - for (Date date : values.keySet()) { - if (date.before(beforeDate) && date.after(afterDate)) { - keys.add(date); - } - } - float factor = 0.0f; - for (Date key : keys) { - Date tdate = key; - float val = values.get(key); + for (Entry<Date, Float> entry : values.subMap(beforeDate, + false, afterDate, false).entrySet()) { + Date tdate = entry.getKey(); + float val = entry.getValue(); if (!rate) { @@ -215,7 +209,7 @@ public class FFMPBasin implements ISerializableObject, Cloneable { } dvalue += val; - prevDate = key; + prevDate = tdate; } } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/HucLevelGeometriesFactory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/HucLevelGeometriesFactory.java index 5cda8cc0dd..285f8ee139 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/HucLevelGeometriesFactory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/HucLevelGeometriesFactory.java @@ -19,16 +19,21 @@ **/ package com.raytheon.uf.common.dataplugin.ffmp; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.zip.GZIPInputStream; import com.raytheon.uf.common.localization.IPathManager; import com.raytheon.uf.common.localization.LocalizationContext; @@ -38,6 +43,8 @@ import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.localization.exception.LocalizationOpFailedException; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.serialization.adapters.FloatWKBReader; +import com.raytheon.uf.common.serialization.adapters.FloatWKBWriter; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -50,7 +57,10 @@ import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; /** - * TODO Add Description + * Manage a cache of geometries and envelopes for different areas/resolutions. + * The first time FFMP is loaded the geometries will be simplified and stored to + * localization for faster retrieval. All geometries and envelopes are held in + * memory by a soft reference or until they are explicitly cleared. * * <pre> * @@ -59,6 +69,8 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 9, 2010 rjpeter Initial creation + * Apr 25, 2013 1954 bsteffen Decompress ffmp geometries to save time + * loading them. * * </pre> * @@ -122,9 +134,44 @@ public class HucLevelGeometriesFactory { if (f.exists()) { try { - map = (Map<Long, Geometry>) SerializationUtil - .transformFromThrift(FileUtil.file2bytes( - f.getFile(), true)); + File file = f.getFile(); + byte[] bytes = FileUtil.file2bytes(file, false); + if (bytes[0] == (byte) 0x1f && bytes[1] == (byte) 0x8b) { + // GZIP magic number is present, before 13.4.1 these + // files were compressed and stored in a different + // format, to maintain backwards compatibility we check + // for compression and deserialize the old way. This + // code can be removed any time after 13.5.1. + System.out.println("Decompressing geometry files."); + InputStream is = new ByteArrayInputStream(bytes); + is = new GZIPInputStream(is, bytes.length); + ByteArrayOutputStream os = new ByteArrayOutputStream( + bytes.length * 3 / 2); + byte[] buffer = new byte[1024 * 8]; + int numRead = 0; + while ((numRead = is.read(buffer)) >= 0) { + os.write(buffer, 0, numRead); + } + bytes = os.toByteArray(); + map = (Map<Long, Geometry>) SerializationUtil + .transformFromThrift(Map.class, bytes); + // save them back the new way. + persistGeometryMap(dataKey, cwa, huc, map); + } else { + Map<Long, byte[]> serializableMap = (Map<Long, byte[]>) SerializationUtil + .transformFromThrift(Map.class, bytes); + FloatWKBReader reader = new FloatWKBReader( + new GeometryFactory()); + map = new HashMap<Long, Geometry>( + serializableMap.size()); + for (Entry<Long, byte[]> entry : serializableMap + .entrySet()) { + InputStream in = new ByteArrayInputStream( + entry.getValue()); + Geometry geom = reader.readGeometry(in); + map.put(entry.getKey(), geom); + } + } int sizeGuess = Math.max( Math.abs(pfafs.size() - map.size()), 10); pfafsToGenerate = new ArrayList<Long>(sizeGuess); @@ -341,13 +388,23 @@ public class HucLevelGeometriesFactory { protected synchronized void persistGeometryMap(String dataKey, String cwa, String huc, Map<Long, Geometry> map) throws Exception { + LocalizationContext lc = pathManager.getContext( LocalizationType.COMMON_STATIC, LocalizationLevel.SITE); LocalizationFile lf = pathManager.getLocalizationFile(lc, getGeomPath(dataKey, cwa, huc)); - FileUtil.bytes2File(SerializationUtil.transformToThrift(map), - lf.getFile(), true); + FloatWKBWriter writer = new FloatWKBWriter(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); + Map<Long, byte[]> serializableMap = new HashMap<Long, byte[]>(); + for (Entry<Long, Geometry> entry : map.entrySet()) { + writer.writeGeometry(entry.getValue(), bos); + serializableMap.put(entry.getKey(), bos.toByteArray()); + bos.reset(); + } + byte[] bytes = SerializationUtil.transformToThrift(serializableMap); + FileUtil.bytes2File(bytes, lf.getFile(), false); lf.save(); + } protected synchronized String getGeomPath(String dataKey, String cwa, diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index 087b58f697..78a8b673f5 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -3,11 +3,9 @@ com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID -com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation com.raytheon.uf.common.dataplugin.gfe.reference.ReferenceData com.raytheon.uf.common.dataplugin.gfe.sample.SampleData com.raytheon.uf.common.dataplugin.gfe.server.lock.Lock -com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable com.raytheon.uf.common.dataplugin.gfe.server.message.ServerMsg com.raytheon.uf.common.dataplugin.gfe.weatherelement.WEGroup com.raytheon.uf.common.dataplugin.gfe.weatherelement.WEItem diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/res/scripts/gfeViews.sql b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/res/scripts/gfeViews.sql new file mode 100644 index 0000000000..b931e8f9e5 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/res/scripts/gfeViews.sql @@ -0,0 +1,21 @@ +CREATE OR REPLACE VIEW gfe_view AS + SELECT db.siteid, db.modelname, db.dbtype, db.modeltime, parm.parmname, + parm.parmlevel, rec.rangestart, rec.rangeend, rec.inserttime + FROM gfe rec, gfe_parmid parm, gfe_dbid db + WHERE rec.parmid_id = parm.id AND parm.dbid_id = db.id; + +ALTER TABLE gfe_view + OWNER TO awips; +GRANT ALL ON TABLE gfe_view TO awips; +GRANT SELECT ON TABLE gfe_view TO public; + +CREATE OR REPLACE VIEW gfe_locks_view AS + SELECT db.siteid, db.modelname, db.dbtype, db.modeltime, parm.parmname, + parm.parmlevel, lk.starttime, lk.endtime, lk.wsid + FROM gfe_locks lk, gfe_parmid parm, gfe_dbid db + WHERE lk.parmid_id = parm.id AND parm.dbid_id = db.id; + +ALTER TABLE gfe_locks_view + OWNER TO awips; +GRANT ALL ON TABLE gfe_locks_view TO awips; +GRANT SELECT ON TABLE gfe_locks_view TO public; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/res/scripts/gfe_indices.sql b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/res/scripts/gfe_indices.sql deleted file mode 100644 index 3411801104..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/res/scripts/gfe_indices.sql +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -CREATE INDEX "gfeParmTime_idx" - ON gfe - USING btree - (parmid, rangestart, rangeend); - diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/GridDataHistory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/GridDataHistory.java index 1b6c34a963..46c596b593 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/GridDataHistory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/GridDataHistory.java @@ -20,21 +20,30 @@ package com.raytheon.uf.common.dataplugin.gfe; -import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import org.hibernate.annotations.Index; import org.hibernate.annotations.Type; import com.raytheon.edex.util.Util; +import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.message.WsId; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.time.TimeRange; @@ -49,22 +58,26 @@ import com.raytheon.uf.common.time.TimeRange; * randerso Initial creation * 02/27/2008 879 rbell Added clone() * 04/18/2008 #875 bphillip Changed date fields to use java.util.Calendar - * + * 03/28/2013 1949 rjpeter Normalized database structure. * </pre> * * @author randerso * @version 1.0 */ -@Entity(name = "gfe_gridhistory") +@Entity +@Table(name = "gfe_gridhistory") @DynamicSerialize -public class GridDataHistory implements Cloneable, Serializable, - ISerializableObject { +public class GridDataHistory implements Cloneable { private static final long serialVersionUID = 1L; + /** + * Auto-generated surrogate key + */ @Id - @GeneratedValue() - private int key; + @SequenceGenerator(name = "GFE_HISTORY_GENERATOR", sequenceName = "gfe_history_seq", allocationSize = 1) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GFE_HISTORY_GENERATOR") + private int id; public enum OriginType { INITIALIZED("Populated"), TIME_INTERPOLATED("Interpolated"), SCRATCH( @@ -89,10 +102,13 @@ public class GridDataHistory implements Cloneable, Serializable, }; @Column - @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.OriginHibType") + @Enumerated(value = EnumType.STRING) @DynamicSerializeElement private OriginType origin; + // DO NOT LINK TO PARMID TABLE. The ParmId table may be purged out + // independent of the history of a forecast grid. Need to keep the history + // of where the grid came from. @Column @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.ParmIdType") @DynamicSerializeElement @@ -123,6 +139,16 @@ public class GridDataHistory implements Cloneable, Serializable, @DynamicSerializeElement private Date lastSentTime; + /** + * Used only for hibernate mappings to allow a look up of GridDataHistory by + * a given parmId/timeRange. Do not set cascade options. + */ + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @PrimaryKeyJoinColumn + @JoinColumn(updatable = false) + @Index(name = "gfe_gridhistory_history_idx") + private GFERecord parent; + /** * Default constructor (all fields initialized null) */ @@ -452,16 +478,16 @@ public class GridDataHistory implements Cloneable, Serializable, /** * @return the key */ - public int getKey() { - return key; + public int getId() { + return id; } /** * @param key * the key to set */ - public void setKey(int key) { - this.key = key; + public void setId(int id) { + this.id = id; } public void replaceValues(GridDataHistory replacement) { @@ -573,4 +599,19 @@ public class GridDataHistory implements Cloneable, Serializable, } return true; } + + /** + * @return the parent + */ + public GFERecord getParent() { + return parent; + } + + /** + * @param parent + * the parent to set + */ + public void setParent(GFERecord parent) { + this.parent = parent; + } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java index c10957f4b2..13a1a763ec 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java @@ -55,6 +55,7 @@ import com.vividsolutions.jts.geom.Coordinate; * ------------ ---------- ----------- -------------------------- * 03/13/08 #1030 randerso Initial port * 04/24/08 #1047 randerso Made all fields private and created getters + * 04/24/13 #1935 randerso Fixed date line spanning issue * * </pre> * @@ -192,10 +193,6 @@ public class ProjectionData implements ISerializableObject { return; } - // fix up corner lons - this.latLonLL.x = MapUtil.correctLon(this.latLonLL.x); - this.latLonUR.x = MapUtil.correctLon(this.latLonUR.x); - try { // transform the projection corner points to CRS units MathTransform mt = MapUtil.getTransformFromLatLon(getCrs()); @@ -287,7 +284,9 @@ public class ProjectionData implements ISerializableObject { break; case LATLON: - crs = MapUtil.LATLON_PROJECTION; + crs = MapUtil.constructEquidistantCylindrical( + MapUtil.AWIPS_EARTH_RADIUS, MapUtil.AWIPS_EARTH_RADIUS, + this.lonCenter, 0); break; case NONE: diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEDataAccessUtil.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEDataAccessUtil.java index bdbece4e64..4a32e089d3 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEDataAccessUtil.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEDataAccessUtil.java @@ -21,7 +21,6 @@ package com.raytheon.uf.common.dataplugin.gfe.dataaccess; import java.util.Arrays; import java.util.List; -import java.util.Map; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo; @@ -31,8 +30,6 @@ import com.raytheon.uf.common.dataplugin.gfe.request.GetGridParmInfoRequest; import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse; import com.raytheon.uf.common.dataplugin.gfe.server.request.GetGridRequest; import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice; -import com.raytheon.uf.common.dataquery.requests.RequestConstraint; -import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; import com.raytheon.uf.common.serialization.comm.RequestRouter; /** @@ -46,6 +43,9 @@ import com.raytheon.uf.common.serialization.comm.RequestRouter; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 9, 2011 bsteffen Initial creation + * May 02, 2013 1949 bsteffen Update GFE data access in Product + * Browser, Volume Browser, and Data Access + * Framework. * * </pre> * @@ -54,25 +54,21 @@ import com.raytheon.uf.common.serialization.comm.RequestRouter; */ public class GFEDataAccessUtil { - private static final String PARM_ID_FORMAT = "%s_%s:%s_GRID_%s_%s_%s"; + public static final String PLUGIN_NAME = "pluginName"; public static final String PARM_ID = "parmId"; - public static final String DB_ID = "dbId"; + public static final String DB_ID = PARM_ID + ".dbId"; - public static final String PLUGIN_NAME = "pluginName"; + public static final String SITE_ID = DB_ID + ".siteId"; - public static final String SITE_ID = "siteId"; + public static final String MODEL_NAME = DB_ID + ".modelName"; - public static final String DB_TYPE = "dbType"; + public static final String MODEL_TIME = DB_ID + ".modelTime"; - public static final String MODEL_NAME = "modelName"; + public static final String PARM_NAME = PARM_ID + ".parmName"; - public static final String MODEL_TIME = "modelTime"; - - public static final String PARM_NAME = "parmName"; - - public static final String PARM_LEVEL = "parmLevel"; + public static final String PARM_LEVEL = PARM_ID + ".parmLevel"; /** * Retrieve the GridParmInfo for a ParmID @@ -114,50 +110,4 @@ public class GFEDataAccessUtil { return response.getPayload().get(0); } - /** - * Take a map of value for various fields that make up the ParmId and - * convert it into a single like constraint for ParmId. ANd fields not in - * the map will accept any value. - * - * @param components - * @return - */ - public static RequestConstraint createParmIdConstraint( - Map<String, String> components) { - String siteId = "%"; - String modelName = "%"; - String modelTime = "%"; - String dbType = "%"; - String parmName = "%"; - String parmLevel = "%"; - - if (components.containsKey(SITE_ID)) { - siteId = components.get(SITE_ID); - } - - if (components.containsKey(MODEL_NAME)) { - modelName = components.get(MODEL_NAME); - } - - if (components.containsKey(MODEL_TIME)) { - modelTime = components.get(MODEL_TIME); - } - - if (components.containsKey(DB_TYPE)) { - dbType = components.get(DB_TYPE); - } - - if (components.containsKey(PARM_NAME)) { - parmName = components.get(PARM_NAME); - } - - if (components.containsKey(PARM_LEVEL)) { - parmLevel = components.get(PARM_LEVEL); - } - - String parmId = String.format(PARM_ID_FORMAT, parmName, - parmLevel, siteId, dbType, modelName, modelTime); - return new RequestConstraint(parmId, ConstraintType.LIKE); - } - } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEGridFactory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEGridFactory.java index 7fed12ecd7..4aa82f64b0 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEGridFactory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/dataaccess/GFEGridFactory.java @@ -19,12 +19,9 @@ **/ package com.raytheon.uf.common.dataplugin.gfe.dataaccess; -import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import org.geotools.coverage.grid.GridGeometry2D; @@ -36,7 +33,6 @@ import com.raytheon.uf.common.dataaccess.impl.AbstractGridDataPluginFactory; import com.raytheon.uf.common.dataaccess.impl.DefaultGridData; import com.raytheon.uf.common.dataaccess.util.DataWrapperUtil; import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo; @@ -66,6 +62,9 @@ import com.raytheon.uf.common.geospatial.MapUtil; * Feb 4, 2013 bsteffen Initial creation * Feb 14, 2013 1614 bsteffen Refactor data access framework to use * single request. + * May 02, 2013 1949 bsteffen Update GFE data access in Product + * Browser, Volume Browser, and Data Access + * Framework. * * </pre> * @@ -76,8 +75,16 @@ import com.raytheon.uf.common.geospatial.MapUtil; public class GFEGridFactory extends AbstractGridDataPluginFactory implements IDataFactory { - private static final String[] VALID_IDENTIFIERS = { GFEDataAccessUtil.MODEL_NAME, - GFEDataAccessUtil.MODEL_TIME, GFEDataAccessUtil.SITE_ID }; + public static final String MODEL_TIME = "modelTime"; + + private static final String MODEL_NAME = "modelName"; + + private static final String SITE_ID = "siteId"; + + // The more full version from GFEDataAccessUtil is prefered but the smaller + // keys are needed for backwards compatibility. + private static final String[] VALID_IDENTIFIERS = { MODEL_NAME, MODEL_TIME, + SITE_ID }; @Override public String[] getValidIdentifiers() { @@ -102,11 +109,11 @@ public class GFEGridFactory extends AbstractGridDataPluginFactory implements defaultGridData.setLocationName(gfeRecord.getDbId().getSiteId()); Map<String, Object> attrs = new HashMap<String, Object>(); - attrs.put(GFEDataAccessUtil.MODEL_NAME, gfeRecord.getDbId() + attrs.put(MODEL_NAME, gfeRecord.getDbId() .getModelName()); - attrs.put(GFEDataAccessUtil.MODEL_TIME, gfeRecord.getDbId() + attrs.put(MODEL_TIME, gfeRecord.getDbId() .getModelTime()); - attrs.put(GFEDataAccessUtil.SITE_ID, gfeRecord.getDbId().getSiteId()); + attrs.put(SITE_ID, gfeRecord.getDbId().getSiteId()); defaultGridData.setAttributes(attrs); @@ -118,19 +125,31 @@ public class GFEGridFactory extends AbstractGridDataPluginFactory implements IDataRequest request) { HashMap<String, RequestConstraint> constraints = new HashMap<String, RequestConstraint>(); - Map<String, String> parmIdComponents = new HashMap<String, String>(); Map<String, Object> identifiers = request.getIdentifiers(); if (identifiers != null) { for (Entry<String, Object> entry : identifiers.entrySet()) { - parmIdComponents.put(entry.getKey(), entry.getValue() - .toString()); + if (entry.getKey().equals(MODEL_NAME)) { + constraints.put(GFEDataAccessUtil.MODEL_NAME, + new RequestConstraint(entry + .getValue().toString())); + } else if (entry.getKey().equals(SITE_ID)) { + constraints.put(GFEDataAccessUtil.SITE_ID, + new RequestConstraint(entry.getValue().toString())); + } else if (entry.getKey().equals(MODEL_TIME)) { + constraints.put(GFEDataAccessUtil.MODEL_TIME, + new RequestConstraint(entry.getValue().toString())); + } else { + constraints.put(entry.getKey(), new RequestConstraint(entry + .getValue().toString())); + } } } String[] parameters = request.getParameters(); if (parameters != null) { if (parameters.length == 1) { - parmIdComponents.put(GFEDataAccessUtil.PARM_NAME, parameters[0]); + constraints.put(GFEDataAccessUtil.PARM_NAME, + new RequestConstraint(parameters[0])); } else if (parameters.length > 1) { RequestConstraint paramNameConstraint = new RequestConstraint( null, ConstraintType.IN); @@ -142,8 +161,9 @@ public class GFEGridFactory extends AbstractGridDataPluginFactory implements Level[] levels = request.getLevels(); if (levels != null) { if (levels.length == 1) { - parmIdComponents.put(GFEDataAccessUtil.PARM_LEVEL, levels[0] - .getMasterLevel().getName()); + constraints.put(GFEDataAccessUtil.PARM_LEVEL, + new RequestConstraint(levels[0].getMasterLevel() + .getName())); } else if (levels.length > 1) { RequestConstraint paramLevelConstraint = new RequestConstraint( null, ConstraintType.IN); @@ -158,34 +178,16 @@ public class GFEGridFactory extends AbstractGridDataPluginFactory implements String[] locationNames = request.getLocationNames(); if (locationNames != null) { if (locationNames.length == 1) { - parmIdComponents.put(GFEDataAccessUtil.SITE_ID, - locationNames[0]); + constraints.put(GFEDataAccessUtil.SITE_ID, + new RequestConstraint(locationNames[0])); } else if (locationNames.length > 1) { - RequestConstraint dbIdConstraint = new RequestConstraint(null, + RequestConstraint siteConstraint = new RequestConstraint(null, ConstraintType.IN); - HashSet<String> locationNamesSet = new HashSet<String>( - Arrays.asList(locationNames)); - DbQueryRequest dbRequest = new DbQueryRequest(); - dbRequest.addRequestField(GFEDataAccessUtil.DB_ID); - dbRequest.setDistinct(true); - DbQueryResponse dbResonse = executeDbQueryRequest(dbRequest, - request.toString()); - for (Map<String, Object> resultMap : dbResonse.getResults()) { - DatabaseID dbId = (DatabaseID) resultMap - .get(GFEDataAccessUtil.DB_ID); - if (locationNamesSet.contains(dbId.getSiteId())) { - dbIdConstraint - .addToConstraintValueList(dbId.toString()); - } - } - constraints.put(GFEDataAccessUtil.DB_ID, dbIdConstraint); - + siteConstraint.setConstraintValueList(locationNames); + constraints.put(GFEDataAccessUtil.SITE_ID, siteConstraint); } } - constraints.put(GFEDataAccessUtil.PARM_ID, - GFEDataAccessUtil.createParmIdConstraint(parmIdComponents)); - return constraints; } @@ -231,17 +233,13 @@ public class GFEGridFactory extends AbstractGridDataPluginFactory implements @Override public String[] getAvailableLocationNames(IDataRequest request) { DbQueryRequest dbRequest = buildDbQueryRequest(request); - dbRequest.addRequestField(GFEDataAccessUtil.DB_ID); + dbRequest.addRequestField(GFEDataAccessUtil.SITE_ID); dbRequest.setDistinct(true); DbQueryResponse dbResonse = executeDbQueryRequest(dbRequest, request.toString()); - Set<String> locationNames = new HashSet<String>(); - for (Map<String, Object> resultMap : dbResonse.getResults()) { - DatabaseID dbId = (DatabaseID) resultMap - .get(GFEDataAccessUtil.DB_ID); - locationNames.add(dbId.getSiteId()); - } - return locationNames.toArray(new String[0]); + + return dbResonse.getFieldObjects(GFEDataAccessUtil.SITE_ID, + String.class); } private GFERecord asGFERecord(Object obj) { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/DatabaseID.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/DatabaseID.java index 3e1e00fb62..47f542e9de 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/DatabaseID.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/DatabaseID.java @@ -20,25 +20,37 @@ package com.raytheon.uf.common.dataplugin.gfe.db.objects; -import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.Set; import java.util.TimeZone; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.gfe.serialize.DatabaseIDAdapter; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter; /** - * * Object used to identify an hdf5 grid "database".<br> * This is a port from original DatabaseID found in AWIPS I * @@ -47,23 +59,22 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdap * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 3/6/08 875 bphillip Initial Creation - * 8/19/09 2899 njensen Rewrote equals() for performance - * 5/08/12 #600 dgilling Implement clone(). - * 6/25/12 #766 dgilling Fix isValid(). - * 01/18/13 #1504 randerso Removed setters since class should be immutable - * + * 8/19/09 2899 njensen Rewrote equals() for performance + * 5/08/12 600 dgilling Implement clone(). + * 6/25/12 766 dgilling Fix isValid(). + * 01/18/13 1504 randerso Removed setters since class should be immutable + * 03/28/13 1949 rjpeter Normalized database structure. * </pre> * * @author bphillip * @version 1.0 */ -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) -@XmlJavaTypeAdapter(value = DatabaseIDAdapter.class) +@Entity +@Table(name = "gfe_dbid", uniqueConstraints = { @UniqueConstraint(columnNames = { + "siteId", "modelName", "modelTime", "dbType" }) }) @DynamicSerialize @DynamicSerializeTypeAdapter(factory = DatabaseIDAdapter.class) -public class DatabaseID implements Serializable, Comparable<DatabaseID>, - ISerializableObject, Cloneable { +public class DatabaseID implements Comparable<DatabaseID> { private static final long serialVersionUID = 5792890762609478694L; @@ -92,27 +103,59 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, NONE, GRID }; + /** + * Auto-generated surrogate key + */ + @Id + @SequenceGenerator(name = "GFE_DBID_GENERATOR", sequenceName = "gfe_dbid_seq") + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GFE_DBID_GENERATOR") + private int id; + /** The site identifier */ + @Column(length = 4, nullable = false) + @DataURI(position = 0) private String siteId; /** The database format */ + @Column(nullable = false) + @Enumerated(EnumType.STRING) + // will this ever not be GRID for any persisted database? private DataType format; /** Optional database type */ + @Column(length = 15) + @DataURI(position = 3) private String dbType; /** The model name */ + @Column(length = 64, nullable = false) + @DataURI(position = 1) private String modelName; + // TODO: Use actual time for db column /** Model Time yyyymmdd_hhmm */ - private String modelTime; + @Column(length = 13, nullable = false) + @DataURI(position = 2) + private String modelTime = NO_MODEL_TIME; /** The model identifier */ + @Transient private String modelId; /** The short model identifier */ + @Transient private String shortModelId; + /** + * Used only for hibernate mappings to allow a cascade delete to all child + * parmIds when the databaseId is deleted. These should not be loaded by or + * referenced normally from code from this object. + */ + @OneToMany(fetch = FetchType.LAZY, mappedBy = "dbId", cascade = { CascadeType.REMOVE }) + @OnDelete(action = OnDeleteAction.CASCADE) + @SuppressWarnings("unused") + private Set<ParmID> parmIds; + /** * Creates a new DatabaseID */ @@ -126,9 +169,7 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, * @param dbIdentifier */ public DatabaseID(String dbIdentifier) { - if (decodeIdentifier(dbIdentifier)) { - encodeIdentifier(); - } else { + if (!decodeIdentifier(dbIdentifier)) { // set to default values format = DataType.NONE; dbType = ""; @@ -181,7 +222,6 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, this.dbType = dbType; this.modelName = modelName; this.modelTime = modelTime; - encodeIdentifier(); } /** @@ -202,6 +242,15 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, this(siteId, format, dbType, modelName, NO_MODEL_TIME); } + /** + * Returns the id field, auto-generated surrogate key. + * + * @return + */ + public int getId() { + return id; + } + /** * The less than operator. Ordering is by site, format, type, model, and * modeltime. <br> @@ -269,7 +318,7 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, */ public DatabaseID stripType() { - if (modelTime.equals(DatabaseID.NO_MODEL_TIME)) { + if (NO_MODEL_TIME.equals(modelTime)) { return new DatabaseID(siteId, format, "", modelName); } else { return new DatabaseID(siteId, format, "", modelName, modelTime); @@ -366,7 +415,7 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, shortModelId += "_" + dbType; } - if (!modelTime.equals(NO_MODEL_TIME)) { + if (!NO_MODEL_TIME.equals(modelTime)) { modelId += "_" + modelTime; shortModelId += "_" + modelTime.substring(6, 8) + modelTime.substring(9, 11); @@ -379,7 +428,7 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, @Override public String toString() { - return modelId; + return getModelId(); } /** @@ -426,6 +475,10 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, */ public String getModelId() { + if (modelId == null) { + encodeIdentifier(); + } + return modelId; } @@ -434,6 +487,10 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, */ public String getShortModelId() { + if (shortModelId == null) { + encodeIdentifier(); + } + return shortModelId; } @@ -448,7 +505,9 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, int result = 1; result = prime * result + (dbType == null ? 0 : dbType.hashCode()); result = prime * result + (format == null ? 0 : format.hashCode()); - result = prime * result + (modelId == null ? 0 : modelId.hashCode()); + String localModelId = getModelId(); + result = prime * result + + (localModelId == null ? 0 : localModelId.hashCode()); result = prime * result + (modelTime == null ? 0 : modelTime.hashCode()); result = prime * result + (siteId == null ? 0 : siteId.hashCode()); @@ -488,6 +547,7 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, return date; } + // TODO: DELETE THIS METHOD public Date getModelTimeAsDate() { if (this.modelTime.equals(NO_MODEL_TIME)) { return new Date(0); @@ -538,16 +598,4 @@ public class DatabaseID implements Serializable, Comparable<DatabaseID>, int time = -this.getModelTimeAsDate().compareTo(o.getModelTimeAsDate()); return time; } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#clone() - */ - @Override - protected DatabaseID clone() throws CloneNotSupportedException { - return new DatabaseID(this.siteId, this.format, this.dbType, - this.modelName, this.modelTime); - } - } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.java index c661e3defb..c40bae90b5 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.java @@ -28,40 +28,35 @@ import java.util.Calendar; import java.util.List; import java.util.TimeZone; -import javax.persistence.CascadeType; -import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; -import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OrderBy; +import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Index; -import org.hibernate.annotations.Type; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory; -import com.raytheon.uf.common.dataplugin.gfe.util.GfeUtil; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.TimeRange; /** - * Record implementation for GFE plugin. + * Record implementation for GFE plugin. Record is essentially read only and + * should never need to be updated. GridDataHistory referenced by record may + * update. * * <pre> * @@ -70,37 +65,30 @@ import com.raytheon.uf.common.time.TimeRange; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * -------- --- randerso Initial creation - * 20070914 379 jkorman Added populateDataStore() and + * 20070914 379 jkorman Added populateDataStore() and * getPersistenceTime() from new IPersistable - * 20071129 472 jkorman Added IDecoderGettable interface. - * 06/17/08 #940 bphillip Implemented GFE Locking - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * 20071129 472 jkorman Added IDecoderGettable interface. + * 06/17/08 940 bphillip Implemented GFE Locking + * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime + * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * Apr 23, 2013 1949 rjpeter Normalized database structure. * </pre> * * @author randerso * @version 1 */ -/** - * - */ @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "gfeseq") -@Table(name = "gfe", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@Table(name = "gfe", uniqueConstraints = { @UniqueConstraint(columnNames = { + "parmId_id", "rangestart", "rangeend", "refTime", "forecasttime" }) }) /* * Both refTime and forecastTime are included in the refTimeIndex since * forecastTime is unlikely to be used. */ -@org.hibernate.annotations.Table( - appliesTo = "gfe", - indexes = { - @Index(name = "gfe_refTimeIndex", columnNames = { "refTime", "forecastTime" } ) - } -) -@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) +@org.hibernate.annotations.Table(appliesTo = "gfe", indexes = { @Index(name = "gfe_refTimeIndex", columnNames = { + "refTime", "forecastTime" }) }) @DynamicSerialize +@BatchSize(size = 500) public class GFERecord extends PluginDataObject { private static final long serialVersionUID = 1L; @@ -110,59 +98,41 @@ public class GFERecord extends PluginDataObject { NONE, SCALAR, VECTOR, WEATHER, DISCRETE }; - /** The name of the parm parameter */ - @Column(length = 100) - @XmlAttribute - @DynamicSerializeElement - private String parmName; - - /** The name of the parm level */ - @Column(length = 8) - @XmlAttribute - @DynamicSerializeElement - private String parmLevel; - /** * The parmID of the associated parm.<br> - * This field is constructed when the getter is called.<br> - * It is constructed from the parmName, parmLevel, and the databaseID */ - @DataURI(position = 1) - @Column - @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.ParmIdType") - @XmlElement + @DataURI(position = 1, embedded = true) + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @PrimaryKeyJoinColumn @DynamicSerializeElement private ParmID parmId; - /** - * The database associated with this record - */ - @DataURI(position = 2) - @Column - @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.DatabaseIdType") - @XmlElement - @DynamicSerializeElement - private DatabaseID dbId; - /** The grid parm information associated with this parameter */ @Transient private GridParmInfo gridInfo; - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) - @JoinColumn(name = "parent", nullable = false) - @Index(name = "gfe_gridhistory_history_idx") - @OrderBy("key") - @XmlElement + /** + * GridHistories for this record. Only cascade on remove. Insert/Update + * managed independently. + */ + @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent") + @BatchSize(size = 500) + @OnDelete(action = OnDeleteAction.CASCADE) + @OrderBy("id") @DynamicSerializeElement - private List<GridDataHistory> gridHistory = new ArrayList<GridDataHistory>( - 0); + private List<GridDataHistory> gridHistory = null; + + /** + * Histories to remove when updated + */ + @Transient + private List<GridDataHistory> oldHistory = null; /** * Creates a new empty GFERecord. Must use setters to fill in private fields * or the object is invalid. */ public GFERecord() { - } /** @@ -180,13 +150,14 @@ public class GFERecord extends PluginDataObject { cal.setTime(timeRange.getStart()); this.dataTime = new DataTime(cal, timeRange); this.parmId = parmId; - this.parmName = parmId.getParmName(); - this.parmLevel = parmId.getParmLevel(); - this.dbId = parmId.getDbId(); } public void addHistoryEntry(GridDataHistory historyEntry) { + if (gridHistory == null) { + gridHistory = new ArrayList<GridDataHistory>(1); + } gridHistory.add(historyEntry); + historyEntry.setParent(this); } /** @@ -226,27 +197,15 @@ public class GFERecord extends PluginDataObject { } public DatabaseID getDbId() { - return dbId; - } - - public void setDbId(DatabaseID dbId) { - this.dbId = dbId; + return parmId.getDbId(); } public String getParmName() { - return parmName; - } - - public void setParmName(String parmName) { - this.parmName = parmName; + return parmId.getParmName(); } public String getParmLevel() { - return parmLevel; - } - - public void setParmLevel(String parmLevel) { - this.parmLevel = parmLevel; + return parmId.getParmLevel(); } public GridParmInfo getGridInfo() { @@ -261,14 +220,14 @@ public class GFERecord extends PluginDataObject { return this.dataTime.getValidPeriod(); } - public String getGridHistoryStrings() { - return GfeUtil.getHistoryStrings(this.gridHistory); - } - /** * @return the gridHistory */ public List<GridDataHistory> getGridHistory() { + if (gridHistory == null) { + gridHistory = new ArrayList<GridDataHistory>(0); + } + return gridHistory; } @@ -278,6 +237,41 @@ public class GFERecord extends PluginDataObject { */ public void setGridHistory(List<GridDataHistory> gridHistory) { this.gridHistory = gridHistory; + if (gridHistory != null) { + for (GridDataHistory hist : gridHistory) { + hist.setParent(this); + } + } } + /** + * @return the oldHistory + */ + public List<GridDataHistory> getOldHistory() { + return oldHistory; + } + + public void consolidateHistory(List<GridDataHistory> newHistory) { + for (int i = 0; i < newHistory.size(); i++) { + if (i < gridHistory.size()) { + gridHistory.get(i).replaceValues(newHistory.get(i)); + } else { + GridDataHistory hist = newHistory.get(i); + hist.setParent(this); + gridHistory.add(hist); + } + } + + if (gridHistory.size() > newHistory.size()) { + if (oldHistory == null) { + oldHistory = new ArrayList<GridDataHistory>( + gridHistory.subList(newHistory.size(), + gridHistory.size())); + } + + for (int i = newHistory.size(); i < gridHistory.size(); i++) { + gridHistory.remove(i); + } + } + } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.java index e8503c2226..4aa195e953 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.java @@ -20,19 +20,33 @@ package com.raytheon.uf.common.dataplugin.gfe.db.objects; -import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Set; import java.util.TimeZone; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import com.raytheon.edex.util.Util; +import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.gfe.serialize.ParmIDAdapter; -import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.dataplugin.gfe.server.lock.Lock; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter; @@ -47,66 +61,92 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdap * ------------ ---------- ----------- -------------------------- * 3/6/08 875 bphillip Initial Creation * 5/8/12 #600 dgilling Implement clone(). - * 01/18/13 #1504 randerso Removed setters since class should be immutable - * + * 01/18/13 1504 randerso Removed setters since class should be immutable + * 03/28/13 1949 rjpeter Normalized database structure. * </pre> * * @author bphillip * @version 1.0 */ -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) -@XmlJavaTypeAdapter(value = ParmIDAdapter.class) +@Entity +@Table(name = "gfe_parmid", uniqueConstraints = { @UniqueConstraint(columnNames = { + "dbId_id", "parmName", "parmLevel" }) }) @DynamicSerialize @DynamicSerializeTypeAdapter(factory = ParmIDAdapter.class) -public class ParmID implements Comparable<ParmID>, Serializable, - ISerializableObject, Cloneable { +public class ParmID implements Comparable<ParmID> { private static final long serialVersionUID = 6801523496768037356L; private static final String DEFAULT_LEVEL = "SFC"; private static final SimpleDateFormat MODEL_TIME_FORMAT; + static { MODEL_TIME_FORMAT = new SimpleDateFormat("MMMddHH"); MODEL_TIME_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); } + /** + * Auto-generated surrogate key + */ + @Id + @SequenceGenerator(name = "GFE_PARMID_GENERATOR", sequenceName = "gfe_parmid_seq") + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GFE_PARMID_GENERATOR") + private int id; + /** The name of the parm (i.e. T for Temperature) */ + @Column(length = 100) + @DataURI(position = 1) private String parmName; /** The level at which this parm applies */ + @Column(length = 8) + @DataURI(position = 2) private String parmLevel; /** The database that this parm ID is associated with */ + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @PrimaryKeyJoinColumn + @DataURI(position = 0, embedded = true) private DatabaseID dbId; /** * The parameter name/level information <br> * Example: T_SFC (Temperature parameter and surface level) */ + @Transient private String compositeName; /** The parmID including the parameter, level and database ID */ + @Transient private String shortParmId; /** A more extended version of the parameter ID */ + @Transient private String parmId; + /** + * Used only for hibernate mappings to allow a cascade delete to all records + * when the databaseId is deleted + */ + @OneToMany(fetch = FetchType.LAZY, mappedBy = "parmId", cascade = { CascadeType.REMOVE }) + @OnDelete(action = OnDeleteAction.CASCADE) + @SuppressWarnings("unused") + private Set<GFERecord> records; + + /** + * Used only for hibernate mappings to allow a cascade delete to all locks + * when the databaseId is deleted + */ + @OneToMany(fetch = FetchType.LAZY, mappedBy = "parmId", cascade = { CascadeType.REMOVE }) + @OnDelete(action = OnDeleteAction.CASCADE) + @SuppressWarnings("unused") + private Set<Lock> locks; + @Override public String toString() { - return this.parmId; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#clone() - */ - @Override - public ParmID clone() throws CloneNotSupportedException { - return new ParmID(this.parmName, this.dbId.clone(), this.parmLevel); + return getParmId(); } /** @@ -120,7 +160,6 @@ public class ParmID implements Comparable<ParmID>, Serializable, } public ParmID() { - } /** @@ -132,11 +171,9 @@ public class ParmID implements Comparable<ParmID>, Serializable, * The model name */ public ParmID(String parmName, String parmModel) { - this.parmName = parmName; this.parmLevel = defaultLevel(); this.dbId = new DatabaseID(parmModel); - encodeIdentifier(); } /** @@ -153,7 +190,6 @@ public class ParmID implements Comparable<ParmID>, Serializable, this.parmName = parmName; this.parmLevel = level; this.dbId = new DatabaseID(parmModel); - encodeIdentifier(); } /** @@ -164,7 +200,6 @@ public class ParmID implements Comparable<ParmID>, Serializable, */ public ParmID(String parmIdentifier) { decodeIdentifier(parmIdentifier); - encodeIdentifier(); } /** @@ -179,7 +214,6 @@ public class ParmID implements Comparable<ParmID>, Serializable, this.parmName = parmName; this.parmLevel = defaultLevel(); this.dbId = dbId; - encodeIdentifier(); } /** @@ -196,7 +230,15 @@ public class ParmID implements Comparable<ParmID>, Serializable, this.parmName = parmName; this.parmLevel = level; this.dbId = dbId; - encodeIdentifier(); + } + + /** + * Returns the id field, auto-generated surrogate key. + * + * @return + */ + public int getId() { + return id; } /** @@ -211,7 +253,7 @@ public class ParmID implements Comparable<ParmID>, Serializable, if (DEFAULT_LEVEL.equals(parmLevel)) { return parmName; } - return this.compositeName; + return getCompositeName(); } /** @@ -251,18 +293,20 @@ public class ParmID implements Comparable<ParmID>, Serializable, if (DEFAULT_LEVEL.equals(this.parmLevel)) { expressionName = parmName; } else { - expressionName = compositeName; + expressionName = getCompositeName(); } } else { - expressionName = compositeName + "_" + dbID.getSiteId() + "_" + expressionName = getCompositeName() + "_" + dbID.getSiteId() + "_" + dbID.getDbType() + "_" + dbID.getModelName(); if (includeTime) { Date modelDate = dbID.getModelDate(); if (modelDate == null) { expressionName += "_00000000_0000"; } else { - expressionName += "_" - + MODEL_TIME_FORMAT.format(dbID.getModelDate()); + synchronized (MODEL_TIME_FORMAT) { + expressionName += "_" + + MODEL_TIME_FORMAT.format(dbID.getModelDate()); + } } } } @@ -279,11 +323,12 @@ public class ParmID implements Comparable<ParmID>, Serializable, */ public boolean isValid() { - if (parmName == null || parmLevel == null || dbId == null) { + if ((parmName == null) || (parmLevel == null) || (dbId == null)) { return false; } - if (parmName.length() < 1 || parmLevel.length() < 1 || !dbId.isValid()) { + if ((parmName.length() < 1) || (parmLevel.length() < 1) + || !dbId.isValid()) { return false; } @@ -358,6 +403,10 @@ public class ParmID implements Comparable<ParmID>, Serializable, */ public String getCompositeName() { + if (compositeName == null) { + encodeIdentifier(); + } + return compositeName; } @@ -369,6 +418,7 @@ public class ParmID implements Comparable<ParmID>, Serializable, if (shortParmId == null) { encodeIdentifier(); } + return shortParmId; } @@ -377,6 +427,10 @@ public class ParmID implements Comparable<ParmID>, Serializable, */ public String getParmId() { + if (parmId == null) { + encodeIdentifier(); + } + return parmId; } @@ -387,7 +441,7 @@ public class ParmID implements Comparable<ParmID>, Serializable, */ @Override public int hashCode() { - return parmId.hashCode(); + return getParmId().hashCode(); } /* @@ -463,8 +517,8 @@ public class ParmID implements Comparable<ParmID>, Serializable, * @param parmID * @return */ - public static String shortSerializer(ParmID parmID) { - return parmID.toString(); + public static String shortSerializer(ParmID localParmID) { + return localParmID.toString(); } /** diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/exception/UnknownParmIdException.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/exception/UnknownParmIdException.java new file mode 100644 index 0000000000..5482d81871 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/exception/UnknownParmIdException.java @@ -0,0 +1,95 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ + +package com.raytheon.uf.common.dataplugin.gfe.exception; + +/** + * GFE Exception for requesting a parm that isn't known to the system. + * + * <pre> + * SOFTWARE HISTORY + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Apr 08, 2013 1949 rjpeter Initial Creation + * </pre> + * + * @author rjpeter + * @version 1.0 + */ +public class UnknownParmIdException extends GfeException { + + private static final long serialVersionUID = 1L; + + /** + * Constructs a new runtime exception with <code>null</code> as its detail + * message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public UnknownParmIdException() { + super(); + } + + /** + * Constructs a new exception with the specified detail message. The cause + * is not initialized, and may subsequently be initialized by a call to + * {@link #initCause}. + * + * @param message + * the detail message. The detail message is saved for later + * retrieval by the {@link #getMessage()} method. + */ + public UnknownParmIdException(String aCause) { + super(aCause); + } + + /** + * Parser exception set with a cause and an existing exception. Used for + * exception chaining to preserve state. + * + * @param aCause + * the detail message (which is saved for later retrieval by the + * {@link #getMessage()} method). + * @param anException + * the cause (which is saved for later retrieval by the + * {@link #getCause()} method). (A <tt>null</tt> value is + * permitted, and indicates that the cause is nonexistent or + * unknown.) + */ + public UnknownParmIdException(String aCause, Throwable anException) { + super(aCause, anException); + } + + /** + * Constructs a new exception with the specified cause and a detail message + * of <tt>(cause==null ? null : cause.toString())</tt> (which typically + * contains the class and detail message of <tt>cause</tt>). This + * constructor is useful for exceptions that are little more than wrappers + * for other throwables. + * + * @param cause + * the cause (which is saved for later retrieval by the + * {@link #getCause()} method). (A <tt>null</tt> value is + * permitted, and indicates that the cause is nonexistent or + * unknown.) + */ + public UnknownParmIdException(Throwable anException) { + super(anException); + } +} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/GetLatestDbTimeRequest.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/GetLatestDbTimeRequest.java deleted file mode 100644 index 19681f83a8..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/GetLatestDbTimeRequest.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.common.dataplugin.gfe.request; - -import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; - -/** - * Request object for getting the latest insert time for a given database ID - * - * <pre> - * - * SOFTWARE HISTORY - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 8/16/2010 6349 bphillip Initial creation - * - * </pre> - * - * @author bphillip - * @version 1.0 - */ -public class GetLatestDbTimeRequest extends AbstractGfeRequest { - - /** The database ID to get the latest insert time for */ - private DatabaseID dbId; - - /** - * Creates a new GetLatestDbTimeRequest - * - * @param dbId - * The database ID to get the latest insert time for - */ - public GetLatestDbTimeRequest(DatabaseID dbId) { - this.dbId = dbId; - } - - /** - * Creates a new GetLatestDbTimeRequest - * - * @param dbId - * The database ID to get the latest insert time for - */ - public GetLatestDbTimeRequest(String dbId) { - this.dbId = new DatabaseID(dbId); - } - - /** - * @return the dbId - */ - public DatabaseID getDbId() { - return dbId; - } - - /** - * @param dbId - * the dbId to set - */ - public void setDbId(DatabaseID dbId) { - this.dbId = dbId; - } - -} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/GetLatestModelDbIdRequest.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/GetLatestModelDbIdRequest.java deleted file mode 100644 index b3b40a8ed4..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/GetLatestModelDbIdRequest.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.common.dataplugin.gfe.request; - -/** - * Request object for getting the latest database ID for a given model name and - * site ID. - * - * <pre> - * - * SOFTWARE HISTORY - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Aug 17, 2010 dgilling Initial creation - * - * </pre> - * - * @author dgilling - * @version 1.0 - */ - -public class GetLatestModelDbIdRequest extends AbstractGfeRequest { - - /** - * The site identifier to perform the request for. - */ - private String siteId; - - /** - * The model name to perform the request for. - */ - private String modelName; - - /** - * Creates a new GetLatestModelDbIdRequest object given a model name and - * site identifier. - * - * @param siteId - * The site identifier to search for. - * @param modelName - * The name of the model to search for. - */ - public GetLatestModelDbIdRequest(String siteId, String modelName) { - this.siteId = siteId; - this.modelName = modelName; - } - - /** - * @return the siteId - */ - public String getSiteId() { - return siteId; - } - - /** - * @param siteId - * the siteId to set - */ - public void setSiteId(String siteId) { - this.siteId = siteId; - } - - /** - * @return the modelName - */ - public String getModelName() { - return modelName; - } - - /** - * @param modelName - * the modelName to set - */ - public void setModelName(String modelName) { - this.modelName = modelName; - } - -} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/serialize/LockTableAdapter.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/serialize/LockTableAdapter.java new file mode 100644 index 0000000000..36be7f1299 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/serialize/LockTableAdapter.java @@ -0,0 +1,125 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.common.dataplugin.gfe.serialize; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; +import com.raytheon.uf.common.dataplugin.gfe.server.lock.Lock; +import com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable; +import com.raytheon.uf.common.message.WsId; +import com.raytheon.uf.common.serialization.IDeserializationContext; +import com.raytheon.uf.common.serialization.ISerializationContext; +import com.raytheon.uf.common.serialization.ISerializationTypeAdapter; +import com.raytheon.uf.common.serialization.SerializationException; + +/** + * SerializeAdapter for LockTable. Strips out parmId and common WsIds to reduce + * serialization size and reflection calls. + * + * <pre> + * SOFTWARE HISTORY + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Apr 02, 2013 1949 rjpeter Initial creation + * </pre> + * + * @author rjpeter + * @version 1.0 + */ + +public class LockTableAdapter implements ISerializationTypeAdapter<LockTable> { + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.serialization.ISerializationTypeAdapter#serialize + * (com.raytheon.uf.common.serialization.ISerializationContext, + * java.lang.Object) + */ + @Override + public void serialize(ISerializationContext serializer, LockTable lockTable) + throws SerializationException { + + // get all the unique WsIds + int index = 0; + // use linked hash so wsIds stay in order + LinkedHashMap<WsId, Integer> wsIds = new LinkedHashMap<WsId, Integer>(); + wsIds.put(lockTable.getWsId(), index++); + List<Lock> locks = lockTable.getLocks(); + WsId curWsId = null; + for (Lock lock : locks) { + curWsId = lock.getWsId(); + if (!wsIds.containsKey(curWsId)) { + wsIds.put(curWsId, index++); + } + } + + // write the parm + serializer.writeObject(lockTable.getParmId()); + + // write the unique wsIds + serializer.writeI32(index); + for (WsId id : wsIds.keySet()) { + serializer.writeObject(id); + } + + serializer.writeI32(locks.size()); + for (Lock lock : locks) { + serializer.writeI64(lock.getStartTime()); + serializer.writeI64(lock.getEndTime()); + serializer.writeI32(wsIds.get(lock.getWsId())); + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.serialization.ISerializationTypeAdapter#deserialize + * (com.raytheon.uf.common.serialization.IDeserializationContext) + */ + @Override + public LockTable deserialize(IDeserializationContext deserializer) + throws SerializationException { + ParmID parmId = (ParmID) deserializer.readObject(); + int numWsIds = deserializer.readI32(); + WsId[] ids = new WsId[numWsIds]; + for (int i = 0; i < numWsIds; i++) { + ids[i] = (WsId) deserializer.readObject(); + } + int numLocks = deserializer.readI32(); + List<Lock> locks = new ArrayList<Lock>(numLocks); + long startDate = 0; + long endDate = 0; + int wsIdIndex = 0; + for (int i = 0; i < numLocks; i++) { + startDate = deserializer.readI64(); + endDate = deserializer.readI64(); + wsIdIndex = deserializer.readI32(); + locks.add(new Lock(parmId, ids[wsIdIndex], startDate, endDate)); + } + + return new LockTable(parmId, locks, ids[0]); + } +} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/Lock.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/Lock.java index 67e4ad268a..cc1e4c9bfe 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/Lock.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/Lock.java @@ -20,31 +20,30 @@ package com.raytheon.uf.common.dataplugin.gfe.server.lock; +import java.util.Date; + import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.Index; import org.hibernate.annotations.Type; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; -import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; import com.raytheon.uf.common.message.WsId; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.time.TimeRange; /** - * Represents a lock on a record + * Represents a lock on a record. Class is Immutable and is only serializable as + * part of a LockTable. * * <pre> * SOFTWARE HISTORY @@ -52,57 +51,56 @@ import com.raytheon.uf.common.time.TimeRange; * ------------ ---------- ----------- -------------------------- * 04/08/08 #875 bphillip Initial Creation * 06/17/08 #940 bphillip Implemented GFE Locking - * + * 03/28/13 1949 rjpeter Normalized database structure, made immutable. * </pre> * * @author bphillip * @version 1.0 */ @Entity -@Table(name = "gfelocktable") -@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class Lock extends PersistableDataObject implements Cloneable, - ISerializableObject { +@Table(name = "gfe_locks", uniqueConstraints = { @UniqueConstraint(columnNames = { + "parmId_id", "startTime", "endTime" }) }) +public class Lock { private static final long serialVersionUID = -7839912817664285509L; - /** The key for the database */ + /** + * Auto-generated surrogate key + */ @Id - @GeneratedValue - private int key; + @SequenceGenerator(name = "GFE_DBID_GENERATOR", sequenceName = "gfe_lock_seq") + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GFE_DBID_GENERATOR") + private int id; - /** The parmID of the lock */ - @Column - @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.ParmIdType") - @XmlElement - @Index(name = "lock_parmId_idx") - @DynamicSerializeElement + /** + * The parmID of the lock. + */ + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @PrimaryKeyJoinColumn private ParmID parmId; /** The workstationID of the lock holder */ - @Column + @Column(nullable = false) @Type(type = "com.raytheon.uf.common.dataplugin.gfe.db.type.WsIdType") - @XmlElement - @DynamicSerializeElement private WsId wsId; - /** The start time of the lock */ - @Column - @XmlAttribute - @DynamicSerializeElement - private long startTime; - - /** The end time of the lock */ - @Column - @XmlAttribute - @DynamicSerializeElement - private long endTime; + /** + * Used as the hibernate field so that Database has a human readable field. + */ + @Column(name = "startTime", nullable = false) + private Date startDate; /** - * Creates a new Lock. Use of this constructor is discouraged. It is used by - * JiBX + * Used as the hibernate field so that Database has a human readable field. + */ + @Column(name = "endTime", nullable = false) + private Date endDate; + + @Transient + private transient TimeRange tr; + + /** + * Creates a new Lock. Use of this constructor is discouraged. */ public Lock() { @@ -111,72 +109,74 @@ public class Lock extends PersistableDataObject implements Cloneable, /** * Creates a new Lock * + * @param parmId + * The parmID of the lock. * @param timeRange * The time range over which the lock applies * @param wsId * The workstation ID of the lock owner */ - public Lock(TimeRange timeRange, WsId wsId) { - this.startTime = timeRange.getStart().getTime(); - this.endTime = timeRange.getEnd().getTime(); + public Lock(ParmID parmId, TimeRange timeRange, WsId wsId) { + this.parmId = parmId; + this.startDate = new Date(timeRange.getStart().getTime()); + this.endDate = new Date(timeRange.getEnd().getTime()); this.wsId = wsId; } + /** + * Creates a new Lock + * + * @param parmId + * The parmID of the lock. + * @param timeRange + * The time range over which the lock applies + * @param wsId + * The workstation ID of the lock owner + */ + public Lock(ParmID parmId, WsId wsId, long startTime, long endTime) { + this.parmId = parmId; + this.wsId = wsId; + this.startDate = new Date(startTime); + this.endDate = new Date(endTime); + } + public WsId getWsId() { return wsId; } - public void setWsId(WsId wsId) { - this.wsId = wsId; - } - public TimeRange getTimeRange() { - return new TimeRange(startTime, endTime); - } + if (tr == null) { + tr = new TimeRange(startDate, endDate); + } - public void setTimeRange(TimeRange timeRange) { - this.startTime = timeRange.getStart().getTime(); - this.endTime = timeRange.getEnd().getTime(); + return tr; } public ParmID getParmId() { return parmId; } - public void setParmId(ParmID parmId) { - this.parmId = parmId; - } - - public int getKey() { - return key; - } - - public void setKey(int key) { - this.key = key; + public int getId() { + return id; } public long getStartTime() { - return startTime; - } - - public void setStartTime(long startTime) { - this.startTime = startTime; + return startDate.getTime(); } public long getEndTime() { - return endTime; + return endDate.getTime(); } - public void setEndTime(long endTime) { - this.endTime = endTime; + public Date getStartDate() { + return startDate; + } + + public Date getEndDate() { + return endDate; } @Override - public Lock clone() { - Lock newLock = new Lock(this.getTimeRange(), wsId); - return newLock; - } - public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("TR: "); @@ -185,5 +185,4 @@ public class Lock extends PersistableDataObject implements Cloneable, buffer.append(this.wsId.toPrettyString()); return buffer.toString(); } - } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/LockTable.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/LockTable.java index cafca035aa..ff4496f213 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/LockTable.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/lock/LockTable.java @@ -24,15 +24,12 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; - import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; +import com.raytheon.uf.common.dataplugin.gfe.serialize.LockTableAdapter; import com.raytheon.uf.common.message.WsId; import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter; import com.raytheon.uf.common.time.TimeRange; /** @@ -44,15 +41,15 @@ import com.raytheon.uf.common.time.TimeRange; * ------------ ---------- ----------- -------------------------- * 04/08/08 #875 bphillip Initial Creation * 06/17/08 #940 bphillip Implemented GFE Locking - * + * 04/23/13 #1949 rjpeter Added serialization adapter * </pre> * * @author bphillip * @version 1.0 */ -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize +@DynamicSerializeTypeAdapter(factory = LockTableAdapter.class) public class LockTable implements Cloneable, ISerializableObject { /** Enumeration denoting status of the lock */ @@ -66,18 +63,12 @@ public class LockTable implements Cloneable, ISerializableObject { }; /** List of locks contained in this lock table */ - @XmlElement - @DynamicSerializeElement private List<Lock> locks; /** The workstation ID of the owner of this lock table */ - @XmlElement - @DynamicSerializeElement private WsId wsId; /** The parm ID for which this lock table holds lock information for */ - @XmlElement - @DynamicSerializeElement private ParmID parmId; /** @@ -215,35 +206,20 @@ public class LockTable implements Cloneable, ISerializableObject { * @return The lock status of the specified time range */ public LockStatus checkLock(TimeRange timeRange, WsId requestorId) { - - for (int i = 0; i < locks.size(); i++) { - if (timeRange.overlaps(locks.get(i).getTimeRange())) { - - if (!requestorId.equals(locks.get(i).getWsId())) { + for (Lock lock : locks) { + TimeRange tr = lock.getTimeRange(); + if (timeRange.overlaps(tr)) { + if (!requestorId.equals(lock.getWsId())) { return LockStatus.LOCKED_BY_OTHER; - } else if (locks.get(i).getTimeRange() - .contains(timeRange.getStart()) - && (locks.get(i).getTimeRange().getEnd() - .after(timeRange.getEnd()) || locks.get(i) - .getTimeRange().getEnd() - .equals(timeRange.getEnd()))) { + } else if (tr.contains(timeRange.getStart()) + && (tr.getEnd().after(timeRange.getEnd()) || tr + .getEnd().equals(timeRange.getEnd()))) { return LockStatus.LOCKED_BY_ME; } } } - return LockStatus.LOCKABLE; - } - public void removeLock(Lock lockToRemove) { - int removeIndex = -1; - for (Lock lock : locks) { - if (lock.getKey() == lockToRemove.getKey()) { - removeIndex = locks.indexOf(lock); - } - } - if (removeIndex != -1) { - locks.remove(removeIndex); - } + return LockStatus.LOCKABLE; } public void removeLocks(Collection<Lock> locksToRemove) { @@ -294,13 +270,9 @@ public class LockTable implements Cloneable, ISerializableObject { @Override public LockTable clone() { - LockTable newTable = new LockTable(); - newTable.setWsId(this.wsId); - newTable.setParmId(this.parmId); - for (Lock lock : locks) { - newTable.addLock(lock.clone()); - } - return newTable; + // locks are immutable so this is safe + List<Lock> lockList = new ArrayList<Lock>(locks); + return new LockTable(this.parmId, lockList, this.wsId); } public static LockMode getLockMode(String modeName) { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/message/ServerResponse.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/message/ServerResponse.java index 3522f70a76..9e3834a687 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/message/ServerResponse.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/message/ServerResponse.java @@ -27,6 +27,7 @@ import com.raytheon.uf.common.dataplugin.gfe.server.notify.GfeNotification; import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import com.raytheon.uf.common.util.CollectionUtil; /** * Encapsulates messages sent from the server to the client. @@ -36,7 +37,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 06/24/08 #875 bphillip Initial Creation - * + * 04/24/13 #1949 rjpeter Create lists on demand * </pre> * * @author bphillip @@ -47,14 +48,14 @@ public class ServerResponse<T> implements ISerializableObject { /** Messages indicating an error */ @DynamicSerializeElement - private ArrayList<ServerMsg> messages = new ArrayList<ServerMsg>(); + private List<ServerMsg> messages = null; /** List of return objects from uEngine tasks */ @DynamicSerializeElement private T payload; @DynamicSerializeElement - private List<GfeNotification> notifications = new ArrayList<GfeNotification>(); + private List<GfeNotification> notifications = null; /** * Constructs and empty ServerResponse @@ -64,10 +65,14 @@ public class ServerResponse<T> implements ISerializableObject { } public boolean isOkay() { - return messages.isEmpty(); + return (messages == null) || messages.isEmpty(); } public void addMessage(String message) { + if (messages == null) { + messages = new ArrayList<ServerMsg>(); + } + messages.add(new ServerMsg(message)); } @@ -78,11 +83,21 @@ public class ServerResponse<T> implements ISerializableObject { * The ServerResponse to add */ public void addMessages(ServerResponse<?> ssr) { - for (ServerMsg message : ssr.getMessages()) { - messages.add(message); + List<ServerMsg> ssrMsgs = ssr.getMessages(); + if (!CollectionUtil.isNullOrEmpty(ssrMsgs)) { + if (messages == null) { + messages = new ArrayList<ServerMsg>(ssrMsgs.size()); + } + messages.addAll(ssrMsgs); } - for (GfeNotification notify : ssr.getNotifications()) { - notifications.add(notify); + + List<GfeNotification> ssrNotifs = ssr.getNotifications(); + if (!CollectionUtil.isNullOrEmpty(ssrNotifs)) { + if (notifications == null) { + notifications = new ArrayList<GfeNotification>(ssrNotifs.size()); + } + + notifications.addAll(ssrNotifs); } } @@ -91,7 +106,11 @@ public class ServerResponse<T> implements ISerializableObject { * * @return The messages */ - public ArrayList<ServerMsg> getMessages() { + public List<ServerMsg> getMessages() { + if (messages == null) { + messages = new ArrayList<ServerMsg>(0); + } + return messages; } @@ -100,7 +119,7 @@ public class ServerResponse<T> implements ISerializableObject { * * @param messages */ - public void setMessages(ArrayList<ServerMsg> messages) { + public void setMessages(List<ServerMsg> messages) { this.messages = messages; } @@ -112,7 +131,7 @@ public class ServerResponse<T> implements ISerializableObject { public String message() { if (!isOkay()) { StringBuffer buf = new StringBuffer(); - for (ServerMsg message : messages) { + for (ServerMsg message : getMessages()) { buf.append(message); buf.append("\n"); } @@ -122,6 +141,7 @@ public class ServerResponse<T> implements ISerializableObject { } } + @Override public String toString() { return message(); } @@ -135,6 +155,10 @@ public class ServerResponse<T> implements ISerializableObject { } public List<GfeNotification> getNotifications() { + if (notifications == null) { + notifications = new ArrayList<GfeNotification>(0); + } + return notifications; } @@ -143,6 +167,10 @@ public class ServerResponse<T> implements ISerializableObject { } public void addNotifications(GfeNotification notify) { - this.notifications.add(notify); + if (notifications == null) { + notifications = new ArrayList<GfeNotification>(); + } + + notifications.add(notify); } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java index b4bd20f012..ab0d0a36e8 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java @@ -54,6 +54,7 @@ import com.raytheon.uf.common.time.TimeRange; * 01/30/2008 chammack Stubbed-out class based on AWIPS I * 02/22/2008 879 rbell Legacy conversion, extended ScalarSlice * 06/10/2009 2159 rjpeter Updated checkDims to check dirGrid for null + * 04/23/2013 1949 rjpeter Updated wind checks to keep float precision. * </pre> * * @author chammack @@ -66,6 +67,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(VectorGridSlice.class); + private static final float DEG_IN_CIRCLE = 360.0f; + @DynamicSerializeElement protected Grid2DFloat dirGrid; @@ -170,7 +173,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, * @return dirGrid */ public Grid2DFloat getDirGrid() { - if (useCache && dirCacheId != null) { + if (useCache && (dirCacheId != null)) { try { @SuppressWarnings("unchecked") ICache<IGrid2D> diskCache = CacheFactory.getInstance() @@ -232,8 +235,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DFloat rhsDirGrid = ((VectorGridSlice) rhs).getDirGrid(); if (rhsDirGrid != null) { - if (thisDirGrid.getXdim() != rhsDirGrid.getXdim() - || thisDirGrid.getYdim() != rhsDirGrid.getYdim()) { + if ((thisDirGrid.getXdim() != rhsDirGrid.getXdim()) + || (thisDirGrid.getYdim() != rhsDirGrid.getYdim())) { throw new IllegalArgumentException( "Supplied grid is not of same dimension"); } @@ -276,7 +279,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } Grid2DFloat dGrid = getDirGrid(); - if (dGrid == null || !dGrid.isValid()) { + if ((dGrid == null) || !dGrid.isValid()) { return "Direction grid is invalid"; } @@ -357,15 +360,13 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, + v.get(i, j) * v.get(i, j))); float dir = (float) Math.toDegrees(Math.atan2(u.get(i, j), v.get(i, j))); - if (dir < 0) { - dir += 360.0; + while (dir < 0.0f) { + dir += DEG_IN_CIRCLE; } - if (dir >= 360.0) { - dir -= 360.0; - } - if (dir == 360.0) { - dir = 360.0f; + while (dir >= DEG_IN_CIRCLE) { + dir -= DEG_IN_CIRCLE; } + dirGrid.set(i, j, dir); } } @@ -404,15 +405,13 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, + v.get(i, j) * v.get(i, j))); float dir = (float) Math.toDegrees(Math.atan2(u.get(i, j), v.get(i, j))); - if (dir < 0) { - dir += 360.0; + while (dir < 0.0f) { + dir += DEG_IN_CIRCLE; } - if (dir >= 360.0) { - dir -= 360.0; - } - if (dir == 360.0) { - dir = 360.0f; + while (dir >= DEG_IN_CIRCLE) { + dir -= DEG_IN_CIRCLE; } + dirGrid.set(i, j, dir); } } @@ -475,8 +474,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DFloat mGrid = getMagGrid(); Grid2DFloat dGrid = getDirGrid(); - if (mGrid.getXdim() != dGrid.getXdim() - || mGrid.getYdim() != dGrid.getYdim()) { + if ((mGrid.getXdim() != dGrid.getXdim()) + || (mGrid.getYdim() != dGrid.getYdim())) { return "Magnitude and Direction grids have different dimensions"; } @@ -497,13 +496,10 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, for (int i = 0; i < size; i++) { float thisDir = dir.get(i); while (thisDir < 0.0f) { - thisDir += 360.0f; + thisDir += DEG_IN_CIRCLE; } - while (thisDir > 360.0f) { - thisDir -= 360.0f; - } - if (thisDir == 360.0f) { - thisDir = 0.0f; + while (thisDir >= DEG_IN_CIRCLE) { + thisDir -= DEG_IN_CIRCLE; } dir.put(i, thisDir); } @@ -518,15 +514,15 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, public ScalarGridSlice verticalMotion(VectorGridSlice gs, Grid2DBit editArea) { Grid2DFloat mGrid = getMagGrid(); - if (mGrid.getXdim() != editArea.getXdim() - || mGrid.getYdim() != editArea.getYdim()) { + if ((mGrid.getXdim() != editArea.getXdim()) + || (mGrid.getYdim() != editArea.getYdim())) { throw new IllegalArgumentException( "This and editArea grids have different dimensions"); } Grid2DFloat gsmGrid = gs.getMagGrid(); - if (mGrid.getXdim() != gsmGrid.getXdim() - || mGrid.getYdim() != gsmGrid.getYdim()) { + if ((mGrid.getXdim() != gsmGrid.getXdim()) + || (mGrid.getYdim() != gsmGrid.getYdim())) { throw new IllegalArgumentException( "This and supplied grids have different dimensions"); } @@ -766,8 +762,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DFloat thisMagGrid = getMagGrid(); Grid2DFloat rhsMagGrid = rhs.getMagGrid(); - if (thisMagGrid.getXdim() != rhsMagGrid.getXdim() - || thisMagGrid.getYdim() != rhsMagGrid.getYdim()) { + if ((thisMagGrid.getXdim() != rhsMagGrid.getXdim()) + || (thisMagGrid.getYdim() != rhsMagGrid.getYdim())) { throw new IllegalArgumentException( "This and supplied GridSlice are different dimensions"); } @@ -815,8 +811,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DFloat thisMagGrid = getMagGrid(); Grid2DFloat rhsMagGrid = rhs.getMagGrid(); - if (thisMagGrid.getXdim() != rhsMagGrid.getXdim() - || thisMagGrid.getYdim() != rhsMagGrid.getYdim()) { + if ((thisMagGrid.getXdim() != rhsMagGrid.getXdim()) + || (thisMagGrid.getYdim() != rhsMagGrid.getYdim())) { throw new IllegalArgumentException( "This and supplied GridSlice are different dimensions"); } @@ -864,7 +860,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DBit magBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); Grid2DBit dirBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); - if (mag != 0 || (dir == 0 && mag == 0)) { // Test Magnitude + if ((mag != 0) || ((dir == 0) && (mag == 0))) { // Test Magnitude for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { if (mGrid.get(i, j) == mag) { @@ -888,8 +884,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, if (cross360) { for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { - if (dGrid.get(i, j) >= lower - || dGrid.get(i, j) <= upper) { + if ((dGrid.get(i, j) >= lower) + || (dGrid.get(i, j) <= upper)) { dirBits.set(i, j); } } @@ -897,15 +893,15 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } else { for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { - if (dGrid.get(i, j) >= lower - && dGrid.get(i, j) <= upper) { + if ((dGrid.get(i, j) >= lower) + && (dGrid.get(i, j) <= upper)) { dirBits.set(i, j); } } } } } - if (mag != 0 && dir != 0) { + if ((mag != 0) && (dir != 0)) { // "AND" magnitude and direction bits = magBits.and(dirBits); } else if (dir != 0) { @@ -935,7 +931,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DBit magBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); Grid2DBit dirBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); - if (mag != 0 || (dir == 0 && mag == 0)) { // Test Magnitude + if ((mag != 0) || ((dir == 0) && (mag == 0))) { // Test Magnitude for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { if (mGrid.get(i, j) > mag) { @@ -953,7 +949,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } } } - if (mag != 0 && dir != 0) { + if ((mag != 0) && (dir != 0)) { // "AND" magnitude and direction bits = magBits.and(dirBits); } else if (dir != 0) { @@ -977,7 +973,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DBit magBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); Grid2DBit dirBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); - if (mag != 0 || (dir == 0 && mag == 0)) { // Test Magnitude + if ((mag != 0) || ((dir == 0) && (mag == 0))) { // Test Magnitude for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { if (mGrid.get(i, j) >= mag) { @@ -995,7 +991,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } } } - if (mag != 0 && dir != 0) { + if ((mag != 0) && (dir != 0)) { // "AND" magnitude and direction bits = magBits.and(dirBits); } else if (dir != 0) { @@ -1019,7 +1015,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DBit magBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); Grid2DBit dirBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); - if (mag != 0 || (dir == 0 && mag == 0)) { // Test Magnitude + if ((mag != 0) || ((dir == 0) && (mag == 0))) { // Test Magnitude for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { if (mGrid.get(i, j) < mag) { @@ -1037,7 +1033,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } } } - if (mag != 0 && dir != 0) { + if ((mag != 0) && (dir != 0)) { // "AND" magnitude and direction bits = magBits.and(dirBits); } else if (dir != 0) { @@ -1061,7 +1057,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DBit magBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); Grid2DBit dirBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); - if (mag != 0 || (dir == 0 && mag == 0)) { // Test Magnitude + if ((mag != 0) || ((dir == 0) && (mag == 0))) { // Test Magnitude for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { if (mGrid.get(i, j) <= mag) { @@ -1079,7 +1075,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } } } - if (mag != 0 && dir != 0) { + if ((mag != 0) && (dir != 0)) { // "AND" magnitude and direction bits = magBits.and(dirBits); } else if (dir != 0) { @@ -1124,7 +1120,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, Grid2DBit magBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); Grid2DBit dirBits = new Grid2DBit(mGrid.getXdim(), mGrid.getYdim()); - if (mag != 0 || (dir == 0 && mag == 0)) { // Test Magnitude + if ((mag != 0) || ((dir == 0) && (mag == 0))) { // Test Magnitude for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { if (Math.abs(mGrid.get(i, j) - mag) <= fuzz) { @@ -1148,8 +1144,8 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, if (cross360) { for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { - if (dGrid.get(i, j) >= lower - || dGrid.get(i, j) <= upper) { + if ((dGrid.get(i, j) >= lower) + || (dGrid.get(i, j) <= upper)) { dirBits.set(i, j); } } @@ -1157,15 +1153,15 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } else { for (int i = 0; i < mGrid.getXdim(); i++) { for (int j = 0; j < mGrid.getYdim(); j++) { - if (dGrid.get(i, j) >= lower - && dGrid.get(i, j) <= upper) { + if ((dGrid.get(i, j) >= lower) + && (dGrid.get(i, j) <= upper)) { dirBits.set(i, j); } } } } } - if (mag != 0 && dir != 0) { + if ((mag != 0) && (dir != 0)) { // "AND" magnitude and direction bits = magBits.and(dirBits); } else if (dir != 0) { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.npp.sounding/src/com/raytheon/uf/common/dataplugin/npp/sounding/NPPSoundingRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.npp.sounding/src/com/raytheon/uf/common/dataplugin/npp/sounding/NPPSoundingRecord.java index 5c72292193..1d10a44087 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.npp.sounding/src/com/raytheon/uf/common/dataplugin/npp/sounding/NPPSoundingRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.npp.sounding/src/com/raytheon/uf/common/dataplugin/npp/sounding/NPPSoundingRecord.java @@ -21,12 +21,16 @@ package com.raytheon.uf.common.dataplugin.npp.sounding; import javax.persistence.Column; import javax.persistence.Embedded; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.MappedSuperclass; +import javax.persistence.SequenceGenerator; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import com.raytheon.uf.common.dataplugin.IDecoderGettable; +import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; import com.raytheon.uf.common.pointdata.IPointData; @@ -45,6 +49,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * ------------ ---------- ----------- -------------------------- * Jan 3, 2013 mschenke Initial creation * Apr 12, 2013 1857 bgonzale Changed to MappedSuperclass. + * Mar 02, 2013 1970 bgonzale Added SequenceGenerator and Inheritance Strategy + * annotations. * * </pre> * @@ -52,6 +58,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * @version 1.0 */ @MappedSuperclass +@SequenceGenerator(name = PluginDataObject.ID_GEN) +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @DynamicSerialize @XmlAccessorType(XmlAccessType.NONE) public abstract class NPPSoundingRecord extends PersistablePluginDataObject diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/PluginDataObject.java b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/PluginDataObject.java index c13551dfcc..439ff831a6 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/PluginDataObject.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/PluginDataObject.java @@ -79,6 +79,7 @@ import com.raytheon.uf.common.util.ConvertUtil; * Mar 29, 2013 1638 mschenke Added methods for loading from data map and creating data map from * dataURI fields * Apr 15, 2013 1868 bsteffen Improved performance of createDataURIMap + * Mar 02, 2013 1970 bgonzale Moved Index annotation from getters to attributes. * </pre> * */ @@ -117,6 +118,7 @@ public abstract class PluginDataObject extends PersistableDataObject implements /** The timestamp denoting when this record was inserted into the database */ @Column(columnDefinition = "timestamp without time zone") + @Index(name = "%TABLE%_insertTimeIndex") @XmlAttribute @DynamicSerializeElement protected Calendar insertTime; @@ -314,9 +316,9 @@ public abstract class PluginDataObject extends PersistableDataObject implements Field currentField = null; String currentUriToken = null; - for (int i = 0; i < dataURIFields.length; i++) { + for (Field dataURIField : dataURIFields) { currentUriToken = uriTokens[uriIndex]; - currentField = dataURIFields[i]; + currentField = dataURIField; if (currentField.getAnnotation(DataURI.class).embedded()) { // The current dataURI token refers to a field in an embedded @@ -484,7 +486,6 @@ public abstract class PluginDataObject extends PersistableDataObject implements return dataTime; } - @Index(name = "dataURI_idx") public String getDataURI() { return this.dataURI; } @@ -493,7 +494,6 @@ public abstract class PluginDataObject extends PersistableDataObject implements return SerializationUtil.marshalToXml(this); } - @Index(name = "insertTimeIndex") public Calendar getInsertTime() { return insertTime; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java index d79b77a372..83f9c9d47a 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java @@ -56,6 +56,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * ------------ ---------- ----------- -------------------------- * 1/08/09 1674 bphillip Initial creation * 04/08/13 1293 bkowal Removed references to hdffileid. + * 04/30/13 1861 bkowal Added constant for hdf5 file suffix. * </pre> * * @author bphillip @@ -64,6 +65,8 @@ import com.raytheon.uf.common.time.util.TimeUtil; public class DefaultPathProvider implements IHDFFilePathProvider { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(DefaultPathProvider.class); + + public static final String HDF5_SUFFIX = ".h5"; public static final ThreadLocal<SimpleDateFormat> fileNameFormat = new ThreadLocal<SimpleDateFormat>() { @Override diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistablePluginDataObject.java b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistablePluginDataObject.java index e900aa46b0..b1b7ad8c8f 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistablePluginDataObject.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistablePluginDataObject.java @@ -23,7 +23,10 @@ import java.util.Calendar; import java.util.Date; import java.util.TimeZone; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.MappedSuperclass; +import javax.persistence.SequenceGenerator; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -42,6 +45,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Dec 16, 2008 chammack Initial creation * Apr 8, 2013 1293 bkowal Removed references to hdffileid. * Apr 12, 2013 1857 bgonzale Changed to MappedSuperclass. + * Mar 02, 2013 1970 bgonzale Added SequenceGenerator and Inheritance Strategy + * annotations. * * </pre> * @@ -49,6 +54,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * @version 1.0 */ @MappedSuperclass +@SequenceGenerator(name = PluginDataObject.ID_GEN) +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public abstract class PersistablePluginDataObject extends PluginDataObject diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java index 07311d42c3..3cbd7cfe4c 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPRunConfigurationManager.java @@ -52,6 +52,7 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2012-09-04 DR 14404 gzhang Fixing ConcurrentModificationException + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * </pre> * @@ -60,7 +61,8 @@ import com.raytheon.uf.common.serialization.SerializationUtil; public class FFMPRunConfigurationManager implements ILocalizationFileObserver { /** Path to FFMP Source config. */ - private static final String CONFIG_FILE_NAME = "ffmp" + File.separatorChar + private static final String CONFIG_FILE_NAME = "ffmp" + + IPathManager.SEPARATOR + "FFMPRunConfig.xml"; /** @@ -211,24 +213,14 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver { } public DomainXML getDomain(String domainname) { - DomainXML domain = null; - for (FFMPRunXML runner : getFFMPRunners()) { - if (runner.getPrimaryDomain().getCwa().equals(domainname)) { - domain = runner.getPrimaryDomain(); - break; - } else { - if (runner.getBackupDomains() != null) { - for (DomainXML backup : runner.getBackupDomains()) { - if (backup.getCwa().equals(domainname)) { - domain = backup; - break; - } - } + for (DomainXML domain : runner.getDomains()) { + if (domain.getCwa().equals(domainname)) { + return domain; } } } - return domain; + return null; } public FFMPRunXML getRunner(String domainName) { @@ -259,9 +251,11 @@ public class FFMPRunConfigurationManager implements ILocalizationFileObserver { } public ProductRunXML getProduct(String productKey) { - for (ProductRunXML product : getProducts()) { - if (product.getProductKey().equals(productKey)) { - return product; + for (FFMPRunXML runner : getFFMPRunners()) { + for (ProductRunXML product : runner.getProducts()) { + if (product.getProductKey().equals(productKey)) { + return product; + } } } diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java index 4fceac7b05..a42b2cf595 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/config/FFMPSourceConfigurationManager.java @@ -21,6 +21,8 @@ package com.raytheon.uf.common.monitor.config; import java.io.File; import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import com.raytheon.uf.common.localization.FileUpdatedMessage; import com.raytheon.uf.common.localization.ILocalizationFileObserver; @@ -47,6 +49,7 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2012-09-04 DR 14404 gzhang Fixing ConcurrentModificationException + * Apr 26, 2013 1954 bsteffen Minor code cleanup throughout FFMP. * * </pre> * @@ -56,8 +59,8 @@ public class FFMPSourceConfigurationManager implements ILocalizationFileObserver { /** Path to FFMP Source config. */ - private static final String CONFIG_FILE_NAME = "ffmp" + File.separatorChar - + "FFMPSourceConfig.xml"; + private static final String CONFIG_FILE_NAME = "ffmp" + + IPathManager.SEPARATOR + "FFMPSourceConfig.xml"; /** * FFMP Source Configuration XML object. @@ -67,20 +70,19 @@ public class FFMPSourceConfigurationManager implements /** Singleton instance of this class */ private static FFMPSourceConfigurationManager instance = new FFMPSourceConfigurationManager(); - private ArrayList<String> virtuals = null; + private List<String> virtuals = null; - private ArrayList<String> rates = null; + private List<String> rates = null; private ArrayList<String> guidances = null; private ArrayList<String> forecasts = null; - private ArrayList<String> accumulators = null; + private List<String> accumulators = null; private LocalizationFile lf = null; - private java.util.concurrent.CopyOnWriteArrayList<MonitorConfigListener> listeners = new java.util.concurrent.CopyOnWriteArrayList<MonitorConfigListener>();// DR 14404 - //private ArrayList<MonitorConfigListener> listeners = new ArrayList<MonitorConfigListener>();// DR 14404 + private List<MonitorConfigListener> listeners = new CopyOnWriteArrayList<MonitorConfigListener>(); /* Private Constructor */ private FFMPSourceConfigurationManager() { @@ -109,18 +111,17 @@ public class FFMPSourceConfigurationManager implements * Read the XML configuration data for the current XML file name. */ public synchronized void readConfigXml() { + IPathManager pm = PathManagerFactory.getPathManager(); try { - IPathManager pm = PathManagerFactory.getPathManager(); LocalizationContext lc = pm.getContext( LocalizationType.COMMON_STATIC, LocalizationLevel.SITE); lf = pm.getLocalizationFile(lc, CONFIG_FILE_NAME); lf.addFileUpdatedObserver(this); File file = lf.getFile(); - // System.out.println("Reading -- " + file.getAbsolutePath()); - FFMPSourceConfigXML configXmltmp = (FFMPSourceConfigXML) SerializationUtil - .jaxbUnmarshalFromXmlFile(file.getAbsolutePath()); + FFMPSourceConfigXML configXmltmp = SerializationUtil + .jaxbUnmarshalFromXmlFile(FFMPSourceConfigXML.class, file); configXml = configXmltmp; @@ -128,18 +129,17 @@ public class FFMPSourceConfigurationManager implements System.err.println("No SITE FFMP Source configuration file found"); // fall back to BASE - IPathManager pm = PathManagerFactory.getPathManager(); LocalizationContext lc = pm.getContext( LocalizationType.COMMON_STATIC, LocalizationLevel.BASE); lf = pm.getLocalizationFile(lc, CONFIG_FILE_NAME); lf.addFileUpdatedObserver(this); File file = lf.getFile(); - // System.out.println("Reading -- " + file.getAbsolutePath()); FFMPSourceConfigXML configXmltmp = null; try { configXmltmp = (FFMPSourceConfigXML) SerializationUtil - .jaxbUnmarshalFromXmlFile(file.getAbsolutePath()); + .jaxbUnmarshalFromXmlFile(FFMPSourceConfigXML.class, + file); } catch (SerializationException e1) { e1.printStackTrace(); } @@ -160,23 +160,18 @@ public class FFMPSourceConfigurationManager implements LocalizationLevel.SITE); LocalizationFile newXmlFile = pm.getLocalizationFile(lc, CONFIG_FILE_NAME); - - if (newXmlFile.getFile().getParentFile().exists() == false) { - // System.out.println("Creating new directory"); - - if (newXmlFile.getFile().getParentFile().mkdirs() == false) { - // System.out.println("Could not create new directory..."); - } + File file = newXmlFile.getFile(); + + if (file.getParentFile().exists() == false) { + file.getParentFile().mkdirs(); } - + try { - // System.out.println("Saving -- " - // + newXmlFile.getFile().getAbsolutePath()); - SerializationUtil.jaxbMarshalToXmlFile(configXml, newXmlFile - .getFile().getAbsolutePath()); + SerializationUtil.jaxbMarshalToXmlFile(configXml, + file.getAbsolutePath()); newXmlFile.save(); - lf = newXmlFile; + lf.addFileUpdatedObserver(this); } catch (Exception e) { e.printStackTrace(); } @@ -218,7 +213,7 @@ public class FFMPSourceConfigurationManager implements * @param name * @return */ - public ArrayList<String> getVirtuals() { + public List<String> getVirtuals() { if (virtuals == null) { virtuals = new ArrayList<String>(); } @@ -273,7 +268,7 @@ public class FFMPSourceConfigurationManager implements * * @return */ - public ArrayList<String> getQPESources() { + public List<String> getQPESources() { if (accumulators == null) { accumulators = new ArrayList<String>(); } @@ -290,7 +285,7 @@ public class FFMPSourceConfigurationManager implements * * @return */ - public ArrayList<String> getRates() { + public List<String> getRates() { if (rates == null) { rates = new ArrayList<String>(); } @@ -431,26 +426,11 @@ public class FFMPSourceConfigurationManager implements } public SOURCE_TYPE getSourceType(String sourceName) { - SOURCE_TYPE source = null; - if (getSource(sourceName) != null) { - if (getSource(sourceName).getSourceType().equals( - SOURCE_TYPE.RATE.getSourceType())) { - source = SOURCE_TYPE.RATE; - } else if (getSource(sourceName).getSourceType().equals( - SOURCE_TYPE.QPE.getSourceType())) { - source = SOURCE_TYPE.QPE; - } else if (getSource(sourceName).getSourceType().equals( - SOURCE_TYPE.QPF.getSourceType())) { - source = SOURCE_TYPE.QPF; - } else if (getSource(sourceName).getSourceType().equals( - SOURCE_TYPE.GUIDANCE.getSourceType())) { - source = SOURCE_TYPE.GUIDANCE; - } else if (getSource(sourceName).getSourceType().equals( - SOURCE_TYPE.GAGE.getSourceType())) { - source = SOURCE_TYPE.GAGE; - } + SourceXML sourceXml = getSource(sourceName); + if (sourceXml != null) { + return SOURCE_TYPE.valueOf(sourceXml.getSourceType()); } - return source; + return null; } /** diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/AbsConfigMgr.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/AbsConfigMgr.java index d6248b5eba..dca0972fde 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/AbsConfigMgr.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/AbsConfigMgr.java @@ -23,8 +23,12 @@ import java.awt.Point; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Map; import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; +import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.monitor.data.CommonTableConfig.SortDirection; import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanThresholdColor; @@ -42,6 +46,7 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 21, 2009 3039 lvenable Initial creation + * Apr 25, 2013 1926 njensen Improved initialization speed * * </pre> * @@ -52,12 +57,12 @@ public abstract class AbsConfigMgr { /** * Map of attribute names and SCANAttributesXML. */ - HashMap<String, SCANAttributesXML> attrMap; + protected Map<String, SCANAttributesXML> attrMap; /** * Map of attribute names and column index. */ - HashMap<String, Integer> indexMap; + protected Map<String, Integer> indexMap; /** * Default XML name. @@ -76,7 +81,6 @@ public abstract class AbsConfigMgr { indexMap = new HashMap<String, Integer>(); init(); - createAttributeMap(getAttributes()); } /** @@ -109,12 +113,16 @@ public abstract class AbsConfigMgr { SCANAbstractXML cfgXML = null; IPathManager pm = PathManagerFactory.getPathManager(); - String path = pm.getStaticFile(getFullDefaultConfigName()) - .getAbsolutePath(); - - cfgXML = (SCANAbstractXML) SerializationUtil - .jaxbUnmarshalFromXmlFile(path.toString()); - + LocalizationFile lfile = pm.getLocalizationFile(pm.getContext( + LocalizationType.CAVE_STATIC, LocalizationLevel.SITE), + getFullDefaultConfigName()); + if (lfile == null || !lfile.exists()) { + lfile = pm.getLocalizationFile(pm.getContext( + LocalizationType.CAVE_STATIC, LocalizationLevel.BASE), + getFullDefaultConfigName()); + } + cfgXML = SerializationUtil.jaxbUnmarshalFromXmlFile( + SCANAbstractXML.class, lfile.getFile()); return cfgXML; } catch (Exception e) { e.printStackTrace(); @@ -142,8 +150,8 @@ public abstract class AbsConfigMgr { IPathManager pm = PathManagerFactory.getPathManager(); String path = pm.getStaticFile(newConfigFile).getAbsolutePath(); - cfgXML = (SCANAbstractXML) SerializationUtil - .jaxbUnmarshalFromXmlFile(path.toString()); + cfgXML = SerializationUtil.jaxbUnmarshalFromXmlFile( + SCANAbstractXML.class, path.toString()); return cfgXML; } catch (Exception e) { diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/SCANConfig.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/SCANConfig.java index 8d223950f3..d149a7dc8a 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/SCANConfig.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/scan/config/SCANConfig.java @@ -50,6 +50,7 @@ import com.raytheon.uf.common.monitor.scan.xml.SCANAttributesXML; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 25, 2009 3039 lvenable Initial creation + * Apr 25, 2013 1926 njensen synchronized instance creation * * </pre> * @@ -60,7 +61,7 @@ public class SCANConfig { /** * Class instance */ - private static SCANConfig classInstance; + private static volatile SCANConfig classInstance; /** * Unwarned configuration data class. @@ -242,11 +243,18 @@ public class SCANConfig { * @return Class instance. */ public static SCANConfig getInstance() { - if (classInstance == null) { - classInstance = new SCANConfig(); + SCANConfig retVal = classInstance; + if (retVal == null) { + synchronized (SCANConfig.class) { + retVal = classInstance; + if (retVal == null) { + classInstance = new SCANConfig(); + retVal = classInstance; + } + } } - return classInstance; + return retVal; } /** @@ -261,7 +269,6 @@ public class SCANConfig { cellTrendConfigMgr = new TrendSetConfigMgr("CellTrendSets.xml"); dmdTrendConfigMgr = new TrendSetConfigMgr("DmdTrendSets.xml"); - ; setupTableIntFormatMap(); setupTrendIntFormatMaps(); diff --git a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java index aa4f702402..06b9ff95a2 100644 --- a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java +++ b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java @@ -14,7 +14,7 @@ * Omaha, NE 68106 * 402.291.0100 * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * See the AWIPS II Master Rights File ("Master Rights File.p df") for * further licensing information. **/ package com.raytheon.uf.common.serialization; @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.ServiceConfigurationError; import java.util.Set; @@ -56,6 +57,9 @@ import com.raytheon.uf.common.serialization.jaxb.JaxbDummyObject; * Aug 11, 2008 njensen Initial creation * Aug 31, 2009 2924 rjpeter Added Embeddable. * Feb 07, 2013 1543 djohnson Implement IJaxbableClassesLocator. + * Apr 24, 2013 1939 randerso Clean up code and attempt to improve speed. + * Added initializeHibernatables flag to disable + * processing hibernatables on CAVE * </pre> * * @author njensen @@ -82,8 +86,6 @@ public class SerializableManager implements IJaxbableClassesLocator { */ @SuppressWarnings(value = { "unchecked" }) private synchronized void initialize() { - ClassLoader cl = getClass().getClassLoader(); - long t0 = System.currentTimeMillis(), total = 0; // this is here in case in the future we want to re-initialize the lists // during runtime, i.e. hot deploy of a new plugin hibernatables.clear(); @@ -96,23 +98,37 @@ public class SerializableManager implements IJaxbableClassesLocator { .getResources( "META-INF/services/" + ISerializableObject.class.getName()); + + // doHibernate will be false in CAVE since they are not needed + boolean doHibernate = Boolean.getBoolean("initializeHibernatables"); + // In testing 1 thread is slowest, 2 threads cuts the time down // about 50% and 3 threads cuts down another 5% or so, 4 threads // shows no benefit over 2. These results are system specific. int numThreads = 3; - Thread[] threads = new Thread[numThreads]; - for (int i = 1; i < numThreads; i++) { - threads[i] = new LoadSerializableClassesThread(urls, clazzSet, - hibernatables); + LoadSerializableClassesThread[] threads = new LoadSerializableClassesThread[numThreads]; + for (int i = 0; i < numThreads; i++) { + threads[i] = new LoadSerializableClassesThread(urls, + doHibernate); threads[i].start(); } - threads[0] = new LoadSerializableClassesThread(urls, clazzSet, - hibernatables); - // Run this one on the current thread since its not doing anything - // but waiting and this avoids overhead of starting a new thread - threads[0].run(); - for (int i = 1; i < numThreads; i++) { - threads[i].join(); + + for (LoadSerializableClassesThread thread : threads) { + thread.join(); + clazzSet.addAll(thread.getClazzList()); + + if (doHibernate) { + for (Entry<String, List<Class<ISerializableObject>>> entry : thread + .getHibernatables().entrySet()) { + List<Class<ISerializableObject>> list = hibernatables + .get(entry.getKey()); + if (list == null) { + list = new ArrayList<Class<ISerializableObject>>(); + hibernatables.put(entry.getKey(), list); + } + list.addAll(entry.getValue()); + } + } } } catch (Throwable e) { e.printStackTrace(); @@ -127,6 +143,7 @@ public class SerializableManager implements IJaxbableClassesLocator { System.out.println("Total time spent loading classes: " + (System.currentTimeMillis() - realStartTime) + "ms"); + } private static void fail(Class service, String msg, Throwable cause) @@ -153,25 +170,28 @@ public class SerializableManager implements IJaxbableClassesLocator { return -1; } int ci = ln.indexOf('#'); - if (ci >= 0) + if (ci >= 0) { ln = ln.substring(0, ci); + } ln = ln.trim(); int n = ln.length(); if (n != 0) { - if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0)) + if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0)) { fail(service, u, lc, "Illegal configuration-file syntax"); + } int cp = ln.codePointAt(0); - if (!Character.isJavaIdentifierStart(cp)) + if (!Character.isJavaIdentifierStart(cp)) { fail(service, u, lc, "Illegal provider-class name: " + ln); + } for (int i = Character.charCount(cp); i < n; i += Character .charCount(cp)) { cp = ln.codePointAt(i); - if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) + if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) { fail(service, u, lc, "Illegal provider-class name: " + ln); + } } - if (!names.contains(ln)) - names.add(ln); + names.add(ln); } return lc + 1; } @@ -233,30 +253,42 @@ public class SerializableManager implements IJaxbableClassesLocator { private final Enumeration<URL> urls; - private final Set<Class<ISerializableObject>> clazzSet; + private final boolean doHibernate; + + private final List<Class<ISerializableObject>> clazzList; private final Map<String, List<Class<ISerializableObject>>> hibernatables; public LoadSerializableClassesThread(Enumeration<URL> urls, - Set<Class<ISerializableObject>> clazzSet, - Map<String, List<Class<ISerializableObject>>> hibernatables) { + boolean doHibernate) { this.urls = urls; - this.clazzSet = clazzSet; - this.hibernatables = hibernatables; + this.doHibernate = doHibernate; + this.clazzList = new ArrayList<Class<ISerializableObject>>(500); + this.hibernatables = new HashMap<String, List<Class<ISerializableObject>>>(); + } + + public List<Class<ISerializableObject>> getClazzList() { + return clazzList; + } + + public Map<String, List<Class<ISerializableObject>>> getHibernatables() { + return hibernatables; } @Override public void run() { try { ClassLoader cl = getClass().getClassLoader(); - Set<Class<ISerializableObject>> pluginHibernateSet = new HashSet<Class<ISerializableObject>>(); + Set<Class<ISerializableObject>> pluginHibernateSet = null; + if (doHibernate) { + pluginHibernateSet = new HashSet<Class<ISerializableObject>>(); + } List<String> names = new ArrayList<String>(); URL u = getNextUrl(); while (u != null) { InputStream in = null; BufferedReader r = null; names.clear(); - pluginHibernateSet.clear(); String path = u.getPath(); int endIndex = path.indexOf(".jar"); if (endIndex < 0) { @@ -276,24 +308,31 @@ public class SerializableManager implements IJaxbableClassesLocator { "utf-8")); int lc = 1; while ((lc = parseLine(ISerializableObject.class, u, r, - lc, names)) >= 0) + lc, names)) >= 0) { ; + } } catch (IOException x) { fail(ISerializableObject.class, "Error reading configuration file", x); } finally { try { - if (r != null) + if (r != null) { r.close(); - if (in != null) + } + if (in != null) { in.close(); + } } catch (IOException y) { fail(ISerializableObject.class, "Error closing configuration file", y); } } - Iterator<String> iter = names.iterator(); + if (doHibernate) { + pluginHibernateSet.clear(); + } + + Iterator<String> iter = names.iterator(); while (iter.hasNext()) { String clazz = iter.next(); try { @@ -303,18 +342,20 @@ public class SerializableManager implements IJaxbableClassesLocator { boolean added = false; if (c.getAnnotation(XmlAccessorType.class) != null || c.getAnnotation(XmlRegistry.class) != null) { - addToClazzSet(c); + clazzList.add(c); added = true; } - if (c.getAnnotation(Entity.class) != null - || c.getAnnotation(Embeddable.class) != null) { - pluginHibernateSet.add(c); - added = true; + if (doHibernate) { + if (c.getAnnotation(Entity.class) != null + || c.getAnnotation(Embeddable.class) != null) { + pluginHibernateSet.add(c); + added = true; + } } long time = (System.currentTimeMillis() - t0); - if (!added) { + if (doHibernate && !added) { System.out .println("Class: " + clazz @@ -329,8 +370,10 @@ public class SerializableManager implements IJaxbableClassesLocator { } } - if (pluginHibernateSet.size() > 0) { - addToHibernatables(pluginFQN, pluginHibernateSet); + if (doHibernate && pluginHibernateSet.size() > 0) { + hibernatables.put(pluginFQN, + new ArrayList<Class<ISerializableObject>>( + pluginHibernateSet)); } u = getNextUrl(); } @@ -347,20 +390,5 @@ public class SerializableManager implements IJaxbableClassesLocator { return null; } } - - private void addToClazzSet(Class<ISerializableObject> clazz) { - synchronized (clazzSet) { - clazzSet.add(clazz); - } - } - - private void addToHibernatables(String pluginFQN, - Set<Class<ISerializableObject>> pluginHibernateSet) { - synchronized (hibernatables) { - hibernatables.put(pluginFQN, - new ArrayList<Class<ISerializableObject>>( - pluginHibernateSet)); - } - } } } diff --git a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/adapters/FloatWKBReader.java b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/adapters/FloatWKBReader.java new file mode 100644 index 0000000000..8f2c0345d4 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/adapters/FloatWKBReader.java @@ -0,0 +1,174 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/diclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.common.serialization.adapters; + +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Array; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.LinearRing; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPoint; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.io.WKBConstants; + +/** + * Class for deserializing geometries in FloatWKB format. FloatWKB is a format + * based off of but completely incompatible with WKB. The only difference from + * WKB is that instead of reading every coordinate as a 8 byte double it is read + * as a 4 byte float. This cuts the size of objects in half while decreasing the + * precision. + * + * <pre> + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Apr 26, 2013 1954 bsteffen Initial creation + * + * </pre> + * + * @author bsteffen + * @version 1.0 + */ +public class FloatWKBReader { + + private final GeometryFactory factory; + + public FloatWKBReader(GeometryFactory factory) { + this.factory = factory; + } + + public Geometry readGeometry(InputStream in) throws IOException { + return readGeometry((DataInput) new DataInputStream(in)); + } + + private Geometry readGeometry(DataInput di) throws IOException { + byte byteOrder = di.readByte(); + if (byteOrder == WKBConstants.wkbNDR) { + throw new IOException( + "WKBF does not currently support little endian"); + } + int type = di.readInt(); + switch (type) { + case WKBConstants.wkbPoint: + return readPoint(di); + case WKBConstants.wkbLineString: + return readLineString(di); + case WKBConstants.wkbPolygon: + return readPolygon(di); + case WKBConstants.wkbMultiPoint: + return readMultiPoint(di); + case WKBConstants.wkbMultiLineString: + return readMultiLineString(di); + case WKBConstants.wkbMultiPolygon: + return readMultiPolygon(di); + case WKBConstants.wkbGeometryCollection: + return readGeometryCollection(di); + } + // If the geometry contains three ordinates or a SRID it will also end + // up here + throw new IOException("Unknown WKB type " + (type & 0xff)); + } + + private Point readPoint(DataInput di) throws IOException { + return factory.createPoint(readCoordinate(di)); + } + + private LineString readLineString(DataInput di) throws IOException { + return factory.createLineString(readCoordinates(di)); + } + + private Polygon readPolygon(DataInput di) throws IOException { + int size = di.readInt(); + LinearRing shell = null; + LinearRing[] holes = null; + shell = factory.createLinearRing(readCoordinates(di)); + if (size > 1) { + holes = new LinearRing[size - 1]; + for (int i = 1; i < size; i += 1) { + holes[i - 1] = factory.createLinearRing(readCoordinates(di)); + } + } + return factory.createPolygon(shell, holes); + } + + private MultiPoint readMultiPoint(DataInput di) throws IOException { + return factory.createMultiPoint(readMultiGeometry(di, Point.class)); + } + + private MultiLineString readMultiLineString(DataInput di) + throws IOException { + return factory.createMultiLineString(readMultiGeometry(di, + LineString.class)); + } + + private MultiPolygon readMultiPolygon(DataInput di) throws IOException { + return factory.createMultiPolygon(readMultiGeometry(di, Polygon.class)); + } + + private GeometryCollection readGeometryCollection(DataInput di) + throws IOException { + return factory.createGeometryCollection(readMultiGeometry(di, + Geometry.class)); + } + + private <T extends Geometry> T[] readMultiGeometry(DataInput di, + Class<T> geomType) throws IOException { + int size = di.readInt(); + @SuppressWarnings("unchecked") + T[] geoms = (T[]) Array.newInstance(geomType, size); + for (int i = 0; i < size; i++) { + Geometry g = readGeometry(di); + if (geomType.isInstance(g)) { + geoms[i] = geomType.cast(g); + } else { + throw new IOException("Expected a " + + geomType.getClass().getSimpleName() + + " but recieved a " + g.getClass().getSimpleName()); + } + } + return geoms; + } + + private Coordinate[] readCoordinates(DataInput di) throws IOException { + int size = di.readInt(); + Coordinate[] coordinates = new Coordinate[size]; + for (int i = 0; i < size; i += 1) { + coordinates[i] = readCoordinate(di); + } + return coordinates; + } + + private Coordinate readCoordinate(DataInput di) throws IOException { + return new Coordinate(di.readFloat(), di.readFloat()); + } + +} diff --git a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/adapters/FloatWKBWriter.java b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/adapters/FloatWKBWriter.java new file mode 100644 index 0000000000..f79606c89c --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/adapters/FloatWKBWriter.java @@ -0,0 +1,152 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/diclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.common.serialization.adapters; + +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPoint; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.io.WKBConstants; + +/** + * Class for serializing geometries in FloatWKB format. FloatWKB is a format + * based off of but completely incompatible with WKB. The only difference from + * WKB is that instead of writing every coordinate as a 8 byte double it is + * written as a 4 byte float. This cuts the size of objects in half while + * decreasing the precision. + * + * <pre> + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Apr 26, 2013 1954 bsteffen Initial creation + * + * </pre> + * + * @author bsteffen + * @version 1.0 + */ +public class FloatWKBWriter { + + public void writeGeometry(Geometry geom, OutputStream out) + throws IOException { + writeGeometry(geom, (DataOutput) new DataOutputStream(out)); + } + + private void writeGeometry(Geometry geom, DataOutput d) + throws IOException { + d.write(WKBConstants.wkbXDR); + if (geom instanceof Point) + writePoint((Point) geom, d); + else if (geom instanceof LineString) + writeLineString((LineString) geom, d); + else if (geom instanceof Polygon) + writePolygon((Polygon) geom, d); + else if (geom instanceof MultiPoint) + writeMultiPoint((MultiPoint) geom, d); + else if (geom instanceof MultiLineString) + writeMultiLineString((MultiLineString) geom, d); + else if (geom instanceof MultiPolygon) + writeMultiPolygon((MultiPolygon) geom, d); + else if (geom instanceof GeometryCollection) + writeGeometryCollection((GeometryCollection) geom, d); + else { + throw new IOException("Unknown Geometry type: " + + geom.getClass().getSimpleName()); + } + } + + private void writePoint(Point p, DataOutput d) throws IOException { + d.writeInt(WKBConstants.wkbPoint); + writeCoordinate(p.getCoordinate(), d); + } + + private void writeLineString(LineString ls, DataOutput d) + throws IOException { + d.writeInt(WKBConstants.wkbLineString); + writeCoordinates(ls.getCoordinates(), d); + } + + private void writePolygon(Polygon polygon, DataOutput d) throws IOException { + d.writeInt(WKBConstants.wkbPolygon); + d.writeInt(polygon.getNumInteriorRing() + 1); + writeCoordinates(polygon.getExteriorRing().getCoordinates(), d); + for (int i = 0; i < polygon.getNumInteriorRing(); i += 1) { + writeCoordinates(polygon.getInteriorRingN(i).getCoordinates(), d); + } + } + + private void writeMultiPoint(MultiPoint mp, DataOutput d) + throws IOException { + d.writeInt(WKBConstants.wkbMultiPoint); + writeMultiGeometry(mp, d); + } + + private void writeMultiLineString(MultiLineString mls, DataOutput d) + throws IOException { + d.writeInt(WKBConstants.wkbMultiLineString); + writeMultiGeometry(mls, d); + } + + private void writeMultiPolygon(MultiPolygon mp, DataOutput d) + throws IOException { + d.writeInt(WKBConstants.wkbMultiPolygon); + writeMultiGeometry(mp, d); + } + + private void writeGeometryCollection(GeometryCollection gc, DataOutput d) + throws IOException { + d.writeInt(WKBConstants.wkbGeometryCollection); + writeMultiGeometry(gc, d); + } + + private void writeMultiGeometry(GeometryCollection gc, DataOutput d) + throws IOException { + d.writeInt(gc.getNumGeometries()); + for (int i = 0; i < gc.getNumGeometries(); i++) { + writeGeometry(gc.getGeometryN(i), d); + } + } + + private void writeCoordinates(Coordinate[] coordinates, DataOutput d) + throws IOException { + d.writeInt(coordinates.length); + for (Coordinate c : coordinates) { + writeCoordinate(c, d); + } + } + + private void writeCoordinate(Coordinate c, DataOutput d) throws IOException { + d.writeFloat((float) c.x); + d.writeFloat((float) c.y); + } +} diff --git a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/thrift/ThriftSerializationContext.java b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/thrift/ThriftSerializationContext.java index c2b41b87b1..40739427bd 100644 --- a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/thrift/ThriftSerializationContext.java +++ b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/thrift/ThriftSerializationContext.java @@ -66,6 +66,7 @@ import com.raytheon.uf.common.serialization.SerializationException; * Sep 14, 2012 #1169 djohnson Add ability to write another object into the stream directly. * Sep 28, 2012 #1195 djohnson Add ability to specify adapter at field level. * Nov 02, 2012 1302 djohnson No more field level adapters. + * Apr 25, 2013 1954 bsteffen Size Collections better. * * </pre> * @@ -946,7 +947,7 @@ public class ThriftSerializationContext extends BaseSerializationContext { if (map == null) { // assume hashmap if nothing else available - map = new HashMap(tmap.size); + map = new HashMap((int) (tmap.size / 0.75) + 1, 0.75f); } for (int i = 0; i < tmap.size; i++) { @@ -995,7 +996,7 @@ public class ThriftSerializationContext extends BaseSerializationContext { if (set == null) { // assume hashset if nothing else available - set = new HashSet(tset.size); + set = new HashSet((int) (tset.size / 0.75) + 1, 0.75f); } for (int i = 0; i < tset.size; i++) { @@ -1175,7 +1176,7 @@ public class ThriftSerializationContext extends BaseSerializationContext { } } if (list == null) { - list = new ArrayList<String>(); + list = new ArrayList<String>(innerList.size); } for (int i = 0; i < innerList.size; i++) { list.add(readString()); @@ -1213,7 +1214,7 @@ public class ThriftSerializationContext extends BaseSerializationContext { } if (list == null) { - list = new ArrayList(); + list = new ArrayList(innerList.size); } for (int i = 0; i < innerList.size; i++) { list.add(this.serializationManager.deserialize(this)); diff --git a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/DataTime.java b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/DataTime.java index 2e0f5b4faf..deaeffb499 100644 --- a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/DataTime.java +++ b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/DataTime.java @@ -61,6 +61,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Jim Ramer Original Code * Jun 18, 2007 chammack Partial port to Java * Apr 12, 2013 1857 bgonzale Added Index annotations to getter methods. + * Mar 02, 2013 1970 bgonzale Removed Index annotations. * * </pre> * diff --git a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/TimeRange.java b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/TimeRange.java index c8de72145f..280ee5fd84 100644 --- a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/TimeRange.java +++ b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/TimeRange.java @@ -56,7 +56,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * duration is 0, use TimeUtil constants. * 04/04/2013 #1787 randerso Removed a bunch of isValid checks to the logic * works as intended by the original A1 implementation. - * + * 04/24/2013 1949 rjpeter Updated clone to deep copy by millis. * </pre> * * <B>Original Documentation:</B> @@ -260,10 +260,10 @@ public class TimeRange implements Serializable, Comparable<TimeRange>, if (days > 0) { sb.append(days + "d "); } - if (hours > 0 || min > 0 || sec > 0) { + if ((hours > 0) || (min > 0) || (sec > 0)) { sb.append(hours + "h "); } - if (min > 0 || sec > 0) { + if ((min > 0) || (sec > 0)) { sb.append(min + "m "); } if (sec > 0) { @@ -340,7 +340,7 @@ public class TimeRange implements Serializable, Comparable<TimeRange>, */ @Override public boolean equals(Object obj) { - if (obj == null || !(obj instanceof TimeRange)) { + if ((obj == null) || !(obj instanceof TimeRange)) { return false; } @@ -368,8 +368,8 @@ public class TimeRange implements Serializable, Comparable<TimeRange>, public boolean contains(Date time) { if (getDuration() != 0) { // the end time is not part of the time range (hence the < operator) - return time.getTime() >= start.getTime() - && time.getTime() < end.getTime(); + return (time.getTime() >= start.getTime()) + && (time.getTime() < end.getTime()); } else { // Special case for zero duration time range return time.equals(start); @@ -416,8 +416,8 @@ public class TimeRange implements Serializable, Comparable<TimeRange>, } else if (timeRange.getDuration() == 0) { return contains(timeRange.getStart()); } else { - return timeRange.start.compareTo(start) >= 0 - && timeRange.end.compareTo(end) <= 0; + return (timeRange.start.compareTo(start) >= 0) + && (timeRange.end.compareTo(end) <= 0); } } @@ -545,7 +545,7 @@ public class TimeRange implements Serializable, Comparable<TimeRange>, */ @Override public TimeRange clone() { - return new TimeRange(this.start, this.end); + return new TimeRange(this.start.getTime(), this.end.getTime()); } @Override diff --git a/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF index 4be6a14922..a68d121ade 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF @@ -26,6 +26,7 @@ Export-Package: com.raytheon.uf.edex.database, com.raytheon.uf.edex.database.cluster.handler, com.raytheon.uf.edex.database.dao, com.raytheon.uf.edex.database.handlers, + com.raytheon.uf.edex.database.init, com.raytheon.uf.edex.database.plugin, com.raytheon.uf.edex.database.purge, com.raytheon.uf.edex.database.query, diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java index aee58fd774..e7b6865c95 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java @@ -259,7 +259,7 @@ public class CoreDao extends HibernateDaoSupport { * @param obj * The object to delete */ - public <T> void delete(final PersistableDataObject<T> obj) { + public <T> void delete(final Object obj) { txTemplate.execute(new TransactionCallbackWithoutResult() { @Override public void doInTransactionWithoutResult(TransactionStatus status) { @@ -311,10 +311,11 @@ public class CoreDao extends HibernateDaoSupport { id.getDataURI())); List<?> list = getHibernateTemplate().findByCriteria( criteria); - if (list.size() > 0) + if (list.size() > 0) { return (PluginDataObject) list.get(0); - else + } else { return null; + } } }); return retVal; @@ -847,7 +848,7 @@ public class CoreDao extends HibernateDaoSupport { logger.error("Unable to close JDBC statement!", e1); } - if (exception == null && transactional) { + if ((exception == null) && transactional) { trans.commit(); } try { diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/init/DbInit.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/init/DbInit.java new file mode 100644 index 0000000000..0dcd4cecdb --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/init/DbInit.java @@ -0,0 +1,345 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ + +package com.raytheon.uf.edex.database.init; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.hibernate.cfg.AnnotationConfiguration; +import org.hibernate.dialect.Dialect; +import org.hibernate.jdbc.Work; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; + +/** + * The DbInit class is responsible for ensuring that the appropriate tables are + * present in the database implementation for the session factory. + * + * <pre> + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Apr 30, 2013 1960 djohnson Extracted and generalized from the registry DbInit. + * </pre> + * + * @author djohnson + */ +public abstract class DbInit { + + /** The logger */ + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(DbInit.class); + + /** Constant used for table regeneration */ + private static final Pattern DROP_TABLE_PATTERN = Pattern + .compile("^drop\\stable\\s"); + + /** Constant used for table regeneration */ + private static final Pattern DROP_SEQUENCE_PATTERN = Pattern + .compile("^drop\\ssequence\\s"); + + /** Constant used for table regeneration */ + private static final Pattern CASCADE_PATTERN = Pattern + .compile("\\scascade$"); + + /** Constant used for table regeneration */ + private static final String DROP_TABLE = "drop table "; + + /** Constant used for table regeneration */ + private static final String DROP_SEQUENCE = "drop sequence "; + + /** Constant used for table regeneration */ + private static final String IF_EXISTS = "if exists "; + + /** Constant used for table regeneration */ + private static final String DROP_TABLE_IF_EXISTS = DROP_TABLE + IF_EXISTS; + + /** Constant used for table regeneration */ + private static final String DROP_SEQUENCE_IF_EXISTS = DROP_SEQUENCE + + IF_EXISTS; + + /** Constant used for table regeneration */ + private static final String CASCADE = " cascade"; + + /** The logging application db name **/ + private final String application; + + /** + * Constructor. + * + * @param application + * the application component the database is used in support of + */ + protected DbInit(String application) { + this.application = application; + } + + /** + * Initializes the database. This method compares the existing tables in the + * database to verify that they match the tables that Hibernate is aware of. + * If the existing tables in the database do not match the tables Hibernate + * is expecting, the tables are regenerated. During the regeneration + * process, the minimum database objects are reloaded into the database. + * + * @throws Exception + * on error initializing the database + */ + public final void initDb() throws Exception { + /* + * Create a new configuration object which holds all the classes that + * this Hibernate SessionFactory is aware of + */ + AnnotationConfiguration aConfig = getAnnotationConfiguration(); + + /* + * Check to see if the database is valid. + */ + boolean dbIsValid = isDbValid(aConfig); + + if (dbIsValid) { + // Database is valid. + statusHandler.info("Database for application [" + application + + "] is up to date!"); + } else { + // Database is not valid. Drop and regenerate the tables defined by + // Hibernate + statusHandler + .info("Database for application [" + + application + + "] is out of sync with defined java classes. Regenerating default database tables..."); + statusHandler.info("Dropping existing tables..."); + dropTables(aConfig); + + statusHandler.info("Recreating tables..."); + createTables(aConfig); + + statusHandler.info("Executing additional SQL..."); + + executeAdditionalSql(); + + statusHandler.info("Database tables for application [" + application + + "] have been successfully regenerated!"); + } + } + + /** + * Hook method to execute any additional setup required. + * + * @throws Exception + * any exceptions may be thrown + */ + protected void executeAdditionalSql() throws Exception { + } + + /** + * Creates the database tables based on the Class metadata that Hibernate is + * aware of + * + * @param aConfig + * The Hibernate annotation configuration holding the metadata + * for all Hibernate-aware classes + * @throws SQLException + * If the drop sql strings cannot be executed + * @throws EbxmlRegistryException + */ + private void createTables(final AnnotationConfiguration aConfig) + throws SQLException { + final String[] createSqls = aConfig + .generateSchemaCreationScript(getDialect()); + final Work work = new Work() { + @Override + public void execute(Connection connection) throws SQLException { + Statement stmt = connection.createStatement(); + for (String sql : createSqls) { + stmt.execute(sql); + connection.commit(); + } + + } + }; + + executeWork(work); + } + + /** + * Checks to see if the database is valid. The RegRep database is considered + * to be valid if the set of tables defined by Hibernate contains the set of + * tables already in existance in the database + * + * @param aConfig + * The Hibernate annotation configuration holding the metadata + * for all Hibernate-aware classes + * @return True if the database is valid, else false + * @throws SQLException + * If the drop sql strings cannot be executed + * @throws EbxmlRegistryException + */ + private boolean isDbValid(AnnotationConfiguration aConfig) + throws SQLException { + statusHandler.info("Verifying the database for application [" + + application + "] against entity classes..."); + final List<String> existingTables = new ArrayList<String>(); + List<String> definedTables = new ArrayList<String>(); + final Work work = new Work() { + @Override + public void execute(Connection connection) throws SQLException { + Statement stmt = connection.createStatement(); + ResultSet results = stmt.executeQuery(getTableCheckQuery()); + while (results.next()) { + existingTables.add(results.getString(1)); + } + } + }; + executeWork(work); + + final String[] dropSqls = aConfig + .generateDropSchemaScript(getDialect()); + for (String sql : dropSqls) { + Matcher matcher = DROP_TABLE_PATTERN.matcher(sql); + if (matcher.find()) { + // Drop the table names to all lower case since this is the form + // the database expects + sql = matcher.replaceFirst("").toLowerCase(); + + // Replace any trailing cascades + Matcher cascadeMatcher = CASCADE_PATTERN.matcher(sql); + if (cascadeMatcher.find()) { + sql = cascadeMatcher.replaceFirst(""); + } + + definedTables.add(sql); + } + } + + // Check if the table set defined by Hibernate matches the table set + // defined in the database already + if (existingTables.size() != definedTables.size() + || !existingTables.containsAll(definedTables)) { + return false; + } + return true; + } + + + /** + * Drops the union set of tables defined by Hibernate and exist in the + * database. + * + * @param aConfig + * The Hibernate annotation configuration holding the metadata + * for all Hibernate-aware classes + * @throws SQLException + * If the drop sql strings cannot be executed + * @throws EbxmlRegistryException + */ + private void dropTables(final AnnotationConfiguration aConfig) + throws SQLException { + + final Work work = new Work() { + @Override + public void execute(Connection connection) throws SQLException { + final String[] dropSqls = aConfig + .generateDropSchemaScript(getDialect()); + Statement stmt = connection.createStatement(); + for (String sql : dropSqls) { + Matcher dropTableMatcher = DROP_TABLE_PATTERN.matcher(sql); + if (dropTableMatcher.find()) { + executeDropSql(sql, dropTableMatcher, + DROP_TABLE_IF_EXISTS, stmt, connection); + } else { + Matcher dropSequenceMatcher = DROP_SEQUENCE_PATTERN + .matcher(sql); + if (dropSequenceMatcher.find()) { + executeDropSql(sql, dropSequenceMatcher, + DROP_SEQUENCE_IF_EXISTS, stmt, connection); + } + } + } + } + }; + + executeWork(work); + } + + + /** + * Convenience method to execute drop sql with parameters. + * + * @param sql + * @param dropTextMatcher + * @param replacementText + * @param stmt + * @param connection + * @throws SQLException + */ + private void executeDropSql(String sql, Matcher dropTextMatcher, + String replacementText, Statement stmt, Connection connection) + throws SQLException { + // Modify the drop string to add the 'if exists' + // and 'cascade' clauses to avoid any errors if + // the tables do not exist already + sql = dropTextMatcher.replaceFirst(replacementText); + if (!sql.endsWith(CASCADE)) { + sql += CASCADE; + } + stmt.execute(sql); + connection.commit(); + } + + /** + * Get the query that will return the list of current table names used for + * this db init. + * + * @return the query + */ + protected abstract String getTableCheckQuery(); + + /** + * Get the dialect. + * + * @return + */ + protected abstract Dialect getDialect(); + + /** + * Execute the work. + * + * @param work + * the work + */ + protected abstract void executeWork(Work work); + + /** + * Get the {@link AnnotationConfiguration} to use. + * + * @return + */ + protected abstract AnnotationConfiguration getAnnotationConfiguration(); +} diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/plugin/PluginDao.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/plugin/PluginDao.java index 915105f076..279820996d 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/plugin/PluginDao.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/plugin/PluginDao.java @@ -39,7 +39,7 @@ import java.util.concurrent.ConcurrentMap; import org.geotools.geometry.jts.ReferencedEnvelope; import org.hibernate.Criteria; -import org.hibernate.StatelessSession; +import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; @@ -234,10 +234,9 @@ public abstract class PluginDao extends CoreDao { int dupCommitCount = 0; int noDupCommitCount = 0; - StatelessSession ss = null; + Session session = null; try { - ss = getHibernateTemplate().getSessionFactory() - .openStatelessSession(); + session = getHibernateTemplate().getSessionFactory().openSession(); // process them all in fixed sized batches. for (int i = 0; i < objects.size(); i += COMMIT_INTERVAL) { List<PluginDataObject> subList = objects.subList(i, @@ -249,16 +248,17 @@ public abstract class PluginDao extends CoreDao { // First attempt is to just shove everything in the database // as fast as possible and assume no duplicates. try { - tx = ss.beginTransaction(); + tx = session.beginTransaction(); for (PluginDataObject object : subList) { if (object == null) { continue; } - ss.insert(object); + session.save(object); } tx.commit(); } catch (ConstraintViolationException e) { tx.rollback(); + session.clear(); constraintViolation = true; } } @@ -267,25 +267,26 @@ public abstract class PluginDao extends CoreDao { // overwrite. constraintViolation = false; try { - tx = ss.beginTransaction(); + tx = session.beginTransaction(); for (PluginDataObject object : subList) { if (object == null) { continue; } try { - Criteria criteria = ss.createCriteria(pdoClass); + Criteria criteria = session + .createCriteria(pdoClass); populateDatauriCriteria(criteria, object); criteria.setProjection(Projections.id()); Integer id = (Integer) criteria.uniqueResult(); if (id != null) { object.setId(id); if (object.isOverwriteAllowed()) { - ss.update(object); + session.update(object); } else { subDuplicates.add(object); } } else { - ss.insert(object); + session.save(object); } } catch (PluginException e) { statusHandler.handle(Priority.PROBLEM, @@ -297,6 +298,7 @@ public abstract class PluginDao extends CoreDao { } catch (ConstraintViolationException e) { constraintViolation = true; tx.rollback(); + session.clear(); } } if (constraintViolation) { @@ -307,20 +309,21 @@ public abstract class PluginDao extends CoreDao { continue; } try { - tx = ss.beginTransaction(); - Criteria criteria = ss.createCriteria(pdoClass); + tx = session.beginTransaction(); + Criteria criteria = session + .createCriteria(pdoClass); populateDatauriCriteria(criteria, object); criteria.setProjection(Projections.id()); Integer id = (Integer) criteria.uniqueResult(); if (id != null) { object.setId(id); if (object.isOverwriteAllowed()) { - ss.update(object); + session.update(object); } else { subDuplicates.add(object); } } else { - ss.insert(object); + session.save(object); } tx.commit(); } catch (ConstraintViolationException e) { @@ -343,8 +346,8 @@ public abstract class PluginDao extends CoreDao { dupStat.updateRate(noDupCommitCount / (noDupCommitCount + dupCommitCount)); } finally { - if (ss != null) { - ss.close(); + if (session != null) { + session.close(); } } return duplicates; @@ -1808,7 +1811,7 @@ public abstract class PluginDao extends CoreDao { // failed) attempts it will take to change the cumulativeRate. protected static final int DUPLICATE_MEMORY = 5000; - protected boolean duplicateCheck = true; + protected boolean duplicateCheck = false; protected float cumulativeRate = 1.0f; diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/res/spring/bandwidth-datadelivery.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/res/spring/bandwidth-datadelivery.xml index ad3a0fbf94..e810233d63 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/res/spring/bandwidth-datadelivery.xml +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/res/spring/bandwidth-datadelivery.xml @@ -16,7 +16,7 @@ factory-method="getBandwidthDao" /> <bean id="bandwidthDbInit" factory-bean="bandwidthContextFactory" - factory-method="getBandwidthDbInit" init-method="init" /> + factory-method="getBandwidthDbInit" /> <bean id="bandwidthManagerInitializer" factory-bean="bandwidthContextFactory" factory-method="getBandwidthInitializer" depends-on="registryManagerInstanceInitializer"> diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthDbInit.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthDbInit.java index a03b6a5527..2ada5a89fc 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthDbInit.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthDbInit.java @@ -19,10 +19,6 @@ **/ package com.raytheon.uf.edex.datadelivery.bandwidth; -import java.sql.SQLException; - -import org.hibernate.cfg.AnnotationConfiguration; - import com.raytheon.uf.edex.datadelivery.bandwidth.dao.IBandwidthDbInit; /** @@ -36,6 +32,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.dao.IBandwidthDbInit; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 24, 2012 1286 djohnson Initial creation + * Apr 30, 2013 1960 djohnson Remove unnecessary methods. * * </pre> * @@ -51,22 +48,4 @@ class InMemoryBandwidthDbInit implements IBandwidthDbInit { public void init() { // Nothing required } - - /** - * {@inheritDoc} - */ - @Override - public void dropTables(AnnotationConfiguration aConfig) throws SQLException { - // Nothing required - - } - - /** - * {@inheritDoc} - */ - @Override - public void createTables(AnnotationConfiguration aConfig) - throws SQLException { - // Nothing required - } } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/dao/IBandwidthDbInit.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/dao/IBandwidthDbInit.java index b5c4addcac..7c484b4dbb 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/dao/IBandwidthDbInit.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/dao/IBandwidthDbInit.java @@ -19,10 +19,6 @@ **/ package com.raytheon.uf.edex.datadelivery.bandwidth.dao; -import java.sql.SQLException; - -import org.hibernate.cfg.AnnotationConfiguration; - /** * Performs any required database initialization. * @@ -33,6 +29,7 @@ import org.hibernate.cfg.AnnotationConfiguration; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 24, 2012 1286 djohnson Separated from the implementation + * Apr 30, 2013 1960 djohnson Remove unnecessary methods. * * </pre> * @@ -44,27 +41,8 @@ public interface IBandwidthDbInit { /** * Initializes the database. + * + * @throws Exception */ - void init(); - - /** - * Drop tables. - * - * @param aConfig - * the annotation configuration - * - * @throws SQLException - */ - void dropTables(AnnotationConfiguration aConfig) - throws java.sql.SQLException; - - /** - * Create the tables. - * - * @param aConfig - * - * @throws SQLException - */ - void createTables(AnnotationConfiguration aConfig) - throws java.sql.SQLException;; -} + void init() throws Exception; +} \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthDbInit.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthDbInit.java index 3a0a71ea20..a2a6f08e99 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthDbInit.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthDbInit.java @@ -20,18 +20,11 @@ package com.raytheon.uf.edex.datadelivery.bandwidth.hibernate; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - import org.hibernate.cfg.AnnotationConfiguration; +import org.hibernate.dialect.Dialect; import org.hibernate.jdbc.Work; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.edex.database.init.DbInit; import com.raytheon.uf.edex.datadelivery.bandwidth.dao.IBandwidthDbInit; /** @@ -46,31 +39,14 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.dao.IBandwidthDbInit; * ------------ ---------- ----------- -------------------------- * Jul 31, 2012 726 jspinks Copied and refactored from ebxml registry DbInit * Oct 26, 2012 1286 djohnson Renamed to Hibernate specific. + * Apr 30, 2013 1960 djohnson Extend the generalized DbInit. * </pre> * * @author jspinks * @version 1 */ -public class HibernateBandwidthDbInit implements IBandwidthDbInit { - - /** The logger */ - private static final IUFStatusHandler statusHandler = UFStatus - .getHandler(HibernateBandwidthDbInit.class); - - /** Query to check which tables exist in the database */ - private static final String TABLE_CHECK_QUERY = "select tablename from pg_tables where tablename like 'bandwidth_%';"; - - /** Constant used for table regeneration */ - private static final String DROP_TABLE = "drop table "; - - /** Constant used for table regeneration */ - private static final String DROP_SEQUENCE = "drop sequence "; - - /** Constant used for table regeneration */ - private static final String IF_EXISTS = "if exists "; - - /** Constant used for table regeneration */ - private static final String CASCADE = " cascade "; +public class HibernateBandwidthDbInit extends DbInit implements + IBandwidthDbInit { private final HibernateBandwidthDao bandwidthDao; @@ -83,207 +59,58 @@ public class HibernateBandwidthDbInit implements IBandwidthDbInit { * */ public HibernateBandwidthDbInit(HibernateBandwidthDao bandwidthDao) { + super("bandwidth manager"); this.bandwidthDao = bandwidthDao; } /** - * Initializes the ebxml database + * {@inheritDoc} */ @Override - public void init() { + protected void executeWork(final Work work) { + bandwidthDao.doWork(work); + } - statusHandler.info("Starting bandwidth database init..."); + /** + * {@inheritDoc} + */ + @Override + protected Dialect getDialect() { + return bandwidthDao.getDialect(); + } + /** + * {@inheritDoc} + */ + @Override + protected AnnotationConfiguration getAnnotationConfiguration() { /* * Create a new configuration object which holds all the classes that * this Hibernate SessionFactory is aware of */ AnnotationConfiguration aConfig = new AnnotationConfiguration(); - - // TODO: add package scanning or some other more elegant solution, but - // for now - // just to it ugly. aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthDataSetUpdate.class); aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthSubscription.class); aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.SubscriptionRetrieval.class); aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthAllocation.class); - - /* - * Check to see if the database is valid. - */ - boolean dbIsValid = true; - try { - dbIsValid = isDbValid(aConfig); - } catch (SQLException e) { - throw new IllegalStateException("Error checking if db is valid!", e); - } - - if (dbIsValid) { - // Database is valid. - statusHandler.info("Bandwidth database is up to date!"); - } else { - // Database is not valid. Drop and regenerate the tables defined by - // Hibernate - statusHandler - .info("Bandwidth database is out of sync with defined java classes. Regenerating default database tables..."); - statusHandler.info("Dropping existing tables..."); - try { - dropTables(aConfig); - } catch (SQLException e) { - throw new IllegalStateException( - "An unexpected database error occurred while dropping existing Bandwidth database tables.", - e); - } - statusHandler.info("Recreating tables..."); - try { - createTables(aConfig); - } catch (SQLException e) { - throw new IllegalStateException( - "An unexpected database error occurred while creating Bandwidth database tables.", - e); - } - - statusHandler - .info("Bandwidth database tables have been successfully regenerated!"); - } - + return aConfig; } /** - * Drops the union set of tables defined by Hibernate and exist in the - * database. - * - * @param aConfig - * The Hibernate annotation configuration holding the metadata - * for all Hibernate-aware classes - * @throws SQLException - * If the drop sql strings cannot be executed - * @throws EbxmlRegistryException + * {@inheritDoc} */ @Override - public void dropTables(final AnnotationConfiguration aConfig) - throws SQLException { - - bandwidthDao.doWork(new Work() { - @Override - public void execute(Connection connection) throws SQLException { - final String[] dropSqls = aConfig - .generateDropSchemaScript(bandwidthDao - .getDialect()); - Statement stmt = connection.createStatement(); - for (String sql : dropSqls) { - if (sql.startsWith(DROP_TABLE)) { - // Modify the drop string to add the 'if exists' - // and - // 'cascade' clauses to avoid any errors if the - // tables - // do not exist already - sql = sql.replace(DROP_TABLE, DROP_TABLE + IF_EXISTS); - sql += CASCADE; - stmt.execute(sql); - connection.commit(); - } else if (sql.startsWith(DROP_SEQUENCE)) { - // Modify the drop string to add the 'if exists' - // and - // 'cascade' clauses to avoid any errors if the - // tables - // do not exist already - sql = sql.replace(DROP_SEQUENCE, DROP_SEQUENCE - + IF_EXISTS); - sql += CASCADE; - stmt.execute(sql); - connection.commit(); - } - - } // end for - } // end execute() - } // end Work() - ); + public void init() throws Exception { + initDb(); } /** - * Creates the database tables based on the Class metadata that Hibernate is - * aware of - * - * @param aConfig - * The Hibernate annotation configuration holding the metadata - * for all Hibernate-aware classes - * @throws SQLException - * If the drop sql strings cannot be executed - * @throws EbxmlRegistryException + * {@inheritDoc} */ @Override - public void createTables(final AnnotationConfiguration aConfig) - throws SQLException { - - final String[] createSqls = aConfig - .generateSchemaCreationScript(bandwidthDao.getDialect()); - bandwidthDao.doWork(new Work() { - @Override - public void execute(Connection connection) throws SQLException { - Statement stmt = connection.createStatement(); - for (String sql : createSqls) { - stmt.execute(sql); - connection.commit(); - } - } - }); - } - - /** - * Checks to see if the database is valid. The Bandwidth database is - * considered to be valid if the set of tables defined by Hibernate contains - * the set of tables already in existance in the database - * - * @param aConfig - * The Hibernate annotation configuration holding the metadata - * for all Hibernate-aware classes - * @return True if the database is valid, else false - * @throws SQLException - * If the drop sql strings cannot be executed - * @throws EbxmlRegistryException - */ - public boolean isDbValid(AnnotationConfiguration aConfig) - throws SQLException { - statusHandler.info("Verifying bandwidth database..."); - final List<String> existingTables = new ArrayList<String>(); - List<String> definedTables = new ArrayList<String>(); - - bandwidthDao.doWork(new Work() { - @Override - public void execute(Connection connection) throws SQLException { - Statement stmt = connection.createStatement(); - ResultSet results = stmt.executeQuery(TABLE_CHECK_QUERY); - while (results.next()) { - existingTables.add(results.getString(1)); - } - } - }); - - final String[] dropSqls = aConfig -.generateDropSchemaScript(bandwidthDao - .getDialect()); - for (String sql : dropSqls) { - if (sql.startsWith(DROP_TABLE)) { - // Drop the table names to all lower case since this is the form - // the database expects - definedTables.add(sql.replace(DROP_TABLE, "").toLowerCase()); - } - } - - for (String t : existingTables) { - statusHandler.info("Existing table [" + t + "]"); - } - for (String t : definedTables) { - statusHandler.info("Defined table [" + t + "]"); - } - - // Check if the table set defined by Hibernate matches the table set - // defined in the database already - if (existingTables.size() <= definedTables.size() - && !existingTables.containsAll(definedTables)) { - return false; - } - return true; + protected String getTableCheckQuery() { + // This intentionally returns a query that will force the tables to be + // recreated + return "SELECT 'alwaysRecreateTables'"; } } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthInitializer.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthInitializer.java index 2a854ad9b8..37f278f2a1 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthInitializer.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/hibernate/HibernateBandwidthInitializer.java @@ -1,13 +1,10 @@ package com.raytheon.uf.edex.datadelivery.bandwidth.hibernate; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; -import org.hibernate.cfg.AnnotationConfiguration; - import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.status.IUFStatusHandler; @@ -29,6 +26,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.interfaces.BandwidthInitializ * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 20, 2013 1543 djohnson Add SW history, separate how to find subscriptions. + * Apr 30, 2013 1960 djohnson just call init rather than drop/create tables explicitly. * * </pre> * @@ -57,19 +55,11 @@ public class HibernateBandwidthInitializer implements BandwidthInitializer { // fulfilled. In the case were DD has been down for a while // BEFORE removing the tables... - // Empty the bandwidth tables (other than BandwidthDataSetUpdate) on - // each start and reload.. - AnnotationConfiguration aConfig = new AnnotationConfiguration(); - aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthSubscription.class); - aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.SubscriptionRetrieval.class); - aConfig.addAnnotatedClass(com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthAllocation.class); - try { - dbInit.dropTables(aConfig); - dbInit.createTables(aConfig); - } catch (SQLException e) { - // Cannot proceed from here.. - return false; + dbInit.init(); + } catch (Exception e1) { + throw new RuntimeException( + "Error generating bandwidth manager tables", e1); } Set<Subscription> activeSubscriptions = Collections.emptySet(); diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.npp.viirs/src/com/raytheon/uf/edex/plugin/npp/viirs/VIIRSDecoder.java b/edexOsgi/com.raytheon.uf.edex.plugin.npp.viirs/src/com/raytheon/uf/edex/plugin/npp/viirs/VIIRSDecoder.java index eaf36f4279..4af307678c 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.npp.viirs/src/com/raytheon/uf/edex/plugin/npp/viirs/VIIRSDecoder.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.npp.viirs/src/com/raytheon/uf/edex/plugin/npp/viirs/VIIRSDecoder.java @@ -62,6 +62,8 @@ import com.vividsolutions.jts.geom.GeometryFactory; * Dec 1, 2011 mschenke Initial creation * Feb 21, 2012 #30 mschenke Changed VIIRS decoder to read time attribute out of record * instead of using WMO header + * May 01, 2013 1962 bsteffen Allow Viirs Decoder to accept numeric + * missing values. * * </pre> * @@ -236,12 +238,27 @@ public class VIIRSDecoder extends AbstractNPPDecoder { for (Attribute attr : var.getAttributes()) { if (MISSING_VALUE_ID.equals(attr.getName())) { - String missing = attr.getStringValue(); - String[] split = missing - .split(MISSING_VALUE_SPLIT_STRING); - missingValues = new float[split.length]; - for (int i = 0; i < split.length; ++i) { - missingValues[i] = Float.parseFloat(split[i]); + if (attr.getDataType().isString()) { + String missing = attr.getStringValue(); + String[] split = missing + .split(MISSING_VALUE_SPLIT_STRING); + missingValues = new float[split.length]; + for (int i = 0; i < split.length; ++i) { + missingValues[i] = Float + .parseFloat(split[i]); + } + } else if(attr.getDataType().isNumeric()){ + if(attr.isArray()){ + missingValues = new float[attr.getLength()]; + for (int i = 0; i < missingValues.length; i += 1) { + missingValues[i] = attr + .getNumericValue(i) + .floatValue(); + } + }else{ + missingValues = new float[] { attr + .getNumericValue().floatValue() }; + } } break; } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.scan/res/scripts/scanIdxs.sql b/edexOsgi/com.raytheon.uf.edex.plugin.scan/res/scripts/scanIdxs.sql new file mode 100644 index 0000000000..c05be4b0e4 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.plugin.scan/res/scripts/scanIdxs.sql @@ -0,0 +1,4 @@ +CREATE INDEX scan_icao_type_idx + ON scan + USING btree + (icao COLLATE pg_catalog."default", type COLLATE pg_catalog."default"); diff --git a/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/PointDataPluginDao.java b/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/PointDataPluginDao.java index ed0d343773..ec0ed9d4d5 100644 --- a/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/PointDataPluginDao.java +++ b/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/PointDataPluginDao.java @@ -70,6 +70,9 @@ import com.raytheon.uf.edex.database.plugin.PluginDao; * Apr 13, 2009 chammack Initial creation * Jan 14, 2013 1469 bkowal Removed the hdf5 data directory. * Apr 15, 2013 1868 bsteffen Rewrite mergeAll in PluginDao. + * Apr 29, 2013 1861 bkowal Refactor hdf5 filename generation during reads + * into its own method so modelsounding dao can + * override it. * * </pre> * @@ -487,19 +490,23 @@ public abstract class PointDataPluginDao<T extends PluginDataObject> extends } bm.putAll(obj); T bean = (T) bm.getBean(); - return this.pluginName - + File.separator - + this.pathProvider.getHDFPath(this.pluginName, - (IPersistable) bean) - + File.separator - + getPointDataFileName(bean).replace(".h5", "") - + DefaultPathProvider.fileNameFormat.get().format( - ((PluginDataObject) bean).getDataTime() - .getRefTime()) + ".h5"; + return this.generatePointDataFileName(bean); } finally { this.beanMapCache.offer(bm); } } + + protected String generatePointDataFileName(T bean) { + return this.pluginName + + File.separator + + this.pathProvider.getHDFPath(this.pluginName, + (IPersistable) bean) + + File.separator + + getPointDataFileName(bean).replace(".h5", "") + + DefaultPathProvider.fileNameFormat.get().format( + ((PluginDataObject) bean).getDataTime() + .getRefTime()) + ".h5"; + } public abstract T newObject(); diff --git a/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/accumulate/AccumDataHandler.java b/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/accumulate/AccumDataHandler.java index 36c8874832..cfcd8b8b08 100644 --- a/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/accumulate/AccumDataHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.pointdata/src/com/raytheon/uf/edex/pointdata/accumulate/AccumDataHandler.java @@ -162,7 +162,7 @@ public class AccumDataHandler implements requestParams.append(request.getTimeParameter()); requestParams.append(","); requestParams.append(request.getStationParameter()); - + query.setParameters(requestParams.toString()); query.addParameter(DATATIME, diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF index 7fb1dcd014..3aff20b79c 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF @@ -26,7 +26,8 @@ Require-Bundle: com.raytheon.uf.common.registry.schemas.ebxml;bundle-version="1. com.google.guava;bundle-version="1.0.0", com.raytheon.uf.common.registry.ebxml, com.raytheon.uf.common.stats;bundle-version="1.0.0", - com.raytheon.uf.common.registry.event;bundle-version="1.0.0" + com.raytheon.uf.common.registry.event;bundle-version="1.0.0", + com.raytheon.uf.edex.database;bundle-version="1.0.0" Export-Package: com.raytheon.uf.edex.registry.ebxml.services.lifecycle, com.raytheon.uf.edex.registry.ebxml.services.query, com.raytheon.uf.edex.registry.ebxml.services.util diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml.xml index e6e8c94b5c..0ea3e20f95 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml.xml @@ -6,8 +6,9 @@ <bean id="ServiceUrlFactory" class="com.raytheon.uf.edex.registry.ebxml.util.ServiceUrlFactory" /> - <bean id="DbInit" class="com.raytheon.uf.edex.registry.ebxml.dao.DbInit"> + <bean id="DbInit" class="com.raytheon.uf.edex.registry.ebxml.dao.DbInit" init-method="initDb"> <constructor-arg ref="lcmServiceImpl" /> + <constructor-arg ref="registryDao" /> </bean> <bean id="registryDao" diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java index 609b624349..4f2540095f 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java @@ -27,10 +27,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.sql.Connection; -import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.List; @@ -44,6 +42,7 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import org.apache.commons.beanutils.PropertyUtils; import org.hibernate.Session; import org.hibernate.cfg.AnnotationConfiguration; +import org.hibernate.dialect.Dialect; import org.hibernate.impl.SessionFactoryImpl; import org.hibernate.jdbc.Work; @@ -71,34 +70,25 @@ import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/9/2012 184 bphillip Initial Coding + * Apr 30, 2013 1960 djohnson Extend the generalized DbInit. * </pre> * * @author bphillip * @version 1 */ -public class DbInit extends RegistryDao { +public class DbInit extends com.raytheon.uf.edex.database.init.DbInit { /** The logger */ - private static final transient IUFStatusHandler statusHandler = UFStatus + private static final IUFStatusHandler statusHandler = UFStatus .getHandler(DbInit.class); /** Query to check which tables exist in the ebxml database */ private static final String TABLE_CHECK_QUERY = "SELECT tablename FROM pg_tables where schemaname = 'public';"; - /** Constant used for table regeneration */ - private static final String DROP_TABLE = "drop table "; - - /** Constant used for table regeneration */ - private static final String DROP_SEQUENCE = "drop sequence "; - - /** Constant used for table regeneration */ - private static final String IF_EXISTS = "if exists "; - - /** Constant used for table regeneration */ - private static final String CASCADE = " cascade "; - private LifecycleManagerImpl lcm; + private final RegistryDao registryDao; + /** * Creates a new instance of DbInit. This constructor should only be called * once when loaded by the Spring container. @@ -106,260 +96,23 @@ public class DbInit extends RegistryDao { * @throws EbxmlRegistryException * If errors occur while regenerating the database tables */ - public DbInit(LifecycleManagerImpl lcm) throws EbxmlRegistryException { - super(null); + public DbInit(LifecycleManagerImpl lcm, RegistryDao registryDao) + throws EbxmlRegistryException { + super("ebxml registry"); this.lcm = lcm; - // try { - initDb(); + this.registryDao = registryDao; } /** - * Initializes the RegRep database. This method compares the existing tables - * in the database to verify that they match the tables that Hibernate is - * aware of. If the existing tables in the database do not match the tables - * Hibernate is expecting, the tables are regenerated. During the - * regeneration process, the minimum database objects are reloaded into the - * database. - * - * @throws EbxmlRegistryException + * {@inheritDoc} */ - private void initDb() throws EbxmlRegistryException { - /* - * Create a new configuration object which holds all the classes that - * this Hibernate SessionFactory is aware of - */ - AnnotationConfiguration aConfig = new AnnotationConfiguration(); - for (Object obj : this.getSessionFactory().getAllClassMetadata() - .keySet()) { - try { - Class<?> clazz = Class.forName((String) obj); - aConfig.addAnnotatedClass(clazz); - } catch (ClassNotFoundException e) { - statusHandler.error( - "Error initializing RegRep database. Class not found: " - + obj, e); - } - } + @Override + protected void executeAdditionalSql() throws Exception { + super.executeAdditionalSql(); - /* - * Check to see if the database is valid. - */ - boolean dbIsValid = true; - try { - dbIsValid = isDbValid(aConfig); - } catch (SQLException e) { - throw new EbxmlRegistryException("Error checking if db is valid!", - e); - } + executeRegistrySql(); - if (dbIsValid) { - // Database is valid. - statusHandler.info("RegRep database is up to date!"); - } else { - // Database is not valid. Drop and regenerate the tables defined by - // Hibernate - statusHandler - .info("RegRep database is out of sync with defined java classes. Regenerating default database tables..."); - statusHandler.info("Dropping existing tables..."); - try { - dropTables(aConfig); - } catch (SQLException e) { - throw new EbxmlRegistryException( - "An unexpected database error occurred while dropping existing RegRep database tables.", - e); - } - statusHandler.info("Recreating tables..."); - try { - createTables(aConfig); - } catch (SQLException e) { - throw new EbxmlRegistryException( - "An unexpected database error occurred while creating RegRep database tables.", - e); - } - - statusHandler.info("Executing additional registry SQL..."); - try { - executeRegistrySql(); - } catch (EbxmlRegistryException e) { - throw new EbxmlRegistryException( - "An unexpected database error occurred while executing additional sql on the registry", - e); - } - - try { - populateDB(); - } catch (SerializationException e) { - throw new EbxmlRegistryException( - "Serialization error populating RegRep database with minDB objects", - e); - } catch (MsgRegistryException e) { - throw new EbxmlRegistryException( - "SubmitObjects encountered an error while populating RegRep database with minDB", - e); - } - statusHandler - .info("RegRep database tables have been successfully regenerated!"); - } - - } - - /** - * Drops the union set of tables defined by Hibernate and exist in the - * database. - * - * @param aConfig - * The Hibernate annotation configuration holding the metadata - * for all Hibernate-aware classes - * @throws SQLException - * If the drop sql strings cannot be executed - * @throws EbxmlRegistryException - */ - private void dropTables(final AnnotationConfiguration aConfig) - throws SQLException, EbxmlRegistryException { - - this.doInTransaction(new RegistryTransactionCallback() { - - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - final String[] dropSqls = aConfig - .generateDropSchemaScript(((SessionFactoryImpl) getSessionFactory()) - .getDialect()); - Statement stmt = connection.createStatement(); - for (String sql : dropSqls) { - if (sql.startsWith(DROP_TABLE)) { - // Modify the drop string to add the 'if exists' - // and - // 'cascade' clauses to avoid any errors if the - // tables - // do not exist already - sql = sql.replace(DROP_TABLE, DROP_TABLE - + IF_EXISTS); - sql += CASCADE; - stmt.execute(sql); - connection.commit(); - } else if (sql.startsWith(DROP_SEQUENCE)) { - // Modify the drop string to add the 'if exists' - // and - // 'cascade' clauses to avoid any errors if the - // tables - // do not exist already - sql = sql.replace(DROP_SEQUENCE, DROP_SEQUENCE - + IF_EXISTS); - sql += CASCADE; - stmt.execute(sql); - connection.commit(); - } - - } - } - }); - return null; - } - }); - - } - - /** - * Creates the database tables based on the Class metadata that Hibernate is - * aware of - * - * @param aConfig - * The Hibernate annotation configuration holding the metadata - * for all Hibernate-aware classes - * @throws SQLException - * If the drop sql strings cannot be executed - * @throws EbxmlRegistryException - */ - private void createTables(final AnnotationConfiguration aConfig) - throws SQLException, EbxmlRegistryException { - - this.doInTransaction(new RegistryTransactionCallback() { - - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - final String[] createSqls = aConfig - .generateSchemaCreationScript(((SessionFactoryImpl) getSessionFactory()) - .getDialect()); - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - Statement stmt = connection.createStatement(); - for (String sql : createSqls) { - stmt.execute(sql); - connection.commit(); - } - - } - }); - return null; - } - }); - - } - - /** - * Checks to see if the database is valid. The RegRep database is considered - * to be valid if the set of tables defined by Hibernate contains the set of - * tables already in existance in the database - * - * @param aConfig - * The Hibernate annotation configuration holding the metadata - * for all Hibernate-aware classes - * @return True if the database is valid, else false - * @throws SQLException - * If the drop sql strings cannot be executed - * @throws EbxmlRegistryException - */ - private boolean isDbValid(AnnotationConfiguration aConfig) - throws SQLException, EbxmlRegistryException { - statusHandler.info("Verifying RegRep database..."); - final List<String> existingTables = new ArrayList<String>(); - List<String> definedTables = new ArrayList<String>(); - this.doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - Statement stmt = connection.createStatement(); - ResultSet results = stmt - .executeQuery(TABLE_CHECK_QUERY); - while (results.next()) { - existingTables.add(results.getString(1)); - } - } - }); - return null; - } - }); - - final String[] dropSqls = aConfig - .generateDropSchemaScript(((SessionFactoryImpl) getSessionFactory()) - .getDialect()); - for (String sql : dropSqls) { - if (sql.startsWith(DROP_TABLE)) { - // Drop the table names to all lower case since this is the form - // the database expects - definedTables.add(sql.replace(DROP_TABLE, "").toLowerCase()); - } - } - - // Check if the table set defined by Hibernate matches the table set - // defined in the database already - if (existingTables.size() <= definedTables.size() - && !existingTables.containsAll(definedTables)) { - return false; - } - return true; + populateDB(); } /** @@ -388,9 +141,9 @@ public class DbInit extends RegistryDao { statusHandler.info("Populating RegRep database from file: " + fileList[i].getName()); - SubmitObjectsRequest obj = null; - obj = (SubmitObjectsRequest) SerializationUtil - .jaxbUnmarshalFromXmlFile(fileList[i]); + SubmitObjectsRequest obj = SerializationUtil + .jaxbUnmarshalFromXmlFile(SubmitObjectsRequest.class, + fileList[i]); // Ensure an owner is assigned for (RegistryObjectType regObject : obj.getRegistryObjectList() @@ -403,7 +156,6 @@ public class DbInit extends RegistryDao { } } - // try { RegistrySessionManager.openSession(); try { lcm.submitObjectsInternal(obj); @@ -449,21 +201,13 @@ public class DbInit extends RegistryDao { while ((line = reader.readLine()) != null) { buffer.append(line); } - this.doInTransaction(new RegistryTransactionCallback() { + executeWork(new Work() { @Override - public Object execute(Session session) - throws EbxmlRegistryException { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - Statement stmt = connection - .createStatement(); - stmt.execute(buffer.toString()); - connection.commit(); - } - }); - return null; + public void execute(Connection connection) + throws SQLException { + Statement stmt = connection.createStatement(); + stmt.execute(buffer.toString()); + connection.commit(); } }); } catch (Exception e) { @@ -535,6 +279,66 @@ public class DbInit extends RegistryDao { } } + /** + * {@inheritDoc} + */ + @Override + protected void executeWork(final Work work) { + try { + registryDao.doInTransaction(new RegistryTransactionCallback() { + @Override + public Object execute(Session session) + throws EbxmlRegistryException { + session.doWork(work); + return null; + } + }); + } catch (EbxmlRegistryException e) { + throw new RuntimeException(e); + } + } + + /** + * {@inheritDoc} + */ + @Override + protected AnnotationConfiguration getAnnotationConfiguration() { + /* + * Create a new configuration object which holds all the classes that + * this Hibernate SessionFactory is aware of + */ + AnnotationConfiguration aConfig = new AnnotationConfiguration(); + for (Object obj : registryDao.getSessionFactory().getAllClassMetadata() + .keySet()) { + try { + Class<?> clazz = Class.forName((String) obj); + aConfig.addAnnotatedClass(clazz); + } catch (ClassNotFoundException e) { + statusHandler.error( + "Error initializing RegRep database. Class not found: " + + obj, e); + } + } + return aConfig; + } + + /** + * {@inheritDoc} + */ + @Override + protected Dialect getDialect() { + return ((SessionFactoryImpl) registryDao.getSessionFactory()) + .getDialect(); + } + + /** + * {@inheritDoc} + */ + @Override + protected String getTableCheckQuery() { + return TABLE_CHECK_QUERY; + } + public LifecycleManagerImpl getLcm() { return lcm; } @@ -542,5 +346,4 @@ public class DbInit extends RegistryDao { public void setLcm(LifecycleManagerImpl lcm) { this.lcm = lcm; } - } diff --git a/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id b/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id deleted file mode 100644 index e2f9cec5c8..0000000000 --- a/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -19110f42806e0a8013fb465f0397de4147d8e17d \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/ASOS_smDecoder b/nativeLib/files.native/adapt/climate/bin/Linux/ASOS_smDecoder new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/ASOS_smDecoder @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/ASOS_smDecoder.sh b/nativeLib/files.native/adapt/climate/bin/Linux/ASOS_smDecoder.sh new file mode 100755 index 0000000000..e215ae82e1 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/ASOS_smDecoder.sh @@ -0,0 +1,52 @@ +#!/bin/sh +############################################################################# +# +# script: ASOS_smDecoder +# +# Purpose: executes the program which decodes the ASOS Daily or Monthly +# Summary Message for daily climate data +# +# Author: David T. Miller PRC/TDL +# +# Date created: 6/16/99 +# +# Modification History: +# +# 12/05/2002 OB2 Bob Morris - Incorporated CLIMATE_BIN_DIR from envir. +# - Fixed -a tests, use -f and -x +# +############################################################################# + +# operations - set environmental files for Informix +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh + + +if [ -f /tmp/ASOS_SM_tmp.txt ] +then + rm -f /tmp/ASOS_SM_tmp.txt +fi + + +if [ ! -x ${CLIMATE_BIN_DIR}/ASOS_smDecoder ] +then + echo "The ASOS DSM or MSM decoder not executable or does not exist!" >> /tmp/ASOS_SM_tmp.txt + echo "Halting script execution...." + exit 1 +else + echo "ASOS Summary Message Decoder starting...." >> /tmp/ASOS_SM_tmp.txt + echo $1 >> /tmp/ASOS_SM_tmp.txt + ${CLIMATE_BIN_DIR}/ASOS_smDecoder $1 >> /tmp/ASOS_SM_tmp.txt + decode_status=$? + case $decode_status in + 0) + echo "The ASOS Summary Message Decoder returned a value of 0" >> /tmp/ASOS_SM_tmp.txt + ;; + *) + echo "The ASOS Summary Message Decoder returned a value of $decode_status" >> /tmp/ASOS_SM_tmp.txt + exit $decode_status + ;; + esac +fi + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/_main.sh b/nativeLib/files.native/adapt/climate/bin/Linux/_main.sh new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/_main.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/build_f6 b/nativeLib/files.native/adapt/climate/bin/Linux/build_f6 new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/build_f6 @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/catRecordClimateData.sh b/nativeLib/files.native/adapt/climate/bin/Linux/catRecordClimateData.sh new file mode 100755 index 0000000000..2304435260 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/catRecordClimateData.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# +# ----------------------------------------------------------------------------- +# File: catRecordClimateData.sh +# +# First, checks that recordClimate is running. If not, this script will hang! +# +# If running, then checks to see if the pipe and data files exist. +# If so, then pipes the RecordClimate data files to the pipe files, which will +# feed the recordClimate program. Otherwise, exits with an error message +# written to the log file for the current climate run. +# +# +# Modification History: +# +# 12/05/2002 OB2 Bob Morris Use ~/climate/tmp not ~/adapt_apps/tmp +# 02/03/2003 OB2 Bob Morris Modified pid logic, error messages, takes +# log file argument, use default otherwise. +# +# Note: If error messages are modified, climate.sh and display.sh may need +# to be modified. They "grep" the log file for errors from this script. +# +# ----------------------------------------------------------------------------- + +if [ $# = 1 ] +then + LOGFILE2=$1 +else + LOGFILE2=/awips/adapt/climate/tmp/tmp.txt + echo "catRecordClimateData.sh: Using default log file $LOGFILE2" >> $LOGFILE2 +fi + +# Set the following so that `ps -eo pid,args ...` below works in HP-UX. +export UNIX95=1 + +pid=`ps -eo pid,args | grep -E 'adapt[/].*recordClimate' | awk '{print $1}'` + +echo "" >> $LOGFILE2 +echo "recordClimate process ID on DS = $pid" >> $LOGFILE2 + +if [ "$pid" != "" ] +then + + if [ ! -p /awips/adapt/climate/tmp/RecordClimateRawData.dat -o ! -p /awips/adapt/climate/tmp/RecordClimateStationInfo.dat ] + then + echo "" >> $LOGFILE2 + echo "***************************************************************" >> $LOGFILE2 + echo "* WARNING! recordClimate cannot run! Pipe files do not exist! *" >> $LOGFILE2 + echo "***************************************************************" >> $LOGFILE2 + exit 1 + fi + + if [ -p /awips/adapt/climate/tmp/RecordClimateRawData.dat -a -p /awips/adapt/climate/tmp/RecordClimateStationInfo.dat -a \ + -f /awips/adapt/climate/tmp/RecordClimateRawData1.dat -a -f /awips/adapt/climate/tmp/RecordClimateStationInfo1.dat ] + then + cat /awips/adapt/climate/tmp/RecordClimateRawData1.dat >> /awips/adapt/climate/tmp/RecordClimateRawData.dat + cat /awips/adapt/climate/tmp/RecordClimateStationInfo1.dat >> /awips/adapt/climate/tmp/RecordClimateStationInfo.dat + exit 0 + fi + +else + echo "" >> $LOGFILE2 + echo "*********************************************" >> $LOGFILE2 + echo "* WARNING! recordClimate not running on ds! *" >> $LOGFILE2 + echo "*********************************************" >> $LOGFILE2 +fi + +exit 1 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/clean_up.sh b/nativeLib/files.native/adapt/climate/bin/Linux/clean_up.sh new file mode 100755 index 0000000000..bc4a8cbcac --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/clean_up.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +############################################################################## +# +# This is the (obsolete?) script to execute the morning climate summary. +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Changed from csh to sh +# - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.csh. +# - General cleanup. +############################################################################## +# +# Set the paths +# +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR + +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +# +# Clean up the old files +# +rm -f ${CLIMATE_TMP_DIR}/*_$1_* >> ${CLIMATE_DIR}/tmp.txt + +rm -f ${CLIMATE_TMP_DIR}/*_$1 >> ${CLIMATE_DIR}/tmp.txt + +rm -f ${CLIMATE_TMP_DIR}/global_day >> ${CLIMATE_DIR}/tmp.txt + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/climate b/nativeLib/files.native/adapt/climate/bin/Linux/climate new file mode 100755 index 0000000000..f924983656 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/climate @@ -0,0 +1,29 @@ +#!/bin/sh + +############################################################################## +# +# This is the script to execute the main climate GUI. +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Changed from csh to sh +# - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.csh. General cleanup. +# +############################################################################## +# +# Set the paths +# + +. $(dirname $0)/set_climate_env.sh + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +# +# Change the directory to the temporary climate directory +# +cd ${CLIMATE_TMP_DIR} +exec ${CLIMATE_BIN_DIR}/do_all_climate & + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/climate.sh b/nativeLib/files.native/adapt/climate/bin/Linux/climate.sh new file mode 100755 index 0000000000..27dbaed733 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/climate.sh @@ -0,0 +1,583 @@ +#!/bin/sh +# +############################################################################## +# +# This is the script to execute the public climate summaries. +# +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. General cleanup. +# - Replace -a's in tests. +# - Replace /adapt_apps/ with /climate/ +# - Set env vars. IFPS_SITE_OFFICE_NAME +# and IFPS_SITE_TIMEZONE for format_cli. +# - Rewrote the wait_times logic. +# 01/27/2003 OB2 Bob Morris - Fix path to catRecordClimateData.sh +# - Made killpid work in both BASH, HP +# 02/03/2003 OB2 Bob Morris - Modified recordClimate remsh/rsh logic, +# and pass log file as argument. +# 02/11/2003 OB2 Bob Morris - Modified ifps env vars set logic, strip +# quotes from IFPS_SITE_OFFICE_NAME +# 02/21/2003 OB2 Bob Morris - Modified/added chmod logic for tmp files +# 03/28/2003 OB2 Bob Morris - Fix env var ID for IFPS_SITE_OFFICE_NAME +# and modified recordClimate logic/messages +# 04/03/2003 OB2 Bob Morris - Set format_flag to 1 if manual run to +# allow format_climate to put up Edit +# Climate Product notification. +# 11/14/2003 OB4 Manan Dalal - Removed all r-commands such as rsh. +# 07/20/2004 OB5 Manan Dalal - Removed execution of catRecordClimateData.sh +# Pipe files for RecordClimate are removed +# and format_climate will call recordClimate +# instead now. +############################################################################## + +. $(dirname $0)/set_climate_env.sh + +cd $(dirname $0) + +# Set the following so that `ps -eo pid,args ...` in killpid works in HP-UX. +export UNIX95=1 + +# +# This function will kill the process id of the "Climate is Running" gui +# (wait.tcl). It is used throughout the scripts. +# +function killpid { +pid_func=`ps -eo pid,args | grep -E 'wish[ ].*wait.tcl' | awk '{print $1}'` +#echo "pid_func in killpid is $pid_func" +if test "$pid_func" != "" +then + kill $pid_func 2> /dev/null 1> /dev/null +fi +} + +# +# Set the file path environment variables +# + +if [ "$CLIMATE_DIR" = "" ] +then + echo "Fatal error in climate.sh: CLIMATE_DIR not defined in environment! Exiting." + exit 1 +fi + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting climate.sh script execution .... " + exit 1 +fi + +if [ ! -d ${CLIMATE_TMP_DIR} ] +then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting climate.sh script execution .... " + exit 1 +fi + +# +# This starts the running clock GUI (wait.tcl) if it's a manual run. +# If it's automatic run, it will start in display climate. +# + +if test "$1" != "auto" +then + ./wait.tcl & +fi + +# +# Set wait.tcl's process id to a variable 'pid'. +# +pid=`ps -ef| grep wait| grep bin| awk '{print $2}'` + +# +# Change to the temporary climate directory. +# +cd ${CLIMATE_TMP_DIR} + +LOGFILE=${CLIMATE_TMP_DIR}/tmp.txt + +# if old temporary script log file is there, delete it +if [ -f $LOGFILE ] +then + rm -f $LOGFILE +fi + +# Remove all other CLIMATE_TMP_DIR files. +rm -f ${CLIMATE_TMP_DIR}/* + +# +# create temporary new log file for climate script/exe output +# +echo "Log file for climate.sh $1 $2 run on = `date` " > $LOGFILE +echo "" >> $LOGFILE +chmod 777 $LOGFILE + +# +# Check that environment variable for path to climate executables is set +# +if [ "$CLIMATE_BIN_DIR" = "" ] +then + echo "In climate.sh: CLIMATE_BIN_DIR not defined in environment! Exiting." >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 +else + echo "In climate.sh: CLIMATE_BIN_DIR = $CLIMATE_BIN_DIR " >> $LOGFILE +fi + +# +# Create new period.txt temp file holding AM or PM for the monitor controller. +# +echo "$1 $2" > period.txt +chmod 777 period.txt + +# +# Test to see if the the hmMonitor is running (?) +# + +# +# Set the waiting times for create_climate and format_climate. The waiting +# times determine the amount of time the notification server will wait before +# sending back a message that the user didn't acknowledge the alert. +# +fileok="true" +if [ -s ${CLIMATE_DATA_DIR}/wait_times.txt ] +then + if [ `wc -w <${CLIMATE_DATA_DIR}/wait_times.txt` -eq 2 ] + then + echo "Reading from ${CLIMATE_DATA_DIR}/wait_times.txt" >> $LOGFILE + read wait1 wait2 < ${CLIMATE_DATA_DIR}/wait_times.txt + echo "wait1, wait2 = ${wait1}, ${wait2} after file read." >> $LOGFILE + if [ ${wait1} -ge 0 -a ${wait2} -ge 0 ] + then + export DATA_WAIT_TIME=$wait1 + export PRODUCT_WAIT_TIME=$wait2 + echo "data wait = $DATA_WAIT_TIME" >> $LOGFILE + echo "product wait = $PRODUCT_WAIT_TIME" >> $LOGFILE + else + echo "Warning: Improper entries in wait_times.txt file." >> $LOGFILE + echo "Must contain exactly two positive integer values." >> $LOGFILE + fileok="false" + fi + else + echo "Warning: Improper number of entries in wait_times.txt file." >> $LOGFILE + echo "Must contain exactly two positive integer values." >> $LOGFILE + fileok="false" + fi +else + echo "Problem: ${CLIMATE_DATA_DIR}/wait_times.txt file not found." >> $LOGFILE + fileok="false" +fi + +if [ "$fileok" = "false" ] +then + echo "Reverting to default times of 20 and 10 minutes:" >> $LOGFILE + DATA_WAIT_TIME=20 + export DATA_WAIT_TIME + PRODUCT_WAIT_TIME=10 + export PRODUCT_WAIT_TIME + echo "data wait = $DATA_WAIT_TIME" >> $LOGFILE + echo "product wait = $PRODUCT_WAIT_TIME" >> $LOGFILE +fi + +# +# Copy the global file if it exists. Notify the user and bail out if it doesn't. +# + +if [ -s ${CLIMATE_DATA_DIR}/global_day ] +then + echo "Copying ${CLIMATE_DATA_DIR}/global_day" >> $LOGFILE + cp ${CLIMATE_DATA_DIR}/global_day ${CLIMATE_TMP_DIR} +else + echo "Missing or empty ${CLIMATE_DATA_DIR}/global_day file." >> $LOGFILE + echo "Halting script execution ..... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 +fi + +# +# Check and run create_climate executable +# +echo "Starting create_climate ....... " >> $LOGFILE + +# Make sure that the create_climate executable exists .... + +if [ ! -s ${CLIMATE_BIN_DIR}/create_climate ] +then + echo "${CLIMATE_BIN_DIR}/create_climate executable does not exist!" >> $LOGFILE + echo "Halting climate.sh script execution .... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/create_climate ] + then + echo "${CLIMATE_BIN_DIR}/create_climate does not have execute permission!" >> $LOGFILE + echo "Halting climate.sh script execution .... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + fi +fi + +${CLIMATE_BIN_DIR}/create_climate $1 $2 >> $LOGFILE 2>> $LOGFILE + +# Test the return status of this routine + +create_status=$? + +case $create_status in + 0) + # Successful run of create_climate, and either data wait is 0, + # or user responded to Edit Climate Data notification. + # Must make a decision what to do here - continue or exit. + # + # If the data wait time is 0, we want to continue in this + # script with display_climate, but without bringing + # up its GUI. Otherwise, this script should exit, + # since control has been given to the script + # display.sh based on user response to notification. + # + echo "create_climate returned a value of 0." >> $LOGFILE + + if test "$1" != "auto" + then + killpid + fi + + if [ ${DATA_WAIT_TIME} -eq 0 ] + then + # Treat this situation the same as a notification timeout. + # Must reset create_status to non-zero for use as arg in call + # to display_climate, to prevent displaying the editor. + # + echo "DATA_WAIT_TIME is 0 -- continuing in climate.sh w/o data editor." >> $LOGFILE + create_status=1 + else + ############################################################## + # Control will go over to display.sh, climate.sh exiting. + # + # But first set write permissions on all files in tmp directory + # except RecCli pipes. + ############################################################## + + ls * | grep -v .dat | + while read fn + do + chmod a+w $fn + done + + exit 0 + fi + ;; + 1) + # Successful run where wait > 0, but notification timed out without + # user response. Must continue in climate.sh w/o data editor. + # + echo "create_climate returned a value of 1." >> $LOGFILE + echo "Continuing in climate.sh w/o displaying data editor." >> $LOGFILE + if test "$1" != "auto" + then + killpid + fi + ;; + 3) + # Some kind of error occurred in create_climate. + echo "create_climate returned a value of 3." >> $LOGFILE + echo "Halting the execution of climate.sh script." >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + ;; + 4) + echo "create_climate returned a value of 4." >> $LOGFILE + echo "User pressed Cancel during manual run." >> $LOGFILE + echo "Halting the execution of climate.sh script." >> $LOGFILE + if test "$1" != "auto" + then + killpid + fi + exit 1 + ;; + *) + echo "create_climate returned an unexpected value of $create_status." + echo "Halting the execution of climate.sh script." >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + ;; +esac + + +# If here, then create_status is not 0, so run display_climate without the GUI. +# Otherwise, this script should have exited above, and all the following +# would have been done by display.sh script called from hmMonitor.tcl. + +echo "Starting display_climate in climate.sh $1 $2 ....... " >> $LOGFILE + +# Make sure that the display_climate executable exists and can be run. + +if [ ! -s ${CLIMATE_BIN_DIR}/display_climate ] +then + echo "${CLIMATE_BIN_DIR}/display_climate executable does not exist!" >> $LOGFILE + echo "Halting climate.sh script execution .... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 +else + if [ ! -x ${CLIMATE_BIN_DIR}/display_climate ] + then + echo "${CLIMATE_BIN_DIR}/display_climate does not have execute permission!" >> $LOGFILE + echo "Halting climate.sh script execution .... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + fi +fi + +${CLIMATE_BIN_DIR}/display_climate $1 $2 $create_status >> $LOGFILE 2>>$LOGFILE + +# Make sure that display_climate did its thing correctly + +if [ $? -ne 0 ] +then + echo "display_climate returned an error in climate.sh. Stopping execution. " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 +fi + +echo "Returned from display_climate in climate.sh $1 $2, continuing..." >> $LOGFILE +echo "" >> $LOGFILE + +# Copy the files generated by set_up_climate + +cp -i ${CLIMATE_DATA_DIR}/*_$2_* ${CLIMATE_TMP_DIR} + +if [ $? -ne 0 ] +then + echo "The copy of the files generated by set_up_climate failed in climate.sh" >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + + exit 1 +fi + +# +# Check to see if the new ifps-ccc.env site file exists and if so, extract the +# necessary environment variables and set them for climate. If unavailable, +# notify user and log errors. +# +echo "Getting WFO Name and local Time Zone from IFPS file." >> $LOGFILE +ifpsfile="/awips/adapt/ifps/localbin/ifps-${ICWF_SITE}.env" +ourcopy="${CLIMATE_TMP_DIR}/ifps-${ICWF_SITE}.env" +haveifps="true" + +if [ -s $ifpsfile ] +then + export IFPS_SITE_OFFICE_NAME + export IFPS_SITE_TIMEZONE + cp $ifpsfile $ourcopy + IFPS_SITE_OFFICE_NAME=`grep "IFPS_SITE_OFFICE_NAME=" $ourcopy | cut -f2 -d= | sed -e "s/\"//g" | sed -e "s/'//g"` + echo "IFPS_SITE_OFFICE_NAME = $IFPS_SITE_OFFICE_NAME" >> $LOGFILE + IFPS_SITE_TIMEZONE=`grep "IFPS_SITE_TIMEZONE=" $ourcopy | cut -f2 -d=` + echo "IFPS_SITE_TIMEZONE = $IFPS_SITE_TIMEZONE" >> $LOGFILE + echo "" >> $LOGFILE + + if [ "$IFPS_SITE_OFFICE_NAME" = "" -o "$IFPS_SITE_TIMEZONE" = "" ] + then + echo "WARNING! IFPS_SITE_OFFICE_NAME and/or IFPS_SITE_TIMEZONE not defined in file:" >> $LOGFILE + echo " ${ifpsfile}" >> $LOGFILE + echo "NWWS Climate products will have wrong time zone and/or WFO name!" >> $LOGFILE + echo "" >> $LOGFILE + haveifps="false" + fi +else + haveifps="false" + echo "" >> $LOGFILE + echo "IFPS environment file $ifpsfile not found." >> $LOGFILE + echo "NWWS Climate products will have wrong time zone and/or WFO name!" >> $LOGFILE + echo "" >> $LOGFILE +fi + +# Make sure the format climate executable exists and has execute permission. + +if [ ! -s ${CLIMATE_BIN_DIR}/format_climate ] +then + echo "${CLIMATE_BIN_DIR}/format_climate executable does not exist!" >> $LOGFILE + echo "Halting script execution .... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/format_climate ] + then + echo "${CLIMATE_BIN_DIR}/format_climate does not have execute permission!" >> $LOGFILE + echo "Halting script execution .... " >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + fi +fi + +# Run format climate + +echo "" >> $LOGFILE + +if test "$1" != "auto" +then + format_flag=1 + echo "Manual run, allowing Edit Product Data notification in format_climate," >> $LOGFILE + echo "contingent on PRODUCT_WAIT_TIME being non-zero." >> $LOGFILE +else + format_flag=0 + echo "Auto run, disallowing Edit Product Data notification in format_climate" >> $LOGFILE + echo "since no DISPLAY available to climate processes running on DS." >> $LOGFILE +fi + +echo "format_flag is $format_flag in climate.sh" >> $LOGFILE +echo "Starting format_climate in climate.sh $1 $2 ....... " >> $LOGFILE +echo "" >> $LOGFILE + +${CLIMATE_BIN_DIR}/format_climate $1 $2 $format_flag 0 >> $LOGFILE 2>&1 + +format_status=$? + +echo "" >> $LOGFILE +echo "Returned from format_climate in climate.sh" >> $LOGFILE +echo "" >> $LOGFILE + +# Set write permissions on all files in tmp directory + +ls * | grep -v .dat | + while read fn + do + chmod a+w $fn + done + +echo "Climate has completed its run. Reporting status:" >> $LOGFILE +echo "" >> $LOGFILE + +# Check to make sure that format_climate ran to completion +# +case $format_status in + 0) + echo "format_climate returned a value of 0, for success." >> $LOGFILE + echo "RecordClimate also returned a value of 0, for success." >> $LOGFILE + + # Delete the two temporary .dat files used for RecordClimate + rm -f ${CLIMATE_TMP_DIR}/*.dat + + if [ "$haveifps" = "false" ] + then + echo "However, IFPS environment file problems were encountered, see preceding messages." >> $LOGFILE + echo "Climate exiting with a report of an error due to this situation." >> $LOGFILE + fi + + if test "$1" != "auto" + then + if [ "$haveifps" = "false" ] + then + $CLIMATE_BIN_DIR/error.tcl & + else + success.tcl & + fi + killpid + fi + ;; + 1) + echo "format_climate returned a value of 1. This means the program" >> $LOGFILE + echo "encountered an invalid input argument, was aborted by user, or" >> $LOGFILE + echo "had problems invoking a non-climate process." >> $LOGFILE + echo " - Check the format_climate log file for details." >> $LOGFILE + + if [ "$haveifps" = "false" ] + then + echo "Also, IFPS environment file problems were encountered, see preceding messages." >> $LOGFILE + echo "Climate exiting with a report of an error due to this situation." >> $LOGFILE + fi + + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + ;; + 3) + echo "format_climate returned a value of 3, fatal database (dis)connect error." >> $LOGFILE + echo "Halting the execution of climate.sh script." >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + ;; + 5) + echo "format_climate ran successfully, but RecordClimate returned errors within format_climate.">>$LOGFILE + echo "Please see logfile for recordClimate under ${LOG_FILE}">>$LOGFILE + + rm -f ${CLIMATE_TMP_DIR}/*.dat + + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + ;; + *) + echo "format_climate returned an unexpected value of $create_status." >> $LOGFILE + echo "Halting the execution of climate.sh script." >> $LOGFILE + if test "$1" != "auto" + then + $CLIMATE_BIN_DIR/error.tcl & + killpid + fi + exit 1 + ;; +esac + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/climate_man b/nativeLib/files.native/adapt/climate/bin/Linux/climate_man new file mode 100755 index 0000000000..44f80a8b2b --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/climate_man @@ -0,0 +1,85 @@ +#!/bin/csh +# This is the script to execute the morning climate +# summary. + +#setenv DB_VERIFICATION verify41 +#setenv INFORMIXDIR /opt/informix +#setenv INFORMIXSERVER ONLINE +#setenv DBSERVERNAME ONLINE + +# Set the paths + +#echo ${CLIMATE_DIR} > tmp.txt + +set CLIMATE_DATA_DIR=${CLIMATE_DIR}/data + +#echo ${CLIMATE_DATA_DIR} >> tmp.txt + +set CLIMATE_BIN_DIR=${CLIMATE_DIR}/bin + +#echo ${CLIMATE_BIN_DIR} >> tmp.txt + +set CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp + +####################################### +# +# Change the directory to the temporary +# climate directory + +cd ${CLIMATE_TMP_DIR} + +####################################### +# Set the waiting times for the +# create_climate and format_climate. +# The waiting times determine the amount +# of time the notification server will +# wait before sending back a message that +# the user didn't acknowledge the alert. + +setenv DATA_WAIT_TIME 200 + +setenv PRODUCT_WAIT_TIME 100 + +# Copy the default versions of the main control +# file for the morning run from the data directory +# to the bin directory + +# Copy the control file if it exists. Notify the user +# if it doesn't + +if (-e ${CLIMATE_DATA_DIR}/control_am) then + echo "Copying "${CLIMATE_DATA_DIR}/control_am >> tmp.txt + cp ${CLIMATE_DATA_DIR}/control_am ${CLIMATE_TMP_DIR} +else + echo "Problems with ${CLIMATE_DATA_DIR}/control_am in the climate/data directory" >> tmp.txt +endif + + +# Run create_climate + +echo "Starting create_climate" >> tmp.txt + +${CLIMATE_BIN_DIR}/create_climate auto am >> tmp.txt + +echo "Starting display_climate" >> tmp.txt + +#display_climate auto am $status +${CLIMATE_BIN_DIR}/display_climate auto am >> tmp.txt + +# Copy the files generated by set_up_climate from +# the data directory to the bin directory. These +# are necessary to run format_climate + +cp ${CLIMATE_DATA_DIR}/*_am_* ${CLIMATE_TMP_DIR} + +# Run format climate + +echo "Starting format_climate" >> tmp.txt + +${CLIMATE_BIN_DIR}/format_climate auto am >> tmp.txt + + +# Remove all temporary files from the tmp directory + +#clean_up_am + diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/create_climate b/nativeLib/files.native/adapt/climate/bin/Linux/create_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/create_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/create_f6_product b/nativeLib/files.native/adapt/climate/bin/Linux/create_f6_product new file mode 100755 index 0000000000..608b7d7e13 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/create_f6_product @@ -0,0 +1,422 @@ +#!/bin/sh + +############################################################################## +# +# This is the script to create and wire f6 products +# for the climate program. +# +# Modification History: +# --------------------- +# 12/06/2002 OB2 Bob Morris - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. General cleanup. +# - Replace -a's in tests. +# - Call "error.tcl &" if error in man. run +# 01/27/2003 OB2 Bob Morris Changes so kill pid works for BASH and HP. +# 02/28/2003 OB2 Bob Morris - Leave RecCli pipe files alone when +# deleting old files from CLIMATE_TMP_DIR. +# - Add tests/messages for f6 return status +# - Add chmod block for tmp files at exit +# +# 12/13/2005 OB7 Greg Zylstra Added transmitting F-6s over WAN by +# incorporating the script transmit_F6.sh +# created by Virgil Middendorf. +# +############################################################################## +# +# Cannot have gui's for automatic (cron) run. Automatic run corresponds +# to $1=0. +no_gui=$1 + +# +# Set up the environment for generating and sending the F6 forms. +# FXA_HOME needs to be defined before we can proceed. +# +FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh + +# +# Determine the directory containing the logs of +# build_f6 and handleOUP runs. +# +day=`date +%Y%m%d` +case "$HOST" +in + ws* | lx* ) + dsplywin=$DISPLAY + [ "$dsplywin" = "" ] && dsplywin=":0" + logdir=${LOG_DIR}/display/${dsplywin}/${day};; + * ) + logdir=${LOG_DIR}/${day};; +esac + +# +# Perform some gui stuff if manual run. +# +if [ "$no_gui" != "0" ] +then + # Set the following so that `ps -eo pid,args ...` in killpid works in HP-UX. + export UNIX95=1 + # + # This function will kill the process id of the "Climate is Running" gui + # (wait.tcl). It is used throughout the scripts. + # + function killpid { + pid_func=`ps -eo pid,args | grep -E 'wish[ ].*wait.tcl' | awk '{print $1}'` + if test "$pid_func" != "" + then + kill $pid_func 2> /dev/null 1> /dev/null + fi + } + + # + # Kill the prior "Climate has completed successfully" icon, if present. + # + succpid_func=`ps -eo pid,args | grep -E 'wish[ ].*success.tcl' | awk '{print $1}'` + if test "$succpid_func" != "" + then + kill $succpid_func 2> /dev/null 1> /dev/null + fi + unset succpid_func +fi + +# +# Set the file path environment variables +# +if [ "$CLIMATE_DIR" = "" ] +then + echo "Fatal error in create_f6_product: CLIMATE_DIR not defined in environment!" + echo "Exiting script." + exit 1 +fi + +# CLIMATE_BIN_DIR is defined already from sourcing the readenv shell script. +# Assume it exists, since this file is called from executables in that directory. +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +#if [ ! -d ${CLIMATE_BIN_DIR} ] +#then +# echo "Directory ${CLIMATE_BIN_DIR} does not exist." +# echo "Check installation and setup of Climate routines." +# echo "Halting create_f6_product script execution .... " +# exit 1 +#fi + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting create_f6_product script execution .... " + exit 1 +fi + +if [ ! -d ${CLIMATE_TMP_DIR} ] +then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting create_f6_product script execution .... " + exit 1 +fi + +# +# Clean the climate tmp directory. +# Change to the temporary climate directory and clean out previous run's files, +# making sure to leave the RecordClimate*.dat files in place +# +cd ${CLIMATE_TMP_DIR} +ls * | grep -v .dat | + while read fn + do + rm -f $fn + done + +# Remove old run's RecordClimate*1.dat regular files, which leaves only the +# RecordClimate pipe files in CLIMATE_TMP_DIR +# + if [ -f ${CLIMATE_TMP_DIR}/RecordClimateRawData1.dat ] + then + rm ${CLIMATE_TMP_DIR}/RecordClimateRawData1.dat + fi + + if [ -f ${CLIMATE_TMP_DIR}/RecordClimateStationInfo1.dat ] + then + rm ${CLIMATE_TMP_DIR}/RecordClimateStationInfo1.dat + fi + + +# This starts the running clock GUI (wait.tcl) if it's a manual run. +# If it's an automatic (cron) run, it will not appear. + +if [ "$no_gui" != "0" ] +then + wait.tcl & +fi + +# +# Set up local log file +# +LOGFILE=${CLIMATE_TMP_DIR}/tmp.txt +echo "Create F6 Products run date/time: `date`" > $LOGFILE + +# +# Make sure that an executable build_f6 exists .... +# +if [ ! -s ${CLIMATE_BIN_DIR}/build_f6 ] +then + echo "${CLIMATE_BIN_DIR}/build_f6 executable does not exist!" >> $LOGFILE + echo "Halting create_f6_product script execution .... " >> $LOGFILE + if [ "$no_gui" != "0" ] + then + error.tcl & + killpid + fi + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/build_f6 ] + then + echo "${CLIMATE_BIN_DIR}/build_f6 does not have execute permission!" >> $LOGFILE + echo "Halting create_f6_product script execution .... " >> $LOGFILE + if [ "$no_gui" != "0" ] + then + error.tcl & + killpid + fi + exit 1 + fi +fi + +# +# Make sure that the executable textdb exists .... +# +# comment out this section as this function is done +# within build_f6. build_f6 stores nnnLCDmmm and CF6nnn +# in the text database, where nnn is the icao_id and mmm +# is the first three letters of the month's name. +# +#if [ ! -s ${FXA_HOME}/bin/textdb ] +#then +# echo "${FXA_HOME}/bin/textdb executable does not exist!" >> $LOGFILE +# echo "Halting create_f6_product script execution .... " >> $LOGFILE +# if [ "$no_gui" != "0" ] +# then +# error.tcl & +# killpid +# fi +# exit 1 +#else if [ ! -x ${FXA_HOME}/bin/textdb ] +# then +# echo "${FXA_HOME}/bin/textdb does not have execute permission!" >> $LOGFILE +# echo "Halting create_f6_product script execution .... " >> $LOGFILE +# if { "$no_gui" != "0" ] +# then +# error.tcl & +# killpid +# fi +# exit 1 +# fi +#fi + +# +# Make sure that the executable handleOUP.pl exists .... +# +if [ ! -s ${FXA_HOME}/bin/handleOUP.pl ] +then + echo "${FXA_HOME}/bin/handleOUP.pl executable does not exist!" >> $LOGFILE + echo "Halting create_f6_product script execution .... " >> $LOGFILE + if [ "$no_gui" != "0" ] + then + error.tcl & + killpid + fi + exit 1 +else if [ ! -x ${FXA_HOME}/bin/handleOUP.pl ] + then + echo "${FXA_HOME}/bin/handleOUP.pl does not have execute permission!" \ + >> $LOGFILE + echo "Halting create_f6_product script execution .... " >> $LOGFILE + if [ "$no_gui" != "0" ] + then + error.tcl & + killpid + fi + exit 1 + fi +fi + +# +# Build F-6s and store F-6s in the text database +# using executable build_f6. +# Standard output and standard error streams +# are redirected into the local log file. +# +${CLIMATE_BIN_DIR}/build_f6 $no_gui $2 1>> $LOGFILE 2>> $LOGFILE + +# +# check the return value of build_f6. +# A non-zero value indicates trouble, but some F6 forms may have +# been created before trouble was encountered. So we will not +# exit at this time. +# +f6_status=$? +echo -n "build_f6 status: " >> $LOGFILE +case $f6_status in + 0 ) echo "Successful completion." >> $LOGFILE;; + 1 ) echo -n "Invalid input argument or " >> $LOGFILE + echo " non-climate process error." >> $LOGFILE;; + 3 ) echo "Database connection error." >> $LOGFILE;; + * ) echo "Unknown error ${f6_status}." >> $LOGFILE;; +esac + +# +# Completed files will have the line "[REMARKS]" in it. Remove any +# forms without this line and log the removal. +# +for file in `ls output_f6_*` +do + if ! grep REMARKS $file > /dev/null + then + rm $file + echo "Removed incomplete F6 form ${file}." >> $LOGFILE + fi +done + +# +# Make the completed F6 forms writeable +# +chmod a+w ${CLIMATE_TMP_DIR}/output_f6_* + +# +# Compare the month and year of the F6 form with the +# current month and year. If they differ, then add +# the line "#FINAL-MM-YY#" to the form. +# +mon_cur=`date +%B | tr '[a-z]' '[A-Z]'` +year_cur=`date +%Y` +for file in `ls output_f6_*` +do + mon_f6=`awk '$1 ~ "MONTH" {month=$2};END{print month}' ${file}` + year_f6=`awk '$1 ~ "YEAR" {year=$2};END{print year}' ${file}` + if [ "$mon_f6" != "$mon_cur" -o "$year_f6" != "$year_cur" ] + then + mo=`echo ${mon_f6} | awk \ + 'BEGIN{ + no["JANUARY"]="01";no["FEBRUARY"]="02"; + no["MARCH"]="03";no["APRIL"]="04" + no["MAY"]="05";no["JUNE"]="06" + no["JULY"]="07";no["AUGUST"]="08" + no["SEPTEMBER"]="09";no["OCTOBER"]="10" + no["NOVEMBER"]="11";no["DECEMBER"]="12"} + {print no[$1]}'` + yr=`echo ${year_f6} | cut -c3-4` + echo "#FINAL-${mo}-${yr}#" >> $file + fi + cp -f ${CLIMATE_TMP_DIR}/${file} ${CLIMATE_DATA_DIR} +done + +# +# Set write permissions on all files in /tmp except RecCli pipe files +# +ls * | grep -v .dat | + while read file + do + chmod a+w $file + done + +# +#Transmit those F6 forms listed in the afos2awips.txt file +# +xmt_status=0 + +################################################################################# +# An awips_id does not necessarily start with "K". No env var associates with it +# Determine the "prefix" as the following. +# +tmp_id_list=`cat ${FXA_HOME}/data/afos2awips.txt | awk '{print $3}' | grep ${FXA_LOCAL_SITE}` + +for id in $tmp_id_list +do + tmp=`echo ${id} | cut -c2-4` + if [ "${FXA_LOCAL_SITE}" = "${tmp}" ] + then + prefix=`echo ${id} | cut -c1` + break; + fi +done +################################################################################ + +awips_id=${prefix}${FXA_LOCAL_SITE} +xmt_list=`grep ${NODE}CF6 ${FXA_HOME}/data/afos2awips.txt \ + | grep $awips_id | awk '{print $1}'` +cf6_list=`ls output_f6_*` +for file in $cf6_list +do + stn=`echo ${file} | cut -c12-14` + cf6_file=${NODE}CF6${stn} + transmit=1 + for xmt_file in $xmt_list + do + [ "${xmt_file}" = "${cf6_file}" ] && transmit=0 + done + if [ "$transmit" = "0" ] + then + ${FXA_HOME}/bin/handleOUP.pl -r ALL ${awips_id}CF6${stn} \ + ${CLIMATE_DATA_DIR}/$file >> $LOGFILE 2>> $LOGFILE + xmit_status=$? + if [ "$xmit_status" = "0" ] + then + echo "${prefix}${cf6_file} sent out as CF6${stn}" >> $LOGFILE + xmt_list=`echo ${xmt_list} | sed 's/${cf6_file}//'` + else + echo "Error in transmitting ${prefix}${cf6_file}." >> $LOGFILE + fi + else + echo "${cf6_file} cannot be transmitted, because" >> $LOGFILE + echo "it is not in the local (`hostname`) file: " >> $LOGFILE + echo " ${FXA_HOME}/data/awips2afos.txt" >> $LOGFILE + fi + [ "$xmit_status" != 0 ] && xmt_status=1 +done + +# +# Note the CF6 forms listed in the afos2awips.txt file +# that did not get transmitted for one reason or another. +# +echo " " >> $LOGFILE +echo "The following F-6 forms listed in the afos2awips.txt file" >> $LOGFILE +echo "were not transmitted over the WAN: " >> $LOGFILE +for file in $xmt_list +do + echo " $file" >> $LOGFILE +done + +# +# If manual run, remove the "Climate is Running" gui. +# Then if the run was successful, put up the success gui +# and the climate gui. +# Otherwise put up the error gui and spit out an informative +# blurb into the local log file about where to get information +# about the error. +# +if [ "$no_gui" != "0" ] +then + killpid + if [ "$f6_status" = "0" -a "$xmt_status" = "0" ] + then + success.tcl & + exec ${CLIMATE_BIN_DIR}/climate & + elif [ "$f6_status" != "0" ] + then + echo "build_f6 error." >> $LOGFILE + echo "Check build_f6 log file in ${logdir}." >> $LOGFILE + error.tcl & + else #[ "$xmt_status" != 0 ] + echo "handleOUP.pl error." >> $LOGFILE + echo "Check handleOUP log file in ${logdir}." >> $LOGFILE + error.tcl & + fi +fi + +# +# Exit with the proper value (0=success, 1=problem) +# +[ "$f6_status" = 0 ] && [ "$xmt_status" = 0 ] && exit 0 +exit 1 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/display.sh b/nativeLib/files.native/adapt/climate/bin/Linux/display.sh new file mode 100755 index 0000000000..5f4dbff128 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/display.sh @@ -0,0 +1,342 @@ +#!/bin/sh +# +############################################################################## +# +# This is the script to display and create the public climate products. It +# takes over from climate.sh if user responds to new data notification. It +# runs in the background, as launched from hmMonitor.tcl +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. +# - Replace -a's in tests. +# - Replace /adapt_apps/ with /climate/ +# - Set env vars. IFPS_SITE_OFFICE_NAME +# and IFPS_SITE_TIMEZONE for format_cli. +# - General cleanup. +# 01/27/2003 OB2 Bob Morris - Fix path to catRecordClimateData.sh +# - Made killpid work in both BASH, HP +# 02/03/2003 OB2 Bob Morris - Modified recordClimate remsh/rsh logic, +# and pass log file as argument. +# 02/11/2003 OB2 Bob Morris - Modified ifps env vars set logic, strip +# quotes from IFPS_SITE_OFFICE_NAME +# 03/28/2003 OB2 Bob Morris - Fix env var ID for IFPS_SITE_OFFICE_NAME +# and modified recordClimate logic/messages +# 04/04/2003 OB2 Bob Morris - Synchonize with climate.sh's messages +# +# 11/14/2003 OB4 Manan Dalal - Removed all occurences of r-commands +# 10/28/2004 OB5 Manan Dalal - Removing everything, including pipe files +# from CLIMATE_TMP_DIR. Pipe files are no +# longer necessary. +############################################################################## + +# Set the following so that `ps -eo pid,args ...` in killpid works in HP-UX. +export UNIX95=1 + +# +# This function will kill the process id of the "Climate is Running" gui +# (wait.tcl). It is used throughout the scripts. +# +function killpid { +pid_func=`ps -eo pid,args | grep -E 'wish[ ].*wait.tcl' | awk '{print $1}'` +#echo "pid_func in killpid is $pid_func" +if test "$pid_func" != "" +then + kill $pid_func 2> /dev/null 1> /dev/null +fi +} + +# +# Change the directory to the temporary +# climate directory. But, +# before trying to switch to the directory, first make sure that +# it exists... +# +# +# Set the file path environment variables +# + +if [ "$CLIMATE_DIR" = "" ] +then + echo "Fatal error in display.sh: CLIMATE_DIR not defined in environment! Exiting." + exit 1 +fi + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting display.sh script execution .... " + exit 1 +fi + +if [ ! -d ${CLIMATE_TMP_DIR} ] +then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting display.sh script execution .... " + exit 1 +fi + +cd ${CLIMATE_TMP_DIR} +LOGFILE=${CLIMATE_TMP_DIR}/tmp.txt + +# +# Display the running clock GUI which lets user know climate is running. +# +wait.tcl & + +echo "" >> $LOGFILE +echo "Starting display_climate $1 $2 in display.sh...... " >> $LOGFILE + +# Make sure that the display_climate executable exists and can be run. + +if [ ! -s ${CLIMATE_BIN_DIR}/display_climate ] +then + echo "The display_climate executable does not exist!" >> $LOGFILE + echo "Halting display.sh script execution .... " >> $LOGFILE + error.tcl & + killpid + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/display_climate ] + then + echo "display_climate does not have execute permission!" >> $LOGFILE + echo "Halting display.sh script execution .... " >> $LOGFILE + error.tcl & + killpid + exit 1 + fi +fi + +${CLIMATE_BIN_DIR}/display_climate $1 $2 0 >>$LOGFILE 2>>$LOGFILE + +# Make sure that display_climate did its thing correctly + +display_status=$? + +if [ $display_status -ne 0 ] +then +# echo "display climate status =$display_status " + echo "display_climate returned an error in display.sh. Stopping execution. " >> $LOGFILE + error.tcl & + killpid + exit 1 +fi + +echo "Returned from display_climate in display.sh $1 $2, continuing..." >> $LOGFILE +echo "" >> $LOGFILE + +# Copy the files generated by set_up_climate + +cp ${CLIMATE_DATA_DIR}/*_$2_* ${CLIMATE_TMP_DIR} + +if [ $? -ne 0 ] +then + echo "display.sh: The copy of the files generated by set_up_climate failed." >> $LOGFILE + error.tcl & + killpid + exit 1 +fi + +# +# Set the waiting times for format_climate. The waiting time determines the +# amount of time the notification server will wait before sending back a +# message that the user didn't acknowledge the alert. Ignore the first wait +# time (don't set DATA_WAIT_TIME) except for value-checking file entries. +# +fileok="true" +if [ -s ${CLIMATE_DATA_DIR}/wait_times.txt ] +then + if [ `wc -w <${CLIMATE_DATA_DIR}/wait_times.txt` -eq 2 ] + then + echo "display.sh: Reading from ${CLIMATE_DATA_DIR}/wait_times.txt" >> $LOGFILE + read wait1 wait2 < ${CLIMATE_DATA_DIR}/wait_times.txt + echo "wait1, wait2 = ${wait1}, ${wait2} after file read." >> $LOGFILE + if [ ${wait1} -ge 0 -a ${wait2} -ge 0 ] + then + export PRODUCT_WAIT_TIME=$wait2 + echo "product wait = $PRODUCT_WAIT_TIME" >> $LOGFILE + else + echo "Warning: Improper entries in wait_times.txt file." >> $LOGFILE + echo "Must contain exactly two positive integer values." >> $LOGFILE + fileok="false" + fi + else + echo "Warning: Improper number of entries in wait_times.txt file." >> $LOGFILE + echo "Must contain exactly two positive integer values." >> $LOGFILE + fileok="false" + fi +else + echo "Problem: ${CLIMATE_DATA_DIR}/wait_times.txt file not found." >> $LOGFILE + fileok="false" +fi + +if [ "$fileok" = "false" ] +then + echo "display.sh: Reverting to default time of 10 minutes:" >> $LOGFILE + PRODUCT_WAIT_TIME=10 + export PRODUCT_WAIT_TIME + echo "product wait = $PRODUCT_WAIT_TIME" >> $LOGFILE +fi + +# Prepare to run format_climate program +# +# Remove old run's RecordClimate*.dat files before running format_climate +# + +rm -f *.dat + +# +# Check to see if the new ifps-ccc.env site file exists and if so, extract the +# necessary environment variables and set them for climate. If unavailable, +# notify user and log errors. +# + echo "display.sh: Getting WFO Name and local Time Zone from IFPS file." >> $LOGFILE + ifpsfile="/awips/adapt/ifps/localbin/ifps-${ICWF_SITE}.env" + ourcopy="${CLIMATE_TMP_DIR}/ifps-${ICWF_SITE}.env" + haveifps="true" + +if [ -s $ifpsfile ] +then + export IFPS_SITE_OFFICE_NAME + export IFPS_SITE_TIMEZONE + cp $ifpsfile $ourcopy + IFPS_SITE_OFFICE_NAME=`grep "IFPS_SITE_OFFICE_NAME=" $ourcopy | cut -f2 -d= | sed -e "s/\"//g" | sed -e "s/'//g"` + echo "IFPS_SITE_OFFICE_NAME = $IFPS_SITE_OFFICE_NAME" >> $LOGFILE + IFPS_SITE_TIMEZONE=`grep "IFPS_SITE_TIMEZONE=" $ourcopy | cut -f2 -d=` + echo "IFPS_SITE_TIMEZONE = $IFPS_SITE_TIMEZONE" >> $LOGFILE + echo "" >> $LOGFILE + + if [ "$IFPS_SITE_OFFICE_NAME" = "" -o "$IFPS_SITE_TIMEZONE" = "" ] + then + echo "WARNING! IFPS_SITE_OFFICE_NAME and/or IFPS_SITE_TIMEZONE not defined in file:" >> $LOGFILE + echo " ${ifpsfile}" >> $LOGFILE + echo "NWWS Climate products will have wrong time zone and/or WFO name!" >> $LOGFILE + echo "" >> $LOGFILE + haveifps="false" + fi +else + haveifps="false" + echo "" >> $LOGFILE + echo "IFPS environment file $ifpsfile not found." >> $LOGFILE + echo "NWWS Climate products will have wrong time zone and/or WFO name!" >> $LOGFILE + echo "" >> $LOGFILE +fi + + +# Make sure that the format climate executable exists and has execute permission. + +if [ ! -s ${CLIMATE_BIN_DIR}/format_climate ] +then + echo "The format_climate executable does not exist!" >> $LOGFILE + echo "Halting script execution .... " >> $LOGFILE + error.tcl & + killpid + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/format_climate ] + then + echo "Format_climate does not have execute permission!" >> $LOGFILE + echo "Halting script execution .... " >> $LOGFILE + error.tcl & + killpid + exit 1 + fi +fi + +echo "" >> $LOGFILE +echo "display.sh: Starting format_climate ....... " >> $LOGFILE 2>>$LOGFILE + +format_flag=1 +#echo "format_flag = $format_flag" +echo "" >> $LOGFILE + +${CLIMATE_BIN_DIR}/format_climate $1 $2 $format_flag 0 >> $LOGFILE 2>&1 + +format_status=$? + +echo "" >> $LOGFILE +echo "Returned from format_climate in display.sh" >> $LOGFILE +echo "" >> $LOGFILE + +echo "Climate has completed its run. Reporting status:" >> $LOGFILE +echo "" >> $LOGFILE + +# Check to make sure that format_climate ran to completion + +case $format_status in + 0) + killpid + + if [ "$recordClimate" != "NO" -a "$haveifps" = "true" ] + then + success.tcl & + echo "display.sh: format_climate returned a value of 0. Climate returned no errors." >> $LOGFILE + echo "display.sh: recordClimate also returned a value of 0, for success." >> $LOGFILE + else + echo "display.sh: format_climate returned a value of 0, for success." >> $LOGFILE + echo "display.sh: recordClimate also returned a value of 0, for success." >> $LOGFILE + + # Remove *.dat file now that they are not needed. + rm -f ${CLIMATE_TMP_DIR}/*.dat + + if [ "$haveifps" = "false" ] + then + echo "However, IFPS environment file problems were encountered, see preceding messages." >> $LOGFILE + fi + + echo "Climate exiting with a report of an error due to this situation." >> $LOGFILE + error.tcl & + fi + ;; + 1) + echo "format_climate returned a value of 1. This means the program" >> $LOGFILE + echo "encountered an invalid input argument, was aborted by user, or" >> $LOGFILE + echo "had problems invoking a non-climate process." >> $LOGFILE + echo " - Check the format_climate log file for details." >> $LOGFILE + + if [ "$haveifps" = "false" ] + then + echo "" >> $LOGFILE + echo "Also, IFPS environment file problems were encountered, see preceding messages." >> $LOGFILE + echo "Climate exiting with reported errors due to these situations." >> $LOGFILE + fi + + killpid + error.tcl & + ;; + 3) + echo "display.sh: format_climate returned a value of 3, fatal database (dis)connect error." >> $LOGFILE + echo " - Check the format_climate log file for details." >> $LOGFILE + killpid + error.tcl & + exit 1 + ;; + 5) + echo "RecordClimate returned error while running within format_climate." >> $LOGFILE + echo "See preceding messages for details." >> $LOGFILE + echo "This problem does not imply that RER would have been created - record" >>$LOGFILE + echo "may have occurred only at station not in NWWS CLI setup." >> $LOGFILE + echo "Climate exiting with a report of an error due to this situation." >> $LOGFILE + + rm -f ${CLIMATE_TMP_DIR}/*.dat + + if test "$1" != "auto" + then + error.tcl & + killpid + fi + ;; + *) + echo "display.sh: format_climate returned an unexpected value of $create_status." + echo " - Check the format_climate log file for details." >> $LOGFILE + killpid + error.tcl & + exit 1 + ;; +esac + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/display_climate b/nativeLib/files.native/adapt/climate/bin/Linux/display_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/display_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/do_all_climate b/nativeLib/files.native/adapt/climate/bin/Linux/do_all_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/do_all_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/error.tcl b/nativeLib/files.native/adapt/climate/bin/Linux/error.tcl new file mode 100755 index 0000000000..8df8bf5313 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/error.tcl @@ -0,0 +1,121 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" "$@" +################################################################################# +# +# error.tcl +# +# Purpose +# This script notifies the user with a tcl button that climate has +# ended with an error. +# +# BER January 2000 +# +################################################################################# + proc read_file {filename} { + set data "" + + if { [file readable $filename] } { + + set fileid [open $filename "r"] + set data [read $fileid] + close $fileid + } + + return $data +} +########################################### +proc read_into_text {textwidget filename} { + set data [read_file $filename] + $textwidget delete 1.0 end + $textwidget insert end $data + +} + +############################################ +proc file_write { filename $data } { + + return [catch { + set fileid [open $filename "w"] + puts -nonewline $fileid $data + close $fileid + }] +} +############################################## +proc error_log_window {w} { + +global env + + wm withdraw $w + toplevel .w + wm overrideredirect .w 0 + + wm title .w "Climate" + wm geometry .w +200+300 + frame .w.mbar -relief raised -bd 2 + pack .w.mbar -side top -fill x + menubutton .w.mbar.file -text File -underline 0 \ + -menu .w.mbar.file.menu +# menubutton .mbar.help -text Help -underline 0 \ +# -menu .mbar.help.menu + pack .w.mbar.file -side left +# pack .mbar.help -side right + menu .w.mbar.file.menu +# .mbar.file.menu add command -label "Save New Product" -command exit + .w.mbar.file.menu add command -label "Close" -command exit + + text .w.text -relief raised -bg white -bd 2 \ + -yscrollcommand ".w.scroll set" -fg black + scrollbar .w.scroll -command ".w.text yview" + pack .w.scroll -side right -fill y + pack .w.text -side left + +# cd /staging/bld50/adapt/adapt_apps/src/climate/work/tmp + cd $env(CLIMATE_DIR)/tmp +#CAN"T SEEM TO GET THIS LINE TO WORK!!! + +# set hold + +#exec tail -10 temp.txt < hold.txt +#more hold.txt +# set hold [read_file tmp.txt] + +# puts $hold + + read_file temp.txt + read_into_text .w.text tmp.txt + +return + +} + +################################################ +proc blink {w option value1 value2 interval} { + $w config $option $value1 + after $interval [list blink $w $option\ + $value2 $value1 $interval] + } +################################################ + wm withdraw . + toplevel .error + wm title .error "Error" + wm geometry .error +1000+400 + wm overrideredirect .error 1 + frame .error.nothing -bg black -bd 5 -relief groove + pack .error.nothing + button .error.nothing.clim -bd 5 -bg red\ + -image [image create photo -file $env(CLIMATE_DIR)/data/error_blast.gif] +# blink .error.nothing -bg red black 500 + pack .error.nothing.clim + button .error.nothing.ok -width 11 -text "View Log File" -bg white -fg black \ + -highlightcolor white -highlightbackground white -activebackground white\ + -activeforeground black -command {error_log_window {.error} } + button .error.nothing.close -width 4 -text "Close" -bg white -fg black \ + -highlightcolor white -highlightbackground white -activebackground white\ + -activeforeground black -command exit + pack .error.nothing.ok .error.nothing.close -side left -padx 1m -pady 1m + + + + + diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/format_climate b/nativeLib/files.native/adapt/climate/bin/Linux/format_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/format_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/free_text.tcl b/nativeLib/files.native/adapt/climate/bin/Linux/free_text.tcl new file mode 100755 index 0000000000..1aab49e0d8 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/free_text.tcl @@ -0,0 +1,676 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" "$@" +#PROCEDURES +#*************************************************************************** +# Procedure multi_scroll +# +# Purpose +# To enable the scrollbar to be attached to several listboxes at the same +# time +# +# Variables (I=Input) (G=Global) (O=output) +# scroll_list (I) List of scroll paths +# args (I) List specifying scroll design options +# +# Returns: +# NULL ##!/usr/local/tk/bin/wish -f +# +# History: +# 7/97 Mike Dutter: modified from Welch, Practical Programming in Tcl +# +# Notes: +# None +# +#*************************************************************************** +proc multi_scroll {scroll_list args} { + + foreach i $scroll_list { + eval {$i yview} $args + } + return +} +#*************************************************************************** +# Procedure multi_scroll2 +# +# Purpose +# This allows a scrollbar that is attached to several listboxes to remain +# in alignment no matter how the user scrolls. +# +# Variables (I=Input) (G=Global) (O=output) +# scroll_path (I) Tk scroll paths +# box_list (I) List of tk-listbox paths +# args (I) List specifying scroll design options +# +# Returns: +# NULL +# +# History: +# 5/98 Howard Berger: created +# +# Notes: +# None +# +#*************************************************************************** +proc multi_scroll2 {scroll_path box_list args} { + + eval {$scroll_path set} $args + foreach box $box_list { + eval {$box yview moveto} [lindex $args 0] + } + return +} + +#****************************************************************************** +# Procedure clear_Window +# +# Purpose: +# This procedure deletes all of the information in the text window. +# +# Variables: (I=input) (O=output) (G=global) +# +# Returns: +# NULL +# +# History: +# 4/98 Teresa Peachey Created +# 12/99 Dan Zipper Modified +# Notes: +# Modified from Teresa's clearWindow routine. +#****************************************************************************** +proc clear_Window {} { + + set t3 .f3.text + +set result [tk_messageBox -parent . -title "Clear?" -type yesno -icon warning \ + -message "Clear the product?\ + Clear will not save changes."] + + if {$result == "yes"} then { + + # Delete the Text file information + $t3 delete 1.0 end + } + + return +} + +#****************************************************************************** +# Procedure clean_Window +# +# Purpose: +# This procedure deletes all of the information in the text window. +# +# Variables: (I=input) (O=output) (G=global) +# +# Returns: +# NULL +# +# History: +# 4/98 Teresa Peachey Created +# 12/99 Dan Zipper Modified +# Notes: +# Modified from Teresa's clearWindow routine. +#****************************************************************************** +proc clean_Window {} { + + set t3 .f3.text + + # Delete the Text file information + $t3 delete 1.0 end + + return +} + +#****************************************************************************** +# Procedure deleteEntry +# +# Purpose: +# Delete an entry in the selection box. +# +# Variables: (I=input) (O=output) (G=global) +# selection (I) The index number of the list entry to be +# deleted +# llist (G) List of all listbox paths +# +# Returns: +# NULL +# +# History: +# 4/98 Teresa Peachey Created +# +# Notes: +# +#****************************************************************************** +proc deleteEntry {selection} { + + global llist + + foreach i $llist { + if { $selection == ""} { + toplevel .error + tk_dialog .error "No product selected" \ + "Select an entry to delete from the list, and try again." \ + error 0 "OK" + } else { + $i delete [lindex $selection 0] + } + } + + return +} + +#**************************************************************************** +# Procedure delete_line +# +# Purpose: +# Delete a file from the selection list. +# +# Variables: (I=input) (O=output) (G=global) +# None +# +# Returns: +# NULL +# +# History: +# 4/98 Teresa Peachey Created +# 12/99 Dan Zipper Modified +# Notes: +# Modified from Teresa's delete routine +#**************************************************************************** +proc delete_line {} { + + global filename1 + + set stnList .f2.frame2.list2 + +# Determine which entry has been selected by the user for deletion and +# which station that entry represents + + set selection [$stnList curselection] + + if { $selection == ""} then { + toplevel .error + tk_dialog .error "No product selected" \ + "Select an entry to delete from the list, and try again." \ + error 0 "OK" + return + } else { + set result [tk_messageBox -parent . -title "Delete?" -type yesno -icon warning \ + -message "Delete $filename1 from list?"] + + if {$result == "yes"} then { + + set File [$stnList get $selection] + + deleteEntry $selection + + exec rm $filename1 + + clean_Window + + } + } + + return + +} + +#**************************************************************************** +# Procedure destory_message +# +# Purpose: +# Delete a file from the selection list. +# +# Variables: (I=input) (O=output) (G=global) +# None +# +# Returns: +# NULL +# +# History: +# 12/99 Dan Zipper Created +# Notes: +# Modified from Teresa's delete routine +#**************************************************************************** +proc destroy_message {text} { + + if {$text == "continue"} then { + +# set result [tk_messageBox -parent . -title "Accept Climate Run?" \ +# -type yesno -icon warning ] + +# if {$result == "yes"} then { + destroy .tbar .f2 .f3 .buttons . "Review Climate Product" + + } + + + } else { + +# set result [tk_messageBox -parent . -title "Abort Climate Run?" \ +# -type yesno -icon warning ] + +# \ +# -message "Choosing 'Yes' will stop the current\ +# climate session without saving any added data."] + +# if {$result == "yes"} then { + + set return_value 1 +# destroy .tbar .f2 .f3 .buttons . "Review Climate Product" + + exit 1 + + } + + } + + +# return $return_value + + return + } + +#****************************************************************************** +# Procedure list_Press +# +# Purpose: +# This procedure takes several actions when a user selects an entry in the +# product list in the Free_text GUI. First it highlights all +# items in the same row as that entry. It then places all related +# data for the entry into the text box in the GUI. +# +# Variables: (I=input) (O=output) (G=global) +# listbox (I) The name of the listbox that the user has selected +# others (I) The names of all the listboxes containing notification +# information +# +# Returns: +# NULL +# +# History: +# 4/98 Teresa Peachey Created +# 12/99 Dan Zipper Modified +# Notes: +# Modified from teresa's listPress routine +#****************************************************************************** +proc list_Press {listbox others} { + + set newlist .f2.frame1.list1 + set index [$listbox curselection] + +# Highlight the corresponding entry in every listbox + foreach i $others { + $i selection clear 0 end + $i selection set $index + } + + clean_Window +# Write all the related information into the GUI's text window + putCliText $listbox + + return +} + +#**************************************************************************** +# Procedure read_file +# +# Purpose: +# This procedure will read a selected output file. +# +# Variables: (I=input) (O=output) (G=global) +# filename (I) The name of the listbox that the user has selected. +# +# Returns: +# NULL +# +# History: +# 12/99 Dan Zipper created +#**************************************************************************** +proc read_file {filename} { + + global filename1 + set data "" + + if { [file readable $filename] } { + + set fileid [open $filename "r"] + set data [read $fileid] + close $fileid + + set filename1 $filename + + } + + return $data +} + +#**************************************************************************** +# Procedure read_into_text +# +# Purpose: +# This procedure will read a selected output file into the window. +# +# Variables: (I=input) (O=output) (G=global) +# textwidget (I) name of text_widget where file is being read into. +# filename (I) The name of the listbox that the user has selected +# +# Returns: +# NULL +# +# History: +# 12/99 Dan Zipper created +#**************************************************************************** +proc read_into_text {textwidget filename} { + set data [read_file $filename] + $textwidget insert end $data +} + +#**************************************************************************** +# Procedure file_write +# +# Purpose: +# This procedure will save the new output file into the window. +# +# Variables: (I=input) (O=output) (G=global) +# listbox (I) The name of the listbox that the user has selected +# notifArray (G) An array of notification information for each station +# w (G) top level for TAF Monitoring Window +# +# Returns: +# NULL +# +# History: +# 12/99 Dan Zipper PRC/TDL +#**************************************************************************** +proc file_write { filename data } { + + set fileid [open $filename "w"] + puts -nonewline $fileid $data + close $fileid + +} + +#**************************************************************************** +# Procedure file_save +# +# Purpose: +# This procedure will save the new output file into the window. +# +# History: +# 12/99 Dan Zipper PRC/TDL +#**************************************************************************** +proc file_save {textwidget filename} { + + set result [tk_messageBox -parent . -title "Save?" -type yesno -icon warning \ + -message "Save $filename?"] + + if {$result == "yes"} then { + + set data [$textwidget get 1.0 end ] + file_write $filename $data + } + + + return +} +#**************************************************************************** +# Procedure wish_to_send +# +# Purpose: +# This procedure will produce a warning message before saving the product. +# +# History: +# 12/99 Dan Zipper PRC/TDL +#**************************************************************************** +proc wish_to_send {} { + + set result [tk_messageBox -parent . -title "Send?" -type yesno -icon warning \ + -message "Send the products?\ + This will send ALL products listed in the window."] + + if {$result == "yes"} then { + + exit + } + + + return +} + + + +#**************************************************************************** +# Procedure putCliText +# +# Purpose: +# This procedure places detailed notification info into the text window +# of the TAF Monitoring GUI when the user selects a particular notification +# entry. The information includes the METAR and TAF values for all weather +# elements with Amend/Alert notices, the entire TAF for the station ID, and +# all the METARs from the past 3 hours. +# +# Variables: (I=input) (O=output) (G=global) +# listbox (I) The name of the listbox that the user has selected +# notifArray (G) An array of notification information for each station +# w (G) top level for TAF Monitoring Window +# +# Returns: +# NULL +# +# History: +# 4/98 Teresa Peachey Created +# 12/99 Dan Zipper Modified +# Notes: +# Modified from Teresa's putNotifText routine +#****************************************************************************** +proc putCliText {listbox} { + + global textwidget + global file_name + set t3 .f3.text + +# Determine the station ID for the notification the user has selected + set selection [$listbox curselection] + set index [lindex $selection 0] + set File [.f2.frame1.list1 get $index] + +# Allow modification of text window + $t3 config -state normal + +read_into_text .f3.text $File +tk_messageBox -icon info -message "This product is now ready to be edited." \ + -parent .f3.text -title "Edit" -type ok + + +set textwidget $t3 +set file_name $File + +return +} +#***************************************************************************** +# +#Proc web_page +# +# This procedure will call up the free_text GUI help page. +# +#proc web_page { program help_file } { +proc web_page {} { + + set err "" + + catch { +# eval exec $program $help_file & + cd $env(CLIMATE_DIR)/data + eval exec netscape help_climo.html 0 & + } err + + return $err +} +#****************************************************************************** +# MAIN BODY FOR NOW......................... +# + + set return_value 1 + + wm title . "Review Climate Product" + +# Set up the menu bar with the "File", "Edit" & "Help" submenus + frame .tbar -relief raised -bd 2 + pack .tbar -side top -fill x + menubutton .tbar.file -text File -fg black -font -adobe-times-medium-r-normal--19-130-72-72-p-88-hp-roman8 -underline 0\ + -menu .tbar.file.menu + menubutton .tbar.edit -text Edit -fg black -font -adobe-times-medium-r-normal--19-130-72-72-p-88-hp-roman8 -underline 0\ + -menu .tbar.edit.menu +# menubutton .tbar.help -text Help -fg black -font -adobe-times-medium-r-normal--19-130-72-72-p-88-hp-roman8 -underline 0\ +# -menu .tbar.help.menu + pack .tbar.file .tbar.edit -side left +# pack .tbar.help -side right + +# Allow the user close the window or stop execution of climate + + set exit "exit" + set continue "continue" + + menu .tbar.file.menu -tearoff 0 +# .tbar.file.menu add separator + .tbar.file.menu add command -label "Accept Climate Run" -font -adobe-times-medium-r-normal--17-130-72-72-p-88-hp-roman8 \ + -command {destroy_message $continue} + .tbar.file.menu add command -label "Abort Climate Run" -font -adobe-times-medium-r-normal--17-130-72-72-p-88-hp-roman8 \ + -command {destroy_message $exit} + +# Allow the user to load the TAF associated with a notification into one of +# the editors, or to delete the notification from the GUI window + menu .tbar.edit.menu -tearoff 0 + .tbar.edit.menu add command -label "Save" -font -adobe-times-medium-r-normal--17-130-72-72-p-88-hp-roman8 \ + -command {file_save $t3 $file_name} + .tbar.edit.menu add command -label "Delete" -font -adobe-times-medium-r-normal--17-130-72-72-p-88-hp-roman8 \ + -command {delete_line} +# .tbar.edit.menu add separator +# .tbar.edit.menu add command -label "Import New product" \ +# -font Hel12 \ +# -command {delete_line} + +# Allow the user to start the help screen in an html-like browser. +# menu .tbar.help.menu -tearoff 0 +# .tbar.help.menu add command -label "Review product help" -font -adobe-times-medium-r-normal--17-130-72-72-p-88-hp-roman8 \ +# -command {web_page} + +# netscape $env(CLIMATE_DIR)/data/help_climo.html} + +# -command "load_html $env(CLIMATE_DIR)/data/help_climo.html 0" + frame .f2 +# Set up sub-frames to hold each of 2 list boxes and their associated labels +# The listboxes contain a "new" indicator, the station id, the time of the +# notification, the level of notification, and the types of present conditions +# that triggered the notification. + + for {set j 1} {$j <= 2} {incr j} { + set f2fr($j) .f2.frame$j + set f2list($j) $f2fr($j).list$j + set f2t($j) $f2fr($j).title$j + lappend llist $f2list($j) + } + + +# THIS SECTION IS CREATING THE SCROLLBAR AND LISTBOXES +# Create scrollbar to control all list boxes + scrollbar .f2.scroll -command [list multi_scroll $llist] + pack .f2.scroll -side right -fill y + + for {set j 1} {$j <= 2} {incr j} { + +# Set the width of the "new" indicator listbox to be narrower than the others + if {($j == 1)} { + set listwidth 35 + } else { + set listwidth 10 + } + + frame $f2fr($j) + label $f2t($j) -width $listwidth + listbox $f2list($j) -height 6 -exportselection off -fg black -bg white\ + -yscrollcommand [list multi_scroll2 .f2.scroll $llist] \ + -font Hel13 -width $listwidth -selectmode single -bd 0 + + pack $f2list($j) -side bottom -expand true -fill both + pack $f2t($j) -side top + +# Do not allow the "new" indicator listbox to expand + if {($j == 1)} { + pack $f2fr($j) -side left -fill both + } else { + pack $f2fr($j) -side left -expand true -fill both + } + + } + +# Set labels for listboxes + set k 1 + foreach title "{NWWS Climate Reports} {Date} " { + $f2t($k) config -text $title -fg black -font -adobe-times-medium-r-normal--19-130-72-72-p-88-hp-roman8 + incr k + } + +# Bind commands to all the listboxes. For the "new" indicator do not bind +# the Double-Click. + for {set j 1} {$j <= 2} {incr j} { + bind $f2list($j) <ButtonRelease-1> [list list_Press $f2list($j) $llist] + if { $j != 1} { + bind $f2list($j) <Double-Button-1> {openEditor} + } + } + +pack .f2 -fill x -side top + +frame .f3 + +# Set up text window to hold more detailed notification information + text .f3.text -state normal -relief raised -fg black -bg white -bd 2 \ + -width 69 -yscrollcommand ".f3.scroll set" + + set t3 .f3.text + +# Set up table to hold specific METAR and TAF values that are in discrepancy + + + scrollbar .f3.scroll -command ".f3.text yview" + + pack .f3.scroll -side right -fill y + pack $t3 -side left -fill both -expand true + + + pack .f3.scroll -side right -fill y + + cd $env(CLIMATE_DIR)/tmp + +set files [glob -nocomplain *.nwws] + if {$files != ""} { + foreach filename $files { + $f2list(1) insert end "$filename" + set info [file atime $filename] + set date1 [clock format $info -format "%c"] + $f2list(2) insert end "$date1" + } +} + +# -state disabled DISABLES BUTTONS +#THIS FRAME CREATES THE BUTTONS# + +frame .buttons + +button .buttons.b1 -text "CLEAR" -font -adobe-times-bold-r-normal--17-120-100-100-p-91-iso8859-1 \ + -fg black -command {clear_Window} +button .buttons.b2 -text "DELETE" -font -adobe-times-bold-r-normal--17-120-100-100-p-91-iso8859-1 \ + -fg black -command {delete_line} +button .buttons.b3 -text "SAVE" -font -adobe-times-bold-r-normal--17-120-100-100-p-91-iso8859-1 \ + -fg black -command {file_save $t3 $file_name} +button .buttons.b4 -text "SEND" -font -adobe-times-bold-r-normal--17-120-100-100-p-91-iso8859-1 \ + -fg black -command wish_to_send +pack .buttons.b1 .buttons.b2 .buttons.b3 .buttons.b4\ + -fill x -side left -padx 40 -expand true + +pack .buttons -side bottom -pady 12 + +pack .f3 -side bottom -pady 12 -expand true -fill both diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/init_climate b/nativeLib/files.native/adapt/climate/bin/Linux/init_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/init_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/init_climate_db b/nativeLib/files.native/adapt/climate/bin/Linux/init_climate_db new file mode 100755 index 0000000000..99ecbf97a6 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/init_climate_db @@ -0,0 +1,88 @@ +#!/bin/sh + +############################################################################## +# +# init_climate_db +# +# This is the script to run the program to allow a user to manually +# initialize historical climate data (records and normals) in database. +# +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Changed from csh to sh +# - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. General cleanup. +# - Replace -a's in tests. +# +############################################################################## + +# +# Set the file path environment variables +# + +if [ "$CLIMATE_DIR" = "" ] +then + echo "Fatal error in init_climate_db: CLIMATE_DIR not defined in environment! Exiting." + exit 1 +fi + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting init_climate_db script execution .... " + exit 1 +fi + +if [ ! -d ${CLIMATE_TMP_DIR} ] +then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting init_climate_db script execution .... " + exit 1 +fi + +# +# Check that environment variable for path to climate executables is set +# +if [ "$CLIMATE_BIN_DIR" = "" ] +then + echo "In init_climate_db: CLIMATE_BIN_DIR not defined in environment! Exiting." + exit 1 +else + echo "In init_climate_db: CLIMATE_BIN_DIR = $CLIMATE_BIN_DIR \n" +fi + +# +# Change the directory to the temporary climate directory +# +cd ${CLIMATE_TMP_DIR} + +if [ ! -s ${CLIMATE_BIN_DIR}/init_climate ] +then + echo "${CLIMATE_BIN_DIR}/init_climate executable does not exist!" + echo "Halting init_climate_db script execution .... " + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/init_climate ] + then + echo "${CLIMATE_BIN_DIR}/init_climate does not have execute permission!" + echo "Halting init_climate_db script execution .... " + exit 1 + fi +fi + +# +# Execute init_climate +# +${CLIMATE_BIN_DIR}/init_climate + +# +# Restart the main climate menu and exit script +# +exec ${CLIMATE_BIN_DIR}/climate & + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/qc_climate b/nativeLib/files.native/adapt/climate/bin/Linux/qc_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/qc_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/qc_climate_db b/nativeLib/files.native/adapt/climate/bin/Linux/qc_climate_db new file mode 100755 index 0000000000..577715ce9c --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/qc_climate_db @@ -0,0 +1,118 @@ +#!/bin/sh + +############################################################################## +# +# qc_climate_db +# +# This is the script to run the program to allow a user to manually +# edit climate data (daily, monthly, seasonal, annual) in database. +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Changed from csh to sh +# - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. General cleanup. +# - Replace -a's in tests. +# 04/21/2003 OB2 Bob Morris - Check for global_day file existence in +# CLIMATE_DATA_DIR before allowing run. +# +# +# 09/04/2003 OB3 Mohammed Sikder A new segment of code is added in order +# to explicitly pipe the generated outputs +# from a set of climate scripts to a logfile. +# Te reason behind that was some of the nested +# GUIs in the climate was failing to get +# displayed at NGIT OB3 test platform. +# +############################################################################## +# +# +############################################################################## + +# +# Set the file path environment variables +# + +if [ "${CLIMATE_DIR}" = "" ] +then + echo "Fatal error in qc_climate_db: CLIMATE_DIR not defined in environment! Exiting." + exit 1 +fi + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting qc_climate_db script execution .... " + exit 1 +fi + +if [ ! -s ${CLIMATE_DATA_DIR}/global_day ] +then + echo "File ${CLIMATE_DATA_DIR}/global_day does not exist or is empty." + echo "Check installation and setup of Climate routines." + echo "Halting qc_climate_db script execution .... " + exit 1 +fi +# +# +# The following code has been added in order to resolve the display +# problem for some climate GUIs +# +##################################################################### + + + if [ ! -d ${CLIMATE_TMP_DIR} ] + then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting qc_climate_db script execution .... " + exit 1 + fi + + LOGFILE=${CLIMATE_TMP_DIR}/tmp.txt + echo "QC Climate Database run date/time: `date`" > $LOGFILE +# +###################################################################### +# +# Check that environment variable for path to climate executables is set +# +if [ "$CLIMATE_BIN_DIR" = "" ] +then + echo "In qc_climate_db: CLIMATE_BIN_DIR not defined in environment! Exiting." + exit 1 +else + echo "In qc_climate_db: CLIMATE_BIN_DIR = $CLIMATE_BIN_DIR \n" +fi + +# +# Change the directory to the climate/data directory +# +cd ${CLIMATE_DATA_DIR} + +if [ ! -s ${CLIMATE_BIN_DIR}/qc_climate ] +then + echo "${CLIMATE_BIN_DIR}/qc_climate executable does not exist!" + echo "Halting qc_climate_db script execution .... " + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/qc_climate ] + then + echo "${CLIMATE_BIN_DIR}/qc_climate does not have execute permission!" + echo "Halting qc_climate_db script execution .... " + exit 1 + fi +fi + +# +# Execute qc_climate +# +${CLIMATE_BIN_DIR}/qc_climate $1 $2 >> $LOGFILE 2>> $LOGFILE + +# +# Restart the main climate menu and exit script +# +exec ${CLIMATE_BIN_DIR}/climate & + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/recordClimate b/nativeLib/files.native/adapt/climate/bin/Linux/recordClimate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/recordClimate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/set_climate_env.sh b/nativeLib/files.native/adapt/climate/bin/Linux/set_climate_env.sh new file mode 100755 index 0000000000..a4bd6d42b1 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/set_climate_env.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# locate EDEX_HOME +if [ "${EDEX_HOME}" = "" ]; then + default_edex_home=$(cd $(dirname $0)/../../../../edex;pwd) + if test -d $default_edex_home; then + export EDEX_HOME=$default_edex_home + else + echo "Unable to locate EDEX_HOME" + exit 1 + fi +fi + +# source set_hydro_env since it sets up the environment for get_apps_defaults +# and contains exports for the database connection + +. ${EDEX_HOME}/data/hdf5/hydroapps/set_hydro_env + +# return the variable's value if it is defined, otherwise return the given value +get_default_value() { #(variable, value) + if [ "$1" = "" ]; then + echo $2 + else + echo $1 + fi +} + +export ADAPT_SITE_ID=$(get_apps_defaults "ADAPT_SITE_ID") +export FXA_LOCAL_TZ=$(get_apps_defaults "FXA_LOCAL_TZ") +export TZ=$(get_apps_defaults "TZ") + +export FXA_TEXT=$(get_default_value $(get_apps_defaults "FXA_TEXT") "fxatext") + +# setup climate specific environment variables +export DB_HM=$(get_default_value "$DB_HM" "hmdb") + +export CLIMATE_DIR=$(get_default_value "$CLIMATE_DIR" "$(cd $(dirname $0)/../../;pwd)") +export CLIMATE_DATA_DIR=${CLIMATE_DIR}/data +export CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp +export CLIMATE_BIN_DIR=${CLIMATE_DIR}/bin/Linux + diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate b/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate new file mode 100755 index 0000000000..74b28ae27a --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate @@ -0,0 +1,18 @@ +#!/bin/bash + +# calls into the main routines in the adappt.climate.ui library +# create links to this script with the appropriate name for each +# main routine + +program_name=$(basename $0) + +script_dir=$(cd $(dirname $0);pwd) + +# set the appropriate environment variables +. $script_dir/set_climate_env.sh + +# the climate apps assume the cwd is the data dir +cd $CLIMATE_DATA_DIR + +# call into the library to launch the program +runso rary.adappt.climate.ui ${program_name}_main $@ diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate_runs b/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate_runs new file mode 100755 index 0000000000..6655de3e59 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate_runs @@ -0,0 +1,128 @@ +#!/bin/sh + +############################################################################## +# +# set_up_climate_runs +# +# This is the script to set up the climate runs for the climate program. +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Changed from csh to sh +# - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. +# - Added file tests. +# - General cleanup. +# 01/27/2003 OB2 Bob Morris Changes so kill pid works in both BASH, HP +# +# +# +# 09/04/2003 OB3 Mohammed Sikder A new segment of code is added in order +# to explicitly pipe the generated outputs +# from a set of climate scripts to a logfile. +# Te reason behind that was some of the nested +# GUIs in the climate was failing to get +# displayed at NGIT OB3 test platform. +# +############################################################################## + +# Set the following so that `ps -eo pid,args ...` for kill pid works in HP-UX. +export UNIX95=1 + +# +# Set the file path environment variables +# + +if [ "${CLIMATE_DIR}" = "" ] +then + echo "\nFatal error in set_up_climate_runs: CLIMATE_DIR not defined in environment!" + echo " - Exiting." + exit 1 +fi + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting set_up_climate_runs script execution .... " + exit 1 +fi +# +# +# The following code has been added in order to resolve the display +# problem for some climate GUIs +# +##################################################################### + + if [ ! -d ${CLIMATE_TMP_DIR} ] + then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting set_up_climate_runs script execution .... " + exit 1 + fi + + LOGFILE=${CLIMATE_TMP_DIR}/tmp.txt + echo "Set Up Climate Runs run date/time: `date`" > $LOGFILE + +####################################################################### +# +# Check that environment variable for path to climate executables is set +# +if [ "$CLIMATE_BIN_DIR" = "" ] +then + echo "In set_up_climate_runs: CLIMATE_BIN_DIR not defined in environment! Exiting." + exit 1 +else + echo "In set_up_climate_runs: CLIMATE_BIN_DIR = $CLIMATE_BIN_DIR \n" +fi + +# +# Change the directory to the climate data directory +# +cd ${CLIMATE_DATA_DIR} + +if [ ! -s ${CLIMATE_BIN_DIR}/set_up_climate ] +then + echo "${CLIMATE_BIN_DIR}/set_up_climate executable does not exist!" + echo "Halting set_up_climate_runs script execution .... " + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/set_up_climate ] + then + echo "${CLIMATE_BIN_DIR}/set_up_climate does not have execute permission!" + echo "Halting set_up_climate_runs script execution .... " + exit 1 + fi +fi + +# +# Call the wait GUI indicator (is this really necessary for just doing setup?) +# +$(dirname $0)/wait.tcl & + +# Execute set_up_climate +# +# The generated outputs need to be explicitly piped in order to resolve +# a potential display problem. +# +${CLIMATE_BIN_DIR}/set_up_climate $1 $2 >> $LOGFILE 2>> $LOGFILE + +# +# Restart the main climate menu and exit script +# +exec ${CLIMATE_BIN_DIR}/climate & + +# +# Set wait.tcl's process id to a variable 'pid' and kill the wait GUI. +# Modified the ps options for OB2 for BASH; requires that $UNIX95 is set for HP. +# +pid=`ps -eo pid,args | grep -E 'wish[ ].*wait.tcl' | awk '{print $1}'` + +if [ "$pid" != "" ] +then + kill $pid +fi + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate_stations b/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate_stations new file mode 100755 index 0000000000..ae9ffc3e52 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/set_up_climate_stations @@ -0,0 +1,111 @@ +#!/bin/sh + +############################################################################## +# +# set_up_climate_stations +# +# This is the script to set up the stations for the climate program. +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris - Changed from csh to sh +# - Removed CLIMATE_BIN_DIR definition, it +# is set in readenv.sh. General cleanup. +# - Replace -a's in tests. +# +# 09/04/2003 OB3 Mohammed Sikder A new technique was adopted in order +# to explicitly pipe the generated outputs +# from a set of climate scripts to a logfile. +# Te reason behind that was some of the nested +# GUIs in the climate was failing to get +# displayed at NGIT OB3 test platform. +# +############################################################################## +# +# +############################################################################## + +# +# Set the file path environment variables +# + +if [ "$CLIMATE_DIR" = "" ] +then + echo "\nFatal error in set_up_climate_stations: CLIMATE_DIR not defined in environment!" + echo " - Exiting." + exit 1 +fi + +CLIMATE_DATA_DIR=${CLIMATE_DIR}/data; export CLIMATE_DATA_DIR +CLIMATE_TMP_DIR=${CLIMATE_DIR}/tmp; export CLIMATE_TMP_DIR + +if [ ! -d ${CLIMATE_DATA_DIR} ] +then + echo "Directory ${CLIMATE_DATA_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting set_up_climate_stations script execution .... " + exit 1 +fi + +if [ ! -d ${CLIMATE_TMP_DIR} ] +then + echo "Directory ${CLIMATE_TMP_DIR} does not exist." + echo "Check installation and setup of Climate routines." + echo "Halting set_up_climate_stations script execution .... " + exit 1 +fi + + LOGFILE=${CLIMATE_TMP_DIR}/tmp.txt + echo "Set Up Climate Params run date/time: `date`" > $LOGFILE + +# +# Check that environment variable for path to climate executables is set +# +if [ "$CLIMATE_BIN_DIR" = "" ] +then + echo "\nIn set_up_climate_stations: CLIMATE_BIN_DIR not defined in environment!" + echo " - Exiting script." + exit 1 +else + echo "In set_up_climate_stations: CLIMATE_BIN_DIR = $CLIMATE_BIN_DIR \n" +fi + +# +# Change the directory to the temporary climate directory +# +cd ${CLIMATE_TMP_DIR} + +if [ ! -s ${CLIMATE_BIN_DIR}/set_up_climate ] +then + echo "${CLIMATE_BIN_DIR}/set_up_climate executable does not exist!" + echo "Halting set_up_climate_stations script execution .... " + exit 1 +else if [ ! -x ${CLIMATE_BIN_DIR}/set_up_climate ] + then + echo "${CLIMATE_BIN_DIR}/set_up_climate does not have execute permission!" + echo "Halting set_up_climate_stations script execution .... " + exit 1 + fi +fi + +# All this copying back-and-forth looks bogus. Is this a remnant of a one-time +# modification? Why wouldn't you just edit the file in ${CLIMATE_DATA_DIR}? +# The run-time scripts copy it from DATA to TMP each time anyway. I'm not going +# to f___ with it for now. - Morris, Dec. 2002, OB2 comment + +# Added 6/18/99 for new global file +cp ${CLIMATE_DATA_DIR}/global_day ${CLIMATE_TMP_DIR} + +# 6/10/99 Changed to reflect new set_up_climate +${CLIMATE_BIN_DIR}/set_up_climate params $1 $2 >> $LOGFILE 2>> $LOGFILE + +# Added 6/18/99 for new global file +cp ${CLIMATE_TMP_DIR}/global_day ${CLIMATE_DATA_DIR} + +# +# Restart the main climate menu and exit script +# +exec ${CLIMATE_BIN_DIR}/climate & + + +exit 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/startRecordClimate.pl b/nativeLib/files.native/adapt/climate/bin/Linux/startRecordClimate.pl new file mode 100755 index 0000000000..04d169ccb8 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/startRecordClimate.pl @@ -0,0 +1,70 @@ +#!/usr/local/perl/bin/perl -w + +use Env; + +#------------------------------------------------------------------------------- +# This script is called by startingest. +# this script which is needed to start up a recordClimate process. +# Before starting a recordClimate process, any leftover instances are terminated +# by calling killProc. +# +# MODIFICATION HISTORY: +# NAME DATE CHANGES +# ---- ---- ------- +# Bob Morris 12/09/002 - Change path adapt_apps/bin to climate/bin/HP-UX +# for OB2. Must change again once DS is Linux. +# - Get env vars from ifps file for OB2. Failure to +# find/set will be fatal after icwf_site.ccc file +# is removed in later build. +# Bob Morris 02/13/002 - Strip double quotes from $wfoname after grep. +# Bob Morris 03/06/003 - Add " umask 000; " to startup command so that +# pipe files are writeable by non-fxa after manual +# restarts. OB2 DR_12281 +# Bob Morris 03/28/03 - Fix env var ID for IFPS_SITE_OFFICE_NAME +#------------------------------------------------------------------------------- + +#system (" ${FXA_HOME}/bin/killProc recordClimate"); + +print "In startRecordClimate.pl, setting up partial IFPS environment:\n\n"; +print "ICWF_SITE = $ICWF_SITE\n\n"; + +$ifpsenvfile = "/awips/adapt/ifps/localbin/ifps-"; +$ifpsenvfile .= $ICWF_SITE; +$ifpsenvfile .= ".env"; +if ( -s $ifpsenvfile ) +{ + $wfoname = `grep "IFPS_SITE_OFFICE_NAME=" $ifpsenvfile | cut -f2 -d=`; + $wfoname =~ s/\"//g; + $wfoname =~ s/'//g; + $wfoname =~ s/\n//; + if ($wfoname eq "") { + print "In startRecordClimate.pl: WARNING!!\n"; + print "IFPS_SITE_OFFICE_NAME not set in $ifpsenvfile !!\n"; + print "RER products will have erroneous WFO name !!\n\n"; + } + else { + $ENV{'IFPS_SITE_OFFICE_NAME'} = $wfoname; + system ("echo IFPS_SITE_OFFICE_NAME = \$IFPS_SITE_OFFICE_NAME"); + } + + $wfotz = `grep "IFPS_SITE_TIMEZONE=" $ifpsenvfile | cut -f2 -d=`; + $wfotz =~ s/\n//; + if ($wfotz eq "") { + print "In startRecordClimate.pl: WARNING!!\n"; + print "IFPS_SITE_TIMEZONE not set in $ifpsenvfile !!\n"; + print "RER products will have erroneous issue time !!\n\n"; + } + else { + $ENV{'IFPS_SITE_TIMEZONE'} = $wfotz; + system ("echo IFPS_SITE_TIMEZONE = \$IFPS_SITE_TIMEZONE"); + } +} +else { +print "In startRecordClimate.pl, setting up partial IFPS environment,\n"; +print "file empty or not found: $ifpsenvfile \n"; +} +# Figure out which platform we are on and run that binary. +#system("umask 000; /usr/bin/ddd /awips/adapt/climate/bin/`uname -s`/recordClimate"); +system("umask 000; /awips/adapt/climate/bin/`uname -s`/recordClimate"); +#system ("/awips/fxa/data/recordClimate > /dev/null 2>&1 &"); + diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/stopRecordClimate.pl b/nativeLib/files.native/adapt/climate/bin/Linux/stopRecordClimate.pl new file mode 100755 index 0000000000..ba02c45652 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/stopRecordClimate.pl @@ -0,0 +1,8 @@ +#!/usr/local/perl/bin/perl -w + +use Env; + +# This script is called by stopingest. +# this script which is needed to stop a recordClimate process. + +system (" ${FXA_HOME}/bin/killProc recordClimate"); diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/success.tcl b/nativeLib/files.native/adapt/climate/bin/Linux/success.tcl new file mode 100755 index 0000000000..9b09e44339 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/success.tcl @@ -0,0 +1,27 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" "$@" +################################################################################# +# +# success.tcl +# +# Purpose +# This script notifies the user with a tcl button that climate has +# successfully Finished +# +# BER February 2000 +# +################################################################################# + +wm title . "Climate is Done" + wm geometry . +1030+400 + wm overrideredirect . 1 + button .done -bd 4 -bg black -highlightbackground black \ + -activebackground black\ + -image [image create photo -file $env(CLIMATE_DIR)/data/climate_map.gif]\ + -command { + destroy . + } + pack .done + + diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/textwsNotification.tcl b/nativeLib/files.native/adapt/climate/bin/Linux/textwsNotification.tcl new file mode 100755 index 0000000000..674e42a410 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/textwsNotification.tcl @@ -0,0 +1,63 @@ +#!/bin/sh +# the next line restarts using wish \ +exec /usr/local/tcltk8.3.2/bin/wish "$0" "$@" + +#exec textWish "$0" "$@" + +# --------------------------------------------------------------------------- +# +# textwsNotification.tcl +# +# Author: Dan Martin +# +# Modification History: +# --------------------------------------------------------------------------- + +# --- module ----------------------------------------------------------------- +# +# +# --- implementation --------------------------------------------------------- +# +# +# --------------------------------------------------------------------------- + +# --------------------------------------------------------------------------- +# +# Collaborative scripts +# +# --------------------------------------------------------------------------- + +# --------------------------------------------------------------------------- +# +# Module-global vars +# +# --------------------------------------------------------------------------- + +set TITLE "Climactic Record Notification" + +# --------------------------------------------------------------------------- +# +# Global functions (called from outside this file) +# +# --------------------------------------------------------------------------- + +# --------------------------------------------------------------------------- +# +# Procedure: main +# +# Purpose: create a notification box... this is temporary +# should use Announcer +# +# --------------------------------------------------------------------------- + +#main + +# don't show the parent +wm withdraw . + +# display a message box +tk_messageBox -icon "info" -message "$argv" -title "$TITLE" -type "ok" + +#destroy parent and return +destroy . +return 0 diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/toggle_cli_vip.py b/nativeLib/files.native/adapt/climate/bin/Linux/toggle_cli_vip.py new file mode 100755 index 0000000000..19c0a0b57d --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/toggle_cli_vip.py @@ -0,0 +1,61 @@ +#!/usr/local/python/bin/python +import sys, os, glob, cmd, string, getpass + +############################################################################### +# +# toggle_cli_vip.py Bob Morris, SAIC/MDL February 2002 +# +# DESCRIPTION +# ----------- +# +# Modifies AWIPS Climate control files for NWR product creation. Sets the +# Active/Inactive Switch, which controls the CRS voice selection, to the user's +# choice of "voice". The AIS character is in position 4 in line 4 of the +# control files: /awips/adapt/climate/data/header_* +# +# Modification History: +# --------------------- +# 12/05/2002 OB2 Bob Morris Changed path /adapt_apps/ to /climate/ +# +############################################################################### + +me = getpass.getuser() +if me != "fxa" and me != "awipsusr": + print "\nSorry, you must be fxa or awipsusr to run this script. Exiting.\n" + sys.exit() + +print "\nPlease select a CRS Voice Type to be used for Climate NWR Products." +ais = "X" +while ais != "C" and ais != "A" and ais != "Q": + ais = raw_input(" - Enter C for Concatenation, A for Synthesis, or Q to Quit: ") + ais = string.capitalize(ais) + +if ais == "C": + print "Voice Concatenation Selected." +elif ais == "A": + print "Voice Synthesis Selected." + +if ais != "Q": + os.chdir('/awips/adapt/climate/data') + filenames = glob.glob("header_*") + for file in filenames: + print "Modifying file: " + file + fp=open(file) + lines=fp.readlines() + newlist = [] + n = 1 + + for line in lines: + if n in [ 4 ]: + nline = line[:3] + ais[0:1] + line[4:] + newlist.append(nline) + else: + newlist.append(line) + n = n + 1 + + fp.close() + fp=open(file, 'w') + fp.writelines(newlist) + fp.close() +else: + print "Exiting, no changes." diff --git a/nativeLib/files.native/adapt/climate/bin/Linux/wait.tcl b/nativeLib/files.native/adapt/climate/bin/Linux/wait.tcl new file mode 100755 index 0000000000..9ac7c50ee0 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/bin/Linux/wait.tcl @@ -0,0 +1,32 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" +################################################################################# +# +# wait.tcl +# +# Purpose +# This script notifies the user with a tcl button that climate is +# running. When the processes have completed, the button will disappear +# automatically. +# +# BER January 2000 +# +################################################################################# + +proc blink {w option value1 value2 interval} { + $w config $option $value1 + after $interval [list blink $w $option\ + $value2 $value1 $interval] + } +wm title . "Running..." + wm geometry . +1080+400 + wm overrideredirect . 1 + button .clim -bd 5\ + -image [image create photo -file $env(CLIMATE_DIR)/data/hour_clim.gif]\ + -command { + destroy . + } + blink .clim -bg brown black 500 + pack .clim + diff --git a/nativeLib/files.native/adapt/climate/data/clibrwse.conf b/nativeLib/files.native/adapt/climate/data/clibrwse.conf new file mode 100644 index 0000000000..6839a14219 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/clibrwse.conf @@ -0,0 +1,9 @@ +# clibrwse.conf +# configuration file for Climate NWR Browser transfer +# +GUI /awips/fxa/bin/NWRBrowser +SCRIPT /awips/fxa/bin/transferNWR -a +DESTDIR $FXA_DATA/workFiles/nwr/pending +REVIEW 200 +# DO NOT modify the flags unless you know what you are doing +# product list diff --git a/nativeLib/files.native/adapt/climate/data/clinwws.conf b/nativeLib/files.native/adapt/climate/data/clinwws.conf new file mode 100644 index 0000000000..ce6931e0e0 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/clinwws.conf @@ -0,0 +1,9 @@ +# clinwws.conf +# configuration file for Climate NWWS file transfer +# +TEXTDB textdb -w WRKALTCLI < +SCRIPT $FXA_HOME/bin/transferNWWS.pl +DESTDIR $CLIMATE_DIR/tmp/ + +#DESTDIR $FXA_DATA/workFiles/nwws +# product list diff --git a/nativeLib/files.native/adapt/climate/data/error_blast.gif b/nativeLib/files.native/adapt/climate/data/error_blast.gif new file mode 100644 index 0000000000..6c7e5f75c9 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/error_blast.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/global_day b/nativeLib/files.native/adapt/climate/data/global_day new file mode 100644 index 0000000000..a4b92492b1 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/global_day @@ -0,0 +1,18 @@ + use_valid_im + T + use_valid_pm + T + no asterisk + T + no colon + T + no minus + F + no small letters + T + Hour Min ampm zone + 9 00 AM EST + Hour Min ampm zone + 17 00 PM EST + T1 T2 T3 T4 T5 T6 P1 P2 S1 + 99 95 90 60 32 20 1.00 2.00 1.0 diff --git a/nativeLib/files.native/adapt/climate/data/help/annual_periods.gif b/nativeLib/files.native/adapt/climate/data/help/annual_periods.gif new file mode 100644 index 0000000000..604982b64f Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/annual_periods.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/arrow.gif b/nativeLib/files.native/adapt/climate/data/help/arrow.gif new file mode 100644 index 0000000000..0f1f4ca1ee Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/arrow.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/awip_ban.gif b/nativeLib/files.native/adapt/climate/data/help/awip_ban.gif new file mode 100644 index 0000000000..8179fab153 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/awip_ban.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/bc_storm.gif b/nativeLib/files.native/adapt/climate/data/help/bc_storm.gif new file mode 100644 index 0000000000..dbff8872a6 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/bc_storm.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/broadcast.html b/nativeLib/files.native/adapt/climate/data/help/broadcast.html new file mode 100644 index 0000000000..6fa0052181 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/broadcast.html @@ -0,0 +1,59 @@ +<HTML> +<HEAD> +<title>HWR NWR Broadcast Format Editor + + +

+

+

HWR NWR Broadcast Format Editor

+
+
+Broadcast Format, +Station Format, +Default Format, +Configuration, +Thresholds, +Home +
+
+The weather element phrases for fixed stations and marine stations +are defined in one or more broadcast records per product. Some of the phrases +will only be formatted if threshold criteria for selected weather elements are met. Program hwrnwr will select the +correct sky/weather format based on the current sky/weather condition.
+
+Product "CCCHWRXXX" contains a template for the broadcast format. You can copy and modify the template +to meet your needs, or you may create your own broadcast records.
+
+/KDCA/At %ID%, { %SW% was falling; %SW% was reported; it was %SW% skies; %SW% were reported}
+ ([VV], reducing the visibility to %VV%U).
+ The temperature was %TF%U, the dewpoint %DF%, and the relative humidity %RR% percent,
+ ([HF], producing a heat index of %HF%).
+ ([FF]The wind was %DD% at %FF%U([GG], gusting to %GG%),
+ ([WF] producing a wind chill of %WF%).
+ The pressure was %PP%U and %PT%.$$
+
+%ID%, %SW%, %VV% are some of the symbolic words described in Figure 1-1 of the user documentation. For +example %ID% will be replaced with the station name for the station identifier "KDCA" +(e.g., Reagan National Airport).
+
+"{%SW% was falling; %SW% was reported; it was %SW%; %SW% were reported}" are four possible +phrases for the program hwrnwr to output depending on the observed weather. The first phrase will be used when +precipitation is falling (e.g., heavy snow was falling). The second phrase will be used generally for +obstructions to vision (e.g., blowing snow was reported). The third phrase will be used to broadcast sky +conditions (e.g., it was partly cloudy). The fourth phrase will be used to report weather conditions +stated in the plural (e.g., drizzle and fog were reported).
+
+The phrases in parentheses (e.g., visibility) are threshold phrases will only be output if the weather element in the brackets +reaches or exceeds a forecaster-specified threshold. The threshold is specified in the GUI.
+
+The above examples contain threshold phrases imbedded within other threshold phrases. Consequently, in the +above example, the gust phrase will be broadcast only if the wind speed meets or exceeds +the forecaster-specified threshold (e.g., [FF]) and if the gust speed meets or exceeds the forecaster-specified +threshold (e.g., [GG]).
+
+"~$$" signifies the end of the station's phrases.
+
+
+
Home
+ + diff --git a/nativeLib/files.native/adapt/climate/data/help/calfrop.gif b/nativeLib/files.native/adapt/climate/data/help/calfrop.gif new file mode 100644 index 0000000000..2884825b7e Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/calfrop.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/climate_map.gif b/nativeLib/files.native/adapt/climate/data/help/climate_map.gif new file mode 100644 index 0000000000..1369b54d85 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/climate_map.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/climate_master.gif b/nativeLib/files.native/adapt/climate/data/help/climate_master.gif new file mode 100644 index 0000000000..d3e73536c4 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/climate_master.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/climate_report_setup.html b/nativeLib/files.native/adapt/climate/data/help/climate_report_setup.html new file mode 100644 index 0000000000..da5d3a5fd1 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/climate_report_setup.html @@ -0,0 +1,32 @@ + + +Climate Reports Setup + + +

+ +

+

SET UP CLIMATE RUNS HELP PAGE

+
+
+
+Set Up Climate Runs allows the user to set up and select the type of configuration report and also choose the parameters which will be output.
+
+CLIMATE REPORTS SETUP GUI (Click here to see GUI) - This GUI is used to select the report type (i.e.,NWR or NWWS) and climatological input type (i.e., daily morning or daily evening) for the set_up_climate program. It is initiated by selecting the Set Up Climate Runs from the Climate Master GUI. Upon selection of the Next button, the Configuration for NWR GUI or the NWWS Setup Configuration GUI is initiated. +

+The Climate Reports Setup GUI provides the forecaster with the option to select either a NOAA Weather Radio report (NWR) or a NOAA Weather Wire Service (NWWS) report. Depending on the selection, either the NWR Setup Configuration GUI or the NWWS Setup Configuration GUI will be displayed when +clicking the NEXT... button.

+ +Set Up Climate Runs GUI's:

+NWR Setup Configuration
+NWWS Setup Configuration
+Select Products
+Report Format

+ +
+Return to Main Climate Help Page
+
+

+ + + diff --git a/nativeLib/files.native/adapt/climate/data/help/climate_reports_setup.gif b/nativeLib/files.native/adapt/climate/data/help/climate_reports_setup.gif new file mode 100644 index 0000000000..1da44b806b Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/climate_reports_setup.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/climo_help.html b/nativeLib/files.native/adapt/climate/data/help/climo_help.html new file mode 100644 index 0000000000..4cbee02c1e --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/climo_help.html @@ -0,0 +1,53 @@ + + +CLIMATE GUI HELP PAGE + + +

+

CLIMATOLOGY HELP PAGE

+
+
+ Please look for special NOTES/CAUTIONS when this arrow appears at the top of page.
+ +
+MASTER CLIMATE GUI (Click here to see GUI) Listed are options found on the Master Climate GUI. Please select from the following:
+
+Configure Climate Parameters - used to change parameters +which affect all of climate. Editing of the Valid Time for evening reports, the Climate Master Station table, +the Alternate Annual Periods, and the format of NWWS output products all occur via this option.

+Set Up/Edit Climate Products - allows the user to +select the type of report and the parameters for the output product. This +includes the product ID, periodicity, effective and expiration times, listening +area code (LAC), the stations for which a product will be generated, and all of +the output options for the product (i.e., weather elements and report periods). It is +also used to view the properties of products which already exist and delete product +ID's that are no longer needed.

+Execute Climate - Six run options exist: Daily Morning, Daily Intermediate, +Daily Evening, Monthly, Seasonal, and Annual. Once one of these options is +selected, an icon appears notifying that Climate is running. After the climate data is +derived, an icon will appear next to Edit Climate Data on the Monitoring +Control window. The user can then click 'Edit Climate Data' which will bring up +the new climate data.

+Create F6 Products - is used to create F6 output products for all stations +in the master station list for a chosen month.

+Initialize Climate Database - is used to manually enter or import recorded climatological data which includes both daily and monthly normal data.

+Quality Control Climate Database - allows the user to edit climate data that is already stored in the database.


+Clicking the menu bar "help" on individual GUI's while running climate will give help for that particular GUI. +

+ +

NOTES/CAUTIONS

+
Please look for special notes/cautions at the bottom of all help pages in this format.
+

+

+


+

+ +

+DJZ (PRC-contractor)
+NWSHQ Techniques Development Laboratory
+1/12/1999
+
+(Updated 1/5/2000 - BER) +

+ + diff --git a/nativeLib/files.native/adapt/climate/data/help/climo_prefs.gif b/nativeLib/files.native/adapt/climate/data/help/climo_prefs.gif new file mode 100644 index 0000000000..e981bf64ba Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/climo_prefs.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/climo_prefs.html b/nativeLib/files.native/adapt/climate/data/help/climo_prefs.html new file mode 100644 index 0000000000..0f23f1b5f1 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/climo_prefs.html @@ -0,0 +1,48 @@ + + +Climate Preferences Configuration + + +

+

+

CLIMATE PREFERENCES HELP PAGE

+
+
+
+ +Climate Preferences GUI- (Click here to see +GUI)

+ +The purpose of this interface is to configure the climate parameters which affect +all products ouput by the application.

+ +The Valid Time for Daily Evening Reports is used +in daily evening reports only. It defines the latest hour for which data is parsed +for the evening daily climatological reports.

+ +The Valid Time for Daily Intermediate Reports is +identical to the valid time for evening reports except that it applies +to intermediate daily products.

+ +In the middle portion of the interface are three buttons:
+ + +The NWWS Product Format section formats the appearance of all +NOAA Weather Wire climate products.

+ +The Save button saves the NWWS format section and the valid times. Any changes +made to the station list or the alternate annual periods must be saved within +their respective GUI's.

+ +Choosing Cancel from the preferences interface will not override changes +made and saved for the station list or the annual periods.

+ +
+Return to Main Climate GUI Help Page
+
+

+ + diff --git a/nativeLib/files.native/adapt/climate/data/help/column.gif b/nativeLib/files.native/adapt/climate/data/help/column.gif new file mode 100644 index 0000000000..b8d73fd241 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/column.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/confignwr.html b/nativeLib/files.native/adapt/climate/data/help/confignwr.html new file mode 100644 index 0000000000..90a8b2dd88 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/confignwr.html @@ -0,0 +1,54 @@ + + +HWR NWR Configuration Parameters + + +

+

+

HWR NWR Configuration Parameters

+
+
+Product # +Station Format, +Broadcast Format, +Default, +Thresholds, +Home +
+
+
+The Listening Area Code "LAC" field is a map to the broadcast towers. There must be +corresponding CRS entries for the LACs used here. One product can go to multiple +towers by putting in multiple LACs.
+
+The "Expiration:" field represents the number of minutes that are to be added to +the nominal hour in order to determine the expiration time of the product. +Enter the value by either directly typing it in or by incrementing/decrementing +via the up and down arrows. The allowable range of this field and its default +value used in the GUI are specified in the xhwrnwr.conf file.
+
+The "Summary Format Temp Range" field represents the range of +temperatures at or below which the temperatures for a group of stations will be +summarized in the output product. Enter the value by either directly typing it in +or by incrementing/decrementing via the up and down arrows. The allowable range +of this field and its default value used in the GUI are specified in the +xhwrnwr.conf file.
+
+Use the "Time Zone" pushbutton to choose the time zone to be used in your product +from a list of available time zones.
+
+Select the "Std Time All Yr?" field to prevent the product from switching to Daylight +Savings Time during the year.
+
+By default, if observations are more than 1 hour old, they are considered invalid and are not +used in the HWR. However, since C-MAN, buoy, and ship observations are not necessarily reported +every hour, the number of hours prior to creation time over which marine observations +are to be considered valid can be entered in the "Window for Marine Obs" field.
+
+Select the "Express Sky as Fair when SCP Missing?" field to have the word "FAIR" output +when the SCP observation is missing and the ASOS observation is clear or partly cloudy. +Otherwise, when the SCP is missing, the sky/weather will be output as missing.
+

+

Home
+ + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/confignwws.html b/nativeLib/files.native/adapt/climate/data/help/confignwws.html new file mode 100644 index 0000000000..92bc32c7c9 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/confignwws.html @@ -0,0 +1,43 @@ + + +HWR NWWS Configuration Parameters + + +

+

+

HWR NWWS Configuration Parameters

+
+
+Product #, +Station Format, +Thresholds, +HWR NWWS Home +
+

+The "Addressee" field (e.g., ALL) is used to route the product to the specified addressee.
+ +Select the "Include Temp in deg C?" option to output the temperature in the Remarks field, +in degrees Celsius. A "Y" selection does not necessarily result in the output of the temperature in degrees Celsius +becasues the output "Remarks" section can contain a maximum of two weather elements +based on a fixed priority order, with the temperature in degrees Celsius having the +lowest priority.
+
+Select the "Express Sky as Fair when SCP Missing?" field to have the word "FAIR" output +when the SCP observation is missing and the ASOS observation is clear or partly cloudy. +Otherwise, when the SCP is missing, the sky/weather will be output as missing.
+
+Select the "Time Zone" pushbutton to choose from the list of available time zones one +to be used in the product.
+
+Select the "Std Time All Yr?" field to prevent the product from switching to Daylight +Savings Time during the year.
+
+By default, if observations are more than 1 hour old, they are considered invalid and are not +used in the HWR. However, since C-MAN, buoy, and ship observations are not necessarily reported +every hour, the number of hours prior to creation time over which marine observations +are to be considered valid can be entered in the "Window for Marine Obs" field. +
+

+

HWR NWWS Home
+ + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/configs.html b/nativeLib/files.native/adapt/climate/data/help/configs.html new file mode 100644 index 0000000000..c7310af2a9 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/configs.html @@ -0,0 +1,157 @@ + + +Climate Product Configuration + + +

+

+

PRODUCT CONFIGURATION HELP PAGE

+
+
+
+ +
+

Valid Time

+The Valid Time for Daily Evening Reports and Valid Time for Daily +Intermediate Reports are used to define a cut-off time for finding the +maximums, minimums, and sums for their respective daily climatological report. +There are two ways to define the valid times: use the product creation time or +set a fixed local time. For example, if an evening report is desired and the +valid time is set to "As Of 5 P.M.", data for the station(s) will be parsed +beginning with midnight local time through 5 P.M. for the current day. On the +other hand, if the "Time of Climate Run" is selected, the report will contain +data from midnight through the time that climate is executed.

+ +

NOTES/CAUTIONS

+
    +Climate defaults to the "Time of Climate +Run" for the valid time if climate is executed before the user-defined "As Of" +time. For example, if the cron automatically runs at 3:30 PM and a valid time of +5:00 PM is chosen, the product will state that the report is valid as of 3:00 PM +(the latest hourly observations).


+ +



+ +
+

Station List

+
(Click here to see GUI)

+ +Station List- This list contains the stations available for the +climatological products.

+ +To edit the list, simply type a four-letter identifier in an empty station ID +box. The name of the station will appear as stored in the database. If an +identifier is not found, Invalid ID will appear in the associated +name box.

+ +The Std Time All Year box should be checked if a station remains on +standard time year-round.

+ +Oftentimes, long station names have been abbreviated in the database and ASOS +stations appear with the word ASOS attached. These cause complications when +used in a NOAA Weather Radio product to be read by the CRS. Therefore, the name +fields are editable.

+ +Save Stations saves the stations and any changes made for use by the climate +application only.

+ +One note, when a station with an edited name is deleted, if retrieval is desired +again, the name will have to be edited again.

+ +



+ +
+

Reporting Periods

+
(Click here to see GUI)

+ +Reporting Periods - These three fields determine the portion of the year +that snow, heating degree days, and cooling degree days appear in the climate +product.

+ +If the current date falls outside of the periods for any of these elements, it +will override any selection made via the report format GUI. For example, if the +heating degree days were chosen to be displayed for a product, the current date +is July 1, and the reporting period is from Sep. 1 to May 1, the heating degree +days will not appear in the final output since the current date falls outside the +reporting period.

+ +The reporting periods are product specific, meaning they can be set to different +dates for each climate product.

+ +



+ +
+

Alternate Annual (Seasonal) Periods

+
(Click here to see GUI)

+ +Alternate Annual Period (Season) - This interface sets the begin date for +the season-to-date totals of snow and liquid precipitation.

+ +Year-to-date totals for all elements are fixed and cannot be changed. They are +as follows:

+
+ + + + +
Heating Degree Days: July 1 - June 30
Cooling Degree Days: January 1 - December 31
Snow: July 1 - June 30
Precipitation: January 1 - December 31

+ +Some stations might be better suited by an alternate annual period. For example, +a station's wet season might occur from the middle of December to the end of January. +An alternate period of March to March might be better suited to keep breaking the wet +season apart into two separate yearly sums.

+ +If this is not necessary, the other option is to use the Current 3 Month Season + for a station. This results in season-to-date sums beginning with the first day +of a defined season.

+ +
+ + + + + +
Current MonthSeason Start Date
Dec., Jan., or Feb.December 1
Mar., Apr., or MayMarch 1
Jun., Jul., or Aug.June 1
Sep., Oct., or Nov.September 1

+ +The seasonal sums for the degree days cannot be changed and are always summed in +the three month intervals described above. Any changes made to the snow and +precipitation dates made via this interface will only appear in the final output +if the season-to-date total has been chosen.

+ +Note that any changes made will affect all products including those already +created.

+ +



+ +
+

Edit User-Defined Values / Change Threshold Values

+
(Click here to see GUI)

+Edit User-Defined Values - This interface allows the user to set specific threshold values +to Maximum and Minimum Temperature, Precipitation amount, and Snowfall amount.

+ +The number of days reaching or crossing the threshold value will be reported in the final +output.

+Existing monthly, seasonal, and annual climate data will not be automatically +regenerated with the new thresholds.

+What in the world does this warning mean?! If new thresholds are entered and the +Save button is pushed, this cryptic warning appears. It means that any +existing monthly, seasonal, and annual data run with the previous threshold +value will remain the same and not be automatically updated for the new value. +This means that all monthly data will have to be regenerated if an end of the +year report is desired and the threshold values have changed during the year. +Likewise, if the values change during the middle of a season and a seasonal report +is needed, the three months of data will have to be regenerated by the user. + + +



+ + +
+Return to Climate Preferences Help Page
+Return to Report Format Help Page
+Return to Main Climate GUI Help Page
+
+

+ + + diff --git a/nativeLib/files.native/adapt/climate/data/help/default.html b/nativeLib/files.native/adapt/climate/data/help/default.html new file mode 100644 index 0000000000..fe22e64fda --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/default.html @@ -0,0 +1,38 @@ + + +HWR NWR Default Format Editor + + +

+

+

HWR NWR Default Format Editor

+
+
+Product #, +Station Format, +Broadcast Format, +Configuration, +Thresholds, +Home +
+

+

+

+Stations that require a fixed phrase broadcast format also require a default format. +The fixed phrase format permits the user to compose output in an almost unlimited +manner. Many phrases contain more than one weather element, some without punctuation marks +after each weather element. Thus, the hwrnwr program won't necessarily be able to coherently drop +missing weather elements from a +fixed phrase. Default formats are output only when some of th forecaster-specified weather elements are +missing. This format requires a punctuation mark after +each phrase. The hwrnwr searches up to each punctuation mark and determines +if the weather element is missing in the phrase up to that point. The default format may be modified by the user, +and must be written so that it makes grammatical sense when any weather element is missing.
+
+The default format is basically the same as the fixed phrase format provided in the "Broadcast" +Help Page.
+
+
+

Home
+ + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/delete_climo_products.html b/nativeLib/files.native/adapt/climate/data/help/delete_climo_products.html new file mode 100644 index 0000000000..e5eaced451 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/delete_climo_products.html @@ -0,0 +1,87 @@ + + +Delete Climate Products + + +

+

+

EDIT CLIMATE PRODUCTS ID'S HELP PAGE

+
+
+
+DELETE CLIMATE PRODUCTS GUI (Click here to see GUI) +

+The File option opens to the Close toggle button which allows the user to +close this GUI.

+The Options selection opens to the Show Product Properties toggle button +which allows the user to view the properties of the selected product in the +Products list. (Click here to see a Product Properties +example.) The +following describes the fields associated with the Product Properties Window:

+
    +
  • Report Type - The type of report the selected product would generate. The user selects +the +Report type in the Climate Reports Setup GUI. +

    +

  • Stations - The station identifiers of the stations that the user selected the Select +Stations GUI. +

    +

  • Effective Time - The earliest allowable broadcast time of the Daily Climatological +Report for the +selected station. Effective time is declared in the Configuration for NWR GUI. +

    +

  • Expiration Time - The latest allowable broadcast time of the Daily Climatological +Report for the +selected station. Expiration time is declared in the Configuration for NWR GUI. +

    +

  • Periodicity - The amount of time between each broadcast of the selected product. +Periodicity is displayed in days, hours, and minutes and is converted from the number of minutes +entered in the Configuration for NWR GUI. +

    +

  • Address - The routing address for a NWWS product only. Address is declared in the +Configuration for NWWS GUI. +

    +

  • Reporting Periods - The periods in which Snow, HDD, and CDD will be reported for the +selected station. +The user specifies the Reporting Periods in the Report Format GUI. +

    +

  • Annual Periods - The beginning date for the annual periods for precipitation and snow +for the selected +station. The user specifies the Annual Periods in the Report Format GUI. +

    +

  • Valid Time for Evening Report - The end time for the report period (local midnight to +valid time) for +the evening Daily Climatological Report for the selected station. Valid Time is specified in the +Report Format +GUI. +

    +

  • Include Temp in deg C? - Yes, if temp in deg C is included in the report for the +selected +station. No, if temp in deg C is not included in the report for the selected station. This +option is +specified in the Report Format GUI. +

    +

  • The table at the bottom portion of the window displays the options the user selected +in the Report +Format GUI for the selected station.
+
+If the Product Properties window is no longer needed, it can be closed by toggling off the same +Show Product Properties toggle button under the Options selection in the Delete Climate +Products GUI. +

+The Product Time buttons (AM/PM) are used to select whether the morning or evening Daily +Climatological +Report product is to be deleted.

+The Products list contains all of the products which have been set up by the Weather +Forecast Office (WFO). + A product can be highlighted for deletion if it is no longer needed.

+The Delete Product button removes the product highlighted in the Products list from the +setup GUIs.

+The Close Window button closes this GUI and returns to the Master Climate +GUI

+

+Return to Climate GUI Help Page
+
+

+ + diff --git a/nativeLib/files.native/adapt/climate/data/help/delete_products.gif b/nativeLib/files.native/adapt/climate/data/help/delete_products.gif new file mode 100644 index 0000000000..e1e7d85635 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/delete_products.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/display.gif b/nativeLib/files.native/adapt/climate/data/help/display.gif new file mode 100644 index 0000000000..d109b11cc9 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/display.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/dispmethods.gif b/nativeLib/files.native/adapt/climate/data/help/dispmethods.gif new file mode 100644 index 0000000000..8b139e259b Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/dispmethods.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/dotblue.gif b/nativeLib/files.native/adapt/climate/data/help/dotblue.gif new file mode 100644 index 0000000000..2e9f5b4f22 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/dotblue.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/edit_climate.gif b/nativeLib/files.native/adapt/climate/data/help/edit_climate.gif new file mode 100644 index 0000000000..8e2d69f087 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/edit_climate.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/edit_data.gif b/nativeLib/files.native/adapt/climate/data/help/edit_data.gif new file mode 100644 index 0000000000..7a74a41f50 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/edit_data.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/edit_data.html b/nativeLib/files.native/adapt/climate/data/help/edit_data.html new file mode 100644 index 0000000000..60466b146d --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/edit_data.html @@ -0,0 +1,72 @@ + + +Edit Climate Help Page + + +

+

+

QUALITY CONTROL CLIMATE DATABASE HELP PAGE

+(Editing the climate database) +
+

+Quality Control Climate Database allows the user to edit climate data that +is already stored in the database.

+ Please read NOTES/CAUTIONS at the +bottom of this page.
+
+Edit Climatological Data - The GUI field displays Daily, Monthly, Seasonal, or +Annual data to be edited.

+ (GUI for Daily values)  |  + (GUI for Period values) +
+

+ + +Data Type - This field allows the user to choose either Daily, +Monthly, Seasonal, and Annual data to be displayed within the bottom +portion of the GUI.

+ +Station - This field provides the user with the option to select the +climatological station name for which data is to be displayed in this GUI. +When this GUI is initiated, the first station in the list is automatically +highlighted and its daily observations are loaded in the GUI.

+Modify Station Values - This option provides the capability to update data in the +Climate database for every field in the GUI.

+Cancel Station Changes - This option cancels any changes that were made to the station +values during the current session. This option does not affect data already stored in the +Climate database. +

+Depending on the type of data selected, different date navigation menus appear:
+Date - Select the date for the Daily climatology data.
+Month - Select the month for the Monthly climatology data.
+End Month of Season - Select the ending month of the season for the Seasonal climatology data. +
      (August would be selected for the three month season +June/July/August.)
+Year - Select the year for the Annual climatology data.

+ +Click on MISSING for more information on +climate's handling of missing data. + +

Notes/Cautions

+ A maximum of 20 stations are allowable +in the station list.

+ Holding the right mouse button in +any field containing a measured element displays how the value was obtained. +(More Detail)

+Basic error checking for the variables +is provided. A warning message is displayed when values are entered that are +outside of the allowable range. The warning message states Values out of bounds! +Please enter last number again. . Missing data are represented as either "9999" +or, for variables reported to the decimal amount, "9999.0". Missing times are +represented as "99".

+If new daily values are saved for a +station, Climate checks for existing monthly, seasonal, and annual data. A warning +appears if data are present, and each existing record can be updated if desired. +Changing monthly data results in updates of seasonal and annual data, and changes +in seasonal data result in an update of annual data if desired.

+
+Return to Main Climate GUI Help Page
+
+

+ + diff --git a/nativeLib/files.native/adapt/climate/data/help/error_blast.gif b/nativeLib/files.native/adapt/climate/data/help/error_blast.gif new file mode 100644 index 0000000000..6c7e5f75c9 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/error_blast.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/execute_AM_PM_climate.html b/nativeLib/files.native/adapt/climate/data/help/execute_AM_PM_climate.html new file mode 100644 index 0000000000..eac19ee445 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/execute_AM_PM_climate.html @@ -0,0 +1,93 @@ + + +Execute Climate + + +

+

+

EXECUTE CLIMATE HELP PAGE

+
+
+
+
Please read NOTES/CAUTIONS at the bottom of this page.
+
+Select Climate Run - (Click here to see GUI).
+This GUI allows the user to select the date, month, season, or year (whether current or past) for the +climatology report. Climate can be executed for the most recent completed period +or any other chosen period.

+
+
For example: Today is Feb. 7, 2000, selecting the Latest +Climate period results in yesterday's climate for a daily morning run, +today's climate through the designated valid time for daily intermediate and +evening runs, Jan. 1-31 for a monthly run, Sept. 1-Nov. 30, 1999 for a seasonal +run, and 1999 data for an annual run.

+
+DAILY DISPLAY CLIMATE GUI (Click here to see GUI)

+Accept Values - The displayed values are stored into the Verification database.

+Clear Values - The displayed data is removed from the GUI so that the fields are blank. This option does not affect data already stored in the Verification database.

+Station - This field provides the user with the option to select the climatological station for which data is to be displayed in this GUI. When this GUI is initiated, the first station in the list is automatically highlighted and its daily observations are loaded in the GUI.

+Date - The field displays the observation date.

+Type of Summary - This field displays either morning, intermediate, or evening daily climate summary.

+The forecaster can change the values if needed but he/she must select Accept Values for each +station edited before closing the GUI.

+
+PERIOD DISPLAY CLIMATE GUI (Click here to see GUI)

+This GUI is used for monthly, seasonal, and annual climate runs. The type of summary +and the dates of inclusion for the run are displayed in the upper right portion +of the interface.

+For monthly runs, data are retrieved/calculated from both the ASOS Monthly Summary +Message (MSM) and the existing daily database values. If an element does not +display an option menu, it means that the value has been retrieved from the +daily database. If an MSM exists, it will be the default value of choice. The +daily database value can be chosen, but the Save Station Values button has +to be selected to override the default. If both are missing, a value can be +entered and the option menu displays "Other". Again, the values then have to be +saved. + +Hopefully, the MSM and daily database values are equal. In the case that they +are not, the offending elements will be displayed in reverse color.

+

+
Example where the MSM and daily database maximum temperatures do not agree +
for Pittsburgh. Also, at least one of the precipitation elements do not agree.


+ +Do you want to update the daily database with the MSM values?
+This warning appears when mismatched values are detected (as described above). +Choosing Yes results in Climate replacing the maximum temperature, +minimum temperature, and snow depth values in the daily database with the MSM values +for the given dates of occurrence (where they do not equal the daily database values). +Choosing No does not update the daily database.

+Seasonal and annual values are compiled from the monthly records. Monthly, +seasonal, and annual records are only saved to the database when a complete +period is run. A monthly report for Jan.1-31 will be saved while a month to +date run for Jan. 1-15 will not.

+ +
+EDIT NWWS PRODUCTS GUI (Click here to see GUI)

+After display climate is closed, Climate formats the output products. If any NWWS +products are set up, the Review Climate Product interface appears. +This allows an opportunity to edit the report before it is sent over the Weather +Wire.

+Clear - This button simply clears the display field.

+Delete - This button removes a product from the list of reports.

+Save - This saves any changes made to a product in the edit window.

+Send - Transmits the output products over the NOAA Weather Wire.

+
+ +

Treatment of Missing

+Click on MISSING for more information on climate's handling of missing data. + +

NOTES/CAUTIONS

+
Punctuation is very important, since the voice synthesizer will be confused by spaces preceding commas and periods. Therefore, be sure to check the printout when initially setting up and testing your files.

+ In the Daily Display Climate GUI, holding +the right mouse button in any field containing a measured element displays how +the value was obtained.(More Detail)

+ If a daily value ties or breaks a record, +the record will automatically be updated in the historical database.

+ If the forecaster wishes to view the NWWS product after it has been distributed for broadcast on the wide area network (WAN), the file will be located in a text window under the product ID of "WRKALTCLI".

+
+Return to Main Climate Help Page
+
+

+ + + diff --git a/nativeLib/files.native/adapt/climate/data/help/f6.html b/nativeLib/files.native/adapt/climate/data/help/f6.html new file mode 100644 index 0000000000..a1ed613912 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/f6.html @@ -0,0 +1,29 @@ + + +F6 CREATION HELP PAGE + + +

+

F6 CREATION HELP PAGE

+
+
+ +


+This option provides a tabular depiction of the climate data for a chosen month. +The first option is to create the F6 product for the current month through the +current day. The other option is to create a product for a previous month by +selecting the desired month from the option menu and entering the year into +the year field. +

+ +From the station list on the right, select the stations for which an F6 is to be +generated. They can be printed to the local printer by checking the Print +selected F6s button. The products will be output into the text database +with the PIL SSSLCDMMM, where SSS represents the three-letter station id and MMM +is the three-letter month (ex. Pittsburgh's F6 for the month of March would +be saved as PITLCDMAR) +

+
+Return to Main Climate GUI Help Page
+
+
diff --git a/nativeLib/files.native/adapt/climate/data/help/f6date.gif b/nativeLib/files.native/adapt/climate/data/help/f6date.gif new file mode 100644 index 0000000000..425ac88107 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/f6date.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/helpnwr.html b/nativeLib/files.native/adapt/climate/data/help/helpnwr.html new file mode 100644 index 0000000000..dd7d9ae39c --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/helpnwr.html @@ -0,0 +1,39 @@ + + +HWR NWR GUI Help Page + + + +

+ +

HWR NWR Help Page

+ +

+


Product #, Station +Format, Broadcast Format, Default +Format, Configuration, Thresholds + +

+ +
    +

    Welcome to the help page for the Hourly Weather +Roundup for the NOAA Weather Radio. The hwrnwr program creates +voice-ready products for broadcast over the NWR. Please refer to the users +documentation, "Hourly Weather Roundup Formatter For The NOAA Weather +Radio And Weather Wire Service" for a thorough description of this +program.

    + +

    You can use these pages for guidance with site-initialization of the +program.

    + +

    +


    + +
    Gary Battel (GSC-contractor)
    +NWSHQ Techniques Development Laboratory
    +9/3/1998

    +
    +
+ + + diff --git a/nativeLib/files.native/adapt/climate/data/help/helpnwws.html b/nativeLib/files.native/adapt/climate/data/help/helpnwws.html new file mode 100644 index 0000000000..4584b626c2 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/helpnwws.html @@ -0,0 +1,33 @@ + + +HWR NWWS GUI Help Page + + +

+

HWR NWWS GUI Help Page

+

+Product #, +Station Format, +Configuration, +Thresholds
+

    +Welcome +to the help page for the Hourly Weather Roundup for the NOAA Weather Wire +Service. The program creates a tabular product consisting +of weather observations for land and marine stations which is disseminated over +the NWWS. Please refer to the users documentation, "NOAA Hourly +Weather Roundup Formatter For The NOAA Weather Radio And Weather +Wire Service" for a thorough description of this program. +

    +You can use these pages for guidance with site-initialization of the program. +

    +


    +

    + +Sal Romano (GSC-contractor)
    +NWSHQ Techniques Development Laboratory
    +9/3/1998
    +
    +
    + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/hour_clim.gif b/nativeLib/files.native/adapt/climate/data/help/hour_clim.gif new file mode 100644 index 0000000000..d4e46fe157 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/hour_clim.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/import_climate.gif b/nativeLib/files.native/adapt/climate/data/help/import_climate.gif new file mode 100644 index 0000000000..e0b66dc273 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/import_climate.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/import_climate.html b/nativeLib/files.native/adapt/climate/data/help/import_climate.html new file mode 100644 index 0000000000..02bfacba26 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/import_climate.html @@ -0,0 +1,52 @@ + + +IMPORT CLIMATE GUI HELP PAGE + + +

    +

    IMPORT CLIMATE HELP PAGE

    +
    +
    + Please read NOTES/CAUTIONS at the bottom of this page.
    +
    +IMPORT CLIMATE GUI (Click here to see GUI) Listed are options found on the Master Climate GUI. Please select from the following:
    +

    +Station Name - This field displays the stations currently in the database.

    +Station Name(s) in Header(s) - This button allows the forecaster to specify that the station name(s) appears in the header(s) of the import file. This is useful when the file contains more than one stations data separated by headers.

    +Station Name(s) in Data - This button allows the forecaster to specify that the station name(s) appears in the data of the import file.

    +Enter Data Delimiters - This field allows the forecaster to insert any delimiter that appears in the imported climatology file. The delimiter defaults are * , space , and / . If any other delimiter is used, the forecaster must enter the appropriate character(s) into the field. There is no specific format for this; if entering more than one delimiter, neither spaces nor commas are needed.

    +File Name - This field displays the name of the import file. The file name will only appear after the forecaster goes through the process of Getting a New Data File Name.

    +Get New Data File Name - This button generates the Choose File to be Imported GUI which allows the forecaster to browse the directories for the import file.

    +Data Type - The Daily button and the Monthly button specifies whether the import file is daily climatology or monthly climatology.

    +Data Format - This field lists the months January through December and allows the forecaster to specify what month(s) the file(s) pertains to.

    +Month Name(s) in Header(s) - This button allows the forecaster to specify if the month name(s) appears in the header(s). This is useful when a file contains more than one month's data separated by headers.

    +Month Located in Data field - This button allows the forecaster to specify whether the month name is located in the data field. If so, the forecaster must select Month first if the format for the date places the month first, Day first if the format for the date places the day first, or Julian Days if the date is recorded in Julian days.

    +Arrange Order - This button allows the forecaster to specify the format of each data file. Once activated, this button will bring up the Import Daily or Monthly Climatology Data GUI where the forecaster arranges the climatology data according to the order of the data in the import file. NOTE: The format must be arranged before the file can be imported.

    +Add File to List - This button adds the specified file to the pending list onthe right. The specific file name, station, data type, data format and delimiter values become visible.

    +Save New Values for File - This button saves any format changes made to the highlighted file already in the pending list.

    +Delete From List - This button deletes the highlighted file from the import list.

    +Import Data From File(s) - This button imports the data from all of the files contained in the import list.

    +Cancel - The cancel button makes no changes and closes the Import Climate GUI. NOTE: The same effect is achieved by toggling off the
    Import Climate Window
    option in the File menu of Climatology Normals, Means, Extremes GUI.

    +Choose File to be Imported - This button will call up a GUI that enables the forecaster to import a file from a specified directory.

    +
    +IMPORT DAILY OR MONTHLY CLIMATOLOGY DATA GUI (Click here to see GUI)

    +Climatology Data Options - Includes a list of variables that may be contained in the WFO's daily or monthly climatology, dependent upon the format chosen for the file (daily or monthly).

    +Order of Data in File - Once a data variable is selected in the Climatology Data Options list it is displayed with its associated column number in this field. A variable may be selected by double-clicking the left mouse button or by highlighting the variable and single-clicking the Append button. +Append - Moves selected variable from Climatology Data Options to Order of Data in File. Append can also be activated by double-clicking the left mousebutton.

    +Place - Opens the Column Placement GUI (Click here to see GUI) and allows the forecaster to move the selected variable from Climatology Data Options to a specific column number in the Order of Data in File field. This is helpful if the forecaster leaves a variable out in the initial configuration. The addition of that variable can be made without starting over. NOTE: The variable placed will not remove any other elements, but will push the remaining list down one column.

    +Append All - Moves all of the remaining variables in Climatology Data Options to the Order of Data in File field. The variables will keep the order in which they appear under Climatology Data Options. NOTE: Other data not listed will not move unless directly selected and appended.

    +Remove - Takes the selected variable in the Order of Data in File and places it back in the Climatology Data Options field shifting the list up one place. If no variable is selected, the variable listed with column 1 is the default and will be removed. Remove can also be activated by double-clicking the left mouse button.

    +Remove All - Selects all of the variables in the Order of Data in File field and places them in the Climatology Data Options field.

    +Accept - Saves the changes and returns the forecaster to the Import Climate GUI.

    +Cancel - Closes the GUI without saving the values and returns forecaster to the Import Climate GUI.

    + +

    NOTES/CAUTIONS

    +If using 'arrange order', the format must be arranged before the file can be imported.
    +
    After clicking 'Import Data from File(s)', in order to view the new imported data, the forecaster must double click on the correct station found on the Climatology Normals, Means, Extremes GUI.
    +

    +
    +Return to Main Climate Help Page
    +
    +

    + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/imported_data.gif b/nativeLib/files.native/adapt/climate/data/help/imported_data.gif new file mode 100644 index 0000000000..571df633cd Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/imported_data.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/initialize_climate.html b/nativeLib/files.native/adapt/climate/data/help/initialize_climate.html new file mode 100644 index 0000000000..21929f157b --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/initialize_climate.html @@ -0,0 +1,72 @@ + + +Norms, Means, Extremes + + +

    +

    +

    INITIALIZE CLIMATE DATABASE HELP PAGE

    +Click here for Climatology Normals, Means, Extremes GUI
    +Click here for Climatology Normals, Means, Extremes GUI - +Daily
    +Click here for Climatology Normals, Means, Extremes GUI +- Period
    +
    +
    +
    + Please look for special NOTES/CAUTIONS when this arrow appears at the top of page.
    +
    +Under the FILE option you will find an option to Import data. You can use this option to populate the climate database from a file. Click on Import Climate Data for more information.
    +
    +Station - This GUI field provides the user with the option to select the climatological station name for which data is to be immediately displayed in the Daily Normals, Means, Extremes GUI. The station name must be double clicked in order for the Daily Normals, Means, Extremes GUI to respond.

    +Normals Period - The starting year and ending year of the period over which climatological normal values were determined can be entered in these two fields.

    +Records Period - The starting year and ending year of the period of record for extreme values can be entered in these two fields.

    +Save Years - Selecting this button stores the years entered for the Normals Period and Records Period for the selected station.

    +Climatological Input Type - This field provides the option to select the climatological reports input data type template that will be displayed in the Daily Normals, Means, Extremes GUI. The choices listed are Daily, Monthly, Seasonally, Yearly, and Display Dailys by Month.

    +Close - Selecting this field closes the init_climate application and all GUIs associated with it. It then returns the user to the Master Climate GUI

    + +The Daily Normals, Means, Extremes GUI is used to manually enter into the database the +daily normals, means, and record values for each day of the year, for a station. The Monthly +Normals and Extremes GUI is used to manually enter into the database the monthly, seasonal, +and annual normals and record values for a station. Basic error checking for the variables is +provided. A warning message is displayed when values +are entered that are outside of the allowable range. The warning message states Values out of bounds! Please enter last number again. Click on MISSING for more information on climate's handling of missing data. The GUIs fields are explained below:

    +Station - This field displays the station name that was selected by the forecaster in the previous GUI, Climatology Normals, Means, Extremes.

    +Month and Day - The observation month and day can be entered in these two fields by two methods. The forecaster can either make a selection from the pull-down menus or increment these fields using the up and down arrows.

    +First - This option displays the first record in the database that contains data for the selected station.

    +Add Record - This button saves the changes to the database only if the record has been modified for the first time.

    +Modify Record - This button saves the changes to the database only if changes have been made to a record that previously contained data.

    +Delete Record - The displayed day s data are deleted from the Verification database when this field is selected. The user is prompted to confirm the deletion.

    +Last -This option displays the last record in the database that contains data for the selected station. It is difficult to type in a station s data for the entire year at once. Thus, data entry can be quickly resumed with this option since it returns to the last entry.

    +Temperature - Please refer to users manual for description on individual items.

    +Precipitation - Please refer to users manual for description on individual items.

    +Heating/Cooling Degree Days - Please refer to users manual for description on individual items.

    +Snowfall - Please refer to users manual for description on individual items.

    +
    +Why can't some of the fields be edited in the period GUI?
    +Some of the monthly, seasonal, and annual normals and extremes can be determined +from daily values which are stored in the database. Normal average maximum and +minimum temperatures, normal mean temperature, record maximum and minimum +temperatures, normal total precipitation, normal daily average precipitation, +normal total snowfall, heating degree days, and cooling degree days can be +derived from daily historical data which is present. Any time a daily +record is modified, these values will be recalculated.

    +How are values already stored for monthly, seasonal, and annual if this is the first +time 5.0 Initialize has been run?
    +If no monthly, seasonal, or annual records exist in the historical database, all of the +values described in the previous question are generated. There probably was a delay +between the time that the Climate Master GUI disappeared and the Initialize Climate +interfaces appeared. This was because the period historical database was being +initialized automatically. Subsequent runs of initialize climate will not have +the delay. + +

    NOTES/CAUTIONS

    +
    Do not enter data into year 2 or year 3 if there is not a record for year 1. It creates bad output.
    +

    + +
    +Return to Main Climate Help Page
    +
    +

    + + diff --git a/nativeLib/files.native/adapt/climate/data/help/missing.html b/nativeLib/files.native/adapt/climate/data/help/missing.html new file mode 100644 index 0000000000..5dfe751a22 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/missing.html @@ -0,0 +1,37 @@ + + +CLIMATE GUI HELP PAGE + + +

    +

    TREATMENT OF MISSING HELP PAGE

    +
    +
    + +Treatment of Missing

    + +The Climatological Reports Formatter will display missing data in the GUIs as follows:

    + +- Missing data values (i.e., temperature) are represented by 9999.

    + +- Missing amounts (i.e., snowfall) are represented by 9999.0.

    + +- Missing degree days are represented by -9999.

    + +- Missing hours and minutes are represented by 99.

    + +- Missing pressure values are repressented by 99.99.

    + +- Trace precipitation is reported as "T". It is stored as a -1 in the database.

    + +The Climatological Reports Formatter will not include any missing values in the NWR product output.

    + +The NWWS product output does include missing values and represents them with MM.

    + +*Click Netscape back to return to previous page.

    +
    +Return to Main Climate Help Page
    +
    +

    + + diff --git a/nativeLib/files.native/adapt/climate/data/help/mon_disp.gif b/nativeLib/files.native/adapt/climate/data/help/mon_disp.gif new file mode 100644 index 0000000000..fef1389f2c Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/mon_disp.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/norms_extremes1.gif b/nativeLib/files.native/adapt/climate/data/help/norms_extremes1.gif new file mode 100644 index 0000000000..42c8a9e9f8 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/norms_extremes1.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/norms_extremes2.gif b/nativeLib/files.native/adapt/climate/data/help/norms_extremes2.gif new file mode 100644 index 0000000000..5770f57be8 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/norms_extremes2.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/norms_extremes_mon.gif b/nativeLib/files.native/adapt/climate/data/help/norms_extremes_mon.gif new file mode 100644 index 0000000000..46eaeb1b76 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/norms_extremes_mon.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/notequal.gif b/nativeLib/files.native/adapt/climate/data/help/notequal.gif new file mode 100644 index 0000000000..4f0f3a1866 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/notequal.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/nwr_config.gif b/nativeLib/files.native/adapt/climate/data/help/nwr_config.gif new file mode 100644 index 0000000000..3c5194ec41 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/nwr_config.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/nwws_config.gif b/nativeLib/files.native/adapt/climate/data/help/nwws_config.gif new file mode 100644 index 0000000000..0073c02644 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/nwws_config.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/product_properties.gif b/nativeLib/files.native/adapt/climate/data/help/product_properties.gif new file mode 100644 index 0000000000..7c6e6e0be8 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/product_properties.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/productnwr.html b/nativeLib/files.native/adapt/climate/data/help/productnwr.html new file mode 100644 index 0000000000..2b99c2b430 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/productnwr.html @@ -0,0 +1,48 @@ + + +HWR NWR Product + + + +


    +

    +

    HWR NWR Product

    +
    +
    Station Editor, Broadcast +Editor, Default Editor, Configuration, +Thresholds, Home + +

    +

    + +

    + +
      +
        +
      • Before you use the GUI, edit the xhwrnwr.conf file product list.
      • + +
          +
        • Change all the "CCCHWRNWx" entries to 9-character product +IDs.
        • + +
        • Keep "CCCHWRXXX" in the list, since this serves as a template. +
        • +
        + +
      • Edit the hwrnwr.conf file. Change the output product names to match +those in the xhwrnwr.conf file.
      • + +
      • Use the xhwrnwr GUI to select the product ID that you wish to edit. +
      • + +
      • You can launch another GUI and select Product # in order to cut and +paste from the Station Editor or Broadcast Editor to your new product. +
      • +
      + +


      +Home

      +
    + + + diff --git a/nativeLib/files.native/adapt/climate/data/help/productnwws.html b/nativeLib/files.native/adapt/climate/data/help/productnwws.html new file mode 100644 index 0000000000..86985f34e4 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/productnwws.html @@ -0,0 +1,49 @@ + + +HWR NWWS Product + + + +


    +

    +

    HWR NWWS Product

    +
    +
    Station Editor, +Configuration, +Thresholds, +Home + +

    +

    + +

    + +
      +
        +
      • Before you use the GUI, edit the xhwrnwws.conf file product list.
      • + +
          +
        • Change the "CCCSWRXX" entry to an 8 or 9-character product +ID.
        • + +
        • Keep "CCCSWRXX" in the list, since this serves as a template. +
        • +
        + +
      • Edit the hwrnwws.conf file. Change the output product names to match +those in the xhwrnwws.conf file.
      • + +
      • Use the xhwrnwws GUI to select the product ID that you wish to edit. +
      • + +
      • You can launch another GUI and select Product # in order to cut and +paste from the Station Editor to your new product. +
      • +
      + +


      +Home

      +
    + + + diff --git a/nativeLib/files.native/adapt/climate/data/help/qcmethods.gif b/nativeLib/files.native/adapt/climate/data/help/qcmethods.gif new file mode 100644 index 0000000000..bc17622f61 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/qcmethods.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/report_format.gif b/nativeLib/files.native/adapt/climate/data/help/report_format.gif new file mode 100644 index 0000000000..e206744547 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/report_format.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/report_format.html b/nativeLib/files.native/adapt/climate/data/help/report_format.html new file mode 100644 index 0000000000..3ee3f4bfa8 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/report_format.html @@ -0,0 +1,121 @@ + + +Report Format + + +

    +

    +

    REPORT FORMAT HELP PAGE

    +
    +
    +
    +Report Format serves as the central hub for the set_up_climate application. +All formatting of climate can be set via this interface. Most importantly, +new products are created, and existing products are edited.

    + Please read NOTES/CAUTIONS +at the bottom of this page.
    +
    +REPORT FORMAT GUI
    + (Click here to see sample GUI for Daily Climate) - +This applies to Morning, Intermediate, and Evening Climate.
    + (Click here to see sample GUI for Period Climate) - +This applies to Monthly, Seasonal, and Annual Climate. +

    The GUI is broken into four main sections: + +Report Type:

    +This section provides the forecaster with the option to select +a NOAA Weather Radio (NWR) or a NOAA Weather Wire Service (NWWS) report. A daily +morning, daily intermediate, daily evening, monthly, seasonal, or annual report is also selected +in this section.

    + +
    Report Configuration:

    +A three-letter product identifier must be entered into the Product ID field +before the product can be saved. The same identifier can be used for a morning and +an evening product, but cannot be used for both an NWR and an NWWS product of one +time type. For example, PIT can be used for a morning daily NWR report and an evening +NWR report, but different identifiers have to be used for a morning daily NWR report +and a morning daily NWWS report. (For more information on how to open existing +products, see the
    menu bar description)

    +NWR PRODUCTS

    +The number of minutes in between broadcasts of the Climatological Report can be entered into the Periodicity field by two methods. The forecaster can either directly type in the time or can increment/decrement using the up and down arrows to reach the value.

    +The Effective Time is the earliest allowable broadcast time of the Climatological Report. The forecaster can either directly type in the time or can increment/decrement using the up and down arrows to reach the value.

    +The Expiration Time field is the latest allowable broadcast time of the Climatological Report. The forecaster can either directly type in the time or can increment/decrement using the up and down arrows to reach the value.

    +The LAC is the Listening Area Code (LAC) field. The forecaster can enter the zones over which the product must be transmitted in this field. The CRS then maps these zones to the correct transmitter.

    +NWWS PRODUCTS

    +The Address field is for the entry of the local CRS or another addressee, +perhaps a backup office to be used during a CRS failure.

    + +Select Stations:

    +This section is used to select the stations for inclusion in the Climatological +Report.

    + +
    Weather Elements:

    +This section which occupies the bottom half of the GUI is used to select which +elements are to be included in the climatological report. When an element is +selected from the list under Categories, all of the options available +for that element are displayed in the field to the right. The desired options +for the final product are then checked off.

    + +Description of the options available:
      +The first choice in each column represents the Observed values.
      +Time/Date of Occurrence is the time of day when an extreme value occurred.
      +Record is the historical extreme recorded for the period.
      +Date/Year is the year which the historical record occurred.
      +Normal is the historically averaged normal value.
      +Departure is the departure of the current period's value from the historical normal.
      +Last Year's is the value one year prior.
      +Month to Date, Season to Date, and Year to Date options also exist for some elements.
      +
    + +The Include All/None check boxes are provided as a shortcut for selecting or +deselecting all options of an element.

    +

    + +Buttons

    +
    + + Menu Bar Description

    +The menu bar provides the same functionality as the buttons with the addition of +four functions which cannot be accessed by a push button.

    +New Product can be selected from the File menu to create a +product using the default values as a foundation.

    +Under the File menu, when selecting Open Existing Product, +another menu appears prompting for the type of report desired. Once the type has +been selected, a list of previously created products appears. Choosing one results +in the properties of the product to be displayed.

    +Under the Edit menu, Edit Reporting Periods, Edit Annual Periods, +Change Threshold Values, and Edit Station List can be selected and their respective +GUI's will be invoked. Select All Elements and Deselect All Elements can be chosen +to quickly select or deselect every reportable option within each category.

    +Under the Options menu, Current Products Window opens up a new window that +displays the current products for the selected Report Type. It can also be +used to open a product by double-clicking on a product ID.

    + +

    NOTES/CAUTIONS

    +
    +The 'Daily Snow' and 'Daily Precip' +normal and departure check boxes control the output for the MTD, STD and YTD. +For example, if you toggle off 'Daily Precip' normal, you will not get the daily +normal, Month to Date normal, Season to Date normal, or Year to Date + normal.

    +For an NWR report, the normal of a weather element +must be selected before the departure from normal can be selected. If the departure +is selected, the normal is automatically selected.

    + +
    +Return to Main Climate GUI Help Page
    +
    +

    + + diff --git a/nativeLib/files.native/adapt/climate/data/help/report_format_MON.gif b/nativeLib/files.native/adapt/climate/data/help/report_format_MON.gif new file mode 100644 index 0000000000..b0cee20357 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/report_format_MON.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/report_periods.gif b/nativeLib/files.native/adapt/climate/data/help/report_periods.gif new file mode 100644 index 0000000000..8d50bab733 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/report_periods.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/retrieve.html b/nativeLib/files.native/adapt/climate/data/help/retrieve.html new file mode 100644 index 0000000000..7851c4aec3 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/retrieve.html @@ -0,0 +1,89 @@ + + +Quality Control Help Page + + +

    +

    +

    VIEWING THE METHOD OF RETRIEVAL

    +
    +

    + +This feature can be used to view how certain data was obtained. All of the daily +elements that are measured are either retrieved from the Daily Summary Message or METAR +data, while the monthly is taken from the Monthly Summary Message or Daily Database. +Both the Edit Climatological Data GUI and the Display Station Daily +Climate Values GUI are equipped to display this retrieval information.

    + +In either case, holding down the right mouse button over a measured element's +value or label results in a pop-up displaying the value along with how it was +retrieved.

    + +Retrieval methods can be viewed for the following elements:

    +
    + + + + + + + + + + + +
    Daily Reports
      Monthly Reports
      • Maximum Temperature
      • Numerous elements
      • Minimum Temperature
      • Maximum Wind Direction and Speed
      • Maximum Gust Direction and Speed
      • Daily Precipitation
      • Daily Snowfall
      • Possible Sunshine
      • Sky Cover
      • Observed Weather


      + +Possible methods of retrieval

      +Daily Reports
      +While the decoded Daily Summary Message is the first option of retrieval +for all of the elements below, alternate options from the METAR observations +are utilized when it is not +available:

      +
      + + + + + + + + +
      +
    • Temperature -
        +24-Hour Temperature Group
        6-Hour Temperature Group
        +Hourly Temperature
        Rounded Hourly Temperature
    • +
    • Precipitation -
        +6-Hour Amount Reports
        3-Hour Amount Reports
        +Hourly Amount Reports
        Any Combination of the Three
    • +
    • Maximum Wind -
        +Special Wind Report
        Hourly Wind Report
    • +
    • Wind Gust -
        +Peak Wind Report
        Hourly Gust Report
    • +
    • Snowfall -
        +Supplemental Climate Data
    • +
    • Possible Sunshine -
        +Calculated
    • +
    • Sky Cover -
        +Calculated
    • +
    • Observed Weather -
        +Hourly and Special Observations
        +No Weather Reported

    • +Monthly Reports
      +Two options exist for the monthly values. Either the ASOS Monthly Summary Message +or the Daily Database is chosen at the time of the run.

      +All Reports
      +Missing appears for the retrieval method when the value is recorded as +missing and Entered Manually appears if the user has made changes to the +value and saved the new value.

      + +


      +


      + +
      +Return to Quality Control Climate GUI Help Page
      +Return to Main Climate GUI Help Page
      +
      +

      + + diff --git a/nativeLib/files.native/adapt/climate/data/help/select_climate_run.gif b/nativeLib/files.native/adapt/climate/data/help/select_climate_run.gif new file mode 100644 index 0000000000..d85cd04c97 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/select_climate_run.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/select_products.gif b/nativeLib/files.native/adapt/climate/data/help/select_products.gif new file mode 100644 index 0000000000..27f5543591 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/select_products.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/select_stations.gif b/nativeLib/files.native/adapt/climate/data/help/select_stations.gif new file mode 100644 index 0000000000..4509588a79 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/select_stations.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/select_stations.html b/nativeLib/files.native/adapt/climate/data/help/select_stations.html new file mode 100644 index 0000000000..e4ad2c9ba2 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/select_stations.html @@ -0,0 +1,47 @@ + + +Select Stations + + +

      +

      +

      SET UP CLIMATE STATIONS HELP PAGE

      +
      +
      +
      +Set Up Climate Stations is used to set up the stations that will be added to the database table. The user has the option to add or delete stations and to specify if a station observes standard time all year.

      + Please read NOTES/CAUTIONS at the bottom of this page.
      +
      +SELECT STATIONS GUI (Click here to see GUI) - This GUI is used to add and delete climatological reporting +stations from this applications subsequent GUIs. This GUI is a part of the set_up_climate +program and is initiated from the Climate Master GUI by selecting the Set Up Climate Stations. +

      +To Add a Station? +A station can be added by typing its four-character METAR identifier using all uppercase letters +into the blank rectangular field and then clicking the Add button.

      +To Delete a Station? +A station can be deleted either by typing the stations four-character METAR identifier into the blank rectangular field or +by highlighting the identifier in the Station field and then clicking the Delete button. When +a station identifier is highlighted, it is automatically entered into the blank rectangular field. +

      Standard time all year for station? +This is an option for the products time to be reported in standard time all year as opposed to switching over to daylight +savings time for part of the year. NOTE: This is useful for the parts of the U.S. that don't use daylight savings time in the summer. +

      +Save - Selecting this button saves the changes that were made. +
      +Cancel - Selecting this button disregards all of the changes made in this GUI and returns to the Master Climate GUI. +
      + +

      NOTES/CAUTIONS

      + + A maximum of 10 stations are allowable in the station list.
      +
      Stations must be entered in uppercase.
      +
      Use the 4 character ICAO for the product ID!
      +

      +
      +Return to Main Climate Help Page
      +

      +








      +

      + + diff --git a/nativeLib/files.native/adapt/climate/data/help/stationlistnwr.html b/nativeLib/files.native/adapt/climate/data/help/stationlistnwr.html new file mode 100644 index 0000000000..66ba256fad --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/stationlistnwr.html @@ -0,0 +1,98 @@ + + +HWR NWR Station List + + +
      +

      +

      HWR NWR Station List

      +
      +
      +Station Format, +HWR NWR Home +
      +
      +
      +All of the stations to appear in the output product must be listed in the station list.
      +
      +

      The station list may contain any combination of the following:
      +* comment lines,
      +* internal station list comment lines,
      +* the broadcast frequency,
      +* fixed phrase stations, +* SCP stations,
      +* marine stations, and
      +* summary stations.
      +
      +Comment lines can be placed anywhere. They begin with a tilde "~" as is shown in +the following example:
      +~These are the %TIMEZ% observations for the local area, on ~%DAY%, %DATE%

      +%TIMEZ%, %DAY%, and %DATE% are symbolic words.
      +
      +Internal comment lines can be placed anywhere. They begin with a pound sign "#" +as is shown in the following example:
      +# Product TDLHWRNW1
      +# Broadcast File Frequency section (optional).
      +
      +The broadcast frequency is identified as follows:
      +!!!!!BDCST_FREQ
      +40 30 30
      +where
      +!!!!!BDCST_FREQ is the broadcast frequency identifier, and
      +40 30 30 represent the broadcast frequencies (in percent) of each of the broadcast files associated with this product.
      +
      +Fixed phrase stations are identified as follows:
      +!!!!!FF_STATIONS
      +/KMKC/KMCI/+Downtown Kansas City
      +/KBWI//*BWI Airport;/KADW/+Andrews
      +where

        +
      • !!!!!FF_STATIONS identifies that fixed phrase land stations follow; + +
      • "KMKC" is the METAR identifier; + +
      • "KMCI" is the SCP station identifier (leave blank when same as METAR identifier); + +
      • "+" signifies that if the METAR is missing "The report from Downtown Kansas city was not available." will be broadcast. Other options +are;
          + +
        1. "-" (ignore the station when missing), +
        2. "*" (use second station on this line when first station is missing) +
        3. "&" (use second entry in broadcast file for this station. This is useful for recapping the weather conditions;
        + +
      • "+" before "Andrews" signifies that if METAR is missing for BWI Airport +and for Andrews Air Force Base then "The report from BWI airport is not available." will be broadcast. +
      +Marine stations are identified as follows:
      +!!!!!MAR_STATIONS
      +/MISM1//+Matinicus Isle
      +where
        +
      • !!!!!MAR_STATIONS identifies that marine stations follow; + +
      • All the rules above for FF_STATIONS applies to MAR_STATIONS; + +
      +Summary stations are identified as follows:
      +!!!!!WX_CONDS
      +SW TF
      +!!!!!SUM_STATIONS
      +@Throughtout the region,
      +/KMRB//+Martinburg
      +/KHGR//*Hagerstown;/KDOV/+Dover
      +/KNHK//-Patuxent River
      +where
        + +
      • "!!!!!WX_CONDS" identifies that the weather elements to be summarized follow on the next line. + +
      • "SW TF" signify that the weather elements -- sky/weather and temperature in degrees Fahrenheit, are to be summarized. + +
      • The "@" signifies that the comment "Throughout the region," will be broadcast whenever + similarities of weather conditions force the creation of a summary phrase. + +
      • The stations to be summarized are listed on the remaining three lines. The symbols and words used on these lines +have the same meaning as those in the fixed phrase station example already explained above. +

        + +
        +

        Station
        + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/stationlistnwws.html b/nativeLib/files.native/adapt/climate/data/help/stationlistnwws.html new file mode 100644 index 0000000000..10a33e65e7 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/stationlistnwws.html @@ -0,0 +1,88 @@ + + + +HWR NWWS Station List + + + +

        +

        +

        HWR NWWS Station List

        +
        +
        +Station Format, +HWR NWWS Home +
        +

        +

        +All of the stations to appear in the output product must be listed in the station list.
        +
        +

        The station list may contain any combination of the following:
        +
        +* comment lines,
        +* internal station list comment lines,
        +* fixed phrase stations,
        +* SCP stations, and
        +* marine stations.
        +

        +Comment lines can be placed anywhere. They begin with a tilde "~" as is shown in +the following examples.
        +~!MOZ005>007-011>016-020-021-028-029-037-043-%DDHHMM%
        +~...West Central and Northwest Missouri...
        +~$$
        +%DDHHMM% is a symbolic word. This symbolic word +will be replaced with the current date comprised of the month, nominal hour, +and minute of the observation.
        +
        +Internal comment lines can be placed anywhere. They begin with a pound sign "#" +as is shown in the following example:
        +# Product 1

        +
        +Fixed phrase stations are identified as follows:
        +!!!!!FF_STATIONS
        +/KMKC/KMCI/+KC DOWNTOWN
        + where

          +
        • !!!!!FF_STATIONS identifies that fixed phrase land stations follow; + +
        • "KMKC" is the METAR identifier; + +
        • "KMCI" is the SCP station identifier (leave blank when same as METAR identifier); + +
        • "+" signifies that if the METAR is missing, "KC DOWNTOWN NOT AVBL" will be output. Other options +are:
            + +
          • "-" (ignore the station when missing), +
          • "=" (same as "+" but also output 6-hourly additive data), and +
          • "&" (ignore the station when missing, but also output 6-hourly additive data when station is not missing).
          + +
        • "~$$" signifies the end of a group of stations. + +
        • "KC DOWNTOWN" is the station name which is transferred to the output product. + +
        +
        +Marine stations are identified as follows: +!!!!!MAR_STATIONS +/MISM1//+MATINICUS ISLE +/41002//-%LATLON% +~$$ +
        +where
          +
        • !!!!!MAR_STATIONS identifies that marine stations follow; + +
        • "MISM1" and "41002" are the marine station identifiers; + +
        • "+" if marine observation is missing will output MATINICUS ISLE NOT AVBL. +Other option when marine observation is missing is "-" (do not output station). + +
        • "MATINICUS ISLE" is the station name which is transferred to the output product. +Use the ketword %LATLON% in order to output the latitude and longitude of a station instead +of its name. + +
        • "~$$" signifies the end of a group of stations. +
        +
        +
        Station
        + + + diff --git a/nativeLib/files.native/adapt/climate/data/help/stationnwr.html b/nativeLib/files.native/adapt/climate/data/help/stationnwr.html new file mode 100644 index 0000000000..059153c88d --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/stationnwr.html @@ -0,0 +1,30 @@ + + +HWR NWR Station Format Editor + + +

        +

        +

        HWR NWR Station Format Editor

        +
        +
        +Product #, +Broadcast Format, +Default Format, +Configuration, +Thresholds, +Home +
        +

        +

        +Select the "Product #" pushbutton to choose from the list of 9 character, AFOS-like product identifiers. +The station list, configuration selections, and thresholds associated with the selected +product identifier will be automatically inserted into the GUI fields. The list of product identifiers +may be modified via the xhwrnwr.conf file.
        +
        +The "Station Format Editor" pushbutton displays the station list for review and edit. A brief overview +follows in Station List.
        +
        +

        Home
        + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/stationnwws.html b/nativeLib/files.native/adapt/climate/data/help/stationnwws.html new file mode 100644 index 0000000000..9f2e98ac66 --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/stationnwws.html @@ -0,0 +1,32 @@ + + +HWR NWWS Station Format Editor + + +

        +

        +

        HWR NWWS Station Format Editor

        +
        +
        +
        +Product #, +Station Format, +Configuration, +Thresholds, +HWR NWWS Home +
        +
        +

        +

        +Select the "Product #" pushbutton to choose from the list of 8 or 9 character, AFOS-like product identifiers. +The station list, configuration selections, and thresholds associated with the selected +product identifier will be automatically inserted into the GUI fields. The list of product identifiers +may be modified via the xhwrnwws.conf file.
        +
        +The "Station Format Editor" pushbutton displays the station list for review and edit. A brief overview +follows in Station List.
        +
        +

        +

        HWR NWWS Home
        + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/threshnwr.html b/nativeLib/files.native/adapt/climate/data/help/threshnwr.html new file mode 100644 index 0000000000..400a6e689f --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/threshnwr.html @@ -0,0 +1,36 @@ + + +HWR NWR Threshold Parameters + + +

        +

        +

        HWR NWR Threshold Parameters

        +
        +
        +Product #, +Station Format, +Broadcast Format, +Default Format, +Configuration, +HWR NWR Home +
        +

        +The "Wind Speed" field represents the lower threshold wind speed that is necessary +for a threshold broadcast or default phrase to be generated.

        +Similarly, the "Wind Gust" field represents the gust value that is required for a +threshold phrase to be generated.


        +Whenever the visibility is at or below the "Visibility" threshold, a visibility phrase +may be generated, using the broadcast or default formats.

        +A heat index phrase will be generated whenever the calculated heat index exceeds or equals the +"Heat Index" threshold.


        +The wind chill threshold is more complex, since three threshold criteria need to be met +for a broadcast of the wind chill index value:
        +* The temperature must be at or below the "Max Temp" value.
        +* The wind speed must be at or above the "Min WS" value. Do not choose a value less than 5 +mph, since the wind chill equation does not permit values below this threshold.
        +* The calculated wind chill index must be at or below the "WCI" field. +

        +

        home
        + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/threshnwws.html b/nativeLib/files.native/adapt/climate/data/help/threshnwws.html new file mode 100644 index 0000000000..e3acca0e8d --- /dev/null +++ b/nativeLib/files.native/adapt/climate/data/help/threshnwws.html @@ -0,0 +1,28 @@ + + +HWR NWWS Threshold Parameters + + +

        +

        +

        HWR NWWS Threshold Parameters

        +
        +
        +Product #, +Station Format, +Configuration, +HWR NWWS Home +
        +

        +A heat index phrase will be generated whenever the calculated heat index exceeds or equals the +"Heat Index" threshold.




        +The wind chill threshold is more complex, since three threshold criteria need to be met +for a broadcast of the wind chill index value:
        +* The temperature must be at or below the "Max Temp" value.
        +* The wind speed must be at or above the "Min WS" value. Do not choose a value less than 5 +mph, since the wind chill equation does not permit values below this threshold.
        +* The calculated wind chill index must be at or below the "WCI" field. +

        +

        home
        + + \ No newline at end of file diff --git a/nativeLib/files.native/adapt/climate/data/help/tstm.gif b/nativeLib/files.native/adapt/climate/data/help/tstm.gif new file mode 100644 index 0000000000..0982b934d0 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/tstm.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/help/usr_defined_values.gif b/nativeLib/files.native/adapt/climate/data/help/usr_defined_values.gif new file mode 100644 index 0000000000..ec586f71bb Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/help/usr_defined_values.gif differ diff --git a/nativeLib/files.native/adapt/climate/data/hour_clim.gif b/nativeLib/files.native/adapt/climate/data/hour_clim.gif new file mode 100644 index 0000000000..d4e46fe157 Binary files /dev/null and b/nativeLib/files.native/adapt/climate/data/hour_clim.gif differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/bin/runso b/nativeLib/files.native/awipsShare/hydroapps/bin/runso new file mode 100755 index 0000000000..7ee690b5d8 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/bin/runso differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/check_app_context b/nativeLib/files.native/awipsShare/hydroapps/check_app_context new file mode 100644 index 0000000000..634aef96b8 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/check_app_context @@ -0,0 +1,80 @@ +#!/bin/sh +## +# This software was developed and / or modified by Raytheon Company, +# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# +# U.S. EXPORT CONTROLLED TECHNICAL DATA +# This software product contains export-restricted data whose +# export/transfer/disclosure is restricted by U.S. law. Dissemination +# to non-U.S. persons whether in the United States or abroad requires +# an export license or other authorization. +# +# Contractor Name: Raytheon Company +# Contractor Address: 6825 Pine Street, Suite 340 +# Mail Stop B8 +# Omaha, NE 68106 +# 402.291.0100 +# +# See the AWIPS II Master Rights File ("Master Rights File.pdf") for +# further licensing information. +## + +# Script: check_app_Context +# Script that determines and sets the APP_CONTEXT variable for the +# calling script, and checks if the setting for that value is set to 'ON' or 'OFF' +# If off, this script will exit the calling script. + +# get contextName from script name +oldIFS="$IFS" +IFS="/" +n=0 +for element in ${0} +do + n=`expr $n + 1` + eval pathPart$n="$element" +done +eval contextName='$pathPart'$n + +# parse off file extension if necessary +IFS="." +n=0 +for element in $contextName +do + n=`expr $n + 1` + eval contextName="$element" + break +done + +# if APP_CONTEXT is not set +if [ "${APP_CONTEXT:-NOTSET}" == "NOTSET" ] +then + eval APP_CONTEXT=${contextName} +else + # check if APP_CONTEXT ends with script's context + # if not, then append it + IFS="." + n=0 + for element in $APP_CONTEXT + do + n=`expr $n + 1` + eval currentContextName="$element" + done + if [ "${currentContextName}" != "${contextName}" ] + then + APP_CONTEXT=${APP_CONTEXT}'.'${contextName} + fi +fi +IFS="${oldIFS}" +export APP_CONTEXT + +# Determine if on or off from APP_CONTEXT. Default APP_CONTEXT is ON +eval APP_VAR=$(runso rary.ohd.util gad $APP_CONTEXT) +echo "App Execution Token for script ${contextName} with App Context ${APP_CONTEXT} is ${APP_VAR:-ON}" + +# if set to not run, exit the calling script +if [ "${APP_VAR:-ON}" == "OFF" ] +then + echo "Script ${contextName} will exit and not run." + exit +fi + diff --git a/nativeLib/files.native/awipsShare/hydroapps/data/fxa/radar/envData/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/data/fxa/radar/envData/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/ffmp_templates/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/ffmp_templates/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/coord_host.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/coord_host.dat new file mode 100644 index 0000000000..43a5da2d9a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/coord_host.dat @@ -0,0 +1,4 @@ +525 +440 +81 +91 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/county.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/county.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/cwaus.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/cwaus.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/fg_basin.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/fg_basin.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/flights.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/flights.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/forecastpt.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/forecastpt.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/map_basin.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/map_basin.dat new file mode 100644 index 0000000000..9abe1c55cc --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/map_basin.dat @@ -0,0 +1,6 @@ +xxx xxx -1 5 +40.5 97.0 +40.5 79.0 +28.5 79.0 +28.5 97.0 +40.5 97.0 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/rfc_boundary.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/rfc_boundary.dat new file mode 100644 index 0000000000..a1ce58263f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/rfc_boundary.dat @@ -0,0 +1,6 @@ +xxx xxx -1 5 +43.3 -98.4 +42.9 -94.2 +39.9 -98.9 +39.4 -95.0 +43.3 -98.4 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/river.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/river.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/state.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/state.dat new file mode 100644 index 0000000000..ac1133d32a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/state.dat @@ -0,0 +1,6 @@ +xxx xxxxxx -1 5 +40.5 97.0 +39.8 93.6 +38.4 88.1 +37.1 85.0 +36.7 82.4 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/town.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/town.dat new file mode 100644 index 0000000000..807a0a375b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/ascii/town.dat @@ -0,0 +1,40 @@ +Alexander City 32.57 85.57 +Anniston AP 33.35 85.51 +Auburn 32.36 85.30 +Birmingham AP 33.34 86.45 +Decatur 34.37 86.59 +Dothan AP 31.19 85.27 +Florence AP 34.48 87.40 +Gadsden 34.1 86.0 +Huntsville AP 34.42 86.35 +Mobile AP 30.41 88.15 +Mobile Co 30.40 88.15 +Montgomery AP 32.23 86.22 +Selma-Craig AFB 32.20 87.59 +Talladega 33.27 86.6 +Tuscaloosa AP 33.13 87.37 +Anchorage AP 61.10 150.1 +Barrow (S) 71.18 156.47 +Fairbanks AP (S) 64.49 147.52 +Juneau AP 58.22 134.35 +Kodiak 57.45 152.29 +Nome AP 64.30 165.26 +Douglas AP 31.27 109.36 +Flagstaff AP 35.8 111.40 +Fort Huachuca AP (S) 31.35 110.20 +Kingman AP 35.12 114.1 +Nogales 31.21 110.55 +Phoenix AP (S) 33.26 112.1 +Prescott AP 34.39 112.26 +Tucson AP (S) 32.7 110.56 +Winslow AP 35.1 110.44 +Yuma AP 32.39 114.37 +Blytheville AFB 35.57 89.57 +Camden 33.36 92.49 +El Dorado AP 33.13 92.49 +Fayetteville AP 36.0 94.10 +Fort Smith AP 35.20 94.22 +Hot Springs 34.29 93.6 +Jonesboro 35.50 90.42 +Little Rock AP (S) 34.44 92.14 +Pine Bluff AP 34.18 92.5 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/binary/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/geo_data/host/binary/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat b/nativeLib/files.native/awipsShare/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat new file mode 100644 index 0000000000..3139bc0f22 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat @@ -0,0 +1,4 @@ +561 +130 +491 +437 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/geo_data/util/run_create_bas_bound b/nativeLib/files.native/awipsShare/hydroapps/geo_data/util/run_create_bas_bound new file mode 100755 index 0000000000..ac7e9edae4 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/geo_data/util/run_create_bas_bound @@ -0,0 +1,5 @@ +#!/bin/ksh +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +runso rary.ohd.util create_bas_bound_main $1 $2 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg.so.6 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg.so.6 new file mode 100755 index 0000000000..732b086cfe Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg.so.6 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg.so.6.0 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg.so.6.0 new file mode 100755 index 0000000000..732b086cfe Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg.so.6.0 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3 new file mode 100755 index 0000000000..54a73b2b0b Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3.0 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3.0 new file mode 100755 index 0000000000..54a73b2b0b Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3.0 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libgfortran.so.1 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libgfortran.so.1 new file mode 100644 index 0000000000..cd5c69bd93 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libgfortran.so.1 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libjasper.so.1 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libjasper.so.1 new file mode 100755 index 0000000000..c720732e99 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libjasper.so.1 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libjvm.so b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libjvm.so new file mode 100755 index 0000000000..4adb1a1bd6 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libjvm.so differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3 new file mode 100755 index 0000000000..b24a5dc603 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3.0 b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3.0 new file mode 100755 index 0000000000..b24a5dc603 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3.0 differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.empty.motif.so b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.empty.motif.so new file mode 100755 index 0000000000..dfa32983a7 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.empty.motif.so differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.ofs.so.REMOVED.git-id b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.ofs.so.REMOVED.git-id new file mode 100644 index 0000000000..670b0bb934 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.ofs.so.REMOVED.git-id @@ -0,0 +1 @@ +cbeec8412bbae976431cb0dbe85fc6b9c170253e \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.pproc.so.REMOVED.git-id b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.pproc.so.REMOVED.git-id new file mode 100644 index 0000000000..2f1567f303 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.pproc.so.REMOVED.git-id @@ -0,0 +1 @@ +4bb014852ca50921e54aaa7a931c57b1026cbccb \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.util.so b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.util.so new file mode 100755 index 0000000000..921c7422ff Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.util.so differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.whfs.so b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.whfs.so new file mode 100755 index 0000000000..58ee78671b Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/lib/native/linux32/library.ohd.whfs.so differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DHRgather b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DHRgather new file mode 100644 index 0000000000..cb8a313a08 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DHRgather @@ -0,0 +1,399 @@ +#!/bin/ksh + +# +# script for gathering DHR products from fxa directories +# and moving them to the OHD precip_proc world +# October 16, 2007 +# David T. Miller RSIS OHD/HSEB +# this script is modified based on DPAgather script. + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export DSP_PROD_DIR=$(get_apps_defaults dsp_prod_dir) +export DHR_LOG_DIR=$(get_apps_defaults dhr_log_dir) +export DHR_DIRNAME2=$(get_apps_defaults dhr_dirname2) +export DHR_DIRNAME1=$(get_apps_defaults dhr_dirname1) +export DHR_PROD_DIR=$(get_apps_defaults dhr_prod_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# define function for checking for a stop file to bypass the gather process + +checkcronstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_hpe_crons + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + + return 1 + + else + return 0 + fi +} + +checkHPErun() +{ + # Check to see if age on file is more than 10 minutes + # If it is stop the start_hpe script until data arrives. + tnow=`date +%s` + tfile=`date +%s -r $HPE_LOG_DIR/processhpe_log` + agesecs=$(($tnow-$tfile)) + echo "Checking age of processhpe_log $agesecs secs " >> $hpefnm + if [[ $agesecs -ge 600 ]] + then + return 1 + else + return 2 + fi +} + +# setup log files +# + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp +fnm=$DHR_LOG_DIR/dhrgather_log +tmp=$DHR_LOG_DIR/dhrgather_tmp + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +checkcronstop $HPE_LOG_DIR +STOP_FOUND=$? + +if test STOP_FOUND -eq 1 +then + +# Instead of using kill, will introduce a delayed stop. +# This is especially important if radar files are separate in time +# and only 1 radar is indicating precip but the rest are not +# The time of this file is checked in start_hpe script. +# If greater than 20 min, the start_hpe script will exit + + if [[ ! -r $HPE_LOG_DIR/stop_hpe_process ]] + then + touch $HPE_LOG_DIR/stop_hpe_process + echo "stop_hpe_process file created " $Dte >> $hpefnm + echo "HPE decoders and field generator will stop after 20 min " >> $hpefnm + echo "unless precipitation occurs at a radar before that time " >> $hpefnm + fi + + + exit 0 +fi + + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# the AMIRUNNING_DIR variable is required by the amirunning script + +AMIRUNNING_DIR=$DHR_LOG_DIR + +. $RFCLX/public/bin/amirunning + + +if [[ $AmIRunning = "yes" ]]; then + echo DHRgather script cancelled due to other instance running >> $fnm + exit 0 +fi +dhrps=`ps -fe | grep DHRgather | grep -v grep | grep -v vi | wc -l` + if [[ $dhrps -gt 1 ]] + then + echo "" + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin gather at "$Dte >> $fnm + +#if [[ ! -d $DHR_PROD_DIR ]] +#then +# echo "The DHR PROD DIR $DHR_PROD_DIR is invalid or " >> $fnm +# echo "does not exist. Exiting DHRgather script. " $Dte >> $fnm +# exit 1 +#fi + +# +# touch dhrgather control temp file +# + +touch $DHR_LOG_DIR/dhrgather_control.temp +touch /tmp/dhrgather_control.temp + +# +# check if radarloc table has any radars with use_radar="T" +# if not, then stop +# the sed command strips off all non-numeric characters +# + +Num_Rad=$( +echo "select count(*) from Radarloc WHERE use_radar='T'; " | \ +$POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +if [[ $Num_Rad = 0 ]] +then + + echo no radars defined for use -- gather not done >> $fnm + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + +elif [[ -z $Num_Rad ]] +then + + echo number of radars defined for use is undetermined -- gather continuing >> $fnm +fi + +# +# write radar identifiers and prefixes to temp file +# + +echo "select lower(radid_prefix), lower(radid) from Radarloc WHERE use_radar='T';" | \ +$POSTGRESQLBINDIR/psql -q -A -t $DB_NAME > $DHR_LOG_DIR/radid.temp + + +# +# if radid.temp is not created or is 0 bytes in length, then print message and exit gather script +# + +if [[ ! -s $DHR_LOG_DIR/radid.temp ]] + then + rm -f $DHR_LOG_DIR/radid.temp + rm -f $DHR_LOG_DIR/dhrgather_control.temp + echo radid.temp file not created properly -- gather not done >> $fnm + + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + fi + +# +# for each radar id in file, construct directory name and search for products +# note that the radar id in the directory name is lower case and 4 char +# + +FileCheck=0 +RainCheck=0 + +#for rid in `cat $DHR_LOG_DIR/radid.temp` +#do +#radid_dir=$(echo "$rid" | sed 's/|//g') +#radid=${radid_dir#?} +#PRODUCT_DIR_NAME=$DHR_DIRNAME1/$radid_dir/$DHR_DIRNAME2 + +# +# Look for raw products in the directory satisfying the time test. +# If found, then copy to a temporary location and mv to the gather directory. +# Change radar id to upper case. +# Successfully processed products will be deleted from the gather directory +# as part of the decoding process. +# Write old name, new name to log file. +# +# In addition, this now checks the DHR data for precip status category. +# If category is 1 or 2, it will kick off the start_hpe script +# which will run the DHR and DSP decoders and +# the HPE field generator +# + +#num_files=`ls -F $PRODUCT_DIR_NAME 2>>$fnm | grep -v "*" | grep -v "/" | wc -l` +#if test $num_files -ne 0 +#then +# RADID=$(print $radid | tr '[a-z]' '[A-Z]') +# i=0 +# for pname in `find $PRODUCT_DIR_NAME -type f -name '*' -newer $DHR_LOG_DIR/dhrgather_control` + + for pname in `find $DHR_PROD_DIR -type f -name '*' -newer $DHR_LOG_DIR/dhrgather_control` + do + + #GATHER_FILENAME=$DHR_PROD_DIR/DHR$RADID.`date -u +%Y%m%d%H%M%S.$i` + #i=`expr $i + 1` + #cp $pname $DHR_LOG_DIR/radar_temp + #mv $DHR_LOG_DIR/radar_temp $GATHER_FILENAME + #echo $pname "copied to" $GATHER_FILENAME >> $fnm + + echo $pname "copied to" $DHR_PROD_DIR >> $fnm + GATHER_FILENAME=$pname + + # check to see if the SUPL info in the DHR data indicates rain + + result=`runso rary.ohd.pproc get_dhrpsm_main $pname` + Get_DHRPsm=`expr $result` + + # debug statement to log file + echo "$GATHER_FILENAME Get_DHRPsm = $Get_DHRPsm" >> $hpefnm + + FileCheck=1 + + if [[ $Get_DHRPsm > 0 ]] + then + RainCheck=1 + fi + + done +#fi + +#done +# +# mv dhrgather control file +# + +mv $DHR_LOG_DIR/dhrgather_control.temp $DHR_LOG_DIR/dhrgather_control + +# +# delete radid.temp file +# + +rm $DHR_LOG_DIR/radid.temp + +# +# end write to log +# + +Dte=`date -u` +echo "End gather at "$Dte >> $fnm + +# In order to execute gather every minute need to not stop or start HPE rapidly +# If there were files last minute but not any now, +# need to just continue with whatever RainCheck did last time + +echo "FileCheck = $FileCheck" >> $hpefnm + +if [[ $FileCheck -gt 0 ]] +then + +# based on precip category in new DHR products for the radars, +# start or stop HPE processes + +echo "checking to start or stop start_hpe script" $Dte >> $hpefnm +phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}'` + +echo "checking to start or stop start_hpe script" $Dte >> $hpefnm + +if [[ -n "$phpe" ]] + then + checkHPErun + RUN_FOUND=$? + if test RUN_FOUND -eq 1 + then + echo "We are going to stop start_hpe " $Dte >> $hpefnm + `kill $phpe` + phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}'` + if [[ -n "$phpe" ]] + then + `kill -9 $phpe` + fi + phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}'` + fi +fi + +if [[ $RainCheck -le 0 ]] +then + if [[ -z "$phpe" ]] + then + echo "start_hpe script not running " $Dte >> $hpefnm + +# if HPE process isn't running, there's no precip in area. +# remove the temp files in the DHR and DSP product directories +# + if [[ -d $DHR_PROD_DIR && -n "$DHR_PROD_DIR" ]] + then + echo "Removing temp DHR files in $DHR_PROD_DIR due to no rain " $Dte >> $hpefnm + rm -f $DHR_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DHR PROD DIR $DHR_PROD_DIR invalid " $Dte >> $hpefnm + fi + if [[ -d $DSP_PROD_DIR && -n "$DSP_PROD_DIR" ]] + then + echo "Removing temp DSP files in $DSP_PROD_DIR due to no rain " $Dte >> $hpefnm + rm -f $DSP_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DSP PROD DIR $DSP_PROD_DIR invalid " $Dte >> $hpefnm + fi + else + +# Instead of using kill, will introduce a delayed stop. +# This is especially important if radar files are separate in time +# and only 1 radar is indicating precip but the rest are not +# The time of this file is checked in start_hpe script. +# If greater than 20 min, the start_hpe script will exit + + if [[ ! -r $HPE_LOG_DIR/stop_hpe_process ]] + then + touch $HPE_LOG_DIR/stop_hpe_process + echo "stop_hpe_process file created " $Dte >> $hpefnm + echo "HPE decoders and field generator will stop after 20 min " >> $hpefnm + echo "unless precipitation occurs at a radar before that time " >> $hpefnm + else + echo "stop_hpe_process file already created " $Dte >> $hpefnm + echo "HPE process will stop in less than 20 min unless new precip occurs " >> \ + $hpefnm + fi + + + fi + + + +elif [[ $RainCheck -gt 0 ]] +then +#sleep 10 + echo "RainCheck= "$RainCheck >> $hpefnm + phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}' | wc -l` + echo "PHPE " $phpe >>$hpefnm + + if [[ $phpe -le 0 ]] + then + + echo "starting HPE processes via start_hpe script " $Dte >> $hpefnm + /bin/ksh $PPROC_BIN/launch_hpe 2>$DHR_LOG_DIR/launch_hpe.err & + exit 0 + else + +# Remove the stop file if it exists because at least one radar has +# indicated there's precip and don't want the processes to stop +# prematurely. +# +# Script will check if one has been entered after it starts. + + if [[ -r $HPE_LOG_DIR/stop_hpe_process ]] + then + rm -f $HPE_LOG_DIR/stop_hpe_process + fi + echo "start_hpe script already running " $Dte >> $hpefnm + fi +fi +else + echo "no radar files found to process " $Dte >> $hpefnm +# next statement goes with FileCheck if test +fi +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DPAgather b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DPAgather new file mode 100755 index 0000000000..8eee267cc7 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DPAgather @@ -0,0 +1,186 @@ +#!/bin/ksh +# +# +# script for gathering DPA products from fxa directories +# and moving them to the OHD precip_proc world +# August 22, 2003 +# updated for PostgreSQL - Oct 22, 2004 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DPA_DIRNAME2=$(get_apps_defaults dpa_dirname2) +export DPA_DIRNAME1=$(get_apps_defaults dpa_dirname1) +export DPA_PROD_DIR=$(get_apps_defaults dpa_prod_dir) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# this script uses the following set_hydro_env variables: +# DPA_LOG_DIR, DPA_PROD_DIR, DPA_DIRNAME1, DPA_DIRNAME2, DB_NAME +# + +# setup log files +# + +fnm=$DPA_LOG_DIR/dpagather_log +tmp=$DPA_LOG_DIR/dpagather_tmp + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# the AMIRUNNING_DIR variable is required by the amirunning script + +AMIRUNNING_DIR=$DPA_LOG_DIR + +. /awips/hydroapps/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo DPAgather script cancelled due to other instance running >> $fnm + exit 1 + fi + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin gather at "$Dte >> $fnm + +# +# touch dpagather control temp file +# + +touch $DPA_LOG_DIR/dpagather_control.temp + +# +# check if radarloc table has any radars with use_radar="T" +# if not, then stop +# the sed command strips off all non-numeric characters +# + +Num_Rad=$( +echo "select count(*) from Radarloc WHERE use_radar='T'; " | \ +$POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +if [[ $Num_Rad = 0 ]] +then + + echo no radars defined for use -- gather not done >> $fnm + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + +elif [[ -z $Num_Rad ]] +then + + echo number of radars defined for use is undetermined -- gather continuing >> $fnm +fi + +# +# write radar identifiers and prefixes to temp file +# + + +#$POSTGRESQLBINDIR/psql -q -t $DB_NAME +#unload to "$DPA_LOG_DIR/radid.temp" +#select lower(radid_prefix), lower(radid) +#from Radarloc +#WHERE use_radar='T'; + +echo "select lower(radid_prefix), lower(radid) from Radarloc WHERE use_radar='T';" | \ +$POSTGRESQLBINDIR/psql -q -A -t $DB_NAME > $DPA_LOG_DIR/radid.temp + + +# +# if radid.temp is not created or is 0 bytes in length, then print message and exit gather script +# + +if [[ ! -s $DPA_LOG_DIR/radid.temp ]] + then + rm -f $DPA_LOG_DIR/radid.temp + rm -f $DPA_LOG_DIR/dpagather_control.temp + echo radid.temp file not created properly -- gather not done >> $fnm + + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + fi + +# +# for each radar id in file, construct directory name and search for products +# note that the radar id in the directory name is lower case and 4 char +# + +for rid in `cat $DPA_LOG_DIR/radid.temp` +do + +radid_dir=$(echo "$rid" | sed 's/|//g') +radid=${radid_dir#?} + +PRODUCT_DIR_NAME=$DPA_DIRNAME1/$radid_dir/$DPA_DIRNAME2 + +# +# look for raw products in the directory satisfying the time test +# if found, then copy to a temporary location and mv to the gather directory +# change radar id to upper case +# successfully processed products will be deleted from the gather directory as part of +# the decoding process +# write old name, new name to log file +# + +num_files=`ls -F $PRODUCT_DIR_NAME 2>>$fnm | grep -v "*" | grep -v "/" | wc -l` +if test $num_files -ne 0 +then + RADID=$(print $radid | tr '[a-z]' '[A-Z]') + + i=0 + + for pname in `find $PRODUCT_DIR_NAME -type f -name '*' -newer $DPA_LOG_DIR/dpagather_control` + do + + GATHER_FILENAME=$DPA_PROD_DIR/DPA$RADID.`date -u +%Y%m%d%H%M%S.$i` + i=`expr $i + 1` + + cp $pname $DPA_LOG_DIR/radar_temp + + mv $DPA_LOG_DIR/radar_temp $GATHER_FILENAME + + echo $pname "copied to" $GATHER_FILENAME >> $fnm + + done + +fi + +done + +# +# mv dpagather control file +# + +mv $DPA_LOG_DIR/dpagather_control.temp $DPA_LOG_DIR/dpagather_control + +# +# delete radid.temp file +# + +rm $DPA_LOG_DIR/radid.temp + +# +# end write to log +# + +Dte=`date -u` +echo "End gather at "$Dte >> $fnm diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DSPgather b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DSPgather new file mode 100755 index 0000000000..0e22ab1383 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/DSPgather @@ -0,0 +1,223 @@ +#!/bin/ksh + +# +# script for gathering DSP products from fxa directories +# and moving them to the OHD precip_proc world +# October 16, 2007 +# David T. Miller RSIS OHD/HSEB +# this script is modified based on DPAgather script. + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export DSP_LOG_DIR=$(get_apps_defaults dsp_log_dir) +export DSP_DIRNAME2=$(get_apps_defaults dsp_dirname2) +export DSP_DIRNAME1=$(get_apps_defaults dsp_dirname1) +export DSP_PROD_DIR=$(get_apps_defaults dsp_prod_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# define function for checking for a stop file to bypass the gather process + +checkcronstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_hpe_crons + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + + return 1 + + else + return 0 + fi +} + + +checkcronstop $HPE_LOG_DIR +STOP_FOUND=$? + +if test STOP_FOUND -eq 1 +then + exit 0 +fi + +# Note that this is slightly different than the DHR log as that +# is the primary data gather process. DSP is secondary and will +# not have stop_hpe_crons info in the log. +# + +# setup log files +# + +fnm=$DSP_LOG_DIR/dspgather_log +tmp=$DSP_LOG_DIR/dspgather_tmp +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# the AMIRUNNING_DIR variable is required by the amirunning script + +AMIRUNNING_DIR=$DSP_LOG_DIR + +. $RFCLX/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo DSPgather script cancelled due to other instance running >> $fnm + exit 1 + fi + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin gather at "$Dte >> $fnm + +#if [[ ! -d $DSP_PROD_DIR ]] +#then +# echo "The DSP PROD DIR $DSP_PROD_DIR is invalid or " >> $fnm +# echo "does not exist. Exiting DHRgather script. " $Dte >> $fnm +# exit 1 +#fi + +# +# touch dspgather control temp file +# + +touch $DSP_LOG_DIR/dspgather_control.temp +touch /tmp/dhrgather_control.temp + +# +# check if radarloc table has any radars with use_radar="T" +# if not, then stop +# the sed command strips off all non-numeric characters +# + +Num_Rad=$( +echo "select count(*) from Radarloc WHERE use_radar='T'; " | \ +$POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +if [[ $Num_Rad = 0 ]] +then + + echo no radars defined for use -- gather not done >> $fnm + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + +elif [[ -z $Num_Rad ]] +then + + echo number of radars defined for use is undetermined -- gather continuing >> $fnm +fi + +# +# write radar identifiers and prefixes to temp file +# + + +#$POSTGRESQLBINDIR/psql -q -t $DB_NAME +#unload to "$DSP_LOG_DIR/radid.temp" +#select lower(radid_prefix), lower(radid) +#from Radarloc +#WHERE use_radar='T'; + +echo "select lower(radid_prefix), lower(radid) from Radarloc WHERE use_radar='T';" | \ +$POSTGRESQLBINDIR/psql -q -A -t $DB_NAME > $DSP_LOG_DIR/radid.temp + +# +# if radid.temp is not created or is 0 bytes in length, then print message and exit gather script +# + +if [[ ! -s $DSP_LOG_DIR/radid.temp ]] + then + rm -f $DSP_LOG_DIR/radid.temp + rm -f $DSP_LOG_DIR/dspgather_control.temp + echo "radid.temp file not created properly -- gather not done" >> $fnm + + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 +fi + +# +# for each radar id in file, construct directory name and search for products +# note that the radar id in the directory name is lower case and 4 char +# +#echo "DSP_DIRNAME1 = $DSP_DIRNAME1" >> $fnm +#echo "DSP_DIRNAME2 = $DSP_DIRNAME2" >> $fnm +#for rid in `cat $DSP_LOG_DIR/radid.temp` +#do +#radid_dir=$(echo "$rid" | sed 's/|//g') +#radid=${radid_dir#?} +#PRODUCT_DIR_NAME=$DSP_DIRNAME1/$radid_dir/$DSP_DIRNAME2 +#echo "PRODUCT_DIR_NAME = $PRODUCT_DIR_NAME radid dir=$radid_dir" + +# +# look for raw products in the directory satisfying the time test +# if found, then copy to a temporary location and mv to the gather directory +# change radar id to upper case +# successfully processed products will be deleted from the gather directory as part of +# the decoding process +# write old name, new name to log file +# + +#num_files=`ls -F $PRODUCT_DIR_NAME 2>>$fnm | grep -v "*" | grep -v "/" | wc -l` +#echo "num_files = $num_files" +#if test $num_files -ne 0 +#then +# RADID=$(print $radid | tr '[a-z]' '[A-Z]') +# i=0 +# for pname in `find $PRODUCT_DIR_NAME -type f -name '*' -newer $DSP_LOG_DIR/dspgather_control` + + for pname in `find $DSP_PROD_DIR -type f -name '*' -newer $DSP_LOG_DIR/dspgather_control` + do + +# GATHER_FILENAME=$DSP_PROD_DIR/DSP$RADID.`date -u +%Y%m%d%H%M%S.$i` +# echo "GATHER_FILENAME = $GATHER_FILENAME" +# i=`expr $i + 1` +# cp $pname $DSP_LOG_DIR/radar_temp +# mv $DSP_LOG_DIR/radar_temp $GATHER_FILENAME +# echo $pname "copied to" $GATHER_FILENAME >> $fnm + + echo $pname "copied to" $DSP_PROD_DIR >> $fnm + done + +#fi +#done +# +# mv dspgather control file +# + +mv $DSP_LOG_DIR/dspgather_control.temp $DSP_LOG_DIR/dspgather_control + +# +# delete radid.temp file +# + +rm $DSP_LOG_DIR/radid.temp + +# +# end write to log +# + +Dte=`date -u` +echo "End gather at "$Dte >> $fnm + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDHR b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDHR new file mode 100755 index 0000000000..8ffd9df19f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDHR @@ -0,0 +1,120 @@ +#!/bin/ksh +# +# This script retrieves Digital Hybrid Reflectivity (DHR) +# radar products from the temporary data gathering directory +# and sends them to the decode_dhr_dsp executable for decoding. +# +# Adapted from the Run_DecodeDPA script +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + + +DHRPRODDIR=`get_apps_defaults dhr_prod_dir` +DHRLOGDIR=`get_apps_defaults dhr_log_dir` + +# +# set up log filename +# + +Dte=`date +%m%d%Y` +fnm=$DHRLOGDIR/decodedhr_log_$Dte +ctlfnm=$DHRLOGDIR/decodedhr_ctl + +echo "fnm is $fnm" + +test -e $DHRLOGDIR/decodedhr_log_$Dte +FOUND=$? +if test FOUND -eq 1 +then + touch $DHRLOGDIR/decodedhr_log_$Dte +fi + +test -e $DHRLOGDIR/decodedhr_ctl +FOUND=$? +if test FOUND -eq 1 +then + touch $DHRLOGDIR/decodedhr_ctl +fi +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway + +AMIRUNNING_DIR=$(get_apps_defaults dhr_log_dir) +. $RFCLX/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo Run_DecodeDHR cancelled due to other instance running >> $fnm + exit 1 + fi + +# Check to see if age on file is more than 1 minute + runfreq=$((60)) + tnow=`date +%s` + tfile=`date +%s -r $ctlfnm` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -lt $runfreq ]] + then + exit 1 + else + touch $ctlfnm + fi + +#---------------------------------------------------------------------- + +# +# define delete messages written to log file +# + +delete_message=" product deleted" +no_delete_message=" product not deleted" + +# +# check for products in the gather directory +# if found, then decode +# note that products in the gather dir will not be decoded if they have "x" +# permission +# +echo "Log file: " $fnm + + for pname in `ls -1F $DHRPRODDIR | grep -v "*" | grep -v "/" ` + do + runso rary.ohd.pproc decode_dhr_dsp_main $DHRPRODDIR/$pname >> $fnm + +# +# return codes from decode_dhr_dsp +# +# 0 -- valid product (precip > 0 or supplemental message = "no precip detected") +# 1 -- valid product, no decoded file created +# (product not top-of-hour, supplemental message = "bad rate scan" etc) +# 2 -- invalid product +# (loss of data, unexpected EOF, invalid date or time, etc) +# 3 -- problem outside of product +# (error opening Informix db, error opening product) +# 4 -- radar not in radarloc table OR use_radar=F + + fstat=$? + if test $fstat -lt 3 + then + rm -f $DHRPRODDIR/$pname + fi + + if test $fstat -eq 2 + then + echo "$delete_message" >> $fnm + elif test $fstat -eq 3 + then + echo "$no_delete_message" >> $fnm + fi + + if test $fstat -eq 4 + then + rm -f $DHRPRODDIR/$pname + echo "$delete_message" >> $fnm + fi + + done +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDPA b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDPA new file mode 100755 index 0000000000..1f3ee3c466 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDPA @@ -0,0 +1,90 @@ +#!/bin/ksh +# +# this script gathers the DPA (Digital Precip Array) radar products +# into the proper directory and decodes them +# +# the decodedpa executable decodes the products +# +# a decoded radar product is a 131x131 array of REAL*4 values where each value +# represents the average hourly rainfall at the center of each bin +# +# beginning in OB3, the decoded radar products are in Little Endian format +# + +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + + +DPAPRODDIR=`get_apps_defaults dpa_prod_dir` +DPALOGDIR=`get_apps_defaults dpa_log_dir` +BIN_DIR=`get_apps_defaults pproc_bin` + +# +# set up log filename +# + +Dte=`date +%m%d%Y` +fnm=$DPALOGDIR/decodedpa_log_$Dte + +# +# define delete messages written to log file +# + +delete_message=" product deleted" +no_delete_message=" product not deleted" +file=$1 + +if [[ -e $file.LCK ]] + then + return +else + `touch $file.LCK` +fi + +runso rary.ohd.pproc decode_dpa_main $1 >> $fnm + +# +# return codes from decodedpa +# +# 0 -- valid product (precip > 0 or supplemental message = "no precip detected") +# 1 -- valid product, no decoded file created +# (product not top-of-hour, supplemental message = "bad rate scan" etc) +# 2 -- invalid product +# (loss of data, unexpected EOF, invalid date or time, etc) +# 3 -- problem outside of product +# (error opening database, error opening product) +# 4 -- radar not in radarloc table OR use_radar=F +# 5 -- problem converting raw product from Big Endian to Little Endian format +# (Linux only) + + fstat=$? +# echo "decode dpa return code for file: $1 " $fstat >> $fnm + if test $fstat -lt 3 + then + rm -f $file + rm -f $file.LE + fi + + if test $fstat -eq 2 + then + echo "$delete_message" >> $fnm + elif test $fstat -eq 3 + then + echo "$no_delete_message" >> $fnm + fi + + if test $fstat -eq 4 + then + rm -f $file + rm -f $file.LE + echo "$delete_message" >> $fnm + fi + if test $fstat -eq 5 + then + rm -f $file + rm -f $file.LE + echo "$delete_message" >> $fnm + fi +`rm $file.LCK` +exit $fstat \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDSP b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDSP new file mode 100755 index 0000000000..525d48a03a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/Run_DecodeDSP @@ -0,0 +1,122 @@ +#!/bin/ksh +# +# This script retrieves Digital Storm total Precipitation +# (DSP) radar products from the temporary data gathering directory +# and sends them to the decode_dhr_dsp executable for decoding. +# +# Adapted from the Run_DecodeDPA script +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + + +export DSPPRODDIR=`get_apps_defaults dsp_prod_dir` +export DSPLOGDIR=`get_apps_defaults dsp_log_dir` + +# +# set up log filename +# + +Dte=`date +%m%d%Y` +fnm=$DSPLOGDIR/decodedsp_log_$Dte +ctlfnm=$DSPLOGDIR/decodedsp_ctl + +test -e $DSPLOGDIR/decodedsp_log_$Dte +FOUND=$? +if test FOUND -eq 1 +then + touch $DSPLOGDIR/decodedsp_log_$Dte +fi + +test -e $DSPLOGDIR/decodedsp_ctl +FOUND=$? +if test FOUND -eq 1 +then + touch $DSPLOGDIR/decodedsp_ctl +fi +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway + +AMIRUNNING_DIR=$(get_apps_defaults dsp_log_dir) + +. $RFCLX/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo Run_DecodeDSP cancelled due to other instance running >> $fnm + exit 1 + fi + +# Check to see if age on file is more than 1 minute + runfreq=$((60)) + tnow=`date +%s` + tfile=`date +%s -r $ctlfnm` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -lt $runfreq ]] + then + exit 1 + else + touch $ctlfnm + fi + +#---------------------------------------------------------------------- +# +# define delete messages written to log file +# + +delete_message=" product deleted" +no_delete_message=" product not deleted" + +# +# check for products in the gather directory +# if found, then decode +# note that products in the gather dir will not be decoded if they have "x" +# permission +# +echo "Log file: " $fnm + + for pname in `ls -1F $DSPPRODDIR | grep -v "*" | grep -v "/" ` + do + echo $pname + runso rary.ohd.pproc decode_dhr_dsp_main $DSPPRODDIR/$pname >> $fnm + + + +# +# return codes from decode_dhr_dsp +# +# 0 -- valid product (precip > 0 or supplemental message = "no precip detected") +# 1 -- valid product, no decoded file created +# (product not top-of-hour, supplemental message = "bad rate scan" etc) +# 2 -- invalid product +# (loss of data, unexpected EOF, invalid date or time, etc) +# 3 -- problem outside of product +# (error opening Informix db, error opening product) +# 4 -- radar not in radarloc table OR use_radar=F + + fstat=$? + if test $fstat -lt 3 + then + rm -f $DSPPRODDIR/$pname + fi + + if test $fstat -eq 2 + then + echo "$delete_message" >> $fnm + elif test $fstat -eq 3 + then + echo "$no_delete_message" >> $fnm + fi + + if test $fstat -eq 4 + then + rm -f $DSPPRODDIR/$pname + echo "$delete_message" >> $fnm + fi + + done +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/bias_trans.jar b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/bias_trans.jar new file mode 100755 index 0000000000..aa93bc7535 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/bias_trans.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/gribit.LX b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/gribit.LX new file mode 100644 index 0000000000..0e61f132ac Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/gribit.LX differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql new file mode 100755 index 0000000000..0760e20080 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql @@ -0,0 +1,33 @@ +-- gather distinct lid,ts combinations from Location and Ingestfilter tables + +select l.lid, i.ts +into temp temptable +from location l, ingestfilter i +where l.lid = i.lid +and l.lat is not null +and l.lon is not null +and i.pe in ('PP', 'PC') +and substr(i.ts, 1, 1) = 'R' +and i.stg2_input = 'T' +group by 1, 2 +order by 1, 2; + + +-- add info from location table for the lid + +select + l.lid, + 'PPH'||t.ts||'ZZ', + to_char(l.lat,'99.99'), + to_char(l.lon,'999.99'), + case + when l.elev >= 0 then to_char(l.elev,'99999') + else ' -999' + end, + '9', + case + when l.name ISNULL then 'XXXXXXXXXX' + else l.name + end +from temptable t, location l +where t.lid=l.lid; diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/launch_hpe b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/launch_hpe new file mode 100644 index 0000000000..f69b4937b5 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/launch_hpe @@ -0,0 +1,10 @@ +#!/bin/ksh + +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +nohup ksh $PPROC_BIN/start_hpe >/dev/null 2>&1 & +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/precip_station_gen.sql b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/precip_station_gen.sql new file mode 100755 index 0000000000..5493606c16 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/precip_station_gen.sql @@ -0,0 +1,43 @@ +-- gather distinct lid,ts combinations from HourlyPP, HourlyPC and DailyPP tables +-- do not include ts = P* + +select lid, ts +into temp temptable +from hourlypp +where substr(ts, 1, 1) != 'P' +group by 1,2 + +union + +select lid, ts +from hourlypc +where substr(ts, 1, 1) != 'P' +group by 1,2 + +union + +select lid, ts +from dailypp +where substr(ts, 1, 1) != 'P' +group by 1,2 +; + +-- add info from location table for the lid + +select + l.lid, + 'PPD'||t.ts||'ZZ', + to_char(l.lat,'99.99'), + to_char(l.lon,'999.99'), + case + when l.elev >= 0 then to_char(l.elev,'99999') + else ' -999' + end, + '9', + case + when l.name ISNULL then 'XXXXXXXXXX' + else l.name + end +from temptable t, location l +where t.lid=l.lid +order by l.lid asc; diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/prism.jar b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/prism.jar new file mode 100755 index 0000000000..53b519d5ef Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/prism.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_dpa b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_dpa new file mode 100755 index 0000000000..498c2c4d2b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_dpa @@ -0,0 +1,103 @@ +#!/bin/ksh +# +# process_dpa +# +# October 10, 2000 +# run script for process dpa +# processes single file by decoding it +# +# Modified: Oct 29, 2001 Russ added OS_SUFFIX logic +# Nov 5, 2002 Mark removed read_dpainfo, bld_latest +# Sep 02, 2003 paul added delete of ".LE" (Little Endian) files +# +# check the input args +# currently, the bin_dir argument is not used. + +USAGE="process_dpa input_data_file output_log_file err_dir bin_dir" + +if [ $# -ne 4 ] +then + print -u2 "\nUSAGE: $USAGE\n" + exit 3 +fi + +# setup file names +# note: the bin directory arg is not used currently + +DATA_FNM=$1 +LOG_FNM=$2 +ERR_DIR=$3 + + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + + +# echo the current time +# +DTZ=`date -u +%a@%H:%M:%S` +echo "Decoding product: " $DTZ >> $LOG_FNM + + +# now run the decoder ************************************************* +# get and save the return status for later use. + +$PPROC_BIN/decodedpa$OS_SUFFIX $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM +#echo Awaiting proper decodedpa return codes >> $LOG_FNM +DECODE_STATUS=$? + +# +# now dispense of the input file accordingly and continue accoringly +# depending on the status of the decoding operation. +# + +if [ $DECODE_STATUS -eq 0 ] +then + echo Decode status=$DECODE_STATUS ok, removing file. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + rm -f $DATA_FNM.LE >> $LOG_FNM 2>>$LOG_FNM + +elif [ $DECODE_STATUS -eq 1 ] +then + echo Decode status=$DECODE_STATUS data unavailable, removing file. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + rm -f $DATA_FNM.LE >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 2 ] +then + echo Decode status=$DECODE_STATUS decode error, moving file to error dir. >> $LOG_FNM + mv -f $DATA_FNM $ERR_DIR >> $LOG_FNM 2>>$LOG_FNM + mv -f $DATA_FNM.LE $ERR_DIR >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 3 ] +then + echo Decode status=$DECODE_STATUS processing error, moving file to error dir. >> $LOG_FNM + mv -f $DATA_FNM $ERR_DIR >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 4 ] +then + echo Decode status=$DECODE_STATUS radar undefined or inactive, removing file. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 5 ] +then + echo Decode status=$DECODE_STATUS error converting raw product from Big Endian to Little Endian format. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + exit +fi + + +# +DTZ=`date -u +%a@%H:%M:%S` +echo "Completed job at: " $DTZ >> $LOG_FNM + +exit +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_dpafiles b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_dpafiles new file mode 100755 index 0000000000..3f6a8bb700 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_dpafiles @@ -0,0 +1,152 @@ +#!/bin/ksh +# +# process_dpafiles +# +# May 10, 2002 +# script for processing dpa products for the WHFS. +# +# the script takes the input data directory, +# output log directory, and bin directory as arguments. +# it is possible that the calling script may be redirecting +# all standard output from this script to the same log file. +# +# Modified: Nov 5, 2002 Mark removed update_latestFFG +# Aug 15, 2003 Paul - replaced "test -r" with "ls -1F ..." +# + +# check for input args +# + +USAGE="process_dpafiles input_data_dir output_log_dir output_error_dir bin_dir1 bin_dir2 " +if [ $# -ne 5 ] +then + print -u2 "\nUSAGE: $USAGE\n" + exit 1 +fi + + +# set some local variables +# the bin_dir1 arg is for the precip_proc/bin dir +# the bin_dir2 arg is for the whfs/bin dir, which is currently not used + +DATA_DIR=$1 +LOG_DIR=$2 +ERR_DIR=$3 +BIN_DIR1=$4 +BIN_DIR2=$5 + +# define the log file name + +LOG_FILE=$LOG_DIR/`date -u +process_dpa_log_%m%d` + +echo "Data directory: " $DATA_DIR >> $LOG_FILE +echo "Log directory: " $LOG_DIR >> $LOG_FILE +echo "Error directory:" $ERR_DIR >> $LOG_FILE +echo "Bin directory:" $BIN_DIR1 >> $LOG_FILE + +# +# define functions for checking for a stop file and +# logging a message. note that for the +# shell function "test", a true condition returns 0. + +checkDPAstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_dpadecode + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + return 1 + else + return 0 + fi +} + + +logDPAstop() +{ + LOG_FILE=$1 + + DTZ=`date -u` + echo "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> $LOG_FILE + echo "Terminating process." >> $LOG_FILE + echo "Stopfile found at:" $DTZ >> $LOG_FILE + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" >> $LOG_FILE + + return 0 +} + + +# +# enter an infinite loop. for each pass thru main loop, +# look for input files and process them individually. +# check for stop file after each loop and after any +# data file that may be processed. +# after the raw input file is processed, the called +# processing script handles the file (either deletes or moves it) +# + +let loop_cnt=0 + +while test 1=1 +do + +# define the log file name + +LOG_FILE=$LOG_DIR/`date -u +process_dpa_log_%m%d` + +# +# this script also performs a secondary function of +# creating the mosaicked FFG grids, and computing areal FFG values +# via the gen_areal_ffg processes. +# + +let loop_cnt=loop_cnt+1 +if ((loop_cnt > 12)) +then + DTZ=`date -u +%a@%H:%M:%S` + echo Running gen_areal_ffg. $DTZ >> $LOG_FILE + $BIN_DIR1/run_gen_areal_ffg + let loop_cnt=0 +fi + +checkDPAstop $DATA_DIR +STOP_FOUND=$? + +if test STOP_FOUND -eq 1 +then + logDPAstop $LOG_FILE + exit +fi + +FILES_FOUND=`ls -F $DATA_DIR | grep -v "*" | grep -v "/" | wc -l` +if test $FILES_FOUND -ne 0 +then + for DATA_FILE in `ls $DATA_DIR` + do + + checkDPAstop $DATA_DIR + STOP_FOUND=$? + if test STOP_FOUND -eq 1 + then + logDPAstop $LOG_FILE + exit + fi + + + #name=`basename $DATA_FILE` + echo "----------------" >> $LOG_FILE + echo Processing $DATA_DIR/$DATA_FILE >> $LOG_FILE + $BIN_DIR1/process_dpa $DATA_DIR/$DATA_FILE $LOG_FILE $ERR_DIR $BIN_DIR1 2>>$LOG_FILE + + done + +else + DTZ=`date -u +%a@%H:%M:%S` + echo "No files awaiting decoding at:" $DTZ >> $LOG_FILE + sleep 45 +fi + +done + + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_grib_files b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_grib_files new file mode 100755 index 0000000000..d202c0df5f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_grib_files @@ -0,0 +1,165 @@ +#!/bin/ksh +# process_grib_files + +# This script is called from MPE to create grib format files. If the +# mpe_d2d_display_grib token is set to "ON", then the grib file is copied to +# another directory and the notif_mpe.csh script is run. This script +# notifies the grib decoder that a file is available for decoding into netCDF +# format. The netCDF file will then be made available for display in D2D. + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +# This has been added to allow the D2D log dir variable to be defined. +# +# An addition for OB7.2, this script will create a separate set of +# GRIB files in the qpe_grib_sbn directory which have the sub center +# code set to the id of the sending office. GRIB files created in the +# standard qpe_grib directory have the sub center code set to 0. +# +# export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +# . $FXA_HOME/readenv.sh + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +export grib_bin_dir=$(get_apps_defaults pproc_bin) +export grib_out_dir=$(get_apps_defaults mpe_grib_dir) +export grib_in_dir=$(get_apps_defaults rfcwide_xmrg_dir) +export MPE_SEND_QPE_TO_SBN=$(get_apps_defaults mpe_send_qpe_to_sbn) +export MPE_QPE_SBN_DIR=$(get_apps_defaults mpe_qpe_sbn_dir) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export RFCWIDE_OUTPUT_DIR=$(get_apps_defaults rfcwide_output_dir) + +# +# Define input file name and output file name +# in_file=xmrg file name +# out_file=grib file name +# + +in_file=$1 +out_file=$2 +# +# Create log file name +# +griblog=$MPE_LOG_DIR/process_grib_files.log +tempname=$MPE_LOG_DIR/process_grib_files.tmp +# +#save only the latest in the log file +# +echo "-------------------------------" >> $griblog + +tail -1200 $griblog > $tempname +mv $tempname $griblog + +Dte=`date -u` +echo Starting process_grib_files at $Dte >> $griblog + +echo Input xmrg file $grib_in_dir/$in_file >> $griblog +echo Output grib file $grib_out_dir/$out_file >> $griblog + +# +# Run gribit to generate grib format file +# input to gribit is xmrg format file, output from gribit is grib format file +# grib_bin_dir is defined in set_hydro_env +# + +export grib_in_file=$in_file +export grib_out_file=$out_file + +# +# Force the subcenter code to 0 in the created GRIB message. +# +export grib_set_subcenter_0=on + +Dte=`date -u` +echo Invoking $grib_bin_dir/gribit at $Dte >> $griblog + +$grib_bin_dir/gribit.LX + +# +# At RFCs, a second version of the grib file needs to be created for +# transmission over the SBN. This version of the GRIB file will contain +# the code of the sending office. +# + +echo "The value of the mpe_send_qpe_to_sbn token is $MPE_SEND_QPE_TO_SBN" >> \ + $griblog + +if [[ $MPE_SEND_QPE_TO_SBN = "ON" || $MPE_SEND_QPE_TO_SBN = "on" ]] +then + + echo "Producing GRIB file for transmission over the SBN." >> $griblog +# +# Build the path to the qpe SBN grib directory. +# + export grib_in_dir=$MPE_QPE_SBN_DIR + export grib_out_dir=$MPE_QPE_GRIB_SBN_DIR +# +# This is important. Must make sure thet sub_center code is set to the +# sending RFC. + export grib_set_subcenter_0=off + echo "The subcenter code will be set to represent the sending office." >> \ + $griblog + echo Input xmrg file $grib_in_dir/$in_file >> $griblog + echo Output grib file $grib_out_dir/$out_file >> $griblog + +# +# Call gribit +# + Dte=`date -u` + echo Invoking $grib_bin_dir/gribit at $Dte >> $griblog + $grib_bin_dir/gribit.LX + +fi + +# +# If token set to ON, then +# (1) Copy grib file to temp file +# (2) mv temp file to $d2d_grib_dir to ensure that file is complete +# (3) Rename file by adding DDHHMMSS of creation time to name +# (4) Run script notif_mpe.csh +# + +D2D_DISPLAY=$(get_apps_defaults mpe_d2d_display_grib) + +echo Token mpe_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + +if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $RFCWIDE_OUTPUT_DIR/qpe_grib/$out_file >> $griblog + echo to $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp >> $griblog + cp $RFCWIDE_OUTPUT_DIR/qpe_grib/$out_file $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp >> $griblog 2>&1 + + echo Move and rename grib file $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + +# echo Invoking $FXA_BIN_DIR/notif_mpe.csh >> $griblog +# $FXA_BIN_DIR/notif_mpe.csh + +else + echo Grib files are not converted to netCDF files to display on D2D >> $griblog + +fi + + +# +# If token set to ON, then send file to NPVU +# + +#SEND_GRIB=$(get_apps_defaults mpe_send_grib) +#if [[ $SEND_GRIB = "ON" || $SEND_GRIB = "on" ]]; then + +#fi + +Dte=`date -u` +echo Completed process_grib_files at $Dte >> $griblog diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_hpe_grib_files b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_hpe_grib_files new file mode 100755 index 0000000000..5303433502 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_hpe_grib_files @@ -0,0 +1,280 @@ +#!/bin/ksh +# process_hpe grib_files + +# This script is called to create grib format files for the +# High-resolution Precipitation Estimator (HPE). These +# are local xmrg mosaic files and will be converted to AWIPS GRIB1 +# format for conversion into AWIPS netCDF and display in D2D. If the +# *_d2d_display_grib token is set to "ON", then the grib file is copied to +# another directory and the notif_mpe.csh script is run. This script +# notifies the grib decoder that a file is available for decoding into netCDF +# format. The netCDF file will then be made available for display in D2D. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +export grib_bin_dir=$(get_apps_defaults pproc_bin) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + +in_file=$1 +out_file=$2 +process=$3 +# +# Create log file name +# + +griblog=$HPE_LOG_DIR/process_grib_files.log +tempname=$HPE_LOG_DIR/process_grib_files.tmp + +# +#save only the latest in the log file +# +echo "-------------------------------" >> $griblog + +tail -1200 $griblog > $tempname +mv $tempname $griblog + +Dte=`date -u` +echo Starting process_hpe_grib_files at $Dte >> $griblog + +if [[ $process = DHR* ]] +then + + export HPE_DHRMOSAIC_DIR=$(get_apps_defaults hpe_dhrmosaic_dir) + export HPE_DHRMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_dhrmosaic_grib_dir) + echo $HPE_DHRMOSAIC_DIR >> $griblog + echo $HPE_DHRMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_DHRMOSAIC_DIR + export grib_out_dir=$HPE_DHRMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_DHRMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_DHRMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = BDHR* ]] +then + + export HPE_BDHRMOSAIC_DIR=$(get_apps_defaults hpe_bdhrmosaic_dir) + export HPE_BDHRMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_bdhrmosaic_grib_dir) + echo $HPE_BDHRMOSAIC_DIR >> $griblog + echo $HPE_BDHRMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_BDHRMOSAIC_DIR + export grib_out_dir=$HPE_BDHRMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_BDHRMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_BDHRMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = BDSP* ]] +then + + export HPE_EBMOSAIC_DIR=$(get_apps_defaults hpe_ebmosaic_dir) + export HPE_EBMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_ebmosaic_grib_dir) + echo $HPE_EBMOSAIC_DIR >> $griblog + echo $HPE_EBMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_EBMOSAIC_DIR + export grib_out_dir=$HPE_EBMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_EBMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_EBMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = DSP* ]] +then + + if [[ $in_file = ERMOSAIC*z ]] + then + + export HPE_ERMOSAIC_DIR=$(get_apps_defaults hpe_ermosaic_dir) + elif [[ $in_file = MAXRMOSAIC*z ]] + then + + export HPE_ERMOSAIC_DIR=$(get_apps_defaults hpe_max_ermosaic_dir) + elif [[ $in_file = AVGRMOSAIC*z ]] + then + + export HPE_ERMOSAIC_DIR=$(get_apps_defaults hpe_avg_ermosaic_dir) + else + echo "Incorrect RMOSAIC filename. Should be ER, AVGR, or MAXRMOSAIC " >> $griblog + exit 1 + fi + export HPE_ERMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_ermosaic_grib_dir) + echo $HPE_ERMOSAIC_DIR >> $griblog + echo $HPE_ERMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_ERMOSAIC_DIR + export grib_out_dir=$HPE_ERMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_ERMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_ERMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = BTP* ]] +then + + echo "Nowcast process flag passed to script. $process - exiting..." >> $griblog + exit 1 +elif [[ $process = BPRT* ]] +then + + echo "Nowcast process flag passed to script. $process - exiting..." >> $griblog + exit 1 +else + echo "Unknown process flag passed to script. exiting..." >> $griblog + exit 1 +fi + + +# +# Run gribit to generate grib format file +# input to gribit is xmrg format file, output from gribit is grib format file +# grib_bin_dir is defined in set_hydro_env +# + +export grib_in_file=$in_file +export grib_out_file=$out_file + +# +# Force the subcenter code to 0 in the created GRIB message. +# +export grib_set_subcenter_0=on + +Dte=`date -u` +echo Invoking $grib_bin_dir/gribit at $Dte >> $griblog + +$grib_bin_dir/gribit.LX >> $griblog + +#runso rary.ohd.pproc gribit_main_main_ + +if [[ $process = DHR* ]] +then + + D2D_DISPLAY=$(get_apps_defaults dhrmosaic_d2d_display_grib) + + echo Token dhrmosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_DHRMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_DHRMOSAIC_GRIB_DIR/$out_file $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_DHRMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo DHR Mosaic Grib files were not created for display on D2D >> $griblog + + fi +elif [[ $process = BDHR* ]] +then + + D2D_DISPLAY=$(get_apps_defaults bdhrmosaic_d2d_display_grib) + + echo Token bdhrmosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_BDHRMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_BDHRMOSAIC_GRIB_DIR/$out_file $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_BDHRMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo BDHR Mosaic Grib files were not created for display on D2D >> $griblog + + fi +elif [[ $process = BDSP* ]] +then + + D2D_DISPLAY=$(get_apps_defaults ebmosaic_d2d_display_grib) + + echo Token ebmosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_EBMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_EBMOSAIC_GRIB_DIR/$out_file $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_EBMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo EB Mosaic Grib files were not created for display on D2D >> $griblog + + fi +elif [[ $process = DSP* ]] +then + + D2D_DISPLAY=$(get_apps_defaults ermosaic_d2d_display_grib) + + echo Token ermosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_ERMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_ERMOSAIC_GRIB_DIR/$out_file $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_ERMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo ER Mosaic Grib files were not converted to netCDF files to display on D2D >> $griblog + + fi +else + + echo HPE Grib files were not moved to display on D2D >> $griblog + +fi +Dte=`date -u` +echo Completed process_hpe_grib_files at $Dte >> $griblog +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_rfc_bias b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_rfc_bias new file mode 100755 index 0000000000..b635bed868 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/process_rfc_bias @@ -0,0 +1,103 @@ +#!/bin/ksh +# +############################################################################### +# FILENAME: process_rfc_bias +# DESCRIPTION: This script is invoked via the message handling service (MHS) +# mechanisms. It is called when a rfc bias message file +# from a RFC is received at the local WFO. This script copies +# this file to a local directory where it is then processed +# by the process_rfc_bias program. +# +# The MHS places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# This script copies this file to the directory: +# /awips/hydroapps/precip_proc/local/data/rfc_bias_input +# +# +# The arguments to this script are provided via the +# message handling system (MHS) and are translated +# from the MHS args %ENCLOSE(1) %SUBJECT %MSGTYPE +# +# +# USAGE: process_rfc_bias filename subject_string msgtype +# +# AUTHOR: Bryon Lawrence +# CREATION DATE: April 5, 2007 +# ORGANIZATION: OHD-11/HSEB +# MACHINE/SHELL: Korn shell +# MODIFICATION HISTORY: +# DATE PROGRAMMER DESCRIPTION/REASON +# 4/5/2007 B. Lawrence Created. +################################################################################ +# + +# This allows this script to be run from outside of the bin directory +RUN_FROM_DIR=`dirname $0` + +# Set up the WHFS runtime environment +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh +. $RUN_FROM_DIR/../../set_hydro_env +export RFC_BIAS_INPUT_DIR=$(get_apps_defaults rfc_bias_input_dir) +export PROCESS_BIAS_LOG_DIR=$(get_apps_defaults process_bias_log_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +export CLASSPATH=$DB_DRIVER_PATH:$PPROC_BIN/bias_trans.jar + +# Prepare the log file. +process_bias_log=`date +$PROCESS_BIAS_LOG_DIR/process_rfc_bias_%m%d` + +echo "--------------------------------------------------" >> $process_bias_log +echo "Starting process_rfc_bias as $LOGNAME at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") on $HOSTNAME" >> $process_bias_log + +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 + +echo "The filename supplied by the MHS: $FILENAME" >> $process_bias_log +echo "The subject line supplied by the MHS: $SUBJECT" >> $process_bias_log +echo "The type of message supplied by the MHS: $MSGTYPE" >> $process_bias_log + +# +# Use a shell function to extract the argument from the subject line +# the subject string is a quoted string with a filename, followed +# by a space, followed by the product identifier. +parseSubject() +{ + DESCRIP=$1 + PRODUCTID=$2 + return +} + +# +# Create the destination filename and path. +parseSubject $SUBJECT +DATESTR=`date -u +%m%d` +TIMESTR=`date -u +%H%M%S` +DESTINATION_FILENAME=$RFC_BIAS_INPUT_DIR/$PRODUCTID.$DATESTR.$TIMESTR + +# +# Copy the MHS rfc bias file to the rfc_bias_input directory +echo "Copying $FILENAME to $DESTINATION_FILENAME" >> $process_bias_log +cp -f $FILENAME $DESTINATION_FILENAME >> $process_bias_log 2>&1 + +if [[ $? -ne 0 ]] +then + echo "The copy of $FILENAME to $DESTINATION_FILENAME failed." >> \ + $process_bias_log + exit 1 +fi + +# +# Start the process_rfc_bias.LX program +echo "Starting the bias message reading program" >> $process_bias_log +echo "${SYS_JAVA_DIR}/bin/java ohd.hseb.bias_trans/BiasMessageReader $JDBCURL $DESTINATION_FILENAME" >> $process_bias_log + +${SYS_JAVA_DIR}/bin/java ohd.hseb.bias_trans/BiasMessageReader $JDBCURL \ + $DESTINATION_FILENAME >> $process_bias_log 2>&1 +# +# Remove the bias message file +rm -f $DESTINATION_FILENAME >> $process_bias_log 2>&1 + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/purge_hpe_files b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/purge_hpe_files new file mode 100755 index 0000000000..d461518561 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/purge_hpe_files @@ -0,0 +1,494 @@ +#! /bin/ksh +# purge_hpe_files +# This script purges HPE (High-resolution Precipitation Estimator) files +# according to retention period requirements. + +# David T. Miller RSIS OHD/HSEB +# October 30 2007 (adapted from purge_mpe_files) + +# This allows you to run this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOme environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export DSP_LOG_DIR=$(get_apps_defaults dsp_log_dir) +export DHR_LOG_DIR=$(get_apps_defaults dhr_log_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export PPROC_LOCAL_DATA=$(get_apps_defaults pproc_local_data) + +HPELOGS=$HPE_LOG_DIR + +hpe_purge_error=`date -u +error_hpepurge.%Y%m%d%H%M%S` + +if [[ -d $HPELOGS ]] +then +# set errorlog + + errorlog=$HPELOGS/$hpe_purge_error + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) + +# +# get purge file settings + + LOGAGE=`get_apps_defaults hpe_purge_logage` + FILEAGE=`get_apps_defaults hpe_purge_fileage` + XMRGAGE=`get_apps_defaults hpe_purge_xmrgage` + +# set defaults should the tokens above be missing or set incorrectly + + if [[ $LOGAGE -le 0 ]] + then + LOGAGE=720 + fi + + if [[ $FILEAGE -le 0 ]] + then + FILEAGE=180 + fi + + if [[ $XMRGAGE -le 0 ]] + then + XMRGAGE=75 + fi + +# remove empty error logs + + if [[ ! -s $errorlog ]] + then + rm -f $errorlog + fi + + Dte=`date -u` + + # Setup file names + # + fnm=$HPELOGS/purge_hpe_files.log + tmp=$HPELOGS/purge_hpe_files.tmp + +echo `basename $0` log location: $fnm + + # Save only the latest events in the log file + # +if [ -e "${fnm}" ] +then + tail -1200 $fnm > $tmp + mv $tmp $fnm + chmod 777 $fnm +fi + + + # Log a header line to the output file + # + echo "----------------------------------------------------" >> $fnm + echo "Begin purge_hpe_files at: " $Dte >> $fnm + +else + echo "HPE log directory $HPELOGS incorrect " >> $errorlog + echo "Check .Apps_defaults and set_hydro_env for correctness " >> $errorlog + echo "purge_hpe_files exiting with error " >> $errorlog + exit 1 +fi + +# Note that the line below is the way this should be established +# However, since files are being purged, best to hard code to ensure +# that the files to be deleted are the correct ones + +#HPE_OUTPUT_DIR=$PPROC_LOCAL_DATA/hpe +HPE_OUTPUT_DIR=${apps_dir}/precip_proc/local/data/hpe + +if [[ -d $HPE_OUTPUT_DIR ]] +then + HPEHEIGHT=$HPE_OUTPUT_DIR/height + HPEINDEX=$HPE_OUTPUT_DIR/index + HPEDHRMOSAIC=$HPE_OUTPUT_DIR/dhrmosaic + HPEERMOSAIC=$HPE_OUTPUT_DIR/ermosaic + HPEEBMOSAIC=$HPE_OUTPUT_DIR/ebmosaic + HPEBDHRMOSAIC=$HPE_OUTPUT_DIR/bdhrmosaic + HPEAVGMOSAIC=$HPE_OUTPUT_DIR/avgrmosaic + HPEMAXMOSAIC=$HPE_OUTPUT_DIR/maxrmosaic + HPENOWCAST=$HPE_OUTPUT_DIR/nowcast + + + HPEDHRGRIB=$HPEDHRMOSAIC/grib + HPEDHRNETCDF=$HPEDHRMOSAIC/netcdf + HPEDHRGIF=$HPEDHRMOSAIC/gif + + HPEBDHRGRIB=$HPEBDHRMOSAIC/grib + HPEBDHRNETCDF=$HPEBDHRMOSAIC/netcdf + HPEBDHRGIF=$HPEBDHRMOSAIC/gif + + HPEERGRIB=$HPEERMOSAIC/grib + HPEERNETCDF=$HPEERMOSAIC/netcdf + HPEERGIF=$HPEERMOSAIC/gif + + HPEEBGRIB=$HPEEBMOSAIC/grib + HPEEBNETCDF=$HPEEBMOSAIC/netcdf + HPEEBGIF=$HPEEBMOSAIC/gif +else + echo "HPE directory $HPE_OUTPUT_DIR not valid. " >> $fnm + echo "Check for correct directory name " >> $fnm + + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm + + echo "Exiting purge_hpe_files with error at: " $Dte >> $fnm + + exit 1 +fi + + +DHRXMRG=${apps_dir}/precip_proc/local/data/dhr_decoded +DHRARCHIVE=${apps_dir}/precip_proc/local/data/dhr_archive +DHRERROR=${apps_dir}/precip_proc/local/data/dhr_error + + +DSPXMRG=${apps_dir}/precip_proc/local/data/dsp_decoded +DSPARCHIVE=${apps_dir}/precip_proc/local/data/dsp_archive +DSPERROR=${apps_dir}/precip_proc/local/data/dsp_error + +# Note kept these lines in case there's enough confidence to +# use the $PPROC_LOCAL_DATA value +# But with purging, must ensure what's purged is what was +# meant to be. + +#DHRXMRG=$PPROC_LOCAL_DATA/dhr_decoded +#DHRARCHIVE=$PPROC_LOCAL_DATA/dhr_archive +#DHRERROR=$PPROC_LOCAL_DATA/dhr_error + + +#DSPXMRG=$PPROC_LOCAL_DATA/dsp_decoded +#DSPARCHIVE=$PPROC_LOCAL_DATA/dsp_archive +#DSPERROR=$PPROC_LOCAL_DATA/dsp_error + +# Purge hpe log files generated by hpe_fieldgen +# + +echo " " >> $fnm +echo " hpe_fieldgen log files " >> $fnm + +if [[ -d $HPELOGS && -n "$HPELOGS" ]] +then + find $HPELOGS -type f -name 'HPE*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm + find $HPELOGS -type f -name 'error.*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm + find $HPELOGS -type f -name 'print.*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE LOG DIR not valid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm + exit 1 +fi + +if [[ -d $DHR_LOG_DIR && -n "$DHR_LOG_DIR" ]] +then + find $DHR_LOG_DIR -type f -name 'decodedhr*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DHR LOG DIR not valid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $DSP_LOG_DIR && -n "$DSP_LOG_DIR" ]] +then + find $DSP_LOG_DIR -type f -name 'decodedsp*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DSP LOG DIR not valid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +#Purge hpe gridded field files +# + +echo " " >> $fnm +echo " hpe gridded field files " >> $fnm + +if [[ -d $HPEHEIGHT && -n "$HPEHEIGHT" ]] +then + find $HPEHEIGHT -type f -name '*HEIGHT*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE height directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEINDEX && -n "$HPEINDEX" ]] +then + find $HPEINDEX -type f -name '*INDEX*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE index directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEDHRMOSAIC && -n "$HPEDHRMOSAIC" ]] +then + find $HPEDHRMOSAIC -type f -name 'DHRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRMOSAIC && -n "$HPEBDHRMOSAIC" ]] +then + find $HPEBDHRMOSAIC -type f -name 'BDHRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEERMOSAIC && -n "$HPEERMOSAIC" ]] +then + find $HPEERMOSAIC -type f -name 'ERMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE ER Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEAVGMOSAIC && -n "$HPEAVGMOSAIC" ]] +then + find $HPEAVGMOSAIC -type f -name 'AVGRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE AVG Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEMAXMOSAIC && -n "$HPEMAXMOSAIC" ]] +then + find $HPEMAXMOSAIC -type f -name 'MAXRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE MAX Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBMOSAIC && -n "$HPEEBMOSAIC" ]] +then + find $HPEEBMOSAIC -type f -name 'EBMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi +if [[ -d $HPENOWCAST && -n "$HPENOWCAST" ]] +then + find $HPENOWCAST -type f -name 'BPRT*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'BPRT*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + find $HPENOWCAST -type f -name 'PRT*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'PRT*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + find $HPENOWCAST -type f -name 'ACC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'ACC*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + find $HPENOWCAST -type f -name 'BACC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'BACC*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + +else + echo "HPE Nowcast directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + + +if [[ -d $HPEDHRGRIB && -n "$HPEDHRGRIB" ]] +then + find $HPEDHRGRIB -type f -name 'DHRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEDHRNETCDF && -n "$HPEDHRNETCDF" ]] +then + find $HPEDHRNETCDF -type f -name 'DHRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEDHRGIF && -n "$HPEDHRGIF" ]] +then + find $HPEDHRGIF -type f -name 'DHRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRGRIB && -n "$HPEBDHRGRIB" ]] +then + find $HPEBDHRGRIB -type f -name 'BDHRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRNETCDF && -n "$HPEBDHRNETCDF" ]] +then + find $HPEBDHRNETCDF -type f -name 'BDHRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRGIF && -n "$HPEBDHRGIF" ]] +then + find $HPEBDHRGIF -type f -name 'BDHRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEERGRIB && -n "$HPEERGRIB" ]] +then + find $HPEERGRIB -type f -name 'ERMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGRIB -type f -name 'AVGRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGRIB -type f -name 'MAXRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + +else + echo "HPE ER Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEERNETCDF && -n "$HPEERNETCDF" ]] +then + find $HPEERNETCDF -type f -name 'ERMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERNETCDF -type f -name 'AVGRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERNETCDF -type f -name 'MAXRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + +else + echo "HPE ER Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEERGIF && -n "$HPEERGIF" ]] +then + find $HPEERGIF -type f -name 'ERMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGIF -type f -name 'AVGRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGIF -type f -name 'MAXRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + +else + echo "HPE ER Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBGRIB && -n "$HPEEBGRIB" ]] +then + find $HPEEBGRIB -type f -name 'EBMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBNETCDF && -n "$HPEEBNETCDF" ]] +then + find $HPEEBNETCDF -type f -name 'EBMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBGIF && -n "$HPEEBGIF" ]] +then + find $HPEEBGIF -type f -name 'EBMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $DHRXMRG && -n "$DHRXMRG" ]] +then + find $DHRXMRG -type f -name 'DHR*Z' -mmin +$XMRGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DHR XMRG directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $DSPXMRG && -n "$DSPXMRG" ]] +then + find $DSPXMRG -type f -name 'DSP*Z' -mmin +$XMRGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DSP XMRG directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + + +Dte=`date -u` +echo "End purge_hpe_files at: " $Dte >> $fnm + +exit 0 + +#End of purge_hpe_files diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/purge_mpe_files b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/purge_mpe_files new file mode 100755 index 0000000000..c5b2f46dbe --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/purge_mpe_files @@ -0,0 +1,295 @@ +#! /bin/ksh +# purge_mpe_files +# This script purges mpe (Multi-sensor-Precipitation Estimator)files +# History: Deng, Jingtao August 09, 2001 +# modified by P. Tilles 4/22/2002 +# - removed stage3 directories +# - added jpeg, netCDF, grib directories +# modified by P. Tilles 10/2002 +# - added DISAGG_LOG_DIR purge +# modified by P. Tilles 9/2003 +# - added LIGHTNING_LOG_DIR purge +# March 9 2004 - added purge of mlmosaic files - pst +# March 25 2004 - added purge of lsatpre files - pst +# - removed delete from satel_precip dir +# March 30 2004 - added purge of state var files +# for local bias corr satellite - pst +# May 5, 2006 - Modified to fix mistakes made in logic +# to purge MAXRMOSAIC, AVGRMOSAIC, and +# P3LMOSAIC fields. Added logic to purge +# GAGETRIANGLES. +# May 5, 2006 - Modified to purge DailyQC files. +# Nov 17, 2006 - Modified to purge sbn grib and sbn qpe directories. +# May 2007 - Added SRG related fields (3 new fields) +# - added "-type f" to all find commands +# - added directories for RFC bias transfer RFC bias fields +# Sep 2007 - removed stray "i" from delete on FREEZEGRID directory +# Nov 2007 - added purge of disagg logs from mpe_editor dir +# - changed purge of mpe_fieldgen logs to purge filenames mpe_* +# Dec 2007 - removed purge of old disagg logs from old disagg app +# Jan 2008 - added purge of DailyQC freezing level preprocessor logs. + +# This allows you to run this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# set up some environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export LIGHTNING_LOG_DIR=$(get_apps_defaults lightning_log_dir) +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export MPE_QPE_SBN_DIR=$(get_apps_defaults mpe_qpe_sbn_dir) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) +export MPE_GAGEQC_DIR=$(get_apps_defaults mpe_gageqc_dir) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export RFCWIDE_OUTPUT_DIR=$(get_apps_defaults rfcwide_output_dir) +export PPROC_LOG=$(get_apps_defaults pproc_log) + +# +# Define directories for MPE data. +MPELOGS=$MPE_LOG_DIR +MPEEDITLOGS=$PPROC_LOG/mpe_editor +RFCBIASLOGS=$PPROC_LOG/process_bias_message +GAQLOGS=$GAQ_LOG_DIR + +GAGETRIANGLES=$RFCWIDE_OUTPUT_DIR/gagetriangles +RWHEIGHT=$RFCWIDE_OUTPUT_DIR/height +RWINDEX=$RFCWIDE_OUTPUT_DIR/index +MAXRMOSAIC=$RFCWIDE_OUTPUT_DIR/maxrmosaic +AVGRMOSAIC=$RFCWIDE_OUTPUT_DIR/avgrmosaic +P3LMOSAIC=$RFCWIDE_OUTPUT_DIR/p3lmosaic +RWBMOSAIC=$RFCWIDE_OUTPUT_DIR/bmosaic +RWRMOSAIC=$RFCWIDE_OUTPUT_DIR/rmosaic +RWMMOSAIC=$RFCWIDE_OUTPUT_DIR/mmosaic +RWMLMOSAIC=$RFCWIDE_OUTPUT_DIR/mlmosaic +RWLSATPRE=$RFCWIDE_OUTPUT_DIR/lsatpre +RWLMOSAIC=$RFCWIDE_OUTPUT_DIR/lmosaic +RWLOCSPAN=$RFCWIDE_OUTPUT_DIR/locspan +RWLOCBIAS=$RFCWIDE_OUTPUT_DIR/locbias +RWSTATEVAR=$RFCWIDE_OUTPUT_DIR/state_var +RWSATSTVAR=$RFCWIDE_OUTPUT_DIR/sat_state_var +RWGAG=$RFCWIDE_OUTPUT_DIR/gageonly +RWXMRG=$RFCWIDE_OUTPUT_DIR/qpe +RWDRAWPRECIP=$RFCWIDE_OUTPUT_DIR/draw_precip + +MPESRMOSAIC=$RFCWIDE_OUTPUT_DIR/srmosaic +MPESGMOSAIC=$RFCWIDE_OUTPUT_DIR/sgmosaic +MPESRGMOSAIC=$RFCWIDE_OUTPUT_DIR/srgmosaic + +MPERFCBMOSAIC=$RFCWIDE_OUTPUT_DIR/rfcbmosaic +MPERFCMMOSAIC=$RFCWIDE_OUTPUT_DIR/rfcmmosaic + +MPEGIF=$RFCWIDE_OUTPUT_DIR/qpe_gif +MPEGRIB=$RFCWIDE_OUTPUT_DIR/qpe_grib +MPEGRIBSBN=$MPE_QPE_GRIB_SBN_DIR +MPEQPESBN=$MPE_QPE_SBN_DIR +MPEJPEG=$RFCWIDE_OUTPUT_DIR/qpe_jpeg +MPENETCDF=$RFCWIDE_OUTPUT_DIR/qpe_netcdf + +LIGHTNING_LOG=$LIGHTNING_LOG_DIR + +RFCQPETEMP=$RFCWIDE_OUTPUT_DIR/rfcqpe_temp +RFCQPE01=$RFCWIDE_OUTPUT_DIR/rfcqpe01 +RFCQPE06=$RFCWIDE_OUTPUT_DIR/rfcqpe06 +RFCQPE24=$RFCWIDE_OUTPUT_DIR/rfcqpe24 + +RFCBIASINDIR=$RFCWIDE_OUTPUT_DIR/bias_message_input +RFCBIASOUTDIR=$RFCWIDE_OUTPUT_DIR/bias_message_output + +# +# Define directories for DailyQC data +SCRATCH=$MPE_GAGEQC_DIR/scratch + +PRECIPPOINT=$MPE_GAGEQC_DIR/precip/point +PRECIPMAP=$MPE_GAGEQC_DIR/precip/MAP +PRECIPGRID=$MPE_GAGEQC_DIR/precip/grid +PRECIPBAD=$MPE_GAGEQC_DIR/precip/bad +PRECIPDEV=$MPE_GAGEQC_DIR/precip/dev + +TEMPPOINT=$MPE_GAGEQC_DIR/temperature/point +TEMPMAT=$MPE_GAGEQC_DIR/temperature/MAT +TEMPGRID=$MPE_GAGEQC_DIR/temperature/grid +TEMPBAD=$MPE_GAGEQC_DIR/temperature/bad +TEMPDEV=$MPE_GAGEQC_DIR/temperature/dev + +FREEZEPOINT=$MPE_GAGEQC_DIR/freezing_level/point +FREEZEMAZ=$MPE_GAGEQC_DIR/freezing_level/MAZ +FREEZEGRID=$MPE_GAGEQC_DIR/freezing_level/grid + +Dte=`date -u` + +# Setup file names +# +fnm=$PPROC_LOG/misc/purge_mpe_files.log +tmp=$PPROC_LOG/misc/purge_mpe_files.tmp + +echo `basename $0` log location: $fnm + +# Save only the latest events in the log file +# +if [ -e "${fnm}" ] +then + tail -1200 $fnm > $tmp + mv $tmp $fnm + chmod 777 $fnm +fi + + +# Log a header line to the output file +# +echo "----------------------------------------------------" >> $fnm +echo "Begin purge_mpe_files at: " $Dte >> $fnm + + +# Purge mpe log files generated by mpe_fieldgen +# + +echo " " >> $fnm +echo " mpe_fieldgen log files " >> $fnm +find $MPELOGS -name 'mpe_*' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPELOGS -name 'error.*' -type f -mtime +10 -print -exec rm {} \; \ +>> $fnm + +find $MPEEDITLOGS -name 'disagg*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm +find $MPEEDITLOGS -name 'mpe_editor*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm +find $MPEEDITLOGS -name 'mpe_pre*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm +find $MPEEDITLOGS -name 'freez*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm + + +find $GAQLOGS -name 'process_qpe*' -type f -mtime +3 -print -exec rm {} \; \ +>> $fnm +find $GAQLOGS -name 'transmit_rfc*' -type f -mtime +3 -print -exec rm {} \; \ +>> $fnm + + + +#Purge mpe gridded field files older than 2 days +#For gif/jpeg/grib/netcdf and state variables, purge files older than 1 day +# +echo " " >> $fnm +echo " mpe gridded field files " >> $fnm +find $RWMMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLSATPRE -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWMLMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWBMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLOCSPAN -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $P3LMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $GAGETRIANGLES -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $AVGRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MAXRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLOCBIAS -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWSTATEVAR -name '*z' -type f -mtime +0 -print -exec rm {} \; \ +>> $fnm +find $RWSATSTVAR -name '*z' -type f -mtime +0 -print -exec rm {} \; \ +>> $fnm +find $RWHEIGHT -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWINDEX -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWGAG -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWXMRG -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWDRAWPRECIP -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPEQPESBN -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +find $MPESRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPESGMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPESRGMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm + +find $MPEGIF -name '*.gif' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPEGRIB -name '*.grib' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPEGRIBSBN -name '*.grib' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPEJPEG -name '*.jpg' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPENETCDF -name '*.nc' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm + +find $LIGHTNING_LOG -name 'lightning_proc*' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +# +# Purge the GageQC directories +find $PRECIPPOINT -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPGRID -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPMAP -name 'map*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPBAD -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPDEV -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm + +find $TEMPPOINT -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPGRID -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPMAT -name 'mat*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPBAD -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPDEV -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm + +find $FREEZEPOINT -name 'freez*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $FREEZEGRID -name 'freez*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $FREEZEMAZ -name 'maz*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm + +find $SCRATCH -name 'pcp.*' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm + +find $RFCQPETEMP -name '*[A-Z]*' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCQPE01 -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCQPE06 -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCQPE24 -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +find $RFCBIASLOGS -name '*[0-9]' -type f -mtime +3 -print -exec rm {} \; \ + >> $fnm +find $MPERFCBMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $MPERFCMMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCBIASINDIR -name '*[0-9]' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCBIASOUTDIR -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +Dte=`date -u` +echo "End purge_mpe_files at: " $Dte >> $fnm + +#End of purge_mpe_files diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/rerun_mpe_fieldgen b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/rerun_mpe_fieldgen new file mode 100755 index 0000000000..c047ad068f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/rerun_mpe_fieldgen @@ -0,0 +1,30 @@ +#!/bin/ksh +# rerun_mpe_fieldgen +# updated July 11, 2007 to remove +# call to build_hourly. +# +# Updated March 18, 2008 to remove the call to MPE Fieldgen and error +# log information which is not used. Also removed commented out +# call to set_hydro_env to clean up this script some more. +# Actions which need to be performed in addition to rerunning +# MPE Fieldgen can be placed in this script. This script is +# run after MPE Fieldgen is rerun. + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# +# Transmit the RFC bias message if the user has +# elected to do so on reruns. +# +if [[ "$MPE_TRANSMIT_BIAS" = "ON" && "$TRANSMIT_BIAS_ON_RERUN" = "YES" ]] +then + year=`echo $2 | cut -c5-8` + monthday=`echo $2 | cut -c1-4` + $PPROC_BIN/transmit_rfc_bias $year$monthday$1 +fi + +if [ "$SSHP_INVOKE_MAP_PREPROCESS" = "ON" ] +then + $WHFS_BIN_DIR/run_SSHP_MAP_preprocess >$SSHP_LOG_DIR/MAPPreprocessor.stdout.log 2>>$SSHP_LOG_DIR/MAPPreprocessor.stdout.log & +fi diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/ruc.pl.template b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/ruc.pl.template new file mode 100755 index 0000000000..a315c5d1fc --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/ruc.pl.template @@ -0,0 +1,146 @@ +#!/usr/bin/perl -w +use File::Copy; + + +# setup the grid +use AGRID; +my($file,$AGID,@temp,@hght); + +#set file name +$file=$ARGV[0]; +#print "file is $file\n"; + +$siteid=$ARGV[1]; +$envsiteid=$ENV{"MPE_SITE_ID"}; +#print "siteid=$siteid envsiteid=$envsiteid\n"; +if ($siteid ne $envsiteid) { + $sitefile=$ENV{"MPE_STATION_LIST_DIR"} . "/" . $siteid . "_station_list"; + #print "sitefile=$sitefile\n"; + open(STNS,$sitefile) || + die "Could not open ${siteid} station list file \n"; + @areastns=; + close(STNS); + chomp(@areastns); + $count = grep(/HZIRZZZ/,@areastns); + #print "count=$count\n"; + if ($count == 0) { exit; } # if there are no freezing stations in the file, exit + + #reinitialize so the values will be determined from the area station list file + + @lat=(); + @lon=(); + + #return the list of freezing stations + + @frzstns = grep(/HZIRZZZ/,@areastns); + + foreach $fzstn(@frzstns) { + @line=split(' ',$fzstn); + $line[3]=(-1.0)*$line[3]; + #print "lat=$line[2] lon=$line[3]\n"; + push(@lat, $line[2]); + push(@lon, $line[3]); + } + + $count=$count-1; +} +else { + + $count=#####; + +} + +$AGID=&AGRID::setup($file,0); +if ($AGID<0) { die &AGRID::geterrorstring; } +if (&AGRID::setupcoord($AGID)) { die &AGRID::geterrorstring; } + + +for ($i=0; $i<=count; $i++) { + $lat = $lat[$i]; + $lon = $lon[$i]; + + $fzlvl[$i]=-9; #initially set to missing + + #get the temp and hght data at all levels + if (&AGRID::getvertpointll($AGID,"t",0,$lat,$lon,1,\@temp)) { &AGRID::geterrorstring; next; } + if (&AGRID::getvertpointll($AGID,"gh",0,$lat,$lon,1,\@hght)) { &AGRID::geterrorstring; next; } + if (&AGRID::getlevs($AGID,"gh",\@ghlevels)) { &AGRID::geterrorstring; next; } + if (&AGRID::getlevs($AGID,"t",\@tlevels)) { &AGRID::geterrorstring; next; } + + #get mb levels of all variables + @mblevs=(); + &getmblevs(\@tlevels,\@mblevs); + &getmblevs(\@ghlevels,\@mblevs); + + #loop over sorted levels + + $fzlvl[$i]=0; + + foreach $mb (sort(Numerically @mblevs)) { + + if (($j=&findmb($mb,\@tlevels))>=0) { + if (($k=&findmb($mb,\@ghlevels))>=0) { + #print "Hght & Temp at ",$mb,"\n"; + #print "j= ",$j,"\n"; + #print "k= ",$k,"\n"; + #print "hght= ",$hght[$k],"\n"; + #print "temp= ",$temp[$j],"\n"; + if ($hght[$k]>-9000) { + if ($temp[$j]>273.16) { + #print "jtop= ",$jtop,"\n"; + #print "ktop= ",$ktop,"\n"; + #print "hght at top= ",$hght[$ktop],"\n"; + #print "temp at top= ",$temp[$jtop],"\n"; + $fzlvl[$i] = ($hght[$ktop] - + (($hght[$ktop] - $hght[$k]) * + ((273.16 - $temp[$jtop])/($temp[$j] - + $temp[$jtop])))) *.00328; + $fzlvl[$i] = substr($fzlvl[$i], 0, 4); + #print "fzlvl= ",$fzlvl[$i],"\n"; + last; + } else { + $jtop=$j; + $ktop=$k; + } + } + } + } + } +} + +$j=0; +while ($j <= $count) { + print "$fzlvl[$j]\n"; + $j++; +} + +#find level index that has the specified MB value +sub findmb { + my($mb,$Rlev)=@_; + my($search,$j,$lev); + + $search=sprintf("MB %d",$mb); + $j=0; + foreach $lev (@$Rlev) { + if ($lev eq $search) { + return($j); + } + $j++; + } + return(-1); +} + +#find any levels that contain the text MB at the beginning +sub getmblevs { + my($Rlev,$Rmblev)=@_; + my($lev,$mb); + + foreach $lev (@$Rlev) { + if (!($lev=~/^MB (\d+)$/)) { next; } + $mb=$1; + if (grep(/$mb/,@$Rmblev)==0) { push(@$Rmblev,$mb); } + } + return; +} + +sub Numerically { $a <=> $b } diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/ruc.tcl b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/ruc.tcl new file mode 100755 index 0000000000..e4a070d714 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/ruc.tcl @@ -0,0 +1,413 @@ +#!/usr/bin/tclsh +# + +# +# Open the log freezing level processing log file. This will +# be written into the MPE Editor log directory. +# This script is called from the run_freezing_level script which +# sources set_hydro_env and defines several environmental variables +# used in this script. +# +# October 17, 2007 - This script was modified to take an optional +# command line argument specifying the number of days to process +# +# March 11, 2008 - Updated to log the names of the files in +# the RUC80. Fixed variable reference typos. +# +# Dec 2009 - Changed date on .E line to be one day earlier +# +# Usage: ruc.tcl [number of days to process] +# +set run_from_dir [lindex $argv 0] +package require Tclx + +# +# Check for a command line argument specifying the number of days to process. +# If no argument is present, then assume that only one day is being processed. +if { $argc == 3 } { + + set days_to_process [lindex $argv 1 ] + set siteid [lindex $argv 2 ] + +} else { + + set days_to_process 1 + set siteid $env(MPE_SITE_ID) + +} + +# +# Set the freezing level data input and output directories +set rucdir $env(RUC_MODEL_DATA_DIR) +set mmdir $env(MPE_POINT_FREEZING_DIR) +#set siteid $env(MPE_SITE_ID) + +# get env variable DQC_PREPROCESSOR_BASETIME, if it is 18Z, load +#freezing level data at12~18Z, 18~00Z, 00~06Z, 06~12Z. IF it is +#12Z, load freezing level data at 6~12Z, 12~18Z, 18~00Z and +#00~06Z. If it is 00Z, load freezing level data at 18~00Z, +#00~06Z, 06~12Z, 12~18Z. If it is 06Z, load the freezing level +#data from 00~06Z, 06~12Z, 12~18Z, 18~00Z + +set dqc_preprocessor_basetime $env(DQC_PREPROCESSOR_BASETIME) +puts "The dqc_preprocessor_basetime is $dqc_preprocessor_basetime" +puts "The number of days to process is $days_to_process" + +# test purpose + +set rucscript $run_from_dir/ruc.pl + +proc mformat {x} { + if {$x == ""} { + return M + } elseif {$x == 0} { + return 0.00S + } else { + set x [format %.1f $x] + return [set x]0S + } +} + +# Force the dqc_preprocessor_basetime string to be lower case. +set dqc_preprocessor_basetime [string tolower $dqc_preprocessor_basetime] + +#setup dates +set csecs [clock seconds] +set tsecs $csecs + +set hour [clock format $csecs -format "%H" -gmt 1] +puts "current hour is $hour" + +# set cdates and tdates. Nothing needs to be done when the base hour is 00z. +if { $dqc_preprocessor_basetime == "12z" && $hour < 12 } { + + set csecs [expr $csecs-24*60*60] + +} elseif { $dqc_preprocessor_basetime == "12z" && $hour >= 12 } { + + set tsecs [ expr $csecs+24*60*60] + +} elseif { $dqc_preprocessor_basetime == "18z" && $hour < 18 } { + + set csecs [expr $csecs-24*60*60] + +} elseif { $dqc_preprocessor_basetime == "18z" && $hour >= 18 } { + + set tsecs [expr $csecs+24*60*60] + +} elseif { $dqc_preprocessor_basetime == "06z" && $hour < 6 } { + + set csecs [ expr $csecs-24*60*60 ] + +} elseif { $dqc_preprocess_basetime == "06z" && $hour >= 6 } { + + set tsecs [expr $csecs+24*60*60] +} + +# +# List the available RUC80 files. + +puts "Contents of $rucdir:" + +set ruc_files [glob "$rucdir/*"] + +foreach f $ruc_files { + if {![file isdirectory $f]} { + puts $f + } +} + +# Loop over the number of days to process freezing level +# data for. Take the user specified number of days minus 1. + +set days_to_process [ expr $days_to_process-1 ] + +for { set k $days_to_process } {$k >= 0 } { incr k -1 } { +# Simultaneously subtract from csecs and tsecs the number of days +# + +set begin_secs [expr $csecs-24*60*60*$k] +set end_secs [expr $tsecs-24*60*60*$k] + +#set k1 [expr $k +1] +#puts "k1 is $k1" +#set end_secs1 [expr $tsecs-24*60*60*$k1] +#set otdate1 [clock format $end_secs1 -format "%Y%m%d" -gmt 1] +#puts "otdate1 is $otdate1" +set otdate1 [clock format $begin_secs -format "%Y%m%d" -gmt 1] + +set cdate [clock format $begin_secs -format "%Y%m%d" -gmt 1] +set tdate [clock format $end_secs -format "%Y%m%d" -gmt 1] + +puts "current days being processed are $cdate and $tdate" + +#set file +set otdate [clock format $end_secs -format "%Y%m%d" -gmt 1] +set ofile $mmdir/freezing_1_${siteid}_point_$otdate +puts "output file is $ofile" + +#get values for hours + +if { $dqc_preprocessor_basetime == "18z" } { + + set dates [list $cdate $tdate $tdate $tdate] + set hrs [list 1800 0000 0600 1200] + +} elseif { $dqc_preprocessor_basetime == "00z" } { + + set dates [list $tdate $tdate $tdate $tdate] + set hrs [list 0000 0600 1200 1800] + +} elseif { $dqc_preprocessor_basetime == "06z" } { + + set dates [list $cdate $cdate $cdate $tdate] + set hrs [list 0600 1200 1800 0000] + +} else { + + # dqc_preprocessor_basetime must be 12z + set dates [list $cdate $cdate $tdate $tdate] + set hrs [list 1200 1800 0000 0600] +} + +set i 0 +foreach hr $hrs dt $dates { + puts "hour $hr" + set file $rucdir/[set dt]_$hr + puts "rucfile is $file" + if {[file exists $file]} { + puts "$rucscript $file $siteid" + set vals$i [exec $rucscript $file $siteid] + } else { + puts "File $file not found. Continuing." + set vals$i "" + } + puts [set vals$i] + incr i +} + +# +# If there was no data, do not overwrite the existing freezing level file. +set len0 [ string length $vals0 ] +set len1 [ string length $vals1 ] +set len2 [ string length $vals2 ] +set len3 [ string length $vals3 ] + +if { $len0 == 0 && $len1 == 0 && $len2 == 0 && $len3 == 0 } { +# Probably want to continue here. + puts "No data found for $ofile." + continue; +} + +# +# Check if the output file already exists. If it does, then open it. +# Process each record. For each blank freezing level value computed +# above, see if there was already one in the file from a previous +# run of this script. If there is, use it. This needs to be +# done because RUC80 data files are only kept around for 8 hours or +# so. + +if [catch {open $ofile r} fileId] { +# +# The file does not exist or could not be opened. + set i 0 + set out "" + puts "file does not exist" + + foreach v0 $vals0 v1 $vals1 v2 $vals2 v3 $vals3 { + set stn [format %05d $i] + set v0 [mformat $v0] + set v1 [mformat $v1] + set v2 [mformat $v2] + set v3 [mformat $v3] + + if { $dqc_preprocessor_basetime == "18Z" || + $dqc_preprocessor_basetime == "18z"} { + append out ".E Z$stn $otdate1 DH18/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "00Z" || + $dqc_preprocessor_basetime == "00z" } { + append out ".E Z$stn $otdate1 DH00/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "06Z" || + $dqc_preprocessor_basetime == "06z" } { + append out ".E Z$stn $otdate1 DH06/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } else { + append out ".E Z$stn $otdate1 DH12/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + } + + incr i + } + + puts -nonewline $out +} else { +# +# The file does exist. + set i 0 + set out "" + + puts "file exist" + foreach v0 $vals0 v1 $vals1 v2 $vals2 v3 $vals3 { + + set stn [format %06d $i] + set v0 [mformat $v0] + set v1 [mformat $v1] + set v2 [mformat $v2] + set v3 [mformat $v3] + + # Read the record. + gets $fileId line + + set len [ string length $line ] + + if {$len > 0} { + + if { $dqc_preprocessor_basetime == "18Z" || + $dqc_preprocessor_basetime == "18z"} { + + # Parse the line for the four freezing level values. + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v18 v00 v06 v12 + + set v18 [ string trimright $v18 / ] + set v00 [ string trimright $v00 / ] + set v06 [ string trimright $v06 / ] + set v12 [ string trimright $v12 / ] + set v18 [ string trimleft $v18 ] + set v00 [ string trimleft $v00 ] + set v06 [ string trimleft $v06 ] + set v12 [ string trimleft $v12 ] + + if { $v0 == "M" && $v18 != "M" } { + set v0 $v18 + } + if { $v1 == "M" && $v00 != "M" } { + set v1 $v00 + } + if { $v2 == "M" && $v06 != "M" } { + set v2 $v06 + } + if { $v3 == "M" && $v12 != "M" } { + set v3 $v12 + } + + } elseif { $dqc_preprocessor_basetime == "00Z" || + $dqc_preprocessor_basetime == "00z"} { + + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v00 v06 v12 v18 + + set v18 [ string trimright $v00 / ] + set v00 [ string trimright $v06 / ] + set v06 [ string trimright $v12 / ] + set v12 [ string trimright $v18 / ] + set v18 [ string trimleft $v00 ] + set v00 [ string trimleft $v06 ] + set v06 [ string trimleft $v12 ] + set v12 [ string trimleft $v18 ] + + if { $v0 == "M" && $v00 != "M" } { + set v0 $v00 + } + if { $v1 == "M" && $v06 != "M" } { + set v1 $v06 + } + if { $v2 == "M" && $v12 != "M" } { + set v2 $v12 + } + if { $v3 == "M" && $v18 != "M" } { + set v3 $v18 + } + + } elseif { $dqc_preprocessor_basetime == "06Z" || + $dqc_preprocessor_basetime == "06z"} { + + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v06 v12 v18 v00 + + set v18 [ string trimright $v06 / ] + set v00 [ string trimright $v12 / ] + set v06 [ string trimright $v18 / ] + set v12 [ string trimright $v00 / ] + set v18 [ string trimleft $v06 ] + set v00 [ string trimleft $v12 ] + set v06 [ string trimleft $v18 ] + set v12 [ string trimleft $v00 ] + + if { $v0 == "M" && $v06 != "M" } { + set v0 $v06 + } + if { $v1 == "M" && $v12 != "M" } { + set v1 $v12 + } + if { $v2 == "M" && $v18 != "M" } { + set v2 $v18 + } + if { $v3 == "M" && $v00 != "M" } { + set v3 $v00 + } + + } else { + + # Parse the line for the four freezing level values. + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v12 v18 v00 v06 + + set v12 [ string trimright $v12 / ] + set v18 [ string trimright $v18 / ] + set v00 [ string trimright $v00 / ] + set v06 [ string trimright $v06 / ] + set v12 [ string trimleft $v12 ] + set v18 [ string trimleft $v18 ] + set v00 [ string trimleft $v00 ] + set v06 [ string trimleft $v06 ] + + if { $v0 == "M" && $v12 != "M" } { + set v0 $v12 + } + if { $v1 == "M" && $v18 != "M" } { + set v1 $v18 + } + if { $v2 == "M" && $v00 != "M" } { + set v2 $v00 + } + if { $v3 == "M" && $v06 != "M" } { + set v3 $v06 + } + } + } + + if { $dqc_preprocessor_basetime == "18Z" || + $dqc_preprocessor_basetime == "18z"} { + + append out ".E Z$stn $otdate1 DH18/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "00Z" || + $dqc_preprocessor_basetime == "00z"} { + + append out ".E Z$stn $otdate1 DH00/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "06Z" || + $dqc_preprocessor_basetime == "06z"} { + + append out ".E Z$stn $otdate1 DH06/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } else { + + append out ".E Z$stn $otdate1 DH12/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + } + + incr i + } + + # + # Close the freezing level data file. + close $fileId + + puts -nonewline $out + +} + +# Write the Freezing Level File. +write_file $ofile $out + +#Continue with the next day to process. +} + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_biasmesgen b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_biasmesgen new file mode 100755 index 0000000000..a71772aec4 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_biasmesgen @@ -0,0 +1,63 @@ +#!/bin/ksh + +# Bias Table Message File Generation Script + +# +# This allows you to call this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +#export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +#. $FXA_HOME/readenv.sh + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export FXA_LOCAL_SITE=$(get_apps_defaults fxa_local_site) +TZ=GMT +export TZ + +# +# setup log file +# + +BIASMESSLOGDIR=$(get_apps_defaults rfcwide_logs_dir) + +fnm=$BIASMESSLOGDIR/biasmesgen.log +tmp=$BIASMESSLOGDIR/biasmesgen.tmp + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin at "$Dte >> $fnm + +# +# Generate Bias Table Message +# + +runso rary.ohd.pproc biasmesgen_main >> $fnm + +# +# end write to log +# + +Dte=`date -u` +echo "End at "$Dte >> $fnm +exit 0 \ No newline at end of file diff --git a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/run_build_hourly b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_build_hourly similarity index 97% rename from nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/run_build_hourly rename to nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_build_hourly index be2c07e877..255b49f4c2 100755 --- a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/run_build_hourly +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_build_hourly @@ -67,9 +67,9 @@ integer CNTR=1 while [[ 1 -eq 1 ]] do NUM_OF_FILES=`ls -1 $GAGE_PP_DATA | grep BUILD | wc -l` - if [[ ($NUM_OF_FILES -ne 0) && ($CNTR -lt 15) ]] + if [[ ($NUM_OF_FILES -ne 0) && ($CNTR -lt 2) ]] then - sleep 2 + sleep 1 CNTR=CNTR+1 else break diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_basin_format b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_basin_format new file mode 100755 index 0000000000..e5e8e3665b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_basin_format @@ -0,0 +1,95 @@ +#!/bin/sh + +############################################################################### +# run_convert_basin_format +# +# This script converts a CBRFC formatted basin file to whfs formatted file. +# +# This script takes three arguments: +# +# : The cbrfc formatted basin file to be converted +# +# : The whfs formatted output file +# +# : The location of the input file +# +# The reformatted output file will be placed in the directory pointed to +# by the whfs_geodata_dir token. +# +# Modification History +# June 5, 2006 Ram Varma Original Coding. +# +############################################################################### + +# +# The user must supply the input file name, output file name and location of the input file + + + +if [[ $# -ne 3 ]] +then + printf "Usage: run_convert_basin_format " + printf "\twhere input_file is the file to be converted" + printf "\tand output file is the converted file" + printf "\tand the input file directory is the location of the source file" + exit 1; +fi + +input_file=$1 +output_file=$2 +input_file_directory=$3 + +# +# Set up environment variables +# Define FILENAME variable + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_GEODATA_DIR=$(get_apps_defaults whfs_geodata_dir) + +printf "The geo data directory is: $WHFS_GEODATA_DIR" + +printf "converting $WHFS_GEODATA_DIR/$input_file to whfs basin file format and storing it in $output_file" + +$RUN_FROM_DIR/convert_basin_format.LX $input_file_directory/$input_file $output_file + +printf "done converting..." + +printf "checking for prior existance of $output_file in $WHFS_GEODATA_DIR/" + +# +# Check for the existence of the output file. If it exists, warn the user +# that this file will be overwritten. If the choice is to overwrite, +# a backup of the original file will be created wit a ".bak" extension. +# Give the user the chance to quit. +# +if [[ -a $WHFS_GEODATA_DIR/$output_file ]] +then + + printf "The $WHFS_GEODATA_DIR/$output_file file exists.\n" + printf "It will be overwritten. Procede?\n" + read overwrite?" (Y/N):" + + while [[ $overwrite != "N" && $overwrite != "Y" ]] + do + read overwrite?" Please enter Y or N:" + done + + if [ $overwrite == "N" ] + then + printf "The basin file conversion has been aborted.\n" + exit 1; + elif [ $overwrite == "Y" ] + then + printf "creating a backup of the original $WHFS_GEODATA_DIR/$output_file file" + printf "Moving the $WHFS_GEODATA_DIR/$output_file to $WHFS_GEODATA_DIR/$output_file.bak" + mv $WHFS_GEODATA_DIR/$output_file $WHFS_GEODATA_DIR/$output_file.bak + fi + +fi + +printf "\n" +printf "Copying $output_file in $WHFS_GEODATA_DIR/" + +cp $output_file $WHFS_GEODATA_DIR/ + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_climo_list b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_climo_list new file mode 100755 index 0000000000..81021db24e --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_climo_list @@ -0,0 +1,77 @@ +#!/bin/ksh + +############################################################################### +# convert_dqc_climo_list +# +# This script converts a CBRFC-formatted climatology list into the format +# required by MPE Editor. +# +# This script takes three arguments: +# +# : The path and name of the station list file to be +# converted. +# : cbrfc, for an example. +# +# +# Modification History +# June 5, 2006 Ram Varma Original Coding. +# +############################################################################### + +# +# The user must supply the input file name and the area_id. + +# +if [[ $# -ne 2 ]] +then + print "Usage: convert_dqc_climo_list " + print "\twhere input_file is the path and name of the input file" + print "\t area_id cbrfc, as an example" + exit 1; +fi + +input_file=$1 +area_id=$2 + +# +# Set up environment variables +# Define FILENAME variable + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_CLIMO_DIR=$(get_apps_defaults mpe_climo_dir) + +FILENAME=$MPE_CLIMO_DIR/${area_id}_station_climo_list + +print "Reading $input_file" +print "Reformatted climo station list will be written to $FILENAME" + +rm -f $FILENAME + +# +# Get a count of the number of PPM records in the climo file. +export num_ppm_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^PPM/ {count=count+1} END{print count}'` + +# +# Get a count of the number of TAI records in the climo file. +export num_tai_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^TAI/ {count=count+1} END{print count}'` + +print "$input_file contains $num_ppm_records PPM records" +print "$input_file contains $num_tai_records TAI records" + +echo $num_ppm_records >> $FILENAME +awk '{if(FNR <= ENVIRON["num_ppm_records"]) print $0}' $input_file \ + >> $FILENAME + +# +# There are two tai climo records for each station. +((num_temp_records=$num_tai_records/2)) + +echo $num_temp_records >> $FILENAME +awk '{if(FNR > ENVIRON["num_ppm_records"] && \ + FNR <= ( ENVIRON["num_tai_records"] + ENVIRON["num_ppm_records"])) \ + print $0}' $input_file >> $FILENAME + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_station_list b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_station_list new file mode 100755 index 0000000000..db3dc56b6d --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_station_list @@ -0,0 +1,133 @@ +#!/bin/ksh + +############################################################################### +# convert_dqc_station_list +# +# This script converts a CBRFC-formatted station list into the format +# expected by MPE Editor. +# +# This script takes three arguments: +# +# : The path and name of the station list file to be +# converted. +# : Y or N. Indicates whether or not to place the PPH +# station list at the top of the file. If this is a +# subarea station list, then this should be N. If this is +# the master DailyQC station list then this should be Y. +# : cbrfc, for an example. +# +# The reformatted station list will be placed in the directory pointed to +# by the mpe_station_list_dir token. This file will be named as +# _station_list. +# +# Modification History +# May 24, 2006 Bryon Lawrence Original Coding. +# +############################################################################### + +# +# The user must supply the input file name, the Y or N flag indicating +# whether or not to include the PPH station list and the area_id. + +# +if [[ $# -ne 3 ]] +then + print "Usage: convert_dqc_station_list " + print "\twhere input_file is the path and name of the input file" + print "\t pph_flag = Y to load PPH station list" + print "\t N to not load PPH station list" + print "\t area_id cbrfc, as an example" + exit 1; +fi + +input_file=$1 +pph_flag=$2 +area_id=$3 + +# +# Set up environment variables +# Define FILENAME variable +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_STATION_LIST_DIR=$(get_apps_defaults mpe_station_list_dir) +export DB_NAME=$(get_apps_defaults db_name) + +FILENAME=$MPE_STATION_LIST_DIR/${area_id}_station_list + +print "Reading $input_file" +print "Reformatted station list will be written to $FILENAME" + +rm -f $FILENAME + +if [[ $pph_flag = "Y" ]] +then + print "Including PPH station list." +else + print "Excluding PPH station list. " +fi + +#Check if the PPH list needs to be appended. +if [[ $pph_flag = "Y" ]] +then + ############################################################################ + # + # Generate station list for 1 hr MPE + # + $POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME \ + -f $RUN_FROM_DIR/hourly_precip_station_gen.sql \ + > hourly_precip_station_list + + # + # Get count of records from above and write to station_list file + # + wc -l < hourly_precip_station_list > $FILENAME + + # + # Write precip station info to station_list file + # + cat hourly_precip_station_list >> $FILENAME + +fi + +# +# Get a count of the number of PPD records in the CBRFC station file. +export num_ppd_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^PPD/ {count=count+1} END{print count}'` + +# +# Get a count of the number of TAI records in the CBRFC station file. +export num_tai_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^TAI/ {count=count+1} END{print count}'` + +# +# Get a count of the number of HZI records in the CBRFC station file. +export num_hzi_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^HZI/ {count=count+1} END{print count}'` + +print "$input_file contains $num_ppd_records PPD records" +print "$input_file contains $num_tai_records TAI records" +print "$input_file contains $num_hzi_records HZI records" + +# +# Insert a dummy record for the PPH stations. +# Or insert the the PPH block as created by the create station list +# script. +echo $num_ppd_records >> $FILENAME +awk '{if(FNR <= ENVIRON["num_ppd_records"]) print $0}' $input_file \ + >> $FILENAME + +echo $num_tai_records >> $FILENAME +awk '{if(FNR > ENVIRON["num_ppd_records"] && \ + FNR <= ( ENVIRON["num_tai_records"] + ENVIRON["num_ppd_records"])) \ + print $0}' $input_file >> $FILENAME + +echo $num_hzi_records >> $FILENAME +awk '{if(FNR > (ENVIRON["num_tai_records"] + ENVIRON["num_ppd_records"])) \ + print $0}' $input_file >> $FILENAME + + +rm -f hourly_precip_station_list + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_copygb b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_copygb new file mode 100755 index 0000000000..200b25157d --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_copygb @@ -0,0 +1,26 @@ +#!/bin/ksh +# run_copygb + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export COPYGB_LOG_DIR=$(get_apps_defaults pproc_util_log_dir) +export PPROC_LOCAL_BIN=$(get_apps_defaults pproc_local_bin) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# Create error log file name +logname=COPYGB_`date -u +error.%Y%m%d%H%M%S` +errorlog=$COPYGB_LOG_DIR/$logname + +# +# Run copygb with parameters specified +# Delete error log if empty +# + +runso rary.ohd.pproc copygb_main_ $@ 2>>$errorlog +echo copygb error log located at: $errorlog + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_freezing_station_list b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_freezing_station_list new file mode 100755 index 0000000000..eb9b803f35 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_freezing_station_list @@ -0,0 +1,12 @@ +#!/bin/ksh +# run_create_gage_file + +# This script is called from Build_Station_List. +# It should not be run alone. It assumes that set_hydro_env has already +# been sourced. + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +runso rary.ohd.pproc create_freezing_station_list_main diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file new file mode 100755 index 0000000000..ba1df26b80 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file @@ -0,0 +1,11 @@ +#!/bin/ksh +# run_create_gage_file + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export RFCWIDE_BEAMHEIGHT_DIR=$(get_apps_defaults rfcwide_beamheight_dir) + +runso rary.ohd.pproc create_mpe_beam_height_main $RFCWIDE_BEAMHEIGHT_DIR diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_climo_lists b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_climo_lists new file mode 100755 index 0000000000..7f23951b13 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_climo_lists @@ -0,0 +1,16 @@ +#!/bin/ksh +# run_create_mpe_climo_lists +# +# Usage: run_create_mpe_climo_lists + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables. +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_EDITOR_LOGS_DIR=$(get_apps_defaults mpe_editor_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +#$RUN_FROM_DIR/dqc_preproc_setup +#$PPROC_BIN/dqc_preproc_setup_main +runso rary.ohd.pproc dqc_preproc_setup_main \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_gage_file b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_gage_file new file mode 100755 index 0000000000..7c6fba6c7c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_gage_file @@ -0,0 +1,12 @@ +#!/bin/ksh +# run_create_gage_file + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export RFCWIDE_GAGELOC_DIR=$(get_apps_defaults rfcwide_gageloc_dir) +export DB_NAME=$(get_apps_defaults db_name) + +runso rary.ohd.pproc create_mpe_gage_file_main -d$DB_NAME $RFCWIDE_GAGELOC_DIR diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_station_lists b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_station_lists new file mode 100755 index 0000000000..8a8227e34c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_mpe_station_lists @@ -0,0 +1,133 @@ +#!/bin/ksh +# +# Script to generate a list of stations and related information for +# (1) 1 hr precip stations for hourly MPE +# (2) 6 hr/daily precip stations +# (3) 6 hr and max/min temperature stations +# (4) 6 hr freezing level grid points +# + +# Inputs: +# MPE_STATION_LIST_DIR - defined in set_hydro_env +# - dir containing station info list +# +# MPE_SITE_ID - defined in set_hydro_env +# - used to create filename containing station info +# +# Output +# The station information is written to a file named "station_info_list". +# This file is located in the directory pointed to by the mpe_station_list_dir token. +# +# Temporary Files +# This script writes results of queries to the following temporary files: +# temperature_station_list +# precip_station_list +# These files are deleted at the end of the script. +#################################################################################### +# +# Set up environment variables +# Define FILENAME variable +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_STATION_LIST_DIR=$(get_apps_defaults mpe_station_list_dir) +export DB_NAME=$(get_apps_defaults db_name) +export MPE_SITE_ID=$(get_apps_defaults mpe_site_id) + +FILENAME=$MPE_STATION_LIST_DIR/${MPE_SITE_ID}_station_list +#################################################################################### +# +# Generate station list for 1 hr MPE +# +$POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME -f $RUN_FROM_DIR/hourly_precip_station_gen.sql > $RUN_FROM_DIR/hourly_precip_station_list + +# +# Get count of records from above and write to station_list file +# +wc -l < $RUN_FROM_DIR/hourly_precip_station_list > $FILENAME + +# +# Write precip station info to station_list file +# +cat $RUN_FROM_DIR/hourly_precip_station_list >> $FILENAME + +#################################################################################### +# +# Generate station list for 6 hr and 24 hr precip stations +# +# Generate station info for precip stations and write results to temporary file +# +$POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME -f $RUN_FROM_DIR/precip_station_gen.sql > $RUN_FROM_DIR/precip_station_list + +# +# Get count of records from above and write to station_list file +# +wc -l < $RUN_FROM_DIR/precip_station_list >> $FILENAME + +# +# Write precip station info to station_list file +# +cat $RUN_FROM_DIR/precip_station_list >> $FILENAME + +#################################################################################### +# +# Generate station list for 6 hr and max/min temperature stations +# +# Generate station info for temperature stations and write results to temporary file +# +$POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME -f $RUN_FROM_DIR/temperature_station_gen.sql > $RUN_FROM_DIR/temperature_station_list + +# +# Get count of records from above and write to station_list file +# +wc -l < $RUN_FROM_DIR/temperature_station_list >> $FILENAME + +# +# Write temperature station info to station_list file +# +cat $RUN_FROM_DIR/temperature_station_list >> $FILENAME + +# +# Delete temporary files +# + +rm -f $RUN_FROM_DIR/temperature_station_list + +rm -f $RUN_FROM_DIR/precip_station_list + +rm -f $RUN_FROM_DIR/hourly_precip_station_list + +#################################################################################### +# +# Generate grid points for freezing level data +# + +# +# Create the temporary file of freezing level stations +# +$RUN_FROM_DIR/run_create_freezing_station_list + +# +# Concatentate this temporary file to the end of the +# station file list. +# +cat $MPE_STATION_LIST_DIR/${MPE_SITE_ID}_freezing_station_list >> $FILENAME + +# +# Create the ruc.pl script from the ruc.pl.template file. +# This file is responsible for retrieving freezing level +# data from the RUC80 model for grid points contained in the +# offices MPE forecast area. +# +$RUN_FROM_DIR/run_freezing_station_setup + +# +# Remove the temporary freezing station list file. +# +rm -f $MPE_STATION_LIST_DIR/${MPE_SITE_ID}_freezing_station_list + +# +# Done +# +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_prism b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_prism new file mode 100755 index 0000000000..df3f460ac4 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_prism @@ -0,0 +1,75 @@ +#!/bin/ksh + +# run_create_prism +# +# Bryon Lawrence October 5, 2006 OHD +# +# Purpose: +# +# This is the run script for the MPEClimo PRISM generating program. It takes +# the national precipitation and temperature PRISM files available from Orgeon State +# University and crops them to a office's MPE forecast area. These cropped PRISM +# files are stored in XMRG format. They can be displayed in MPE Editor. +# +# This script requires three arguments: +# +# 1) Input Prism File Prefix +# 2) Output Prism File Suffix +# 3) Temperature/Precipitation PRISM flag. This may be either "t" or "p" +# +# The prism_input_dir token provides the path to the raw PRISM files. +# The prism_output_dir token provides the path to the cropped XMRG PRISM files. +# +# This routine expects there to be 13 raw PRISM files, one for each month and one +# for the entire year. This routine will create XMRG files corresponding to the +# raw PRISM files. +# +# This routine assumes that the input prism files have the suffix "_MM" where MM +# is the 2 digit month number. When generating the output PRISM files, this +# routine will append a "_MMM" to each month's XMRG PRISM filename. MMM is the +# lower case 3 character month abbreviation. +# +# For example, run_create_prism us_tmax prism_max_temp t +# +# Will look for the files +# +# us_tmax_01 us_tmax_04 us_tmax_07 us_tmax_10 us_tmax_14 +# us_tmax_02 us_tmax_05 us_tmax_08 us_tmax_11 +# us_tmax_03 us_tmax_06 us_tmax_09 us_tmax_12 +# +# in the input directort specified by the prism_input_dir token. +# +# It will generate the following files in the prism_output_dir token: +# +# prism_max_temp_jan prism_max_temp_apr prism_max_temp_jul prism_max_temp_oct +# prism_max_temp_feb prism_max_temp_may prism_max_temp_aug prism_max_temp_nov +# prism_max_temp_mar prism_max_temp_jun prism_max_temp_sep prism_max_temp_dec +# prism_max_temp_ann +# +# +# + +if [[ $# -ne 3 ]] +then + print "Usage: run_create_prism " + print " " + print " " + exit 1; +fi +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export SYS_JAVA_DIR=/awips2/java +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +# Temporarily set here. +export CLASSPATH=${PPROC_BIN}/prism.jar + +# Temporarily set here. +export prism_input_dir=/awips2/awipsShare/hydroapps/precip_proc/local/data/log/disagg +export prism_output_dir=/awips2/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism +#export prism_input_dir=/fs/hseb/whfs/site_data/mpe_data/PRISM +#export prism_output_dir=/fs/hseb/whfs/cbrfc_historical/cbrfc/mpe_editor/local/data/app/MPE/PRISM + +# Start the MPEClimo program +$SYS_JAVA_BIN_DIR/java -classpath ${CLASSPATH} ohd.hseb.prism.MPEClimo $1 $2 $3 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_topo b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_topo new file mode 100755 index 0000000000..969eca2795 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_topo @@ -0,0 +1,10 @@ +#!/bin/ksh +# run_create_gage_file + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env + +runso rary.ohd.pproc read_topo_main diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_triangles b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_triangles new file mode 100755 index 0000000000..065dc68879 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_create_triangles @@ -0,0 +1,19 @@ +#!/usr/bin/ksh + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env +export UTILTRI_DIR=$(get_apps_defaults rfcwide_utiltriangles_dir) +utiltri=$UTILTRI_DIR/utiltriangles +if [[ -f $utiltri ]] +then + echo triangle files exist! + exit 0 +fi +echo creating triangles ..... + +#$RUN_FROM_DIR/create_triangles.LX +runso rary.ohd.pproc create_triangles_main + +echo Finished creating triangles !!!!! \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_disagg b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_disagg new file mode 100755 index 0000000000..67f822228f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_disagg @@ -0,0 +1,28 @@ +#!/bin/ksh +# run_disagg +# Oct 31, 2002 + +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DISAGG_LOG_DIR=$(get_apps_defaults disagg_log_dir) +export HYDRO_PUBLICBIN=$(get_apps_defaults hydro_publicbin) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# +# AMIRUNNIN_DIR env is REQUIRED by name by amirunning script +# + +#AMIRUNNING_DIR=$DISAGG_LOG_DIR +#echo $HYDRO_PUBLICBIN +#. $HYDRO_PUBLICBIN/amirunning + +#if [[ $AmIRunning = "yes" ]]; then + #echo Run_disagg script canceled due to disagg is currently running + #exit 1 + # fi + +$PPROC_BIN/disagg$OS_SUFFIX diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_disagg_fieldgen b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_disagg_fieldgen new file mode 100755 index 0000000000..61037e215c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_disagg_fieldgen @@ -0,0 +1,37 @@ +# ============================================================================ +# pgm: run_disagg_fieldgen .. test ver of script to run run_disagg/run_mpe_fieldgen +# +# use: test_run_all [num-hours] +# +# in: num-hours .... (optional) if given, input into mpe_fieldgen as the +# in: number of hours, else default to 3 +# in: CURRENTLY NOT IMPLEMENTED +# +# rqd: commands - run_disagg, run_mpe_fieldgen, set_hydro_env +# +# ver: 20021022 +# ============================================================================ + type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null + +Optns="$@" + +# This allows you to call this script from outside of ./whfs/bin +# RUN_FROM_DIR=`dirname $0` +# WhfsDir=$RUN_FROM_DIR/../.. + + ## -------------------------------------- set current dir for scripts + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + + ## -------------------------------------- run run_disagg +$PPROC_BIN/run_disagg $Optns +RtnCod=$? + +if [ "$RtnCod" != 0 ]; then exit 1; fi + + ## -------------------------------------- run run_mpe_fieldgen + +$PPROC_BIN/run_mpe_fieldgen $Optns + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_dqc_preprocessor b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_dqc_preprocessor new file mode 100755 index 0000000000..8529660e7f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_dqc_preprocessor @@ -0,0 +1,73 @@ +#!/bin/ksh +# run_dqc_preprocessor +# +# Usage: run_dqc_preprocessor [-d num_days] [-t run_date] [-a sub_areas] [-z] +# where num_days = NN +# run_date = YYYYMMDD +# sub_areas = sub1,sub2 + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables. +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export MPE_EDITOR_LOGS_DIR=$(get_apps_defaults mpe_editor_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# +# Initialize the parameters +# +NUM_DAYS=10 +RUN_DATE=`date -u +%Y%m%d` +SUBAREA_LIST="ALL" +SET_ZERO="OFF" + +# +# Setup log file +# +LOG_DATE=`date -u +%Y%m%d%H%M%S` +LOGNAME=$MPE_EDITOR_LOGS_DIR/mpe_preprocessor_$LOG_DATE + +# +# Parse the command parameters +# +args=`getopt d:t:a:z $*` +if [ $? != 0 ] +then + echo "Usage: run_dqc_preprocessor [-d num_days] [-t run_date] [-a sub_areas] [-z]" + echo " num_days = N" + echo " run_date = YYYYMMDD" + echo " sub_areas = sub1,sub2,..." + echo " z option = set precip value to zero" + exit 1 +fi + +set -- $args +for i +do + case "$i" in + -d) shift; NUM_DAYS="$1"; shift;; + -t) shift; RUN_DATE="$1"; shift;; + -a) shift; SUBAREA_LIST="$1"; shift;; + -z) shift; SET_ZERO="ON";; + esac +done + +if [ $SET_ZERO = "ON" ] +then + if [ $SUBAREA_LIST = "ALL" ] + then + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -t$RUN_DATE -z > $LOGNAME 2>&1 + else + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -a$SUBAREA_LIST -t$RUN_DATE -z > $LOGNAME 2>&1 + fi +else + if [ $SUBAREA_LIST = "ALL" ] + then + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -t$RUN_DATE > $LOGNAME 2>&1 + else + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -t$RUN_DATE -a$SUBAREA_LIST > $LOGNAME 2>&1 + fi +fi diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen new file mode 100755 index 0000000000..24fadaabc4 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen @@ -0,0 +1,41 @@ +# ============================================================================ +# pgm: run_fieldgen_disagg_fieldgen .. script to run run_mpe_fielgen/run_disagg# /run_mpe_fieldgen +# +# +# in: num-hours .... (optional) if given, input into mpe_fieldgen as the +# in: number of hours, else default to 3 +# in: CURRENTLY NOT IMPLEMENTED +# +# rqd: commands - run_mpe_fieldgen, run_disagg, run_mpe_fieldgen, set_hydro_env +# +# ver: 20030113 +# ============================================================================ + type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null + +Optns="$@" + +# This allows you to call this script from outside of ./whfs/bin +# RUN_FROM_DIR=`dirname $0` +# WhfsDir=$RUN_FROM_DIR/../.. + + ## -------------------------------------- set current dir for scripts + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + + ## -------------------------------------- run run_mpe_fieldgen +$PPROC_BIN/run_mpe_fieldgen $Optns +#RtnCode=$? +#if [ "$RtnCode" != 0 ]; then exit 1; fi + + ## -------------------------------------- run run_disagg +$PPROC_BIN/run_disagg $Optns +RtnCod=$? + +if [ "$RtnCod" != 0 ]; then exit 1; fi + + ## -------------------------------------- run run_mpe_fieldgen + +$PPROC_BIN/run_mpe_fieldgen $Optns + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_freezing_level b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_freezing_level new file mode 100755 index 0000000000..ec4f6c3b2c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_freezing_level @@ -0,0 +1,76 @@ +#!/bin/ksh +############################################################################## +# run_freezing_level +# +# Description: Runs the scripts which extract freezing level data from +# the RUC80 model and store it in a SHEF-formatted +# format for use in the MPE Editor GageQC tools. +# +# This script is setup to be run from the cron. It will +# produce log files in the mpe_editor directory in +# /awips/hydroapps/precip_proc/local/data/log or as +# specified by the mpe_editor_logs_dir token. +# +# Usage: +# run_freezing_level [number of days to process] +# +# Revision History: +# +# April 19, 2006 Bryon Lawrence Original Coding +# October 16, 2007 Bryon Lawrence Added option to supply the +# number days of freezing level +# data to process. +# October 17, 2007 Bryon Lawrence Modified how the freezing level +# logs are purged. Setup so +# that daily log files are created, +# and they are purged by +# the purge_mpe_files script. +############################################################################## +# + +# +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# +# Set up environment variables +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_EDITOR_LOGS_DIR=$(get_apps_defaults mpe_editor_logs_dir) + +# +# Check for the optional command line argument specifying the number +# of days to process. If the number of days is not specified +# then default to 1. +if [ $# -eq 1 ] +then + number_of_days=$1 +else + number_of_days=1 +fi + +# +# Set up the log directory. +freezinglog_file=`date +freezing_level_log_%m%d` +freezinglog=$MPE_EDITOR_LOGS_DIR/${freezinglog_file} + +# +# Write a startup message to the log. +date_string=`date` +echo "############################################################" >> \ + $freezinglog +echo "Running freezing level data retrieval script at $date_string" \ + >> $freezinglog + +# +# Run the scripts to retrieve the freezing level data from the RUC80 +# model for the model grid points which are located within the +# office's MPE forecast area. +${RUN_FROM_DIR}/ruc.tcl $RUN_FROM_DIR $number_of_days >> $freezinglog 2>&1 + +# +# Write a completion message to the freezing level log. +date_string=`date` +echo "Done retrieving freezing level data at $date_string" >> $freezinglog + +# +# End of Script. diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_freezing_station_setup b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_freezing_station_setup new file mode 100755 index 0000000000..e06a939a76 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_freezing_station_setup @@ -0,0 +1,134 @@ +#!/usr/bin/ksh + +############################################################################### +# FILENAME: run_freezing_station_setup +# GENERAL INFORMATION: +# DESCRIPTION: Using the template ruc.pl.template, this script will +# produce a version of ruc.pl which contains the +# RUC80 points within the office's MPE forecast area. +# The ruc.pl script is used by ruc.tcl to extract +# RUC80 data from the AWIPS netCDF files. +# +# This routine reads the freezing station list in the +# /awips/hydroapps/precip_proc/local/data/app/MPE/station_lists +# directory. It formats the latitude/longitude coordinates into +# the format required by the ruc.pl script. It then inserts +# these latitude/longitude coordinates into the ruc.pl script +# as well as updating references to the count of freezing +# stations. +# +# The ruc.pl.template file should never be edited. +# +# This script is meant to be called from the Build_Station_List +# script. It should not be run alone. It assumes that +# /awips/hydroapps/set_hydro_env has already been sourced. +# +# +# ORIGINAL AUTHOR: Bryon Lawrence +# CREATION DATE: April 3, 2006 +# ORGANIZATION: OHD/HSEB +# MACHINE: Linux +# MODIFICATION HISTORY: +# DATE PROGRAMMER DESCRIPTION/REASON +# April 3, 2006 Bryon Lawrence Initial Coding +################################################################################ +# + +# This allows this script to be run from outside of precip_proc/bin. +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +export MPE_SITE_ID=$(get_apps_defaults mpe_site_id) +export MPE_STATION_LIST_DIR=$(get_apps_defaults mpe_station_list_dir) + +# +# Retrieve the directory to read the freezing level station list data from. +# +FREEZING_LIST_PATH=$MPE_STATION_LIST_DIR + +# +# Retrieve the identifier of the office. +# +SITE_ID=$MPE_SITE_ID + +# +# Create the freezing station file name. +# +FREEZING_STATION_FILE=$FREEZING_LIST_PATH/${SITE_ID}_freezing_station_list + +# +# Create the file to temporarily contain the lat/lon coords. These +# will be inserted into the ruc.pl script. +# +FREEZING_STATION_COORD_FILE=$FREEZING_LIST_PATH/${SITE_ID}_freezing_coords + +# +# Check for the existence of the ruc.pl file. If it exists, warn the user +# that this file will be overwritten. Give the user the chance to quit. +# +if [[ -a $RUN_FROM_DIR/ruc.pl ]] +then + + printf "The $RUN_FROM_DIR/ruc.pl file exists.\n" + printf "It will be overwritten. Procede?\n" + read overwrite?" (Y/N):" + + while [[ $overwrite != "N" && $overwrite != "Y" ]] + do + read overwrite?" Please enter Y or N:" + done + + if [ $overwrite == "N" ] + then + printf "The freezing station setup has been aborted.\n" + exit 1; + fi + +fi + +# +# Create the list of RUC80 point latitude/longitude coordinates in the format +# required by the ruc.pl script. Skip the first record in the freezing +# station list file. This is the number of records in the file. +# +awk 'BEGIN{count=0} + {if(FNR > 1){print "$lat["count"] = "$3";\n$lon["count"] = -"$4";"; + count=count+1}}' $FREEZING_STATION_FILE > $FREEZING_STATION_COORD_FILE + +# +# Retrieve the number of records in the coodinate file. +# +num_coord_records=`wc -l $FREEZING_STATION_COORD_FILE | cut -f1 -d' '` + +num_coord_records=`echo $num_coord_records | xargs -i expr {} / 2` +num_coord_records=`echo $num_coord_records | xargs -i expr {} - 1` + +# +# Insert the lat/lon coords into the ruc.pl script. +# +echo $FREEZING_STATION_COORD_FILE | \ + xargs -i sed '3r{}' $RUN_FROM_DIR/ruc.pl.template > ruc.pl.temp + +# +# Modify the ruc.pl script to contain the correct number of lat/lon +# coordinate pairs to process. +# +echo $num_coord_records | xargs -i sed 's/#####/{}/g' ruc.pl.temp > ruc.pl + +# +# Remove the temporary file. +# +rm -f ruc.pl.temp +rm -f $FREEZING_STATION_COORD_FILE + +# +# Change the permissions on the ruc.pl script so that they are executable +# by all. +# +chmod 755 ruc.pl + +# +# Done +# + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gen_areal_ffg b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gen_areal_ffg new file mode 100755 index 0000000000..ea56ae8cbd --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gen_areal_ffg @@ -0,0 +1,41 @@ +#!/bin/ksh +# run_gen_areal_ffg +# July 19, 2002 + +# This allows you to call this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) + +# +# Check if gaff execution is desired +# + +GAFFEXEC=$(get_apps_defaults gaff_execution) + +if [[ $GAFFEXEC = "OFF" || $GAFFEXEC = "off" ]]; then + exit 1 + fi + +# +# Setup log file +# + +Date=`date -u +%m%d` +LOG_FILE=$DPA_LOG_DIR/gen_areal_ffg_log_$Date + +# +# Run gen_areal_ffg from the appropriate directory +# + +runso rary.ohd.pproc gen_areal_ffg_main >> $LOG_FILE + +# Write ending info to log file + + +DTZ=`date -u +%a@%H:%M:%S` +echo $DTZ: Completed job. >>$LOG_FILE +echo "-------------" >>$LOG_FILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gen_areal_qpe b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gen_areal_qpe new file mode 100755 index 0000000000..223b57313a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gen_areal_qpe @@ -0,0 +1,36 @@ +#!/bin/ksh +# +# process_qpe_files + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# Create error log file name +logname=`date -u +error.%Y%m%d%H%M%S` +errorlog=$MPE_LOG_DIR/$logname + +# +# Run mpe_fieldgen for the number of hours specified +# Delete error log if empty +# + +RFC_LIST=XXXXX,YYYYY +DURATION_LIST=1,3,6 + +export geo_data=/awips/hydroapps/geo_data +export st3_rfc=host +export gaq_input_dir=. +export gaq_output_xmrg_dir=. +export gaq_output_netcdf_dir=. + +$PPROC_BIN/gen_areal_qpe$OS_SUFFIX -r$RFC_LIST -h$DURATION_LIST + +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gribit b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gribit new file mode 100755 index 0000000000..efedd56f6c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_gribit @@ -0,0 +1,272 @@ +#!/bin/ksh +# ===================================================================== +# +# run_gribit script +# +# This script was previously known as "gribits" +# + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export grib_out_dir=$(get_apps_defaults mpe_grib_dir) +export grib_in_dir=$(get_apps_defaults rfcwide_xmrg_dir) + +USAGE="usage:run_gribit [-p pgm] [-b bin_dir] [-f file_set] [-i in_file] +[-n in_dir] [-o out_file] [-t out_dir] [-c control] [-g geo_dir] +[-h hrap_coord_file] [-d debug_level] [-l logfile] [-v verbose] +[-s search_order]" + +# ===================================================================== +# Switch Description Default value +# ------ ------------------------------ -------------------------- +# -p Program name. gribit +# +# -f File set override for st3_rfc, Sets indicated by st3_rfc, +# ofs_level, ffg_level tokens. ofs_level, ffg_level tokens. +# +# -i Input file name. None. Program prompt. +# +# -n Input directory and path OR: Use input directory and path +# sat - $rfcwide_satpre_dir indicated by the $grib_in_dir +# token token. +# mpe - $rfcwide_xmrg_dir token +# s3 - $ofs_griddb_dir token +# ffg - $ffg_gridff_dir token +# ro - $ffg_gridro_dir token +# +# -o Output file name. None. Program prompt. +# +# -t Output directory and path. Use output directory and path +# indicated by the $grib_out_dir +# token. +# +# -c Control: g - Encode XMRG into GRIB. +# g - encode XMRG into GRIB +# u - unpack GRIB and output to +# log file +# x - decode GRIB to XMRG file +# +# -g Geo directory (HRAP coordinates Use directory indicated by +# directory) the $geo_st3_ascii token. +# +# -h HRAP coordinate domain file coord.dat +# +# -d Debug level (d1, d2, or d3). Debug off (level = 0) +# +# -l Log file on. Log file off. +# +# -v Verbose program prompts. Suppress program prompts. +# +# -s Parameter table search sequence Parameter table search +# - use user-defined table, if sequence: +# available - use built-in Table 2 NCEP +# - use built-in Table 128 - use built-in Table 128 +# - use built-in Table 2 (NCEP) - use user-defined table, +# if available +# +# Note: -g and -h commands used only with command -c x. +# +# ===================================================================== + +# Initialize command line parameters + + Pgm_cl="" + Fl_set_cl="" + Infil_cl="" + Nindir_cl="" + Otfil_cl="" + Toutdir_cl="" + Control_cl="" + Geo_cl="" + Hcoord_cl="" + Dbug_set_cl="" + Log_prt="off" + Vrb_set_cl="no" + Search_set_cl="0" + +# check parameters were entered on the command line +while getopts :p:f:i:n:o:t:c:g:h:d:b:lvs cl_args ; do + case $cl_args in + p) Pgm_cl=$OPTARG;; + f) Fl_set_cl=$OPTARG;; + i) Infil_cl=$OPTARG;; + n) Nindir_cl=$OPTARG;; + o) Otfil_cl=$OPTARG;; + t) Toutdir_cl=$OPTARG;; + c) Control_cl=$OPTARG;; + g) Geo_cl=$OPTARG;; + h) Hcoord_cl=$OPTARG;; + d) Dbug_set_cl=$OPTARG;; + l) Log_prt="on";; + v) Vrb_set_cl="yes";; + s) Search_set_cl="1";; + \?) bad_sw=YES;; + esac + done + +# set parameters for program execution + +if [[ $Pgm_cl = "" ]] ; then + Pgm="gribit.LX" + else + Pgm=$Pgm_cl + fi + +if [[ $Infil_cl != "" ]] ; then + export grib_in_file=$Infil_cl + fi + +if [[ $Otfil_cl != "" ]] ; then + export grib_out_file=$Otfil_cl + fi + +if [[ $Fl_set_cl = "" ]] ; then + Rfcname=$(get_apps_defaults st3_rfc) + Ofs_lev=$(get_apps_defaults ofs_level) + Ffg_lev=$(get_apps_defaults ffg_level) + else + Rfcname=$Fl_set_cl + Ofs_lev=$Fl_set_cl + Ffg_lev=$Fl_set_cl + export st3_rfc=$Fl_set_cl + export Rfcw_rfcname=$Fl_set_cl + export ofs_level=$Ofs_lev + export ffg_level=$Ffg_lev + fi + +export hrap_domain_id=$Rfcname + +# set input and output directories - can override output directory using -t +P1="" +if [[ $Nindir_cl = "sat" ]] ; then + P1=$(get_apps_defaults pproc_dir) + export grib_in_dir=$P1/"input/rfcwide"/$Rfcname/"satpre" + export grib_out_dir=$(get_apps_defaults grib_dir)/output + elif [[ $Nindir_cl = "mpe" ]] ; then + P1=$(get_apps_defaults ofs_files) + export grib_in_dir=$P1/$Ofs_lev/"griddb/xmrg" + export grib_out_dir=$(get_apps_defaults grib_dir)/output + elif [[ $Nindir_cl = "s3" ]] ; then + P1=$(get_apps_defaults ofs_files) + export grib_in_dir=$P1/$Ofs_lev/"griddb" + export grib_out_dir=$(get_apps_defaults grib_dir)/output + elif [[ $Nindir_cl = "ffg" ]] ; then + P1=$(get_apps_defaults ffg_files) + P2=$(get_apps_defaults ffg_gff_level) + export grib_in_dir=$P1/$Ffg_lev/$P2 + export grib_out_dir=$(get_apps_defaults ffg_out_dir)/grib + elif [[ $Nindir_cl = "ro" ]] ; then + P1=$(get_apps_defaults ffg_files) + P2=$(get_apps_defaults ffg_gro_level) + export grib_in_dir=$P1/$Ffg_lev/$P2 + export grib_out_dir=$(get_apps_defaults ffg_out_dir)/grib + fi + +if [[ $Control_cl != "" ]] ; then + export grib_ctl=$Control_cl + fi + +if [[ $Control_cl != "x" ]] ; then + if [[ $P1 = "" && $Nindir_cl != "" ]] ; then + export grib_in_dir=$Nindir_cl + fi + if [[ $Toutdir_cl != "" ]] ; then + export grib_out_dir=$Toutdir_cl + fi + elif [[ $Control_cl = "x" ]] ; then + if [[ $P1 = "" && $Nindir_cl != "" ]] ; then + export grib_out_dir=$Nindir_cl + fi + if [[ $Toutdir_cl != "" ]] ; then + export grib_in_dir=$Toutdir_cl + fi + if [[ $Geo_cl = "" ]] ; then + P3=$(get_apps_defaults geo_data) + export hrap_domain_dir=$P3/$Rfcname/"ascii" + else + export hrap_domain_dir=$Geo_cl + fi + if [[ $Hcoord_cl = "" ]] ; then + export hrap_domain_file="coord_"$Rfcname".dat" + else + export hrap_domain_file=$Hcoord_cl + fi + fi + +if [[ $Dbug_set_cl != "" ]] ; then + export grib_debug_output=$Dbug_set_cl + fi + +if [[ $Log_prt = "on" ]] ; then + export grib_log_output="on" + fi + +if [[ $Search_set_cl = "1" ]] ; then + export grib_ptbl_search="1" + fi + +if [[ $Vrb_set_cl = "yes" ]] ; then + export grib_verbose="yes" + #echo "Script gribits : Release $Release - $Date" + echo "Script gribits" + echo "The GRIB output directory is : $(get_apps_defaults grib_out_dir)" + echo "The XMRG input directory is : $(get_apps_defaults grib_in_dir)" + echo "The GRIB output file is : $(get_apps_defaults grib_out_file)" + echo "The XMRG input file is : $(get_apps_defaults grib_in_file)" + if [ "$P1" != "" ] ; then + echo " $P1" + fi + if [ "$P2" != "" ] ; then + echo " $P2" + fi + echo "Rfcname is : $Rfcname" + if [[ $Control_cl = "x" ]] ; then + echo "The hrap_domain directory is : $(get_apps_defaults hrap_domain_dir)" + echo "The hrap_domain file is : $(get_apps_defaults hrap_domain_file)" + fi + fi + +#if [[ $Bin_set_cl = "" ]] ; then +# Ex_dir=$(get_apps_defaults grib_dir)/bin/RELEASE +# #Added by Guoxian Zhou 06/17/2003 +# [ -n "$(get_apps_defaults grib_rls) +# elif [[ $Bin_set_cl = "d" ]] ; then +# Ex_dir=$(get_apps_defaults my_dir)/bin +# #Added by Guoxian Zhou 06/17/2003 +# [ -n "$(get_apps_defaults my_rls) +# elif [[ $Bin_set_cl = "a" ]] ; then +# Ex_dir=$(get_apps_defaults grib_dir)/bin/ARCHIVE +# elif [[ $Bin_set_cl = "m" ]] ; then +# Ex_dir=$(get_apps_defaults +# #Added by Guoxian Zhou 06/17/2003 +# [ -n "$(get_apps_defaults mgr_rls) +# elif [[ $Bin_set_cl = "ma" ]] ; then +# Ex_dir=$(get_apps_defaults mgr_dir)/bin/ARCHIVE +# else +# Ex_dir=$Bin_set_cl +# fi + +Ex_dir=$(get_apps_defaults pproc_bin) + +#if [ ! -d $Ex_dir ] ; then +# print "ERROR: directory $Ex_dir not found." +# exit 1 +# fi +#if [ ! -f $Ex_dir/$Pgm ] ; then +# print "ERROR: program $Pgm not found in directory $Ex_dir." + # exit 1 +# fi + +if [[ $Vrb_set_cl = "yes" ]] ; then + echo "Executing from : $Ex_dir/$Pgm" + fi + +eval $Ex_dir/$Pgm +#runso rary.ohd.pproc gribit_main_main_ +echo GRIBIT DONE +#=============================================================== + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_hpe_fieldgen b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_hpe_fieldgen new file mode 100755 index 0000000000..50d582d9fd --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_hpe_fieldgen @@ -0,0 +1,41 @@ +#!/bin/ksh +# run_hpe_fieldgen +# +# This script calls the High-resolution Precipitation Estimator (HPE) +# Field Generator executable. Adapted from run_mpe_fieldgen +# +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + +# Create error log file name +logname=`date -u +error.%Y%m%d%H%M%S` +normalprint=`date -u +print.%Y%m%d%H%M%S` +errorlog=$HPE_LOG_DIR/$logname +printlog=$HPE_LOG_DIR/$normalprint + +# +# Run hpe_fieldgen for the number of runs specified + +export HPE_TIMELAG=`get_apps_defaults hpe_timelag` + +if [[ $1 -gt $HPE_TIMELAG ]] +then + HPE_TIMELAG=$1 +fi + +runso rary.ohd.pproc hpe_fieldgen_main -l $HPE_TIMELAG >> $printlog 2>> $errorlog + +# Delete error and normal print logs if empty +if [[ ! -s $errorlog ]] + then + rm -f $errorlog +fi +if [[ ! -s $printlog ]] +then + rm -f $printlog +fi +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_lightning_proc b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_lightning_proc new file mode 100755 index 0000000000..c7f18d3e56 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_lightning_proc @@ -0,0 +1,131 @@ +#!/bin/ksh +# +# This script gathers the lightning data from the file in netcdf format and +# inserts them in the "lightning" table. +# + +# umask 002 # which is 775 (rwxrwxr_x) or umask 001 = 776 (rwxrwxrw_) + +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env +export LIGHTNING_LOG_DIR=$(get_apps_defaults lightning_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + +echo Starting... +INFILE=`get_apps_defaults lightning_input_dir` + +TEMPDIR=$LIGHTNING_LOG_DIR +export INFILE TEMPDIR + +# +# set up log filename +# + +TZ=GMT +export TZ + +Dte=`date +%m%d%Y` +logfnm=$LIGHTNING_LOG_DIR/lightning_proc_log_$Dte +echo $logfnm + +Starttime=`date` +echo "-------- Run_lightning_proc started at: $Starttime --------" >> $logfnm +echo "****** Operating system is " `uname` >> $logfnm +echo "****** Database name is $DB_NAME " >> $logfnm +### Get current the year, Month, Day +YY=`date '+%Y'` +MM=`date '+%m'` +DD=`date '+%d'` +HR=`date '+%H'` + +### Compute 1 hour behind from current time +hour=`expr $HR - 1` + +### Compute ending day of a month or month of a year +if [ $hour -le 9 ] + then + hour=0${hour} + else + hour=${hour} +fi + +if [ $hour -lt 0 ] +then + hour=23 + DD=`expr $DD - 1` + + if [ $DD -le 9 ] + then + DD=0${DD} + else + DD=${DD} + fi + + if [ $DD -eq 0 ] + then + MM=`expr $MM - 1` + if [ $MM -le 9 ] + then + MM=0${MM} + else + MM=${MM} + fi + + if [ $MM -eq 0 ] + then + MM=12 + YY=`expr $YY - 1` + fi + case $MM in + 02) YRMOD=`expr $YY % 4` #Leap year + if [ $YRMOD -eq 0 -o $YY -eq 00 ] #do not change -eq 0 and -eq 00 + then + DD=29 + else + DD=28 + fi + ;; + 04|06|09|11) DD=30 + ;; + 01|03|05|07|08|10|12) DD=31 + ;; + *) echo "ERROR!!! Invalid month $MM" >> $logfnm + exit + ;; + esac + fi +fi + +Datetime=${YY}${MM}${DD}_${hour}00 +echo "$Datetime is the file that will be processed." >> $logfnm + +#** Copy file to data dir +if [ -f "$INFILE/$Datetime" ]; then + cp $INFILE/$Datetime $TEMPDIR/. + fstat=$? + if test $fstat -ne 0; then + echo "ERROR: copy $TEMPDIR/$Datetime failed." >> $logfnm + else + echo "copy $TEMPDIR/$Datetime succeeded." >> $logfnm + chmod 755 $TEMPDIR/2* + fi +else + echo "WARNING: CAN NOT FIND FILE $INFILE/$Datetime !!!" >> $logfnm + Endtime=`date` + echo "-------- Run_lightning_proc ended at: $Endtime --------" >> $logfnm + echo " " >> $logfnm + exit +fi + +#*** Run lightning_proc program to process data +for fname in `ls -1F $TEMPDIR/2*` +do + echo Processing $fname >> $logfnm + runso rary.ohd.pproc lightning_proc_main $fname >> $logfnm 2>>$logfnm + rm -f $fname +done + +Endtime=`date` +echo "-------- Run_lightning_proc ended at: $Endtime --------" >> $logfnm +echo " " >> $logfnm diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_mpe_fieldgen b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_mpe_fieldgen new file mode 100755 index 0000000000..9ad7c3b4bf --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_mpe_fieldgen @@ -0,0 +1,55 @@ +#!/bin/ksh +# run_mpe_fieldgen + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export SSHP_INVOKE_MAP_PREPROCESS=$(get_apps_defaults sshp_invoke_map_preprocess) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export MPE_GAGE_QC=$(get_apps_defaults mpe_gage_qc) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_LOCAL_BIN=$(get_apps_defaults pproc_local_bin) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export FXA_LOCAL_SITE=$(get_apps_defaults fxa_local_site) + +# Create error log file name +logname=`date -u +error.%Y%m%d%H%M%S` +errorlog=$MPE_LOG_DIR/$logname + + +# +# run build_hourly script which generates hourly +# PP reports based on sub-hourly PP reports. +# it defaults to the top of the current hour + +$PPROC_LOCAL_BIN/run_build_hourly + +# +# Run mpe_fieldgen for the number of hours specified +# Delete error log if empty +# + +runso rary.ohd.pproc mpe_fieldgen_main $@ 2>>$errorlog +echo mpe_fieldgen error log located at: $errorlog + +if [ "$SSHP_INVOKE_MAP_PREPROCESS" = "ON" ] +then + $WHFS_BIN_DIR/run_SSHP_MAP_preprocess >$SSHP_LOG_DIR/MAPPreprocessor.stdout.log 2>>$SSHP_LOG_DIR/MAPPreprocessor.stdout.log & + +fi + +if [[ ! -s $errorlog ]] + then + rm -f $errorlog + fi + + # Run Biasmesgen. +# this should only be run at WFOs +$PPROC_BIN/run_biasmesgen + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_mpe_whfs b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_mpe_whfs new file mode 100755 index 0000000000..8cc81d14b5 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_mpe_whfs @@ -0,0 +1,110 @@ +#!/bin/ksh + +# run_mpe_whfs +# run script for set of programs to complete mpe analysis +# 06/06/2006 + +# This allows you to run this script outside of ./standard/bin +# +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +#. $FXA_HOME/readenv.sh + +# Set up some environment variables for WHFS applications +# +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_INVOKE_MAP_PREPROCESS=$(get_apps_defaults sshp_invoke_map_preprocess) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export MPE_GAGE_QC=$(get_apps_defaults mpe_gage_qc) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_LOCAL_BIN=$(get_apps_defaults pproc_local_bin) +export PPROC_LOG=$(get_apps_defaults pproc_log) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# Setup log output file name +# +fnm=$PPROC_LOG/misc/run_mpe_whfs.log +tmp=$PPROC_LOG/misc/run_mpe_whfs.tmp + +# Save only the latest events in the log file +# +tail -1200 $fnm > $tmp +mv $tmp $fnm +chmod 777 $fnm + +# Run the series of programs +# +echo "---------------------------------------------" >> $fnm + +# build hourly precip reports from sub-hourly data. +# +Dte=`date -u` +echo "Initiating build_hourly job at: "$Dte >> $fnm +$PPROC_LOCAL_BIN/run_build_hourly + +# Run lightning data retrieval process if token set +# +if [ $MPE_GAGE_QC = "ON" ] +then + Dte=`date -u` + echo "Initiating lightning proc job at: "$Dte >> $fnm + $PPROC_BIN/run_lightning_proc +else + echo "Not running lightning proc job since mpe_gage_qc is OFF" >> $fnm +fi + +# run mpe_fieldgen +# Create fieldgen error log file name; later, delete error log if empty + +Dte=`date -u` +echo "Initiating mpe_fieldgen at: "$Dte >> $fnm + +logname=`date -u +error.%Y%m%d%H%M%S` +errorlog=$MPE_LOG_DIR/$logname + +NUM_HOURS=$1 +echo $errorlog +runso rary.ohd.pproc mpe_fieldgen_main $NUM_HOURS 1>>$fnm 2>>$errorlog + +if [[ ! -s $errorlog ]] +then + rm -f $errorlog +fi + +# Run the SiteSpecific MAP preprocessor if token set, to get basin MAP estimates +# +if [ "$SSHP_INVOKE_MAP_PREPROCESS" = "ON" ] +then + echo "Initiating run_SSHP_MAP_preprocess at: "$Dte >> $fnm + $WHFS_BIN_DIR/run_SSHP_MAP_preprocess \ + >$SSHP_LOG_DIR/MAPPreprocessor.stdout.log 2>>$SSHP_LOG_DIR/MAPPreprocessor.stdout.log & +fi + +# Run Biasmesgen. +# this should only be run at WFOs + +Dte=`date -u` +echo "Initiating run_biasmesgen at: "$Dte >> $fnm + +$PPROC_BIN/run_biasmesgen + +# +# initiate the script to transmit the best estimate QPE +# from the RFCs to the WFOs. This should not be +# enabled at the WFOs. + +#Dte=`date -u` +#echo "Initiating transmit_rfc_qpe at: "$Dte >> $fnm +#$PPROC_LOCAL_BIN/transmit_rfc_qpe + +# wrap it up +# +Dte=`date -u` +echo "Completed run_mpe_whfs job at: "$Dte >> $fnm diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_nc2grib b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_nc2grib new file mode 100755 index 0000000000..eb25e3b2e1 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_nc2grib @@ -0,0 +1,31 @@ +#!/bin/ksh +# run_nc2grib + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +#export NC2GRIB_LOG_DIR=$(get_apps_defaults pproc_util_log_dir) +export PPROC_LOCAL_BIN=$(get_apps_defaults pproc_local_bin) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# Create error log file name +logname=NC2GRIB_`date -u +error.%Y%m%d%H%M%S` +errorlog=$NC2GRIB_LOG_DIR/$logname + +# +# Run nc2grib with parameters specified +# Delete error log if empty +# + +runso rary.ohd.pproc nc2grib_main $@ 2>>$errorlog +echo nc2grib error log located at: $errorlog +if [[ ! -s $errorlog ]] + then + rm -f $errorlog + fi + +exit $? +#exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_post_analysis b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_post_analysis new file mode 100755 index 0000000000..561019e71f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/run_post_analysis @@ -0,0 +1,55 @@ +#!/bin/ksh +# run_post_analysis +# October 18, 2005 + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DB_NAME=$(get_apps_defaults db_name) + +#set the resource file searching directory +XAPPLRESDIR=$RUN_FROM_DIR +export XAPPLRESDIR + +#---------------------------------------------------------------------- +# Setup log file name +# +LOGFILE=$MPE_LOG_DIR/post_analysis.log +TEMPFILE=$MPE_LOG_DIR/post_analysis.tmp +# +HOSTNAME=`hostname` +# +# save only the latest events in the log file +# +if [ -f $LOGFILE ] + then + { + tail -1200 $LOGFILE > $TEMPFILE + mv $TEMPFILE $LOGFILE + } + else + echo "--------------------------" > $LOGFILE + fi + +# log start of script +# +echo "------------------------------ " >> $LOGFILE +Dte=`date -u` +echo Invoking $PPROC_BIN/post_analysis$OS_SUFFIX at $Dte >> $LOGFILE +echo Current system: $HOSTNAME >> $LOGFILE +echo Current database: $DB_NAME >> $LOGFILE + +# +# program usage: +# post_analysis [-ddebug] [-t> $LOGFILE 2>&1 + +Dte=`date -u ` +echo Completed post_analysis at $Dte >> $LOGFILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_gage_pp b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_gage_pp new file mode 100755 index 0000000000..cad17b539e --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_gage_pp @@ -0,0 +1,165 @@ +#!/bin/ksh +# ============================================================== +# start_gage_pp - script to start up the Gage Precip Processor +# +# This script will return one of the following completion codes +# to the operating system indicating success or failure of its attempt +# to start the Gage Precip Processor program: +# +# 0 The attempt to start Gage Precip Processor was successful. +# 1 An invalid argument was passed to this script. +# 2 The gage_pp_userid token is not defined. +# 3 The user does not have permission to start Gage Precip Processor. +# 4 The directory specified for data files does not exist. +# 5 The directory specified for the log files does not exist. +# 6 The directory specified for the error files does not exist. +# 7 The directory specified for the executables does not exist. +# 8 The Gage Precip Processor is already running. +# 9 The Gage Precip Processor is not allowed to run on this system. +# Check the gage_pp_host token for the valid system name. +# 10 The gage_pp_enable token is off. There will be no data for gage_pp +# to process. Gage_pp will not be started. +# +# Revision History +# Moria Shebsovich July 2, 2004 Created. +# +# ================================================================= + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` +HOSTNAME=`hostname` + +# +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export GAGE_PP_USERID=$(get_apps_defaults gage_pp_userid) +export GAGE_PP_HOST=$(get_apps_defaults gage_pp_host) +export GAGE_PP_ENABLE=$(get_apps_defaults gage_pp_enable) +export GAGE_PP_DATA=$(get_apps_defaults gage_pp_data) +export GAGE_PP_LOG=$(get_apps_defaults gage_pp_log) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +GAGE_PP_LOGDIR=$GAGE_PP_LOG + +if [[ ! -d $GAGE_PP_LOGDIR ]] + then + print "start_gage_pp: Directory specified for log files does not " \ + "exist " $GAGE_PP_LOGDIR + exit 5 +fi + +# +# define the gage_pp daily log file name +LOGFILE=`date +gage_pp_log_%m%d` +GAGE_PP_LOGFILE=$GAGE_PP_LOGDIR/$LOGFILE + +# Check to make sure that the gage_pp_enable token is set to ON. +if [[ $GAGE_PP_ENABLE != "ON" ]] +then + + print "gage_pp_enable token must be set to 'ON'. Gage Precip Processor" \ + "not started." | tee -a $GAGE_PP_LOGFILE + exit 10 +fi + +# Check which system the Gage Precip Processor is allowed to run on. +# This is specified by the gage_pp_host token which is represented +# by the GAGE_PP_HOST variable set in set_hydro_env. +# If this script is not being run on that system, then log an error message. + +COMPARISON_STRING=`echo $HOSTNAME $GAGE_PP_HOST | awk -F' ' 'match ($1, $2)'` + +if test -z "$COMPARISON_STRING" +then + + print "Gage Precip Processor cannot be started on '$HOSTNAME'" \ + "It can only be started from '$GAGE_PP_HOST'." >> $GAGE_PP_LOGFILE + exit 9 +fi + +# First check to see if the user trying to start process is the one +# allowed to do it +if [[ $GAGE_PP_USERID = "" ]] + then + print start_gage_pp: User allowed to start Gage Precip Processor \ + has not been assigned. >> $GAGE_PP_LOGFILE + print " "Please assign a user id to the 'gage_pp_userid' >> $GAGE_PP_LOGFILE + print " "token for the get_apps_defaults process. >> $GAGE_PP_LOGFILE + exit 2 +fi + +if [ $LOGNAME != $GAGE_PP_USERID ] + then + print start_gage_pp: User $LOGNAME is not allowed to start \ + Gage Precip Processor. >> $GAGE_PP_LOGFILE + print " "Only user $GAGE_PP_USERID can start Gage Precip Processor! >> $GAGE_PP_LOGFILE + exit 3 +fi + +# +# get the directory specifications + + GAGEPPDATA=$GAGE_PP_DATA + GAGEPPBIN=$PPROC_BIN + +# +# Check to see if Gage Precip Processor data, log, and error directories exists + + if [[ ! -d $GAGEPPDATA ]] + then + print "start_gage_pp: Directory specified for data files does not " \ + "exist " $GAGEPPDATA >> $GAGE_PP_LOGFILE + exit 4 + fi + + + if [[ ! -d $GAGEPPBIN ]] + then + print "start_gage_pp: Directory specified for executables does not " \ + "exist " $GAGEPPBIN >> $GAGE_PP_LOGFILE + exit 7 + fi + +# Check if there is an instance of the Gage Precip Processor already running +# for this input data directory, and on this machine +# first, get the pid of the most recent run of the gage_pp +# for this input data directory + +export DUPSTART_LOGFILE=$GAGE_PP_LOGDIR/duplicate_start.log + +export PIDFILE=$GAGEPPDATA/gage_pp_pid.dat +export FILEPID=`cat $PIDFILE` + +if [[ $FILEPID != "" ]] +then + if ps -p $FILEPID | grep gage_pp > /dev/null 2>&1 + then + print "***********************************************" >> $DUPSTART_LOGFILE + print "Gage Precip Processor ALREADY running (pid $FILEPID)." >> $DUPSTART_LOGFILE + print "Additional run prevented. $(date -u) " >> $DUPSTART_LOGFILE + print " " >> $DUPSTART_LOGFILE + + exit 8 + fi +fi + + +# Announce startup of gage_pp + +print ===================================================================== >> $GAGE_PP_LOGFILE +print Starting gage_pp$OS_SUFFIX as $LOGNAME at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") on $HOSTNAME >> $GAGE_PP_LOGFILE +print ===================================================================== >> $GAGE_PP_LOGFILE +print " " >> $GAGE_PP_LOGFILE + + +# Remove stop flag file if it exists + + rm -f $GAGEPPDATA/stop_gage_pp + +# Start program in background +# Redirect standard input and output to /dev/null so that +# gage_pp.OS does not hang up when called from ssh. + $GAGEPPBIN/gage_pp$OS_SUFFIX < /dev/null > /dev/null 2>&1 & + + exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_hpe b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_hpe new file mode 100755 index 0000000000..1b84d7c3bf --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_hpe @@ -0,0 +1,241 @@ +#!/bin/ksh +# +# This script is normally started by or stopped from the DHRgather script +# which runs via cron at set user time to check what precipitation cat +# all the radars in a WFO or RFC AOR are in. +# If any are in precip mode, the decoders and HPE field generator below +# will start if they're not running. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DSP_PROD_DIR=$(get_apps_defaults dsp_prod_dir) +export DHR_PROD_DIR=$(get_apps_defaults dhr_prod_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DHR_LOG_DIR=$(get_apps_defaults dhr_log_dir) + +test -e $HPE_LOG_DIR/start_hpe_ctl +FOUND=$? +if test FOUND -eq 1 +then + touch $HPE_LOG_DIR/start_hpe_ctl +fi + +# +# define functions for checking for a stop file and +# logging a message. note that for the +# shell function "test", a true condition returns 0. + +checkHPEstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_hpe_process + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + +# delay stopping just to make sure that there really isn't any precip +# for all radars within the CWFA +# check the time for the file against the current time +# if greater than 20 minutes then stop HPE + + tnow=`date +%s` + tfile=`date +%s -r $STOP_DIR/stop_hpe_process` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -ge 1200 ]] + then + return 1 + else + echo "stop_hpe_process file found. Will stop HPE after 1200 sec (20min) " >> $hpefnm + echo "unless new precip occurs within that time. Time elapsed = $agesecs seconds " \ + >> $STOP_DIR/processhpe_log + return 2 + fi + + else + return 0 + fi +} + +checkDataRun() +{ + # Check to see if age on file is more than 20 minutes + tnow=`date +%s` + tfile=`date +%s -r $DHR_LOG_DIR/dhrgather_control` #$HPE_LOG_DIR/start_hpe_log` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -ge 1200 ]] + then + return 1 + else + return 2 + fi +} + +logHPEstop() +{ + LOG_FILE=$1 + + DTZ=`date -u` + echo "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> $LOG_FILE + echo "Terminating HPE processes." >> $LOG_FILE + echo "Stopfile found at:" $DTZ >> $LOG_FILE + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" >> $LOG_FILE + + return 0 +} + + + +hpefnm=$HPE_LOG_DIR/processhpe_log +hpetmp=$HPE_LOG_DIR/processhpe_tmp + +# Remove the stop file because either at least one radar has +# indicated there's precip or this script was started manually. +# Script will check if one has been entered after it starts. + +if [[ -r $HPE_LOG_DIR/stop_hpe_process ]] +then + rm -f $HPE_LOG_DIR/stop_hpe_process +fi + +# get the time lag variable to check against data files +# + +TIMELAG=`get_apps_defaults hpe_timelag` + +# +# enter an infinite loop. for each pass thru main loop, +# run the DHR and DSP decoders every minute. Then check to +# see when the HPE field generator should be run according to +# the users frequency token. Will do this until there's no more +# precip in the WFO or RFC AOR and this script is stopped. +# + +Dte=`date -u` +echo "" >> $hpefnm +echo "HPE processing starting up " $Dte >> $hpefnm +echo "DHR and DSP decoders running every minute" >> $hpefnm + +let "loop_cnt=0" + +HPE_RUNFREQ=`get_apps_defaults hpe_runfreq` +echo "HPE Run Frequency $HPE_RUNFREQ minutes " >> $hpefnm + +while true +do + +# +# save log latest entries +# + + if [[ -s $hpefnm ]] + then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm + fi + + checkHPEstop $HPE_LOG_DIR + STOP_FOUND=$? + + if test STOP_FOUND -eq 1 + then + + echo "Elapsed time reached, stopping..." >> $hpefnm + + +# if there's no precip in area, remove the temp files +# + if [[ -d $DHR_PROD_DIR && -n "$DHR_PROD_DIR" ]] + then + echo "Removing temp DHR files in $DHR_PROD_DIR due to no rain " $Dte \ + >> $hpefnm + rm -f $DHR_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DHR PROD DIR $DHR_PROD_DIR invalid " $Dte >> $hpefnm + fi + + if [[ -d $DSP_PROD_DIR && -n "$DSP_PROD_DIR" ]] + then + echo "Removing temp DSP files in $DSP_PROD_DIR due to no rain " $Dte >> $hpefnm + rm -f $DSP_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DSP PROD DIR $DSP_PROD_DIR invalid " $Dte >> $hpefnm + fi + + logHPEstop $hpefnm + exit 0 + elif test STOP_FOUND -eq 2 + then + echo "Stop condition not met, continuing..." >> $hpefnm + fi + + checkDataRun $HPE_LOG_DIR + DATA_RUN=$? + + if test DATA_RUN -eq 1 + then + echo "No data received in 20 minutes, exiting. " `date -u` >> $hpefnm + exit 0 + fi + + $PPROC_BIN/Run_DecodeDHR + DHRDECODE_RUN=$? + if test $DHRDECODE_RUN -eq 0 + then + echo "Finished running dhr decoders " `date -u` >> $hpefnm + fi + $PPROC_BIN/Run_DecodeDSP + DSPDECODE_RUN=$? + if test $DSPDECODE_RUN -eq 0 + then + echo "Finished running dsp decoders " `date -u` >> $hpefnm + fi + + sleep 60 + +# Check to see if age on file is more than $HPE_RUNFREQ minutes + runfreq=$(($HPE_RUNFREQ * 60)) + tnow=`date +%s` + tfile=`date +%s -r $HPE_LOG_DIR/start_hpe_ctl` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -lt $runfreq ]] + then + let "loop_cnt=1" + else + let "loop_cnt=2" + fi + +# checking every run allows the user to change this run frequency + + if [[ loop_cnt -eq 2 ]] + then +# +# get the time lag variable again in case it has changed +# + + touch $HPE_LOG_DIR/start_hpe_ctl + echo "touching start_hpe_ctl file before starting hpe_fieldgen " $Dte >> $hpefnm + Dte=`date -u` + TIMELAG=`get_apps_defaults hpe_timelag` + echo "starting HPE field generator with time lag of $TIMELAG minutes " $Dte >> $hpefnm + $PPROC_BIN/run_hpe_fieldgen $TIMELAG + + # checking every run allows the user to change this run frequency + HPE_RUNFREQ2=`get_apps_defaults hpe_runfreq` + + if [[ $HPE_RUNFREQ -ne $HPE_RUNFREQ2 ]] + then + HPE_RUNFREQ=$HPE_RUNFREQ2 + echo "HPE run freq changed to $HPE_RUNFREQ minutes " >> $hpefnm + fi + fi +done +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_hpe_crons b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_hpe_crons new file mode 100755 index 0000000000..df223a65d2 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_hpe_crons @@ -0,0 +1,72 @@ +#!/bin/ksh + +# +# script for allowing the restart of the HPE crons +# +# HPE crons to gather radar information run every minute +# This script just removes the stop file if present which the crons +# are looking for so that they can start again via the cron. +# +# David T. Miller RSIS OHD/HSEB +# October 31, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + +# this script uses the following set_hydro_env variables: +# HPE_LOG_DIR +# + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# setup log files +# + +if [[ ! -d $HPE_LOG_DIR ]] +then + print "Directory specified for placing stop_hpe_crons file does not exist " $HPE_LOG_DIR + echo "Directory specified for placing stop_hpe_crons file does not exist " $HPE_LOG_DIR + + exit -1 +fi + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp + + +# +# save latest entries in log file +# + + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +echo "Attempting to remove stop_hpe_crons file... " >> $hpefnm + +if [[ -r $HPE_LOG_DIR/stop_hpe_crons ]] +then + rm -f $HPE_LOG_DIR/stop_hpe_crons + echo "stop_hpe_crons file has been removed." >> $hpefnm + echo "HPE radar data processes should now restart via cron " >> $hpefnm + +# so user will see this on the screen as well since this is a manual process + + echo "stop_hpe_crons file has been removed." + echo "HPE radar data processes should now restart via cron " + +else + echo "stop_hpe_crons file does not exist. " >> $hpefnm + echo "stop_hpe_crons file does not exist. " + +fi + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_mpe_editor b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_mpe_editor new file mode 100755 index 0000000000..aeb6331dbf --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_mpe_editor @@ -0,0 +1,28 @@ +#!/bin/ksh +# start_hmap_mpe + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +. $FXA_HOME/readenv.sh + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +XAPPLRESDIR=$RUN_FROM_DIR +export XAPPLRESDIR + +# for calling Java (for the ColorManager in this case) from withing a C program +# already added LD_LIBRARY_PATH to set_hydro_env +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/timeserieslite.jar:$WHFS_BIN_DIR/MiscDialogs.jar + +xterm -T mpe_editor$OS_SUFFIX -iconic -n mpe_editor \ + -e $RUN_FROM_DIR/mpe_editor$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_process_dpafiles b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_process_dpafiles new file mode 100755 index 0000000000..88a3dba095 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/start_process_dpafiles @@ -0,0 +1,101 @@ +#!/bin/ksh +# ========================================================================= +# start_process_dpafiles - script to start up the process_dpafiles process +# ========================================================================= + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export DPA_PROD_DIR=$(get_apps_defaults dpa_prod_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export SHEFDECODE_USERID=$(get_apps_defaults shefdecode_userid) +export DPA_ERROR_DIR=$(get_apps_defaults dpa_error_dir) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# First check to see if the user trying to start process is +# allowed to do it + +if [[ $SHEFDECODE_USERID = "" ]] +then + print The user allowed to start the decoders has not been assigned. + print " "Please assign a user id to the 'shefdecode_userid' + print " "token for the get_apps_defaults process. + exit -1 +fi + +if [ $LOGNAME != $SHEFDECODE_USERID ] +then + print User $LOGNAME is not allowed to start process_dpafiles. + print " "Only user $SHEFDECODE_USERID can start this process. + exit -2 +fi + + +# get the directory specifications + +DATA_DIR=$DPA_PROD_DIR +LOG_DIR=$DPA_LOG_DIR +ERR_DIR=$DPA_ERROR_DIR +BIN_DIR1=$PPROC_BIN +BIN_DIR2=$WHFS_BIN_DIR + +# Check to see if directories exist + +if [[ ! -d $DATA_DIR ]] +then + print "Directory specified for data files does not exist " $DATA_DIR + exit -3 +fi + +if [[ ! -d $LOG_DIR ]] +then + print "Directory specified for log files does not exist " $LOG_DIR + exit -4 +fi + +if [[ ! -d $ERR_DIR ]] +then + print "Directory specified for error files does not exist " $ERR_DIR + exit -5 +fi + +if [[ ! -d $BIN_DIR1 ]] +then + print "Directory specified for executables does not exist " $BIN_DIR1 + exit -6 +fi + +if [[ ! -d $BIN_DIR2 ]] +then + print "Directory specified for executables does not exist " $BIN_DIR2 + exit -7 +fi + + + +# define the log file name + +LOG_NAME=`date -u +process_dpa_log_%m%d` +LOG_FILE=$LOG_DIR/$LOG_NAME + + +# Announce startup of process_dpafiles + +print ======================================================== >> $LOG_FILE +print Starting process_dpafiles at $(date -u) >> $LOG_FILE +print ======================================================== >> $LOG_FILE +print " " >> $LOG_FILE + + +# Remove stop flag file if it exists + +rm -f $DATA_DIR/stop_dpadecode + + +# Start script in background +# note that ihe script requires arguments + +$BIN_DIR1/process_dpafiles $DATA_DIR $LOG_DIR $ERR_DIR $BIN_DIR1 $BIN_DIR2 >> $LOG_FILE & diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_gage_pp b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_gage_pp new file mode 100755 index 0000000000..fe4246706c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_gage_pp @@ -0,0 +1,110 @@ +#!/bin/ksh +# ============================================================ +# stop_gage_pp - script to stop the gage_pp process +# +# This script will return one of the following completion codes +# to the operating system indicating success or failure of its +# attempt to stop the Gage Precip Processor. +# +# 0 The attempt to stop the Gage Precip Processor was successful. +# 1 An invalid command line argument has been passed into this script. +# 2 The gage_pp_userid token is not defined. +# 3 The user is not allowed to stop the Gage Precip Processor. +# 4 The directory specified for the data files does not exist. +# 5 The Gage Precip Process is not running. There is no process to stop. +# 6 The Gage Precip Processor log directory has not been defined. +# 7 The Gage Precip Processor cannot be stopped from this system. +# Check the gage_pp_host token for the valid system name. +# +# Revision History +# Moria Shebsovich July 7, 2004 Created. +# ============================================================ +# +# This allows you to call this script from outside of ./bin +HOSTNAME=`hostname` +RUN_FROM_DIR=`dirname $0` + +# +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export GAGE_PP_USERID=$(get_apps_defaults gage_pp_userid) +export GAGE_PP_HOST=$(get_apps_defaults gage_pp_host) +export GAGE_PP_DATA=$(get_apps_defaults gage_pp_data) +export GAGE_PP_LOG=$(get_apps_defaults gage_pp_log) + +GAGE_PP_LOG_DIR=$GAGE_PP_LOG +if [[ ! -d $GAGE_PP_LOG_DIR ]] +then + print "Directory specified for log files does not exist " $GAGE_PP_LOG_DIR + exit 6 +fi + +# +# define the Gage Precip Processor daily log file name +LOGFILE=`date +gage_pp_log_%m%d` +GAGE_PP_LOG_FILE=$GAGE_PP_LOG_DIR/$LOGFILE + +# Check to see which system the Gage Precip Processor is allowed +# to be stopped from. +# This is specified by the gage_pp_host token which is represented +# by the GAGE_PP_HOST variable set in set_hydro_env. +# If this script is not being run on that system, then log an error message. + +COMPARISON_STRING=`echo $HOSTNAME $GAGE_PP_HOST | awk -F' ' 'match ($1, $2)'` +if test -z "$COMPARISON_STRING" +then + + print "Gage Precip Processor cannot be stopped from '$HOSTNAME'" \ + "It can only be stopped from '$GAGE_PP_HOST'." >> $GAGE_PP_LOG_FILE + exit 7 + +fi + +# +# Check to see if the user trying to stop process is the one +# allowed to do it + +if [[ $GAGE_PP_USERID = "" ]] + then + print stop_gage_pp: User allowed to stop gage_pp has not \ + been assigned. >> $GAGE_PP_LOG_FILE + print " "Please assign a user id to the \ + 'gage_pp_userid' >> $GAGE_PP_LOG_FILE + print " "token for the get_apps_defaults process. + >> $GAGE_PP_LOG_FILE + exit 2 +fi + +if [ $LOGNAME != $GAGE_PP_USERID ] + then + print stop_gage_pp: User $LOGNAME is not allowed to stop \ + Gage Precip Processor. >> $GAGE_PP_LOG_FILE + print " "Only user $GAGE_PP_USERID can stop \ + Gage Precip Processor! >> $GAGE_PP_LOG_FILE + exit 3 +fi + +# Check to determine if the Gage Precip Processor is running before +# an attempt is made to stop it. + +export PIDFILE=$GAGE_PP_DATA/gage_pp_pid.dat +export FILEPID=`cat $PIDFILE` + +if [[ $FILEPID != "" ]] +then + ps -p $FILEPID | grep gage_pp > /dev/null 2>&1 + if [ $? -eq 1 ] + then + print "stop_gage_pp: GagePP is not running." >> $GAGE_PP_LOG_FILE + exit 5 + fi + +fi + +# +# touch the stop file, which the gage_pp program checks for +# and if it exists, then it initiates an orderly abort of the system + +touch $GAGE_PP_DATA/stop_gage_pp + + diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_hpe b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_hpe new file mode 100755 index 0000000000..8df1138614 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_hpe @@ -0,0 +1,77 @@ +#!/bin/ksh + +# +# script for stopping the HPE processes +# +# This introduces a delayed stop of 20 min to the hpe processes +# However, note that the DHRgather script executed via cron should +# be stopped first. Otherwise, at the next precipitation report +# The HPE processes will be started again. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + + + +# this script uses the following set_hydro_env variables: +# HPE_LOG_DIR +# + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# setup log files +# + +if [[ ! -d $HPE_LOG_DIR ]] +then + print "Directory specified for placing stop file does not exist " $HPE_LOG_DIR + exit -1 +fi + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp + + +# +# save latest entries in log file +# + + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +echo "Attempting to stop start_hpe... " >> $hpefnm + +phpe=`ps -ef|grep start_hpe|grep -v grep|awk '{print $2}'` + + + +if [[ -z "$phpe" ]] +then + echo "start_hpe not running, stop not required " >> $hpefnm +else + if [[ ! -r $HPE_LOG_DIR/stop_hpe_process ]] + then + touch $HPE_LOG_DIR/stop_hpe_process + echo "stop_hpe_process file has been created." >> $hpefnm + echo "HPE process will stop after 20 min unless new precip is detected. " >> $hpefnm + echo "Use kill -9 (pid of start_hpe) if immediate shutdown is needed. " >> $hpefnm + else + echo "stop_hpe_process file exists already. " >> $hpefnm + echo "HPE processes will end in less than 20 min unless new precip is detected. " >> $hpefnm + echo "Use kill -9 (pid of start_hpe) if immediate shutdown is needed. " >> $hpefnm + fi +fi + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_hpe_crons b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_hpe_crons new file mode 100755 index 0000000000..32bb65242f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_hpe_crons @@ -0,0 +1,74 @@ +#!/bin/ksh + +# +# script for bypassing the HPE radar gather crons +# +# HPE crons to gather radar information run every minute +# This script just creates a file the crons are looking for +# and if found, it will exit the gather script before beginning. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + + + +# this script uses the following set_hydro_env variables: +# HPE_LOG_DIR +# + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# setup log files +# + +if [[ ! -d $HPE_LOG_DIR ]] +then + print "Directory specified for placing stop_hpe_crons file does not exist " $HPE_LOG_DIR + exit -1 +fi + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp + + +# +# save latest entries in log file +# + + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +echo "Attempting to create stop_hpe_crons file... " >> $hpefnm + +if [[ ! -r $HPE_LOG_DIR/stop_hpe_crons ]] +then + touch $HPE_LOG_DIR/stop_hpe_crons + echo "stop_hpe_crons file has been created." >> $hpefnm + echo "HPE radar data processes will not be executed via cron until this file " >> $hpefnm + echo "removed by the start_hpe_crons script. " >> $hpefnm + +# so user sees it on the screen as well since this is a manual process + + echo "stop_hpe_crons file has been created." + echo "HPE radar data processes will not be executed via cron until this file " + echo "removed by the start_hpe_crons script. " + +else + echo "stop_hpe_crons file exists already. " >> $hpefnm + echo "stop_hpe_crons file exists already. " + +fi + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_process_dpafiles b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_process_dpafiles new file mode 100755 index 0000000000..25dea36fda --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/stop_process_dpafiles @@ -0,0 +1,44 @@ +#!/bin/ksh +# ==================================================================== +# stop_process_dpafiles - script to stop the process_dpafiles process +# ==================================================================== + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export DPA_PROD_DIR=$(get_apps_defaults dpa_prod_dir) +export SHEFDECODE_USERID=$(get_apps_defaults shefdecode_userid) + +# First check to see if the user trying to stop process is the one +# allowed to do it. note that it uses the same token as shefdecode +# Error if user id is not the one to do it or no allowed id has been +# assigned + +if [[ $SHEFDECODE_USERID = "" ]] +then + print The user allowed to stop the decoders has not been assigned. + print " "Please assign a user id to the 'shefdecode_userid' + print " "token for the get_apps_defaults process. + exit -1 +fi + +if [ $LOGNAME != $SHEFDECODE_USERID ] +then + print User $LOGNAME is not allowed to stop process_dpafiles. + print " "Only user $SHEFDECODE_USERID can issue this command. + exit -2 +fi + + +# touch the stop file, which the process script checks for +# and if it exists, then it initiates an orderly abort of the process. + +if [[ ! -d $DPA_PROD_DIR ]] +then + print "Directory specified for placing stop file does not exist " $DPA_PROD_DIR + exit -3 +fi + +touch $DPA_PROD_DIR/stop_dpadecode diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/temperature_station_gen.sql b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/temperature_station_gen.sql new file mode 100755 index 0000000000..f8c0e47388 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/temperature_station_gen.sql @@ -0,0 +1,29 @@ +-- gather distinct lid,ts combinations from temperature table where extremum='X' + +select lid, ts +into temp temptable +from temperature +where extremum='X' +group by 1,2 +order by lid +; + +-- add info from location table for the lid + +select + l.lid, + ' TAI'||t.ts||'XZ', + to_char(l.lat,'99.99'), + to_char(l.lon,'999.99'), + case + when l.elev >= 0 then to_char(l.elev,'99999') + else ' -999' + end, + '9', + case + when l.name ISNULL then 'XXXXXXXXXX' + else l.name + end +from temptable t, location l +where t.lid=l.lid +order by l.lid asc; diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/transmit_rfc_bias b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/transmit_rfc_bias new file mode 100755 index 0000000000..17f2448b5a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/transmit_rfc_bias @@ -0,0 +1,133 @@ +#!/bin/ksh + +############################################################################### +# transmit_rfc_bias +# +# This script creates a rfc bias message and transmits it across the WAN. +# +# The office must set the PRODUCT_ID and RECIPIENTS variables at the +# beginning of this script. The PRODUCT_ID is the 10 character WMO id - +# CCCCNNNXXX. The product category (NNN) should be left as "RRM" indicating +# miscellaneous hydrologic data. For example for MARFC, the WMO id could +# be set as "KRHARRMRHA". +# +# The RECIPIENTS variable contains a comma-separated list of offices the +# RFC would like to send the bias message to. For example for MARFC, +# this list could be defined as: +# RECIPIENTS="LWX,CTP,PHI,PBZ,BGM,BUF,OKX" +# +# Usage: +# +# transmit_rfc_bias +# YYYY is the year +# MM is the month +# DD is the day +# HH is the hour +# +# Logs for this script are written to: +# /awips/hydroapps/precip_proc/local/data/log/process_bias_message +# +# Modification History +# March 26, 2007 Bryon Lawrence Script Written +# September 21, 2007 Bryon Lawrence Added -e option to distributeProduct call. +# +############################################################################### +export PRODUCT_ID="CCCCRRMXXX" +export RECIPIENTS="" + +# +# Export WHFS environmental variables. +# +RUN_FROM_DIR=`dirname $0` + +# These lines are commented out because this script will be run +# from mpe_editor using mpe_editor's environment. If this script +# is run stand alone, these lines must be uncommented. +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh +. $RUN_FROM_DIR/../../set_hydro_env +export RFC_BIAS_OUTPUT_DIR=$(get_apps_defaults rfc_bias_output_dir) +export PROCESS_BIAS_LOG_DIR=$(get_apps_defaults process_bias_log_dir) +export MPE_TRANSMIT_BIAS=$(get_apps_defaults mpe_transmit_bias) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$PPROC_BIN/bias_trans.jar + +# +# Open the log file to track the status of the transmission of the RFC Bias +# Message. +# +transmit_log=`date +$PROCESS_BIAS_LOG_DIR/transmit_rfc_bias_%m%d` + +echo "------------------------------------------------" >> $transmit_log + +Dte=`date -u` +echo "Starting transmit_rfc_bias at $Dte" >> $transmit_log + +# +# Check the mpe_transmit_bias token to make sure it is on. +# +if [[ $MPE_TRANSMIT_BIAS = "OFF" || $MPE_TRANSMIT_BIAS = "off" ]] +then + echo "Token mpe_transmit_bias is off. RFC Bias Message not generated." + exit 1 +fi + +if [[ -z "$RECIPIENTS" ]] +then + echo "No recipients specified in transmit_rfc_bias script." >> $transmit_log + exit 1 +fi + +# +# Create the RFC Bias message. +# +echo "Calling the bias message creating program" >> $transmit_log +echo "${SYS_JAVA_DIR}/bin/java/ ohd.hseb.bias_trans/BiasMessageCreator $JDBCURL $1" >> $transmit_log +${SYS_JAVA_DIR}/bin/java ohd.hseb.bias_trans/BiasMessageCreator $JDBCURL $1 \ + >> $transmit_log 2>&1 + +# +# Call distribute product and send the RFC Bias Message across the WAN. +# +FILENAME=${FXA_LOCAL_SITE}${1}z +FILEPATH=$RFC_BIAS_OUTPUT_DIR/$FILENAME + +# +# Check to make sure this file exists. +if [[ ! -a $FILEPATH ]] +then + echo "$FILEPATH does not exist." + exit 1 +fi + +SUBJECT="$FILENAME $PRODUCT_ID RADAR_PRECIP_BIAS" + +# +# Call distributeProduct for the recipients. +echo "Sending file:$FILENAME product_ID:$PRODUCT_ID to '$RECIPIENTS' via "\ + "distributeProduct" >> $transmit_log +echo "distributeProduct -c RADAR_PRECIP_BIAS -s\"$SUBJECT\" "\ + "-a\"$RECIPIENTS\" -e $FILEPATH $PRODUCT_ID dummy" >> $transmit_log +/awips/fxa/bin/distributeProduct -c RADAR_PRECIP_BIAS -s "$SUBJECT" -a \ + "$RECIPIENTS" -e $FILEPATH $PRODUCT_ID \ + dummy >> $transmit_log 2>&1 + +# +# Test the exit status of distributeProduct. +# +if [[ $? -ne 0 ]] +then + echo "The call to distributeProduct failed." >> $transmit_log + exit 1 +else + echo "The call to distributeProduct was successful." >> $transmit_log +fi + +# +# Remove the RFC bias message +rm -f $FILEPATH >> $transmit_log 2>&1 + +# End of script. +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/transmit_rfc_qpe b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/transmit_rfc_qpe new file mode 100755 index 0000000000..70d65e4a47 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/bin/transmit_rfc_qpe @@ -0,0 +1,186 @@ +#!/bin/ksh +############################################################################### +# transmit_rfc_qpe +# +# This script transmits the 1 hour MPE generated Best Estimate QPE mosaics +# over the SBN. Normally, these QPE products will be created at an RFC +# and sent over the SBN for WFOs to use in their daily operations. These +# products are displayable through MPE Editor and Hydroview, and they +# can be used perationally in applications like the Site Specific Head Water +# Model. +# +# This script is called by MPE Fieldgen when run from the cron and +# MPE Editor from the Transmit Best Estimate QPE option on the MPE Control +# menu. +# +# The mpe_send_qpe_to_sbn token must be set to "ON" and the mpe_save_grib token +# must be set to "save" for this script to function. Also, the section +# of this script which calls distributeProduct must be uncommented. +# +# Example of PRODUCT ID: KALRQPEBIN +# Where NNN should be QPE +# Where XXX should be BIN +# Where CCCC should be: +# +# PACR : APRFC +# KALR : SERFC +# KTAR : NERFC +# KTIR : OHRFC +# KFWR : WGRFC +# KKRF : MBRFC +# KMSR : NCRFC +# KORN : LMRFC +# KTUA : ABRFC +# KPTR : NWRFC +# KRHA : MARFC +# KRSA : CNRFC +# KSTR : CBRFC +# +# Modification History +# June 1, 2006 Bryon Lawrence Original Coding +# November 8, 2006 Bryon Lawrence Updated to read GRIB +# files from qpe_grib_sbn +# directory. Removed +# logic using touch file. +############################################################################### + +# +# The product id must be locally defined for the office. +# +export PRODUCT_ID=CCCCQPEBIN + +export FXA_HOME=/awips/fxa + +# +# Set up the D2D environment... +. $FXA_HOME/readenv.sh + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export MPE_SEND_QPE_TO_SBN=$(get_apps_defaults mpe_send_qpe_to_sbn) +export MPE_SAVE_GRIB=$(get_apps_defaults mpe_save_grib) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) + +# +# Open the transmit_rfc_qpe log file. +# +transmit_qpe_log=`date +$GAQ_LOG_DIR/transmit_rfc_qpe_%m%d` + +# +# Save only the latest information in the log file. +echo "-------------------------------------------" >> $transmit_qpe_log + +Dte=`date -u` +echo "Starting transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +# Check to make sure that the mpe_save_grib token is set to 'save' +# +if [[ $MPE_SAVE_GRIB != "save" && $MPE_SAVE_GRIB != "SAVE" ]] +then + echo "The mpe_save_grib token is not set to save." >> transmit_qpe_log + echo "No QPE files transmitted." >> transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check the mpe_send_qpe_to_sbn token to make sure that the office +# wants to send the 1 HR QPE over the SBN. +# +if [[ $MPE_SEND_QPE_TO_SBN != "ON" && $MPE_SEND_QPE_TO_SBN != "on" ]] +then + echo "The mpe_send_qpe_to_sbn token is not set to 'ON'." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Determine the list of QPE grib files to transmit over the SBN +# Any files in the qpe_grib_sbn directory need to be sent over the SBN. +# Files are removed from this directory after each successful call to +# distributeProduct. +# +echo "Searching directory $MPE_QPE_GRIB_SBN_DIR for grib " >> $transmit_qpe_log +echo "files to transmit." >> $transmit_qpe_log + +grib_file_list=`ls $MPE_QPE_GRIB_SBN_DIR/*.grib` >> $transmit_qpe_log 2>&1 + +if [[ $? -ne 0 ]] +then + echo "An error was encountered while searching for grib files in" >> \ + $transmit_qpe_log + echo "the $MPE_QPE_GRIB_SBN_DIR directory." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check if there are any files to process. +# +if [[ -z "$grib_file_list" ]] +then + echo "No grib files found to process." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 0 +fi + +# +# Loop over the grib files +# +for i in $grib_file_list +do + echo "Processing grib file $i." >> $transmit_qpe_log + +# +# The GRIB files normally created by the process_grib_files +# script have a subcenter code of 0. GRIB files with a subcenter +# code representing the tranmitting RFC need to be created. +# + +# +# Send product using distributeProduct +# The GRIB file is sent to the DEFAULTNCF. Upon arrival at the NCF +# the GRIB file is placed on the SBN uplink. The GRIB file is sent +# as an attachment to the call to distributeProduct. The dummy file +# does not exist. It is just a dummy argument. +# + echo "Sending file: $i product ID $PRODUCT_ID to distributeProduct" >> \ + $transmit_qpe_log + echo "/awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy" >> \ + $transmit_qpe_log + /awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy >> \ + $transmit_qpe_log 2>&1 + + if [[ $? -eq 0 ]] + then + echo "The call to distributeProduct was successful." >> $transmit_qpe_log + echo "Removing grib file $i." >> $transmit_qpe_log + rm -f $i >> $transmit_qpe_log 2>&1 + else + echo "The call to distrbuteProduct failed with code $?." + echo "Grib file $i not removed." + fi + +# +done + +# +# This script can be locally configured here. + +# +# +Dte=`date -u` +echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/mpe_internal_script b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/mpe_internal_script new file mode 100755 index 0000000000..997162bbf9 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/mpe_internal_script @@ -0,0 +1,2 @@ +#!/bin/ksh +echo "Test of mpe_internal_script" >/tmp/internal_script_test diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/process_qpe_mosaic b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/process_qpe_mosaic new file mode 100755 index 0000000000..d29792467a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/process_qpe_mosaic @@ -0,0 +1,189 @@ +#!/bin/ksh +############################################################################### +# process_qpe_mosaic +# +# This script grib encodes the RFC QPE mosaics and sends them to awips for +# display in D2D. +# +# In order for the generate_areal_qpe (GAQ) program to run and produce a +# mosaicked RFC QPE product, the mpe_generate_areal_qpe token must be set +# to "ON". +# +# In order for the RFC QPE product to be sent to D2D, the mpe_d2d_display_grib +# token must be set to "ON". +# +# The RFC and DURATION list variables (below) must be locally defined at +# each office. +# +# Modification History +# June 6, 2006 Bryon Lawrence Script Written +# September 12, 2006 Bryon Lawrence Setup to source readenv.sh +# November 7, 2006 Bryon Lawrence Modified to set the +# grib_set_subcenter_0 token to 'on'. +# +############################################################################### + +# These must be defined for the office GAQ is running at. +# The RFC_LIST will contain all of the RFCs which cover all or part +# of the office's MPE forecast area. The DURATION_LIST will contain +# the durations to create RFC QPE products for. The acceptable durations +# are 1,6,24. +RFC_LIST=MARFC,OHRFC,LMRFC +DURATION_LIST=1,6,24 + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +. $FXA_HOME/readenv.sh + +# Allow this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export grib_bin_dir=$(get_apps_defaults pproc_bin) +export grib_out_dir=$(get_apps_defaults mpe_grib_dir) +export D2D_INPUT_DIR=$(get_apps_defaults d2d_input_dir) +export MPE_D2D_DISPLAY_GRIB=$(get_apps_defaults mpe_d2d_display_grib) +export MPE_GENERATE_AREAL_QPE=$(get_apps_defaults mpe_generate_areal_qpe) +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export GAQ_TEMP_XMRG_DIR=$(get_apps_defaults gaq_temp_xmrg_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# +# Open the process qpe mosaic log. +# +process_qpe_log=`date +$GAQ_LOG_DIR/process_qpe_mosaic_%m%d` + +# +# Save only the latest information in the log file. +echo "-----------------------------------------------" >> $process_qpe_log + +Dte=`date -u` +echo "Starting process_qpe_mosaic at $Dte" >> $process_qpe_log + +echo "Token mpe_generate_areal_qpe is defined as $MPE_GENERATE_AREAL_QPE" >> \ + $process_qpe_log +echo "Token mpe_d2d_display_grib is defined as $MPE_D2D_DISPLAY_GRIB" >> \ + $process_qpe_log + +# +# If the mpe_generate_areal_qpe token is not on, then do not generate +# QPE Mosaics. +# +if [[ $MPE_GENERATE_AREAL_QPE != "ON" && $MPE_GENERATE_AREAL_QPE != "on" ]] +then + echo "Token mpe_generate_areal_qpe must be set to 'ON'." >> $process_qpe_log + echo "RFC QPE mosaics not created." >> $process_qpe_log + exit 1 +fi + +# +# Call the StoreHydroGrids program to ungrib the QPE GRIB messages stored in +# the /data/fxa/Grid/SBN/HydroRaw directory and place the resulting netCDF +# files into the /data/fxa/GRID/SBN/netCDF/HRAP/QPE and +# /data/fxa/Grid/SBN/HydroBad directories. +# +echo "Invoking $FXA_BIN_DIR/StoreHydroGrids" >> $process_qpe_log +$FXA_BIN_DIR/StoreHydroGrids >> $process_qpe_log 2>&1 + +# +# Call the gen_areal_qpe program +# +$PPROC_BIN/gen_areal_qpe.LX -r$RFC_LIST -h$DURATION_LIST >> \ + $process_qpe_log 2>&1 + +# +# Retrieve a list of the files in the temporary QPE xmrg directory. +# +echo "Searching for QPE Mosaic files in $GAQ_TEMP_XMRG_DIR" >> \ + $process_qpe_log + +file_list=`ls $GAQ_TEMP_XMRG_DIR/RFC*` >> $process_qpe_log 2>&1 + +# +# Only send the RFC QPE mosaics to D2D if the mpe_d2d_displag_grib +# token is set to 'on'. +# +if [[ $MPE_D2D_DISPLAY_GRIB = "ON" || $MPE_D2D_DISPLAY_GRIB = "on" ]] +then + + if [[ -z "$file_list" ]] + then + echo "No QPE mosaic files found in $GAQ_TEMP_XMRG_DIR" >> \ + $process_qpe_log + Dte=`date -u` + echo "Finished process_qpe_mosaic at $Dte" >> $process_qpe_log + exit 1; + fi + +# +# Set the directory to read the GRIB files from. +# Also set the directory to write the QPE files to. +# + + export grib_in_dir=$GAQ_TEMP_XMRG_DIR + export grib_out_dir=$GAQ_TEMP_XMRG_DIR +# +# Force the subcenter code in the GRIB message to be 0. +# This will allow the QPE products contained within the GRIB +# messages to be displayed in the local D2D. +# + export grib_set_subcenter_0=on + + for i in $file_list + do +# +# Build the input and output paths for GRIBIT. +# + export grib_in_file=`basename $i` + export grib_out_file=$grib_in_file.grib + + echo "Grib in file: $grib_in_file" >> $process_qpe_log + echo "Grib out file: $grib_out_file" >> $process_qpe_log + + Dte=`date -u` + echo "Invoking $grib_bin_dir/gribit.LX at $Dte" >> $process_qpe_log + $grib_bin_dir/gribit.LX >> $process_qpe_log 2>&1 +# +# Move the grib file to the SBN/Raw directory +# + new_string=`date -u +%d%H%M%S` + new_file_name=${grib_out_file%.*}_$new_string.grib + + echo "Move and rename grib file $grib_out_dir/$grib_out_file" >> \ + $process_qpe_log + echo "to $D2D_INPUT_DIR/$new_file_name" >> $process_qpe_log + mv $grib_out_dir/$grib_out_file $D2D_INPUT_DIR/$new_file_name >> \ + $process_qpe_log 2>&1 + + if [[ $? -ne 0 ]] + then + # The move failed. Remove the grib file. + rm -f $grib_out_dir/$grib_out_file >> $process_qpe_log 2>&1 + fi + +# +# Notify D2D about the grib file. +# + echo "Invoking $FXA_BIN_DIR/notif_mpe.csh" >> $process_qpe_log + $FXA_BIN_DIR/notif_mpe.csh >> $process_qpe_log 2>&1 + + done + +fi + +# +# Remove the files from the GAQ output XMRG directory. +# +rm -f $file_list >> $process_qpe_log 2>&1 + +Dte=`date -u` +echo "Finished process_qpe_mosaic at $Dte" >> $process_qpe_log + +exit 0 + +# +# End of process_qpe_mosaic script +# diff --git a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/local/bin/run_build_hourly b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/run_build_hourly similarity index 97% rename from nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/local/bin/run_build_hourly rename to nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/run_build_hourly index 4da54dea9c..ef955800c1 100755 --- a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/local/bin/run_build_hourly +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/run_build_hourly @@ -67,9 +67,9 @@ integer CNTR=1 while [[ 1 -eq 1 ]] do NUM_OF_FILES=`ls -1 $GAGE_PP_DATA | grep BUILD | wc -l` - if [[ ($NUM_OF_FILES -ne 0) && ($CNTR -lt 15) ]] + if [[ ($NUM_OF_FILES -ne 0) && ($CNTR -lt 2) ]] then - sleep 2 + sleep 1 CNTR=CNTR+1 else break diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/transmit_rfc_qpe b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/transmit_rfc_qpe new file mode 100755 index 0000000000..70d65e4a47 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/bin/transmit_rfc_qpe @@ -0,0 +1,186 @@ +#!/bin/ksh +############################################################################### +# transmit_rfc_qpe +# +# This script transmits the 1 hour MPE generated Best Estimate QPE mosaics +# over the SBN. Normally, these QPE products will be created at an RFC +# and sent over the SBN for WFOs to use in their daily operations. These +# products are displayable through MPE Editor and Hydroview, and they +# can be used perationally in applications like the Site Specific Head Water +# Model. +# +# This script is called by MPE Fieldgen when run from the cron and +# MPE Editor from the Transmit Best Estimate QPE option on the MPE Control +# menu. +# +# The mpe_send_qpe_to_sbn token must be set to "ON" and the mpe_save_grib token +# must be set to "save" for this script to function. Also, the section +# of this script which calls distributeProduct must be uncommented. +# +# Example of PRODUCT ID: KALRQPEBIN +# Where NNN should be QPE +# Where XXX should be BIN +# Where CCCC should be: +# +# PACR : APRFC +# KALR : SERFC +# KTAR : NERFC +# KTIR : OHRFC +# KFWR : WGRFC +# KKRF : MBRFC +# KMSR : NCRFC +# KORN : LMRFC +# KTUA : ABRFC +# KPTR : NWRFC +# KRHA : MARFC +# KRSA : CNRFC +# KSTR : CBRFC +# +# Modification History +# June 1, 2006 Bryon Lawrence Original Coding +# November 8, 2006 Bryon Lawrence Updated to read GRIB +# files from qpe_grib_sbn +# directory. Removed +# logic using touch file. +############################################################################### + +# +# The product id must be locally defined for the office. +# +export PRODUCT_ID=CCCCQPEBIN + +export FXA_HOME=/awips/fxa + +# +# Set up the D2D environment... +. $FXA_HOME/readenv.sh + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export MPE_SEND_QPE_TO_SBN=$(get_apps_defaults mpe_send_qpe_to_sbn) +export MPE_SAVE_GRIB=$(get_apps_defaults mpe_save_grib) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) + +# +# Open the transmit_rfc_qpe log file. +# +transmit_qpe_log=`date +$GAQ_LOG_DIR/transmit_rfc_qpe_%m%d` + +# +# Save only the latest information in the log file. +echo "-------------------------------------------" >> $transmit_qpe_log + +Dte=`date -u` +echo "Starting transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +# Check to make sure that the mpe_save_grib token is set to 'save' +# +if [[ $MPE_SAVE_GRIB != "save" && $MPE_SAVE_GRIB != "SAVE" ]] +then + echo "The mpe_save_grib token is not set to save." >> transmit_qpe_log + echo "No QPE files transmitted." >> transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check the mpe_send_qpe_to_sbn token to make sure that the office +# wants to send the 1 HR QPE over the SBN. +# +if [[ $MPE_SEND_QPE_TO_SBN != "ON" && $MPE_SEND_QPE_TO_SBN != "on" ]] +then + echo "The mpe_send_qpe_to_sbn token is not set to 'ON'." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Determine the list of QPE grib files to transmit over the SBN +# Any files in the qpe_grib_sbn directory need to be sent over the SBN. +# Files are removed from this directory after each successful call to +# distributeProduct. +# +echo "Searching directory $MPE_QPE_GRIB_SBN_DIR for grib " >> $transmit_qpe_log +echo "files to transmit." >> $transmit_qpe_log + +grib_file_list=`ls $MPE_QPE_GRIB_SBN_DIR/*.grib` >> $transmit_qpe_log 2>&1 + +if [[ $? -ne 0 ]] +then + echo "An error was encountered while searching for grib files in" >> \ + $transmit_qpe_log + echo "the $MPE_QPE_GRIB_SBN_DIR directory." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check if there are any files to process. +# +if [[ -z "$grib_file_list" ]] +then + echo "No grib files found to process." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 0 +fi + +# +# Loop over the grib files +# +for i in $grib_file_list +do + echo "Processing grib file $i." >> $transmit_qpe_log + +# +# The GRIB files normally created by the process_grib_files +# script have a subcenter code of 0. GRIB files with a subcenter +# code representing the tranmitting RFC need to be created. +# + +# +# Send product using distributeProduct +# The GRIB file is sent to the DEFAULTNCF. Upon arrival at the NCF +# the GRIB file is placed on the SBN uplink. The GRIB file is sent +# as an attachment to the call to distributeProduct. The dummy file +# does not exist. It is just a dummy argument. +# + echo "Sending file: $i product ID $PRODUCT_ID to distributeProduct" >> \ + $transmit_qpe_log + echo "/awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy" >> \ + $transmit_qpe_log + /awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy >> \ + $transmit_qpe_log 2>&1 + + if [[ $? -eq 0 ]] + then + echo "The call to distributeProduct was successful." >> $transmit_qpe_log + echo "Removing grib file $i." >> $transmit_qpe_log + rm -f $i >> $transmit_qpe_log 2>&1 + else + echo "The call to distrbuteProduct failed with code $?." + echo "Grib file $i not removed." + fi + +# +done + +# +# This script can be locally configured here. + +# +# +Dte=`date -u` +echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/gen_areal_qpe/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/gen_areal_qpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/hpe/projection.con b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/hpe/projection.con new file mode 100644 index 0000000000..4af4ff3294 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/hpe/projection.con @@ -0,0 +1,14 @@ +1.00 F4.2 RESET TIME (HRS) +1.00 F4.2 PROJECTION INTERVAL (HRS) +4.00 F5.2 nominal grid size (km) +1.00 F4.2 ERROR PROPORTION FACTOR +0.2500 F6.4 NOMINAL SCAN INTERVAL (HRS) +0.10 F4.2 MINIMUM THRESHOLD PRECIP RATE (MM) +0 I2 MINIMUM NUMBER OF SAMPLES +1.0000 F6.4 Max. allowable missing period of radar data (hr) for reset +200.0 f6.1 PDF min. area threshold (km^2) +0.6 f6.1 PDF min. rainrate threshold (dBR)(modified to rainrate) +n logical Account for growth/decay? +1 I1 Storm motion vectors used (1=local, 2=uniform hrly-avg) +0.8 f6.1 lamda (for rate smooth) +1.3 f6.1 kappa (for rate smooth) diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/beam_height/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/beam_height/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/climo/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/climo/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/gage_locations/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/gage_locations/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/grid_masks/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/grid_masks/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/help/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/help/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/misbin/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/misbin/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib/gfe2grib.txt b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib/gfe2grib.txt new file mode 100644 index 0000000000..f230ddde41 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib/gfe2grib.txt @@ -0,0 +1,8 @@ +QPF QPF_SFC 180 61 3 4 1 +QTF Tavg6_SFC 30 11 2 3 1 +QTE Tavg6_SFC 30 11 2 0 1 +PETF PotET_SFC 30 57 3 0 2 +PETE PotET_SFC 30 57 3 0 2 +QPE qpe_grid 172 61 3 4 1 +QTE qte_grid 172 11 2 3 1 +QZE qze_grid 172 7 2 0 1 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann new file mode 100644 index 0000000000..e74d17c6f3 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr new file mode 100644 index 0000000000..610b64379b Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug new file mode 100644 index 0000000000..ddf4d87e08 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec new file mode 100644 index 0000000000..fae866c52d Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb new file mode 100644 index 0000000000..e73dee7e18 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan new file mode 100644 index 0000000000..684645c6bf Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul new file mode 100644 index 0000000000..680d186ac9 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun new file mode 100644 index 0000000000..a97571b750 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar new file mode 100644 index 0000000000..11368e0bf4 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may new file mode 100644 index 0000000000..d2c0674459 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov new file mode 100644 index 0000000000..cd16bf8988 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct new file mode 100644 index 0000000000..a5403a2359 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep new file mode 100644 index 0000000000..4be38e0519 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann new file mode 100644 index 0000000000..1a148aa6b3 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr new file mode 100644 index 0000000000..1a3e1db805 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug new file mode 100644 index 0000000000..bfbe2b1fda Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec new file mode 100644 index 0000000000..4b3ce84ddf Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb new file mode 100644 index 0000000000..13c4821f3d Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan new file mode 100644 index 0000000000..3ca6fcf53f Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul new file mode 100644 index 0000000000..9c21a42d2b Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun new file mode 100644 index 0000000000..a3f927637b Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar new file mode 100644 index 0000000000..bda3ae31eb Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may new file mode 100644 index 0000000000..880b6e4974 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov new file mode 100644 index 0000000000..16110e70a4 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct new file mode 100644 index 0000000000..819b88272f Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep new file mode 100644 index 0000000000..c07bfb85fe Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann new file mode 100644 index 0000000000..04a3f23564 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr new file mode 100644 index 0000000000..1dd46ef024 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug new file mode 100644 index 0000000000..fdc7759c36 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec new file mode 100644 index 0000000000..c23fc80d44 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb new file mode 100644 index 0000000000..843a924c20 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan new file mode 100644 index 0000000000..9861ca01ff Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul new file mode 100644 index 0000000000..5fa21e4176 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun new file mode 100644 index 0000000000..e36cd07167 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar new file mode 100644 index 0000000000..c48200a6ed Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may new file mode 100644 index 0000000000..849e132b86 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov new file mode 100644 index 0000000000..9dfd90a339 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct new file mode 100644 index 0000000000..3eaaefa206 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep new file mode 100644 index 0000000000..c4da1b76f6 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/station_lists/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/station_lists/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/utiltriangles/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/mpe/utiltriangles/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/nc2grib/gfe2grib.txt b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/nc2grib/gfe2grib.txt new file mode 100644 index 0000000000..636a45eb33 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/nc2grib/gfe2grib.txt @@ -0,0 +1,5 @@ +QPF QPF_SFC 180 61 3 4 1 +QTF Tavg6_SFC 30 11 2 3 1 +QTE Tavg6_SFC 30 11 2 0 1 +PETF PotET_SFC 30 57 3 0 2 +PETE PotET_SFC 30 57 3 0 2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/radclim/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/radclim/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/stage3/help/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/app/stage3/help/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_archive/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_archive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_decoded/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_decoded/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_error/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_error/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_gather/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dhr_gather/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_archive/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_archive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_decoded/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_decoded/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_error/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_error/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_gather/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/dsp_gather/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/gpp_input/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/gpp_input/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/avgrmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/avgrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/gif/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/height/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/height/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_gif/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_jpeg/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_jpeg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_netcdf/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_xmrg/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_xmrg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/index/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/index/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/lsatpre/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/lsatpre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/maxrmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/maxrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/nowcast/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/hpe/nowcast/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/decodedhr/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/decodedhr/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/decodedpa/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/decodedpa/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/decodedsp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/decodedsp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/disagg/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/disagg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/gage_pp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/gage_pp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/gen_areal_qpe/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/gen_areal_qpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/hpe/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/hpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/lightning_proc/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/lightning_proc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/misc/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/mpe_editor/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/mpe_editor/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/mpe_fieldgen/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/mpe_fieldgen/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/process_bias_message/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/process_bias_message/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/siipp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/log/siipp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/avgrmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/avgrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bad_gages/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bad_gages/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_input/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_input/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_output/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/bmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/d2d_files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/d2d_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/fewsgrib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/fewsgrib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/netcdf_files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/netcdf_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/draw_precip/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/draw_precip/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/edit_polygon/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/edit_polygon/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/gageonly/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/gageonly/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/gagetriangles/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/gagetriangles/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/height/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/height/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/index/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/index/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/lmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/lmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/localfield1/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/localfield1/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/localfield2/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/localfield2/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/localfield3/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/localfield3/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/locbias/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/locbias/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/locspan/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/locspan/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/lqmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/lqmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/lsatpre/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/lsatpre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/maxrmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/maxrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mlmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mlmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mlqmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mlqmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mrmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/mrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/p3lmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/p3lmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_gif/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_jpeg/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_jpeg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_netcdf/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_sbn/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_sbn/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcbmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcbmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcmmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcmmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe01/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe01/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe06/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe06/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe24/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe24/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/rmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/sat_state_var/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/sat_state_var/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/satpre/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/satpre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/sgmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/sgmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/srgmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/srgmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/srmosaic/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/srmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/state_var/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/mpe/state_var/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage1_archive/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage1_archive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage1_decoded/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage1_decoded/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage1_error/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage1_error/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage3/post_analysis/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/precip_proc/local/data/stage3/post_analysis/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/public/bin/amirunning b/nativeLib/files.native/awipsShare/hydroapps/public/bin/amirunning new file mode 100644 index 0000000000..444ac03524 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/public/bin/amirunning @@ -0,0 +1,39 @@ +# ============================================================================ +# pgm: amirunning .. insert script to check if same named program is running +# +# use: . amirunning +# +# in: (env-var) ... (optional) global variable "AMIRUNNING_DIR" defines the +# in: directory to place a temproary file; if not defined use +# in: directory "/tmp" +# out: AmIRunning .. variable set to "yes" if running, else set to "no" +# oth: (file) ...... a temporary file "temp_ps.$$" is made in the directory +# oth: defined by global variable "AmIRunning" or in "/tmp" +# +# rqd: env vars - AMIRUNNING_DIR +# +# cmt: MUST BE RUN WITH THE DOT COMMAND. +# cmt: SCRIPT NAME MUST BE UNIQUE TO 14 PLACES. +# cmt: (ps -e only gets 14 char names) +# cmt: THE CALLING SCRIPT MUST HAVE "#!/bin/ksh" AS THE TOP LINE +# +# cmt: Add blank in front of lines comming from "ps -e". +# +# ver: 20031006 +# ============================================================================ + type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null + +Fil=${AMIRUNNING_DIR:-/tmp}/temp_ps.$$ +touch "$Fil" || exit + + ## Limit the caller name to 15 chars since "ps -e" only outputs 15 + +Nam=${0##*/}; [ "${#Nam}" -gt 14 ] && Nam=$(expr $Nam : '\(..............\)') +ps -e | sed 's/^/ /' | awk '/ '$$' /{next};/ '$Nam'/{print $1}' > $Fil +ps -e | sed 's/^/ /' | awk '/ '$$' /{next};/ '$Nam'/{print $1}' >> $Fil + +Lin=$(cat $Fil | sort | uniq -d); rm -f $Fil +[[ -n "$Lin" ]] && AmIRunning="yes" || AmIRunning="no" + +unset Fil Nam Lin + diff --git a/nativeLib/files.native/awipsShare/hydroapps/public/bin/dd_help b/nativeLib/files.native/awipsShare/hydroapps/public/bin/dd_help new file mode 100644 index 0000000000..e45873628f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/public/bin/dd_help @@ -0,0 +1,88 @@ +# ============================================================================ +# pgm: dd_help .. dot cmd - list header or run gvn cmds on current script text +# +# use: type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null +# +# in: -hh ........ (optional) list current script header and quit +# in: -hhver ..... (optional) output the version number ("# ver:" line) +# in: -hhuse ..... (optional) output the "# use:" statement only +# in: -hhargs .... (optional) output the "# use:" and i/o stmts only +# in: -hhpgm ..... (optional) output the "# pgm:" statement only +# in: -hhcat ..... (optional) cat the current script and quit +# in: -hhex ...... (optional) run ex session on current script +# in: -hhvi ...... (optional) echo the vi command on current script +# in: -hhwc ...... (optional) run wc on current script +# in: -hhls ...... (optional) run ls -l on current script +# in: -hhgrep . (optional) run grep -ni for string on current script +# in: (env var) .. DS_HH - if exists turn shell debug on using the value +# in: of DS_HH (minus sign optional, ex. set -$DS_HH +# in: (currently commented out) +# i/o: (env var) .. DS_BUG - if set and not null, then turn off debug tracing +# i/o: (env var) .. dd_help - skip rtn if "on", else run and set "on" +# out: (stdout) ... outputs the current script's header from "# ===" to +# out: the first line not starting with # +# out: (file) ..... (optional) log info in $HOME/hhlog if it exists +# +# ver: 20051115 +# ============================================================================ + +set +u + +# type dd_help_sup1 1>/dev/null 2>&1 && . dd_help_sup1 2>/dev/null +# type dd_help_sup2 1>/dev/null 2>&1 && . dd_help_sup2 2>/dev/null +# type dd_help_sup3 1>/dev/null 2>&1 && . dd_help_sup3 2>/dev/null + +[ -n "$DS_BUG" ] && set +x + +if [ "$dd_help" != "on" ]; then + + u_Fl=/fs/home/dws/hhlog; [ -w $u_Fl ] && [ "${HHLOG:-:}" != "${0##*/}" ] && + >> $u_Fl 2>&1 printf '%10s %8s %s\n' "`uname -n`" "$LOGNAME" \ + "$(date +%d-%H:%M) ${0##*/} ${*:-}" && export HHLOG="${0##*/}" + unset u_Fl + + u_On=${1:-'a'}; u_Cm=${u_On#-hh} + if [ "$u_Cm" != "$u_On" ]; then + u_Sc=${0##*/}; u_Sc=${u_Sc#-} + if [ "$u_Sc" != ksh -a "$u_Sc" != zsh -a "$u_Sc" != rsh -a \ + "$u_Sc" != bash -a "$u_Sc" != sh ]; then + u_Ln="" + case $u_Cm in + "" ) u_Ln="sed -n '/^# *======/,/^[^#]/{/^#/p;/^[^#]/q;/^$/q;}'";; + ver ) u_Ln="sed -n '/^# ver: \( *[^ ].*\) *$/s//\1/p'";; + use ) u_Ln="sed -n '/^# use: \( *[^ ].*\) *$/s//\1/p'";; + arg* ) u_Ln="sed -n '/^# use: \( *[^ ].*\) *$/s//\1/p + /^# \( in: *[^ ].*\) *$/s// \1/p + /^# \(i\/o: *[^ ].*\) *$/s// \1/p + /^# \(out: *[^ ].*\) *$/s// \1/p + /^# \(oth: *[^ ].*\) *$/s// \1/p'";; + pgm ) u_Ln="sed -n '/^# pgm: \( *[^ ].*\) *$/s//\1/p'";; + rqd ) u_Ln="sed -n '/^# rqd: \( *[^ ].*\) *$/s//\1/p'";; + cat ) u_Ln="cat";; + ex ) u_Ln="ex";; + wc ) u_Ln="wc";; + ls ) u_Ln="ls -l";; + vi ) u_Ln="echo vi";; + type ) type "$u_Sc";; + grep?* ) u_Ln="grep -ni ${u_Cm#grep}";; + ?* ) type $u_Cm 1>/dev/null 2>&1 && u_Ln="$u_Cm";; + esac + + if [ -n "$u_Ln" ]; then + u_Sc=$(type $0 | sed -n "/t *found/d;/^.* \(\.*\/*..*\) *$/s//\1/p" | + sed "/^\./s#^#$(pwd)/#" | + sed "s#^\./#$(pwd)/#;s#/\./#/#g;s#///*#/#g" | + sed "s#/\./#/#g;s#/\./#/#g;s/[')]$//" | + sed "s#/[^/][^/]*/\.\./#/#g") + [ -r "$u_Sc" ] && [ "$u_Cm" = "" ] && echo " PATHNAME: $u_Sc" + [ -r "$u_Sc" ] && eval exec "$u_Ln" $u_Sc + fi + unset u_Sc u_Ln; exit + fi; unset u_Sc + fi; unset u_Cm u_On + +# [ "${DS_HH:-}" ] && { echo " ---------------- ${0##*/}"; set -${DS_HH#-}; } + + dd_help="on" +fi + diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/data/products/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/data/products/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/fld/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/fld/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/fld/bin/RELEASE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/fld/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/fldview/floodmapdata/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/fldview/floodmapdata/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/grib/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/grib/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/grib/output/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/grib/output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/app-defaults/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/app-defaults/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/bin/RELEASE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/help_files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/help_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/scripts/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/hdb/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/bin/RELEASE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/lib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/lib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/output/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/calb/output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/doc/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/doc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/bin/RELEASE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/espts/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/espts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/input/oper/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/input/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/output/oper/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/output/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/scripts/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ens/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid new file mode 100755 index 0000000000..6432a2ea8b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid @@ -0,0 +1,17 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +runso rary.ohd.ffg ffmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen new file mode 100755 index 0000000000..221f4a493e --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen @@ -0,0 +1,17 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +runso rary.ohd.ffg pgmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid new file mode 100755 index 0000000000..11fa4f632d --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid @@ -0,0 +1,17 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +runso rary.ohd.ffg zgrid_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/affg/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/affg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/cary/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/cary/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/define/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/define/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grff/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grff/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grro/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grro/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/prod/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/prod/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/text/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/text/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/user/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/user/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/output/grib/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/output/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/output/oper/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/output/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg new file mode 100755 index 0000000000..696c012e17 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg @@ -0,0 +1,556 @@ +#!/bin/ksh +# ======================================================================== +# pgm: ffg .. run FFGS programs +# +# Release 1.31 01/09/2001 +# +USAGE="usage:ffg -p pgm [-i in_file] [-o out_file_prefix] \ +[-f ffg_&_ofs_filesets] [-g ffg_fileset_only] [-h hydrologist_on_duty] \ +[-m message_filename] [-a apend_name] [-c copy_method] [-b bin_dir] \ +[-u user] [-q user_qulf] [-r] [-l] [-x] [-t] [-s]" +# +# The only required parameter is the program to be executed indicated by the +# -p switch. +# +# All switches are documented further down in this script where they are +# output when the script executes with no switches,i.e. ffg. +#=========================================================================== +# HISTORY: +# 09/14/1998 - Release 1.0 - Tim Sweeney +# +# 10/07/1998 - Release 1.1 - Tim Sweeney +# Added token ffg_out_dir +# Added -b for executable directory +# +# 08/20/1999 - Release 1.2 - Tim Sweeney +# Added -r for alternate grid directories +# Changed program GRIBIT to DEGRIB +# +# 05/03/2000 - Release 1.30 - Tim Sweeney +# Changed tokens that point to .../devl/bin +# and .../ffg/bin/RELEASE and .../ffg/bin/ARCHIVE +# +# 01/09/2001 - Release 1.31 - Tim Sweeney +# Removed command -d to point to ../devl/bin directory. Use +# -b d. +# Corrected -b name so name is the complete path and directory of +# the executable. +#=========================================================================== + +Dte=$(date -u +%Y%m%d.%H%M%S) + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ./${env_file} +cd ${prev_dir} + +# initialize command line parameters +Pgm_cl="" +Infil_cl="tty" +Otfil_cl="" +Fl_set_cl="" +Gl_set_cl="" +Hod_set_cl="" +Msg_set_cl="" +Apname_cl="" +Copy_meth_cl="copy" +Bin_set_cl="" +User_cl="" +User_qulf="" +Grid_set="off" +Log_prt="on" +Xqt_pgm="on" +Redir="on" +##Devl="off" +Remsh_request="off" + +# check command line arguments +while getopts p:i:o:f:g:h:m:a:c:b:u:q:rlxtds cl_args ; do + #print "cl_args=$cl_args" + case $cl_args in + p) Pgm_cl=$OPTARG;; + i) Infil_cl=$OPTARG;; + o) Otfil_cl=$OPTARG;; + f) Fl_set_cl=$OPTARG;; + g) Gl_set_cl=$OPTARG;; + h) Hod_set_cl=$OPTARG;; + m) Msg_set_cl=$OPTARG;; + a) Apname_cl=$OPTARG;; + c) Copy_meth_cl=$OPTARG;; + b) Bin_set_cl=$OPTARG;; + u) User_cl=$OPTARG;; + q) User_qulf=$OPTARG;; + r) Grid_set="on";; + l) Log_prt=off;; + x) Xqt_pgm=off;; + t) Redir="off";; +## d) Devl="on";; + s) Remsh_request="on";; + :) Ms_arg=$OPTARG;; + \?) bad_sw=YES;; + esac + done + +# check if command line args were entered properly +bad_cl=0 +if [[ $Ms_arg != "" || $bad_sw != "" || $Pgm_cl = "" ]] ; then + bad_cl=1 + fi +for Ck_arg in $Pgm_cl $Infil_cl $Otfil_cl $Fl_set_cl $User_cl ; do + if [[ $Ck_arg = -[a-zA-Z] ]] ; then + bad_cl=1 + break + fi + done + +# create output directory for user if it does not exist +Usr=${User_cl:-$LOGNAME} +Out_dir=$(get_apps_defaults ffg_output) +if [[ $Out_dir = "" ]] ; then + Out_dir=$(get_apps_defaults ffg_out_dir) + fi +Out_dir=$(get_apps_defaults ofs_output)/$Usr +if [[ ! -d $Out_dir ]] ; then + mkdir -p $Out_dir + chmod ug+rw $Out_dir + fi + +Pgm=${Pgm_cl:-"No_pgm"} +#print "User_qulf=$User_qulf" +Cofil=$Out_dir/$Pgm$User_qulf"_log".$Dte + +# check if messages are to be returned to terminal +if [[ $Redir = "on" ]] ; then + Log_actn=">> $Cofil" + else + Log_actn="" + fi + +# stop if bad command line arguments entered +if (( $bad_cl == 1 )) ; then + eval print ============================================================================$Log_actn + eval print "' '"Stopping FFG script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' $USAGE '" $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + echo + echo "The only required parameter is the program to be executed indicated " + echo "by the -p switch." + echo "--------------------------------------------------------------------" + echo "All other parameters are optional and will be successfully provided " + echo "values if not supplied on the command line. However, certain switch" + echo "values become meaningless unless provided with values by the user. " + echo " Switches are:" + echo + echo " Switch Description Default value" + echo " ------ ------------------------------ --------------------------" + echo " -i Input file/control of program 'tty' to interact with " + echo " execution. Enter 'auto' for the menu." + echo " automatic selection of first" + echo " item in ffguid or prodgen" + echo " menus. Enter 'chain' to " + echo " execute ffguid then prodgen" + echo " and functions as 'auto'." + echo + echo " -o Output file prefix or 'tty'. 'program name'" + echo " Files are date-time stamped" + echo " and placed in the output" + echo " directory. If 'tty' is given," + echo " output goes to the terminal." + echo " (Use -m switch for single" + echo " message file ffgout.)" + echo + echo " -f ffg and ofs file sets override. The file sets indicated" + echo " by the get_apps_defaults" + echo " tokens 'ffg_level' and" + echo " 'ofs_level'." + echo + echo " -g ffg file set override. The file set indicated" + echo " by the get_apps_defaults" + echo " token 'ffg_level' only." + echo + echo " -h Initials of hydrologist on None" + echo " duty" + echo + echo " -m Change name of single ffgout (Used only when a" + echo " message file that contains single file is specified" + echo " all the messages for all messages." + echo + echo " -a Append name to message None" + echo " filename(s). OR Enter 'date'" + echo " to append date-time stamp." + echo + echo " -c Method of copying files to Copy file(s) to append" + echo " append a suffix name to the filename(s)." + echo " message filename(s):" + echo " 'copy' - copy file(s)" + echo " 'move' - move file(s)" + echo + echo " -b Use executable directory Use directory indicated" + echo " indicated as by the 'ffg_dir'/bin/ " + echo " a - 'ffg_dir'/bin/ARCHIVE token RELEASE token." + echo " d - 'my_dir'/bin token (devl)" + echo " m - 'mgr_dir'/bin/RELEASE token" + echo " ma - 'mgr_dir'/bin/ARCHIVE token " + echo " name - path and directory" + echo + echo " -u User name override. Used to Log-in user id ($LOGNAME)." + echo " place output in output dir." + echo " other than the submitting" + echo " user's." + echo + echo " -q User name qualifier. Used None" + echo " when creating" + echo " [progname][user_qulf].[date]" + echo " files." + echo + echo " -r Use alternate directores for Use the default directories" + echo " gridded guidance and runoff, for gridded guidance and" + echo " grfft and grrot, respectively. runoff, grff and grro" + echo + echo " -l Suppress info log message Log message will be printed." + echo " generation." + echo + echo " -x Conduct execution check only, Program will be executed." + echo " displaying add'l info, but" + echo " program is not executed." + echo + echo " -t Have log information displayed Output into log file." + echo " at terminal." + echo + echo " -s Execute program on machine Execute program on machine" + echo " designated as ofs_server via from which ofs command is" + echo " get_apps_defaults mechanism. issued." + echo " end of switch descriptions" + #---------------------------------------------------------------------------" + exit 1 + fi + +if [[ $Log_prt = "on" && $Redir = "on" ]] ; then + print "FFG execution log information will be written to:" + print " ==> $Cofil <==" + fi + +# set parameters for program execution +if [[ $Fl_set_cl != "" ]] ; then + export ofs_level=$Fl_set_cl + export ffg_level=$Fl_set_cl + fi +if [[ $Gl_set_cl != "" ]] ; then + export ffg_level=$Gl_set_cl + fi +if [[ $Grid_set = "on" ]] ; then + export ffg_gff_level="grfft" + export ffg_gro_level="grrot" + fi +if [[ $Bin_set_cl = "" ]] ; then + Ex_dir=$(get_apps_defaults ffg_dir)/bin/RELEASE + # Added by Guoxian Zhou 06/17/2003 + [ -n "$(get_apps_defaults ffg_rls)" ] && Ex_dir=$(get_apps_defaults ffg_rls) + elif [[ $Bin_set_cl = "d" || $Bin_set_cl = "D" ]] ; then + Ex_dir=$(get_apps_defaults my_dir)/bin + # Added by Guoxian Zhou 06/17/2003 + [ -n "$(get_apps_defaults my_rls)" ] && Ex_dir=$(get_apps_defaults my_rls) + elif [[ $Bin_set_cl = "a" || $Bin_set_cl = "A" ]] ; then + Ex_dir=$(get_apps_defaults ffg_dir)/bin/ARCHIVE + elif [[ $Bin_set_cl = "m" ]] ; then + Ex_dir=$(get_apps_defaults mgr_dir)/bin/RELEASE + # Added by Guoxian Zhou 06/17/2003 + [ -n "$(get_apps_defaults mgr_rls)" ] && Ex_dir=$(get_apps_defaults mgr_rls) + elif [[ $Bin_set_cl = "ma" ]] ; then + Ex_dir=$(get_apps_defaults mgr_dir)/bin/ARCHIVE + else + Ex_dir=$Bin_set_cl + fi + +##if [[ $Devl = on ]] ; then +## Ex_dir=$(get_apps_defaults my_dir)/bin +## else +## Ex_dir=$(get_apps_defaults ffg_dir)/bin/RELEASE +## fi + +# check if program found +if [[ ! -a $Ex_dir/$Pgm || ! -f $Ex_dir/$Pgm || ! -x $Ex_dir/$Pgm ]] ; then + eval print ============================================================================$Log_actn + eval print "' '"Stopping FFG script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Ex_dir/$Pgm"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is not executable. $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + +##Inflx=${Infil_cl:-stop} +##Infil=$In_dir/$Inflx + +# check program name to see if to set output to tty +if [[ $Pgm = zgrid ]]; then + Otfil_cl=tty + elif [[ $Infil_cl != auto && $Infil_cl != chain ]] ; then + Otfil_cl=tty + fi + +if [[ $Otfil_cl = tty ]]; then + Otflx=tty + Otfil=tty + Otfil_actn="" + else + Otflx=${Otfil_cl:-$Pgm}$User_qulf.$Dte + Otfil=$Out_dir/$Otflx + Otfil_actn="> $Otfil" + export ffg_print_filename=$Otfil + #print "ffg_print_filename=$(get_apps_defaults ffg_print_filename)" + fi + +# check if input file exists as a file and is not empty +##if [[ ! -a $Infil || ! -f $Infil || ! -s $Infil ]] ; then +## eval print ============================================================================$Log_actn +## eval print "' '"Stopping OFS script at $(date -u +"%T %Z") on \ +## $(date -u +"%a %b %d %Y") $Log_actn +## eval print "' ==> '"$Infil"' <=='" $Log_actn +## eval print "' '"does not exist, is not a file, or is empty. $Log_actn +## eval print ============================================================================$Log_actn +## eval print "''" $Log_actn +## exit 1 +## fi + +## remove tabs from input file +##if grep -l ' ' "$Infil" >&-; then +## tab_out $Infil ${Infil}_temp \ +## && mv ${Infil}_temp $Infil \ +## || rm -f ${Infil}_temp +## chmod 664 $Infil +## fi + +# check if request made to execute program on ofs_server +This_cpu=$(hostname | cut -f1 -d".") +Xqt_prefix="" +if [[ $Remsh_request = "on" ]] ; then + ofs_server=$(get_apps_defaults ofs_server) + ofs_server_defined="no" +# cannot do remote execution if token not defined + if [[ $ofs_server != "" ]] ;then + ofs_server_defined="yes" + # check if already on ofs_server + if [[ $This_cpu != $ofs_server ]] ; then + # check if can remsh to that machine + remsh $ofs_server -n date >> /dev/null 2>> /dev/null + remsh_code=$? + if (( $remsh_code == 0 )) ; then + Xqt_prefix="remsh "$ofs_server" " + valid_request="yes" + else + valid_request="no" + fi + fi + fi + fi + +zbeglog () { + eval print ============================================================================$Log_actn + if [[ $Xqt_pgm = "on" ]] ; then + eval print "' '"Starting FFG program execution at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + else + eval print "' '"Starting FFG execution check at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + fi + eval print "' FFG command issued on: '"$This_cpu $Log_actn + eval print "' Program to be executed: '"$Pgm $Log_actn + if [[ $Remsh_request = "off" ]] ; then + eval print "' Local execution on: '"$This_cpu $Log_actn + else + eval print "' Remote exec requested. '" $Log_actn + if [[ $This_cpu = $ofs_server ]] ; then + eval print "' This cpu is ofs server. '" $Log_actn + eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $ofs_server_defined = "no" ]] ; then + eval print "' OFS Server not defined. '" $Log_actn + eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $valid_request = "no" ]] ; then + eval print "' Cannot execute on: '"$ofs_server $Log_actn + eval print "' Local execution on: '"$This_cpu $Log_actn + else + eval print "' Remote execution on: '"$ofs_server $Log_actn + fi + fi + fi + fi + eval print "' Executable directory: '"$Ex_dir $Log_actn + ##eval print "' Input file: '"$Inflx $Log_actn + ##eval print "' Input directory: '"$In_dir $Log_actn + eval print "' Output file: '"$Otflx $Log_actn + eval print "' Output directory: '"$Out_dir $Log_actn + eval print ============================================================================$Log_actn + } + +zendlog () { + elapsed_time=$SECONDS + ((min = elapsed_time / 60)) + ((sec = elapsed_time % 60)) + ms="s" + ss="s" + if (( min == 1 )) ; then + ms="" + fi + if (( sec == 1 )) ; then + ss="" + fi + eval print "''" $Log_actn + if [[ $Xqt_pgm = "on" ]] ; then + eval print "' Execution of $Pgm took $min minute$ms and $sec second$ss.'" $Log_actn + else + eval print "' Execution check for $Pgm took $min minute$ms and $sec second$ss.'" $Log_actn + fi + eval print "''" $Log_actn + eval print ============================================================================$Log_actn + eval print "' '"Ending $Pgm run at $(date -u +"%T %Z") on $(date -u +"%a %b %d %Y") $Log_actn + eval print ============================================================================$Log_actn + } + +zbeglog + +blank=" " + +#set -o xtrace + +# check if to run program +if [[ $Xqt_pgm = "on" ]] ; then + if [[ $Pgm = ffguid ]] ; then + if [[ $Otfil != tty ]] ; then + set -o xtrace + #print "Pgm=$Pgm blank=$blank" + eval $Xqt_prefix $Ex_dir/$Pgm << eof $Otfil_actn 2$Log_actn +c +$blank +eof + set +o xtrace + else + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + fi + if [[ $Infil_cl = "chain" ]] ; then + zendlog + Pgm="prodgen" +# eval print "' change pgm to '"$Pgm $Log_actn + if [[ $Otfil_cl != tty ]] ; then + Otflx=${Otfil_cl:-$Pgm}$User_qulf.$Dte + Otfil=$Out_dir/$Otflx + Otfil_actn="> $Otfil" + export ffg_print_filename=$Otfil + #print "ffg_print_filename=$(get_apps_defaults ffg_print_filename)" + Cofil=$Out_dir/$Pgm$User_qulf"_log".$Dte + Log_actn=">> $Cofil" + if [[ $Log_prt = "on" && $Redir = "on" ]] ; then + print "FFG execution log information will be written to:" + print " ==> $Cofil <==" + zbeglog + fi + fi + fi + fi + if [[ $Pgm = prodgen ]] ; then + #set -o xtrace + #print "Pgm=$Pgm blank=$blank Hod_set_cl=$Hod_set_cl" + if [[ $Otfil != tty ]] ; then + if [[ $Hod_set_cl = "" || $Hod_set_cl = "." ]] ; then + #set -o xtrace + eval $Xqt_prefix $Ex_dir/$Pgm << eof $Otfil_actn 2$Log_actn +1 +$blank +eof + #set +o xtrace + else + eval $Xqt_prefix $Ex_dir/$Pgm << eof $Otfil_actn 2$Log_actn +1 +$Hod_set_cl +$Otfil +eof + fi + else + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + fi + elif [[ $Pgm = zgrid ]] ; then + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + elif [[ $Pgm = sfcst ]] ; then + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + elif [[ $Pgm != ffguid ]] ; then + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + fi + else +# print execution check information + Ffoper_dir=$(get_apps_defaults ffg_gsfiles) + Oper_dir=$(get_apps_defaults ofs_fs5files) + Sys_dir=$(get_apps_defaults rfs_sys_dir) + eval print "' '"Execution check information: $Log_actn + eval print "' FFG data files directory: '"$Ffoper_dir $Log_actn + eval print "' OFS data files directory: '"$Oper_dir $Log_actn + eval print "' System files directory: '"$Sys_dir $Log_actn + eval print "" $Log_actn + zendlog + exit + fi + +# time stamp ffgout file or individual product files when used and +# option to change name of ffgout file +if [[ $Pgm = prodgen ]]; then + if [[ $Copy_meth_cl = copy ]]; then + Cpactn="cp" + elif [[ $Copy_meth_cl = move ]]; then + Cpactn="mv" + fi + if [[ $Apname_cl = date ]]; then + Part2_name=$Dte + elif [[ $Apname_cl != "" ]]; then + Part2_name=$Apname_cl + else + Part2_name="" + fi + if [ -f $Out_dir/ffgout ] ; then + # for single file + if [[ $Msg_set_cl = "" ]]; then + Part_name="ffgout" + else + Part_name=$Msg_set_cl + fi + if [[ $Apname_cl != "" ]]; then + $Cpactn $Out_dir/ffgout $Out_dir/$Part_name.$Part2_name + elif [[ $Msg_set_cl != "" ]]; then + $Cpactn $Out_dir/ffgout $Out_dir/$Part_name + fi + fi +# for individual files + if [[ $Apname_cl != "" ]]; then + #for Pth in $(ls $Dir/*[0-9][0-9][0-9] 2>&-); do + for Pth in $(ls $Out_dir/[A-Z]*[!.][!0-9][!a-z] 2>&-); do + Part_name=${Pth##*/} + Date_name=$Part_name.$Part2_name + echo " $Out_dir/$Date_name" + $Cpactn $Out_dir/$Part_name $Out_dir/$Date_name + done + fi + fi + +# remove any output files that are empty +Ck_list="$Otfil $Pufil $Cofil" +for Ck_fil in $Ck_list ; do + if [[ -a $Ck_fil && -f $Ck_fil && ! -s $Ck_fil ]] ; then + eval print "''" $Log_actn + eval print Deleting $Ck_fil because nothing was written to it. $Log_actn + rm $Ck_fil + fi + done + +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit new file mode 100755 index 0000000000..cdac785616 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit @@ -0,0 +1,29 @@ +# transmit gridded FFG to AWIPS +# add to script that transmits current FFG products to AWIPS + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh + +DPBIN=/awips/fxa/bin;export DPBIN +FFGGRIB=`get_apps_defaults ffg_grib_out`;export FFGGRIB +FFGA2AID='KcccFFGBIN' +# where ccc is your old AFOS id, i.e. MKC +${DPBIN}/distributeProduct -a DEFAULTNCF -e ${FFGGRIB}/FFGBIN1 ${FFGA2AID} crazy2 +${DPBIN}/distributeProduct -a DEFAULTNCF -e ${FFGGRIB}/FFGBIN3 ${FFGA2AID} crazy2 +${DPBIN}/distributeProduct -a DEFAULTNCF -e ${FFGGRIB}/FFGBIN6 ${FFGA2AID} crazy2 + +# end diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit new file mode 100755 index 0000000000..cba9d04b7e --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit @@ -0,0 +1,1177 @@ +#!/bin/ksh + +# script to test the Flash Flood Guidance System programs + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +set +o xtrace + + ##################################################################### + ## Variable "TesPgmLis" is required by other scripts to determine + ## which programs are used by this script. + ##################################################################### + +TesPgmLis=" + zgrid prodgen ffguid + " + +# get script name +scrname=${0##*/} +#print "scrname=$scrname" + +# set commands to execute if interrupt signal encountered +signal=2 +trap " \ + set +o xtrace ; \ + print 'NOTE: in $scrname - interrupt encountered.' ; \ + set +o xtrace ; \ + xexit 0 $scrname ; exit 0 ; \ + " \ + $signal + +xscrhdr () { + print "Script $scrname started." + } + +xscrtlr () { + print "Script $scrname ended." + } + +xexit () { + print "Script $scrname ended." + } + +xrunning () { + print "RUNNING: $string" + } + +# function to set the Development System build level +xsetbuild () { + read ans?"Enter build level or for $DS_BUILD: " + #set -o xtrace + if [ "$ans" != "" ] ; then + ido=1 + while [ $ido = 1 ] ; do + if [ "$ans" = "ob2" -o "$ans" = "2" -o \ + "$ans" = "ob3" -o "$ans" = "3" -o \ + "$ans" = "ob4" -o "$ans" = "4" ] ; then + if [[ $ans = [1-9]* ]] ; then + ans="ob$ans" + fi + set -o xtrace + export DS_BUILD=$ans + set +o xtrace + ido=0 + else + print "ERROR: '$ans' is an invalid build level." + read ans?"Enter build level or for $DS_BUILD: " + if [ "$ans" = "" ] ; then + ido=0 + fi + fi + done + fi + } + +# function to check if to continue execution. +xcontinue () { +#set -o xtrace +# set prefix for options +optprefix="-" + +allval_f= +chkval_f=yes +prtstr_f= +quitval_f= + +#print "command line arguments: $*" + +# check number of command line arguments +if [ $# -gt 0 ] ; then + ichkval_f= + iprtstr_f= + iquitval_f= + while [ "$1" != "" ] ; do + #set -o xtrace + # check for optional dash + option=${1##$optprefix} + if [ "$option" = "" ] ; then + option=$1 + fi + # get option name + option=${option%%=*} + if [ "$option" = "" ] ; then + option=$1 + fi + option=${option##*=} + #print "option=$option" + # get value for option + #value=${1##*=} + value=${1#*=} + #print "value=$value" + if [ "$value" = "$option" ] ; then + value= + fi + ioption=0 + # check option name + if [[ $option = all* ]] ; then + allval_f=$value + iallval_f=1 + ioption=1 + fi + if [[ $option = chk* ]] ; then + if [[ $value = y* || $value = n* ]] ; then + chkval_f=$value + ichkval_f=1 + else + print "WARNING: in $funcname - '$value' is an invalid $option value." + fi + ioption=1 + fi + if [[ $option = command ]] ; then + command=$value + ioption=1 + fi + if [[ $option = prt* ]] ; then + prtstr_f=$value + #print "prtstr_f=$prtstr_f" + iprtstr_f=1 + ioption=1 + fi + if [[ $option = quit* ]] ; then + quitval_f=$value + iquitstr_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$iprtstr" = "" ] ; then + prtstr_f=$option + iprtstr_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$iallval" = "" ] ; then + allval_f=$option + iallval_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$ichkval" = "" ] ; then + chkval_f=$option + ichkval_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$iquitkval" = "" ] ; then + quitval_f=$option + iquitval_f=1 + fi + if [ $ioption = 0 ] ; then + print "ERROR: '$option' is an invalid option." + fi + shift + done + fi + +#print prtstr_f=$prtstr_f +#print chkval_f=$chkval_f +#print quitval_f=$quitval_f + +#set -o xtrace + +if [ "$prtstr_f" = "" ] ; then + prtstr_f="Okay to continue" + fi + +ireturn_f= + +while [ "$ireturn_f" = "" ] ; do + if [ "$command" != "" ] ; then + print "$prtstr_f" + eval $command + print -n "( for ${chkval_f})? " + else + print -n "$prtstr_f ( for ${chkval_f})? " + fi + read ans? + if [[ "$ans" = "" ]] ; then + if [[ $chkval_f = n* ]] ; then + ireturn_f=0 + fi + if [[ $chkval_f = N* ]] ; then + ireturn_f=0 + fi + if [[ $chkval_f = y* ]] ; then + ireturn_f=1 + fi + if [[ $chkval_f = Y* ]] ; then + ireturn_f=1 + fi + fi + if [[ $ans = n* ]] ; then + ireturn_f=0 + fi + if [[ $ans = N* ]] ; then + ireturn_f=0 + fi + if [[ $ans = y* ]] ; then + ireturn_f=1 + fi + if [[ $ans = Y* ]] ; then + ireturn_f=1 + fi + if [ "$quitval_f" != "" ] ; then + if [ "$ans" = "$quitval_f" ] ; then + ireturn_f=2 + fi + fi + if [ "$allval_f" != "" ] ; then + if [ "$ans" = "$allval_f" ] ; then + ireturn_f=3 + fi + fi + if [ "$ireturn_f" = "" ] ; then + print "ERROR: '$ans' is invalid. Valid values are 'yes' or 'no'." + #ireturn_f=0 + fi + done + +#print "ireturn_f=$ireturn_f" + +set +o xtrace +return $ireturn_f +set +o xtrace +} + +# print script header +xscrhdr $scrname $pid + +# set build level for running programs +xsetbuild + +# set build level for comparing files +default=$DS_BUILD +ido=1 +while [ $ido = 1 ] ; do + read ans?"Enter build level for comparing files or for $default: " + if [ "$ans" = "" ] ; then + ds_build_compare=$default + else + ds_build_compare=$ans + fi + compdir=$(get_apps_defaults ffg_dir)/output/ofstest/$ds_build_compare + #print "compdir=$compdir" + if [ ! -d $compdir ] ; then + print "ERROR: directory $compdir not found." + #set -o xtrace + string=ob + buildnum=${default##*$string} + let buildnum=$buildnum-1 + default=$string$buildnum + ds_build_compare=$default + continue + fi + ido=0 + done +print "NOTE: directory $compdir will be used for comparing files." + +# check operating system +if [ "$(uname)" = "Linux" ] ; then + unamez=lx + moreopt="-d" + redir="1> " + else + unamez=hp + moreopt="-d -e" + redir="2> " + fi +#print "moreopt=$moreopt" + +outdir=$PWD +#outdir=$HOME/$scrname + +#ffguser=ofstest_new +ffguser=ffg_testit_new +#ofsuser=ofstest +ofsuser=ffg_testit +ifpuser=ofstest + +# set environment values +#set -o xtrace +export ffg_level=$ffguser +export ofs_level=$ofsuser +export ifp_rfc=$ifpuser +export ffg_out_dir=$outdir/_prod +export ffg_grib_out=$outdir/_grib +ffg_files=$(get_apps_defaults ffg_files) +ofs_files=$(get_apps_defaults ofs_files) +ffg_duty_fcstr="." +#export $ffg_duty_fcst +set +o xtrace +print "ffg_level=$(get_apps_defaults ffg_level)" +print "ofs_level=$(get_apps_defaults ofs_level)" +print "ifp_rfc=$(get_apps_defaults ifp_rfc)" +print "ffg_files=$ffg_files" +print "ffg_ffgfiles=$(get_apps_defaults ffg_files)/$ffg_level" +print "ffg_dir=$(get_apps_defaults ffg_dir)" +print "ffg_out_dir=$(get_apps_defaults ffg_out_dir)" +print "ffg_grib_out=$(get_apps_defaults ffg_grib_out)" +print "ffg_dir=$(get_apps_defaults ffg_dir)" +#print "ffg_duty_fcstr=$(get_apps_defaults ffg_duty_fcstr)" +print "ofs_files=$ofs_files" +print "ofs_fs5files=$(get_apps_defaults ofs_fs5files)" + +#set -o xtrace +iexit=0 +if [ ! -d $ffg_files ] ; then + #print "ERROR: ffg_files $ffg_files not found." + #iexit=1 + set -o xtrace + mkdir -p $ffg_files + set +o xtrace + else + dirname=$ffg_files/$ffg_level + if [ ! -d $dirname ] ; then + #print "ERROR: dirname $dirname not found." + #iexit=1 + set -o xtrace + mkdir -p $dirname + set +o xtrace + fi + fi +if [ ! -d $ofs_files ] ; then + print "ERROR: ofs_files $ofs_files not found." + iexit=1 + else + dirname=$ofs_files/$ofs_level + if [ ! -d $dirname ] ; then + print "ERROR: dirname $dirname not found." + iexit=1 + fi + fi +if [ $iexit = 1 ] ; then + xexit 0 $scrname ; exit 0 + fi + +filename_errors=${scrname}_errors +filename_warnings=${scrname}_warnings + +zfilesize () { +# check file sizes + for filename in * ; do + if [ ! -s $filename ] ; then + print "WARNING: file $filename is a zero length file." + fi + done + } + +#zfilesize ; xcontinue + +dir_separator="#" +file_separator="=" + +zseparator () { + nrepeat=100 + line= + ncount=0 + #char="#" + char=$1 + while [ $ncount -lt $nrepeat ] ; do + let ncount=$ncount+1 + line="$line$char" + done + print "" >> $filename_compare + print "$line" >> $filename_compare + } + +zgrep () { + #set -o xtrace + string="grep" + xcontinue -prtstr="Okay to run '$string' to check output files for errors and warning" -chkstr=yes + condcode=$? + if [ $condcode = 1 ] ; then + suffix=$1 + grepfile=${filename_errors}$suffix + #set -o xtrace + string="grep "ERROR:" $filenames > $grepfile" + xrunning "$string" + eval $string + if [ -s $grepfile ] ; then + string="vi $grepfile" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + vi $grepfile + set +o xtrace + fi + else + print "NOTE: no errors found." + fi + grepfile=${filename_warnings}$suffix + string="grep "WARNING:" $filenames > $grepfile" + xrunning "$string" + eval $string + if [ -s $grepfile ] ; then + string="vi $grepfile" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + vi $grepfile + set +o xtrace + fi + else + print "NOTE: no warnings found." + fi + set +o xtrace + fi + } + +#filenames="ffguid* prodgen* zgrid*" ; zgrep ; xcontinue + +zcompare () { +# compare files + cmdname="diff" + xcontinue -prtstr="Okay to run '$cmdname' to compare output files" -chkstr=yes + condcode=$? + if [ $condcode = 1 ] ; then + compdir=$(get_apps_defaults ffg_dir)/output/ofstest/$ds_build_compare + if [ ! -d $compdir ] ; then + print "ERROR: directory $compdir not found." + else + options="-b -w" # ignore white space + filename_comparez=${scrname}_compare + filename_compare=$PWD/$filename_comparez + if [ -f $filename_compare ] ; then + rm $filename_compare + fi + #set -o xtrace + new_filenames=@.$scrname.new.filenames + old_filenames=@.$scrname.old.filenames + sedstr="/$new_filenames/d" + sedstr="$sedstr ; /$old_filenames/d" + sedstr="$sedstr ; /$filename_errors*/d" + sedstr="$sedstr ; /$filename_warnings*/d" + sedstr="$sedstr ; /$filename_comparez*/d" + #print "sedstr=$sedstr" + ls $PWD | sed "$sedstr" > $new_filenames + ls $compdir | sed "$sedstr" > $old_filenames + print "BEGIN COMPARING DIRECTORIES:" >> $filename_compare + print " $PWD" >> $filename_compare + print "AND" >> $filename_compare + print " $compdir:" >> $filename_compare + string="diff $new_filenames $old_filenames" + xrunning "$string" + $string >> $filename_compare + rm $new_filenames $old_filenames + print "END COMPARING DIRECTORIES" >> $filename_compare + #sedstr="/\/fs\/awips/d" # delete lines with pathname + #sedstr="$sedstr ; /\/fs\/hseb/d" # delete lines with pathname + sedstr="$sedstr ; /RUN DATE=/d" # delete lines with run date + sedstr="$sedstr ; /RUN DATE = /d" # delete lines with run date + for filename in * ; do + #print "filename=$filename" + if [ "$filename" = "$new_filenames" -o \ + "$filename" = "$old_filenames" -o \ + "$filename" = "$filename_errors" -o \ + "$filename" = "$filename_warnings" -o \ + "$filename" = "$filename_comparez" ] ; then + print "NOTE: skipping file /$PWD/$filename." + print "NOTE: skipping file /$PWD/$filename." >> $filename_compare + continue + fi + file1=$PWD/$filename + #print "file1=$file1" + file2=$compdir/$filename + #print "file2=$file2" + if [ -f $file1 ] ; then + string="FILES" + stringz=$file_separator + else + string="DIRECTORIES" + stringz=$dir_separator + fi + zseparator $stringz + if [ -f $file1 ] ; then + if [ ! -f $file2 ] ; then + print "ERROR: file $file2 not found." + print "ERROR: file $file2 not found." >> $filename_compare + continue + fi + fi + print "BEGIN COMPARING $string:" >> $filename_compare + print " $file1" >> $filename_compare + print "AND" >> $filename_compare + print " $file2:" >> $filename_compare + if [ ! -d $file1 ] ; then + string="$cmdname $options $file1 $file2" + xrunning "$string" + $string | + sed "$sedstr" >> $filename_compare + else + cd $filename + for filenamez in * ; do + #print "filenamez=$filenamez" + iskip=0 + if [[ $filenamez = ${scrname}*ffg ]] ; then + iskip=1 + fi + if [[ $filenamez = *$ffguser*[0-9]* ]] ; then + iskip=1 + fi + if [ $iskip = 1 ] ; then + print "NOTE: skipping file $PWD/$filenamez." + print "NOTE: skipping file $PWD/$filenamez." >> $filename_compare + continue + fi + file1=$PWD/$filenamez + #print "file1=$file1" + file2=$compdir/$filename/$filenamez + #print "file2=$file2" + if [ -f $file1 ] ; then + string="FILES" + stringz=$file_separator + else + string="DIRECTORIES" + stringz=$dir_separator + fi + zseparator $stringz + if [ -f $file1 ] ; then + if [ ! -f $file2 ] ; then + print "ERROR: file $file2 not found." + print "ERROR: file $file2 not found." >> $filename_compare + continue + fi + fi + print "BEGIN COMPARING $string:" >> $filename_compare + print " $file1" >> $filename_compare + print "AND" >> $filename_compare + print " $file2:" >> $filename_compare + string="$cmdname $options $file1 $file2" + xrunning "$string" + $string | + sed "$sedstr" >> $filename_compare + done + print "END COMPARING DIRECTORIES" >> $filename_compare + cd - + fi + set +o xtrace + done + print "END COMPARING FILES" >> $filename_compare + string="vi $filename_compare" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + vi $filename_compare + set +o xtrace + fi + fi + fi + } + +#zcompare ; xcontinue + +#set -o xtrace + +default=dvl +#string="dvl, mgr, rls, arc" +string="dvl, rls, arc" +read using?"Enter $string or for $default: " +if [ "$using" = "" ] ; then + using=$default + fi + +iexit=0 + +# set program pathname +if [[ $using = d* ]] ; then + progpath=$(get_apps_defaults my_rls) + fi +if [[ $using = m* ]] ; then + progpath=$(get_apps_defaults mgr_rls) + fi +if [[ $using = r* ]] ; then + progpath=$(get_apps_defaults ffg_rls) + fi +if [[ $using = a* ]] ; then + progpath=$(get_apps_defaults ffg_arc) + fi +if [ ! -d $progpath ] ; then + print "ERROR: directory $progpath not found." + iexit=1 + else + print "NOTE: progpath is $progpath." + fi + +# set directory for definition input file +ffgdir_define=$(get_apps_defaults ffg_files)/$ofsuser/define +if [ ! -d $ffgdir_define ] ; then + print "ERROR: directory $ffgdir_define not found." + iexit=1 + fi + +# set directory for definition output files +ffgdir_files=$(get_apps_defaults ffg_files)/$ffguser + +if [ $iexit = 1 ] ; then + xexit 0 $scrname ; exit 0 + fi + +xcontinue +condcode=$? +if [ $condcode = 0 ] ; then + xexit 0 $scrname ; exit 0 + fi + +#set -o xtrace + +# check if to delete output files and directories +ideloutdir=1 +if [ $ideloutdir = 1 ] ; then +# check if any files found + dirname=$PWD + ifound=0 + for filename in * ; do + if [ -d $filename ] ; then + ifound=1 + break + fi + if [ -f $filename ] ; then + ifound=1 + break + fi + done + if [ $ifound = 1 ] ; then + print "WARNING: the following files in $dirname will be deleted:" + ls -C -1 -l $dirname | sed '/^total /d' | more $moreopt + xcontinue + condcode=$? + if [ $condcode = 1 ] ; then + #set -o xtrace + #string="rm prodgen* ffguid* zgrid*" + #string="rm -r -f $ffg_out_dir" + #string="rm -r -f $ffg_grib_out" + string="rm -r -f *" + xrunning "$string" + $string + set +o xtrace + fi + fi + fi + +# check if to delete ffg file directory +idelffgdir=1 +if [ $idelffgdir = 1 ] ; then + dirname=$(get_apps_defaults ffg_files)/$ffguser + if [ -d $dirname ] ; then +# check if any files found + cd $dirname + ifound=0 + for filename in * ; do + if [ -d $filename ] ; then + ifound=1 + break + fi + if [ -f $filename ] ; then + ifound=1 + break + fi + done + cd - + if [ $ifound = 1 ] ; then + print "WARNING: the following files in $dirname will be deleted:" + ls -C -1 -l $dirname | sed '/^total /d' | more $moreopt + xcontinue + condcode=$? + if [ $condcode = 1 ] ; then + #set -o xtrace + string="rm -r -f $dirname" + xrunning "$string" + $string + set +o xtrace + fi + fi + fi + fi + +# check if need to create output directories +if [ ! -d $ffg_out_dir ] ; then + set -o xtrace + mkdir -p $ffg_out_dir + set +o xtrace + fi +if [ ! -d $ffg_grib_out ] ; then + set -o xtrace + mkdir -p $ffg_grib_out + set +o xtrace + fi + +blank=" " + +zchkffgdir () { + #print "in zchkffgdir - ffgdir=$ffgdir" + if [ ! -d $ffgdir ] ; then + set -o xtrace + mkdir -p $ffgdir + set +o xtrace + fi + } + +set -o xtrace + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# run program to assign threshold runoff values by areas to each HRAP bin in +# the area using the boundary defined for the area + +progname=zgrid + +export zgrid_file_prefix=$progname + +prefix=$progname +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +$blank # debug/logfile options +$ffgdir_define/defaffg # pathname of old area runoff define file +${progname}_defaffg_new # pathname of new area runoff define file +eof +set +o xtrace + +#xcontinue + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# run flash flood guidance computation program + +progname=ffguid + +# define user controls +type=user +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +u # User Controls +f # file +$ffgdir_define/defuinf +$blank +eof +set +o xtrace + +#xcontinue + +# define area parameters +type=affg +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +a # Areas +c # change +f # file +$ffgdir_define/defaffg +$blank +eof +set +o xtrace + +#xcontinue + +# define grid parameters +type=grro +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +g # Grid +f # file +$ffgdir_define/defgro01 +1 +yes +$ffgdir_define/defgro03 +3 +yes +$ffgdir_define/defgro06 +6 +yes +$ffgdir_define/defgro12 +12 +yes +$ffgdir_define/defgro24 +24 +yes +$blank +$blank # not needed for my_rls version +eof +set +o xtrace + +#xcontinue + +# define runoff adjust for grids parameters +type=gdpm +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +r # Runoff Adjust for Grids +c # change +f # file +$ffgdir_define/defgdpm +$blank +eof +set +o xtrace + +#xcontinue + +# define headwater parameters +type=hffg +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +h # Headwaters +c # change +f # file +$ffgdir_define/defhffg +$blank +eof +set +o xtrace + +#xcontinue + +# define water supply parameters +type=wsup +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +w # Water Supply +c # change +f # file +$ffgdir_define/defwsup +$blank +eof +set +o xtrace + +#xcontinue + +# output parametric information +set -o xtrace +type=dump +prefix=${progname}_$type +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +a # Areas +l # list +${progname}_${type}_parm_affg +1 # first +$blank # last +$blank +$blank +h # Headwater +l # list +${progname}_${type}_parm_hffg +1 # first +$blank # last +$blank +$blank +r # Runoff Adjust for Grids +l # list +${progname}_${type}_parm_gdpm +1 # first +$blank # last +$blank +$blank +u # User controls +l # list +${progname}_${type}_parm_uinf +$blank +w # Water Supply +l # list +${progname}_${type}_parm_wsup +1 # first +$blank # last +$blank +$blank +$blank +quit +eof +set +o xtrace + +#xcontinue + +# create other directories +type=cary +ffgdir=$ffgdir_files/$type +zchkffgdir +type=grff +ffgdir=$ffgdir_files/$type +zchkffgdir + +# compute guidance +set -o xtrace +prefix=${progname}_compute +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +eval $progpath/$progname << eof > $prtfile $logfile +c # Compute all +$blank +eof +set +o xtrace + +#xcontinue + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# run flash flood guidance product generation program + +progname=prodgen + +type=grpp +ffgdir=$ffgdir_files/$type # checked for at start of program +zchkffgdir + +# define user controls +type=user +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +u # User Controls +f # file +$ffgdir_define/defuinf +$blank +eof +set +o xtrace + +#xcontinue + +# define products +type=prod +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +p # Products +c # change +f # file +$ffgdir_define/defprod +$blank +eof +set +o xtrace + +#xcontinue + +# define groups of products +type=grpp +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +g # Groups of Products +c # change +f # file +$ffgdir_define/defgrpp +$blank +$blank +eof +set +o xtrace + +#xcontinue + +# define text parameters +type=text +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +T # Text +c # change +f # file +$ffgdir_define/deftext +$blank +$blank +eof +set +o xtrace + +#xcontinue + +# output parametric information +set -o xtrace +type=dump +prefix=${progname}_$type +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +p # Products +l # list +${progname}_${type}_parm_prod +1 # first +$blank # last +$blank +$blank +$blank +g # Groups of Products +l # list +${progname}_${type}_parm_grpp +1 # first +$blank # last +$blank +$blank +$blank +t # Text +l # list +${progname}_${type}_parm_text +1 # first +$blank # last +$blank +$blank +$blank +u # User controls +l # list +${progname}_${type}_parm_uinf +$blank +$blank +eof +set +o xtrace + +#xcontinue + +# generate products +prefix=${progname}_generate +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +1 # Generate +$blank +eof +set +o xtrace + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# check file size +zfilesize + +# check files for errors and warnings +filenames="ffguid* prodgen* zgrid*" +zgrep + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# test using script ffg + +irun=1 +if [ $irun = 1 ] ; then + if [[ $using = d* ]] ; then + using="-b d" # for my_rls + fi + if [[ $using = m* ]] ; then + using="-b m" # for mgr_rls + fi + if [[ $using = r* ]] ; then + using="" # for ffg_rls + fi + if [[ $using = a* ]] ; then + using="-b ma" # for ffg_arc + fi + runopt="auto" ; progname=${PWD##*/} # run program using first item on menu + runopt="chain" ; progname=ffguid # run program ffguid then prodgen and functions as auto + logqulf="-q _$ffguser" # qualifer for [progname][user_qulf].[date] files + copyopt="-c copy" # copy files when appending suffix name + #copyopt="-c move" # move files when appending suffix name + append="-a $ffguser" # append name to message filenames + #append="-a date" # append date-time stamp to message filenames + duty_fcstr="-h $ffg_duty_fcstr" # duty forecaster + ffgscr="ffg" + string="$ffgscr -p $progname $using -i $runopt $logqulf $copyopt $append $duty_fcstr" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + eval $string + set +o xtrace + cd $ffg_out_dir + # check file size + zfilesize + # check files for errors and warnings + filenames="ffguid* prodgen*" + set +o xtrace + zgrep "_ffg" + cd - + fi + fi + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# compare files +zcompare + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# print script trailer +xscrtlr $scrname $SECONDS + +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/icp/bin/RELEASE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/icp/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/icp/scripts/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/icp/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/help_files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/help_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/options/colors/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/options/colors/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/scripts/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/system/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ifp/system/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/locks/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/locks/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst new file mode 100755 index 0000000000..5f54823ac5 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs batchpst_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit new file mode 100755 index 0000000000..820d1079f7 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs einmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit new file mode 100755 index 0000000000..efa94c7f02 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs fcinmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst new file mode 100755 index 0000000000..1323656fcd --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs fcstmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat new file mode 100755 index 0000000000..b8382f9d2e --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs uxmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize new file mode 100755 index 0000000000..cd8ce08114 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs uzmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb new file mode 100755 index 0000000000..d100bda26b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs goesdb_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh new file mode 100755 index 0000000000..713e9a4afa --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs new file mode 100755 index 0000000000..08a79aea38 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs ndfd2rfs_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil new file mode 100755 index 0000000000..44a8a2ee2c --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs pdutmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit new file mode 100755 index 0000000000..b56ea47fd8 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs ppinmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil new file mode 100755 index 0000000000..7daebc8a06 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs prutmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder new file mode 100755 index 0000000000..ffb47cbc67 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs urmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb new file mode 100755 index 0000000000..f59d0ea3db --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs sasmdb_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars new file mode 100755 index 0000000000..bdfc0406e7 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs dfprmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost new file mode 100755 index 0000000000..5ff6e836e7 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs dfpsmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/mods/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/mods/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/input/oper/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/input/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/output/jelkins/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/output/jelkins/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group new file mode 100755 index 0000000000..c66d90de90 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group @@ -0,0 +1,98 @@ +#!/bin/ksh +#========================================================================== +# Create file directories for an OFS files group +# +USAGE="Usage: create_files_group group_name" +# +# The script create_files_group will create a new branch in the ofs files +# directory structure. The command usage is: +# +# create_files_group group_name +# +# The group_name parameter is required. The top-level of the files group branch +# is created directly under the "ofs_files" directory ("" indicating the use of +# a gad token). The names of the sub-directories created under +# group_name held in the file ofs.files_dir.list in the "rfs_sys_dir" +# directory. All directories in the chain are tested for existence and are +# created if they don't exist. +# Permissions are read for all users and write for the user and group. +#========================================================================== + +if [[ -z $1 ]] + then + print $USAGE + exit + fi + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + +print ' 'Creating OFS files directories for $1 group +print ' 'at `date -u +"%T %Z"` on `date -u +"%a %b %d %Y"` +print "" + +# Now create the ofs groups as indicated in the "groups" files +# First see if the directory above the fs5files needs to be created +# then create the fs5files, shefdata, mods, and griddb directories + +Files_dir=$(gad ofs_files) +List_dir=$(gad rfs_sys_dir) +List_file=$List_dir/ofs.files_dir.list + +print " Check to create: $Files_dir" + +if [[ ! -a $Files_dir ]] + then + mkdir $Files_dir + chmod ug+rw $Files_dir + print " Directory $Files_dir created." + fi + +Grp_dir=$Files_dir/$1 +print "" +print " Check to create: $Grp_dir" + +if [[ ! -a $Grp_dir ]] + then + mkdir $Grp_dir + chmod ug+rwx $Grp_dir + print " Directory $Grp_dir created." + fi +if [[ -a $List_dir && -d $List_dir && -a $List_file ]] + then + while read -r sub_dir_name + do + print " Check to create: $Grp_dir/$sub_dir_name" + + if [[ ! -a $Grp_dir/$sub_dir_name ]] + then + mkdir $Grp_dir/$sub_dir_name + chmod ug+rwx $Grp_dir/$sub_dir_name + print " Directory $Grp_dir/$sub_dir_name created." + if [[ $sub_dir_name = dhmdata ]] + then + mkdir $Grp_dir/$sub_dir_name/parameters + chmod ug+rwx $Grp_dir/$sub_dir_name/parameters + print " Directory $Grp_dir/$sub_dir_name/parameters created." + mkdir $Grp_dir/$sub_dir_name/states + chmod ug+rwx $Grp_dir/$sub_dir_name/states + print " Directory $Grp_dir/$sub_dir_name/states created." + mkdir $Grp_dir/$sub_dir_name/pet + chmod ug+rwx $Grp_dir/$sub_dir_name/pet + print " Directory $Grp_dir/$sub_dir_name/pet created." + mkdir $Grp_dir/$sub_dir_name/channelflow + chmod ug+rwx $Grp_dir/$sub_dir_name/channelflow + print " Directory $Grp_dir/$sub_dir_name/channelflow created." + fi + fi + done < $List_file + fi + +return diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group new file mode 100755 index 0000000000..4ea34e1e41 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group @@ -0,0 +1,83 @@ +#!/bin/ksh +#========================================================================== +# Create input file directories for OFS +# +USAGE="Usage: create_input_group group_name" +# +# The script create_input_group will create a new branch in the ofs input +# directory structure. The command usage is: +# +# create_input_group group_name +# +# The group_name parameter is required. The top-level of the input group +# branch is created directly under the "ofs_dir"/input directory ("" +# indicating the use of a gad token). The names of the +# sub-directories created under group_name correspond to the collection of +# batch ofs programs that exist on the scientific workstations. A list of +# those programs is held in the file ofs.program.list in the "rfs_sys_dir" +# directory. All directories in the chain are tested for existence and are +# created if they don't exist. Permissions are read for all users and write +# for the user and group. +#========================================================================== + +if [[ -z $1 ]] + then + print $USAGE + exit + fi + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + +print Creating OFS input directories for $1 group +print ' 'at `date -u +"%T %Z"` on `date -u +"%a %b %d %Y"` +print "" + +# First create default input directories + +List_dir=$(gad rfs_sys_dir) +List_file=$List_dir/ofs.program.list +Inpt_dir=$(gad ofs_dir)/input + +print " Check to create: $Inpt_dir" + +if [[ ! -a $Inpt_dir ]] + then + mkdir $Inpt_dir + chmod ug+rwx $Inpt_dir + print " Directory $Inpt_dir created." +fi + +Inpt_dir=$Inpt_dir/$1 +print " Check to create: $Inpt_dir" + +if [[ ! -a $Inpt_dir ]] + then + mkdir $Inpt_dir + chmod ug+rwx $Inpt_dir + print " Directory $Inpt_dir created." +fi + +if [[ -a $List_dir && -d $List_dir && -a $List_file ]] + then + while read -r pgm_name + do + print " Check to create: $Inpt_dir/$pgm_name" + + if [[ ! -a $Inpt_dir/$pgm_name ]] + then + mkdir $Inpt_dir/$pgm_name + chmod ug+rwx $Inpt_dir/$pgm_name + print " Directory $Inpt_dir/$pgm_name created." + fi + done < $List_file + fi + + diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh new file mode 100755 index 0000000000..b84331febf --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ./${env_file} +cd ${prev_dir} + +gad() { + get_apps_defaults $@ +} + diff --git a/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/ofs b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/ofs new file mode 100755 index 0000000000..d02a20c9fc --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/ofs @@ -0,0 +1,631 @@ +#!/bin/ksh +# ======================================================================== +# pgm: ofs .. run OFS program +# +USAGE="usage:ofs -p pgm [-i in_file] [-o out_file_prefix] [-f fileset] \ +[-u user] [-g input_group] [-r reor_set] [-h shefout_file_name] \ +[-d] [-m] [-a] [-t] [-x] [-s]" +# +# The only required parameter is the program to be executed indicated by the +# -p switch. +#--------------------------------------------------------------------------- +# All other parameters are optional and will be successfully provided values +# if not supplied on the command line. However, certain switch values +# become meaningless unless provided with values by the user. Switches are: +# +# Switch Description Default value +# ------ ------------------------------ -------------------------- +# -i Input file to be used with stop +# program. File must be +# located in the appropriate +# program's input directory. +# +# -o Output file prefix or "tty". "program name" +# Files are date-time stamped +# and placed in the user's output +# directory. If "tty" is given, +# output goes to the terminal. +# +# -f ofs file set override. The file set indicated +# by the gad +# token "ofs_level". +# +# -g Input file group override. The group indicated by the +# gad token +# "ofs_inpt_grp" +# +# -u User name override. Used to Log-in user id ($LOGNAME). +# place output in output dir. +# other than the submitting +# user's. +# +# -r Reorder file set override. The file set indicated +# by the gad +# token "ofs_reor_lvl". +# +# -h Name of shefout file used as shefout +# output from shefpars and as +# input to shefpost +# +# -d Use "development" executable Use directory indicated +# directory indicated by the by the "ofs_rls" token. +# token "my_rls". +# +# -a Use "manager" executable Use directory indicated +# directory indicated by the by the "ofs_rls" token. +# token "mgr_rls". +# +# -m Suppress "info" message Message will be printed. +# generation. +# +# -t Have log information displayed Output into log file. +# at terminal. +# +# -x Conduct execution check only, Program will be executed. +# displaying add'l info, but +# program is not executed. +# +# -s Execute program on machine Execute program on machine +# designated as ofs_server via from which ofs command is +# gad mechanism. issued. +#--------------------------------------------------------------------------- +# rqd: gad +# +# ver: 20020122 +#=========================================================================== + +# Change Information +# +# Disable the -s switch for HPs since it doesn't work and the HP is +# faster anyway. jto - 3/98 +# Update to include ndfd2rfs temperature pre-processor 10/10/04 Edwin +# Update to put -m back to suppressing messages, and made -c the mgr option +# no known reason why the -m became mgr, but this returns the script to the +# configuration in the field 2/3/05 Edwin +# +#=========================================================================== + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + +# Make sure the temporary input file is removed at script exit + + trap '[ -f "$Tmpfile" ] && /bin/rm $Tmpfile 2>> /dev/null' 0 + + Dte=$(date -u +%Y%m%d.%H%M%S) + +# Umask patch + + umask 002 + +# On Linux we output log messages to stdout, on HP to stderr: + + [ "`uname`" = Linux ] && Num_actn=1 || Num_actn=2 + +# Initialize command line parameters + + Pgm_cl="" + Infil_cl="" + Otfil_cl="" + Fl_set_cl="" + Inpt_grp_cl="" + User_cl="" + Reor_cl="" + Sho_fil_cl="" + Devl="off" + Mgr="off" + Msg_prt="on" + Redir="on" + Xqt_pgm="on" + Remsh_request="off" + +# Determine which parameters were entered on the command line + +while getopts :p:i:o:f:g:u:r:h:damtxs cl_args +do + case $cl_args in + p) Pgm_cl=$OPTARG;; + i) Infil_cl=$OPTARG;; + o) Otfil_cl=$OPTARG;; + f) Fl_set_cl=$OPTARG;; + u) User_cl=$OPTARG;; + g) Inpt_grp_cl=$OPTARG;; + r) Reor_cl=$OPTARG;; + h) Sho_fil_cl=$OPTARG;; + d) Devl="on";; + a) Mgr="on";; + m) Msg_prt=off;; + t) Redir="off";; + x) Xqt_pgm=off;; + s) [ "`uname`" = HP-UX ] && { Remsh_request="on"; RshCmd="ssh"; } + [ "`uname`" = Linux ] && { Remsh_request="on"; RshCmd="ssh"; };; + :) Ms_arg=$OPTARG;; + \?) bad_sw=YES;; + esac +done + +# See if command line args were entered properly + +bad_cl=0 +if [[ $Ms_arg != "" || $bad_sw != "" || $Pgm_cl = "" ]] + then + bad_cl=1 + fi + +for Ck_arg in $Pgm_cl $Infil_cl $Otfil_cl $Fl_set_cl $User_cl $Reor_cl \ + $Sho_fil_cl +do + if [[ $Ck_arg = -[a-zA-Z0-9.] ]] + then + bad_cl=1 + break + fi +done + +# create output directory for user if it doesn't exist + + Usr=${User_cl:-$LOGNAME} + Out_dir=$(gad ofs_output)/$Usr + if [[ ! -d $Out_dir ]] + then + + AccRit=775 + if [ "$Usr" = ofstest ]; then + [ "$LOGNAME" = testmgr ] && AccRit=755 || AccRit=555 + fi + + mkdir -p $Out_dir + chmod $AccRit $Out_dir + fi + + Pgm=${Pgm_cl:-"No_pgm"} + Cofil=$Out_dir/$Pgm"_log".$Dte + +# Check to see if messages are to be returned to terminal + + if [[ $Redir = "on" ]] + then + Log_actn=">> $Cofil" + else + Log_actn="" + fi + +# Check to see if "informatory" message is to be displayed + + if [[ $Msg_prt = "on" && $Redir = "on" ]] + then + print "OFS execution log information will be written to:" + print " ==> $Cofil <==" + fi + +# Kick out if bad command line arguments entered + +if (( $bad_cl == 1 )) + then + eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' $USAGE '" $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + +# Establish key parameters for program execution + + if [[ $Fl_set_cl != "" ]] + then + export ofs_level=$Fl_set_cl + fi + + if [[ $Inpt_grp_cl != "" ]] + then + export ofs_inpt_grp=$Inpt_grp_cl + fi + + if [[ $Reor_cl != "" ]] + then + export ofs_reor_lvl=$Reor_cl + fi + + + if [[ $Devl = on ]] + then + Ex_dir=$(gad my_rls) + elif [[ $Mgr = on ]] + then + Ex_dir=$(gad mgr_rls) + else + Ex_dir=$(gad ofs_rls) + fi + +############################################################################## +# Added by DHM Team (11/06)... +# add the following jars and so's to the approriate ENV paths for executing DHM through FCST +############################################################################## + + shared_jars=$(gad util_rls)/toolsUI-2.2.12.jar:$(gad util_rls)/jgrapht-0.6.0.jar:$(gad util_rls)/commons-io-1.3.1.jar:$(gad util_rls)/commons-collections-3.1.jar + util_nwsrfs_jars=$(gad util_rls)/ofs.jar:$(gad util_rls)/dhm.jar:$(gad util_rls)/rdhmutilities.jar:$(gad util_rls)/distrouting.jar + + export CLASSPATH=$shared_jars:$util_nwsrfs_jars + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(gad util_rls):$(gad sys_java_dir)/lib/i386:$(gad sys_java_dir)/lib/i386/native_threads:$(gad sys_java_dir)/lib/i386/client + + In_dir=$(gad ofs_input)/$Pgm + Shef_dir=$(gad ofs_shefdata_dir) + Sho_dir=$(gad ofs_shefout_dir) + + +############################################################################## +# Added by Hank Herr (12/4/01)... +# If the Pgm is convert_espts, then I need to change the Ex_dir to point to +# the scripts directory. I also need a different Num_actn. +############################################################################## +if [[ $Pgm = "convert_griddb" ]] +then + Ex_dir="$(gad ofs_scripts)" + Num_actn=2 +fi + +# Check to see if program exists at exec directory + + if [[ ! -a $Ex_dir/$Pgm || ! -f $Ex_dir/$Pgm || ! -x $Ex_dir/$Pgm ]] + then + eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Ex_dir/$Pgm"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is not executable. $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + +# Establish file names that can be used by any OFS program + + Inflx=${Infil_cl:-stop} + Infil=$In_dir/$Inflx + +if [[ $Otfil_cl = tty ]]; then + Otflx=tty + Otfil=tty + Otfil_actn="" + else + Otflx=${Otfil_cl:-$Pgm}.$Dte + Otfil=$Out_dir/$Otflx + Otfil_actn="> $Otfil" +fi + + Pufil=$Out_dir/$Pgm"_pun".$Dte + Shofl=${Sho_fil_cl:-shefout} + X1fil=$Out_dir/$Pgm"_unit1".$Dte + X8fil=$Out_dir/$Pgm"_unit8".$Dte + X9fil=$Out_dir/$Pgm"_unit9".$Dte + X97fil=$Out_dir/$Pgm"_unit97".$Dte + Tmpfile=/tmp/${0##*/}.$LOGNAME.$$ + + if [[ $Pgm = shefpars || $Pgm = shefpost ]] + then + Inflx=$Pgm.in + Infil=$In_dir/$Inflx + Xxfil=$Sho_dir/$Shofl + if [[ $Pgm = shefpars ]] + then + Shflx=${Infil_cl:-shin} + Shfil=$Shef_dir/$Shflx + + # Check to see if SHEF input file exists as a file + # and is not empty + + if [[ ! -a $Shfil || ! -f $Shfil || ! -s $Shfil ]] + then +eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script for $Pgm at $(date -u +"%T %Z") on\ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Shfil"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is empty. $Log_actn +eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + + fi + fi + +# Check to see if input file exists as a file and is not empty. +# Note, skip this section if program "ndfd2rfs" is used. + +if [[ $Pgm != ndfd2rfs ]] + then + if [[ ! -a $Infil || ! -f $Infil || ! -s $Infil ]] + then +eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Infil"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is empty. $Log_actn +eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + + +# Take tabs out of input file: +# ... routine "tab_out" MUST EXIST in the user environment +# ... use "if [[ "`uname -s`" = "AIX" ]]; then" if only IBM usage + + if grep -l ' ' "$Infil" >/dev/null; then + tab_out $Infil ${Infil}_temp \ + && mv ${Infil}_temp $Infil \ + || rm -f ${Infil}_temp + [ "$LOGNAME" = testmgr ] && chmod 644 $Infil || chmod 664 $Infil + fi + +fi # end of if on ndfd +# +# See if request made to execute program on ofs_server +# + +This_cpu=$(hostname | cut -f1 -d".") +##=## Xqt_prefix='$Ex_dir/$Pgm < $Tmpfile $Otfil_actn' + +if [[ $Remsh_request = "on" ]] + then + ofs_server=$(gad ofs_server) + ofs_server_defined="no" + +# Can't do remote execution if g_a_d token not defined. + + if [[ $ofs_server != "" ]] + then + ofs_server_defined="yes" + +# See if we're already on ofs_server, and +# if not, see if we can remsh to that box. + + if [[ $This_cpu != $ofs_server ]] + then + eval $RshCmd $ofs_server -n date >> /dev/null 2>> /dev/null + remsh_code=$? + if (( $remsh_code == 0 )) + then + lvl=$(gad ofs_level) +##=## Xqt_prefix='remsh $ofs_server -n \"{ export ofs_level=$lvl; $Ex_dir/$Pgm < $Tmpfile $Otfil_actn; }\"' + valid_request="yes" + else + valid_request="no" + fi + fi + fi + fi + +eval print ============================================================================$Log_actn +if [[ $Xqt_pgm = "on" ]] + then +eval print "' '"Starting OFS program execution at $(date -u +"%T %Z") on \ +$(date -u +"%a %b %d %Y") $Log_actn +else +eval print "' '"Starting OFS execution check at $(date -u +"%T %Z") on \ +$(date -u +"%a %b %d %Y") $Log_actn +fi + +eval print "' OFS command issued on: '"$This_cpu $Log_actn +eval print "' Program to be executed: '"$Pgm $Log_actn + +if [[ $Remsh_request = "off" ]] + then +eval print "' Local execution on: '"$This_cpu $Log_actn + + else +eval print "' Remote exec requested. '" $Log_actn + if [[ $This_cpu = $ofs_server ]] + then +eval print "' This cpu is ofs server. '" $Log_actn +eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $ofs_server_defined = "no" ]] + then +eval print "' OFS Server not defined. '" $Log_actn +eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $valid_request = "no" ]] + then +eval print "' Cannot execute on: '"$ofs_server $Log_actn +eval print "' Local execution on: '"$This_cpu $Log_actn + else +eval print "' Remote execution on: '"$ofs_server $Log_actn + fi + fi + fi + fi + +eval print "' Executable directory: '"$Ex_dir $Log_actn +eval print "' Input file: '"$Inflx $Log_actn +eval print "' Input directory: '"$In_dir $Log_actn +eval print "' Output file: '"$Otflx $Log_actn +eval print "' Output directory: '"$Out_dir $Log_actn +if [[ $Pgm = shefpars ]] + then + eval print "' SHEF file: '"$Shflx $Log_actn + eval print "' SHEF directory: '"$Shef_dir $Log_actn + fi +eval print ============================================================================$Log_actn + +# Execute OFS program, unless "execute program" switch is off + +if [[ $Xqt_pgm = "on" ]] + then + +############################################################################## +# Added by Hank Herr (12/4/01)... +# The convert_griddb runs differently than the others, so I'll handle it +# in a special way right here. +############################################################################## +if [[ $Pgm = convert_griddb ]] +then + # execute the pgm + eval $Ex_dir/$Pgm $In_dir/$Inflx > $Out_dir/$Otflx $Num_actn$Log_actn + exit 0 +fi +############################################################################## + +############################################################################## +# Added by Edwin Welles... +# +############################################################################## +if [[ $Pgm = ndfd2rfs ]] +then + # execute the wrapper script + scr_Dir=$(get_apps_defaults ofs_scripts) + # execute the pgm + eval $scr_Dir/${Pgm}.ksh $Out_dir/$Otflx $Num_actn$Log_actn + exit 0 +fi +############################################################################## + +# Set up temporary file for use in input redirection +# for program execution + +if [[ $Pgm = fcst ]]; then +cat > $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < Basins overlay +# resvrs_latlon.OS --> Reservoirs overlay +# grid_to_basin_hrap.OS --> HRAP grid to basin +# navigation file +# grid_to_county_hrap.OS --> HRAP grid to county +# navigation file +# +# GeoLine-based files: +# +# hiways_latlon.OS --> Highways overlays +# roads_latlon.OS --> Road overlay +# rivers_latlon.OS --> Rivers overlay +# streams_latlon.OS --> Streams overlay +# +# ORIGINAL AUTHOR: Bryon Lawrence +# CREATION DATE: November 20, 2003 +# ORGANIZATION: HSEB-OHD +# MACHINE: HP-UX, Redhat Linux. +# MODIFICATION HISTORY: +# DATE PROGRAMMER DESCRIPTION/REASON +# 11/20/2003 Bryon Lawrence Original Coding +################################################################################ +# + +geo_area_types_filenames="BASIN:basins.dat COUNTY:counties.dat RESRVR:resvrs.dat ZONE:zones.dat" +geo_line_types_filenames="ROAD:HIWAYS:hiways.dat:1 ROAD:ROADS:roads.dat:2 STREAM:RIVERS:rivers.dat:1 STREAM:STREAMS:streams.dat:2" + +# +# Source set_hydro_env +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_GEODATA_DIR=$(get_apps_defaults whfs_geodata_dir) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# Create the log directory. +LOGNAME=$WHFS_UTIL_LOG_DIR/create_whfs_geodata.log + +rm -f $LOGNAME + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` + +echo "=====================================" | tee -a $LOGNAME +echo "Starting create_whfs_geodata on $date ..." | tee -a $LOGNAME +printf "Logging to $LOGNAME.\n" + +# Check the existence of each of the .dat files. If the .dat file +# does not exist for a particular GeoArea or GeoLine type, then +# unload it from the database. + +# First the existence of the .dat files containing GeoArea data is checked. +# Any files that are missing are created by unloading data for the +# correct boundary_type from the GeoArea table. +for i in $geo_area_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + filename=`echo $i | cut -d: -f2` + + if [[ ! -a $WHFS_GEODATA_DIR/$filename || \ + ! -r $WHFS_GEODATA_DIR/$filename ]] + then + + printf "\nFile $filename does not exist. Unloading it from the\n" \ + | tee -a $LOGNAME + printf "GeoArea table\n" | tee -a $LOGNAME + printf "Running $WHFS_BIN_DIR/process_geoarea -u\n" \ + | tee -a $LOGNAME + printf "-d$DB_NAME -t$filetype $WHFS_GEODATA_DIR/$filename\n" \ + | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoarea -u -d$DB_NAME -t$filetype \ + $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + printf "\nThe call to process_geoarea failed.\n" | tee -a $LOGNAME + fi + fi + +done + +# Now, the existence of the .dat files containing geoline data is checked. +# Any missing files are created by unloading data from the GeoLine table +# for the correct vector type. +for i in $geo_line_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + typename=`echo $i | cut -d: -f2` + filename=`echo $i | cut -d: -f3` + rank=`echo $i | cut -d: -f4` + + if [[ ! -a $WHFS_GEODATA_DIR/$filename || \ + ! -r $WHFS_GEODATA_DIR/$filename ]] + then + + printf "\nFile $filename does not exist. Unloading it from the\n" \ + | tee -a $LOGNAME + printf "GeoLine table\n" | tee -a $LOGNAME + printf "Running $WHFS_BIN_DIR/process_geoline -u \n" \ + | tee -a $LOGNAME + printf "-d$DB_NAME -t$filetype -n$typename -r$rank " \ + | tee -a $LOGNAME + printf "$WHFS_GEODATA_DIR/$filename\n" | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoline -u -d$DB_NAME -t$filetype \ + -n$typename -r$rank $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + printf "The call to process_geoline failed.\n" | tee -a $LOGNAME + fi + fi + +done + +# +# Any .dat files which needed to be created have been created. It is now +# time to load them into the GeoArea and GeoLine tables. First the +# .dat files containing GeoArea data are loaded into the GeoArea table. +# +# Load all of the GeoArea .dat files into the database. The process_geoarea +# routine will decide which overlay and navigation files to create. + +for i in $geo_area_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + filename=`echo $i | cut -d: -f2` + + printf "Running $WHFS_BIN_DIR/process_geoarea -l -d$DB_NAME\n" \ + | tee -a $LOGNAME + printf "-t$filetype $WHFS_GEODATA_DIR/$filename\n" \ + | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoarea -l -d$DB_NAME -t$filetype \ + $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + printf "The call to process_geoarea failed.\n" | tee -a $LOGNAME + fi + +done + +# Load all of the GeoLine .dat files into the database. The process_geoline +# routine will decide which overlay files to create. +for i in $geo_line_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + typename=`echo $i | cut -d: -f2` + filename=`echo $i | cut -d: -f3` + rank=`echo $i | cut -d: -f4` + + printf "Running $WHFS_BIN_DIR/process_geoline -l -d$DB_NAME\n" \ + | tee -a $LOGNAME + printf "-t$filetype -n$typename -r$rank $WHFS_GEODATA_DIR/$filename\n" \ + | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoline -l -d$DB_NAME -t$filetype \ + -n$typename -r$rank $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + + printf "The call to process_geoline failed.\n" | tee -a $LOGNAME + + fi + +done + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` +printf "create_whfs_geodata completed on $date\n" | tee -a $LOGNAME diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/crs2awips.ksh b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/crs2awips.ksh new file mode 100755 index 0000000000..6666651f77 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/crs2awips.ksh @@ -0,0 +1,34 @@ +#!/bin/ksh +# +# crs2awips.ksh +# +# given CRS id, find best-fit awips +# the input file contains 3 fields: +# 1) afos cccnnnxxx 2) wmo ttaaoo 3) awips cccc +# +# Last Modified: 01/31/2002 +# +export FILENAME=/awips/fxa/data/afos2awips.txt + +if [[ $1 = "" ]] +then + echo NO_ID_GIVEN + exit +fi + +export CRS_ID=$1 + +CCCNNN=`echo $CRS_ID | cut -c1-6` +LINE=`grep "$CCCNNN" $FILENAME` + + +if [ -n "$LINE" ] +then + CCCC=`echo $LINE | cut -f3 -d" " ` + NNNXXX=`echo $LINE | cut -c4-9 ` + AWIPSID=$CCCC$NNNXXX + echo $AWIPSID +else + echo NO_MATCH +fi +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/damcrest.jar b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/damcrest.jar new file mode 100755 index 0000000000..3860561b34 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/damcrest.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/fcstservice.jar b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/fcstservice.jar new file mode 100755 index 0000000000..32d6ba07af Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/fcstservice.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/fldat.jar b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/fldat.jar new file mode 100755 index 0000000000..c3cb6a36fc Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/fldat.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/init_rivermon_tables.ksh b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/init_rivermon_tables.ksh new file mode 100755 index 0000000000..7c0620fcd8 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/init_rivermon_tables.ksh @@ -0,0 +1,35 @@ +#!/bin/ksh + +#Author: Varalakshmi Rajaram +#Date : May 10th 2006 +#Initialize rivermonlocation and rivermongroup tables + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +###################### function +fn(){ + psql $DB_NAME -e << END + \copy rpffcstgroup (group_id, group_name, ordinal) to './input.grp' with delimiter '|' + \copy rivermongroup(group_id, group_name, ordinal) from './input.grp' with delimiter '|' + insert into rivermongroup values('DEFAULT', 'DEFAULT GROUP', 1); + update rivermongroup set hsa=(select hsa from admin) where hsa is null; + \copy rpffcstpoint (lid, group_id, ordinal) to './input.lid1' with delimiter '|' + create table dummytable(lid varchar(8)); + insert into dummytable select lid from location where lid not in(select lid from rpffcstpoint); + \copy dummytable (lid) to './input.lid2' with delimiter '|' + \copy rivermonlocation(lid, group_id, ordinal) from './input.lid1' with delimiter '|' + \copy rivermonlocation(lid) from './input.lid2' with delimiter '|' + update rivermonlocation set ordinal=1 where ordinal is null; + update rivermonlocation set group_id='DEFAULT' where group_id is null; + drop table dummytable; +END + + rm -f ./input.grp ./input.lid1 ./input.lid2 +} + +fn diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/load_maxfcst.LX b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/load_maxfcst.LX new file mode 100644 index 0000000000..74b0326628 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/load_maxfcst.LX differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/load_rpf_backup_msg b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/load_rpf_backup_msg new file mode 100755 index 0000000000..20bdf9c5c0 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/load_rpf_backup_msg @@ -0,0 +1,177 @@ +#!/bin/ksh +# +# load_rpf_backup_msg +# +# version: July 6, 2006 +# +# This script performs the real work in posting the +# RiverPro information associated with backup information +# from neighboring sites. It is called from the process_rpf_backup_msg +# +# The script takes the incoming message, cleans up the file, then +# extracts the info within the file for the three database +# tables, and loads the information into the database. +# + +# set up SOME environment variables for WHFS applications + +RUN_FROM_DIR=`dirname $0` +#. $RUN_FROM_DIR/../../set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export DB_NAME=$(get_apps_defaults db_name) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# assign the args to local variables + +FILENAME=$1 +PRODUCTID=$2 +PACKEDTIME=$3 +WFO_SOURCE=$4 + +# +# define the log file names. +# this name must be consistent with the name in the calling script. +# + +LOGFILE=$RPF_LOG_DIR/process_backup_$PACKEDTIME.log.from$WFO_SOURCE + +Dte=`date -u` +/bin/echo Begin load_rpf_backup_msg at $Dte >> $LOGFILE + +# +# create a new output file by removing the two header lines +# from the product and the extra carriage returns that are added by +# the distributeProduct operations. also change the backslash-newline +# sequence to be newline +# + +NEWFILENAME=$WHFS_PRODUCT_DIR/$PRODUCTID.$PACKEDTIME.from$WFO_SOURCE +/bin/sed -e '1,2d' $FILENAME | /usr/bin/tr -d '\015' > $NEWFILENAME + + +# for testing possibilities... +#cat $FILENAME | /usr/bin/tr -d '\015' | sed 's/\\n\\n/\\n/g' | sed 's/\\n/\n/g' > $NEWFILENAME +#cat $FILENAME | /usr/bin/tr -d '\015' > $NEWFILENAME + +# +# parse the three sets of data in the file into individual load files. +# use an embedded awk script to do this. just in case, +# remove any files beforehand since the files is always appended to. +# these work files get purged from the product dir via a cron. +# + +VTECEVENT_FILE=$WHFS_PRODUCT_DIR/VTECevent_$PACKEDTIME.load.$WFO_SOURCE +FPPREVPROD_FILE=$WHFS_PRODUCT_DIR/FpPrevProd_$PACKEDTIME.load.$WFO_SOURCE +TEXTPRODUCT_FILE=$WHFS_PRODUCT_DIR/TextPoduct_$PACKEDTIME.load.$WFO_SOURCE + +if [ -s $VTECEVENT_FILE ] +then + rm -f $VTECEVENT_FILE +fi + +if [ -s $FPPREVPROD_FILE ] +then + rm -f $FPPREVPROD_FILE +fi + +if [ -s $TEXTPRODUCT_FILE ] +then + rm -f $TEXTPRODUCT_FILE +fi + +awk 'BEGIN {FS=" "; + header_mode=0 + file_name="" + } + +$1=="table:vtecevent" { header_mode=1; file_name=file1 } +$1=="table:fpprevprod" { header_mode=1; file_name=file2 } +$1=="table:textproduct" { header_mode=1; file_name=file3 } + +$1!="table:vtecevent" && $1!="table:fpprevprod" && $1!="table:textproduct" { + if ( header_mode == 1 ) print >> file_name; + }' file1=$VTECEVENT_FILE file2=$FPPREVPROD_FILE file3=$TEXTPRODUCT_FILE $NEWFILENAME + +# +# load the three data sets by using \copy table from file in Postgres, note that +# the load will fail if there is duplicate data +# + +/bin/echo Loading VTECevent, FpPrevProd, TextProduct records. >> $LOGFILE +/bin/echo Duplicate record errors can be ignored. >> $LOGFILE + +# +# load the VTECevent data +# + +/bin/echo Loading VTECevent table......... >> $LOGFILE +$POSTGRESQLBINDIR/psql -d $DB_NAME -c "\COPY VTECevent FROM $VTECEVENT_FILE USING DELIMITERS '|' WITH NULL as ''" >> $LOGFILE 2>&1 + +# +# load the FpPrevProd table +# + +/bin/echo Loading FpPrevProd table......... >> $LOGFILE +$POSTGRESQLBINDIR/psql -d $DB_NAME -c "\COPY FpPrevProd FROM $FPPREVPROD_FILE USING DELIMITERS '|' WITH NULL as ''" >> $LOGFILE 2>&1 + +# +# load the TextProduct table +# + +/bin/echo Loading TextProduct table......... >> $LOGFILE +$POSTGRESQLBINDIR/psql -d $DB_NAME -c "\COPY TextProduct FROM $TEXTPRODUCT_FILE USING DELIMITERS '|' WITH NULL as ''" >> $LOGFILE 2>&1 + + +# When a new product id arrives for the first time, make an entry to the +# PurgeProduct table for the product id. This is needed to ensure +# that there are not unlimited number of products for the product id in +# the TextProduct table. + + +/bin/echo Make entry to PurgeProduct per product id >> $LOGFILE + +TIMESTR=`date -u +"%F %k:%M:%S"` + +YEARSTR=`echo $PACKEDTIME | cut -c1-4` +MONSTR=`echo $PACKEDTIME | cut -c5-6` +DAYSTR=`echo $PACKEDTIME | cut -c7-8` +HOURSTR=`echo $PACKEDTIME | cut -c9-10` +MINSTR=`echo $PACKEDTIME | cut -c11-12` +SECSTR=`echo $PACKEDTIME | cut -c13-14` +PRODUCTTIME="$YEARSTR-$MONSTR-$DAYSTR $HOURSTR:$MINSTR:$SECSTR" + +product_id_num=$(echo "SELECT count(*) FROM PurgeProduct "\ + "WHERE product_id='$PRODUCTID';" | $POSTGRESQLBINDIR/psql -d $DB_NAME -t) + + + +if [ $product_id_num -eq 0 ] +then + + echo "INSERT INTO PurgeProduct "\ + "VALUES ('$PRODUCTID',"\ + "3, '$PRODUCTTIME','$TIMESTR');" | $POSTGRESQLBINDIR/psql -d $DB_NAME + +else + + echo "UPDATE PurgeProduct "\ + "SET producttime='$PRODUCTTIME', "\ + "postingtime='$TIMESTR'" \ + "WHERE product_id='$PRODUCTID';" | $POSTGRESQLBINDIR/psql -d $DB_NAME +fi + +# +# + +Dte=`date -u` +/bin/echo Completed load_rpf_backup_msg at $Dte >> $LOGFILE + + +return 0 + +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/log4j.xml b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/log4j.xml new file mode 100644 index 0000000000..f2cf23c666 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/log4j.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pa/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pa/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pdc_pp.jar b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pdc_pp.jar new file mode 100755 index 0000000000..1f3cf5be27 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pdc_pp.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pdc_pp_test b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pdc_pp_test new file mode 100755 index 0000000000..e189b93223 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/pdc_pp_test @@ -0,0 +1,29 @@ +#!/bin/ksh + +# File name: run_pdc_pp +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +export CONNECTION_STRING=$JDBCURL + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +# set java classpath + +export CLASSPATH=.:$SYS_JAVA_DIR\ +:$SYS_JAVA_BIN_DIR\ +:$DB_DRIVER_PATH\ +:$WHFS_BIN_DIR/pdc_pp.jar + +# set up an X Terminal window to write stdout and run the DamCrest +# application using java +$SYS_JAVA_BIN_DIR/java ohd.hseb.pdc_pp.sample_data_set.PDCPreProcessorTest $CONNECTION_STRING $PDC_PP_LOG_DIR diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/post_remote_CRS_msg b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/post_remote_CRS_msg new file mode 100755 index 0000000000..daae9c85c4 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/post_remote_CRS_msg @@ -0,0 +1,87 @@ +#!/bin/ksh +# +# post_remote_CRS_msg +# +# version: January 30, 2002 +# +# usage: post_remote_CRS_msg filename subject_string msgtype +# where the arguments are provided via the mhs receive process +# and are translated from the mhs args %ENCLOSE(1) %SUBJECT %MSGTYPE args. +# +# This script is invoked via the message handling service (MHS) mechanisms. +# It is called when a CRS product file from a remote (i.e. nonlocal) WFO +# is received at the local WFO. This script is used so the local WFO can +# pass the file to the local CRS. The arguments passed to this function +# are provided by the mhs receive process, and originate in the +# arguments provides on the mhs send process at the remote system. +# +# mhs places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# transferNWR copies the file into the directory: +# /data/fxa/workFiles/nwr/pending +# + +# This allows you to run this script outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) + +# +# +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 +# +LOGFILE=$WHFS_UTIL_LOG_DIR/post_remote_CRS_msg.log +TMPFILE=$WHFS_UTIL_LOG_DIR/post_remote_CRS_msg.tmp +# +# save only the latest events in the log file +# +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE +# +# +Dte=`date -u` +echo "----" >> $LOGFILE +echo Processing file: $FILENAME at $Dte >> $LOGFILE +echo Subject: $SUBJECT Msgtype: $MSGTYPE >> $LOGFILE +# +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh +# +# +# use a shell function to extract the argument from the subject line +# +parseSubject() +{ +DESCRIP=$1 +PRODUCTID=$2 +return +} +# +# get the product id from the subject, then use it to build the +# new filename, which is written to when the two header lines +# are stripped off the product and the extra carriage returns +# are added by the distributeproduct operations. +# +parseSubject $SUBJECT +NEWFILENAME=$WHFS_PRODUCT_DIR/$PRODUCTID.remote +/bin/sed -e '1,2d' $FILENAME | /bin/tr -d '\015' > $NEWFILENAME +# +# issue the product as appropriate +# +echo Sending product $NEWFILENAME to transferNWR as pending. >> $LOGFILE +/awips/fxa/bin/transferNWR -d $NEWFILENAME +RETURN_STATUS=$? + +if [ $RETURN_STATUS -eq 0 ] +then + echo Request successfully completed >> $LOGFILE +else + echo Error detected; return status= $RETURN_STATUS >> $LOGFILE +fi +# +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/print_image b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/print_image new file mode 100755 index 0000000000..be0cf0f06b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/print_image @@ -0,0 +1,130 @@ +#!/usr/bin/ksh +# +# print_image +# +# Bryon Lawrence September 26, 2001 OHD +# +# Russ Erb / Bryon Lawrence June 5, 2002 Modified to provide ability +# to print color images on +# from a HP workstation. +# +# Purpose: +# +# This script will capture an image on the screen and print it. +# It was designed to be called from a program such as timeseries +# or hydromap which provide the option of capturing an image +# on the screen and sending it to a printer. +# +# The commands that must be called to do this are different on the +# HP/UX and Linux operating systems. So this script has the logic +# built into it to determine which operating system it is being run +# on. +# +# The caller of this script must provide three arguments: the name of the +# window to be "captured" and printed, the print command followed +# by any print options, and a flag indicating whether or not to print +# the image in reverse color ( 0 = print normal, and 1 = print reverse ). +# +############################################################################### + +TEMP_DIR="/tmp" + +# +# Trap any malicious signals and make a sure the temporary file needed +# by the Linux operating system is cleaned up before the program +# terminates. +trap 'rm -f ; rm -f $TEMP_DIR/junk.gif; exit 1' 1 2 15 + +# Specify the device for xpr to use when formatting a X window screen dump +# file to be printed out as a black and white image. For HP only. +# Do a "man" on "xpr" to learn about the acceptable device options. +HP_BLACK_AND_WHITE_DEVICE="ps -gray 2" + +# Specify the device for xpr to use when formatting a X window screen dump +# file to be printed out as a color image. For HP only. +# Do a "man" on "xpr" to learn about the acceptable device options. +HP_COLOR_DEVICE="dj1200" + +# Specify the the option for xpr to use to format a X window screen dump +# file to be printed in reverse color. For HP only. +HP_REVERSE_PRINT_OPTION="-rv" + +# Test to make certain that the proper number of command line parameters +# have been passed into this script. +if [[ $# -ne 3 ]] +then + + print "\nThe attempt to print the image has failed." + print "An incorrect number of arguments have been passed to the" + print "print_image script. An argument specifying the name of" + print "the window to print, an argument specifiying the print" + print "command, and an argument specifying whether or not to print" + print "the image in "reverse" color must be supplied to this script.\n" + exit 1 + +fi + +# Assign the script arguments to the variables that correspond to them. +WINDOW_NAME=$1 +PRINTCOMMAND=$2 +REVERSE=$3 + +# Determine the operating system that this script is running on. +OPER_SYSTEM=`uname` + +# +# Depending upon the type of operating system being used, choose the +# correct command to capture the screen image and print it. +if [[ $OPER_SYSTEM = "Linux" ]] +then + + # This is the Linux sequence of commands. + rm -f $TEMP_DIR/junk.gif + import -window "$WINDOW_NAME" $TEMP_DIR/junk.gif + + # Does the user want to print in "reverse"? + if [[ $REVERSE -eq 1 ]] + then + + mogrify -negate $TEMP_DIR/junk.gif + + fi + + $PRINTCOMMAND $TEMP_DIR/junk.gif 2>&1 + rm -f $TEMP_DIR/junk.gif + +else + + # This is the HP-UX sequence of commands. + # Retrieve the token "whfs_print_color" which indicates + # whether or not the image should be printed in color. + PRINT_IN_COLOR=`/fs/awips/whfs/dev/get_apps_defaults$OS_SUFFIX whfs_print_color` + + if [[ $PRINT_IN_COLOR = "YES" ]] + then + + DEVICE=$HP_COLOR_DEVICE + + else + + DEVICE=$HP_BLACK_AND_WHITE_DEVICE + + fi + + if [[ $REVERSE -eq 1 ]] + then + + REVERSE_OPTION=$HP_REVERSE_PRINT_OPTION + + else + + REVERSE_OPTION="" + + fi + + xwd -name "$WINDOW_NAME" | xpr -cutoff 87.5 -device $DEVICE \ + $REVERSE_OPTION | $PRINTCOMMAND 2>&1 + +fi + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_geoarea b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_geoarea new file mode 100755 index 0000000000..37bbdb0a25 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_geoarea @@ -0,0 +1,385 @@ +#!/bin/ksh +# +# process_geoarea +# +# Bryon Lawrence May 15, 2002 OHD +# Moria Shebsovich Jul 30, 2003 OHD +# Bryon Lawrence Nov 14, 2003 OHD +# - Modified this script to delete and load +# LineSegs information for the boundary type +# being processed. Formerly, Hydrobase would +# delete ALL LineSegs data when importing areal data. +# It would load ALL lineSegs data when the user +# closed the Hydrobase Areal Data GUI. This script +# uses sqlcmd to delete information from +# the LineSegs database table. +# +# Bryon Lawrence Nov 19, 2003 OHD +# - Modified this script to delete the data from the +# GeoArea table. This functionality used to be +# in the Hydrobase in the import_geoarea routine. +# Process_geoarea is being setup to be standalone. +# That is, it should be able to handling all of the +# details of processing WHFS geodata files on its +# own. +# +# Bryon Lawrence January 7, 2004 OHD +# - Added the redirection of standard error to +# standard output for the calls to executables +# (unload_geoarea, load_geoarea, load_linesegs, +# convert_ascii_to_latlon, grid_to_area, and +# sqlcmd). +# +# Moria Shebsovich October 12, 2004 OHD +# - The script is modified to read geodata from the +# set of ascii files and write to the geoarea table. +# The unload functionality was eliminated, now +# ascii files are the master files, they should be +# edited as needed, and updated data loaded into +# the geoarea table. +# Mark Glaudemans February 3, 2005 +# Removed RESVRS from consideration in GeoArea, +# LineSegs loading +# +# This script is responsible for manipulating the geoarea data sets used +# to populate files and tables in the ihfs database. These data sets +# can then be used to plot graphical overlays in an application such as +# Hydromap. +# +# The script creates two types of binary files: +# 1) Geographic overlay files. +# 2) Navigation files which tell the user of Hydroview/MPE which county +# and basin the mouse pointer is currently over. +# +# This script provides the logic to load geodata to the +# geoarea table. When loading geoarea data into the database, it also +# executes a sequence of commands that updates the "grid_to_basin_hrap.[OS]" and +# "grid_to_county_hrap.[OS]" navigation files which provide cursor location +# information at a HRAP grid resolution for Hydroview/MPE. These are also +# referred to as the navigation files because they indicate to the user +# which basin and county the mouse pointer is currently in. +# +# The overlay and navigation files created are as follows. +# The binary files are created during load operations. +# +# Overlay Data File (load) Binary File +# ======= =============== ==================== +# Basins basins.dat basins_latlon.OS +# Counties counties.dat counties_latlon.OS +# Reservoirs resvrs.dat resvrs_latlon.OS +# Zones zones.dat zones_latlon.OS +# +# Navigation File Binary File +# =============== =========== +# Basin grid_to_basin_hrap.OS +# County grid_to_county_hrap.OS +# +# Usage: +# +# process_geoarea -l -d -t filename +# +# Where -l specifies that the data in will be loaded into the +# geoarea database table. +# -d specifies the name of the database that the geoarea table +# resides in. +# -t indicates the type of the GEOAREA data being loaded. +# Valid types: +# COUNTY, STATE, RESRVR, ZONE, BASIN +# +# "Filename" is the full path and name of the file containing the +# geoarea data. If the file is in the same directory as the +# this script is being run in, "./filename" can be used. +# +# All other options (-l, -d , -t, filename) must be supplied +# or the script will not run. +# +# Programs run from this script: +# Option combination: -ldt filename +# load_geoarea +# grid_to_area, which runs +# if type is "BASIN" or "COUNTY" only. +# +# Error Returns: +# +# This script will exit with a value of "0" upon successful completion. +# This script will exit with a value of "1" when an invalid combination +# of arguments has been passed to it. +# This script will exit with a value of "2" when a geoarea data filename +# has not been supplied to it. +# This script will exit with a value of "3" when an invalid geoarea +# boundary type has been passed to it. +# This script will exit with a value of "4" when rows from the LineSegs +# database table cannot be deleted. +# This script will exit with a value of "5" when rows from the GeoArea +# table cannot be deleted. +# +# Assumptions: +# In order for this script to work the following must be done first: +# 1) set_hydro_env must be sourced before this script is run. +# +# Log Files: +# There are two possible log files depending on the error return: +# Error returns 1, 2, 3: The log file will be process_geoarea.log +# Error returns 0, 4, 5: The log file will be process_geoarea_TYPE.log +# where TYPE is BASIN, COUNTY, RESRVR, or ZONE. +# +############################################################################### +# +# +# Function which describes the correct useage of this script. +useage () +{ + printf "Useage: process_geoarea -l -d(database name) -t(type) filename" + printf "\n where -l means to load the contents of the geoarea" + printf "\n table" + printf "\n where -d is the name of the database in which the" + printf "\n geoarea table resides" + printf "\n where -t is the type of the geoarea being processed:" + printf "\n COUNTY, STATE, RESRVR, ZONE, BASIN" + printf "\n where filename is the full path and name of the file" + printf "\n containing the ascii geoarea data.\n" + +} + +# +# Initialize the variables that will contain the command line options. +found=0 # Flag indicating whether or not a type is valid. +load=0 # Flag indicating that the "-l" option was specified. +db_found=0 # Flag indicating that the database name was found. +type_found=0 # Flag indicating that the geoarea type was found. +load_found=0 # Flag indicating that the load flag was supplied. + +valid_types="COUNTY STATE RESRVR ZONE BASIN" + +# +# Create the log directory. +LOGNAME=$WHFS_UTIL_LOG_DIR/process_geoarea.log +rm -f $LOGNAME + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` + +echo "=====================================" | tee -a $LOGNAME +echo "Starting process_geoarea on $date ..." | tee -a $LOGNAME +printf "Processing command line arguments.\n" | tee -a $LOGNAME + printf "Logging to $LOGNAME.\n" + + # Test the supplied options to make sure that they are valid. + while getopts d:t:l name 2>/dev/null + do + case $name in + + d) + # This is the database name. + dbname=$OPTARG + db_found=1 + ;; + + t) + # This is the geoarea type. + type=$OPTARG + type_found=1 + ;; + + l) + # This option specifies that the file be loaded. + load=1 + load_found=1 + ;; + + ?) + useage | tee -a $LOGNAME + exit 1 + ;; + esac +done + +if [ $load -eq 0 ] +then + + useage | tee -a $LOGNAME + exit 1 + +fi + +if [[ $db_found -eq 0 || $type_found -eq 0 ]] +then + + useage | tee -a $LOGNAME + exit 1 + +fi + +# +# Retrieve the filename. +if [[ $OPTIND -le $# ]] +then + + # Shift the parameters to dispose of the ones we do not need. + while [ $OPTIND -gt 1 ] + do + (( OPTIND = OPTIND - 1 )) + shift + done + + # Retrieve the filename. + filename=$1 + +else + + printf "Could not find the filename for the ascii geoarea data.\n" + useage | tee -a $LOGNAME + exit 2 +fi + +# Test to determine if the type is valid. +for i in $valid_types +do + + if [[ $type = $i ]] + then + found=1 + break + fi + +done + +if [ found -eq 0 ] +then + + printf "The type $type supplied via the \"-t\" option is invalid.\n" + useage | tee -a $LOGNAME + exit 3 + +fi + +# Build the name of the log file. This will include the boundary type +# being processed. +FINALNAME=$WHFS_UTIL_LOG_DIR/process_geoarea_$type.log +rm -f $FILENAME + +if [[ $load -eq 1 ]] +then + printf "Running process_geoarea to load $type data\n" | tee -a $LOGNAME + printf "from file $filename.\n" | tee -a $LOGNAME +fi + +if [ load -eq 1 ] +then + + # Delete the information from the GeoArea and LineSegs table + # for the boundary type being processed. + + if [ $type != "RESRVR" ] + then + delete_linesegs="DELETE FROM LineSegs\n \ + WHERE area_id IN (\n \ + SELECT area_id\n \ + FROM GeoArea\n \ + WHERE boundary_type='$type');\n" + + printf "Deleting LineSegs using query: $delete_linesegs\n" | \ + tee -a $LOGNAME + +# echo $delete_linesegs | \ +# $SQLCMD_BIN_DIR/sqlcmd -d $DB_NAME@$INFORMIXSERVER \ +# 2>&1 | tee -a $LOGNAME + + echo $delete_linesegs | $POSTGRESQLBINDIR/psql $DB_NAME 2>&1 | tee -a $LOGNAME + + if [ $? -ne 0 ] + then + printf "Could not delete rows corresponding to GeoArea type\n" | \ + tee -a $LOGNAME + printf "$type from the LineSegs database table.\n" | \ + tee -a $LOGNAME + mv $LOGNAME $FINALNAME + exit 4 + + fi + + delete_geoarea="DELETE FROM GeoArea\n \ + WHERE boundary_type='$type';" + + printf "Deleting GeoArea info using query: $delete_geoarea\n" | \ + tee -a $LOGNAME + +# echo $delete_geoarea | $SQLCMD_BIN_DIR/sqlcmd -d $DB_NAME@$INFORMIXSERVER |\ +# tee -a $LOGNAME + + echo $delete_geoarea | $POSTGRESQLBINDIR/psql $DB_NAME 2>&1 | tee -a $LOGNAME + + if [ $? -ne 0 ] + then + printf "Could not delete rows from the GeoArea table\n" | \ + tee -a $LOGNAME + printf "corresponding to boundary_type $type.\n" | \ + tee -a $LOGNAME + mv $LOGNAME $FINALNAME + exit 5 + + fi + + printf "Running $WHFS_BIN_DIR/load_geoarea$OS_SUFFIX -d$dbname\n" \ + | tee -a $LOGNAME + printf "-i$filename -t$type\n" | tee -a $LOGNAME + + $WHFS_BIN_DIR/load_geoarea$OS_SUFFIX -d"$dbname" -i"$filename" -t"$type" \ + 2>&1 | tee -a $LOGNAME + + + printf "Running $WHFS_BIN_DIR/load_linesegs$OS_SUFFIX -d"$dbname" -i"$filename"\n" \ + | tee -a $LOGNAME + printf "-t$type\n" | tee -a $LOGNAME + + $WHFS_BIN_DIR/load_linesegs$OS_SUFFIX -d"$dbname" -i"$filename" -t"$type" \ + 2>&1 | tee -a $LOGNAME + + fi + + + if [ $type = "BASIN" ] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" | \ + tee -a $LOGNAME + printf "$filename basins_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + basins_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + printf "Running $PPROC_BIN/grid_to_area$OS_SUFFIX -d$dbname\n" \ + | tee -a $LOGNAME + printf "-tBASIN grid_to_basin_hrap$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/grid_to_area$OS_SUFFIX -d"$dbname" -t"BASIN" \ + grid_to_basin_hrap$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [ $type = "COUNTY" ] + then + + printf "Running $PPROC_BIN/grid_to_area$OS_SUFFIX -d$dbname\n" \ + | tee -a $LOGNAME + printf "-tCOUNTY grid_to_county_hrap$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/grid_to_area$OS_SUFFIX -d"$dbname" -t"COUNTY" \ + grid_to_county_hrap$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [ $type = "RESRVR" ] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "-d$dbname -i$filename -t$type\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + resvrs_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + fi + +fi + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` +printf "Process_geoarea completed on $date\n" | tee -a $LOGNAME + +# Copy the running log file into the log file which contains, in its name, +# the geoarea boundary type that was processed during by the process_geoarea +# script. +mv $LOGNAME $FINALNAME + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_geoline b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_geoline new file mode 100755 index 0000000000..741d899c6d --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_geoline @@ -0,0 +1,238 @@ +#!/bin/ksh +# +# process_geoline +# +# Bryon Lawrence May 15, 2002 OHD +# Moria Shebsovich July 30, 2003 OHD +# Bryon Lawrence November 20, 2003 OHD +# - Added a log file, error diagnostics, and +# extra documentation. +# Bryon Lawrence January 7, 2004 OHD +# - Added redirection of standard error to standard +# output for the calls to executables (load_geoline, +# unload_geoline, convert_ascii_to_latlon, and +# sqlcmd). +# Moria Shebsovich October 18, 2004 OHD +# - The script is modified to read geodata from the +# set of ascii files and create binary files. +# The unload functionality was eliminated, +# GeoLine table does not exist any more +# in the database. Now ascii files are the master +# files, they should be edited as needed. +# +# This script is responsible for manipulating the geoline data sets. +# These data sets +# can then be used to plot graphical overlays on an application such as +# Hydromap. +# +# The script provides logic to create a set of binary files which can +# be then displayed as overlays in a graphical application such as +# Hydroview/MPE. +# +# The user has the option of modifying the geoline data to update the +# appearance of the geological data that it represents. It could be done by +# editing an ascii formatted file. +# The data can then be edited in a standard text +# editor or loaded into a geographical data editor such as Arcview. Once +# updated, the binary file must be created. +# +# The following files are created: +# +# Geoline overlay Data File Binary File +# =============== ========= =========== +# Highways hiways.dat hiways_latlon.OS +# Roads roads.dat roads_latlon.OS +# Rivers rivers.dat rivers_latlon.OS +# Streams streams.dat streams_latlon.OS +# +# Useage: +# +# process_geoline -t -n filename +# +# Where -t indicates the type of the geoline data. +# Valid types: +# ROAD STREAM +# -n indicates the geoline name options being used. +# Valid geoline names: +# RIVERS STREAMS HIWAYS ROADS +# +# All options (-t,-n, filename) must be +# supplied or this script will not run. +# +# Programs run from this script: +# convert_ascii_to_latlon +# +# Error Returns: +# This script will exit with a value of "0" upon successful completion. +# This script will exit with a value of "1" when an invalid combination +# of arguments has been passed to it. +# This script will exit with a value of "2" when it cannot find the +# filename containing the ascii data. +# This script will exit with a value of "3" when an invalid overlay +# type was passed into this routine. +# +# Assumptions: +# In order for this script to work the following must be true: +# 1) set_hydro_env must be sourced before this script is run. +# +# Log Files: +# Two log files may be created, depending on the error return: +# +# For error returns 1, 2, 3: The log file will be process_geoline.log +# For error return 0: The log file will be +# process_geoline_TYPE.log, where TYPE is the type of vector being +# processed, i.e. RIVERS, STREAMS, HIWAYS, or ROADS. +# +############################################################################### +# + +# +# Function which describes the correct useage of this script. +useage () +{ + printf "Useage: process_geoline -t(type)" + printf " -n(name_geoline) filename" + printf "\n where -t is the type of the geoline being processed:" + printf "\n ROAD STREAM" + printf "\n where -n is the geoline type name to distinguish" + printf "\n between rivers and streams geoline type names" + printf "\n where filename is the name of the file containing the" + printf "\n ascii geoline data.\n" +} + +# +# Initialize the variables that will contain the command line options. +found=0 +name_geoline_found=0 +type_found=0 + +valid_types="ROAD STREAM" + +# +# Create the log directory. +LOGNAME=$WHFS_UTIL_LOG_DIR/process_geoline.log +rm -f $LOGNAME + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` + +echo "=====================================" | tee -a $LOGNAME +echo "Starting process_geoline on $date ..." | tee -a $LOGNAME +printf "Processing command line arguments.\n" | tee -a $LOGNAME +printf "Logging to $LOGNAME.\n" + +# Test the supplied options to make sure that they are valid. +while getopts t:n: name 2>/dev/null +do + case $name in + + n) # This option specifies geoline names. + name_geoline=$OPTARG + name_geoline_found=1 + ;; + + t) + # This is the geoline type. + type=$OPTARG + type_found=1 + ;; + + ?) printf "I am in default case\n" + useage | tee -a $LOGNAME + exit 1 + ;; + esac + +done + +if [[ $OPTIND -le $# ]] +then + + # Shift the parameters to dispose of the ones we do not need. + while [ $OPTIND -gt 1 ] + do + (( OPTIND = OPTIND - 1 )) + shift + done + + # Retrieve the filename. + filename=$1 + +else + + printf "Could not find the filename for the ascii geoline data.\n" + useage | tee -a $LOGNAME + exit 2 + +fi + +# Test to determine if the type is valid. +for i in $valid_types +do + + if [[ $type = $i ]] + then + found=1 + break + fi + +done + +if [ found -eq 0 ] +then + + printf "The type $type supplied via the \"-t\" option is invalid.\n" \ + | tee -a $LOGNAME + useage | tee -a $LOGNAME + exit 3 + +fi + +FINALNAME=$WHFS_UTIL_LOG_DIR/process_geoline_$name_geoline.log +rm -f $FINALNAME + + + if [[ $type = "STREAM" && $name_geoline = "RIVERS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename rivers_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + rivers_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [[ $type = "STREAM" && $name_geoline = "STREAMS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename streams_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + streams_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [[ $type = "ROAD" && $name_geoline = "HIWAYS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename hiways_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + hiways_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [[ $type = "ROAD" && $name_geoline = "ROADS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename roads_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + roads_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + fi + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` +printf "Process_geoline completed on $date\n" | tee -a $LOGNAME + +# Copy the running log file to the log file which contains the name of the +# geoline vector in its title. +mv $LOGNAME $FINALNAME + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_hydro_model_data b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_hydro_model_data new file mode 100755 index 0000000000..9902e79197 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_hydro_model_data @@ -0,0 +1,55 @@ +#!/bin/ksh +# file name: process_hydro_model_data +# Created: 04/01/2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SSHP_INCOMING_DIR=$(get_apps_defaults sshp_incoming_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# setup the AWIPS environment +# +. $FXA_HOME/readenv.sh + +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 + +# use a shell function to extract the argument from the subject line +# the subject string is a quoted string with the a descriptive term, +# followed by a space, followed by the product identifier. +# +parseSubject() +{ +ORIGINAL_FILE_NAME=$1 +PRODUCTID=$2 +return +} +# +# get the product id from the subject +# +parseSubject $SUBJECT + +ORIGINAL_FILE_PATH=$SSHP_INCOMING_DIR/$ORIGINAL_FILE_NAME + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/process_hydro_model_data.log +TMPFILE=$SSHP_LOG_DIR/process_hydro_model_data.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +cp -f $FILENAME $ORIGINAL_FILE_PATH + +# used to remove the header and ^Ms from the transferred XML file +sed '1,2d' $ORIGINAL_FILE_PATH > $SSHP_INCOMING_DIR/temp.xml +cat $SSHP_INCOMING_DIR/temp.xml | tr -d '\015' > $ORIGINAL_FILE_PATH +rm -f $SSHP_INCOMING_DIR/temp.xml + +ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/run_SSHP_data_decode >$LOGFILE 2>>$LOGFILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_rpf_backup_msg b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_rpf_backup_msg new file mode 100755 index 0000000000..bbc03ad494 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_rpf_backup_msg @@ -0,0 +1,136 @@ +#!/bin/ksh +# +# process_rpf_backup_msg +# +# version: July 6, 2006 +# +# This script handles the receipt of externally generated messages +# containing product issuance data used to support service backup operations. +# It is invoked via the message handling service (MHS) mechanisms and +# is called when the rpf_sendbackup operation, which is invoked from +# RiverPro, is executed. This occurs in two cases: +# 1) When RiverPro issues a product, a messages are sent to the offices +# providing backup. For each forecast point included in the product, +# its info is sent to its primary and secondary backup sites. The info +# consists of entries for the VTECevent, FpPrevProd, and TextProduct tables. +# There is also entry made to PurgeProduct table to ensure no unlimited +# number of products for a product id in the TextProduct table. +# 2) When a site providing backup services no longer needs to provide +# the services since the office is backed up has returned to its +# operational status. This is referred to as a restoration of service. +# In this case, the messages are sent to the offices formerly +# receiving backup services. +# +# The script calls the load_rpf_backup_msg to do the real work, +# since it must use postgres which is not available on the DS +# machine upon which the MHS operates and calls this script. +# +# Usage: +# process_rpf_backup_msg filename subject_string msgtype +# +# The arguments are provided via the mhs receive process and are +# translated from the mhs args %ENCLOSE(1) %SUBJECT %MSGTYPE args. +# +# MHS places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# + +# set up SOME environment variables for WHFS applications + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# +# assign the args to local variables +# + +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 + +# +# parse out info from the command line +# + +parseSubject() +{ + PRODUCTID=$1 + PACKEDTIME=$2 + WFO_SOURCE=$3 + return +} + +# +# get the product id from the subject, which is needed when loading the data +# + +parseSubject $SUBJECT + +# +# define the log file names. +# write to a temp log file, then concatenate to the +# daily log file later. +# + +DATESTR=`date -u +%Y%m%d` +LOGFILE=$RPF_LOG_DIR/process_backup_$PACKEDTIME.log.from$WFO_SOURCE + +LOGFILE_DAILY=$RPF_LOG_DIR/process_backup.log.$DATESTR + +# +# the first write to the log file, specific to the sender, overwrites +# any existing info. at the end of the script, the session log file is then +# concatenated to the daily log file. +# +Dte=`date -u` + +echo "-----------------------------" > $LOGFILE +echo Starting process_rpf_backup_msg at $Dte >> $LOGFILE +echo File: $FILENAME >> $LOGFILE +echo Subject: $SUBJECT >> $LOGFILE +echo Msgtype: $MSGTYPE >> $LOGFILE +echo ProductId, PackedTime: $PRODUCTID $PACKEDTIME >> $LOGFILE +echo WFOsource: $WFO_SOURCE >> $LOGFILE + +# +# use ssh to execute the postgres-dependent script on a +# separate system which can access postgres. +# only the dynamic info is passed to the script. +# the logfile name must be consistent between the scripts. +# + +echo Copying file to product directory >> $LOGFILE +LOADFILENAME=$WHFS_PRODUCT_DIR/$PRODUCTID.$PACKEDTIME.raw$WFO_SOURCE +/bin/cp $FILENAME $LOADFILENAME + +Dte=`date -u` +echo ssh execution of load_rpf_backup_msg on $SSHP_JAVA_PROCESS_HOST at $Dte >> $LOGFILE + +ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/load_rpf_backup_msg $LOADFILENAME $PRODUCTID $PACKEDTIME $WFO_SOURCE + +# +# copy the product specific log info to the daily log file +# + +Dte=`date -u` +echo ssh call completed at $Dte >> $LOGFILE + +/bin/cat $LOGFILE >> $LOGFILE_DAILY + +if [ -s $LOGFILE ] +then + rm -f $LOGFILE +fi + +return 0 + +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_shef_msg b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_shef_msg new file mode 100755 index 0000000000..9c933f1e3a --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/process_shef_msg @@ -0,0 +1,123 @@ +#!/bin/ksh +# process_shef_msg +# +# version: April 12, 2000 for Bld 5.0 +# +# usage: process_shef_msg filename subject_string msgtype +# +# where the arguments are provided via the mhs receive process +# and are translated from the mhs args %ENCLOSE(1) %SUBJECT %MSGTYPE +# +# This script is invoked via the message handling service (MHS) mechanisms. +# It is called when a shef-encoded product file from a remote (i.e. nonlocal) +# office is received at the local WFO. This script copies the file to the +# local directory used as input to the shefdecode application. +# +# mhs places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# this script copies the file into the directory: +# /data/fxa/ispan/hydro +# if archiving is enabled, this script also copies the file into the directory: +# /data/fxa/ispan/hydro_adbs/ +# + + +# define the following via environment variables: +# WHFS_UTIL_LOG_DIR +# WHFS_PRODUCT_DIR +# WHFS_BIN_DIR + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export ARCHIVE_ENABLE=$(get_apps_defaults archive_enable) +export ARCHIVE_SHEFDATA_DIR=$(get_apps_defaults archive_shefdata_dir) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# +# +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 +# +LOGFILE=$WHFS_UTIL_LOG_DIR/process_shef_msg.log +TMPFILE=$WHFS_UTIL_LOG_DIR/process_shef_msg.tmp +# +# +# save only the latest events in the log file +# +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE +# +# +# log this event +# +Dte=`date -u` +echo "----" >> $LOGFILE +echo Processing file: $FILENAME at $Dte >> $LOGFILE +echo Subject: $SUBJECT Msgtype: $MSGTYPE >> $LOGFILE +# +# +# setup the AWIPS environment +# +. $FXA_HOME/readenv.sh +# +# +# use a shell function to extract the argument from the subject line +# the subject string is a quoted string with the a descriptive term, +# followed by a space, followed by the product identifier. +# +parseSubject() +{ +DESCRIP=$1 +PRODUCTID=$2 +return +} +# +# get the product id from the subject +# +parseSubject $SUBJECT +# +# +# define the current date time info. use MPER to avoid SCCS conflict. +# use this info to define the new file name +# +MPER="%M" +DATESTR=`date -u +%m%d` +TIMESTR=`date -u +%H$MPER%S` +COPYNAME=$WHFS_PRODUCT_DIR/$PRODUCTID.$DATESTR.$TIMESTR +# +# +# strip off extra carriage returns added by message handling by sender +# +cat $FILENAME | /bin/tr -d '\015' > $COPYNAME +# +# send a copy of the product to the text database +# after determining the equivalent AFOS id required by textdb +# +AFOSID=`$WHFS_BIN_DIR/awips2afos.ksh $PRODUCTID` +echo Writing $COPYNAME to textdb as $AFOSID >> $LOGFILE +/awips/fxa/bin/textdb -w $AFOSID < $COPYNAME >> $LOGFILE 2>&1 +# +# +# copy the file into the RFC archive directory if archiving is enabled +# +if [ "$ARCHIVE_ENABLE" = "ON" ] +then + echo Copying $COPYNAME to RFC archive input directory >> $LOGFILE + cp -f $COPYNAME $ARCHIVE_SHEFDATA_DIR >> $LOGFILE 2>&1 +fi +# +# +# move the file to the shef input directory. +# +echo Moving $COPYNAME to input shef directory >> $LOGFILE +mv -f $COPYNAME /data/fxa/ispan/hydro >> $LOGFILE 2>&1 +# +# +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/purge_files b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/purge_files new file mode 100755 index 0000000000..291e1dc3cb --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/purge_files @@ -0,0 +1,222 @@ +#! /bin/ksh +# purge_files +# +# This script purges WHFS UNIX files +# revised: 10/24/2001 +# revised: 05/29/2002 - added purging of GAFF_MOSAIC_DIR +# revised: 08/15/2002 - added purging of DPA_ARCH_DIR +# revised: 09/12/2003 - replaced wc | cut -f 1 d " " with wc -l (6 places) +# - latter version works on both HP and Linux +# - former version does not work on Linux +# revised: 02/18/2004 - removed delete of stage2 log files +# revised: 08/06/2004 - Added the purging of the GAGE_PP_LOG directory. +# revised: 12/29/2004 - Added the purging of the VACUUM_LOG_DIR dir. +# - Removed purge of siipp logs +# revised: 8/19/2005 - Added purge of metar_input dir. +# - removed purge of vacuum logs +# (vacuum now done via postgres cron and log files +# purged with scour) +# revised: 9/7/2006 - added purge of gage pp input directory +# +# revised: 5/9/2007 - commented out purge from DAILY_QC_LOG dir +# - added "-type f" to all find commands +# revised 1/15/08 - added purging of PrecipMonitor log files by changing RiverMonitor.* to +# *Monitor.* +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export GAGE_PP_DATA=$(get_apps_defaults gage_pp_data) +export GAGE_PP_LOG=$(get_apps_defaults gage_pp_log) +export SSHP_INGEST_XML_DIR=$(get_apps_defaults sshp_ingest_xml_dir) +export SSHP_OFS_EXTRACT_XML_DIR=$(get_apps_defaults sshp_ofs_extract_xml_dir) +export SSHP_OFS_EXTRACT_TEXT_DIR=$(get_apps_defaults sshp_ofs_extract_text_dir) +export GAFF_MOSAIC_DIR=$(get_apps_defaults gaff_mosaic_dir) +export DPA_ARCH_DIR=$(get_apps_defaults dpa_arch_dir) +export DPA_ERROR_DIR=$(get_apps_defaults dpa_error_dir) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) +export SHEF_ERROR_DIR=$(get_apps_defaults shef_error_dir) +export SHEFDECODE_LOG=$(get_apps_defaults shefdecode_log) +export QCALARM_LOG_DIR=$(get_apps_defaults qcalarm_log_dir) +export FLOODSEQ_LOG_DIR=$(get_apps_defaults floodseq_log_dir) +export DB_PURGE_LOG_DIR=$(get_apps_defaults db_purge_log_dir) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export OBSFCSTMONITOR_LOG_DIR=$(get_apps_defaults obsfcstmonitor_log_dir) +export RIVERMON_LOG_DIR=$(get_apps_defaults rivermon_log_dir) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export METAR_LOG_DIR=$(get_apps_defaults metar_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) + + +Dte=`date -u` + +# Setup file names +# +fnm=$WHFS_UTIL_LOG_DIR/purge_files.log +tmp=$WHFS_UTIL_LOG_DIR/purge_files.tmp + +echo `basename $0` log location: $fnm + +if [ -e "${fnm}" ] +then + tail -1200 $fnm > $tmp + mv $tmp $fnm +fi + +# Log a header line to the output file +# +echo "----------------------------------------------------" >> $fnm +echo "Begin purge_files at: " $Dte >> $fnm + + +# Purge SHEF Decoder product log files older than 1 day +# +echo " Purging SHEF Decoder product log files..." >> $fnm +Num=`ls $SHEF_ERROR_DIR | wc -l` +echo " Number of files before purge: " $Num >> $fnm +find $SHEF_ERROR_DIR -name '*.*.*' -type f -mtime +0 -print | xargs rm -f >> $fnm +Num=`ls $SHEF_ERROR_DIR | wc -l` +echo " Number of files after purge: " $Num >> $fnm + + +# Purge SHEF Decoder daily log files older than 2 days +# +echo " Purging SHEF Decoder daily log files..." >> $fnm +find $SHEFDECODE_LOG -name 'shef_decode_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge Gage PP daily log files older than 2 days +# +echo " Purging Gage Precipitation Processor daily log files..." >> $fnm +find $GAGE_PP_LOG -name 'gage_pp_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge obsfcst monitor daily log files older than 2 days +# +echo " Purging ObsFcst Monitor daily log files..." >> $fnm +find $OBSFCSTMONITOR_LOG_DIR -name 'obsfcst_monitor_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge river monitor daily log files older than 2 days +# +echo " Purging RiverMonitor and PrecipMonitor daily log files..." >> $fnm +find $RIVERMON_LOG_DIR -name '*Monitor.*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge build hourly daily log files older than 2 days +# +echo " Purging build hourly daily log files..." >> $fnm +find $GAGE_PP_LOG -name 'build_hourly_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge any undecoded metar input file. They would only be there +# if the decoder fails to run normally. +# This directory is hardcoded here as it is not centrally defined; +# it is expected to have the below value, as defined in the file: +# ${apps_dir}/whfs/local/data/app/metar2shef/metar.cfg +# +echo " Purging undecoded metar input files..." >> $fnm +echo " If any files are purged, check metar2shef processing..." >> $fnm +METAR_INPUT_DIR=${apps_dir}/whfs/local/data/metar_input +find $METAR_INPUT_DIR -name '*[A-Z]*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge undecodable DPA files older than 1 day +# +echo " Purging undecodable DPA files..." >> $fnm +find $DPA_ERROR_DIR -name '*[A-Z]*' -type f -mtime +0 -print | xargs rm -f >> $fnm + + +# Purge DPA Decoder daily log files older than 2 days +# +echo " Purging DPA Decoder daily log files..." >> $fnm +find $DPA_LOG_DIR -name 'process_dpa_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + + +# Purge DPA Archive files older than 1 day +# +echo " Purging DPA Archive files..." >> $fnm +find $DPA_ARCH_DIR -name '*[A-Z]*' -type f -mtime +0 -print | xargs rm -f >> $fnm + + +# Purge METAR-to-SHEF Translator log files older than 1 day +# +echo " Purging METAR-to-SHEF Translator log files..." >> $fnm +Num=`ls $METAR_LOG_DIR | wc -l` +echo " Number of files before purge: " $Num >> $fnm +find $METAR_LOG_DIR -type f \! -name '*.log' -type f -mtime +0 -print | xargs rm -f >> $fnm +Num=`ls $METAR_LOG_DIR | wc -l` +echo " Number of files after purge: " $Num >> $fnm + + +# Purge QC/Alert/Alarm log files older than 1 day +# +echo " Purging QC/Alert/Alarm log files..." >> $fnm +find $QCALARM_LOG_DIR -name '*.*.*' -type f -mtime +0 -print | xargs rm -f >> $fnm + + +# Purge db_purge log files older than 4 days +# +echo " Purging db_purge log files..." >> $fnm +find $DB_PURGE_LOG_DIR -name '*.*.*' -type f -mtime +3 -print | xargs rm -f >> $fnm + +# Purge FloodSeq log files older than 2 days +# +echo " Purging FloodSeq log files..." >> $fnm +find $FLOODSEQ_LOG_DIR -name '*.*.*' -type f -mtime +1 -print | xargs rm -f >> $fnm + + +# Purge RiverPro log files older than 2 days +# +echo " Purging RiverPro log files..." >> $fnm +find $RPF_LOG_DIR -name '*.log.*' -type f -mtime +1 -print | xargs rm -f >> $fnm + + +# Purge RiverPro, SHEF Encoder, and Alarm output product files older than 2 days +# +echo " Purging RiverPro, SHEF Encoder, and Alarm output product files..." >> $fnm +Num=`ls $WHFS_PRODUCT_DIR | wc -l` +echo " Number of files before purge: " $Num >> $fnm +find $WHFS_PRODUCT_DIR -name '*.*' -type f -mtime +1 -print | xargs rm -f >> $fnm +Num=`ls $WHFS_PRODUCT_DIR | wc -l` +echo " Number of files after purge: " $Num >> $fnm + + +# Purge DailyQC logs older than 1 day +#DAILY_QC_LOG_DIR=/fs/hseb/ob7/wfo_rfc/precip_proc/local/data/log/daily_qc +#echo "Purging DailyQC logs older than 1 day..." >> $fnm +#find $DAILY_QC_LOG_DIR -name '*.*' -type f -mtime +1 -print | xargs rm -f >> $fnm +#Num=`ls $DAILY_QC_LOG_DIR | wc -l` +#echo " Number of files after purge: " $Num >> $fnm + + +# Purge GAFF mosaic ffg files older than 3 days +# +echo " Purging GAFF mosaic ffg files..." >> $fnm +find $GAFF_MOSAIC_DIR -name '*.ffg' -type f -mtime +2 -print | xargs rm -f >> $fnm + +# Purge GAFF log files older than 3 days +# +echo " Purging GAFF log files..." >> $fnm +find $DPA_LOG_DIR -name 'gen_areal_ffg_log_*' -type f -mtime +2 -print | xargs rm -f >> $fnm + +# Purge SSHP OFS extract text files older than 15 days +echo " Purging SSHP OFS extract text files..." >> $fnm +find $SSHP_OFS_EXTRACT_TEXT_DIR -name '*.txt' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge SSHP OFS extract text log files older than 15 days +echo " Purging SSHP OFS extract text log files..." >> $fnm +find $SSHP_OFS_EXTRACT_TEXT_DIR -name '*.log' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge SSHP OFS extract xml files older than 15 days +echo " Purging SSHP OFS extract XML files..." >> $fnm +find $SSHP_OFS_EXTRACT_XML_DIR -name '*.xml' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge SSHP ingest XML files older than 15 days +echo " Purging SSHP ingest XML files..." >> $fnm +find $SSHP_INGEST_XML_DIR -name '*.xml' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge the GagePP input directory of files older than 2 days. +echo " Purging GagePP input files..." >> $fnm +find $GAGE_PP_DATA -name '*[A-Z0-9]*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +Dte=`date -u` +echo "End purge_files at: " $Dte >> $fnm + diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rax_apps.jar b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rax_apps.jar new file mode 100755 index 0000000000..a4bc218d47 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rax_apps.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rpf_sendbackup b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rpf_sendbackup new file mode 100755 index 0000000000..e4aa02abcd --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rpf_sendbackup @@ -0,0 +1,260 @@ +#!/bin/ksh +# +# rpf_sendbackup +# +# version: July 06, 2006 +# +# This script is used to send RiverPro product issuance info +# to other offices so that they can have the data to support RiverPro +# product issuances in the event that they need to provide service +# backup for the source office. This is normally executed from RiverPro. +# This script is called under two circumstances: +# 1) It is called when issuing a product. It is called once for each +# office to which is should send data to; so for a given Riverpro +# product which may include forecast points with differing backup +# office assignment, this script will be called more than once. +# 2) A site performing backup service for an office can send the info +# for any product it issued for that office back to the backed-up +# office after that has is restored to service level +# +# It dumps info for the given product_id/time from the tables +# VTECevent, FpPrevProd, TextProduct, and only rows for the forecast points +# which have a service backup relationship with the given destination +# office. It packages this info and then sends it to the destination. +# +# +# Usage: +# rpf_sendbackup product_id product_time wfo_source wfo_destination +# +# where: +# product_id - is the official identifier for the product, whether +# it be the 10-character WMO id or the 9-character CRS id +# product_time - yyyy-mm-dd hh:mm:ss +# wfo_source - office identifier sending data from +# wfo_destination - office identifier to send data to +# +# +#-------------------------------------------------------------------- +# +# Log file discussion: +# +# when sending files to remote WFOs, the distributeProduct script is +# used. it returns 0 for success, -1 for error. its log files are in: +# +# ds1-xxx:/data/logs/fxa/yymmdd/dis* (where yymmdd is the date info). +# +# if not there, try looking on local workstation in: +# ws#-xxx:/data/logs/fxa/display/ws#-xxx:0.0/yymmdd +# +# distributeProduct uses the msg_send program to actually send the +# message across the WAN. its log files for msg_send can be found in: +# +# /awips/ops/logs/ds1-xxx, the filenames are either +# msgreq_svr.log for sending and +# msgrcv_svr.log for receiving. +# +# Note that the locations given above are dependent upon instructions +# given in scripts outside of the WHFS control and are subject to change. +# +#-------------------------------------------------------------------- +# +# set up SOME environment variables for WHFS applications +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# Initialize the status to bad +# + +RETURN_STATUS=1 + +# +# define the log file name, use the same log that is used for local +# riverpro issuances. + +DATESTR=`date -u +%Y%m%d` +LOGNAME=$RPF_LOG_DIR/rpf_issue.log.$DATESTR + +# +# Load the arguments into local variables + +PRODUCT_ID=$1 +PRODUCT_TIME=$2 +WFO_SOURCE=$3 +WFO_DESTINATION=$4 + +# +# log the initial info +# + +print "**************" +print Sending backup info for $PRODUCT_ID $PRODUCT_TIME from $WFO_SOURCE to $WFO_DESTINATION + +echo ">>>>>>>>>>>> " >> $LOGNAME +Dte=`date -u` +echo Invoking rpf_sendbackup at: $Dte >> $LOGNAME +echo Sending backup info for $PRODUCT_ID $PRODUCT_TIME from $WFO_SOURCE to $WFO_DESTINATION >> $LOGNAME + +# +# check that the source and the destination are not the same +# + +if [[ $WFO_SOURCE = $WFO_DESTINATION ]] +then + print Source and destination are identical. Send aborted. + echo Source and destination are identical. Send aborted. >> $LOGNAME + return $RETURN_STATUS +fi + +# +# define the input file which contains the dynamic SQL commands +# the check for an hsa is needed for the special case of the +# restoration of service backup information. +# + +SQL_INPUT_FILE=$WHFS_PRODUCT_DIR/rpf_sendbackup_sql.$WFO_DESTINATION + +echo "Write SQL commands to " $SQL_INPUT_FILE >> $LOGNAME + +if [ -f $SQL_INPUT_FILE ] +then + rm -f $SQL_INPUT_FILE +fi + +echo "SELECT * INTO TEMP vtecevent_temp FROM VTECevent \ +WHERE producttime='"$PRODUCT_TIME"' AND geoid IN \ +(SELECT lid FROM FpInfo WHERE hsa='"$WFO_DESTINATION"' OR \ +primary_back='"$WFO_DESTINATION"' OR \ +secondary_back='"$WFO_DESTINATION"');" > $SQL_INPUT_FILE + +echo "\COPY vtecevent_temp TO vtecevent_temp.output USING DELIMITERS '|' \ +WITH NULL as ''" >> $SQL_INPUT_FILE + + +echo "SELECT * INTO TEMP fpprevprod_temp from FpPrevProd WHERE \ +producttime='"$PRODUCT_TIME"' AND lid IN (SELECT lid FROM FpInfo \ +WHERE hsa='"$WFO_DESTINATION"' OR primary_back='"$WFO_DESTINATION"' OR \ +secondary_back='"$WFO_DESTINATION"');" >> $SQL_INPUT_FILE + +echo "\COPY fpprevprod_temp to fpprevprod_temp.output USING DELIMITERS '|' \ +WITH NULL as ''" >> $SQL_INPUT_FILE + + +echo "SELECT * INTO TEMP textproduct_temp FROM TextProduct WHERE \ +product_id='"$PRODUCT_ID"' AND producttime='"$PRODUCT_TIME"';" >> $SQL_INPUT_FILE + +echo "\COPY textproduct_temp TO textproduct_temp.output USING DELIMITERS '|' \ +WITH NULL as ''" >> $SQL_INPUT_FILE + +# +# define the output data file names +# the product time is expected to be passed in with +# the format YYYY-MM-DD HH:MM:SS + +VTECEVENT_FILE=$WHFS_PRODUCT_DIR/VTECevent.$WFO_DESTINATION.unload +FPPREVPROD_FILE=$WHFS_PRODUCT_DIR/FpPrevProd.$WFO_DESTINATION.unload +TEXTPRODUCT_FILE=$WHFS_PRODUCT_DIR/TextProduct.$WFO_DESTINATION.unload + +PACKED_TIME=`echo $PRODUCT_TIME | cut -c1-4,6-7,9-10,12-13,15-16,18-19` + +MHS_FILE=$WHFS_PRODUCT_DIR/$PRODUCT_ID.$PACKED_TIME.to$WFO_DESTINATION + +print MHS transmit file $MHS_FILE +echo MHS transmit file $MHS_FILE >> $LOGNAME + +# +# extract the necessary data from the database. +# note that for a site providing backup, RiverPro will not invoke this +# script to have info sent back to the out-of-operation host office. +# this info needs to be sent by invoking the restoration button in the gui. +# this may be changed in the future with a change to RiverPro. +# + +print $POSTGRESQLBINDIR/psql -d $DB_NAME -f $SQL_INPUT_FILE +echo $POSTGRESQLBINDIR/psql -d $DB_NAME -f $SQL_INPUT_FILE >> $LOGNAME + +$POSTGRESQLBINDIR/psql -d $DB_NAME -f $SQL_INPUT_FILE >> $LOGNAME 2>&1 + +# +# move the temporary files to the three files in product directory +# + +echo Move vtecevent_temp.output to $VTECEVENT_FILE >> $LOGNAME +echo Move fpprevprod_temp.output to $FPPREVPROD_FILE >> $LOGNAME +echo Move textproduct_temp.output to $TEXTPRODUCT_FILE >> $LOGNAME +print Move three temporary files to product directory and rename + +if [ -f vtecevent_temp.output ] +then + mv vtecevent_temp.output $VTECEVENT_FILE +else + echo vtecevent_temp.output can not be found. +fi + +if [ -f fpprevprod_temp.output ] +then + mv fpprevprod_temp.output $FPPREVPROD_FILE +else + echo fpprevprod_temp.output can not be found. +fi + +if [ -f textproduct_temp.output ] +then + mv textproduct_temp.output $TEXTPRODUCT_FILE +else + echo textproduct_temp.output can not be found. +fi + +# +# concatenate the 3 data sets into one file. +# the header lines preceding each data set are set specifically +# to match the header lines searched for by the receive +# script which later processes this data +# + +echo "table:vtecevent" > $MHS_FILE +cat $VTECEVENT_FILE >> $MHS_FILE +echo "table:fpprevprod" >> $MHS_FILE +cat $FPPREVPROD_FILE >> $MHS_FILE +echo "table:textproduct" >> $MHS_FILE +cat $TEXTPRODUCT_FILE >> $MHS_FILE + +# +# prepare the environment for the actions to come +# + +. $FXA_HOME/readenv.sh >> $LOGNAME 2>&1 + +# +# send the data set +# the subject line content is specifically recognized by the receive script +# + +SUBJECT="$PRODUCT_ID $PACKED_TIME $WFO_SOURCE" + +print Using distributeProduct with subject $SUBJECT +echo Using distributeProduct with subject $SUBJECT >> $LOGNAME + +/awips/fxa/bin/distributeProduct -c RIVPROD_BACKUP -a $WFO_DESTINATION -s "$SUBJECT" $PRODUCT_ID $MHS_FILE >> $LOGNAME 2>>$LOGNAME +RETURN_STATUS=$? + +if [ $RETURN_STATUS -eq 0 ] +then + echo Send backup info request success >> $LOGNAME + print Send backup info request success + +else + echo Send backup info request failed status= $RETURN_STATUS >> $LOGNAME + print Send backup info request failed status= $RETURN_STATUS +fi + +# + +return $RETURN_STATUS +# diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rpf_sendbackup_latest b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rpf_sendbackup_latest new file mode 100755 index 0000000000..ffcdf562b9 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/rpf_sendbackup_latest @@ -0,0 +1,193 @@ +#!/bin/ksh +# +# rpf_sendbackup_latest +# +# version: August 25, 2006 +# +# This script is used to send the latest RiverPro product issuance info +# to other offices if for some abnormal reason the info was not sent +# previously using routine operations. +# +# It will only send info for products/events which have a phenom=FL and +# a signif=W,A,Y, and which are for host office +# +# + +#-------------------------------------------------------------------- +# +# set up SOME environment variables for WHFS applications +# +. /awips/hydroapps/set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_LOCAL_BIN_DIR=$(get_apps_defaults whfs_local_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# Initialize the status to bad +# + +RETURN_STATUS=1 + +# +# define the log file name. + +DATESTR=`date -u +%Y%m%d` +LOGNAME=$RPF_LOG_DIR/rpf_send_backup_latest.log.$DATESTR + +# +# log the initial info +# + +echo ">>>>>>>>>>>> " >> $LOGNAME +Dte=`date -u` +echo Invoking rpf_sendbackup_latest at: $Dte >> $LOGNAME + +# +# ----------------------------------------------------- +# define a function that can be used repeatedly for each +# of the VTEC signif codes being processed +# + +invoke_backup_script() +{ + +# check if data exist + + NUM_EVENT=$( + echo "SELECT COUNT(*) FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00';" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + if [ $NUM_EVENT -eq 0 ] + then + print No records found for signif=$signif + echo "No records found for signif=$signif" >> $LOGNAME + return + elif [ -z "$NUM_EVENT" ] + then + print The number of events is undetermined + echo The number of events is undetermined >> $LOGNAME + return + fi + + echo There are $NUM_EVENT events in VTECevent table with signif as $signif >> $LOGNAME + +# +# load the rpf_sendbackup arguments into local variables +# + + PRODUCT_ID=$( + echo "SELECT product_id FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + PRODUCT_TIME=$( + echo "SELECT producttime FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + WFO_SOURCE=$( + echo "SELECT office_id FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +# print information + + echo For signif as $signif >> $LOGNAME + echo PRODUCT_ID:$PRODUCT_ID, PRODUCT_TIME:$PRODUCT_TIME, WFO_SOURCE:$WFO_SOURCE >> $LOGNAME + +# +# find the two office destinations for the forecast point +# + + WFO_DESTINATION1=$( + echo "SELECT primary_back FROM rpffcstpoint WHERE lid= \ + (SELECT geoid FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1) \ + ORDER BY 1 DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + WFO_DESTINATION2=$( + echo "SELECT secondary_back FROM rpffcstpoint WHERE lid= \ + (SELECT geoid FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1) \ + ORDER BY 1 ASC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + +# +# invoke backup send for each defined destination +# + + print Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION1 + echo Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION1 >> $LOGNAME + + $WHFS_LOCAL_BIN_DIR/rpf_sendbackup $PRODUCT_ID $PRODUCT_TIME $WFO_SOURCE $WFO_DESTINATION1 + + RETURN_STATUS=$? + + if [ $RETURN_STATUS -eq 0 ] + then + print Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION1 + echo Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION1 >> $LOGNAME + else + print Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION1 + echo Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION1 >> $LOGNAME + fi + + print Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION2 + echo Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION2 >> $LOGNAME + + $WHFS_LOCAL_BIN_DIR/rpf_sendbackup $PRODUCT_ID $PRODUCT_TIME $WFO_SOURCE $WFO_DESTINATION2 + + RETURN_STATUS=$? + + if [ $RETURN_STATUS -eq 0 ] + then + print Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION2 + echo Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION2 >> $LOGNAME + else + print Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION2 + echo Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION2 >> $LOGNAME + fi + + return $RETURN_STATUS +} + +# end of embedded function +# ---------------------------------------------------------- + +# +# +# select FL.W, FL.A, FL.Y products with highest etn +# +for signif in W A Y +do + print Send latest backup product with hightest etn and signif code as $signif + echo "Send latest backup product with hightest etn and signif code as $signif" >> $LOGNAME + invoke_backup_script +done + +Dte=`date -u` +echo Completed rpf_sendbackup_latest at: $Dte >> $LOGNAME + + + diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_ColorChooserDialog b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_ColorChooserDialog new file mode 100755 index 0000000000..b6b08da8dd --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_ColorChooserDialog @@ -0,0 +1,44 @@ +#!/bin/ksh +# file name: run_ColorChooserDialog +# Created: 07/12/2007 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_LOCAL_DATA_DIR=$(get_apps_defaults whfs_local_data_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# need to add a path to the jar file for this application +export CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/MiscDialogs.jar:$DB_DRIVER_PATH + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +Dte=`date +%m%d%Y` + +LOG_FILE=$WHFS_LOCAL_DATA_DIR/log/color_scale/ColorChooserDialog_$Dte.log +TMPLOGFILE=$WHFS_LOCAL_DATA_DIR/log/color_scale/ColorChooserDialog.tmp + +tail -1200 $LOG_FILE > $TMPLOGFILE +mv $TMPLOGFILE $LOG_FILE + +if [ $# -ne 3 ] +then + echo "run_ColorChooserDialog " + exit 1 +else + APPLICATION_NAME=$1 + LOGIN_ID=`whoami` + DEFAULT_COLOR_SCALE_FILE=$2 + RGB_COLOR_FILE=$3 +fi + +######################################################################## + +# set up an X Terminal window to write stdout and run the ColorChooser Dialog +# application using java +xterm -T ColorChooserDialog -iconic -n ColorChooserDialog -e $JBINDIR/java ohd.hseb.color_chooser.ColorChooserDialog $JDBCURL $LOG_FILE $APPLICATION_NAME $LOGIN_ID $DEFAULT_COLOR_SCALE_FILE $RGB_COLOR_FILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_MAP_preprocess b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_MAP_preprocess new file mode 100755 index 0000000000..d64a098766 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_MAP_preprocess @@ -0,0 +1,39 @@ +#!/bin/ksh +# file name: run_MapPreprocessor +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=. +CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$JAVA_HOME/bin + +# Trims, but keeps the last 12000 lines of the internal, java-created log file +tail -12000 $SSHP_LOG_DIR/MAPPreprocessor.log > $SSHP_LOG_DIR/MAPPreprocessor.log.tmp +mv $SSHP_LOG_DIR/MAPPreprocessor.log.tmp $SSHP_LOG_DIR/MAPPreprocessor.log + +# Trims, but keeps the last 12000 lines of the stdout and stderr log file +export LOGFILE=$SSHP_LOG_DIR/MAPPreprocessor.stdout2.log +export TMPFILE=$SSHP_LOG_DIR/MAPPreprocessor.stdout2.tmp +tail -12000 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +# run the MAPPreprocessor +$JBINDIR/java ohd.hseb.sshp.precip.MAPPreprocessor $JDBCURL $SSHP_LOG_DIR >>$LOGFILE 2>&1 + + + diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_SAC_state_update b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_SAC_state_update new file mode 100755 index 0000000000..fa3de4cbc5 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_SAC_state_update @@ -0,0 +1,61 @@ +#!/bin/ksh +# file name: run_SSHP_SAC_state_update +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=. +CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +export WHFS_LOCAL_DATA_SSHP_DIR=$WHFS_BIN_DIR/../local/data/app/sshp + + +EXPIRATION_HOURS=$(get_apps_defaults sshp_sac_update_expiration_hours) +if [ -z "$EXPIRATION_HOURS" ] +then + EXPIRATION_HOURS=25 +fi + +HOURS_FORWARD=$(get_apps_defaults sshp_sac_update_hours_forward) +if [ -z "$HOURS_FORWARD" ] +then + HOURS_FORWARD=-2 +fi + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SacStateUpdate.log +STDLOGFILE=$SSHP_LOG_DIR/SacStateUpdate.stdout.log +TMPFILE=$SSHP_LOG_DIR/SacStateUpdate.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +tail -1200 $STDLOGFILE > $TMPFILE +mv $TMPFILE $STDLOGFILE +# run the SacStateUpdater if on Linux or ssh to a linux machine if not. + +if [[ `uname` = "Linux" ]] +then + $JBINDIR/java ohd.hseb.sshp.SacStateUpdater $JDBCURL $EXPIRATION_HOURS $HOURS_FORWARD $LOGFILE >>$STDLOGFILE 2>>$STDLOGFILE +elif [[ `uname` = "HP-UX" ]] +then + ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/run_SSHP_SAC_state_update >>$STDLOGFILE 2>>$STDLOGFILE +fi diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_decode b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_decode new file mode 100755 index 0000000000..3ce7a8f881 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_decode @@ -0,0 +1,40 @@ +#!/bin/ksh +# file name: run_SSHP_data_decoder +# Created: 12/15/2003 +# Last Modified: 04/01/2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SSHP_INCOMING_DIR=$(get_apps_defaults sshp_incoming_dir) +export SSHP_INGEST_XML_DIR=$(get_apps_defaults sshp_ingest_xml_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +wait_time=$1 + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SacXMLDecoder.log +TMPFILE=$SSHP_LOG_DIR/SacXMLDecoder.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +# set up an X Terminal window to write stdout and run the SacXMLDecoder application +$JBINDIR/java ohd.hseb.sshp.messaging.SacXMLDecoder $JDBCURL $SSHP_INCOMING_DIR $SSHP_INGEST_XML_DIR $SSHP_LOG_DIR $wait_time >>$LOGFILE 2>>$LOGFILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_send b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_send new file mode 100755 index 0000000000..f264f6c5eb --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_send @@ -0,0 +1,41 @@ +#!/bin/ksh +# file name: run_sshp_data_sender +# Purpose: this will contain the code to send a message over the AWIPS +# Message Handling System (MHS) +# For now, in order to test the overall system, though, it just does a copy +# Created: 03-05-2004 +# Last Modified: 04-01-2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) + + +# setup the AWIPS environment +# +. $FXA_HOME/readenv.sh + +FILEPATH=$1 +FILENAME=$2 +MHS_SITE_ID=$3 +PRODUCT_ID=$4 + +cp $FILEPATH SSHP_OUTGOING_DIR/. +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SshpDataSender.log +TMPFILE=$SSHP_LOG_DIR/SshpDataSender.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + + +# Send product to specific location +# add the one-word description and the office id +# +echo "Sending file:$FILENAME product_ID:$PRODUCT_ID to $MHS_SITE_ID via distributeProduct" >> $LOGFILE +SUBJECT="$FILENAME $PRODUCT_ID Hydro_Model_Data" +/awips/fxa/bin/distributeProduct -c HYDRO_MODEL_DATA -s "$SUBJECT" -a $MHS_SITE_ID $PRODUCT_ID $FILEPATH diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_transfer b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_transfer new file mode 100755 index 0000000000..8534101f4b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_data_transfer @@ -0,0 +1,49 @@ +#!/bin/ksh +# file name: run_SSHP_data_transfer +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SSHP_CONTROL_DIR=$(get_apps_defaults sshp_control_dir) +export SSHP_OFS_EXTRACT_XML_DIR=$(get_apps_defaults sshp_ofs_extract_xml_dir) +export SSHP_OFS_EXTRACT_TEXT_DIR=$(get_apps_defaults sshp_ofs_extract_text_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +export CONTROL_FILE=$SSHP_CONTROL_DIR/SSHPTransfer.xml + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SshpDataTransferMgr.log +STDLOGFILE=$SSHP_LOG_DIR/SshpDataTransferMgr.stdout.log +TMPFILE=$SSHP_LOG_DIR/SshpDataTransferMgr.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +tail -1200 $STDLOGFILE > $TMPFILE +mv $TMPFILE $STDLOGFILE + +if [[ `uname` = "Linux" ]] +then + $JBINDIR/java ohd.hseb.sshp.messaging.SshpDataTransferMgr $CONTROL_FILE $SSHP_OFS_EXTRACT_TEXT_DIR $SSHP_OFS_EXTRACT_XML_DIR $SSHP_LOG_DIR >>$STDLOGFILE 2>>$STDLOGFILE +elif [[ `uname` = "HP-UX" ]] +then + ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/run_SSHP_data_transfer >>$STDLOGFILE 2>>$STDLOGFILE +fi diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_ofs_extract b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_ofs_extract new file mode 100755 index 0000000000..3aed57bcac --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SSHP_ofs_extract @@ -0,0 +1,19 @@ +#!/bin/ksh +# run_sshp_ofs_extract + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +SEGID=$1 +OUTPUT_FILE=$2 + +export TZ=GMT + +### Comment out the line below if you need to reset apps_dir back to the value in .Apps_defaults! +export apps_dir=/awips/hydroapps/lx + +$WHFS_BIN_DIR/sshp_ofs_extract.LX $SEGID $OUTPUT_FILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SiteSpecific b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SiteSpecific new file mode 100644 index 0000000000..5f1d3203b8 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_SiteSpecific @@ -0,0 +1,34 @@ +#!/bin/ksh +# file name: run_SiteSpecific +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# trim log file +SSHPLOGFILE=$SSHP_LOG_DIR/SSHP.log +SSHPTMPFILE=$SSHP_LOG_DIR/SSHP.tmp +tail -1200 $SSHPLOGFILE > $SSHPTMPFILE +mv $SSHPTMPFILE $SSHPLOGFILE + +# set up an X Terminal window to write stdout and run the SiteSpecific +# application using java +xterm -T "SiteSpecific standard output window" -iconic \ +-e $JBINDIR/java ohd.hseb.sshp.SSHP $JDBCURL $SSHP_LOG_DIR $LID_PASSED_IN & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_UnitHydrographEditor b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_UnitHydrographEditor new file mode 100755 index 0000000000..351e98e763 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_UnitHydrographEditor @@ -0,0 +1,35 @@ +#!/bin/ksh +# file name: run_UnitHydrographEditor +# Created: 10/07/2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +Dte=`date +%m%d%Y` + +LOG_FILE=$SSHP_LOG_DIR/UnitHydrographEditor_$Dte.log +TMPLOGFILE=$SSHP_LOG_DIR/UnitHydrographEditor.tmp + +tail -1200 $LOG_FILE > $TMPLOGFILE +mv $TMPLOGFILE $LOG_FILE + +# set up an X Terminal window to write stdout and run the SiteSpecific +# application using java +xterm -T UnitHydrographEditor -iconic -hold -n UnitHydrographEditor -e $JBINDIR/java ohd.hseb.sshp.window.UnitHydrographEditor $JDBCURL $LID_PASSED_IN $LOG_FILE >$LOG_FILE 2>>$LOG_FILE & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_alarm_whfs b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_alarm_whfs new file mode 100755 index 0000000000..2533da9c7f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_alarm_whfs @@ -0,0 +1,51 @@ +#!/bin/ksh +# run_alarm_whfs +# +# script to call the scheduled alarm component of the whfs +# this includes running the roc checker and the alerm reporter scripts +# +# Date: August 23, 2000 +# + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_LOCAL_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# +# +LOGFILE=$WHFS_UTIL_LOG_DIR/alarm_whfs.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/alarm_whfs.tmp +# +# +# save only the latest events in the log file +# + +echo `basename $0` log location: $LOGFILE + +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# +echo "------------------------------ " >> $LOGFILE + +# run the two scripts +# +Dte=`date -u ` +echo Starting alarm_whfs at $Dte >> $LOGFILE + +$WHFS_LOCAL_BIN_DIR/run_roc_checker + +$WHFS_LOCAL_BIN_DIR/run_report_alarm + +Dte=`date -u ` +echo Completed alarm_whfs at $Dte >> $LOGFILE + diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_check_outlier b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_check_outlier new file mode 100755 index 0000000000..590a0aaaa3 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_check_outlier @@ -0,0 +1,77 @@ +#!/bin/ksh +# run_check_outlier +# +# +# ALL roc's HAVE BEEN CHANGED TO check_outlier +# +# +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# Normal output, including function errors, goes to dedicated files named by +# basis time of run. Only other, system-type error messages should appear +# in the redirected output of the program +# +# +LOGFILE=$WHFS_UTIL_LOG_DIR/check_outlier_checker.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/check_outlier_checker.tmp +# +# +# save only the latest events in the log file +# +tail -1200 $LOGFILE > $TEMPNAME +mv $TEMPNAME $LOGFILE + +# echo the current time +# +echo "------------------------------ " >> $LOGFILE + +# run the program with the ending time the current time, and for +# the most recent hours. +# +# program usage: +# +# +#check_outlier_checker -d -t <--required args +# database : name of database, supplied by script +# table : name of the table whose data will be reviewed. The names are +# one of the following tables in the Informix database which +# contain observed data: agricultural, discharge, +# evaporation, gatedam, ground, height, ice, lake, moisture, precip, +# pressure, procvalue, radiation, snow, temperature, weather, +# wind, yunique +# optional args: +# -h : default=current system time; can specify time as 1-4 digit +# number which is the numbers of hours preceding the current +# time, or an absolute time can be specified in the format +# yyyymmddhh. +# -n : default = 6 hrs; defines the starting time as the given +# number of hours before the ending time +# -l : default = all stations; can specify single station id +# -p : default = all SHEF pe codes; can specify single SHEF pe code +# -err : default = show all messages; if arg specified, only err +# msgs written +# -u : type of data used in quality code checks. +# 'G' denotes the use of "good" data; +# 'GQ' denotes the use of "good questionable" data; +# default = 'G' ("good data"). + +Dte=`date -u` +echo Calling check_outlier$OS_SUFFIX at $Dte >> $LOGFILE + +$WHFS_BIN_DIR/check_outlier$OS_SUFFIX -d$DB_NAME -theight >> $LOGFILE +$WHFS_BIN_DIR/check_outlier$OS_SUFFIX -d$DB_NAME -tprecip -pPC >> $LOGFILE +#$WHFS_BIN_DIR/check_outlier_checker -d$DB_NAME -ttemperature >> $LOGFILE + + + +Dte=`date -u ` +echo Completed run_check_outlier at $Dte >> $LOGFILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_damcrest b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_damcrest new file mode 100644 index 0000000000..7d37e9effa --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_damcrest @@ -0,0 +1,35 @@ +#!/bin/ksh + +# File name: run_damcrest +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + + +export CONNECTION_STRING=$DAMCREST_JDBCURL + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +# set java classpath + +export CLASSPATH=.:$SYS_JAVA_DIR\ +:$SYS_JAVA_BIN_DIR\ +:$SYS_JAVA_DIR/JClassDesktopViews/lib/jcchart.jar\ +:$DB_DRIVER_PATH\ +:$WHFS_BIN_DIR/damcrest.jar\ +:$WHFS_BIN_DIR/fldat.jar + +export DBDRIVER=org.postgresql.Driver +export DAMCREST_HOME=$WHFS_BIN_DIR + +# set up an X Terminal window to write stdout and run the DamCrest +# application using java +xterm -T "DamCrest standard output window" -iconic \ +-e "$SYS_JAVA_BIN_DIR/java -Ddamcrest.home=$DAMCREST_HOME gov.dambreak.menu.Launcher $1" diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_db_purge b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_db_purge new file mode 100755 index 0000000000..bc2dff514f --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_db_purge @@ -0,0 +1,25 @@ +#!/bin/ksh +# run_db_purge +# April 20, 2005 + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export DB_PURGE_LOG_DIR=$(get_apps_defaults db_purge_log_dir) + + +# Create log file name +# + +name=`date -u +db_purge.log.%m%d_%H%M` +fnm=$DB_PURGE_LOG_DIR/$name + +# +# Run db_purge from the appropriate directory +# +echo IHFS database purge log located at: $fnm +runso rary.ohd.whfs db_purge_main >> $fnm diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_floodseq b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_floodseq new file mode 100755 index 0000000000..0542d173da --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_floodseq @@ -0,0 +1,27 @@ +#!/bin/ksh +# run_floodseq + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export FLOODSEQ_LOG_DIR=$(get_apps_defaults floodseq_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Setup file name, based on system clock +# use extra var to avoid SCCS problem +# +hstr="%H" +name=`date -u +floodseq_auto.%m%d.$hstr%M` +fnm=$FLOODSEQ_LOG_DIR/$name + +echo `basename $0` log location: $fnm + +# Run floodseq +# +runso rary.ohd.whfs floodseq_main -d$DB_NAME >> $fnm 2>> $fnm diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_floodseq_interactive b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_floodseq_interactive new file mode 100755 index 0000000000..045d25cbe1 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_floodseq_interactive @@ -0,0 +1,33 @@ +#!/bin/ksh +# run_floodseq_interactive +# job for running the flood sequencer via HydroBase +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export FLOODSEQ_LOG_DIR=$(get_apps_defaults floodseq_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Setup file names +# use extra var to avoid SCCS problem +# +hstr="%H" +name=`date -u +floodseq_hb.%m%d.$hstr%M` +fnm=$FLOODSEQ_LOG_DIR/$name + + +# Run floodseq +# +if $WHFS_BIN_DIR/x_notify$OS_SUFFIX -tWHFS "Update flood sequences?" "This may take a few minutes." \ +"Press 'OK' to proceed, 'Cancel' to abort." +then + if $WHFS_BIN_DIR/floodseq$OS_SUFFIX -d$DB_NAME >> $fnm 2>> $fnm + then + $WHFS_BIN_DIR/x_notify$OS_SUFFIX -n -tWHFS "Update of flood sequences complete." + fi +fi diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_hydrobrief b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_hydrobrief new file mode 100755 index 0000000000..dc6a01d9fd --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_hydrobrief @@ -0,0 +1,14 @@ +#!/bin/ksh +# run_hydrobrief +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + + +echo $RUN_FROM_DIR/hydrobrief -d$DB_NAME +$RUN_FROM_DIR/hydrobrief$OS_SUFFIX -d$DB_NAME diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_metar2shef b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_metar2shef new file mode 100755 index 0000000000..b7a8b664eb --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_metar2shef @@ -0,0 +1,104 @@ +#!/bin/ksh +# +# run script for metar2shef (metar to shef) +## +# usage: run_metar2shef +# no args are used; it does create its own detailed log file +# +# if archiving is NOT enabled, then metar.cfg (located in $METAR_CONFIG_DIR) should be modified so +# the 2nd line has the shef directory instead of the temp directory +# if archiving is enabled, the 2nd line in metar.cfg should have the temp directory listed instead of +# the shef directory. This script will then copy the files from the temp directory to: +# /data/fxa/ispan/hydro_adbs/ +# + + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export METAR_OUTPUT_DIR=$(get_apps_defaults metar_output_dir) +export ARCHIVE_ENABLE=$(get_apps_defaults archive_enable) +export ARCHIVE_SHEFDATA_DIR=$(get_apps_defaults archive_shefdata_dir) +export HYDRO_PUBLICBIN=$(get_apps_defaults hydro_publicbin) +export SHEF_DATA_DIR=$(get_apps_defaults shef_data_dir) +export METAR2SHEF_OPTIONS=$(get_apps_defaults metar2shef_options) +export METAR_LOG_DIR=$(get_apps_defaults metar_log_dir) +export METAR_CONFIG_DIR=$(get_apps_defaults metar_config_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + + +# setup log output file names +# +fnm=$METAR_LOG_DIR/metar2shef.log +tmp=$METAR_LOG_DIR/metar2shef.tmp + +#---------------------------------------------------------------------- +# Don't start another instance of this script if one is currently running +# + +AMIRUNNING_DIR=$METAR_LOG_DIR + +. $HYDRO_PUBLICBIN/amirunning + +if [[ $AmIRunning = "yes" ]]; then + Dte=`date -u` + echo run_metar2shef aborted at $Dte due to other instance running >> $fnm + exit 1 +fi + +#---------------------------------------------------------------------- + +# save only the latest events in the log file +# +tail -1200 $fnm > $tmp +mv $tmp $fnm + +# echo the current time +# +echo "-------------------------------------------------- " >> $fnm +Dte=`date -u` +echo "Running metar2shef"$OS_SUFFIX " version OB8.1 (03/26/2007) at: " $Dte >> $fnm + +# now run the application +# -a strip 1st char off of id +# -b accept collectives +# -fcfg config filename +# -p1, -p6, -p24 account for non-reporting 0 precip +# -round round the non-special times to nearest hour +# -w generate WMO header +# -strip convert bad ascii characters to blanks +# -q1 express wind direction in degrees, not tens of degrees +# +$WHFS_BIN_DIR/metar2shef$OS_SUFFIX \ + -fcfg $METAR_CONFIG_DIR/metar.cfg $METAR2SHEF_OPTIONS \ + >> $fnm 2>>$fnm + +# +# Checks to see if archiving is enabled. If it is enabled, then this script will copy +# the files from the temp directory to the archive directory as well as the shef directory +# + +num_files=`ls -1F $METAR_OUTPUT_DIR | grep -v "/" | wc -l` # Checks to see if the directory + # is empty. If it is, then no + # copy/move command will be issued +if (( $num_files > 0 )) +then + for metarfile in `ls -1F $METAR_OUTPUT_DIR | grep -v "/"` + do + if [ "$ARCHIVE_ENABLE" = "ON" ] # Checks to see if archiving is enabled. The token + # for this is located in .Apps_defaults_site + then + cp -f $METAR_OUTPUT_DIR/$metarfile $ARCHIVE_SHEFDATA_DIR + mv -f $METAR_OUTPUT_DIR/$metarfile $SHEF_DATA_DIR + else + mv -f $METAR_OUTPUT_DIR/$metarfile $SHEF_DATA_DIR + fi + done +fi +# +# +Dte=`date -u ` +echo "Completed metar2shef"$OS_SUFFIX "at: " $Dte >> $fnm diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_obsfcst_monitor b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_obsfcst_monitor new file mode 100755 index 0000000000..f7a7a3559b --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_obsfcst_monitor @@ -0,0 +1,28 @@ +#!/bin/ksh +# file name: run_obsfcst_monitor +# Created: August 2005 Author : Varalakshmi Rajaram + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Command line arguments to the program obsfcst_monitor + +DATABASE_NAME=$DB_NAME +LOCATION_FILTER=hsa +BASISTIME_LOOKBACK_HRS=36 +VALIDTIME_LOOKBACK_HRS=6 +MATCHING_VALID_TIMEWINDOW_MINS=120 + +# obsfcst_monitor -d dbname -f location filter -t forecast table name +# -b basis time lookback hrs -v valid time lookback hrs +# -w matching valid time window in mins + +$WHFS_BIN_DIR/obsfcst_monitor.LX -d $DATABASE_NAME -f $LOCATION_FILTER -t FcstHeight -b $BASISTIME_LOOKBACK_HRS -v $VALIDTIME_LOOKBACK_HRS -w $MATCHING_VALID_TIMEWINDOW_MINS + +$WHFS_BIN_DIR/obsfcst_monitor.LX -d $DATABASE_NAME -f $LOCATION_FILTER -t FcstDischarge -b $BASISTIME_LOOKBACK_HRS -v $VALIDTIME_LOOKBACK_HRS -w $MATCHING_VALID_TIMEWINDOW_MINS diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_pp b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_pp new file mode 100755 index 0000000000..a80357d546 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_pp @@ -0,0 +1,49 @@ +#!/bin/ksh + +# File name: run_pdc_pp +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +export CONNECTION_STRING=$JDBCURL +#export CONNECTION_STRING=jdbc:postgresql://lx1-nhdr:5432/hd_ob6rhax?user=oper + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +#truncate the preprocessor log +export LOGFILE=$PDC_PP_LOG_DIR/PDCPreprocessor.log +export LOGFILE_TMP=$PDC_PP_LOG_DIR/PDCPreprocessor.tmp + +echo `basename $0` log location: $LOGFILE + +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $LOGFILE_TMP + mv $LOGFILE_TMP $LOGFILE +fi + + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/pdc_pp.jar + +#AMIRUNNING_DIR=$PDC_PP_LOG_DIR +#. /awips/hydroapps/public/bin/amirunning + +#if [[ $AmIRunning = "yes" ]] +#then +# echo Startup cancelled because of prior running instance >> $LOGFILE +# exit 1 +#fi + +#Execute the PDC Preprocessor +java ohd.hseb.pdc_pp.PDCPreprocessor $CONNECTION_STRING $1 >>$LOGFILE 2>&1 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_precip_pp b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_precip_pp new file mode 100755 index 0000000000..8d2adc7a53 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_precip_pp @@ -0,0 +1,53 @@ +#!/bin/ksh +# run_pdc_precip_pp +# +# +# +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# +# Normal output, including function errors, goes to dedicated files named by +# basis time of run. Only other, system-type error messages should appear +# in the redirected output of the program +# +# +LOGFILE=$PDC_PP_LOG_DIR/pdc_precip_pp.log +TEMPNAME=$PDC_PP_LOG_DIR/pdc_precip_pp.tmp + +echo `basename $0` log location: $LOGFILE +# +# +# save only the latest events in the log file +# +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# echo the current time +# +echo "------------------------------ " >> $LOGFILE + +# program usage: +# +# +# pdc_precip_pp -e +# +# endtime : end time for the timeseries + +Dte=`date -u` +echo Calling pdc_precip_pp at $Dte >> $LOGFILE 2>&1 + +echo runso rary.ohd.whfs pdc_precip_main -e$1 -h$2 >> $LOGFILE 2>&1 +runso rary.ohd.whfs pdc_precip_main -e$1 -h$2 >> $LOGFILE 2>&1 + +Dte=`date -u ` +echo Completed run_pdc_precip_pp at $Dte >> $LOGFILE 2>&1 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_tsl b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_tsl new file mode 100755 index 0000000000..cf1d34c972 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_pdc_tsl @@ -0,0 +1,50 @@ +#!/bin/ksh + +# File name: run_pdc_pp +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +export CONNECTION_STRING=$JDBCURL +#export CONNECTION_STRING=jdbc:postgresql://lx1-nhdr:5432/hd_ob6rhax?user=oper + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +#truncate the timeseries lite log +#export LOGFILE=$PDC_PP_LOG_DIR/PDCPreprocessor.log +#export LOGFILE_TMP=$PDC_PP_LOG_DIR/PDCPreprocessor.tmp +#tail -12000 $LOGFILE > $LOGFILE_TMP +#mv $LOGFILE_TMP $LOGFILE + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/timeserieslite.jar + +#AMIRUNNING_DIR=$PDC_PP_LOG_DIR +#. /awips/hydroapps/public/bin/amirunning + +#if [[ $AmIRunning = "yes" ]] +#then +# echo Startup cancelled because of prior running instance >> $LOGFILE +# exit 1 +#fi + +echo + +export LID=$1 +export PARAMCODE1=$2 +export PARAMCODE2=$3 +export PARAMCODE3=$4 +export PARAMCODE4=$5 +export PARAMCODE5=$6 + + +#Execute TimeSeries Lite +$SYS_JAVA_BIN_DIR/java ohd.hseb.timeserieslite.TimeSeriesLite ohd.hseb.timeserieslite.pdc.PDCDrawingMgr $CONNECTION_STRING $LID $PARAMCODE1 $PARAMCODE2 $PARAMCODE3 $PARAMCODE4 $PARAMCODE5 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_raxdb_sync b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_raxdb_sync new file mode 100755 index 0000000000..504694ebd1 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_raxdb_sync @@ -0,0 +1,21 @@ +#!/bin/ksh +# file name: run_IHFS_RAX_Sync_batch +# Created: 05/24/2007 +# Edited : 08/03/2007 - Added unix remove command to delete log files +# Edited : 09/06/2007 - Removed delete log file logic +# Edited : 10/24/2007 - Renamed jar from raxdb_sync.jar to rax_apps.jar + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for RAX applications +. /rfc_arc/lib/rax.profile + +# need to add a path to the jar file for this application +export CLASSPATH=$DB_DRIVER_PATH:$RUN_FROM_DIR/rax_apps.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# run application using java +$JBINDIR/java ohd.hseb.raxdb_sync.RaxDbSyncBatch $IHFS_JDBCURL $RAX_JDBCURL diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_report_alarm b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_report_alarm new file mode 100644 index 0000000000..719032977e --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_report_alarm @@ -0,0 +1,161 @@ +#!/bin/ksh +# run_report_alarm +# +# script to review the current alert/alarm values and report them in +# a product and send them to the text database +# + +# Revised:Sep 11, 2012 +###################################################################### + + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +# Run from local bin dir +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export EDEX_HOME=/awips2/edex +export DB_NAME=$(get_apps_defaults db_name) +export FXA_DB_NAME=fxatext +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export UTILITYDIR=$EDEX_HOME/data/utility + + +# +# Report output goes to dedicated files named by product_id and the +# file suffix, which is normally set according to the system time. +# Log output and error messages should appear in the redirected output of the program. +# + +LOGFILE=$WHFS_UTIL_LOG_DIR/report_alarm.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/report_alarm.tmp + +# setup the AWIPS environment +# redirect any output from this script to the log file +# + +/awips2/fxa/bin/setup.env >> $LOGFILE 2>&1 + + +# +# save only the latest events in the log file +# +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# log start of script +# +echo "------------------------------ " >> $LOGFILE +Dte=`date -u` +echo Invoking report_alarm at $Dte >> $LOGFILE + +# +# program usage: +# report_alarm -d -p <--required args +# -r -s -m <-- optional args +# -f -e <-- optional args +# + +# define the product id as per local needs - SET LOCALLY !!!!!!!!!!!!!!!!!!!!! +# + +PRODUCT_ID=CCCACRXXX +# +# define the file suffix based on the system time +# use extr var to avoid SCCS problem + +hstr="%H" +SUFFIX=`date -u +%m%d.$hstr%M` + +# +# the name of the created file is set according to how the program +# builds the name + +FILENAME=$WHFS_PRODUCT_DIR/$PRODUCT_ID.$SUFFIX + +# +# To discover dependencies and dynamically +# build associated classpath. +# + +function buildClassPath { + targetDir=$1 + pattern=$2 + targetDirListing=`find $targetDir -name "$pattern"` + list= + for i in $targetDirListing + do + list=${list}:${i} + done + printf " $list " +} + + +# set dependencies base directories +LOG4J_CONF=$WHFS_BIN_DIR +DEPENDENCY_DIR=$EDEX_HOME/lib/dependencies +HIBERNATE_DIR=$DEPENDENCY_DIR/org.hibernate +CAMEL_DIR=$DEPENDENCY_DIR/org.apache.camel +SPRING_ORM_DIR=$DEPENDENCY_DIR/org.springframework + + +# set patterns for target dependencies +PATTERN='*\.jar' +COMMONS_PATTERN='commons*\.jar' + +# get dependencies path +PLUGINS="$EDEX_HOME/lib/plugins/*" +CAMEL="$DEPENDENCY_DIR/org.apache.camel/*" +GEOTOOLS="$DEPENDENCY_DIR/org.geotools/*" +JAVAX_MEASURE="$DEPENDENCY_DIR/javax.measure/*" +JAVAX_PERSISTANCE="$DEPENDENCY_DIR/javax.persistence/*" +MCHANGE="$DEPENDENCY_DIR/com.mchange/*" +LOG4J="$DEPENDENCY_DIR/org.apache.log4j/*" +SLF4J="$DEPENDENCY_DIR/org.slf4j/*" +DOM4J="$DEPENDENCY_DIR/org.dom4j/*" +SPRING="$DEPENDENCY_DIR/org.springframework/*" +HIBERNATE="$DEPENDENCY_DIR/org.hibernate/*" +APACHE_COMMONS=`buildClassPath $DEPENDENCY_DIR $COMMONS_PATTERN` + + +# set the application classpath +export CLASSPATH=$HIBERNATE:$SPRING:$DB_DRIVER_PATH:$CAMEL:$GEOTOOLS:$JAVAX_MEASURE:$MCHANGE:$LOG4J:$SLF4J:$JAVAX_PERSISTANCE:$DOM4J:$APACHE_COMMONS:$PLUGINS:$CLASSPATH + +# +# run the application +# +$SYS_JAVA_DIR/bin/java -Xms64m -Xmx512m com.raytheon.edex.plugin.shef.alarms.AlertalarmStdTextProductUtil -d$DB_NAME -p$PRODUCT_ID -s$SUFFIX -rNEAREST >> $LOGFILE 2>&1 +NUM_ALARMS=$? + + +if [ $NUM_ALARMS -eq 0 ] +then + print No alarms reported, info sent to $FILENAME >> $LOGFILE + print File NOT sent to text database >> $LOGFILE + +else + print $NUM_ALARMS alarms reported, report written to $FILENAME >> $LOGFILE + + echo Writing $FILENAME to textdb as id $PRODUCT_ID >> $LOGFILE + /awips2/fxa/bin/textdb -w $PRODUCT_ID < $FILENAME >> $LOGFILE 2>&1 + RETURN_STATUS=$? + + if [ $RETURN_STATUS -eq 0 ] + then + print Product successfully sent >> $LOGFILE + else + print Product send error detected, status= $RETURN_STATUS >> $LOGFILE + fi +fi + +Dte=`date -u ` +echo Completed report_alarm at $Dte >> $LOGFILE diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_roc_checker b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_roc_checker new file mode 100755 index 0000000000..6e8de7d9d3 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_roc_checker @@ -0,0 +1,80 @@ +#!/bin/ksh +# run_roc_checker +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +# Source set_hydro_env from local bin +. $RUN_FROM_DIR/../../set_hydro_env +. $RUN_FROM_DIR/../../check_app_context + +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# Normal output, including function errors, goes to dedicated files named by +# basis time of run. Only other, system-type error messages should appear +# in the redirected output of the program +# +# +LOGFILE=$WHFS_UTIL_LOG_DIR/roc_checker.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/roc_checker.tmp +# +# +# save only the latest events in the log file +# +echo `basename $0` log location: $LOGFILE + +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# echo the current time +# +echo "------------------------------ " >> $LOGFILE + +# run the program with the ending time the current time, and for +# the most recent hours. +# +# program usage: +# +# roc_checker -d -t
        <--required args +# database : name of database, supplied by script +# table : name of the table whose data will be reviewed. The names are +# one of the following tables in the Informix database which +# contain observed data: agricultural, discharge, +# evaporation, gatedam, ground, height, ice, lake, moisture, precip, +# pressure, procvalue, radiation, snow, temperature, weather, +# wind, yunique +# optional args: +# -h : default=current system time; can specify time as 1-4 digit +# number which is the numbers of hours preceding the current +# time, or an absolute time can be specified in the format +# yyyymmddhh. +# -n : default = 6 hrs; defines the starting time as the given +# number of hours before the ending time +# -l : default = all stations; can specify single station id +# -p : default = all SHEF pe codes; can specify single SHEF pe code +# -err : default = show all messages; if arg specified, only err +# msgs written +# -u : type of data used in quality code checks. +# 'G' denotes the use of "good" data; +# 'GQ' denotes the use of "good questionable" data; +# default = 'G' ("good data"). + +Dte=`date -u` +echo Calling roc_checker at $Dte >> $LOGFILE + +runso rary.ohd.whfs roc_checker_main -d$DB_NAME -theight >> $LOGFILE +runso rary.ohd.whfs roc_checker_main -d$DB_NAME -tprecip -pPC >> $LOGFILE +#$WHFS_BIN_DIR/roc_checker -d$DB_NAME -ttemperature >> $LOGFILE + + + +Dte=`date -u ` +echo Completed run_roc_checker at $Dte >> $LOGFILE \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_rpf_batch b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_rpf_batch new file mode 100755 index 0000000000..d5fe9224e1 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_rpf_batch @@ -0,0 +1,112 @@ +#! /bin/ksh +# +# run_rpf_batch +# April, 2005 +# +# +# Sample file for running the non-interactive version of RiverPro. +# This file should be configured to your local office needs. +# +# To run the rpf_batch program, its three arguments need to be defined. +# +# -d dbname = Required name of the IHFS Informix database. +# +# -p pccfile = Required name of the product content control (pcc) +# file that contains the high-level instructions for +# generating the product. The pcc filename should include +# the suffix identifying the office +# name such as fls_def.pcc.XXX with the full path name +# -s filesuffix = Optional name of the suffix to be appended onto the +# output product and log files created by the program. +# If not specified, the process id will be used. +# Use of the file suffix is strongly suggested to facilitate +# the dissemination of the generated product by allowing +# its filename to be known. +# +# Note: The product only inlcude the information for +# points specified after keyword "INCLUDE_POINTS:" in +# the pcc file +# +# After creating the product, the product can be issued to the +# appropriate communications circuits using the rpf_issue script. +# +# Define some environment variables, including the log directories +# and the database name. + +# Modification: JIngtao +# Revision: 03/17/2006 +# change the generated product name from rpf_product.$SUFFIX +# to work_product.$SUFFIX + +# This allows you to run this script outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../../set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export RPF_TEMPLATE_DIR=$(get_apps_defaults rpf_template_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + + +# Log some info. Change this as desired. Writes to the log +# file can be added later in the script as desired. + +LOGFILE=$RPF_LOG_DIR/run_rpf_batch.log +Dte=`date -u` +echo Invoking run_rpf_batch$OS_SUFFIX at $Dte > $LOGFILE + +# This command will create a product using instructions given in the +# specified pcc file, and with the specified file suffix. +# Uncomment this line after defining the two arguments. + +SUFFIX=RVS_test +PCCFILE=filexxx.pcc.ooo + +#echo Generating product using pccfile$PCCFILE and suffix $SUFFIX > $LOGFILE + +#$WHFS_BIN_DIR/rpf_batch$OS_SUFFIX -d$DB_NAME -p$RPF_TEMPLATE_DIR/$PCCFILE -s$SUFFIX > $LOGFILE + + +# The script rpf_issue which has the following arguments: +# The name of the output product file created by rpf_batch +# it is uniquely identified by using the suffix argument. + +FILENAME=$WHFS_PRODUCT_DIR/work_product.$SUFFIX + +# The AWIPS product id is CRITICAL - it should match the definition +# in the .pcc file and must be a valid ID recognized by AWIPS + +PRODUCT_ID=CCCCNNNXXX + +# Specify OUP [Official User Product] as the product type; rpf_batch does not +# currently support NWR products + +PRODUCT_TYPE=OUP + +# Specifies NORMAL issuance of product for the mode; i.e. not test mode. + +ISSUE_MODE=NORMAL + +# Specify LOCAL destination; the NON-LOCAL is not supported +# since rpf_batch does not support NWR products + +DESTINATION=LOCAL + +# Specify the identifier for the sending office. This is used for +# non-local NWR products only so its value is not important. + +WFO_ID=xxx + +# The formal specification for the call to rpf_issue is: +# rpf_issue $FILENAME $PRODUCT_ID $PRODUCT_TYPE $ISSUE_MODE $DESTINATION $WFO_ID +# +# Using the fixed/known arguments, to make this script operational, +# uncomment the call below after specifying the suffix and product id above: +# +# echo Issuing file $FILENAME > $LOGFILE +#rpf_issue $FILENAME $PRODUCT_ID OUP NORMAL LOCAL $WFO_ID + +# end of script diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_vacuum b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_vacuum new file mode 100755 index 0000000000..4287270fd3 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/run_vacuum @@ -0,0 +1,50 @@ +#!/bin/ksh +# run_vacuum +# December 29, 2004 + +# this script runs from the cron every 2 hours +# it does a vacuum of the IHFS db + +#------------------------------------------------------------------- + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export VACUUM_LOG_DIR=$(get_apps_defaults vacuum_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Create log file name +# + +name_vac=`date -u +vacuum.log.%m%d_%H%M` +fnm_vac=$VACUUM_LOG_DIR/$name_vac + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# If another instance is running, write a message to the log file and stop + +AMIRUNNING_DIR=$VACUUM_LOG_DIR + +. /awips/hydroapps/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]] +then + echo run_vacuum script cancelled due to other instance running >> $fnm_vac + exit 1 +fi + +#---------------------------------------------------------------------- +# run vacuum with verbose option on IHFS db +# + +DTZ=`date -u +%T` +echo begin vacuum at $DTZ >> $fnm_vac + +echo database name = $DB_NAME >> $fnm_vac +$POSTGRESQLBINDIR/vacuumdb -v $DB_NAME >> $fnm_vac 2>>$fnm_vac + +DTZ=`date -u +%T` +echo end vacuum at $DTZ >> $fnm_vac diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/save_image b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/save_image new file mode 100755 index 0000000000..442da91696 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/save_image @@ -0,0 +1,99 @@ +#!/usr/bin/ksh +# +# save_image +# +# Bryon Lawrence September 26, 2001 OHD +# +# Purpose: +# +# This script will capture an image on the screen and save it. +# It was designed to be called from a program such as +# timeseries or hydromap which provides the option of +# capturing an image on the screen and storing it in a file. +# The commands that must be called to do this are different on the +# HP-UX and Linux operating systems. So, this script has the logic +# built into it to determine which operating system it is being run +# on. +# +# The caller of this script must provide two arguments: the name of the +# window to be "captured" and the name of the file (including the +# full path) to save the image to. Note that the extension of the +# filename must reflect the desired image format. For example if the +# user wants to capture a window named "test window" and save it as a +# GIF image in his home directory, then he should use the following +# command structure: +# +# save_image "test window" "~/test_window.gif" +# +# If the user does not supply an extension identifying the image format, +# then an extension of ".gif" is appended onto the filename, and the file +# is saved as a gif image. +# +############################################################################### + +TEMP_DIR="/tmp" + +# +# Trap any malicious signals and make sure the temporary file needed +# by the HP-UX operating system is cleaned up before the program +# terminates. +trap 'rm -f ; rm -f $TEMP_DIR/junk.gif; exit 1' 1 2 15 + +# Test to make certain that the proper number of command line parameters +# have been passed into this script. +if [[ $# -ne 2 ]] +then + + print "\nThe attempt to save the image has failed." + print "An incorrect number of arguments have been passed to the" + print "save_image script. An argument specifying the name of" + print "window to save and an argument specifiying the name of" + print "the file to save it to must be supplied to this script.\n" + exit 1 + +fi + +WINDOW_NAME=$1 +FILENAME=$2 + +# Determine if an extension was included on the filename. If no +# extension was provided, then the image format of the file +# will default to "*.gif". The test for an extension is simple. +# Check to determine if there is a "." in the filename. If so, then +# assume there is an extension. If not, then there is no extension, and +# a ".gif" will be appended to the filename. If an extension specifying +# an image file format is supplied, then it is up to the user to make sure +# that the extension and the image format that it represents are valid. +echo $FILENAME | grep "\." + +if [ $? -ne 0 ] +then + FILENAME="$FILENAME.gif" +fi + +# Determine the operating system that this script is running on. +OPER_SYSTEM=`uname` + +if [[ $OPER_SYSTEM = "Linux" ]] +then + + # This is the Linux sequence of commands. + import -window "$WINDOW_NAME" $FILENAME + +else + + # This is the HP-UX sequence of commands. + rm -f $TEMP_DIR/junk.xwd + xwd -name "$WINDOW_NAME" -out "$TEMP_DIR/junk.xwd" + + if [[ -z "$HYDRO_PUBLICBIN" ]] + then + imconv "$TEMP_DIR/junk.xwd" "$FILENAME" + else + ${HYDRO_PUBLICBIN}/imconv "$TEMP_DIR/junk.xwd" -gif "$FILENAME" + fi + + rm -f $TEMP_DIR/junk.xwd +fi + +exit 0 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/sdbj.LX b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/sdbj.LX new file mode 100755 index 0000000000..b15c81c0b1 Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/sdbj.LX differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_fcstservice b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_fcstservice new file mode 100644 index 0000000000..5bc6296ec2 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_fcstservice @@ -0,0 +1,23 @@ +#!/bin/ksh + +# File name: start_fcstservice +# Author : Ram Varma + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +#LHVM_LOG=$LHVM_LOG_DIR/fcstservice + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/fcstservice.jar + +#Execute Lhvm +xterm -T "fcstservice" -iconic \ +-e $SYS_JAVA_DIR/bin/java ohd.hseb.fcstservice.LhvmApplicationWindow $JDBCURL & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_hydrobase b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_hydrobase new file mode 100755 index 0000000000..57a426efbe --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_hydrobase @@ -0,0 +1,11 @@ +#!/bin/ksh +# start_hydrobase + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +xterm -T HydroBase$OS_SUFFIX -iconic -n HydroBase -e $RUN_FROM_DIR/hb$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_hydroview b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_hydroview new file mode 100755 index 0000000000..dbcd03e37d --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_hydroview @@ -0,0 +1,29 @@ +#!/bin/ksh +# start_hydroview + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +. $FXA_HOME/readenv.sh + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +XAPPLRESDIR=$RUN_FROM_DIR +export XAPPLRESDIR + +# for calling Java (TimeSeriesLite in this case) from withing a C program +# already added LD_LIBRARY_PATH to set_hydro_env +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/timeserieslite.jar:$WHFS_BIN_DIR/MiscDialogs.jar + + +xterm -T HydroView$OS_SUFFIX -iconic -n Hydroview \ + -e $RUN_FROM_DIR/hydroview$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_ldv b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_ldv new file mode 100755 index 0000000000..8232b556b9 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_ldv @@ -0,0 +1,11 @@ +#!/bin/ksh +# filename: start_ldv + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +xterm -T LiveDataViewer$OS_SUFFIX -iconic -e $RUN_FROM_DIR/ldv$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_raxbase b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_raxbase new file mode 100755 index 0000000000..08e0e418fc --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_raxbase @@ -0,0 +1,18 @@ +#!/bin/ksh +# file name: start_raxbase +# Last Updated: 01/02/2008 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for RAX applications +. /rfc_arc/lib/rax.profile + +# need to add a path to the jar file for this application +export CLASSPATH=$DB_DRIVER_PATH:$RUN_FROM_DIR/rax_apps.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# run application using java +xterm -T RaxBase -iconic -n RaxBase -e $JBINDIR/java -Xmx512m -Xms32m ohd.hseb.raxbase.RaxBase $RAX_JDBCURL $IHFS_JDBCURL $ADB_NAME . diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_rivermonitor b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_rivermonitor new file mode 100644 index 0000000000..8a3173763d --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_rivermonitor @@ -0,0 +1,30 @@ +#!/bin/ksh + +# File name: start_rivermonitor +# Author : Varalakshmi Rajaram + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/RiverMonitor.jar:$CLASSPATH + +MISSING_REPRESENTATION=' ' + +#Execute the RiverMonitor + +if [[ $# > 0 ]] +then +MONITOR_NAME="$1" +else +MONITOR_NAME="River" +fi + +xterm -T $MONITOR_NAME"Monitor" -iconic \ +-e $SYS_JAVA_DIR/bin/java -Xms64m -Xmx512m ohd.hseb.monitor.Monitor $JDBCURL "$MISSING_REPRESENTATION" $MONITOR_NAME & + diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_riverpro b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_riverpro new file mode 100755 index 0000000000..8392126de9 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_riverpro @@ -0,0 +1,56 @@ +#!/bin/ksh +# start_riverpro +# +# AWIPS OB8.3 +# + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export TZ=CST6CDT +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) +export WHFS_CONFIG_DIR=$(get_apps_defaults whfs_config_dir) +export rpf_template_dir=$WHFS_CONFIG_DIR/riverpro +export WHFS_LOG_DIR=$(get_apps_defaults whfs_log_dir) +export RPF_LOG_DIR=$WHFS_LOG_DIR/riverpro + + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/MiscDialogs.jar:$CLASSPATH +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/jre/lib/i386:/usr/local/jre/lib/i386/client:/usr/local/jre/lib/i386/native_threads + + +# execute the application in TEST MODE + +#xterm -T RiverPro$OS_SUFFIX -iconic -name RiverPro \ +#-e $RUN_FROM_DIR/rpf$OS_SUFFIX -d$DB_NAME -m$MODE_ARG & + +$RUN_FROM_DIR/rpf$OS_SUFFIX -d$DB_NAME -mT > $RPF_LOG_DIR/riverpro.log 2>&1 + + + +if test WORKSTATION_MODE -eq OPERATIONAL_MODE +then + MODE_ARG="O" +elif test WORKSTATION_MODE -eq TEST_MODE +then + MODE_ARG="T" +elif test WORKSTATION_MODE -eq PRACTICE_MODE +then + MODE_ARG="P" +else + MODE_ARG="O" + echo Assuming operational workstation mode +fi + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/MiscDialogs.jar:$CLASSPATH + + +# execute the application + +xterm -T RiverPro$OS_SUFFIX -iconic -hold -name RiverPro \ +-e $RUN_FROM_DIR/rpf$OS_SUFFIX -d$DB_NAME -m$MODE_ARG & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_timeseries b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_timeseries new file mode 100755 index 0000000000..4d9e11a2e7 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/start_timeseries @@ -0,0 +1,11 @@ +#!/bin/ksh +# start_timeseries + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +xterm -T TimeSeries$OS_SUFFIX -iconic -name TimeSeries -e $RUN_FROM_DIR/timeseries$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/timeserieslite.jar b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/timeserieslite.jar new file mode 100755 index 0000000000..239c45098c Binary files /dev/null and b/nativeLib/files.native/awipsShare/hydroapps/whfs/bin/timeserieslite.jar differ diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/bin/whfs_editor b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/bin/whfs_editor new file mode 100755 index 0000000000..24fa7cf5f2 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/bin/whfs_editor @@ -0,0 +1,133 @@ +#! /bin/ksh +# whfs_editor - Launches a standalone editor from an application. +# +# The "dtpad" editor is invoked from the "HP" operating system. +# The "kwrite" editor is invoked from the "Linux" operating system. +# +# This script was modified to use a "hard-wired" +# editor based upon which operating system it is being run under. +# If the user wants to use an editor of their preference, then this +# script may be modified. Alternatively, the token "whfs_editor:" +# can be set to use a different file in this local/bin directory. +# +# The script must recognize the following args from the command line. +# Argument "0" is the command name. +# Argument "1" is the title to display across the top of the editor. +# Argument "2" is the name of the file to be opened. +# Argument "3" is the type of the file which is important +# +# Note that this script has been created on the premise that it will be +# launched from an application that has already had "set_hydro_env" sourced +# by a start script. This script relies on set_hydro_env being sourced +# to set values for: "RPF_LINEWIDTH", "OS_SUFFIX", "WHFS_UTIL_LOG_DIR". +# If "OS_SUFFIX" is not set, then this script will issue an error message +# and exit with a return value of "1". +# If "RFC_LINEWIDTH" is not set, then it will default to a value of "80". +# If "WHFS_UTIL_LOG_DIR" is not set, then if the editor command is +# logging to the file, the edit command will fail. +# +# modified 01/28/2002 +# removed "-geometry" option when calling kwrite editor on Linux machines +# added error logging feature for kwrite +# +TITLE=$1 +FILENAME=$2 +FILETYPE=$3 + +LOGFILENAME=$WHFS_UTIL_LOG_DIR/whfs_editor.log + +# +# This allows you to run this script from outside of ./local/bin +RUN_FROM_DIR=`dirname $0` + +# +# get line_limit value from the RPF_LINEWIDTH environmental variable. +if [[ -z "`echo $RPF_LINEWIDTH | tr -d ' /\t'`" ]] +then + NUM_COLS="80" +else + NUM_COLS=$RPF_LINEWIDTH +fi + +BY="x" +NUM_LINES="30" +GEOMETRY=$NUM_COLS$BY$NUM_LINES + +#--------------------------------- +# + +# +# Is the OS_SUFFIX variable defined in the environment? +if [[ -z "`echo $OS_SUFFIX | tr -d ' /\t'`" ]] +then + print "\nOS_SUFFIX is not defined. This variable needs to be defined" + print "for the whfs_editor script to properly function.\n" + exit 1 +fi + +# +# Determine the operating system that this script is being run under. +if [[ $OS_SUFFIX = ".HP" ]] +then + + DTPAD_EDITOR=/usr/dt/bin/dtpad + + if [[ $FILETYPE = "OUP" ]] + then + echo $DTPAD_EDITOR -wrapToFit -geometry $GEOMETRY $FILENAME -standAlone + $DTPAD_EDITOR -wrapToFit -geometry $GEOMETRY $FILENAME -standAlone + fi + + if [[ $FILETYPE = "NWR" ]] + then + echo $DTPAD_EDITOR -geometry $GEOMETRY $FILENAME -standAlone + $DTPAD_EDITOR -geometry $GEOMETRY $FILENAME -standAlone + fi + + if [[ $FILETYPE = "SHEFENCODE" ]] + then + echo $DTPAD_EDITOR $FILENAME -standAlone + $DTPAD_EDITOR $FILENAME -standAlone + fi + + if [[ $FILETYPE = "" ]] + then + echo $DTPAD_EDITOR $FILENAME -standAlone + $DTPAD_EDITOR $FILENAME -standAlone + fi + + +# for the $KWRITE_EDITOR invocations, send any error output to a log file. + +else + if [ -e /usr/bin/kwrite ]; then + KWRITE_EDITOR=/usr/bin/kwrite + else + KWRITE_EDITOR=/usr/bin/gedit + fi + + if [[ $FILETYPE = "OUP" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + + if [[ $FILETYPE = "NWR" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + + if [[ $FILETYPE = "SHEFENCODE" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + + if [[ $FILETYPE = "" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + +fi diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/damcrest/.vimrc b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/damcrest/.vimrc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/hydroview/help/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/hydroview/help/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/metar2shef/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/metar2shef/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/rivermon/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/rivermon/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/riverpro/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/riverpro/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/sshp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/sshp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/timeseries/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/app/timeseries/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/damcrest/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/damcrest/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/basins.dat b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/basins.dat new file mode 100644 index 0000000000..09de0b12d3 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/basins.dat @@ -0,0 +1,13335 @@ +105 105 -1 25 40.10000 98.14803 + 40.2029900 98.2218000 + 40.1545600 98.1811800 + 40.1655000 98.1163200 + 40.1364600 98.0893900 + 40.1471400 98.0375500 + 40.1277000 98.0239600 + 40.0990600 97.9710500 + 40.0994700 97.9450000 + 39.9719800 97.9285400 + 39.9707600 98.0065400 + 39.9410900 98.0187100 + 39.9308500 98.0444100 + 39.9504900 98.0449800 + 39.9684000 98.1495200 + 39.9478600 98.2009000 + 39.9770900 98.2148100 + 39.9651600 98.3314800 + 39.9845600 98.3451200 + 40.0341500 98.3207000 + 40.1618200 98.3248400 + 40.2102000 98.3655600 + 40.2691300 98.3675100 + 40.2504600 98.3146700 + 40.2308200 98.3140300 + 40.2029900 98.2218000 +106 106 -1 27 39.90240 98.37499 + 39.9410900 98.0187100 + 39.8723400 98.0167800 + 39.8328500 98.0286500 + 39.8418200 98.0808300 + 39.8023200 98.0926600 + 39.8213100 98.1321500 + 39.8092200 98.2615400 + 39.8286200 98.2751300 + 39.8239100 98.5215900 + 39.8432900 98.5352600 + 39.8326800 98.5738200 + 39.8812400 98.6015400 + 39.8796000 98.6794200 + 39.9079400 98.7324600 + 39.9275900 98.7332100 + 39.9990800 98.6058100 + 39.9701600 98.5787500 + 40.0024700 98.4367800 + 39.9833300 98.4101200 + 39.9845600 98.3451200 + 39.9651600 98.3314800 + 39.9770900 98.2148100 + 39.9478600 98.2009000 + 39.9684000 98.1495200 + 39.9504900 98.0449800 + 39.9308500 98.0444100 + 39.9410900 98.0187100 +107 107 -1 21 39.94800 97.86219 + 39.9553600 97.7200800 + 39.9358900 97.7066100 + 39.8966000 97.7056800 + 39.8964200 97.7186700 + 39.8866000 97.7184300 + 39.8862500 97.7444000 + 39.7973100 97.7811700 + 39.7965600 97.8330300 + 39.8737700 97.9259100 + 39.8635500 97.9516100 + 39.8527000 98.0162300 + 39.8723400 98.0167800 + 39.9410900 98.0187100 + 39.9707600 98.0065400 + 39.9719800 97.9285400 + 40.0994700 97.9450000 + 40.0707900 97.8921400 + 40.0317000 97.8780900 + 40.0041100 97.7472700 + 39.9648200 97.7463100 + 39.9553600 97.7200800 +108 108 -1 22 39.68160 98.05697 + 39.8635500 97.9516100 + 39.7663300 97.8841300 + 39.7172200 97.8828500 + 39.7077900 97.8566900 + 39.5408400 97.8523900 + 39.4909700 97.9027900 + 39.5298500 97.9296600 + 39.5480600 98.0206500 + 39.6150900 98.1260500 + 39.6142000 98.1777900 + 39.6429700 98.2174900 + 39.7021200 98.2063600 + 39.7213000 98.2328600 + 39.7802200 98.2347000 + 39.8092200 98.2615400 + 39.8213100 98.1321500 + 39.8023200 98.0926600 + 39.8418200 98.0808300 + 39.8328500 98.0286500 + 39.8723400 98.0167800 + 39.8527000 98.0162300 + 39.8635500 97.9516100 +109 109 -1 19 39.64590 97.80373 + 39.8866000 97.7184300 + 39.7392800 97.7149200 + 39.6808800 97.6746700 + 39.4744800 97.6828100 + 39.4257200 97.6558600 + 39.4052100 97.7199000 + 39.4626600 97.8245700 + 39.4715200 97.8893700 + 39.4909700 97.9027900 + 39.5408400 97.8523900 + 39.7077900 97.8566900 + 39.7172200 97.8828500 + 39.7663300 97.8841300 + 39.8635500 97.9516100 + 39.8737700 97.9259100 + 39.7965600 97.8330300 + 39.7973100 97.7811700 + 39.8862500 97.7444000 + 39.8866000 97.7184300 +110 110 -1 31 39.66770 97.56583 + 39.8966000 97.7056800 + 39.8778200 97.6403000 + 39.9177800 97.5892400 + 39.8984600 97.5628400 + 39.8793000 97.5234500 + 39.8013400 97.4699200 + 39.6931500 97.4806600 + 39.5959700 97.3881100 + 39.6356800 97.3500500 + 39.7141200 97.3644800 + 39.7538200 97.3263400 + 39.7832800 97.3268900 + 39.8033300 97.2883400 + 39.7842100 97.2361200 + 39.7254100 97.2221500 + 39.7160800 97.1701700 + 39.5583200 97.2322500 + 39.4983300 97.3345700 + 39.5174100 97.3866100 + 39.4680100 97.4114800 + 39.4775400 97.4375000 + 39.4281400 97.4623300 + 39.4177000 97.5137300 + 39.4268900 97.5655500 + 39.4257200 97.6558600 + 39.4744800 97.6828100 + 39.6808800 97.6746700 + 39.7392800 97.7149200 + 39.8866000 97.7184300 + 39.8964200 97.7186700 + 39.8966000 97.7056800 +111 111 -1 32 39.51920 97.28186 + 39.7070700 97.0793400 + 39.6481400 97.0784500 + 39.5594100 97.1159100 + 39.4715800 97.0500000 + 39.4713600 97.0758100 + 39.4021500 97.1263900 + 39.3234700 97.1380500 + 39.3231100 97.1767000 + 39.2443000 97.2011700 + 39.2440500 97.2269100 + 39.2731200 97.2660400 + 39.2727300 97.3046600 + 39.3215600 97.3313100 + 39.3306700 97.3959200 + 39.3797700 97.3968700 + 39.3991200 97.4230400 + 39.3785800 97.5000200 + 39.3882400 97.5131100 + 39.4177000 97.5137300 + 39.4281400 97.4623300 + 39.4775400 97.4375000 + 39.4680100 97.4114800 + 39.5174100 97.3866100 + 39.4983300 97.3345700 + 39.5583200 97.2322500 + 39.7160800 97.1701700 + 39.7254100 97.2221500 + 39.7842100 97.2361200 + 39.7944100 97.1973800 + 39.7262600 97.1314500 + 39.7266000 97.0925900 + 39.7070700 97.0793400 +112 112 -1 24 39.25080 97.01398 + 39.3843000 96.9068600 + 39.3844800 96.8810700 + 39.3746600 96.8809500 + 39.3157300 96.8802300 + 39.2277000 96.8276900 + 39.1491400 96.8268000 + 39.1193200 96.8778500 + 39.0307500 96.9024600 + 39.0501100 96.9412100 + 39.0300700 96.9922900 + 39.0496100 97.0053900 + 39.1278500 97.0450300 + 39.1470500 97.0967300 + 39.1961500 97.0974700 + 39.2443000 97.2011700 + 39.3231100 97.1767000 + 39.3234700 97.1380500 + 39.4021500 97.1263900 + 39.4713600 97.0758100 + 39.4715800 97.0500000 + 39.4324000 97.0365200 + 39.4425400 96.9979500 + 39.3839100 96.9584400 + 39.3843000 96.9068600 +117 117 -1 8 39.69910 97.40350 + 39.7538200 97.3263400 + 39.7141200 97.3644800 + 39.6356800 97.3500500 + 39.5959700 97.3881100 + 39.6931500 97.4806600 + 39.8013400 97.4699200 + 39.8022300 97.3921000 + 39.7538200 97.3263400 +1407 1407 -1 11 41.06810 98.88040 + 41.1598700 99.0189800 + 41.1605000 98.9925500 + 41.0649600 98.8696300 + 41.0476400 98.7632800 + 41.0187300 98.7357600 + 40.9756300 98.9055900 + 41.0146300 98.9203900 + 40.9943800 98.9459500 + 40.9925200 99.0250400 + 41.0131100 98.9863200 + 41.1598700 99.0189800 +1411 1411 -1 16 41.41380 99.08044 + 41.5238300 99.0213200 + 41.4756100 98.9793900 + 41.4657800 98.9789700 + 41.4461300 98.9781300 + 41.3281800 98.9731500 + 41.2787300 98.9843200 + 41.2670300 99.0633100 + 41.2854000 99.1171100 + 41.3725500 99.1740300 + 41.3722200 99.1872900 + 41.3820500 99.1877400 + 41.4432900 99.0975400 + 41.5124200 99.0873000 + 41.5606000 99.1293200 + 41.5232000 99.0478800 + 41.5238300 99.0213200 +1412 1412 -1 15 41.18790 98.92117 + 41.3281800 98.9731500 + 41.3192700 98.9330100 + 41.2897800 98.9317900 + 41.2227800 98.8495700 + 41.1447500 98.8199800 + 41.0878000 98.7252200 + 41.0476400 98.7632800 + 41.0649600 98.8696300 + 41.1605000 98.9925500 + 41.1598700 99.0189800 + 41.2277200 99.0616000 + 41.2854000 99.1171100 + 41.2670300 99.0633100 + 41.2787300 98.9843200 + 41.3281800 98.9731500 +1413 1413 -1 26 41.03090 98.65353 + 41.2230800 98.8363400 + 41.2048700 98.7694400 + 41.1658500 98.7546800 + 41.1568700 98.7146500 + 41.0796400 98.6456400 + 41.1011700 98.5539500 + 41.1208300 98.5546600 + 41.1213500 98.5282400 + 41.1017000 98.5275300 + 41.0323800 98.5514600 + 40.9990800 98.7350000 + 40.9204700 98.7319600 + 40.8988100 98.8233700 + 40.8493900 98.8345700 + 40.8485100 98.8740500 + 40.8386800 98.8736500 + 40.8482100 98.8872000 + 40.8467000 98.9529800 + 40.9348100 98.9698300 + 40.9756300 98.9055900 + 41.0187300 98.7357600 + 41.0476400 98.7632800 + 41.0878000 98.7252200 + 41.1447500 98.8199800 + 41.2227800 98.8495700 + 41.2230800 98.8363400 +1414 1414 -1 12 41.33440 98.88117 + 41.3511400 98.8282400 + 41.3126900 98.7869300 + 41.2930400 98.7861600 + 41.2439000 98.7842100 + 41.2230800 98.8363400 + 41.2227800 98.8495700 + 41.2897800 98.9317900 + 41.3192700 98.9330100 + 41.3281800 98.9731500 + 41.4461300 98.9781300 + 41.3499600 98.8812300 + 41.3511400 98.8282400 +1415 1415 -1 11 41.18630 98.69514 + 41.2930400 98.7861600 + 41.2444700 98.7577500 + 41.1208300 98.5546600 + 41.1011700 98.5539500 + 41.0796400 98.6456400 + 41.1568700 98.7146500 + 41.1658500 98.7546800 + 41.2048700 98.7694400 + 41.2230800 98.8363400 + 41.2439000 98.7842100 + 41.2930400 98.7861600 +1416 1416 -1 18 41.19180 98.62523 + 41.3332100 98.7479600 + 41.2663700 98.6526400 + 41.2193700 98.5449800 + 41.1999800 98.5310500 + 41.2209300 98.4656200 + 41.2020300 98.4252600 + 41.1135700 98.4222300 + 41.0334300 98.4987000 + 41.0323800 98.5514600 + 41.1017000 98.5275300 + 41.1213500 98.5282400 + 41.1208300 98.5546600 + 41.2444700 98.7577500 + 41.2930400 98.7861600 + 41.3126900 98.7869300 + 41.3511400 98.8282400 + 41.3323500 98.7877000 + 41.3332100 98.7479600 +1420 1420 -1 18 41.68590 99.05527 + 41.7975200 99.0998600 + 41.8485800 99.0219700 + 41.7247000 98.8433100 + 41.6749500 98.8679400 + 41.6740500 98.9078700 + 41.6347300 98.9062400 + 41.5843600 98.9573800 + 41.5253800 98.9549000 + 41.5238300 99.0213200 + 41.5232000 99.0478800 + 41.5606000 99.1293200 + 41.5799400 99.1434900 + 41.5691300 99.1829100 + 41.6654200 99.2672300 + 41.6766000 99.2144400 + 41.7260900 99.2033800 + 41.7575500 99.1247700 + 41.7975200 99.0998600 +1421 1421 -1 16 41.57800 98.86229 + 41.7247000 98.8433100 + 41.6579000 98.7473600 + 41.6191400 98.7192200 + 41.5506000 98.7032700 + 41.4317900 98.7385300 + 41.4312200 98.7650700 + 41.4508800 98.7658400 + 41.4657800 98.9789700 + 41.4756100 98.9793900 + 41.5238300 99.0213200 + 41.5253800 98.9549000 + 41.5843600 98.9573800 + 41.6347300 98.9062400 + 41.6740500 98.9078700 + 41.6749500 98.8679400 + 41.7247000 98.8433100 +1422 1422 -1 19 41.49120 98.68251 + 41.6500200 98.6538200 + 41.6210700 98.6261100 + 41.5424200 98.6231700 + 41.4531300 98.6596800 + 41.3750300 98.6302000 + 41.3733700 98.7097300 + 41.3332100 98.7479600 + 41.3323500 98.7877000 + 41.3511400 98.8282400 + 41.3499600 98.8812300 + 41.4461300 98.9781300 + 41.4657800 98.9789700 + 41.4508800 98.7658400 + 41.4312200 98.7650700 + 41.4317900 98.7385300 + 41.5506000 98.7032700 + 41.6191400 98.7192200 + 41.6489100 98.7070500 + 41.6500200 98.6538200 +1423 1423 -1 13 41.38090 98.60086 + 41.5424200 98.6231700 + 41.4845100 98.5678600 + 41.4257900 98.5524400 + 41.4170000 98.4990300 + 41.2605000 98.4537600 + 41.2305000 98.4791900 + 41.2193700 98.5449800 + 41.2663700 98.6526400 + 41.3332100 98.7479600 + 41.3733700 98.7097300 + 41.3750300 98.6302000 + 41.4531300 98.6596800 + 41.5424200 98.6231700 +1424 1424 -1 20 41.46640 98.49505 + 41.5468400 98.3972700 + 41.4684300 98.3813200 + 41.4200100 98.3398600 + 41.3118700 98.3362700 + 41.2819000 98.3617700 + 41.2909900 98.4018200 + 41.4175200 98.4725000 + 41.4170000 98.4990300 + 41.4257900 98.5524400 + 41.4845100 98.5678600 + 41.5424200 98.6231700 + 41.6210700 98.6261100 + 41.6500200 98.6538200 + 41.6508400 98.6139000 + 41.6311800 98.6131700 + 41.6319800 98.5732600 + 41.6327700 98.5333400 + 41.5939700 98.5053300 + 41.5949900 98.4521400 + 41.5468400 98.3972700 +1425 1425 -1 19 41.27230 98.33995 + 41.4020100 98.2463700 + 41.2856300 98.1499300 + 41.2268800 98.1349100 + 41.1145700 98.3694000 + 41.1135700 98.4222300 + 41.2020300 98.4252600 + 41.2209300 98.4656200 + 41.1999800 98.5310500 + 41.2193700 98.5449800 + 41.2305000 98.4791900 + 41.2605000 98.4537600 + 41.4170000 98.4990300 + 41.4175200 98.4725000 + 41.2909900 98.4018200 + 41.2819000 98.3617700 + 41.3118700 98.3362700 + 41.4200100 98.3398600 + 41.4310300 98.2738500 + 41.4020100 98.2463700 +1426 1426 -1 11 41.31990 98.07302 + 41.3762700 98.0200600 + 41.3680600 97.9137300 + 41.3387700 97.8996700 + 41.2793900 97.9245600 + 41.2268800 98.1349100 + 41.2856300 98.1499300 + 41.4020100 98.2463700 + 41.4129800 98.1803700 + 41.3741100 98.1526300 + 41.3649400 98.1125600 + 41.3762700 98.0200600 +1427 1427 -1 14 41.78970 98.69801 + 41.8312500 98.4470600 + 41.8216700 98.4333700 + 41.8020000 98.4326900 + 41.7233300 98.4299600 + 41.7018700 98.5225100 + 41.7215300 98.5232200 + 41.7385200 98.6571700 + 41.7857200 98.7523700 + 41.7969700 98.6860800 + 41.7502400 98.5642600 + 41.8095100 98.5530900 + 41.8775600 98.5956500 + 41.7512900 98.5109600 + 41.8312500 98.4470600 +1428 1428 -1 19 41.66610 98.33966 + 41.7761200 98.2316800 + 41.7171100 98.2298000 + 41.6207900 98.1069600 + 41.5912900 98.1060700 + 41.5307400 98.1973100 + 41.5302800 98.2238800 + 41.5693800 98.2384200 + 41.5979400 98.2925600 + 41.5468400 98.3972700 + 41.5949900 98.4521400 + 41.5939700 98.5053300 + 41.6327700 98.5333400 + 41.6319800 98.5732600 + 41.7016100 98.5358300 + 41.7018700 98.5225100 + 41.7233300 98.4299600 + 41.8020000 98.4326900 + 41.7857200 98.2453300 + 41.7761200 98.2316800 +1429 1429 -1 17 41.49290 98.20386 + 41.6207900 98.1069600 + 41.5042900 98.0104400 + 41.3762700 98.0200600 + 41.3649400 98.1125600 + 41.3741100 98.1526300 + 41.4129800 98.1803700 + 41.4020100 98.2463700 + 41.4310300 98.2738500 + 41.4200100 98.3398600 + 41.4684300 98.3813200 + 41.5468400 98.3972700 + 41.5979400 98.2925600 + 41.5693800 98.2384200 + 41.5302800 98.2238800 + 41.5307400 98.1973100 + 41.5912900 98.1060700 + 41.6207900 98.1069600 +1430 1430 -1 19 41.55790 97.97990 + 41.7672000 98.1780500 + 41.7184700 98.1498700 + 41.6319100 98.0274100 + 41.5925800 98.0262800 + 41.5833700 97.9861000 + 41.5245700 97.9711500 + 41.4185800 97.8222000 + 41.4297000 97.7295700 + 41.3707000 97.7281200 + 41.3692300 97.8341800 + 41.3387700 97.8996700 + 41.3680600 97.9137300 + 41.3762700 98.0200600 + 41.5042900 98.0104400 + 41.6207900 98.1069600 + 41.7171100 98.2298000 + 41.7761200 98.2316800 + 41.7770300 98.1783500 + 41.7672000 98.1780500 +1431 1431 -1 21 41.87420 98.27620 + 41.9346300 98.1698900 + 41.9162800 98.0891200 + 41.8777800 98.0345400 + 41.8482700 98.0336800 + 41.8083000 98.0725600 + 41.7689600 98.0713900 + 41.7672000 98.1780500 + 41.7770300 98.1783500 + 41.7761200 98.2316800 + 41.7857200 98.2453300 + 41.8020000 98.4326900 + 41.8216700 98.4333700 + 41.8312500 98.4470600 + 41.8229100 98.3666700 + 41.8728200 98.3282800 + 41.9212600 98.3700000 + 41.9288400 98.4905900 + 41.9676600 98.5187200 + 41.9812500 98.3185100 + 41.9428600 98.2637500 + 41.9346300 98.1698900 +1432 1432 -1 19 41.63380 97.95381 + 41.8482700 98.0336800 + 41.8491100 97.9802900 + 41.7905000 97.9519500 + 41.7523500 97.8708700 + 41.7228400 97.8700900 + 41.7237900 97.8034700 + 41.6742400 97.8288300 + 41.5475100 97.7457700 + 41.4297000 97.7295700 + 41.4185800 97.8222000 + 41.5245700 97.9711500 + 41.5833700 97.9861000 + 41.5925800 98.0262800 + 41.6319100 98.0274100 + 41.7184700 98.1498700 + 41.7672000 98.1780500 + 41.7689600 98.0713900 + 41.8083000 98.0725600 + 41.8482700 98.0336800 +1434 1434 -1 18 41.54720 97.70525 + 41.5485700 97.6660200 + 41.5194100 97.6387500 + 41.5009000 97.5453100 + 41.4714000 97.5446600 + 41.4724800 97.4517200 + 41.4340200 97.3712800 + 41.4143600 97.3709000 + 41.4027300 97.5298800 + 41.4010700 97.6625300 + 41.3812400 97.6753200 + 41.3712300 97.6883500 + 41.3707000 97.7281200 + 41.4297000 97.7295700 + 41.5475100 97.7457700 + 41.6742400 97.8288300 + 41.7237900 97.8034700 + 41.7048600 97.7496800 + 41.5485700 97.6660200 +1601 1601 -1 43 42.04000 95.64500 + 42.1200000 95.7500000 + 42.1700000 95.7200000 + 42.2000000 95.6700000 + 42.2200000 95.6300000 + 42.3000000 95.5200000 + 42.2800000 95.4500000 + 42.3000000 95.4300000 + 42.3000000 95.4000000 + 42.2700000 95.3800000 + 42.2800000 95.3500000 + 42.2700000 95.3200000 + 42.2300000 95.3300000 + 42.2200000 95.3700000 + 42.2000000 95.3800000 + 42.2000000 95.4000000 + 42.1700000 95.4200000 + 42.1200000 95.3800000 + 42.1000000 95.4200000 + 42.0800000 95.4800000 + 42.0300000 95.5500000 + 42.0300000 95.5800000 + 42.0200000 95.6300000 + 42.0000000 95.6700000 + 42.0000000 95.6800000 + 41.9300000 95.7000000 + 41.9200000 95.7500000 + 41.8700000 95.7500000 + 41.8500000 95.8200000 + 41.8000000 95.8500000 + 41.8000000 95.8700000 + 41.7800000 95.9000000 + 41.8300000 95.9300000 + 41.8500000 95.9700000 + 41.9000000 95.9500000 + 41.9200000 95.9300000 + 41.9700000 95.9200000 + 41.9800000 95.8700000 + 42.0200000 95.8500000 + 42.0300000 95.8300000 + 42.0700000 95.8300000 + 42.0800000 95.8000000 + 42.0800000 95.7700000 + 42.1200000 95.7500000 +1602 1602 -1 74 42.12500 95.20283 + 42.6300000 95.2800000 + 42.6000000 95.2000000 + 42.5800000 95.1300000 + 42.5200000 95.1000000 + 42.5000000 95.1200000 + 42.4700000 95.1000000 + 42.3700000 95.0800000 + 42.3200000 95.0700000 + 42.3200000 95.0300000 + 42.2700000 95.0500000 + 42.2300000 95.0300000 + 42.2200000 95.0000000 + 42.2000000 95.0200000 + 42.1500000 95.0300000 + 42.1200000 95.0200000 + 42.0800000 95.0200000 + 42.0700000 95.0200000 + 42.0500000 95.0300000 + 42.0300000 95.0300000 + 42.0200000 95.0500000 + 42.0300000 95.0800000 + 42.0200000 95.1300000 + 42.0200000 95.1500000 + 42.0000000 95.1800000 + 41.9800000 95.2300000 + 41.9500000 95.2300000 + 41.9500000 95.2800000 + 41.9200000 95.2800000 + 41.9200000 95.3000000 + 41.9000000 95.3800000 + 41.8700000 95.4000000 + 41.8800000 95.4300000 + 41.8500000 95.4200000 + 41.8000000 95.4800000 + 41.7800000 95.4800000 + 41.7700000 95.5200000 + 41.7200000 95.5500000 + 41.7300000 95.5800000 + 41.6500000 95.6300000 + 41.6300000 95.6300000 + 41.6200000 95.6500000 + 41.6200000 95.7200000 + 41.6500000 95.7800000 + 41.6500000 95.8000000 + 41.7000000 95.8000000 + 41.7700000 95.7300000 + 41.8000000 95.7300000 + 41.8200000 95.7000000 + 41.8700000 95.7000000 + 41.8800000 95.6700000 + 41.9200000 95.6500000 + 41.9300000 95.6200000 + 41.9800000 95.5800000 + 42.0000000 95.5700000 + 42.0300000 95.5500000 + 42.0800000 95.4800000 + 42.1000000 95.4200000 + 42.1200000 95.3800000 + 42.1700000 95.4200000 + 42.2000000 95.4000000 + 42.2000000 95.3800000 + 42.2200000 95.3700000 + 42.2300000 95.3300000 + 42.2700000 95.3200000 + 42.2800000 95.2500000 + 42.3200000 95.2200000 + 42.3500000 95.2200000 + 42.3700000 95.2300000 + 42.4300000 95.2300000 + 42.4500000 95.2700000 + 42.5200000 95.2800000 + 42.5300000 95.3000000 + 42.5700000 95.3000000 + 42.6300000 95.2800000 +1603 WEEPING WATER CR. AT UNION NE -1 262 40.81000 96.30667 + 40.7912500 95.9108130 + 40.7850210 95.9087500 + 40.7808130 95.9087500 + 40.7787500 95.9066880 + 40.7766880 95.9004170 + 40.7683130 95.9004170 + 40.7620830 95.9066460 + 40.7620830 95.9108540 + 40.7599790 95.9129170 + 40.7579170 95.9150210 + 40.7516880 95.9212500 + 40.7433130 95.9212500 + 40.7412500 95.9233540 + 40.7391460 95.9254170 + 40.7370830 95.9233130 + 40.7308130 95.9212500 + 40.7287500 95.9233130 + 40.7287500 95.9400210 + 40.7266880 95.9420830 + 40.7224790 95.9420830 + 40.7204170 95.9441880 + 40.7183540 95.9462500 + 40.7141460 95.9462500 + 40.7120830 95.9483540 + 40.7099790 95.9504170 + 40.7079170 95.9525210 + 40.7058540 95.9545830 + 40.7016460 95.9545830 + 40.6995830 95.9545830 + 40.6954170 95.9733540 + 40.6975210 95.9754170 + 40.6995830 95.9775210 + 40.7058130 95.9837500 + 40.7141880 95.9837500 + 40.7162500 95.9858540 + 40.7183540 95.9879170 + 40.7204170 95.9899790 + 40.7204170 96.0316880 + 40.7225210 96.0337500 + 40.7245830 96.0358130 + 40.7245830 96.0400210 + 40.7224790 96.0420830 + 40.7204170 96.0441880 + 40.7225210 96.0462500 + 40.7245830 96.0483130 + 40.7245830 96.0525210 + 40.7266880 96.0545830 + 40.7287500 96.0566880 + 40.7308540 96.0587500 + 40.7329170 96.0608130 + 40.7329170 96.0733540 + 40.7349790 96.0754170 + 40.7391880 96.0754170 + 40.7412500 96.0775210 + 40.7433540 96.0795830 + 40.7454170 96.0816460 + 40.7474790 96.0879170 + 40.7516880 96.0879170 + 40.7620830 96.0983130 + 40.7620830 96.1275210 + 40.7641880 96.1295830 + 40.7662500 96.1316460 + 40.7662500 96.1358540 + 40.7683540 96.1379170 + 40.7704170 96.1399790 + 40.7704170 96.1441880 + 40.7725210 96.1462500 + 40.7745830 96.1483130 + 40.7745830 96.1816880 + 40.7766880 96.1837500 + 40.7787500 96.1858540 + 40.7808540 96.1879170 + 40.7829170 96.1899790 + 40.7829170 96.1941880 + 40.7849790 96.1962500 + 40.7891880 96.1962500 + 40.7912500 96.1983540 + 40.7933130 96.2004170 + 40.8016880 96.2004170 + 40.8037500 96.2025210 + 40.8058130 96.2045830 + 40.8141880 96.2045830 + 40.8162500 96.2066880 + 40.8183540 96.2087500 + 40.8204170 96.2108540 + 40.8225210 96.2129170 + 40.8245830 96.2150210 + 40.8266460 96.2170830 + 40.8308540 96.2170830 + 40.8329170 96.2191460 + 40.8329170 96.2358540 + 40.8350210 96.2379170 + 40.8370830 96.2399790 + 40.8370830 96.2441880 + 40.8391880 96.2462500 + 40.8412500 96.2483130 + 40.8412500 96.2525210 + 40.8391460 96.2545830 + 40.8370830 96.2566460 + 40.8370830 96.2608540 + 40.8349790 96.2629170 + 40.8329170 96.2691880 + 40.8308130 96.2712500 + 40.8287500 96.2733540 + 40.8266880 96.2754170 + 40.8058130 96.2754170 + 40.8037500 96.2775210 + 40.8016880 96.2795830 + 40.7933130 96.2795830 + 40.7912500 96.2816880 + 40.7891460 96.2837500 + 40.7870830 96.2858130 + 40.7870830 96.2900210 + 40.7891880 96.2920830 + 40.7912500 96.2941460 + 40.7912500 96.3066880 + 40.7933540 96.3087500 + 40.7954170 96.3108130 + 40.7954170 96.3233540 + 40.7975210 96.3254170 + 40.7995830 96.3275210 + 40.8016880 96.3295830 + 40.8037500 96.3316880 + 40.8058540 96.3337500 + 40.8079170 96.3358540 + 40.8100210 96.3379170 + 40.8120830 96.3399790 + 40.8120830 96.3650210 + 40.8141460 96.3670830 + 40.8183540 96.3670830 + 40.8204170 96.3691460 + 40.8204170 96.3775210 + 40.8183130 96.3795830 + 40.8162500 96.3816880 + 40.8183540 96.3837500 + 40.8204170 96.3858540 + 40.8225210 96.3879170 + 40.8245830 96.3899790 + 40.8245830 96.3941880 + 40.8245830 96.3962500 + 40.8266880 96.3962500 + 40.8287500 96.3983130 + 40.8308130 96.4004170 + 40.8391880 96.4004170 + 40.8412500 96.3983540 + 40.8433130 96.3962500 + 40.8766880 96.3962500 + 40.8787500 96.3941880 + 40.8808130 96.3920830 + 40.8829170 96.3900210 + 40.8829170 96.3858130 + 40.8849790 96.3837500 + 40.8870830 96.3816880 + 40.8870830 96.3399790 + 40.8850210 96.3379170 + 40.8808130 96.3379170 + 40.8787500 96.3358540 + 40.8787500 96.3274790 + 40.8808130 96.3254170 + 40.8850210 96.3254170 + 40.8891460 96.3212500 + 40.8933540 96.3212500 + 40.8954170 96.3191880 + 40.8954170 96.3108130 + 40.8974790 96.3087500 + 40.9016880 96.3087500 + 40.9037500 96.3066880 + 40.9058130 96.3045830 + 40.9079170 96.3025210 + 40.9079170 96.2941460 + 40.9225210 96.2837500 + 40.9245830 96.2837500 + 40.9245830 96.2816460 + 40.9266460 96.2795830 + 40.9287500 96.2775210 + 40.9287500 96.2691460 + 40.9266880 96.2670830 + 40.9245830 96.2650210 + 40.9245830 96.2566460 + 40.9225210 96.2545830 + 40.9204170 96.2525210 + 40.9204170 96.2399790 + 40.9183540 96.2379170 + 40.9162500 96.2358540 + 40.9141880 96.2337500 + 40.9120830 96.2316880 + 40.9120830 96.1983130 + 40.9141460 96.1962500 + 40.9162500 96.1941880 + 40.9162500 96.1899790 + 40.9183130 96.1879170 + 40.9204170 96.1858540 + 40.9224790 96.1837500 + 40.9266880 96.1837500 + 40.9287500 96.1816880 + 40.9287500 96.1733130 + 40.9162500 96.1545830 + 40.9141460 96.1545830 + 40.9120830 96.1441460 + 40.9100210 96.1420830 + 40.9079170 96.1400210 + 40.9058540 96.1337500 + 40.9037500 96.1316880 + 40.9037500 96.1149790 + 40.9016880 96.1129170 + 40.8995830 96.1108540 + 40.8995830 96.0899790 + 40.9016460 96.0879170 + 40.9141880 96.0879170 + 40.9162500 96.0774790 + 40.9141880 96.0754170 + 40.9120830 96.0441460 + 40.9141460 96.0420830 + 40.9162500 96.0400210 + 40.9162500 96.0024790 + 40.9141880 96.0004170 + 40.9120830 95.9983540 + 40.9100210 95.9962500 + 40.9079170 95.9941880 + 40.9079170 95.9899790 + 40.9099790 95.9879170 + 40.9120830 95.9858540 + 40.9100210 95.9837500 + 40.9079170 95.9816880 + 40.9079170 95.9774790 + 40.9058540 95.9754170 + 40.9037500 95.9733540 + 40.9037500 95.9608130 + 40.8891460 95.9587500 + 40.8870830 95.9566880 + 40.8870830 95.9399790 + 40.8850210 95.9379170 + 40.8808130 95.9379170 + 40.8787500 95.9358540 + 40.8787500 95.9316460 + 40.8766880 95.9295830 + 40.8745830 95.9275210 + 40.8725210 95.9254170 + 40.8683130 95.9254170 + 40.8662500 95.9233540 + 40.8641880 95.9212500 + 40.8620830 95.9191880 + 40.8620830 95.9149790 + 40.8600210 95.9129170 + 40.8558130 95.9129170 + 40.8537500 95.9108540 + 40.8516880 95.9087500 + 40.8495830 95.9108130 + 40.8475210 95.9129170 + 40.8412500 95.9108540 + 40.8391880 95.9087500 + 40.8370830 95.9066880 + 40.8350210 95.9045830 + 40.8329170 95.9066460 + 40.8308540 95.9087500 + 40.8287500 95.9108130 + 40.8266880 95.9129170 + 40.8120830 95.9149790 + 40.8100210 95.9170830 + 40.8079170 95.9150210 + 40.7974790 95.9129170 + 40.7912500 95.9108130 +1604 1604 -1 40 41.62500 94.86500 + 41.7200000 94.9700000 + 41.7300000 94.9700000 + 41.7700000 94.9700000 + 41.8000000 94.9000000 + 41.8800000 94.9700000 + 41.9200000 94.9800000 + 41.9200000 94.9500000 + 41.9200000 94.9000000 + 41.8800000 94.8700000 + 41.8700000 94.8300000 + 41.8000000 94.8000000 + 41.7700000 94.7500000 + 41.7000000 94.7200000 + 41.6500000 94.6700000 + 41.6300000 94.6700000 + 41.6200000 94.6500000 + 41.6000000 94.7000000 + 41.5800000 94.7000000 + 41.5700000 94.6700000 + 41.5300000 94.6700000 + 41.5200000 94.7000000 + 41.5000000 94.7200000 + 41.5000000 94.7300000 + 41.4500000 94.8200000 + 41.4700000 94.8300000 + 41.4500000 94.8700000 + 41.4300000 94.8700000 + 41.3800000 95.0300000 + 41.3300000 95.0700000 + 41.3500000 95.0800000 + 41.4300000 95.0800000 + 41.4500000 95.0700000 + 41.5300000 95.0500000 + 41.5500000 95.0500000 + 41.5800000 94.9800000 + 41.5800000 94.9700000 + 41.6200000 94.9300000 + 41.6500000 94.9700000 + 41.6800000 94.9500000 + 41.7200000 94.9700000 +1605 1605 -1 22 41.41500 94.85500 + 41.5300000 94.6700000 + 41.4800000 94.6300000 + 41.4500000 94.7300000 + 41.4000000 94.7500000 + 41.4000000 94.7800000 + 41.3700000 94.8200000 + 41.3500000 94.8200000 + 41.3000000 94.9200000 + 41.3000000 94.9500000 + 41.3000000 95.0500000 + 41.3200000 95.0700000 + 41.3200000 95.0800000 + 41.3300000 95.0700000 + 41.3800000 95.0300000 + 41.4300000 94.8700000 + 41.4500000 94.8700000 + 41.4700000 94.8300000 + 41.4500000 94.8200000 + 41.5000000 94.7300000 + 41.5000000 94.7200000 + 41.5200000 94.7000000 + 41.5300000 94.6700000 +1606 1606 -1 27 41.22500 95.16000 + 41.3300000 95.0700000 + 41.3200000 95.0800000 + 41.3200000 95.0700000 + 41.3000000 95.0500000 + 41.2300000 95.0500000 + 41.2000000 95.0500000 + 41.2000000 95.0700000 + 41.1200000 95.1000000 + 41.1000000 95.1200000 + 41.0500000 95.1300000 + 41.0300000 95.1500000 + 41.0500000 95.1700000 + 41.0200000 95.2200000 + 41.0200000 95.2300000 + 41.0200000 95.2700000 + 41.1500000 95.2000000 + 41.2300000 95.1700000 + 41.2700000 95.1700000 + 41.2800000 95.1800000 + 41.3200000 95.2000000 + 41.3200000 95.1700000 + 41.3200000 95.1300000 + 41.3200000 95.1200000 + 41.4200000 95.1200000 + 41.4300000 95.0800000 + 41.3500000 95.0800000 + 41.3300000 95.0700000 +1607 W. NISHNABOTNA RIVER AT HANCOCK IA -1 516 41.71000 95.18167 + 41.3891460 95.3712500 + 41.4037500 95.3941460 + 41.4037500 95.4066880 + 41.4058130 95.4087500 + 41.4141880 95.4087500 + 41.4162500 95.4066460 + 41.4224790 95.4004170 + 41.4266880 95.4004170 + 41.4287500 95.4025210 + 41.4308130 95.4045830 + 41.4350210 95.4045830 + 41.4370830 95.4024790 + 41.4391460 95.4004170 + 41.4433540 95.4004170 + 41.4454170 95.3983130 + 41.4474790 95.3962500 + 41.4516880 95.3962500 + 41.4537500 95.3983130 + 41.4558130 95.4087500 + 41.4600210 95.4087500 + 41.4620830 95.4066460 + 41.4641460 95.4045830 + 41.4683540 95.4045830 + 41.4704170 95.4025210 + 41.4704170 95.3941460 + 41.4725210 95.3920830 + 41.4745830 95.3900210 + 41.4745830 95.3858130 + 41.4766460 95.3837500 + 41.4933540 95.3837500 + 41.4954170 95.3858540 + 41.4974790 95.3879170 + 41.5016880 95.3879170 + 41.5037500 95.3899790 + 41.5100210 95.4004170 + 41.5120830 95.3983130 + 41.5141880 95.3962500 + 41.5162500 95.3941460 + 41.5183130 95.3920830 + 41.5266880 95.3920830 + 41.5287500 95.3899790 + 41.5308540 95.3879170 + 41.5329170 95.3858130 + 41.5350210 95.3837500 + 41.5370830 95.3816460 + 41.5391880 95.3795830 + 41.5412500 95.3774790 + 41.5474790 95.3712500 + 41.5516880 95.3712500 + 41.5537500 95.3733130 + 41.5537500 95.3816880 + 41.5558540 95.3837500 + 41.5579170 95.3858540 + 41.5599790 95.3879170 + 41.5683540 95.3879170 + 41.5704170 95.3858130 + 41.5724790 95.3837500 + 41.5766880 95.3837500 + 41.5787500 95.3816460 + 41.5808130 95.3795830 + 41.5850210 95.3795830 + 41.5870830 95.3774790 + 41.5891460 95.3754170 + 41.5933540 95.3754170 + 41.5954170 95.3733130 + 41.5974790 95.3712500 + 41.6016880 95.3712500 + 41.6037500 95.3691460 + 41.6058130 95.3670830 + 41.6100210 95.3670830 + 41.6120830 95.3649790 + 41.6141460 95.3629170 + 41.6433540 95.3629170 + 41.6454170 95.3650210 + 41.6474790 95.3670830 + 41.6558540 95.3670830 + 41.6579170 95.3649790 + 41.6599790 95.3629170 + 41.6641880 95.3629170 + 41.6662500 95.3608130 + 41.6683540 95.3587500 + 41.6704170 95.3566460 + 41.6724790 95.3545830 + 41.7016880 95.3545830 + 41.7037500 95.3524790 + 41.7058130 95.3504170 + 41.7100210 95.3504170 + 41.7120830 95.3525210 + 41.7141880 95.3545830 + 41.7162500 95.3566460 + 41.7162500 95.3608540 + 41.7183540 95.3629170 + 41.7204170 95.3650210 + 41.7225210 95.3670830 + 41.7245830 95.3691880 + 41.7266460 95.3712500 + 41.7370830 95.3774790 + 41.7370830 95.3816880 + 41.7391880 95.3837500 + 41.7412500 95.3858130 + 41.7412500 95.3900210 + 41.7412500 95.3920830 + 41.7600210 95.3920830 + 41.7620830 95.3941460 + 41.7641460 95.3962500 + 41.7683540 95.3962500 + 41.7704170 95.3941880 + 41.7724790 95.3920830 + 41.7745830 95.3900210 + 41.7766460 95.3879170 + 41.7787500 95.3858540 + 41.7787500 95.3816460 + 41.7808130 95.3795830 + 41.7829170 95.3775210 + 41.7829170 95.3691460 + 41.7849790 95.3670830 + 41.7891880 95.3670830 + 41.7912500 95.3691460 + 41.7933130 95.3712500 + 41.7954170 95.3733130 + 41.7974790 95.3754170 + 41.8016880 95.3754170 + 41.8037500 95.3774790 + 41.8058130 95.3795830 + 41.8100210 95.3795830 + 41.8120830 95.3816460 + 41.8141460 95.3837500 + 41.8183540 95.3837500 + 41.8204170 95.3858130 + 41.8224790 95.3879170 + 41.8245830 95.3899790 + 41.8245830 95.3983540 + 41.8266460 95.4004170 + 41.8287500 95.4024790 + 41.8412500 95.4149790 + 41.8412500 95.4191880 + 41.8433130 95.4212500 + 41.8558130 95.4254170 + 41.8600210 95.4254170 + 41.8620830 95.4274790 + 41.8641460 95.4295830 + 41.8725210 95.4295830 + 41.8745830 95.4316460 + 41.8766460 95.4337500 + 41.8808540 95.4337500 + 41.8829170 95.4316880 + 41.8849790 95.4295830 + 41.8870830 95.4275210 + 41.8870830 95.4191460 + 41.8850210 95.4170830 + 41.8829170 95.4150210 + 41.8829170 95.4108130 + 41.8808540 95.4087500 + 41.8787500 95.4066880 + 41.8766880 95.4045830 + 41.8724790 95.4045830 + 41.8704170 95.4025210 + 41.8724790 95.4004170 + 41.8745830 95.3983540 + 41.8766460 95.3962500 + 41.8850210 95.3962500 + 41.8870830 95.3941880 + 41.8891460 95.3920830 + 41.8912500 95.3900210 + 41.8891880 95.3879170 + 41.8870830 95.3858540 + 41.8870830 95.3733130 + 41.8891460 95.3712500 + 41.8912500 95.3691880 + 41.8933130 95.3670830 + 41.8954170 95.3650210 + 41.8974790 95.3629170 + 41.8995830 95.3608540 + 41.8995830 95.3524790 + 41.9016460 95.3504170 + 41.9037500 95.3483540 + 41.9058130 95.3462500 + 41.9079170 95.3441880 + 41.9099790 95.3420830 + 41.9120830 95.3400210 + 41.9141460 95.3379170 + 41.9162500 95.3358540 + 41.9162500 95.3274790 + 41.9183130 95.3254170 + 41.9204170 95.3233540 + 41.9204170 95.3108130 + 41.9224790 95.3087500 + 41.9245830 95.3066880 + 41.9245830 95.2899790 + 41.9266460 95.2879170 + 41.9391880 95.2879170 + 41.9475210 95.2962500 + 41.9495830 95.2962500 + 41.9495830 95.2941460 + 41.9516460 95.2920830 + 41.9537500 95.2900210 + 41.9537500 95.2858130 + 41.9558130 95.2837500 + 41.9579170 95.2816880 + 41.9579170 95.2774790 + 41.9558540 95.2754170 + 41.9537500 95.2733540 + 41.9537500 95.2608130 + 41.9558130 95.2587500 + 41.9579170 95.2566880 + 41.9579170 95.2524790 + 41.9599790 95.2504170 + 41.9641880 95.2504170 + 41.9683130 95.2462500 + 41.9808540 95.2462500 + 41.9829170 95.2441880 + 41.9829170 95.2399790 + 41.9849790 95.2379170 + 41.9870830 95.2358540 + 41.9850210 95.2337500 + 41.9829170 95.2316880 + 41.9829170 95.2191460 + 41.9849790 95.2170830 + 41.9870830 95.2150210 + 41.9891460 95.2129170 + 41.9912500 95.2108540 + 41.9912500 95.2024790 + 41.9933130 95.2004170 + 41.9975210 95.2004170 + 41.9995830 95.1983540 + 42.0016460 95.1962500 + 42.0037500 95.1941880 + 42.0058130 95.1920830 + 42.0079170 95.1900210 + 42.0079170 95.1858130 + 42.0099790 95.1837500 + 42.0120830 95.1816880 + 42.0141460 95.1795830 + 42.0162500 95.1775210 + 42.0183130 95.1754170 + 42.0204170 95.1733540 + 42.0183540 95.1712500 + 42.0162500 95.1691880 + 42.0141880 95.1670830 + 42.0120830 95.1650210 + 42.0120830 95.1441460 + 42.0141460 95.1420830 + 42.0162500 95.1400210 + 42.0162500 95.1274790 + 42.0183130 95.1254170 + 42.0225210 95.1254170 + 42.0245830 95.1233540 + 42.0245830 95.1191460 + 42.0266460 95.1170830 + 42.0287500 95.1150210 + 42.0287500 95.1066460 + 42.0308130 95.1045830 + 42.0329170 95.1025210 + 42.0308540 95.1004170 + 42.0287500 95.0983540 + 42.0266880 95.0962500 + 42.0245830 95.0941880 + 42.0225210 95.0920830 + 42.0204170 95.0900210 + 42.0204170 95.0816460 + 42.0224790 95.0795830 + 42.0245830 95.0775210 + 42.0245830 95.0649790 + 42.0370830 95.0525210 + 42.0370830 95.0441460 + 42.0391880 95.0420830 + 42.0412500 95.0420830 + 42.0412500 95.0358130 + 42.0391880 95.0337500 + 42.0370830 95.0316880 + 42.0370830 95.0233130 + 42.0350210 95.0212500 + 42.0266460 95.0212500 + 42.0245830 95.0191880 + 42.0225210 95.0170830 + 42.0183130 95.0170830 + 42.0162500 95.0150210 + 42.0141880 95.0129170 + 42.0099790 95.0129170 + 42.0079170 95.0108540 + 42.0079170 95.0066460 + 42.0058540 95.0045830 + 41.9933130 95.0045830 + 41.9912500 95.0025210 + 41.9912500 94.9983130 + 41.9850210 94.9920830 + 41.9724790 94.9920830 + 41.9704170 94.9900210 + 41.9704170 94.9858130 + 41.9683540 94.9837500 + 41.9641460 94.9837500 + 41.9620830 94.9816880 + 41.9620830 94.9774790 + 41.9600210 94.9754170 + 41.9558130 94.9754170 + 41.9537500 94.9733540 + 41.9537500 94.9691460 + 41.9516880 94.9670830 + 41.9433130 94.9670830 + 41.9412500 94.9650210 + 41.9391880 94.9629170 + 41.9308130 94.9629170 + 41.9287500 94.9608540 + 41.9266880 94.9587500 + 41.9224790 94.9587500 + 41.9204170 94.9608130 + 41.9204170 94.9650210 + 41.9183540 94.9670830 + 41.9162500 94.9691460 + 41.9141880 94.9712500 + 41.9120830 94.9733130 + 41.9141460 94.9754170 + 41.9162500 94.9774790 + 41.9162500 94.9858540 + 41.9141880 94.9879170 + 41.9120830 94.9899790 + 41.9100210 94.9920830 + 41.9016460 94.9920830 + 41.8995830 94.9900210 + 41.8995830 94.9858130 + 41.8975210 94.9837500 + 41.8933130 94.9837500 + 41.8891880 94.9795830 + 41.8766460 94.9795830 + 41.8745830 94.9733130 + 41.8725210 94.9712500 + 41.8704170 94.9691880 + 41.8683540 94.9670830 + 41.8662500 94.9650210 + 41.8641880 94.9629170 + 41.8620830 94.9608540 + 41.8600210 94.9587500 + 41.8579170 94.9566880 + 41.8558540 94.9545830 + 41.8516460 94.9545830 + 41.8495830 94.9525210 + 41.8495830 94.9441460 + 41.8475210 94.9420830 + 41.8454170 94.9400210 + 41.8454170 94.9358130 + 41.8433540 94.9337500 + 41.8370830 94.9316880 + 41.8350210 94.9295830 + 41.8308130 94.9295830 + 41.8287500 94.9275210 + 41.8266880 94.9212500 + 41.8120830 94.9191880 + 41.8100210 94.9170830 + 41.8058130 94.9170830 + 41.7954170 94.9274790 + 41.7933540 94.9295830 + 41.7912500 94.9316460 + 41.7912500 94.9441880 + 41.7891880 94.9462500 + 41.7849790 94.9462500 + 41.7829170 94.9441880 + 41.7808540 94.9420830 + 41.7787500 94.9441460 + 41.7766880 94.9462500 + 41.7745830 94.9483130 + 41.7745830 94.9566880 + 41.7725210 94.9587500 + 41.7704170 94.9608130 + 41.7683540 94.9629170 + 41.7662500 94.9649790 + 41.7641880 94.9670830 + 41.7620830 94.9691460 + 41.7620830 94.9733540 + 41.7600210 94.9754170 + 41.7474790 94.9754170 + 41.7454170 94.9733540 + 41.7433540 94.9712500 + 41.7308130 94.9712500 + 41.7287500 94.9733130 + 41.7266880 94.9754170 + 41.7183130 94.9712500 + 41.7162500 94.9712500 + 41.7100210 94.9837500 + 41.7058130 94.9837500 + 41.7037500 94.9858130 + 41.7037500 94.9983540 + 41.7058130 95.0004170 + 41.7100210 95.0004170 + 41.7120830 95.0024790 + 41.7100210 95.0129170 + 41.7037500 95.0149790 + 41.7037500 95.0400210 + 41.7016460 95.0420830 + 41.6995830 95.0441880 + 41.6975210 95.0462500 + 41.6933130 95.0462500 + 41.6912500 95.0483130 + 41.6912500 95.0608540 + 41.6933540 95.0629170 + 41.6954170 95.0649790 + 41.6954170 95.0691880 + 41.6933130 95.0712500 + 41.6912500 95.0733540 + 41.6891460 95.0754170 + 41.6870830 95.0774790 + 41.6870830 95.1066880 + 41.6891880 95.1087500 + 41.6912500 95.1108130 + 41.6912500 95.1191880 + 41.6891460 95.1212500 + 41.6870830 95.1233130 + 41.6870830 95.1275210 + 41.6849790 95.1295830 + 41.6829170 95.1316880 + 41.6808130 95.1337500 + 41.6787500 95.1358540 + 41.6766460 95.1379170 + 41.6745830 95.1400210 + 41.6725210 95.1420830 + 41.6683130 95.1420830 + 41.6495830 95.1608130 + 41.6495830 95.1650210 + 41.6475210 95.1670830 + 41.6391460 95.1670830 + 41.6370830 95.1691880 + 41.6350210 95.1712500 + 41.6308130 95.1712500 + 41.6287500 95.1733540 + 41.6266880 95.1754170 + 41.6224790 95.1754170 + 41.6204170 95.1733130 + 41.6183130 95.1712500 + 41.6162500 95.1691460 + 41.6141460 95.1670830 + 41.6120830 95.1649790 + 41.6100210 95.1629170 + 41.6058130 95.1629170 + 41.6037500 95.1649790 + 41.6037500 95.1691880 + 41.6016460 95.1712500 + 41.5995830 95.1733540 + 41.5974790 95.1754170 + 41.5954170 95.1774790 + 41.5954170 95.1816880 + 41.5933540 95.1837500 + 41.5891460 95.1837500 + 41.5870830 95.1858540 + 41.5850210 95.1879170 + 41.5808130 95.1879170 + 41.5787500 95.1900210 + 41.5766460 95.1920830 + 41.5745830 95.1899790 + 41.5725210 95.1879170 + 41.5683130 95.1879170 + 41.5662500 95.1900210 + 41.5641880 95.1920830 + 41.5558130 95.1920830 + 41.5537500 95.1941880 + 41.5516880 95.1962500 + 41.5474790 95.1962500 + 41.5454170 95.1983130 + 41.5454170 95.2066880 + 41.5433540 95.2087500 + 41.5391460 95.2087500 + 41.5370830 95.2108540 + 41.5350210 95.2129170 + 41.5308130 95.2129170 + 41.5287500 95.2150210 + 41.5308540 95.2170830 + 41.5329170 95.2191460 + 41.5329170 95.2275210 + 41.5350210 95.2295830 + 41.5370830 95.2316460 + 41.5266880 95.2504170 + 41.5224790 95.2504170 + 41.5204170 95.2483130 + 41.5183540 95.2462500 + 41.5141460 95.2462500 + 41.5120830 95.2441880 + 41.5120830 95.2399790 + 41.5100210 95.2379170 + 41.4891460 95.2379170 + 41.4870830 95.2400210 + 41.4849790 95.2420830 + 41.4829170 95.2400210 + 41.4829170 95.2358130 + 41.4808540 95.2337500 + 41.4683130 95.2337500 + 41.4662500 95.2337500 + 41.4495830 95.2524790 + 41.4495830 95.2608540 + 41.4475210 95.2629170 + 41.4433130 95.2629170 + 41.4412500 95.2649790 + 41.4412500 95.2816880 + 41.4391880 95.2837500 + 41.4141460 95.2837500 + 41.4120830 95.2858540 + 41.4100210 95.2879170 + 41.4058130 95.2879170 + 41.4037500 95.2899790 + 41.4037500 95.3066880 + 41.4058540 95.3087500 + 41.4079170 95.3108130 + 41.4079170 95.3150210 + 41.4058540 95.3170830 + 41.4016460 95.3170830 + 41.3995830 95.3191880 + 41.3975210 95.3212500 + 41.3849790 95.3212500 + 41.3829170 95.3233540 + 41.3808130 95.3254170 + 41.3787500 95.3274790 + 41.3787500 95.3316880 + 41.3808540 95.3337500 + 41.3829170 95.3358130 + 41.3829170 95.3608540 + 41.3850210 95.3629170 + 41.3870830 95.3649790 + 41.3870830 95.3691880 + 41.3891460 95.3712500 +1608 1608 -1 51 41.31000 95.43500 + 41.4700000 95.2300000 + 41.4300000 95.2000000 + 41.4200000 95.2200000 + 41.4000000 95.2000000 + 41.3800000 95.2300000 + 41.3500000 95.2300000 + 41.2800000 95.2300000 + 41.2700000 95.2200000 + 41.2200000 95.2200000 + 41.1300000 95.2800000 + 41.0800000 95.3200000 + 41.0700000 95.3300000 + 41.0200000 95.3500000 + 41.0000000 95.3700000 + 40.9700000 95.3800000 + 40.9800000 95.4200000 + 40.9300000 95.4300000 + 40.8700000 95.5300000 + 40.8700000 95.5800000 + 40.8700000 95.6000000 + 40.8800000 95.6700000 + 40.9300000 95.6700000 + 41.0300000 95.6700000 + 41.0700000 95.6700000 + 41.1500000 95.6500000 + 41.1800000 95.6200000 + 41.2200000 95.6300000 + 41.2700000 95.6300000 + 41.3500000 95.6000000 + 41.4200000 95.5200000 + 41.5000000 95.5000000 + 41.5300000 95.4500000 + 41.6000000 95.4300000 + 41.6700000 95.3800000 + 41.7000000 95.3800000 + 41.7300000 95.4000000 + 41.7500000 95.3800000 + 41.7000000 95.3500000 + 41.6000000 95.3700000 + 41.5700000 95.3800000 + 41.5500000 95.3800000 + 41.5200000 95.4000000 + 41.4700000 95.3800000 + 41.4700000 95.4000000 + 41.4000000 95.4200000 + 41.3800000 95.3800000 + 41.3800000 95.3300000 + 41.4000000 95.3200000 + 41.4000000 95.3000000 + 41.4300000 95.2800000 + 41.4700000 95.2300000 +1609 1609 -1 63 41.08500 95.27550 + 41.5700000 95.1800000 + 41.5700000 95.1700000 + 41.4500000 95.1700000 + 41.3200000 95.2000000 + 41.2800000 95.1800000 + 41.2700000 95.1700000 + 41.2300000 95.1700000 + 41.1500000 95.2000000 + 41.0200000 95.2700000 + 41.0200000 95.2300000 + 41.0200000 95.2200000 + 41.0500000 95.1700000 + 41.0300000 95.1500000 + 41.0000000 95.1700000 + 40.9800000 95.1700000 + 40.9700000 95.1800000 + 40.8800000 95.2000000 + 40.8700000 95.2300000 + 40.8000000 95.2300000 + 40.7700000 95.3000000 + 40.7300000 95.3200000 + 40.6700000 95.3700000 + 40.6700000 95.3800000 + 40.6300000 95.4300000 + 40.6300000 95.4500000 + 40.6000000 95.5000000 + 40.6000000 95.5700000 + 40.6200000 95.6000000 + 40.6300000 95.6300000 + 40.6500000 95.6700000 + 40.7000000 95.6500000 + 40.7200000 95.6700000 + 40.7500000 95.6500000 + 40.8000000 95.6500000 + 40.8000000 95.6700000 + 40.8200000 95.6800000 + 40.8500000 95.6700000 + 40.8800000 95.6700000 + 40.8700000 95.6000000 + 40.8700000 95.5800000 + 40.8700000 95.5300000 + 40.9300000 95.4300000 + 40.9800000 95.4200000 + 40.9700000 95.3800000 + 41.0000000 95.3700000 + 41.0200000 95.3500000 + 41.0700000 95.3300000 + 41.0800000 95.3200000 + 41.1300000 95.2800000 + 41.2200000 95.2200000 + 41.2700000 95.2200000 + 41.2800000 95.2300000 + 41.3500000 95.2300000 + 41.3800000 95.2300000 + 41.4000000 95.2000000 + 41.4200000 95.2200000 + 41.4300000 95.2000000 + 41.4700000 95.2300000 + 41.5000000 95.2500000 + 41.5300000 95.2500000 + 41.5300000 95.2200000 + 41.5500000 95.2000000 + 41.5700000 95.1800000 +1610 LITTLE NEMAHA RIVER AT AUBURN NE -1 486 40.58083 96.18583 + 40.3870830 95.8129170 + 40.3787500 95.8400210 + 40.3829170 95.8441880 + 40.3808130 95.8462500 + 40.3787500 95.8525210 + 40.3766880 95.8545830 + 40.3558130 95.8545830 + 40.3537500 95.8566880 + 40.3474790 95.8629170 + 40.3454170 95.8608130 + 40.3245830 95.8587500 + 40.3329170 95.8774790 + 40.3329170 95.8900210 + 40.3349790 95.8920830 + 40.3433540 95.8920830 + 40.3454170 95.8941880 + 40.3475210 95.8962500 + 40.3495830 95.8983540 + 40.3516880 95.9004170 + 40.3537500 95.9024790 + 40.3537500 95.9066880 + 40.3558540 95.9087500 + 40.3579170 95.9108540 + 40.3600210 95.9129170 + 40.3620830 95.9149790 + 40.3620830 95.9191880 + 40.3641880 95.9212500 + 40.3662500 95.9233540 + 40.3683540 95.9254170 + 40.3704170 95.9275210 + 40.3725210 95.9295830 + 40.3787500 95.9358130 + 40.3787500 95.9400210 + 40.3808540 95.9420830 + 40.3829170 95.9441460 + 40.3829170 95.9483540 + 40.3849790 95.9504170 + 40.4079170 95.9649790 + 40.4079170 95.9983540 + 40.4100210 96.0004170 + 40.4120830 96.0024790 + 40.4120830 96.0066880 + 40.4141880 96.0087500 + 40.4162500 96.0108130 + 40.4162500 96.0191880 + 40.4183130 96.0212500 + 40.4225210 96.0212500 + 40.4245830 96.0233130 + 40.4245830 96.0316880 + 40.4266880 96.0337500 + 40.4287500 96.0358540 + 40.4308540 96.0379170 + 40.4329170 96.0399790 + 40.4329170 96.0650210 + 40.4308130 96.0670830 + 40.4287500 96.0691460 + 40.4287500 96.0775210 + 40.4266880 96.0795830 + 40.4224790 96.0795830 + 40.4204170 96.0816880 + 40.4183130 96.0837500 + 40.4162500 96.0858540 + 40.4141880 96.0879170 + 40.4058130 96.0879170 + 40.4037500 96.0900210 + 40.4016460 96.0920830 + 40.3995830 96.0941880 + 40.3975210 96.0962500 + 40.3933130 96.0962500 + 40.3912500 96.0983540 + 40.3891460 96.1004170 + 40.3870830 96.0983130 + 40.3850210 96.0962500 + 40.3808130 96.0962500 + 40.3787500 96.0941460 + 40.3766460 96.0920830 + 40.3745830 96.0900210 + 40.3704170 96.0775210 + 40.3704170 96.0691460 + 40.3683540 96.0670830 + 40.3599790 96.0670830 + 40.3579170 96.0670830 + 40.3537500 96.0774790 + 40.3537500 96.0858540 + 40.3558540 96.0879170 + 40.3579170 96.0899790 + 40.3579170 96.1025210 + 40.3558540 96.1045830 + 40.3516460 96.1045830 + 40.3495830 96.1066460 + 40.3495830 96.1191880 + 40.3474790 96.1212500 + 40.3454170 96.1233540 + 40.3474790 96.1254170 + 40.3516880 96.1254170 + 40.3537500 96.1274790 + 40.3537500 96.1316880 + 40.3558130 96.1337500 + 40.3600210 96.1337500 + 40.3620830 96.1358540 + 40.3641460 96.1379170 + 40.3766880 96.1379170 + 40.3787500 96.1399790 + 40.3787500 96.1608540 + 40.3808130 96.1629170 + 40.3850210 96.1629170 + 40.3891460 96.1670830 + 40.3975210 96.1670830 + 40.3995830 96.1691880 + 40.4016880 96.1712500 + 40.4037500 96.1733130 + 40.4037500 96.1816880 + 40.4037500 96.1837500 + 40.4141460 96.1920830 + 40.4183540 96.1920830 + 40.4204170 96.1941460 + 40.4204170 96.2191880 + 40.4224790 96.2212500 + 40.4266880 96.2212500 + 40.4287500 96.2233540 + 40.4308540 96.2254170 + 40.4329170 96.2274790 + 40.4329170 96.2316880 + 40.4370830 96.2358130 + 40.4370830 96.2400210 + 40.4350210 96.2420830 + 40.4308130 96.2420830 + 40.4287500 96.2525210 + 40.4308540 96.2545830 + 40.4329170 96.2566460 + 40.4329170 96.2608540 + 40.4308130 96.2629170 + 40.4287500 96.2650210 + 40.4308540 96.2670830 + 40.4329170 96.2691880 + 40.4350210 96.2712500 + 40.4370830 96.2733540 + 40.4391460 96.2754170 + 40.4433540 96.2754170 + 40.4454170 96.2775210 + 40.4475210 96.2795830 + 40.4495830 96.2816460 + 40.4495830 96.2858540 + 40.4537500 96.2899790 + 40.4537500 96.3066880 + 40.4558540 96.3087500 + 40.4579170 96.3108540 + 40.4600210 96.3129170 + 40.4620830 96.3149790 + 40.4620830 96.3233540 + 40.4641460 96.3254170 + 40.4683540 96.3254170 + 40.4704170 96.3274790 + 40.4704170 96.3358540 + 40.4683130 96.3379170 + 40.4662500 96.3400210 + 40.4683540 96.3420830 + 40.4704170 96.3441460 + 40.4704170 96.3525210 + 40.4725210 96.3545830 + 40.4745830 96.3566460 + 40.4745830 96.3608540 + 40.4766460 96.3629170 + 40.4933540 96.3629170 + 40.4954170 96.3650210 + 40.4974790 96.3670830 + 40.5016880 96.3670830 + 40.5037500 96.3691880 + 40.5058130 96.3712500 + 40.5204170 96.3774790 + 40.5204170 96.3941880 + 40.5225210 96.3962500 + 40.5245830 96.3983130 + 40.5329170 96.4191460 + 40.5329170 96.4275210 + 40.5350210 96.4295830 + 40.5370830 96.4316880 + 40.5391460 96.4337500 + 40.5433540 96.4337500 + 40.5454170 96.4358540 + 40.5475210 96.4379170 + 40.5495830 96.4400210 + 40.5516460 96.4420830 + 40.5579170 96.4441460 + 40.5579170 96.4483540 + 40.5600210 96.4504170 + 40.5620830 96.4524790 + 40.5620830 96.4566880 + 40.5641880 96.4587500 + 40.5662500 96.4608130 + 40.5662500 96.4650210 + 40.5683540 96.4670830 + 40.5704170 96.4691880 + 40.5725210 96.4712500 + 40.5745830 96.4733540 + 40.5766880 96.4754170 + 40.5787500 96.4774790 + 40.5787500 96.4900210 + 40.5808540 96.4920830 + 40.5829170 96.4941880 + 40.5850210 96.4962500 + 40.5870830 96.4983540 + 40.5891880 96.5004170 + 40.5912500 96.5025210 + 40.5933130 96.5045830 + 40.6016880 96.5045830 + 40.6037500 96.5066880 + 40.6058130 96.5087500 + 40.6120830 96.5108540 + 40.6120830 96.5129170 + 40.6224790 96.5212500 + 40.6308540 96.5212500 + 40.6329170 96.5233130 + 40.6329170 96.5275210 + 40.6350210 96.5295830 + 40.6370830 96.5316880 + 40.6391460 96.5337500 + 40.6433540 96.5337500 + 40.6495830 96.5399790 + 40.6495830 96.5441880 + 40.6537500 96.5483130 + 40.6579170 96.5566460 + 40.6599790 96.5629170 + 40.6683540 96.5629170 + 40.6724790 96.5670830 + 40.6808130 96.5712500 + 40.6891880 96.5712500 + 40.6912500 96.5733540 + 40.6933130 96.5754170 + 40.6975210 96.5754170 + 40.6995830 96.5754170 + 40.6995830 96.5649790 + 40.7016460 96.5629170 + 40.7058540 96.5629170 + 40.7079170 96.5608540 + 40.7079170 96.5524790 + 40.7099790 96.5504170 + 40.7120830 96.5483540 + 40.7120830 96.5274790 + 40.7141460 96.5254170 + 40.7162500 96.5233540 + 40.7183130 96.5212500 + 40.7225210 96.5212500 + 40.7245830 96.5233130 + 40.7266460 96.5254170 + 40.7308540 96.5254170 + 40.7329170 96.5233540 + 40.7349790 96.5212500 + 40.7370830 96.5191880 + 40.7391460 96.5170830 + 40.7412500 96.5150210 + 40.7433130 96.5129170 + 40.7579170 96.5108540 + 40.7620830 96.5066880 + 40.7620830 96.4983130 + 40.7641460 96.4962500 + 40.7683130 96.4920830 + 40.7725210 96.4920830 + 40.7745830 96.4941460 + 40.7766460 96.4962500 + 40.7829170 96.4941880 + 40.7849790 96.4920830 + 40.8100210 96.4920830 + 40.8120830 96.4941460 + 40.8141460 96.4962500 + 40.8183540 96.4962500 + 40.8204170 96.4941880 + 40.8204170 96.4899790 + 40.8183540 96.4879170 + 40.8162500 96.4858540 + 40.8162500 96.4733130 + 40.8141880 96.4712500 + 40.8120830 96.4691880 + 40.8162500 96.4566880 + 40.8162500 96.4066460 + 40.8204170 96.4025210 + 40.8204170 96.3983130 + 40.8225210 96.3962500 + 40.8245830 96.3962500 + 40.8245830 96.3899790 + 40.8225210 96.3879170 + 40.8204170 96.3858540 + 40.8183540 96.3837500 + 40.8162500 96.3816880 + 40.8183130 96.3795830 + 40.8204170 96.3775210 + 40.8204170 96.3691460 + 40.8183540 96.3670830 + 40.8141460 96.3670830 + 40.8120830 96.3650210 + 40.8120830 96.3399790 + 40.8100210 96.3379170 + 40.8079170 96.3358540 + 40.8058540 96.3337500 + 40.8037500 96.3316880 + 40.8016880 96.3295830 + 40.7995830 96.3275210 + 40.7975210 96.3254170 + 40.7954170 96.3233540 + 40.7954170 96.3108130 + 40.7933540 96.3087500 + 40.7912500 96.3066880 + 40.7912500 96.2941460 + 40.7891880 96.2920830 + 40.7870830 96.2900210 + 40.7870830 96.2858130 + 40.7891460 96.2837500 + 40.7912500 96.2816880 + 40.7933130 96.2795830 + 40.8016880 96.2795830 + 40.8037500 96.2775210 + 40.8058130 96.2754170 + 40.8266880 96.2754170 + 40.8287500 96.2733540 + 40.8308130 96.2712500 + 40.8329170 96.2691880 + 40.8329170 96.2649790 + 40.8349790 96.2629170 + 40.8370830 96.2608540 + 40.8370830 96.2566460 + 40.8391460 96.2545830 + 40.8412500 96.2525210 + 40.8412500 96.2483130 + 40.8391880 96.2462500 + 40.8370830 96.2441880 + 40.8370830 96.2399790 + 40.8350210 96.2379170 + 40.8329170 96.2358540 + 40.8329170 96.2191460 + 40.8308540 96.2170830 + 40.8266460 96.2170830 + 40.8245830 96.2150210 + 40.8225210 96.2129170 + 40.8204170 96.2108540 + 40.8183540 96.2087500 + 40.8162500 96.2066880 + 40.8141880 96.2045830 + 40.8058130 96.2045830 + 40.8037500 96.2025210 + 40.8016880 96.2004170 + 40.7933130 96.2004170 + 40.7912500 96.1983540 + 40.7891880 96.1962500 + 40.7849790 96.1962500 + 40.7829170 96.1941880 + 40.7829170 96.1899790 + 40.7808540 96.1879170 + 40.7766880 96.1837500 + 40.7745830 96.1816880 + 40.7745830 96.1483130 + 40.7725210 96.1462500 + 40.7704170 96.1441880 + 40.7704170 96.1399790 + 40.7683540 96.1379170 + 40.7662500 96.1358540 + 40.7662500 96.1316460 + 40.7641880 96.1295830 + 40.7620830 96.1275210 + 40.7620830 96.0983130 + 40.7600210 96.0962500 + 40.7579170 96.0941880 + 40.7558540 96.0920830 + 40.7537500 96.0900210 + 40.7516880 96.0879170 + 40.7474790 96.0879170 + 40.7454170 96.0858540 + 40.7454170 96.0816460 + 40.7433540 96.0795830 + 40.7412500 96.0775210 + 40.7391880 96.0754170 + 40.7349790 96.0754170 + 40.7329170 96.0733540 + 40.7329170 96.0608130 + 40.7308540 96.0587500 + 40.7287500 96.0566880 + 40.7266880 96.0545830 + 40.7245830 96.0525210 + 40.7245830 96.0483130 + 40.7225210 96.0462500 + 40.7204170 96.0441880 + 40.7224790 96.0420830 + 40.7245830 96.0400210 + 40.7245830 96.0358130 + 40.7225210 96.0337500 + 40.7204170 96.0316880 + 40.7204170 95.9899790 + 40.7058130 95.9837500 + 40.6974790 95.9712500 + 40.6995830 95.9691880 + 40.6995830 95.9524790 + 40.6975210 95.9504170 + 40.6891460 95.9504170 + 40.6870830 95.9483540 + 40.6870830 95.9441460 + 40.6850210 95.9420830 + 40.6808130 95.9420830 + 40.6787500 95.9441460 + 40.6766880 95.9462500 + 40.6683130 95.9462500 + 40.6662500 95.9441880 + 40.6641880 95.9420830 + 40.6558130 95.9420830 + 40.6537500 95.9400210 + 40.6516880 95.9379170 + 40.6474790 95.9379170 + 40.6454170 95.9358540 + 40.6454170 95.9316460 + 40.6433540 95.9295830 + 40.6308130 95.9295830 + 40.6287500 95.9316460 + 40.6287500 95.9358540 + 40.6245830 95.9358540 + 40.6245830 95.9274790 + 40.6266460 95.9254170 + 40.6287500 95.9233540 + 40.6308130 95.9212500 + 40.6329170 95.9191880 + 40.6329170 95.8983130 + 40.6287500 95.8941880 + 40.6266880 95.8920830 + 40.6224790 95.8920830 + 40.6204170 95.8900210 + 40.6183540 95.8879170 + 40.6099790 95.8879170 + 40.6079170 95.8858540 + 40.6037500 95.8816880 + 40.6016880 95.8754170 + 40.5766460 95.8754170 + 40.5745830 95.8733540 + 40.5745830 95.8691460 + 40.5725210 95.8670830 + 40.5683130 95.8670830 + 40.5662500 95.8650210 + 40.5641880 95.8629170 + 40.5433130 95.8629170 + 40.5412500 95.8608540 + 40.5391880 95.8587500 + 40.5370830 95.8566880 + 40.5329170 95.8525210 + 40.5308540 95.8504170 + 40.5266460 95.8504170 + 40.5245830 95.8483540 + 40.5225210 95.8462500 + 40.5141460 95.8462500 + 40.5120830 95.8441880 + 40.5100210 95.8420830 + 40.5058130 95.8420830 + 40.5037500 95.8400210 + 40.5016880 95.8379170 + 40.4933130 95.8379170 + 40.4912500 95.8399790 + 40.4891880 95.8420830 + 40.4870830 95.8400210 + 40.4850210 95.8379170 + 40.4829170 95.8358540 + 40.4808540 95.8337500 + 40.4787500 95.8316880 + 40.4766880 95.8295830 + 40.4683130 95.8295830 + 40.4662500 95.8275210 + 40.4641880 95.8254170 + 40.4620830 95.8233540 + 40.4620830 95.8191460 + 40.4600210 95.8170830 + 40.4579170 95.8150210 + 40.4579170 95.8108130 + 40.4537500 95.8024790 + 40.4516880 95.8004170 + 40.4495830 95.7983540 + 40.4475210 95.7962500 + 40.4454170 95.7941880 + 40.4433540 95.7920830 + 40.4412500 95.7900210 + 40.4391880 95.7879170 + 40.4349790 95.7879170 + 40.4266460 95.7920830 + 40.4245830 95.7941460 + 40.4245830 95.7983540 + 40.4225210 95.8004170 + 40.4204170 95.8024790 + 40.4183540 95.8045830 + 40.4141460 95.8045830 + 40.4120830 95.8066460 + 40.4100210 95.8087500 + 40.3974790 95.8087500 + 40.3870830 95.8129170 +1611 1611 -1 30 40.95000 95.17500 + 41.2000000 95.0500000 + 41.1300000 95.0500000 + 41.1200000 95.0500000 + 41.0800000 95.0500000 + 41.0700000 95.0300000 + 41.0000000 95.0500000 + 41.0000000 95.0700000 + 40.9500000 95.0500000 + 40.9300000 95.0500000 + 40.8700000 95.0700000 + 40.7800000 95.0800000 + 40.7700000 95.0800000 + 40.7500000 95.0800000 + 40.7300000 95.1000000 + 40.7000000 95.1300000 + 40.7000000 95.2200000 + 40.7300000 95.3200000 + 40.7700000 95.3000000 + 40.8000000 95.2300000 + 40.8700000 95.2300000 + 40.8800000 95.2000000 + 40.9700000 95.1800000 + 40.9800000 95.1700000 + 41.0000000 95.1700000 + 41.0300000 95.1500000 + 41.0500000 95.1300000 + 41.1000000 95.1200000 + 41.1200000 95.1000000 + 41.2000000 95.0700000 + 41.2000000 95.0500000 +1612 1612 -1 29 40.53000 95.30500 + 40.7300000 95.3200000 + 40.7000000 95.2200000 + 40.7000000 95.1300000 + 40.6800000 95.1300000 + 40.6200000 95.1800000 + 40.5700000 95.1800000 + 40.5500000 95.1800000 + 40.5000000 95.1800000 + 40.4800000 95.2000000 + 40.4800000 95.2300000 + 40.4200000 95.2800000 + 40.4200000 95.3200000 + 40.4000000 95.3500000 + 40.3800000 95.3700000 + 40.3500000 95.3800000 + 40.3300000 95.4200000 + 40.3300000 95.4300000 + 40.3500000 95.4500000 + 40.3700000 95.4500000 + 40.3800000 95.4700000 + 40.4200000 95.4700000 + 40.4300000 95.4800000 + 40.4700000 95.4700000 + 40.4800000 95.4500000 + 40.5300000 95.4500000 + 40.6300000 95.3800000 + 40.6700000 95.3800000 + 40.6700000 95.3700000 + 40.7300000 95.3200000 +1613 1613 -1 29 40.43770 96.48228 + 40.6243200 96.5290300 + 40.5264900 96.4103700 + 40.5266100 96.3710600 + 40.4677200 96.3445700 + 40.4189000 96.2004200 + 40.3697900 96.1872100 + 40.3696300 96.2787300 + 40.3204000 96.3177300 + 40.3203000 96.3569300 + 40.2711400 96.3697400 + 40.2807500 96.4350800 + 40.2511900 96.4610100 + 40.2510900 96.4871100 + 40.3395200 96.4877100 + 40.3688300 96.5271400 + 40.4179600 96.5275000 + 40.3980800 96.5796700 + 40.4372600 96.6061600 + 40.4664100 96.6718700 + 40.5057800 96.6591400 + 40.5253000 96.6855300 + 40.5346000 96.7773500 + 40.5741300 96.7384500 + 40.5744300 96.6860000 + 40.5450900 96.6595100 + 40.5649400 96.6203600 + 40.5454100 96.5939700 + 40.5751800 96.5286600 + 40.6243200 96.5290300 +1614 1614 -1 22 40.09950 96.28455 + 40.1729200 96.3561900 + 40.2220500 96.3564400 + 40.2315800 96.4478300 + 40.2511900 96.4610100 + 40.2807500 96.4350800 + 40.2711400 96.3697400 + 40.3203000 96.3569300 + 40.3204000 96.3177300 + 40.1144000 96.1474600 + 40.1046000 96.1213900 + 39.9277800 96.1080900 + 39.9179500 96.1210700 + 39.9277100 96.1730700 + 39.8785700 96.1859300 + 39.8785100 96.2248800 + 39.8981600 96.2249500 + 39.9273300 96.3549700 + 39.9960900 96.3553200 + 40.0844700 96.3687700 + 40.1140500 96.3298500 + 40.1533500 96.3300200 + 40.1729200 96.3561900 +1615 1615 -1 17 39.81000 96.01058 + 39.9179500 96.1210700 + 39.9278100 96.0691100 + 39.9671100 96.0431500 + 39.9670900 95.9131400 + 39.9277200 95.8352300 + 39.8786600 95.8872800 + 39.6822500 95.9782300 + 39.6724300 96.0041300 + 39.6527900 95.9911900 + 39.6527800 96.0300200 + 39.6724100 96.0688700 + 39.7214900 96.1207400 + 39.7804300 96.1078700 + 39.7902100 96.1468000 + 39.8785700 96.1859300 + 39.9277100 96.1730700 + 39.9179500 96.1210700 +1616 1616 -1 18 40.24700 96.12182 + 40.1046000 96.1213900 + 40.1144000 96.1474600 + 40.3204000 96.3177300 + 40.3696300 96.2787300 + 40.3697900 96.1872100 + 40.4189000 96.2004200 + 40.3600500 96.1218300 + 40.3600800 96.0826000 + 40.3011500 95.9780400 + 40.1930500 95.9259100 + 40.1341100 95.9390000 + 40.1341300 95.9781000 + 40.1046500 95.9781000 + 40.1046600 96.0171800 + 40.0751700 96.0562400 + 40.0751500 96.0953000 + 40.1046200 96.0953400 + 40.1046000 96.1213900 +1617 1617 -1 27 40.04560 95.86095 + 40.1930500 95.9259100 + 40.1733900 95.8998600 + 40.1733000 95.8216200 + 40.0845600 95.6655800 + 40.0745500 95.6005200 + 39.9468400 95.6012300 + 39.9273100 95.6403200 + 39.9469900 95.6532200 + 39.9471000 95.6922100 + 39.9176900 95.7183200 + 39.8981900 95.7963300 + 39.8982100 95.8093200 + 39.9277200 95.8352300 + 39.9670900 95.9131400 + 39.9671100 96.0431500 + 39.9278100 96.0691100 + 39.9179500 96.1210700 + 39.9277800 96.1080900 + 40.1046000 96.1213900 + 40.1046200 96.0953400 + 40.0751500 96.0953000 + 40.0751700 96.0562400 + 40.1046600 96.0171800 + 40.1046500 95.9781000 + 40.1341300 95.9781000 + 40.1341100 95.9390000 + 40.1930500 95.9259100 +1618 NODAWAY RIVER AT CLARINDA IA -1 540 41.11000 94.86083 + 40.7370830 95.0129170 + 40.7412500 95.0566880 + 40.7454170 95.0608130 + 40.7454170 95.0733540 + 40.7475210 95.0754170 + 40.7495830 95.0774790 + 40.7495830 95.0816880 + 40.7516880 95.0837500 + 40.7537500 95.0858540 + 40.7537500 95.0879170 + 40.7600210 95.0879170 + 40.7620830 95.0858540 + 40.7724790 95.0754170 + 40.7745830 95.0774790 + 40.7766460 95.0795830 + 40.7787500 95.0816460 + 40.7808130 95.0837500 + 40.7850210 95.0837500 + 40.7870830 95.0858130 + 40.7891460 95.0879170 + 40.7933540 95.0879170 + 40.7954170 95.0858540 + 40.7974790 95.0837500 + 40.7995830 95.0858130 + 40.8016460 95.0879170 + 40.8058540 95.0879170 + 40.8079170 95.0899790 + 40.8099790 95.0920830 + 40.8120830 95.0900210 + 40.8141460 95.0879170 + 40.8225210 95.0879170 + 40.8245830 95.0858540 + 40.8266460 95.0837500 + 40.8350210 95.0837500 + 40.8370830 95.0816880 + 40.8391460 95.0795830 + 40.8558540 95.0795830 + 40.8579170 95.0775210 + 40.8599790 95.0754170 + 40.8766880 95.0754170 + 40.8787500 95.0733540 + 40.8787500 95.0691460 + 40.8808130 95.0670830 + 40.8829170 95.0650210 + 40.8829170 95.0608130 + 40.8849790 95.0587500 + 40.8870830 95.0566880 + 40.8891460 95.0545830 + 40.8912500 95.0566460 + 40.8933130 95.0587500 + 40.8954170 95.0608130 + 40.8974790 95.0629170 + 40.9058540 95.0629170 + 40.9079170 95.0608540 + 40.9099790 95.0587500 + 40.9120830 95.0566880 + 40.9141460 95.0545830 + 40.9162500 95.0525210 + 40.9183130 95.0504170 + 40.9245830 95.0483540 + 40.9266460 95.0462500 + 40.9350210 95.0462500 + 40.9370830 95.0483130 + 40.9370830 95.0566880 + 40.9391460 95.0587500 + 40.9412500 95.0608130 + 40.9474790 95.0670830 + 40.9641880 95.0670830 + 40.9662500 95.0650210 + 40.9683130 95.0629170 + 40.9725210 95.0629170 + 40.9745830 95.0649790 + 40.9766460 95.0670830 + 40.9975210 95.0670830 + 40.9995830 95.0650210 + 41.0016460 95.0629170 + 41.0058540 95.0629170 + 41.0079170 95.0608540 + 41.0099790 95.0587500 + 41.0120830 95.0566880 + 41.0141460 95.0545830 + 41.0183540 95.0545830 + 41.0204170 95.0566460 + 41.0224790 95.0587500 + 41.0266880 95.0587500 + 41.0287500 95.0566880 + 41.0308130 95.0545830 + 41.0350210 95.0545830 + 41.0370830 95.0525210 + 41.0391460 95.0504170 + 41.0412500 95.0483540 + 41.0433130 95.0462500 + 41.0454170 95.0441880 + 41.0474790 95.0420830 + 41.0516880 95.0420830 + 41.0537500 95.0441460 + 41.0558130 95.0462500 + 41.0600210 95.0462500 + 41.0620830 95.0483130 + 41.0620830 95.0525210 + 41.0641460 95.0545830 + 41.0725210 95.0545830 + 41.0745830 95.0566460 + 41.0745830 95.0608540 + 41.0766460 95.0629170 + 41.0808130 95.0670830 + 41.0954170 95.0650210 + 41.0974790 95.0629170 + 41.0995830 95.0608540 + 41.1016460 95.0587500 + 41.1058540 95.0587500 + 41.1079170 95.0566880 + 41.1099790 95.0545830 + 41.1141880 95.0545830 + 41.1162500 95.0566460 + 41.1183130 95.0587500 + 41.1266880 95.0587500 + 41.1287500 95.0608130 + 41.1308130 95.0629170 + 41.1329170 95.0649790 + 41.1349790 95.0670830 + 41.1370830 95.0650210 + 41.1391460 95.0629170 + 41.1516880 95.0629170 + 41.1537500 95.0649790 + 41.1558130 95.0670830 + 41.1579170 95.0650210 + 41.1766880 95.0629170 + 41.1787500 95.0649790 + 41.1850210 95.0670830 + 41.1870830 95.0650210 + 41.1975210 95.0629170 + 41.1995830 95.0608540 + 41.2016460 95.0587500 + 41.2079170 95.0608130 + 41.2099790 95.0629170 + 41.2433540 95.0629170 + 41.2454170 95.0608540 + 41.2474790 95.0587500 + 41.2558540 95.0587500 + 41.2579170 95.0566880 + 41.2599790 95.0545830 + 41.2641880 95.0545830 + 41.2662500 95.0525210 + 41.2683130 95.0504170 + 41.2808540 95.0504170 + 41.2933540 95.0462500 + 41.2954170 95.0462500 + 41.2974790 95.0045830 + 41.3037500 95.0025210 + 41.3037500 94.9483130 + 41.3058130 94.9462500 + 41.3079170 94.9441880 + 41.3079170 94.9274790 + 41.3058540 94.9254170 + 41.2974790 94.9254170 + 41.2954170 94.9233540 + 41.2954170 94.9108130 + 41.2974790 94.9087500 + 41.2995830 94.9066880 + 41.3016460 94.9045830 + 41.3058540 94.9045830 + 41.3079170 94.9025210 + 41.3079170 94.8858130 + 41.3099790 94.8837500 + 41.3120830 94.8816880 + 41.3141460 94.8795830 + 41.3183540 94.8795830 + 41.3204170 94.8775210 + 41.3204170 94.8608130 + 41.3224790 94.8587500 + 41.3245830 94.8566880 + 41.3266460 94.8545830 + 41.3308540 94.8545830 + 41.3329170 94.8525210 + 41.3349790 94.8504170 + 41.3370830 94.8483540 + 41.3370830 94.8441460 + 41.3391460 94.8420830 + 41.3412500 94.8400210 + 41.3412500 94.8274790 + 41.3391880 94.8254170 + 41.3370830 94.8233540 + 41.3391460 94.8212500 + 41.3412500 94.8191880 + 41.3433130 94.8170830 + 41.3454170 94.8150210 + 41.3474790 94.8129170 + 41.3641880 94.8129170 + 41.3662500 94.8108540 + 41.3662500 94.8066460 + 41.3683130 94.8045830 + 41.3704170 94.8025210 + 41.3704170 94.7983130 + 41.3808130 94.7879170 + 41.3829170 94.7899790 + 41.3849790 94.7920830 + 41.3891880 94.7920830 + 41.3912500 94.7900210 + 41.3933130 94.7879170 + 41.3954170 94.7858540 + 41.3974790 94.7837500 + 41.4016880 94.7837500 + 41.4037500 94.7816880 + 41.4037500 94.7566460 + 41.4058130 94.7545830 + 41.4100210 94.7545830 + 41.4120830 94.7525210 + 41.4120830 94.7483130 + 41.4141460 94.7462500 + 41.4162500 94.7441880 + 41.4183130 94.7420830 + 41.4225210 94.7420830 + 41.4245830 94.7400210 + 41.4266460 94.7379170 + 41.4308540 94.7379170 + 41.4329170 94.7358540 + 41.4329170 94.7316460 + 41.4349790 94.7295830 + 41.4391880 94.7295830 + 41.4412500 94.7275210 + 41.4412500 94.7191460 + 41.4495830 94.7108540 + 41.4495830 94.7024790 + 41.4516460 94.7004170 + 41.4537500 94.6983540 + 41.4537500 94.6899790 + 41.4558130 94.6879170 + 41.4579170 94.6858540 + 41.4599790 94.6837500 + 41.4620830 94.6816880 + 41.4620830 94.6774790 + 41.4641460 94.6754170 + 41.4662500 94.6733540 + 41.4683130 94.6712500 + 41.4704170 94.6691880 + 41.4724790 94.6670830 + 41.4745830 94.6650210 + 41.4745830 94.6566460 + 41.4766460 94.6545830 + 41.4787500 94.6525210 + 41.4808130 94.6504170 + 41.4829170 94.6483540 + 41.4829170 94.6358130 + 41.4808540 94.6337500 + 41.4787500 94.6316880 + 41.4787500 94.6233130 + 41.4766880 94.6212500 + 41.4745830 94.6191880 + 41.4725210 94.6170830 + 41.4704170 94.6150210 + 41.4683540 94.6129170 + 41.4558130 94.6129170 + 41.4537500 94.6108540 + 41.4537500 94.5983130 + 41.4516880 94.5962500 + 41.4495830 94.5941880 + 41.4475210 94.5920830 + 41.4454170 94.5900210 + 41.4454170 94.5816460 + 41.4433540 94.5795830 + 41.4349790 94.5795830 + 41.4329170 94.5775210 + 41.4308540 94.5754170 + 41.4225210 94.5712500 + 41.4120830 94.5650210 + 41.4079170 94.5566880 + 41.4079170 94.5524790 + 41.4099790 94.5504170 + 41.4120830 94.5483540 + 41.4120830 94.5399790 + 41.4141460 94.5379170 + 41.4162500 94.5358540 + 41.4162500 94.5316460 + 41.4183130 94.5295830 + 41.4204170 94.5316460 + 41.4224790 94.5337500 + 41.4308540 94.5337500 + 41.4329170 94.5358130 + 41.4349790 94.5379170 + 41.4475210 94.5379170 + 41.4495830 94.5399790 + 41.4516460 94.5420830 + 41.4537500 94.5400210 + 41.4558130 94.5379170 + 41.4579170 94.5358540 + 41.4579170 94.5274790 + 41.4558540 94.5254170 + 41.4537500 94.5233540 + 41.4537500 94.5191460 + 41.4516880 94.5170830 + 41.4495830 94.5191460 + 41.4475210 94.5212500 + 41.4349790 94.5212500 + 41.4329170 94.5191880 + 41.4308540 94.5170830 + 41.4287500 94.5150210 + 41.4266880 94.5129170 + 41.4224790 94.5129170 + 41.4204170 94.5108540 + 41.4183540 94.5087500 + 41.4016460 94.5087500 + 41.3891460 94.5004170 + 41.3808130 94.4962500 + 41.3787500 94.4941880 + 41.3766880 94.4920830 + 41.3724790 94.4920830 + 41.3704170 94.4900210 + 41.3704170 94.4858130 + 41.3683540 94.4837500 + 41.3641460 94.4837500 + 41.3620830 94.4816880 + 41.3620830 94.4566460 + 41.3641460 94.4545830 + 41.3662500 94.4525210 + 41.3641880 94.4379170 + 41.3516460 94.4379170 + 41.3495830 94.4399790 + 41.3475210 94.4420830 + 41.3391460 94.4420830 + 41.3370830 94.4400210 + 41.3350210 94.4379170 + 41.3329170 94.4399790 + 41.3308540 94.4420830 + 41.3141460 94.4420830 + 41.3120830 94.4441460 + 41.3100210 94.4462500 + 41.3079170 94.4483130 + 41.3079170 94.4566880 + 41.3058540 94.4587500 + 41.3037500 94.4608130 + 41.3016880 94.4629170 + 41.2891460 94.4629170 + 41.2870830 94.4608540 + 41.2850210 94.4587500 + 41.2787500 94.4733540 + 41.2766880 94.4754170 + 41.2745830 94.4774790 + 41.2725210 94.4795830 + 41.2683540 94.4754170 + 41.2662500 94.4733540 + 41.2641880 94.4712500 + 41.2599790 94.4754170 + 41.2579170 94.4754170 + 41.2495830 94.4899790 + 41.2495830 94.4941880 + 41.2474790 94.4962500 + 41.2454170 94.4983540 + 41.2433540 94.5004170 + 41.2370830 94.5024790 + 41.2370830 94.5191880 + 41.2349790 94.5212500 + 41.2329170 94.5233540 + 41.2308540 94.5254170 + 41.2224790 94.5254170 + 41.2204170 94.5275210 + 41.2183540 94.5295830 + 41.2079170 94.5358130 + 41.2079170 94.5441880 + 41.2058130 94.5462500 + 41.2037500 94.5483540 + 41.2016880 94.5504170 + 41.1891460 94.5504170 + 41.1849790 94.5545830 + 41.1829170 94.5524790 + 41.1808540 94.5504170 + 41.1766460 94.5504170 + 41.1745830 94.5524790 + 41.1724790 94.5629170 + 41.1704170 94.5649790 + 41.1683540 94.5712500 + 41.1620830 94.5733130 + 41.1620830 94.5775210 + 41.1579170 94.5816460 + 41.1558540 94.5879170 + 41.1474790 94.5879170 + 41.1454170 94.5899790 + 41.1454170 94.6108540 + 41.1433130 94.6129170 + 41.1412500 94.6149790 + 41.1391880 94.6212500 + 41.1287500 94.6233130 + 41.1245830 94.6358130 + 41.1245830 94.6400210 + 41.1224790 94.6420830 + 41.1204170 94.6441460 + 41.1204170 94.6483540 + 41.1183130 94.6504170 + 41.1162500 94.6524790 + 41.1162500 94.6566880 + 41.1183540 94.6587500 + 41.1204170 94.6608540 + 41.1183130 94.6629170 + 41.1162500 94.6650210 + 41.1141880 94.6670830 + 41.1099790 94.6670830 + 41.1079170 94.6691460 + 41.1079170 94.6733540 + 41.1058130 94.6754170 + 41.1037500 94.6774790 + 41.1037500 94.6816880 + 41.1016460 94.6837500 + 41.0995830 94.6858130 + 41.0995830 94.6983540 + 41.0974790 94.7004170 + 41.0954170 94.7025210 + 41.0933130 94.7045830 + 41.0912500 94.7066460 + 41.0912500 94.7150210 + 41.0891460 94.7170830 + 41.0870830 94.7191460 + 41.0870830 94.7233540 + 41.0849790 94.7254170 + 41.0829170 94.7274790 + 41.0829170 94.7358540 + 41.0808130 94.7379170 + 41.0787500 94.7400210 + 41.0766460 94.7420830 + 41.0745830 94.7441880 + 41.0724790 94.7462500 + 41.0704170 94.7483130 + 41.0704170 94.7566880 + 41.0683130 94.7587500 + 41.0662500 94.7608130 + 41.0662500 94.7650210 + 41.0641460 94.7670830 + 41.0620830 94.7691880 + 41.0599790 94.7712500 + 41.0579170 94.7733540 + 41.0558540 94.7754170 + 41.0516460 94.7754170 + 41.0495830 94.7775210 + 41.0474790 94.7795830 + 41.0454170 94.7816880 + 41.0433130 94.7837500 + 41.0412500 94.7858540 + 41.0391460 94.7879170 + 41.0370830 94.7900210 + 41.0349790 94.7920830 + 41.0329170 94.7941460 + 41.0329170 94.7983540 + 41.0308130 94.8004170 + 41.0287500 94.8025210 + 41.0308540 94.8045830 + 41.0329170 94.8066880 + 41.0308130 94.8087500 + 41.0287500 94.8108540 + 41.0266880 94.8129170 + 41.0183130 94.8129170 + 41.0162500 94.8150210 + 41.0141880 94.8170830 + 41.0099790 94.8170830 + 41.0079170 94.8191460 + 41.0079170 94.8400210 + 41.0058540 94.8420830 + 41.0016460 94.8420830 + 40.9995830 94.8441460 + 40.9995830 94.8525210 + 41.0016880 94.8545830 + 41.0037500 94.8566880 + 41.0016460 94.8587500 + 40.9995830 94.8608130 + 40.9995830 94.8691880 + 40.9974790 94.8712500 + 40.9954170 94.8733540 + 40.9933130 94.8754170 + 40.9912500 94.8774790 + 40.9912500 94.8941880 + 40.9891880 94.8962500 + 40.9808130 94.8962500 + 40.9787500 94.8983130 + 40.9787500 94.9025210 + 40.9766880 94.9045830 + 40.9724790 94.9045830 + 40.9704170 94.9066880 + 40.9683130 94.9087500 + 40.9662500 94.9108130 + 40.9662500 94.9150210 + 40.9641460 94.9170830 + 40.9620830 94.9191880 + 40.9599790 94.9212500 + 40.9579170 94.9233540 + 40.9558540 94.9254170 + 40.9433130 94.9254170 + 40.9412500 94.9275210 + 40.9391880 94.9295830 + 40.9349790 94.9295830 + 40.9329170 94.9316460 + 40.9329170 94.9358540 + 40.9308540 94.9379170 + 40.9224790 94.9379170 + 40.9204170 94.9400210 + 40.9183540 94.9420830 + 40.9120830 94.9441880 + 40.9099790 94.9462500 + 40.9079170 94.9483540 + 40.9058130 94.9504170 + 40.9037500 94.9483130 + 40.9016460 94.9462500 + 40.8995830 94.9441460 + 40.8974790 94.9420830 + 40.8954170 94.9399790 + 40.8891880 94.9420830 + 40.8474790 94.9420830 + 40.8454170 94.9441880 + 40.8433540 94.9462500 + 40.8308130 94.9462500 + 40.8287500 94.9483540 + 40.8266460 94.9504170 + 40.8245830 94.9524790 + 40.8245830 94.9566880 + 40.8225210 94.9587500 + 40.8058130 94.9587500 + 40.8037500 94.9608130 + 40.8037500 94.9650210 + 40.8016880 94.9670830 + 40.7933130 94.9670830 + 40.7912500 94.9691880 + 40.7891460 94.9712500 + 40.7870830 94.9691460 + 40.7849790 94.9670830 + 40.7829170 94.9691880 + 40.7808540 94.9712500 + 40.7724790 94.9712500 + 40.7704170 94.9733540 + 40.7683540 94.9754170 + 40.7641460 94.9754170 + 40.7620830 94.9775210 + 40.7599790 94.9795830 + 40.7579170 94.9816880 + 40.7558130 94.9837500 + 40.7537500 94.9858540 + 40.7516460 94.9879170 + 40.7495830 94.9900210 + 40.7475210 94.9920830 + 40.7433130 94.9920830 + 40.7412500 94.9941880 + 40.7391460 94.9962500 + 40.7370830 94.9983130 + 40.7370830 95.0129170 +1619 1619 -1 56 40.82500 94.89768 + 41.2700000 94.4700000 + 41.2000000 94.4200000 + 41.2000000 94.4000000 + 41.1700000 94.3800000 + 41.1300000 94.4200000 + 41.0800000 94.4300000 + 41.0300000 94.5000000 + 41.0200000 94.5300000 + 41.0200000 94.5500000 + 40.9800000 94.5500000 + 40.9700000 94.5800000 + 40.9738500 94.5992300 + 40.9800000 94.6300000 + 40.9800000 94.6700000 + 40.9300000 94.7700000 + 40.9200000 94.8000000 + 40.8700000 94.8200000 + 40.8700000 94.8300000 + 40.8000000 94.8500000 + 40.8000000 94.8700000 + 40.7300000 94.8800000 + 40.6800000 94.8500000 + 40.6300000 94.8700000 + 40.6200000 94.8800000 + 40.5800000 94.8800000 + 40.5500000 94.8700000 + 40.5000000 94.8700000 + 40.4700000 94.8800000 + 40.4300000 94.8800000 + 40.4000000 94.9200000 + 40.3800000 94.9500000 + 40.4300000 94.9800000 + 40.4200000 95.0200000 + 40.4500000 95.0300000 + 40.4500000 95.0800000 + 40.4700000 95.0800000 + 40.4800000 95.0700000 + 40.5200000 95.0800000 + 40.6000000 95.0700000 + 40.6300000 95.0500000 + 40.6500000 95.0700000 + 40.7300000 95.1000000 + 40.7500000 95.0800000 + 40.7300000 95.0200000 + 40.7300000 95.0000000 + 40.8300000 94.9500000 + 40.9000000 94.9500000 + 40.9800000 94.9000000 + 41.0000000 94.8500000 + 41.0200000 94.8200000 + 41.0700000 94.7700000 + 41.1200000 94.6700000 + 41.1500000 94.6000000 + 41.1800000 94.5500000 + 41.2000000 94.5500000 + 41.2700000 94.4700000 +1620 1620 -1 21 40.78500 94.60000 + 40.8800000 94.5500000 + 40.9000000 94.5200000 + 40.8800000 94.5200000 + 40.8800000 94.5000000 + 40.8700000 94.4700000 + 40.8500000 94.4800000 + 40.8300000 94.4800000 + 40.8300000 94.5000000 + 40.8000000 94.5000000 + 40.7700000 94.5500000 + 40.7300000 94.6000000 + 40.7000000 94.6500000 + 40.6800000 94.6500000 + 40.6700000 94.6800000 + 40.6700000 94.7000000 + 40.6800000 94.7300000 + 40.7000000 94.7200000 + 40.7300000 94.7200000 + 40.8300000 94.6200000 + 40.8700000 94.5700000 + 40.8800000 94.5500000 +1621 1621 -1 41 40.66500 94.71500 + 40.9738500 94.5992300 + 40.9500000 94.5800000 + 40.9200000 94.5800000 + 40.9200000 94.5700000 + 40.8800000 94.5500000 + 40.8700000 94.5700000 + 40.8300000 94.6200000 + 40.7300000 94.7200000 + 40.7000000 94.7200000 + 40.6800000 94.7300000 + 40.6700000 94.7000000 + 40.6700000 94.6800000 + 40.6200000 94.7000000 + 40.5700000 94.7000000 + 40.5200000 94.7200000 + 40.4800000 94.7500000 + 40.4500000 94.7700000 + 40.3500000 94.7800000 + 40.3500000 94.8300000 + 40.3500000 94.8700000 + 40.3700000 94.8800000 + 40.4000000 94.8500000 + 40.4200000 94.8700000 + 40.4300000 94.8700000 + 40.4700000 94.8800000 + 40.5000000 94.8700000 + 40.5500000 94.8700000 + 40.5800000 94.8800000 + 40.6200000 94.8800000 + 40.6300000 94.8700000 + 40.6800000 94.8500000 + 40.7300000 94.8800000 + 40.8000000 94.8700000 + 40.8000000 94.8500000 + 40.8700000 94.8300000 + 40.8700000 94.8200000 + 40.9200000 94.8000000 + 40.9300000 94.7700000 + 40.9800000 94.6700000 + 40.9800000 94.6300000 + 40.9738500 94.5992300 +1622 1622 -1 37 40.27500 94.83500 + 40.5200000 94.7200000 + 40.5000000 94.7000000 + 40.4700000 94.7300000 + 40.4200000 94.7300000 + 40.4000000 94.7500000 + 40.3000000 94.7700000 + 40.3000000 94.7800000 + 40.2300000 94.7800000 + 40.2200000 94.8000000 + 40.1800000 94.8000000 + 40.1000000 94.7700000 + 40.0800000 94.7800000 + 40.0700000 94.7700000 + 40.0500000 94.7800000 + 40.0500000 94.8300000 + 40.0500000 94.8500000 + 40.0300000 94.8500000 + 40.0500000 94.8800000 + 40.1200000 94.8800000 + 40.1300000 94.8800000 + 40.2000000 94.9200000 + 40.2800000 94.9300000 + 40.3300000 94.9700000 + 40.3800000 94.9500000 + 40.4000000 94.9200000 + 40.4300000 94.8800000 + 40.4700000 94.8800000 + 40.4300000 94.8700000 + 40.4200000 94.8700000 + 40.4000000 94.8500000 + 40.3700000 94.8800000 + 40.3500000 94.8700000 + 40.3500000 94.8300000 + 40.3500000 94.7800000 + 40.4500000 94.7700000 + 40.4800000 94.7500000 + 40.5200000 94.7200000 +1623 1623 -1 58 40.76000 94.49500 + 41.1700000 94.3800000 + 41.1000000 94.3300000 + 41.0800000 94.3200000 + 41.0300000 94.3000000 + 41.0200000 94.2800000 + 41.0000000 94.2700000 + 40.9800000 94.2700000 + 40.9700000 94.2800000 + 40.9200000 94.3300000 + 40.9300000 94.3500000 + 40.9200000 94.3700000 + 40.8300000 94.3700000 + 40.8000000 94.3800000 + 40.7300000 94.4000000 + 40.7300000 94.3800000 + 40.6800000 94.4000000 + 40.6500000 94.4500000 + 40.6200000 94.4500000 + 40.5500000 94.5300000 + 40.5500000 94.5700000 + 40.4800000 94.5800000 + 40.4000000 94.6300000 + 40.4000000 94.6500000 + 40.3500000 94.6500000 + 40.3500000 94.6800000 + 40.3500000 94.7000000 + 40.3800000 94.7200000 + 40.4200000 94.7200000 + 40.5000000 94.7000000 + 40.5200000 94.7200000 + 40.5700000 94.7000000 + 40.6200000 94.7000000 + 40.6700000 94.6800000 + 40.6800000 94.6500000 + 40.7000000 94.6500000 + 40.7300000 94.6000000 + 40.7700000 94.5500000 + 40.8000000 94.5000000 + 40.8300000 94.5000000 + 40.8300000 94.4800000 + 40.8500000 94.4800000 + 40.8700000 94.4700000 + 40.8800000 94.5000000 + 40.8800000 94.5200000 + 40.9000000 94.5200000 + 40.8800000 94.5500000 + 40.9200000 94.5700000 + 40.9200000 94.5800000 + 40.9500000 94.5800000 + 40.9738500 94.5992300 + 40.9700000 94.5800000 + 40.9800000 94.5500000 + 41.0200000 94.5500000 + 41.0200000 94.5300000 + 41.0300000 94.5000000 + 41.0800000 94.4300000 + 41.1300000 94.4200000 + 41.1700000 94.3800000 +1624 1624 -1 65 40.07500 94.66500 + 40.5000000 94.7000000 + 40.4200000 94.7200000 + 40.3800000 94.7200000 + 40.3500000 94.7000000 + 40.3500000 94.6800000 + 40.3500000 94.6500000 + 40.3000000 94.6700000 + 40.2800000 94.6800000 + 40.2200000 94.7000000 + 40.2000000 94.6800000 + 40.1300000 94.6700000 + 40.1200000 94.6500000 + 40.1200000 94.6200000 + 40.1200000 94.5800000 + 40.0800000 94.5700000 + 40.0800000 94.5500000 + 40.0800000 94.5200000 + 40.0700000 94.5300000 + 40.0200000 94.5000000 + 40.0000000 94.4800000 + 40.0000000 94.4700000 + 39.9500000 94.4700000 + 39.9300000 94.4800000 + 39.9200000 94.4500000 + 39.9000000 94.4700000 + 39.8500000 94.4800000 + 39.8000000 94.5200000 + 39.7800000 94.5300000 + 39.7300000 94.5500000 + 39.7200000 94.5800000 + 39.7300000 94.6200000 + 39.6800000 94.6200000 + 39.6500000 94.6700000 + 39.6800000 94.6700000 + 39.6800000 94.7000000 + 39.7000000 94.7300000 + 39.6800000 94.7700000 + 39.6800000 94.7800000 + 39.7200000 94.8000000 + 39.7500000 94.7800000 + 39.7500000 94.7983400 + 39.7499500 94.8000000 + 39.8300000 94.8200000 + 39.9200000 94.8000000 + 39.9300000 94.8200000 + 39.9700000 94.8700000 + 39.9800000 94.8700000 + 40.0000000 94.8800000 + 40.0500000 94.8800000 + 40.0300000 94.8500000 + 40.0500000 94.8500000 + 40.0500000 94.8300000 + 40.0500000 94.7800000 + 40.0700000 94.7700000 + 40.0800000 94.7800000 + 40.1000000 94.7700000 + 40.1800000 94.8000000 + 40.2200000 94.8000000 + 40.2300000 94.7800000 + 40.3000000 94.7800000 + 40.3000000 94.7700000 + 40.4000000 94.7500000 + 40.4200000 94.7300000 + 40.4700000 94.7300000 + 40.5000000 94.7000000 +1628 1628 -1 31 39.49000 94.70000 + 39.6700000 94.8300000 + 39.6800000 94.7800000 + 39.6800000 94.7700000 + 39.7000000 94.7300000 + 39.6800000 94.7000000 + 39.6800000 94.6700000 + 39.6500000 94.6700000 + 39.5800000 94.6800000 + 39.5500000 94.6700000 + 39.5700000 94.6300000 + 39.5300000 94.5800000 + 39.5200000 94.5700000 + 39.4800000 94.5800000 + 39.4700000 94.5700000 + 39.4200000 94.5700000 + 39.4011800 94.5747100 + 39.3800000 94.5800000 + 39.3700000 94.6300000 + 39.2800000 94.6800000 + 39.3000000 94.7300000 + 39.3300000 94.7200000 + 39.3500000 94.7200000 + 39.3700000 94.7800000 + 39.3800000 94.8000000 + 39.4000000 94.8200000 + 39.4700000 94.7700000 + 39.5000000 94.7700000 + 39.5200000 94.7500000 + 39.5800000 94.7500000 + 39.6300000 94.7800000 + 39.6700000 94.8300000 +1630 1630 -1 26 41.52000 95.06500 + 41.7200000 94.9700000 + 41.6800000 94.9500000 + 41.6500000 94.9700000 + 41.6200000 94.9300000 + 41.5800000 94.9700000 + 41.5800000 94.9800000 + 41.5500000 95.0500000 + 41.5300000 95.0500000 + 41.4500000 95.0700000 + 41.4300000 95.0800000 + 41.4200000 95.1200000 + 41.3200000 95.1200000 + 41.3200000 95.1300000 + 41.3200000 95.1700000 + 41.3200000 95.2000000 + 41.4500000 95.1700000 + 41.5700000 95.1700000 + 41.5700000 95.1800000 + 41.6000000 95.1700000 + 41.6300000 95.1700000 + 41.6500000 95.1700000 + 41.6800000 95.1200000 + 41.6800000 95.1000000 + 41.7200000 95.0200000 + 41.7000000 94.9800000 + 41.7200000 94.9700000 +1634 1634 -1 18 40.58000 95.11500 + 40.7000000 95.1300000 + 40.7300000 95.1000000 + 40.6500000 95.0700000 + 40.6300000 95.0500000 + 40.6000000 95.0700000 + 40.5200000 95.0800000 + 40.4800000 95.0700000 + 40.4700000 95.0800000 + 40.4500000 95.0800000 + 40.4500000 95.1000000 + 40.4300000 95.1700000 + 40.4800000 95.1700000 + 40.5000000 95.1800000 + 40.5500000 95.1800000 + 40.5700000 95.1800000 + 40.6200000 95.1800000 + 40.6800000 95.1300000 + 40.7000000 95.1300000 +1635 1635 -1 20 40.32500 95.06500 + 40.4500000 95.0800000 + 40.4500000 95.0300000 + 40.4200000 95.0200000 + 40.4300000 94.9800000 + 40.3800000 94.9500000 + 40.3300000 94.9700000 + 40.3300000 94.9800000 + 40.2800000 95.0300000 + 40.2200000 95.0500000 + 40.2000000 95.0700000 + 40.2000000 95.1000000 + 40.2300000 95.1200000 + 40.2500000 95.1500000 + 40.2700000 95.1700000 + 40.3000000 95.1700000 + 40.3300000 95.1700000 + 40.3500000 95.1800000 + 40.4300000 95.1700000 + 40.4500000 95.1000000 + 40.4500000 95.0800000 +1801 1801 -1 49 42.77990 97.24212 + 43.2743500 97.4489400 + 43.2152200 97.4476900 + 43.0588400 97.3221300 + 42.9603200 97.3202400 + 42.8544100 97.0473000 + 42.7761300 96.9784600 + 42.7968600 96.8298800 + 42.8955400 96.8039600 + 42.8662300 96.7629800 + 42.7482600 96.7211000 + 42.6995000 96.6259800 + 42.5620500 96.5303300 + 42.5228700 96.4761100 + 42.4738300 96.4218900 + 42.4540000 96.4621700 + 42.4536300 96.5564300 + 42.3842800 96.6500500 + 42.3251500 96.6629500 + 42.2756500 96.7162100 + 42.3247900 96.7301600 + 42.3729100 96.9055300 + 42.4610200 96.9740200 + 42.5006000 96.9476200 + 42.4804000 97.0147200 + 42.5485500 97.1101200 + 42.5477100 97.2045100 + 42.4688200 97.2166100 + 42.4974400 97.3114400 + 42.4676300 97.3378200 + 42.4470900 97.4182300 + 42.4566300 97.4453600 + 42.5736900 97.5422400 + 42.6418000 97.6112800 + 42.7007100 97.6261700 + 42.8100300 97.5475200 + 42.8305200 97.4802600 + 42.8797600 97.4813200 + 42.9275800 97.6043900 + 42.9168800 97.6719400 + 43.1020700 97.8259900 + 43.1304700 97.9083600 + 43.2477100 97.9797400 + 43.2760200 98.0623400 + 43.2770700 97.9942100 + 43.1803200 97.8689000 + 43.1735600 97.6373400 + 43.2836000 97.5036500 + 43.2842100 97.4491400 + 43.2743500 97.4489400 +1802 1802 -1 41 42.26140 96.44726 + 42.5500000 96.2800000 + 42.5300000 96.2700000 + 42.5200000 96.3000000 + 42.5200000 96.3200000 + 42.4800000 96.3200000 + 42.4700000 96.3500000 + 42.4300000 96.3500000 + 42.4200000 96.3300000 + 42.3305100 96.2584100 + 42.1986200 96.2592200 + 42.1495500 96.1785800 + 42.0413000 96.1783100 + 42.0018800 96.2183500 + 42.0213300 96.3254800 + 41.9228600 96.3517500 + 41.9227900 96.3784700 + 41.9423000 96.4320500 + 41.9618400 96.4722900 + 42.0504000 96.4728900 + 42.0698200 96.5399900 + 42.1091800 96.5402900 + 42.1679300 96.6078000 + 42.1677300 96.6480400 + 42.1774400 96.6749600 + 42.2266500 96.6754300 + 42.2756500 96.7162100 + 42.3251500 96.6629500 + 42.3842800 96.6500500 + 42.4536300 96.5564300 + 42.4540000 96.4621700 + 42.4738300 96.4218900 + 42.5228700 96.4761100 + 42.5500800 96.4703800 + 42.5500000 96.4300000 + 42.5300000 96.4200000 + 42.5300000 96.4000000 + 42.5800000 96.3500000 + 42.6000000 96.3500000 + 42.5700000 96.3200000 + 42.5700000 96.3000000 + 42.5500000 96.2800000 +1803 1803 -1 43 41.92520 96.12587 + 41.9000000 95.9500000 + 41.8500000 95.9700000 + 41.8300000 95.9300000 + 41.7800000 95.9000000 + 41.7300000 95.9500000 + 41.7200000 95.9500000 + 41.6700000 95.9700000 + 41.6500000 96.0000000 + 41.6300000 96.0500000 + 41.6000000 96.0200000 + 41.5700000 96.0300000 + 41.5500000 96.1000000 + 41.5300000 96.1200000 + 41.5200000 96.1200000 + 41.5200000 96.1500000 + 41.5297200 96.1903000 + 41.5984800 96.2437000 + 41.5787600 96.2702300 + 41.6179800 96.3236100 + 41.6769900 96.3238800 + 41.7066000 96.2840400 + 41.7261800 96.3241000 + 41.8540600 96.3247000 + 41.8836400 96.2981200 + 41.9228600 96.3517500 + 42.0213300 96.3254800 + 42.0018800 96.2183500 + 42.0413000 96.1783100 + 42.1495500 96.1785800 + 42.1986200 96.2592200 + 42.3305100 96.2584100 + 42.3200000 96.2500000 + 42.2800000 96.2000000 + 42.1700000 96.1300000 + 42.0800000 96.1000000 + 42.0700000 96.0700000 + 42.0200000 96.0500000 + 41.9700000 96.0200000 + 41.9700000 96.0000000 + 41.9700000 95.9800000 + 41.9700000 95.9700000 + 41.9700000 95.9500000 + 41.9000000 95.9500000 +1804 1804 -1 71 41.64000 95.81500 + 42.0300000 95.5500000 + 42.0000000 95.5700000 + 41.9800000 95.5800000 + 41.9300000 95.6200000 + 41.9200000 95.6500000 + 41.8800000 95.6700000 + 41.8700000 95.7000000 + 41.8200000 95.7000000 + 41.8000000 95.7300000 + 41.7700000 95.7300000 + 41.7000000 95.8000000 + 41.6500000 95.8000000 + 41.6500000 95.7800000 + 41.6200000 95.7200000 + 41.6200000 95.6500000 + 41.6300000 95.6300000 + 41.6500000 95.6300000 + 41.7300000 95.5800000 + 41.7200000 95.5500000 + 41.7700000 95.5200000 + 41.7800000 95.4800000 + 41.7300000 95.4800000 + 41.7200000 95.5200000 + 41.7000000 95.5200000 + 41.6800000 95.5500000 + 41.6500000 95.5800000 + 41.6000000 95.6200000 + 41.5500000 95.6200000 + 41.5200000 95.6300000 + 41.4800000 95.6500000 + 41.4300000 95.6800000 + 41.4000000 95.7500000 + 41.3500000 95.8200000 + 41.3200000 95.8200000 + 41.2700000 95.8500000 + 41.2700000 95.9200000 + 41.2700000 95.9500000 + 41.2500000 95.9700000 + 41.2550200 95.9700000 + 41.2700000 95.9700000 + 41.2800000 96.0000000 + 41.3200000 96.0000000 + 41.3500000 96.0000000 + 41.3800000 96.0300000 + 41.4200000 96.0500000 + 41.4300000 96.0800000 + 41.4200000 96.1000000 + 41.4800000 96.1500000 + 41.5200000 96.1500000 + 41.5200000 96.1200000 + 41.5300000 96.1200000 + 41.5500000 96.1000000 + 41.5700000 96.0300000 + 41.6000000 96.0200000 + 41.6300000 96.0500000 + 41.6500000 96.0000000 + 41.6700000 95.9700000 + 41.7200000 95.9500000 + 41.7300000 95.9500000 + 41.7800000 95.9000000 + 41.8000000 95.8700000 + 41.8000000 95.8500000 + 41.8500000 95.8200000 + 41.8700000 95.7500000 + 41.9200000 95.7500000 + 41.9300000 95.7000000 + 42.0000000 95.6800000 + 42.0000000 95.6700000 + 42.0200000 95.6300000 + 42.0300000 95.5800000 + 42.0300000 95.5500000 +1806 1806 -1 77 41.28000 95.65000 + 41.8700000 95.4000000 + 41.8500000 95.3800000 + 41.8200000 95.3800000 + 41.8000000 95.4000000 + 41.7800000 95.3700000 + 41.7700000 95.4000000 + 41.7500000 95.3800000 + 41.7300000 95.4000000 + 41.7000000 95.3800000 + 41.6700000 95.3800000 + 41.6000000 95.4300000 + 41.5300000 95.4500000 + 41.5000000 95.5000000 + 41.4200000 95.5200000 + 41.3500000 95.6000000 + 41.2700000 95.6300000 + 41.2200000 95.6300000 + 41.1800000 95.6200000 + 41.1500000 95.6500000 + 41.0700000 95.6700000 + 41.0300000 95.6700000 + 40.9300000 95.6700000 + 40.8800000 95.6700000 + 40.8500000 95.6700000 + 40.8200000 95.6800000 + 40.8200000 95.7000000 + 40.7800000 95.7300000 + 40.8000000 95.7500000 + 40.8000000 95.7800000 + 40.7800000 95.8200000 + 40.7300000 95.8500000 + 40.7000000 95.8300000 + 40.6800000 95.8500000 + 40.7000000 95.8500000 + 40.7200000 95.8800000 + 40.7500000 95.8800000 + 40.7800000 95.8300000 + 40.8000000 95.8500000 + 40.8300000 95.8300000 + 40.8700000 95.8500000 + 40.8800000 95.8200000 + 40.9000000 95.8200000 + 40.9200000 95.8300000 + 40.9500000 95.8300000 + 40.9800000 95.8300000 + 41.0000000 95.8700000 + 41.0200000 95.8700000 + 41.0300000 95.8500000 + 41.0500000 95.8700000 + 41.0800000 95.8700000 + 41.1500000 95.8800000 + 41.1700000 95.8800000 + 41.1700000 95.8500000 + 41.1800000 95.8500000 + 41.1800000 95.9200000 + 41.2000000 95.9300000 + 41.2300000 95.9200000 + 41.2700000 95.9200000 + 41.2700000 95.8500000 + 41.3200000 95.8200000 + 41.3500000 95.8200000 + 41.4000000 95.7500000 + 41.4300000 95.6800000 + 41.4800000 95.6500000 + 41.5200000 95.6300000 + 41.5500000 95.6200000 + 41.6000000 95.6200000 + 41.6500000 95.5800000 + 41.6800000 95.5500000 + 41.7000000 95.5200000 + 41.7200000 95.5200000 + 41.7300000 95.4800000 + 41.7800000 95.4800000 + 41.8000000 95.4800000 + 41.8500000 95.4200000 + 41.8800000 95.4300000 + 41.8700000 95.4000000 +1807 1807 -1 54 40.97500 96.04416 + 41.2700000 95.9200000 + 41.2300000 95.9200000 + 41.2000000 95.9300000 + 41.1800000 95.9200000 + 41.1800000 95.8500000 + 41.1700000 95.8500000 + 41.1700000 95.8800000 + 41.1500000 95.8800000 + 41.0800000 95.8700000 + 41.0500000 95.8700000 + 41.0300000 95.8500000 + 41.0200000 95.8700000 + 41.0000000 95.8700000 + 40.9800000 95.8300000 + 40.9500000 95.8300000 + 40.9200000 95.8300000 + 40.9000000 95.8200000 + 40.8800000 95.8200000 + 40.8700000 95.8500000 + 40.8300000 95.8300000 + 40.8000000 95.8500000 + 40.7800000 95.8300000 + 40.7500000 95.8800000 + 40.7200000 95.8800000 + 40.7000000 95.8500000 + 40.6800000 95.8500000 + 40.7000000 95.8700000 + 40.7000000 95.9200000 + 40.6842800 95.9278600 + 40.6942100 95.9516500 + 40.7040300 95.9516400 + 40.7531400 95.8990300 + 40.7531300 95.8858900 + 40.8514300 95.8989000 + 40.9202700 95.9778500 + 40.9005600 96.1227500 + 40.9299900 96.1755100 + 41.0184600 96.1757400 + 41.0380100 96.2417700 + 41.0675000 96.2418700 + 41.0772700 96.2683100 + 41.1264600 96.2552900 + 41.1168800 95.9910000 + 41.0972100 95.9645800 + 41.1168800 95.9645800 + 41.1168600 95.9249400 + 41.1463400 95.8984800 + 41.1758500 95.9248800 + 41.1856800 95.9248700 + 41.2446900 95.9777500 + 41.2550200 95.9700000 + 41.2500000 95.9700000 + 41.2700000 95.9500000 + 41.2700000 95.9200000 +1808 1808 -1 44 40.61000 95.68000 + 40.8200000 95.6800000 + 40.8000000 95.6700000 + 40.8000000 95.6500000 + 40.7500000 95.6500000 + 40.7200000 95.6700000 + 40.7000000 95.6500000 + 40.6500000 95.6700000 + 40.6300000 95.6300000 + 40.6200000 95.6000000 + 40.6000000 95.5700000 + 40.6000000 95.5000000 + 40.6300000 95.4500000 + 40.6300000 95.4300000 + 40.5800000 95.4500000 + 40.4800000 95.5000000 + 40.4800000 95.5200000 + 40.4500000 95.5300000 + 40.4700000 95.6000000 + 40.4000000 95.6300000 + 40.4000000 95.6500000 + 40.4000000 95.6700000 + 40.4000000 95.6800000 + 40.4200000 95.7300000 + 40.4000000 95.7300000 + 40.4300000 95.7700000 + 40.4700000 95.8300000 + 40.4800000 95.8300000 + 40.5000000 95.8300000 + 40.6300000 95.8800000 + 40.6300000 95.9200000 + 40.6700000 95.9300000 + 40.6800000 95.9300000 + 40.6842800 95.9278600 + 40.7000000 95.9200000 + 40.7000000 95.8700000 + 40.6800000 95.8500000 + 40.7000000 95.8300000 + 40.7300000 95.8500000 + 40.7800000 95.8200000 + 40.8000000 95.7800000 + 40.8000000 95.7500000 + 40.7800000 95.7300000 + 40.8200000 95.7000000 + 40.8200000 95.6800000 +1809 1809 -1 54 40.36000 95.61000 + 40.6700000 95.3800000 + 40.6300000 95.3800000 + 40.5300000 95.4500000 + 40.4800000 95.4500000 + 40.4700000 95.4700000 + 40.4300000 95.4800000 + 40.4200000 95.4700000 + 40.3800000 95.4700000 + 40.3700000 95.4500000 + 40.3500000 95.4500000 + 40.3300000 95.4300000 + 40.3300000 95.4200000 + 40.3500000 95.3800000 + 40.3300000 95.3700000 + 40.2500000 95.3800000 + 40.2500000 95.4000000 + 40.2300000 95.4200000 + 40.2000000 95.4000000 + 40.1800000 95.4000000 + 40.0800000 95.3800000 + 40.0700000 95.3800000 + 40.0500000 95.4200000 + 40.0500000 95.4300000 + 40.0700000 95.4500000 + 40.1500000 95.5300000 + 40.1700000 95.5300000 + 40.2200000 95.5700000 + 40.2000000 95.6000000 + 40.2000000 95.6200000 + 40.2200000 95.6300000 + 40.2300000 95.7200000 + 40.2700000 95.7500000 + 40.2800000 95.7800000 + 40.3000000 95.8300000 + 40.3300000 95.8500000 + 40.3328900 95.8488500 + 40.3800000 95.8300000 + 40.3800000 95.8200000 + 40.4000000 95.8000000 + 40.4200000 95.8000000 + 40.4300000 95.7700000 + 40.4000000 95.7300000 + 40.4200000 95.7300000 + 40.4000000 95.6800000 + 40.4000000 95.6700000 + 40.4000000 95.6500000 + 40.4000000 95.6300000 + 40.4700000 95.6000000 + 40.4500000 95.5300000 + 40.4800000 95.5200000 + 40.4800000 95.5000000 + 40.5800000 95.4500000 + 40.6300000 95.4300000 + 40.6700000 95.3800000 +1810 1810 -1 48 40.10440 95.59246 + 40.3328900 95.8488500 + 40.3300000 95.8500000 + 40.3000000 95.8300000 + 40.2800000 95.7800000 + 40.2700000 95.7500000 + 40.2300000 95.7200000 + 40.2200000 95.6300000 + 40.2000000 95.6200000 + 40.2000000 95.6000000 + 40.2200000 95.5700000 + 40.1700000 95.5300000 + 40.1500000 95.5300000 + 40.0700000 95.4500000 + 40.0500000 95.4300000 + 40.0500000 95.4200000 + 40.0443700 95.4184800 + 40.0443100 95.4054600 + 39.9751500 95.3280200 + 39.9260300 95.3284800 + 39.9262400 95.3674600 + 39.8672300 95.3550000 + 39.8479600 95.4330400 + 39.8973000 95.4846100 + 39.8678800 95.4978000 + 39.8679800 95.5237700 + 39.8385100 95.5239600 + 39.8289600 95.6018800 + 39.7995700 95.6279900 + 39.7799600 95.6410600 + 39.7898900 95.6799200 + 39.8587800 95.7315400 + 39.8981900 95.7963300 + 39.9176900 95.7183200 + 39.9471000 95.6922100 + 39.9469900 95.6532200 + 39.9273100 95.6403200 + 39.9468400 95.6012300 + 40.0745500 95.6005200 + 40.0845600 95.6655800 + 40.1733000 95.8216200 + 40.1733900 95.8998600 + 40.1930500 95.9259100 + 40.3011500 95.9780400 + 40.3600800 96.0826000 + 40.4092000 96.0957400 + 40.4288800 96.0303400 + 40.3305800 95.8865700 + 40.3328900 95.8488500 +1811 1811 -1 37 40.24000 95.27000 + 40.4300000 95.1700000 + 40.3500000 95.1800000 + 40.3300000 95.1700000 + 40.3000000 95.1700000 + 40.2700000 95.1700000 + 40.2500000 95.1500000 + 40.2200000 95.1500000 + 40.1800000 95.1300000 + 40.1700000 95.1500000 + 40.0800000 95.1300000 + 40.0700000 95.1300000 + 40.0300000 95.1300000 + 40.0200000 95.1200000 + 40.0200000 95.1700000 + 39.9800000 95.2200000 + 39.9800000 95.2700000 + 40.0000000 95.3000000 + 40.0300000 95.3500000 + 40.0500000 95.4200000 + 40.0700000 95.3800000 + 40.0800000 95.3800000 + 40.1800000 95.4000000 + 40.2000000 95.4000000 + 40.2300000 95.4200000 + 40.2500000 95.4000000 + 40.2500000 95.3800000 + 40.3300000 95.3700000 + 40.3500000 95.3800000 + 40.3800000 95.3700000 + 40.4000000 95.3500000 + 40.4200000 95.3200000 + 40.4200000 95.2800000 + 40.4800000 95.2300000 + 40.4800000 95.2000000 + 40.5000000 95.1800000 + 40.4800000 95.1700000 + 40.4300000 95.1700000 +1812 1812 -1 29 40.14000 95.01000 + 40.3300000 94.9700000 + 40.2800000 94.9300000 + 40.2000000 94.9200000 + 40.1300000 94.8800000 + 40.1200000 94.8800000 + 40.0500000 94.8800000 + 40.0000000 94.8800000 + 39.9800000 94.8700000 + 39.9700000 94.8700000 + 39.9500000 94.9200000 + 39.9700000 95.0000000 + 39.9800000 95.0700000 + 40.0000000 95.0800000 + 40.0200000 95.1000000 + 40.0200000 95.1200000 + 40.0300000 95.1300000 + 40.0700000 95.1300000 + 40.0800000 95.1300000 + 40.1700000 95.1500000 + 40.1800000 95.1300000 + 40.2200000 95.1500000 + 40.2500000 95.1500000 + 40.2300000 95.1200000 + 40.2000000 95.1000000 + 40.2000000 95.0700000 + 40.2200000 95.0500000 + 40.2800000 95.0300000 + 40.3300000 94.9800000 + 40.3300000 94.9700000 +1813 1813 -1 44 39.84070 95.21405 + 40.0200000 95.1200000 + 40.0200000 95.1000000 + 40.0000000 95.0800000 + 39.9800000 95.0700000 + 39.9700000 95.0000000 + 39.9500000 94.9200000 + 39.9700000 94.8700000 + 39.9300000 94.8200000 + 39.9200000 94.8000000 + 39.8300000 94.8200000 + 39.7499500 94.8000000 + 39.7464300 94.9283400 + 39.8156200 94.9792100 + 39.8163300 95.0700200 + 39.7673100 95.0836200 + 39.7292900 95.2784800 + 39.7000400 95.3176300 + 39.6313600 95.3312200 + 39.6708500 95.3697000 + 39.6710900 95.4214900 + 39.7203200 95.4470100 + 39.7207400 95.5506600 + 39.7601200 95.5763400 + 39.7799300 95.6280900 + 39.7995700 95.6279900 + 39.8289600 95.6018800 + 39.8385100 95.5239600 + 39.8679800 95.5237700 + 39.8678800 95.4978000 + 39.8973000 95.4846100 + 39.8479600 95.4330400 + 39.8672300 95.3550000 + 39.9262400 95.3674600 + 39.9260300 95.3284800 + 39.9751500 95.3280200 + 40.0443100 95.4054600 + 40.0443700 95.4184800 + 40.0500000 95.4200000 + 40.0300000 95.3500000 + 40.0000000 95.3000000 + 39.9800000 95.2700000 + 39.9800000 95.2200000 + 40.0200000 95.1700000 + 40.0200000 95.1200000 +1814 1814 -1 26 39.67320 95.05579 + 39.6800000 94.7800000 + 39.6700000 94.8300000 + 39.6500000 94.8500000 + 39.6300000 94.8500000 + 39.5700000 94.8700000 + 39.5500000 94.8800000 + 39.6000000 94.9300000 + 39.5800000 94.9800000 + 39.5700000 95.0300000 + 39.5500000 95.1200000 + 39.5800000 95.1500000 + 39.5300000 95.2000000 + 39.5720600 95.2671200 + 39.5920700 95.3315900 + 39.6313600 95.3312200 + 39.7000400 95.3176300 + 39.7292900 95.2784800 + 39.7673100 95.0836200 + 39.8163300 95.0700200 + 39.8156200 94.9792100 + 39.7464300 94.9283400 + 39.7499500 94.8000000 + 39.7500000 94.7983400 + 39.7500000 94.7800000 + 39.7200000 94.8000000 + 39.6800000 94.7800000 +1815 1815 -1 30 39.47500 94.97500 + 39.5300000 95.2000000 + 39.5800000 95.1500000 + 39.5500000 95.1200000 + 39.5700000 95.0300000 + 39.5800000 94.9800000 + 39.6000000 94.9300000 + 39.5500000 94.8800000 + 39.5700000 94.8700000 + 39.6300000 94.8500000 + 39.6500000 94.8500000 + 39.6700000 94.8300000 + 39.6300000 94.7800000 + 39.5800000 94.7500000 + 39.5200000 94.7500000 + 39.5000000 94.7700000 + 39.4700000 94.7700000 + 39.4000000 94.8200000 + 39.3800000 94.8000000 + 39.3500000 94.8300000 + 39.3300000 94.8500000 + 39.3200000 94.9200000 + 39.3200000 94.9300000 + 39.2800000 94.9800000 + 39.3200000 95.0500000 + 39.3500000 95.0500000 + 39.3538300 95.0500000 + 39.3700000 95.0500000 + 39.4200000 95.0500000 + 39.4800000 95.1700000 + 39.5300000 95.2000000 +1850 BIG PAPILLION CREEK AT FORT STREET, NE -1 193 41.44333 96.21917 + 41.3016460 96.1087500 + 41.3037500 96.1316880 + 41.2995830 96.1358130 + 41.2995830 96.1400210 + 41.2954170 96.1441460 + 41.2954170 96.1483540 + 41.2933130 96.1504170 + 41.2912500 96.1524790 + 41.2912500 96.1608540 + 41.2933540 96.1629170 + 41.2974790 96.1670830 + 41.3100210 96.1670830 + 41.3120830 96.1691460 + 41.3120830 96.1733540 + 41.3141460 96.1754170 + 41.3391460 96.1962500 + 41.3475210 96.1962500 + 41.3495830 96.1983540 + 41.3516880 96.2004170 + 41.3537500 96.2024790 + 41.3537500 96.2150210 + 41.3558540 96.2170830 + 41.3579170 96.2191460 + 41.3579170 96.2233540 + 41.3600210 96.2254170 + 41.3620830 96.2274790 + 41.3620830 96.2316880 + 41.3641880 96.2337500 + 41.3662500 96.2358130 + 41.3662500 96.2608540 + 41.3641460 96.2629170 + 41.3620830 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4370830 96.2941460 + 41.4391460 96.2962500 + 41.4412500 96.2983130 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4579170 96.3108130 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4183130 96.1212500 + 41.4162500 96.1233130 + 41.4141880 96.1254170 + 41.4120830 96.1274790 + 41.4100210 96.1295830 + 41.4016460 96.1295830 + 41.3995830 96.1275210 + 41.3975210 96.1254170 + 41.3891460 96.1254170 + 41.3870830 96.1233540 + 41.3850210 96.1212500 + 41.3829170 96.1191880 + 41.3808540 96.1170830 + 41.3766460 96.1170830 + 41.3745830 96.1150210 + 41.3725210 96.1129170 + 41.3683130 96.1129170 + 41.3662500 96.1108540 + 41.3641880 96.1087500 + 41.3558130 96.1087500 + 41.3537500 96.1066880 + 41.3516880 96.1045830 + 41.3495830 96.1025210 + 41.3475210 96.1004170 + 41.3433130 96.1004170 + 41.3225210 96.0795830 + 41.3141460 96.0795830 + 41.3120830 96.0774790 + 41.3120830 96.0754170 + 41.2995830 96.0774790 + 41.2995830 96.0858540 + 41.3037500 96.0899790 + 41.3037500 96.1025210 + 41.3016460 96.1045830 + 41.2995830 96.1066880 + 41.3016460 96.1087500 +201 201 -1 17 39.26190 97.36923 + 39.2731200 97.2660400 + 39.2439200 97.2397800 + 39.1653600 97.2384400 + 39.1254200 97.3020200 + 39.1247400 97.3662600 + 39.1344100 97.3793000 + 39.1735500 97.3929000 + 39.2216100 97.4839000 + 39.2608900 97.4847100 + 39.3000100 97.4983900 + 39.3785800 97.5000200 + 39.3991200 97.4230400 + 39.3797700 97.3968700 + 39.3306700 97.3959200 + 39.3215600 97.3313100 + 39.2727300 97.3046600 + 39.2731200 97.2660400 +208 208 -1 36 39.11710 96.67976 + 39.2583000 96.6349300 + 39.2288400 96.6346700 + 39.1802100 96.5313600 + 39.1017000 96.5179400 + 39.0720700 96.5562500 + 39.0232900 96.4788900 + 38.9741900 96.4785600 + 38.9641600 96.5297900 + 38.8679000 96.5290900 + 38.8679000 96.5333000 + 38.8659300 96.5333000 + 38.8595000 96.5333000 + 38.8595000 96.5416000 + 38.8659000 96.5416000 + 38.8679000 96.5416000 + 38.8679000 96.5750000 + 38.8595000 96.5750000 + 38.8595000 96.5833000 + 38.8679000 96.5833000 + 38.8679000 96.5916000 + 38.8762000 96.5916000 + 38.8762000 96.6079600 + 38.9342800 96.6192900 + 38.9732200 96.6837400 + 39.0222500 96.6970300 + 39.0024700 96.7225000 + 39.0121400 96.7482500 + 39.1003600 96.7748600 + 39.1491400 96.8268000 + 39.2277000 96.8276900 + 39.3157300 96.8802300 + 39.3746600 96.8809500 + 39.3554600 96.8162600 + 39.3260000 96.8159300 + 39.2772900 96.7509900 + 39.2583000 96.6349300 +209 209 -1 23 39.18530 96.45445 + 39.3472300 96.5197000 + 39.2785800 96.4934500 + 39.2689100 96.4547600 + 39.2394000 96.4674500 + 39.2297100 96.4287700 + 39.2494000 96.4160200 + 39.2298000 96.4030400 + 39.2003800 96.3900100 + 39.2201000 96.3643800 + 39.2006300 96.2999600 + 39.1319400 96.2739800 + 39.0728900 96.3251200 + 39.0726700 96.4021700 + 39.0234800 96.4275600 + 39.0232900 96.4788900 + 39.0720700 96.5562500 + 39.1017000 96.5179400 + 39.1802100 96.5313600 + 39.2288400 96.6346700 + 39.2583000 96.6349300 + 39.2586100 96.5705600 + 39.3175900 96.5581400 + 39.3472300 96.5197000 +210 210 -1 26 39.47590 96.15276 + 39.6527900 95.9911900 + 39.6527800 95.9782400 + 39.6429600 95.9782400 + 39.6429600 96.0041300 + 39.4956300 96.0170400 + 39.4661200 96.1074100 + 39.3777200 96.1072800 + 39.3482200 96.1459000 + 39.2794000 96.1972700 + 39.2793600 96.2230300 + 39.3479800 96.2876900 + 39.4264800 96.3138000 + 39.4854800 96.2882400 + 39.4952400 96.3141100 + 39.5247300 96.3013200 + 39.5246700 96.3271600 + 39.5541300 96.3272900 + 39.5542600 96.2755800 + 39.6034200 96.2499000 + 39.6230100 96.2758500 + 39.6230700 96.2499700 + 39.6722100 96.2371900 + 39.6527500 96.0947400 + 39.6724100 96.0688700 + 39.6527800 96.0300200 + 39.6527900 95.9911900 +211 211 -1 19 39.36250 96.41074 + 39.4952400 96.3141100 + 39.4854800 96.2882400 + 39.4264800 96.3138000 + 39.3969900 96.3265800 + 39.3772000 96.3780700 + 39.2495600 96.3645300 + 39.2298000 96.4030400 + 39.2494000 96.4160200 + 39.2297100 96.4287700 + 39.2394000 96.4674500 + 39.2689100 96.4547600 + 39.2785800 96.4934500 + 39.3472300 96.5197000 + 39.4258000 96.5202600 + 39.4355600 96.5332400 + 39.4752000 96.4431500 + 39.4754100 96.3785800 + 39.4950600 96.3786800 + 39.4952400 96.3141100 +213 213 -1 21 39.25470 96.19714 + 39.3482200 96.1459000 + 39.2795000 96.1200100 + 39.2697300 96.0298600 + 39.1715200 95.9912400 + 39.1617100 95.9912400 + 39.1617000 96.0298200 + 39.0829800 96.1967400 + 39.1319700 96.2611300 + 39.1319400 96.2739800 + 39.2006300 96.2999600 + 39.2201000 96.3643800 + 39.2003800 96.3900100 + 39.2298000 96.4030400 + 39.2495600 96.3645300 + 39.3772000 96.3780700 + 39.3969900 96.3265800 + 39.4264800 96.3138000 + 39.3479800 96.2876900 + 39.2793600 96.2230300 + 39.2794000 96.1972700 + 39.3482200 96.1459000 +215 215 -1 13 39.42200 95.92045 + 39.6429600 95.9782400 + 39.5938400 95.9394600 + 39.5054400 95.9524500 + 39.4169700 95.8492900 + 39.2597900 95.8238700 + 39.2009300 95.8754700 + 39.2107700 95.9011800 + 39.2893700 95.9525900 + 39.4170500 95.9654100 + 39.4465200 96.0041200 + 39.4956300 96.0170400 + 39.6429600 96.0041300 + 39.6429600 95.9782400 +216 216 -1 15 39.24990 95.81093 + 39.3972500 95.7977400 + 39.3185000 95.7077600 + 39.2988600 95.7078500 + 39.2202900 95.7081600 + 39.1908800 95.7340100 + 39.0730300 95.7344400 + 39.1125500 95.8884700 + 39.1715000 95.9140900 + 39.2009600 95.9140600 + 39.2107700 95.9011800 + 39.2009300 95.8754700 + 39.2597900 95.8238700 + 39.4169700 95.8492900 + 39.4267500 95.8234600 + 39.3972500 95.7977400 +217 217 -1 15 39.76550 95.77772 + 39.8981900 95.7963300 + 39.8587800 95.7315400 + 39.7898900 95.6799200 + 39.7799600 95.6410600 + 39.7995700 95.6279900 + 39.7799300 95.6280900 + 39.6127800 95.5772000 + 39.6032000 95.6548700 + 39.6033900 95.7324800 + 39.6428200 95.8099900 + 39.6822500 95.9782300 + 39.8786600 95.8872800 + 39.9277200 95.8352300 + 39.8982100 95.8093200 + 39.8981900 95.7963300 +219 219 -1 20 39.64210 95.49305 + 39.6313600 95.3312200 + 39.5920700 95.3315900 + 39.5531700 95.4095100 + 39.5236400 95.3968300 + 39.5139400 95.4227400 + 39.5140000 95.4356700 + 39.5042400 95.4486600 + 39.5239900 95.4743500 + 39.5243400 95.5648000 + 39.5538500 95.5775500 + 39.5540100 95.6292600 + 39.6032000 95.6548700 + 39.6127800 95.5772000 + 39.7799300 95.6280900 + 39.7601200 95.5763400 + 39.7207400 95.5506600 + 39.7203200 95.4470100 + 39.6710900 95.4214900 + 39.6708500 95.3697000 + 39.6313600 95.3312200 +2207 2207 -1 82 43.48620 99.35506 + 43.9733100 99.5985900 + 43.9846600 99.5440700 + 43.9565300 99.4875100 + 43.9766200 99.4747600 + 43.8611000 99.3588500 + 43.8216600 99.3569000 + 43.8223500 99.3294400 + 43.7829100 99.3275200 + 43.7451800 99.2570300 + 43.7468500 99.1884700 + 43.6896500 99.1034900 + 43.6778400 99.1021300 + 43.4928200 99.0809000 + 43.4349500 99.0236400 + 43.3942600 99.0764800 + 43.3761300 99.0073900 + 43.3967700 98.9673200 + 43.4559000 98.9698700 + 43.4672800 98.9020100 + 43.5476300 98.8369700 + 43.6166300 98.8398300 + 43.6746000 98.8970900 + 43.6740000 98.9244900 + 43.7337600 98.8996000 + 43.7635300 98.9232700 + 43.8646300 98.7814000 + 43.8112800 98.6335900 + 43.6882500 98.7193600 + 43.6488100 98.7178000 + 43.6003500 98.6747700 + 43.6025300 98.5652800 + 43.5441600 98.5220300 + 43.5332500 98.5763600 + 43.4730200 98.6287900 + 43.4510800 98.7373000 + 43.3412300 98.8011500 + 43.3221100 98.7730900 + 43.3240800 98.6776600 + 43.2854900 98.6352500 + 43.2460800 98.6337400 + 43.2191800 98.4964900 + 43.3187400 98.4455500 + 43.4463600 98.4774300 + 43.4473800 98.4228100 + 43.4483800 98.3681700 + 43.3899600 98.3252000 + 43.3298500 98.3777300 + 43.2510100 98.3750000 + 43.2517400 98.3341400 + 43.2320400 98.3334700 + 43.0825200 98.4235700 + 43.0700900 98.5590500 + 43.0400000 98.5851100 + 43.0276800 98.7069000 + 42.9877200 98.7324900 + 43.0259700 98.7883500 + 43.0239100 98.8833500 + 43.0815000 98.9537400 + 43.0701000 99.0212200 + 43.0783700 99.0895600 + 43.1263200 99.1461400 + 43.1250000 99.2005000 + 43.2095700 99.3679100 + 43.2489700 99.3698400 + 43.2231300 99.6002300 + 43.2795800 99.6986600 + 43.3477600 99.7296400 + 43.3773200 99.7312500 + 43.3879400 99.7045000 + 43.4269600 99.7202800 + 43.4285000 99.6656900 + 43.4690400 99.6268200 + 43.5566000 99.6725500 + 43.5690800 99.5773500 + 43.6574200 99.5956800 + 43.6975900 99.5703500 + 43.6987000 99.5292400 + 43.7176800 99.5576700 + 43.7866900 99.5612700 + 43.8071500 99.5348500 + 43.8838000 99.6213800 + 43.9733100 99.5985900 +221 221 -1 26 39.52990 95.72639 + 39.6822500 95.9782300 + 39.6428200 95.8099900 + 39.6033900 95.7324800 + 39.6032000 95.6548700 + 39.5540100 95.6292600 + 39.5538500 95.5775500 + 39.5243400 95.5648000 + 39.5239900 95.4743500 + 39.5042400 95.4486600 + 39.4749400 95.4876300 + 39.4454200 95.4749200 + 39.4261200 95.5653900 + 39.3967000 95.5784700 + 39.4164700 95.6170600 + 39.4166500 95.6815600 + 39.3775100 95.7462200 + 39.3972500 95.7977400 + 39.4267500 95.8234600 + 39.4169700 95.8492900 + 39.5054400 95.9524500 + 39.5938400 95.9394600 + 39.6429600 95.9782400 + 39.6527800 95.9782400 + 39.6527900 95.9911900 + 39.6724300 96.0041300 + 39.6822500 95.9782300 +2214 2214 -1 46 42.79310 99.38328 + 42.9519200 99.0160400 + 42.9420700 99.0156200 + 42.8312800 98.6721200 + 42.7429400 98.6551800 + 42.7108700 98.7756600 + 42.6494600 98.8812800 + 42.6396100 98.8808700 + 42.6393100 98.8943700 + 42.6390100 98.9078700 + 42.6159300 99.0554500 + 42.6251300 99.0828700 + 42.6740300 99.0985600 + 42.6730600 99.1390700 + 42.7212900 99.1818400 + 42.7199700 99.2358800 + 42.6704100 99.2470900 + 42.6673300 99.3685800 + 42.6465900 99.4081200 + 42.6634100 99.5170700 + 42.6327800 99.5560500 + 42.6316700 99.5965300 + 42.6687700 99.6795700 + 42.6880700 99.6941100 + 42.6959800 99.7621600 + 42.6424100 99.9079100 + 42.7235400 99.8313100 + 42.7424200 99.8594200 + 42.7309700 99.9129100 + 42.7006400 99.9382500 + 42.7178400 100.0204100 + 42.7576200 100.0091900 + 42.7752100 100.0779100 + 42.8248300 100.0672900 + 42.8239900 100.0943500 + 42.8826200 100.1113800 + 42.8732000 100.0972600 + 42.8679500 99.9477900 + 42.7864900 99.6993800 + 42.7986100 99.6187600 + 42.7716700 99.5225800 + 42.8518700 99.4724600 + 42.8265500 99.3086100 + 42.8702800 99.1344800 + 42.9690700 99.1254000 + 42.9703500 99.0711500 + 42.9519200 99.0160400 +2215 2215 -1 23 42.64960 98.60373 + 42.7512500 98.2090400 + 42.7217100 98.2081000 + 42.6809300 98.2878900 + 42.6213800 98.3129300 + 42.6194200 98.4208900 + 42.5689300 98.4866000 + 42.4795600 98.5238300 + 42.4684000 98.5907900 + 42.4678500 98.6177200 + 42.4737600 98.8066100 + 42.5032900 98.8078000 + 42.5679700 98.9993500 + 42.6291700 98.9074500 + 42.6390100 98.9078700 + 42.6393100 98.8943700 + 42.6396100 98.8808700 + 42.6494600 98.8812800 + 42.7108700 98.7756600 + 42.7429400 98.6551800 + 42.8312800 98.6721200 + 42.7759300 98.4805000 + 42.7789200 98.3181900 + 42.7512500 98.2090400 +2216 2216 -1 29 42.51500 98.26291 + 42.7613300 98.1958300 + 42.7132100 98.1267000 + 42.7434100 98.0870500 + 42.7442600 98.0329700 + 42.7061100 97.9507400 + 42.6566800 97.9628500 + 42.6275400 97.9350200 + 42.6172900 97.9617400 + 42.5090000 97.9586800 + 42.4987500 97.9853400 + 42.3906700 97.9688000 + 42.3502700 98.0349000 + 42.3211600 98.0071700 + 42.2706800 98.0863200 + 42.2792100 98.1672000 + 42.2686800 98.2071700 + 42.3068800 98.2756000 + 42.4228000 98.4005700 + 42.4306100 98.5085800 + 42.4684000 98.5907900 + 42.4795600 98.5238300 + 42.5689300 98.4866000 + 42.6194200 98.4208900 + 42.6213800 98.3129300 + 42.6809300 98.2878900 + 42.7217100 98.2081000 + 42.7512500 98.2090400 + 42.7514800 98.1955200 + 42.7613300 98.1958300 +2217 2217 -1 20 43.11570 99.40417 + 43.2795800 99.6986600 + 43.2231300 99.6002300 + 43.2489700 99.3698400 + 43.2095700 99.3679100 + 43.1250000 99.2005000 + 43.1263200 99.1461400 + 43.0783700 99.0895600 + 43.0701000 99.0212200 + 43.0116300 98.9914900 + 42.9519200 99.0160400 + 42.9703500 99.0711500 + 42.9690700 99.1254000 + 42.9749300 99.2885700 + 43.1250100 99.5814900 + 43.1231300 99.6494300 + 43.1523000 99.6645900 + 43.1503800 99.7325600 + 43.1972800 99.8168400 + 43.2473100 99.7923500 + 43.2795800 99.6986600 +2218 2218 -1 21 42.91640 98.60837 + 42.9877200 98.7324900 + 42.9488900 98.7038100 + 42.9699700 98.6367800 + 42.9609400 98.5957200 + 42.8749200 98.4569500 + 42.8764200 98.3756800 + 42.8302600 98.1980200 + 42.7613300 98.1958300 + 42.7514800 98.1955200 + 42.7512500 98.2090400 + 42.7789200 98.3181900 + 42.7759300 98.4805000 + 42.8312800 98.6721200 + 42.9420700 99.0156200 + 42.9519200 99.0160400 + 43.0116300 98.9914900 + 43.0701000 99.0212200 + 43.0815000 98.9537400 + 43.0239100 98.8833500 + 43.0259700 98.7883500 + 42.9877200 98.7324900 +2219 2219 -1 26 42.55930 97.78151 + 42.5736900 97.5422400 + 42.5443200 97.5281100 + 42.5133000 97.6487400 + 42.4632000 97.7149000 + 42.4522700 97.7954500 + 42.4231100 97.7677700 + 42.3737100 97.7799700 + 42.3229800 97.8862200 + 42.3211600 98.0071700 + 42.3502700 98.0349000 + 42.3906700 97.9688000 + 42.4987500 97.9853400 + 42.5090000 97.9586800 + 42.6172900 97.9617400 + 42.6275400 97.9350200 + 42.6566800 97.9628500 + 42.7061100 97.9507400 + 42.7457000 97.9383200 + 42.7179100 97.8158600 + 42.7673400 97.8036300 + 42.7677100 97.7765800 + 42.7974400 97.7638000 + 42.7302600 97.6268600 + 42.7007100 97.6261700 + 42.6418000 97.6112800 + 42.5736900 97.5422400 +2220 2220 -1 46 43.12430 98.10638 + 43.5476800 98.3305500 + 43.5479300 98.3168700 + 43.4221000 98.1760100 + 43.3629600 98.1741400 + 43.2755900 98.0895800 + 43.2760200 98.0623400 + 43.2477100 97.9797400 + 43.1304700 97.9083600 + 43.1020700 97.8259900 + 42.9168800 97.6719400 + 42.9275800 97.6043900 + 42.8797600 97.4813200 + 42.8305200 97.4802600 + 42.8100300 97.5475200 + 42.7007100 97.6261700 + 42.7302600 97.6268600 + 42.7974400 97.7638000 + 42.7677100 97.7765800 + 42.7673400 97.8036300 + 42.7179100 97.8158600 + 42.7457000 97.9383200 + 42.7061100 97.9507400 + 42.7442600 98.0329700 + 42.7434100 98.0870500 + 42.7132100 98.1267000 + 42.7613300 98.1958300 + 42.8302600 98.1980200 + 42.8764200 98.3756800 + 42.8749200 98.4569500 + 42.9609400 98.5957200 + 42.9699700 98.6367800 + 42.9488900 98.7038100 + 42.9877200 98.7324900 + 43.0276800 98.7069000 + 43.0400000 98.5851100 + 43.0700900 98.5590500 + 43.0825200 98.4235700 + 43.2320400 98.3334700 + 43.2517400 98.3341400 + 43.2510100 98.3750000 + 43.3298500 98.3777300 + 43.3899600 98.3252000 + 43.4483800 98.3681700 + 43.4473800 98.4228100 + 43.5452000 98.4673200 + 43.5476800 98.3305500 +223 223 -1 24 39.39630 95.55903 + 39.5042400 95.4486600 + 39.5140000 95.4356700 + 39.5139400 95.4227400 + 39.4351800 95.3846600 + 39.4152100 95.3203200 + 39.3563500 95.3337600 + 39.3666200 95.4239200 + 39.2981000 95.4759900 + 39.2983100 95.5275100 + 39.2787100 95.5405200 + 39.2985700 95.6048000 + 39.2789300 95.6049000 + 39.3184100 95.6691100 + 39.2988600 95.7078500 + 39.3185000 95.7077600 + 39.3972500 95.7977400 + 39.3775100 95.7462200 + 39.4166500 95.6815600 + 39.4164700 95.6170600 + 39.3967000 95.5784700 + 39.4261200 95.5653900 + 39.4454200 95.4749200 + 39.4749400 95.4876300 + 39.5042400 95.4486600 +224 224 -1 22 39.23400 95.40574 + 39.3563500 95.3337600 + 39.2974200 95.3343000 + 39.2776400 95.3087300 + 39.3167000 95.2697100 + 39.2478800 95.2575200 + 39.1984600 95.2065700 + 39.1790600 95.2453700 + 39.1989300 95.2837500 + 39.1792900 95.2839500 + 39.1696800 95.3226200 + 39.1013900 95.4131800 + 39.1115500 95.4901900 + 39.1609500 95.5669800 + 39.1903700 95.5539400 + 39.2101400 95.5924100 + 39.2789300 95.6049000 + 39.2985700 95.6048000 + 39.2787100 95.5405200 + 39.2983100 95.5275100 + 39.2981000 95.4759900 + 39.3666200 95.4239200 + 39.3563500 95.3337600 +225 225 -1 29 39.13180 95.58001 + 39.2789300 95.6049000 + 39.2101400 95.5924100 + 39.1903700 95.5539400 + 39.1609500 95.5669800 + 39.1115500 95.4901900 + 39.1013900 95.4131800 + 39.1696800 95.3226200 + 39.0814300 95.3491300 + 39.0816300 95.3876500 + 39.0521700 95.3879000 + 39.0325900 95.4009000 + 39.0030600 95.3883100 + 39.0134000 95.5037000 + 38.9547200 95.5682100 + 38.9744500 95.5937300 + 38.9548800 95.6194800 + 38.9746700 95.6706800 + 38.9452400 95.6836200 + 38.9651800 95.8374000 + 39.0044600 95.8373200 + 39.0338700 95.7987500 + 39.0434500 95.6832000 + 39.0630600 95.6702700 + 39.0730300 95.7344400 + 39.1908800 95.7340100 + 39.2202900 95.7081600 + 39.2988600 95.7078500 + 39.3184100 95.6691100 + 39.2789300 95.6049000 +226 226 -1 15 39.31390 96.02354 + 39.4956300 96.0170400 + 39.4465200 96.0041200 + 39.4170500 95.9654100 + 39.2893700 95.9525900 + 39.2107700 95.9011800 + 39.2009600 95.9140600 + 39.1715000 95.9140900 + 39.1322400 95.9655500 + 39.1715200 95.9912400 + 39.2697300 96.0298600 + 39.2795000 96.1200100 + 39.3482200 96.1459000 + 39.3777200 96.1072800 + 39.4661200 96.1074100 + 39.4956300 96.0170400 +229 229 -1 18 39.43480 95.23637 + 39.3563500 95.3337600 + 39.4152100 95.3203200 + 39.4351800 95.3846600 + 39.5139400 95.4227400 + 39.5236400 95.3968300 + 39.5531700 95.4095100 + 39.5920700 95.3315900 + 39.5720600 95.2671200 + 39.5300000 95.2000000 + 39.4800000 95.1700000 + 39.4200000 95.0500000 + 39.3700000 95.0500000 + 39.3538300 95.0500000 + 39.3653300 95.1918600 + 39.3167000 95.2697100 + 39.2776400 95.3087300 + 39.2974200 95.3343000 + 39.3563500 95.3337600 +230 230 -1 17 39.23190 95.10308 + 39.3538300 95.0500000 + 39.3500000 95.0500000 + 39.3200000 95.0500000 + 39.2800000 94.9800000 + 39.2300000 94.9700000 + 39.2300000 94.9500000 + 39.1971600 94.9364500 + 39.1080600 94.9377600 + 39.0985600 94.9764400 + 39.1280300 94.9760200 + 39.1188200 95.0532500 + 39.1681100 95.0783200 + 39.1984600 95.2065700 + 39.2478800 95.2575200 + 39.3167000 95.2697100 + 39.3653300 95.1918600 + 39.3538300 95.0500000 +2619 2619 -1 47 43.94200 97.85540 + 44.3683900 97.5693000 + 44.3190000 97.5681500 + 44.2997400 97.5262000 + 44.2503600 97.5250900 + 44.2497200 97.5803800 + 44.0231600 97.5337800 + 44.0223400 97.6026600 + 43.9924000 97.6295000 + 43.7654600 97.6240800 + 43.7351800 97.6782500 + 43.6763500 97.6493900 + 43.6460600 97.7034800 + 43.5567700 97.7423200 + 43.5156500 97.8643700 + 43.6225200 97.9768800 + 43.6004600 98.1269000 + 43.5598900 98.1940800 + 43.5476800 98.3305500 + 43.7029600 98.4730100 + 43.7597700 98.5986400 + 43.7992100 98.6001400 + 43.8112800 98.6335900 + 43.8646300 98.7814000 + 43.9449700 98.7158400 + 43.9266300 98.6462900 + 43.9770500 98.5931500 + 44.0263800 98.5950400 + 44.0450300 98.6509000 + 44.1149300 98.6122200 + 44.1234200 98.6815600 + 44.1826400 98.6839000 + 44.1864000 98.4906200 + 44.1087100 98.4187900 + 44.0709600 98.3209000 + 43.9927300 98.2769100 + 43.9445600 98.2064700 + 43.8952300 98.2048700 + 43.8961300 98.1498800 + 43.9268300 98.0820400 + 43.9663000 98.0832400 + 44.0491000 97.8238500 + 44.1487400 97.7575000 + 44.1693800 97.6889900 + 44.2093800 97.6485300 + 44.2888800 97.6089600 + 44.3677200 97.6246800 + 44.3683900 97.5693000 +2620 2620 -1 32 43.59840 97.56263 + 44.0231600 97.5337800 + 43.8068500 97.4602400 + 43.6983300 97.4579200 + 43.6594700 97.4022800 + 43.4129500 97.3972400 + 43.4121900 97.3980000 + 43.3730800 97.4373700 + 43.3237900 97.4363400 + 43.3040700 97.4359300 + 43.2842100 97.4491400 + 43.2836000 97.5036500 + 43.1735600 97.6373400 + 43.1803200 97.8689000 + 43.2770700 97.9942100 + 43.2760200 98.0623400 + 43.2755900 98.0895800 + 43.3629600 98.1741400 + 43.4221000 98.1760100 + 43.5479300 98.3168700 + 43.5476800 98.3305500 + 43.5598900 98.1940800 + 43.6004600 98.1269000 + 43.6225200 97.9768800 + 43.5156500 97.8643700 + 43.5567700 97.7423200 + 43.6460600 97.7034800 + 43.6763500 97.6493900 + 43.7351800 97.6782500 + 43.7654600 97.6240800 + 43.9924000 97.6295000 + 44.0223400 97.6026600 + 44.0231600 97.5337800 +2646 2646 -1 21 43.02550 97.12052 + 43.0434100 96.7921000 + 43.0235300 96.8190300 + 42.8955400 96.8039600 + 42.7968600 96.8298800 + 42.7761300 96.9784600 + 42.8544100 97.0473000 + 42.9603200 97.3202400 + 43.0588400 97.3221300 + 43.2152200 97.4476900 + 43.2743500 97.4489400 + 43.2749400 97.3944300 + 43.2263700 97.3253500 + 43.1968000 97.3247800 + 43.1685400 97.1881600 + 43.0895800 97.2003900 + 43.0607400 97.1183600 + 42.9721800 97.1033600 + 42.9732500 96.9676900 + 43.0135100 96.8460600 + 43.0431600 96.8328500 + 43.0434100 96.7921000 +2647 2647 -1 37 43.28290 97.27369 + 43.5934000 97.0860000 + 43.5935200 97.0723000 + 43.5248100 97.0302000 + 43.5148400 97.0437200 + 43.2803300 96.7266800 + 43.2015500 96.7122400 + 43.2174300 96.6487100 + 43.1800000 96.6300000 + 43.1522000 96.7253300 + 43.0434100 96.7921000 + 43.0431600 96.8328500 + 43.0135100 96.8460600 + 42.9732500 96.9676900 + 42.9721800 97.1033600 + 43.0607400 97.1183600 + 43.0895800 97.2003900 + 43.1685400 97.1881600 + 43.1968000 97.3247800 + 43.2263700 97.3253500 + 43.2749400 97.3944300 + 43.2743500 97.4489400 + 43.2842100 97.4491400 + 43.3040700 97.4359300 + 43.3237900 97.4363400 + 43.3249300 97.3272500 + 43.3620500 97.2672800 + 43.3258600 97.2318000 + 43.3169800 97.1225400 + 43.2385800 97.0667700 + 43.2191900 97.0256200 + 43.2293600 96.9849200 + 43.2786400 96.9856200 + 43.3579100 96.9321700 + 43.4262100 97.0287200 + 43.4755100 97.0294600 + 43.5439800 97.0988900 + 43.5934000 97.0860000 +2648 2648 -1 24 43.48010 97.09973 + 43.7410100 97.1295100 + 43.7215200 97.1017500 + 43.6326300 97.1140200 + 43.5934000 97.0860000 + 43.5439800 97.0988900 + 43.4755100 97.0294600 + 43.4262100 97.0287200 + 43.3579100 96.9321700 + 43.2786400 96.9856200 + 43.2293600 96.9849200 + 43.2191900 97.0256200 + 43.2385800 97.0667700 + 43.3169800 97.1225400 + 43.3258600 97.2318000 + 43.3620500 97.2672800 + 43.3750200 97.2463200 + 43.4444200 97.2066000 + 43.4446700 97.1792800 + 43.4738700 97.2207900 + 43.5624900 97.2360500 + 43.5819600 97.2637900 + 43.6805700 97.2667200 + 43.6812200 97.1970700 + 43.7410100 97.1295100 +2650 2650 -1 29 43.78710 97.43668 + 44.2503600 97.5250900 + 44.2213700 97.4691600 + 44.1233800 97.3980500 + 44.1033500 97.4252200 + 44.0441200 97.4239900 + 44.0237800 97.4786800 + 43.9551500 97.4358900 + 43.8071400 97.4327800 + 43.7778400 97.4047000 + 43.7589600 97.3219600 + 43.6805700 97.2667200 + 43.5819600 97.2637900 + 43.5624900 97.2360500 + 43.4738700 97.2207900 + 43.4446700 97.1792800 + 43.4444200 97.2066000 + 43.3750200 97.2463200 + 43.3620500 97.2672800 + 43.3249300 97.3272500 + 43.3237900 97.4363400 + 43.3730800 97.4373700 + 43.4121900 97.3980000 + 43.4129500 97.3972400 + 43.6594700 97.4022800 + 43.6983300 97.4579200 + 43.8068500 97.4602400 + 44.0231600 97.5337800 + 44.2497200 97.5803800 + 44.2503600 97.5250900 +309 309 -1 25 39.44030 98.02153 + 39.4909700 97.9027900 + 39.4715200 97.8893700 + 39.4626600 97.8245700 + 39.4035600 97.8359800 + 39.3251900 97.8211100 + 39.3246200 97.8597600 + 39.2951600 97.8590000 + 39.2755200 97.8585000 + 39.2655100 97.8711200 + 39.2737400 97.9743700 + 39.2835600 97.9746300 + 39.3228300 97.9757000 + 39.3504000 98.0924900 + 39.3294400 98.1692200 + 39.3678100 98.2219600 + 39.3883500 98.1709900 + 39.4278500 98.1592600 + 39.4285200 98.1205700 + 39.5760300 98.1119700 + 39.5945600 98.1771900 + 39.6142000 98.1777900 + 39.6150900 98.1260500 + 39.5480600 98.0206500 + 39.5298500 97.9296600 + 39.4909700 97.9027900 +311 311 -1 15 39.35650 97.66035 + 39.4177000 97.5137300 + 39.3882400 97.5131100 + 39.3785800 97.5000200 + 39.3000100 97.4983900 + 39.2608900 97.4847100 + 39.2605800 97.5104500 + 39.2504500 97.5359900 + 39.2790900 97.6009900 + 39.3251900 97.8211100 + 39.4035600 97.8359800 + 39.4626600 97.8245700 + 39.4052100 97.7199000 + 39.4257200 97.6558600 + 39.4268900 97.5655500 + 39.4177000 97.5137300 +601 601 -1 18 41.02060 97.86402 + 41.0478500 97.6014300 + 41.0178600 97.6403400 + 41.0162700 97.7590600 + 40.9669500 97.7710200 + 40.9652500 97.8896600 + 40.9544300 97.9552900 + 40.9247400 97.9676500 + 40.9437800 98.0077300 + 40.9322400 98.1128500 + 40.9516800 98.1266200 + 41.0219800 98.0363500 + 41.0228100 97.9835700 + 41.0525000 97.9712100 + 41.0731600 97.9057500 + 41.0550400 97.7996300 + 41.0763200 97.6813100 + 41.1164900 97.6162000 + 41.0478500 97.6014300 +602 602 -1 20 41.16030 97.25434 + 41.2211500 96.9966300 + 41.1818200 96.9960800 + 41.1815100 97.0357500 + 41.0824200 97.1267500 + 41.1020800 97.1270600 + 41.1016000 97.1798900 + 41.0520800 97.2186700 + 41.0513000 97.2978700 + 41.0609900 97.3112500 + 41.0608600 97.3244500 + 41.1395000 97.3259200 + 41.1578700 97.4452600 + 41.2160800 97.5126100 + 41.2269800 97.4202000 + 41.2665900 97.3945200 + 41.2483000 97.2617700 + 41.2682300 97.2356500 + 41.2693200 97.1164900 + 41.2304500 97.0629300 + 41.2211500 96.9966300 +603 603 -1 14 40.99860 97.19780 + 41.0824200 97.1267500 + 41.0232000 97.1521900 + 40.9741700 97.1382100 + 40.9548600 97.0983500 + 40.9155500 97.0977400 + 40.8951800 97.1764600 + 40.9250300 97.1374200 + 40.9933500 97.1912800 + 41.0122500 97.2707600 + 41.0513000 97.2978700 + 41.0520800 97.2186700 + 41.1016000 97.1798900 + 41.1020800 97.1270600 + 41.0824200 97.1267500 +604 604 -1 13 40.90340 98.04480 + 40.9652500 97.8896600 + 40.9361500 97.8625200 + 40.8773800 97.8478100 + 40.8457100 97.9917900 + 40.8824500 98.1508900 + 40.8415500 98.2418000 + 40.9210800 98.1916000 + 40.9516800 98.1266200 + 40.9322400 98.1128500 + 40.9437800 98.0077300 + 40.9247400 97.9676500 + 40.9544300 97.9552900 + 40.9652500 97.8896600 +605 605 -1 18 40.97810 97.63250 + 41.0501800 97.4034600 + 40.9620100 97.3753400 + 40.9222600 97.4141000 + 40.9221100 97.4272800 + 40.9024500 97.4268800 + 40.9307100 97.5328800 + 40.9005900 97.5849200 + 40.8777600 97.8214700 + 40.8773800 97.8478100 + 40.9361500 97.8625200 + 40.9652500 97.8896600 + 40.9669500 97.7710200 + 41.0162700 97.7590600 + 41.0178600 97.6403400 + 41.0478500 97.6014300 + 41.0787700 97.4832600 + 41.0696900 97.4170500 + 41.0501800 97.4034600 +606 606 -1 15 40.97780 97.27576 + 41.0608600 97.3244500 + 41.0609900 97.3112500 + 41.0513000 97.2978700 + 41.0122500 97.2707600 + 40.9933500 97.1912800 + 40.9250300 97.1374200 + 40.8951800 97.1764600 + 40.8946800 97.2291400 + 40.9041300 97.2688200 + 40.9229700 97.3482300 + 40.9222600 97.4141000 + 40.9620100 97.3753400 + 41.0501800 97.4034600 + 41.0510300 97.3242600 + 41.0608600 97.3244500 +607 607 -1 17 40.82140 98.10301 + 40.8777600 97.8214700 + 40.8282400 97.8465300 + 40.8276600 97.8859900 + 40.7981800 97.8852200 + 40.7975900 97.9246600 + 40.7763000 98.0293000 + 40.7955300 98.0561600 + 40.7832900 98.2005000 + 40.8013100 98.2931600 + 40.7603200 98.3838800 + 40.7799700 98.3845400 + 40.8317300 98.2414900 + 40.8415500 98.2418000 + 40.8824500 98.1508900 + 40.8457100 97.9917900 + 40.8773800 97.8478100 + 40.8777600 97.8214700 +608 608 -1 11 40.85700 97.65644 + 40.9024500 97.4268800 + 40.7942000 97.4378600 + 40.7832900 97.5297000 + 40.8214600 97.6226300 + 40.7981800 97.8852200 + 40.8276600 97.8859900 + 40.8282400 97.8465300 + 40.8777600 97.8214700 + 40.9005900 97.5849200 + 40.9307100 97.5328800 + 40.9024500 97.4268800 +609 609 -1 23 40.68330 98.19797 + 40.7975900 97.9246600 + 40.7288100 97.9228000 + 40.7183800 97.9619400 + 40.6485700 98.0256600 + 40.6671600 98.0918500 + 40.6269800 98.1431700 + 40.6258500 98.2087600 + 40.5760400 98.2465600 + 40.5753400 98.2858800 + 40.5652800 98.2986800 + 40.5844500 98.3255200 + 40.5827300 98.4172900 + 40.6018800 98.4441800 + 40.6799600 98.4731400 + 40.7207700 98.3957000 + 40.7502400 98.3967000 + 40.7504900 98.3835500 + 40.7603200 98.3838800 + 40.8013100 98.2931600 + 40.7832900 98.2005000 + 40.7955300 98.0561600 + 40.7763000 98.0293000 + 40.7975900 97.9246600 +610 610 -1 19 40.67020 97.88813 + 40.7832900 97.5297000 + 40.7045200 97.5411500 + 40.6738900 97.6324000 + 40.6344200 97.6446200 + 40.6233700 97.7362300 + 40.5937200 97.7486200 + 40.5321000 97.9306000 + 40.5189100 98.1399200 + 40.5760400 98.2465600 + 40.6258500 98.2087600 + 40.6269800 98.1431700 + 40.6671600 98.0918500 + 40.6485700 98.0256600 + 40.7183800 97.9619400 + 40.7288100 97.9228000 + 40.7975900 97.9246600 + 40.7981800 97.8852200 + 40.8214600 97.6226300 + 40.7832900 97.5297000 +611 611 -1 26 40.74950 97.40932 + 40.9041300 97.2688200 + 40.8455400 97.2282900 + 40.7767500 97.2271000 + 40.7772400 97.1745100 + 40.7477600 97.1740200 + 40.7181600 97.1866700 + 40.7172700 97.2786300 + 40.7369200 97.2789800 + 40.7463500 97.3185900 + 40.7165900 97.3443100 + 40.6854900 97.4882000 + 40.6460300 97.5005000 + 40.6458800 97.5136200 + 40.6260700 97.5263200 + 40.5759700 97.6039300 + 40.6049400 97.6439400 + 40.6344200 97.6446200 + 40.6738900 97.6324000 + 40.7045200 97.5411500 + 40.7832900 97.5297000 + 40.7942000 97.4378600 + 40.9024500 97.4268800 + 40.9221100 97.4272800 + 40.9222600 97.4141000 + 40.9229700 97.3482300 + 40.9041300 97.2688200 +612 612 -1 19 40.68260 97.26440 + 40.6503100 97.0805200 + 40.6498500 97.1330200 + 40.6693800 97.1464600 + 40.6493700 97.1855200 + 40.6483400 97.2905200 + 40.6181800 97.3555800 + 40.6168600 97.4736400 + 40.6460300 97.5005000 + 40.6854900 97.4882000 + 40.7165900 97.3443100 + 40.7463500 97.3185900 + 40.7369200 97.2789800 + 40.7172700 97.2786300 + 40.7181600 97.1866700 + 40.7477600 97.1740200 + 40.7483500 97.1083000 + 40.6998800 97.0287300 + 40.6703900 97.0283100 + 40.6503100 97.0805200 +613 613 -1 33 40.89170 97.07623 + 41.1818200 96.9960800 + 41.1130100 96.9951100 + 41.0142800 97.0464900 + 40.9750700 97.0327300 + 40.9557300 96.9929000 + 40.9360700 96.9926200 + 40.9358600 97.0189800 + 40.8768900 97.0181400 + 40.7688800 97.0034300 + 40.7298700 96.9634600 + 40.7003900 96.9630600 + 40.6518300 96.8836400 + 40.6318900 96.9227700 + 40.6122400 96.9225100 + 40.6016000 97.0273100 + 40.6503100 97.0805200 + 40.6703900 97.0283100 + 40.6998800 97.0287300 + 40.7483500 97.1083000 + 40.7477600 97.1740200 + 40.7772400 97.1745100 + 40.7767500 97.2271000 + 40.8455400 97.2282900 + 40.9041300 97.2688200 + 40.8946800 97.2291400 + 40.8951800 97.1764600 + 40.9155500 97.0977400 + 40.9548600 97.0983500 + 40.9741700 97.1382100 + 41.0232000 97.1521900 + 41.0824200 97.1267500 + 41.1815100 97.0357500 + 41.1818200 96.9960800 +614 614 -1 17 40.53160 97.65487 + 40.6260700 97.5263200 + 40.5580600 97.4593100 + 40.5294600 97.3801000 + 40.4803400 97.3791400 + 40.4403000 97.4438200 + 40.4300300 97.4828600 + 40.4287600 97.5875300 + 40.4767000 97.6802700 + 40.4650700 97.8109400 + 40.4741300 97.8635500 + 40.5321000 97.9306000 + 40.5937200 97.7486200 + 40.6233700 97.7362300 + 40.6344200 97.6446200 + 40.6049400 97.6439400 + 40.5759700 97.6039300 + 40.6260700 97.5263200 +615 615 -1 21 40.56490 97.26287 + 40.6460300 97.5005000 + 40.6168600 97.4736400 + 40.6181800 97.3555800 + 40.6483400 97.2905200 + 40.6493700 97.1855200 + 40.6210400 97.0538300 + 40.6016000 97.0273100 + 40.5918800 97.0140500 + 40.4839000 96.9994300 + 40.4829200 97.1172700 + 40.5219800 97.1441000 + 40.5215000 97.1965000 + 40.5507300 97.2232100 + 40.5499500 97.3018400 + 40.4806200 97.3529600 + 40.4803400 97.3791400 + 40.5294600 97.3801000 + 40.5580600 97.4593100 + 40.6260700 97.5263200 + 40.6458800 97.5136200 + 40.6460300 97.5005000 +616 616 -1 17 40.40830 97.14268 + 40.4839000 96.9994300 + 40.3664900 96.9324100 + 40.3661000 96.9847000 + 40.2965800 97.0751800 + 40.2658000 97.2183300 + 40.2753700 97.2446100 + 40.3244900 97.2454700 + 40.3044500 97.2843100 + 40.3531700 97.3244000 + 40.4514200 97.3262300 + 40.4806200 97.3529600 + 40.5499500 97.3018400 + 40.5507300 97.2232100 + 40.5215000 97.1965000 + 40.5219800 97.1441000 + 40.4829200 97.1172700 + 40.4839000 96.9994300 +617 617 -1 23 40.39550 96.93874 + 40.6122400 96.9225100 + 40.5631100 96.9218800 + 40.5241700 96.8689600 + 40.5346000 96.7773500 + 40.5253000 96.6855300 + 40.5057800 96.6591400 + 40.4664100 96.6718700 + 40.3878000 96.6711300 + 40.2005300 96.7737300 + 40.2293200 96.8784300 + 40.1793300 96.9951800 + 40.1985500 97.0476200 + 40.1786800 97.0734100 + 40.1974000 97.1780400 + 40.2268800 97.1785200 + 40.2658000 97.2183300 + 40.2965800 97.0751800 + 40.3661000 96.9847000 + 40.3664900 96.9324100 + 40.4839000 96.9994300 + 40.5918800 97.0140500 + 40.6016000 97.0273100 + 40.6122400 96.9225100 +618 618 -1 18 40.26010 96.63042 + 40.4664100 96.6718700 + 40.4372600 96.6061600 + 40.3980800 96.5796700 + 40.4179600 96.5275000 + 40.3688300 96.5271400 + 40.3395200 96.4877100 + 40.2510900 96.4871100 + 40.2018600 96.5128600 + 40.2015800 96.5780800 + 40.0935100 96.5772100 + 40.0834400 96.6292100 + 40.0539000 96.6419800 + 40.0537600 96.6680100 + 40.1224600 96.6816800 + 40.1417400 96.7470200 + 40.2005300 96.7737300 + 40.3878000 96.6711300 + 40.4664100 96.6718700 +619 619 -1 16 40.12620 96.85772 + 40.2005300 96.7737300 + 40.1417400 96.7470200 + 40.1224600 96.6816800 + 40.0537600 96.6680100 + 40.0341100 96.6678200 + 40.0237000 96.7718200 + 40.0230100 96.8759000 + 40.0423900 96.9151800 + 40.0522100 96.9153100 + 40.0521100 96.9283200 + 40.0709500 97.0327300 + 40.1496500 97.0208300 + 40.1985500 97.0476200 + 40.1793300 96.9951800 + 40.2293200 96.8784300 + 40.2005300 96.7737300 +620 620 -1 13 40.15250 96.49908 + 40.1729200 96.3561900 + 40.1530300 96.4343000 + 40.0543300 96.5508600 + 40.0539000 96.6419800 + 40.0834400 96.6292100 + 40.0935100 96.5772100 + 40.2015800 96.5780800 + 40.2018600 96.5128600 + 40.2510900 96.4871100 + 40.2511900 96.4610100 + 40.2315800 96.4478300 + 40.2220500 96.3564400 + 40.1729200 96.3561900 +621 621 -1 25 40.00030 96.62252 + 40.1729200 96.3561900 + 40.1533500 96.3300200 + 40.1140500 96.3298500 + 40.0844700 96.3687700 + 39.9960900 96.3553200 + 39.9665400 96.3811700 + 39.9663300 96.4461700 + 39.9269400 96.4719200 + 39.9167400 96.5628000 + 39.8872100 96.5755500 + 39.8277600 96.6788900 + 39.8473300 96.6920500 + 39.8664400 96.7831100 + 39.8662000 96.8220600 + 39.9252200 96.8097400 + 39.9247800 96.8747000 + 40.0423900 96.9151800 + 40.0230100 96.8759000 + 40.0237000 96.7718200 + 40.0341100 96.6678200 + 40.0537600 96.6680100 + 40.0539000 96.6419800 + 40.0543300 96.5508600 + 40.1530300 96.4343000 + 40.1729200 96.3561900 +622 622 -1 14 39.76410 96.68445 + 39.9269400 96.4719200 + 39.8286100 96.4972200 + 39.7791600 96.5746800 + 39.7789200 96.6265600 + 39.7592000 96.6393400 + 39.6412700 96.6512500 + 39.6013200 96.7673000 + 39.7587100 96.7300900 + 39.8664400 96.7831100 + 39.8473300 96.6920500 + 39.8277600 96.6788900 + 39.8872100 96.5755500 + 39.9167400 96.5628000 + 39.9269400 96.4719200 +623 623 -1 17 39.72380 96.90471 + 39.8664400 96.7831100 + 39.7587100 96.7300900 + 39.6013200 96.7673000 + 39.6010800 96.8061100 + 39.5912600 96.8059900 + 39.5910900 96.8318600 + 39.5810900 96.8576000 + 39.6201100 96.8968900 + 39.6194200 96.9874500 + 39.6481400 97.0784500 + 39.7070700 97.0793400 + 39.7665400 97.0154000 + 39.7666500 97.0024300 + 39.7177400 96.9758500 + 39.7182300 96.9110600 + 39.8662000 96.8220600 + 39.8664400 96.7831100 +626 626 -1 21 40.39370 98.28368 + 40.5652800 98.2986800 + 40.5161600 98.2970900 + 40.4686700 98.2038900 + 40.4296000 98.1895900 + 40.3724300 98.0832100 + 40.3333500 98.0690000 + 40.3121700 98.1598600 + 40.2530100 98.1711300 + 40.2521000 98.2233300 + 40.2029900 98.2218000 + 40.2308200 98.3140300 + 40.2504600 98.3146700 + 40.2691300 98.3675100 + 40.2789600 98.3678400 + 40.2764400 98.4983700 + 40.4046500 98.4766800 + 40.4741700 98.4398000 + 40.4744200 98.4267200 + 40.5827300 98.4172900 + 40.5844500 98.3255200 + 40.5652800 98.2986800 +627 627 -1 26 40.29910 98.04586 + 40.4686700 98.2038900 + 40.4704400 98.0991700 + 40.3241600 98.0295300 + 40.3249900 97.9772800 + 40.2676400 97.8712200 + 40.2685900 97.8059600 + 40.2303900 97.7266900 + 40.2314400 97.6484100 + 40.2028000 97.5825200 + 40.1731700 97.5949100 + 40.1796200 97.8428400 + 40.1301200 97.8676400 + 40.1772300 97.9992800 + 40.1277000 98.0239600 + 40.1471400 98.0375500 + 40.1364600 98.0893900 + 40.1655000 98.1163200 + 40.1545600 98.1811800 + 40.2029900 98.2218000 + 40.2521000 98.2233300 + 40.2530100 98.1711300 + 40.3121700 98.1598600 + 40.3333500 98.0690000 + 40.3724300 98.0832100 + 40.4296000 98.1895900 + 40.4686700 98.2038900 +628 628 -1 24 40.38940 97.88874 + 40.5321000 97.9306000 + 40.4741300 97.8635500 + 40.4650700 97.8109400 + 40.3684500 97.6908000 + 40.3313100 97.5200300 + 40.2826600 97.4798100 + 40.2335400 97.4788000 + 40.2329200 97.5309800 + 40.2032900 97.5434000 + 40.2028000 97.5825200 + 40.2314400 97.6484100 + 40.2303900 97.7266900 + 40.2685900 97.8059600 + 40.2676400 97.8712200 + 40.3249900 97.9772800 + 40.3241600 98.0295300 + 40.4704400 98.0991700 + 40.4686700 98.2038900 + 40.5161600 98.2970900 + 40.5652800 98.2986800 + 40.5753400 98.2858800 + 40.5760400 98.2465600 + 40.5189100 98.1399200 + 40.5321000 97.9306000 +629 629 -1 18 40.33060 97.47400 + 40.4300300 97.4828600 + 40.3908800 97.4689700 + 40.3716800 97.4293500 + 40.3225600 97.4283700 + 40.3228500 97.4022400 + 40.2247500 97.3872700 + 40.1845700 97.4647400 + 40.2040700 97.4781900 + 40.2032900 97.5434000 + 40.2329200 97.5309800 + 40.2335400 97.4788000 + 40.2826600 97.4798100 + 40.3313100 97.5200300 + 40.3684500 97.6908000 + 40.4650700 97.8109400 + 40.4767000 97.6802700 + 40.4287600 97.5875300 + 40.4300300 97.4828600 +630 630 -1 42 40.21800 97.28934 + 40.4806200 97.3529600 + 40.4514200 97.3262300 + 40.3531700 97.3244000 + 40.3044500 97.2843100 + 40.3244900 97.2454700 + 40.2753700 97.2446100 + 40.2658000 97.2183300 + 40.2268800 97.1785200 + 40.1974000 97.1780400 + 40.0991600 97.1764200 + 40.0984100 97.2545600 + 40.1666500 97.3079100 + 40.1658100 97.3861200 + 40.0953900 97.5280500 + 40.0261500 97.5656100 + 40.0248100 97.6696900 + 39.9755300 97.6815500 + 39.9553600 97.7200800 + 39.9648200 97.7463100 + 40.0041100 97.7472700 + 40.0317000 97.8780900 + 40.0707900 97.8921400 + 40.0994700 97.9450000 + 40.0990600 97.9710500 + 40.1277000 98.0239600 + 40.1772300 97.9992800 + 40.1301200 97.8676400 + 40.1796200 97.8428400 + 40.1731700 97.5949100 + 40.2028000 97.5825200 + 40.2032900 97.5434000 + 40.2040700 97.4781900 + 40.1845700 97.4647400 + 40.2247500 97.3872700 + 40.3228500 97.4022400 + 40.3225600 97.4283700 + 40.3716800 97.4293500 + 40.3908800 97.4689700 + 40.4300300 97.4828600 + 40.4403000 97.4438200 + 40.4803400 97.3791400 + 40.4806200 97.3529600 +631 631 -1 25 39.85400 97.28263 + 39.9815300 97.1484800 + 39.8933500 97.1211000 + 39.8741600 97.0688600 + 39.7666500 97.0024300 + 39.7665400 97.0154000 + 39.7070700 97.0793400 + 39.7266000 97.0925900 + 39.7262600 97.1314500 + 39.7944100 97.1973800 + 39.7842100 97.2361200 + 39.8033300 97.2883400 + 39.7832800 97.3268900 + 39.7538200 97.3263400 + 39.8022300 97.3921000 + 39.8013400 97.4699200 + 39.8793000 97.5234500 + 39.8984600 97.5628400 + 39.9383900 97.5117100 + 39.9489700 97.4469400 + 39.9687700 97.4343300 + 39.9696300 97.3563400 + 39.9995200 97.3178800 + 39.9809200 97.2135000 + 40.0009300 97.1748100 + 39.9815300 97.1484800 +632 632 -1 32 40.03820 97.32420 + 40.1985500 97.0476200 + 40.1496500 97.0208300 + 40.0709500 97.0327300 + 40.0521100 96.9283200 + 39.9729300 97.0053200 + 40.0212800 97.0970800 + 40.0210500 97.1230900 + 39.9815300 97.1484800 + 40.0009300 97.1748100 + 39.9809200 97.2135000 + 39.9995200 97.3178800 + 39.9696300 97.3563400 + 39.9687700 97.4343300 + 39.9489700 97.4469400 + 39.9383900 97.5117100 + 39.8984600 97.5628400 + 39.9177800 97.5892400 + 39.8778200 97.6403000 + 39.8966000 97.7056800 + 39.9358900 97.7066100 + 39.9553600 97.7200800 + 39.9755300 97.6815500 + 40.0248100 97.6696900 + 40.0261500 97.5656100 + 40.0953900 97.5280500 + 40.1658100 97.3861200 + 40.1666500 97.3079100 + 40.0984100 97.2545600 + 40.0991600 97.1764200 + 40.1974000 97.1780400 + 40.1786800 97.0734100 + 40.1985500 97.0476200 +633 633 -1 16 39.88500 96.97911 + 40.0521100 96.9283200 + 40.0522100 96.9153100 + 40.0423900 96.9151800 + 39.9247800 96.8747000 + 39.9252200 96.8097400 + 39.8662000 96.8220600 + 39.7182300 96.9110600 + 39.7177400 96.9758500 + 39.7666500 97.0024300 + 39.8741600 97.0688600 + 39.8933500 97.1211000 + 39.9815300 97.1484800 + 40.0210500 97.1230900 + 40.0212800 97.0970800 + 39.9729300 97.0053200 + 40.0521100 96.9283200 +634 634 -1 12 39.83870 96.45166 + 39.9960900 96.3553200 + 39.9273300 96.3549700 + 39.8488100 96.3286300 + 39.7600900 96.4319300 + 39.6814200 96.4573600 + 39.7203400 96.5483000 + 39.7791600 96.5746800 + 39.8286100 96.4972200 + 39.9269400 96.4719200 + 39.9663300 96.4461700 + 39.9665400 96.3811700 + 39.9960900 96.3553200 +635 635 -1 20 39.74070 96.26311 + 39.8785700 96.1859300 + 39.7902100 96.1468000 + 39.7804300 96.1078700 + 39.7214900 96.1207400 + 39.6724100 96.0688700 + 39.6527500 96.0947400 + 39.6722100 96.2371900 + 39.6230700 96.2499700 + 39.6230100 96.2758500 + 39.6034200 96.2499000 + 39.5542600 96.2755800 + 39.5541300 96.3272900 + 39.6620300 96.3795600 + 39.6814200 96.4573600 + 39.7600900 96.4319300 + 39.8488100 96.3286300 + 39.9273300 96.3549700 + 39.8981600 96.2249500 + 39.8785100 96.2248800 + 39.8785700 96.1859300 +636 636 -1 15 39.51600 96.97315 + 39.5810900 96.8576000 + 39.4926100 96.8694800 + 39.4634100 96.8303900 + 39.4533200 96.8690000 + 39.3943000 96.8812000 + 39.3843000 96.9068600 + 39.3839100 96.9584400 + 39.4425400 96.9979500 + 39.4324000 97.0365200 + 39.4715800 97.0500000 + 39.5594100 97.1159100 + 39.6481400 97.0784500 + 39.6194200 96.9874500 + 39.6201100 96.8968900 + 39.5810900 96.8576000 +637 637 -1 21 39.60200 96.55371 + 39.6814200 96.4573600 + 39.6620300 96.3795600 + 39.5541300 96.3272900 + 39.5246700 96.3271600 + 39.5247300 96.3013200 + 39.4952400 96.3141100 + 39.4950600 96.3786800 + 39.4754100 96.3785800 + 39.4752000 96.4431500 + 39.4355600 96.5332400 + 39.4249100 96.7009100 + 39.5034100 96.7145900 + 39.5912600 96.8059900 + 39.6010800 96.8061100 + 39.6013200 96.7673000 + 39.6412700 96.6512500 + 39.7592000 96.6393400 + 39.7789200 96.6265600 + 39.7791600 96.5746800 + 39.7203400 96.5483000 + 39.6814200 96.4573600 +638 638 -1 22 39.42480 96.71328 + 39.5912600 96.8059900 + 39.5034100 96.7145900 + 39.4249100 96.7009100 + 39.4355600 96.5332400 + 39.4258000 96.5202600 + 39.3472300 96.5197000 + 39.3175900 96.5581400 + 39.2586100 96.5705600 + 39.2583000 96.6349300 + 39.2772900 96.7509900 + 39.3260000 96.8159300 + 39.3554600 96.8162600 + 39.3746600 96.8809500 + 39.3844800 96.8810700 + 39.3843000 96.9068600 + 39.3943000 96.8812000 + 39.4533200 96.8690000 + 39.4634100 96.8303900 + 39.4926100 96.8694800 + 39.5810900 96.8576000 + 39.5910900 96.8318600 + 39.5912600 96.8059900 +640 640 -1 18 41.13600 97.61501 + 41.2160800 97.5126100 + 41.1578700 97.4452600 + 41.1395000 97.3259200 + 41.0608600 97.3244500 + 41.0510300 97.3242600 + 41.0501800 97.4034600 + 41.0696900 97.4170500 + 41.0787700 97.4832600 + 41.0478500 97.6014300 + 41.1164900 97.6162000 + 41.0763200 97.6813100 + 41.0550400 97.7996300 + 41.0731600 97.9057500 + 41.1230900 97.8542300 + 41.1438700 97.7754500 + 41.1252900 97.6956900 + 41.2241100 97.6583600 + 41.2160800 97.5126100 +701 701 -1 15 42.51360 99.10980 + 42.4678500 98.6177200 + 42.4284900 98.6162300 + 42.3767900 98.7354000 + 42.4794000 98.9955300 + 42.4762200 99.1301700 + 42.5214300 99.2940700 + 42.5033800 99.6033700 + 42.5627900 99.5929600 + 42.5948800 99.5001000 + 42.6346100 99.4885900 + 42.6503900 99.2596600 + 42.5679700 98.9993500 + 42.5032900 98.8078000 + 42.4737600 98.8066100 + 42.4678500 98.6177200 +702 702 -1 15 42.29350 98.58879 + 42.3068800 98.2756000 + 42.2473700 98.3005100 + 42.1934000 98.5537300 + 42.1327600 98.6319700 + 42.1186800 98.8325500 + 42.1371700 98.8869500 + 42.1762200 98.9019900 + 42.2474400 98.7974900 + 42.3767900 98.7354000 + 42.4284900 98.6162300 + 42.4678500 98.6177200 + 42.4684000 98.5907900 + 42.4306100 98.5085800 + 42.4228000 98.4005700 + 42.3068800 98.2756000 +703 703 -1 24 42.12080 98.43000 + 42.1731300 98.0297400 + 42.0944200 98.0274500 + 42.0940000 98.0542400 + 42.0542100 98.0798600 + 42.0535600 98.1200100 + 41.9945400 98.1182300 + 41.9840400 98.1580400 + 41.9346300 98.1698900 + 41.9428600 98.2637500 + 41.9812500 98.3185100 + 42.0412300 98.2669400 + 42.0705100 98.2812900 + 42.0473900 98.4680300 + 42.0665500 98.4955000 + 42.0717900 98.7234600 + 42.1186800 98.8325500 + 42.1327600 98.6319700 + 42.1934000 98.5537300 + 42.2473700 98.3005100 + 42.3068800 98.2756000 + 42.2686800 98.2071700 + 42.2792100 98.1672000 + 42.2210500 98.1116900 + 42.1731300 98.0297400 +704 704 -1 35 42.00820 97.78967 + 42.1004300 97.5987900 + 42.0714000 97.5579400 + 42.0726500 97.4508100 + 42.0140500 97.4094400 + 41.8860100 97.4202200 + 41.8952500 97.4738500 + 41.9247600 97.4744700 + 41.9231600 97.6081100 + 41.8843100 97.5671400 + 41.8644700 97.5800500 + 41.8228800 97.7526200 + 41.8319800 97.8062500 + 41.9002700 97.8481100 + 41.9282100 97.9557900 + 41.9278000 97.9825100 + 41.8980800 97.9950300 + 41.8974600 98.0351100 + 41.8777800 98.0345400 + 41.9162800 98.0891200 + 41.9346300 98.1698900 + 41.9840400 98.1580400 + 41.9945400 98.1182300 + 42.0535600 98.1200100 + 42.0542100 98.0798600 + 42.0940000 98.0542400 + 42.0944200 98.0274500 + 42.1731300 98.0297400 + 42.1934400 97.9900700 + 42.1639200 97.9892300 + 42.1653300 97.8953700 + 42.1267400 97.8407000 + 42.1466100 97.8278100 + 42.1473600 97.7741900 + 42.1182000 97.7466400 + 42.1004300 97.5987900 +705 NF ELKHORN RIVER NR PIERCE NE -1 496 42.33500 97.62750 + 42.1787500 97.4879170 + 42.1745830 97.4983540 + 42.1620830 97.5108540 + 42.1641880 97.5129170 + 42.1662500 97.5149790 + 42.1662500 97.5275210 + 42.1641880 97.5295830 + 42.1558130 97.5295830 + 42.1537500 97.5274790 + 42.1516880 97.5254170 + 42.1454170 97.5274790 + 42.1412500 97.5399790 + 42.1412500 97.5691880 + 42.1391460 97.5712500 + 42.1370830 97.5733130 + 42.1370830 97.5775210 + 42.1349790 97.5795830 + 42.1329170 97.5816460 + 42.1329170 97.5858540 + 42.1308130 97.5879170 + 42.1287500 97.5899790 + 42.1287500 97.6025210 + 42.1266460 97.6045830 + 42.1245830 97.6066880 + 42.1225210 97.6087500 + 42.1183130 97.6087500 + 42.1162500 97.6108540 + 42.1141880 97.6129170 + 42.1058130 97.6129170 + 42.1037500 97.6150210 + 42.1016460 97.6170830 + 42.0995830 97.6170830 + 42.0954170 97.6358540 + 42.0975210 97.6379170 + 42.0995830 97.6399790 + 42.0995830 97.6483540 + 42.1016880 97.6504170 + 42.1037500 97.6524790 + 42.1037500 97.6691880 + 42.1016460 97.6712500 + 42.0995830 97.6858540 + 42.1016880 97.6879170 + 42.1037500 97.6941880 + 42.1058540 97.6962500 + 42.1079170 97.6983130 + 42.1079170 97.7025210 + 42.1100210 97.7045830 + 42.1120830 97.7066460 + 42.1120830 97.7108540 + 42.1141880 97.7129170 + 42.1162500 97.7150210 + 42.1183540 97.7170830 + 42.1204170 97.7191880 + 42.1183130 97.7212500 + 42.1162500 97.7233130 + 42.1162500 97.7316880 + 42.1141460 97.7337500 + 42.1120830 97.7358130 + 42.1120830 97.7441880 + 42.1141880 97.7462500 + 42.1162500 97.7483540 + 42.1183540 97.7504170 + 42.1204170 97.7525210 + 42.1225210 97.7545830 + 42.1245830 97.7566460 + 42.1245830 97.7650210 + 42.1266880 97.7670830 + 42.1287500 97.7691880 + 42.1308540 97.7712500 + 42.1329170 97.7733130 + 42.1329170 97.7775210 + 42.1350210 97.7795830 + 42.1370830 97.7816460 + 42.1370830 97.7858540 + 42.1391880 97.7879170 + 42.1412500 97.7899790 + 42.1412500 97.7983540 + 42.1433130 97.8004170 + 42.1475210 97.8004170 + 42.1495830 97.8025210 + 42.1516460 97.8045830 + 42.1683540 97.8045830 + 42.1704170 97.8066880 + 42.1725210 97.8087500 + 42.1745830 97.8108540 + 42.1766880 97.8129170 + 42.1787500 97.8149790 + 42.1787500 97.8233540 + 42.1766460 97.8254170 + 42.1745830 97.8274790 + 42.1745830 97.8525210 + 42.1724790 97.8545830 + 42.1704170 97.8566880 + 42.1683130 97.8587500 + 42.1662500 97.8608130 + 42.1662500 97.8650210 + 42.1641460 97.8670830 + 42.1620830 97.8691460 + 42.1620830 97.8733540 + 42.1599790 97.8754170 + 42.1579170 97.8774790 + 42.1579170 97.8816880 + 42.1558130 97.8837500 + 42.1537500 97.8858130 + 42.1537500 97.8900210 + 42.1558540 97.8920830 + 42.1579170 97.8941880 + 42.1600210 97.8962500 + 42.1620830 97.8983130 + 42.1620830 97.9066880 + 42.1641880 97.9087500 + 42.1662500 97.9108130 + 42.1662500 97.9150210 + 42.1683540 97.9170830 + 42.1704170 97.9191460 + 42.1704170 97.9233540 + 42.1683130 97.9254170 + 42.1662500 97.9275210 + 42.1683540 97.9295830 + 42.1704170 97.9316460 + 42.1704170 97.9525210 + 42.1725210 97.9545830 + 42.1745830 97.9608540 + 42.1724790 97.9629170 + 42.1704170 97.9691880 + 42.1725210 97.9712500 + 42.1745830 97.9733130 + 42.1745830 97.9816880 + 42.1766460 97.9837500 + 42.1808540 97.9837500 + 42.1829170 97.9858540 + 42.1849790 97.9879170 + 42.1912500 97.9899790 + 42.1912500 97.9941880 + 42.1933540 97.9962500 + 42.1954170 97.9983540 + 42.1933130 98.0004170 + 42.1912500 98.0024790 + 42.1912500 98.0108540 + 42.1891460 98.0129170 + 42.1870830 98.0149790 + 42.1870830 98.0275210 + 42.1891880 98.0295830 + 42.1912500 98.0316460 + 42.1912500 98.0441880 + 42.1933540 98.0462500 + 42.1954170 98.0483540 + 42.1975210 98.0504170 + 42.1995830 98.0524790 + 42.1995830 98.0566880 + 42.2016880 98.0587500 + 42.2037500 98.0608540 + 42.2058540 98.0629170 + 42.2079170 98.0649790 + 42.2079170 98.0775210 + 42.2100210 98.0795830 + 42.2120830 98.0816460 + 42.2120830 98.0983540 + 42.2141880 98.1004170 + 42.2162500 98.1024790 + 42.2162500 98.1066880 + 42.2183130 98.1087500 + 42.2225210 98.1087500 + 42.2245830 98.1108540 + 42.2266460 98.1129170 + 42.2350210 98.1129170 + 42.2370830 98.1150210 + 42.2391460 98.1170830 + 42.2433540 98.1170830 + 42.2454170 98.1191880 + 42.2474790 98.1212500 + 42.2516880 98.1212500 + 42.2537500 98.1233540 + 42.2558130 98.1254170 + 42.2641880 98.1254170 + 42.2662500 98.1254170 + 42.2662500 98.1149790 + 42.2683130 98.1129170 + 42.2704170 98.1108540 + 42.2704170 98.1024790 + 42.2724790 98.1004170 + 42.2766880 98.1004170 + 42.2787500 98.0983540 + 42.2787500 98.0858130 + 42.2808130 98.0837500 + 42.2829170 98.0816880 + 42.2829170 98.0649790 + 42.2849790 98.0629170 + 42.2870830 98.0608540 + 42.2870830 98.0483130 + 42.2891460 98.0462500 + 42.2912500 98.0441880 + 42.2933130 98.0420830 + 42.2954170 98.0400210 + 42.2974790 98.0379170 + 42.2995830 98.0358540 + 42.3037500 98.0316880 + 42.3037500 98.0108130 + 42.3058130 98.0087500 + 42.3079170 98.0066880 + 42.3099790 98.0045830 + 42.3120830 98.0025210 + 42.3120830 97.9941460 + 42.3141460 97.9920830 + 42.3162500 97.9900210 + 42.3183130 97.9879170 + 42.3204170 97.9858540 + 42.3204170 97.9733130 + 42.3224790 97.9712500 + 42.3245830 97.9691880 + 42.3245830 97.9524790 + 42.3266460 97.9504170 + 42.3287500 97.9483540 + 42.3266880 97.9462500 + 42.3245830 97.9441880 + 42.3245830 97.9358130 + 42.3225210 97.9337500 + 42.3204170 97.9316880 + 42.3183540 97.9295830 + 42.3162500 97.9275210 + 42.3162500 97.9191460 + 42.3183130 97.9170830 + 42.3204170 97.9150210 + 42.3204170 97.9108130 + 42.3183540 97.9087500 + 42.3162500 97.9066880 + 42.3183130 97.9045830 + 42.3204170 97.9025210 + 42.3224790 97.9004170 + 42.3266880 97.9004170 + 42.3287500 97.8983540 + 42.3308130 97.8962500 + 42.3329170 97.8941880 + 42.3329170 97.8774790 + 42.3349790 97.8754170 + 42.3370830 97.8733540 + 42.3391460 97.8712500 + 42.3412500 97.8691880 + 42.3433130 97.8670830 + 42.3475210 97.8670830 + 42.3495830 97.8650210 + 42.3516460 97.8629170 + 42.3537500 97.8608540 + 42.3537500 97.8483130 + 42.3558130 97.8462500 + 42.3579170 97.8441880 + 42.3599790 97.8420830 + 42.3641880 97.8420830 + 42.3662500 97.8400210 + 42.3683130 97.8379170 + 42.3704170 97.8358540 + 42.3745830 97.8275210 + 42.3745830 97.8066460 + 42.3787500 97.7983130 + 42.3870830 97.7941460 + 42.3891460 97.7962500 + 42.3912500 97.7983130 + 42.3933130 97.8004170 + 42.4079170 97.7983540 + 42.4079170 97.7774790 + 42.4099790 97.7754170 + 42.4141880 97.7754170 + 42.4162500 97.7774790 + 42.4183130 97.7795830 + 42.4204170 97.7816460 + 42.4224790 97.7837500 + 42.4245830 97.7858130 + 42.4266460 97.7879170 + 42.4287500 97.7899790 + 42.4308130 97.7920830 + 42.4350210 97.7920830 + 42.4370830 97.7941460 + 42.4391460 97.7962500 + 42.4412500 97.7983130 + 42.4433130 97.8004170 + 42.4454170 97.7983540 + 42.4474790 97.7962500 + 42.4495830 97.7941880 + 42.4516460 97.7920830 + 42.4558540 97.7920830 + 42.4579170 97.7900210 + 42.4599790 97.7879170 + 42.4620830 97.7858540 + 42.4641460 97.7837500 + 42.4662500 97.7816880 + 42.4683130 97.7795830 + 42.4704170 97.7775210 + 42.4745830 97.7691880 + 42.4745830 97.7524790 + 42.4725210 97.7504170 + 42.4704170 97.7483540 + 42.4704170 97.7399790 + 42.4724790 97.7379170 + 42.4745830 97.7358540 + 42.4745830 97.7316460 + 42.4725210 97.7295830 + 42.4704170 97.7275210 + 42.4704170 97.7066460 + 42.4683540 97.7045830 + 42.4662500 97.7025210 + 42.4683130 97.7004170 + 42.4704170 97.6983540 + 42.4724790 97.6962500 + 42.4745830 97.6941880 + 42.4766460 97.6920830 + 42.4808540 97.6920830 + 42.4829170 97.6900210 + 42.4849790 97.6879170 + 42.4891880 97.6879170 + 42.4912500 97.6858540 + 42.5037500 97.6733540 + 42.5037500 97.6649790 + 42.5079170 97.6608540 + 42.5079170 97.6441460 + 42.5099790 97.6420830 + 42.5120830 97.6400210 + 42.5120830 97.6274790 + 42.5141460 97.6254170 + 42.5162500 97.6233540 + 42.5141880 97.6212500 + 42.5120830 97.6191880 + 42.5120830 97.6066460 + 42.5141460 97.6045830 + 42.5162500 97.6025210 + 42.5183130 97.6004170 + 42.5204170 97.5983540 + 42.5224790 97.5962500 + 42.5266880 97.5962500 + 42.5287500 97.5941880 + 42.5308130 97.5920830 + 42.5329170 97.5900210 + 42.5349790 97.5879170 + 42.5370830 97.5858540 + 42.5391460 97.5837500 + 42.5412500 97.5816880 + 42.5412500 97.5733130 + 42.5433130 97.5712500 + 42.5454170 97.5691880 + 42.5454170 97.5524790 + 42.5474790 97.5504170 + 42.5495830 97.5524790 + 42.5516460 97.5545830 + 42.5537500 97.5525210 + 42.5537500 97.5399790 + 42.5558130 97.5379170 + 42.5579170 97.5358540 + 42.5599790 97.5337500 + 42.5641880 97.5337500 + 42.5662500 97.5358130 + 42.5683130 97.5379170 + 42.5725210 97.5379170 + 42.5745830 97.5358540 + 42.5745830 97.5149790 + 42.5725210 97.5129170 + 42.5683130 97.5129170 + 42.5662500 97.5108540 + 42.5641880 97.5087500 + 42.5558130 97.5087500 + 42.5537500 97.5066880 + 42.5516880 97.5045830 + 42.5433130 97.5045830 + 42.5412500 97.5025210 + 42.5391880 97.5004170 + 42.5349790 97.5004170 + 42.5287500 97.4899790 + 42.5266880 97.4879170 + 42.5245830 97.4858540 + 42.5225210 97.4837500 + 42.5204170 97.4816880 + 42.5183540 97.4795830 + 42.5162500 97.4775210 + 42.5162500 97.4691460 + 42.5141880 97.4670830 + 42.5120830 97.4650210 + 42.5100210 97.4629170 + 42.5079170 97.4649790 + 42.5058540 97.4670830 + 42.5016460 97.4670830 + 42.4995830 97.4650210 + 42.4954170 97.4608540 + 42.4912500 97.4566880 + 42.4870830 97.4525210 + 42.4870830 97.4483130 + 42.4725210 97.4337500 + 42.4683130 97.4337500 + 42.4662500 97.4358130 + 42.4641880 97.4379170 + 42.4558130 97.4379170 + 42.4495830 97.4316460 + 42.4495830 97.4295830 + 42.4474790 97.4295830 + 42.4454170 97.4275210 + 42.4433540 97.4254170 + 42.4349790 97.4254170 + 42.4329170 97.4274790 + 42.4308540 97.4295830 + 42.4287500 97.4275210 + 42.4266880 97.4254170 + 42.4245830 97.4233540 + 42.4225210 97.4212500 + 42.4099790 97.4212500 + 42.4079170 97.4191880 + 42.4058540 97.4170830 + 42.4037500 97.4150210 + 42.4016880 97.4129170 + 42.3995830 97.4149790 + 42.3975210 97.4170830 + 42.3954170 97.4191460 + 42.3933540 97.4212500 + 42.3808130 97.4212500 + 42.3724790 97.4170830 + 42.3704170 97.4150210 + 42.3683540 97.4129170 + 42.3662500 97.4108540 + 42.3641880 97.4087500 + 42.3620830 97.4066880 + 42.3620830 97.4024790 + 42.3600210 97.4004170 + 42.3579170 97.3983540 + 42.3558540 97.3962500 + 42.3537500 97.3941880 + 42.3516880 97.3920830 + 42.3474790 97.3920830 + 42.3454170 97.3900210 + 42.3433540 97.3879170 + 42.3391460 97.3879170 + 42.3370830 97.3858540 + 42.3370830 97.3774790 + 42.3287500 97.3649790 + 42.3266880 97.3629170 + 42.3245830 97.3608540 + 42.3245830 97.3524790 + 42.3225210 97.3504170 + 42.3204170 97.3483540 + 42.3183540 97.3462500 + 42.3058130 97.3462500 + 42.2975210 97.3379170 + 42.2766460 97.3379170 + 42.2745830 97.3358540 + 42.2725210 97.3337500 + 42.2516460 97.3337500 + 42.2454170 97.3191460 + 42.2433540 97.3170830 + 42.2391460 97.3170830 + 42.2370830 97.3191460 + 42.2350210 97.3212500 + 42.2266460 97.3212500 + 42.2224790 97.3170830 + 42.2204170 97.3170830 + 42.2141880 97.3254170 + 42.2058130 97.3254170 + 42.2037500 97.3275210 + 42.2016460 97.3295830 + 42.1995830 97.3316460 + 42.1995830 97.3358540 + 42.1974790 97.3379170 + 42.1954170 97.3399790 + 42.1954170 97.3441880 + 42.1933130 97.3462500 + 42.1912500 97.3483130 + 42.1912500 97.3608540 + 42.1891880 97.3629170 + 42.1849790 97.3629170 + 42.1829170 97.3650210 + 42.1808130 97.3670830 + 42.1787500 97.3691460 + 42.1787500 97.3816880 + 42.1808540 97.3837500 + 42.1829170 97.3858540 + 42.1850210 97.3879170 + 42.1870830 97.3900210 + 42.1891880 97.3920830 + 42.1912500 97.3941460 + 42.1912500 97.3983540 + 42.1891460 97.4004170 + 42.1870830 97.4024790 + 42.1870830 97.4108540 + 42.1891880 97.4129170 + 42.1912500 97.4149790 + 42.1912500 97.4400210 + 42.1891460 97.4420830 + 42.1870830 97.4441880 + 42.1891880 97.4462500 + 42.1912500 97.4483130 + 42.1912500 97.4525210 + 42.1933540 97.4545830 + 42.1954170 97.4608540 + 42.1933130 97.4629170 + 42.1912500 97.4650210 + 42.1891460 97.4670830 + 42.1870830 97.4691460 + 42.1870830 97.4775210 + 42.1849790 97.4795830 + 42.1829170 97.4816880 + 42.1808130 97.4837500 + 42.1787500 97.4879170 +706 706 -1 38 41.92570 97.39318 + 42.1447400 97.1305100 + 42.0760800 97.1026100 + 42.0665800 97.0622800 + 42.0371700 97.0484400 + 41.9487200 97.0337400 + 41.8990900 97.0864600 + 41.8795300 97.0727900 + 41.8494400 97.1390900 + 41.8001400 97.1516300 + 41.7997700 97.1916500 + 41.8193200 97.2053300 + 41.7896900 97.2181600 + 41.7695000 97.2711600 + 41.6809800 97.2695500 + 41.6793000 97.4293600 + 41.6395100 97.4684800 + 41.6293700 97.4949000 + 41.6672600 97.6155600 + 41.7649300 97.6711600 + 41.7837200 97.7383100 + 41.8228800 97.7526200 + 41.8644700 97.5800500 + 41.8843100 97.5671400 + 41.9231600 97.6081100 + 41.9247600 97.4744700 + 41.8952500 97.4738500 + 41.8860100 97.4202200 + 42.0140500 97.4094400 + 42.0726500 97.4508100 + 42.0714000 97.5579400 + 42.1004300 97.5987900 + 42.1302800 97.5726600 + 42.1409100 97.5058600 + 42.1702800 97.5199100 + 42.1821900 97.3323400 + 42.2221000 97.2794100 + 42.1436300 97.2511600 + 42.1447400 97.1305100 +707 707 -1 20 41.99950 96.90828 + 42.0783400 96.7945600 + 42.0292200 96.7806100 + 42.0195400 96.7537300 + 41.9606600 96.7263600 + 41.9412000 96.6860500 + 41.8328300 96.7116800 + 41.8424400 96.7518300 + 41.9013100 96.7791800 + 41.8701200 97.0192300 + 41.8503400 97.0323000 + 41.8696900 97.0726400 + 41.8795300 97.0727900 + 41.8990900 97.0864600 + 41.9487200 97.0337400 + 42.0371700 97.0484400 + 42.0665800 97.0622800 + 42.0760800 97.1026100 + 42.1447400 97.1305100 + 42.1661100 96.9162600 + 42.0783400 96.7945600 +708 708 -1 20 41.79820 96.75809 + 41.8503400 97.0323000 + 41.8701200 97.0192300 + 41.9013100 96.7791800 + 41.8424400 96.7518300 + 41.8328300 96.7116800 + 41.9412000 96.6860500 + 41.9606600 96.7263600 + 42.0195400 96.7537300 + 42.0198400 96.7002000 + 41.8826900 96.5786100 + 41.7941500 96.5778800 + 41.7841300 96.6178200 + 41.7448400 96.6041400 + 41.7060000 96.4838900 + 41.6174200 96.4965900 + 41.5977000 96.5097500 + 41.5968300 96.6959900 + 41.5766200 96.7888800 + 41.6151700 96.9090700 + 41.8503400 97.0323000 +PEDN1HW LOGAN CR. AT PENDER NE -1 506 42.31833 97.04833 + 42.1079170 96.7024790 + 42.1183130 96.7212500 + 42.1225210 96.7212500 + 42.1245830 96.7233130 + 42.1329170 96.7358130 + 42.1329170 96.7441880 + 42.1350210 96.7462500 + 42.1370830 96.7483130 + 42.1370830 96.7566880 + 42.1349790 96.7587500 + 42.1329170 96.7608540 + 42.1266880 96.7670830 + 42.1224790 96.7670830 + 42.1204170 96.7691880 + 42.1183540 96.7712500 + 42.1141460 96.7712500 + 42.1120830 96.7733130 + 42.1100210 96.7795830 + 42.1058130 96.7795830 + 42.1037500 96.7816880 + 42.0995830 96.7858130 + 42.0995830 96.7941880 + 42.0974790 96.7962500 + 42.0954170 96.7983540 + 42.0933540 96.8004170 + 42.0891460 96.8004170 + 42.0870830 96.8025210 + 42.0849790 96.8045830 + 42.0829170 96.8045830 + 42.0870830 96.8108130 + 42.0870830 96.8150210 + 42.0891880 96.8170830 + 42.0912500 96.8191880 + 42.0995830 96.8275210 + 42.0974790 96.8295830 + 42.0954170 96.8316460 + 42.0954170 96.8358540 + 42.0975210 96.8379170 + 42.0995830 96.8400210 + 42.1016880 96.8420830 + 42.1037500 96.8441460 + 42.1037500 96.8483540 + 42.1058540 96.8504170 + 42.1079170 96.8524790 + 42.1079170 96.8608540 + 42.1099790 96.8629170 + 42.1141880 96.8629170 + 42.1162500 96.8649790 + 42.1162500 96.8691880 + 42.1183540 96.8712500 + 42.1204170 96.8733540 + 42.1370830 96.8899790 + 42.1370830 96.8983540 + 42.1391880 96.9004170 + 42.1412500 96.9025210 + 42.1433540 96.9045830 + 42.1454170 96.9066880 + 42.1475210 96.9087500 + 42.1495830 96.9108540 + 42.1516460 96.9129170 + 42.1558540 96.9129170 + 42.1579170 96.9150210 + 42.1600210 96.9170830 + 42.1620830 96.9191460 + 42.1620830 96.9275210 + 42.1599790 96.9295830 + 42.1579170 96.9316460 + 42.1579170 96.9400210 + 42.1600210 96.9420830 + 42.1620830 96.9441880 + 42.1641880 96.9462500 + 42.1662500 96.9483540 + 42.1683540 96.9504170 + 42.1704170 96.9524790 + 42.1704170 96.9566880 + 42.1683130 96.9587500 + 42.1662500 96.9608130 + 42.1662500 96.9858540 + 42.1683540 96.9879170 + 42.1704170 96.9899790 + 42.1704170 97.0066880 + 42.1683130 97.0087500 + 42.1662500 97.0108130 + 42.1662500 97.0316880 + 42.1641460 97.0337500 + 42.1620830 97.0358130 + 42.1620830 97.0525210 + 42.1599790 97.0545830 + 42.1579170 97.0566880 + 42.1558130 97.0587500 + 42.1537500 97.0608130 + 42.1537500 97.0691880 + 42.1558540 97.0712500 + 42.1579170 97.0941880 + 42.1558130 97.0962500 + 42.1537500 97.0983130 + 42.1537500 97.1025210 + 42.1516460 97.1045830 + 42.1495830 97.1066880 + 42.1474790 97.1087500 + 42.1454170 97.1108540 + 42.1433130 97.1129170 + 42.1412500 97.1150210 + 42.1433540 97.1170830 + 42.1454170 97.1191880 + 42.1475210 97.1212500 + 42.1495830 97.1233540 + 42.1516880 97.1254170 + 42.1537500 97.1274790 + 42.1537500 97.1358540 + 42.1516460 97.1379170 + 42.1495830 97.1399790 + 42.1495830 97.1525210 + 42.1474790 97.1545830 + 42.1454170 97.1545830 + 42.1495830 97.2025210 + 42.1474790 97.2045830 + 42.1454170 97.2066880 + 42.1475210 97.2087500 + 42.1495830 97.2275210 + 42.1474790 97.2295830 + 42.1454170 97.2316460 + 42.1454170 97.2358540 + 42.1433130 97.2379170 + 42.1412500 97.2399790 + 42.1412500 97.2608540 + 42.1433540 97.2629170 + 42.1454170 97.2650210 + 42.1475210 97.2670830 + 42.1495830 97.2691880 + 42.1516880 97.2712500 + 42.1537500 97.2733540 + 42.1558540 97.2754170 + 42.1579170 97.2775210 + 42.1599790 97.2795830 + 42.1683540 97.2795830 + 42.1704170 97.2816880 + 42.1724790 97.2837500 + 42.1766880 97.2837500 + 42.1787500 97.2858130 + 42.1808130 97.3004170 + 42.1891880 97.3004170 + 42.1912500 97.2983130 + 42.1933130 97.2962500 + 42.2016880 97.2962500 + 42.2037500 97.2983540 + 42.2058130 97.3004170 + 42.2100210 97.3004170 + 42.2120830 97.3025210 + 42.2141880 97.3045830 + 42.2162500 97.3066460 + 42.2162500 97.3150210 + 42.2183130 97.3170830 + 42.2225210 97.3170830 + 42.2245830 97.3191880 + 42.2266460 97.3212500 + 42.2350210 97.3212500 + 42.2370830 97.3191460 + 42.2391460 97.3170830 + 42.2433540 97.3170830 + 42.2454170 97.3191460 + 42.2454170 97.3275210 + 42.2475210 97.3295830 + 42.2495830 97.3316880 + 42.2516460 97.3337500 + 42.2725210 97.3337500 + 42.2745830 97.3358540 + 42.2766460 97.3379170 + 42.2975210 97.3379170 + 42.2995830 97.3400210 + 42.3016880 97.3420830 + 42.3037500 97.3441880 + 42.3058130 97.3462500 + 42.3183540 97.3462500 + 42.3204170 97.3483540 + 42.3225210 97.3504170 + 42.3245830 97.3524790 + 42.3245830 97.3608540 + 42.3266880 97.3629170 + 42.3287500 97.3649790 + 42.3287500 97.3691880 + 42.3308540 97.3712500 + 42.3370830 97.3774790 + 42.3370830 97.3858540 + 42.3391460 97.3879170 + 42.3454170 97.3900210 + 42.3474790 97.3920830 + 42.3516880 97.3920830 + 42.3537500 97.3941880 + 42.3558540 97.3962500 + 42.3579170 97.3983540 + 42.3600210 97.4004170 + 42.3620830 97.4024790 + 42.3620830 97.4066880 + 42.3724790 97.4170830 + 42.3808130 97.4212500 + 42.3933540 97.4212500 + 42.3954170 97.4191460 + 42.3975210 97.4170830 + 42.3995830 97.4149790 + 42.4016880 97.4129170 + 42.4037500 97.4150210 + 42.4058540 97.4170830 + 42.4079170 97.4191880 + 42.4099790 97.4212500 + 42.4225210 97.4212500 + 42.4245830 97.4233540 + 42.4266880 97.4254170 + 42.4287500 97.4275210 + 42.4308540 97.4295830 + 42.4329170 97.4274790 + 42.4349790 97.4254170 + 42.4433540 97.4254170 + 42.4454170 97.4275210 + 42.4475210 97.4295830 + 42.4495830 97.4295830 + 42.4495830 97.4108130 + 42.4516460 97.4087500 + 42.4537500 97.4066880 + 42.4537500 97.3983130 + 42.4558130 97.3962500 + 42.4579170 97.3941880 + 42.4579170 97.3899790 + 42.4620830 97.3858540 + 42.4620830 97.3816460 + 42.4641460 97.3795830 + 42.4662500 97.3775210 + 42.4662500 97.3566460 + 42.4641880 97.3545830 + 42.4620830 97.3525210 + 42.4620830 97.3233130 + 42.4641460 97.3212500 + 42.4662500 97.3191880 + 42.4662500 97.3149790 + 42.4683130 97.3129170 + 42.4704170 97.3108540 + 42.4724790 97.3087500 + 42.4745830 97.3066880 + 42.4745830 97.3024790 + 42.4766460 97.3004170 + 42.4850210 97.3004170 + 42.4870830 97.2983540 + 42.4891460 97.2962500 + 42.4912500 97.2941880 + 42.4912500 97.2774790 + 42.4891880 97.2754170 + 42.4870830 97.2733540 + 42.4870830 97.2691460 + 42.4891460 97.2670830 + 42.4912500 97.2650210 + 42.4912500 97.2566460 + 42.4891880 97.2545830 + 42.4849790 97.2545830 + 42.4829170 97.2525210 + 42.4829170 97.2483130 + 42.4808540 97.2462500 + 42.4787500 97.2441880 + 42.4787500 97.2358130 + 42.4766880 97.2337500 + 42.4724790 97.2337500 + 42.4704170 97.2316880 + 42.4724790 97.2254170 + 42.4766880 97.2254170 + 42.4787500 97.2233540 + 42.4787500 97.2108130 + 42.4808130 97.2087500 + 42.4891880 97.2087500 + 42.4912500 97.2108130 + 42.4933130 97.2129170 + 42.5058540 97.2129170 + 42.5079170 97.2108540 + 42.5099790 97.2087500 + 42.5120830 97.2066880 + 42.5141460 97.2045830 + 42.5162500 97.2025210 + 42.5183130 97.2004170 + 42.5204170 97.1983540 + 42.5224790 97.1962500 + 42.5266880 97.1962500 + 42.5287500 97.1941880 + 42.5308130 97.1920830 + 42.5350210 97.1920830 + 42.5370830 97.1941460 + 42.5391460 97.1962500 + 42.5412500 97.1983130 + 42.5433130 97.2004170 + 42.5454170 97.2024790 + 42.5474790 97.2045830 + 42.5516880 97.2045830 + 42.5537500 97.2025210 + 42.5558130 97.2004170 + 42.5579170 97.1983540 + 42.5579170 97.1774790 + 42.5558540 97.1754170 + 42.5537500 97.1733540 + 42.5537500 97.1441460 + 42.5516880 97.1420830 + 42.5495830 97.1400210 + 42.5495830 97.1358130 + 42.5475210 97.1337500 + 42.5454170 97.1316880 + 42.5454170 97.1274790 + 42.5474790 97.1254170 + 42.5495830 97.1233540 + 42.5495830 97.1108130 + 42.5475210 97.1087500 + 42.5454170 97.1066880 + 42.5454170 97.0983130 + 42.5433540 97.0962500 + 42.5412500 97.0941880 + 42.5412500 97.0858130 + 42.5391880 97.0837500 + 42.5370830 97.0816880 + 42.5350210 97.0795830 + 42.5329170 97.0775210 + 42.5308540 97.0754170 + 42.5287500 97.0733540 + 42.5266880 97.0712500 + 42.5245830 97.0691880 + 42.5245830 97.0608130 + 42.5225210 97.0587500 + 42.5204170 97.0566880 + 42.5204170 97.0524790 + 42.5183540 97.0504170 + 42.5162500 97.0483540 + 42.5162500 97.0441460 + 42.5141880 97.0420830 + 42.5120830 97.0400210 + 42.5120830 97.0358130 + 42.5100210 97.0337500 + 42.5058130 97.0337500 + 42.5037500 97.0316880 + 42.5037500 97.0274790 + 42.5016880 97.0254170 + 42.4995830 97.0233540 + 42.4995830 97.0191460 + 42.4975210 97.0170830 + 42.4954170 97.0150210 + 42.4933540 97.0129170 + 42.4912500 97.0108540 + 42.4912500 97.0024790 + 42.4891880 97.0004170 + 42.4870830 96.9983540 + 42.4891460 96.9962500 + 42.4933540 96.9962500 + 42.4954170 96.9941880 + 42.4974790 96.9920830 + 42.5016880 96.9920830 + 42.5037500 96.9900210 + 42.5037500 96.9858130 + 42.4995830 96.9774790 + 42.4891460 96.9754170 + 42.4850210 96.9712500 + 42.4724790 96.9712500 + 42.4704170 96.9733130 + 42.4683540 96.9754170 + 42.4662500 96.9733540 + 42.4641880 96.9712500 + 42.4620830 96.9691880 + 42.4600210 96.9670830 + 42.4516460 96.9670830 + 42.4495830 96.9650210 + 42.4475210 96.9629170 + 42.4454170 96.9608540 + 42.4433540 96.9587500 + 42.4412500 96.9566880 + 42.4391880 96.9545830 + 42.4370830 96.9525210 + 42.4370830 96.9483130 + 42.4350210 96.9462500 + 42.4308130 96.9462500 + 42.4287500 96.9441880 + 42.4266880 96.9420830 + 42.4245830 96.9400210 + 42.4225210 96.9379170 + 42.4204170 96.9358540 + 42.4183540 96.9337500 + 42.4162500 96.9316880 + 42.4162500 96.9191460 + 42.4141880 96.9170830 + 42.4099790 96.9170830 + 42.4079170 96.9150210 + 42.4058540 96.9129170 + 42.4016460 96.9129170 + 42.3975210 96.9087500 + 42.3933540 96.9045830 + 42.3912500 96.9025210 + 42.3933130 96.9004170 + 42.3954170 96.8983540 + 42.3954170 96.8941460 + 42.3933540 96.8920830 + 42.3891460 96.8920830 + 42.3870830 96.8900210 + 42.3850210 96.8879170 + 42.3829170 96.8858540 + 42.3808540 96.8837500 + 42.3745830 96.8775210 + 42.3745830 96.8649790 + 42.3725210 96.8629170 + 42.3704170 96.8608540 + 42.3704170 96.8566460 + 42.3683540 96.8545830 + 42.3662500 96.8525210 + 42.3641880 96.8504170 + 42.3620830 96.8483540 + 42.3620830 96.8441460 + 42.3641460 96.8420830 + 42.3662500 96.8400210 + 42.3683130 96.8379170 + 42.3704170 96.8358540 + 42.3724790 96.8337500 + 42.3745830 96.8316880 + 42.3745830 96.8233130 + 42.3725210 96.8212500 + 42.3704170 96.8191880 + 42.3683540 96.8170830 + 42.3662500 96.8150210 + 42.3641880 96.8129170 + 42.3620830 96.8108540 + 42.3600210 96.8087500 + 42.3516460 96.8087500 + 42.3495830 96.8066880 + 42.3495830 96.7983130 + 42.3475210 96.7962500 + 42.3454170 96.7941880 + 42.3433540 96.7920830 + 42.3412500 96.7900210 + 42.3370830 96.7691460 + 42.3350210 96.7670830 + 42.3329170 96.7650210 + 42.3308540 96.7629170 + 42.3287500 96.7608540 + 42.3266880 96.7587500 + 42.3245830 96.7566880 + 42.3245830 96.7524790 + 42.3225210 96.7504170 + 42.3204170 96.7483540 + 42.3183540 96.7462500 + 42.3162500 96.7441880 + 42.3141880 96.7420830 + 42.3120830 96.7400210 + 42.3120830 96.7316460 + 42.3100210 96.7295830 + 42.3058130 96.7295830 + 42.3037500 96.7275210 + 42.3016880 96.7254170 + 42.2974790 96.7254170 + 42.2954170 96.7233540 + 42.2933540 96.7212500 + 42.2912500 96.7191880 + 42.2912500 96.7149790 + 42.2891880 96.7129170 + 42.2808540 96.7087500 + 42.2683130 96.7087500 + 42.2662500 96.7066880 + 42.2641880 96.7045830 + 42.2620830 96.7025210 + 42.2600210 96.7004170 + 42.2579170 96.6983540 + 42.2558540 96.6962500 + 42.2537500 96.6941880 + 42.2537500 96.6899790 + 42.2516880 96.6879170 + 42.2495830 96.6858540 + 42.2495830 96.6816460 + 42.2475210 96.6795830 + 42.2349790 96.6795830 + 42.2329170 96.6775210 + 42.2308540 96.6754170 + 42.2183130 96.6754170 + 42.2162500 96.6733540 + 42.2162500 96.6649790 + 42.2141880 96.6629170 + 42.2016460 96.6629170 + 42.1995830 96.6649790 + 42.1975210 96.6670830 + 42.1954170 96.6691460 + 42.1933540 96.6712500 + 42.1808130 96.6712500 + 42.1787500 96.6691880 + 42.1766880 96.6670830 + 42.1745830 96.6650210 + 42.1745830 96.6566460 + 42.1725210 96.6545830 + 42.1704170 96.6525210 + 42.1683540 96.6504170 + 42.1599790 96.6504170 + 42.1579170 96.6524790 + 42.1579170 96.6566880 + 42.1558540 96.6587500 + 42.1516460 96.6587500 + 42.1495830 96.6608130 + 42.1475210 96.6629170 + 42.1433130 96.6629170 + 42.1349790 96.6670830 + 42.1329170 96.6691460 + 42.1308540 96.6712500 + 42.1287500 96.6733130 + 42.1287500 96.6775210 + 42.1266880 96.6795830 + 42.1245830 96.6816460 + 42.1225210 96.6837500 + 42.1204170 96.6858130 + 42.1204170 96.6941880 + 42.1141880 96.7004170 + 42.1079170 96.7024790 +710 710 -1 24 41.93700 96.61285 + 42.1677300 96.6480400 + 42.1679300 96.6078000 + 42.1091800 96.5402900 + 42.0698200 96.5399900 + 42.0504000 96.4728900 + 41.9618400 96.4722900 + 41.9423000 96.4320500 + 41.8831700 96.4584000 + 41.8734300 96.4316300 + 41.8536600 96.4582100 + 41.7947200 96.4311400 + 41.7847400 96.4711000 + 41.7356100 96.4574400 + 41.7060000 96.4838900 + 41.7448400 96.6041400 + 41.7841300 96.6178200 + 41.7941500 96.5778800 + 41.8826900 96.5786100 + 42.0198400 96.7002000 + 42.0195400 96.7537300 + 42.0292200 96.7806100 + 42.0783400 96.7945600 + 42.1183200 96.6877900 + 42.1677300 96.6480400 +711 MAPLE CR. NR NICKERSON NE -1 408 41.69333 97.10667 + 41.5579170 96.5399790 + 41.5495830 96.5525210 + 41.5454170 96.5566460 + 41.5454170 96.5650210 + 41.5433130 96.5670830 + 41.5412500 96.5691460 + 41.5412500 96.5775210 + 41.5433540 96.5795830 + 41.5454170 96.5816460 + 41.5454170 96.5941880 + 41.5433130 96.5962500 + 41.5370830 96.6024790 + 41.5370830 96.6150210 + 41.5349790 96.6170830 + 41.5329170 96.6191460 + 41.5329170 96.6275210 + 41.5350210 96.6295830 + 41.5370830 96.6316460 + 41.5370830 96.6358540 + 41.5349790 96.6379170 + 41.5329170 96.6399790 + 41.5329170 96.6441880 + 41.5349790 96.6462500 + 41.5391880 96.6462500 + 41.5454170 96.6524790 + 41.5454170 96.6858540 + 41.5433130 96.6879170 + 41.5412500 96.6899790 + 41.5412500 96.7025210 + 41.5433540 96.7045830 + 41.5454170 96.7108540 + 41.5433130 96.7129170 + 41.5412500 96.7150210 + 41.5433540 96.7170830 + 41.5454170 96.7191460 + 41.5454170 96.7358540 + 41.5475210 96.7379170 + 41.5495830 96.7399790 + 41.5495830 96.7775210 + 41.5516880 96.7795830 + 41.5537500 96.7816460 + 41.5537500 96.7941880 + 41.5516460 96.7962500 + 41.5495830 96.7983130 + 41.5495830 96.8025210 + 41.5474790 96.8045830 + 41.5454170 96.8066880 + 41.5433130 96.8087500 + 41.5412500 96.8108130 + 41.5412500 96.8358540 + 41.5391460 96.8379170 + 41.5370830 96.8399790 + 41.5370830 96.8650210 + 41.5349790 96.8670830 + 41.5329170 96.8691460 + 41.5329170 96.8733540 + 41.5308130 96.8754170 + 41.5287500 96.8775210 + 41.5266460 96.8795830 + 41.5245830 96.8816460 + 41.5245830 96.8983540 + 41.5266880 96.9004170 + 41.5287500 96.9025210 + 41.5266460 96.9045830 + 41.5245830 96.9066460 + 41.5245830 96.9150210 + 41.5224790 96.9170830 + 41.5204170 96.9191460 + 41.5204170 96.9233540 + 41.5183130 96.9254170 + 41.5162500 96.9274790 + 41.5162500 96.9316880 + 41.5141460 96.9337500 + 41.5120830 96.9358130 + 41.5120830 96.9483540 + 41.5141880 96.9504170 + 41.5162500 96.9524790 + 41.5162500 96.9608540 + 41.5141460 96.9629170 + 41.5120830 96.9650210 + 41.5141880 96.9670830 + 41.5162500 96.9691460 + 41.5162500 97.0025210 + 41.5183540 97.0045830 + 41.5204170 97.0066460 + 41.5204170 97.0108540 + 41.5183130 97.0129170 + 41.5162500 97.0149790 + 41.5162500 97.0191880 + 41.5141460 97.0212500 + 41.5120830 97.0233130 + 41.5120830 97.0608540 + 41.5141880 97.0629170 + 41.5162500 97.0650210 + 41.5183540 97.0670830 + 41.5204170 97.0691460 + 41.5204170 97.0733540 + 41.5183130 97.0754170 + 41.5162500 97.0774790 + 41.5162500 97.1066880 + 41.5183540 97.1087500 + 41.5204170 97.1108130 + 41.5204170 97.1233540 + 41.5225210 97.1254170 + 41.5245830 97.1316880 + 41.5266880 97.1337500 + 41.5287500 97.1358130 + 41.5287500 97.1441880 + 41.5266460 97.1462500 + 41.5245830 97.1483130 + 41.5245830 97.1566880 + 41.5266880 97.1587500 + 41.5287500 97.1608130 + 41.5287500 97.1733540 + 41.5308540 97.1754170 + 41.5329170 97.1775210 + 41.5349790 97.1795830 + 41.5516880 97.1837500 + 41.5537500 97.1816880 + 41.5537500 97.1774790 + 41.5558540 97.1754170 + 41.5579170 97.1733130 + 41.5599790 97.1712500 + 41.5891880 97.1712500 + 41.5912500 97.1691460 + 41.5933130 97.1670830 + 41.5975210 97.1670830 + 41.5995830 97.1650210 + 41.5995830 97.1608130 + 41.6016460 97.1587500 + 41.6100210 97.1587500 + 41.6120830 97.1608130 + 41.6120830 97.1650210 + 41.6141460 97.1670830 + 41.6308540 97.1670830 + 41.6329170 97.1691880 + 41.6350210 97.1712500 + 41.6370830 97.1733540 + 41.6391460 97.1754170 + 41.6433540 97.1754170 + 41.6454170 97.1775210 + 41.6474790 97.1795830 + 41.6516880 97.1795830 + 41.6537500 97.1816880 + 41.6558130 97.1837500 + 41.6600210 97.1837500 + 41.6620830 97.1858130 + 41.6620830 97.1941880 + 41.6704170 97.2024790 + 41.6704170 97.2275210 + 41.6725210 97.2295830 + 41.6745830 97.2316880 + 41.6766880 97.2337500 + 41.6787500 97.2358130 + 41.6787500 97.2400210 + 41.6808540 97.2420830 + 41.6829170 97.2441880 + 41.6850210 97.2462500 + 41.6870830 97.2483130 + 41.6870830 97.2566880 + 41.6891880 97.2587500 + 41.6912500 97.2608130 + 41.6912500 97.2691880 + 41.6933130 97.2712500 + 41.6975210 97.2712500 + 41.6995830 97.2733130 + 41.6995830 97.2775210 + 41.6995830 97.2795830 + 41.7016880 97.2795830 + 41.7037500 97.2816460 + 41.7058130 97.2837500 + 41.7183540 97.2837500 + 41.7308540 97.2795830 + 41.7349790 97.2754170 + 41.7433540 97.2754170 + 41.7454170 97.2733540 + 41.7725210 97.2712500 + 41.7745830 97.2691880 + 41.7745830 97.2649790 + 41.7766460 97.2629170 + 41.7787500 97.2608540 + 41.7808130 97.2587500 + 41.7829170 97.2566880 + 41.7829170 97.2483130 + 41.7849790 97.2462500 + 41.7870830 97.2441880 + 41.7870830 97.2399790 + 41.7891460 97.2379170 + 41.7912500 97.2358540 + 41.7933130 97.2337500 + 41.7954170 97.2316880 + 41.7974790 97.2295830 + 41.7995830 97.2275210 + 41.8016460 97.2254170 + 41.8058540 97.2254170 + 41.8079170 97.2233540 + 41.8099790 97.2212500 + 41.8225210 97.2212500 + 41.8245830 97.2191880 + 41.8245830 97.2108130 + 41.8225210 97.2087500 + 41.8204170 97.2066880 + 41.8204170 97.1983130 + 41.8183540 97.1962500 + 41.8162500 97.1941880 + 41.8141880 97.1920830 + 41.8120830 97.1900210 + 41.8100210 97.1879170 + 41.8079170 97.1858540 + 41.8058540 97.1837500 + 41.8037500 97.1816880 + 41.8037500 97.1649790 + 41.8058130 97.1629170 + 41.8079170 97.1608540 + 41.8099790 97.1587500 + 41.8225210 97.1587500 + 41.8245830 97.1566880 + 41.8245830 97.1524790 + 41.8266460 97.1504170 + 41.8287500 97.1483540 + 41.8308130 97.1462500 + 41.8329170 97.1441880 + 41.8329170 97.1399790 + 41.8349790 97.1379170 + 41.8391880 97.1379170 + 41.8412500 97.1399790 + 41.8433130 97.1420830 + 41.8454170 97.1441460 + 41.8474790 97.1462500 + 41.8600210 97.1462500 + 41.8620830 97.1441880 + 41.8620830 97.1399790 + 41.8641460 97.1379170 + 41.8662500 97.1358540 + 41.8662500 97.1274790 + 41.8641880 97.1254170 + 41.8620830 97.1233540 + 41.8620830 97.1191460 + 41.8704170 97.1108540 + 41.8704170 97.1066460 + 41.8724790 97.1045830 + 41.8745830 97.1025210 + 41.8745830 97.0899790 + 41.8766460 97.0879170 + 41.8787500 97.0858540 + 41.8787500 97.0733130 + 41.8766880 97.0712500 + 41.8745830 97.0691880 + 41.8745830 97.0608130 + 41.8766460 97.0587500 + 41.8787500 97.0566880 + 41.8787500 97.0524790 + 41.8766880 97.0504170 + 41.8683130 97.0504170 + 41.8537500 97.0358130 + 41.8537500 97.0337500 + 41.8433130 97.0337500 + 41.8412500 97.0316880 + 41.8391880 97.0295830 + 41.8349790 97.0295830 + 41.8329170 97.0275210 + 41.8287500 97.0233540 + 41.8266880 97.0170830 + 41.8225210 97.0129170 + 41.8204170 97.0108540 + 41.8183540 97.0045830 + 41.8099790 97.0045830 + 41.8079170 97.0025210 + 41.8058540 97.0004170 + 41.8016460 97.0004170 + 41.7995830 96.9983540 + 41.7975210 96.9962500 + 41.7954170 96.9941880 + 41.7933540 96.9920830 + 41.7808130 96.9920830 + 41.7787500 96.9900210 + 41.7766880 96.9879170 + 41.7724790 96.9879170 + 41.7704170 96.9858540 + 41.7704170 96.9816460 + 41.7683540 96.9795830 + 41.7558130 96.9795830 + 41.7537500 96.9775210 + 41.7537500 96.9733130 + 41.7516880 96.9712500 + 41.7433130 96.9712500 + 41.7412500 96.9691880 + 41.7391880 96.9670830 + 41.7308130 96.9670830 + 41.7287500 96.9650210 + 41.7266880 96.9629170 + 41.7245830 96.9608540 + 41.7225210 96.9587500 + 41.7204170 96.9566880 + 41.7204170 96.9524790 + 41.7183540 96.9504170 + 41.7099790 96.9504170 + 41.7079170 96.9483540 + 41.7058540 96.9462500 + 41.6974790 96.9462500 + 41.6912500 96.9400210 + 41.6912500 96.9358130 + 41.6891880 96.9337500 + 41.6766460 96.9337500 + 41.6745830 96.9316880 + 41.6725210 96.9295830 + 41.6558130 96.9295830 + 41.6537500 96.9275210 + 41.6537500 96.9191460 + 41.6516880 96.9170830 + 41.6474790 96.9170830 + 41.6454170 96.9191460 + 41.6433540 96.9212500 + 41.6349790 96.9212500 + 41.6329170 96.9191880 + 41.6308540 96.9170830 + 41.6287500 96.9150210 + 41.6287500 96.9108130 + 41.6266880 96.9087500 + 41.6245830 96.9066880 + 41.6225210 96.9045830 + 41.6204170 96.9025210 + 41.6204170 96.8899790 + 41.6183540 96.8879170 + 41.6162500 96.8858540 + 41.6162500 96.8816460 + 41.6141880 96.8795830 + 41.6120830 96.8775210 + 41.6120830 96.8649790 + 41.6100210 96.8629170 + 41.6079170 96.8608540 + 41.6079170 96.8566460 + 41.6058540 96.8545830 + 41.6037500 96.8525210 + 41.6037500 96.8399790 + 41.6016880 96.8379170 + 41.5995830 96.8358540 + 41.5975210 96.8337500 + 41.5954170 96.8316880 + 41.5954170 96.8191460 + 41.5933540 96.8170830 + 41.5912500 96.8150210 + 41.5912500 96.8066460 + 41.5891880 96.8045830 + 41.5870830 96.8025210 + 41.5870830 96.7399790 + 41.5891460 96.7379170 + 41.5912500 96.7358540 + 41.5912500 96.7233130 + 41.5891880 96.7212500 + 41.5870830 96.7191880 + 41.5870830 96.7024790 + 41.5933130 96.6962500 + 41.5954170 96.6941880 + 41.5974790 96.6920830 + 41.5995830 96.6900210 + 41.6016460 96.6879170 + 41.6037500 96.6858540 + 41.6037500 96.6816460 + 41.6058130 96.6795830 + 41.6079170 96.6775210 + 41.6099790 96.6754170 + 41.6141880 96.6754170 + 41.6162500 96.6733540 + 41.6183130 96.6712500 + 41.6204170 96.6691880 + 41.6204170 96.6608130 + 41.6183540 96.6587500 + 41.6162500 96.6566880 + 41.6162500 96.6483130 + 41.6141880 96.6462500 + 41.6120830 96.6441880 + 41.6100210 96.6420830 + 41.6079170 96.6400210 + 41.6079170 96.6358130 + 41.6058540 96.6337500 + 41.6016460 96.6337500 + 41.5995830 96.6316880 + 41.5995830 96.6274790 + 41.5975210 96.6254170 + 41.5954170 96.6233540 + 41.5954170 96.6149790 + 41.5974790 96.6129170 + 41.5995830 96.6108540 + 41.5975210 96.5962500 + 41.5954170 96.5941880 + 41.5954170 96.5899790 + 41.5974790 96.5879170 + 41.5995830 96.5858540 + 41.5995830 96.5733130 + 41.5975210 96.5712500 + 41.5954170 96.5691880 + 41.5995830 96.5608130 + 41.5995830 96.5587500 + 41.5974790 96.5587500 + 41.5954170 96.5566880 + 41.5954170 96.5441460 + 41.5933540 96.5420830 + 41.5912500 96.5400210 + 41.5912500 96.5358130 + 41.5891880 96.5337500 + 41.5870830 96.5358130 + 41.5850210 96.5379170 + 41.5724790 96.5379170 + 41.5704170 96.5399790 + 41.5683540 96.5420830 + 41.5641460 96.5420830 + 41.5579170 96.5399790 +712 712 -1 32 41.61300 96.46915 + 41.9228600 96.3517500 + 41.8836400 96.2981200 + 41.8540600 96.3247000 + 41.7261800 96.3241000 + 41.7066000 96.2840400 + 41.6769900 96.3238800 + 41.6179800 96.3236100 + 41.5787600 96.2702300 + 41.5394400 96.2567800 + 41.5196900 96.2965800 + 41.4508500 96.2962900 + 41.3526000 96.2561000 + 41.3034100 96.2691700 + 41.2836800 96.2955900 + 41.4111800 96.4155300 + 41.4501300 96.5219600 + 41.4498400 96.5883300 + 41.5084600 96.6685400 + 41.5477300 96.6822100 + 41.5288000 96.5225400 + 41.5977000 96.5097500 + 41.6174200 96.4965900 + 41.7060000 96.4838900 + 41.7356100 96.4574400 + 41.7847400 96.4711000 + 41.7947200 96.4311400 + 41.8536600 96.4582100 + 41.8734300 96.4316300 + 41.8831700 96.4584000 + 41.9423000 96.4320500 + 41.9227900 96.3784700 + 41.9228600 96.3517500 +713 713 -1 30 40.62750 98.85050 + 40.8290900 98.3861900 + 40.7799700 98.3845400 + 40.7603200 98.3838800 + 40.7504900 98.3835500 + 40.7502400 98.3967000 + 40.7207700 98.3957000 + 40.6799600 98.4731400 + 40.6784000 98.5519000 + 40.6268500 98.6681900 + 40.5957000 98.7457400 + 40.5936800 98.8375200 + 40.5323600 98.9399600 + 40.5200600 99.0443100 + 40.4386100 99.1586800 + 40.4068300 99.2488900 + 40.4457700 99.2637600 + 40.4738700 99.3174500 + 40.5151900 99.2407200 + 40.5168500 99.1752500 + 40.5757800 99.1778900 + 40.5973700 99.1001100 + 40.6563000 99.1026800 + 40.6765800 99.0772900 + 40.7130100 98.7765700 + 40.7517300 98.8043700 + 40.7635500 98.7127800 + 40.8036900 98.6748400 + 40.8273400 98.4782700 + 40.8482500 98.4131700 + 40.8290900 98.3861900 +714 714 -1 29 41.09130 97.99108 + 41.4027300 97.5298800 + 41.3637100 97.5025200 + 41.2527300 97.7252300 + 41.1941000 97.6973400 + 41.1438700 97.7754500 + 41.1230900 97.8542300 + 41.0731600 97.9057500 + 41.0525000 97.9712100 + 41.0228100 97.9835700 + 41.0219800 98.0363500 + 40.9516800 98.1266200 + 40.9210800 98.1916000 + 40.8415500 98.2418000 + 40.8317300 98.2414900 + 40.7799700 98.3845400 + 40.8290900 98.3861900 + 40.8986100 98.3490100 + 40.8784700 98.3746900 + 40.8666400 98.4796400 + 40.9177700 98.3760000 + 40.9772300 98.3516200 + 41.0086100 98.2470900 + 41.2292200 97.9893800 + 41.2803600 97.8583600 + 41.2820400 97.7392000 + 41.3320800 97.6741600 + 41.3812400 97.6753200 + 41.4010700 97.6625300 + 41.4027300 97.5298800 +720 720 -1 26 41.09120 98.25436 + 41.3812400 97.6753200 + 41.3320800 97.6741600 + 41.2820400 97.7392000 + 41.2803600 97.8583600 + 41.2292200 97.9893800 + 41.0086100 98.2470900 + 40.9772300 98.3516200 + 40.9177700 98.3760000 + 40.8666400 98.4796400 + 40.8020000 98.7537200 + 40.8011400 98.7931700 + 40.8493900 98.8345700 + 40.8988100 98.8233700 + 40.9204700 98.7319600 + 40.9990800 98.7350000 + 41.0323800 98.5514600 + 41.0334300 98.4987000 + 41.1135700 98.4222300 + 41.1145700 98.3694000 + 41.2268800 98.1349100 + 41.2793900 97.9245600 + 41.3387700 97.8996700 + 41.3692300 97.8341800 + 41.3707000 97.7281200 + 41.3712300 97.6883500 + 41.3812400 97.6753200 +721 SHELL CR. NR COLUMBUS NE -1 404 41.70583 97.82333 + 41.5245830 97.2795830 + 41.4912500 97.2983540 + 41.4954170 97.3024790 + 41.4954170 97.3108540 + 41.4975210 97.3129170 + 41.5016460 97.3170830 + 41.5058540 97.3170830 + 41.5079170 97.3191460 + 41.5079170 97.3400210 + 41.5058130 97.3420830 + 41.5037500 97.3441460 + 41.5037500 97.3566880 + 41.5016460 97.3587500 + 41.4995830 97.3608130 + 41.4995830 97.3775210 + 41.5016880 97.3795830 + 41.5037500 97.3816460 + 41.5037500 97.3858540 + 41.5016460 97.3879170 + 41.4995830 97.3899790 + 41.4995830 97.3941880 + 41.5016880 97.3962500 + 41.5037500 97.3983130 + 41.5037500 97.4025210 + 41.5016880 97.4045830 + 41.4891460 97.4045830 + 41.4870830 97.4066460 + 41.4870830 97.4483540 + 41.4891460 97.4504170 + 41.4933540 97.4504170 + 41.4954170 97.4524790 + 41.4954170 97.4566880 + 41.4933130 97.4587500 + 41.4912500 97.4608130 + 41.4912500 97.4858540 + 41.4933540 97.4879170 + 41.4954170 97.4900210 + 41.4974790 97.4920830 + 41.5058540 97.4920830 + 41.5079170 97.4941460 + 41.5079170 97.4983540 + 41.5100210 97.5004170 + 41.5120830 97.5024790 + 41.5120830 97.5066880 + 41.5141880 97.5087500 + 41.5162500 97.5108540 + 41.5204170 97.5149790 + 41.5204170 97.5191880 + 41.5225210 97.5212500 + 41.5245830 97.5233130 + 41.5245830 97.5608540 + 41.5266460 97.5629170 + 41.5308540 97.5629170 + 41.5329170 97.5649790 + 41.5329170 97.5775210 + 41.5350210 97.5795830 + 41.5370830 97.5816460 + 41.5370830 97.5900210 + 41.5391880 97.5920830 + 41.5412500 97.5941460 + 41.5412500 97.6025210 + 41.5433540 97.6045830 + 41.5454170 97.6066460 + 41.5454170 97.6108540 + 41.5475210 97.6129170 + 41.5495830 97.6149790 + 41.5495830 97.6233540 + 41.5516880 97.6254170 + 41.5537500 97.6274790 + 41.5537500 97.6483540 + 41.5516460 97.6504170 + 41.5495830 97.6524790 + 41.5495830 97.6566880 + 41.5516880 97.6587500 + 41.5537500 97.6608540 + 41.5558540 97.6629170 + 41.5579170 97.6649790 + 41.5579170 97.6691880 + 41.5599790 97.6712500 + 41.5725210 97.6712500 + 41.5745830 97.6733130 + 41.5745830 97.6816880 + 41.5766880 97.6837500 + 41.5787500 97.6858540 + 41.5808130 97.6879170 + 41.5891880 97.6879170 + 41.5912500 97.6900210 + 41.5933540 97.6920830 + 41.5954170 97.6941880 + 41.6058130 97.7045830 + 41.6183540 97.7045830 + 41.6204170 97.7066880 + 41.6224790 97.7087500 + 41.6266880 97.7087500 + 41.6287500 97.7108130 + 41.6287500 97.7191880 + 41.6308130 97.7212500 + 41.6350210 97.7212500 + 41.6391460 97.7254170 + 41.6475210 97.7254170 + 41.6495830 97.7274790 + 41.6599790 97.7420830 + 41.6641880 97.7420830 + 41.6662500 97.7441880 + 41.6683130 97.7462500 + 41.6808540 97.7462500 + 41.6829170 97.7483130 + 41.6829170 97.7608540 + 41.6849790 97.7629170 + 41.6891880 97.7629170 + 41.6912500 97.7650210 + 41.6933540 97.7670830 + 41.6954170 97.7691460 + 41.6954170 97.7733540 + 41.6975210 97.7754170 + 41.6995830 97.7774790 + 41.6995830 97.7816880 + 41.7016880 97.7837500 + 41.7037500 97.7858540 + 41.7058540 97.7879170 + 41.7079170 97.7899790 + 41.7079170 97.7941880 + 41.7100210 97.7962500 + 41.7162500 97.8024790 + 41.7162500 97.8066880 + 41.7141460 97.8087500 + 41.7120830 97.8108540 + 41.7099790 97.8129170 + 41.7079170 97.8150210 + 41.7058130 97.8170830 + 41.7037500 97.8191460 + 41.7037500 97.8275210 + 41.7058540 97.8295830 + 41.7079170 97.8316460 + 41.7079170 97.8358540 + 41.7100210 97.8379170 + 41.7120830 97.8399790 + 41.7120830 97.8525210 + 41.7099790 97.8545830 + 41.7079170 97.8566460 + 41.7079170 97.8775210 + 41.7099790 97.8795830 + 41.7141880 97.8795830 + 41.7162500 97.8774790 + 41.7183130 97.8754170 + 41.7225210 97.8754170 + 41.7245830 97.8775210 + 41.7266880 97.8795830 + 41.7287500 97.8816880 + 41.7308540 97.8837500 + 41.7329170 97.8858540 + 41.7350210 97.8879170 + 41.7370830 97.8900210 + 41.7391880 97.8920830 + 41.7412500 97.8899790 + 41.7433540 97.8879170 + 41.7454170 97.8858130 + 41.7475210 97.8837500 + 41.7495830 97.8858540 + 41.7516880 97.8879170 + 41.7537500 97.8900210 + 41.7558540 97.8920830 + 41.7579170 97.8941460 + 41.7579170 97.9066880 + 41.7599790 97.9087500 + 41.7641880 97.9087500 + 41.7662500 97.9066460 + 41.7683130 97.9045830 + 41.7766880 97.9045830 + 41.7787500 97.9066460 + 41.7787500 97.9233540 + 41.7808540 97.9254170 + 41.7829170 97.9274790 + 41.7829170 97.9316880 + 41.7850210 97.9337500 + 41.7870830 97.9358540 + 41.7891880 97.9379170 + 41.7912500 97.9400210 + 41.7891460 97.9420830 + 41.7870830 97.9441460 + 41.7870830 97.9525210 + 41.7891460 97.9545830 + 41.7933540 97.9545830 + 41.7954170 97.9566460 + 41.7954170 97.9608540 + 41.7975210 97.9629170 + 41.7995830 97.9650210 + 41.8016460 97.9670830 + 41.8100210 97.9670830 + 41.8120830 97.9691460 + 41.8120830 97.9733540 + 41.8141880 97.9754170 + 41.8162500 97.9775210 + 41.8183540 97.9795830 + 41.8204170 97.9816880 + 41.8224790 97.9837500 + 41.8266880 97.9837500 + 41.8287500 97.9858540 + 41.8308130 97.9879170 + 41.8350210 97.9879170 + 41.8370830 97.9900210 + 41.8391460 97.9920830 + 41.8474790 97.9962500 + 41.8537500 97.9983130 + 41.8537500 98.0108540 + 41.8516460 98.0129170 + 41.8495830 98.0149790 + 41.8537500 98.0275210 + 41.8537500 98.0295830 + 41.8725210 98.0295830 + 41.8745830 98.0275210 + 41.8766460 98.0254170 + 41.8787500 98.0274790 + 41.8808130 98.0295830 + 41.8850210 98.0295830 + 41.8870830 98.0275210 + 41.8870830 98.0149790 + 41.8891460 98.0129170 + 41.8912500 98.0108540 + 41.8933130 98.0087500 + 41.8954170 98.0066880 + 41.8974790 98.0045830 + 41.8995830 98.0025210 + 41.8995830 97.9983130 + 41.9016460 97.9962500 + 41.9037500 97.9941880 + 41.9037500 97.9899790 + 41.9058130 97.9879170 + 41.9100210 97.9879170 + 41.9120830 97.9858540 + 41.9141460 97.9837500 + 41.9162500 97.9816880 + 41.9162500 97.9733130 + 41.9183130 97.9712500 + 41.9204170 97.9691880 + 41.9224790 97.9670830 + 41.9266880 97.9670830 + 41.9287500 97.9650210 + 41.9287500 97.9566460 + 41.9266880 97.9545830 + 41.9245830 97.9525210 + 41.9245830 97.9441460 + 41.9225210 97.9420830 + 41.9204170 97.9400210 + 41.9204170 97.9191460 + 41.9183540 97.9170830 + 41.9162500 97.9066460 + 41.9141880 97.9045830 + 41.9120830 97.9025210 + 41.9120830 97.8816460 + 41.9100210 97.8795830 + 41.9079170 97.8775210 + 41.9079170 97.8733130 + 41.9058540 97.8712500 + 41.9016460 97.8712500 + 41.8995830 97.8691880 + 41.9016460 97.8670830 + 41.9037500 97.8650210 + 41.9037500 97.8566460 + 41.8995830 97.8525210 + 41.8995830 97.8483130 + 41.8975210 97.8462500 + 41.8891460 97.8462500 + 41.8870830 97.8441880 + 41.8870830 97.8399790 + 41.8850210 97.8379170 + 41.8829170 97.8358540 + 41.8808540 97.8337500 + 41.8787500 97.8316880 + 41.8787500 97.8233130 + 41.8766880 97.8212500 + 41.8683130 97.8212500 + 41.8662500 97.8191880 + 41.8641880 97.8170830 + 41.8558130 97.8170830 + 41.8537500 97.8150210 + 41.8516880 97.8129170 + 41.8474790 97.8129170 + 41.8349790 97.8045830 + 41.8329170 97.8025210 + 41.8329170 97.7983130 + 41.8245830 97.7900210 + 41.8225210 97.7795830 + 41.8183130 97.7795830 + 41.8162500 97.7524790 + 41.8162500 97.7504170 + 41.8099790 97.7504170 + 41.8079170 97.7483540 + 41.8058540 97.7462500 + 41.8016460 97.7462500 + 41.7995830 97.7441880 + 41.7995830 97.7399790 + 41.7975210 97.7379170 + 41.7933130 97.7379170 + 41.7849790 97.7337500 + 41.7829170 97.7316880 + 41.7808540 97.7295830 + 41.7787500 97.7275210 + 41.7787500 97.7191460 + 41.7766880 97.7170830 + 41.7745830 97.7150210 + 41.7725210 97.7129170 + 41.7704170 97.7108540 + 41.7724790 97.7087500 + 41.7745830 97.7066880 + 41.7745830 97.7024790 + 41.7725210 97.7004170 + 41.7704170 97.6983540 + 41.7704170 97.6941460 + 41.7683540 97.6920830 + 41.7662500 97.6900210 + 41.7641880 97.6879170 + 41.7599790 97.6879170 + 41.7579170 97.6858540 + 41.7558540 97.6837500 + 41.7516460 97.6837500 + 41.7495830 97.6816880 + 41.7475210 97.6795830 + 41.7349790 97.6795830 + 41.7329170 97.6775210 + 41.7308540 97.6754170 + 41.7224790 97.6754170 + 41.7204170 97.6733540 + 41.7204170 97.6691460 + 41.7183540 97.6670830 + 41.7058130 97.6670830 + 41.7037500 97.6650210 + 41.7016880 97.6629170 + 41.6995830 97.6608540 + 41.6975210 97.6587500 + 41.6933130 97.6587500 + 41.6912500 97.6566880 + 41.6891880 97.6545830 + 41.6849790 97.6545830 + 41.6829170 97.6525210 + 41.6808540 97.6504170 + 41.6787500 97.6483540 + 41.6787500 97.6399790 + 41.6766880 97.6379170 + 41.6745830 97.6358540 + 41.6745830 97.6191460 + 41.6725210 97.6170830 + 41.6704170 97.6150210 + 41.6704170 97.6066460 + 41.6683540 97.6045830 + 41.6641460 97.6045830 + 41.6620830 97.6025210 + 41.6620830 97.5566460 + 41.6600210 97.5545830 + 41.6579170 97.5525210 + 41.6579170 97.5483130 + 41.6558540 97.5462500 + 41.6537500 97.5441880 + 41.6537500 97.5399790 + 41.6516880 97.5379170 + 41.6495830 97.5358540 + 41.6495830 97.5274790 + 41.6475210 97.5254170 + 41.6454170 97.5233540 + 41.6454170 97.5149790 + 41.6433540 97.5129170 + 41.6412500 97.5108540 + 41.6391880 97.5087500 + 41.6370830 97.5066880 + 41.6370830 97.4983130 + 41.6391460 97.4962500 + 41.6412500 97.4941880 + 41.6391880 97.4920830 + 41.6370830 97.4900210 + 41.6370830 97.4858130 + 41.6391460 97.4837500 + 41.6433540 97.4837500 + 41.6454170 97.4816880 + 41.6474790 97.4795830 + 41.6495830 97.4775210 + 41.6454170 97.4629170 + 41.6183130 97.4629170 + 41.5891880 97.4545830 + 41.5870830 97.4525210 + 41.5870830 97.4358130 + 41.5808130 97.4337500 + 41.5766880 97.4295830 + 41.5662500 97.4233540 + 41.5662500 97.4108130 + 41.5641880 97.4087500 + 41.5620830 97.4066880 + 41.5600210 97.4004170 + 41.5475210 97.3920830 + 41.5433130 97.3920830 + 41.5412500 97.3900210 + 41.5391880 97.3879170 + 41.5370830 97.3858540 + 41.5370830 97.3733130 + 41.5350210 97.3712500 + 41.5329170 97.3691880 + 41.5349790 97.3670830 + 41.5370830 97.3650210 + 41.5391460 97.3129170 + 41.5412500 97.3108540 + 41.5412500 97.3024790 + 41.5433130 97.3004170 + 41.5454170 97.2983540 + 41.5454170 97.2941460 + 41.5245830 97.2795830 +722 722 -1 41 41.40310 97.26144 + 41.6809800 97.2695500 + 41.6720200 97.1761600 + 41.5245000 97.1737000 + 41.5158200 97.0406700 + 41.4669600 97.0001100 + 41.4686000 96.7611200 + 41.4293400 96.7474200 + 41.3994400 96.8134300 + 41.3990000 96.8797500 + 41.2121900 96.8774300 + 41.2017900 96.9566700 + 41.2211500 96.9966300 + 41.2304500 97.0629300 + 41.2693200 97.1164900 + 41.2682300 97.2356500 + 41.2483000 97.2617700 + 41.2665900 97.3945200 + 41.2269800 97.4202000 + 41.2160800 97.5126100 + 41.2241100 97.6583600 + 41.1252900 97.6956900 + 41.1438700 97.7754500 + 41.1941000 97.6973400 + 41.2527300 97.7252300 + 41.3637100 97.5025200 + 41.4027300 97.5298800 + 41.4143600 97.3709000 + 41.4340200 97.3712800 + 41.4724800 97.4517200 + 41.4714000 97.5446600 + 41.5009000 97.5453100 + 41.5194100 97.6387500 + 41.5485700 97.6660200 + 41.5492500 97.6128500 + 41.5015300 97.4921800 + 41.5136500 97.2798200 + 41.5329200 97.3200500 + 41.5317800 97.4263600 + 41.6395100 97.4684800 + 41.6793000 97.4293600 + 41.6809800 97.2695500 +723 723 -1 15 41.03800 96.25488 + 41.1559300 96.2686200 + 41.1559500 96.2553900 + 41.1264600 96.2552900 + 41.0772700 96.2683100 + 41.0675000 96.2418700 + 41.0380100 96.2417700 + 41.0184600 96.1757400 + 40.9299900 96.1755100 + 40.9201400 96.1886700 + 40.9199700 96.2808900 + 40.9297000 96.3204700 + 40.9591600 96.3337800 + 41.0574600 96.3342400 + 41.1361400 96.3214000 + 41.1559300 96.2686200 +724 SALT CR. AT ROCA NE -1 256 40.61417 96.71917 + 40.6620830 96.6712500 + 40.6579170 96.6566880 + 40.6579170 96.6524790 + 40.6599790 96.6504170 + 40.6620830 96.6483540 + 40.6620830 96.6399790 + 40.6662500 96.6358540 + 40.6641880 96.6337500 + 40.6620830 96.6316880 + 40.6620830 96.6274790 + 40.6641460 96.6254170 + 40.6662500 96.6233540 + 40.6662500 96.6191460 + 40.6683130 96.6170830 + 40.6725210 96.6170830 + 40.6745830 96.6150210 + 40.6766460 96.6129170 + 40.6850210 96.6129170 + 40.6870830 96.6149790 + 40.6974790 96.6254170 + 40.6995830 96.6233540 + 40.7016460 96.6212500 + 40.7037500 96.6191880 + 40.7037500 96.6149790 + 40.7079170 96.6108540 + 40.7079170 96.5983130 + 40.7058540 96.5962500 + 40.7037500 96.5941880 + 40.7079170 96.5900210 + 40.7079170 96.5816460 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6524790 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5308540 96.7545830 + 40.5287500 96.7566460 + 40.5266880 96.7587500 + 40.5245830 96.7608130 + 40.5266460 96.7629170 + 40.5287500 96.7649790 + 40.5308130 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5349790 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391460 96.7920830 + 40.5412500 96.7941460 + 40.5391880 96.7962500 + 40.5370830 96.7983130 + 40.5391460 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391880 96.8129170 + 40.5370830 96.8149790 + 40.5350210 96.8170830 + 40.5329170 96.8191460 + 40.5308540 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8774790 + 40.5308130 96.8795830 + 40.5329170 96.8816460 + 40.5349790 96.8837500 + 40.5370830 96.8858130 + 40.5391460 96.8879170 + 40.5412500 96.8899790 + 40.5433130 96.8920830 + 40.5454170 96.8941460 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983130 + 40.5599790 96.9004170 + 40.5620830 96.9024790 + 40.5641460 96.9045830 + 40.5662500 96.9066460 + 40.5683130 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808130 96.9212500 + 40.5829170 96.9191880 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191460 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233130 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308130 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6349790 96.9004170 + 40.6370830 96.8983540 + 40.6412500 96.8900210 + 40.6412500 96.8858130 + 40.6433130 96.8837500 + 40.6475210 96.8837500 + 40.6495830 96.8816880 + 40.6495830 96.8774790 + 40.6516460 96.8754170 + 40.6600210 96.8754170 + 40.6620830 96.8733540 + 40.6662500 96.8691880 + 40.6662500 96.8608130 + 40.6641880 96.8587500 + 40.6620830 96.8566880 + 40.6620830 96.8441460 + 40.6641460 96.8420830 + 40.6662500 96.8400210 + 40.6662500 96.8358130 + 40.6683130 96.8337500 + 40.6704170 96.8316880 + 40.6704170 96.8274790 + 40.6724790 96.8254170 + 40.6745830 96.8233540 + 40.6766460 96.8212500 + 40.6787500 96.8191880 + 40.6787500 96.8108130 + 40.6766880 96.8087500 + 40.6745830 96.8066880 + 40.6745830 96.7983130 + 40.6725210 96.7962500 + 40.6704170 96.7941880 + 40.6704170 96.7899790 + 40.6724790 96.7879170 + 40.6766880 96.7879170 + 40.6787500 96.7858540 + 40.6808130 96.7837500 + 40.6829170 96.7816880 + 40.6829170 96.7691460 + 40.6849790 96.7670830 + 40.6870830 96.7650210 + 40.6870830 96.7566460 + 40.6829170 96.7525210 + 40.6808540 96.7504170 + 40.6787500 96.7483540 + 40.6766880 96.7462500 + 40.6745830 96.7441880 + 40.6745830 96.7399790 + 40.6725210 96.7379170 + 40.6704170 96.7358540 + 40.6704170 96.7149790 + 40.6683540 96.7129170 + 40.6662500 96.7108540 + 40.6662500 96.6941460 + 40.6620830 96.6712500 +725 725 -1 23 40.97550 96.86758 + 41.2121900 96.8774300 + 41.1437200 96.8237100 + 41.1338900 96.8235900 + 41.1046400 96.7836200 + 40.9671100 96.7689100 + 40.9280200 96.7289600 + 40.8788800 96.7284500 + 40.8496100 96.6886600 + 40.7805100 96.7405900 + 40.7995100 96.8460200 + 40.7298700 96.9634600 + 40.7688800 97.0034300 + 40.8768900 97.0181400 + 40.9358600 97.0189800 + 40.9360700 96.9926200 + 40.9557300 96.9929000 + 40.9750700 97.0327300 + 41.0142800 97.0464900 + 41.1130100 96.9951100 + 41.1818200 96.9960800 + 41.2211500 96.9966300 + 41.2017900 96.9566700 + 41.2121900 96.8774300 +726 726 -1 14 40.74650 96.77946 + 40.8496100 96.6886600 + 40.7908400 96.6486400 + 40.7812700 96.5959500 + 40.7223100 96.5954500 + 40.6730400 96.6213000 + 40.6432900 96.6735400 + 40.6919100 96.7659400 + 40.6814900 96.8577500 + 40.6518300 96.8836400 + 40.7003900 96.9630600 + 40.7298700 96.9634600 + 40.7995100 96.8460200 + 40.7805100 96.7405900 + 40.8496100 96.6886600 +727 WAHOO CR. AT ITHACA NE -1 234 41.26000 96.74417 + 41.1412500 96.5379170 + 41.1266460 96.5504170 + 41.1225210 96.5545830 + 41.1183130 96.5545830 + 41.1162500 96.5566880 + 41.1141880 96.5587500 + 41.1099790 96.5587500 + 41.1079170 96.5608540 + 41.1058540 96.5629170 + 41.1016460 96.5629170 + 41.0995830 96.5629170 + 41.1099790 96.5795830 + 41.1141880 96.5795830 + 41.1162500 96.5816460 + 41.1162500 96.5941880 + 41.1183540 96.5962500 + 41.1245830 96.6024790 + 41.1245830 96.6108540 + 41.1266460 96.6129170 + 41.1308540 96.6129170 + 41.1329170 96.6149790 + 41.1329170 96.6275210 + 41.1349790 96.6295830 + 41.1391880 96.6295830 + 41.1412500 96.6316880 + 41.1433130 96.6337500 + 41.1475210 96.6337500 + 41.1495830 96.6358540 + 41.1516880 96.6379170 + 41.1537500 96.6399790 + 41.1537500 96.6483540 + 41.1516880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1391460 96.6587500 + 41.1370830 96.6608540 + 41.1349790 96.6629170 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3308540 96.8920830 + 41.3329170 96.8941880 + 41.3350210 96.8962500 + 41.3370830 96.8983540 + 41.3391460 96.9004170 + 41.3433540 96.9004170 + 41.3454170 96.8983130 + 41.3475210 96.8962500 + 41.3495830 96.8983540 + 41.3516460 96.9004170 + 41.3683540 96.9004170 + 41.3704170 96.9025210 + 41.3724790 96.9045830 + 41.3766880 96.9045830 + 41.3787500 96.9066880 + 41.3808130 96.9087500 + 41.3891880 96.9087500 + 41.3912500 96.9066880 + 41.3912500 96.9024790 + 41.3933540 96.9004170 + 41.3954170 96.8983540 + 41.3954170 96.8816460 + 41.3975210 96.8795830 + 41.3995830 96.8775210 + 41.4037500 96.8400210 + 41.4037500 96.8316460 + 41.4058540 96.8295830 + 41.4079170 96.8275210 + 41.4079170 96.8066460 + 41.4099790 96.8045830 + 41.4141880 96.8045830 + 41.4162500 96.8024790 + 41.4183130 96.8004170 + 41.4225210 96.8004170 + 41.4245830 96.7983540 + 41.4245830 96.7649790 + 41.4224790 96.7629170 + 41.4204170 96.7608540 + 41.4204170 96.7524790 + 41.4183130 96.7504170 + 41.4162500 96.7483540 + 41.4162500 96.7358130 + 41.4141460 96.7337500 + 41.4120830 96.7316880 + 41.4120830 96.6941460 + 41.4099790 96.6920830 + 41.4079170 96.6629170 + 41.3891460 96.6629170 + 41.3870830 96.6608540 + 41.3870830 96.6566460 + 41.3850210 96.6545830 + 41.3829170 96.6525210 + 41.3808540 96.6504170 + 41.3787500 96.6483540 + 41.3766880 96.6462500 + 41.3745830 96.6441880 + 41.3745830 96.6316460 + 41.3725210 96.6295830 + 41.3704170 96.6275210 + 41.3683540 96.6254170 + 41.3641460 96.6254170 + 41.3620830 96.6233540 + 41.3600210 96.6212500 + 41.3558130 96.6212500 + 41.3537500 96.6191880 + 41.3516880 96.6170830 + 41.3391460 96.6170830 + 41.3370830 96.6191460 + 41.3350210 96.6212500 + 41.3308130 96.6212500 + 41.3287500 96.6233130 + 41.3266880 96.6254170 + 41.3099790 96.6254170 + 41.3079170 96.6233540 + 41.3058540 96.6212500 + 41.3016460 96.6212500 + 41.2995830 96.6191880 + 41.2975210 96.6170830 + 41.2933130 96.6170830 + 41.2912500 96.6150210 + 41.2891880 96.6129170 + 41.2870830 96.6108540 + 41.2870830 96.6066460 + 41.2850210 96.6045830 + 41.2766460 96.6045830 + 41.2745830 96.6025210 + 41.2725210 96.6004170 + 41.2704170 96.5983540 + 41.2683540 96.5962500 + 41.2662500 96.5941880 + 41.2641880 96.5920830 + 41.2516460 96.5920830 + 41.2495830 96.5900210 + 41.2475210 96.5879170 + 41.2433130 96.5879170 + 41.2412500 96.5858540 + 41.2391880 96.5837500 + 41.2370830 96.5816880 + 41.2350210 96.5795830 + 41.2266460 96.5795830 + 41.2245830 96.5775210 + 41.2245830 96.5733130 + 41.2225210 96.5712500 + 41.2016460 96.5712500 + 41.1995830 96.5733130 + 41.1975210 96.5754170 + 41.1933130 96.5754170 + 41.1912500 96.5733540 + 41.1912500 96.5608130 + 41.1891880 96.5587500 + 41.1870830 96.5566880 + 41.1850210 96.5545830 + 41.1808130 96.5545830 + 41.1787500 96.5525210 + 41.1766880 96.5504170 + 41.1745830 96.5483540 + 41.1745830 96.5399790 + 41.1725210 96.5379170 + 41.1558130 96.5379170 + 41.1537500 96.5358540 + 41.1516880 96.5337500 + 41.1495830 96.5316880 + 41.1475210 96.5295830 + 41.1412500 96.5379170 +728 728 -1 26 41.15040 96.48756 + 41.4198100 96.6942400 + 41.4204000 96.5748200 + 41.3910700 96.5347900 + 41.3222900 96.5210100 + 41.3224000 96.4945100 + 41.2929500 96.4810600 + 41.2931800 96.4148300 + 41.2736000 96.3882400 + 41.2146500 96.3746800 + 41.1852600 96.3348500 + 41.0770100 96.3739500 + 41.0574600 96.3342400 + 40.9591600 96.3337800 + 40.9297000 96.3204700 + 40.9199700 96.2808900 + 40.8805500 96.3202400 + 40.8804100 96.3729200 + 40.9000700 96.3730200 + 40.9195600 96.4258300 + 40.9687100 96.4261200 + 40.9685200 96.4788600 + 41.1254300 96.5724200 + 41.1551500 96.5197800 + 41.3513200 96.6272800 + 41.3608800 96.6804000 + 41.4198100 96.6942400 +729 729 -1 27 40.92870 96.59826 + 41.1254300 96.5724200 + 40.9685200 96.4788600 + 40.9687100 96.4261200 + 40.9195600 96.4258300 + 40.9000700 96.3730200 + 40.8804100 96.3729200 + 40.8803700 96.3860900 + 40.8213600 96.3989200 + 40.8209800 96.5041800 + 40.7719400 96.4775300 + 40.7717900 96.5169800 + 40.7226500 96.5166200 + 40.7027700 96.5690200 + 40.7027100 96.5821500 + 40.7223100 96.5954500 + 40.7812700 96.5959500 + 40.7908400 96.6486400 + 40.8496100 96.6886600 + 40.8788800 96.7284500 + 40.9280200 96.7289600 + 40.9671100 96.7689100 + 41.1046400 96.7836200 + 41.1338900 96.8235900 + 41.1442100 96.7444100 + 41.1249800 96.6649200 + 41.1546700 96.6255300 + 41.1254300 96.5724200 +730 730 -1 12 40.80920 98.67616 + 40.8493900 98.8345700 + 40.8011400 98.7931700 + 40.8020000 98.7537200 + 40.8666400 98.4796400 + 40.8273400 98.4782700 + 40.8036900 98.6748400 + 40.7635500 98.7127800 + 40.7517300 98.8043700 + 40.7812000 98.8055400 + 40.8386800 98.8736500 + 40.8485100 98.8740500 + 40.8493900 98.8345700 +757 757 -1 7 40.86300 98.41433 + 40.8290900 98.3861900 + 40.8482500 98.4131700 + 40.8273400 98.4782700 + 40.8666400 98.4796400 + 40.8784700 98.3746900 + 40.8986100 98.3490100 + 40.8290900 98.3861900 +770 770 -1 30 41.30260 96.39942 + 41.5477300 96.6822100 + 41.5084600 96.6685400 + 41.4498400 96.5883300 + 41.4501300 96.5219600 + 41.4111800 96.4155300 + 41.2836800 96.2955900 + 41.3034100 96.2691700 + 41.2837700 96.2558500 + 41.1559300 96.2686200 + 41.1361400 96.3214000 + 41.0574600 96.3342400 + 41.0770100 96.3739500 + 41.1852600 96.3348500 + 41.2146500 96.3746800 + 41.2736000 96.3882400 + 41.2931800 96.4148300 + 41.2929500 96.4810600 + 41.3224000 96.4945100 + 41.3222900 96.5210100 + 41.3910700 96.5347900 + 41.4204000 96.5748200 + 41.4198100 96.6942400 + 41.4196600 96.7207800 + 41.4293400 96.7474200 + 41.4686000 96.7611200 + 41.4669600 97.0001100 + 41.5158200 97.0406700 + 41.4965700 96.9872500 + 41.5468600 96.8284300 + 41.5477300 96.6822100 +804 804 -1 24 42.83000 95.30000 + 42.8800000 95.2200000 + 42.8200000 95.2300000 + 42.8200000 95.2700000 + 42.7800000 95.2700000 + 42.6800000 95.2200000 + 42.6800000 95.2700000 + 42.7200000 95.2800000 + 42.7200000 95.3000000 + 42.7700000 95.3200000 + 42.7800000 95.3000000 + 42.8200000 95.3200000 + 42.8500000 95.3700000 + 42.8700000 95.3800000 + 42.9000000 95.3500000 + 42.9200000 95.3700000 + 42.9200000 95.3500000 + 42.9300000 95.3500000 + 42.9500000 95.3500000 + 42.9800000 95.3000000 + 42.9500000 95.2500000 + 42.9200000 95.2700000 + 42.9000000 95.2500000 + 42.8800000 95.2500000 + 42.8800000 95.2200000 +805 805 -1 39 43.00000 95.46500 + 43.1800000 95.6000000 + 43.2700000 95.6000000 + 43.2700000 95.5700000 + 43.2500000 95.5000000 + 43.2200000 95.4700000 + 43.1700000 95.4800000 + 43.1300000 95.4700000 + 43.1300000 95.4500000 + 43.0800000 95.4200000 + 43.0300000 95.3700000 + 43.0200000 95.3700000 + 43.0000000 95.3500000 + 43.0000000 95.3300000 + 42.9800000 95.3000000 + 42.9500000 95.3500000 + 42.9300000 95.3500000 + 42.9200000 95.3500000 + 42.9200000 95.3700000 + 42.9000000 95.3500000 + 42.8700000 95.3800000 + 42.8300000 95.4300000 + 42.8200000 95.4500000 + 42.7800000 95.4700000 + 42.7500000 95.4800000 + 42.7300000 95.5300000 + 42.7500000 95.5500000 + 42.7700000 95.5800000 + 42.7800000 95.6300000 + 42.8000000 95.6000000 + 42.7800000 95.5700000 + 42.7800000 95.5500000 + 42.8000000 95.5300000 + 42.8800000 95.5200000 + 42.9500000 95.5200000 + 43.0200000 95.5300000 + 43.0800000 95.5500000 + 43.0800000 95.5700000 + 43.1500000 95.5700000 + 43.1800000 95.6000000 +806 806 -1 31 42.98000 95.67000 + 42.8800000 95.8200000 + 42.8800000 95.8000000 + 42.9300000 95.8200000 + 42.9700000 95.8200000 + 42.9800000 95.8200000 + 43.0200000 95.8200000 + 43.0200000 95.7800000 + 43.0300000 95.7700000 + 43.0500000 95.7700000 + 43.0800000 95.7500000 + 43.1000000 95.7300000 + 43.1300000 95.7300000 + 43.1500000 95.6700000 + 43.1500000 95.6200000 + 43.1800000 95.6200000 + 43.1800000 95.6000000 + 43.1500000 95.5700000 + 43.0800000 95.5700000 + 43.0800000 95.5500000 + 43.0200000 95.5300000 + 42.9500000 95.5200000 + 42.8800000 95.5200000 + 42.8000000 95.5300000 + 42.7800000 95.5500000 + 42.7800000 95.5700000 + 42.8000000 95.6000000 + 42.7800000 95.6300000 + 42.8000000 95.6800000 + 42.8200000 95.7200000 + 42.8500000 95.7200000 + 42.8800000 95.8200000 +807 807 -1 25 42.64500 95.70000 + 42.7800000 95.6300000 + 42.7700000 95.5800000 + 42.7500000 95.5500000 + 42.7300000 95.5300000 + 42.7500000 95.4800000 + 42.7000000 95.5000000 + 42.7000000 95.5200000 + 42.6500000 95.5000000 + 42.5800000 95.5300000 + 42.5700000 95.5200000 + 42.4800000 95.5300000 + 42.4800000 95.6000000 + 42.5000000 95.6500000 + 42.5000000 95.7300000 + 42.4700000 95.8000000 + 42.5000000 95.8500000 + 42.5000000 95.8800000 + 42.5300000 95.9200000 + 42.5800000 95.9000000 + 42.6200000 95.8300000 + 42.6800000 95.7700000 + 42.7300000 95.7700000 + 42.8200000 95.7200000 + 42.8000000 95.6800000 + 42.7800000 95.6300000 +808 808 -1 33 42.28500 95.86675 + 42.4800000 95.6000000 + 42.4300000 95.6000000 + 42.4300000 95.6300000 + 42.4000000 95.6300000 + 42.3800000 95.7000000 + 42.3500000 95.7200000 + 42.3500000 95.7300000 + 42.3000000 95.8000000 + 42.2500000 95.8200000 + 42.2300000 95.8200000 + 42.2000000 95.8500000 + 42.1800000 95.8500000 + 42.1800000 95.8800000 + 42.1500000 95.9000000 + 42.1300000 95.9200000 + 42.0800000 95.9500000 + 42.0700000 95.9800000 + 42.0800000 96.0100000 + 42.1000000 96.0000000 + 42.1800000 96.0000000 + 42.2300000 95.9500000 + 42.2800000 95.9300000 + 42.3000000 95.9200000 + 42.3200000 95.9200000 + 42.4500000 95.8800000 + 42.4700000 95.9000000 + 42.4800000 95.9000000 + 42.5000000 95.8800000 + 42.5000000 95.8500000 + 42.4700000 95.8000000 + 42.5000000 95.7300000 + 42.5000000 95.6500000 + 42.4800000 95.6000000 +809 809 -1 55 42.49500 95.40238 + 42.7200000 95.3000000 + 42.6800000 95.3000000 + 42.6500000 95.2800000 + 42.6300000 95.2800000 + 42.5700000 95.3000000 + 42.5300000 95.3000000 + 42.5200000 95.2800000 + 42.4500000 95.2700000 + 42.4300000 95.2300000 + 42.3700000 95.2300000 + 42.3500000 95.2200000 + 42.3200000 95.2200000 + 42.2800000 95.2500000 + 42.2700000 95.3200000 + 42.2800000 95.3500000 + 42.2700000 95.3800000 + 42.3000000 95.4000000 + 42.3000000 95.4300000 + 42.2800000 95.4500000 + 42.3000000 95.5200000 + 42.2200000 95.6300000 + 42.2000000 95.6700000 + 42.1700000 95.7200000 + 42.1200000 95.7500000 + 42.1200000 95.7700000 + 42.1300000 95.7800000 + 42.1500000 95.8000000 + 42.1800000 95.8500000 + 42.2000000 95.8500000 + 42.2300000 95.8200000 + 42.2500000 95.8200000 + 42.3000000 95.8000000 + 42.3500000 95.7300000 + 42.3500000 95.7200000 + 42.3800000 95.7000000 + 42.4000000 95.6300000 + 42.4300000 95.6300000 + 42.4300000 95.6000000 + 42.4800000 95.6000000 + 42.4800000 95.5300000 + 42.5700000 95.5200000 + 42.5800000 95.5300000 + 42.6500000 95.5000000 + 42.7000000 95.5200000 + 42.7000000 95.5000000 + 42.7500000 95.4800000 + 42.7800000 95.4700000 + 42.8200000 95.4500000 + 42.8300000 95.4300000 + 42.8700000 95.3800000 + 42.8500000 95.3700000 + 42.8200000 95.3200000 + 42.7800000 95.3000000 + 42.7700000 95.3200000 + 42.7200000 95.3000000 +810 810 -1 29 42.04000 95.88500 + 42.1200000 95.7500000 + 42.0800000 95.7700000 + 42.0800000 95.8000000 + 42.0700000 95.8300000 + 42.0300000 95.8300000 + 42.0200000 95.8500000 + 41.9800000 95.8700000 + 41.9700000 95.9200000 + 41.9200000 95.9300000 + 41.9000000 95.9500000 + 41.9700000 95.9500000 + 41.9700000 95.9700000 + 41.9700000 95.9800000 + 42.0000000 95.9800000 + 42.0300000 96.0000000 + 42.0500000 96.0200000 + 42.1000000 96.0200000 + 42.1000000 96.0000000 + 42.0800000 96.0100000 + 42.0700000 95.9800000 + 42.0800000 95.9500000 + 42.1300000 95.9200000 + 42.1500000 95.9000000 + 42.1800000 95.8800000 + 42.1800000 95.8500000 + 42.1500000 95.8000000 + 42.1300000 95.7800000 + 42.1200000 95.7700000 + 42.1200000 95.7500000 +811 811 -1 33 42.55500 95.93500 + 42.8200000 95.7200000 + 42.7300000 95.7700000 + 42.6800000 95.7700000 + 42.6200000 95.8300000 + 42.5800000 95.9000000 + 42.5300000 95.9200000 + 42.5300000 95.9300000 + 42.5000000 95.9800000 + 42.4700000 96.0000000 + 42.4300000 96.0500000 + 42.3800000 96.0300000 + 42.3300000 96.0300000 + 42.3000000 96.0700000 + 42.2300000 96.0700000 + 42.2700000 96.0800000 + 42.3200000 96.1300000 + 42.4300000 96.1200000 + 42.5000000 96.1500000 + 42.5700000 96.1200000 + 42.6500000 96.1300000 + 42.6800000 96.1000000 + 42.7200000 96.1000000 + 42.7300000 96.0800000 + 42.7300000 96.0500000 + 42.7800000 96.0200000 + 42.7800000 96.0000000 + 42.7800000 95.9700000 + 42.8000000 95.9500000 + 42.8000000 95.9300000 + 42.8800000 95.8700000 + 42.8800000 95.8200000 + 42.8500000 95.7200000 + 42.8200000 95.7200000 +812 812 -1 54 42.34500 96.19886 + 42.6800000 96.1500000 + 42.7200000 96.1000000 + 42.6800000 96.1000000 + 42.6500000 96.1300000 + 42.5700000 96.1200000 + 42.5000000 96.1500000 + 42.4300000 96.1200000 + 42.3200000 96.1300000 + 42.2700000 96.0800000 + 42.2300000 96.0700000 + 42.3000000 96.0700000 + 42.3300000 96.0300000 + 42.3800000 96.0300000 + 42.4300000 96.0500000 + 42.4700000 96.0000000 + 42.5000000 95.9800000 + 42.5300000 95.9300000 + 42.5300000 95.9200000 + 42.5000000 95.8800000 + 42.4800000 95.9000000 + 42.4700000 95.9000000 + 42.4500000 95.8800000 + 42.3200000 95.9200000 + 42.3000000 95.9200000 + 42.2800000 95.9300000 + 42.2300000 95.9500000 + 42.1800000 96.0000000 + 42.1000000 96.0000000 + 42.1000000 96.0200000 + 42.0500000 96.0200000 + 42.0300000 96.0000000 + 42.0000000 95.9800000 + 41.9700000 95.9800000 + 41.9700000 96.0000000 + 41.9700000 96.0200000 + 42.0200000 96.0500000 + 42.0700000 96.0700000 + 42.0800000 96.1000000 + 42.1700000 96.1300000 + 42.2800000 96.2000000 + 42.3200000 96.2500000 + 42.3305100 96.2584100 + 42.4200000 96.3300000 + 42.4300000 96.3500000 + 42.4700000 96.3500000 + 42.4800000 96.3200000 + 42.5200000 96.3200000 + 42.5200000 96.3000000 + 42.5300000 96.2700000 + 42.5500000 96.2800000 + 42.5700000 96.2500000 + 42.6800000 96.1800000 + 42.6800000 96.1700000 + 42.6800000 96.1500000 +813 813 -1 29 43.80070 97.02903 + 44.1251500 97.2186900 + 44.1061400 97.1355700 + 44.0279600 97.0378100 + 43.9790300 96.9819900 + 43.9306300 96.8437000 + 43.8912500 96.8294600 + 43.8817100 96.7743500 + 43.8125600 96.7872900 + 43.7138200 96.7998700 + 43.6746100 96.7582900 + 43.5956200 96.7711100 + 43.5265000 96.7840100 + 43.4965000 96.8520300 + 43.4762200 96.9337800 + 43.5248100 97.0302000 + 43.5935200 97.0723000 + 43.5934000 97.0860000 + 43.6326300 97.1140200 + 43.7215200 97.1017500 + 43.7410100 97.1295100 + 43.7899800 97.1715100 + 43.8295700 97.1584500 + 43.8786600 97.1867800 + 43.9284800 97.1326100 + 43.9960500 97.2990200 + 44.0355300 97.2997700 + 44.0459300 97.2448300 + 44.1248900 97.2462800 + 44.1251500 97.2186900 +819 819 -1 32 42.99500 96.37500 + 43.1700000 96.2700000 + 43.1500000 96.2000000 + 43.1700000 96.1500000 + 43.1200000 96.1800000 + 43.0800000 96.1700000 + 43.0700000 96.1800000 + 43.0500000 96.2200000 + 43.0200000 96.2200000 + 43.0000000 96.2700000 + 42.9700000 96.2800000 + 42.9300000 96.2700000 + 42.8800000 96.3300000 + 42.8700000 96.4000000 + 42.8300000 96.4500000 + 42.8200000 96.5200000 + 42.8300000 96.5700000 + 42.8700000 96.5800000 + 42.9000000 96.5700000 + 42.9200000 96.5800000 + 42.9500000 96.5800000 + 42.9800000 96.5800000 + 43.0200000 96.5800000 + 43.0300000 96.6000000 + 43.0500000 96.5800000 + 43.1000000 96.5800000 + 43.1300000 96.5700000 + 43.1200000 96.5500000 + 43.0500000 96.4800000 + 43.0500000 96.4700000 + 43.1300000 96.3500000 + 43.1500000 96.3000000 + 43.1700000 96.2700000 +820 820 -1 29 43.38410 96.71186 + 43.5480300 96.5770600 + 43.5300000 96.5500000 + 43.5200000 96.5300000 + 43.5000000 96.5000000 + 43.5200000 96.4700000 + 43.5300000 96.4700000 + 43.5300000 96.4000000 + 43.4700000 96.4200000 + 43.4300000 96.3800000 + 43.3700000 96.3800000 + 43.3500000 96.4200000 + 43.3200000 96.4300000 + 43.3000000 96.4700000 + 43.2700000 96.4700000 + 43.2700000 96.5000000 + 43.2300000 96.5800000 + 43.2200000 96.6500000 + 43.2174300 96.6487100 + 43.2015500 96.7122400 + 43.2803300 96.7266800 + 43.5148400 97.0437200 + 43.5248100 97.0302000 + 43.4762200 96.9337800 + 43.4965000 96.8520300 + 43.4670900 96.8243300 + 43.4674200 96.7696700 + 43.5271100 96.6745900 + 43.5666300 96.6612900 + 43.5480300 96.5770600 +825 825 -1 38 42.85140 96.66654 + 43.1300000 96.5700000 + 43.1000000 96.5800000 + 43.0500000 96.5800000 + 43.0300000 96.6000000 + 43.0200000 96.5800000 + 42.9800000 96.5800000 + 42.9500000 96.5800000 + 42.9200000 96.5800000 + 42.9000000 96.5700000 + 42.8700000 96.5800000 + 42.8300000 96.5700000 + 42.8200000 96.5200000 + 42.8300000 96.4500000 + 42.8700000 96.4000000 + 42.8800000 96.3300000 + 42.8700000 96.3300000 + 42.8500000 96.3000000 + 42.8300000 96.3200000 + 42.8200000 96.3500000 + 42.7800000 96.3500000 + 42.7300000 96.3800000 + 42.7000000 96.4200000 + 42.6200000 96.4300000 + 42.5800000 96.4700000 + 42.5518600 96.4700000 + 42.5500800 96.4703800 + 42.5228700 96.4761100 + 42.5620500 96.5303300 + 42.6995000 96.6259800 + 42.7482600 96.7211000 + 42.8662300 96.7629800 + 42.8955400 96.8039600 + 43.0235300 96.8190300 + 43.0434100 96.7921000 + 43.1522000 96.7253300 + 43.1800000 96.6300000 + 43.1800000 96.5800000 + 43.1300000 96.5700000 +826 826 -1 21 43.21000 96.46000 + 43.1700000 96.2700000 + 43.1500000 96.3000000 + 43.1300000 96.3500000 + 43.0500000 96.4700000 + 43.0500000 96.4800000 + 43.1200000 96.5500000 + 43.1300000 96.5700000 + 43.1800000 96.5800000 + 43.1800000 96.6300000 + 43.2174300 96.6487100 + 43.2200000 96.6500000 + 43.2300000 96.5800000 + 43.2700000 96.5000000 + 43.2700000 96.4700000 + 43.3000000 96.4700000 + 43.3200000 96.4300000 + 43.3500000 96.4200000 + 43.3700000 96.3800000 + 43.2300000 96.2800000 + 43.2200000 96.2800000 + 43.1700000 96.2700000 +855 855 -1 32 42.90500 96.00000 + 42.9700000 96.0800000 + 42.9800000 96.0700000 + 42.9800000 96.0300000 + 42.9800000 96.0000000 + 42.9700000 95.9800000 + 42.9700000 95.9500000 + 43.0000000 95.9300000 + 43.0200000 95.9200000 + 43.0300000 95.8800000 + 43.0200000 95.8200000 + 42.9800000 95.8200000 + 42.9700000 95.8200000 + 42.9300000 95.8200000 + 42.8800000 95.8000000 + 42.8800000 95.8200000 + 42.8800000 95.8700000 + 42.8000000 95.9300000 + 42.8000000 95.9500000 + 42.7800000 95.9700000 + 42.7800000 96.0000000 + 42.7800000 96.0200000 + 42.8000000 96.0800000 + 42.7800000 96.1000000 + 42.7800000 96.1300000 + 42.8000000 96.1700000 + 42.8200000 96.2000000 + 42.8500000 96.1800000 + 42.8700000 96.1800000 + 42.8800000 96.1700000 + 42.9000000 96.1300000 + 42.9500000 96.0800000 + 42.9700000 96.0800000 +856 856 -1 25 43.07500 96.11500 + 43.2200000 96.0700000 + 43.2300000 96.0200000 + 43.2000000 95.9800000 + 43.1800000 95.9800000 + 43.1700000 95.9500000 + 43.1200000 95.9800000 + 43.1000000 96.0000000 + 43.0800000 95.9800000 + 43.0700000 96.0200000 + 43.0500000 96.0200000 + 43.0200000 96.0500000 + 42.9800000 96.0700000 + 42.9700000 96.0800000 + 42.9200000 96.1500000 + 42.9200000 96.1800000 + 42.9300000 96.2700000 + 42.9700000 96.2800000 + 43.0000000 96.2700000 + 43.0200000 96.2200000 + 43.0500000 96.2200000 + 43.0700000 96.1800000 + 43.0800000 96.1700000 + 43.1200000 96.1800000 + 43.1700000 96.1500000 + 43.2200000 96.0700000 +857 857 -1 30 42.82500 96.26583 + 42.9700000 96.0800000 + 42.9500000 96.0800000 + 42.9000000 96.1300000 + 42.8800000 96.1700000 + 42.8700000 96.1800000 + 42.8500000 96.1800000 + 42.8200000 96.2000000 + 42.8000000 96.1700000 + 42.7800000 96.1300000 + 42.7800000 96.1000000 + 42.8000000 96.0800000 + 42.7800000 96.0200000 + 42.7300000 96.0500000 + 42.7300000 96.0800000 + 42.7200000 96.1000000 + 42.6800000 96.1500000 + 42.7200000 96.2300000 + 42.7500000 96.3200000 + 42.7700000 96.3200000 + 42.7800000 96.3300000 + 42.7800000 96.3500000 + 42.8200000 96.3500000 + 42.8300000 96.3200000 + 42.8500000 96.3000000 + 42.8700000 96.3300000 + 42.8800000 96.3300000 + 42.9300000 96.2700000 + 42.9200000 96.1800000 + 42.9200000 96.1500000 + 42.9700000 96.0800000 +858 858 -1 14 42.65000 96.25000 + 42.6800000 96.1500000 + 42.6800000 96.1700000 + 42.6800000 96.1800000 + 42.5700000 96.2500000 + 42.5500000 96.2800000 + 42.5700000 96.3000000 + 42.5700000 96.3200000 + 42.6000000 96.3500000 + 42.6200000 96.3500000 + 42.6300000 96.3300000 + 42.7000000 96.3300000 + 42.7500000 96.3200000 + 42.7200000 96.2300000 + 42.6800000 96.1500000 +865 865 -1 19 42.65500 96.39519 + 42.7500000 96.3200000 + 42.7000000 96.3300000 + 42.6300000 96.3300000 + 42.6200000 96.3500000 + 42.6000000 96.3500000 + 42.5800000 96.3500000 + 42.5300000 96.4000000 + 42.5300000 96.4200000 + 42.5500000 96.4300000 + 42.5500800 96.4703800 + 42.5518600 96.4700000 + 42.5800000 96.4700000 + 42.6200000 96.4300000 + 42.7000000 96.4200000 + 42.7300000 96.3800000 + 42.7800000 96.3500000 + 42.7800000 96.3300000 + 42.7700000 96.3200000 + 42.7500000 96.3200000 +904 904 -1 30 40.79660 94.31000 + 41.0200000 94.2800000 + 41.0232900 94.2712300 + 41.0200000 94.2500000 + 40.9500000 94.2200000 + 40.9200000 94.2200000 + 40.8800000 94.2300000 + 40.8500000 94.1800000 + 40.8200000 94.1800000 + 40.8200000 94.1700000 + 40.7500000 94.1800000 + 40.7300000 94.2000000 + 40.7200000 94.2300000 + 40.6700000 94.2200000 + 40.5800000 94.2700000 + 40.5700000 94.3000000 + 40.6000000 94.4200000 + 40.6200000 94.4500000 + 40.6500000 94.4500000 + 40.6800000 94.4000000 + 40.7300000 94.3800000 + 40.7300000 94.4000000 + 40.8000000 94.3800000 + 40.8300000 94.3700000 + 40.9200000 94.3700000 + 40.9300000 94.3500000 + 40.9200000 94.3300000 + 40.9700000 94.2800000 + 40.9800000 94.2700000 + 41.0000000 94.2700000 + 41.0200000 94.2800000 +905 905 -1 16 40.46000 94.47500 + 40.5700000 94.3000000 + 40.5500000 94.3300000 + 40.4500000 94.3800000 + 40.4200000 94.3800000 + 40.3800000 94.3700000 + 40.3000000 94.3800000 + 40.3200000 94.5300000 + 40.3500000 94.6500000 + 40.4000000 94.6500000 + 40.4000000 94.6300000 + 40.4800000 94.5800000 + 40.5500000 94.5700000 + 40.5500000 94.5300000 + 40.6200000 94.4500000 + 40.6000000 94.4200000 + 40.5700000 94.3000000 +906 906 -1 23 40.21500 94.53500 + 40.3000000 94.3800000 + 40.2500000 94.3800000 + 40.2000000 94.3700000 + 40.1800000 94.3800000 + 40.1800000 94.4000000 + 40.1500000 94.4200000 + 40.1200000 94.4300000 + 40.1000000 94.4700000 + 40.1000000 94.4800000 + 40.0800000 94.5200000 + 40.0800000 94.5500000 + 40.0800000 94.5700000 + 40.1200000 94.5800000 + 40.1200000 94.6200000 + 40.1200000 94.6500000 + 40.1300000 94.6700000 + 40.2000000 94.6800000 + 40.2200000 94.7000000 + 40.2800000 94.6800000 + 40.3000000 94.6700000 + 40.3500000 94.6500000 + 40.3200000 94.5300000 + 40.3000000 94.3800000 +907 907 -1 34 40.73500 94.17500 + 40.9500000 94.2200000 + 40.9500000 94.1800000 + 40.9300000 94.1700000 + 40.9300000 94.1500000 + 40.9000000 94.1200000 + 40.8500000 94.1200000 + 40.8300000 94.1000000 + 40.8300000 94.0800000 + 40.8000000 94.0700000 + 40.7700000 94.0500000 + 40.7500000 94.0700000 + 40.7200000 94.0500000 + 40.7000000 94.0500000 + 40.6800000 94.0800000 + 40.6700000 94.0800000 + 40.6200000 94.1000000 + 40.6000000 94.1300000 + 40.5800000 94.1200000 + 40.5500000 94.1300000 + 40.5300000 94.1200000 + 40.5200000 94.1200000 + 40.5500000 94.2800000 + 40.5700000 94.3000000 + 40.5800000 94.2700000 + 40.6700000 94.2200000 + 40.7200000 94.2300000 + 40.7300000 94.2000000 + 40.7500000 94.1800000 + 40.8200000 94.1700000 + 40.8200000 94.1800000 + 40.8500000 94.1800000 + 40.8800000 94.2300000 + 40.9200000 94.2200000 + 40.9500000 94.2200000 +908 908 -1 21 40.37500 94.25000 + 40.5200000 94.1200000 + 40.5000000 94.1300000 + 40.4700000 94.1200000 + 40.4200000 94.1300000 + 40.3500000 94.1500000 + 40.3200000 94.2200000 + 40.2800000 94.2200000 + 40.2500000 94.2500000 + 40.2000000 94.2700000 + 40.2000000 94.3500000 + 40.1800000 94.3800000 + 40.2000000 94.3700000 + 40.2500000 94.3800000 + 40.3000000 94.3800000 + 40.3800000 94.3700000 + 40.4200000 94.3800000 + 40.4500000 94.3800000 + 40.5500000 94.3300000 + 40.5700000 94.3000000 + 40.5500000 94.2800000 + 40.5200000 94.1200000 +909 909 -1 32 40.18500 94.29500 + 40.3500000 94.1500000 + 40.3500000 94.1300000 + 40.3300000 94.1300000 + 40.3200000 94.1200000 + 40.2700000 94.1200000 + 40.2300000 94.1300000 + 40.2000000 94.1300000 + 40.1800000 94.1200000 + 40.0800000 94.1500000 + 40.0300000 94.1300000 + 40.0200000 94.1300000 + 40.0200000 94.1500000 + 40.0200000 94.1700000 + 40.0200000 94.1800000 + 40.0200000 94.2500000 + 40.0500000 94.3000000 + 40.0500000 94.3300000 + 40.0500000 94.3500000 + 40.0300000 94.3800000 + 40.0300000 94.4200000 + 40.0500000 94.4300000 + 40.1000000 94.4700000 + 40.1200000 94.4300000 + 40.1500000 94.4200000 + 40.1800000 94.4000000 + 40.1800000 94.3800000 + 40.2000000 94.3500000 + 40.2000000 94.2700000 + 40.2500000 94.2500000 + 40.2800000 94.2200000 + 40.3200000 94.2200000 + 40.3500000 94.1500000 +910 910 -1 38 39.90000 94.32500 + 40.1000000 94.4700000 + 40.0500000 94.4300000 + 40.0300000 94.4200000 + 40.0300000 94.3800000 + 40.0500000 94.3500000 + 40.0500000 94.3300000 + 40.0500000 94.3000000 + 40.0200000 94.2500000 + 40.0200000 94.1800000 + 40.0200000 94.1700000 + 40.0200000 94.1500000 + 40.0200000 94.1300000 + 39.9500000 94.1200000 + 39.9200000 94.1300000 + 39.8700000 94.1300000 + 39.8500000 94.1800000 + 39.8300000 94.1800000 + 39.8000000 94.2200000 + 39.7800000 94.2300000 + 39.7500000 94.2300000 + 39.7300000 94.2800000 + 39.7000000 94.3200000 + 39.7200000 94.3700000 + 39.7800000 94.3800000 + 39.7800000 94.4200000 + 39.8300000 94.4200000 + 39.8500000 94.4300000 + 39.9000000 94.4700000 + 39.9200000 94.4500000 + 39.9300000 94.4800000 + 39.9500000 94.4700000 + 40.0000000 94.4700000 + 40.0000000 94.4800000 + 40.0200000 94.5000000 + 40.0700000 94.5300000 + 40.0800000 94.5200000 + 40.1000000 94.4800000 + 40.1000000 94.4700000 +933 933 -1 25 41.19500 94.24500 + 41.3700000 94.4300000 + 41.3700000 94.3700000 + 41.3300000 94.3200000 + 41.3000000 94.3200000 + 41.2500000 94.2500000 + 41.2700000 94.2200000 + 41.2200000 94.2000000 + 41.1800000 94.1700000 + 41.1800000 94.1300000 + 41.1300000 94.0800000 + 41.1300000 94.0300000 + 41.1200000 94.0200000 + 41.0800000 94.1200000 + 41.0232900 94.2712300 + 41.0200000 94.2800000 + 41.0300000 94.3000000 + 41.0800000 94.3200000 + 41.1000000 94.3300000 + 41.1700000 94.3800000 + 41.2000000 94.4000000 + 41.2000000 94.4200000 + 41.2700000 94.4700000 + 41.3000000 94.4700000 + 41.3200000 94.4500000 + 41.3700000 94.4300000 +934 934 -1 26 40.94500 94.03562 + 41.1200000 94.0200000 + 41.1200000 93.9800000 + 41.0800000 93.9800000 + 41.0500000 93.9300000 + 41.0700000 93.9200000 + 41.0500000 93.8800000 + 41.0300000 93.9000000 + 41.0200000 93.8800000 + 40.9800000 93.8800000 + 40.9800000 93.8200000 + 40.9300000 93.8000000 + 40.8300000 93.9300000 + 40.7700000 94.0500000 + 40.8000000 94.0700000 + 40.8300000 94.0800000 + 40.8300000 94.1000000 + 40.8500000 94.1200000 + 40.9000000 94.1200000 + 40.9300000 94.1500000 + 40.9300000 94.1700000 + 40.9500000 94.1800000 + 40.9500000 94.2200000 + 41.0200000 94.2500000 + 41.0232900 94.2712300 + 41.0800000 94.1200000 + 41.1200000 94.0200000 +BAYI4 BAYI4 -1 18 41.99500 94.76000 + 42.2200000 95.0000000 + 42.1800000 94.8900000 + 42.1200000 94.7500000 + 42.0200000 94.6100000 + 41.9900000 94.5300000 + 41.9700000 94.5100000 + 41.8600000 94.5100000 + 41.8400000 94.4900000 + 41.7800000 94.5000000 + 41.7700000 94.5300000 + 41.8300000 94.6700000 + 41.9000000 94.7500000 + 41.9300000 94.8200000 + 42.0500000 94.9500000 + 42.1200000 95.0200000 + 42.1500000 95.0300000 + 42.2000000 95.0200000 + 42.2200000 95.0000000 +EFWI4 EFWI4 -1 43 42.28000 94.74000 + 42.6200000 94.7300000 + 42.6000000 94.6900000 + 42.5900000 94.6600000 + 42.5400000 94.5800000 + 42.5200000 94.4900000 + 42.5100000 94.4500000 + 42.4900000 94.4200000 + 42.4300000 94.3700000 + 42.4200000 94.3600000 + 42.4000000 94.3800000 + 42.2700000 94.4900000 + 42.2200000 94.5100000 + 42.1700000 94.5100000 + 42.1200000 94.4900000 + 42.0700000 94.4400000 + 42.0200000 94.3600000 + 42.0000000 94.3600000 + 41.9900000 94.3800000 + 41.9500000 94.3800000 + 41.9400000 94.4000000 + 41.9800000 94.4700000 + 41.9900000 94.5300000 + 42.0200000 94.6100000 + 42.1200000 94.7500000 + 42.1800000 94.8900000 + 42.2200000 95.0000000 + 42.2300000 95.0300000 + 42.2700000 95.0500000 + 42.3200000 95.0300000 + 42.3200000 95.0700000 + 42.3700000 95.0800000 + 42.4700000 95.1000000 + 42.5000000 95.1200000 + 42.5200000 95.1000000 + 42.5000000 95.0800000 + 42.4500000 95.0500000 + 42.3800000 95.0300000 + 42.3000000 94.9800000 + 42.3700000 94.9400000 + 42.3800000 94.8900000 + 42.4300000 94.8500000 + 42.5300000 94.8000000 + 42.6200000 94.7300000 +FCKN1HW PAPILLION CR. NR FT. CROOK NE -1 369 41.34750 96.14417 + 41.1183130 95.9379170 + 41.1204170 95.9608540 + 41.1183540 95.9629170 + 41.1099790 95.9629170 + 41.1058540 95.9670830 + 41.1016460 95.9670830 + 41.0995830 95.9691460 + 41.0995830 95.9733540 + 41.1162500 95.9899790 + 41.1162500 96.0025210 + 41.1183130 96.0045830 + 41.1225210 96.0045830 + 41.1245830 96.0066460 + 41.1245830 96.0108540 + 41.1224790 96.0129170 + 41.1204170 96.0150210 + 41.1162500 96.0191460 + 41.1162500 96.0275210 + 41.1141460 96.0295830 + 41.1120830 96.0400210 + 41.1141880 96.0420830 + 41.1162500 96.0483540 + 41.1183540 96.0504170 + 41.1204170 96.0525210 + 41.1225210 96.0545830 + 41.1245830 96.0608540 + 41.1224790 96.0629170 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1225210 96.1004170 + 41.1245830 96.1025210 + 41.1266880 96.1045830 + 41.1287500 96.1066880 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1649790 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1183130 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2066460 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3058540 96.2587500 + 41.3079170 96.2608130 + 41.3099790 96.2629170 + 41.3120830 96.2608540 + 41.3141460 96.2587500 + 41.3162500 96.2566880 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3245830 96.2483130 + 41.3266460 96.2462500 + 41.3287500 96.2483130 + 41.3308130 96.2504170 + 41.3329170 96.2524790 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566460 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4412500 96.2983130 + 41.4412500 96.3025210 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5329170 96.2858130 + 41.5349790 96.2837500 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5558540 96.2712500 + 41.5579170 96.2691880 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5558540 96.2045830 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4224790 96.1212500 + 41.4204170 96.1191880 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4287500 96.0733540 + 41.4308130 96.0712500 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3600210 96.0254170 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3245830 96.0191880 + 41.3245830 96.0024790 + 41.3225210 96.0004170 + 41.3141460 96.0004170 + 41.3120830 95.9983540 + 41.3100210 95.9962500 + 41.2933130 95.9962500 + 41.2912500 95.9983130 + 41.2891880 96.0004170 + 41.2870830 96.0024790 + 41.2850210 96.0045830 + 41.2829170 96.0025210 + 41.2829170 95.9858130 + 41.2725210 95.9754170 + 41.2704170 95.9733540 + 41.2683540 95.9712500 + 41.2599790 95.9712500 + 41.2474790 95.9670830 + 41.2454170 95.9670830 + 41.2454170 95.9691880 + 41.2433540 95.9712500 + 41.2391460 95.9712500 + 41.2370830 95.9733130 + 41.2350210 95.9754170 + 41.2099790 95.9754170 + 41.2079170 95.9733540 + 41.2058540 95.9712500 + 41.1974790 95.9712500 + 41.1954170 95.9691880 + 41.1933540 95.9670830 + 41.1912500 95.9650210 + 41.1912500 95.9608130 + 41.1891880 95.9587500 + 41.1849790 95.9587500 + 41.1829170 95.9566880 + 41.1829170 95.9524790 + 41.1808540 95.9504170 + 41.1787500 95.9483540 + 41.1808130 95.9462500 + 41.1891880 95.9462500 + 41.1912500 95.9441880 + 41.1912500 95.9399790 + 41.1787500 95.9233130 + 41.1766880 95.9212500 + 41.1724790 95.9212500 + 41.1704170 95.9191880 + 41.1683540 95.9170830 + 41.1641460 95.9170830 + 41.1620830 95.9150210 + 41.1620830 95.9108130 + 41.1600210 95.9087500 + 41.1579170 95.9066880 + 41.1558540 95.9045830 + 41.1474790 95.9045830 + 41.1454170 95.9066460 + 41.1433540 95.9087500 + 41.1391460 95.9087500 + 41.1370830 95.9108130 + 41.1350210 95.9129170 + 41.1329170 95.9149790 + 41.1308540 95.9170830 + 41.1266460 95.9170830 + 41.1245830 95.9191460 + 41.1225210 95.9212500 + 41.1204170 95.9233130 + 41.1204170 95.9316880 + 41.1183130 95.9379170 +HBLN1HW N.F. BIG NEMAHA RIVER AT HUMBOLT NE -1 528 40.34333 96.27750 + 40.1537500 95.9420830 + 40.1287500 95.9691880 + 40.1245830 95.9733130 + 40.1245830 95.9775210 + 40.1225210 95.9795830 + 40.1141460 95.9795830 + 40.1120830 95.9816460 + 40.1120830 95.9858540 + 40.1099790 95.9879170 + 40.1058540 95.9920830 + 40.1016460 95.9920830 + 40.0995830 95.9941880 + 40.0954170 95.9983130 + 40.0954170 96.0108540 + 40.0975210 96.0129170 + 40.0995830 96.0149790 + 40.0995830 96.0233540 + 40.0974790 96.0254170 + 40.0954170 96.0274790 + 40.0954170 96.0358540 + 40.0933540 96.0379170 + 40.0891460 96.0379170 + 40.0870830 96.0399790 + 40.0870830 96.0650210 + 40.0850210 96.0670830 + 40.0808130 96.0670830 + 40.0787500 96.0691880 + 40.0766460 96.0712500 + 40.0745830 96.0733130 + 40.0745830 96.0858540 + 40.0766460 96.0879170 + 40.0808540 96.0879170 + 40.0829170 96.0900210 + 40.0850210 96.0920830 + 40.0891460 96.0962500 + 40.0933540 96.0962500 + 40.0954170 96.0983540 + 40.0974790 96.1004170 + 40.1016880 96.1004170 + 40.1037500 96.1025210 + 40.1058540 96.1045830 + 40.1079170 96.1066880 + 40.1120830 96.1108540 + 40.1099790 96.1129170 + 40.1079170 96.1149790 + 40.1079170 96.1295830 + 40.1141460 96.1337500 + 40.1183540 96.1337500 + 40.1204170 96.1358130 + 40.1245830 96.1441460 + 40.1245830 96.1525210 + 40.1266460 96.1545830 + 40.1308540 96.1545830 + 40.1329170 96.1566460 + 40.1329170 96.1608540 + 40.1350210 96.1629170 + 40.1391460 96.1670830 + 40.1433540 96.1670830 + 40.1495830 96.1733130 + 40.1495830 96.1775210 + 40.1516460 96.1795830 + 40.1558540 96.1795830 + 40.1579170 96.1774790 + 40.1600210 96.1754170 + 40.1620830 96.1775210 + 40.1641460 96.1795830 + 40.1683540 96.1795830 + 40.1704170 96.1816460 + 40.1704170 96.1858540 + 40.1766460 96.1920830 + 40.1808540 96.1920830 + 40.1829170 96.1941460 + 40.1829170 96.1983540 + 40.1849790 96.2004170 + 40.1933540 96.2004170 + 40.1954170 96.2024790 + 40.1974790 96.2129170 + 40.2100210 96.2129170 + 40.2120830 96.2150210 + 40.2141880 96.2170830 + 40.2162500 96.2191880 + 40.2183540 96.2212500 + 40.2204170 96.2233540 + 40.2224790 96.2254170 + 40.2266880 96.2254170 + 40.2287500 96.2275210 + 40.2308540 96.2295830 + 40.2329170 96.2316880 + 40.2350210 96.2337500 + 40.2370830 96.2358130 + 40.2433130 96.2462500 + 40.2475210 96.2462500 + 40.2599790 96.2587500 + 40.2683540 96.2587500 + 40.2704170 96.2608130 + 40.3037500 96.3024790 + 40.3037500 96.3150210 + 40.3058130 96.3170830 + 40.3204170 96.3233130 + 40.3204170 96.3316880 + 40.3225210 96.3337500 + 40.3245830 96.3358130 + 40.3245830 96.3483540 + 40.3225210 96.3504170 + 40.2891460 96.3504170 + 40.2870830 96.3524790 + 40.2870830 96.3566880 + 40.2891880 96.3587500 + 40.2912500 96.3608130 + 40.2912500 96.3650210 + 40.2891880 96.3670830 + 40.2849790 96.3670830 + 40.2829170 96.3691460 + 40.2829170 96.3733540 + 40.2808130 96.3754170 + 40.2787500 96.3775210 + 40.2766460 96.3795830 + 40.2745830 96.3816460 + 40.2745830 96.3941880 + 40.2766880 96.3962500 + 40.2787500 96.3983130 + 40.2787500 96.4150210 + 40.2766460 96.4170830 + 40.2745830 96.4191460 + 40.2745830 96.4233540 + 40.2724790 96.4254170 + 40.2704170 96.4274790 + 40.2704170 96.4400210 + 40.2683130 96.4420830 + 40.2662500 96.4441460 + 40.2662500 96.4525210 + 40.2641880 96.4545830 + 40.2599790 96.4545830 + 40.2579170 96.4566880 + 40.2558130 96.4587500 + 40.2537500 96.4608130 + 40.2537500 96.4650210 + 40.2516460 96.4670830 + 40.2495830 96.4670830 + 40.2454170 96.4733130 + 40.2454170 96.4941880 + 40.2454170 96.4962500 + 40.2599790 96.5004170 + 40.2641880 96.5004170 + 40.2662500 96.4983130 + 40.2683130 96.4962500 + 40.2725210 96.4962500 + 40.2745830 96.4941460 + 40.2766880 96.4920830 + 40.2787500 96.4900210 + 40.2787500 96.4733130 + 40.2808540 96.4712500 + 40.2829170 96.4691460 + 40.2850210 96.4670830 + 40.2870830 96.4691880 + 40.2891460 96.4712500 + 40.2933540 96.4712500 + 40.2954170 96.4733540 + 40.2975210 96.4754170 + 40.2995830 96.4775210 + 40.3016460 96.4795830 + 40.3058540 96.4795830 + 40.3079170 96.4816460 + 40.3079170 96.4858540 + 40.3100210 96.4879170 + 40.3120830 96.4900210 + 40.3141460 96.4920830 + 40.3266880 96.4920830 + 40.3287500 96.4899790 + 40.3308130 96.4879170 + 40.3391880 96.4879170 + 40.3412500 96.4900210 + 40.3433540 96.4920830 + 40.3454170 96.4941880 + 40.3474790 96.4962500 + 40.3516880 96.4962500 + 40.3537500 96.4983540 + 40.3558540 96.5004170 + 40.3579170 96.5024790 + 40.3579170 96.5066880 + 40.3600210 96.5087500 + 40.3620830 96.5108130 + 40.3620830 96.5191880 + 40.3641460 96.5212500 + 40.3725210 96.5212500 + 40.3745830 96.5233540 + 40.3766460 96.5254170 + 40.3891880 96.5254170 + 40.3912500 96.5275210 + 40.3933540 96.5295830 + 40.3954170 96.5316460 + 40.3954170 96.5358540 + 40.3975210 96.5379170 + 40.3995830 96.5358130 + 40.4016460 96.5337500 + 40.4058540 96.5337500 + 40.4079170 96.5358130 + 40.4079170 96.5400210 + 40.4100210 96.5420830 + 40.4120830 96.5441460 + 40.4120830 96.5775210 + 40.4141880 96.5795830 + 40.4162500 96.5816460 + 40.4162500 96.5900210 + 40.4183130 96.5920830 + 40.4266880 96.5920830 + 40.4287500 96.5941880 + 40.4308540 96.5962500 + 40.4329170 96.5983130 + 40.4329170 96.6150210 + 40.4350210 96.6170830 + 40.4370830 96.6191880 + 40.4391880 96.6212500 + 40.4412500 96.6233130 + 40.4412500 96.6316880 + 40.4433540 96.6337500 + 40.4454170 96.6358540 + 40.4475210 96.6379170 + 40.4495830 96.6400210 + 40.4516880 96.6420830 + 40.4537500 96.6441880 + 40.4558130 96.6462500 + 40.4600210 96.6462500 + 40.4620830 96.6483540 + 40.4641880 96.6504170 + 40.4662500 96.6525210 + 40.4683540 96.6545830 + 40.4704170 96.6566880 + 40.4724790 96.6587500 + 40.4766880 96.6587500 + 40.4787500 96.6566460 + 40.4808540 96.6545830 + 40.4829170 96.6524790 + 40.4849790 96.6504170 + 40.4933130 96.6545830 + 40.4975210 96.6545830 + 40.4995830 96.6566460 + 40.5120830 96.6774790 + 40.5120830 96.6858540 + 40.5141880 96.6879170 + 40.5162500 96.6900210 + 40.5183540 96.6920830 + 40.5204170 96.6941460 + 40.5224790 96.7004170 + 40.5266880 96.7004170 + 40.5287500 96.7024790 + 40.5329170 96.7108540 + 40.5308130 96.7129170 + 40.5287500 96.7150210 + 40.5266460 96.7170830 + 40.5245830 96.7191460 + 40.5245830 96.7233540 + 40.5266880 96.7254170 + 40.5287500 96.7274790 + 40.5287500 96.7358540 + 40.5308540 96.7379170 + 40.5329170 96.7399790 + 40.5329170 96.7483540 + 40.5329170 96.7504170 + 40.5350210 96.7504170 + 40.5370830 96.7524790 + 40.5391460 96.7545830 + 40.5516880 96.7545830 + 40.5537500 96.7525210 + 40.5558130 96.7504170 + 40.5579170 96.7483540 + 40.5599790 96.7462500 + 40.5620830 96.7441880 + 40.5620830 96.7191460 + 40.5641460 96.7170830 + 40.5662500 96.7150210 + 40.5683130 96.7129170 + 40.5704170 96.7108540 + 40.5704170 96.7066460 + 40.5724790 96.7045830 + 40.5745830 96.7025210 + 40.5745830 96.6941460 + 40.5725210 96.6920830 + 40.5704170 96.6900210 + 40.5704170 96.6816460 + 40.5683540 96.6795830 + 40.5662500 96.6775210 + 40.5662500 96.6608130 + 40.5641880 96.6587500 + 40.5620830 96.6566880 + 40.5620830 96.6524790 + 40.5600210 96.6504170 + 40.5558130 96.6504170 + 40.5537500 96.6483540 + 40.5537500 96.6399790 + 40.5558130 96.6379170 + 40.5579170 96.6358540 + 40.5599790 96.6337500 + 40.5620830 96.6316880 + 40.5600210 96.6295830 + 40.5579170 96.6275210 + 40.5579170 96.6191460 + 40.5558540 96.6170830 + 40.5537500 96.6150210 + 40.5537500 96.5941460 + 40.5558130 96.5920830 + 40.5579170 96.5900210 + 40.5599790 96.5879170 + 40.5620830 96.5858540 + 40.5641460 96.5837500 + 40.5662500 96.5816880 + 40.5641880 96.5795830 + 40.5620830 96.5775210 + 40.5641460 96.5754170 + 40.5662500 96.5733540 + 40.5662500 96.5691460 + 40.5683130 96.5670830 + 40.5704170 96.5650210 + 40.5704170 96.5608130 + 40.5724790 96.5587500 + 40.5745830 96.5566880 + 40.5745830 96.5524790 + 40.5766460 96.5504170 + 40.5787500 96.5483540 + 40.5808130 96.5462500 + 40.5829170 96.5441880 + 40.5829170 96.5316460 + 40.5849790 96.5295830 + 40.5891880 96.5295830 + 40.5912500 96.5275210 + 40.5933130 96.5254170 + 40.5975210 96.5254170 + 40.6100210 96.5129170 + 40.6120830 96.5129170 + 40.6120830 96.5108130 + 40.6100210 96.5087500 + 40.6058130 96.5087500 + 40.6037500 96.5066880 + 40.6016880 96.5045830 + 40.5933130 96.5045830 + 40.5912500 96.5025210 + 40.5891880 96.5004170 + 40.5870830 96.4983540 + 40.5850210 96.4962500 + 40.5829170 96.4941880 + 40.5808540 96.4920830 + 40.5787500 96.4900210 + 40.5787500 96.4774790 + 40.5766880 96.4754170 + 40.5745830 96.4733540 + 40.5725210 96.4712500 + 40.5704170 96.4691880 + 40.5683540 96.4670830 + 40.5662500 96.4650210 + 40.5662500 96.4608130 + 40.5641880 96.4587500 + 40.5620830 96.4566880 + 40.5620830 96.4524790 + 40.5600210 96.4504170 + 40.5579170 96.4483540 + 40.5579170 96.4441460 + 40.5558540 96.4420830 + 40.5516460 96.4420830 + 40.5495830 96.4400210 + 40.5475210 96.4379170 + 40.5454170 96.4358540 + 40.5433540 96.4337500 + 40.5391460 96.4337500 + 40.5350210 96.4295830 + 40.5329170 96.4275210 + 40.5329170 96.4191460 + 40.5308540 96.4170830 + 40.5287500 96.4150210 + 40.5266880 96.4129170 + 40.5245830 96.4108540 + 40.5245830 96.3983130 + 40.5225210 96.3962500 + 40.5204170 96.3941880 + 40.5204170 96.3774790 + 40.5183540 96.3754170 + 40.5162500 96.3733540 + 40.5141880 96.3712500 + 40.5058130 96.3712500 + 40.5037500 96.3691880 + 40.5016880 96.3670830 + 40.4974790 96.3670830 + 40.4954170 96.3650210 + 40.4933540 96.3629170 + 40.4766460 96.3629170 + 40.4745830 96.3608540 + 40.4745830 96.3566460 + 40.4725210 96.3545830 + 40.4704170 96.3525210 + 40.4704170 96.3441460 + 40.4683540 96.3420830 + 40.4662500 96.3400210 + 40.4683130 96.3379170 + 40.4704170 96.3358540 + 40.4704170 96.3274790 + 40.4683540 96.3254170 + 40.4620830 96.3233540 + 40.4600210 96.3129170 + 40.4558540 96.3087500 + 40.4537500 96.3066880 + 40.4537500 96.2899790 + 40.4516880 96.2879170 + 40.4495830 96.2858540 + 40.4495830 96.2816460 + 40.4475210 96.2795830 + 40.4454170 96.2775210 + 40.4433540 96.2754170 + 40.4391460 96.2754170 + 40.4370830 96.2733540 + 40.4350210 96.2712500 + 40.4329170 96.2691880 + 40.4308540 96.2670830 + 40.4287500 96.2650210 + 40.4308130 96.2629170 + 40.4329170 96.2608540 + 40.4329170 96.2566460 + 40.4308540 96.2545830 + 40.4287500 96.2525210 + 40.4287500 96.2441460 + 40.4308130 96.2420830 + 40.4350210 96.2420830 + 40.4370830 96.2400210 + 40.4370830 96.2358130 + 40.4350210 96.2337500 + 40.4329170 96.2316880 + 40.4329170 96.2274790 + 40.4308540 96.2254170 + 40.4287500 96.2233540 + 40.4266880 96.2212500 + 40.4224790 96.2212500 + 40.4204170 96.2191880 + 40.4204170 96.1941460 + 40.4183540 96.1920830 + 40.4141460 96.1920830 + 40.4037500 96.1733130 + 40.4016880 96.1712500 + 40.3995830 96.1691880 + 40.3975210 96.1670830 + 40.3891460 96.1670830 + 40.3870830 96.1650210 + 40.3850210 96.1629170 + 40.3808130 96.1629170 + 40.3787500 96.1608540 + 40.3787500 96.1399790 + 40.3766880 96.1379170 + 40.3641460 96.1379170 + 40.3620830 96.1358540 + 40.3600210 96.1337500 + 40.3558130 96.1337500 + 40.3537500 96.1316880 + 40.3537500 96.1274790 + 40.3516880 96.1254170 + 40.3474790 96.1254170 + 40.3454170 96.1233540 + 40.3474790 96.1212500 + 40.3495830 96.1191880 + 40.3495830 96.1066460 + 40.3516460 96.1045830 + 40.3558540 96.1045830 + 40.3579170 96.1025210 + 40.3579170 96.0899790 + 40.3558540 96.0879170 + 40.3537500 96.0858540 + 40.3537500 96.0774790 + 40.3579170 96.0691460 + 40.3579170 96.0670830 + 40.3558130 96.0670830 + 40.3537500 96.0650210 + 40.3516880 96.0629170 + 40.3495830 96.0608540 + 40.3475210 96.0587500 + 40.3433130 96.0587500 + 40.3412500 96.0566880 + 40.3391880 96.0545830 + 40.3370830 96.0525210 + 40.3350210 96.0504170 + 40.3329170 96.0483540 + 40.3329170 96.0399790 + 40.3308540 96.0379170 + 40.3287500 96.0358540 + 40.3287500 96.0274790 + 40.3266880 96.0254170 + 40.3224790 96.0254170 + 40.3204170 96.0233540 + 40.3183540 96.0212500 + 40.3141460 96.0212500 + 40.3120830 96.0191880 + 40.3100210 96.0170830 + 40.3079170 96.0150210 + 40.3058540 96.0129170 + 40.2954170 96.0025210 + 40.2954170 95.9899790 + 40.2933540 95.9879170 + 40.2912500 95.9858540 + 40.2912500 95.9774790 + 40.2891880 95.9754170 + 40.2849790 95.9754170 + 40.2829170 95.9733540 + 40.2808540 95.9712500 + 40.2724790 95.9712500 + 40.2704170 95.9691880 + 40.2683540 95.9670830 + 40.2662500 95.9650210 + 40.2641880 95.9629170 + 40.2558540 95.9587500 + 40.2516460 95.9587500 + 40.2495830 95.9566880 + 40.2475210 95.9545830 + 40.2391460 95.9545830 + 40.2370830 95.9525210 + 40.2350210 95.9504170 + 40.2329170 95.9483540 + 40.2225210 95.9337500 + 40.2141460 95.9337500 + 40.2058130 95.9254170 + 40.2037500 95.9254170 + 40.2016880 95.9295830 + 40.1974790 95.9295830 + 40.1933540 95.9337500 + 40.1891460 95.9337500 + 40.1870830 95.9358540 + 40.1849790 95.9379170 + 40.1829170 95.9399790 + 40.1829170 95.9441880 + 40.1808540 95.9462500 + 40.1641460 95.9462500 + 40.1620830 95.9441460 + 40.1600210 95.9420830 + 40.1537500 95.9420830 +IDNI4 IDNI4 -1 48 41.37000 93.66875 + 41.6200000 94.6500000 + 41.6000000 94.6300000 + 41.5700000 94.5500000 + 41.5300000 94.5100000 + 41.5100000 94.4700000 + 41.4800000 94.4500000 + 41.4200000 94.3900000 + 41.3900000 94.3400000 + 41.3300000 94.2400000 + 41.3100000 94.1600000 + 41.3100000 94.0800000 + 41.3200000 93.9900000 + 41.3400000 93.9100000 + 41.3800000 93.7200000 + 41.4000000 93.6700000 + 41.4300000 93.6500000 + 41.4300000 93.5700000 + 41.3800000 93.5600000 + 41.3500000 93.5900000 + 41.2900000 93.7600000 + 41.2500000 93.8000000 + 41.2200000 93.8300000 + 41.1700000 93.8600000 + 41.1400000 93.9100000 + 41.1300000 93.9900000 + 41.1200000 94.0200000 + 41.1300000 94.0300000 + 41.1300000 94.0800000 + 41.1800000 94.1300000 + 41.1800000 94.1700000 + 41.2200000 94.2000000 + 41.2700000 94.2200000 + 41.2500000 94.2500000 + 41.3000000 94.3200000 + 41.3300000 94.3200000 + 41.3700000 94.3700000 + 41.3700000 94.4300000 + 41.3700000 94.4700000 + 41.3700000 94.4800000 + 41.4700000 94.5700000 + 41.4500000 94.5700000 + 41.4700000 94.6200000 + 41.4800000 94.6300000 + 41.5300000 94.6700000 + 41.5700000 94.6700000 + 41.5800000 94.7000000 + 41.6000000 94.7000000 + 41.6200000 94.6500000 +IRVN1HW LTL PAPILLION CRK AT IRVINGTON, NE -1 76 41.36833 96.06917 + 41.3079170 96.0504170 + 41.3120830 96.0775210 + 41.3141460 96.0795830 + 41.3225210 96.0795830 + 41.3433130 96.1004170 + 41.3475210 96.1004170 + 41.3495830 96.1025210 + 41.3516880 96.1045830 + 41.3558130 96.1087500 + 41.3641880 96.1087500 + 41.3662500 96.1108540 + 41.3683130 96.1129170 + 41.3725210 96.1129170 + 41.3745830 96.1150210 + 41.3766460 96.1170830 + 41.3808540 96.1170830 + 41.3829170 96.1191880 + 41.3850210 96.1212500 + 41.3870830 96.1233540 + 41.3891460 96.1254170 + 41.3975210 96.1254170 + 41.3995830 96.1275210 + 41.4016460 96.1295830 + 41.4100210 96.1295830 + 41.4120830 96.1274790 + 41.4141880 96.1254170 + 41.4162500 96.1233130 + 41.4183540 96.1212500 + 41.4204170 96.1212500 + 41.4204170 96.1191460 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3183130 96.0212500 + 41.3162500 96.0233130 + 41.3141880 96.0254170 + 41.3120830 96.0274790 + 41.3120830 96.0316880 + 41.3079170 96.0358130 + 41.3058540 96.0379170 + 41.3037500 96.0399790 + 41.3079170 96.0504170 +LCNN1HW SALT CR. AT LINCOLN NE -1 485 40.87250 96.86500 + 40.8454170 96.6795830 + 40.8224790 96.6670830 + 40.8141880 96.6587500 + 40.8058130 96.6587500 + 40.8037500 96.6566880 + 40.8016880 96.6545830 + 40.7995830 96.6525210 + 40.7995830 96.6483130 + 40.7975210 96.6462500 + 40.7954170 96.6441880 + 40.7954170 96.6274790 + 40.7933540 96.6254170 + 40.7912500 96.6233540 + 40.7891880 96.6212500 + 40.7870830 96.6191880 + 40.7870830 96.6108130 + 40.7850210 96.6087500 + 40.7724790 96.6087500 + 40.7704170 96.6066880 + 40.7683540 96.6045830 + 40.7662500 96.6025210 + 40.7600210 96.5962500 + 40.7558130 96.5962500 + 40.7537500 96.5941880 + 40.7516880 96.5920830 + 40.7308130 96.5920830 + 40.7287500 96.5941460 + 40.7266880 96.5962500 + 40.7245830 96.5941880 + 40.7225210 96.5920830 + 40.7183130 96.5920830 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6399790 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5245830 96.7608540 + 40.5266880 96.7629170 + 40.5287500 96.7650210 + 40.5308540 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5350210 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391880 96.7920830 + 40.5412500 96.7941880 + 40.5391460 96.7962500 + 40.5370830 96.7983540 + 40.5391880 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391460 96.8129170 + 40.5370830 96.8150210 + 40.5349790 96.8170830 + 40.5329170 96.8191880 + 40.5308130 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8587500 + 40.5245830 96.8608540 + 40.5224790 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8775210 + 40.5308540 96.8795830 + 40.5329170 96.8816880 + 40.5350210 96.8837500 + 40.5370830 96.8858540 + 40.5391880 96.8879170 + 40.5412500 96.8900210 + 40.5433540 96.8920830 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983540 + 40.5600210 96.9004170 + 40.5620830 96.9025210 + 40.5641880 96.9045830 + 40.5662500 96.9066880 + 40.5683540 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808540 96.9212500 + 40.5829170 96.9191460 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191880 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233540 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308540 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6350210 96.9004170 + 40.6370830 96.8983540 + 40.6370830 96.8941460 + 40.6391880 96.8920830 + 40.6412500 96.8899790 + 40.6433540 96.8879170 + 40.6454170 96.8900210 + 40.6475210 96.8920830 + 40.6495830 96.8941460 + 40.6495830 96.9025210 + 40.6516460 96.9045830 + 40.6725210 96.9045830 + 40.6745830 96.9066460 + 40.6745830 96.9150210 + 40.6724790 96.9170830 + 40.6704170 96.9191460 + 40.6704170 96.9233540 + 40.6725210 96.9254170 + 40.6745830 96.9275210 + 40.6870830 96.9399790 + 40.6870830 96.9525210 + 40.6891880 96.9545830 + 40.6912500 96.9566880 + 40.6933130 96.9587500 + 40.7016880 96.9587500 + 40.7037500 96.9608540 + 40.7058130 96.9629170 + 40.7391880 96.9629170 + 40.7412500 96.9649790 + 40.7412500 96.9691880 + 40.7433540 96.9712500 + 40.7454170 96.9733130 + 40.7454170 96.9775210 + 40.7475210 96.9795830 + 40.7495830 96.9816880 + 40.7516880 96.9837500 + 40.7537500 96.9858540 + 40.7558540 96.9879170 + 40.7579170 96.9899790 + 40.7579170 96.9941880 + 40.7599790 96.9962500 + 40.7683540 96.9962500 + 40.7704170 96.9983540 + 40.7725210 97.0004170 + 40.7766880 97.0045830 + 40.7787500 97.0024790 + 40.7808130 97.0004170 + 40.7850210 97.0004170 + 40.7870830 96.9983130 + 40.7891460 96.9962500 + 40.7933540 96.9962500 + 40.7954170 96.9983540 + 40.7974790 97.0004170 + 40.8225210 97.0004170 + 40.8245830 97.0025210 + 40.8266880 97.0045830 + 40.8287500 97.0066880 + 40.8308130 97.0087500 + 40.8516880 97.0087500 + 40.8537500 97.0108540 + 40.8558130 97.0129170 + 40.8641880 97.0129170 + 40.8662500 97.0108130 + 40.8683130 97.0087500 + 40.8933540 97.0087500 + 40.8954170 97.0108540 + 40.8975210 97.0129170 + 40.8995830 97.0150210 + 40.9016880 97.0170830 + 40.9037500 97.0149790 + 40.9058130 97.0129170 + 40.9100210 97.0129170 + 40.9120830 97.0108130 + 40.9183540 97.0087500 + 40.9204170 97.0108540 + 40.9224790 97.0129170 + 40.9266880 97.0129170 + 40.9287500 97.0108130 + 40.9308540 97.0087500 + 40.9329170 97.0066460 + 40.9350210 97.0045830 + 40.9370830 97.0025210 + 40.9370830 96.9941460 + 40.9391880 96.9920830 + 40.9412500 96.9899790 + 40.9433130 96.9879170 + 40.9475210 96.9879170 + 40.9495830 96.9858130 + 40.9516460 96.9837500 + 40.9558540 96.9837500 + 40.9579170 96.9858540 + 40.9600210 96.9879170 + 40.9620830 96.9899790 + 40.9620830 97.0025210 + 40.9641460 97.0045830 + 40.9683540 97.0045830 + 40.9704170 97.0066880 + 40.9725210 97.0087500 + 40.9745830 97.0108130 + 40.9745830 97.0233540 + 40.9766460 97.0254170 + 40.9975210 97.0254170 + 40.9995830 97.0275210 + 41.0016460 97.0295830 + 41.0058540 97.0295830 + 41.0079170 97.0316460 + 41.0141460 97.0420830 + 41.0225210 97.0420830 + 41.0245830 97.0441880 + 41.0266880 97.0462500 + 41.0287500 97.0441460 + 41.0308130 97.0420830 + 41.0350210 97.0420830 + 41.0370830 97.0399790 + 41.0391880 97.0379170 + 41.0412500 97.0358130 + 41.0433130 97.0337500 + 41.0475210 97.0337500 + 41.0495830 97.0316460 + 41.0516880 97.0295830 + 41.0537500 97.0275210 + 41.0537500 97.0233130 + 41.0558540 97.0212500 + 41.0579170 97.0191460 + 41.0599790 97.0170830 + 41.0766880 97.0170830 + 41.0787500 97.0191880 + 41.0808540 97.0212500 + 41.0829170 97.0233540 + 41.0849790 97.0254170 + 41.0975210 97.0254170 + 41.0995830 97.0233130 + 41.1016880 97.0212500 + 41.1037500 97.0191460 + 41.1058540 97.0170830 + 41.1079170 97.0150210 + 41.1079170 97.0108130 + 41.1141880 97.0087500 + 41.1162500 97.0066460 + 41.1183540 97.0045830 + 41.1204170 97.0024790 + 41.1225210 97.0004170 + 41.1245830 96.9983130 + 41.1266460 96.9962500 + 41.1391880 96.9962500 + 41.1412500 96.9941460 + 41.1433540 96.9920830 + 41.1454170 96.9941460 + 41.1454170 96.9983540 + 41.1474790 97.0004170 + 41.1766880 97.0004170 + 41.1787500 97.0025210 + 41.1808540 97.0045830 + 41.1829170 97.0066880 + 41.1891880 97.0087500 + 41.1912500 97.0066460 + 41.1933130 97.0045830 + 41.2016880 97.0045830 + 41.2037500 97.0066880 + 41.2100210 97.0087500 + 41.2120830 97.0108540 + 41.2183540 97.0129170 + 41.2204170 97.0129170 + 41.2204170 97.0024790 + 41.2224790 97.0004170 + 41.2245830 96.9983540 + 41.2245830 96.9899790 + 41.2225210 96.9879170 + 41.2204170 96.9858540 + 41.2183540 96.9837500 + 41.2162500 96.9816880 + 41.2162500 96.9774790 + 41.2183130 96.9754170 + 41.2204170 96.9733540 + 41.2183540 96.9712500 + 41.2141460 96.9712500 + 41.2120830 96.9691880 + 41.2120830 96.9649790 + 41.2100210 96.9629170 + 41.2079170 96.9608540 + 41.2079170 96.9274790 + 41.2058540 96.9254170 + 41.2037500 96.9233540 + 41.2037500 96.9149790 + 41.2058130 96.9129170 + 41.2079170 96.9108540 + 41.2058540 96.9087500 + 41.2037500 96.9066880 + 41.2120830 96.8941460 + 41.2120830 96.8920830 + 41.2099790 96.8920830 + 41.2079170 96.8900210 + 41.2079170 96.8858130 + 41.2058540 96.8837500 + 41.2016460 96.8837500 + 41.1995830 96.8816880 + 41.1975210 96.8795830 + 41.1954170 96.8775210 + 41.1933540 96.8754170 + 41.1891460 96.8754170 + 41.1870830 96.8733540 + 41.1850210 96.8712500 + 41.1829170 96.8691880 + 41.1808540 96.8670830 + 41.1787500 96.8650210 + 41.1766880 96.8629170 + 41.1745830 96.8608540 + 41.1745830 96.8524790 + 41.1725210 96.8504170 + 41.1683130 96.8504170 + 41.1600210 96.8420830 + 41.1391460 96.8420830 + 41.1370830 96.8400210 + 41.1370830 96.8358130 + 41.1329170 96.8316460 + 41.1329170 96.8295830 + 41.1266460 96.8295830 + 41.1245830 96.8275210 + 41.1245830 96.8149790 + 41.1183540 96.8087500 + 41.1141460 96.8087500 + 41.1120830 96.8066880 + 41.1100210 96.8004170 + 41.1016460 96.8004170 + 41.0995830 96.7983540 + 41.0975210 96.7962500 + 41.0808130 96.7962500 + 41.0787500 96.7983130 + 41.0766880 96.8004170 + 41.0745830 96.7983540 + 41.0725210 96.7962500 + 41.0704170 96.7941880 + 41.0683540 96.7920830 + 41.0662500 96.7900210 + 41.0641880 96.7879170 + 41.0391460 96.7879170 + 41.0370830 96.7858540 + 41.0350210 96.7837500 + 41.0183130 96.7837500 + 41.0162500 96.7858130 + 41.0141880 96.7879170 + 41.0120830 96.7858540 + 41.0100210 96.7837500 + 41.0016460 96.7837500 + 40.9995830 96.7816880 + 40.9975210 96.7795830 + 40.9933130 96.7795830 + 40.9912500 96.7775210 + 40.9891880 96.7754170 + 40.9766460 96.7754170 + 40.9745830 96.7733540 + 40.9725210 96.7712500 + 40.9704170 96.7691880 + 40.9683540 96.7670830 + 40.9641460 96.7670830 + 40.9620830 96.7650210 + 40.9600210 96.7629170 + 40.9558130 96.7629170 + 40.9537500 96.7608540 + 40.9516880 96.7587500 + 40.9495830 96.7566880 + 40.9475210 96.7545830 + 40.9454170 96.7525210 + 40.9433540 96.7504170 + 40.9412500 96.7483540 + 40.9391880 96.7462500 + 40.9349790 96.7462500 + 40.9329170 96.7441880 + 40.9308540 96.7420830 + 40.9058130 96.7420830 + 40.9037500 96.7400210 + 40.9016880 96.7379170 + 40.8891460 96.7379170 + 40.8787500 96.7233130 + 40.8766880 96.7212500 + 40.8745830 96.7191880 + 40.8725210 96.7170830 + 40.8704170 96.7150210 + 40.8683540 96.7129170 + 40.8641460 96.7129170 + 40.8620830 96.7108540 + 40.8600210 96.7087500 + 40.8579170 96.7066880 + 40.8579170 96.6899790 + 40.8454170 96.6795830 +NEWI4 NEWI4 -1 24 42.78500 95.09000 + 42.9300000 94.9500000 + 42.8700000 94.9200000 + 42.8000000 94.9100000 + 42.7700000 94.9200000 + 42.6800000 94.9700000 + 42.6300000 95.0200000 + 42.6200000 95.0200000 + 42.6000000 95.0800000 + 42.6500000 95.1500000 + 42.6800000 95.2200000 + 42.7800000 95.2700000 + 42.8200000 95.2700000 + 42.8200000 95.2300000 + 42.8800000 95.2200000 + 42.8800000 95.2000000 + 42.8700000 95.1700000 + 42.8700000 95.1500000 + 42.8700000 95.1300000 + 42.8800000 95.1000000 + 42.9000000 95.0700000 + 42.9200000 95.0700000 + 42.9200000 95.0200000 + 42.9700000 94.9800000 + 42.9300000 94.9500000 +NRWI4 NRWI4 -1 28 41.42000 94.08000 + 41.5300000 94.5100000 + 41.5300000 94.4700000 + 41.5200000 94.3800000 + 41.5000000 94.2600000 + 41.5100000 94.2300000 + 41.4800000 94.1500000 + 41.4800000 94.1200000 + 41.4800000 94.0300000 + 41.5000000 93.9800000 + 41.4900000 93.9000000 + 41.4700000 93.8400000 + 41.4800000 93.7700000 + 41.5000000 93.7200000 + 41.4700000 93.6600000 + 41.4600000 93.6500000 + 41.4300000 93.6500000 + 41.4000000 93.6700000 + 41.3800000 93.7200000 + 41.3400000 93.9100000 + 41.3200000 93.9900000 + 41.3100000 94.0800000 + 41.3100000 94.1600000 + 41.3300000 94.2400000 + 41.3900000 94.3400000 + 41.4200000 94.3900000 + 41.4800000 94.4500000 + 41.5100000 94.4700000 + 41.5300000 94.5100000 +PANI4 PANI4 -1 9 41.65500 94.34500 + 41.7000000 94.4400000 + 41.7000000 94.3800000 + 41.7000000 94.3500000 + 41.7200000 94.3000000 + 41.6000000 94.2500000 + 41.5900000 94.3200000 + 41.6000000 94.4000000 + 41.6500000 94.4300000 + 41.7000000 94.4400000 +PNLI4 PNLI4 -1 10 41.77000 94.44000 + 41.8400000 94.4900000 + 41.8200000 94.4100000 + 41.7500000 94.3700000 + 41.7000000 94.3500000 + 41.7000000 94.3800000 + 41.7000000 94.4400000 + 41.7300000 94.4400000 + 41.7700000 94.5300000 + 41.7800000 94.5000000 + 41.8400000 94.4900000 +PPLN1HW W BR PAPILLION CREEK AT PAPILLION, NE -1 159 41.23917 96.18583 + 41.1495830 96.0420830 + 41.1391460 96.0462500 + 41.1370830 96.0483130 + 41.1370830 96.0566880 + 41.1350210 96.0587500 + 41.1245830 96.0587500 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2183130 96.2587500 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3100210 96.2629170 + 41.3120830 96.2608130 + 41.3141880 96.2587500 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3266880 96.2462500 + 41.3287500 96.2483540 + 41.3308540 96.2504170 + 41.3329170 96.2525210 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566880 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3600210 96.2670830 + 41.3620830 96.2670830 + 41.3620830 96.2649790 + 41.3641460 96.2629170 + 41.3662500 96.2608540 + 41.3662500 96.2358130 + 41.3641880 96.2337500 + 41.3620830 96.2316880 + 41.3620830 96.2274790 + 41.3600210 96.2254170 + 41.3579170 96.2233540 + 41.3579170 96.2191460 + 41.3558540 96.2170830 + 41.3537500 96.2150210 + 41.3537500 96.2024790 + 41.3516880 96.2004170 + 41.3495830 96.1983540 + 41.3475210 96.1962500 + 41.3391460 96.1962500 + 41.3183540 96.1754170 + 41.3120830 96.1733540 + 41.3120830 96.1691460 + 41.3100210 96.1670830 + 41.2974790 96.1670830 + 41.2912500 96.1566460 + 41.2912500 96.1545830 + 41.2891460 96.1545830 + 41.2599790 96.1462500 + 41.2579170 96.1441880 + 41.2558540 96.1420830 + 41.2516460 96.1420830 + 41.2495830 96.1400210 + 41.2495830 96.1316460 + 41.2475210 96.1295830 + 41.2454170 96.1275210 + 41.2433540 96.1254170 + 41.2412500 96.1233540 + 41.2412500 96.1149790 + 41.2391880 96.1129170 + 41.2370830 96.1108540 + 41.2350210 96.1087500 + 41.2308130 96.1087500 + 41.2287500 96.1066880 + 41.2266880 96.1045830 + 41.2204170 96.1025210 + 41.2204170 96.0899790 + 41.2016880 96.0754170 + 41.1974790 96.0754170 + 41.1954170 96.0733540 + 41.1954170 96.0649790 + 41.1912500 96.0566460 + 41.1891880 96.0545830 + 41.1870830 96.0566460 + 41.1850210 96.0587500 + 41.1829170 96.0566880 + 41.1683540 96.0379170 + 41.1599790 96.0379170 + 41.1495830 96.0420830 +PROI4 PROI4 -1 40 42.10000 94.30000 + 42.4100000 94.2700000 + 42.3900000 94.2600000 + 42.3600000 94.2400000 + 42.3300000 94.2100000 + 42.3100000 94.2000000 + 42.3100000 94.1600000 + 42.3000000 94.1400000 + 42.2800000 94.1400000 + 42.2400000 94.1500000 + 42.1500000 94.2300000 + 42.0900000 94.2400000 + 42.0200000 94.2400000 + 41.9800000 94.2200000 + 41.9300000 94.1500000 + 41.8400000 94.0800000 + 41.8000000 94.0700000 + 41.8100000 94.1100000 + 41.8300000 94.2100000 + 41.8200000 94.2300000 + 41.7800000 94.2400000 + 41.8100000 94.2900000 + 41.8400000 94.3400000 + 41.9200000 94.4600000 + 41.9700000 94.5100000 + 41.9900000 94.5300000 + 41.9800000 94.4700000 + 41.9400000 94.4000000 + 41.9500000 94.3800000 + 41.9900000 94.3800000 + 42.0000000 94.3600000 + 42.0200000 94.3600000 + 42.0700000 94.4400000 + 42.1200000 94.4900000 + 42.1700000 94.5100000 + 42.2200000 94.5100000 + 42.2700000 94.4900000 + 42.4000000 94.3800000 + 42.4200000 94.3600000 + 42.3900000 94.3200000 + 42.4100000 94.2700000 +PSGI4HW SOLDIER RIVER AT PISGAH IA -1 404 42.03917 95.68167 + 41.8287500 95.9337500 + 41.8350210 95.9379170 + 41.8474790 95.9504170 + 41.8516880 95.9504170 + 41.8558130 95.9545830 + 41.8600210 95.9545830 + 41.8620830 95.9524790 + 41.8641460 95.9504170 + 41.8891880 95.9504170 + 41.8912500 95.9483130 + 41.8933130 95.9462500 + 41.8975210 95.9462500 + 41.8995830 95.9441460 + 41.9016460 95.9420830 + 41.9058540 95.9420830 + 41.9079170 95.9399790 + 41.9141880 95.9337500 + 41.9162500 95.9337500 + 41.9162500 95.9191460 + 41.9183130 95.9170830 + 41.9225210 95.9170830 + 41.9245830 95.9150210 + 41.9266460 95.9129170 + 41.9308540 95.9129170 + 41.9329170 95.9108540 + 41.9349790 95.9087500 + 41.9558540 95.9087500 + 41.9579170 95.9108130 + 41.9599790 95.9129170 + 41.9662500 95.9024790 + 41.9683540 95.8962500 + 41.9662500 95.8941880 + 41.9662500 95.8899790 + 41.9683130 95.8879170 + 41.9704170 95.8858540 + 41.9724790 95.8837500 + 41.9766880 95.8837500 + 41.9787500 95.8816880 + 41.9787500 95.8733130 + 41.9766880 95.8712500 + 41.9745830 95.8691880 + 41.9766460 95.8670830 + 41.9787500 95.8650210 + 41.9808130 95.8629170 + 41.9891880 95.8629170 + 41.9912500 95.8608540 + 41.9933130 95.8587500 + 41.9954170 95.8566880 + 42.0016460 95.8504170 + 42.0141880 95.8504170 + 42.0162500 95.8483540 + 42.0183130 95.8462500 + 42.0225210 95.8462500 + 42.0245830 95.8441880 + 42.0245830 95.8399790 + 42.0266460 95.8379170 + 42.0350210 95.8379170 + 42.0516880 95.8295830 + 42.0537500 95.8316460 + 42.0558130 95.8337500 + 42.0579170 95.8316880 + 42.0599790 95.8295830 + 42.0620830 95.8275210 + 42.0641460 95.8254170 + 42.0683540 95.8254170 + 42.0704170 95.8191460 + 42.0787500 95.8108540 + 42.0787500 95.8024790 + 42.0829170 95.7733130 + 42.0849790 95.7712500 + 42.0870830 95.7691880 + 42.0870830 95.7649790 + 42.0891460 95.7629170 + 42.0933540 95.7629170 + 42.0954170 95.7649790 + 42.0974790 95.7670830 + 42.0995830 95.7650210 + 42.1016460 95.7629170 + 42.1037500 95.7608540 + 42.1058130 95.7587500 + 42.1079170 95.7566880 + 42.1099790 95.7545830 + 42.1183540 95.7545830 + 42.1204170 95.7525210 + 42.1224790 95.7504170 + 42.1245830 95.7483540 + 42.1266460 95.7462500 + 42.1308540 95.7462500 + 42.1329170 95.7441880 + 42.1349790 95.7420830 + 42.1391880 95.7420830 + 42.1412500 95.7400210 + 42.1412500 95.7358130 + 42.1433130 95.7337500 + 42.1474790 95.7295830 + 42.1558540 95.7295830 + 42.1579170 95.7275210 + 42.1599790 95.7212500 + 42.1641880 95.7212500 + 42.1662500 95.7191880 + 42.1683130 95.7087500 + 42.1725210 95.7087500 + 42.1745830 95.7066880 + 42.1745830 95.7024790 + 42.1766460 95.7004170 + 42.1787500 95.6983540 + 42.1808130 95.6962500 + 42.1829170 95.6941880 + 42.1849790 95.6920830 + 42.1933540 95.6920830 + 42.1954170 95.6900210 + 42.1954170 95.6816460 + 42.1974790 95.6795830 + 42.2016880 95.6795830 + 42.2037500 95.6775210 + 42.2037500 95.6691460 + 42.2058130 95.6670830 + 42.2079170 95.6650210 + 42.2079170 95.6399790 + 42.2099790 95.6379170 + 42.2120830 95.6358540 + 42.2141460 95.6337500 + 42.2162500 95.6316880 + 42.2183130 95.6295830 + 42.2204170 95.6275210 + 42.2224790 95.6254170 + 42.2245830 95.6233540 + 42.2266460 95.6212500 + 42.2308130 95.6170830 + 42.2350210 95.6170830 + 42.2370830 95.6150210 + 42.2391460 95.6129170 + 42.2412500 95.6108540 + 42.2454170 95.6025210 + 42.2433540 95.6004170 + 42.2412500 95.5983540 + 42.2412500 95.5899790 + 42.2579170 95.5733540 + 42.2579170 95.5691460 + 42.2620830 95.5608130 + 42.2662500 95.5566880 + 42.2683130 95.5545830 + 42.2704170 95.5525210 + 42.2724790 95.5504170 + 42.2808540 95.5504170 + 42.2829170 95.5483540 + 42.2808540 95.5462500 + 42.2787500 95.5441880 + 42.2787500 95.5399790 + 42.2808130 95.5379170 + 42.2829170 95.5358540 + 42.2829170 95.5316460 + 42.2870830 95.5275210 + 42.2891460 95.5254170 + 42.2912500 95.5233540 + 42.2912500 95.5024790 + 42.2870830 95.4858130 + 42.2870830 95.4837500 + 42.2849790 95.4837500 + 42.2829170 95.4816880 + 42.2829170 95.4733130 + 42.2808540 95.4712500 + 42.2787500 95.4691880 + 42.2787500 95.4524790 + 42.2808130 95.4504170 + 42.2829170 95.4483540 + 42.2849790 95.4462500 + 42.2870830 95.4441880 + 42.2870830 95.4399790 + 42.2891460 95.4379170 + 42.2912500 95.4358540 + 42.2933130 95.4337500 + 42.2954170 95.4316880 + 42.2954170 95.4274790 + 42.2933540 95.4254170 + 42.2912500 95.4233540 + 42.2912500 95.4108130 + 42.2933130 95.4087500 + 42.2954170 95.4066880 + 42.2933540 95.4045830 + 42.2912500 95.4025210 + 42.2891880 95.4004170 + 42.2808130 95.4004170 + 42.2787500 95.4024790 + 42.2766880 95.4045830 + 42.2745830 95.4025210 + 42.2725210 95.3962500 + 42.2704170 95.3941880 + 42.2704170 95.3899790 + 42.2724790 95.3879170 + 42.2745830 95.3858540 + 42.2745830 95.3816460 + 42.2766460 95.3795830 + 42.2787500 95.3775210 + 42.2787500 95.3691460 + 42.2808130 95.3670830 + 42.2829170 95.3650210 + 42.2829170 95.3483130 + 42.2808540 95.3462500 + 42.2787500 95.3441880 + 42.2787500 95.3358130 + 42.2745830 95.3233130 + 42.2745830 95.3212500 + 42.2662500 95.3274790 + 42.2662500 95.3316880 + 42.2641880 95.3337500 + 42.2579170 95.3358130 + 42.2579170 95.3525210 + 42.2558130 95.3545830 + 42.2537500 95.3524790 + 42.2516880 95.3504170 + 42.2391460 95.3504170 + 42.2370830 95.3524790 + 42.2370830 95.3566880 + 42.2349790 95.3587500 + 42.2329170 95.3608130 + 42.2329170 95.3650210 + 42.2287500 95.3691460 + 42.2287500 95.3775210 + 42.2266460 95.3795830 + 42.2245830 95.3816880 + 42.2224790 95.3837500 + 42.2141880 95.3920830 + 42.1995830 95.3983130 + 42.1995830 95.4066880 + 42.1954170 95.4108130 + 42.1954170 95.4150210 + 42.1933540 95.4170830 + 42.1787500 95.4191880 + 42.1683540 95.4295830 + 42.1641460 95.4295830 + 42.1620830 95.4274790 + 42.1599790 95.4254170 + 42.1579170 95.4233540 + 42.1579170 95.4191460 + 42.1558540 95.4170830 + 42.1433130 95.4170830 + 42.1412500 95.4149790 + 42.1391880 95.4129170 + 42.1308130 95.4129170 + 42.1287500 95.4108130 + 42.1224790 95.4087500 + 42.1204170 95.4108540 + 42.1183130 95.4129170 + 42.1162500 95.4150210 + 42.1141460 95.4170830 + 42.1120830 95.4191880 + 42.1058130 95.4212500 + 42.1037500 95.4233130 + 42.1037500 95.4316880 + 42.1016460 95.4337500 + 42.0995830 95.4358540 + 42.0975210 95.4379170 + 42.0933130 95.4379170 + 42.0912500 95.4379170 + 42.0829170 95.4649790 + 42.0829170 95.4816880 + 42.0808130 95.4837500 + 42.0766880 95.4879170 + 42.0704170 95.4899790 + 42.0704170 95.5025210 + 42.0683130 95.5045830 + 42.0662500 95.5066880 + 42.0641460 95.5087500 + 42.0620830 95.5108540 + 42.0599790 95.5129170 + 42.0579170 95.5149790 + 42.0579170 95.5275210 + 42.0558130 95.5295830 + 42.0537500 95.5274790 + 42.0516880 95.5254170 + 42.0433540 95.5295830 + 42.0391460 95.5295830 + 42.0370830 95.5316460 + 42.0329170 95.5399790 + 42.0329170 95.5483540 + 42.0308130 95.5504170 + 42.0287500 95.5525210 + 42.0266460 95.5545830 + 42.0245830 95.5545830 + 42.0287500 95.5608130 + 42.0287500 95.5816880 + 42.0308540 95.5837500 + 42.0329170 95.5858130 + 42.0329170 95.5900210 + 42.0350210 95.5920830 + 42.0370830 95.5941460 + 42.0370830 95.6066880 + 42.0349790 95.6087500 + 42.0329170 95.6108540 + 42.0308540 95.6129170 + 42.0266460 95.6129170 + 42.0245830 95.6149790 + 42.0204170 95.6233130 + 42.0204170 95.6275210 + 42.0183130 95.6295830 + 42.0162500 95.6316880 + 42.0141460 95.6337500 + 42.0120830 95.6358130 + 42.0120830 95.6608540 + 42.0099790 95.6629170 + 42.0079170 95.6650210 + 42.0058130 95.6670830 + 42.0037500 95.6691880 + 42.0016460 95.6712500 + 41.9995830 95.6733540 + 41.9975210 95.6754170 + 41.9891460 95.6754170 + 41.9870830 95.6774790 + 41.9870830 95.6816880 + 41.9850210 95.6837500 + 41.9808130 95.6837500 + 41.9787500 95.6858540 + 41.9766880 95.6879170 + 41.9683130 95.6879170 + 41.9662500 95.6900210 + 41.9641460 95.6920830 + 41.9620830 95.6941880 + 41.9600210 95.6962500 + 41.9516880 95.7004170 + 41.9433540 95.7045830 + 41.9349790 95.7045830 + 41.9329170 95.7066460 + 41.9329170 95.7233540 + 41.9308130 95.7254170 + 41.9287500 95.7275210 + 41.9266460 95.7295830 + 41.9245830 95.7316880 + 41.9224790 95.7337500 + 41.9204170 95.7358540 + 41.9162500 95.7399790 + 41.9162500 95.7441880 + 41.9141880 95.7462500 + 41.8849790 95.7462500 + 41.8829170 95.7483540 + 41.8808540 95.7504170 + 41.8683130 95.7504170 + 41.8662500 95.7524790 + 41.8662500 95.7566880 + 41.8641460 95.7587500 + 41.8620830 95.7608540 + 41.8599790 95.7629170 + 41.8579170 95.7650210 + 41.8558130 95.7670830 + 41.8537500 95.7691460 + 41.8537500 95.7733540 + 41.8516460 95.7754170 + 41.8495830 95.7775210 + 41.8474790 95.7795830 + 41.8454170 95.7816460 + 41.8454170 95.7858540 + 41.8475210 95.7879170 + 41.8495830 95.7900210 + 41.8474790 95.7920830 + 41.8454170 95.7941880 + 41.8475210 95.7962500 + 41.8495830 95.7983130 + 41.8433540 95.8170830 + 41.8308540 95.8212500 + 41.8266460 95.8212500 + 41.8245830 95.8233540 + 41.8225210 95.8254170 + 41.8183130 95.8254170 + 41.8162500 95.8275210 + 41.8141460 95.8295830 + 41.8120830 95.8316880 + 41.8099790 95.8337500 + 41.8079170 95.8358540 + 41.8058130 95.8379170 + 41.8037500 95.8399790 + 41.8037500 95.8441880 + 41.8016460 95.8462500 + 41.7995830 95.8483540 + 41.7974790 95.8504170 + 41.7954170 95.8525210 + 41.7974790 95.8545830 + 41.8016880 95.8545830 + 41.8037500 95.8566460 + 41.8037500 95.8691880 + 41.8016460 95.8712500 + 41.7995830 95.8733540 + 41.7974790 95.8754170 + 41.7954170 95.8775210 + 41.7933130 95.8795830 + 41.7912500 95.8816460 + 41.7912500 95.8858540 + 41.7891460 95.8879170 + 41.7870830 95.8899790 + 41.7870830 95.8983540 + 41.7870830 95.9004170 + 41.7933130 95.9045830 + 41.7975210 95.9045830 + 41.7995830 95.9066880 + 41.8016460 95.9087500 + 41.8058540 95.9087500 + 41.8079170 95.9108540 + 41.8100210 95.9129170 + 41.8120830 95.9150210 + 41.8183130 95.9212500 + 41.8225210 95.9212500 + 41.8245830 95.9233540 + 41.8266880 95.9254170 + 41.8287500 95.9274790 + 41.8287500 95.9337500 +RDOI4HW E. NISHNABOTNA RIVER AT REDOAK IA -1 596 41.46417 94.92333 + 41.0099790 95.2420830 + 41.0162500 95.2483130 + 41.0162500 95.2525210 + 41.0183130 95.2545830 + 41.0329170 95.2691460 + 41.0329170 95.2733540 + 41.0349790 95.2754170 + 41.0391880 95.2754170 + 41.0412500 95.2733540 + 41.0433130 95.2712500 + 41.0558540 95.2712500 + 41.0579170 95.2691880 + 41.0579170 95.2649790 + 41.0599790 95.2629170 + 41.0641880 95.2629170 + 41.0662500 95.2608540 + 41.0683130 95.2587500 + 41.0704170 95.2566880 + 41.0724790 95.2545830 + 41.0766880 95.2545830 + 41.0787500 95.2525210 + 41.0808130 95.2504170 + 41.0891880 95.2504170 + 41.0912500 95.2483540 + 41.0933130 95.2462500 + 41.0954170 95.2441880 + 41.0974790 95.2420830 + 41.1016880 95.2420830 + 41.1037500 95.2400210 + 41.1037500 95.2358130 + 41.1058130 95.2337500 + 41.1100210 95.2337500 + 41.1120830 95.2316880 + 41.1141460 95.2295830 + 41.1183540 95.2295830 + 41.1204170 95.2275210 + 41.1224790 95.2254170 + 41.1308540 95.2254170 + 41.1329170 95.2233540 + 41.1349790 95.2212500 + 41.1475210 95.2212500 + 41.1495830 95.2191880 + 41.1516460 95.2170830 + 41.1537500 95.2150210 + 41.1558130 95.2129170 + 41.1600210 95.2129170 + 41.1620830 95.2108540 + 41.1641460 95.2087500 + 41.1683540 95.2087500 + 41.1704170 95.2108130 + 41.1724790 95.2129170 + 41.1850210 95.2129170 + 41.1870830 95.2108540 + 41.1870830 95.2066460 + 41.1891460 95.2045830 + 41.1912500 95.2025210 + 41.1912500 95.1983130 + 41.1933130 95.1962500 + 41.2058540 95.1962500 + 41.2079170 95.1941880 + 41.2099790 95.1920830 + 41.2183540 95.1920830 + 41.2204170 95.1900210 + 41.2224790 95.1879170 + 41.2433540 95.1879170 + 41.2454170 95.1858540 + 41.2474790 95.1837500 + 41.2683540 95.1837500 + 41.2704170 95.1858130 + 41.2704170 95.1900210 + 41.2724790 95.1920830 + 41.2975210 95.1920830 + 41.2995830 95.1900210 + 41.3016460 95.1879170 + 41.3037500 95.1858540 + 41.3100210 95.1837500 + 41.3120830 95.1858130 + 41.3141460 95.1879170 + 41.3162500 95.1858540 + 41.3183130 95.1837500 + 41.3266880 95.1837500 + 41.3287500 95.1858130 + 41.3308130 95.1879170 + 41.3329170 95.1858540 + 41.3475210 95.1837500 + 41.3495830 95.1816880 + 41.3516460 95.1795830 + 41.3579170 95.1775210 + 41.3599790 95.1754170 + 41.3787500 95.1774790 + 41.3808130 95.1795830 + 41.3850210 95.1795830 + 41.3870830 95.1775210 + 41.3891460 95.1754170 + 41.4058540 95.1754170 + 41.4079170 95.1774790 + 41.4141880 95.1795830 + 41.4162500 95.1775210 + 41.4308540 95.1754170 + 41.4329170 95.1774790 + 41.4433540 95.1795830 + 41.4454170 95.1775210 + 41.4474790 95.1754170 + 41.4516880 95.1754170 + 41.4537500 95.1733540 + 41.4558130 95.1712500 + 41.4579170 95.1733130 + 41.4599790 95.1754170 + 41.4620830 95.1733540 + 41.4641460 95.1712500 + 41.4891880 95.1712500 + 41.4912500 95.1733130 + 41.4933130 95.1754170 + 41.5016880 95.1754170 + 41.5037500 95.1774790 + 41.5058130 95.1795830 + 41.5225210 95.1795830 + 41.5349790 95.1920830 + 41.5391880 95.1920830 + 41.5412500 95.1941460 + 41.5412500 95.1983540 + 41.5433540 95.2004170 + 41.5454170 95.2004170 + 41.5454170 95.1983130 + 41.5474790 95.1962500 + 41.5516880 95.1962500 + 41.5537500 95.1941880 + 41.5558130 95.1920830 + 41.5641880 95.1920830 + 41.5662500 95.1900210 + 41.5683130 95.1879170 + 41.5725210 95.1879170 + 41.5745830 95.1899790 + 41.5766460 95.1920830 + 41.5850210 95.1879170 + 41.5870830 95.1858540 + 41.5891460 95.1837500 + 41.5933540 95.1837500 + 41.5954170 95.1816880 + 41.5954170 95.1774790 + 41.5974790 95.1754170 + 41.5995830 95.1733540 + 41.6016460 95.1712500 + 41.6037500 95.1691880 + 41.6037500 95.1649790 + 41.6058130 95.1629170 + 41.6100210 95.1629170 + 41.6120830 95.1649790 + 41.6141460 95.1670830 + 41.6162500 95.1691460 + 41.6183130 95.1712500 + 41.6204170 95.1733130 + 41.6224790 95.1754170 + 41.6266880 95.1754170 + 41.6287500 95.1733540 + 41.6350210 95.1712500 + 41.6370830 95.1691880 + 41.6391460 95.1670830 + 41.6475210 95.1670830 + 41.6495830 95.1650210 + 41.6495830 95.1608130 + 41.6516460 95.1587500 + 41.6537500 95.1566880 + 41.6558130 95.1545830 + 41.6579170 95.1525210 + 41.6599790 95.1504170 + 41.6620830 95.1483540 + 41.6641460 95.1462500 + 41.6662500 95.1441880 + 41.6683130 95.1420830 + 41.6725210 95.1420830 + 41.6745830 95.1400210 + 41.6870830 95.1275210 + 41.6870830 95.1233130 + 41.6912500 95.1191880 + 41.6912500 95.1108130 + 41.6891880 95.1087500 + 41.6870830 95.1066880 + 41.6870830 95.0774790 + 41.6891460 95.0754170 + 41.6912500 95.0733540 + 41.6933130 95.0712500 + 41.6954170 95.0691880 + 41.6954170 95.0649790 + 41.6933540 95.0629170 + 41.6912500 95.0608540 + 41.6912500 95.0483130 + 41.6933130 95.0462500 + 41.6975210 95.0462500 + 41.6995830 95.0441880 + 41.7016460 95.0420830 + 41.7037500 95.0400210 + 41.7037500 95.0149790 + 41.7120830 95.0024790 + 41.7100210 95.0004170 + 41.7058130 95.0004170 + 41.7037500 94.9983540 + 41.7037500 94.9858130 + 41.7058130 94.9837500 + 41.7100210 94.9837500 + 41.7120830 94.9816880 + 41.7141460 94.9795830 + 41.7162500 94.9775210 + 41.7162500 94.9733130 + 41.7183130 94.9712500 + 41.7225210 94.9712500 + 41.7245830 94.9733130 + 41.7266460 94.9754170 + 41.7287500 94.9733540 + 41.7308130 94.9712500 + 41.7433540 94.9712500 + 41.7454170 94.9733130 + 41.7474790 94.9754170 + 41.7600210 94.9754170 + 41.7620830 94.9733540 + 41.7620830 94.9691460 + 41.7641460 94.9670830 + 41.7662500 94.9650210 + 41.7683130 94.9629170 + 41.7704170 94.9608540 + 41.7724790 94.9587500 + 41.7745830 94.9566880 + 41.7745830 94.9483130 + 41.7766460 94.9462500 + 41.7787500 94.9441880 + 41.7808130 94.9420830 + 41.7829170 94.9441460 + 41.7849790 94.9462500 + 41.7891880 94.9462500 + 41.7912500 94.9441880 + 41.7912500 94.9316460 + 41.7933130 94.9295830 + 41.7954170 94.9275210 + 41.8058130 94.9170830 + 41.8100210 94.9170830 + 41.8120830 94.9191460 + 41.8141460 94.9212500 + 41.8266880 94.9212500 + 41.8287500 94.9233130 + 41.8287500 94.9275210 + 41.8350210 94.9295830 + 41.8370830 94.9316460 + 41.8391460 94.9337500 + 41.8433540 94.9337500 + 41.8454170 94.9358130 + 41.8454170 94.9400210 + 41.8474790 94.9420830 + 41.8495830 94.9441460 + 41.8495830 94.9525210 + 41.8558540 94.9545830 + 41.8579170 94.9566460 + 41.8599790 94.9587500 + 41.8620830 94.9608130 + 41.8641460 94.9629170 + 41.8662500 94.9649790 + 41.8683130 94.9670830 + 41.8704170 94.9691460 + 41.8724790 94.9712500 + 41.8745830 94.9733130 + 41.8766460 94.9795830 + 41.8891880 94.9795830 + 41.8912500 94.9816460 + 41.8933130 94.9837500 + 41.8975210 94.9837500 + 41.8995830 94.9858130 + 41.9016460 94.9920830 + 41.9100210 94.9920830 + 41.9120830 94.9900210 + 41.9141460 94.9879170 + 41.9162500 94.9858540 + 41.9162500 94.9774790 + 41.9141880 94.9754170 + 41.9120830 94.9733540 + 41.9204170 94.9650210 + 41.9204170 94.9608130 + 41.9245830 94.9587500 + 41.9245830 94.9566460 + 41.9225210 94.9545830 + 41.9204170 94.9525210 + 41.9204170 94.9274790 + 41.9141460 94.9170830 + 41.9162500 94.9150210 + 41.9162500 94.9066460 + 41.9016460 94.8962500 + 41.8995830 94.8941880 + 41.8995830 94.8858130 + 41.8975210 94.8837500 + 41.8954170 94.8816880 + 41.8954170 94.8733130 + 41.8912500 94.8649790 + 41.8850210 94.8587500 + 41.8808130 94.8587500 + 41.8745830 94.8525210 + 41.8745830 94.8483130 + 41.8725210 94.8462500 + 41.8704170 94.8441880 + 41.8704170 94.8399790 + 41.8683540 94.8379170 + 41.8662500 94.8358540 + 41.8641880 94.8337500 + 41.8558130 94.8337500 + 41.8537500 94.8358130 + 41.8516880 94.8379170 + 41.8474790 94.8379170 + 41.8454170 94.8358540 + 41.8433540 94.8337500 + 41.8412500 94.8316880 + 41.8391880 94.8295830 + 41.8370830 94.8275210 + 41.8350210 94.8254170 + 41.8287500 94.8233540 + 41.8266880 94.8170830 + 41.8204170 94.8150210 + 41.8183540 94.8004170 + 41.8058130 94.8004170 + 41.8037500 94.7983540 + 41.8016880 94.7962500 + 41.7995830 94.7941880 + 41.7995830 94.7899790 + 41.7975210 94.7879170 + 41.7933130 94.7879170 + 41.7912500 94.7858540 + 41.7891880 94.7837500 + 41.7870830 94.7816880 + 41.7850210 94.7795830 + 41.7829170 94.7775210 + 41.7808540 94.7754170 + 41.7599790 94.7754170 + 41.7579170 94.7691460 + 41.7558540 94.7670830 + 41.7537500 94.7650210 + 41.7516880 94.7629170 + 41.7495830 94.7608540 + 41.7495830 94.7566460 + 41.7516460 94.7545830 + 41.7683540 94.7545830 + 41.7704170 94.7525210 + 41.7704170 94.7399790 + 41.7683540 94.7379170 + 41.7662500 94.7358540 + 41.7641880 94.7337500 + 41.7516460 94.7337500 + 41.7495830 94.7358130 + 41.7475210 94.7379170 + 41.7454170 94.7399790 + 41.7433540 94.7420830 + 41.7412500 94.7400210 + 41.7391880 94.7379170 + 41.7308130 94.7379170 + 41.7287500 94.7358540 + 41.7266880 94.7337500 + 41.7245830 94.7316880 + 41.7225210 94.7295830 + 41.7204170 94.7275210 + 41.7183540 94.7254170 + 41.7141460 94.7254170 + 41.7120830 94.7233540 + 41.7100210 94.7212500 + 41.7058130 94.7212500 + 41.7016880 94.7170830 + 41.6933130 94.7170830 + 41.6912500 94.7150210 + 41.6891880 94.7129170 + 41.6870830 94.7108540 + 41.6850210 94.7087500 + 41.6829170 94.7066880 + 41.6829170 94.6983130 + 41.6808540 94.6962500 + 41.6745830 94.6941880 + 41.6725210 94.6920830 + 41.6704170 94.6900210 + 41.6683540 94.6879170 + 41.6662500 94.6858540 + 41.6641880 94.6837500 + 41.6599790 94.6837500 + 41.6579170 94.6858130 + 41.6579170 94.6900210 + 41.6558540 94.6920830 + 41.6516460 94.6920830 + 41.6495830 94.6941460 + 41.6475210 94.6962500 + 41.6454170 94.6983130 + 41.6454170 94.7025210 + 41.6433540 94.7045830 + 41.6412500 94.7025210 + 41.6391880 94.7004170 + 41.6370830 94.6983540 + 41.6350210 94.6962500 + 41.6308130 94.6962500 + 41.6287500 94.6941880 + 41.6266880 94.6920830 + 41.6099790 94.6920830 + 41.6079170 94.6941460 + 41.6058540 94.6962500 + 41.6037500 94.6983130 + 41.6016880 94.7004170 + 41.5995830 94.7024790 + 41.5975210 94.7045830 + 41.5954170 94.7025210 + 41.5933540 94.7004170 + 41.5912500 94.6983540 + 41.5849790 94.6962500 + 41.5829170 94.6941880 + 41.5808540 94.6920830 + 41.5787500 94.6900210 + 41.5724790 94.6879170 + 41.5704170 94.6858540 + 41.5704170 94.6774790 + 41.5683540 94.6754170 + 41.5662500 94.6733540 + 41.5662500 94.6691460 + 41.5641880 94.6670830 + 41.5516460 94.6670830 + 41.5495830 94.6650210 + 41.5475210 94.6629170 + 41.5454170 94.6608540 + 41.5433540 94.6587500 + 41.5391460 94.6587500 + 41.5370830 94.6566880 + 41.5350210 94.6545830 + 41.5329170 94.6566460 + 41.5308540 94.6587500 + 41.5266460 94.6587500 + 41.5245830 94.6566880 + 41.5225210 94.6545830 + 41.5183130 94.6545830 + 41.5100210 94.6462500 + 41.4974790 94.6462500 + 41.4954170 94.6441880 + 41.4954170 94.6399790 + 41.4849790 94.6379170 + 41.4829170 94.6379170 + 41.4745830 94.6566460 + 41.4745830 94.6650210 + 41.4724790 94.6670830 + 41.4704170 94.6691880 + 41.4683130 94.6712500 + 41.4662500 94.6733540 + 41.4641460 94.6754170 + 41.4620830 94.6774790 + 41.4620830 94.6816880 + 41.4599790 94.6837500 + 41.4579170 94.6858540 + 41.4558130 94.6879170 + 41.4537500 94.6899790 + 41.4537500 94.6983540 + 41.4516460 94.7004170 + 41.4495830 94.7024790 + 41.4495830 94.7108540 + 41.4474790 94.7129170 + 41.4454170 94.7150210 + 41.4433130 94.7170830 + 41.4412500 94.7191460 + 41.4412500 94.7275210 + 41.4391880 94.7295830 + 41.4349790 94.7295830 + 41.4329170 94.7316460 + 41.4329170 94.7358540 + 41.4308540 94.7379170 + 41.4266460 94.7379170 + 41.4245830 94.7400210 + 41.4225210 94.7420830 + 41.4183130 94.7420830 + 41.4162500 94.7441880 + 41.4120830 94.7483130 + 41.4120830 94.7525210 + 41.4100210 94.7545830 + 41.4037500 94.7566460 + 41.4037500 94.7816880 + 41.4016880 94.7837500 + 41.3974790 94.7837500 + 41.3954170 94.7858540 + 41.3933130 94.7879170 + 41.3912500 94.7900210 + 41.3891880 94.7920830 + 41.3849790 94.7920830 + 41.3829170 94.7899790 + 41.3704170 94.7983130 + 41.3704170 94.8025210 + 41.3683130 94.8045830 + 41.3662500 94.8066460 + 41.3662500 94.8108540 + 41.3641880 94.8129170 + 41.3370830 94.8233540 + 41.3391880 94.8254170 + 41.3412500 94.8274790 + 41.3412500 94.8400210 + 41.3391460 94.8420830 + 41.3370830 94.8441460 + 41.3370830 94.8483540 + 41.3349790 94.8504170 + 41.3329170 94.8525210 + 41.3308540 94.8545830 + 41.3204170 94.8608130 + 41.3204170 94.8775210 + 41.3183540 94.8795830 + 41.3141460 94.8795830 + 41.3120830 94.8816880 + 41.3099790 94.8837500 + 41.3079170 94.8858130 + 41.3079170 94.9025210 + 41.3058540 94.9045830 + 41.3016460 94.9045830 + 41.2995830 94.9066880 + 41.2974790 94.9087500 + 41.2954170 94.9108130 + 41.2954170 94.9233540 + 41.2974790 94.9254170 + 41.3058540 94.9254170 + 41.3079170 94.9274790 + 41.3079170 94.9441880 + 41.3058130 94.9462500 + 41.3037500 94.9483130 + 41.3037500 95.0025210 + 41.3016880 95.0045830 + 41.2974790 95.0045830 + 41.2954170 95.0066460 + 41.2954170 95.0441880 + 41.2933540 95.0462500 + 41.2849790 95.0462500 + 41.2829170 95.0483540 + 41.2808540 95.0504170 + 41.2683130 95.0504170 + 41.2662500 95.0525210 + 41.2641880 95.0545830 + 41.2599790 95.0545830 + 41.2579170 95.0566880 + 41.2558540 95.0587500 + 41.2474790 95.0587500 + 41.2454170 95.0608540 + 41.2433540 95.0629170 + 41.2099790 95.0629170 + 41.2079170 95.0608130 + 41.2058540 95.0587500 + 41.2016460 95.0587500 + 41.1995830 95.0608540 + 41.1974790 95.0629170 + 41.1954170 95.0629170 + 41.1912500 95.0816460 + 41.1912500 95.0858540 + 41.1891460 95.0879170 + 41.1870830 95.0900210 + 41.1850210 95.0920830 + 41.1558130 95.0920830 + 41.1516880 95.0962500 + 41.1433540 95.1004170 + 41.1308130 95.1004170 + 41.1287500 95.1025210 + 41.1266880 95.1045830 + 41.1224790 95.1045830 + 41.1204170 95.1066880 + 41.1183130 95.1087500 + 41.1162500 95.1108130 + 41.1162500 95.1191880 + 41.1141460 95.1212500 + 41.1120830 95.1233540 + 41.1100210 95.1254170 + 41.1058130 95.1254170 + 41.1037500 95.1275210 + 41.1016460 95.1295830 + 41.0995830 95.1316460 + 41.0995830 95.1358540 + 41.0974790 95.1379170 + 41.0954170 95.1358130 + 41.0933540 95.1337500 + 41.0891460 95.1337500 + 41.0870830 95.1316460 + 41.0849790 95.1295830 + 41.0829170 95.1316880 + 41.0808540 95.1337500 + 41.0641460 95.1337500 + 41.0620830 95.1358540 + 41.0600210 95.1379170 + 41.0474790 95.1379170 + 41.0454170 95.1400210 + 41.0433130 95.1420830 + 41.0412500 95.1441460 + 41.0412500 95.1525210 + 41.0391460 95.1545830 + 41.0370830 95.1566460 + 41.0370830 95.1608540 + 41.0349790 95.1629170 + 41.0329170 95.1650210 + 41.0329170 95.1670830 + 41.0412500 95.1691460 + 41.0412500 95.1733540 + 41.0454170 95.1774790 + 41.0412500 95.1858130 + 41.0412500 95.1941880 + 41.0370830 95.1983540 + 41.0349790 95.2004170 + 41.0120830 95.2233130 + 41.0120830 95.2358540 + 41.0099790 95.2379170 + 41.0079170 95.2400210 + 41.0099790 95.2420830 +REDI4 REDI4 -1 58 41.81000 94.71381 + 42.1200000 95.0200000 + 42.0500000 94.9500000 + 41.9300000 94.8200000 + 41.9000000 94.7500000 + 41.8300000 94.6700000 + 41.7700000 94.5300000 + 41.7300000 94.4400000 + 41.7000000 94.4400000 + 41.6500000 94.4300000 + 41.6000000 94.4000000 + 41.5900000 94.3200000 + 41.6000000 94.2500000 + 41.7200000 94.3000000 + 41.7000000 94.3500000 + 41.7500000 94.3700000 + 41.8200000 94.4100000 + 41.8400000 94.4900000 + 41.8600000 94.5100000 + 41.9700000 94.5100000 + 41.9200000 94.4600000 + 41.8400000 94.3400000 + 41.8100000 94.2900000 + 41.7800000 94.2400000 + 41.7500000 94.2200000 + 41.7300000 94.2100000 + 41.6600000 94.1800000 + 41.6300000 94.1500000 + 41.6100000 94.1400000 + 41.5800000 94.1800000 + 41.5400000 94.1900000 + 41.5300000 94.2200000 + 41.5100000 94.2300000 + 41.5000000 94.2600000 + 41.5200000 94.3800000 + 41.5300000 94.4700000 + 41.5300000 94.5100000 + 41.5700000 94.5500000 + 41.6200000 94.6500000 + 41.6300000 94.6700000 + 41.6500000 94.6700000 + 41.7000000 94.7200000 + 41.7700000 94.7500000 + 41.8000000 94.8000000 + 41.8700000 94.8300000 + 41.8800000 94.8700000 + 41.9200000 94.9000000 + 41.9200000 94.9500000 + 41.9200000 94.9800000 + 41.9500000 94.9800000 + 41.9500000 94.9700000 + 42.0000000 94.9800000 + 42.0000000 95.0000000 + 42.0300000 95.0200000 + 42.0300000 95.0300000 + 42.0500000 95.0300000 + 42.0700000 95.0200000 + 42.0800000 95.0200000 + 42.1200000 95.0200000 +SCRI4 SCRI4 -1 35 42.61500 95.01500 + 42.7700000 94.7600000 + 42.6900000 94.7700000 + 42.6500000 94.7600000 + 42.6200000 94.7300000 + 42.5300000 94.8000000 + 42.4300000 94.8500000 + 42.3800000 94.8900000 + 42.3700000 94.9400000 + 42.3000000 94.9800000 + 42.3800000 95.0300000 + 42.4500000 95.0500000 + 42.5000000 95.0800000 + 42.5200000 95.1000000 + 42.5800000 95.1300000 + 42.6000000 95.2000000 + 42.6300000 95.2800000 + 42.6500000 95.2800000 + 42.6800000 95.3000000 + 42.7200000 95.3000000 + 42.7200000 95.2800000 + 42.6800000 95.2700000 + 42.6800000 95.2200000 + 42.6500000 95.1500000 + 42.6000000 95.0800000 + 42.6200000 95.0200000 + 42.6300000 95.0200000 + 42.6800000 94.9700000 + 42.7700000 94.9200000 + 42.8000000 94.9100000 + 42.8700000 94.9200000 + 42.9300000 94.9500000 + 42.9200000 94.8800000 + 42.9000000 94.8500000 + 42.8700000 94.8000000 + 42.7700000 94.7600000 +SRBN1HW Pebble Creek near Scribner, NE -1 220 41.73917 96.86500 + 41.6537500 96.6795830 + 41.6266460 96.6837500 + 41.6183540 96.6754170 + 41.6099790 96.6754170 + 41.6079170 96.6775210 + 41.6058130 96.6795830 + 41.6037500 96.6816460 + 41.6037500 96.6858540 + 41.6016460 96.6879170 + 41.5995830 96.6900210 + 41.5870830 96.7024790 + 41.5870830 96.7191880 + 41.5891880 96.7212500 + 41.5912500 96.7233130 + 41.5912500 96.7358540 + 41.5891460 96.7379170 + 41.5870830 96.7399790 + 41.5870830 96.8025210 + 41.5891880 96.8045830 + 41.5912500 96.8066460 + 41.5912500 96.8150210 + 41.5933540 96.8170830 + 41.5954170 96.8191460 + 41.5954170 96.8316880 + 41.5975210 96.8337500 + 41.5995830 96.8358540 + 41.6016880 96.8379170 + 41.6037500 96.8399790 + 41.6037500 96.8525210 + 41.6058540 96.8545830 + 41.6079170 96.8566460 + 41.6079170 96.8608540 + 41.6100210 96.8629170 + 41.6120830 96.8649790 + 41.6120830 96.8775210 + 41.6141880 96.8795830 + 41.6162500 96.8816460 + 41.6162500 96.8858540 + 41.6183540 96.8879170 + 41.6204170 96.8899790 + 41.6204170 96.9025210 + 41.6225210 96.9045830 + 41.6245830 96.9066880 + 41.6266880 96.9087500 + 41.6287500 96.9108130 + 41.6287500 96.9150210 + 41.6308540 96.9170830 + 41.6329170 96.9191880 + 41.6349790 96.9212500 + 41.6433540 96.9212500 + 41.6454170 96.9191460 + 41.6474790 96.9170830 + 41.6516880 96.9170830 + 41.6537500 96.9191460 + 41.6537500 96.9275210 + 41.6558130 96.9295830 + 41.6766460 96.9337500 + 41.6891880 96.9337500 + 41.6912500 96.9358130 + 41.6912500 96.9400210 + 41.6933540 96.9420830 + 41.6954170 96.9441880 + 41.6974790 96.9462500 + 41.7058540 96.9462500 + 41.7079170 96.9483540 + 41.7099790 96.9504170 + 41.7183540 96.9504170 + 41.7204170 96.9524790 + 41.7204170 96.9566880 + 41.7225210 96.9587500 + 41.7245830 96.9608540 + 41.7266880 96.9629170 + 41.7287500 96.9650210 + 41.7308130 96.9670830 + 41.7391880 96.9670830 + 41.7412500 96.9691880 + 41.7433130 96.9712500 + 41.7516880 96.9712500 + 41.7537500 96.9733130 + 41.7537500 96.9775210 + 41.7558130 96.9795830 + 41.7683540 96.9795830 + 41.7704170 96.9816460 + 41.7704170 96.9858540 + 41.7724790 96.9879170 + 41.7766880 96.9879170 + 41.7787500 96.9900210 + 41.7808130 96.9920830 + 41.7933540 96.9920830 + 41.7954170 96.9941880 + 41.7975210 96.9962500 + 41.7995830 96.9983540 + 41.8016460 97.0004170 + 41.8058540 97.0004170 + 41.8079170 97.0025210 + 41.8099790 97.0045830 + 41.8183540 97.0045830 + 41.8204170 97.0066460 + 41.8204170 97.0108540 + 41.8225210 97.0129170 + 41.8245830 97.0150210 + 41.8266880 97.0170830 + 41.8287500 97.0191460 + 41.8349790 97.0295830 + 41.8391880 97.0295830 + 41.8412500 97.0316880 + 41.8433130 97.0337500 + 41.8516880 97.0337500 + 41.8537500 97.0337500 + 41.8537500 97.0233130 + 41.8558130 97.0212500 + 41.8579170 97.0191880 + 41.8579170 97.0149790 + 41.8599790 97.0129170 + 41.8620830 97.0149790 + 41.8641460 97.0170830 + 41.8725210 97.0170830 + 41.8745830 97.0150210 + 41.8745830 96.9858130 + 41.8766460 96.9837500 + 41.8808540 96.9837500 + 41.8829170 96.9816880 + 41.8849790 96.9795830 + 41.8870830 96.9775210 + 41.8850210 96.9754170 + 41.8829170 96.9733540 + 41.8829170 96.9566460 + 41.8808540 96.9545830 + 41.8787500 96.9525210 + 41.8808130 96.9504170 + 41.8829170 96.9483540 + 41.8829170 96.9399790 + 41.8849790 96.9379170 + 41.8870830 96.9358540 + 41.8891460 96.9337500 + 41.8912500 96.9316880 + 41.8912500 96.9274790 + 41.8891880 96.9254170 + 41.8870830 96.9233540 + 41.8870830 96.8983130 + 41.8850210 96.8962500 + 41.8829170 96.8858130 + 41.8808540 96.8837500 + 41.8787500 96.8816880 + 41.8787500 96.8774790 + 41.8829170 96.8649790 + 41.8829170 96.8629170 + 41.8808130 96.8629170 + 41.8787500 96.8608540 + 41.8766880 96.8587500 + 41.8724790 96.8587500 + 41.8704170 96.8566880 + 41.8683540 96.8545830 + 41.8662500 96.8525210 + 41.8641880 96.8504170 + 41.8620830 96.8483540 + 41.8600210 96.8462500 + 41.8579170 96.8441880 + 41.8558540 96.8420830 + 41.8537500 96.8400210 + 41.8516880 96.8379170 + 41.8433130 96.8379170 + 41.8412500 96.8358540 + 41.8391880 96.8337500 + 41.8349790 96.8337500 + 41.8329170 96.8316880 + 41.8308540 96.8295830 + 41.8287500 96.8275210 + 41.8266880 96.8254170 + 41.8245830 96.8233540 + 41.8225210 96.8212500 + 41.8204170 96.8191880 + 41.8183540 96.8170830 + 41.8162500 96.8191460 + 41.8141880 96.8212500 + 41.8099790 96.8212500 + 41.8079170 96.8191880 + 41.8058540 96.8170830 + 41.8037500 96.8150210 + 41.8037500 96.8108130 + 41.8016880 96.8087500 + 41.7995830 96.8066880 + 41.7975210 96.8045830 + 41.7933130 96.8045830 + 41.7912500 96.8025210 + 41.7912500 96.7983130 + 41.7891880 96.7962500 + 41.7766880 96.7879170 + 41.7641460 96.7879170 + 41.7620830 96.7858540 + 41.7620830 96.7816460 + 41.7600210 96.7795830 + 41.7516460 96.7795830 + 41.7495830 96.7775210 + 41.7475210 96.7754170 + 41.7454170 96.7733540 + 41.7454170 96.7649790 + 41.7433540 96.7629170 + 41.7412500 96.7608540 + 41.7391880 96.7587500 + 41.7308130 96.7587500 + 41.7287500 96.7566880 + 41.7266880 96.7545830 + 41.7245830 96.7525210 + 41.7225210 96.7504170 + 41.7183130 96.7504170 + 41.7162500 96.7483540 + 41.7141880 96.7462500 + 41.7099790 96.7462500 + 41.6995830 96.7316460 + 41.6954170 96.7275210 + 41.6933540 96.7254170 + 41.6891460 96.7254170 + 41.6870830 96.7233540 + 41.6850210 96.7212500 + 41.6829170 96.7191880 + 41.6808540 96.7170830 + 41.6787500 96.7150210 + 41.6787500 96.6899790 + 41.6537500 96.6795830 +WLBN1HW TURKEY CR. NR WILBUR NE -1 464 40.54333 97.24000 + 40.4787500 97.0170830 + 40.4704170 97.0316880 + 40.4662500 97.0358130 + 40.4662500 97.0400210 + 40.4683540 97.0420830 + 40.4745830 97.0483130 + 40.4745830 97.0566880 + 40.4766880 97.0587500 + 40.4787500 97.0608130 + 40.4787500 97.0816880 + 40.4766460 97.0837500 + 40.4745830 97.0858130 + 40.4745830 97.0900210 + 40.4766880 97.0920830 + 40.4787500 97.0941460 + 40.4787500 97.1025210 + 40.4808130 97.1045830 + 40.4850210 97.1045830 + 40.4870830 97.1066460 + 40.4870830 97.1150210 + 40.4891880 97.1170830 + 40.4912500 97.1191460 + 40.4912500 97.1316880 + 40.4933130 97.1337500 + 40.5016880 97.1337500 + 40.5037500 97.1358540 + 40.5058540 97.1379170 + 40.5079170 97.1400210 + 40.5141460 97.1462500 + 40.5183540 97.1462500 + 40.5204170 97.1483130 + 40.5204170 97.1650210 + 40.5183130 97.1670830 + 40.5162500 97.1691460 + 40.5162500 97.1858540 + 40.5141460 97.1879170 + 40.5120830 97.1900210 + 40.5141880 97.1920830 + 40.5162500 97.1941880 + 40.5183540 97.1962500 + 40.5204170 97.1983130 + 40.5204170 97.2025210 + 40.5225210 97.2045830 + 40.5245830 97.2066880 + 40.5266880 97.2087500 + 40.5287500 97.2108540 + 40.5308130 97.2129170 + 40.5391880 97.2129170 + 40.5412500 97.2149790 + 40.5412500 97.2275210 + 40.5433540 97.2295830 + 40.5454170 97.2316880 + 40.5433130 97.2337500 + 40.5412500 97.2358130 + 40.5412500 97.2441880 + 40.5433540 97.2462500 + 40.5454170 97.2483540 + 40.5475210 97.2504170 + 40.5495830 97.2524790 + 40.5495830 97.2691880 + 40.5474790 97.2712500 + 40.5454170 97.2733130 + 40.5454170 97.2983540 + 40.5433130 97.3004170 + 40.5412500 97.3025210 + 40.5391460 97.3045830 + 40.5370830 97.3066460 + 40.5370830 97.3108540 + 40.5349790 97.3129170 + 40.5329170 97.3149790 + 40.5329170 97.3233540 + 40.5308130 97.3254170 + 40.5287500 97.3275210 + 40.5266880 97.3295830 + 40.5224790 97.3295830 + 40.5204170 97.3316880 + 40.5183540 97.3337500 + 40.5141460 97.3337500 + 40.5120830 97.3358540 + 40.5100210 97.3379170 + 40.5058130 97.3379170 + 40.5037500 97.3400210 + 40.5016460 97.3420830 + 40.4995830 97.3441880 + 40.4975210 97.3462500 + 40.4933130 97.3462500 + 40.4912500 97.3483540 + 40.4891880 97.3504170 + 40.4849790 97.3504170 + 40.4829170 97.3525210 + 40.4808130 97.3545830 + 40.4787500 97.3545830 + 40.4745830 97.3608130 + 40.4745830 97.3858540 + 40.4724790 97.3879170 + 40.4704170 97.3900210 + 40.4683540 97.3920830 + 40.4641460 97.3920830 + 40.4620830 97.3941880 + 40.4599790 97.3962500 + 40.4579170 97.3983540 + 40.4558130 97.4004170 + 40.4495830 97.4066460 + 40.4495830 97.4275210 + 40.4474790 97.4295830 + 40.4454170 97.4316460 + 40.4454170 97.4400210 + 40.4433130 97.4420830 + 40.4412500 97.4441880 + 40.4391460 97.4462500 + 40.4370830 97.4483130 + 40.4370830 97.4525210 + 40.4349790 97.4545830 + 40.4329170 97.4566460 + 40.4329170 97.4608540 + 40.4308540 97.4629170 + 40.4266460 97.4629170 + 40.4224790 97.4670830 + 40.4204170 97.4670830 + 40.4245830 97.5024790 + 40.4245830 97.5233540 + 40.4266880 97.5254170 + 40.4287500 97.5274790 + 40.4287500 97.5608540 + 40.4266460 97.5629170 + 40.4245830 97.5649790 + 40.4245830 97.5691880 + 40.4266880 97.5712500 + 40.4287500 97.5733130 + 40.4287500 97.5858540 + 40.4308540 97.5879170 + 40.4329170 97.5899790 + 40.4329170 97.6025210 + 40.4349790 97.6045830 + 40.4391880 97.6045830 + 40.4412500 97.6066880 + 40.4433540 97.6087500 + 40.4454170 97.6108130 + 40.4454170 97.6150210 + 40.4495830 97.6191460 + 40.4495830 97.6233540 + 40.4516460 97.6254170 + 40.4620830 97.6275210 + 40.4599790 97.6295830 + 40.4579170 97.6316460 + 40.4579170 97.6441880 + 40.4558130 97.6462500 + 40.4537500 97.6483130 + 40.4537500 97.6566880 + 40.4495830 97.6650210 + 40.4474790 97.6670830 + 40.4454170 97.6691460 + 40.4454170 97.6858540 + 40.4475210 97.6879170 + 40.4495830 97.6899790 + 40.4495830 97.6941880 + 40.4516460 97.6962500 + 40.4600210 97.6962500 + 40.4620830 97.6983130 + 40.4620830 97.7108540 + 40.4641880 97.7129170 + 40.4662500 97.7149790 + 40.4662500 97.7233540 + 40.4641460 97.7254170 + 40.4620830 97.7274790 + 40.4620830 97.7358540 + 40.4641880 97.7379170 + 40.4662500 97.7399790 + 40.4662500 97.7733540 + 40.4641460 97.7754170 + 40.4620830 97.7774790 + 40.4620830 97.7858540 + 40.4599790 97.7879170 + 40.4579170 97.7899790 + 40.4579170 97.7983540 + 40.4558130 97.8004170 + 40.4537500 97.8004170 + 40.4537500 97.8066880 + 40.4558130 97.8087500 + 40.4579170 97.8108130 + 40.4599790 97.8129170 + 40.4620830 97.8149790 + 40.4641460 97.8170830 + 40.4683540 97.8170830 + 40.4704170 97.8191460 + 40.4704170 97.8525210 + 40.4683540 97.8545830 + 40.4662500 97.8566460 + 40.4662500 97.8650210 + 40.4683130 97.8670830 + 40.4704170 97.8691460 + 40.4724790 97.8712500 + 40.4745830 97.8733130 + 40.4766460 97.8754170 + 40.4787500 97.8774790 + 40.4808130 97.8795830 + 40.5058540 97.8795830 + 40.5079170 97.8816460 + 40.5079170 97.8941880 + 40.5099790 97.8962500 + 40.5120830 97.8983130 + 40.5120830 97.9025210 + 40.5141460 97.9045830 + 40.5162500 97.9066460 + 40.5183130 97.9087500 + 40.5204170 97.9108130 + 40.5224790 97.9129170 + 40.5308540 97.9129170 + 40.5329170 97.9149790 + 40.5349790 97.9170830 + 40.5370830 97.9191460 + 40.5391460 97.9212500 + 40.5412500 97.9191880 + 40.5433130 97.9170830 + 40.5475210 97.9170830 + 40.5495830 97.9150210 + 40.5495830 97.8941460 + 40.5516460 97.8920830 + 40.5537500 97.8900210 + 40.5537500 97.8858130 + 40.5558130 97.8837500 + 40.5579170 97.8816880 + 40.5599790 97.8795830 + 40.5620830 97.8775210 + 40.5620830 97.8649790 + 40.5641460 97.8629170 + 40.5662500 97.8608540 + 40.5662500 97.8483130 + 40.5683130 97.8462500 + 40.5704170 97.8441880 + 40.5724790 97.8420830 + 40.5745830 97.8400210 + 40.5745830 97.8358130 + 40.5766460 97.8337500 + 40.5787500 97.8316880 + 40.5787500 97.8108130 + 40.5808130 97.8087500 + 40.5829170 97.8066880 + 40.5849790 97.8045830 + 40.5870830 97.8025210 + 40.5870830 97.7983130 + 40.5891460 97.7962500 + 40.5912500 97.7941880 + 40.5933130 97.7920830 + 40.5954170 97.7900210 + 40.5974790 97.7879170 + 40.5995830 97.7858540 + 40.6016460 97.7837500 + 40.6079170 97.7775210 + 40.6079170 97.7733130 + 40.6058540 97.7712500 + 40.6016460 97.7712500 + 40.5995830 97.7691880 + 40.5995830 97.7524790 + 40.6100210 97.7462500 + 40.6120830 97.7441880 + 40.6120830 97.7399790 + 40.6141460 97.7379170 + 40.6162500 97.7358540 + 40.6183130 97.7337500 + 40.6204170 97.7316880 + 40.6204170 97.7149790 + 40.6224790 97.7129170 + 40.6245830 97.7108540 + 40.6245830 97.7066460 + 40.6287500 97.6691460 + 40.6287500 97.6670830 + 40.6141460 97.6670830 + 40.6120830 97.6650210 + 40.6100210 97.6629170 + 40.6079170 97.6608540 + 40.6058540 97.6587500 + 40.6037500 97.6566880 + 40.6016880 97.6545830 + 40.5995830 97.6525210 + 40.5995830 97.6483130 + 40.5975210 97.6462500 + 40.5954170 97.6441880 + 40.5954170 97.6399790 + 40.5933540 97.6379170 + 40.5912500 97.6358540 + 40.5891880 97.6337500 + 40.5870830 97.6316880 + 40.5870830 97.6191460 + 40.5891460 97.6170830 + 40.5912500 97.6150210 + 40.5933130 97.6129170 + 40.5954170 97.6066460 + 40.5974790 97.6045830 + 40.5995830 97.6025210 + 40.5975210 97.6004170 + 40.5954170 97.5983540 + 40.5954170 97.5816460 + 40.5974790 97.5795830 + 40.5995830 97.5775210 + 40.5995830 97.5608130 + 40.6016460 97.5587500 + 40.6037500 97.5566880 + 40.6037500 97.5524790 + 40.6058130 97.5504170 + 40.6100210 97.5504170 + 40.6120830 97.5483540 + 40.6141460 97.5462500 + 40.6162500 97.5441880 + 40.6162500 97.5399790 + 40.6183130 97.5379170 + 40.6204170 97.5358540 + 40.6204170 97.5274790 + 40.6183540 97.5254170 + 40.6162500 97.5233540 + 40.6162500 97.5149790 + 40.6183130 97.5129170 + 40.6204170 97.5108540 + 40.6224790 97.5087500 + 40.6245830 97.5066880 + 40.6266460 97.5045830 + 40.6287500 97.5025210 + 40.6287500 97.4858130 + 40.6308130 97.4837500 + 40.6329170 97.4816880 + 40.6308540 97.4795830 + 40.6287500 97.4775210 + 40.6287500 97.4691460 + 40.6266880 97.4670830 + 40.6245830 97.4650210 + 40.6245830 97.4608130 + 40.6225210 97.4587500 + 40.6204170 97.4566880 + 40.6183540 97.4545830 + 40.6162500 97.4525210 + 40.6141880 97.4504170 + 40.6120830 97.4483540 + 40.6120830 97.4358130 + 40.6100210 97.4337500 + 40.6079170 97.4316880 + 40.6099790 97.4295830 + 40.6120830 97.4275210 + 40.6120830 97.4191460 + 40.6100210 97.4170830 + 40.6079170 97.4150210 + 40.6079170 97.4108130 + 40.6099790 97.4087500 + 40.6120830 97.4024790 + 40.6141460 97.4004170 + 40.6162500 97.3983540 + 40.6141880 97.3962500 + 40.6120830 97.3941880 + 40.6120830 97.3774790 + 40.6141460 97.3754170 + 40.6183540 97.3754170 + 40.6204170 97.3733540 + 40.6224790 97.3712500 + 40.6245830 97.3691880 + 40.6266460 97.3670830 + 40.6287500 97.3650210 + 40.6287500 97.3608130 + 40.6308130 97.3587500 + 40.6329170 97.3566880 + 40.6329170 97.3483130 + 40.6349790 97.3462500 + 40.6370830 97.3441880 + 40.6391460 97.3420830 + 40.6412500 97.3400210 + 40.6412500 97.3358130 + 40.6433130 97.3337500 + 40.6454170 97.3316880 + 40.6454170 97.3149790 + 40.6433540 97.3129170 + 40.6412500 97.3108540 + 40.6433130 97.3087500 + 40.6454170 97.3066880 + 40.6454170 97.3024790 + 40.6474790 97.3004170 + 40.6495830 97.2983540 + 40.6516460 97.2962500 + 40.6558540 97.2962500 + 40.6579170 97.2941880 + 40.6599790 97.2920830 + 40.6641880 97.2920830 + 40.6662500 97.2900210 + 40.6662500 97.2691460 + 40.6641880 97.2670830 + 40.6599790 97.2670830 + 40.6579170 97.2650210 + 40.6579170 97.2608130 + 40.6558540 97.2587500 + 40.6537500 97.2566880 + 40.6537500 97.2441460 + 40.6558130 97.2420830 + 40.6579170 97.2400210 + 40.6579170 97.2274790 + 40.6599790 97.2254170 + 40.6620830 97.2233540 + 40.6600210 97.2212500 + 40.6579170 97.2191880 + 40.6579170 97.2024790 + 40.6558540 97.2004170 + 40.6537500 97.1983540 + 40.6558130 97.1962500 + 40.6579170 97.1941880 + 40.6579170 97.1858130 + 40.6620830 97.1774790 + 40.6620830 97.1754170 + 40.6599790 97.1754170 + 40.6579170 97.1733540 + 40.6558540 97.1712500 + 40.6537500 97.1691880 + 40.6516880 97.1670830 + 40.6495830 97.1650210 + 40.6495830 97.1608130 + 40.6475210 97.1587500 + 40.6454170 97.1566880 + 40.6433540 97.1545830 + 40.6329170 97.1483540 + 40.6329170 97.1274790 + 40.6308540 97.1254170 + 40.6287500 97.1233540 + 40.6287500 97.1024790 + 40.6266880 97.1004170 + 40.6245830 97.0983540 + 40.6245830 97.0816460 + 40.6225210 97.0795830 + 40.6204170 97.0775210 + 40.6204170 97.0733130 + 40.6183540 97.0712500 + 40.6162500 97.0691880 + 40.6141880 97.0670830 + 40.6120830 97.0650210 + 40.6100210 97.0629170 + 40.6079170 97.0608540 + 40.6079170 97.0566460 + 40.6058540 97.0545830 + 40.5933130 97.0545830 + 40.5912500 97.0525210 + 40.5891880 97.0504170 + 40.5870830 97.0483540 + 40.5870830 97.0399790 + 40.5745830 97.0275210 + 40.5745830 97.0233130 + 40.5725210 97.0212500 + 40.5704170 97.0191880 + 40.5704170 97.0066460 + 40.5683540 97.0045830 + 40.5662500 97.0025210 + 40.5641880 97.0004170 + 40.5558130 97.0004170 + 40.5537500 97.0024790 + 40.5516880 97.0045830 + 40.5370830 97.0025210 + 40.5329170 96.9983540 + 40.5308540 96.9962500 + 40.5120830 96.9941880 + 40.5100210 96.9920830 + 40.5079170 96.9941460 + 40.5058540 96.9962500 + 40.4974790 96.9920830 + 40.4954170 96.9920830 + 40.4933540 97.0004170 + 40.4891460 97.0004170 + 40.4829170 97.0066460 + 40.4829170 97.0108540 + 40.4808130 97.0129170 + 40.4787500 97.0149790 + 40.4787500 97.0170830 +WOON1HW WAHOO CREEK AT WAHOO, NE -1 171 41.23083 96.76083 + 41.1975210 96.6212500 + 41.1787500 96.6441880 + 41.1766880 96.6462500 + 41.1641880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3329170 96.8920830 + 41.3329170 96.8899790 + 41.3349790 96.8879170 + 41.3370830 96.8858540 + 41.3370830 96.8816460 + 41.3391460 96.8795830 + 41.3433540 96.8795830 + 41.3454170 96.8775210 + 41.3474790 96.8754170 + 41.3495830 96.8733540 + 41.3495830 96.8399790 + 41.3475210 96.8379170 + 41.3454170 96.8358540 + 41.3454170 96.8316460 + 41.3433540 96.8295830 + 41.3412500 96.8275210 + 41.3412500 96.8149790 + 41.3391880 96.8129170 + 41.3349790 96.8129170 + 41.3329170 96.8108540 + 41.3308540 96.8087500 + 41.3287500 96.8066880 + 41.3266880 96.8045830 + 41.3245830 96.8025210 + 41.3225210 96.8004170 + 41.3183130 96.8004170 + 41.3162500 96.7983540 + 41.3141880 96.7962500 + 41.3120830 96.7941880 + 41.3100210 96.7920830 + 41.3079170 96.7900210 + 41.3079170 96.7816460 + 41.3058540 96.7795830 + 41.3037500 96.7775210 + 41.3037500 96.7733130 + 41.3016880 96.7712500 + 41.2995830 96.7691880 + 41.2995830 96.7649790 + 41.2975210 96.7629170 + 41.2954170 96.7608540 + 41.2974790 96.7587500 + 41.3016880 96.7587500 + 41.3037500 96.7566880 + 41.3037500 96.7358130 + 41.3016880 96.7337500 + 41.2995830 96.7316880 + 41.2975210 96.7295830 + 41.2954170 96.7275210 + 41.2974790 96.7254170 + 41.2995830 96.7233540 + 41.2995830 96.7024790 + 41.2975210 96.7004170 + 41.2954170 96.6983540 + 41.2954170 96.6858130 + 41.2933540 96.6837500 + 41.2891460 96.6837500 + 41.2870830 96.6816880 + 41.2870830 96.6733130 + 41.2850210 96.6712500 + 41.2829170 96.6691880 + 41.2808540 96.6670830 + 41.2787500 96.6650210 + 41.2787500 96.6566460 + 41.2766880 96.6545830 + 41.2724790 96.6545830 + 41.2704170 96.6525210 + 41.2683540 96.6504170 + 41.2662500 96.6483540 + 41.2641880 96.6462500 + 41.2620830 96.6441880 + 41.2600210 96.6420830 + 41.2579170 96.6400210 + 41.2579170 96.6358130 + 41.2558540 96.6337500 + 41.2537500 96.6316880 + 41.2516880 96.6295830 + 41.2474790 96.6295830 + 41.2454170 96.6275210 + 41.2433540 96.6254170 + 41.2412500 96.6274790 + 41.2391880 96.6295830 + 41.2308130 96.6295830 + 41.2287500 96.6275210 + 41.2266880 96.6254170 + 41.2183130 96.6254170 + 41.2162500 96.6233540 + 41.2141880 96.6212500 + 41.2120830 96.6191880 + 41.2100210 96.6170830 + 41.2079170 96.6150210 + 41.2058540 96.6129170 + 41.1975210 96.6212500 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/basins.dat.OAX b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/basins.dat.OAX new file mode 100644 index 0000000000..e594f8d679 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/basins.dat.OAX @@ -0,0 +1,13335 @@ +105 105 -1 25 40.10000 98.14803 + 40.2029900 98.2218000 + 40.1545600 98.1811800 + 40.1655000 98.1163200 + 40.1364600 98.0893900 + 40.1471400 98.0375500 + 40.1277000 98.0239600 + 40.0990600 97.9710500 + 40.0994700 97.9450000 + 39.9719800 97.9285400 + 39.9707600 98.0065400 + 39.9410900 98.0187100 + 39.9308500 98.0444100 + 39.9504900 98.0449800 + 39.9684000 98.1495200 + 39.9478600 98.2009000 + 39.9770900 98.2148100 + 39.9651600 98.3314800 + 39.9845600 98.3451200 + 40.0341500 98.3207000 + 40.1618200 98.3248400 + 40.2102000 98.3655600 + 40.2691300 98.3675100 + 40.2504600 98.3146700 + 40.2308200 98.3140300 + 40.2029900 98.2218000 +106 106 -1 27 39.90240 98.37499 + 39.9410900 98.0187100 + 39.8723400 98.0167800 + 39.8328500 98.0286500 + 39.8418200 98.0808300 + 39.8023200 98.0926600 + 39.8213100 98.1321500 + 39.8092200 98.2615400 + 39.8286200 98.2751300 + 39.8239100 98.5215900 + 39.8432900 98.5352600 + 39.8326800 98.5738200 + 39.8812400 98.6015400 + 39.8796000 98.6794200 + 39.9079400 98.7324600 + 39.9275900 98.7332100 + 39.9990800 98.6058100 + 39.9701600 98.5787500 + 40.0024700 98.4367800 + 39.9833300 98.4101200 + 39.9845600 98.3451200 + 39.9651600 98.3314800 + 39.9770900 98.2148100 + 39.9478600 98.2009000 + 39.9684000 98.1495200 + 39.9504900 98.0449800 + 39.9308500 98.0444100 + 39.9410900 98.0187100 +107 107 -1 21 39.94800 97.86219 + 39.9553600 97.7200800 + 39.9358900 97.7066100 + 39.8966000 97.7056800 + 39.8964200 97.7186700 + 39.8866000 97.7184300 + 39.8862500 97.7444000 + 39.7973100 97.7811700 + 39.7965600 97.8330300 + 39.8737700 97.9259100 + 39.8635500 97.9516100 + 39.8527000 98.0162300 + 39.8723400 98.0167800 + 39.9410900 98.0187100 + 39.9707600 98.0065400 + 39.9719800 97.9285400 + 40.0994700 97.9450000 + 40.0707900 97.8921400 + 40.0317000 97.8780900 + 40.0041100 97.7472700 + 39.9648200 97.7463100 + 39.9553600 97.7200800 +108 108 -1 22 39.68160 98.05697 + 39.8635500 97.9516100 + 39.7663300 97.8841300 + 39.7172200 97.8828500 + 39.7077900 97.8566900 + 39.5408400 97.8523900 + 39.4909700 97.9027900 + 39.5298500 97.9296600 + 39.5480600 98.0206500 + 39.6150900 98.1260500 + 39.6142000 98.1777900 + 39.6429700 98.2174900 + 39.7021200 98.2063600 + 39.7213000 98.2328600 + 39.7802200 98.2347000 + 39.8092200 98.2615400 + 39.8213100 98.1321500 + 39.8023200 98.0926600 + 39.8418200 98.0808300 + 39.8328500 98.0286500 + 39.8723400 98.0167800 + 39.8527000 98.0162300 + 39.8635500 97.9516100 +109 109 -1 19 39.64590 97.80373 + 39.8866000 97.7184300 + 39.7392800 97.7149200 + 39.6808800 97.6746700 + 39.4744800 97.6828100 + 39.4257200 97.6558600 + 39.4052100 97.7199000 + 39.4626600 97.8245700 + 39.4715200 97.8893700 + 39.4909700 97.9027900 + 39.5408400 97.8523900 + 39.7077900 97.8566900 + 39.7172200 97.8828500 + 39.7663300 97.8841300 + 39.8635500 97.9516100 + 39.8737700 97.9259100 + 39.7965600 97.8330300 + 39.7973100 97.7811700 + 39.8862500 97.7444000 + 39.8866000 97.7184300 +110 110 -1 31 39.66770 97.56583 + 39.8966000 97.7056800 + 39.8778200 97.6403000 + 39.9177800 97.5892400 + 39.8984600 97.5628400 + 39.8793000 97.5234500 + 39.8013400 97.4699200 + 39.6931500 97.4806600 + 39.5959700 97.3881100 + 39.6356800 97.3500500 + 39.7141200 97.3644800 + 39.7538200 97.3263400 + 39.7832800 97.3268900 + 39.8033300 97.2883400 + 39.7842100 97.2361200 + 39.7254100 97.2221500 + 39.7160800 97.1701700 + 39.5583200 97.2322500 + 39.4983300 97.3345700 + 39.5174100 97.3866100 + 39.4680100 97.4114800 + 39.4775400 97.4375000 + 39.4281400 97.4623300 + 39.4177000 97.5137300 + 39.4268900 97.5655500 + 39.4257200 97.6558600 + 39.4744800 97.6828100 + 39.6808800 97.6746700 + 39.7392800 97.7149200 + 39.8866000 97.7184300 + 39.8964200 97.7186700 + 39.8966000 97.7056800 +111 111 -1 32 39.51920 97.28186 + 39.7070700 97.0793400 + 39.6481400 97.0784500 + 39.5594100 97.1159100 + 39.4715800 97.0500000 + 39.4713600 97.0758100 + 39.4021500 97.1263900 + 39.3234700 97.1380500 + 39.3231100 97.1767000 + 39.2443000 97.2011700 + 39.2440500 97.2269100 + 39.2731200 97.2660400 + 39.2727300 97.3046600 + 39.3215600 97.3313100 + 39.3306700 97.3959200 + 39.3797700 97.3968700 + 39.3991200 97.4230400 + 39.3785800 97.5000200 + 39.3882400 97.5131100 + 39.4177000 97.5137300 + 39.4281400 97.4623300 + 39.4775400 97.4375000 + 39.4680100 97.4114800 + 39.5174100 97.3866100 + 39.4983300 97.3345700 + 39.5583200 97.2322500 + 39.7160800 97.1701700 + 39.7254100 97.2221500 + 39.7842100 97.2361200 + 39.7944100 97.1973800 + 39.7262600 97.1314500 + 39.7266000 97.0925900 + 39.7070700 97.0793400 +112 112 -1 24 39.25080 97.01398 + 39.3843000 96.9068600 + 39.3844800 96.8810700 + 39.3746600 96.8809500 + 39.3157300 96.8802300 + 39.2277000 96.8276900 + 39.1491400 96.8268000 + 39.1193200 96.8778500 + 39.0307500 96.9024600 + 39.0501100 96.9412100 + 39.0300700 96.9922900 + 39.0496100 97.0053900 + 39.1278500 97.0450300 + 39.1470500 97.0967300 + 39.1961500 97.0974700 + 39.2443000 97.2011700 + 39.3231100 97.1767000 + 39.3234700 97.1380500 + 39.4021500 97.1263900 + 39.4713600 97.0758100 + 39.4715800 97.0500000 + 39.4324000 97.0365200 + 39.4425400 96.9979500 + 39.3839100 96.9584400 + 39.3843000 96.9068600 +117 117 -1 8 39.69910 97.40350 + 39.7538200 97.3263400 + 39.7141200 97.3644800 + 39.6356800 97.3500500 + 39.5959700 97.3881100 + 39.6931500 97.4806600 + 39.8013400 97.4699200 + 39.8022300 97.3921000 + 39.7538200 97.3263400 +1407 1407 -1 11 41.06810 98.88040 + 41.1598700 99.0189800 + 41.1605000 98.9925500 + 41.0649600 98.8696300 + 41.0476400 98.7632800 + 41.0187300 98.7357600 + 40.9756300 98.9055900 + 41.0146300 98.9203900 + 40.9943800 98.9459500 + 40.9925200 99.0250400 + 41.0131100 98.9863200 + 41.1598700 99.0189800 +1411 1411 -1 16 41.41380 99.08044 + 41.5238300 99.0213200 + 41.4756100 98.9793900 + 41.4657800 98.9789700 + 41.4461300 98.9781300 + 41.3281800 98.9731500 + 41.2787300 98.9843200 + 41.2670300 99.0633100 + 41.2854000 99.1171100 + 41.3725500 99.1740300 + 41.3722200 99.1872900 + 41.3820500 99.1877400 + 41.4432900 99.0975400 + 41.5124200 99.0873000 + 41.5606000 99.1293200 + 41.5232000 99.0478800 + 41.5238300 99.0213200 +1412 1412 -1 15 41.18790 98.92117 + 41.3281800 98.9731500 + 41.3192700 98.9330100 + 41.2897800 98.9317900 + 41.2227800 98.8495700 + 41.1447500 98.8199800 + 41.0878000 98.7252200 + 41.0476400 98.7632800 + 41.0649600 98.8696300 + 41.1605000 98.9925500 + 41.1598700 99.0189800 + 41.2277200 99.0616000 + 41.2854000 99.1171100 + 41.2670300 99.0633100 + 41.2787300 98.9843200 + 41.3281800 98.9731500 +1413 1413 -1 26 41.03090 98.65353 + 41.2230800 98.8363400 + 41.2048700 98.7694400 + 41.1658500 98.7546800 + 41.1568700 98.7146500 + 41.0796400 98.6456400 + 41.1011700 98.5539500 + 41.1208300 98.5546600 + 41.1213500 98.5282400 + 41.1017000 98.5275300 + 41.0323800 98.5514600 + 40.9990800 98.7350000 + 40.9204700 98.7319600 + 40.8988100 98.8233700 + 40.8493900 98.8345700 + 40.8485100 98.8740500 + 40.8386800 98.8736500 + 40.8482100 98.8872000 + 40.8467000 98.9529800 + 40.9348100 98.9698300 + 40.9756300 98.9055900 + 41.0187300 98.7357600 + 41.0476400 98.7632800 + 41.0878000 98.7252200 + 41.1447500 98.8199800 + 41.2227800 98.8495700 + 41.2230800 98.8363400 +1414 1414 -1 12 41.33440 98.88117 + 41.3511400 98.8282400 + 41.3126900 98.7869300 + 41.2930400 98.7861600 + 41.2439000 98.7842100 + 41.2230800 98.8363400 + 41.2227800 98.8495700 + 41.2897800 98.9317900 + 41.3192700 98.9330100 + 41.3281800 98.9731500 + 41.4461300 98.9781300 + 41.3499600 98.8812300 + 41.3511400 98.8282400 +1415 1415 -1 11 41.18630 98.69514 + 41.2930400 98.7861600 + 41.2444700 98.7577500 + 41.1208300 98.5546600 + 41.1011700 98.5539500 + 41.0796400 98.6456400 + 41.1568700 98.7146500 + 41.1658500 98.7546800 + 41.2048700 98.7694400 + 41.2230800 98.8363400 + 41.2439000 98.7842100 + 41.2930400 98.7861600 +1416 1416 -1 18 41.19180 98.62523 + 41.3332100 98.7479600 + 41.2663700 98.6526400 + 41.2193700 98.5449800 + 41.1999800 98.5310500 + 41.2209300 98.4656200 + 41.2020300 98.4252600 + 41.1135700 98.4222300 + 41.0334300 98.4987000 + 41.0323800 98.5514600 + 41.1017000 98.5275300 + 41.1213500 98.5282400 + 41.1208300 98.5546600 + 41.2444700 98.7577500 + 41.2930400 98.7861600 + 41.3126900 98.7869300 + 41.3511400 98.8282400 + 41.3323500 98.7877000 + 41.3332100 98.7479600 +1420 1420 -1 18 41.68590 99.05527 + 41.7975200 99.0998600 + 41.8485800 99.0219700 + 41.7247000 98.8433100 + 41.6749500 98.8679400 + 41.6740500 98.9078700 + 41.6347300 98.9062400 + 41.5843600 98.9573800 + 41.5253800 98.9549000 + 41.5238300 99.0213200 + 41.5232000 99.0478800 + 41.5606000 99.1293200 + 41.5799400 99.1434900 + 41.5691300 99.1829100 + 41.6654200 99.2672300 + 41.6766000 99.2144400 + 41.7260900 99.2033800 + 41.7575500 99.1247700 + 41.7975200 99.0998600 +1421 1421 -1 16 41.57800 98.86229 + 41.7247000 98.8433100 + 41.6579000 98.7473600 + 41.6191400 98.7192200 + 41.5506000 98.7032700 + 41.4317900 98.7385300 + 41.4312200 98.7650700 + 41.4508800 98.7658400 + 41.4657800 98.9789700 + 41.4756100 98.9793900 + 41.5238300 99.0213200 + 41.5253800 98.9549000 + 41.5843600 98.9573800 + 41.6347300 98.9062400 + 41.6740500 98.9078700 + 41.6749500 98.8679400 + 41.7247000 98.8433100 +1422 1422 -1 19 41.49120 98.68251 + 41.6500200 98.6538200 + 41.6210700 98.6261100 + 41.5424200 98.6231700 + 41.4531300 98.6596800 + 41.3750300 98.6302000 + 41.3733700 98.7097300 + 41.3332100 98.7479600 + 41.3323500 98.7877000 + 41.3511400 98.8282400 + 41.3499600 98.8812300 + 41.4461300 98.9781300 + 41.4657800 98.9789700 + 41.4508800 98.7658400 + 41.4312200 98.7650700 + 41.4317900 98.7385300 + 41.5506000 98.7032700 + 41.6191400 98.7192200 + 41.6489100 98.7070500 + 41.6500200 98.6538200 +1423 1423 -1 13 41.38090 98.60086 + 41.5424200 98.6231700 + 41.4845100 98.5678600 + 41.4257900 98.5524400 + 41.4170000 98.4990300 + 41.2605000 98.4537600 + 41.2305000 98.4791900 + 41.2193700 98.5449800 + 41.2663700 98.6526400 + 41.3332100 98.7479600 + 41.3733700 98.7097300 + 41.3750300 98.6302000 + 41.4531300 98.6596800 + 41.5424200 98.6231700 +1424 1424 -1 20 41.46640 98.49505 + 41.5468400 98.3972700 + 41.4684300 98.3813200 + 41.4200100 98.3398600 + 41.3118700 98.3362700 + 41.2819000 98.3617700 + 41.2909900 98.4018200 + 41.4175200 98.4725000 + 41.4170000 98.4990300 + 41.4257900 98.5524400 + 41.4845100 98.5678600 + 41.5424200 98.6231700 + 41.6210700 98.6261100 + 41.6500200 98.6538200 + 41.6508400 98.6139000 + 41.6311800 98.6131700 + 41.6319800 98.5732600 + 41.6327700 98.5333400 + 41.5939700 98.5053300 + 41.5949900 98.4521400 + 41.5468400 98.3972700 +1425 1425 -1 19 41.27230 98.33995 + 41.4020100 98.2463700 + 41.2856300 98.1499300 + 41.2268800 98.1349100 + 41.1145700 98.3694000 + 41.1135700 98.4222300 + 41.2020300 98.4252600 + 41.2209300 98.4656200 + 41.1999800 98.5310500 + 41.2193700 98.5449800 + 41.2305000 98.4791900 + 41.2605000 98.4537600 + 41.4170000 98.4990300 + 41.4175200 98.4725000 + 41.2909900 98.4018200 + 41.2819000 98.3617700 + 41.3118700 98.3362700 + 41.4200100 98.3398600 + 41.4310300 98.2738500 + 41.4020100 98.2463700 +1426 1426 -1 11 41.31990 98.07302 + 41.3762700 98.0200600 + 41.3680600 97.9137300 + 41.3387700 97.8996700 + 41.2793900 97.9245600 + 41.2268800 98.1349100 + 41.2856300 98.1499300 + 41.4020100 98.2463700 + 41.4129800 98.1803700 + 41.3741100 98.1526300 + 41.3649400 98.1125600 + 41.3762700 98.0200600 +1427 1427 -1 14 41.78970 98.69801 + 41.8312500 98.4470600 + 41.8216700 98.4333700 + 41.8020000 98.4326900 + 41.7233300 98.4299600 + 41.7018700 98.5225100 + 41.7215300 98.5232200 + 41.7385200 98.6571700 + 41.7857200 98.7523700 + 41.7969700 98.6860800 + 41.7502400 98.5642600 + 41.8095100 98.5530900 + 41.8775600 98.5956500 + 41.7512900 98.5109600 + 41.8312500 98.4470600 +1428 1428 -1 19 41.66610 98.33966 + 41.7761200 98.2316800 + 41.7171100 98.2298000 + 41.6207900 98.1069600 + 41.5912900 98.1060700 + 41.5307400 98.1973100 + 41.5302800 98.2238800 + 41.5693800 98.2384200 + 41.5979400 98.2925600 + 41.5468400 98.3972700 + 41.5949900 98.4521400 + 41.5939700 98.5053300 + 41.6327700 98.5333400 + 41.6319800 98.5732600 + 41.7016100 98.5358300 + 41.7018700 98.5225100 + 41.7233300 98.4299600 + 41.8020000 98.4326900 + 41.7857200 98.2453300 + 41.7761200 98.2316800 +1429 1429 -1 17 41.49290 98.20386 + 41.6207900 98.1069600 + 41.5042900 98.0104400 + 41.3762700 98.0200600 + 41.3649400 98.1125600 + 41.3741100 98.1526300 + 41.4129800 98.1803700 + 41.4020100 98.2463700 + 41.4310300 98.2738500 + 41.4200100 98.3398600 + 41.4684300 98.3813200 + 41.5468400 98.3972700 + 41.5979400 98.2925600 + 41.5693800 98.2384200 + 41.5302800 98.2238800 + 41.5307400 98.1973100 + 41.5912900 98.1060700 + 41.6207900 98.1069600 +1430 1430 -1 19 41.55790 97.97990 + 41.7672000 98.1780500 + 41.7184700 98.1498700 + 41.6319100 98.0274100 + 41.5925800 98.0262800 + 41.5833700 97.9861000 + 41.5245700 97.9711500 + 41.4185800 97.8222000 + 41.4297000 97.7295700 + 41.3707000 97.7281200 + 41.3692300 97.8341800 + 41.3387700 97.8996700 + 41.3680600 97.9137300 + 41.3762700 98.0200600 + 41.5042900 98.0104400 + 41.6207900 98.1069600 + 41.7171100 98.2298000 + 41.7761200 98.2316800 + 41.7770300 98.1783500 + 41.7672000 98.1780500 +1431 1431 -1 21 41.87420 98.27620 + 41.9346300 98.1698900 + 41.9162800 98.0891200 + 41.8777800 98.0345400 + 41.8482700 98.0336800 + 41.8083000 98.0725600 + 41.7689600 98.0713900 + 41.7672000 98.1780500 + 41.7770300 98.1783500 + 41.7761200 98.2316800 + 41.7857200 98.2453300 + 41.8020000 98.4326900 + 41.8216700 98.4333700 + 41.8312500 98.4470600 + 41.8229100 98.3666700 + 41.8728200 98.3282800 + 41.9212600 98.3700000 + 41.9288400 98.4905900 + 41.9676600 98.5187200 + 41.9812500 98.3185100 + 41.9428600 98.2637500 + 41.9346300 98.1698900 +1432 1432 -1 19 41.63380 97.95381 + 41.8482700 98.0336800 + 41.8491100 97.9802900 + 41.7905000 97.9519500 + 41.7523500 97.8708700 + 41.7228400 97.8700900 + 41.7237900 97.8034700 + 41.6742400 97.8288300 + 41.5475100 97.7457700 + 41.4297000 97.7295700 + 41.4185800 97.8222000 + 41.5245700 97.9711500 + 41.5833700 97.9861000 + 41.5925800 98.0262800 + 41.6319100 98.0274100 + 41.7184700 98.1498700 + 41.7672000 98.1780500 + 41.7689600 98.0713900 + 41.8083000 98.0725600 + 41.8482700 98.0336800 +1434 1434 -1 18 41.54720 97.70525 + 41.5485700 97.6660200 + 41.5194100 97.6387500 + 41.5009000 97.5453100 + 41.4714000 97.5446600 + 41.4724800 97.4517200 + 41.4340200 97.3712800 + 41.4143600 97.3709000 + 41.4027300 97.5298800 + 41.4010700 97.6625300 + 41.3812400 97.6753200 + 41.3712300 97.6883500 + 41.3707000 97.7281200 + 41.4297000 97.7295700 + 41.5475100 97.7457700 + 41.6742400 97.8288300 + 41.7237900 97.8034700 + 41.7048600 97.7496800 + 41.5485700 97.6660200 +1601 1601 -1 43 42.04000 95.64500 + 42.1200000 95.7500000 + 42.1700000 95.7200000 + 42.2000000 95.6700000 + 42.2200000 95.6300000 + 42.3000000 95.5200000 + 42.2800000 95.4500000 + 42.3000000 95.4300000 + 42.3000000 95.4000000 + 42.2700000 95.3800000 + 42.2800000 95.3500000 + 42.2700000 95.3200000 + 42.2300000 95.3300000 + 42.2200000 95.3700000 + 42.2000000 95.3800000 + 42.2000000 95.4000000 + 42.1700000 95.4200000 + 42.1200000 95.3800000 + 42.1000000 95.4200000 + 42.0800000 95.4800000 + 42.0300000 95.5500000 + 42.0300000 95.5800000 + 42.0200000 95.6300000 + 42.0000000 95.6700000 + 42.0000000 95.6800000 + 41.9300000 95.7000000 + 41.9200000 95.7500000 + 41.8700000 95.7500000 + 41.8500000 95.8200000 + 41.8000000 95.8500000 + 41.8000000 95.8700000 + 41.7800000 95.9000000 + 41.8300000 95.9300000 + 41.8500000 95.9700000 + 41.9000000 95.9500000 + 41.9200000 95.9300000 + 41.9700000 95.9200000 + 41.9800000 95.8700000 + 42.0200000 95.8500000 + 42.0300000 95.8300000 + 42.0700000 95.8300000 + 42.0800000 95.8000000 + 42.0800000 95.7700000 + 42.1200000 95.7500000 +1602 1602 -1 74 42.12500 95.20283 + 42.6300000 95.2800000 + 42.6000000 95.2000000 + 42.5800000 95.1300000 + 42.5200000 95.1000000 + 42.5000000 95.1200000 + 42.4700000 95.1000000 + 42.3700000 95.0800000 + 42.3200000 95.0700000 + 42.3200000 95.0300000 + 42.2700000 95.0500000 + 42.2300000 95.0300000 + 42.2200000 95.0000000 + 42.2000000 95.0200000 + 42.1500000 95.0300000 + 42.1200000 95.0200000 + 42.0800000 95.0200000 + 42.0700000 95.0200000 + 42.0500000 95.0300000 + 42.0300000 95.0300000 + 42.0200000 95.0500000 + 42.0300000 95.0800000 + 42.0200000 95.1300000 + 42.0200000 95.1500000 + 42.0000000 95.1800000 + 41.9800000 95.2300000 + 41.9500000 95.2300000 + 41.9500000 95.2800000 + 41.9200000 95.2800000 + 41.9200000 95.3000000 + 41.9000000 95.3800000 + 41.8700000 95.4000000 + 41.8800000 95.4300000 + 41.8500000 95.4200000 + 41.8000000 95.4800000 + 41.7800000 95.4800000 + 41.7700000 95.5200000 + 41.7200000 95.5500000 + 41.7300000 95.5800000 + 41.6500000 95.6300000 + 41.6300000 95.6300000 + 41.6200000 95.6500000 + 41.6200000 95.7200000 + 41.6500000 95.7800000 + 41.6500000 95.8000000 + 41.7000000 95.8000000 + 41.7700000 95.7300000 + 41.8000000 95.7300000 + 41.8200000 95.7000000 + 41.8700000 95.7000000 + 41.8800000 95.6700000 + 41.9200000 95.6500000 + 41.9300000 95.6200000 + 41.9800000 95.5800000 + 42.0000000 95.5700000 + 42.0300000 95.5500000 + 42.0800000 95.4800000 + 42.1000000 95.4200000 + 42.1200000 95.3800000 + 42.1700000 95.4200000 + 42.2000000 95.4000000 + 42.2000000 95.3800000 + 42.2200000 95.3700000 + 42.2300000 95.3300000 + 42.2700000 95.3200000 + 42.2800000 95.2500000 + 42.3200000 95.2200000 + 42.3500000 95.2200000 + 42.3700000 95.2300000 + 42.4300000 95.2300000 + 42.4500000 95.2700000 + 42.5200000 95.2800000 + 42.5300000 95.3000000 + 42.5700000 95.3000000 + 42.6300000 95.2800000 +1603 WEEPING WATER CR. AT UNION NE -1 262 40.81000 96.30667 + 40.7912500 95.9108130 + 40.7850210 95.9087500 + 40.7808130 95.9087500 + 40.7787500 95.9066880 + 40.7766880 95.9004170 + 40.7683130 95.9004170 + 40.7620830 95.9066460 + 40.7620830 95.9108540 + 40.7599790 95.9129170 + 40.7579170 95.9150210 + 40.7516880 95.9212500 + 40.7433130 95.9212500 + 40.7412500 95.9233540 + 40.7391460 95.9254170 + 40.7370830 95.9233130 + 40.7308130 95.9212500 + 40.7287500 95.9233130 + 40.7287500 95.9400210 + 40.7266880 95.9420830 + 40.7224790 95.9420830 + 40.7204170 95.9441880 + 40.7183540 95.9462500 + 40.7141460 95.9462500 + 40.7120830 95.9483540 + 40.7099790 95.9504170 + 40.7079170 95.9525210 + 40.7058540 95.9545830 + 40.7016460 95.9545830 + 40.6995830 95.9545830 + 40.6954170 95.9733540 + 40.6975210 95.9754170 + 40.6995830 95.9775210 + 40.7058130 95.9837500 + 40.7141880 95.9837500 + 40.7162500 95.9858540 + 40.7183540 95.9879170 + 40.7204170 95.9899790 + 40.7204170 96.0316880 + 40.7225210 96.0337500 + 40.7245830 96.0358130 + 40.7245830 96.0400210 + 40.7224790 96.0420830 + 40.7204170 96.0441880 + 40.7225210 96.0462500 + 40.7245830 96.0483130 + 40.7245830 96.0525210 + 40.7266880 96.0545830 + 40.7287500 96.0566880 + 40.7308540 96.0587500 + 40.7329170 96.0608130 + 40.7329170 96.0733540 + 40.7349790 96.0754170 + 40.7391880 96.0754170 + 40.7412500 96.0775210 + 40.7433540 96.0795830 + 40.7454170 96.0816460 + 40.7474790 96.0879170 + 40.7516880 96.0879170 + 40.7620830 96.0983130 + 40.7620830 96.1275210 + 40.7641880 96.1295830 + 40.7662500 96.1316460 + 40.7662500 96.1358540 + 40.7683540 96.1379170 + 40.7704170 96.1399790 + 40.7704170 96.1441880 + 40.7725210 96.1462500 + 40.7745830 96.1483130 + 40.7745830 96.1816880 + 40.7766880 96.1837500 + 40.7787500 96.1858540 + 40.7808540 96.1879170 + 40.7829170 96.1899790 + 40.7829170 96.1941880 + 40.7849790 96.1962500 + 40.7891880 96.1962500 + 40.7912500 96.1983540 + 40.7933130 96.2004170 + 40.8016880 96.2004170 + 40.8037500 96.2025210 + 40.8058130 96.2045830 + 40.8141880 96.2045830 + 40.8162500 96.2066880 + 40.8183540 96.2087500 + 40.8204170 96.2108540 + 40.8225210 96.2129170 + 40.8245830 96.2150210 + 40.8266460 96.2170830 + 40.8308540 96.2170830 + 40.8329170 96.2191460 + 40.8329170 96.2358540 + 40.8350210 96.2379170 + 40.8370830 96.2399790 + 40.8370830 96.2441880 + 40.8391880 96.2462500 + 40.8412500 96.2483130 + 40.8412500 96.2525210 + 40.8391460 96.2545830 + 40.8370830 96.2566460 + 40.8370830 96.2608540 + 40.8349790 96.2629170 + 40.8329170 96.2691880 + 40.8308130 96.2712500 + 40.8287500 96.2733540 + 40.8266880 96.2754170 + 40.8058130 96.2754170 + 40.8037500 96.2775210 + 40.8016880 96.2795830 + 40.7933130 96.2795830 + 40.7912500 96.2816880 + 40.7891460 96.2837500 + 40.7870830 96.2858130 + 40.7870830 96.2900210 + 40.7891880 96.2920830 + 40.7912500 96.2941460 + 40.7912500 96.3066880 + 40.7933540 96.3087500 + 40.7954170 96.3108130 + 40.7954170 96.3233540 + 40.7975210 96.3254170 + 40.7995830 96.3275210 + 40.8016880 96.3295830 + 40.8037500 96.3316880 + 40.8058540 96.3337500 + 40.8079170 96.3358540 + 40.8100210 96.3379170 + 40.8120830 96.3399790 + 40.8120830 96.3650210 + 40.8141460 96.3670830 + 40.8183540 96.3670830 + 40.8204170 96.3691460 + 40.8204170 96.3775210 + 40.8183130 96.3795830 + 40.8162500 96.3816880 + 40.8183540 96.3837500 + 40.8204170 96.3858540 + 40.8225210 96.3879170 + 40.8245830 96.3899790 + 40.8245830 96.3941880 + 40.8245830 96.3962500 + 40.8266880 96.3962500 + 40.8287500 96.3983130 + 40.8308130 96.4004170 + 40.8391880 96.4004170 + 40.8412500 96.3983540 + 40.8433130 96.3962500 + 40.8766880 96.3962500 + 40.8787500 96.3941880 + 40.8808130 96.3920830 + 40.8829170 96.3900210 + 40.8829170 96.3858130 + 40.8849790 96.3837500 + 40.8870830 96.3816880 + 40.8870830 96.3399790 + 40.8850210 96.3379170 + 40.8808130 96.3379170 + 40.8787500 96.3358540 + 40.8787500 96.3274790 + 40.8808130 96.3254170 + 40.8850210 96.3254170 + 40.8891460 96.3212500 + 40.8933540 96.3212500 + 40.8954170 96.3191880 + 40.8954170 96.3108130 + 40.8974790 96.3087500 + 40.9016880 96.3087500 + 40.9037500 96.3066880 + 40.9058130 96.3045830 + 40.9079170 96.3025210 + 40.9079170 96.2941460 + 40.9225210 96.2837500 + 40.9245830 96.2837500 + 40.9245830 96.2816460 + 40.9266460 96.2795830 + 40.9287500 96.2775210 + 40.9287500 96.2691460 + 40.9266880 96.2670830 + 40.9245830 96.2650210 + 40.9245830 96.2566460 + 40.9225210 96.2545830 + 40.9204170 96.2525210 + 40.9204170 96.2399790 + 40.9183540 96.2379170 + 40.9162500 96.2358540 + 40.9141880 96.2337500 + 40.9120830 96.2316880 + 40.9120830 96.1983130 + 40.9141460 96.1962500 + 40.9162500 96.1941880 + 40.9162500 96.1899790 + 40.9183130 96.1879170 + 40.9204170 96.1858540 + 40.9224790 96.1837500 + 40.9266880 96.1837500 + 40.9287500 96.1816880 + 40.9287500 96.1733130 + 40.9162500 96.1545830 + 40.9141460 96.1545830 + 40.9120830 96.1441460 + 40.9100210 96.1420830 + 40.9079170 96.1400210 + 40.9058540 96.1337500 + 40.9037500 96.1316880 + 40.9037500 96.1149790 + 40.9016880 96.1129170 + 40.8995830 96.1108540 + 40.8995830 96.0899790 + 40.9016460 96.0879170 + 40.9141880 96.0879170 + 40.9162500 96.0774790 + 40.9141880 96.0754170 + 40.9120830 96.0441460 + 40.9141460 96.0420830 + 40.9162500 96.0400210 + 40.9162500 96.0024790 + 40.9141880 96.0004170 + 40.9120830 95.9983540 + 40.9100210 95.9962500 + 40.9079170 95.9941880 + 40.9079170 95.9899790 + 40.9099790 95.9879170 + 40.9120830 95.9858540 + 40.9100210 95.9837500 + 40.9079170 95.9816880 + 40.9079170 95.9774790 + 40.9058540 95.9754170 + 40.9037500 95.9733540 + 40.9037500 95.9608130 + 40.8891460 95.9587500 + 40.8870830 95.9566880 + 40.8870830 95.9399790 + 40.8850210 95.9379170 + 40.8808130 95.9379170 + 40.8787500 95.9358540 + 40.8787500 95.9316460 + 40.8766880 95.9295830 + 40.8745830 95.9275210 + 40.8725210 95.9254170 + 40.8683130 95.9254170 + 40.8662500 95.9233540 + 40.8641880 95.9212500 + 40.8620830 95.9191880 + 40.8620830 95.9149790 + 40.8600210 95.9129170 + 40.8558130 95.9129170 + 40.8537500 95.9108540 + 40.8516880 95.9087500 + 40.8495830 95.9108130 + 40.8475210 95.9129170 + 40.8412500 95.9108540 + 40.8391880 95.9087500 + 40.8370830 95.9066880 + 40.8350210 95.9045830 + 40.8329170 95.9066460 + 40.8308540 95.9087500 + 40.8287500 95.9108130 + 40.8266880 95.9129170 + 40.8120830 95.9149790 + 40.8100210 95.9170830 + 40.8079170 95.9150210 + 40.7974790 95.9129170 + 40.7912500 95.9108130 +1604 1604 -1 40 41.62500 94.86500 + 41.7200000 94.9700000 + 41.7300000 94.9700000 + 41.7700000 94.9700000 + 41.8000000 94.9000000 + 41.8800000 94.9700000 + 41.9200000 94.9800000 + 41.9200000 94.9500000 + 41.9200000 94.9000000 + 41.8800000 94.8700000 + 41.8700000 94.8300000 + 41.8000000 94.8000000 + 41.7700000 94.7500000 + 41.7000000 94.7200000 + 41.6500000 94.6700000 + 41.6300000 94.6700000 + 41.6200000 94.6500000 + 41.6000000 94.7000000 + 41.5800000 94.7000000 + 41.5700000 94.6700000 + 41.5300000 94.6700000 + 41.5200000 94.7000000 + 41.5000000 94.7200000 + 41.5000000 94.7300000 + 41.4500000 94.8200000 + 41.4700000 94.8300000 + 41.4500000 94.8700000 + 41.4300000 94.8700000 + 41.3800000 95.0300000 + 41.3300000 95.0700000 + 41.3500000 95.0800000 + 41.4300000 95.0800000 + 41.4500000 95.0700000 + 41.5300000 95.0500000 + 41.5500000 95.0500000 + 41.5800000 94.9800000 + 41.5800000 94.9700000 + 41.6200000 94.9300000 + 41.6500000 94.9700000 + 41.6800000 94.9500000 + 41.7200000 94.9700000 +1605 1605 -1 22 41.41500 94.85500 + 41.5300000 94.6700000 + 41.4800000 94.6300000 + 41.4500000 94.7300000 + 41.4000000 94.7500000 + 41.4000000 94.7800000 + 41.3700000 94.8200000 + 41.3500000 94.8200000 + 41.3000000 94.9200000 + 41.3000000 94.9500000 + 41.3000000 95.0500000 + 41.3200000 95.0700000 + 41.3200000 95.0800000 + 41.3300000 95.0700000 + 41.3800000 95.0300000 + 41.4300000 94.8700000 + 41.4500000 94.8700000 + 41.4700000 94.8300000 + 41.4500000 94.8200000 + 41.5000000 94.7300000 + 41.5000000 94.7200000 + 41.5200000 94.7000000 + 41.5300000 94.6700000 +1606 1606 -1 27 41.22500 95.16000 + 41.3300000 95.0700000 + 41.3200000 95.0800000 + 41.3200000 95.0700000 + 41.3000000 95.0500000 + 41.2300000 95.0500000 + 41.2000000 95.0500000 + 41.2000000 95.0700000 + 41.1200000 95.1000000 + 41.1000000 95.1200000 + 41.0500000 95.1300000 + 41.0300000 95.1500000 + 41.0500000 95.1700000 + 41.0200000 95.2200000 + 41.0200000 95.2300000 + 41.0200000 95.2700000 + 41.1500000 95.2000000 + 41.2300000 95.1700000 + 41.2700000 95.1700000 + 41.2800000 95.1800000 + 41.3200000 95.2000000 + 41.3200000 95.1700000 + 41.3200000 95.1300000 + 41.3200000 95.1200000 + 41.4200000 95.1200000 + 41.4300000 95.0800000 + 41.3500000 95.0800000 + 41.3300000 95.0700000 +1607 W. NISHNABOTNA RIVER AT HANCOCK IA -1 516 41.71000 95.18167 + 41.3891460 95.3712500 + 41.4037500 95.3941460 + 41.4037500 95.4066880 + 41.4058130 95.4087500 + 41.4141880 95.4087500 + 41.4162500 95.4066460 + 41.4224790 95.4004170 + 41.4266880 95.4004170 + 41.4287500 95.4025210 + 41.4308130 95.4045830 + 41.4350210 95.4045830 + 41.4370830 95.4024790 + 41.4391460 95.4004170 + 41.4433540 95.4004170 + 41.4454170 95.3983130 + 41.4474790 95.3962500 + 41.4516880 95.3962500 + 41.4537500 95.3983130 + 41.4558130 95.4087500 + 41.4600210 95.4087500 + 41.4620830 95.4066460 + 41.4641460 95.4045830 + 41.4683540 95.4045830 + 41.4704170 95.4025210 + 41.4704170 95.3941460 + 41.4725210 95.3920830 + 41.4745830 95.3900210 + 41.4745830 95.3858130 + 41.4766460 95.3837500 + 41.4933540 95.3837500 + 41.4954170 95.3858540 + 41.4974790 95.3879170 + 41.5016880 95.3879170 + 41.5037500 95.3899790 + 41.5100210 95.4004170 + 41.5120830 95.3983130 + 41.5141880 95.3962500 + 41.5162500 95.3941460 + 41.5183130 95.3920830 + 41.5266880 95.3920830 + 41.5287500 95.3899790 + 41.5308540 95.3879170 + 41.5329170 95.3858130 + 41.5350210 95.3837500 + 41.5370830 95.3816460 + 41.5391880 95.3795830 + 41.5412500 95.3774790 + 41.5474790 95.3712500 + 41.5516880 95.3712500 + 41.5537500 95.3733130 + 41.5537500 95.3816880 + 41.5558540 95.3837500 + 41.5579170 95.3858540 + 41.5599790 95.3879170 + 41.5683540 95.3879170 + 41.5704170 95.3858130 + 41.5724790 95.3837500 + 41.5766880 95.3837500 + 41.5787500 95.3816460 + 41.5808130 95.3795830 + 41.5850210 95.3795830 + 41.5870830 95.3774790 + 41.5891460 95.3754170 + 41.5933540 95.3754170 + 41.5954170 95.3733130 + 41.5974790 95.3712500 + 41.6016880 95.3712500 + 41.6037500 95.3691460 + 41.6058130 95.3670830 + 41.6100210 95.3670830 + 41.6120830 95.3649790 + 41.6141460 95.3629170 + 41.6433540 95.3629170 + 41.6454170 95.3650210 + 41.6474790 95.3670830 + 41.6558540 95.3670830 + 41.6579170 95.3649790 + 41.6599790 95.3629170 + 41.6641880 95.3629170 + 41.6662500 95.3608130 + 41.6683540 95.3587500 + 41.6704170 95.3566460 + 41.6724790 95.3545830 + 41.7016880 95.3545830 + 41.7037500 95.3524790 + 41.7058130 95.3504170 + 41.7100210 95.3504170 + 41.7120830 95.3525210 + 41.7141880 95.3545830 + 41.7162500 95.3566460 + 41.7162500 95.3608540 + 41.7183540 95.3629170 + 41.7204170 95.3650210 + 41.7225210 95.3670830 + 41.7245830 95.3691880 + 41.7266460 95.3712500 + 41.7370830 95.3774790 + 41.7370830 95.3816880 + 41.7391880 95.3837500 + 41.7412500 95.3858130 + 41.7412500 95.3900210 + 41.7412500 95.3920830 + 41.7600210 95.3920830 + 41.7620830 95.3941460 + 41.7641460 95.3962500 + 41.7683540 95.3962500 + 41.7704170 95.3941880 + 41.7724790 95.3920830 + 41.7745830 95.3900210 + 41.7766460 95.3879170 + 41.7787500 95.3858540 + 41.7787500 95.3816460 + 41.7808130 95.3795830 + 41.7829170 95.3775210 + 41.7829170 95.3691460 + 41.7849790 95.3670830 + 41.7891880 95.3670830 + 41.7912500 95.3691460 + 41.7933130 95.3712500 + 41.7954170 95.3733130 + 41.7974790 95.3754170 + 41.8016880 95.3754170 + 41.8037500 95.3774790 + 41.8058130 95.3795830 + 41.8100210 95.3795830 + 41.8120830 95.3816460 + 41.8141460 95.3837500 + 41.8183540 95.3837500 + 41.8204170 95.3858130 + 41.8224790 95.3879170 + 41.8245830 95.3899790 + 41.8245830 95.3983540 + 41.8266460 95.4004170 + 41.8287500 95.4024790 + 41.8412500 95.4149790 + 41.8412500 95.4191880 + 41.8433130 95.4212500 + 41.8558130 95.4254170 + 41.8600210 95.4254170 + 41.8620830 95.4274790 + 41.8641460 95.4295830 + 41.8725210 95.4295830 + 41.8745830 95.4316460 + 41.8766460 95.4337500 + 41.8808540 95.4337500 + 41.8829170 95.4316880 + 41.8849790 95.4295830 + 41.8870830 95.4275210 + 41.8870830 95.4191460 + 41.8850210 95.4170830 + 41.8829170 95.4150210 + 41.8829170 95.4108130 + 41.8808540 95.4087500 + 41.8787500 95.4066880 + 41.8766880 95.4045830 + 41.8724790 95.4045830 + 41.8704170 95.4025210 + 41.8724790 95.4004170 + 41.8745830 95.3983540 + 41.8766460 95.3962500 + 41.8850210 95.3962500 + 41.8870830 95.3941880 + 41.8891460 95.3920830 + 41.8912500 95.3900210 + 41.8891880 95.3879170 + 41.8870830 95.3858540 + 41.8870830 95.3733130 + 41.8891460 95.3712500 + 41.8912500 95.3691880 + 41.8933130 95.3670830 + 41.8954170 95.3650210 + 41.8974790 95.3629170 + 41.8995830 95.3608540 + 41.8995830 95.3524790 + 41.9016460 95.3504170 + 41.9037500 95.3483540 + 41.9058130 95.3462500 + 41.9079170 95.3441880 + 41.9099790 95.3420830 + 41.9120830 95.3400210 + 41.9141460 95.3379170 + 41.9162500 95.3358540 + 41.9162500 95.3274790 + 41.9183130 95.3254170 + 41.9204170 95.3233540 + 41.9204170 95.3108130 + 41.9224790 95.3087500 + 41.9245830 95.3066880 + 41.9245830 95.2899790 + 41.9266460 95.2879170 + 41.9391880 95.2879170 + 41.9475210 95.2962500 + 41.9495830 95.2962500 + 41.9495830 95.2941460 + 41.9516460 95.2920830 + 41.9537500 95.2900210 + 41.9537500 95.2858130 + 41.9558130 95.2837500 + 41.9579170 95.2816880 + 41.9579170 95.2774790 + 41.9558540 95.2754170 + 41.9537500 95.2733540 + 41.9537500 95.2608130 + 41.9558130 95.2587500 + 41.9579170 95.2566880 + 41.9579170 95.2524790 + 41.9599790 95.2504170 + 41.9641880 95.2504170 + 41.9683130 95.2462500 + 41.9808540 95.2462500 + 41.9829170 95.2441880 + 41.9829170 95.2399790 + 41.9849790 95.2379170 + 41.9870830 95.2358540 + 41.9850210 95.2337500 + 41.9829170 95.2316880 + 41.9829170 95.2191460 + 41.9849790 95.2170830 + 41.9870830 95.2150210 + 41.9891460 95.2129170 + 41.9912500 95.2108540 + 41.9912500 95.2024790 + 41.9933130 95.2004170 + 41.9975210 95.2004170 + 41.9995830 95.1983540 + 42.0016460 95.1962500 + 42.0037500 95.1941880 + 42.0058130 95.1920830 + 42.0079170 95.1900210 + 42.0079170 95.1858130 + 42.0099790 95.1837500 + 42.0120830 95.1816880 + 42.0141460 95.1795830 + 42.0162500 95.1775210 + 42.0183130 95.1754170 + 42.0204170 95.1733540 + 42.0183540 95.1712500 + 42.0162500 95.1691880 + 42.0141880 95.1670830 + 42.0120830 95.1650210 + 42.0120830 95.1441460 + 42.0141460 95.1420830 + 42.0162500 95.1400210 + 42.0162500 95.1274790 + 42.0183130 95.1254170 + 42.0225210 95.1254170 + 42.0245830 95.1233540 + 42.0245830 95.1191460 + 42.0266460 95.1170830 + 42.0287500 95.1150210 + 42.0287500 95.1066460 + 42.0308130 95.1045830 + 42.0329170 95.1025210 + 42.0308540 95.1004170 + 42.0287500 95.0983540 + 42.0266880 95.0962500 + 42.0245830 95.0941880 + 42.0225210 95.0920830 + 42.0204170 95.0900210 + 42.0204170 95.0816460 + 42.0224790 95.0795830 + 42.0245830 95.0775210 + 42.0245830 95.0649790 + 42.0370830 95.0525210 + 42.0370830 95.0441460 + 42.0391880 95.0420830 + 42.0412500 95.0420830 + 42.0412500 95.0358130 + 42.0391880 95.0337500 + 42.0370830 95.0316880 + 42.0370830 95.0233130 + 42.0350210 95.0212500 + 42.0266460 95.0212500 + 42.0245830 95.0191880 + 42.0225210 95.0170830 + 42.0183130 95.0170830 + 42.0162500 95.0150210 + 42.0141880 95.0129170 + 42.0099790 95.0129170 + 42.0079170 95.0108540 + 42.0079170 95.0066460 + 42.0058540 95.0045830 + 41.9933130 95.0045830 + 41.9912500 95.0025210 + 41.9912500 94.9983130 + 41.9850210 94.9920830 + 41.9724790 94.9920830 + 41.9704170 94.9900210 + 41.9704170 94.9858130 + 41.9683540 94.9837500 + 41.9641460 94.9837500 + 41.9620830 94.9816880 + 41.9620830 94.9774790 + 41.9600210 94.9754170 + 41.9558130 94.9754170 + 41.9537500 94.9733540 + 41.9537500 94.9691460 + 41.9516880 94.9670830 + 41.9433130 94.9670830 + 41.9412500 94.9650210 + 41.9391880 94.9629170 + 41.9308130 94.9629170 + 41.9287500 94.9608540 + 41.9266880 94.9587500 + 41.9224790 94.9587500 + 41.9204170 94.9608130 + 41.9204170 94.9650210 + 41.9183540 94.9670830 + 41.9162500 94.9691460 + 41.9141880 94.9712500 + 41.9120830 94.9733130 + 41.9141460 94.9754170 + 41.9162500 94.9774790 + 41.9162500 94.9858540 + 41.9141880 94.9879170 + 41.9120830 94.9899790 + 41.9100210 94.9920830 + 41.9016460 94.9920830 + 41.8995830 94.9900210 + 41.8995830 94.9858130 + 41.8975210 94.9837500 + 41.8933130 94.9837500 + 41.8891880 94.9795830 + 41.8766460 94.9795830 + 41.8745830 94.9733130 + 41.8725210 94.9712500 + 41.8704170 94.9691880 + 41.8683540 94.9670830 + 41.8662500 94.9650210 + 41.8641880 94.9629170 + 41.8620830 94.9608540 + 41.8600210 94.9587500 + 41.8579170 94.9566880 + 41.8558540 94.9545830 + 41.8516460 94.9545830 + 41.8495830 94.9525210 + 41.8495830 94.9441460 + 41.8475210 94.9420830 + 41.8454170 94.9400210 + 41.8454170 94.9358130 + 41.8433540 94.9337500 + 41.8370830 94.9316880 + 41.8350210 94.9295830 + 41.8308130 94.9295830 + 41.8287500 94.9275210 + 41.8266880 94.9212500 + 41.8120830 94.9191880 + 41.8100210 94.9170830 + 41.8058130 94.9170830 + 41.7954170 94.9274790 + 41.7933540 94.9295830 + 41.7912500 94.9316460 + 41.7912500 94.9441880 + 41.7891880 94.9462500 + 41.7849790 94.9462500 + 41.7829170 94.9441880 + 41.7808540 94.9420830 + 41.7787500 94.9441460 + 41.7766880 94.9462500 + 41.7745830 94.9483130 + 41.7745830 94.9566880 + 41.7725210 94.9587500 + 41.7704170 94.9608130 + 41.7683540 94.9629170 + 41.7662500 94.9649790 + 41.7641880 94.9670830 + 41.7620830 94.9691460 + 41.7620830 94.9733540 + 41.7600210 94.9754170 + 41.7474790 94.9754170 + 41.7454170 94.9733540 + 41.7433540 94.9712500 + 41.7308130 94.9712500 + 41.7287500 94.9733130 + 41.7266880 94.9754170 + 41.7183130 94.9712500 + 41.7162500 94.9712500 + 41.7100210 94.9837500 + 41.7058130 94.9837500 + 41.7037500 94.9858130 + 41.7037500 94.9983540 + 41.7058130 95.0004170 + 41.7100210 95.0004170 + 41.7120830 95.0024790 + 41.7100210 95.0129170 + 41.7037500 95.0149790 + 41.7037500 95.0400210 + 41.7016460 95.0420830 + 41.6995830 95.0441880 + 41.6975210 95.0462500 + 41.6933130 95.0462500 + 41.6912500 95.0483130 + 41.6912500 95.0608540 + 41.6933540 95.0629170 + 41.6954170 95.0649790 + 41.6954170 95.0691880 + 41.6933130 95.0712500 + 41.6912500 95.0733540 + 41.6891460 95.0754170 + 41.6870830 95.0774790 + 41.6870830 95.1066880 + 41.6891880 95.1087500 + 41.6912500 95.1108130 + 41.6912500 95.1191880 + 41.6891460 95.1212500 + 41.6870830 95.1233130 + 41.6870830 95.1275210 + 41.6849790 95.1295830 + 41.6829170 95.1316880 + 41.6808130 95.1337500 + 41.6787500 95.1358540 + 41.6766460 95.1379170 + 41.6745830 95.1400210 + 41.6725210 95.1420830 + 41.6683130 95.1420830 + 41.6495830 95.1608130 + 41.6495830 95.1650210 + 41.6475210 95.1670830 + 41.6391460 95.1670830 + 41.6370830 95.1691880 + 41.6350210 95.1712500 + 41.6308130 95.1712500 + 41.6287500 95.1733540 + 41.6266880 95.1754170 + 41.6224790 95.1754170 + 41.6204170 95.1733130 + 41.6183130 95.1712500 + 41.6162500 95.1691460 + 41.6141460 95.1670830 + 41.6120830 95.1649790 + 41.6100210 95.1629170 + 41.6058130 95.1629170 + 41.6037500 95.1649790 + 41.6037500 95.1691880 + 41.6016460 95.1712500 + 41.5995830 95.1733540 + 41.5974790 95.1754170 + 41.5954170 95.1774790 + 41.5954170 95.1816880 + 41.5933540 95.1837500 + 41.5891460 95.1837500 + 41.5870830 95.1858540 + 41.5850210 95.1879170 + 41.5808130 95.1879170 + 41.5787500 95.1900210 + 41.5766460 95.1920830 + 41.5745830 95.1899790 + 41.5725210 95.1879170 + 41.5683130 95.1879170 + 41.5662500 95.1900210 + 41.5641880 95.1920830 + 41.5558130 95.1920830 + 41.5537500 95.1941880 + 41.5516880 95.1962500 + 41.5474790 95.1962500 + 41.5454170 95.1983130 + 41.5454170 95.2066880 + 41.5433540 95.2087500 + 41.5391460 95.2087500 + 41.5370830 95.2108540 + 41.5350210 95.2129170 + 41.5308130 95.2129170 + 41.5287500 95.2150210 + 41.5308540 95.2170830 + 41.5329170 95.2191460 + 41.5329170 95.2275210 + 41.5350210 95.2295830 + 41.5370830 95.2316460 + 41.5266880 95.2504170 + 41.5224790 95.2504170 + 41.5204170 95.2483130 + 41.5183540 95.2462500 + 41.5141460 95.2462500 + 41.5120830 95.2441880 + 41.5120830 95.2399790 + 41.5100210 95.2379170 + 41.4891460 95.2379170 + 41.4870830 95.2400210 + 41.4849790 95.2420830 + 41.4829170 95.2400210 + 41.4829170 95.2358130 + 41.4808540 95.2337500 + 41.4683130 95.2337500 + 41.4662500 95.2337500 + 41.4495830 95.2524790 + 41.4495830 95.2608540 + 41.4475210 95.2629170 + 41.4433130 95.2629170 + 41.4412500 95.2649790 + 41.4412500 95.2816880 + 41.4391880 95.2837500 + 41.4141460 95.2837500 + 41.4120830 95.2858540 + 41.4100210 95.2879170 + 41.4058130 95.2879170 + 41.4037500 95.2899790 + 41.4037500 95.3066880 + 41.4058540 95.3087500 + 41.4079170 95.3108130 + 41.4079170 95.3150210 + 41.4058540 95.3170830 + 41.4016460 95.3170830 + 41.3995830 95.3191880 + 41.3975210 95.3212500 + 41.3849790 95.3212500 + 41.3829170 95.3233540 + 41.3808130 95.3254170 + 41.3787500 95.3274790 + 41.3787500 95.3316880 + 41.3808540 95.3337500 + 41.3829170 95.3358130 + 41.3829170 95.3608540 + 41.3850210 95.3629170 + 41.3870830 95.3649790 + 41.3870830 95.3691880 + 41.3891460 95.3712500 +1608 1608 -1 51 41.31000 95.43500 + 41.4700000 95.2300000 + 41.4300000 95.2000000 + 41.4200000 95.2200000 + 41.4000000 95.2000000 + 41.3800000 95.2300000 + 41.3500000 95.2300000 + 41.2800000 95.2300000 + 41.2700000 95.2200000 + 41.2200000 95.2200000 + 41.1300000 95.2800000 + 41.0800000 95.3200000 + 41.0700000 95.3300000 + 41.0200000 95.3500000 + 41.0000000 95.3700000 + 40.9700000 95.3800000 + 40.9800000 95.4200000 + 40.9300000 95.4300000 + 40.8700000 95.5300000 + 40.8700000 95.5800000 + 40.8700000 95.6000000 + 40.8800000 95.6700000 + 40.9300000 95.6700000 + 41.0300000 95.6700000 + 41.0700000 95.6700000 + 41.1500000 95.6500000 + 41.1800000 95.6200000 + 41.2200000 95.6300000 + 41.2700000 95.6300000 + 41.3500000 95.6000000 + 41.4200000 95.5200000 + 41.5000000 95.5000000 + 41.5300000 95.4500000 + 41.6000000 95.4300000 + 41.6700000 95.3800000 + 41.7000000 95.3800000 + 41.7300000 95.4000000 + 41.7500000 95.3800000 + 41.7000000 95.3500000 + 41.6000000 95.3700000 + 41.5700000 95.3800000 + 41.5500000 95.3800000 + 41.5200000 95.4000000 + 41.4700000 95.3800000 + 41.4700000 95.4000000 + 41.4000000 95.4200000 + 41.3800000 95.3800000 + 41.3800000 95.3300000 + 41.4000000 95.3200000 + 41.4000000 95.3000000 + 41.4300000 95.2800000 + 41.4700000 95.2300000 +1609 1609 -1 63 41.08500 95.27550 + 41.5700000 95.1800000 + 41.5700000 95.1700000 + 41.4500000 95.1700000 + 41.3200000 95.2000000 + 41.2800000 95.1800000 + 41.2700000 95.1700000 + 41.2300000 95.1700000 + 41.1500000 95.2000000 + 41.0200000 95.2700000 + 41.0200000 95.2300000 + 41.0200000 95.2200000 + 41.0500000 95.1700000 + 41.0300000 95.1500000 + 41.0000000 95.1700000 + 40.9800000 95.1700000 + 40.9700000 95.1800000 + 40.8800000 95.2000000 + 40.8700000 95.2300000 + 40.8000000 95.2300000 + 40.7700000 95.3000000 + 40.7300000 95.3200000 + 40.6700000 95.3700000 + 40.6700000 95.3800000 + 40.6300000 95.4300000 + 40.6300000 95.4500000 + 40.6000000 95.5000000 + 40.6000000 95.5700000 + 40.6200000 95.6000000 + 40.6300000 95.6300000 + 40.6500000 95.6700000 + 40.7000000 95.6500000 + 40.7200000 95.6700000 + 40.7500000 95.6500000 + 40.8000000 95.6500000 + 40.8000000 95.6700000 + 40.8200000 95.6800000 + 40.8500000 95.6700000 + 40.8800000 95.6700000 + 40.8700000 95.6000000 + 40.8700000 95.5800000 + 40.8700000 95.5300000 + 40.9300000 95.4300000 + 40.9800000 95.4200000 + 40.9700000 95.3800000 + 41.0000000 95.3700000 + 41.0200000 95.3500000 + 41.0700000 95.3300000 + 41.0800000 95.3200000 + 41.1300000 95.2800000 + 41.2200000 95.2200000 + 41.2700000 95.2200000 + 41.2800000 95.2300000 + 41.3500000 95.2300000 + 41.3800000 95.2300000 + 41.4000000 95.2000000 + 41.4200000 95.2200000 + 41.4300000 95.2000000 + 41.4700000 95.2300000 + 41.5000000 95.2500000 + 41.5300000 95.2500000 + 41.5300000 95.2200000 + 41.5500000 95.2000000 + 41.5700000 95.1800000 +1610 LITTLE NEMAHA RIVER AT AUBURN NE -1 486 40.58083 96.18583 + 40.3870830 95.8129170 + 40.3787500 95.8400210 + 40.3829170 95.8441880 + 40.3808130 95.8462500 + 40.3787500 95.8525210 + 40.3766880 95.8545830 + 40.3558130 95.8545830 + 40.3537500 95.8566880 + 40.3474790 95.8629170 + 40.3454170 95.8608130 + 40.3245830 95.8587500 + 40.3329170 95.8774790 + 40.3329170 95.8900210 + 40.3349790 95.8920830 + 40.3433540 95.8920830 + 40.3454170 95.8941880 + 40.3475210 95.8962500 + 40.3495830 95.8983540 + 40.3516880 95.9004170 + 40.3537500 95.9024790 + 40.3537500 95.9066880 + 40.3558540 95.9087500 + 40.3579170 95.9108540 + 40.3600210 95.9129170 + 40.3620830 95.9149790 + 40.3620830 95.9191880 + 40.3641880 95.9212500 + 40.3662500 95.9233540 + 40.3683540 95.9254170 + 40.3704170 95.9275210 + 40.3725210 95.9295830 + 40.3787500 95.9358130 + 40.3787500 95.9400210 + 40.3808540 95.9420830 + 40.3829170 95.9441460 + 40.3829170 95.9483540 + 40.3849790 95.9504170 + 40.4079170 95.9649790 + 40.4079170 95.9983540 + 40.4100210 96.0004170 + 40.4120830 96.0024790 + 40.4120830 96.0066880 + 40.4141880 96.0087500 + 40.4162500 96.0108130 + 40.4162500 96.0191880 + 40.4183130 96.0212500 + 40.4225210 96.0212500 + 40.4245830 96.0233130 + 40.4245830 96.0316880 + 40.4266880 96.0337500 + 40.4287500 96.0358540 + 40.4308540 96.0379170 + 40.4329170 96.0399790 + 40.4329170 96.0650210 + 40.4308130 96.0670830 + 40.4287500 96.0691460 + 40.4287500 96.0775210 + 40.4266880 96.0795830 + 40.4224790 96.0795830 + 40.4204170 96.0816880 + 40.4183130 96.0837500 + 40.4162500 96.0858540 + 40.4141880 96.0879170 + 40.4058130 96.0879170 + 40.4037500 96.0900210 + 40.4016460 96.0920830 + 40.3995830 96.0941880 + 40.3975210 96.0962500 + 40.3933130 96.0962500 + 40.3912500 96.0983540 + 40.3891460 96.1004170 + 40.3870830 96.0983130 + 40.3850210 96.0962500 + 40.3808130 96.0962500 + 40.3787500 96.0941460 + 40.3766460 96.0920830 + 40.3745830 96.0900210 + 40.3704170 96.0775210 + 40.3704170 96.0691460 + 40.3683540 96.0670830 + 40.3599790 96.0670830 + 40.3579170 96.0670830 + 40.3537500 96.0774790 + 40.3537500 96.0858540 + 40.3558540 96.0879170 + 40.3579170 96.0899790 + 40.3579170 96.1025210 + 40.3558540 96.1045830 + 40.3516460 96.1045830 + 40.3495830 96.1066460 + 40.3495830 96.1191880 + 40.3474790 96.1212500 + 40.3454170 96.1233540 + 40.3474790 96.1254170 + 40.3516880 96.1254170 + 40.3537500 96.1274790 + 40.3537500 96.1316880 + 40.3558130 96.1337500 + 40.3600210 96.1337500 + 40.3620830 96.1358540 + 40.3641460 96.1379170 + 40.3766880 96.1379170 + 40.3787500 96.1399790 + 40.3787500 96.1608540 + 40.3808130 96.1629170 + 40.3850210 96.1629170 + 40.3891460 96.1670830 + 40.3975210 96.1670830 + 40.3995830 96.1691880 + 40.4016880 96.1712500 + 40.4037500 96.1733130 + 40.4037500 96.1816880 + 40.4037500 96.1837500 + 40.4141460 96.1920830 + 40.4183540 96.1920830 + 40.4204170 96.1941460 + 40.4204170 96.2191880 + 40.4224790 96.2212500 + 40.4266880 96.2212500 + 40.4287500 96.2233540 + 40.4308540 96.2254170 + 40.4329170 96.2274790 + 40.4329170 96.2316880 + 40.4370830 96.2358130 + 40.4370830 96.2400210 + 40.4350210 96.2420830 + 40.4308130 96.2420830 + 40.4287500 96.2525210 + 40.4308540 96.2545830 + 40.4329170 96.2566460 + 40.4329170 96.2608540 + 40.4308130 96.2629170 + 40.4287500 96.2650210 + 40.4308540 96.2670830 + 40.4329170 96.2691880 + 40.4350210 96.2712500 + 40.4370830 96.2733540 + 40.4391460 96.2754170 + 40.4433540 96.2754170 + 40.4454170 96.2775210 + 40.4475210 96.2795830 + 40.4495830 96.2816460 + 40.4495830 96.2858540 + 40.4537500 96.2899790 + 40.4537500 96.3066880 + 40.4558540 96.3087500 + 40.4579170 96.3108540 + 40.4600210 96.3129170 + 40.4620830 96.3149790 + 40.4620830 96.3233540 + 40.4641460 96.3254170 + 40.4683540 96.3254170 + 40.4704170 96.3274790 + 40.4704170 96.3358540 + 40.4683130 96.3379170 + 40.4662500 96.3400210 + 40.4683540 96.3420830 + 40.4704170 96.3441460 + 40.4704170 96.3525210 + 40.4725210 96.3545830 + 40.4745830 96.3566460 + 40.4745830 96.3608540 + 40.4766460 96.3629170 + 40.4933540 96.3629170 + 40.4954170 96.3650210 + 40.4974790 96.3670830 + 40.5016880 96.3670830 + 40.5037500 96.3691880 + 40.5058130 96.3712500 + 40.5204170 96.3774790 + 40.5204170 96.3941880 + 40.5225210 96.3962500 + 40.5245830 96.3983130 + 40.5329170 96.4191460 + 40.5329170 96.4275210 + 40.5350210 96.4295830 + 40.5370830 96.4316880 + 40.5391460 96.4337500 + 40.5433540 96.4337500 + 40.5454170 96.4358540 + 40.5475210 96.4379170 + 40.5495830 96.4400210 + 40.5516460 96.4420830 + 40.5579170 96.4441460 + 40.5579170 96.4483540 + 40.5600210 96.4504170 + 40.5620830 96.4524790 + 40.5620830 96.4566880 + 40.5641880 96.4587500 + 40.5662500 96.4608130 + 40.5662500 96.4650210 + 40.5683540 96.4670830 + 40.5704170 96.4691880 + 40.5725210 96.4712500 + 40.5745830 96.4733540 + 40.5766880 96.4754170 + 40.5787500 96.4774790 + 40.5787500 96.4900210 + 40.5808540 96.4920830 + 40.5829170 96.4941880 + 40.5850210 96.4962500 + 40.5870830 96.4983540 + 40.5891880 96.5004170 + 40.5912500 96.5025210 + 40.5933130 96.5045830 + 40.6016880 96.5045830 + 40.6037500 96.5066880 + 40.6058130 96.5087500 + 40.6120830 96.5108540 + 40.6120830 96.5129170 + 40.6224790 96.5212500 + 40.6308540 96.5212500 + 40.6329170 96.5233130 + 40.6329170 96.5275210 + 40.6350210 96.5295830 + 40.6370830 96.5316880 + 40.6391460 96.5337500 + 40.6433540 96.5337500 + 40.6495830 96.5399790 + 40.6495830 96.5441880 + 40.6537500 96.5483130 + 40.6579170 96.5566460 + 40.6599790 96.5629170 + 40.6683540 96.5629170 + 40.6724790 96.5670830 + 40.6808130 96.5712500 + 40.6891880 96.5712500 + 40.6912500 96.5733540 + 40.6933130 96.5754170 + 40.6975210 96.5754170 + 40.6995830 96.5754170 + 40.6995830 96.5649790 + 40.7016460 96.5629170 + 40.7058540 96.5629170 + 40.7079170 96.5608540 + 40.7079170 96.5524790 + 40.7099790 96.5504170 + 40.7120830 96.5483540 + 40.7120830 96.5274790 + 40.7141460 96.5254170 + 40.7162500 96.5233540 + 40.7183130 96.5212500 + 40.7225210 96.5212500 + 40.7245830 96.5233130 + 40.7266460 96.5254170 + 40.7308540 96.5254170 + 40.7329170 96.5233540 + 40.7349790 96.5212500 + 40.7370830 96.5191880 + 40.7391460 96.5170830 + 40.7412500 96.5150210 + 40.7433130 96.5129170 + 40.7579170 96.5108540 + 40.7620830 96.5066880 + 40.7620830 96.4983130 + 40.7641460 96.4962500 + 40.7683130 96.4920830 + 40.7725210 96.4920830 + 40.7745830 96.4941460 + 40.7766460 96.4962500 + 40.7829170 96.4941880 + 40.7849790 96.4920830 + 40.8100210 96.4920830 + 40.8120830 96.4941460 + 40.8141460 96.4962500 + 40.8183540 96.4962500 + 40.8204170 96.4941880 + 40.8204170 96.4899790 + 40.8183540 96.4879170 + 40.8162500 96.4858540 + 40.8162500 96.4733130 + 40.8141880 96.4712500 + 40.8120830 96.4691880 + 40.8162500 96.4566880 + 40.8162500 96.4066460 + 40.8204170 96.4025210 + 40.8204170 96.3983130 + 40.8225210 96.3962500 + 40.8245830 96.3962500 + 40.8245830 96.3899790 + 40.8225210 96.3879170 + 40.8204170 96.3858540 + 40.8183540 96.3837500 + 40.8162500 96.3816880 + 40.8183130 96.3795830 + 40.8204170 96.3775210 + 40.8204170 96.3691460 + 40.8183540 96.3670830 + 40.8141460 96.3670830 + 40.8120830 96.3650210 + 40.8120830 96.3399790 + 40.8100210 96.3379170 + 40.8079170 96.3358540 + 40.8058540 96.3337500 + 40.8037500 96.3316880 + 40.8016880 96.3295830 + 40.7995830 96.3275210 + 40.7975210 96.3254170 + 40.7954170 96.3233540 + 40.7954170 96.3108130 + 40.7933540 96.3087500 + 40.7912500 96.3066880 + 40.7912500 96.2941460 + 40.7891880 96.2920830 + 40.7870830 96.2900210 + 40.7870830 96.2858130 + 40.7891460 96.2837500 + 40.7912500 96.2816880 + 40.7933130 96.2795830 + 40.8016880 96.2795830 + 40.8037500 96.2775210 + 40.8058130 96.2754170 + 40.8266880 96.2754170 + 40.8287500 96.2733540 + 40.8308130 96.2712500 + 40.8329170 96.2691880 + 40.8329170 96.2649790 + 40.8349790 96.2629170 + 40.8370830 96.2608540 + 40.8370830 96.2566460 + 40.8391460 96.2545830 + 40.8412500 96.2525210 + 40.8412500 96.2483130 + 40.8391880 96.2462500 + 40.8370830 96.2441880 + 40.8370830 96.2399790 + 40.8350210 96.2379170 + 40.8329170 96.2358540 + 40.8329170 96.2191460 + 40.8308540 96.2170830 + 40.8266460 96.2170830 + 40.8245830 96.2150210 + 40.8225210 96.2129170 + 40.8204170 96.2108540 + 40.8183540 96.2087500 + 40.8162500 96.2066880 + 40.8141880 96.2045830 + 40.8058130 96.2045830 + 40.8037500 96.2025210 + 40.8016880 96.2004170 + 40.7933130 96.2004170 + 40.7912500 96.1983540 + 40.7891880 96.1962500 + 40.7849790 96.1962500 + 40.7829170 96.1941880 + 40.7829170 96.1899790 + 40.7808540 96.1879170 + 40.7766880 96.1837500 + 40.7745830 96.1816880 + 40.7745830 96.1483130 + 40.7725210 96.1462500 + 40.7704170 96.1441880 + 40.7704170 96.1399790 + 40.7683540 96.1379170 + 40.7662500 96.1358540 + 40.7662500 96.1316460 + 40.7641880 96.1295830 + 40.7620830 96.1275210 + 40.7620830 96.0983130 + 40.7600210 96.0962500 + 40.7579170 96.0941880 + 40.7558540 96.0920830 + 40.7537500 96.0900210 + 40.7516880 96.0879170 + 40.7474790 96.0879170 + 40.7454170 96.0858540 + 40.7454170 96.0816460 + 40.7433540 96.0795830 + 40.7412500 96.0775210 + 40.7391880 96.0754170 + 40.7349790 96.0754170 + 40.7329170 96.0733540 + 40.7329170 96.0608130 + 40.7308540 96.0587500 + 40.7287500 96.0566880 + 40.7266880 96.0545830 + 40.7245830 96.0525210 + 40.7245830 96.0483130 + 40.7225210 96.0462500 + 40.7204170 96.0441880 + 40.7224790 96.0420830 + 40.7245830 96.0400210 + 40.7245830 96.0358130 + 40.7225210 96.0337500 + 40.7204170 96.0316880 + 40.7204170 95.9899790 + 40.7058130 95.9837500 + 40.6974790 95.9712500 + 40.6995830 95.9691880 + 40.6995830 95.9524790 + 40.6975210 95.9504170 + 40.6891460 95.9504170 + 40.6870830 95.9483540 + 40.6870830 95.9441460 + 40.6850210 95.9420830 + 40.6808130 95.9420830 + 40.6787500 95.9441460 + 40.6766880 95.9462500 + 40.6683130 95.9462500 + 40.6662500 95.9441880 + 40.6641880 95.9420830 + 40.6558130 95.9420830 + 40.6537500 95.9400210 + 40.6516880 95.9379170 + 40.6474790 95.9379170 + 40.6454170 95.9358540 + 40.6454170 95.9316460 + 40.6433540 95.9295830 + 40.6308130 95.9295830 + 40.6287500 95.9316460 + 40.6287500 95.9358540 + 40.6245830 95.9358540 + 40.6245830 95.9274790 + 40.6266460 95.9254170 + 40.6287500 95.9233540 + 40.6308130 95.9212500 + 40.6329170 95.9191880 + 40.6329170 95.8983130 + 40.6287500 95.8941880 + 40.6266880 95.8920830 + 40.6224790 95.8920830 + 40.6204170 95.8900210 + 40.6183540 95.8879170 + 40.6099790 95.8879170 + 40.6079170 95.8858540 + 40.6037500 95.8816880 + 40.6016880 95.8754170 + 40.5766460 95.8754170 + 40.5745830 95.8733540 + 40.5745830 95.8691460 + 40.5725210 95.8670830 + 40.5683130 95.8670830 + 40.5662500 95.8650210 + 40.5641880 95.8629170 + 40.5433130 95.8629170 + 40.5412500 95.8608540 + 40.5391880 95.8587500 + 40.5370830 95.8566880 + 40.5329170 95.8525210 + 40.5308540 95.8504170 + 40.5266460 95.8504170 + 40.5245830 95.8483540 + 40.5225210 95.8462500 + 40.5141460 95.8462500 + 40.5120830 95.8441880 + 40.5100210 95.8420830 + 40.5058130 95.8420830 + 40.5037500 95.8400210 + 40.5016880 95.8379170 + 40.4933130 95.8379170 + 40.4912500 95.8399790 + 40.4891880 95.8420830 + 40.4870830 95.8400210 + 40.4850210 95.8379170 + 40.4829170 95.8358540 + 40.4808540 95.8337500 + 40.4787500 95.8316880 + 40.4766880 95.8295830 + 40.4683130 95.8295830 + 40.4662500 95.8275210 + 40.4641880 95.8254170 + 40.4620830 95.8233540 + 40.4620830 95.8191460 + 40.4600210 95.8170830 + 40.4579170 95.8150210 + 40.4579170 95.8108130 + 40.4537500 95.8024790 + 40.4516880 95.8004170 + 40.4495830 95.7983540 + 40.4475210 95.7962500 + 40.4454170 95.7941880 + 40.4433540 95.7920830 + 40.4412500 95.7900210 + 40.4391880 95.7879170 + 40.4349790 95.7879170 + 40.4266460 95.7920830 + 40.4245830 95.7941460 + 40.4245830 95.7983540 + 40.4225210 95.8004170 + 40.4204170 95.8024790 + 40.4183540 95.8045830 + 40.4141460 95.8045830 + 40.4120830 95.8066460 + 40.4100210 95.8087500 + 40.3974790 95.8087500 + 40.3870830 95.8129170 +1611 1611 -1 30 40.95000 95.17500 + 41.2000000 95.0500000 + 41.1300000 95.0500000 + 41.1200000 95.0500000 + 41.0800000 95.0500000 + 41.0700000 95.0300000 + 41.0000000 95.0500000 + 41.0000000 95.0700000 + 40.9500000 95.0500000 + 40.9300000 95.0500000 + 40.8700000 95.0700000 + 40.7800000 95.0800000 + 40.7700000 95.0800000 + 40.7500000 95.0800000 + 40.7300000 95.1000000 + 40.7000000 95.1300000 + 40.7000000 95.2200000 + 40.7300000 95.3200000 + 40.7700000 95.3000000 + 40.8000000 95.2300000 + 40.8700000 95.2300000 + 40.8800000 95.2000000 + 40.9700000 95.1800000 + 40.9800000 95.1700000 + 41.0000000 95.1700000 + 41.0300000 95.1500000 + 41.0500000 95.1300000 + 41.1000000 95.1200000 + 41.1200000 95.1000000 + 41.2000000 95.0700000 + 41.2000000 95.0500000 +1612 1612 -1 29 40.53000 95.30500 + 40.7300000 95.3200000 + 40.7000000 95.2200000 + 40.7000000 95.1300000 + 40.6800000 95.1300000 + 40.6200000 95.1800000 + 40.5700000 95.1800000 + 40.5500000 95.1800000 + 40.5000000 95.1800000 + 40.4800000 95.2000000 + 40.4800000 95.2300000 + 40.4200000 95.2800000 + 40.4200000 95.3200000 + 40.4000000 95.3500000 + 40.3800000 95.3700000 + 40.3500000 95.3800000 + 40.3300000 95.4200000 + 40.3300000 95.4300000 + 40.3500000 95.4500000 + 40.3700000 95.4500000 + 40.3800000 95.4700000 + 40.4200000 95.4700000 + 40.4300000 95.4800000 + 40.4700000 95.4700000 + 40.4800000 95.4500000 + 40.5300000 95.4500000 + 40.6300000 95.3800000 + 40.6700000 95.3800000 + 40.6700000 95.3700000 + 40.7300000 95.3200000 +1613 1613 -1 29 40.43770 96.48228 + 40.6243200 96.5290300 + 40.5264900 96.4103700 + 40.5266100 96.3710600 + 40.4677200 96.3445700 + 40.4189000 96.2004200 + 40.3697900 96.1872100 + 40.3696300 96.2787300 + 40.3204000 96.3177300 + 40.3203000 96.3569300 + 40.2711400 96.3697400 + 40.2807500 96.4350800 + 40.2511900 96.4610100 + 40.2510900 96.4871100 + 40.3395200 96.4877100 + 40.3688300 96.5271400 + 40.4179600 96.5275000 + 40.3980800 96.5796700 + 40.4372600 96.6061600 + 40.4664100 96.6718700 + 40.5057800 96.6591400 + 40.5253000 96.6855300 + 40.5346000 96.7773500 + 40.5741300 96.7384500 + 40.5744300 96.6860000 + 40.5450900 96.6595100 + 40.5649400 96.6203600 + 40.5454100 96.5939700 + 40.5751800 96.5286600 + 40.6243200 96.5290300 +1614 1614 -1 22 40.09950 96.28455 + 40.1729200 96.3561900 + 40.2220500 96.3564400 + 40.2315800 96.4478300 + 40.2511900 96.4610100 + 40.2807500 96.4350800 + 40.2711400 96.3697400 + 40.3203000 96.3569300 + 40.3204000 96.3177300 + 40.1144000 96.1474600 + 40.1046000 96.1213900 + 39.9277800 96.1080900 + 39.9179500 96.1210700 + 39.9277100 96.1730700 + 39.8785700 96.1859300 + 39.8785100 96.2248800 + 39.8981600 96.2249500 + 39.9273300 96.3549700 + 39.9960900 96.3553200 + 40.0844700 96.3687700 + 40.1140500 96.3298500 + 40.1533500 96.3300200 + 40.1729200 96.3561900 +1615 1615 -1 17 39.81000 96.01058 + 39.9179500 96.1210700 + 39.9278100 96.0691100 + 39.9671100 96.0431500 + 39.9670900 95.9131400 + 39.9277200 95.8352300 + 39.8786600 95.8872800 + 39.6822500 95.9782300 + 39.6724300 96.0041300 + 39.6527900 95.9911900 + 39.6527800 96.0300200 + 39.6724100 96.0688700 + 39.7214900 96.1207400 + 39.7804300 96.1078700 + 39.7902100 96.1468000 + 39.8785700 96.1859300 + 39.9277100 96.1730700 + 39.9179500 96.1210700 +1616 1616 -1 18 40.24700 96.12182 + 40.1046000 96.1213900 + 40.1144000 96.1474600 + 40.3204000 96.3177300 + 40.3696300 96.2787300 + 40.3697900 96.1872100 + 40.4189000 96.2004200 + 40.3600500 96.1218300 + 40.3600800 96.0826000 + 40.3011500 95.9780400 + 40.1930500 95.9259100 + 40.1341100 95.9390000 + 40.1341300 95.9781000 + 40.1046500 95.9781000 + 40.1046600 96.0171800 + 40.0751700 96.0562400 + 40.0751500 96.0953000 + 40.1046200 96.0953400 + 40.1046000 96.1213900 +1617 1617 -1 27 40.04560 95.86095 + 40.1930500 95.9259100 + 40.1733900 95.8998600 + 40.1733000 95.8216200 + 40.0845600 95.6655800 + 40.0745500 95.6005200 + 39.9468400 95.6012300 + 39.9273100 95.6403200 + 39.9469900 95.6532200 + 39.9471000 95.6922100 + 39.9176900 95.7183200 + 39.8981900 95.7963300 + 39.8982100 95.8093200 + 39.9277200 95.8352300 + 39.9670900 95.9131400 + 39.9671100 96.0431500 + 39.9278100 96.0691100 + 39.9179500 96.1210700 + 39.9277800 96.1080900 + 40.1046000 96.1213900 + 40.1046200 96.0953400 + 40.0751500 96.0953000 + 40.0751700 96.0562400 + 40.1046600 96.0171800 + 40.1046500 95.9781000 + 40.1341300 95.9781000 + 40.1341100 95.9390000 + 40.1930500 95.9259100 +1618 NODAWAY RIVER AT CLARINDA IA -1 540 41.11000 94.86083 + 40.7370830 95.0129170 + 40.7412500 95.0566880 + 40.7454170 95.0608130 + 40.7454170 95.0733540 + 40.7475210 95.0754170 + 40.7495830 95.0774790 + 40.7495830 95.0816880 + 40.7516880 95.0837500 + 40.7537500 95.0858540 + 40.7537500 95.0879170 + 40.7600210 95.0879170 + 40.7620830 95.0858540 + 40.7724790 95.0754170 + 40.7745830 95.0774790 + 40.7766460 95.0795830 + 40.7787500 95.0816460 + 40.7808130 95.0837500 + 40.7850210 95.0837500 + 40.7870830 95.0858130 + 40.7891460 95.0879170 + 40.7933540 95.0879170 + 40.7954170 95.0858540 + 40.7974790 95.0837500 + 40.7995830 95.0858130 + 40.8016460 95.0879170 + 40.8058540 95.0879170 + 40.8079170 95.0899790 + 40.8099790 95.0920830 + 40.8120830 95.0900210 + 40.8141460 95.0879170 + 40.8225210 95.0879170 + 40.8245830 95.0858540 + 40.8266460 95.0837500 + 40.8350210 95.0837500 + 40.8370830 95.0816880 + 40.8391460 95.0795830 + 40.8558540 95.0795830 + 40.8579170 95.0775210 + 40.8599790 95.0754170 + 40.8766880 95.0754170 + 40.8787500 95.0733540 + 40.8787500 95.0691460 + 40.8808130 95.0670830 + 40.8829170 95.0650210 + 40.8829170 95.0608130 + 40.8849790 95.0587500 + 40.8870830 95.0566880 + 40.8891460 95.0545830 + 40.8912500 95.0566460 + 40.8933130 95.0587500 + 40.8954170 95.0608130 + 40.8974790 95.0629170 + 40.9058540 95.0629170 + 40.9079170 95.0608540 + 40.9099790 95.0587500 + 40.9120830 95.0566880 + 40.9141460 95.0545830 + 40.9162500 95.0525210 + 40.9183130 95.0504170 + 40.9245830 95.0483540 + 40.9266460 95.0462500 + 40.9350210 95.0462500 + 40.9370830 95.0483130 + 40.9370830 95.0566880 + 40.9391460 95.0587500 + 40.9412500 95.0608130 + 40.9474790 95.0670830 + 40.9641880 95.0670830 + 40.9662500 95.0650210 + 40.9683130 95.0629170 + 40.9725210 95.0629170 + 40.9745830 95.0649790 + 40.9766460 95.0670830 + 40.9975210 95.0670830 + 40.9995830 95.0650210 + 41.0016460 95.0629170 + 41.0058540 95.0629170 + 41.0079170 95.0608540 + 41.0099790 95.0587500 + 41.0120830 95.0566880 + 41.0141460 95.0545830 + 41.0183540 95.0545830 + 41.0204170 95.0566460 + 41.0224790 95.0587500 + 41.0266880 95.0587500 + 41.0287500 95.0566880 + 41.0308130 95.0545830 + 41.0350210 95.0545830 + 41.0370830 95.0525210 + 41.0391460 95.0504170 + 41.0412500 95.0483540 + 41.0433130 95.0462500 + 41.0454170 95.0441880 + 41.0474790 95.0420830 + 41.0516880 95.0420830 + 41.0537500 95.0441460 + 41.0558130 95.0462500 + 41.0600210 95.0462500 + 41.0620830 95.0483130 + 41.0620830 95.0525210 + 41.0641460 95.0545830 + 41.0725210 95.0545830 + 41.0745830 95.0566460 + 41.0745830 95.0608540 + 41.0766460 95.0629170 + 41.0808130 95.0670830 + 41.0954170 95.0650210 + 41.0974790 95.0629170 + 41.0995830 95.0608540 + 41.1016460 95.0587500 + 41.1058540 95.0587500 + 41.1079170 95.0566880 + 41.1099790 95.0545830 + 41.1141880 95.0545830 + 41.1162500 95.0566460 + 41.1183130 95.0587500 + 41.1266880 95.0587500 + 41.1287500 95.0608130 + 41.1308130 95.0629170 + 41.1329170 95.0649790 + 41.1349790 95.0670830 + 41.1370830 95.0650210 + 41.1391460 95.0629170 + 41.1516880 95.0629170 + 41.1537500 95.0649790 + 41.1558130 95.0670830 + 41.1579170 95.0650210 + 41.1766880 95.0629170 + 41.1787500 95.0649790 + 41.1850210 95.0670830 + 41.1870830 95.0650210 + 41.1975210 95.0629170 + 41.1995830 95.0608540 + 41.2016460 95.0587500 + 41.2079170 95.0608130 + 41.2099790 95.0629170 + 41.2433540 95.0629170 + 41.2454170 95.0608540 + 41.2474790 95.0587500 + 41.2558540 95.0587500 + 41.2579170 95.0566880 + 41.2599790 95.0545830 + 41.2641880 95.0545830 + 41.2662500 95.0525210 + 41.2683130 95.0504170 + 41.2808540 95.0504170 + 41.2933540 95.0462500 + 41.2954170 95.0462500 + 41.2974790 95.0045830 + 41.3037500 95.0025210 + 41.3037500 94.9483130 + 41.3058130 94.9462500 + 41.3079170 94.9441880 + 41.3079170 94.9274790 + 41.3058540 94.9254170 + 41.2974790 94.9254170 + 41.2954170 94.9233540 + 41.2954170 94.9108130 + 41.2974790 94.9087500 + 41.2995830 94.9066880 + 41.3016460 94.9045830 + 41.3058540 94.9045830 + 41.3079170 94.9025210 + 41.3079170 94.8858130 + 41.3099790 94.8837500 + 41.3120830 94.8816880 + 41.3141460 94.8795830 + 41.3183540 94.8795830 + 41.3204170 94.8775210 + 41.3204170 94.8608130 + 41.3224790 94.8587500 + 41.3245830 94.8566880 + 41.3266460 94.8545830 + 41.3308540 94.8545830 + 41.3329170 94.8525210 + 41.3349790 94.8504170 + 41.3370830 94.8483540 + 41.3370830 94.8441460 + 41.3391460 94.8420830 + 41.3412500 94.8400210 + 41.3412500 94.8274790 + 41.3391880 94.8254170 + 41.3370830 94.8233540 + 41.3391460 94.8212500 + 41.3412500 94.8191880 + 41.3433130 94.8170830 + 41.3454170 94.8150210 + 41.3474790 94.8129170 + 41.3641880 94.8129170 + 41.3662500 94.8108540 + 41.3662500 94.8066460 + 41.3683130 94.8045830 + 41.3704170 94.8025210 + 41.3704170 94.7983130 + 41.3808130 94.7879170 + 41.3829170 94.7899790 + 41.3849790 94.7920830 + 41.3891880 94.7920830 + 41.3912500 94.7900210 + 41.3933130 94.7879170 + 41.3954170 94.7858540 + 41.3974790 94.7837500 + 41.4016880 94.7837500 + 41.4037500 94.7816880 + 41.4037500 94.7566460 + 41.4058130 94.7545830 + 41.4100210 94.7545830 + 41.4120830 94.7525210 + 41.4120830 94.7483130 + 41.4141460 94.7462500 + 41.4162500 94.7441880 + 41.4183130 94.7420830 + 41.4225210 94.7420830 + 41.4245830 94.7400210 + 41.4266460 94.7379170 + 41.4308540 94.7379170 + 41.4329170 94.7358540 + 41.4329170 94.7316460 + 41.4349790 94.7295830 + 41.4391880 94.7295830 + 41.4412500 94.7275210 + 41.4412500 94.7191460 + 41.4495830 94.7108540 + 41.4495830 94.7024790 + 41.4516460 94.7004170 + 41.4537500 94.6983540 + 41.4537500 94.6899790 + 41.4558130 94.6879170 + 41.4579170 94.6858540 + 41.4599790 94.6837500 + 41.4620830 94.6816880 + 41.4620830 94.6774790 + 41.4641460 94.6754170 + 41.4662500 94.6733540 + 41.4683130 94.6712500 + 41.4704170 94.6691880 + 41.4724790 94.6670830 + 41.4745830 94.6650210 + 41.4745830 94.6566460 + 41.4766460 94.6545830 + 41.4787500 94.6525210 + 41.4808130 94.6504170 + 41.4829170 94.6483540 + 41.4829170 94.6358130 + 41.4808540 94.6337500 + 41.4787500 94.6316880 + 41.4787500 94.6233130 + 41.4766880 94.6212500 + 41.4745830 94.6191880 + 41.4725210 94.6170830 + 41.4704170 94.6150210 + 41.4683540 94.6129170 + 41.4558130 94.6129170 + 41.4537500 94.6108540 + 41.4537500 94.5983130 + 41.4516880 94.5962500 + 41.4495830 94.5941880 + 41.4475210 94.5920830 + 41.4454170 94.5900210 + 41.4454170 94.5816460 + 41.4433540 94.5795830 + 41.4349790 94.5795830 + 41.4329170 94.5775210 + 41.4308540 94.5754170 + 41.4225210 94.5712500 + 41.4120830 94.5650210 + 41.4079170 94.5566880 + 41.4079170 94.5524790 + 41.4099790 94.5504170 + 41.4120830 94.5483540 + 41.4120830 94.5399790 + 41.4141460 94.5379170 + 41.4162500 94.5358540 + 41.4162500 94.5316460 + 41.4183130 94.5295830 + 41.4204170 94.5316460 + 41.4224790 94.5337500 + 41.4308540 94.5337500 + 41.4329170 94.5358130 + 41.4349790 94.5379170 + 41.4475210 94.5379170 + 41.4495830 94.5399790 + 41.4516460 94.5420830 + 41.4537500 94.5400210 + 41.4558130 94.5379170 + 41.4579170 94.5358540 + 41.4579170 94.5274790 + 41.4558540 94.5254170 + 41.4537500 94.5233540 + 41.4537500 94.5191460 + 41.4516880 94.5170830 + 41.4495830 94.5191460 + 41.4475210 94.5212500 + 41.4349790 94.5212500 + 41.4329170 94.5191880 + 41.4308540 94.5170830 + 41.4287500 94.5150210 + 41.4266880 94.5129170 + 41.4224790 94.5129170 + 41.4204170 94.5108540 + 41.4183540 94.5087500 + 41.4016460 94.5087500 + 41.3891460 94.5004170 + 41.3808130 94.4962500 + 41.3787500 94.4941880 + 41.3766880 94.4920830 + 41.3724790 94.4920830 + 41.3704170 94.4900210 + 41.3704170 94.4858130 + 41.3683540 94.4837500 + 41.3641460 94.4837500 + 41.3620830 94.4816880 + 41.3620830 94.4566460 + 41.3641460 94.4545830 + 41.3662500 94.4525210 + 41.3641880 94.4379170 + 41.3516460 94.4379170 + 41.3495830 94.4399790 + 41.3475210 94.4420830 + 41.3391460 94.4420830 + 41.3370830 94.4400210 + 41.3350210 94.4379170 + 41.3329170 94.4399790 + 41.3308540 94.4420830 + 41.3141460 94.4420830 + 41.3120830 94.4441460 + 41.3100210 94.4462500 + 41.3079170 94.4483130 + 41.3079170 94.4566880 + 41.3058540 94.4587500 + 41.3037500 94.4608130 + 41.3016880 94.4629170 + 41.2891460 94.4629170 + 41.2870830 94.4608540 + 41.2850210 94.4587500 + 41.2787500 94.4733540 + 41.2766880 94.4754170 + 41.2745830 94.4774790 + 41.2725210 94.4795830 + 41.2683540 94.4754170 + 41.2662500 94.4733540 + 41.2641880 94.4712500 + 41.2599790 94.4754170 + 41.2579170 94.4754170 + 41.2495830 94.4899790 + 41.2495830 94.4941880 + 41.2474790 94.4962500 + 41.2454170 94.4983540 + 41.2433540 94.5004170 + 41.2370830 94.5024790 + 41.2370830 94.5191880 + 41.2349790 94.5212500 + 41.2329170 94.5233540 + 41.2308540 94.5254170 + 41.2224790 94.5254170 + 41.2204170 94.5275210 + 41.2183540 94.5295830 + 41.2079170 94.5358130 + 41.2079170 94.5441880 + 41.2058130 94.5462500 + 41.2037500 94.5483540 + 41.2016880 94.5504170 + 41.1891460 94.5504170 + 41.1849790 94.5545830 + 41.1829170 94.5524790 + 41.1808540 94.5504170 + 41.1766460 94.5504170 + 41.1745830 94.5524790 + 41.1724790 94.5629170 + 41.1704170 94.5649790 + 41.1683540 94.5712500 + 41.1620830 94.5733130 + 41.1620830 94.5775210 + 41.1579170 94.5816460 + 41.1558540 94.5879170 + 41.1474790 94.5879170 + 41.1454170 94.5899790 + 41.1454170 94.6108540 + 41.1433130 94.6129170 + 41.1412500 94.6149790 + 41.1391880 94.6212500 + 41.1287500 94.6233130 + 41.1245830 94.6358130 + 41.1245830 94.6400210 + 41.1224790 94.6420830 + 41.1204170 94.6441460 + 41.1204170 94.6483540 + 41.1183130 94.6504170 + 41.1162500 94.6524790 + 41.1162500 94.6566880 + 41.1183540 94.6587500 + 41.1204170 94.6608540 + 41.1183130 94.6629170 + 41.1162500 94.6650210 + 41.1141880 94.6670830 + 41.1099790 94.6670830 + 41.1079170 94.6691460 + 41.1079170 94.6733540 + 41.1058130 94.6754170 + 41.1037500 94.6774790 + 41.1037500 94.6816880 + 41.1016460 94.6837500 + 41.0995830 94.6858130 + 41.0995830 94.6983540 + 41.0974790 94.7004170 + 41.0954170 94.7025210 + 41.0933130 94.7045830 + 41.0912500 94.7066460 + 41.0912500 94.7150210 + 41.0891460 94.7170830 + 41.0870830 94.7191460 + 41.0870830 94.7233540 + 41.0849790 94.7254170 + 41.0829170 94.7274790 + 41.0829170 94.7358540 + 41.0808130 94.7379170 + 41.0787500 94.7400210 + 41.0766460 94.7420830 + 41.0745830 94.7441880 + 41.0724790 94.7462500 + 41.0704170 94.7483130 + 41.0704170 94.7566880 + 41.0683130 94.7587500 + 41.0662500 94.7608130 + 41.0662500 94.7650210 + 41.0641460 94.7670830 + 41.0620830 94.7691880 + 41.0599790 94.7712500 + 41.0579170 94.7733540 + 41.0558540 94.7754170 + 41.0516460 94.7754170 + 41.0495830 94.7775210 + 41.0474790 94.7795830 + 41.0454170 94.7816880 + 41.0433130 94.7837500 + 41.0412500 94.7858540 + 41.0391460 94.7879170 + 41.0370830 94.7900210 + 41.0349790 94.7920830 + 41.0329170 94.7941460 + 41.0329170 94.7983540 + 41.0308130 94.8004170 + 41.0287500 94.8025210 + 41.0308540 94.8045830 + 41.0329170 94.8066880 + 41.0308130 94.8087500 + 41.0287500 94.8108540 + 41.0266880 94.8129170 + 41.0183130 94.8129170 + 41.0162500 94.8150210 + 41.0141880 94.8170830 + 41.0099790 94.8170830 + 41.0079170 94.8191460 + 41.0079170 94.8400210 + 41.0058540 94.8420830 + 41.0016460 94.8420830 + 40.9995830 94.8441460 + 40.9995830 94.8525210 + 41.0016880 94.8545830 + 41.0037500 94.8566880 + 41.0016460 94.8587500 + 40.9995830 94.8608130 + 40.9995830 94.8691880 + 40.9974790 94.8712500 + 40.9954170 94.8733540 + 40.9933130 94.8754170 + 40.9912500 94.8774790 + 40.9912500 94.8941880 + 40.9891880 94.8962500 + 40.9808130 94.8962500 + 40.9787500 94.8983130 + 40.9787500 94.9025210 + 40.9766880 94.9045830 + 40.9724790 94.9045830 + 40.9704170 94.9066880 + 40.9683130 94.9087500 + 40.9662500 94.9108130 + 40.9662500 94.9150210 + 40.9641460 94.9170830 + 40.9620830 94.9191880 + 40.9599790 94.9212500 + 40.9579170 94.9233540 + 40.9558540 94.9254170 + 40.9433130 94.9254170 + 40.9412500 94.9275210 + 40.9391880 94.9295830 + 40.9349790 94.9295830 + 40.9329170 94.9316460 + 40.9329170 94.9358540 + 40.9308540 94.9379170 + 40.9224790 94.9379170 + 40.9204170 94.9400210 + 40.9183540 94.9420830 + 40.9120830 94.9441880 + 40.9099790 94.9462500 + 40.9079170 94.9483540 + 40.9058130 94.9504170 + 40.9037500 94.9483130 + 40.9016460 94.9462500 + 40.8995830 94.9441460 + 40.8974790 94.9420830 + 40.8954170 94.9399790 + 40.8891880 94.9420830 + 40.8474790 94.9420830 + 40.8454170 94.9441880 + 40.8433540 94.9462500 + 40.8308130 94.9462500 + 40.8287500 94.9483540 + 40.8266460 94.9504170 + 40.8245830 94.9524790 + 40.8245830 94.9566880 + 40.8225210 94.9587500 + 40.8058130 94.9587500 + 40.8037500 94.9608130 + 40.8037500 94.9650210 + 40.8016880 94.9670830 + 40.7933130 94.9670830 + 40.7912500 94.9691880 + 40.7891460 94.9712500 + 40.7870830 94.9691460 + 40.7849790 94.9670830 + 40.7829170 94.9691880 + 40.7808540 94.9712500 + 40.7724790 94.9712500 + 40.7704170 94.9733540 + 40.7683540 94.9754170 + 40.7641460 94.9754170 + 40.7620830 94.9775210 + 40.7599790 94.9795830 + 40.7579170 94.9816880 + 40.7558130 94.9837500 + 40.7537500 94.9858540 + 40.7516460 94.9879170 + 40.7495830 94.9900210 + 40.7475210 94.9920830 + 40.7433130 94.9920830 + 40.7412500 94.9941880 + 40.7391460 94.9962500 + 40.7370830 94.9983130 + 40.7370830 95.0129170 +1619 1619 -1 56 40.82500 94.89768 + 41.2700000 94.4700000 + 41.2000000 94.4200000 + 41.2000000 94.4000000 + 41.1700000 94.3800000 + 41.1300000 94.4200000 + 41.0800000 94.4300000 + 41.0300000 94.5000000 + 41.0200000 94.5300000 + 41.0200000 94.5500000 + 40.9800000 94.5500000 + 40.9700000 94.5800000 + 40.9738500 94.5992300 + 40.9800000 94.6300000 + 40.9800000 94.6700000 + 40.9300000 94.7700000 + 40.9200000 94.8000000 + 40.8700000 94.8200000 + 40.8700000 94.8300000 + 40.8000000 94.8500000 + 40.8000000 94.8700000 + 40.7300000 94.8800000 + 40.6800000 94.8500000 + 40.6300000 94.8700000 + 40.6200000 94.8800000 + 40.5800000 94.8800000 + 40.5500000 94.8700000 + 40.5000000 94.8700000 + 40.4700000 94.8800000 + 40.4300000 94.8800000 + 40.4000000 94.9200000 + 40.3800000 94.9500000 + 40.4300000 94.9800000 + 40.4200000 95.0200000 + 40.4500000 95.0300000 + 40.4500000 95.0800000 + 40.4700000 95.0800000 + 40.4800000 95.0700000 + 40.5200000 95.0800000 + 40.6000000 95.0700000 + 40.6300000 95.0500000 + 40.6500000 95.0700000 + 40.7300000 95.1000000 + 40.7500000 95.0800000 + 40.7300000 95.0200000 + 40.7300000 95.0000000 + 40.8300000 94.9500000 + 40.9000000 94.9500000 + 40.9800000 94.9000000 + 41.0000000 94.8500000 + 41.0200000 94.8200000 + 41.0700000 94.7700000 + 41.1200000 94.6700000 + 41.1500000 94.6000000 + 41.1800000 94.5500000 + 41.2000000 94.5500000 + 41.2700000 94.4700000 +1620 1620 -1 21 40.78500 94.60000 + 40.8800000 94.5500000 + 40.9000000 94.5200000 + 40.8800000 94.5200000 + 40.8800000 94.5000000 + 40.8700000 94.4700000 + 40.8500000 94.4800000 + 40.8300000 94.4800000 + 40.8300000 94.5000000 + 40.8000000 94.5000000 + 40.7700000 94.5500000 + 40.7300000 94.6000000 + 40.7000000 94.6500000 + 40.6800000 94.6500000 + 40.6700000 94.6800000 + 40.6700000 94.7000000 + 40.6800000 94.7300000 + 40.7000000 94.7200000 + 40.7300000 94.7200000 + 40.8300000 94.6200000 + 40.8700000 94.5700000 + 40.8800000 94.5500000 +1621 1621 -1 41 40.66500 94.71500 + 40.9738500 94.5992300 + 40.9500000 94.5800000 + 40.9200000 94.5800000 + 40.9200000 94.5700000 + 40.8800000 94.5500000 + 40.8700000 94.5700000 + 40.8300000 94.6200000 + 40.7300000 94.7200000 + 40.7000000 94.7200000 + 40.6800000 94.7300000 + 40.6700000 94.7000000 + 40.6700000 94.6800000 + 40.6200000 94.7000000 + 40.5700000 94.7000000 + 40.5200000 94.7200000 + 40.4800000 94.7500000 + 40.4500000 94.7700000 + 40.3500000 94.7800000 + 40.3500000 94.8300000 + 40.3500000 94.8700000 + 40.3700000 94.8800000 + 40.4000000 94.8500000 + 40.4200000 94.8700000 + 40.4300000 94.8700000 + 40.4700000 94.8800000 + 40.5000000 94.8700000 + 40.5500000 94.8700000 + 40.5800000 94.8800000 + 40.6200000 94.8800000 + 40.6300000 94.8700000 + 40.6800000 94.8500000 + 40.7300000 94.8800000 + 40.8000000 94.8700000 + 40.8000000 94.8500000 + 40.8700000 94.8300000 + 40.8700000 94.8200000 + 40.9200000 94.8000000 + 40.9300000 94.7700000 + 40.9800000 94.6700000 + 40.9800000 94.6300000 + 40.9738500 94.5992300 +1622 1622 -1 37 40.27500 94.83500 + 40.5200000 94.7200000 + 40.5000000 94.7000000 + 40.4700000 94.7300000 + 40.4200000 94.7300000 + 40.4000000 94.7500000 + 40.3000000 94.7700000 + 40.3000000 94.7800000 + 40.2300000 94.7800000 + 40.2200000 94.8000000 + 40.1800000 94.8000000 + 40.1000000 94.7700000 + 40.0800000 94.7800000 + 40.0700000 94.7700000 + 40.0500000 94.7800000 + 40.0500000 94.8300000 + 40.0500000 94.8500000 + 40.0300000 94.8500000 + 40.0500000 94.8800000 + 40.1200000 94.8800000 + 40.1300000 94.8800000 + 40.2000000 94.9200000 + 40.2800000 94.9300000 + 40.3300000 94.9700000 + 40.3800000 94.9500000 + 40.4000000 94.9200000 + 40.4300000 94.8800000 + 40.4700000 94.8800000 + 40.4300000 94.8700000 + 40.4200000 94.8700000 + 40.4000000 94.8500000 + 40.3700000 94.8800000 + 40.3500000 94.8700000 + 40.3500000 94.8300000 + 40.3500000 94.7800000 + 40.4500000 94.7700000 + 40.4800000 94.7500000 + 40.5200000 94.7200000 +1623 1623 -1 58 40.76000 94.49500 + 41.1700000 94.3800000 + 41.1000000 94.3300000 + 41.0800000 94.3200000 + 41.0300000 94.3000000 + 41.0200000 94.2800000 + 41.0000000 94.2700000 + 40.9800000 94.2700000 + 40.9700000 94.2800000 + 40.9200000 94.3300000 + 40.9300000 94.3500000 + 40.9200000 94.3700000 + 40.8300000 94.3700000 + 40.8000000 94.3800000 + 40.7300000 94.4000000 + 40.7300000 94.3800000 + 40.6800000 94.4000000 + 40.6500000 94.4500000 + 40.6200000 94.4500000 + 40.5500000 94.5300000 + 40.5500000 94.5700000 + 40.4800000 94.5800000 + 40.4000000 94.6300000 + 40.4000000 94.6500000 + 40.3500000 94.6500000 + 40.3500000 94.6800000 + 40.3500000 94.7000000 + 40.3800000 94.7200000 + 40.4200000 94.7200000 + 40.5000000 94.7000000 + 40.5200000 94.7200000 + 40.5700000 94.7000000 + 40.6200000 94.7000000 + 40.6700000 94.6800000 + 40.6800000 94.6500000 + 40.7000000 94.6500000 + 40.7300000 94.6000000 + 40.7700000 94.5500000 + 40.8000000 94.5000000 + 40.8300000 94.5000000 + 40.8300000 94.4800000 + 40.8500000 94.4800000 + 40.8700000 94.4700000 + 40.8800000 94.5000000 + 40.8800000 94.5200000 + 40.9000000 94.5200000 + 40.8800000 94.5500000 + 40.9200000 94.5700000 + 40.9200000 94.5800000 + 40.9500000 94.5800000 + 40.9738500 94.5992300 + 40.9700000 94.5800000 + 40.9800000 94.5500000 + 41.0200000 94.5500000 + 41.0200000 94.5300000 + 41.0300000 94.5000000 + 41.0800000 94.4300000 + 41.1300000 94.4200000 + 41.1700000 94.3800000 +1624 1624 -1 65 40.07500 94.66500 + 40.5000000 94.7000000 + 40.4200000 94.7200000 + 40.3800000 94.7200000 + 40.3500000 94.7000000 + 40.3500000 94.6800000 + 40.3500000 94.6500000 + 40.3000000 94.6700000 + 40.2800000 94.6800000 + 40.2200000 94.7000000 + 40.2000000 94.6800000 + 40.1300000 94.6700000 + 40.1200000 94.6500000 + 40.1200000 94.6200000 + 40.1200000 94.5800000 + 40.0800000 94.5700000 + 40.0800000 94.5500000 + 40.0800000 94.5200000 + 40.0700000 94.5300000 + 40.0200000 94.5000000 + 40.0000000 94.4800000 + 40.0000000 94.4700000 + 39.9500000 94.4700000 + 39.9300000 94.4800000 + 39.9200000 94.4500000 + 39.9000000 94.4700000 + 39.8500000 94.4800000 + 39.8000000 94.5200000 + 39.7800000 94.5300000 + 39.7300000 94.5500000 + 39.7200000 94.5800000 + 39.7300000 94.6200000 + 39.6800000 94.6200000 + 39.6500000 94.6700000 + 39.6800000 94.6700000 + 39.6800000 94.7000000 + 39.7000000 94.7300000 + 39.6800000 94.7700000 + 39.6800000 94.7800000 + 39.7200000 94.8000000 + 39.7500000 94.7800000 + 39.7500000 94.7983400 + 39.7499500 94.8000000 + 39.8300000 94.8200000 + 39.9200000 94.8000000 + 39.9300000 94.8200000 + 39.9700000 94.8700000 + 39.9800000 94.8700000 + 40.0000000 94.8800000 + 40.0500000 94.8800000 + 40.0300000 94.8500000 + 40.0500000 94.8500000 + 40.0500000 94.8300000 + 40.0500000 94.7800000 + 40.0700000 94.7700000 + 40.0800000 94.7800000 + 40.1000000 94.7700000 + 40.1800000 94.8000000 + 40.2200000 94.8000000 + 40.2300000 94.7800000 + 40.3000000 94.7800000 + 40.3000000 94.7700000 + 40.4000000 94.7500000 + 40.4200000 94.7300000 + 40.4700000 94.7300000 + 40.5000000 94.7000000 +1628 1628 -1 31 39.49000 94.70000 + 39.6700000 94.8300000 + 39.6800000 94.7800000 + 39.6800000 94.7700000 + 39.7000000 94.7300000 + 39.6800000 94.7000000 + 39.6800000 94.6700000 + 39.6500000 94.6700000 + 39.5800000 94.6800000 + 39.5500000 94.6700000 + 39.5700000 94.6300000 + 39.5300000 94.5800000 + 39.5200000 94.5700000 + 39.4800000 94.5800000 + 39.4700000 94.5700000 + 39.4200000 94.5700000 + 39.4011800 94.5747100 + 39.3800000 94.5800000 + 39.3700000 94.6300000 + 39.2800000 94.6800000 + 39.3000000 94.7300000 + 39.3300000 94.7200000 + 39.3500000 94.7200000 + 39.3700000 94.7800000 + 39.3800000 94.8000000 + 39.4000000 94.8200000 + 39.4700000 94.7700000 + 39.5000000 94.7700000 + 39.5200000 94.7500000 + 39.5800000 94.7500000 + 39.6300000 94.7800000 + 39.6700000 94.8300000 +1630 1630 -1 26 41.52000 95.06500 + 41.7200000 94.9700000 + 41.6800000 94.9500000 + 41.6500000 94.9700000 + 41.6200000 94.9300000 + 41.5800000 94.9700000 + 41.5800000 94.9800000 + 41.5500000 95.0500000 + 41.5300000 95.0500000 + 41.4500000 95.0700000 + 41.4300000 95.0800000 + 41.4200000 95.1200000 + 41.3200000 95.1200000 + 41.3200000 95.1300000 + 41.3200000 95.1700000 + 41.3200000 95.2000000 + 41.4500000 95.1700000 + 41.5700000 95.1700000 + 41.5700000 95.1800000 + 41.6000000 95.1700000 + 41.6300000 95.1700000 + 41.6500000 95.1700000 + 41.6800000 95.1200000 + 41.6800000 95.1000000 + 41.7200000 95.0200000 + 41.7000000 94.9800000 + 41.7200000 94.9700000 +1634 1634 -1 18 40.58000 95.11500 + 40.7000000 95.1300000 + 40.7300000 95.1000000 + 40.6500000 95.0700000 + 40.6300000 95.0500000 + 40.6000000 95.0700000 + 40.5200000 95.0800000 + 40.4800000 95.0700000 + 40.4700000 95.0800000 + 40.4500000 95.0800000 + 40.4500000 95.1000000 + 40.4300000 95.1700000 + 40.4800000 95.1700000 + 40.5000000 95.1800000 + 40.5500000 95.1800000 + 40.5700000 95.1800000 + 40.6200000 95.1800000 + 40.6800000 95.1300000 + 40.7000000 95.1300000 +1635 1635 -1 20 40.32500 95.06500 + 40.4500000 95.0800000 + 40.4500000 95.0300000 + 40.4200000 95.0200000 + 40.4300000 94.9800000 + 40.3800000 94.9500000 + 40.3300000 94.9700000 + 40.3300000 94.9800000 + 40.2800000 95.0300000 + 40.2200000 95.0500000 + 40.2000000 95.0700000 + 40.2000000 95.1000000 + 40.2300000 95.1200000 + 40.2500000 95.1500000 + 40.2700000 95.1700000 + 40.3000000 95.1700000 + 40.3300000 95.1700000 + 40.3500000 95.1800000 + 40.4300000 95.1700000 + 40.4500000 95.1000000 + 40.4500000 95.0800000 +1801 1801 -1 49 42.77990 97.24212 + 43.2743500 97.4489400 + 43.2152200 97.4476900 + 43.0588400 97.3221300 + 42.9603200 97.3202400 + 42.8544100 97.0473000 + 42.7761300 96.9784600 + 42.7968600 96.8298800 + 42.8955400 96.8039600 + 42.8662300 96.7629800 + 42.7482600 96.7211000 + 42.6995000 96.6259800 + 42.5620500 96.5303300 + 42.5228700 96.4761100 + 42.4738300 96.4218900 + 42.4540000 96.4621700 + 42.4536300 96.5564300 + 42.3842800 96.6500500 + 42.3251500 96.6629500 + 42.2756500 96.7162100 + 42.3247900 96.7301600 + 42.3729100 96.9055300 + 42.4610200 96.9740200 + 42.5006000 96.9476200 + 42.4804000 97.0147200 + 42.5485500 97.1101200 + 42.5477100 97.2045100 + 42.4688200 97.2166100 + 42.4974400 97.3114400 + 42.4676300 97.3378200 + 42.4470900 97.4182300 + 42.4566300 97.4453600 + 42.5736900 97.5422400 + 42.6418000 97.6112800 + 42.7007100 97.6261700 + 42.8100300 97.5475200 + 42.8305200 97.4802600 + 42.8797600 97.4813200 + 42.9275800 97.6043900 + 42.9168800 97.6719400 + 43.1020700 97.8259900 + 43.1304700 97.9083600 + 43.2477100 97.9797400 + 43.2760200 98.0623400 + 43.2770700 97.9942100 + 43.1803200 97.8689000 + 43.1735600 97.6373400 + 43.2836000 97.5036500 + 43.2842100 97.4491400 + 43.2743500 97.4489400 +1802 1802 -1 41 42.26140 96.44726 + 42.5500000 96.2800000 + 42.5300000 96.2700000 + 42.5200000 96.3000000 + 42.5200000 96.3200000 + 42.4800000 96.3200000 + 42.4700000 96.3500000 + 42.4300000 96.3500000 + 42.4200000 96.3300000 + 42.3305100 96.2584100 + 42.1986200 96.2592200 + 42.1495500 96.1785800 + 42.0413000 96.1783100 + 42.0018800 96.2183500 + 42.0213300 96.3254800 + 41.9228600 96.3517500 + 41.9227900 96.3784700 + 41.9423000 96.4320500 + 41.9618400 96.4722900 + 42.0504000 96.4728900 + 42.0698200 96.5399900 + 42.1091800 96.5402900 + 42.1679300 96.6078000 + 42.1677300 96.6480400 + 42.1774400 96.6749600 + 42.2266500 96.6754300 + 42.2756500 96.7162100 + 42.3251500 96.6629500 + 42.3842800 96.6500500 + 42.4536300 96.5564300 + 42.4540000 96.4621700 + 42.4738300 96.4218900 + 42.5228700 96.4761100 + 42.5500800 96.4703800 + 42.5500000 96.4300000 + 42.5300000 96.4200000 + 42.5300000 96.4000000 + 42.5800000 96.3500000 + 42.6000000 96.3500000 + 42.5700000 96.3200000 + 42.5700000 96.3000000 + 42.5500000 96.2800000 +1803 1803 -1 43 41.92520 96.12587 + 41.9000000 95.9500000 + 41.8500000 95.9700000 + 41.8300000 95.9300000 + 41.7800000 95.9000000 + 41.7300000 95.9500000 + 41.7200000 95.9500000 + 41.6700000 95.9700000 + 41.6500000 96.0000000 + 41.6300000 96.0500000 + 41.6000000 96.0200000 + 41.5700000 96.0300000 + 41.5500000 96.1000000 + 41.5300000 96.1200000 + 41.5200000 96.1200000 + 41.5200000 96.1500000 + 41.5297200 96.1903000 + 41.5984800 96.2437000 + 41.5787600 96.2702300 + 41.6179800 96.3236100 + 41.6769900 96.3238800 + 41.7066000 96.2840400 + 41.7261800 96.3241000 + 41.8540600 96.3247000 + 41.8836400 96.2981200 + 41.9228600 96.3517500 + 42.0213300 96.3254800 + 42.0018800 96.2183500 + 42.0413000 96.1783100 + 42.1495500 96.1785800 + 42.1986200 96.2592200 + 42.3305100 96.2584100 + 42.3200000 96.2500000 + 42.2800000 96.2000000 + 42.1700000 96.1300000 + 42.0800000 96.1000000 + 42.0700000 96.0700000 + 42.0200000 96.0500000 + 41.9700000 96.0200000 + 41.9700000 96.0000000 + 41.9700000 95.9800000 + 41.9700000 95.9700000 + 41.9700000 95.9500000 + 41.9000000 95.9500000 +1804 1804 -1 71 41.64000 95.81500 + 42.0300000 95.5500000 + 42.0000000 95.5700000 + 41.9800000 95.5800000 + 41.9300000 95.6200000 + 41.9200000 95.6500000 + 41.8800000 95.6700000 + 41.8700000 95.7000000 + 41.8200000 95.7000000 + 41.8000000 95.7300000 + 41.7700000 95.7300000 + 41.7000000 95.8000000 + 41.6500000 95.8000000 + 41.6500000 95.7800000 + 41.6200000 95.7200000 + 41.6200000 95.6500000 + 41.6300000 95.6300000 + 41.6500000 95.6300000 + 41.7300000 95.5800000 + 41.7200000 95.5500000 + 41.7700000 95.5200000 + 41.7800000 95.4800000 + 41.7300000 95.4800000 + 41.7200000 95.5200000 + 41.7000000 95.5200000 + 41.6800000 95.5500000 + 41.6500000 95.5800000 + 41.6000000 95.6200000 + 41.5500000 95.6200000 + 41.5200000 95.6300000 + 41.4800000 95.6500000 + 41.4300000 95.6800000 + 41.4000000 95.7500000 + 41.3500000 95.8200000 + 41.3200000 95.8200000 + 41.2700000 95.8500000 + 41.2700000 95.9200000 + 41.2700000 95.9500000 + 41.2500000 95.9700000 + 41.2550200 95.9700000 + 41.2700000 95.9700000 + 41.2800000 96.0000000 + 41.3200000 96.0000000 + 41.3500000 96.0000000 + 41.3800000 96.0300000 + 41.4200000 96.0500000 + 41.4300000 96.0800000 + 41.4200000 96.1000000 + 41.4800000 96.1500000 + 41.5200000 96.1500000 + 41.5200000 96.1200000 + 41.5300000 96.1200000 + 41.5500000 96.1000000 + 41.5700000 96.0300000 + 41.6000000 96.0200000 + 41.6300000 96.0500000 + 41.6500000 96.0000000 + 41.6700000 95.9700000 + 41.7200000 95.9500000 + 41.7300000 95.9500000 + 41.7800000 95.9000000 + 41.8000000 95.8700000 + 41.8000000 95.8500000 + 41.8500000 95.8200000 + 41.8700000 95.7500000 + 41.9200000 95.7500000 + 41.9300000 95.7000000 + 42.0000000 95.6800000 + 42.0000000 95.6700000 + 42.0200000 95.6300000 + 42.0300000 95.5800000 + 42.0300000 95.5500000 +1806 1806 -1 77 41.28000 95.65000 + 41.8700000 95.4000000 + 41.8500000 95.3800000 + 41.8200000 95.3800000 + 41.8000000 95.4000000 + 41.7800000 95.3700000 + 41.7700000 95.4000000 + 41.7500000 95.3800000 + 41.7300000 95.4000000 + 41.7000000 95.3800000 + 41.6700000 95.3800000 + 41.6000000 95.4300000 + 41.5300000 95.4500000 + 41.5000000 95.5000000 + 41.4200000 95.5200000 + 41.3500000 95.6000000 + 41.2700000 95.6300000 + 41.2200000 95.6300000 + 41.1800000 95.6200000 + 41.1500000 95.6500000 + 41.0700000 95.6700000 + 41.0300000 95.6700000 + 40.9300000 95.6700000 + 40.8800000 95.6700000 + 40.8500000 95.6700000 + 40.8200000 95.6800000 + 40.8200000 95.7000000 + 40.7800000 95.7300000 + 40.8000000 95.7500000 + 40.8000000 95.7800000 + 40.7800000 95.8200000 + 40.7300000 95.8500000 + 40.7000000 95.8300000 + 40.6800000 95.8500000 + 40.7000000 95.8500000 + 40.7200000 95.8800000 + 40.7500000 95.8800000 + 40.7800000 95.8300000 + 40.8000000 95.8500000 + 40.8300000 95.8300000 + 40.8700000 95.8500000 + 40.8800000 95.8200000 + 40.9000000 95.8200000 + 40.9200000 95.8300000 + 40.9500000 95.8300000 + 40.9800000 95.8300000 + 41.0000000 95.8700000 + 41.0200000 95.8700000 + 41.0300000 95.8500000 + 41.0500000 95.8700000 + 41.0800000 95.8700000 + 41.1500000 95.8800000 + 41.1700000 95.8800000 + 41.1700000 95.8500000 + 41.1800000 95.8500000 + 41.1800000 95.9200000 + 41.2000000 95.9300000 + 41.2300000 95.9200000 + 41.2700000 95.9200000 + 41.2700000 95.8500000 + 41.3200000 95.8200000 + 41.3500000 95.8200000 + 41.4000000 95.7500000 + 41.4300000 95.6800000 + 41.4800000 95.6500000 + 41.5200000 95.6300000 + 41.5500000 95.6200000 + 41.6000000 95.6200000 + 41.6500000 95.5800000 + 41.6800000 95.5500000 + 41.7000000 95.5200000 + 41.7200000 95.5200000 + 41.7300000 95.4800000 + 41.7800000 95.4800000 + 41.8000000 95.4800000 + 41.8500000 95.4200000 + 41.8800000 95.4300000 + 41.8700000 95.4000000 +1807 1807 -1 54 40.97500 96.04416 + 41.2700000 95.9200000 + 41.2300000 95.9200000 + 41.2000000 95.9300000 + 41.1800000 95.9200000 + 41.1800000 95.8500000 + 41.1700000 95.8500000 + 41.1700000 95.8800000 + 41.1500000 95.8800000 + 41.0800000 95.8700000 + 41.0500000 95.8700000 + 41.0300000 95.8500000 + 41.0200000 95.8700000 + 41.0000000 95.8700000 + 40.9800000 95.8300000 + 40.9500000 95.8300000 + 40.9200000 95.8300000 + 40.9000000 95.8200000 + 40.8800000 95.8200000 + 40.8700000 95.8500000 + 40.8300000 95.8300000 + 40.8000000 95.8500000 + 40.7800000 95.8300000 + 40.7500000 95.8800000 + 40.7200000 95.8800000 + 40.7000000 95.8500000 + 40.6800000 95.8500000 + 40.7000000 95.8700000 + 40.7000000 95.9200000 + 40.6842800 95.9278600 + 40.6942100 95.9516500 + 40.7040300 95.9516400 + 40.7531400 95.8990300 + 40.7531300 95.8858900 + 40.8514300 95.8989000 + 40.9202700 95.9778500 + 40.9005600 96.1227500 + 40.9299900 96.1755100 + 41.0184600 96.1757400 + 41.0380100 96.2417700 + 41.0675000 96.2418700 + 41.0772700 96.2683100 + 41.1264600 96.2552900 + 41.1168800 95.9910000 + 41.0972100 95.9645800 + 41.1168800 95.9645800 + 41.1168600 95.9249400 + 41.1463400 95.8984800 + 41.1758500 95.9248800 + 41.1856800 95.9248700 + 41.2446900 95.9777500 + 41.2550200 95.9700000 + 41.2500000 95.9700000 + 41.2700000 95.9500000 + 41.2700000 95.9200000 +1808 1808 -1 44 40.61000 95.68000 + 40.8200000 95.6800000 + 40.8000000 95.6700000 + 40.8000000 95.6500000 + 40.7500000 95.6500000 + 40.7200000 95.6700000 + 40.7000000 95.6500000 + 40.6500000 95.6700000 + 40.6300000 95.6300000 + 40.6200000 95.6000000 + 40.6000000 95.5700000 + 40.6000000 95.5000000 + 40.6300000 95.4500000 + 40.6300000 95.4300000 + 40.5800000 95.4500000 + 40.4800000 95.5000000 + 40.4800000 95.5200000 + 40.4500000 95.5300000 + 40.4700000 95.6000000 + 40.4000000 95.6300000 + 40.4000000 95.6500000 + 40.4000000 95.6700000 + 40.4000000 95.6800000 + 40.4200000 95.7300000 + 40.4000000 95.7300000 + 40.4300000 95.7700000 + 40.4700000 95.8300000 + 40.4800000 95.8300000 + 40.5000000 95.8300000 + 40.6300000 95.8800000 + 40.6300000 95.9200000 + 40.6700000 95.9300000 + 40.6800000 95.9300000 + 40.6842800 95.9278600 + 40.7000000 95.9200000 + 40.7000000 95.8700000 + 40.6800000 95.8500000 + 40.7000000 95.8300000 + 40.7300000 95.8500000 + 40.7800000 95.8200000 + 40.8000000 95.7800000 + 40.8000000 95.7500000 + 40.7800000 95.7300000 + 40.8200000 95.7000000 + 40.8200000 95.6800000 +1809 1809 -1 54 40.36000 95.61000 + 40.6700000 95.3800000 + 40.6300000 95.3800000 + 40.5300000 95.4500000 + 40.4800000 95.4500000 + 40.4700000 95.4700000 + 40.4300000 95.4800000 + 40.4200000 95.4700000 + 40.3800000 95.4700000 + 40.3700000 95.4500000 + 40.3500000 95.4500000 + 40.3300000 95.4300000 + 40.3300000 95.4200000 + 40.3500000 95.3800000 + 40.3300000 95.3700000 + 40.2500000 95.3800000 + 40.2500000 95.4000000 + 40.2300000 95.4200000 + 40.2000000 95.4000000 + 40.1800000 95.4000000 + 40.0800000 95.3800000 + 40.0700000 95.3800000 + 40.0500000 95.4200000 + 40.0500000 95.4300000 + 40.0700000 95.4500000 + 40.1500000 95.5300000 + 40.1700000 95.5300000 + 40.2200000 95.5700000 + 40.2000000 95.6000000 + 40.2000000 95.6200000 + 40.2200000 95.6300000 + 40.2300000 95.7200000 + 40.2700000 95.7500000 + 40.2800000 95.7800000 + 40.3000000 95.8300000 + 40.3300000 95.8500000 + 40.3328900 95.8488500 + 40.3800000 95.8300000 + 40.3800000 95.8200000 + 40.4000000 95.8000000 + 40.4200000 95.8000000 + 40.4300000 95.7700000 + 40.4000000 95.7300000 + 40.4200000 95.7300000 + 40.4000000 95.6800000 + 40.4000000 95.6700000 + 40.4000000 95.6500000 + 40.4000000 95.6300000 + 40.4700000 95.6000000 + 40.4500000 95.5300000 + 40.4800000 95.5200000 + 40.4800000 95.5000000 + 40.5800000 95.4500000 + 40.6300000 95.4300000 + 40.6700000 95.3800000 +1810 1810 -1 48 40.10440 95.59246 + 40.3328900 95.8488500 + 40.3300000 95.8500000 + 40.3000000 95.8300000 + 40.2800000 95.7800000 + 40.2700000 95.7500000 + 40.2300000 95.7200000 + 40.2200000 95.6300000 + 40.2000000 95.6200000 + 40.2000000 95.6000000 + 40.2200000 95.5700000 + 40.1700000 95.5300000 + 40.1500000 95.5300000 + 40.0700000 95.4500000 + 40.0500000 95.4300000 + 40.0500000 95.4200000 + 40.0443700 95.4184800 + 40.0443100 95.4054600 + 39.9751500 95.3280200 + 39.9260300 95.3284800 + 39.9262400 95.3674600 + 39.8672300 95.3550000 + 39.8479600 95.4330400 + 39.8973000 95.4846100 + 39.8678800 95.4978000 + 39.8679800 95.5237700 + 39.8385100 95.5239600 + 39.8289600 95.6018800 + 39.7995700 95.6279900 + 39.7799600 95.6410600 + 39.7898900 95.6799200 + 39.8587800 95.7315400 + 39.8981900 95.7963300 + 39.9176900 95.7183200 + 39.9471000 95.6922100 + 39.9469900 95.6532200 + 39.9273100 95.6403200 + 39.9468400 95.6012300 + 40.0745500 95.6005200 + 40.0845600 95.6655800 + 40.1733000 95.8216200 + 40.1733900 95.8998600 + 40.1930500 95.9259100 + 40.3011500 95.9780400 + 40.3600800 96.0826000 + 40.4092000 96.0957400 + 40.4288800 96.0303400 + 40.3305800 95.8865700 + 40.3328900 95.8488500 +1811 1811 -1 37 40.24000 95.27000 + 40.4300000 95.1700000 + 40.3500000 95.1800000 + 40.3300000 95.1700000 + 40.3000000 95.1700000 + 40.2700000 95.1700000 + 40.2500000 95.1500000 + 40.2200000 95.1500000 + 40.1800000 95.1300000 + 40.1700000 95.1500000 + 40.0800000 95.1300000 + 40.0700000 95.1300000 + 40.0300000 95.1300000 + 40.0200000 95.1200000 + 40.0200000 95.1700000 + 39.9800000 95.2200000 + 39.9800000 95.2700000 + 40.0000000 95.3000000 + 40.0300000 95.3500000 + 40.0500000 95.4200000 + 40.0700000 95.3800000 + 40.0800000 95.3800000 + 40.1800000 95.4000000 + 40.2000000 95.4000000 + 40.2300000 95.4200000 + 40.2500000 95.4000000 + 40.2500000 95.3800000 + 40.3300000 95.3700000 + 40.3500000 95.3800000 + 40.3800000 95.3700000 + 40.4000000 95.3500000 + 40.4200000 95.3200000 + 40.4200000 95.2800000 + 40.4800000 95.2300000 + 40.4800000 95.2000000 + 40.5000000 95.1800000 + 40.4800000 95.1700000 + 40.4300000 95.1700000 +1812 1812 -1 29 40.14000 95.01000 + 40.3300000 94.9700000 + 40.2800000 94.9300000 + 40.2000000 94.9200000 + 40.1300000 94.8800000 + 40.1200000 94.8800000 + 40.0500000 94.8800000 + 40.0000000 94.8800000 + 39.9800000 94.8700000 + 39.9700000 94.8700000 + 39.9500000 94.9200000 + 39.9700000 95.0000000 + 39.9800000 95.0700000 + 40.0000000 95.0800000 + 40.0200000 95.1000000 + 40.0200000 95.1200000 + 40.0300000 95.1300000 + 40.0700000 95.1300000 + 40.0800000 95.1300000 + 40.1700000 95.1500000 + 40.1800000 95.1300000 + 40.2200000 95.1500000 + 40.2500000 95.1500000 + 40.2300000 95.1200000 + 40.2000000 95.1000000 + 40.2000000 95.0700000 + 40.2200000 95.0500000 + 40.2800000 95.0300000 + 40.3300000 94.9800000 + 40.3300000 94.9700000 +1813 1813 -1 44 39.84070 95.21405 + 40.0200000 95.1200000 + 40.0200000 95.1000000 + 40.0000000 95.0800000 + 39.9800000 95.0700000 + 39.9700000 95.0000000 + 39.9500000 94.9200000 + 39.9700000 94.8700000 + 39.9300000 94.8200000 + 39.9200000 94.8000000 + 39.8300000 94.8200000 + 39.7499500 94.8000000 + 39.7464300 94.9283400 + 39.8156200 94.9792100 + 39.8163300 95.0700200 + 39.7673100 95.0836200 + 39.7292900 95.2784800 + 39.7000400 95.3176300 + 39.6313600 95.3312200 + 39.6708500 95.3697000 + 39.6710900 95.4214900 + 39.7203200 95.4470100 + 39.7207400 95.5506600 + 39.7601200 95.5763400 + 39.7799300 95.6280900 + 39.7995700 95.6279900 + 39.8289600 95.6018800 + 39.8385100 95.5239600 + 39.8679800 95.5237700 + 39.8678800 95.4978000 + 39.8973000 95.4846100 + 39.8479600 95.4330400 + 39.8672300 95.3550000 + 39.9262400 95.3674600 + 39.9260300 95.3284800 + 39.9751500 95.3280200 + 40.0443100 95.4054600 + 40.0443700 95.4184800 + 40.0500000 95.4200000 + 40.0300000 95.3500000 + 40.0000000 95.3000000 + 39.9800000 95.2700000 + 39.9800000 95.2200000 + 40.0200000 95.1700000 + 40.0200000 95.1200000 +1814 1814 -1 26 39.67320 95.05579 + 39.6800000 94.7800000 + 39.6700000 94.8300000 + 39.6500000 94.8500000 + 39.6300000 94.8500000 + 39.5700000 94.8700000 + 39.5500000 94.8800000 + 39.6000000 94.9300000 + 39.5800000 94.9800000 + 39.5700000 95.0300000 + 39.5500000 95.1200000 + 39.5800000 95.1500000 + 39.5300000 95.2000000 + 39.5720600 95.2671200 + 39.5920700 95.3315900 + 39.6313600 95.3312200 + 39.7000400 95.3176300 + 39.7292900 95.2784800 + 39.7673100 95.0836200 + 39.8163300 95.0700200 + 39.8156200 94.9792100 + 39.7464300 94.9283400 + 39.7499500 94.8000000 + 39.7500000 94.7983400 + 39.7500000 94.7800000 + 39.7200000 94.8000000 + 39.6800000 94.7800000 +1815 1815 -1 30 39.47500 94.97500 + 39.5300000 95.2000000 + 39.5800000 95.1500000 + 39.5500000 95.1200000 + 39.5700000 95.0300000 + 39.5800000 94.9800000 + 39.6000000 94.9300000 + 39.5500000 94.8800000 + 39.5700000 94.8700000 + 39.6300000 94.8500000 + 39.6500000 94.8500000 + 39.6700000 94.8300000 + 39.6300000 94.7800000 + 39.5800000 94.7500000 + 39.5200000 94.7500000 + 39.5000000 94.7700000 + 39.4700000 94.7700000 + 39.4000000 94.8200000 + 39.3800000 94.8000000 + 39.3500000 94.8300000 + 39.3300000 94.8500000 + 39.3200000 94.9200000 + 39.3200000 94.9300000 + 39.2800000 94.9800000 + 39.3200000 95.0500000 + 39.3500000 95.0500000 + 39.3538300 95.0500000 + 39.3700000 95.0500000 + 39.4200000 95.0500000 + 39.4800000 95.1700000 + 39.5300000 95.2000000 +201 201 -1 17 39.26190 97.36923 + 39.2731200 97.2660400 + 39.2439200 97.2397800 + 39.1653600 97.2384400 + 39.1254200 97.3020200 + 39.1247400 97.3662600 + 39.1344100 97.3793000 + 39.1735500 97.3929000 + 39.2216100 97.4839000 + 39.2608900 97.4847100 + 39.3000100 97.4983900 + 39.3785800 97.5000200 + 39.3991200 97.4230400 + 39.3797700 97.3968700 + 39.3306700 97.3959200 + 39.3215600 97.3313100 + 39.2727300 97.3046600 + 39.2731200 97.2660400 +208 208 -1 36 39.11710 96.67976 + 39.2583000 96.6349300 + 39.2288400 96.6346700 + 39.1802100 96.5313600 + 39.1017000 96.5179400 + 39.0720700 96.5562500 + 39.0232900 96.4788900 + 38.9741900 96.4785600 + 38.9641600 96.5297900 + 38.8679000 96.5290900 + 38.8679000 96.5333000 + 38.8659300 96.5333000 + 38.8595000 96.5333000 + 38.8595000 96.5416000 + 38.8659000 96.5416000 + 38.8679000 96.5416000 + 38.8679000 96.5750000 + 38.8595000 96.5750000 + 38.8595000 96.5833000 + 38.8679000 96.5833000 + 38.8679000 96.5916000 + 38.8762000 96.5916000 + 38.8762000 96.6079600 + 38.9342800 96.6192900 + 38.9732200 96.6837400 + 39.0222500 96.6970300 + 39.0024700 96.7225000 + 39.0121400 96.7482500 + 39.1003600 96.7748600 + 39.1491400 96.8268000 + 39.2277000 96.8276900 + 39.3157300 96.8802300 + 39.3746600 96.8809500 + 39.3554600 96.8162600 + 39.3260000 96.8159300 + 39.2772900 96.7509900 + 39.2583000 96.6349300 +209 209 -1 23 39.18530 96.45445 + 39.3472300 96.5197000 + 39.2785800 96.4934500 + 39.2689100 96.4547600 + 39.2394000 96.4674500 + 39.2297100 96.4287700 + 39.2494000 96.4160200 + 39.2298000 96.4030400 + 39.2003800 96.3900100 + 39.2201000 96.3643800 + 39.2006300 96.2999600 + 39.1319400 96.2739800 + 39.0728900 96.3251200 + 39.0726700 96.4021700 + 39.0234800 96.4275600 + 39.0232900 96.4788900 + 39.0720700 96.5562500 + 39.1017000 96.5179400 + 39.1802100 96.5313600 + 39.2288400 96.6346700 + 39.2583000 96.6349300 + 39.2586100 96.5705600 + 39.3175900 96.5581400 + 39.3472300 96.5197000 +210 210 -1 26 39.47590 96.15276 + 39.6527900 95.9911900 + 39.6527800 95.9782400 + 39.6429600 95.9782400 + 39.6429600 96.0041300 + 39.4956300 96.0170400 + 39.4661200 96.1074100 + 39.3777200 96.1072800 + 39.3482200 96.1459000 + 39.2794000 96.1972700 + 39.2793600 96.2230300 + 39.3479800 96.2876900 + 39.4264800 96.3138000 + 39.4854800 96.2882400 + 39.4952400 96.3141100 + 39.5247300 96.3013200 + 39.5246700 96.3271600 + 39.5541300 96.3272900 + 39.5542600 96.2755800 + 39.6034200 96.2499000 + 39.6230100 96.2758500 + 39.6230700 96.2499700 + 39.6722100 96.2371900 + 39.6527500 96.0947400 + 39.6724100 96.0688700 + 39.6527800 96.0300200 + 39.6527900 95.9911900 +211 211 -1 19 39.36250 96.41074 + 39.4952400 96.3141100 + 39.4854800 96.2882400 + 39.4264800 96.3138000 + 39.3969900 96.3265800 + 39.3772000 96.3780700 + 39.2495600 96.3645300 + 39.2298000 96.4030400 + 39.2494000 96.4160200 + 39.2297100 96.4287700 + 39.2394000 96.4674500 + 39.2689100 96.4547600 + 39.2785800 96.4934500 + 39.3472300 96.5197000 + 39.4258000 96.5202600 + 39.4355600 96.5332400 + 39.4752000 96.4431500 + 39.4754100 96.3785800 + 39.4950600 96.3786800 + 39.4952400 96.3141100 +213 213 -1 21 39.25470 96.19714 + 39.3482200 96.1459000 + 39.2795000 96.1200100 + 39.2697300 96.0298600 + 39.1715200 95.9912400 + 39.1617100 95.9912400 + 39.1617000 96.0298200 + 39.0829800 96.1967400 + 39.1319700 96.2611300 + 39.1319400 96.2739800 + 39.2006300 96.2999600 + 39.2201000 96.3643800 + 39.2003800 96.3900100 + 39.2298000 96.4030400 + 39.2495600 96.3645300 + 39.3772000 96.3780700 + 39.3969900 96.3265800 + 39.4264800 96.3138000 + 39.3479800 96.2876900 + 39.2793600 96.2230300 + 39.2794000 96.1972700 + 39.3482200 96.1459000 +215 215 -1 13 39.42200 95.92045 + 39.6429600 95.9782400 + 39.5938400 95.9394600 + 39.5054400 95.9524500 + 39.4169700 95.8492900 + 39.2597900 95.8238700 + 39.2009300 95.8754700 + 39.2107700 95.9011800 + 39.2893700 95.9525900 + 39.4170500 95.9654100 + 39.4465200 96.0041200 + 39.4956300 96.0170400 + 39.6429600 96.0041300 + 39.6429600 95.9782400 +216 216 -1 15 39.24990 95.81093 + 39.3972500 95.7977400 + 39.3185000 95.7077600 + 39.2988600 95.7078500 + 39.2202900 95.7081600 + 39.1908800 95.7340100 + 39.0730300 95.7344400 + 39.1125500 95.8884700 + 39.1715000 95.9140900 + 39.2009600 95.9140600 + 39.2107700 95.9011800 + 39.2009300 95.8754700 + 39.2597900 95.8238700 + 39.4169700 95.8492900 + 39.4267500 95.8234600 + 39.3972500 95.7977400 +217 217 -1 15 39.76550 95.77772 + 39.8981900 95.7963300 + 39.8587800 95.7315400 + 39.7898900 95.6799200 + 39.7799600 95.6410600 + 39.7995700 95.6279900 + 39.7799300 95.6280900 + 39.6127800 95.5772000 + 39.6032000 95.6548700 + 39.6033900 95.7324800 + 39.6428200 95.8099900 + 39.6822500 95.9782300 + 39.8786600 95.8872800 + 39.9277200 95.8352300 + 39.8982100 95.8093200 + 39.8981900 95.7963300 +219 219 -1 20 39.64210 95.49305 + 39.6313600 95.3312200 + 39.5920700 95.3315900 + 39.5531700 95.4095100 + 39.5236400 95.3968300 + 39.5139400 95.4227400 + 39.5140000 95.4356700 + 39.5042400 95.4486600 + 39.5239900 95.4743500 + 39.5243400 95.5648000 + 39.5538500 95.5775500 + 39.5540100 95.6292600 + 39.6032000 95.6548700 + 39.6127800 95.5772000 + 39.7799300 95.6280900 + 39.7601200 95.5763400 + 39.7207400 95.5506600 + 39.7203200 95.4470100 + 39.6710900 95.4214900 + 39.6708500 95.3697000 + 39.6313600 95.3312200 +2207 2207 -1 82 43.48620 99.35506 + 43.9733100 99.5985900 + 43.9846600 99.5440700 + 43.9565300 99.4875100 + 43.9766200 99.4747600 + 43.8611000 99.3588500 + 43.8216600 99.3569000 + 43.8223500 99.3294400 + 43.7829100 99.3275200 + 43.7451800 99.2570300 + 43.7468500 99.1884700 + 43.6896500 99.1034900 + 43.6778400 99.1021300 + 43.4928200 99.0809000 + 43.4349500 99.0236400 + 43.3942600 99.0764800 + 43.3761300 99.0073900 + 43.3967700 98.9673200 + 43.4559000 98.9698700 + 43.4672800 98.9020100 + 43.5476300 98.8369700 + 43.6166300 98.8398300 + 43.6746000 98.8970900 + 43.6740000 98.9244900 + 43.7337600 98.8996000 + 43.7635300 98.9232700 + 43.8646300 98.7814000 + 43.8112800 98.6335900 + 43.6882500 98.7193600 + 43.6488100 98.7178000 + 43.6003500 98.6747700 + 43.6025300 98.5652800 + 43.5441600 98.5220300 + 43.5332500 98.5763600 + 43.4730200 98.6287900 + 43.4510800 98.7373000 + 43.3412300 98.8011500 + 43.3221100 98.7730900 + 43.3240800 98.6776600 + 43.2854900 98.6352500 + 43.2460800 98.6337400 + 43.2191800 98.4964900 + 43.3187400 98.4455500 + 43.4463600 98.4774300 + 43.4473800 98.4228100 + 43.4483800 98.3681700 + 43.3899600 98.3252000 + 43.3298500 98.3777300 + 43.2510100 98.3750000 + 43.2517400 98.3341400 + 43.2320400 98.3334700 + 43.0825200 98.4235700 + 43.0700900 98.5590500 + 43.0400000 98.5851100 + 43.0276800 98.7069000 + 42.9877200 98.7324900 + 43.0259700 98.7883500 + 43.0239100 98.8833500 + 43.0815000 98.9537400 + 43.0701000 99.0212200 + 43.0783700 99.0895600 + 43.1263200 99.1461400 + 43.1250000 99.2005000 + 43.2095700 99.3679100 + 43.2489700 99.3698400 + 43.2231300 99.6002300 + 43.2795800 99.6986600 + 43.3477600 99.7296400 + 43.3773200 99.7312500 + 43.3879400 99.7045000 + 43.4269600 99.7202800 + 43.4285000 99.6656900 + 43.4690400 99.6268200 + 43.5566000 99.6725500 + 43.5690800 99.5773500 + 43.6574200 99.5956800 + 43.6975900 99.5703500 + 43.6987000 99.5292400 + 43.7176800 99.5576700 + 43.7866900 99.5612700 + 43.8071500 99.5348500 + 43.8838000 99.6213800 + 43.9733100 99.5985900 +221 221 -1 26 39.52990 95.72639 + 39.6822500 95.9782300 + 39.6428200 95.8099900 + 39.6033900 95.7324800 + 39.6032000 95.6548700 + 39.5540100 95.6292600 + 39.5538500 95.5775500 + 39.5243400 95.5648000 + 39.5239900 95.4743500 + 39.5042400 95.4486600 + 39.4749400 95.4876300 + 39.4454200 95.4749200 + 39.4261200 95.5653900 + 39.3967000 95.5784700 + 39.4164700 95.6170600 + 39.4166500 95.6815600 + 39.3775100 95.7462200 + 39.3972500 95.7977400 + 39.4267500 95.8234600 + 39.4169700 95.8492900 + 39.5054400 95.9524500 + 39.5938400 95.9394600 + 39.6429600 95.9782400 + 39.6527800 95.9782400 + 39.6527900 95.9911900 + 39.6724300 96.0041300 + 39.6822500 95.9782300 +2214 2214 -1 46 42.79310 99.38328 + 42.9519200 99.0160400 + 42.9420700 99.0156200 + 42.8312800 98.6721200 + 42.7429400 98.6551800 + 42.7108700 98.7756600 + 42.6494600 98.8812800 + 42.6396100 98.8808700 + 42.6393100 98.8943700 + 42.6390100 98.9078700 + 42.6159300 99.0554500 + 42.6251300 99.0828700 + 42.6740300 99.0985600 + 42.6730600 99.1390700 + 42.7212900 99.1818400 + 42.7199700 99.2358800 + 42.6704100 99.2470900 + 42.6673300 99.3685800 + 42.6465900 99.4081200 + 42.6634100 99.5170700 + 42.6327800 99.5560500 + 42.6316700 99.5965300 + 42.6687700 99.6795700 + 42.6880700 99.6941100 + 42.6959800 99.7621600 + 42.6424100 99.9079100 + 42.7235400 99.8313100 + 42.7424200 99.8594200 + 42.7309700 99.9129100 + 42.7006400 99.9382500 + 42.7178400 100.0204100 + 42.7576200 100.0091900 + 42.7752100 100.0779100 + 42.8248300 100.0672900 + 42.8239900 100.0943500 + 42.8826200 100.1113800 + 42.8732000 100.0972600 + 42.8679500 99.9477900 + 42.7864900 99.6993800 + 42.7986100 99.6187600 + 42.7716700 99.5225800 + 42.8518700 99.4724600 + 42.8265500 99.3086100 + 42.8702800 99.1344800 + 42.9690700 99.1254000 + 42.9703500 99.0711500 + 42.9519200 99.0160400 +2215 2215 -1 23 42.64960 98.60373 + 42.7512500 98.2090400 + 42.7217100 98.2081000 + 42.6809300 98.2878900 + 42.6213800 98.3129300 + 42.6194200 98.4208900 + 42.5689300 98.4866000 + 42.4795600 98.5238300 + 42.4684000 98.5907900 + 42.4678500 98.6177200 + 42.4737600 98.8066100 + 42.5032900 98.8078000 + 42.5679700 98.9993500 + 42.6291700 98.9074500 + 42.6390100 98.9078700 + 42.6393100 98.8943700 + 42.6396100 98.8808700 + 42.6494600 98.8812800 + 42.7108700 98.7756600 + 42.7429400 98.6551800 + 42.8312800 98.6721200 + 42.7759300 98.4805000 + 42.7789200 98.3181900 + 42.7512500 98.2090400 +2216 2216 -1 29 42.51500 98.26291 + 42.7613300 98.1958300 + 42.7132100 98.1267000 + 42.7434100 98.0870500 + 42.7442600 98.0329700 + 42.7061100 97.9507400 + 42.6566800 97.9628500 + 42.6275400 97.9350200 + 42.6172900 97.9617400 + 42.5090000 97.9586800 + 42.4987500 97.9853400 + 42.3906700 97.9688000 + 42.3502700 98.0349000 + 42.3211600 98.0071700 + 42.2706800 98.0863200 + 42.2792100 98.1672000 + 42.2686800 98.2071700 + 42.3068800 98.2756000 + 42.4228000 98.4005700 + 42.4306100 98.5085800 + 42.4684000 98.5907900 + 42.4795600 98.5238300 + 42.5689300 98.4866000 + 42.6194200 98.4208900 + 42.6213800 98.3129300 + 42.6809300 98.2878900 + 42.7217100 98.2081000 + 42.7512500 98.2090400 + 42.7514800 98.1955200 + 42.7613300 98.1958300 +2217 2217 -1 20 43.11570 99.40417 + 43.2795800 99.6986600 + 43.2231300 99.6002300 + 43.2489700 99.3698400 + 43.2095700 99.3679100 + 43.1250000 99.2005000 + 43.1263200 99.1461400 + 43.0783700 99.0895600 + 43.0701000 99.0212200 + 43.0116300 98.9914900 + 42.9519200 99.0160400 + 42.9703500 99.0711500 + 42.9690700 99.1254000 + 42.9749300 99.2885700 + 43.1250100 99.5814900 + 43.1231300 99.6494300 + 43.1523000 99.6645900 + 43.1503800 99.7325600 + 43.1972800 99.8168400 + 43.2473100 99.7923500 + 43.2795800 99.6986600 +2218 2218 -1 21 42.91640 98.60837 + 42.9877200 98.7324900 + 42.9488900 98.7038100 + 42.9699700 98.6367800 + 42.9609400 98.5957200 + 42.8749200 98.4569500 + 42.8764200 98.3756800 + 42.8302600 98.1980200 + 42.7613300 98.1958300 + 42.7514800 98.1955200 + 42.7512500 98.2090400 + 42.7789200 98.3181900 + 42.7759300 98.4805000 + 42.8312800 98.6721200 + 42.9420700 99.0156200 + 42.9519200 99.0160400 + 43.0116300 98.9914900 + 43.0701000 99.0212200 + 43.0815000 98.9537400 + 43.0239100 98.8833500 + 43.0259700 98.7883500 + 42.9877200 98.7324900 +2219 2219 -1 26 42.55930 97.78151 + 42.5736900 97.5422400 + 42.5443200 97.5281100 + 42.5133000 97.6487400 + 42.4632000 97.7149000 + 42.4522700 97.7954500 + 42.4231100 97.7677700 + 42.3737100 97.7799700 + 42.3229800 97.8862200 + 42.3211600 98.0071700 + 42.3502700 98.0349000 + 42.3906700 97.9688000 + 42.4987500 97.9853400 + 42.5090000 97.9586800 + 42.6172900 97.9617400 + 42.6275400 97.9350200 + 42.6566800 97.9628500 + 42.7061100 97.9507400 + 42.7457000 97.9383200 + 42.7179100 97.8158600 + 42.7673400 97.8036300 + 42.7677100 97.7765800 + 42.7974400 97.7638000 + 42.7302600 97.6268600 + 42.7007100 97.6261700 + 42.6418000 97.6112800 + 42.5736900 97.5422400 +2220 2220 -1 46 43.12430 98.10638 + 43.5476800 98.3305500 + 43.5479300 98.3168700 + 43.4221000 98.1760100 + 43.3629600 98.1741400 + 43.2755900 98.0895800 + 43.2760200 98.0623400 + 43.2477100 97.9797400 + 43.1304700 97.9083600 + 43.1020700 97.8259900 + 42.9168800 97.6719400 + 42.9275800 97.6043900 + 42.8797600 97.4813200 + 42.8305200 97.4802600 + 42.8100300 97.5475200 + 42.7007100 97.6261700 + 42.7302600 97.6268600 + 42.7974400 97.7638000 + 42.7677100 97.7765800 + 42.7673400 97.8036300 + 42.7179100 97.8158600 + 42.7457000 97.9383200 + 42.7061100 97.9507400 + 42.7442600 98.0329700 + 42.7434100 98.0870500 + 42.7132100 98.1267000 + 42.7613300 98.1958300 + 42.8302600 98.1980200 + 42.8764200 98.3756800 + 42.8749200 98.4569500 + 42.9609400 98.5957200 + 42.9699700 98.6367800 + 42.9488900 98.7038100 + 42.9877200 98.7324900 + 43.0276800 98.7069000 + 43.0400000 98.5851100 + 43.0700900 98.5590500 + 43.0825200 98.4235700 + 43.2320400 98.3334700 + 43.2517400 98.3341400 + 43.2510100 98.3750000 + 43.3298500 98.3777300 + 43.3899600 98.3252000 + 43.4483800 98.3681700 + 43.4473800 98.4228100 + 43.5452000 98.4673200 + 43.5476800 98.3305500 +223 223 -1 24 39.39630 95.55903 + 39.5042400 95.4486600 + 39.5140000 95.4356700 + 39.5139400 95.4227400 + 39.4351800 95.3846600 + 39.4152100 95.3203200 + 39.3563500 95.3337600 + 39.3666200 95.4239200 + 39.2981000 95.4759900 + 39.2983100 95.5275100 + 39.2787100 95.5405200 + 39.2985700 95.6048000 + 39.2789300 95.6049000 + 39.3184100 95.6691100 + 39.2988600 95.7078500 + 39.3185000 95.7077600 + 39.3972500 95.7977400 + 39.3775100 95.7462200 + 39.4166500 95.6815600 + 39.4164700 95.6170600 + 39.3967000 95.5784700 + 39.4261200 95.5653900 + 39.4454200 95.4749200 + 39.4749400 95.4876300 + 39.5042400 95.4486600 +224 224 -1 22 39.23400 95.40574 + 39.3563500 95.3337600 + 39.2974200 95.3343000 + 39.2776400 95.3087300 + 39.3167000 95.2697100 + 39.2478800 95.2575200 + 39.1984600 95.2065700 + 39.1790600 95.2453700 + 39.1989300 95.2837500 + 39.1792900 95.2839500 + 39.1696800 95.3226200 + 39.1013900 95.4131800 + 39.1115500 95.4901900 + 39.1609500 95.5669800 + 39.1903700 95.5539400 + 39.2101400 95.5924100 + 39.2789300 95.6049000 + 39.2985700 95.6048000 + 39.2787100 95.5405200 + 39.2983100 95.5275100 + 39.2981000 95.4759900 + 39.3666200 95.4239200 + 39.3563500 95.3337600 +225 225 -1 29 39.13180 95.58001 + 39.2789300 95.6049000 + 39.2101400 95.5924100 + 39.1903700 95.5539400 + 39.1609500 95.5669800 + 39.1115500 95.4901900 + 39.1013900 95.4131800 + 39.1696800 95.3226200 + 39.0814300 95.3491300 + 39.0816300 95.3876500 + 39.0521700 95.3879000 + 39.0325900 95.4009000 + 39.0030600 95.3883100 + 39.0134000 95.5037000 + 38.9547200 95.5682100 + 38.9744500 95.5937300 + 38.9548800 95.6194800 + 38.9746700 95.6706800 + 38.9452400 95.6836200 + 38.9651800 95.8374000 + 39.0044600 95.8373200 + 39.0338700 95.7987500 + 39.0434500 95.6832000 + 39.0630600 95.6702700 + 39.0730300 95.7344400 + 39.1908800 95.7340100 + 39.2202900 95.7081600 + 39.2988600 95.7078500 + 39.3184100 95.6691100 + 39.2789300 95.6049000 +226 226 -1 15 39.31390 96.02354 + 39.4956300 96.0170400 + 39.4465200 96.0041200 + 39.4170500 95.9654100 + 39.2893700 95.9525900 + 39.2107700 95.9011800 + 39.2009600 95.9140600 + 39.1715000 95.9140900 + 39.1322400 95.9655500 + 39.1715200 95.9912400 + 39.2697300 96.0298600 + 39.2795000 96.1200100 + 39.3482200 96.1459000 + 39.3777200 96.1072800 + 39.4661200 96.1074100 + 39.4956300 96.0170400 +229 229 -1 18 39.43480 95.23637 + 39.3563500 95.3337600 + 39.4152100 95.3203200 + 39.4351800 95.3846600 + 39.5139400 95.4227400 + 39.5236400 95.3968300 + 39.5531700 95.4095100 + 39.5920700 95.3315900 + 39.5720600 95.2671200 + 39.5300000 95.2000000 + 39.4800000 95.1700000 + 39.4200000 95.0500000 + 39.3700000 95.0500000 + 39.3538300 95.0500000 + 39.3653300 95.1918600 + 39.3167000 95.2697100 + 39.2776400 95.3087300 + 39.2974200 95.3343000 + 39.3563500 95.3337600 +230 230 -1 17 39.23190 95.10308 + 39.3538300 95.0500000 + 39.3500000 95.0500000 + 39.3200000 95.0500000 + 39.2800000 94.9800000 + 39.2300000 94.9700000 + 39.2300000 94.9500000 + 39.1971600 94.9364500 + 39.1080600 94.9377600 + 39.0985600 94.9764400 + 39.1280300 94.9760200 + 39.1188200 95.0532500 + 39.1681100 95.0783200 + 39.1984600 95.2065700 + 39.2478800 95.2575200 + 39.3167000 95.2697100 + 39.3653300 95.1918600 + 39.3538300 95.0500000 +2619 2619 -1 47 43.94200 97.85540 + 44.3683900 97.5693000 + 44.3190000 97.5681500 + 44.2997400 97.5262000 + 44.2503600 97.5250900 + 44.2497200 97.5803800 + 44.0231600 97.5337800 + 44.0223400 97.6026600 + 43.9924000 97.6295000 + 43.7654600 97.6240800 + 43.7351800 97.6782500 + 43.6763500 97.6493900 + 43.6460600 97.7034800 + 43.5567700 97.7423200 + 43.5156500 97.8643700 + 43.6225200 97.9768800 + 43.6004600 98.1269000 + 43.5598900 98.1940800 + 43.5476800 98.3305500 + 43.7029600 98.4730100 + 43.7597700 98.5986400 + 43.7992100 98.6001400 + 43.8112800 98.6335900 + 43.8646300 98.7814000 + 43.9449700 98.7158400 + 43.9266300 98.6462900 + 43.9770500 98.5931500 + 44.0263800 98.5950400 + 44.0450300 98.6509000 + 44.1149300 98.6122200 + 44.1234200 98.6815600 + 44.1826400 98.6839000 + 44.1864000 98.4906200 + 44.1087100 98.4187900 + 44.0709600 98.3209000 + 43.9927300 98.2769100 + 43.9445600 98.2064700 + 43.8952300 98.2048700 + 43.8961300 98.1498800 + 43.9268300 98.0820400 + 43.9663000 98.0832400 + 44.0491000 97.8238500 + 44.1487400 97.7575000 + 44.1693800 97.6889900 + 44.2093800 97.6485300 + 44.2888800 97.6089600 + 44.3677200 97.6246800 + 44.3683900 97.5693000 +2620 2620 -1 32 43.59840 97.56263 + 44.0231600 97.5337800 + 43.8068500 97.4602400 + 43.6983300 97.4579200 + 43.6594700 97.4022800 + 43.4129500 97.3972400 + 43.4121900 97.3980000 + 43.3730800 97.4373700 + 43.3237900 97.4363400 + 43.3040700 97.4359300 + 43.2842100 97.4491400 + 43.2836000 97.5036500 + 43.1735600 97.6373400 + 43.1803200 97.8689000 + 43.2770700 97.9942100 + 43.2760200 98.0623400 + 43.2755900 98.0895800 + 43.3629600 98.1741400 + 43.4221000 98.1760100 + 43.5479300 98.3168700 + 43.5476800 98.3305500 + 43.5598900 98.1940800 + 43.6004600 98.1269000 + 43.6225200 97.9768800 + 43.5156500 97.8643700 + 43.5567700 97.7423200 + 43.6460600 97.7034800 + 43.6763500 97.6493900 + 43.7351800 97.6782500 + 43.7654600 97.6240800 + 43.9924000 97.6295000 + 44.0223400 97.6026600 + 44.0231600 97.5337800 +2646 2646 -1 21 43.02550 97.12052 + 43.0434100 96.7921000 + 43.0235300 96.8190300 + 42.8955400 96.8039600 + 42.7968600 96.8298800 + 42.7761300 96.9784600 + 42.8544100 97.0473000 + 42.9603200 97.3202400 + 43.0588400 97.3221300 + 43.2152200 97.4476900 + 43.2743500 97.4489400 + 43.2749400 97.3944300 + 43.2263700 97.3253500 + 43.1968000 97.3247800 + 43.1685400 97.1881600 + 43.0895800 97.2003900 + 43.0607400 97.1183600 + 42.9721800 97.1033600 + 42.9732500 96.9676900 + 43.0135100 96.8460600 + 43.0431600 96.8328500 + 43.0434100 96.7921000 +2647 2647 -1 37 43.28290 97.27369 + 43.5934000 97.0860000 + 43.5935200 97.0723000 + 43.5248100 97.0302000 + 43.5148400 97.0437200 + 43.2803300 96.7266800 + 43.2015500 96.7122400 + 43.2174300 96.6487100 + 43.1800000 96.6300000 + 43.1522000 96.7253300 + 43.0434100 96.7921000 + 43.0431600 96.8328500 + 43.0135100 96.8460600 + 42.9732500 96.9676900 + 42.9721800 97.1033600 + 43.0607400 97.1183600 + 43.0895800 97.2003900 + 43.1685400 97.1881600 + 43.1968000 97.3247800 + 43.2263700 97.3253500 + 43.2749400 97.3944300 + 43.2743500 97.4489400 + 43.2842100 97.4491400 + 43.3040700 97.4359300 + 43.3237900 97.4363400 + 43.3249300 97.3272500 + 43.3620500 97.2672800 + 43.3258600 97.2318000 + 43.3169800 97.1225400 + 43.2385800 97.0667700 + 43.2191900 97.0256200 + 43.2293600 96.9849200 + 43.2786400 96.9856200 + 43.3579100 96.9321700 + 43.4262100 97.0287200 + 43.4755100 97.0294600 + 43.5439800 97.0988900 + 43.5934000 97.0860000 +2648 2648 -1 24 43.48010 97.09973 + 43.7410100 97.1295100 + 43.7215200 97.1017500 + 43.6326300 97.1140200 + 43.5934000 97.0860000 + 43.5439800 97.0988900 + 43.4755100 97.0294600 + 43.4262100 97.0287200 + 43.3579100 96.9321700 + 43.2786400 96.9856200 + 43.2293600 96.9849200 + 43.2191900 97.0256200 + 43.2385800 97.0667700 + 43.3169800 97.1225400 + 43.3258600 97.2318000 + 43.3620500 97.2672800 + 43.3750200 97.2463200 + 43.4444200 97.2066000 + 43.4446700 97.1792800 + 43.4738700 97.2207900 + 43.5624900 97.2360500 + 43.5819600 97.2637900 + 43.6805700 97.2667200 + 43.6812200 97.1970700 + 43.7410100 97.1295100 +2650 2650 -1 29 43.78710 97.43668 + 44.2503600 97.5250900 + 44.2213700 97.4691600 + 44.1233800 97.3980500 + 44.1033500 97.4252200 + 44.0441200 97.4239900 + 44.0237800 97.4786800 + 43.9551500 97.4358900 + 43.8071400 97.4327800 + 43.7778400 97.4047000 + 43.7589600 97.3219600 + 43.6805700 97.2667200 + 43.5819600 97.2637900 + 43.5624900 97.2360500 + 43.4738700 97.2207900 + 43.4446700 97.1792800 + 43.4444200 97.2066000 + 43.3750200 97.2463200 + 43.3620500 97.2672800 + 43.3249300 97.3272500 + 43.3237900 97.4363400 + 43.3730800 97.4373700 + 43.4121900 97.3980000 + 43.4129500 97.3972400 + 43.6594700 97.4022800 + 43.6983300 97.4579200 + 43.8068500 97.4602400 + 44.0231600 97.5337800 + 44.2497200 97.5803800 + 44.2503600 97.5250900 +309 309 -1 25 39.44030 98.02153 + 39.4909700 97.9027900 + 39.4715200 97.8893700 + 39.4626600 97.8245700 + 39.4035600 97.8359800 + 39.3251900 97.8211100 + 39.3246200 97.8597600 + 39.2951600 97.8590000 + 39.2755200 97.8585000 + 39.2655100 97.8711200 + 39.2737400 97.9743700 + 39.2835600 97.9746300 + 39.3228300 97.9757000 + 39.3504000 98.0924900 + 39.3294400 98.1692200 + 39.3678100 98.2219600 + 39.3883500 98.1709900 + 39.4278500 98.1592600 + 39.4285200 98.1205700 + 39.5760300 98.1119700 + 39.5945600 98.1771900 + 39.6142000 98.1777900 + 39.6150900 98.1260500 + 39.5480600 98.0206500 + 39.5298500 97.9296600 + 39.4909700 97.9027900 +311 311 -1 15 39.35650 97.66035 + 39.4177000 97.5137300 + 39.3882400 97.5131100 + 39.3785800 97.5000200 + 39.3000100 97.4983900 + 39.2608900 97.4847100 + 39.2605800 97.5104500 + 39.2504500 97.5359900 + 39.2790900 97.6009900 + 39.3251900 97.8211100 + 39.4035600 97.8359800 + 39.4626600 97.8245700 + 39.4052100 97.7199000 + 39.4257200 97.6558600 + 39.4268900 97.5655500 + 39.4177000 97.5137300 +601 601 -1 18 41.02060 97.86402 + 41.0478500 97.6014300 + 41.0178600 97.6403400 + 41.0162700 97.7590600 + 40.9669500 97.7710200 + 40.9652500 97.8896600 + 40.9544300 97.9552900 + 40.9247400 97.9676500 + 40.9437800 98.0077300 + 40.9322400 98.1128500 + 40.9516800 98.1266200 + 41.0219800 98.0363500 + 41.0228100 97.9835700 + 41.0525000 97.9712100 + 41.0731600 97.9057500 + 41.0550400 97.7996300 + 41.0763200 97.6813100 + 41.1164900 97.6162000 + 41.0478500 97.6014300 +602 602 -1 20 41.16030 97.25434 + 41.2211500 96.9966300 + 41.1818200 96.9960800 + 41.1815100 97.0357500 + 41.0824200 97.1267500 + 41.1020800 97.1270600 + 41.1016000 97.1798900 + 41.0520800 97.2186700 + 41.0513000 97.2978700 + 41.0609900 97.3112500 + 41.0608600 97.3244500 + 41.1395000 97.3259200 + 41.1578700 97.4452600 + 41.2160800 97.5126100 + 41.2269800 97.4202000 + 41.2665900 97.3945200 + 41.2483000 97.2617700 + 41.2682300 97.2356500 + 41.2693200 97.1164900 + 41.2304500 97.0629300 + 41.2211500 96.9966300 +603 603 -1 14 40.99860 97.19780 + 41.0824200 97.1267500 + 41.0232000 97.1521900 + 40.9741700 97.1382100 + 40.9548600 97.0983500 + 40.9155500 97.0977400 + 40.8951800 97.1764600 + 40.9250300 97.1374200 + 40.9933500 97.1912800 + 41.0122500 97.2707600 + 41.0513000 97.2978700 + 41.0520800 97.2186700 + 41.1016000 97.1798900 + 41.1020800 97.1270600 + 41.0824200 97.1267500 +604 604 -1 13 40.90340 98.04480 + 40.9652500 97.8896600 + 40.9361500 97.8625200 + 40.8773800 97.8478100 + 40.8457100 97.9917900 + 40.8824500 98.1508900 + 40.8415500 98.2418000 + 40.9210800 98.1916000 + 40.9516800 98.1266200 + 40.9322400 98.1128500 + 40.9437800 98.0077300 + 40.9247400 97.9676500 + 40.9544300 97.9552900 + 40.9652500 97.8896600 +605 605 -1 18 40.97810 97.63250 + 41.0501800 97.4034600 + 40.9620100 97.3753400 + 40.9222600 97.4141000 + 40.9221100 97.4272800 + 40.9024500 97.4268800 + 40.9307100 97.5328800 + 40.9005900 97.5849200 + 40.8777600 97.8214700 + 40.8773800 97.8478100 + 40.9361500 97.8625200 + 40.9652500 97.8896600 + 40.9669500 97.7710200 + 41.0162700 97.7590600 + 41.0178600 97.6403400 + 41.0478500 97.6014300 + 41.0787700 97.4832600 + 41.0696900 97.4170500 + 41.0501800 97.4034600 +606 606 -1 15 40.97780 97.27576 + 41.0608600 97.3244500 + 41.0609900 97.3112500 + 41.0513000 97.2978700 + 41.0122500 97.2707600 + 40.9933500 97.1912800 + 40.9250300 97.1374200 + 40.8951800 97.1764600 + 40.8946800 97.2291400 + 40.9041300 97.2688200 + 40.9229700 97.3482300 + 40.9222600 97.4141000 + 40.9620100 97.3753400 + 41.0501800 97.4034600 + 41.0510300 97.3242600 + 41.0608600 97.3244500 +607 607 -1 17 40.82140 98.10301 + 40.8777600 97.8214700 + 40.8282400 97.8465300 + 40.8276600 97.8859900 + 40.7981800 97.8852200 + 40.7975900 97.9246600 + 40.7763000 98.0293000 + 40.7955300 98.0561600 + 40.7832900 98.2005000 + 40.8013100 98.2931600 + 40.7603200 98.3838800 + 40.7799700 98.3845400 + 40.8317300 98.2414900 + 40.8415500 98.2418000 + 40.8824500 98.1508900 + 40.8457100 97.9917900 + 40.8773800 97.8478100 + 40.8777600 97.8214700 +608 608 -1 11 40.85700 97.65644 + 40.9024500 97.4268800 + 40.7942000 97.4378600 + 40.7832900 97.5297000 + 40.8214600 97.6226300 + 40.7981800 97.8852200 + 40.8276600 97.8859900 + 40.8282400 97.8465300 + 40.8777600 97.8214700 + 40.9005900 97.5849200 + 40.9307100 97.5328800 + 40.9024500 97.4268800 +609 609 -1 23 40.68330 98.19797 + 40.7975900 97.9246600 + 40.7288100 97.9228000 + 40.7183800 97.9619400 + 40.6485700 98.0256600 + 40.6671600 98.0918500 + 40.6269800 98.1431700 + 40.6258500 98.2087600 + 40.5760400 98.2465600 + 40.5753400 98.2858800 + 40.5652800 98.2986800 + 40.5844500 98.3255200 + 40.5827300 98.4172900 + 40.6018800 98.4441800 + 40.6799600 98.4731400 + 40.7207700 98.3957000 + 40.7502400 98.3967000 + 40.7504900 98.3835500 + 40.7603200 98.3838800 + 40.8013100 98.2931600 + 40.7832900 98.2005000 + 40.7955300 98.0561600 + 40.7763000 98.0293000 + 40.7975900 97.9246600 +610 610 -1 19 40.67020 97.88813 + 40.7832900 97.5297000 + 40.7045200 97.5411500 + 40.6738900 97.6324000 + 40.6344200 97.6446200 + 40.6233700 97.7362300 + 40.5937200 97.7486200 + 40.5321000 97.9306000 + 40.5189100 98.1399200 + 40.5760400 98.2465600 + 40.6258500 98.2087600 + 40.6269800 98.1431700 + 40.6671600 98.0918500 + 40.6485700 98.0256600 + 40.7183800 97.9619400 + 40.7288100 97.9228000 + 40.7975900 97.9246600 + 40.7981800 97.8852200 + 40.8214600 97.6226300 + 40.7832900 97.5297000 +611 611 -1 26 40.74950 97.40932 + 40.9041300 97.2688200 + 40.8455400 97.2282900 + 40.7767500 97.2271000 + 40.7772400 97.1745100 + 40.7477600 97.1740200 + 40.7181600 97.1866700 + 40.7172700 97.2786300 + 40.7369200 97.2789800 + 40.7463500 97.3185900 + 40.7165900 97.3443100 + 40.6854900 97.4882000 + 40.6460300 97.5005000 + 40.6458800 97.5136200 + 40.6260700 97.5263200 + 40.5759700 97.6039300 + 40.6049400 97.6439400 + 40.6344200 97.6446200 + 40.6738900 97.6324000 + 40.7045200 97.5411500 + 40.7832900 97.5297000 + 40.7942000 97.4378600 + 40.9024500 97.4268800 + 40.9221100 97.4272800 + 40.9222600 97.4141000 + 40.9229700 97.3482300 + 40.9041300 97.2688200 +612 612 -1 19 40.68260 97.26440 + 40.6503100 97.0805200 + 40.6498500 97.1330200 + 40.6693800 97.1464600 + 40.6493700 97.1855200 + 40.6483400 97.2905200 + 40.6181800 97.3555800 + 40.6168600 97.4736400 + 40.6460300 97.5005000 + 40.6854900 97.4882000 + 40.7165900 97.3443100 + 40.7463500 97.3185900 + 40.7369200 97.2789800 + 40.7172700 97.2786300 + 40.7181600 97.1866700 + 40.7477600 97.1740200 + 40.7483500 97.1083000 + 40.6998800 97.0287300 + 40.6703900 97.0283100 + 40.6503100 97.0805200 +613 613 -1 33 40.89170 97.07623 + 41.1818200 96.9960800 + 41.1130100 96.9951100 + 41.0142800 97.0464900 + 40.9750700 97.0327300 + 40.9557300 96.9929000 + 40.9360700 96.9926200 + 40.9358600 97.0189800 + 40.8768900 97.0181400 + 40.7688800 97.0034300 + 40.7298700 96.9634600 + 40.7003900 96.9630600 + 40.6518300 96.8836400 + 40.6318900 96.9227700 + 40.6122400 96.9225100 + 40.6016000 97.0273100 + 40.6503100 97.0805200 + 40.6703900 97.0283100 + 40.6998800 97.0287300 + 40.7483500 97.1083000 + 40.7477600 97.1740200 + 40.7772400 97.1745100 + 40.7767500 97.2271000 + 40.8455400 97.2282900 + 40.9041300 97.2688200 + 40.8946800 97.2291400 + 40.8951800 97.1764600 + 40.9155500 97.0977400 + 40.9548600 97.0983500 + 40.9741700 97.1382100 + 41.0232000 97.1521900 + 41.0824200 97.1267500 + 41.1815100 97.0357500 + 41.1818200 96.9960800 +614 614 -1 17 40.53160 97.65487 + 40.6260700 97.5263200 + 40.5580600 97.4593100 + 40.5294600 97.3801000 + 40.4803400 97.3791400 + 40.4403000 97.4438200 + 40.4300300 97.4828600 + 40.4287600 97.5875300 + 40.4767000 97.6802700 + 40.4650700 97.8109400 + 40.4741300 97.8635500 + 40.5321000 97.9306000 + 40.5937200 97.7486200 + 40.6233700 97.7362300 + 40.6344200 97.6446200 + 40.6049400 97.6439400 + 40.5759700 97.6039300 + 40.6260700 97.5263200 +615 615 -1 21 40.56490 97.26287 + 40.6460300 97.5005000 + 40.6168600 97.4736400 + 40.6181800 97.3555800 + 40.6483400 97.2905200 + 40.6493700 97.1855200 + 40.6210400 97.0538300 + 40.6016000 97.0273100 + 40.5918800 97.0140500 + 40.4839000 96.9994300 + 40.4829200 97.1172700 + 40.5219800 97.1441000 + 40.5215000 97.1965000 + 40.5507300 97.2232100 + 40.5499500 97.3018400 + 40.4806200 97.3529600 + 40.4803400 97.3791400 + 40.5294600 97.3801000 + 40.5580600 97.4593100 + 40.6260700 97.5263200 + 40.6458800 97.5136200 + 40.6460300 97.5005000 +616 616 -1 17 40.40830 97.14268 + 40.4839000 96.9994300 + 40.3664900 96.9324100 + 40.3661000 96.9847000 + 40.2965800 97.0751800 + 40.2658000 97.2183300 + 40.2753700 97.2446100 + 40.3244900 97.2454700 + 40.3044500 97.2843100 + 40.3531700 97.3244000 + 40.4514200 97.3262300 + 40.4806200 97.3529600 + 40.5499500 97.3018400 + 40.5507300 97.2232100 + 40.5215000 97.1965000 + 40.5219800 97.1441000 + 40.4829200 97.1172700 + 40.4839000 96.9994300 +617 617 -1 23 40.39550 96.93874 + 40.6122400 96.9225100 + 40.5631100 96.9218800 + 40.5241700 96.8689600 + 40.5346000 96.7773500 + 40.5253000 96.6855300 + 40.5057800 96.6591400 + 40.4664100 96.6718700 + 40.3878000 96.6711300 + 40.2005300 96.7737300 + 40.2293200 96.8784300 + 40.1793300 96.9951800 + 40.1985500 97.0476200 + 40.1786800 97.0734100 + 40.1974000 97.1780400 + 40.2268800 97.1785200 + 40.2658000 97.2183300 + 40.2965800 97.0751800 + 40.3661000 96.9847000 + 40.3664900 96.9324100 + 40.4839000 96.9994300 + 40.5918800 97.0140500 + 40.6016000 97.0273100 + 40.6122400 96.9225100 +618 618 -1 18 40.26010 96.63042 + 40.4664100 96.6718700 + 40.4372600 96.6061600 + 40.3980800 96.5796700 + 40.4179600 96.5275000 + 40.3688300 96.5271400 + 40.3395200 96.4877100 + 40.2510900 96.4871100 + 40.2018600 96.5128600 + 40.2015800 96.5780800 + 40.0935100 96.5772100 + 40.0834400 96.6292100 + 40.0539000 96.6419800 + 40.0537600 96.6680100 + 40.1224600 96.6816800 + 40.1417400 96.7470200 + 40.2005300 96.7737300 + 40.3878000 96.6711300 + 40.4664100 96.6718700 +619 619 -1 16 40.12620 96.85772 + 40.2005300 96.7737300 + 40.1417400 96.7470200 + 40.1224600 96.6816800 + 40.0537600 96.6680100 + 40.0341100 96.6678200 + 40.0237000 96.7718200 + 40.0230100 96.8759000 + 40.0423900 96.9151800 + 40.0522100 96.9153100 + 40.0521100 96.9283200 + 40.0709500 97.0327300 + 40.1496500 97.0208300 + 40.1985500 97.0476200 + 40.1793300 96.9951800 + 40.2293200 96.8784300 + 40.2005300 96.7737300 +620 620 -1 13 40.15250 96.49908 + 40.1729200 96.3561900 + 40.1530300 96.4343000 + 40.0543300 96.5508600 + 40.0539000 96.6419800 + 40.0834400 96.6292100 + 40.0935100 96.5772100 + 40.2015800 96.5780800 + 40.2018600 96.5128600 + 40.2510900 96.4871100 + 40.2511900 96.4610100 + 40.2315800 96.4478300 + 40.2220500 96.3564400 + 40.1729200 96.3561900 +621 621 -1 25 40.00030 96.62252 + 40.1729200 96.3561900 + 40.1533500 96.3300200 + 40.1140500 96.3298500 + 40.0844700 96.3687700 + 39.9960900 96.3553200 + 39.9665400 96.3811700 + 39.9663300 96.4461700 + 39.9269400 96.4719200 + 39.9167400 96.5628000 + 39.8872100 96.5755500 + 39.8277600 96.6788900 + 39.8473300 96.6920500 + 39.8664400 96.7831100 + 39.8662000 96.8220600 + 39.9252200 96.8097400 + 39.9247800 96.8747000 + 40.0423900 96.9151800 + 40.0230100 96.8759000 + 40.0237000 96.7718200 + 40.0341100 96.6678200 + 40.0537600 96.6680100 + 40.0539000 96.6419800 + 40.0543300 96.5508600 + 40.1530300 96.4343000 + 40.1729200 96.3561900 +622 622 -1 14 39.76410 96.68445 + 39.9269400 96.4719200 + 39.8286100 96.4972200 + 39.7791600 96.5746800 + 39.7789200 96.6265600 + 39.7592000 96.6393400 + 39.6412700 96.6512500 + 39.6013200 96.7673000 + 39.7587100 96.7300900 + 39.8664400 96.7831100 + 39.8473300 96.6920500 + 39.8277600 96.6788900 + 39.8872100 96.5755500 + 39.9167400 96.5628000 + 39.9269400 96.4719200 +623 623 -1 17 39.72380 96.90471 + 39.8664400 96.7831100 + 39.7587100 96.7300900 + 39.6013200 96.7673000 + 39.6010800 96.8061100 + 39.5912600 96.8059900 + 39.5910900 96.8318600 + 39.5810900 96.8576000 + 39.6201100 96.8968900 + 39.6194200 96.9874500 + 39.6481400 97.0784500 + 39.7070700 97.0793400 + 39.7665400 97.0154000 + 39.7666500 97.0024300 + 39.7177400 96.9758500 + 39.7182300 96.9110600 + 39.8662000 96.8220600 + 39.8664400 96.7831100 +626 626 -1 21 40.39370 98.28368 + 40.5652800 98.2986800 + 40.5161600 98.2970900 + 40.4686700 98.2038900 + 40.4296000 98.1895900 + 40.3724300 98.0832100 + 40.3333500 98.0690000 + 40.3121700 98.1598600 + 40.2530100 98.1711300 + 40.2521000 98.2233300 + 40.2029900 98.2218000 + 40.2308200 98.3140300 + 40.2504600 98.3146700 + 40.2691300 98.3675100 + 40.2789600 98.3678400 + 40.2764400 98.4983700 + 40.4046500 98.4766800 + 40.4741700 98.4398000 + 40.4744200 98.4267200 + 40.5827300 98.4172900 + 40.5844500 98.3255200 + 40.5652800 98.2986800 +627 627 -1 26 40.29910 98.04586 + 40.4686700 98.2038900 + 40.4704400 98.0991700 + 40.3241600 98.0295300 + 40.3249900 97.9772800 + 40.2676400 97.8712200 + 40.2685900 97.8059600 + 40.2303900 97.7266900 + 40.2314400 97.6484100 + 40.2028000 97.5825200 + 40.1731700 97.5949100 + 40.1796200 97.8428400 + 40.1301200 97.8676400 + 40.1772300 97.9992800 + 40.1277000 98.0239600 + 40.1471400 98.0375500 + 40.1364600 98.0893900 + 40.1655000 98.1163200 + 40.1545600 98.1811800 + 40.2029900 98.2218000 + 40.2521000 98.2233300 + 40.2530100 98.1711300 + 40.3121700 98.1598600 + 40.3333500 98.0690000 + 40.3724300 98.0832100 + 40.4296000 98.1895900 + 40.4686700 98.2038900 +628 628 -1 24 40.38940 97.88874 + 40.5321000 97.9306000 + 40.4741300 97.8635500 + 40.4650700 97.8109400 + 40.3684500 97.6908000 + 40.3313100 97.5200300 + 40.2826600 97.4798100 + 40.2335400 97.4788000 + 40.2329200 97.5309800 + 40.2032900 97.5434000 + 40.2028000 97.5825200 + 40.2314400 97.6484100 + 40.2303900 97.7266900 + 40.2685900 97.8059600 + 40.2676400 97.8712200 + 40.3249900 97.9772800 + 40.3241600 98.0295300 + 40.4704400 98.0991700 + 40.4686700 98.2038900 + 40.5161600 98.2970900 + 40.5652800 98.2986800 + 40.5753400 98.2858800 + 40.5760400 98.2465600 + 40.5189100 98.1399200 + 40.5321000 97.9306000 +629 629 -1 18 40.33060 97.47400 + 40.4300300 97.4828600 + 40.3908800 97.4689700 + 40.3716800 97.4293500 + 40.3225600 97.4283700 + 40.3228500 97.4022400 + 40.2247500 97.3872700 + 40.1845700 97.4647400 + 40.2040700 97.4781900 + 40.2032900 97.5434000 + 40.2329200 97.5309800 + 40.2335400 97.4788000 + 40.2826600 97.4798100 + 40.3313100 97.5200300 + 40.3684500 97.6908000 + 40.4650700 97.8109400 + 40.4767000 97.6802700 + 40.4287600 97.5875300 + 40.4300300 97.4828600 +630 630 -1 42 40.21800 97.28934 + 40.4806200 97.3529600 + 40.4514200 97.3262300 + 40.3531700 97.3244000 + 40.3044500 97.2843100 + 40.3244900 97.2454700 + 40.2753700 97.2446100 + 40.2658000 97.2183300 + 40.2268800 97.1785200 + 40.1974000 97.1780400 + 40.0991600 97.1764200 + 40.0984100 97.2545600 + 40.1666500 97.3079100 + 40.1658100 97.3861200 + 40.0953900 97.5280500 + 40.0261500 97.5656100 + 40.0248100 97.6696900 + 39.9755300 97.6815500 + 39.9553600 97.7200800 + 39.9648200 97.7463100 + 40.0041100 97.7472700 + 40.0317000 97.8780900 + 40.0707900 97.8921400 + 40.0994700 97.9450000 + 40.0990600 97.9710500 + 40.1277000 98.0239600 + 40.1772300 97.9992800 + 40.1301200 97.8676400 + 40.1796200 97.8428400 + 40.1731700 97.5949100 + 40.2028000 97.5825200 + 40.2032900 97.5434000 + 40.2040700 97.4781900 + 40.1845700 97.4647400 + 40.2247500 97.3872700 + 40.3228500 97.4022400 + 40.3225600 97.4283700 + 40.3716800 97.4293500 + 40.3908800 97.4689700 + 40.4300300 97.4828600 + 40.4403000 97.4438200 + 40.4803400 97.3791400 + 40.4806200 97.3529600 +631 631 -1 25 39.85400 97.28263 + 39.9815300 97.1484800 + 39.8933500 97.1211000 + 39.8741600 97.0688600 + 39.7666500 97.0024300 + 39.7665400 97.0154000 + 39.7070700 97.0793400 + 39.7266000 97.0925900 + 39.7262600 97.1314500 + 39.7944100 97.1973800 + 39.7842100 97.2361200 + 39.8033300 97.2883400 + 39.7832800 97.3268900 + 39.7538200 97.3263400 + 39.8022300 97.3921000 + 39.8013400 97.4699200 + 39.8793000 97.5234500 + 39.8984600 97.5628400 + 39.9383900 97.5117100 + 39.9489700 97.4469400 + 39.9687700 97.4343300 + 39.9696300 97.3563400 + 39.9995200 97.3178800 + 39.9809200 97.2135000 + 40.0009300 97.1748100 + 39.9815300 97.1484800 +632 632 -1 32 40.03820 97.32420 + 40.1985500 97.0476200 + 40.1496500 97.0208300 + 40.0709500 97.0327300 + 40.0521100 96.9283200 + 39.9729300 97.0053200 + 40.0212800 97.0970800 + 40.0210500 97.1230900 + 39.9815300 97.1484800 + 40.0009300 97.1748100 + 39.9809200 97.2135000 + 39.9995200 97.3178800 + 39.9696300 97.3563400 + 39.9687700 97.4343300 + 39.9489700 97.4469400 + 39.9383900 97.5117100 + 39.8984600 97.5628400 + 39.9177800 97.5892400 + 39.8778200 97.6403000 + 39.8966000 97.7056800 + 39.9358900 97.7066100 + 39.9553600 97.7200800 + 39.9755300 97.6815500 + 40.0248100 97.6696900 + 40.0261500 97.5656100 + 40.0953900 97.5280500 + 40.1658100 97.3861200 + 40.1666500 97.3079100 + 40.0984100 97.2545600 + 40.0991600 97.1764200 + 40.1974000 97.1780400 + 40.1786800 97.0734100 + 40.1985500 97.0476200 +633 633 -1 16 39.88500 96.97911 + 40.0521100 96.9283200 + 40.0522100 96.9153100 + 40.0423900 96.9151800 + 39.9247800 96.8747000 + 39.9252200 96.8097400 + 39.8662000 96.8220600 + 39.7182300 96.9110600 + 39.7177400 96.9758500 + 39.7666500 97.0024300 + 39.8741600 97.0688600 + 39.8933500 97.1211000 + 39.9815300 97.1484800 + 40.0210500 97.1230900 + 40.0212800 97.0970800 + 39.9729300 97.0053200 + 40.0521100 96.9283200 +634 634 -1 12 39.83870 96.45166 + 39.9960900 96.3553200 + 39.9273300 96.3549700 + 39.8488100 96.3286300 + 39.7600900 96.4319300 + 39.6814200 96.4573600 + 39.7203400 96.5483000 + 39.7791600 96.5746800 + 39.8286100 96.4972200 + 39.9269400 96.4719200 + 39.9663300 96.4461700 + 39.9665400 96.3811700 + 39.9960900 96.3553200 +635 635 -1 20 39.74070 96.26311 + 39.8785700 96.1859300 + 39.7902100 96.1468000 + 39.7804300 96.1078700 + 39.7214900 96.1207400 + 39.6724100 96.0688700 + 39.6527500 96.0947400 + 39.6722100 96.2371900 + 39.6230700 96.2499700 + 39.6230100 96.2758500 + 39.6034200 96.2499000 + 39.5542600 96.2755800 + 39.5541300 96.3272900 + 39.6620300 96.3795600 + 39.6814200 96.4573600 + 39.7600900 96.4319300 + 39.8488100 96.3286300 + 39.9273300 96.3549700 + 39.8981600 96.2249500 + 39.8785100 96.2248800 + 39.8785700 96.1859300 +636 636 -1 15 39.51600 96.97315 + 39.5810900 96.8576000 + 39.4926100 96.8694800 + 39.4634100 96.8303900 + 39.4533200 96.8690000 + 39.3943000 96.8812000 + 39.3843000 96.9068600 + 39.3839100 96.9584400 + 39.4425400 96.9979500 + 39.4324000 97.0365200 + 39.4715800 97.0500000 + 39.5594100 97.1159100 + 39.6481400 97.0784500 + 39.6194200 96.9874500 + 39.6201100 96.8968900 + 39.5810900 96.8576000 +637 637 -1 21 39.60200 96.55371 + 39.6814200 96.4573600 + 39.6620300 96.3795600 + 39.5541300 96.3272900 + 39.5246700 96.3271600 + 39.5247300 96.3013200 + 39.4952400 96.3141100 + 39.4950600 96.3786800 + 39.4754100 96.3785800 + 39.4752000 96.4431500 + 39.4355600 96.5332400 + 39.4249100 96.7009100 + 39.5034100 96.7145900 + 39.5912600 96.8059900 + 39.6010800 96.8061100 + 39.6013200 96.7673000 + 39.6412700 96.6512500 + 39.7592000 96.6393400 + 39.7789200 96.6265600 + 39.7791600 96.5746800 + 39.7203400 96.5483000 + 39.6814200 96.4573600 +638 638 -1 22 39.42480 96.71328 + 39.5912600 96.8059900 + 39.5034100 96.7145900 + 39.4249100 96.7009100 + 39.4355600 96.5332400 + 39.4258000 96.5202600 + 39.3472300 96.5197000 + 39.3175900 96.5581400 + 39.2586100 96.5705600 + 39.2583000 96.6349300 + 39.2772900 96.7509900 + 39.3260000 96.8159300 + 39.3554600 96.8162600 + 39.3746600 96.8809500 + 39.3844800 96.8810700 + 39.3843000 96.9068600 + 39.3943000 96.8812000 + 39.4533200 96.8690000 + 39.4634100 96.8303900 + 39.4926100 96.8694800 + 39.5810900 96.8576000 + 39.5910900 96.8318600 + 39.5912600 96.8059900 +640 640 -1 18 41.13600 97.61501 + 41.2160800 97.5126100 + 41.1578700 97.4452600 + 41.1395000 97.3259200 + 41.0608600 97.3244500 + 41.0510300 97.3242600 + 41.0501800 97.4034600 + 41.0696900 97.4170500 + 41.0787700 97.4832600 + 41.0478500 97.6014300 + 41.1164900 97.6162000 + 41.0763200 97.6813100 + 41.0550400 97.7996300 + 41.0731600 97.9057500 + 41.1230900 97.8542300 + 41.1438700 97.7754500 + 41.1252900 97.6956900 + 41.2241100 97.6583600 + 41.2160800 97.5126100 +701 701 -1 15 42.51360 99.10980 + 42.4678500 98.6177200 + 42.4284900 98.6162300 + 42.3767900 98.7354000 + 42.4794000 98.9955300 + 42.4762200 99.1301700 + 42.5214300 99.2940700 + 42.5033800 99.6033700 + 42.5627900 99.5929600 + 42.5948800 99.5001000 + 42.6346100 99.4885900 + 42.6503900 99.2596600 + 42.5679700 98.9993500 + 42.5032900 98.8078000 + 42.4737600 98.8066100 + 42.4678500 98.6177200 +702 702 -1 15 42.29350 98.58879 + 42.3068800 98.2756000 + 42.2473700 98.3005100 + 42.1934000 98.5537300 + 42.1327600 98.6319700 + 42.1186800 98.8325500 + 42.1371700 98.8869500 + 42.1762200 98.9019900 + 42.2474400 98.7974900 + 42.3767900 98.7354000 + 42.4284900 98.6162300 + 42.4678500 98.6177200 + 42.4684000 98.5907900 + 42.4306100 98.5085800 + 42.4228000 98.4005700 + 42.3068800 98.2756000 +703 703 -1 24 42.12080 98.43000 + 42.1731300 98.0297400 + 42.0944200 98.0274500 + 42.0940000 98.0542400 + 42.0542100 98.0798600 + 42.0535600 98.1200100 + 41.9945400 98.1182300 + 41.9840400 98.1580400 + 41.9346300 98.1698900 + 41.9428600 98.2637500 + 41.9812500 98.3185100 + 42.0412300 98.2669400 + 42.0705100 98.2812900 + 42.0473900 98.4680300 + 42.0665500 98.4955000 + 42.0717900 98.7234600 + 42.1186800 98.8325500 + 42.1327600 98.6319700 + 42.1934000 98.5537300 + 42.2473700 98.3005100 + 42.3068800 98.2756000 + 42.2686800 98.2071700 + 42.2792100 98.1672000 + 42.2210500 98.1116900 + 42.1731300 98.0297400 +704 704 -1 35 42.00820 97.78967 + 42.1004300 97.5987900 + 42.0714000 97.5579400 + 42.0726500 97.4508100 + 42.0140500 97.4094400 + 41.8860100 97.4202200 + 41.8952500 97.4738500 + 41.9247600 97.4744700 + 41.9231600 97.6081100 + 41.8843100 97.5671400 + 41.8644700 97.5800500 + 41.8228800 97.7526200 + 41.8319800 97.8062500 + 41.9002700 97.8481100 + 41.9282100 97.9557900 + 41.9278000 97.9825100 + 41.8980800 97.9950300 + 41.8974600 98.0351100 + 41.8777800 98.0345400 + 41.9162800 98.0891200 + 41.9346300 98.1698900 + 41.9840400 98.1580400 + 41.9945400 98.1182300 + 42.0535600 98.1200100 + 42.0542100 98.0798600 + 42.0940000 98.0542400 + 42.0944200 98.0274500 + 42.1731300 98.0297400 + 42.1934400 97.9900700 + 42.1639200 97.9892300 + 42.1653300 97.8953700 + 42.1267400 97.8407000 + 42.1466100 97.8278100 + 42.1473600 97.7741900 + 42.1182000 97.7466400 + 42.1004300 97.5987900 +705 NF ELKHORN RIVER NR PIERCE NE -1 496 42.33500 97.62750 + 42.1787500 97.4879170 + 42.1745830 97.4983540 + 42.1620830 97.5108540 + 42.1641880 97.5129170 + 42.1662500 97.5149790 + 42.1662500 97.5275210 + 42.1641880 97.5295830 + 42.1558130 97.5295830 + 42.1537500 97.5274790 + 42.1516880 97.5254170 + 42.1454170 97.5274790 + 42.1412500 97.5399790 + 42.1412500 97.5691880 + 42.1391460 97.5712500 + 42.1370830 97.5733130 + 42.1370830 97.5775210 + 42.1349790 97.5795830 + 42.1329170 97.5816460 + 42.1329170 97.5858540 + 42.1308130 97.5879170 + 42.1287500 97.5899790 + 42.1287500 97.6025210 + 42.1266460 97.6045830 + 42.1245830 97.6066880 + 42.1225210 97.6087500 + 42.1183130 97.6087500 + 42.1162500 97.6108540 + 42.1141880 97.6129170 + 42.1058130 97.6129170 + 42.1037500 97.6150210 + 42.1016460 97.6170830 + 42.0995830 97.6170830 + 42.0954170 97.6358540 + 42.0975210 97.6379170 + 42.0995830 97.6399790 + 42.0995830 97.6483540 + 42.1016880 97.6504170 + 42.1037500 97.6524790 + 42.1037500 97.6691880 + 42.1016460 97.6712500 + 42.0995830 97.6858540 + 42.1016880 97.6879170 + 42.1037500 97.6941880 + 42.1058540 97.6962500 + 42.1079170 97.6983130 + 42.1079170 97.7025210 + 42.1100210 97.7045830 + 42.1120830 97.7066460 + 42.1120830 97.7108540 + 42.1141880 97.7129170 + 42.1162500 97.7150210 + 42.1183540 97.7170830 + 42.1204170 97.7191880 + 42.1183130 97.7212500 + 42.1162500 97.7233130 + 42.1162500 97.7316880 + 42.1141460 97.7337500 + 42.1120830 97.7358130 + 42.1120830 97.7441880 + 42.1141880 97.7462500 + 42.1162500 97.7483540 + 42.1183540 97.7504170 + 42.1204170 97.7525210 + 42.1225210 97.7545830 + 42.1245830 97.7566460 + 42.1245830 97.7650210 + 42.1266880 97.7670830 + 42.1287500 97.7691880 + 42.1308540 97.7712500 + 42.1329170 97.7733130 + 42.1329170 97.7775210 + 42.1350210 97.7795830 + 42.1370830 97.7816460 + 42.1370830 97.7858540 + 42.1391880 97.7879170 + 42.1412500 97.7899790 + 42.1412500 97.7983540 + 42.1433130 97.8004170 + 42.1475210 97.8004170 + 42.1495830 97.8025210 + 42.1516460 97.8045830 + 42.1683540 97.8045830 + 42.1704170 97.8066880 + 42.1725210 97.8087500 + 42.1745830 97.8108540 + 42.1766880 97.8129170 + 42.1787500 97.8149790 + 42.1787500 97.8233540 + 42.1766460 97.8254170 + 42.1745830 97.8274790 + 42.1745830 97.8525210 + 42.1724790 97.8545830 + 42.1704170 97.8566880 + 42.1683130 97.8587500 + 42.1662500 97.8608130 + 42.1662500 97.8650210 + 42.1641460 97.8670830 + 42.1620830 97.8691460 + 42.1620830 97.8733540 + 42.1599790 97.8754170 + 42.1579170 97.8774790 + 42.1579170 97.8816880 + 42.1558130 97.8837500 + 42.1537500 97.8858130 + 42.1537500 97.8900210 + 42.1558540 97.8920830 + 42.1579170 97.8941880 + 42.1600210 97.8962500 + 42.1620830 97.8983130 + 42.1620830 97.9066880 + 42.1641880 97.9087500 + 42.1662500 97.9108130 + 42.1662500 97.9150210 + 42.1683540 97.9170830 + 42.1704170 97.9191460 + 42.1704170 97.9233540 + 42.1683130 97.9254170 + 42.1662500 97.9275210 + 42.1683540 97.9295830 + 42.1704170 97.9316460 + 42.1704170 97.9525210 + 42.1725210 97.9545830 + 42.1745830 97.9608540 + 42.1724790 97.9629170 + 42.1704170 97.9691880 + 42.1725210 97.9712500 + 42.1745830 97.9733130 + 42.1745830 97.9816880 + 42.1766460 97.9837500 + 42.1808540 97.9837500 + 42.1829170 97.9858540 + 42.1849790 97.9879170 + 42.1912500 97.9899790 + 42.1912500 97.9941880 + 42.1933540 97.9962500 + 42.1954170 97.9983540 + 42.1933130 98.0004170 + 42.1912500 98.0024790 + 42.1912500 98.0108540 + 42.1891460 98.0129170 + 42.1870830 98.0149790 + 42.1870830 98.0275210 + 42.1891880 98.0295830 + 42.1912500 98.0316460 + 42.1912500 98.0441880 + 42.1933540 98.0462500 + 42.1954170 98.0483540 + 42.1975210 98.0504170 + 42.1995830 98.0524790 + 42.1995830 98.0566880 + 42.2016880 98.0587500 + 42.2037500 98.0608540 + 42.2058540 98.0629170 + 42.2079170 98.0649790 + 42.2079170 98.0775210 + 42.2100210 98.0795830 + 42.2120830 98.0816460 + 42.2120830 98.0983540 + 42.2141880 98.1004170 + 42.2162500 98.1024790 + 42.2162500 98.1066880 + 42.2183130 98.1087500 + 42.2225210 98.1087500 + 42.2245830 98.1108540 + 42.2266460 98.1129170 + 42.2350210 98.1129170 + 42.2370830 98.1150210 + 42.2391460 98.1170830 + 42.2433540 98.1170830 + 42.2454170 98.1191880 + 42.2474790 98.1212500 + 42.2516880 98.1212500 + 42.2537500 98.1233540 + 42.2558130 98.1254170 + 42.2641880 98.1254170 + 42.2662500 98.1254170 + 42.2662500 98.1149790 + 42.2683130 98.1129170 + 42.2704170 98.1108540 + 42.2704170 98.1024790 + 42.2724790 98.1004170 + 42.2766880 98.1004170 + 42.2787500 98.0983540 + 42.2787500 98.0858130 + 42.2808130 98.0837500 + 42.2829170 98.0816880 + 42.2829170 98.0649790 + 42.2849790 98.0629170 + 42.2870830 98.0608540 + 42.2870830 98.0483130 + 42.2891460 98.0462500 + 42.2912500 98.0441880 + 42.2933130 98.0420830 + 42.2954170 98.0400210 + 42.2974790 98.0379170 + 42.2995830 98.0358540 + 42.3037500 98.0316880 + 42.3037500 98.0108130 + 42.3058130 98.0087500 + 42.3079170 98.0066880 + 42.3099790 98.0045830 + 42.3120830 98.0025210 + 42.3120830 97.9941460 + 42.3141460 97.9920830 + 42.3162500 97.9900210 + 42.3183130 97.9879170 + 42.3204170 97.9858540 + 42.3204170 97.9733130 + 42.3224790 97.9712500 + 42.3245830 97.9691880 + 42.3245830 97.9524790 + 42.3266460 97.9504170 + 42.3287500 97.9483540 + 42.3266880 97.9462500 + 42.3245830 97.9441880 + 42.3245830 97.9358130 + 42.3225210 97.9337500 + 42.3204170 97.9316880 + 42.3183540 97.9295830 + 42.3162500 97.9275210 + 42.3162500 97.9191460 + 42.3183130 97.9170830 + 42.3204170 97.9150210 + 42.3204170 97.9108130 + 42.3183540 97.9087500 + 42.3162500 97.9066880 + 42.3183130 97.9045830 + 42.3204170 97.9025210 + 42.3224790 97.9004170 + 42.3266880 97.9004170 + 42.3287500 97.8983540 + 42.3308130 97.8962500 + 42.3329170 97.8941880 + 42.3329170 97.8774790 + 42.3349790 97.8754170 + 42.3370830 97.8733540 + 42.3391460 97.8712500 + 42.3412500 97.8691880 + 42.3433130 97.8670830 + 42.3475210 97.8670830 + 42.3495830 97.8650210 + 42.3516460 97.8629170 + 42.3537500 97.8608540 + 42.3537500 97.8483130 + 42.3558130 97.8462500 + 42.3579170 97.8441880 + 42.3599790 97.8420830 + 42.3641880 97.8420830 + 42.3662500 97.8400210 + 42.3683130 97.8379170 + 42.3704170 97.8358540 + 42.3745830 97.8275210 + 42.3745830 97.8066460 + 42.3787500 97.7983130 + 42.3870830 97.7941460 + 42.3891460 97.7962500 + 42.3912500 97.7983130 + 42.3933130 97.8004170 + 42.4079170 97.7983540 + 42.4079170 97.7774790 + 42.4099790 97.7754170 + 42.4141880 97.7754170 + 42.4162500 97.7774790 + 42.4183130 97.7795830 + 42.4204170 97.7816460 + 42.4224790 97.7837500 + 42.4245830 97.7858130 + 42.4266460 97.7879170 + 42.4287500 97.7899790 + 42.4308130 97.7920830 + 42.4350210 97.7920830 + 42.4370830 97.7941460 + 42.4391460 97.7962500 + 42.4412500 97.7983130 + 42.4433130 97.8004170 + 42.4454170 97.7983540 + 42.4474790 97.7962500 + 42.4495830 97.7941880 + 42.4516460 97.7920830 + 42.4558540 97.7920830 + 42.4579170 97.7900210 + 42.4599790 97.7879170 + 42.4620830 97.7858540 + 42.4641460 97.7837500 + 42.4662500 97.7816880 + 42.4683130 97.7795830 + 42.4704170 97.7775210 + 42.4745830 97.7691880 + 42.4745830 97.7524790 + 42.4725210 97.7504170 + 42.4704170 97.7483540 + 42.4704170 97.7399790 + 42.4724790 97.7379170 + 42.4745830 97.7358540 + 42.4745830 97.7316460 + 42.4725210 97.7295830 + 42.4704170 97.7275210 + 42.4704170 97.7066460 + 42.4683540 97.7045830 + 42.4662500 97.7025210 + 42.4683130 97.7004170 + 42.4704170 97.6983540 + 42.4724790 97.6962500 + 42.4745830 97.6941880 + 42.4766460 97.6920830 + 42.4808540 97.6920830 + 42.4829170 97.6900210 + 42.4849790 97.6879170 + 42.4891880 97.6879170 + 42.4912500 97.6858540 + 42.5037500 97.6733540 + 42.5037500 97.6649790 + 42.5079170 97.6608540 + 42.5079170 97.6441460 + 42.5099790 97.6420830 + 42.5120830 97.6400210 + 42.5120830 97.6274790 + 42.5141460 97.6254170 + 42.5162500 97.6233540 + 42.5141880 97.6212500 + 42.5120830 97.6191880 + 42.5120830 97.6066460 + 42.5141460 97.6045830 + 42.5162500 97.6025210 + 42.5183130 97.6004170 + 42.5204170 97.5983540 + 42.5224790 97.5962500 + 42.5266880 97.5962500 + 42.5287500 97.5941880 + 42.5308130 97.5920830 + 42.5329170 97.5900210 + 42.5349790 97.5879170 + 42.5370830 97.5858540 + 42.5391460 97.5837500 + 42.5412500 97.5816880 + 42.5412500 97.5733130 + 42.5433130 97.5712500 + 42.5454170 97.5691880 + 42.5454170 97.5524790 + 42.5474790 97.5504170 + 42.5495830 97.5524790 + 42.5516460 97.5545830 + 42.5537500 97.5525210 + 42.5537500 97.5399790 + 42.5558130 97.5379170 + 42.5579170 97.5358540 + 42.5599790 97.5337500 + 42.5641880 97.5337500 + 42.5662500 97.5358130 + 42.5683130 97.5379170 + 42.5725210 97.5379170 + 42.5745830 97.5358540 + 42.5745830 97.5149790 + 42.5725210 97.5129170 + 42.5683130 97.5129170 + 42.5662500 97.5108540 + 42.5641880 97.5087500 + 42.5558130 97.5087500 + 42.5537500 97.5066880 + 42.5516880 97.5045830 + 42.5433130 97.5045830 + 42.5412500 97.5025210 + 42.5391880 97.5004170 + 42.5349790 97.5004170 + 42.5287500 97.4899790 + 42.5266880 97.4879170 + 42.5245830 97.4858540 + 42.5225210 97.4837500 + 42.5204170 97.4816880 + 42.5183540 97.4795830 + 42.5162500 97.4775210 + 42.5162500 97.4691460 + 42.5141880 97.4670830 + 42.5120830 97.4650210 + 42.5100210 97.4629170 + 42.5079170 97.4649790 + 42.5058540 97.4670830 + 42.5016460 97.4670830 + 42.4995830 97.4650210 + 42.4954170 97.4608540 + 42.4912500 97.4566880 + 42.4870830 97.4525210 + 42.4870830 97.4483130 + 42.4725210 97.4337500 + 42.4683130 97.4337500 + 42.4662500 97.4358130 + 42.4641880 97.4379170 + 42.4558130 97.4379170 + 42.4495830 97.4316460 + 42.4495830 97.4295830 + 42.4474790 97.4295830 + 42.4454170 97.4275210 + 42.4433540 97.4254170 + 42.4349790 97.4254170 + 42.4329170 97.4274790 + 42.4308540 97.4295830 + 42.4287500 97.4275210 + 42.4266880 97.4254170 + 42.4245830 97.4233540 + 42.4225210 97.4212500 + 42.4099790 97.4212500 + 42.4079170 97.4191880 + 42.4058540 97.4170830 + 42.4037500 97.4150210 + 42.4016880 97.4129170 + 42.3995830 97.4149790 + 42.3975210 97.4170830 + 42.3954170 97.4191460 + 42.3933540 97.4212500 + 42.3808130 97.4212500 + 42.3724790 97.4170830 + 42.3704170 97.4150210 + 42.3683540 97.4129170 + 42.3662500 97.4108540 + 42.3641880 97.4087500 + 42.3620830 97.4066880 + 42.3620830 97.4024790 + 42.3600210 97.4004170 + 42.3579170 97.3983540 + 42.3558540 97.3962500 + 42.3537500 97.3941880 + 42.3516880 97.3920830 + 42.3474790 97.3920830 + 42.3454170 97.3900210 + 42.3433540 97.3879170 + 42.3391460 97.3879170 + 42.3370830 97.3858540 + 42.3370830 97.3774790 + 42.3287500 97.3649790 + 42.3266880 97.3629170 + 42.3245830 97.3608540 + 42.3245830 97.3524790 + 42.3225210 97.3504170 + 42.3204170 97.3483540 + 42.3183540 97.3462500 + 42.3058130 97.3462500 + 42.2975210 97.3379170 + 42.2766460 97.3379170 + 42.2745830 97.3358540 + 42.2725210 97.3337500 + 42.2516460 97.3337500 + 42.2454170 97.3191460 + 42.2433540 97.3170830 + 42.2391460 97.3170830 + 42.2370830 97.3191460 + 42.2350210 97.3212500 + 42.2266460 97.3212500 + 42.2224790 97.3170830 + 42.2204170 97.3170830 + 42.2141880 97.3254170 + 42.2058130 97.3254170 + 42.2037500 97.3275210 + 42.2016460 97.3295830 + 42.1995830 97.3316460 + 42.1995830 97.3358540 + 42.1974790 97.3379170 + 42.1954170 97.3399790 + 42.1954170 97.3441880 + 42.1933130 97.3462500 + 42.1912500 97.3483130 + 42.1912500 97.3608540 + 42.1891880 97.3629170 + 42.1849790 97.3629170 + 42.1829170 97.3650210 + 42.1808130 97.3670830 + 42.1787500 97.3691460 + 42.1787500 97.3816880 + 42.1808540 97.3837500 + 42.1829170 97.3858540 + 42.1850210 97.3879170 + 42.1870830 97.3900210 + 42.1891880 97.3920830 + 42.1912500 97.3941460 + 42.1912500 97.3983540 + 42.1891460 97.4004170 + 42.1870830 97.4024790 + 42.1870830 97.4108540 + 42.1891880 97.4129170 + 42.1912500 97.4149790 + 42.1912500 97.4400210 + 42.1891460 97.4420830 + 42.1870830 97.4441880 + 42.1891880 97.4462500 + 42.1912500 97.4483130 + 42.1912500 97.4525210 + 42.1933540 97.4545830 + 42.1954170 97.4608540 + 42.1933130 97.4629170 + 42.1912500 97.4650210 + 42.1891460 97.4670830 + 42.1870830 97.4691460 + 42.1870830 97.4775210 + 42.1849790 97.4795830 + 42.1829170 97.4816880 + 42.1808130 97.4837500 + 42.1787500 97.4879170 +706 706 -1 38 41.92570 97.39318 + 42.1447400 97.1305100 + 42.0760800 97.1026100 + 42.0665800 97.0622800 + 42.0371700 97.0484400 + 41.9487200 97.0337400 + 41.8990900 97.0864600 + 41.8795300 97.0727900 + 41.8494400 97.1390900 + 41.8001400 97.1516300 + 41.7997700 97.1916500 + 41.8193200 97.2053300 + 41.7896900 97.2181600 + 41.7695000 97.2711600 + 41.6809800 97.2695500 + 41.6793000 97.4293600 + 41.6395100 97.4684800 + 41.6293700 97.4949000 + 41.6672600 97.6155600 + 41.7649300 97.6711600 + 41.7837200 97.7383100 + 41.8228800 97.7526200 + 41.8644700 97.5800500 + 41.8843100 97.5671400 + 41.9231600 97.6081100 + 41.9247600 97.4744700 + 41.8952500 97.4738500 + 41.8860100 97.4202200 + 42.0140500 97.4094400 + 42.0726500 97.4508100 + 42.0714000 97.5579400 + 42.1004300 97.5987900 + 42.1302800 97.5726600 + 42.1409100 97.5058600 + 42.1702800 97.5199100 + 42.1821900 97.3323400 + 42.2221000 97.2794100 + 42.1436300 97.2511600 + 42.1447400 97.1305100 +707 707 -1 20 41.99950 96.90828 + 42.0783400 96.7945600 + 42.0292200 96.7806100 + 42.0195400 96.7537300 + 41.9606600 96.7263600 + 41.9412000 96.6860500 + 41.8328300 96.7116800 + 41.8424400 96.7518300 + 41.9013100 96.7791800 + 41.8701200 97.0192300 + 41.8503400 97.0323000 + 41.8696900 97.0726400 + 41.8795300 97.0727900 + 41.8990900 97.0864600 + 41.9487200 97.0337400 + 42.0371700 97.0484400 + 42.0665800 97.0622800 + 42.0760800 97.1026100 + 42.1447400 97.1305100 + 42.1661100 96.9162600 + 42.0783400 96.7945600 +708 708 -1 20 41.79820 96.75809 + 41.8503400 97.0323000 + 41.8701200 97.0192300 + 41.9013100 96.7791800 + 41.8424400 96.7518300 + 41.8328300 96.7116800 + 41.9412000 96.6860500 + 41.9606600 96.7263600 + 42.0195400 96.7537300 + 42.0198400 96.7002000 + 41.8826900 96.5786100 + 41.7941500 96.5778800 + 41.7841300 96.6178200 + 41.7448400 96.6041400 + 41.7060000 96.4838900 + 41.6174200 96.4965900 + 41.5977000 96.5097500 + 41.5968300 96.6959900 + 41.5766200 96.7888800 + 41.6151700 96.9090700 + 41.8503400 97.0323000 +709 LOGAN CR. AT PENDER NE -1 506 42.31833 97.04833 + 42.1079170 96.7024790 + 42.1183130 96.7212500 + 42.1225210 96.7212500 + 42.1245830 96.7233130 + 42.1329170 96.7358130 + 42.1329170 96.7441880 + 42.1350210 96.7462500 + 42.1370830 96.7483130 + 42.1370830 96.7566880 + 42.1349790 96.7587500 + 42.1329170 96.7608540 + 42.1266880 96.7670830 + 42.1224790 96.7670830 + 42.1204170 96.7691880 + 42.1183540 96.7712500 + 42.1141460 96.7712500 + 42.1120830 96.7733130 + 42.1100210 96.7795830 + 42.1058130 96.7795830 + 42.1037500 96.7816880 + 42.0995830 96.7858130 + 42.0995830 96.7941880 + 42.0974790 96.7962500 + 42.0954170 96.7983540 + 42.0933540 96.8004170 + 42.0891460 96.8004170 + 42.0870830 96.8025210 + 42.0849790 96.8045830 + 42.0829170 96.8045830 + 42.0870830 96.8108130 + 42.0870830 96.8150210 + 42.0891880 96.8170830 + 42.0912500 96.8191880 + 42.0995830 96.8275210 + 42.0974790 96.8295830 + 42.0954170 96.8316460 + 42.0954170 96.8358540 + 42.0975210 96.8379170 + 42.0995830 96.8400210 + 42.1016880 96.8420830 + 42.1037500 96.8441460 + 42.1037500 96.8483540 + 42.1058540 96.8504170 + 42.1079170 96.8524790 + 42.1079170 96.8608540 + 42.1099790 96.8629170 + 42.1141880 96.8629170 + 42.1162500 96.8649790 + 42.1162500 96.8691880 + 42.1183540 96.8712500 + 42.1204170 96.8733540 + 42.1370830 96.8899790 + 42.1370830 96.8983540 + 42.1391880 96.9004170 + 42.1412500 96.9025210 + 42.1433540 96.9045830 + 42.1454170 96.9066880 + 42.1475210 96.9087500 + 42.1495830 96.9108540 + 42.1516460 96.9129170 + 42.1558540 96.9129170 + 42.1579170 96.9150210 + 42.1600210 96.9170830 + 42.1620830 96.9191460 + 42.1620830 96.9275210 + 42.1599790 96.9295830 + 42.1579170 96.9316460 + 42.1579170 96.9400210 + 42.1600210 96.9420830 + 42.1620830 96.9441880 + 42.1641880 96.9462500 + 42.1662500 96.9483540 + 42.1683540 96.9504170 + 42.1704170 96.9524790 + 42.1704170 96.9566880 + 42.1683130 96.9587500 + 42.1662500 96.9608130 + 42.1662500 96.9858540 + 42.1683540 96.9879170 + 42.1704170 96.9899790 + 42.1704170 97.0066880 + 42.1683130 97.0087500 + 42.1662500 97.0108130 + 42.1662500 97.0316880 + 42.1641460 97.0337500 + 42.1620830 97.0358130 + 42.1620830 97.0525210 + 42.1599790 97.0545830 + 42.1579170 97.0566880 + 42.1558130 97.0587500 + 42.1537500 97.0608130 + 42.1537500 97.0691880 + 42.1558540 97.0712500 + 42.1579170 97.0941880 + 42.1558130 97.0962500 + 42.1537500 97.0983130 + 42.1537500 97.1025210 + 42.1516460 97.1045830 + 42.1495830 97.1066880 + 42.1474790 97.1087500 + 42.1454170 97.1108540 + 42.1433130 97.1129170 + 42.1412500 97.1150210 + 42.1433540 97.1170830 + 42.1454170 97.1191880 + 42.1475210 97.1212500 + 42.1495830 97.1233540 + 42.1516880 97.1254170 + 42.1537500 97.1274790 + 42.1537500 97.1358540 + 42.1516460 97.1379170 + 42.1495830 97.1399790 + 42.1495830 97.1525210 + 42.1474790 97.1545830 + 42.1454170 97.1545830 + 42.1495830 97.2025210 + 42.1474790 97.2045830 + 42.1454170 97.2066880 + 42.1475210 97.2087500 + 42.1495830 97.2275210 + 42.1474790 97.2295830 + 42.1454170 97.2316460 + 42.1454170 97.2358540 + 42.1433130 97.2379170 + 42.1412500 97.2399790 + 42.1412500 97.2608540 + 42.1433540 97.2629170 + 42.1454170 97.2650210 + 42.1475210 97.2670830 + 42.1495830 97.2691880 + 42.1516880 97.2712500 + 42.1537500 97.2733540 + 42.1558540 97.2754170 + 42.1579170 97.2775210 + 42.1599790 97.2795830 + 42.1683540 97.2795830 + 42.1704170 97.2816880 + 42.1724790 97.2837500 + 42.1766880 97.2837500 + 42.1787500 97.2858130 + 42.1808130 97.3004170 + 42.1891880 97.3004170 + 42.1912500 97.2983130 + 42.1933130 97.2962500 + 42.2016880 97.2962500 + 42.2037500 97.2983540 + 42.2058130 97.3004170 + 42.2100210 97.3004170 + 42.2120830 97.3025210 + 42.2141880 97.3045830 + 42.2162500 97.3066460 + 42.2162500 97.3150210 + 42.2183130 97.3170830 + 42.2225210 97.3170830 + 42.2245830 97.3191880 + 42.2266460 97.3212500 + 42.2350210 97.3212500 + 42.2370830 97.3191460 + 42.2391460 97.3170830 + 42.2433540 97.3170830 + 42.2454170 97.3191460 + 42.2454170 97.3275210 + 42.2475210 97.3295830 + 42.2495830 97.3316880 + 42.2516460 97.3337500 + 42.2725210 97.3337500 + 42.2745830 97.3358540 + 42.2766460 97.3379170 + 42.2975210 97.3379170 + 42.2995830 97.3400210 + 42.3016880 97.3420830 + 42.3037500 97.3441880 + 42.3058130 97.3462500 + 42.3183540 97.3462500 + 42.3204170 97.3483540 + 42.3225210 97.3504170 + 42.3245830 97.3524790 + 42.3245830 97.3608540 + 42.3266880 97.3629170 + 42.3287500 97.3649790 + 42.3287500 97.3691880 + 42.3308540 97.3712500 + 42.3370830 97.3774790 + 42.3370830 97.3858540 + 42.3391460 97.3879170 + 42.3454170 97.3900210 + 42.3474790 97.3920830 + 42.3516880 97.3920830 + 42.3537500 97.3941880 + 42.3558540 97.3962500 + 42.3579170 97.3983540 + 42.3600210 97.4004170 + 42.3620830 97.4024790 + 42.3620830 97.4066880 + 42.3724790 97.4170830 + 42.3808130 97.4212500 + 42.3933540 97.4212500 + 42.3954170 97.4191460 + 42.3975210 97.4170830 + 42.3995830 97.4149790 + 42.4016880 97.4129170 + 42.4037500 97.4150210 + 42.4058540 97.4170830 + 42.4079170 97.4191880 + 42.4099790 97.4212500 + 42.4225210 97.4212500 + 42.4245830 97.4233540 + 42.4266880 97.4254170 + 42.4287500 97.4275210 + 42.4308540 97.4295830 + 42.4329170 97.4274790 + 42.4349790 97.4254170 + 42.4433540 97.4254170 + 42.4454170 97.4275210 + 42.4475210 97.4295830 + 42.4495830 97.4295830 + 42.4495830 97.4108130 + 42.4516460 97.4087500 + 42.4537500 97.4066880 + 42.4537500 97.3983130 + 42.4558130 97.3962500 + 42.4579170 97.3941880 + 42.4579170 97.3899790 + 42.4620830 97.3858540 + 42.4620830 97.3816460 + 42.4641460 97.3795830 + 42.4662500 97.3775210 + 42.4662500 97.3566460 + 42.4641880 97.3545830 + 42.4620830 97.3525210 + 42.4620830 97.3233130 + 42.4641460 97.3212500 + 42.4662500 97.3191880 + 42.4662500 97.3149790 + 42.4683130 97.3129170 + 42.4704170 97.3108540 + 42.4724790 97.3087500 + 42.4745830 97.3066880 + 42.4745830 97.3024790 + 42.4766460 97.3004170 + 42.4850210 97.3004170 + 42.4870830 97.2983540 + 42.4891460 97.2962500 + 42.4912500 97.2941880 + 42.4912500 97.2774790 + 42.4891880 97.2754170 + 42.4870830 97.2733540 + 42.4870830 97.2691460 + 42.4891460 97.2670830 + 42.4912500 97.2650210 + 42.4912500 97.2566460 + 42.4891880 97.2545830 + 42.4849790 97.2545830 + 42.4829170 97.2525210 + 42.4829170 97.2483130 + 42.4808540 97.2462500 + 42.4787500 97.2441880 + 42.4787500 97.2358130 + 42.4766880 97.2337500 + 42.4724790 97.2337500 + 42.4704170 97.2316880 + 42.4724790 97.2254170 + 42.4766880 97.2254170 + 42.4787500 97.2233540 + 42.4787500 97.2108130 + 42.4808130 97.2087500 + 42.4891880 97.2087500 + 42.4912500 97.2108130 + 42.4933130 97.2129170 + 42.5058540 97.2129170 + 42.5079170 97.2108540 + 42.5099790 97.2087500 + 42.5120830 97.2066880 + 42.5141460 97.2045830 + 42.5162500 97.2025210 + 42.5183130 97.2004170 + 42.5204170 97.1983540 + 42.5224790 97.1962500 + 42.5266880 97.1962500 + 42.5287500 97.1941880 + 42.5308130 97.1920830 + 42.5350210 97.1920830 + 42.5370830 97.1941460 + 42.5391460 97.1962500 + 42.5412500 97.1983130 + 42.5433130 97.2004170 + 42.5454170 97.2024790 + 42.5474790 97.2045830 + 42.5516880 97.2045830 + 42.5537500 97.2025210 + 42.5558130 97.2004170 + 42.5579170 97.1983540 + 42.5579170 97.1774790 + 42.5558540 97.1754170 + 42.5537500 97.1733540 + 42.5537500 97.1441460 + 42.5516880 97.1420830 + 42.5495830 97.1400210 + 42.5495830 97.1358130 + 42.5475210 97.1337500 + 42.5454170 97.1316880 + 42.5454170 97.1274790 + 42.5474790 97.1254170 + 42.5495830 97.1233540 + 42.5495830 97.1108130 + 42.5475210 97.1087500 + 42.5454170 97.1066880 + 42.5454170 97.0983130 + 42.5433540 97.0962500 + 42.5412500 97.0941880 + 42.5412500 97.0858130 + 42.5391880 97.0837500 + 42.5370830 97.0816880 + 42.5350210 97.0795830 + 42.5329170 97.0775210 + 42.5308540 97.0754170 + 42.5287500 97.0733540 + 42.5266880 97.0712500 + 42.5245830 97.0691880 + 42.5245830 97.0608130 + 42.5225210 97.0587500 + 42.5204170 97.0566880 + 42.5204170 97.0524790 + 42.5183540 97.0504170 + 42.5162500 97.0483540 + 42.5162500 97.0441460 + 42.5141880 97.0420830 + 42.5120830 97.0400210 + 42.5120830 97.0358130 + 42.5100210 97.0337500 + 42.5058130 97.0337500 + 42.5037500 97.0316880 + 42.5037500 97.0274790 + 42.5016880 97.0254170 + 42.4995830 97.0233540 + 42.4995830 97.0191460 + 42.4975210 97.0170830 + 42.4954170 97.0150210 + 42.4933540 97.0129170 + 42.4912500 97.0108540 + 42.4912500 97.0024790 + 42.4891880 97.0004170 + 42.4870830 96.9983540 + 42.4891460 96.9962500 + 42.4933540 96.9962500 + 42.4954170 96.9941880 + 42.4974790 96.9920830 + 42.5016880 96.9920830 + 42.5037500 96.9900210 + 42.5037500 96.9858130 + 42.4995830 96.9774790 + 42.4891460 96.9754170 + 42.4850210 96.9712500 + 42.4724790 96.9712500 + 42.4704170 96.9733130 + 42.4683540 96.9754170 + 42.4662500 96.9733540 + 42.4641880 96.9712500 + 42.4620830 96.9691880 + 42.4600210 96.9670830 + 42.4516460 96.9670830 + 42.4495830 96.9650210 + 42.4475210 96.9629170 + 42.4454170 96.9608540 + 42.4433540 96.9587500 + 42.4412500 96.9566880 + 42.4391880 96.9545830 + 42.4370830 96.9525210 + 42.4370830 96.9483130 + 42.4350210 96.9462500 + 42.4308130 96.9462500 + 42.4287500 96.9441880 + 42.4266880 96.9420830 + 42.4245830 96.9400210 + 42.4225210 96.9379170 + 42.4204170 96.9358540 + 42.4183540 96.9337500 + 42.4162500 96.9316880 + 42.4162500 96.9191460 + 42.4141880 96.9170830 + 42.4099790 96.9170830 + 42.4079170 96.9150210 + 42.4058540 96.9129170 + 42.4016460 96.9129170 + 42.3975210 96.9087500 + 42.3933540 96.9045830 + 42.3912500 96.9025210 + 42.3933130 96.9004170 + 42.3954170 96.8983540 + 42.3954170 96.8941460 + 42.3933540 96.8920830 + 42.3891460 96.8920830 + 42.3870830 96.8900210 + 42.3850210 96.8879170 + 42.3829170 96.8858540 + 42.3808540 96.8837500 + 42.3745830 96.8775210 + 42.3745830 96.8649790 + 42.3725210 96.8629170 + 42.3704170 96.8608540 + 42.3704170 96.8566460 + 42.3683540 96.8545830 + 42.3662500 96.8525210 + 42.3641880 96.8504170 + 42.3620830 96.8483540 + 42.3620830 96.8441460 + 42.3641460 96.8420830 + 42.3662500 96.8400210 + 42.3683130 96.8379170 + 42.3704170 96.8358540 + 42.3724790 96.8337500 + 42.3745830 96.8316880 + 42.3745830 96.8233130 + 42.3725210 96.8212500 + 42.3704170 96.8191880 + 42.3683540 96.8170830 + 42.3662500 96.8150210 + 42.3641880 96.8129170 + 42.3620830 96.8108540 + 42.3600210 96.8087500 + 42.3516460 96.8087500 + 42.3495830 96.8066880 + 42.3495830 96.7983130 + 42.3475210 96.7962500 + 42.3454170 96.7941880 + 42.3433540 96.7920830 + 42.3412500 96.7900210 + 42.3370830 96.7691460 + 42.3350210 96.7670830 + 42.3329170 96.7650210 + 42.3308540 96.7629170 + 42.3287500 96.7608540 + 42.3266880 96.7587500 + 42.3245830 96.7566880 + 42.3245830 96.7524790 + 42.3225210 96.7504170 + 42.3204170 96.7483540 + 42.3183540 96.7462500 + 42.3162500 96.7441880 + 42.3141880 96.7420830 + 42.3120830 96.7400210 + 42.3120830 96.7316460 + 42.3100210 96.7295830 + 42.3058130 96.7295830 + 42.3037500 96.7275210 + 42.3016880 96.7254170 + 42.2974790 96.7254170 + 42.2954170 96.7233540 + 42.2933540 96.7212500 + 42.2912500 96.7191880 + 42.2912500 96.7149790 + 42.2891880 96.7129170 + 42.2808540 96.7087500 + 42.2683130 96.7087500 + 42.2662500 96.7066880 + 42.2641880 96.7045830 + 42.2620830 96.7025210 + 42.2600210 96.7004170 + 42.2579170 96.6983540 + 42.2558540 96.6962500 + 42.2537500 96.6941880 + 42.2537500 96.6899790 + 42.2516880 96.6879170 + 42.2495830 96.6858540 + 42.2495830 96.6816460 + 42.2475210 96.6795830 + 42.2349790 96.6795830 + 42.2329170 96.6775210 + 42.2308540 96.6754170 + 42.2183130 96.6754170 + 42.2162500 96.6733540 + 42.2162500 96.6649790 + 42.2141880 96.6629170 + 42.2016460 96.6629170 + 42.1995830 96.6649790 + 42.1975210 96.6670830 + 42.1954170 96.6691460 + 42.1933540 96.6712500 + 42.1808130 96.6712500 + 42.1787500 96.6691880 + 42.1766880 96.6670830 + 42.1745830 96.6650210 + 42.1745830 96.6566460 + 42.1725210 96.6545830 + 42.1704170 96.6525210 + 42.1683540 96.6504170 + 42.1599790 96.6504170 + 42.1579170 96.6524790 + 42.1579170 96.6566880 + 42.1558540 96.6587500 + 42.1516460 96.6587500 + 42.1495830 96.6608130 + 42.1475210 96.6629170 + 42.1433130 96.6629170 + 42.1349790 96.6670830 + 42.1329170 96.6691460 + 42.1308540 96.6712500 + 42.1287500 96.6733130 + 42.1287500 96.6775210 + 42.1266880 96.6795830 + 42.1245830 96.6816460 + 42.1225210 96.6837500 + 42.1204170 96.6858130 + 42.1204170 96.6941880 + 42.1141880 96.7004170 + 42.1079170 96.7024790 +710 710 -1 24 41.93700 96.61285 + 42.1677300 96.6480400 + 42.1679300 96.6078000 + 42.1091800 96.5402900 + 42.0698200 96.5399900 + 42.0504000 96.4728900 + 41.9618400 96.4722900 + 41.9423000 96.4320500 + 41.8831700 96.4584000 + 41.8734300 96.4316300 + 41.8536600 96.4582100 + 41.7947200 96.4311400 + 41.7847400 96.4711000 + 41.7356100 96.4574400 + 41.7060000 96.4838900 + 41.7448400 96.6041400 + 41.7841300 96.6178200 + 41.7941500 96.5778800 + 41.8826900 96.5786100 + 42.0198400 96.7002000 + 42.0195400 96.7537300 + 42.0292200 96.7806100 + 42.0783400 96.7945600 + 42.1183200 96.6877900 + 42.1677300 96.6480400 +711 MAPLE CR. NR NICKERSON NE -1 408 41.69333 97.10667 + 41.5579170 96.5399790 + 41.5495830 96.5525210 + 41.5454170 96.5566460 + 41.5454170 96.5650210 + 41.5433130 96.5670830 + 41.5412500 96.5691460 + 41.5412500 96.5775210 + 41.5433540 96.5795830 + 41.5454170 96.5816460 + 41.5454170 96.5941880 + 41.5433130 96.5962500 + 41.5370830 96.6024790 + 41.5370830 96.6150210 + 41.5349790 96.6170830 + 41.5329170 96.6191460 + 41.5329170 96.6275210 + 41.5350210 96.6295830 + 41.5370830 96.6316460 + 41.5370830 96.6358540 + 41.5349790 96.6379170 + 41.5329170 96.6399790 + 41.5329170 96.6441880 + 41.5349790 96.6462500 + 41.5391880 96.6462500 + 41.5454170 96.6524790 + 41.5454170 96.6858540 + 41.5433130 96.6879170 + 41.5412500 96.6899790 + 41.5412500 96.7025210 + 41.5433540 96.7045830 + 41.5454170 96.7108540 + 41.5433130 96.7129170 + 41.5412500 96.7150210 + 41.5433540 96.7170830 + 41.5454170 96.7191460 + 41.5454170 96.7358540 + 41.5475210 96.7379170 + 41.5495830 96.7399790 + 41.5495830 96.7775210 + 41.5516880 96.7795830 + 41.5537500 96.7816460 + 41.5537500 96.7941880 + 41.5516460 96.7962500 + 41.5495830 96.7983130 + 41.5495830 96.8025210 + 41.5474790 96.8045830 + 41.5454170 96.8066880 + 41.5433130 96.8087500 + 41.5412500 96.8108130 + 41.5412500 96.8358540 + 41.5391460 96.8379170 + 41.5370830 96.8399790 + 41.5370830 96.8650210 + 41.5349790 96.8670830 + 41.5329170 96.8691460 + 41.5329170 96.8733540 + 41.5308130 96.8754170 + 41.5287500 96.8775210 + 41.5266460 96.8795830 + 41.5245830 96.8816460 + 41.5245830 96.8983540 + 41.5266880 96.9004170 + 41.5287500 96.9025210 + 41.5266460 96.9045830 + 41.5245830 96.9066460 + 41.5245830 96.9150210 + 41.5224790 96.9170830 + 41.5204170 96.9191460 + 41.5204170 96.9233540 + 41.5183130 96.9254170 + 41.5162500 96.9274790 + 41.5162500 96.9316880 + 41.5141460 96.9337500 + 41.5120830 96.9358130 + 41.5120830 96.9483540 + 41.5141880 96.9504170 + 41.5162500 96.9524790 + 41.5162500 96.9608540 + 41.5141460 96.9629170 + 41.5120830 96.9650210 + 41.5141880 96.9670830 + 41.5162500 96.9691460 + 41.5162500 97.0025210 + 41.5183540 97.0045830 + 41.5204170 97.0066460 + 41.5204170 97.0108540 + 41.5183130 97.0129170 + 41.5162500 97.0149790 + 41.5162500 97.0191880 + 41.5141460 97.0212500 + 41.5120830 97.0233130 + 41.5120830 97.0608540 + 41.5141880 97.0629170 + 41.5162500 97.0650210 + 41.5183540 97.0670830 + 41.5204170 97.0691460 + 41.5204170 97.0733540 + 41.5183130 97.0754170 + 41.5162500 97.0774790 + 41.5162500 97.1066880 + 41.5183540 97.1087500 + 41.5204170 97.1108130 + 41.5204170 97.1233540 + 41.5225210 97.1254170 + 41.5245830 97.1316880 + 41.5266880 97.1337500 + 41.5287500 97.1358130 + 41.5287500 97.1441880 + 41.5266460 97.1462500 + 41.5245830 97.1483130 + 41.5245830 97.1566880 + 41.5266880 97.1587500 + 41.5287500 97.1608130 + 41.5287500 97.1733540 + 41.5308540 97.1754170 + 41.5329170 97.1775210 + 41.5349790 97.1795830 + 41.5516880 97.1837500 + 41.5537500 97.1816880 + 41.5537500 97.1774790 + 41.5558540 97.1754170 + 41.5579170 97.1733130 + 41.5599790 97.1712500 + 41.5891880 97.1712500 + 41.5912500 97.1691460 + 41.5933130 97.1670830 + 41.5975210 97.1670830 + 41.5995830 97.1650210 + 41.5995830 97.1608130 + 41.6016460 97.1587500 + 41.6100210 97.1587500 + 41.6120830 97.1608130 + 41.6120830 97.1650210 + 41.6141460 97.1670830 + 41.6308540 97.1670830 + 41.6329170 97.1691880 + 41.6350210 97.1712500 + 41.6370830 97.1733540 + 41.6391460 97.1754170 + 41.6433540 97.1754170 + 41.6454170 97.1775210 + 41.6474790 97.1795830 + 41.6516880 97.1795830 + 41.6537500 97.1816880 + 41.6558130 97.1837500 + 41.6600210 97.1837500 + 41.6620830 97.1858130 + 41.6620830 97.1941880 + 41.6704170 97.2024790 + 41.6704170 97.2275210 + 41.6725210 97.2295830 + 41.6745830 97.2316880 + 41.6766880 97.2337500 + 41.6787500 97.2358130 + 41.6787500 97.2400210 + 41.6808540 97.2420830 + 41.6829170 97.2441880 + 41.6850210 97.2462500 + 41.6870830 97.2483130 + 41.6870830 97.2566880 + 41.6891880 97.2587500 + 41.6912500 97.2608130 + 41.6912500 97.2691880 + 41.6933130 97.2712500 + 41.6975210 97.2712500 + 41.6995830 97.2733130 + 41.6995830 97.2775210 + 41.6995830 97.2795830 + 41.7016880 97.2795830 + 41.7037500 97.2816460 + 41.7058130 97.2837500 + 41.7183540 97.2837500 + 41.7308540 97.2795830 + 41.7349790 97.2754170 + 41.7433540 97.2754170 + 41.7454170 97.2733540 + 41.7725210 97.2712500 + 41.7745830 97.2691880 + 41.7745830 97.2649790 + 41.7766460 97.2629170 + 41.7787500 97.2608540 + 41.7808130 97.2587500 + 41.7829170 97.2566880 + 41.7829170 97.2483130 + 41.7849790 97.2462500 + 41.7870830 97.2441880 + 41.7870830 97.2399790 + 41.7891460 97.2379170 + 41.7912500 97.2358540 + 41.7933130 97.2337500 + 41.7954170 97.2316880 + 41.7974790 97.2295830 + 41.7995830 97.2275210 + 41.8016460 97.2254170 + 41.8058540 97.2254170 + 41.8079170 97.2233540 + 41.8099790 97.2212500 + 41.8225210 97.2212500 + 41.8245830 97.2191880 + 41.8245830 97.2108130 + 41.8225210 97.2087500 + 41.8204170 97.2066880 + 41.8204170 97.1983130 + 41.8183540 97.1962500 + 41.8162500 97.1941880 + 41.8141880 97.1920830 + 41.8120830 97.1900210 + 41.8100210 97.1879170 + 41.8079170 97.1858540 + 41.8058540 97.1837500 + 41.8037500 97.1816880 + 41.8037500 97.1649790 + 41.8058130 97.1629170 + 41.8079170 97.1608540 + 41.8099790 97.1587500 + 41.8225210 97.1587500 + 41.8245830 97.1566880 + 41.8245830 97.1524790 + 41.8266460 97.1504170 + 41.8287500 97.1483540 + 41.8308130 97.1462500 + 41.8329170 97.1441880 + 41.8329170 97.1399790 + 41.8349790 97.1379170 + 41.8391880 97.1379170 + 41.8412500 97.1399790 + 41.8433130 97.1420830 + 41.8454170 97.1441460 + 41.8474790 97.1462500 + 41.8600210 97.1462500 + 41.8620830 97.1441880 + 41.8620830 97.1399790 + 41.8641460 97.1379170 + 41.8662500 97.1358540 + 41.8662500 97.1274790 + 41.8641880 97.1254170 + 41.8620830 97.1233540 + 41.8620830 97.1191460 + 41.8704170 97.1108540 + 41.8704170 97.1066460 + 41.8724790 97.1045830 + 41.8745830 97.1025210 + 41.8745830 97.0899790 + 41.8766460 97.0879170 + 41.8787500 97.0858540 + 41.8787500 97.0733130 + 41.8766880 97.0712500 + 41.8745830 97.0691880 + 41.8745830 97.0608130 + 41.8766460 97.0587500 + 41.8787500 97.0566880 + 41.8787500 97.0524790 + 41.8766880 97.0504170 + 41.8683130 97.0504170 + 41.8537500 97.0358130 + 41.8537500 97.0337500 + 41.8433130 97.0337500 + 41.8412500 97.0316880 + 41.8391880 97.0295830 + 41.8349790 97.0295830 + 41.8329170 97.0275210 + 41.8287500 97.0233540 + 41.8266880 97.0170830 + 41.8225210 97.0129170 + 41.8204170 97.0108540 + 41.8183540 97.0045830 + 41.8099790 97.0045830 + 41.8079170 97.0025210 + 41.8058540 97.0004170 + 41.8016460 97.0004170 + 41.7995830 96.9983540 + 41.7975210 96.9962500 + 41.7954170 96.9941880 + 41.7933540 96.9920830 + 41.7808130 96.9920830 + 41.7787500 96.9900210 + 41.7766880 96.9879170 + 41.7724790 96.9879170 + 41.7704170 96.9858540 + 41.7704170 96.9816460 + 41.7683540 96.9795830 + 41.7558130 96.9795830 + 41.7537500 96.9775210 + 41.7537500 96.9733130 + 41.7516880 96.9712500 + 41.7433130 96.9712500 + 41.7412500 96.9691880 + 41.7391880 96.9670830 + 41.7308130 96.9670830 + 41.7287500 96.9650210 + 41.7266880 96.9629170 + 41.7245830 96.9608540 + 41.7225210 96.9587500 + 41.7204170 96.9566880 + 41.7204170 96.9524790 + 41.7183540 96.9504170 + 41.7099790 96.9504170 + 41.7079170 96.9483540 + 41.7058540 96.9462500 + 41.6974790 96.9462500 + 41.6912500 96.9400210 + 41.6912500 96.9358130 + 41.6891880 96.9337500 + 41.6766460 96.9337500 + 41.6745830 96.9316880 + 41.6725210 96.9295830 + 41.6558130 96.9295830 + 41.6537500 96.9275210 + 41.6537500 96.9191460 + 41.6516880 96.9170830 + 41.6474790 96.9170830 + 41.6454170 96.9191460 + 41.6433540 96.9212500 + 41.6349790 96.9212500 + 41.6329170 96.9191880 + 41.6308540 96.9170830 + 41.6287500 96.9150210 + 41.6287500 96.9108130 + 41.6266880 96.9087500 + 41.6245830 96.9066880 + 41.6225210 96.9045830 + 41.6204170 96.9025210 + 41.6204170 96.8899790 + 41.6183540 96.8879170 + 41.6162500 96.8858540 + 41.6162500 96.8816460 + 41.6141880 96.8795830 + 41.6120830 96.8775210 + 41.6120830 96.8649790 + 41.6100210 96.8629170 + 41.6079170 96.8608540 + 41.6079170 96.8566460 + 41.6058540 96.8545830 + 41.6037500 96.8525210 + 41.6037500 96.8399790 + 41.6016880 96.8379170 + 41.5995830 96.8358540 + 41.5975210 96.8337500 + 41.5954170 96.8316880 + 41.5954170 96.8191460 + 41.5933540 96.8170830 + 41.5912500 96.8150210 + 41.5912500 96.8066460 + 41.5891880 96.8045830 + 41.5870830 96.8025210 + 41.5870830 96.7399790 + 41.5891460 96.7379170 + 41.5912500 96.7358540 + 41.5912500 96.7233130 + 41.5891880 96.7212500 + 41.5870830 96.7191880 + 41.5870830 96.7024790 + 41.5933130 96.6962500 + 41.5954170 96.6941880 + 41.5974790 96.6920830 + 41.5995830 96.6900210 + 41.6016460 96.6879170 + 41.6037500 96.6858540 + 41.6037500 96.6816460 + 41.6058130 96.6795830 + 41.6079170 96.6775210 + 41.6099790 96.6754170 + 41.6141880 96.6754170 + 41.6162500 96.6733540 + 41.6183130 96.6712500 + 41.6204170 96.6691880 + 41.6204170 96.6608130 + 41.6183540 96.6587500 + 41.6162500 96.6566880 + 41.6162500 96.6483130 + 41.6141880 96.6462500 + 41.6120830 96.6441880 + 41.6100210 96.6420830 + 41.6079170 96.6400210 + 41.6079170 96.6358130 + 41.6058540 96.6337500 + 41.6016460 96.6337500 + 41.5995830 96.6316880 + 41.5995830 96.6274790 + 41.5975210 96.6254170 + 41.5954170 96.6233540 + 41.5954170 96.6149790 + 41.5974790 96.6129170 + 41.5995830 96.6108540 + 41.5975210 96.5962500 + 41.5954170 96.5941880 + 41.5954170 96.5899790 + 41.5974790 96.5879170 + 41.5995830 96.5858540 + 41.5995830 96.5733130 + 41.5975210 96.5712500 + 41.5954170 96.5691880 + 41.5995830 96.5608130 + 41.5995830 96.5587500 + 41.5974790 96.5587500 + 41.5954170 96.5566880 + 41.5954170 96.5441460 + 41.5933540 96.5420830 + 41.5912500 96.5400210 + 41.5912500 96.5358130 + 41.5891880 96.5337500 + 41.5870830 96.5358130 + 41.5850210 96.5379170 + 41.5724790 96.5379170 + 41.5704170 96.5399790 + 41.5683540 96.5420830 + 41.5641460 96.5420830 + 41.5579170 96.5399790 +712 712 -1 32 41.61300 96.46915 + 41.9228600 96.3517500 + 41.8836400 96.2981200 + 41.8540600 96.3247000 + 41.7261800 96.3241000 + 41.7066000 96.2840400 + 41.6769900 96.3238800 + 41.6179800 96.3236100 + 41.5787600 96.2702300 + 41.5394400 96.2567800 + 41.5196900 96.2965800 + 41.4508500 96.2962900 + 41.3526000 96.2561000 + 41.3034100 96.2691700 + 41.2836800 96.2955900 + 41.4111800 96.4155300 + 41.4501300 96.5219600 + 41.4498400 96.5883300 + 41.5084600 96.6685400 + 41.5477300 96.6822100 + 41.5288000 96.5225400 + 41.5977000 96.5097500 + 41.6174200 96.4965900 + 41.7060000 96.4838900 + 41.7356100 96.4574400 + 41.7847400 96.4711000 + 41.7947200 96.4311400 + 41.8536600 96.4582100 + 41.8734300 96.4316300 + 41.8831700 96.4584000 + 41.9423000 96.4320500 + 41.9227900 96.3784700 + 41.9228600 96.3517500 +713 713 -1 30 40.62750 98.85050 + 40.8290900 98.3861900 + 40.7799700 98.3845400 + 40.7603200 98.3838800 + 40.7504900 98.3835500 + 40.7502400 98.3967000 + 40.7207700 98.3957000 + 40.6799600 98.4731400 + 40.6784000 98.5519000 + 40.6268500 98.6681900 + 40.5957000 98.7457400 + 40.5936800 98.8375200 + 40.5323600 98.9399600 + 40.5200600 99.0443100 + 40.4386100 99.1586800 + 40.4068300 99.2488900 + 40.4457700 99.2637600 + 40.4738700 99.3174500 + 40.5151900 99.2407200 + 40.5168500 99.1752500 + 40.5757800 99.1778900 + 40.5973700 99.1001100 + 40.6563000 99.1026800 + 40.6765800 99.0772900 + 40.7130100 98.7765700 + 40.7517300 98.8043700 + 40.7635500 98.7127800 + 40.8036900 98.6748400 + 40.8273400 98.4782700 + 40.8482500 98.4131700 + 40.8290900 98.3861900 +714 714 -1 29 41.09130 97.99108 + 41.4027300 97.5298800 + 41.3637100 97.5025200 + 41.2527300 97.7252300 + 41.1941000 97.6973400 + 41.1438700 97.7754500 + 41.1230900 97.8542300 + 41.0731600 97.9057500 + 41.0525000 97.9712100 + 41.0228100 97.9835700 + 41.0219800 98.0363500 + 40.9516800 98.1266200 + 40.9210800 98.1916000 + 40.8415500 98.2418000 + 40.8317300 98.2414900 + 40.7799700 98.3845400 + 40.8290900 98.3861900 + 40.8986100 98.3490100 + 40.8784700 98.3746900 + 40.8666400 98.4796400 + 40.9177700 98.3760000 + 40.9772300 98.3516200 + 41.0086100 98.2470900 + 41.2292200 97.9893800 + 41.2803600 97.8583600 + 41.2820400 97.7392000 + 41.3320800 97.6741600 + 41.3812400 97.6753200 + 41.4010700 97.6625300 + 41.4027300 97.5298800 +720 720 -1 26 41.09120 98.25436 + 41.3812400 97.6753200 + 41.3320800 97.6741600 + 41.2820400 97.7392000 + 41.2803600 97.8583600 + 41.2292200 97.9893800 + 41.0086100 98.2470900 + 40.9772300 98.3516200 + 40.9177700 98.3760000 + 40.8666400 98.4796400 + 40.8020000 98.7537200 + 40.8011400 98.7931700 + 40.8493900 98.8345700 + 40.8988100 98.8233700 + 40.9204700 98.7319600 + 40.9990800 98.7350000 + 41.0323800 98.5514600 + 41.0334300 98.4987000 + 41.1135700 98.4222300 + 41.1145700 98.3694000 + 41.2268800 98.1349100 + 41.2793900 97.9245600 + 41.3387700 97.8996700 + 41.3692300 97.8341800 + 41.3707000 97.7281200 + 41.3712300 97.6883500 + 41.3812400 97.6753200 +721 SHELL CR. NR COLUMBUS NE -1 404 41.70583 97.82333 + 41.5245830 97.2795830 + 41.4912500 97.2983540 + 41.4954170 97.3024790 + 41.4954170 97.3108540 + 41.4975210 97.3129170 + 41.5016460 97.3170830 + 41.5058540 97.3170830 + 41.5079170 97.3191460 + 41.5079170 97.3400210 + 41.5058130 97.3420830 + 41.5037500 97.3441460 + 41.5037500 97.3566880 + 41.5016460 97.3587500 + 41.4995830 97.3608130 + 41.4995830 97.3775210 + 41.5016880 97.3795830 + 41.5037500 97.3816460 + 41.5037500 97.3858540 + 41.5016460 97.3879170 + 41.4995830 97.3899790 + 41.4995830 97.3941880 + 41.5016880 97.3962500 + 41.5037500 97.3983130 + 41.5037500 97.4025210 + 41.5016880 97.4045830 + 41.4891460 97.4045830 + 41.4870830 97.4066460 + 41.4870830 97.4483540 + 41.4891460 97.4504170 + 41.4933540 97.4504170 + 41.4954170 97.4524790 + 41.4954170 97.4566880 + 41.4933130 97.4587500 + 41.4912500 97.4608130 + 41.4912500 97.4858540 + 41.4933540 97.4879170 + 41.4954170 97.4900210 + 41.4974790 97.4920830 + 41.5058540 97.4920830 + 41.5079170 97.4941460 + 41.5079170 97.4983540 + 41.5100210 97.5004170 + 41.5120830 97.5024790 + 41.5120830 97.5066880 + 41.5141880 97.5087500 + 41.5162500 97.5108540 + 41.5204170 97.5149790 + 41.5204170 97.5191880 + 41.5225210 97.5212500 + 41.5245830 97.5233130 + 41.5245830 97.5608540 + 41.5266460 97.5629170 + 41.5308540 97.5629170 + 41.5329170 97.5649790 + 41.5329170 97.5775210 + 41.5350210 97.5795830 + 41.5370830 97.5816460 + 41.5370830 97.5900210 + 41.5391880 97.5920830 + 41.5412500 97.5941460 + 41.5412500 97.6025210 + 41.5433540 97.6045830 + 41.5454170 97.6066460 + 41.5454170 97.6108540 + 41.5475210 97.6129170 + 41.5495830 97.6149790 + 41.5495830 97.6233540 + 41.5516880 97.6254170 + 41.5537500 97.6274790 + 41.5537500 97.6483540 + 41.5516460 97.6504170 + 41.5495830 97.6524790 + 41.5495830 97.6566880 + 41.5516880 97.6587500 + 41.5537500 97.6608540 + 41.5558540 97.6629170 + 41.5579170 97.6649790 + 41.5579170 97.6691880 + 41.5599790 97.6712500 + 41.5725210 97.6712500 + 41.5745830 97.6733130 + 41.5745830 97.6816880 + 41.5766880 97.6837500 + 41.5787500 97.6858540 + 41.5808130 97.6879170 + 41.5891880 97.6879170 + 41.5912500 97.6900210 + 41.5933540 97.6920830 + 41.5954170 97.6941880 + 41.6058130 97.7045830 + 41.6183540 97.7045830 + 41.6204170 97.7066880 + 41.6224790 97.7087500 + 41.6266880 97.7087500 + 41.6287500 97.7108130 + 41.6287500 97.7191880 + 41.6308130 97.7212500 + 41.6350210 97.7212500 + 41.6391460 97.7254170 + 41.6475210 97.7254170 + 41.6495830 97.7274790 + 41.6599790 97.7420830 + 41.6641880 97.7420830 + 41.6662500 97.7441880 + 41.6683130 97.7462500 + 41.6808540 97.7462500 + 41.6829170 97.7483130 + 41.6829170 97.7608540 + 41.6849790 97.7629170 + 41.6891880 97.7629170 + 41.6912500 97.7650210 + 41.6933540 97.7670830 + 41.6954170 97.7691460 + 41.6954170 97.7733540 + 41.6975210 97.7754170 + 41.6995830 97.7774790 + 41.6995830 97.7816880 + 41.7016880 97.7837500 + 41.7037500 97.7858540 + 41.7058540 97.7879170 + 41.7079170 97.7899790 + 41.7079170 97.7941880 + 41.7100210 97.7962500 + 41.7162500 97.8024790 + 41.7162500 97.8066880 + 41.7141460 97.8087500 + 41.7120830 97.8108540 + 41.7099790 97.8129170 + 41.7079170 97.8150210 + 41.7058130 97.8170830 + 41.7037500 97.8191460 + 41.7037500 97.8275210 + 41.7058540 97.8295830 + 41.7079170 97.8316460 + 41.7079170 97.8358540 + 41.7100210 97.8379170 + 41.7120830 97.8399790 + 41.7120830 97.8525210 + 41.7099790 97.8545830 + 41.7079170 97.8566460 + 41.7079170 97.8775210 + 41.7099790 97.8795830 + 41.7141880 97.8795830 + 41.7162500 97.8774790 + 41.7183130 97.8754170 + 41.7225210 97.8754170 + 41.7245830 97.8775210 + 41.7266880 97.8795830 + 41.7287500 97.8816880 + 41.7308540 97.8837500 + 41.7329170 97.8858540 + 41.7350210 97.8879170 + 41.7370830 97.8900210 + 41.7391880 97.8920830 + 41.7412500 97.8899790 + 41.7433540 97.8879170 + 41.7454170 97.8858130 + 41.7475210 97.8837500 + 41.7495830 97.8858540 + 41.7516880 97.8879170 + 41.7537500 97.8900210 + 41.7558540 97.8920830 + 41.7579170 97.8941460 + 41.7579170 97.9066880 + 41.7599790 97.9087500 + 41.7641880 97.9087500 + 41.7662500 97.9066460 + 41.7683130 97.9045830 + 41.7766880 97.9045830 + 41.7787500 97.9066460 + 41.7787500 97.9233540 + 41.7808540 97.9254170 + 41.7829170 97.9274790 + 41.7829170 97.9316880 + 41.7850210 97.9337500 + 41.7870830 97.9358540 + 41.7891880 97.9379170 + 41.7912500 97.9400210 + 41.7891460 97.9420830 + 41.7870830 97.9441460 + 41.7870830 97.9525210 + 41.7891460 97.9545830 + 41.7933540 97.9545830 + 41.7954170 97.9566460 + 41.7954170 97.9608540 + 41.7975210 97.9629170 + 41.7995830 97.9650210 + 41.8016460 97.9670830 + 41.8100210 97.9670830 + 41.8120830 97.9691460 + 41.8120830 97.9733540 + 41.8141880 97.9754170 + 41.8162500 97.9775210 + 41.8183540 97.9795830 + 41.8204170 97.9816880 + 41.8224790 97.9837500 + 41.8266880 97.9837500 + 41.8287500 97.9858540 + 41.8308130 97.9879170 + 41.8350210 97.9879170 + 41.8370830 97.9900210 + 41.8391460 97.9920830 + 41.8474790 97.9962500 + 41.8537500 97.9983130 + 41.8537500 98.0108540 + 41.8516460 98.0129170 + 41.8495830 98.0149790 + 41.8537500 98.0275210 + 41.8537500 98.0295830 + 41.8725210 98.0295830 + 41.8745830 98.0275210 + 41.8766460 98.0254170 + 41.8787500 98.0274790 + 41.8808130 98.0295830 + 41.8850210 98.0295830 + 41.8870830 98.0275210 + 41.8870830 98.0149790 + 41.8891460 98.0129170 + 41.8912500 98.0108540 + 41.8933130 98.0087500 + 41.8954170 98.0066880 + 41.8974790 98.0045830 + 41.8995830 98.0025210 + 41.8995830 97.9983130 + 41.9016460 97.9962500 + 41.9037500 97.9941880 + 41.9037500 97.9899790 + 41.9058130 97.9879170 + 41.9100210 97.9879170 + 41.9120830 97.9858540 + 41.9141460 97.9837500 + 41.9162500 97.9816880 + 41.9162500 97.9733130 + 41.9183130 97.9712500 + 41.9204170 97.9691880 + 41.9224790 97.9670830 + 41.9266880 97.9670830 + 41.9287500 97.9650210 + 41.9287500 97.9566460 + 41.9266880 97.9545830 + 41.9245830 97.9525210 + 41.9245830 97.9441460 + 41.9225210 97.9420830 + 41.9204170 97.9400210 + 41.9204170 97.9191460 + 41.9183540 97.9170830 + 41.9162500 97.9066460 + 41.9141880 97.9045830 + 41.9120830 97.9025210 + 41.9120830 97.8816460 + 41.9100210 97.8795830 + 41.9079170 97.8775210 + 41.9079170 97.8733130 + 41.9058540 97.8712500 + 41.9016460 97.8712500 + 41.8995830 97.8691880 + 41.9016460 97.8670830 + 41.9037500 97.8650210 + 41.9037500 97.8566460 + 41.8995830 97.8525210 + 41.8995830 97.8483130 + 41.8975210 97.8462500 + 41.8891460 97.8462500 + 41.8870830 97.8441880 + 41.8870830 97.8399790 + 41.8850210 97.8379170 + 41.8829170 97.8358540 + 41.8808540 97.8337500 + 41.8787500 97.8316880 + 41.8787500 97.8233130 + 41.8766880 97.8212500 + 41.8683130 97.8212500 + 41.8662500 97.8191880 + 41.8641880 97.8170830 + 41.8558130 97.8170830 + 41.8537500 97.8150210 + 41.8516880 97.8129170 + 41.8474790 97.8129170 + 41.8349790 97.8045830 + 41.8329170 97.8025210 + 41.8329170 97.7983130 + 41.8245830 97.7900210 + 41.8225210 97.7795830 + 41.8183130 97.7795830 + 41.8162500 97.7524790 + 41.8162500 97.7504170 + 41.8099790 97.7504170 + 41.8079170 97.7483540 + 41.8058540 97.7462500 + 41.8016460 97.7462500 + 41.7995830 97.7441880 + 41.7995830 97.7399790 + 41.7975210 97.7379170 + 41.7933130 97.7379170 + 41.7849790 97.7337500 + 41.7829170 97.7316880 + 41.7808540 97.7295830 + 41.7787500 97.7275210 + 41.7787500 97.7191460 + 41.7766880 97.7170830 + 41.7745830 97.7150210 + 41.7725210 97.7129170 + 41.7704170 97.7108540 + 41.7724790 97.7087500 + 41.7745830 97.7066880 + 41.7745830 97.7024790 + 41.7725210 97.7004170 + 41.7704170 97.6983540 + 41.7704170 97.6941460 + 41.7683540 97.6920830 + 41.7662500 97.6900210 + 41.7641880 97.6879170 + 41.7599790 97.6879170 + 41.7579170 97.6858540 + 41.7558540 97.6837500 + 41.7516460 97.6837500 + 41.7495830 97.6816880 + 41.7475210 97.6795830 + 41.7349790 97.6795830 + 41.7329170 97.6775210 + 41.7308540 97.6754170 + 41.7224790 97.6754170 + 41.7204170 97.6733540 + 41.7204170 97.6691460 + 41.7183540 97.6670830 + 41.7058130 97.6670830 + 41.7037500 97.6650210 + 41.7016880 97.6629170 + 41.6995830 97.6608540 + 41.6975210 97.6587500 + 41.6933130 97.6587500 + 41.6912500 97.6566880 + 41.6891880 97.6545830 + 41.6849790 97.6545830 + 41.6829170 97.6525210 + 41.6808540 97.6504170 + 41.6787500 97.6483540 + 41.6787500 97.6399790 + 41.6766880 97.6379170 + 41.6745830 97.6358540 + 41.6745830 97.6191460 + 41.6725210 97.6170830 + 41.6704170 97.6150210 + 41.6704170 97.6066460 + 41.6683540 97.6045830 + 41.6641460 97.6045830 + 41.6620830 97.6025210 + 41.6620830 97.5566460 + 41.6600210 97.5545830 + 41.6579170 97.5525210 + 41.6579170 97.5483130 + 41.6558540 97.5462500 + 41.6537500 97.5441880 + 41.6537500 97.5399790 + 41.6516880 97.5379170 + 41.6495830 97.5358540 + 41.6495830 97.5274790 + 41.6475210 97.5254170 + 41.6454170 97.5233540 + 41.6454170 97.5149790 + 41.6433540 97.5129170 + 41.6412500 97.5108540 + 41.6391880 97.5087500 + 41.6370830 97.5066880 + 41.6370830 97.4983130 + 41.6391460 97.4962500 + 41.6412500 97.4941880 + 41.6391880 97.4920830 + 41.6370830 97.4900210 + 41.6370830 97.4858130 + 41.6391460 97.4837500 + 41.6433540 97.4837500 + 41.6454170 97.4816880 + 41.6474790 97.4795830 + 41.6495830 97.4775210 + 41.6454170 97.4629170 + 41.6183130 97.4629170 + 41.5891880 97.4545830 + 41.5870830 97.4525210 + 41.5870830 97.4358130 + 41.5808130 97.4337500 + 41.5766880 97.4295830 + 41.5662500 97.4233540 + 41.5662500 97.4108130 + 41.5641880 97.4087500 + 41.5620830 97.4066880 + 41.5600210 97.4004170 + 41.5475210 97.3920830 + 41.5433130 97.3920830 + 41.5412500 97.3900210 + 41.5391880 97.3879170 + 41.5370830 97.3858540 + 41.5370830 97.3733130 + 41.5350210 97.3712500 + 41.5329170 97.3691880 + 41.5349790 97.3670830 + 41.5370830 97.3650210 + 41.5391460 97.3129170 + 41.5412500 97.3108540 + 41.5412500 97.3024790 + 41.5433130 97.3004170 + 41.5454170 97.2983540 + 41.5454170 97.2941460 + 41.5245830 97.2795830 +722 722 -1 41 41.40310 97.26144 + 41.6809800 97.2695500 + 41.6720200 97.1761600 + 41.5245000 97.1737000 + 41.5158200 97.0406700 + 41.4669600 97.0001100 + 41.4686000 96.7611200 + 41.4293400 96.7474200 + 41.3994400 96.8134300 + 41.3990000 96.8797500 + 41.2121900 96.8774300 + 41.2017900 96.9566700 + 41.2211500 96.9966300 + 41.2304500 97.0629300 + 41.2693200 97.1164900 + 41.2682300 97.2356500 + 41.2483000 97.2617700 + 41.2665900 97.3945200 + 41.2269800 97.4202000 + 41.2160800 97.5126100 + 41.2241100 97.6583600 + 41.1252900 97.6956900 + 41.1438700 97.7754500 + 41.1941000 97.6973400 + 41.2527300 97.7252300 + 41.3637100 97.5025200 + 41.4027300 97.5298800 + 41.4143600 97.3709000 + 41.4340200 97.3712800 + 41.4724800 97.4517200 + 41.4714000 97.5446600 + 41.5009000 97.5453100 + 41.5194100 97.6387500 + 41.5485700 97.6660200 + 41.5492500 97.6128500 + 41.5015300 97.4921800 + 41.5136500 97.2798200 + 41.5329200 97.3200500 + 41.5317800 97.4263600 + 41.6395100 97.4684800 + 41.6793000 97.4293600 + 41.6809800 97.2695500 +723 723 -1 15 41.03800 96.25488 + 41.1559300 96.2686200 + 41.1559500 96.2553900 + 41.1264600 96.2552900 + 41.0772700 96.2683100 + 41.0675000 96.2418700 + 41.0380100 96.2417700 + 41.0184600 96.1757400 + 40.9299900 96.1755100 + 40.9201400 96.1886700 + 40.9199700 96.2808900 + 40.9297000 96.3204700 + 40.9591600 96.3337800 + 41.0574600 96.3342400 + 41.1361400 96.3214000 + 41.1559300 96.2686200 +724 SALT CR. AT ROCA NE -1 256 40.61417 96.71917 + 40.6620830 96.6712500 + 40.6579170 96.6566880 + 40.6579170 96.6524790 + 40.6599790 96.6504170 + 40.6620830 96.6483540 + 40.6620830 96.6399790 + 40.6662500 96.6358540 + 40.6641880 96.6337500 + 40.6620830 96.6316880 + 40.6620830 96.6274790 + 40.6641460 96.6254170 + 40.6662500 96.6233540 + 40.6662500 96.6191460 + 40.6683130 96.6170830 + 40.6725210 96.6170830 + 40.6745830 96.6150210 + 40.6766460 96.6129170 + 40.6850210 96.6129170 + 40.6870830 96.6149790 + 40.6974790 96.6254170 + 40.6995830 96.6233540 + 40.7016460 96.6212500 + 40.7037500 96.6191880 + 40.7037500 96.6149790 + 40.7079170 96.6108540 + 40.7079170 96.5983130 + 40.7058540 96.5962500 + 40.7037500 96.5941880 + 40.7079170 96.5900210 + 40.7079170 96.5816460 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6524790 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5308540 96.7545830 + 40.5287500 96.7566460 + 40.5266880 96.7587500 + 40.5245830 96.7608130 + 40.5266460 96.7629170 + 40.5287500 96.7649790 + 40.5308130 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5349790 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391460 96.7920830 + 40.5412500 96.7941460 + 40.5391880 96.7962500 + 40.5370830 96.7983130 + 40.5391460 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391880 96.8129170 + 40.5370830 96.8149790 + 40.5350210 96.8170830 + 40.5329170 96.8191460 + 40.5308540 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8774790 + 40.5308130 96.8795830 + 40.5329170 96.8816460 + 40.5349790 96.8837500 + 40.5370830 96.8858130 + 40.5391460 96.8879170 + 40.5412500 96.8899790 + 40.5433130 96.8920830 + 40.5454170 96.8941460 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983130 + 40.5599790 96.9004170 + 40.5620830 96.9024790 + 40.5641460 96.9045830 + 40.5662500 96.9066460 + 40.5683130 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808130 96.9212500 + 40.5829170 96.9191880 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191460 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233130 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308130 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6349790 96.9004170 + 40.6370830 96.8983540 + 40.6412500 96.8900210 + 40.6412500 96.8858130 + 40.6433130 96.8837500 + 40.6475210 96.8837500 + 40.6495830 96.8816880 + 40.6495830 96.8774790 + 40.6516460 96.8754170 + 40.6600210 96.8754170 + 40.6620830 96.8733540 + 40.6662500 96.8691880 + 40.6662500 96.8608130 + 40.6641880 96.8587500 + 40.6620830 96.8566880 + 40.6620830 96.8441460 + 40.6641460 96.8420830 + 40.6662500 96.8400210 + 40.6662500 96.8358130 + 40.6683130 96.8337500 + 40.6704170 96.8316880 + 40.6704170 96.8274790 + 40.6724790 96.8254170 + 40.6745830 96.8233540 + 40.6766460 96.8212500 + 40.6787500 96.8191880 + 40.6787500 96.8108130 + 40.6766880 96.8087500 + 40.6745830 96.8066880 + 40.6745830 96.7983130 + 40.6725210 96.7962500 + 40.6704170 96.7941880 + 40.6704170 96.7899790 + 40.6724790 96.7879170 + 40.6766880 96.7879170 + 40.6787500 96.7858540 + 40.6808130 96.7837500 + 40.6829170 96.7816880 + 40.6829170 96.7691460 + 40.6849790 96.7670830 + 40.6870830 96.7650210 + 40.6870830 96.7566460 + 40.6829170 96.7525210 + 40.6808540 96.7504170 + 40.6787500 96.7483540 + 40.6766880 96.7462500 + 40.6745830 96.7441880 + 40.6745830 96.7399790 + 40.6725210 96.7379170 + 40.6704170 96.7358540 + 40.6704170 96.7149790 + 40.6683540 96.7129170 + 40.6662500 96.7108540 + 40.6662500 96.6941460 + 40.6620830 96.6712500 +725 725 -1 23 40.97550 96.86758 + 41.2121900 96.8774300 + 41.1437200 96.8237100 + 41.1338900 96.8235900 + 41.1046400 96.7836200 + 40.9671100 96.7689100 + 40.9280200 96.7289600 + 40.8788800 96.7284500 + 40.8496100 96.6886600 + 40.7805100 96.7405900 + 40.7995100 96.8460200 + 40.7298700 96.9634600 + 40.7688800 97.0034300 + 40.8768900 97.0181400 + 40.9358600 97.0189800 + 40.9360700 96.9926200 + 40.9557300 96.9929000 + 40.9750700 97.0327300 + 41.0142800 97.0464900 + 41.1130100 96.9951100 + 41.1818200 96.9960800 + 41.2211500 96.9966300 + 41.2017900 96.9566700 + 41.2121900 96.8774300 +726 726 -1 14 40.74650 96.77946 + 40.8496100 96.6886600 + 40.7908400 96.6486400 + 40.7812700 96.5959500 + 40.7223100 96.5954500 + 40.6730400 96.6213000 + 40.6432900 96.6735400 + 40.6919100 96.7659400 + 40.6814900 96.8577500 + 40.6518300 96.8836400 + 40.7003900 96.9630600 + 40.7298700 96.9634600 + 40.7995100 96.8460200 + 40.7805100 96.7405900 + 40.8496100 96.6886600 +727 WAHOO CR. AT ITHACA NE -1 234 41.26000 96.74417 + 41.1412500 96.5379170 + 41.1266460 96.5504170 + 41.1225210 96.5545830 + 41.1183130 96.5545830 + 41.1162500 96.5566880 + 41.1141880 96.5587500 + 41.1099790 96.5587500 + 41.1079170 96.5608540 + 41.1058540 96.5629170 + 41.1016460 96.5629170 + 41.0995830 96.5629170 + 41.1099790 96.5795830 + 41.1141880 96.5795830 + 41.1162500 96.5816460 + 41.1162500 96.5941880 + 41.1183540 96.5962500 + 41.1245830 96.6024790 + 41.1245830 96.6108540 + 41.1266460 96.6129170 + 41.1308540 96.6129170 + 41.1329170 96.6149790 + 41.1329170 96.6275210 + 41.1349790 96.6295830 + 41.1391880 96.6295830 + 41.1412500 96.6316880 + 41.1433130 96.6337500 + 41.1475210 96.6337500 + 41.1495830 96.6358540 + 41.1516880 96.6379170 + 41.1537500 96.6399790 + 41.1537500 96.6483540 + 41.1516880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1391460 96.6587500 + 41.1370830 96.6608540 + 41.1349790 96.6629170 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3308540 96.8920830 + 41.3329170 96.8941880 + 41.3350210 96.8962500 + 41.3370830 96.8983540 + 41.3391460 96.9004170 + 41.3433540 96.9004170 + 41.3454170 96.8983130 + 41.3475210 96.8962500 + 41.3495830 96.8983540 + 41.3516460 96.9004170 + 41.3683540 96.9004170 + 41.3704170 96.9025210 + 41.3724790 96.9045830 + 41.3766880 96.9045830 + 41.3787500 96.9066880 + 41.3808130 96.9087500 + 41.3891880 96.9087500 + 41.3912500 96.9066880 + 41.3912500 96.9024790 + 41.3933540 96.9004170 + 41.3954170 96.8983540 + 41.3954170 96.8816460 + 41.3975210 96.8795830 + 41.3995830 96.8775210 + 41.4037500 96.8400210 + 41.4037500 96.8316460 + 41.4058540 96.8295830 + 41.4079170 96.8275210 + 41.4079170 96.8066460 + 41.4099790 96.8045830 + 41.4141880 96.8045830 + 41.4162500 96.8024790 + 41.4183130 96.8004170 + 41.4225210 96.8004170 + 41.4245830 96.7983540 + 41.4245830 96.7649790 + 41.4224790 96.7629170 + 41.4204170 96.7608540 + 41.4204170 96.7524790 + 41.4183130 96.7504170 + 41.4162500 96.7483540 + 41.4162500 96.7358130 + 41.4141460 96.7337500 + 41.4120830 96.7316880 + 41.4120830 96.6941460 + 41.4099790 96.6920830 + 41.4079170 96.6629170 + 41.3891460 96.6629170 + 41.3870830 96.6608540 + 41.3870830 96.6566460 + 41.3850210 96.6545830 + 41.3829170 96.6525210 + 41.3808540 96.6504170 + 41.3787500 96.6483540 + 41.3766880 96.6462500 + 41.3745830 96.6441880 + 41.3745830 96.6316460 + 41.3725210 96.6295830 + 41.3704170 96.6275210 + 41.3683540 96.6254170 + 41.3641460 96.6254170 + 41.3620830 96.6233540 + 41.3600210 96.6212500 + 41.3558130 96.6212500 + 41.3537500 96.6191880 + 41.3516880 96.6170830 + 41.3391460 96.6170830 + 41.3370830 96.6191460 + 41.3350210 96.6212500 + 41.3308130 96.6212500 + 41.3287500 96.6233130 + 41.3266880 96.6254170 + 41.3099790 96.6254170 + 41.3079170 96.6233540 + 41.3058540 96.6212500 + 41.3016460 96.6212500 + 41.2995830 96.6191880 + 41.2975210 96.6170830 + 41.2933130 96.6170830 + 41.2912500 96.6150210 + 41.2891880 96.6129170 + 41.2870830 96.6108540 + 41.2870830 96.6066460 + 41.2850210 96.6045830 + 41.2766460 96.6045830 + 41.2745830 96.6025210 + 41.2725210 96.6004170 + 41.2704170 96.5983540 + 41.2683540 96.5962500 + 41.2662500 96.5941880 + 41.2641880 96.5920830 + 41.2516460 96.5920830 + 41.2495830 96.5900210 + 41.2475210 96.5879170 + 41.2433130 96.5879170 + 41.2412500 96.5858540 + 41.2391880 96.5837500 + 41.2370830 96.5816880 + 41.2350210 96.5795830 + 41.2266460 96.5795830 + 41.2245830 96.5775210 + 41.2245830 96.5733130 + 41.2225210 96.5712500 + 41.2016460 96.5712500 + 41.1995830 96.5733130 + 41.1975210 96.5754170 + 41.1933130 96.5754170 + 41.1912500 96.5733540 + 41.1912500 96.5608130 + 41.1891880 96.5587500 + 41.1870830 96.5566880 + 41.1850210 96.5545830 + 41.1808130 96.5545830 + 41.1787500 96.5525210 + 41.1766880 96.5504170 + 41.1745830 96.5483540 + 41.1745830 96.5399790 + 41.1725210 96.5379170 + 41.1558130 96.5379170 + 41.1537500 96.5358540 + 41.1516880 96.5337500 + 41.1495830 96.5316880 + 41.1475210 96.5295830 + 41.1412500 96.5379170 +728 728 -1 26 41.15040 96.48756 + 41.4198100 96.6942400 + 41.4204000 96.5748200 + 41.3910700 96.5347900 + 41.3222900 96.5210100 + 41.3224000 96.4945100 + 41.2929500 96.4810600 + 41.2931800 96.4148300 + 41.2736000 96.3882400 + 41.2146500 96.3746800 + 41.1852600 96.3348500 + 41.0770100 96.3739500 + 41.0574600 96.3342400 + 40.9591600 96.3337800 + 40.9297000 96.3204700 + 40.9199700 96.2808900 + 40.8805500 96.3202400 + 40.8804100 96.3729200 + 40.9000700 96.3730200 + 40.9195600 96.4258300 + 40.9687100 96.4261200 + 40.9685200 96.4788600 + 41.1254300 96.5724200 + 41.1551500 96.5197800 + 41.3513200 96.6272800 + 41.3608800 96.6804000 + 41.4198100 96.6942400 +729 729 -1 27 40.92870 96.59826 + 41.1254300 96.5724200 + 40.9685200 96.4788600 + 40.9687100 96.4261200 + 40.9195600 96.4258300 + 40.9000700 96.3730200 + 40.8804100 96.3729200 + 40.8803700 96.3860900 + 40.8213600 96.3989200 + 40.8209800 96.5041800 + 40.7719400 96.4775300 + 40.7717900 96.5169800 + 40.7226500 96.5166200 + 40.7027700 96.5690200 + 40.7027100 96.5821500 + 40.7223100 96.5954500 + 40.7812700 96.5959500 + 40.7908400 96.6486400 + 40.8496100 96.6886600 + 40.8788800 96.7284500 + 40.9280200 96.7289600 + 40.9671100 96.7689100 + 41.1046400 96.7836200 + 41.1338900 96.8235900 + 41.1442100 96.7444100 + 41.1249800 96.6649200 + 41.1546700 96.6255300 + 41.1254300 96.5724200 +730 730 -1 12 40.80920 98.67616 + 40.8493900 98.8345700 + 40.8011400 98.7931700 + 40.8020000 98.7537200 + 40.8666400 98.4796400 + 40.8273400 98.4782700 + 40.8036900 98.6748400 + 40.7635500 98.7127800 + 40.7517300 98.8043700 + 40.7812000 98.8055400 + 40.8386800 98.8736500 + 40.8485100 98.8740500 + 40.8493900 98.8345700 +757 757 -1 7 40.86300 98.41433 + 40.8290900 98.3861900 + 40.8482500 98.4131700 + 40.8273400 98.4782700 + 40.8666400 98.4796400 + 40.8784700 98.3746900 + 40.8986100 98.3490100 + 40.8290900 98.3861900 +770 770 -1 30 41.30260 96.39942 + 41.5477300 96.6822100 + 41.5084600 96.6685400 + 41.4498400 96.5883300 + 41.4501300 96.5219600 + 41.4111800 96.4155300 + 41.2836800 96.2955900 + 41.3034100 96.2691700 + 41.2837700 96.2558500 + 41.1559300 96.2686200 + 41.1361400 96.3214000 + 41.0574600 96.3342400 + 41.0770100 96.3739500 + 41.1852600 96.3348500 + 41.2146500 96.3746800 + 41.2736000 96.3882400 + 41.2931800 96.4148300 + 41.2929500 96.4810600 + 41.3224000 96.4945100 + 41.3222900 96.5210100 + 41.3910700 96.5347900 + 41.4204000 96.5748200 + 41.4198100 96.6942400 + 41.4196600 96.7207800 + 41.4293400 96.7474200 + 41.4686000 96.7611200 + 41.4669600 97.0001100 + 41.5158200 97.0406700 + 41.4965700 96.9872500 + 41.5468600 96.8284300 + 41.5477300 96.6822100 +804 804 -1 24 42.83000 95.30000 + 42.8800000 95.2200000 + 42.8200000 95.2300000 + 42.8200000 95.2700000 + 42.7800000 95.2700000 + 42.6800000 95.2200000 + 42.6800000 95.2700000 + 42.7200000 95.2800000 + 42.7200000 95.3000000 + 42.7700000 95.3200000 + 42.7800000 95.3000000 + 42.8200000 95.3200000 + 42.8500000 95.3700000 + 42.8700000 95.3800000 + 42.9000000 95.3500000 + 42.9200000 95.3700000 + 42.9200000 95.3500000 + 42.9300000 95.3500000 + 42.9500000 95.3500000 + 42.9800000 95.3000000 + 42.9500000 95.2500000 + 42.9200000 95.2700000 + 42.9000000 95.2500000 + 42.8800000 95.2500000 + 42.8800000 95.2200000 +805 805 -1 39 43.00000 95.46500 + 43.1800000 95.6000000 + 43.2700000 95.6000000 + 43.2700000 95.5700000 + 43.2500000 95.5000000 + 43.2200000 95.4700000 + 43.1700000 95.4800000 + 43.1300000 95.4700000 + 43.1300000 95.4500000 + 43.0800000 95.4200000 + 43.0300000 95.3700000 + 43.0200000 95.3700000 + 43.0000000 95.3500000 + 43.0000000 95.3300000 + 42.9800000 95.3000000 + 42.9500000 95.3500000 + 42.9300000 95.3500000 + 42.9200000 95.3500000 + 42.9200000 95.3700000 + 42.9000000 95.3500000 + 42.8700000 95.3800000 + 42.8300000 95.4300000 + 42.8200000 95.4500000 + 42.7800000 95.4700000 + 42.7500000 95.4800000 + 42.7300000 95.5300000 + 42.7500000 95.5500000 + 42.7700000 95.5800000 + 42.7800000 95.6300000 + 42.8000000 95.6000000 + 42.7800000 95.5700000 + 42.7800000 95.5500000 + 42.8000000 95.5300000 + 42.8800000 95.5200000 + 42.9500000 95.5200000 + 43.0200000 95.5300000 + 43.0800000 95.5500000 + 43.0800000 95.5700000 + 43.1500000 95.5700000 + 43.1800000 95.6000000 +806 806 -1 31 42.98000 95.67000 + 42.8800000 95.8200000 + 42.8800000 95.8000000 + 42.9300000 95.8200000 + 42.9700000 95.8200000 + 42.9800000 95.8200000 + 43.0200000 95.8200000 + 43.0200000 95.7800000 + 43.0300000 95.7700000 + 43.0500000 95.7700000 + 43.0800000 95.7500000 + 43.1000000 95.7300000 + 43.1300000 95.7300000 + 43.1500000 95.6700000 + 43.1500000 95.6200000 + 43.1800000 95.6200000 + 43.1800000 95.6000000 + 43.1500000 95.5700000 + 43.0800000 95.5700000 + 43.0800000 95.5500000 + 43.0200000 95.5300000 + 42.9500000 95.5200000 + 42.8800000 95.5200000 + 42.8000000 95.5300000 + 42.7800000 95.5500000 + 42.7800000 95.5700000 + 42.8000000 95.6000000 + 42.7800000 95.6300000 + 42.8000000 95.6800000 + 42.8200000 95.7200000 + 42.8500000 95.7200000 + 42.8800000 95.8200000 +807 807 -1 25 42.64500 95.70000 + 42.7800000 95.6300000 + 42.7700000 95.5800000 + 42.7500000 95.5500000 + 42.7300000 95.5300000 + 42.7500000 95.4800000 + 42.7000000 95.5000000 + 42.7000000 95.5200000 + 42.6500000 95.5000000 + 42.5800000 95.5300000 + 42.5700000 95.5200000 + 42.4800000 95.5300000 + 42.4800000 95.6000000 + 42.5000000 95.6500000 + 42.5000000 95.7300000 + 42.4700000 95.8000000 + 42.5000000 95.8500000 + 42.5000000 95.8800000 + 42.5300000 95.9200000 + 42.5800000 95.9000000 + 42.6200000 95.8300000 + 42.6800000 95.7700000 + 42.7300000 95.7700000 + 42.8200000 95.7200000 + 42.8000000 95.6800000 + 42.7800000 95.6300000 +808 808 -1 33 42.28500 95.86675 + 42.4800000 95.6000000 + 42.4300000 95.6000000 + 42.4300000 95.6300000 + 42.4000000 95.6300000 + 42.3800000 95.7000000 + 42.3500000 95.7200000 + 42.3500000 95.7300000 + 42.3000000 95.8000000 + 42.2500000 95.8200000 + 42.2300000 95.8200000 + 42.2000000 95.8500000 + 42.1800000 95.8500000 + 42.1800000 95.8800000 + 42.1500000 95.9000000 + 42.1300000 95.9200000 + 42.0800000 95.9500000 + 42.0700000 95.9800000 + 42.0800000 96.0100000 + 42.1000000 96.0000000 + 42.1800000 96.0000000 + 42.2300000 95.9500000 + 42.2800000 95.9300000 + 42.3000000 95.9200000 + 42.3200000 95.9200000 + 42.4500000 95.8800000 + 42.4700000 95.9000000 + 42.4800000 95.9000000 + 42.5000000 95.8800000 + 42.5000000 95.8500000 + 42.4700000 95.8000000 + 42.5000000 95.7300000 + 42.5000000 95.6500000 + 42.4800000 95.6000000 +809 809 -1 55 42.49500 95.40238 + 42.7200000 95.3000000 + 42.6800000 95.3000000 + 42.6500000 95.2800000 + 42.6300000 95.2800000 + 42.5700000 95.3000000 + 42.5300000 95.3000000 + 42.5200000 95.2800000 + 42.4500000 95.2700000 + 42.4300000 95.2300000 + 42.3700000 95.2300000 + 42.3500000 95.2200000 + 42.3200000 95.2200000 + 42.2800000 95.2500000 + 42.2700000 95.3200000 + 42.2800000 95.3500000 + 42.2700000 95.3800000 + 42.3000000 95.4000000 + 42.3000000 95.4300000 + 42.2800000 95.4500000 + 42.3000000 95.5200000 + 42.2200000 95.6300000 + 42.2000000 95.6700000 + 42.1700000 95.7200000 + 42.1200000 95.7500000 + 42.1200000 95.7700000 + 42.1300000 95.7800000 + 42.1500000 95.8000000 + 42.1800000 95.8500000 + 42.2000000 95.8500000 + 42.2300000 95.8200000 + 42.2500000 95.8200000 + 42.3000000 95.8000000 + 42.3500000 95.7300000 + 42.3500000 95.7200000 + 42.3800000 95.7000000 + 42.4000000 95.6300000 + 42.4300000 95.6300000 + 42.4300000 95.6000000 + 42.4800000 95.6000000 + 42.4800000 95.5300000 + 42.5700000 95.5200000 + 42.5800000 95.5300000 + 42.6500000 95.5000000 + 42.7000000 95.5200000 + 42.7000000 95.5000000 + 42.7500000 95.4800000 + 42.7800000 95.4700000 + 42.8200000 95.4500000 + 42.8300000 95.4300000 + 42.8700000 95.3800000 + 42.8500000 95.3700000 + 42.8200000 95.3200000 + 42.7800000 95.3000000 + 42.7700000 95.3200000 + 42.7200000 95.3000000 +810 810 -1 29 42.04000 95.88500 + 42.1200000 95.7500000 + 42.0800000 95.7700000 + 42.0800000 95.8000000 + 42.0700000 95.8300000 + 42.0300000 95.8300000 + 42.0200000 95.8500000 + 41.9800000 95.8700000 + 41.9700000 95.9200000 + 41.9200000 95.9300000 + 41.9000000 95.9500000 + 41.9700000 95.9500000 + 41.9700000 95.9700000 + 41.9700000 95.9800000 + 42.0000000 95.9800000 + 42.0300000 96.0000000 + 42.0500000 96.0200000 + 42.1000000 96.0200000 + 42.1000000 96.0000000 + 42.0800000 96.0100000 + 42.0700000 95.9800000 + 42.0800000 95.9500000 + 42.1300000 95.9200000 + 42.1500000 95.9000000 + 42.1800000 95.8800000 + 42.1800000 95.8500000 + 42.1500000 95.8000000 + 42.1300000 95.7800000 + 42.1200000 95.7700000 + 42.1200000 95.7500000 +811 811 -1 33 42.55500 95.93500 + 42.8200000 95.7200000 + 42.7300000 95.7700000 + 42.6800000 95.7700000 + 42.6200000 95.8300000 + 42.5800000 95.9000000 + 42.5300000 95.9200000 + 42.5300000 95.9300000 + 42.5000000 95.9800000 + 42.4700000 96.0000000 + 42.4300000 96.0500000 + 42.3800000 96.0300000 + 42.3300000 96.0300000 + 42.3000000 96.0700000 + 42.2300000 96.0700000 + 42.2700000 96.0800000 + 42.3200000 96.1300000 + 42.4300000 96.1200000 + 42.5000000 96.1500000 + 42.5700000 96.1200000 + 42.6500000 96.1300000 + 42.6800000 96.1000000 + 42.7200000 96.1000000 + 42.7300000 96.0800000 + 42.7300000 96.0500000 + 42.7800000 96.0200000 + 42.7800000 96.0000000 + 42.7800000 95.9700000 + 42.8000000 95.9500000 + 42.8000000 95.9300000 + 42.8800000 95.8700000 + 42.8800000 95.8200000 + 42.8500000 95.7200000 + 42.8200000 95.7200000 +812 812 -1 54 42.34500 96.19886 + 42.6800000 96.1500000 + 42.7200000 96.1000000 + 42.6800000 96.1000000 + 42.6500000 96.1300000 + 42.5700000 96.1200000 + 42.5000000 96.1500000 + 42.4300000 96.1200000 + 42.3200000 96.1300000 + 42.2700000 96.0800000 + 42.2300000 96.0700000 + 42.3000000 96.0700000 + 42.3300000 96.0300000 + 42.3800000 96.0300000 + 42.4300000 96.0500000 + 42.4700000 96.0000000 + 42.5000000 95.9800000 + 42.5300000 95.9300000 + 42.5300000 95.9200000 + 42.5000000 95.8800000 + 42.4800000 95.9000000 + 42.4700000 95.9000000 + 42.4500000 95.8800000 + 42.3200000 95.9200000 + 42.3000000 95.9200000 + 42.2800000 95.9300000 + 42.2300000 95.9500000 + 42.1800000 96.0000000 + 42.1000000 96.0000000 + 42.1000000 96.0200000 + 42.0500000 96.0200000 + 42.0300000 96.0000000 + 42.0000000 95.9800000 + 41.9700000 95.9800000 + 41.9700000 96.0000000 + 41.9700000 96.0200000 + 42.0200000 96.0500000 + 42.0700000 96.0700000 + 42.0800000 96.1000000 + 42.1700000 96.1300000 + 42.2800000 96.2000000 + 42.3200000 96.2500000 + 42.3305100 96.2584100 + 42.4200000 96.3300000 + 42.4300000 96.3500000 + 42.4700000 96.3500000 + 42.4800000 96.3200000 + 42.5200000 96.3200000 + 42.5200000 96.3000000 + 42.5300000 96.2700000 + 42.5500000 96.2800000 + 42.5700000 96.2500000 + 42.6800000 96.1800000 + 42.6800000 96.1700000 + 42.6800000 96.1500000 +813 813 -1 29 43.80070 97.02903 + 44.1251500 97.2186900 + 44.1061400 97.1355700 + 44.0279600 97.0378100 + 43.9790300 96.9819900 + 43.9306300 96.8437000 + 43.8912500 96.8294600 + 43.8817100 96.7743500 + 43.8125600 96.7872900 + 43.7138200 96.7998700 + 43.6746100 96.7582900 + 43.5956200 96.7711100 + 43.5265000 96.7840100 + 43.4965000 96.8520300 + 43.4762200 96.9337800 + 43.5248100 97.0302000 + 43.5935200 97.0723000 + 43.5934000 97.0860000 + 43.6326300 97.1140200 + 43.7215200 97.1017500 + 43.7410100 97.1295100 + 43.7899800 97.1715100 + 43.8295700 97.1584500 + 43.8786600 97.1867800 + 43.9284800 97.1326100 + 43.9960500 97.2990200 + 44.0355300 97.2997700 + 44.0459300 97.2448300 + 44.1248900 97.2462800 + 44.1251500 97.2186900 +819 819 -1 32 42.99500 96.37500 + 43.1700000 96.2700000 + 43.1500000 96.2000000 + 43.1700000 96.1500000 + 43.1200000 96.1800000 + 43.0800000 96.1700000 + 43.0700000 96.1800000 + 43.0500000 96.2200000 + 43.0200000 96.2200000 + 43.0000000 96.2700000 + 42.9700000 96.2800000 + 42.9300000 96.2700000 + 42.8800000 96.3300000 + 42.8700000 96.4000000 + 42.8300000 96.4500000 + 42.8200000 96.5200000 + 42.8300000 96.5700000 + 42.8700000 96.5800000 + 42.9000000 96.5700000 + 42.9200000 96.5800000 + 42.9500000 96.5800000 + 42.9800000 96.5800000 + 43.0200000 96.5800000 + 43.0300000 96.6000000 + 43.0500000 96.5800000 + 43.1000000 96.5800000 + 43.1300000 96.5700000 + 43.1200000 96.5500000 + 43.0500000 96.4800000 + 43.0500000 96.4700000 + 43.1300000 96.3500000 + 43.1500000 96.3000000 + 43.1700000 96.2700000 +820 820 -1 29 43.38410 96.71186 + 43.5480300 96.5770600 + 43.5300000 96.5500000 + 43.5200000 96.5300000 + 43.5000000 96.5000000 + 43.5200000 96.4700000 + 43.5300000 96.4700000 + 43.5300000 96.4000000 + 43.4700000 96.4200000 + 43.4300000 96.3800000 + 43.3700000 96.3800000 + 43.3500000 96.4200000 + 43.3200000 96.4300000 + 43.3000000 96.4700000 + 43.2700000 96.4700000 + 43.2700000 96.5000000 + 43.2300000 96.5800000 + 43.2200000 96.6500000 + 43.2174300 96.6487100 + 43.2015500 96.7122400 + 43.2803300 96.7266800 + 43.5148400 97.0437200 + 43.5248100 97.0302000 + 43.4762200 96.9337800 + 43.4965000 96.8520300 + 43.4670900 96.8243300 + 43.4674200 96.7696700 + 43.5271100 96.6745900 + 43.5666300 96.6612900 + 43.5480300 96.5770600 +825 825 -1 38 42.85140 96.66654 + 43.1300000 96.5700000 + 43.1000000 96.5800000 + 43.0500000 96.5800000 + 43.0300000 96.6000000 + 43.0200000 96.5800000 + 42.9800000 96.5800000 + 42.9500000 96.5800000 + 42.9200000 96.5800000 + 42.9000000 96.5700000 + 42.8700000 96.5800000 + 42.8300000 96.5700000 + 42.8200000 96.5200000 + 42.8300000 96.4500000 + 42.8700000 96.4000000 + 42.8800000 96.3300000 + 42.8700000 96.3300000 + 42.8500000 96.3000000 + 42.8300000 96.3200000 + 42.8200000 96.3500000 + 42.7800000 96.3500000 + 42.7300000 96.3800000 + 42.7000000 96.4200000 + 42.6200000 96.4300000 + 42.5800000 96.4700000 + 42.5518600 96.4700000 + 42.5500800 96.4703800 + 42.5228700 96.4761100 + 42.5620500 96.5303300 + 42.6995000 96.6259800 + 42.7482600 96.7211000 + 42.8662300 96.7629800 + 42.8955400 96.8039600 + 43.0235300 96.8190300 + 43.0434100 96.7921000 + 43.1522000 96.7253300 + 43.1800000 96.6300000 + 43.1800000 96.5800000 + 43.1300000 96.5700000 +826 826 -1 21 43.21000 96.46000 + 43.1700000 96.2700000 + 43.1500000 96.3000000 + 43.1300000 96.3500000 + 43.0500000 96.4700000 + 43.0500000 96.4800000 + 43.1200000 96.5500000 + 43.1300000 96.5700000 + 43.1800000 96.5800000 + 43.1800000 96.6300000 + 43.2174300 96.6487100 + 43.2200000 96.6500000 + 43.2300000 96.5800000 + 43.2700000 96.5000000 + 43.2700000 96.4700000 + 43.3000000 96.4700000 + 43.3200000 96.4300000 + 43.3500000 96.4200000 + 43.3700000 96.3800000 + 43.2300000 96.2800000 + 43.2200000 96.2800000 + 43.1700000 96.2700000 +855 855 -1 32 42.90500 96.00000 + 42.9700000 96.0800000 + 42.9800000 96.0700000 + 42.9800000 96.0300000 + 42.9800000 96.0000000 + 42.9700000 95.9800000 + 42.9700000 95.9500000 + 43.0000000 95.9300000 + 43.0200000 95.9200000 + 43.0300000 95.8800000 + 43.0200000 95.8200000 + 42.9800000 95.8200000 + 42.9700000 95.8200000 + 42.9300000 95.8200000 + 42.8800000 95.8000000 + 42.8800000 95.8200000 + 42.8800000 95.8700000 + 42.8000000 95.9300000 + 42.8000000 95.9500000 + 42.7800000 95.9700000 + 42.7800000 96.0000000 + 42.7800000 96.0200000 + 42.8000000 96.0800000 + 42.7800000 96.1000000 + 42.7800000 96.1300000 + 42.8000000 96.1700000 + 42.8200000 96.2000000 + 42.8500000 96.1800000 + 42.8700000 96.1800000 + 42.8800000 96.1700000 + 42.9000000 96.1300000 + 42.9500000 96.0800000 + 42.9700000 96.0800000 +856 856 -1 25 43.07500 96.11500 + 43.2200000 96.0700000 + 43.2300000 96.0200000 + 43.2000000 95.9800000 + 43.1800000 95.9800000 + 43.1700000 95.9500000 + 43.1200000 95.9800000 + 43.1000000 96.0000000 + 43.0800000 95.9800000 + 43.0700000 96.0200000 + 43.0500000 96.0200000 + 43.0200000 96.0500000 + 42.9800000 96.0700000 + 42.9700000 96.0800000 + 42.9200000 96.1500000 + 42.9200000 96.1800000 + 42.9300000 96.2700000 + 42.9700000 96.2800000 + 43.0000000 96.2700000 + 43.0200000 96.2200000 + 43.0500000 96.2200000 + 43.0700000 96.1800000 + 43.0800000 96.1700000 + 43.1200000 96.1800000 + 43.1700000 96.1500000 + 43.2200000 96.0700000 +857 857 -1 30 42.82500 96.26583 + 42.9700000 96.0800000 + 42.9500000 96.0800000 + 42.9000000 96.1300000 + 42.8800000 96.1700000 + 42.8700000 96.1800000 + 42.8500000 96.1800000 + 42.8200000 96.2000000 + 42.8000000 96.1700000 + 42.7800000 96.1300000 + 42.7800000 96.1000000 + 42.8000000 96.0800000 + 42.7800000 96.0200000 + 42.7300000 96.0500000 + 42.7300000 96.0800000 + 42.7200000 96.1000000 + 42.6800000 96.1500000 + 42.7200000 96.2300000 + 42.7500000 96.3200000 + 42.7700000 96.3200000 + 42.7800000 96.3300000 + 42.7800000 96.3500000 + 42.8200000 96.3500000 + 42.8300000 96.3200000 + 42.8500000 96.3000000 + 42.8700000 96.3300000 + 42.8800000 96.3300000 + 42.9300000 96.2700000 + 42.9200000 96.1800000 + 42.9200000 96.1500000 + 42.9700000 96.0800000 +858 858 -1 14 42.65000 96.25000 + 42.6800000 96.1500000 + 42.6800000 96.1700000 + 42.6800000 96.1800000 + 42.5700000 96.2500000 + 42.5500000 96.2800000 + 42.5700000 96.3000000 + 42.5700000 96.3200000 + 42.6000000 96.3500000 + 42.6200000 96.3500000 + 42.6300000 96.3300000 + 42.7000000 96.3300000 + 42.7500000 96.3200000 + 42.7200000 96.2300000 + 42.6800000 96.1500000 +865 865 -1 19 42.65500 96.39519 + 42.7500000 96.3200000 + 42.7000000 96.3300000 + 42.6300000 96.3300000 + 42.6200000 96.3500000 + 42.6000000 96.3500000 + 42.5800000 96.3500000 + 42.5300000 96.4000000 + 42.5300000 96.4200000 + 42.5500000 96.4300000 + 42.5500800 96.4703800 + 42.5518600 96.4700000 + 42.5800000 96.4700000 + 42.6200000 96.4300000 + 42.7000000 96.4200000 + 42.7300000 96.3800000 + 42.7800000 96.3500000 + 42.7800000 96.3300000 + 42.7700000 96.3200000 + 42.7500000 96.3200000 +904 904 -1 30 40.79660 94.31000 + 41.0200000 94.2800000 + 41.0232900 94.2712300 + 41.0200000 94.2500000 + 40.9500000 94.2200000 + 40.9200000 94.2200000 + 40.8800000 94.2300000 + 40.8500000 94.1800000 + 40.8200000 94.1800000 + 40.8200000 94.1700000 + 40.7500000 94.1800000 + 40.7300000 94.2000000 + 40.7200000 94.2300000 + 40.6700000 94.2200000 + 40.5800000 94.2700000 + 40.5700000 94.3000000 + 40.6000000 94.4200000 + 40.6200000 94.4500000 + 40.6500000 94.4500000 + 40.6800000 94.4000000 + 40.7300000 94.3800000 + 40.7300000 94.4000000 + 40.8000000 94.3800000 + 40.8300000 94.3700000 + 40.9200000 94.3700000 + 40.9300000 94.3500000 + 40.9200000 94.3300000 + 40.9700000 94.2800000 + 40.9800000 94.2700000 + 41.0000000 94.2700000 + 41.0200000 94.2800000 +905 905 -1 16 40.46000 94.47500 + 40.5700000 94.3000000 + 40.5500000 94.3300000 + 40.4500000 94.3800000 + 40.4200000 94.3800000 + 40.3800000 94.3700000 + 40.3000000 94.3800000 + 40.3200000 94.5300000 + 40.3500000 94.6500000 + 40.4000000 94.6500000 + 40.4000000 94.6300000 + 40.4800000 94.5800000 + 40.5500000 94.5700000 + 40.5500000 94.5300000 + 40.6200000 94.4500000 + 40.6000000 94.4200000 + 40.5700000 94.3000000 +906 906 -1 23 40.21500 94.53500 + 40.3000000 94.3800000 + 40.2500000 94.3800000 + 40.2000000 94.3700000 + 40.1800000 94.3800000 + 40.1800000 94.4000000 + 40.1500000 94.4200000 + 40.1200000 94.4300000 + 40.1000000 94.4700000 + 40.1000000 94.4800000 + 40.0800000 94.5200000 + 40.0800000 94.5500000 + 40.0800000 94.5700000 + 40.1200000 94.5800000 + 40.1200000 94.6200000 + 40.1200000 94.6500000 + 40.1300000 94.6700000 + 40.2000000 94.6800000 + 40.2200000 94.7000000 + 40.2800000 94.6800000 + 40.3000000 94.6700000 + 40.3500000 94.6500000 + 40.3200000 94.5300000 + 40.3000000 94.3800000 +907 907 -1 34 40.73500 94.17500 + 40.9500000 94.2200000 + 40.9500000 94.1800000 + 40.9300000 94.1700000 + 40.9300000 94.1500000 + 40.9000000 94.1200000 + 40.8500000 94.1200000 + 40.8300000 94.1000000 + 40.8300000 94.0800000 + 40.8000000 94.0700000 + 40.7700000 94.0500000 + 40.7500000 94.0700000 + 40.7200000 94.0500000 + 40.7000000 94.0500000 + 40.6800000 94.0800000 + 40.6700000 94.0800000 + 40.6200000 94.1000000 + 40.6000000 94.1300000 + 40.5800000 94.1200000 + 40.5500000 94.1300000 + 40.5300000 94.1200000 + 40.5200000 94.1200000 + 40.5500000 94.2800000 + 40.5700000 94.3000000 + 40.5800000 94.2700000 + 40.6700000 94.2200000 + 40.7200000 94.2300000 + 40.7300000 94.2000000 + 40.7500000 94.1800000 + 40.8200000 94.1700000 + 40.8200000 94.1800000 + 40.8500000 94.1800000 + 40.8800000 94.2300000 + 40.9200000 94.2200000 + 40.9500000 94.2200000 +908 908 -1 21 40.37500 94.25000 + 40.5200000 94.1200000 + 40.5000000 94.1300000 + 40.4700000 94.1200000 + 40.4200000 94.1300000 + 40.3500000 94.1500000 + 40.3200000 94.2200000 + 40.2800000 94.2200000 + 40.2500000 94.2500000 + 40.2000000 94.2700000 + 40.2000000 94.3500000 + 40.1800000 94.3800000 + 40.2000000 94.3700000 + 40.2500000 94.3800000 + 40.3000000 94.3800000 + 40.3800000 94.3700000 + 40.4200000 94.3800000 + 40.4500000 94.3800000 + 40.5500000 94.3300000 + 40.5700000 94.3000000 + 40.5500000 94.2800000 + 40.5200000 94.1200000 +909 909 -1 32 40.18500 94.29500 + 40.3500000 94.1500000 + 40.3500000 94.1300000 + 40.3300000 94.1300000 + 40.3200000 94.1200000 + 40.2700000 94.1200000 + 40.2300000 94.1300000 + 40.2000000 94.1300000 + 40.1800000 94.1200000 + 40.0800000 94.1500000 + 40.0300000 94.1300000 + 40.0200000 94.1300000 + 40.0200000 94.1500000 + 40.0200000 94.1700000 + 40.0200000 94.1800000 + 40.0200000 94.2500000 + 40.0500000 94.3000000 + 40.0500000 94.3300000 + 40.0500000 94.3500000 + 40.0300000 94.3800000 + 40.0300000 94.4200000 + 40.0500000 94.4300000 + 40.1000000 94.4700000 + 40.1200000 94.4300000 + 40.1500000 94.4200000 + 40.1800000 94.4000000 + 40.1800000 94.3800000 + 40.2000000 94.3500000 + 40.2000000 94.2700000 + 40.2500000 94.2500000 + 40.2800000 94.2200000 + 40.3200000 94.2200000 + 40.3500000 94.1500000 +910 910 -1 38 39.90000 94.32500 + 40.1000000 94.4700000 + 40.0500000 94.4300000 + 40.0300000 94.4200000 + 40.0300000 94.3800000 + 40.0500000 94.3500000 + 40.0500000 94.3300000 + 40.0500000 94.3000000 + 40.0200000 94.2500000 + 40.0200000 94.1800000 + 40.0200000 94.1700000 + 40.0200000 94.1500000 + 40.0200000 94.1300000 + 39.9500000 94.1200000 + 39.9200000 94.1300000 + 39.8700000 94.1300000 + 39.8500000 94.1800000 + 39.8300000 94.1800000 + 39.8000000 94.2200000 + 39.7800000 94.2300000 + 39.7500000 94.2300000 + 39.7300000 94.2800000 + 39.7000000 94.3200000 + 39.7200000 94.3700000 + 39.7800000 94.3800000 + 39.7800000 94.4200000 + 39.8300000 94.4200000 + 39.8500000 94.4300000 + 39.9000000 94.4700000 + 39.9200000 94.4500000 + 39.9300000 94.4800000 + 39.9500000 94.4700000 + 40.0000000 94.4700000 + 40.0000000 94.4800000 + 40.0200000 94.5000000 + 40.0700000 94.5300000 + 40.0800000 94.5200000 + 40.1000000 94.4800000 + 40.1000000 94.4700000 +933 933 -1 25 41.19500 94.24500 + 41.3700000 94.4300000 + 41.3700000 94.3700000 + 41.3300000 94.3200000 + 41.3000000 94.3200000 + 41.2500000 94.2500000 + 41.2700000 94.2200000 + 41.2200000 94.2000000 + 41.1800000 94.1700000 + 41.1800000 94.1300000 + 41.1300000 94.0800000 + 41.1300000 94.0300000 + 41.1200000 94.0200000 + 41.0800000 94.1200000 + 41.0232900 94.2712300 + 41.0200000 94.2800000 + 41.0300000 94.3000000 + 41.0800000 94.3200000 + 41.1000000 94.3300000 + 41.1700000 94.3800000 + 41.2000000 94.4000000 + 41.2000000 94.4200000 + 41.2700000 94.4700000 + 41.3000000 94.4700000 + 41.3200000 94.4500000 + 41.3700000 94.4300000 +934 934 -1 26 40.94500 94.03562 + 41.1200000 94.0200000 + 41.1200000 93.9800000 + 41.0800000 93.9800000 + 41.0500000 93.9300000 + 41.0700000 93.9200000 + 41.0500000 93.8800000 + 41.0300000 93.9000000 + 41.0200000 93.8800000 + 40.9800000 93.8800000 + 40.9800000 93.8200000 + 40.9300000 93.8000000 + 40.8300000 93.9300000 + 40.7700000 94.0500000 + 40.8000000 94.0700000 + 40.8300000 94.0800000 + 40.8300000 94.1000000 + 40.8500000 94.1200000 + 40.9000000 94.1200000 + 40.9300000 94.1500000 + 40.9300000 94.1700000 + 40.9500000 94.1800000 + 40.9500000 94.2200000 + 41.0200000 94.2500000 + 41.0232900 94.2712300 + 41.0800000 94.1200000 + 41.1200000 94.0200000 +BAYI4 BAYI4 -1 18 41.99500 94.76000 + 42.2200000 95.0000000 + 42.1800000 94.8900000 + 42.1200000 94.7500000 + 42.0200000 94.6100000 + 41.9900000 94.5300000 + 41.9700000 94.5100000 + 41.8600000 94.5100000 + 41.8400000 94.4900000 + 41.7800000 94.5000000 + 41.7700000 94.5300000 + 41.8300000 94.6700000 + 41.9000000 94.7500000 + 41.9300000 94.8200000 + 42.0500000 94.9500000 + 42.1200000 95.0200000 + 42.1500000 95.0300000 + 42.2000000 95.0200000 + 42.2200000 95.0000000 +EFWI4 EFWI4 -1 43 42.28000 94.74000 + 42.6200000 94.7300000 + 42.6000000 94.6900000 + 42.5900000 94.6600000 + 42.5400000 94.5800000 + 42.5200000 94.4900000 + 42.5100000 94.4500000 + 42.4900000 94.4200000 + 42.4300000 94.3700000 + 42.4200000 94.3600000 + 42.4000000 94.3800000 + 42.2700000 94.4900000 + 42.2200000 94.5100000 + 42.1700000 94.5100000 + 42.1200000 94.4900000 + 42.0700000 94.4400000 + 42.0200000 94.3600000 + 42.0000000 94.3600000 + 41.9900000 94.3800000 + 41.9500000 94.3800000 + 41.9400000 94.4000000 + 41.9800000 94.4700000 + 41.9900000 94.5300000 + 42.0200000 94.6100000 + 42.1200000 94.7500000 + 42.1800000 94.8900000 + 42.2200000 95.0000000 + 42.2300000 95.0300000 + 42.2700000 95.0500000 + 42.3200000 95.0300000 + 42.3200000 95.0700000 + 42.3700000 95.0800000 + 42.4700000 95.1000000 + 42.5000000 95.1200000 + 42.5200000 95.1000000 + 42.5000000 95.0800000 + 42.4500000 95.0500000 + 42.3800000 95.0300000 + 42.3000000 94.9800000 + 42.3700000 94.9400000 + 42.3800000 94.8900000 + 42.4300000 94.8500000 + 42.5300000 94.8000000 + 42.6200000 94.7300000 +FCKN1HW PAPILLION CR. NR FT. CROOK NE -1 369 41.34750 96.14417 + 41.1183130 95.9379170 + 41.1204170 95.9608540 + 41.1183540 95.9629170 + 41.1099790 95.9629170 + 41.1058540 95.9670830 + 41.1016460 95.9670830 + 41.0995830 95.9691460 + 41.0995830 95.9733540 + 41.1162500 95.9899790 + 41.1162500 96.0025210 + 41.1183130 96.0045830 + 41.1225210 96.0045830 + 41.1245830 96.0066460 + 41.1245830 96.0108540 + 41.1224790 96.0129170 + 41.1204170 96.0150210 + 41.1162500 96.0191460 + 41.1162500 96.0275210 + 41.1141460 96.0295830 + 41.1120830 96.0400210 + 41.1141880 96.0420830 + 41.1162500 96.0483540 + 41.1183540 96.0504170 + 41.1204170 96.0525210 + 41.1225210 96.0545830 + 41.1245830 96.0608540 + 41.1224790 96.0629170 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1225210 96.1004170 + 41.1245830 96.1025210 + 41.1266880 96.1045830 + 41.1287500 96.1066880 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1649790 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1183130 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2066460 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3058540 96.2587500 + 41.3079170 96.2608130 + 41.3099790 96.2629170 + 41.3120830 96.2608540 + 41.3141460 96.2587500 + 41.3162500 96.2566880 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3245830 96.2483130 + 41.3266460 96.2462500 + 41.3287500 96.2483130 + 41.3308130 96.2504170 + 41.3329170 96.2524790 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566460 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4412500 96.2983130 + 41.4412500 96.3025210 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5329170 96.2858130 + 41.5349790 96.2837500 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5558540 96.2712500 + 41.5579170 96.2691880 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5558540 96.2045830 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4224790 96.1212500 + 41.4204170 96.1191880 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4287500 96.0733540 + 41.4308130 96.0712500 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3600210 96.0254170 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3245830 96.0191880 + 41.3245830 96.0024790 + 41.3225210 96.0004170 + 41.3141460 96.0004170 + 41.3120830 95.9983540 + 41.3100210 95.9962500 + 41.2933130 95.9962500 + 41.2912500 95.9983130 + 41.2891880 96.0004170 + 41.2870830 96.0024790 + 41.2850210 96.0045830 + 41.2829170 96.0025210 + 41.2829170 95.9858130 + 41.2725210 95.9754170 + 41.2704170 95.9733540 + 41.2683540 95.9712500 + 41.2599790 95.9712500 + 41.2474790 95.9670830 + 41.2454170 95.9670830 + 41.2454170 95.9691880 + 41.2433540 95.9712500 + 41.2391460 95.9712500 + 41.2370830 95.9733130 + 41.2350210 95.9754170 + 41.2099790 95.9754170 + 41.2079170 95.9733540 + 41.2058540 95.9712500 + 41.1974790 95.9712500 + 41.1954170 95.9691880 + 41.1933540 95.9670830 + 41.1912500 95.9650210 + 41.1912500 95.9608130 + 41.1891880 95.9587500 + 41.1849790 95.9587500 + 41.1829170 95.9566880 + 41.1829170 95.9524790 + 41.1808540 95.9504170 + 41.1787500 95.9483540 + 41.1808130 95.9462500 + 41.1891880 95.9462500 + 41.1912500 95.9441880 + 41.1912500 95.9399790 + 41.1787500 95.9233130 + 41.1766880 95.9212500 + 41.1724790 95.9212500 + 41.1704170 95.9191880 + 41.1683540 95.9170830 + 41.1641460 95.9170830 + 41.1620830 95.9150210 + 41.1620830 95.9108130 + 41.1600210 95.9087500 + 41.1579170 95.9066880 + 41.1558540 95.9045830 + 41.1474790 95.9045830 + 41.1454170 95.9066460 + 41.1433540 95.9087500 + 41.1391460 95.9087500 + 41.1370830 95.9108130 + 41.1350210 95.9129170 + 41.1329170 95.9149790 + 41.1308540 95.9170830 + 41.1266460 95.9170830 + 41.1245830 95.9191460 + 41.1225210 95.9212500 + 41.1204170 95.9233130 + 41.1204170 95.9316880 + 41.1183130 95.9379170 +HBLN1HW N.F. BIG NEMAHA RIVER AT HUMBOLT NE -1 528 40.34333 96.27750 + 40.1537500 95.9420830 + 40.1287500 95.9691880 + 40.1245830 95.9733130 + 40.1245830 95.9775210 + 40.1225210 95.9795830 + 40.1141460 95.9795830 + 40.1120830 95.9816460 + 40.1120830 95.9858540 + 40.1099790 95.9879170 + 40.1058540 95.9920830 + 40.1016460 95.9920830 + 40.0995830 95.9941880 + 40.0954170 95.9983130 + 40.0954170 96.0108540 + 40.0975210 96.0129170 + 40.0995830 96.0149790 + 40.0995830 96.0233540 + 40.0974790 96.0254170 + 40.0954170 96.0274790 + 40.0954170 96.0358540 + 40.0933540 96.0379170 + 40.0891460 96.0379170 + 40.0870830 96.0399790 + 40.0870830 96.0650210 + 40.0850210 96.0670830 + 40.0808130 96.0670830 + 40.0787500 96.0691880 + 40.0766460 96.0712500 + 40.0745830 96.0733130 + 40.0745830 96.0858540 + 40.0766460 96.0879170 + 40.0808540 96.0879170 + 40.0829170 96.0900210 + 40.0850210 96.0920830 + 40.0891460 96.0962500 + 40.0933540 96.0962500 + 40.0954170 96.0983540 + 40.0974790 96.1004170 + 40.1016880 96.1004170 + 40.1037500 96.1025210 + 40.1058540 96.1045830 + 40.1079170 96.1066880 + 40.1120830 96.1108540 + 40.1099790 96.1129170 + 40.1079170 96.1149790 + 40.1079170 96.1295830 + 40.1141460 96.1337500 + 40.1183540 96.1337500 + 40.1204170 96.1358130 + 40.1245830 96.1441460 + 40.1245830 96.1525210 + 40.1266460 96.1545830 + 40.1308540 96.1545830 + 40.1329170 96.1566460 + 40.1329170 96.1608540 + 40.1350210 96.1629170 + 40.1391460 96.1670830 + 40.1433540 96.1670830 + 40.1495830 96.1733130 + 40.1495830 96.1775210 + 40.1516460 96.1795830 + 40.1558540 96.1795830 + 40.1579170 96.1774790 + 40.1600210 96.1754170 + 40.1620830 96.1775210 + 40.1641460 96.1795830 + 40.1683540 96.1795830 + 40.1704170 96.1816460 + 40.1704170 96.1858540 + 40.1766460 96.1920830 + 40.1808540 96.1920830 + 40.1829170 96.1941460 + 40.1829170 96.1983540 + 40.1849790 96.2004170 + 40.1933540 96.2004170 + 40.1954170 96.2024790 + 40.1974790 96.2129170 + 40.2100210 96.2129170 + 40.2120830 96.2150210 + 40.2141880 96.2170830 + 40.2162500 96.2191880 + 40.2183540 96.2212500 + 40.2204170 96.2233540 + 40.2224790 96.2254170 + 40.2266880 96.2254170 + 40.2287500 96.2275210 + 40.2308540 96.2295830 + 40.2329170 96.2316880 + 40.2350210 96.2337500 + 40.2370830 96.2358130 + 40.2433130 96.2462500 + 40.2475210 96.2462500 + 40.2599790 96.2587500 + 40.2683540 96.2587500 + 40.2704170 96.2608130 + 40.3037500 96.3024790 + 40.3037500 96.3150210 + 40.3058130 96.3170830 + 40.3204170 96.3233130 + 40.3204170 96.3316880 + 40.3225210 96.3337500 + 40.3245830 96.3358130 + 40.3245830 96.3483540 + 40.3225210 96.3504170 + 40.2891460 96.3504170 + 40.2870830 96.3524790 + 40.2870830 96.3566880 + 40.2891880 96.3587500 + 40.2912500 96.3608130 + 40.2912500 96.3650210 + 40.2891880 96.3670830 + 40.2849790 96.3670830 + 40.2829170 96.3691460 + 40.2829170 96.3733540 + 40.2808130 96.3754170 + 40.2787500 96.3775210 + 40.2766460 96.3795830 + 40.2745830 96.3816460 + 40.2745830 96.3941880 + 40.2766880 96.3962500 + 40.2787500 96.3983130 + 40.2787500 96.4150210 + 40.2766460 96.4170830 + 40.2745830 96.4191460 + 40.2745830 96.4233540 + 40.2724790 96.4254170 + 40.2704170 96.4274790 + 40.2704170 96.4400210 + 40.2683130 96.4420830 + 40.2662500 96.4441460 + 40.2662500 96.4525210 + 40.2641880 96.4545830 + 40.2599790 96.4545830 + 40.2579170 96.4566880 + 40.2558130 96.4587500 + 40.2537500 96.4608130 + 40.2537500 96.4650210 + 40.2516460 96.4670830 + 40.2495830 96.4670830 + 40.2454170 96.4733130 + 40.2454170 96.4941880 + 40.2454170 96.4962500 + 40.2599790 96.5004170 + 40.2641880 96.5004170 + 40.2662500 96.4983130 + 40.2683130 96.4962500 + 40.2725210 96.4962500 + 40.2745830 96.4941460 + 40.2766880 96.4920830 + 40.2787500 96.4900210 + 40.2787500 96.4733130 + 40.2808540 96.4712500 + 40.2829170 96.4691460 + 40.2850210 96.4670830 + 40.2870830 96.4691880 + 40.2891460 96.4712500 + 40.2933540 96.4712500 + 40.2954170 96.4733540 + 40.2975210 96.4754170 + 40.2995830 96.4775210 + 40.3016460 96.4795830 + 40.3058540 96.4795830 + 40.3079170 96.4816460 + 40.3079170 96.4858540 + 40.3100210 96.4879170 + 40.3120830 96.4900210 + 40.3141460 96.4920830 + 40.3266880 96.4920830 + 40.3287500 96.4899790 + 40.3308130 96.4879170 + 40.3391880 96.4879170 + 40.3412500 96.4900210 + 40.3433540 96.4920830 + 40.3454170 96.4941880 + 40.3474790 96.4962500 + 40.3516880 96.4962500 + 40.3537500 96.4983540 + 40.3558540 96.5004170 + 40.3579170 96.5024790 + 40.3579170 96.5066880 + 40.3600210 96.5087500 + 40.3620830 96.5108130 + 40.3620830 96.5191880 + 40.3641460 96.5212500 + 40.3725210 96.5212500 + 40.3745830 96.5233540 + 40.3766460 96.5254170 + 40.3891880 96.5254170 + 40.3912500 96.5275210 + 40.3933540 96.5295830 + 40.3954170 96.5316460 + 40.3954170 96.5358540 + 40.3975210 96.5379170 + 40.3995830 96.5358130 + 40.4016460 96.5337500 + 40.4058540 96.5337500 + 40.4079170 96.5358130 + 40.4079170 96.5400210 + 40.4100210 96.5420830 + 40.4120830 96.5441460 + 40.4120830 96.5775210 + 40.4141880 96.5795830 + 40.4162500 96.5816460 + 40.4162500 96.5900210 + 40.4183130 96.5920830 + 40.4266880 96.5920830 + 40.4287500 96.5941880 + 40.4308540 96.5962500 + 40.4329170 96.5983130 + 40.4329170 96.6150210 + 40.4350210 96.6170830 + 40.4370830 96.6191880 + 40.4391880 96.6212500 + 40.4412500 96.6233130 + 40.4412500 96.6316880 + 40.4433540 96.6337500 + 40.4454170 96.6358540 + 40.4475210 96.6379170 + 40.4495830 96.6400210 + 40.4516880 96.6420830 + 40.4537500 96.6441880 + 40.4558130 96.6462500 + 40.4600210 96.6462500 + 40.4620830 96.6483540 + 40.4641880 96.6504170 + 40.4662500 96.6525210 + 40.4683540 96.6545830 + 40.4704170 96.6566880 + 40.4724790 96.6587500 + 40.4766880 96.6587500 + 40.4787500 96.6566460 + 40.4808540 96.6545830 + 40.4829170 96.6524790 + 40.4849790 96.6504170 + 40.4933130 96.6545830 + 40.4975210 96.6545830 + 40.4995830 96.6566460 + 40.5120830 96.6774790 + 40.5120830 96.6858540 + 40.5141880 96.6879170 + 40.5162500 96.6900210 + 40.5183540 96.6920830 + 40.5204170 96.6941460 + 40.5224790 96.7004170 + 40.5266880 96.7004170 + 40.5287500 96.7024790 + 40.5329170 96.7108540 + 40.5308130 96.7129170 + 40.5287500 96.7150210 + 40.5266460 96.7170830 + 40.5245830 96.7191460 + 40.5245830 96.7233540 + 40.5266880 96.7254170 + 40.5287500 96.7274790 + 40.5287500 96.7358540 + 40.5308540 96.7379170 + 40.5329170 96.7399790 + 40.5329170 96.7483540 + 40.5329170 96.7504170 + 40.5350210 96.7504170 + 40.5370830 96.7524790 + 40.5391460 96.7545830 + 40.5516880 96.7545830 + 40.5537500 96.7525210 + 40.5558130 96.7504170 + 40.5579170 96.7483540 + 40.5599790 96.7462500 + 40.5620830 96.7441880 + 40.5620830 96.7191460 + 40.5641460 96.7170830 + 40.5662500 96.7150210 + 40.5683130 96.7129170 + 40.5704170 96.7108540 + 40.5704170 96.7066460 + 40.5724790 96.7045830 + 40.5745830 96.7025210 + 40.5745830 96.6941460 + 40.5725210 96.6920830 + 40.5704170 96.6900210 + 40.5704170 96.6816460 + 40.5683540 96.6795830 + 40.5662500 96.6775210 + 40.5662500 96.6608130 + 40.5641880 96.6587500 + 40.5620830 96.6566880 + 40.5620830 96.6524790 + 40.5600210 96.6504170 + 40.5558130 96.6504170 + 40.5537500 96.6483540 + 40.5537500 96.6399790 + 40.5558130 96.6379170 + 40.5579170 96.6358540 + 40.5599790 96.6337500 + 40.5620830 96.6316880 + 40.5600210 96.6295830 + 40.5579170 96.6275210 + 40.5579170 96.6191460 + 40.5558540 96.6170830 + 40.5537500 96.6150210 + 40.5537500 96.5941460 + 40.5558130 96.5920830 + 40.5579170 96.5900210 + 40.5599790 96.5879170 + 40.5620830 96.5858540 + 40.5641460 96.5837500 + 40.5662500 96.5816880 + 40.5641880 96.5795830 + 40.5620830 96.5775210 + 40.5641460 96.5754170 + 40.5662500 96.5733540 + 40.5662500 96.5691460 + 40.5683130 96.5670830 + 40.5704170 96.5650210 + 40.5704170 96.5608130 + 40.5724790 96.5587500 + 40.5745830 96.5566880 + 40.5745830 96.5524790 + 40.5766460 96.5504170 + 40.5787500 96.5483540 + 40.5808130 96.5462500 + 40.5829170 96.5441880 + 40.5829170 96.5316460 + 40.5849790 96.5295830 + 40.5891880 96.5295830 + 40.5912500 96.5275210 + 40.5933130 96.5254170 + 40.5975210 96.5254170 + 40.6100210 96.5129170 + 40.6120830 96.5129170 + 40.6120830 96.5108130 + 40.6100210 96.5087500 + 40.6058130 96.5087500 + 40.6037500 96.5066880 + 40.6016880 96.5045830 + 40.5933130 96.5045830 + 40.5912500 96.5025210 + 40.5891880 96.5004170 + 40.5870830 96.4983540 + 40.5850210 96.4962500 + 40.5829170 96.4941880 + 40.5808540 96.4920830 + 40.5787500 96.4900210 + 40.5787500 96.4774790 + 40.5766880 96.4754170 + 40.5745830 96.4733540 + 40.5725210 96.4712500 + 40.5704170 96.4691880 + 40.5683540 96.4670830 + 40.5662500 96.4650210 + 40.5662500 96.4608130 + 40.5641880 96.4587500 + 40.5620830 96.4566880 + 40.5620830 96.4524790 + 40.5600210 96.4504170 + 40.5579170 96.4483540 + 40.5579170 96.4441460 + 40.5558540 96.4420830 + 40.5516460 96.4420830 + 40.5495830 96.4400210 + 40.5475210 96.4379170 + 40.5454170 96.4358540 + 40.5433540 96.4337500 + 40.5391460 96.4337500 + 40.5350210 96.4295830 + 40.5329170 96.4275210 + 40.5329170 96.4191460 + 40.5308540 96.4170830 + 40.5287500 96.4150210 + 40.5266880 96.4129170 + 40.5245830 96.4108540 + 40.5245830 96.3983130 + 40.5225210 96.3962500 + 40.5204170 96.3941880 + 40.5204170 96.3774790 + 40.5183540 96.3754170 + 40.5162500 96.3733540 + 40.5141880 96.3712500 + 40.5058130 96.3712500 + 40.5037500 96.3691880 + 40.5016880 96.3670830 + 40.4974790 96.3670830 + 40.4954170 96.3650210 + 40.4933540 96.3629170 + 40.4766460 96.3629170 + 40.4745830 96.3608540 + 40.4745830 96.3566460 + 40.4725210 96.3545830 + 40.4704170 96.3525210 + 40.4704170 96.3441460 + 40.4683540 96.3420830 + 40.4662500 96.3400210 + 40.4683130 96.3379170 + 40.4704170 96.3358540 + 40.4704170 96.3274790 + 40.4683540 96.3254170 + 40.4620830 96.3233540 + 40.4600210 96.3129170 + 40.4558540 96.3087500 + 40.4537500 96.3066880 + 40.4537500 96.2899790 + 40.4516880 96.2879170 + 40.4495830 96.2858540 + 40.4495830 96.2816460 + 40.4475210 96.2795830 + 40.4454170 96.2775210 + 40.4433540 96.2754170 + 40.4391460 96.2754170 + 40.4370830 96.2733540 + 40.4350210 96.2712500 + 40.4329170 96.2691880 + 40.4308540 96.2670830 + 40.4287500 96.2650210 + 40.4308130 96.2629170 + 40.4329170 96.2608540 + 40.4329170 96.2566460 + 40.4308540 96.2545830 + 40.4287500 96.2525210 + 40.4287500 96.2441460 + 40.4308130 96.2420830 + 40.4350210 96.2420830 + 40.4370830 96.2400210 + 40.4370830 96.2358130 + 40.4350210 96.2337500 + 40.4329170 96.2316880 + 40.4329170 96.2274790 + 40.4308540 96.2254170 + 40.4287500 96.2233540 + 40.4266880 96.2212500 + 40.4224790 96.2212500 + 40.4204170 96.2191880 + 40.4204170 96.1941460 + 40.4183540 96.1920830 + 40.4141460 96.1920830 + 40.4037500 96.1733130 + 40.4016880 96.1712500 + 40.3995830 96.1691880 + 40.3975210 96.1670830 + 40.3891460 96.1670830 + 40.3870830 96.1650210 + 40.3850210 96.1629170 + 40.3808130 96.1629170 + 40.3787500 96.1608540 + 40.3787500 96.1399790 + 40.3766880 96.1379170 + 40.3641460 96.1379170 + 40.3620830 96.1358540 + 40.3600210 96.1337500 + 40.3558130 96.1337500 + 40.3537500 96.1316880 + 40.3537500 96.1274790 + 40.3516880 96.1254170 + 40.3474790 96.1254170 + 40.3454170 96.1233540 + 40.3474790 96.1212500 + 40.3495830 96.1191880 + 40.3495830 96.1066460 + 40.3516460 96.1045830 + 40.3558540 96.1045830 + 40.3579170 96.1025210 + 40.3579170 96.0899790 + 40.3558540 96.0879170 + 40.3537500 96.0858540 + 40.3537500 96.0774790 + 40.3579170 96.0691460 + 40.3579170 96.0670830 + 40.3558130 96.0670830 + 40.3537500 96.0650210 + 40.3516880 96.0629170 + 40.3495830 96.0608540 + 40.3475210 96.0587500 + 40.3433130 96.0587500 + 40.3412500 96.0566880 + 40.3391880 96.0545830 + 40.3370830 96.0525210 + 40.3350210 96.0504170 + 40.3329170 96.0483540 + 40.3329170 96.0399790 + 40.3308540 96.0379170 + 40.3287500 96.0358540 + 40.3287500 96.0274790 + 40.3266880 96.0254170 + 40.3224790 96.0254170 + 40.3204170 96.0233540 + 40.3183540 96.0212500 + 40.3141460 96.0212500 + 40.3120830 96.0191880 + 40.3100210 96.0170830 + 40.3079170 96.0150210 + 40.3058540 96.0129170 + 40.2954170 96.0025210 + 40.2954170 95.9899790 + 40.2933540 95.9879170 + 40.2912500 95.9858540 + 40.2912500 95.9774790 + 40.2891880 95.9754170 + 40.2849790 95.9754170 + 40.2829170 95.9733540 + 40.2808540 95.9712500 + 40.2724790 95.9712500 + 40.2704170 95.9691880 + 40.2683540 95.9670830 + 40.2662500 95.9650210 + 40.2641880 95.9629170 + 40.2558540 95.9587500 + 40.2516460 95.9587500 + 40.2495830 95.9566880 + 40.2475210 95.9545830 + 40.2391460 95.9545830 + 40.2370830 95.9525210 + 40.2350210 95.9504170 + 40.2329170 95.9483540 + 40.2225210 95.9337500 + 40.2141460 95.9337500 + 40.2058130 95.9254170 + 40.2037500 95.9254170 + 40.2016880 95.9295830 + 40.1974790 95.9295830 + 40.1933540 95.9337500 + 40.1891460 95.9337500 + 40.1870830 95.9358540 + 40.1849790 95.9379170 + 40.1829170 95.9399790 + 40.1829170 95.9441880 + 40.1808540 95.9462500 + 40.1641460 95.9462500 + 40.1620830 95.9441460 + 40.1600210 95.9420830 + 40.1537500 95.9420830 +IDNI4 IDNI4 -1 48 41.37000 93.66875 + 41.6200000 94.6500000 + 41.6000000 94.6300000 + 41.5700000 94.5500000 + 41.5300000 94.5100000 + 41.5100000 94.4700000 + 41.4800000 94.4500000 + 41.4200000 94.3900000 + 41.3900000 94.3400000 + 41.3300000 94.2400000 + 41.3100000 94.1600000 + 41.3100000 94.0800000 + 41.3200000 93.9900000 + 41.3400000 93.9100000 + 41.3800000 93.7200000 + 41.4000000 93.6700000 + 41.4300000 93.6500000 + 41.4300000 93.5700000 + 41.3800000 93.5600000 + 41.3500000 93.5900000 + 41.2900000 93.7600000 + 41.2500000 93.8000000 + 41.2200000 93.8300000 + 41.1700000 93.8600000 + 41.1400000 93.9100000 + 41.1300000 93.9900000 + 41.1200000 94.0200000 + 41.1300000 94.0300000 + 41.1300000 94.0800000 + 41.1800000 94.1300000 + 41.1800000 94.1700000 + 41.2200000 94.2000000 + 41.2700000 94.2200000 + 41.2500000 94.2500000 + 41.3000000 94.3200000 + 41.3300000 94.3200000 + 41.3700000 94.3700000 + 41.3700000 94.4300000 + 41.3700000 94.4700000 + 41.3700000 94.4800000 + 41.4700000 94.5700000 + 41.4500000 94.5700000 + 41.4700000 94.6200000 + 41.4800000 94.6300000 + 41.5300000 94.6700000 + 41.5700000 94.6700000 + 41.5800000 94.7000000 + 41.6000000 94.7000000 + 41.6200000 94.6500000 +IRVN1HW LTL PAPILLION CRK AT IRVINGTON, NE -1 76 41.36833 96.06917 + 41.3079170 96.0504170 + 41.3120830 96.0775210 + 41.3141460 96.0795830 + 41.3225210 96.0795830 + 41.3433130 96.1004170 + 41.3475210 96.1004170 + 41.3495830 96.1025210 + 41.3516880 96.1045830 + 41.3558130 96.1087500 + 41.3641880 96.1087500 + 41.3662500 96.1108540 + 41.3683130 96.1129170 + 41.3725210 96.1129170 + 41.3745830 96.1150210 + 41.3766460 96.1170830 + 41.3808540 96.1170830 + 41.3829170 96.1191880 + 41.3850210 96.1212500 + 41.3870830 96.1233540 + 41.3891460 96.1254170 + 41.3975210 96.1254170 + 41.3995830 96.1275210 + 41.4016460 96.1295830 + 41.4100210 96.1295830 + 41.4120830 96.1274790 + 41.4141880 96.1254170 + 41.4162500 96.1233130 + 41.4183540 96.1212500 + 41.4204170 96.1212500 + 41.4204170 96.1191460 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3183130 96.0212500 + 41.3162500 96.0233130 + 41.3141880 96.0254170 + 41.3120830 96.0274790 + 41.3120830 96.0316880 + 41.3079170 96.0358130 + 41.3058540 96.0379170 + 41.3037500 96.0399790 + 41.3079170 96.0504170 +LCNN1HW SALT CR. AT LINCOLN NE -1 485 40.87250 96.86500 + 40.8454170 96.6795830 + 40.8224790 96.6670830 + 40.8141880 96.6587500 + 40.8058130 96.6587500 + 40.8037500 96.6566880 + 40.8016880 96.6545830 + 40.7995830 96.6525210 + 40.7995830 96.6483130 + 40.7975210 96.6462500 + 40.7954170 96.6441880 + 40.7954170 96.6274790 + 40.7933540 96.6254170 + 40.7912500 96.6233540 + 40.7891880 96.6212500 + 40.7870830 96.6191880 + 40.7870830 96.6108130 + 40.7850210 96.6087500 + 40.7724790 96.6087500 + 40.7704170 96.6066880 + 40.7683540 96.6045830 + 40.7662500 96.6025210 + 40.7600210 96.5962500 + 40.7558130 96.5962500 + 40.7537500 96.5941880 + 40.7516880 96.5920830 + 40.7308130 96.5920830 + 40.7287500 96.5941460 + 40.7266880 96.5962500 + 40.7245830 96.5941880 + 40.7225210 96.5920830 + 40.7183130 96.5920830 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6399790 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5245830 96.7608540 + 40.5266880 96.7629170 + 40.5287500 96.7650210 + 40.5308540 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5350210 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391880 96.7920830 + 40.5412500 96.7941880 + 40.5391460 96.7962500 + 40.5370830 96.7983540 + 40.5391880 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391460 96.8129170 + 40.5370830 96.8150210 + 40.5349790 96.8170830 + 40.5329170 96.8191880 + 40.5308130 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8587500 + 40.5245830 96.8608540 + 40.5224790 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8775210 + 40.5308540 96.8795830 + 40.5329170 96.8816880 + 40.5350210 96.8837500 + 40.5370830 96.8858540 + 40.5391880 96.8879170 + 40.5412500 96.8900210 + 40.5433540 96.8920830 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983540 + 40.5600210 96.9004170 + 40.5620830 96.9025210 + 40.5641880 96.9045830 + 40.5662500 96.9066880 + 40.5683540 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808540 96.9212500 + 40.5829170 96.9191460 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191880 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233540 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308540 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6350210 96.9004170 + 40.6370830 96.8983540 + 40.6370830 96.8941460 + 40.6391880 96.8920830 + 40.6412500 96.8899790 + 40.6433540 96.8879170 + 40.6454170 96.8900210 + 40.6475210 96.8920830 + 40.6495830 96.8941460 + 40.6495830 96.9025210 + 40.6516460 96.9045830 + 40.6725210 96.9045830 + 40.6745830 96.9066460 + 40.6745830 96.9150210 + 40.6724790 96.9170830 + 40.6704170 96.9191460 + 40.6704170 96.9233540 + 40.6725210 96.9254170 + 40.6745830 96.9275210 + 40.6870830 96.9399790 + 40.6870830 96.9525210 + 40.6891880 96.9545830 + 40.6912500 96.9566880 + 40.6933130 96.9587500 + 40.7016880 96.9587500 + 40.7037500 96.9608540 + 40.7058130 96.9629170 + 40.7391880 96.9629170 + 40.7412500 96.9649790 + 40.7412500 96.9691880 + 40.7433540 96.9712500 + 40.7454170 96.9733130 + 40.7454170 96.9775210 + 40.7475210 96.9795830 + 40.7495830 96.9816880 + 40.7516880 96.9837500 + 40.7537500 96.9858540 + 40.7558540 96.9879170 + 40.7579170 96.9899790 + 40.7579170 96.9941880 + 40.7599790 96.9962500 + 40.7683540 96.9962500 + 40.7704170 96.9983540 + 40.7725210 97.0004170 + 40.7766880 97.0045830 + 40.7787500 97.0024790 + 40.7808130 97.0004170 + 40.7850210 97.0004170 + 40.7870830 96.9983130 + 40.7891460 96.9962500 + 40.7933540 96.9962500 + 40.7954170 96.9983540 + 40.7974790 97.0004170 + 40.8225210 97.0004170 + 40.8245830 97.0025210 + 40.8266880 97.0045830 + 40.8287500 97.0066880 + 40.8308130 97.0087500 + 40.8516880 97.0087500 + 40.8537500 97.0108540 + 40.8558130 97.0129170 + 40.8641880 97.0129170 + 40.8662500 97.0108130 + 40.8683130 97.0087500 + 40.8933540 97.0087500 + 40.8954170 97.0108540 + 40.8975210 97.0129170 + 40.8995830 97.0150210 + 40.9016880 97.0170830 + 40.9037500 97.0149790 + 40.9058130 97.0129170 + 40.9100210 97.0129170 + 40.9120830 97.0108130 + 40.9183540 97.0087500 + 40.9204170 97.0108540 + 40.9224790 97.0129170 + 40.9266880 97.0129170 + 40.9287500 97.0108130 + 40.9308540 97.0087500 + 40.9329170 97.0066460 + 40.9350210 97.0045830 + 40.9370830 97.0025210 + 40.9370830 96.9941460 + 40.9391880 96.9920830 + 40.9412500 96.9899790 + 40.9433130 96.9879170 + 40.9475210 96.9879170 + 40.9495830 96.9858130 + 40.9516460 96.9837500 + 40.9558540 96.9837500 + 40.9579170 96.9858540 + 40.9600210 96.9879170 + 40.9620830 96.9899790 + 40.9620830 97.0025210 + 40.9641460 97.0045830 + 40.9683540 97.0045830 + 40.9704170 97.0066880 + 40.9725210 97.0087500 + 40.9745830 97.0108130 + 40.9745830 97.0233540 + 40.9766460 97.0254170 + 40.9975210 97.0254170 + 40.9995830 97.0275210 + 41.0016460 97.0295830 + 41.0058540 97.0295830 + 41.0079170 97.0316460 + 41.0141460 97.0420830 + 41.0225210 97.0420830 + 41.0245830 97.0441880 + 41.0266880 97.0462500 + 41.0287500 97.0441460 + 41.0308130 97.0420830 + 41.0350210 97.0420830 + 41.0370830 97.0399790 + 41.0391880 97.0379170 + 41.0412500 97.0358130 + 41.0433130 97.0337500 + 41.0475210 97.0337500 + 41.0495830 97.0316460 + 41.0516880 97.0295830 + 41.0537500 97.0275210 + 41.0537500 97.0233130 + 41.0558540 97.0212500 + 41.0579170 97.0191460 + 41.0599790 97.0170830 + 41.0766880 97.0170830 + 41.0787500 97.0191880 + 41.0808540 97.0212500 + 41.0829170 97.0233540 + 41.0849790 97.0254170 + 41.0975210 97.0254170 + 41.0995830 97.0233130 + 41.1016880 97.0212500 + 41.1037500 97.0191460 + 41.1058540 97.0170830 + 41.1079170 97.0150210 + 41.1079170 97.0108130 + 41.1141880 97.0087500 + 41.1162500 97.0066460 + 41.1183540 97.0045830 + 41.1204170 97.0024790 + 41.1225210 97.0004170 + 41.1245830 96.9983130 + 41.1266460 96.9962500 + 41.1391880 96.9962500 + 41.1412500 96.9941460 + 41.1433540 96.9920830 + 41.1454170 96.9941460 + 41.1454170 96.9983540 + 41.1474790 97.0004170 + 41.1766880 97.0004170 + 41.1787500 97.0025210 + 41.1808540 97.0045830 + 41.1829170 97.0066880 + 41.1891880 97.0087500 + 41.1912500 97.0066460 + 41.1933130 97.0045830 + 41.2016880 97.0045830 + 41.2037500 97.0066880 + 41.2100210 97.0087500 + 41.2120830 97.0108540 + 41.2183540 97.0129170 + 41.2204170 97.0129170 + 41.2204170 97.0024790 + 41.2224790 97.0004170 + 41.2245830 96.9983540 + 41.2245830 96.9899790 + 41.2225210 96.9879170 + 41.2204170 96.9858540 + 41.2183540 96.9837500 + 41.2162500 96.9816880 + 41.2162500 96.9774790 + 41.2183130 96.9754170 + 41.2204170 96.9733540 + 41.2183540 96.9712500 + 41.2141460 96.9712500 + 41.2120830 96.9691880 + 41.2120830 96.9649790 + 41.2100210 96.9629170 + 41.2079170 96.9608540 + 41.2079170 96.9274790 + 41.2058540 96.9254170 + 41.2037500 96.9233540 + 41.2037500 96.9149790 + 41.2058130 96.9129170 + 41.2079170 96.9108540 + 41.2058540 96.9087500 + 41.2037500 96.9066880 + 41.2120830 96.8941460 + 41.2120830 96.8920830 + 41.2099790 96.8920830 + 41.2079170 96.8900210 + 41.2079170 96.8858130 + 41.2058540 96.8837500 + 41.2016460 96.8837500 + 41.1995830 96.8816880 + 41.1975210 96.8795830 + 41.1954170 96.8775210 + 41.1933540 96.8754170 + 41.1891460 96.8754170 + 41.1870830 96.8733540 + 41.1850210 96.8712500 + 41.1829170 96.8691880 + 41.1808540 96.8670830 + 41.1787500 96.8650210 + 41.1766880 96.8629170 + 41.1745830 96.8608540 + 41.1745830 96.8524790 + 41.1725210 96.8504170 + 41.1683130 96.8504170 + 41.1600210 96.8420830 + 41.1391460 96.8420830 + 41.1370830 96.8400210 + 41.1370830 96.8358130 + 41.1329170 96.8316460 + 41.1329170 96.8295830 + 41.1266460 96.8295830 + 41.1245830 96.8275210 + 41.1245830 96.8149790 + 41.1183540 96.8087500 + 41.1141460 96.8087500 + 41.1120830 96.8066880 + 41.1100210 96.8004170 + 41.1016460 96.8004170 + 41.0995830 96.7983540 + 41.0975210 96.7962500 + 41.0808130 96.7962500 + 41.0787500 96.7983130 + 41.0766880 96.8004170 + 41.0745830 96.7983540 + 41.0725210 96.7962500 + 41.0704170 96.7941880 + 41.0683540 96.7920830 + 41.0662500 96.7900210 + 41.0641880 96.7879170 + 41.0391460 96.7879170 + 41.0370830 96.7858540 + 41.0350210 96.7837500 + 41.0183130 96.7837500 + 41.0162500 96.7858130 + 41.0141880 96.7879170 + 41.0120830 96.7858540 + 41.0100210 96.7837500 + 41.0016460 96.7837500 + 40.9995830 96.7816880 + 40.9975210 96.7795830 + 40.9933130 96.7795830 + 40.9912500 96.7775210 + 40.9891880 96.7754170 + 40.9766460 96.7754170 + 40.9745830 96.7733540 + 40.9725210 96.7712500 + 40.9704170 96.7691880 + 40.9683540 96.7670830 + 40.9641460 96.7670830 + 40.9620830 96.7650210 + 40.9600210 96.7629170 + 40.9558130 96.7629170 + 40.9537500 96.7608540 + 40.9516880 96.7587500 + 40.9495830 96.7566880 + 40.9475210 96.7545830 + 40.9454170 96.7525210 + 40.9433540 96.7504170 + 40.9412500 96.7483540 + 40.9391880 96.7462500 + 40.9349790 96.7462500 + 40.9329170 96.7441880 + 40.9308540 96.7420830 + 40.9058130 96.7420830 + 40.9037500 96.7400210 + 40.9016880 96.7379170 + 40.8891460 96.7379170 + 40.8787500 96.7233130 + 40.8766880 96.7212500 + 40.8745830 96.7191880 + 40.8725210 96.7170830 + 40.8704170 96.7150210 + 40.8683540 96.7129170 + 40.8641460 96.7129170 + 40.8620830 96.7108540 + 40.8600210 96.7087500 + 40.8579170 96.7066880 + 40.8579170 96.6899790 + 40.8454170 96.6795830 +NEWI4 NEWI4 -1 24 42.78500 95.09000 + 42.9300000 94.9500000 + 42.8700000 94.9200000 + 42.8000000 94.9100000 + 42.7700000 94.9200000 + 42.6800000 94.9700000 + 42.6300000 95.0200000 + 42.6200000 95.0200000 + 42.6000000 95.0800000 + 42.6500000 95.1500000 + 42.6800000 95.2200000 + 42.7800000 95.2700000 + 42.8200000 95.2700000 + 42.8200000 95.2300000 + 42.8800000 95.2200000 + 42.8800000 95.2000000 + 42.8700000 95.1700000 + 42.8700000 95.1500000 + 42.8700000 95.1300000 + 42.8800000 95.1000000 + 42.9000000 95.0700000 + 42.9200000 95.0700000 + 42.9200000 95.0200000 + 42.9700000 94.9800000 + 42.9300000 94.9500000 +NRWI4 NRWI4 -1 28 41.42000 94.08000 + 41.5300000 94.5100000 + 41.5300000 94.4700000 + 41.5200000 94.3800000 + 41.5000000 94.2600000 + 41.5100000 94.2300000 + 41.4800000 94.1500000 + 41.4800000 94.1200000 + 41.4800000 94.0300000 + 41.5000000 93.9800000 + 41.4900000 93.9000000 + 41.4700000 93.8400000 + 41.4800000 93.7700000 + 41.5000000 93.7200000 + 41.4700000 93.6600000 + 41.4600000 93.6500000 + 41.4300000 93.6500000 + 41.4000000 93.6700000 + 41.3800000 93.7200000 + 41.3400000 93.9100000 + 41.3200000 93.9900000 + 41.3100000 94.0800000 + 41.3100000 94.1600000 + 41.3300000 94.2400000 + 41.3900000 94.3400000 + 41.4200000 94.3900000 + 41.4800000 94.4500000 + 41.5100000 94.4700000 + 41.5300000 94.5100000 +PANI4 PANI4 -1 9 41.65500 94.34500 + 41.7000000 94.4400000 + 41.7000000 94.3800000 + 41.7000000 94.3500000 + 41.7200000 94.3000000 + 41.6000000 94.2500000 + 41.5900000 94.3200000 + 41.6000000 94.4000000 + 41.6500000 94.4300000 + 41.7000000 94.4400000 +PNLI4 PNLI4 -1 10 41.77000 94.44000 + 41.8400000 94.4900000 + 41.8200000 94.4100000 + 41.7500000 94.3700000 + 41.7000000 94.3500000 + 41.7000000 94.3800000 + 41.7000000 94.4400000 + 41.7300000 94.4400000 + 41.7700000 94.5300000 + 41.7800000 94.5000000 + 41.8400000 94.4900000 +PPLN1HW W BR PAPILLION CREEK AT PAPILLION, NE -1 159 41.23917 96.18583 + 41.1495830 96.0420830 + 41.1391460 96.0462500 + 41.1370830 96.0483130 + 41.1370830 96.0566880 + 41.1350210 96.0587500 + 41.1245830 96.0587500 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2183130 96.2587500 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3100210 96.2629170 + 41.3120830 96.2608130 + 41.3141880 96.2587500 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3266880 96.2462500 + 41.3287500 96.2483540 + 41.3308540 96.2504170 + 41.3329170 96.2525210 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566880 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3600210 96.2670830 + 41.3620830 96.2670830 + 41.3620830 96.2649790 + 41.3641460 96.2629170 + 41.3662500 96.2608540 + 41.3662500 96.2358130 + 41.3641880 96.2337500 + 41.3620830 96.2316880 + 41.3620830 96.2274790 + 41.3600210 96.2254170 + 41.3579170 96.2233540 + 41.3579170 96.2191460 + 41.3558540 96.2170830 + 41.3537500 96.2150210 + 41.3537500 96.2024790 + 41.3516880 96.2004170 + 41.3495830 96.1983540 + 41.3475210 96.1962500 + 41.3391460 96.1962500 + 41.3183540 96.1754170 + 41.3120830 96.1733540 + 41.3120830 96.1691460 + 41.3100210 96.1670830 + 41.2974790 96.1670830 + 41.2912500 96.1566460 + 41.2912500 96.1545830 + 41.2891460 96.1545830 + 41.2599790 96.1462500 + 41.2579170 96.1441880 + 41.2558540 96.1420830 + 41.2516460 96.1420830 + 41.2495830 96.1400210 + 41.2495830 96.1316460 + 41.2475210 96.1295830 + 41.2454170 96.1275210 + 41.2433540 96.1254170 + 41.2412500 96.1233540 + 41.2412500 96.1149790 + 41.2391880 96.1129170 + 41.2370830 96.1108540 + 41.2350210 96.1087500 + 41.2308130 96.1087500 + 41.2287500 96.1066880 + 41.2266880 96.1045830 + 41.2204170 96.1025210 + 41.2204170 96.0899790 + 41.2016880 96.0754170 + 41.1974790 96.0754170 + 41.1954170 96.0733540 + 41.1954170 96.0649790 + 41.1912500 96.0566460 + 41.1891880 96.0545830 + 41.1870830 96.0566460 + 41.1850210 96.0587500 + 41.1829170 96.0566880 + 41.1683540 96.0379170 + 41.1599790 96.0379170 + 41.1495830 96.0420830 +PROI4 PROI4 -1 40 42.10000 94.30000 + 42.4100000 94.2700000 + 42.3900000 94.2600000 + 42.3600000 94.2400000 + 42.3300000 94.2100000 + 42.3100000 94.2000000 + 42.3100000 94.1600000 + 42.3000000 94.1400000 + 42.2800000 94.1400000 + 42.2400000 94.1500000 + 42.1500000 94.2300000 + 42.0900000 94.2400000 + 42.0200000 94.2400000 + 41.9800000 94.2200000 + 41.9300000 94.1500000 + 41.8400000 94.0800000 + 41.8000000 94.0700000 + 41.8100000 94.1100000 + 41.8300000 94.2100000 + 41.8200000 94.2300000 + 41.7800000 94.2400000 + 41.8100000 94.2900000 + 41.8400000 94.3400000 + 41.9200000 94.4600000 + 41.9700000 94.5100000 + 41.9900000 94.5300000 + 41.9800000 94.4700000 + 41.9400000 94.4000000 + 41.9500000 94.3800000 + 41.9900000 94.3800000 + 42.0000000 94.3600000 + 42.0200000 94.3600000 + 42.0700000 94.4400000 + 42.1200000 94.4900000 + 42.1700000 94.5100000 + 42.2200000 94.5100000 + 42.2700000 94.4900000 + 42.4000000 94.3800000 + 42.4200000 94.3600000 + 42.3900000 94.3200000 + 42.4100000 94.2700000 +PSGI4HW SOLDIER RIVER AT PISGAH IA -1 404 42.03917 95.68167 + 41.8287500 95.9337500 + 41.8350210 95.9379170 + 41.8474790 95.9504170 + 41.8516880 95.9504170 + 41.8558130 95.9545830 + 41.8600210 95.9545830 + 41.8620830 95.9524790 + 41.8641460 95.9504170 + 41.8891880 95.9504170 + 41.8912500 95.9483130 + 41.8933130 95.9462500 + 41.8975210 95.9462500 + 41.8995830 95.9441460 + 41.9016460 95.9420830 + 41.9058540 95.9420830 + 41.9079170 95.9399790 + 41.9141880 95.9337500 + 41.9162500 95.9337500 + 41.9162500 95.9191460 + 41.9183130 95.9170830 + 41.9225210 95.9170830 + 41.9245830 95.9150210 + 41.9266460 95.9129170 + 41.9308540 95.9129170 + 41.9329170 95.9108540 + 41.9349790 95.9087500 + 41.9558540 95.9087500 + 41.9579170 95.9108130 + 41.9599790 95.9129170 + 41.9662500 95.9024790 + 41.9683540 95.8962500 + 41.9662500 95.8941880 + 41.9662500 95.8899790 + 41.9683130 95.8879170 + 41.9704170 95.8858540 + 41.9724790 95.8837500 + 41.9766880 95.8837500 + 41.9787500 95.8816880 + 41.9787500 95.8733130 + 41.9766880 95.8712500 + 41.9745830 95.8691880 + 41.9766460 95.8670830 + 41.9787500 95.8650210 + 41.9808130 95.8629170 + 41.9891880 95.8629170 + 41.9912500 95.8608540 + 41.9933130 95.8587500 + 41.9954170 95.8566880 + 42.0016460 95.8504170 + 42.0141880 95.8504170 + 42.0162500 95.8483540 + 42.0183130 95.8462500 + 42.0225210 95.8462500 + 42.0245830 95.8441880 + 42.0245830 95.8399790 + 42.0266460 95.8379170 + 42.0350210 95.8379170 + 42.0516880 95.8295830 + 42.0537500 95.8316460 + 42.0558130 95.8337500 + 42.0579170 95.8316880 + 42.0599790 95.8295830 + 42.0620830 95.8275210 + 42.0641460 95.8254170 + 42.0683540 95.8254170 + 42.0704170 95.8191460 + 42.0787500 95.8108540 + 42.0787500 95.8024790 + 42.0829170 95.7733130 + 42.0849790 95.7712500 + 42.0870830 95.7691880 + 42.0870830 95.7649790 + 42.0891460 95.7629170 + 42.0933540 95.7629170 + 42.0954170 95.7649790 + 42.0974790 95.7670830 + 42.0995830 95.7650210 + 42.1016460 95.7629170 + 42.1037500 95.7608540 + 42.1058130 95.7587500 + 42.1079170 95.7566880 + 42.1099790 95.7545830 + 42.1183540 95.7545830 + 42.1204170 95.7525210 + 42.1224790 95.7504170 + 42.1245830 95.7483540 + 42.1266460 95.7462500 + 42.1308540 95.7462500 + 42.1329170 95.7441880 + 42.1349790 95.7420830 + 42.1391880 95.7420830 + 42.1412500 95.7400210 + 42.1412500 95.7358130 + 42.1433130 95.7337500 + 42.1474790 95.7295830 + 42.1558540 95.7295830 + 42.1579170 95.7275210 + 42.1599790 95.7212500 + 42.1641880 95.7212500 + 42.1662500 95.7191880 + 42.1683130 95.7087500 + 42.1725210 95.7087500 + 42.1745830 95.7066880 + 42.1745830 95.7024790 + 42.1766460 95.7004170 + 42.1787500 95.6983540 + 42.1808130 95.6962500 + 42.1829170 95.6941880 + 42.1849790 95.6920830 + 42.1933540 95.6920830 + 42.1954170 95.6900210 + 42.1954170 95.6816460 + 42.1974790 95.6795830 + 42.2016880 95.6795830 + 42.2037500 95.6775210 + 42.2037500 95.6691460 + 42.2058130 95.6670830 + 42.2079170 95.6650210 + 42.2079170 95.6399790 + 42.2099790 95.6379170 + 42.2120830 95.6358540 + 42.2141460 95.6337500 + 42.2162500 95.6316880 + 42.2183130 95.6295830 + 42.2204170 95.6275210 + 42.2224790 95.6254170 + 42.2245830 95.6233540 + 42.2266460 95.6212500 + 42.2308130 95.6170830 + 42.2350210 95.6170830 + 42.2370830 95.6150210 + 42.2391460 95.6129170 + 42.2412500 95.6108540 + 42.2454170 95.6025210 + 42.2433540 95.6004170 + 42.2412500 95.5983540 + 42.2412500 95.5899790 + 42.2579170 95.5733540 + 42.2579170 95.5691460 + 42.2620830 95.5608130 + 42.2662500 95.5566880 + 42.2683130 95.5545830 + 42.2704170 95.5525210 + 42.2724790 95.5504170 + 42.2808540 95.5504170 + 42.2829170 95.5483540 + 42.2808540 95.5462500 + 42.2787500 95.5441880 + 42.2787500 95.5399790 + 42.2808130 95.5379170 + 42.2829170 95.5358540 + 42.2829170 95.5316460 + 42.2870830 95.5275210 + 42.2891460 95.5254170 + 42.2912500 95.5233540 + 42.2912500 95.5024790 + 42.2870830 95.4858130 + 42.2870830 95.4837500 + 42.2849790 95.4837500 + 42.2829170 95.4816880 + 42.2829170 95.4733130 + 42.2808540 95.4712500 + 42.2787500 95.4691880 + 42.2787500 95.4524790 + 42.2808130 95.4504170 + 42.2829170 95.4483540 + 42.2849790 95.4462500 + 42.2870830 95.4441880 + 42.2870830 95.4399790 + 42.2891460 95.4379170 + 42.2912500 95.4358540 + 42.2933130 95.4337500 + 42.2954170 95.4316880 + 42.2954170 95.4274790 + 42.2933540 95.4254170 + 42.2912500 95.4233540 + 42.2912500 95.4108130 + 42.2933130 95.4087500 + 42.2954170 95.4066880 + 42.2933540 95.4045830 + 42.2912500 95.4025210 + 42.2891880 95.4004170 + 42.2808130 95.4004170 + 42.2787500 95.4024790 + 42.2766880 95.4045830 + 42.2745830 95.4025210 + 42.2725210 95.3962500 + 42.2704170 95.3941880 + 42.2704170 95.3899790 + 42.2724790 95.3879170 + 42.2745830 95.3858540 + 42.2745830 95.3816460 + 42.2766460 95.3795830 + 42.2787500 95.3775210 + 42.2787500 95.3691460 + 42.2808130 95.3670830 + 42.2829170 95.3650210 + 42.2829170 95.3483130 + 42.2808540 95.3462500 + 42.2787500 95.3441880 + 42.2787500 95.3358130 + 42.2745830 95.3233130 + 42.2745830 95.3212500 + 42.2662500 95.3274790 + 42.2662500 95.3316880 + 42.2641880 95.3337500 + 42.2579170 95.3358130 + 42.2579170 95.3525210 + 42.2558130 95.3545830 + 42.2537500 95.3524790 + 42.2516880 95.3504170 + 42.2391460 95.3504170 + 42.2370830 95.3524790 + 42.2370830 95.3566880 + 42.2349790 95.3587500 + 42.2329170 95.3608130 + 42.2329170 95.3650210 + 42.2287500 95.3691460 + 42.2287500 95.3775210 + 42.2266460 95.3795830 + 42.2245830 95.3816880 + 42.2224790 95.3837500 + 42.2141880 95.3920830 + 42.1995830 95.3983130 + 42.1995830 95.4066880 + 42.1954170 95.4108130 + 42.1954170 95.4150210 + 42.1933540 95.4170830 + 42.1787500 95.4191880 + 42.1683540 95.4295830 + 42.1641460 95.4295830 + 42.1620830 95.4274790 + 42.1599790 95.4254170 + 42.1579170 95.4233540 + 42.1579170 95.4191460 + 42.1558540 95.4170830 + 42.1433130 95.4170830 + 42.1412500 95.4149790 + 42.1391880 95.4129170 + 42.1308130 95.4129170 + 42.1287500 95.4108130 + 42.1224790 95.4087500 + 42.1204170 95.4108540 + 42.1183130 95.4129170 + 42.1162500 95.4150210 + 42.1141460 95.4170830 + 42.1120830 95.4191880 + 42.1058130 95.4212500 + 42.1037500 95.4233130 + 42.1037500 95.4316880 + 42.1016460 95.4337500 + 42.0995830 95.4358540 + 42.0975210 95.4379170 + 42.0933130 95.4379170 + 42.0912500 95.4379170 + 42.0829170 95.4649790 + 42.0829170 95.4816880 + 42.0808130 95.4837500 + 42.0766880 95.4879170 + 42.0704170 95.4899790 + 42.0704170 95.5025210 + 42.0683130 95.5045830 + 42.0662500 95.5066880 + 42.0641460 95.5087500 + 42.0620830 95.5108540 + 42.0599790 95.5129170 + 42.0579170 95.5149790 + 42.0579170 95.5275210 + 42.0558130 95.5295830 + 42.0537500 95.5274790 + 42.0516880 95.5254170 + 42.0433540 95.5295830 + 42.0391460 95.5295830 + 42.0370830 95.5316460 + 42.0329170 95.5399790 + 42.0329170 95.5483540 + 42.0308130 95.5504170 + 42.0287500 95.5525210 + 42.0266460 95.5545830 + 42.0245830 95.5545830 + 42.0287500 95.5608130 + 42.0287500 95.5816880 + 42.0308540 95.5837500 + 42.0329170 95.5858130 + 42.0329170 95.5900210 + 42.0350210 95.5920830 + 42.0370830 95.5941460 + 42.0370830 95.6066880 + 42.0349790 95.6087500 + 42.0329170 95.6108540 + 42.0308540 95.6129170 + 42.0266460 95.6129170 + 42.0245830 95.6149790 + 42.0204170 95.6233130 + 42.0204170 95.6275210 + 42.0183130 95.6295830 + 42.0162500 95.6316880 + 42.0141460 95.6337500 + 42.0120830 95.6358130 + 42.0120830 95.6608540 + 42.0099790 95.6629170 + 42.0079170 95.6650210 + 42.0058130 95.6670830 + 42.0037500 95.6691880 + 42.0016460 95.6712500 + 41.9995830 95.6733540 + 41.9975210 95.6754170 + 41.9891460 95.6754170 + 41.9870830 95.6774790 + 41.9870830 95.6816880 + 41.9850210 95.6837500 + 41.9808130 95.6837500 + 41.9787500 95.6858540 + 41.9766880 95.6879170 + 41.9683130 95.6879170 + 41.9662500 95.6900210 + 41.9641460 95.6920830 + 41.9620830 95.6941880 + 41.9600210 95.6962500 + 41.9516880 95.7004170 + 41.9433540 95.7045830 + 41.9349790 95.7045830 + 41.9329170 95.7066460 + 41.9329170 95.7233540 + 41.9308130 95.7254170 + 41.9287500 95.7275210 + 41.9266460 95.7295830 + 41.9245830 95.7316880 + 41.9224790 95.7337500 + 41.9204170 95.7358540 + 41.9162500 95.7399790 + 41.9162500 95.7441880 + 41.9141880 95.7462500 + 41.8849790 95.7462500 + 41.8829170 95.7483540 + 41.8808540 95.7504170 + 41.8683130 95.7504170 + 41.8662500 95.7524790 + 41.8662500 95.7566880 + 41.8641460 95.7587500 + 41.8620830 95.7608540 + 41.8599790 95.7629170 + 41.8579170 95.7650210 + 41.8558130 95.7670830 + 41.8537500 95.7691460 + 41.8537500 95.7733540 + 41.8516460 95.7754170 + 41.8495830 95.7775210 + 41.8474790 95.7795830 + 41.8454170 95.7816460 + 41.8454170 95.7858540 + 41.8475210 95.7879170 + 41.8495830 95.7900210 + 41.8474790 95.7920830 + 41.8454170 95.7941880 + 41.8475210 95.7962500 + 41.8495830 95.7983130 + 41.8433540 95.8170830 + 41.8308540 95.8212500 + 41.8266460 95.8212500 + 41.8245830 95.8233540 + 41.8225210 95.8254170 + 41.8183130 95.8254170 + 41.8162500 95.8275210 + 41.8141460 95.8295830 + 41.8120830 95.8316880 + 41.8099790 95.8337500 + 41.8079170 95.8358540 + 41.8058130 95.8379170 + 41.8037500 95.8399790 + 41.8037500 95.8441880 + 41.8016460 95.8462500 + 41.7995830 95.8483540 + 41.7974790 95.8504170 + 41.7954170 95.8525210 + 41.7974790 95.8545830 + 41.8016880 95.8545830 + 41.8037500 95.8566460 + 41.8037500 95.8691880 + 41.8016460 95.8712500 + 41.7995830 95.8733540 + 41.7974790 95.8754170 + 41.7954170 95.8775210 + 41.7933130 95.8795830 + 41.7912500 95.8816460 + 41.7912500 95.8858540 + 41.7891460 95.8879170 + 41.7870830 95.8899790 + 41.7870830 95.8983540 + 41.7870830 95.9004170 + 41.7933130 95.9045830 + 41.7975210 95.9045830 + 41.7995830 95.9066880 + 41.8016460 95.9087500 + 41.8058540 95.9087500 + 41.8079170 95.9108540 + 41.8100210 95.9129170 + 41.8120830 95.9150210 + 41.8183130 95.9212500 + 41.8225210 95.9212500 + 41.8245830 95.9233540 + 41.8266880 95.9254170 + 41.8287500 95.9274790 + 41.8287500 95.9337500 +RDOI4HW E. NISHNABOTNA RIVER AT REDOAK IA -1 596 41.46417 94.92333 + 41.0099790 95.2420830 + 41.0162500 95.2483130 + 41.0162500 95.2525210 + 41.0183130 95.2545830 + 41.0329170 95.2691460 + 41.0329170 95.2733540 + 41.0349790 95.2754170 + 41.0391880 95.2754170 + 41.0412500 95.2733540 + 41.0433130 95.2712500 + 41.0558540 95.2712500 + 41.0579170 95.2691880 + 41.0579170 95.2649790 + 41.0599790 95.2629170 + 41.0641880 95.2629170 + 41.0662500 95.2608540 + 41.0683130 95.2587500 + 41.0704170 95.2566880 + 41.0724790 95.2545830 + 41.0766880 95.2545830 + 41.0787500 95.2525210 + 41.0808130 95.2504170 + 41.0891880 95.2504170 + 41.0912500 95.2483540 + 41.0933130 95.2462500 + 41.0954170 95.2441880 + 41.0974790 95.2420830 + 41.1016880 95.2420830 + 41.1037500 95.2400210 + 41.1037500 95.2358130 + 41.1058130 95.2337500 + 41.1100210 95.2337500 + 41.1120830 95.2316880 + 41.1141460 95.2295830 + 41.1183540 95.2295830 + 41.1204170 95.2275210 + 41.1224790 95.2254170 + 41.1308540 95.2254170 + 41.1329170 95.2233540 + 41.1349790 95.2212500 + 41.1475210 95.2212500 + 41.1495830 95.2191880 + 41.1516460 95.2170830 + 41.1537500 95.2150210 + 41.1558130 95.2129170 + 41.1600210 95.2129170 + 41.1620830 95.2108540 + 41.1641460 95.2087500 + 41.1683540 95.2087500 + 41.1704170 95.2108130 + 41.1724790 95.2129170 + 41.1850210 95.2129170 + 41.1870830 95.2108540 + 41.1870830 95.2066460 + 41.1891460 95.2045830 + 41.1912500 95.2025210 + 41.1912500 95.1983130 + 41.1933130 95.1962500 + 41.2058540 95.1962500 + 41.2079170 95.1941880 + 41.2099790 95.1920830 + 41.2183540 95.1920830 + 41.2204170 95.1900210 + 41.2224790 95.1879170 + 41.2433540 95.1879170 + 41.2454170 95.1858540 + 41.2474790 95.1837500 + 41.2683540 95.1837500 + 41.2704170 95.1858130 + 41.2704170 95.1900210 + 41.2724790 95.1920830 + 41.2975210 95.1920830 + 41.2995830 95.1900210 + 41.3016460 95.1879170 + 41.3037500 95.1858540 + 41.3100210 95.1837500 + 41.3120830 95.1858130 + 41.3141460 95.1879170 + 41.3162500 95.1858540 + 41.3183130 95.1837500 + 41.3266880 95.1837500 + 41.3287500 95.1858130 + 41.3308130 95.1879170 + 41.3329170 95.1858540 + 41.3475210 95.1837500 + 41.3495830 95.1816880 + 41.3516460 95.1795830 + 41.3579170 95.1775210 + 41.3599790 95.1754170 + 41.3787500 95.1774790 + 41.3808130 95.1795830 + 41.3850210 95.1795830 + 41.3870830 95.1775210 + 41.3891460 95.1754170 + 41.4058540 95.1754170 + 41.4079170 95.1774790 + 41.4141880 95.1795830 + 41.4162500 95.1775210 + 41.4308540 95.1754170 + 41.4329170 95.1774790 + 41.4433540 95.1795830 + 41.4454170 95.1775210 + 41.4474790 95.1754170 + 41.4516880 95.1754170 + 41.4537500 95.1733540 + 41.4558130 95.1712500 + 41.4579170 95.1733130 + 41.4599790 95.1754170 + 41.4620830 95.1733540 + 41.4641460 95.1712500 + 41.4891880 95.1712500 + 41.4912500 95.1733130 + 41.4933130 95.1754170 + 41.5016880 95.1754170 + 41.5037500 95.1774790 + 41.5058130 95.1795830 + 41.5225210 95.1795830 + 41.5349790 95.1920830 + 41.5391880 95.1920830 + 41.5412500 95.1941460 + 41.5412500 95.1983540 + 41.5433540 95.2004170 + 41.5454170 95.2004170 + 41.5454170 95.1983130 + 41.5474790 95.1962500 + 41.5516880 95.1962500 + 41.5537500 95.1941880 + 41.5558130 95.1920830 + 41.5641880 95.1920830 + 41.5662500 95.1900210 + 41.5683130 95.1879170 + 41.5725210 95.1879170 + 41.5745830 95.1899790 + 41.5766460 95.1920830 + 41.5850210 95.1879170 + 41.5870830 95.1858540 + 41.5891460 95.1837500 + 41.5933540 95.1837500 + 41.5954170 95.1816880 + 41.5954170 95.1774790 + 41.5974790 95.1754170 + 41.5995830 95.1733540 + 41.6016460 95.1712500 + 41.6037500 95.1691880 + 41.6037500 95.1649790 + 41.6058130 95.1629170 + 41.6100210 95.1629170 + 41.6120830 95.1649790 + 41.6141460 95.1670830 + 41.6162500 95.1691460 + 41.6183130 95.1712500 + 41.6204170 95.1733130 + 41.6224790 95.1754170 + 41.6266880 95.1754170 + 41.6287500 95.1733540 + 41.6350210 95.1712500 + 41.6370830 95.1691880 + 41.6391460 95.1670830 + 41.6475210 95.1670830 + 41.6495830 95.1650210 + 41.6495830 95.1608130 + 41.6516460 95.1587500 + 41.6537500 95.1566880 + 41.6558130 95.1545830 + 41.6579170 95.1525210 + 41.6599790 95.1504170 + 41.6620830 95.1483540 + 41.6641460 95.1462500 + 41.6662500 95.1441880 + 41.6683130 95.1420830 + 41.6725210 95.1420830 + 41.6745830 95.1400210 + 41.6870830 95.1275210 + 41.6870830 95.1233130 + 41.6912500 95.1191880 + 41.6912500 95.1108130 + 41.6891880 95.1087500 + 41.6870830 95.1066880 + 41.6870830 95.0774790 + 41.6891460 95.0754170 + 41.6912500 95.0733540 + 41.6933130 95.0712500 + 41.6954170 95.0691880 + 41.6954170 95.0649790 + 41.6933540 95.0629170 + 41.6912500 95.0608540 + 41.6912500 95.0483130 + 41.6933130 95.0462500 + 41.6975210 95.0462500 + 41.6995830 95.0441880 + 41.7016460 95.0420830 + 41.7037500 95.0400210 + 41.7037500 95.0149790 + 41.7120830 95.0024790 + 41.7100210 95.0004170 + 41.7058130 95.0004170 + 41.7037500 94.9983540 + 41.7037500 94.9858130 + 41.7058130 94.9837500 + 41.7100210 94.9837500 + 41.7120830 94.9816880 + 41.7141460 94.9795830 + 41.7162500 94.9775210 + 41.7162500 94.9733130 + 41.7183130 94.9712500 + 41.7225210 94.9712500 + 41.7245830 94.9733130 + 41.7266460 94.9754170 + 41.7287500 94.9733540 + 41.7308130 94.9712500 + 41.7433540 94.9712500 + 41.7454170 94.9733130 + 41.7474790 94.9754170 + 41.7600210 94.9754170 + 41.7620830 94.9733540 + 41.7620830 94.9691460 + 41.7641460 94.9670830 + 41.7662500 94.9650210 + 41.7683130 94.9629170 + 41.7704170 94.9608540 + 41.7724790 94.9587500 + 41.7745830 94.9566880 + 41.7745830 94.9483130 + 41.7766460 94.9462500 + 41.7787500 94.9441880 + 41.7808130 94.9420830 + 41.7829170 94.9441460 + 41.7849790 94.9462500 + 41.7891880 94.9462500 + 41.7912500 94.9441880 + 41.7912500 94.9316460 + 41.7933130 94.9295830 + 41.7954170 94.9275210 + 41.8058130 94.9170830 + 41.8100210 94.9170830 + 41.8120830 94.9191460 + 41.8141460 94.9212500 + 41.8266880 94.9212500 + 41.8287500 94.9233130 + 41.8287500 94.9275210 + 41.8350210 94.9295830 + 41.8370830 94.9316460 + 41.8391460 94.9337500 + 41.8433540 94.9337500 + 41.8454170 94.9358130 + 41.8454170 94.9400210 + 41.8474790 94.9420830 + 41.8495830 94.9441460 + 41.8495830 94.9525210 + 41.8558540 94.9545830 + 41.8579170 94.9566460 + 41.8599790 94.9587500 + 41.8620830 94.9608130 + 41.8641460 94.9629170 + 41.8662500 94.9649790 + 41.8683130 94.9670830 + 41.8704170 94.9691460 + 41.8724790 94.9712500 + 41.8745830 94.9733130 + 41.8766460 94.9795830 + 41.8891880 94.9795830 + 41.8912500 94.9816460 + 41.8933130 94.9837500 + 41.8975210 94.9837500 + 41.8995830 94.9858130 + 41.9016460 94.9920830 + 41.9100210 94.9920830 + 41.9120830 94.9900210 + 41.9141460 94.9879170 + 41.9162500 94.9858540 + 41.9162500 94.9774790 + 41.9141880 94.9754170 + 41.9120830 94.9733540 + 41.9204170 94.9650210 + 41.9204170 94.9608130 + 41.9245830 94.9587500 + 41.9245830 94.9566460 + 41.9225210 94.9545830 + 41.9204170 94.9525210 + 41.9204170 94.9274790 + 41.9141460 94.9170830 + 41.9162500 94.9150210 + 41.9162500 94.9066460 + 41.9016460 94.8962500 + 41.8995830 94.8941880 + 41.8995830 94.8858130 + 41.8975210 94.8837500 + 41.8954170 94.8816880 + 41.8954170 94.8733130 + 41.8912500 94.8649790 + 41.8850210 94.8587500 + 41.8808130 94.8587500 + 41.8745830 94.8525210 + 41.8745830 94.8483130 + 41.8725210 94.8462500 + 41.8704170 94.8441880 + 41.8704170 94.8399790 + 41.8683540 94.8379170 + 41.8662500 94.8358540 + 41.8641880 94.8337500 + 41.8558130 94.8337500 + 41.8537500 94.8358130 + 41.8516880 94.8379170 + 41.8474790 94.8379170 + 41.8454170 94.8358540 + 41.8433540 94.8337500 + 41.8412500 94.8316880 + 41.8391880 94.8295830 + 41.8370830 94.8275210 + 41.8350210 94.8254170 + 41.8287500 94.8233540 + 41.8266880 94.8170830 + 41.8204170 94.8150210 + 41.8183540 94.8004170 + 41.8058130 94.8004170 + 41.8037500 94.7983540 + 41.8016880 94.7962500 + 41.7995830 94.7941880 + 41.7995830 94.7899790 + 41.7975210 94.7879170 + 41.7933130 94.7879170 + 41.7912500 94.7858540 + 41.7891880 94.7837500 + 41.7870830 94.7816880 + 41.7850210 94.7795830 + 41.7829170 94.7775210 + 41.7808540 94.7754170 + 41.7599790 94.7754170 + 41.7579170 94.7691460 + 41.7558540 94.7670830 + 41.7537500 94.7650210 + 41.7516880 94.7629170 + 41.7495830 94.7608540 + 41.7495830 94.7566460 + 41.7516460 94.7545830 + 41.7683540 94.7545830 + 41.7704170 94.7525210 + 41.7704170 94.7399790 + 41.7683540 94.7379170 + 41.7662500 94.7358540 + 41.7641880 94.7337500 + 41.7516460 94.7337500 + 41.7495830 94.7358130 + 41.7475210 94.7379170 + 41.7454170 94.7399790 + 41.7433540 94.7420830 + 41.7412500 94.7400210 + 41.7391880 94.7379170 + 41.7308130 94.7379170 + 41.7287500 94.7358540 + 41.7266880 94.7337500 + 41.7245830 94.7316880 + 41.7225210 94.7295830 + 41.7204170 94.7275210 + 41.7183540 94.7254170 + 41.7141460 94.7254170 + 41.7120830 94.7233540 + 41.7100210 94.7212500 + 41.7058130 94.7212500 + 41.7016880 94.7170830 + 41.6933130 94.7170830 + 41.6912500 94.7150210 + 41.6891880 94.7129170 + 41.6870830 94.7108540 + 41.6850210 94.7087500 + 41.6829170 94.7066880 + 41.6829170 94.6983130 + 41.6808540 94.6962500 + 41.6745830 94.6941880 + 41.6725210 94.6920830 + 41.6704170 94.6900210 + 41.6683540 94.6879170 + 41.6662500 94.6858540 + 41.6641880 94.6837500 + 41.6599790 94.6837500 + 41.6579170 94.6858130 + 41.6579170 94.6900210 + 41.6558540 94.6920830 + 41.6516460 94.6920830 + 41.6495830 94.6941460 + 41.6475210 94.6962500 + 41.6454170 94.6983130 + 41.6454170 94.7025210 + 41.6433540 94.7045830 + 41.6412500 94.7025210 + 41.6391880 94.7004170 + 41.6370830 94.6983540 + 41.6350210 94.6962500 + 41.6308130 94.6962500 + 41.6287500 94.6941880 + 41.6266880 94.6920830 + 41.6099790 94.6920830 + 41.6079170 94.6941460 + 41.6058540 94.6962500 + 41.6037500 94.6983130 + 41.6016880 94.7004170 + 41.5995830 94.7024790 + 41.5975210 94.7045830 + 41.5954170 94.7025210 + 41.5933540 94.7004170 + 41.5912500 94.6983540 + 41.5849790 94.6962500 + 41.5829170 94.6941880 + 41.5808540 94.6920830 + 41.5787500 94.6900210 + 41.5724790 94.6879170 + 41.5704170 94.6858540 + 41.5704170 94.6774790 + 41.5683540 94.6754170 + 41.5662500 94.6733540 + 41.5662500 94.6691460 + 41.5641880 94.6670830 + 41.5516460 94.6670830 + 41.5495830 94.6650210 + 41.5475210 94.6629170 + 41.5454170 94.6608540 + 41.5433540 94.6587500 + 41.5391460 94.6587500 + 41.5370830 94.6566880 + 41.5350210 94.6545830 + 41.5329170 94.6566460 + 41.5308540 94.6587500 + 41.5266460 94.6587500 + 41.5245830 94.6566880 + 41.5225210 94.6545830 + 41.5183130 94.6545830 + 41.5100210 94.6462500 + 41.4974790 94.6462500 + 41.4954170 94.6441880 + 41.4954170 94.6399790 + 41.4849790 94.6379170 + 41.4829170 94.6379170 + 41.4745830 94.6566460 + 41.4745830 94.6650210 + 41.4724790 94.6670830 + 41.4704170 94.6691880 + 41.4683130 94.6712500 + 41.4662500 94.6733540 + 41.4641460 94.6754170 + 41.4620830 94.6774790 + 41.4620830 94.6816880 + 41.4599790 94.6837500 + 41.4579170 94.6858540 + 41.4558130 94.6879170 + 41.4537500 94.6899790 + 41.4537500 94.6983540 + 41.4516460 94.7004170 + 41.4495830 94.7024790 + 41.4495830 94.7108540 + 41.4474790 94.7129170 + 41.4454170 94.7150210 + 41.4433130 94.7170830 + 41.4412500 94.7191460 + 41.4412500 94.7275210 + 41.4391880 94.7295830 + 41.4349790 94.7295830 + 41.4329170 94.7316460 + 41.4329170 94.7358540 + 41.4308540 94.7379170 + 41.4266460 94.7379170 + 41.4245830 94.7400210 + 41.4225210 94.7420830 + 41.4183130 94.7420830 + 41.4162500 94.7441880 + 41.4120830 94.7483130 + 41.4120830 94.7525210 + 41.4100210 94.7545830 + 41.4037500 94.7566460 + 41.4037500 94.7816880 + 41.4016880 94.7837500 + 41.3974790 94.7837500 + 41.3954170 94.7858540 + 41.3933130 94.7879170 + 41.3912500 94.7900210 + 41.3891880 94.7920830 + 41.3849790 94.7920830 + 41.3829170 94.7899790 + 41.3704170 94.7983130 + 41.3704170 94.8025210 + 41.3683130 94.8045830 + 41.3662500 94.8066460 + 41.3662500 94.8108540 + 41.3641880 94.8129170 + 41.3370830 94.8233540 + 41.3391880 94.8254170 + 41.3412500 94.8274790 + 41.3412500 94.8400210 + 41.3391460 94.8420830 + 41.3370830 94.8441460 + 41.3370830 94.8483540 + 41.3349790 94.8504170 + 41.3329170 94.8525210 + 41.3308540 94.8545830 + 41.3204170 94.8608130 + 41.3204170 94.8775210 + 41.3183540 94.8795830 + 41.3141460 94.8795830 + 41.3120830 94.8816880 + 41.3099790 94.8837500 + 41.3079170 94.8858130 + 41.3079170 94.9025210 + 41.3058540 94.9045830 + 41.3016460 94.9045830 + 41.2995830 94.9066880 + 41.2974790 94.9087500 + 41.2954170 94.9108130 + 41.2954170 94.9233540 + 41.2974790 94.9254170 + 41.3058540 94.9254170 + 41.3079170 94.9274790 + 41.3079170 94.9441880 + 41.3058130 94.9462500 + 41.3037500 94.9483130 + 41.3037500 95.0025210 + 41.3016880 95.0045830 + 41.2974790 95.0045830 + 41.2954170 95.0066460 + 41.2954170 95.0441880 + 41.2933540 95.0462500 + 41.2849790 95.0462500 + 41.2829170 95.0483540 + 41.2808540 95.0504170 + 41.2683130 95.0504170 + 41.2662500 95.0525210 + 41.2641880 95.0545830 + 41.2599790 95.0545830 + 41.2579170 95.0566880 + 41.2558540 95.0587500 + 41.2474790 95.0587500 + 41.2454170 95.0608540 + 41.2433540 95.0629170 + 41.2099790 95.0629170 + 41.2079170 95.0608130 + 41.2058540 95.0587500 + 41.2016460 95.0587500 + 41.1995830 95.0608540 + 41.1974790 95.0629170 + 41.1954170 95.0629170 + 41.1912500 95.0816460 + 41.1912500 95.0858540 + 41.1891460 95.0879170 + 41.1870830 95.0900210 + 41.1850210 95.0920830 + 41.1558130 95.0920830 + 41.1516880 95.0962500 + 41.1433540 95.1004170 + 41.1308130 95.1004170 + 41.1287500 95.1025210 + 41.1266880 95.1045830 + 41.1224790 95.1045830 + 41.1204170 95.1066880 + 41.1183130 95.1087500 + 41.1162500 95.1108130 + 41.1162500 95.1191880 + 41.1141460 95.1212500 + 41.1120830 95.1233540 + 41.1100210 95.1254170 + 41.1058130 95.1254170 + 41.1037500 95.1275210 + 41.1016460 95.1295830 + 41.0995830 95.1316460 + 41.0995830 95.1358540 + 41.0974790 95.1379170 + 41.0954170 95.1358130 + 41.0933540 95.1337500 + 41.0891460 95.1337500 + 41.0870830 95.1316460 + 41.0849790 95.1295830 + 41.0829170 95.1316880 + 41.0808540 95.1337500 + 41.0641460 95.1337500 + 41.0620830 95.1358540 + 41.0600210 95.1379170 + 41.0474790 95.1379170 + 41.0454170 95.1400210 + 41.0433130 95.1420830 + 41.0412500 95.1441460 + 41.0412500 95.1525210 + 41.0391460 95.1545830 + 41.0370830 95.1566460 + 41.0370830 95.1608540 + 41.0349790 95.1629170 + 41.0329170 95.1650210 + 41.0329170 95.1670830 + 41.0412500 95.1691460 + 41.0412500 95.1733540 + 41.0454170 95.1774790 + 41.0412500 95.1858130 + 41.0412500 95.1941880 + 41.0370830 95.1983540 + 41.0349790 95.2004170 + 41.0120830 95.2233130 + 41.0120830 95.2358540 + 41.0099790 95.2379170 + 41.0079170 95.2400210 + 41.0099790 95.2420830 +REDI4 REDI4 -1 58 41.81000 94.71381 + 42.1200000 95.0200000 + 42.0500000 94.9500000 + 41.9300000 94.8200000 + 41.9000000 94.7500000 + 41.8300000 94.6700000 + 41.7700000 94.5300000 + 41.7300000 94.4400000 + 41.7000000 94.4400000 + 41.6500000 94.4300000 + 41.6000000 94.4000000 + 41.5900000 94.3200000 + 41.6000000 94.2500000 + 41.7200000 94.3000000 + 41.7000000 94.3500000 + 41.7500000 94.3700000 + 41.8200000 94.4100000 + 41.8400000 94.4900000 + 41.8600000 94.5100000 + 41.9700000 94.5100000 + 41.9200000 94.4600000 + 41.8400000 94.3400000 + 41.8100000 94.2900000 + 41.7800000 94.2400000 + 41.7500000 94.2200000 + 41.7300000 94.2100000 + 41.6600000 94.1800000 + 41.6300000 94.1500000 + 41.6100000 94.1400000 + 41.5800000 94.1800000 + 41.5400000 94.1900000 + 41.5300000 94.2200000 + 41.5100000 94.2300000 + 41.5000000 94.2600000 + 41.5200000 94.3800000 + 41.5300000 94.4700000 + 41.5300000 94.5100000 + 41.5700000 94.5500000 + 41.6200000 94.6500000 + 41.6300000 94.6700000 + 41.6500000 94.6700000 + 41.7000000 94.7200000 + 41.7700000 94.7500000 + 41.8000000 94.8000000 + 41.8700000 94.8300000 + 41.8800000 94.8700000 + 41.9200000 94.9000000 + 41.9200000 94.9500000 + 41.9200000 94.9800000 + 41.9500000 94.9800000 + 41.9500000 94.9700000 + 42.0000000 94.9800000 + 42.0000000 95.0000000 + 42.0300000 95.0200000 + 42.0300000 95.0300000 + 42.0500000 95.0300000 + 42.0700000 95.0200000 + 42.0800000 95.0200000 + 42.1200000 95.0200000 +SCRI4 SCRI4 -1 35 42.61500 95.01500 + 42.7700000 94.7600000 + 42.6900000 94.7700000 + 42.6500000 94.7600000 + 42.6200000 94.7300000 + 42.5300000 94.8000000 + 42.4300000 94.8500000 + 42.3800000 94.8900000 + 42.3700000 94.9400000 + 42.3000000 94.9800000 + 42.3800000 95.0300000 + 42.4500000 95.0500000 + 42.5000000 95.0800000 + 42.5200000 95.1000000 + 42.5800000 95.1300000 + 42.6000000 95.2000000 + 42.6300000 95.2800000 + 42.6500000 95.2800000 + 42.6800000 95.3000000 + 42.7200000 95.3000000 + 42.7200000 95.2800000 + 42.6800000 95.2700000 + 42.6800000 95.2200000 + 42.6500000 95.1500000 + 42.6000000 95.0800000 + 42.6200000 95.0200000 + 42.6300000 95.0200000 + 42.6800000 94.9700000 + 42.7700000 94.9200000 + 42.8000000 94.9100000 + 42.8700000 94.9200000 + 42.9300000 94.9500000 + 42.9200000 94.8800000 + 42.9000000 94.8500000 + 42.8700000 94.8000000 + 42.7700000 94.7600000 +SRBN1HW Pebble Creek near Scribner, NE -1 220 41.73917 96.86500 + 41.6537500 96.6795830 + 41.6266460 96.6837500 + 41.6183540 96.6754170 + 41.6099790 96.6754170 + 41.6079170 96.6775210 + 41.6058130 96.6795830 + 41.6037500 96.6816460 + 41.6037500 96.6858540 + 41.6016460 96.6879170 + 41.5995830 96.6900210 + 41.5870830 96.7024790 + 41.5870830 96.7191880 + 41.5891880 96.7212500 + 41.5912500 96.7233130 + 41.5912500 96.7358540 + 41.5891460 96.7379170 + 41.5870830 96.7399790 + 41.5870830 96.8025210 + 41.5891880 96.8045830 + 41.5912500 96.8066460 + 41.5912500 96.8150210 + 41.5933540 96.8170830 + 41.5954170 96.8191460 + 41.5954170 96.8316880 + 41.5975210 96.8337500 + 41.5995830 96.8358540 + 41.6016880 96.8379170 + 41.6037500 96.8399790 + 41.6037500 96.8525210 + 41.6058540 96.8545830 + 41.6079170 96.8566460 + 41.6079170 96.8608540 + 41.6100210 96.8629170 + 41.6120830 96.8649790 + 41.6120830 96.8775210 + 41.6141880 96.8795830 + 41.6162500 96.8816460 + 41.6162500 96.8858540 + 41.6183540 96.8879170 + 41.6204170 96.8899790 + 41.6204170 96.9025210 + 41.6225210 96.9045830 + 41.6245830 96.9066880 + 41.6266880 96.9087500 + 41.6287500 96.9108130 + 41.6287500 96.9150210 + 41.6308540 96.9170830 + 41.6329170 96.9191880 + 41.6349790 96.9212500 + 41.6433540 96.9212500 + 41.6454170 96.9191460 + 41.6474790 96.9170830 + 41.6516880 96.9170830 + 41.6537500 96.9191460 + 41.6537500 96.9275210 + 41.6558130 96.9295830 + 41.6766460 96.9337500 + 41.6891880 96.9337500 + 41.6912500 96.9358130 + 41.6912500 96.9400210 + 41.6933540 96.9420830 + 41.6954170 96.9441880 + 41.6974790 96.9462500 + 41.7058540 96.9462500 + 41.7079170 96.9483540 + 41.7099790 96.9504170 + 41.7183540 96.9504170 + 41.7204170 96.9524790 + 41.7204170 96.9566880 + 41.7225210 96.9587500 + 41.7245830 96.9608540 + 41.7266880 96.9629170 + 41.7287500 96.9650210 + 41.7308130 96.9670830 + 41.7391880 96.9670830 + 41.7412500 96.9691880 + 41.7433130 96.9712500 + 41.7516880 96.9712500 + 41.7537500 96.9733130 + 41.7537500 96.9775210 + 41.7558130 96.9795830 + 41.7683540 96.9795830 + 41.7704170 96.9816460 + 41.7704170 96.9858540 + 41.7724790 96.9879170 + 41.7766880 96.9879170 + 41.7787500 96.9900210 + 41.7808130 96.9920830 + 41.7933540 96.9920830 + 41.7954170 96.9941880 + 41.7975210 96.9962500 + 41.7995830 96.9983540 + 41.8016460 97.0004170 + 41.8058540 97.0004170 + 41.8079170 97.0025210 + 41.8099790 97.0045830 + 41.8183540 97.0045830 + 41.8204170 97.0066460 + 41.8204170 97.0108540 + 41.8225210 97.0129170 + 41.8245830 97.0150210 + 41.8266880 97.0170830 + 41.8287500 97.0191460 + 41.8349790 97.0295830 + 41.8391880 97.0295830 + 41.8412500 97.0316880 + 41.8433130 97.0337500 + 41.8516880 97.0337500 + 41.8537500 97.0337500 + 41.8537500 97.0233130 + 41.8558130 97.0212500 + 41.8579170 97.0191880 + 41.8579170 97.0149790 + 41.8599790 97.0129170 + 41.8620830 97.0149790 + 41.8641460 97.0170830 + 41.8725210 97.0170830 + 41.8745830 97.0150210 + 41.8745830 96.9858130 + 41.8766460 96.9837500 + 41.8808540 96.9837500 + 41.8829170 96.9816880 + 41.8849790 96.9795830 + 41.8870830 96.9775210 + 41.8850210 96.9754170 + 41.8829170 96.9733540 + 41.8829170 96.9566460 + 41.8808540 96.9545830 + 41.8787500 96.9525210 + 41.8808130 96.9504170 + 41.8829170 96.9483540 + 41.8829170 96.9399790 + 41.8849790 96.9379170 + 41.8870830 96.9358540 + 41.8891460 96.9337500 + 41.8912500 96.9316880 + 41.8912500 96.9274790 + 41.8891880 96.9254170 + 41.8870830 96.9233540 + 41.8870830 96.8983130 + 41.8850210 96.8962500 + 41.8829170 96.8858130 + 41.8808540 96.8837500 + 41.8787500 96.8816880 + 41.8787500 96.8774790 + 41.8829170 96.8649790 + 41.8829170 96.8629170 + 41.8808130 96.8629170 + 41.8787500 96.8608540 + 41.8766880 96.8587500 + 41.8724790 96.8587500 + 41.8704170 96.8566880 + 41.8683540 96.8545830 + 41.8662500 96.8525210 + 41.8641880 96.8504170 + 41.8620830 96.8483540 + 41.8600210 96.8462500 + 41.8579170 96.8441880 + 41.8558540 96.8420830 + 41.8537500 96.8400210 + 41.8516880 96.8379170 + 41.8433130 96.8379170 + 41.8412500 96.8358540 + 41.8391880 96.8337500 + 41.8349790 96.8337500 + 41.8329170 96.8316880 + 41.8308540 96.8295830 + 41.8287500 96.8275210 + 41.8266880 96.8254170 + 41.8245830 96.8233540 + 41.8225210 96.8212500 + 41.8204170 96.8191880 + 41.8183540 96.8170830 + 41.8162500 96.8191460 + 41.8141880 96.8212500 + 41.8099790 96.8212500 + 41.8079170 96.8191880 + 41.8058540 96.8170830 + 41.8037500 96.8150210 + 41.8037500 96.8108130 + 41.8016880 96.8087500 + 41.7995830 96.8066880 + 41.7975210 96.8045830 + 41.7933130 96.8045830 + 41.7912500 96.8025210 + 41.7912500 96.7983130 + 41.7891880 96.7962500 + 41.7766880 96.7879170 + 41.7641460 96.7879170 + 41.7620830 96.7858540 + 41.7620830 96.7816460 + 41.7600210 96.7795830 + 41.7516460 96.7795830 + 41.7495830 96.7775210 + 41.7475210 96.7754170 + 41.7454170 96.7733540 + 41.7454170 96.7649790 + 41.7433540 96.7629170 + 41.7412500 96.7608540 + 41.7391880 96.7587500 + 41.7308130 96.7587500 + 41.7287500 96.7566880 + 41.7266880 96.7545830 + 41.7245830 96.7525210 + 41.7225210 96.7504170 + 41.7183130 96.7504170 + 41.7162500 96.7483540 + 41.7141880 96.7462500 + 41.7099790 96.7462500 + 41.6995830 96.7316460 + 41.6954170 96.7275210 + 41.6933540 96.7254170 + 41.6891460 96.7254170 + 41.6870830 96.7233540 + 41.6850210 96.7212500 + 41.6829170 96.7191880 + 41.6808540 96.7170830 + 41.6787500 96.7150210 + 41.6787500 96.6899790 + 41.6537500 96.6795830 +WLBN1HW TURKEY CR. NR WILBUR NE -1 464 40.54333 97.24000 + 40.4787500 97.0170830 + 40.4704170 97.0316880 + 40.4662500 97.0358130 + 40.4662500 97.0400210 + 40.4683540 97.0420830 + 40.4745830 97.0483130 + 40.4745830 97.0566880 + 40.4766880 97.0587500 + 40.4787500 97.0608130 + 40.4787500 97.0816880 + 40.4766460 97.0837500 + 40.4745830 97.0858130 + 40.4745830 97.0900210 + 40.4766880 97.0920830 + 40.4787500 97.0941460 + 40.4787500 97.1025210 + 40.4808130 97.1045830 + 40.4850210 97.1045830 + 40.4870830 97.1066460 + 40.4870830 97.1150210 + 40.4891880 97.1170830 + 40.4912500 97.1191460 + 40.4912500 97.1316880 + 40.4933130 97.1337500 + 40.5016880 97.1337500 + 40.5037500 97.1358540 + 40.5058540 97.1379170 + 40.5079170 97.1400210 + 40.5141460 97.1462500 + 40.5183540 97.1462500 + 40.5204170 97.1483130 + 40.5204170 97.1650210 + 40.5183130 97.1670830 + 40.5162500 97.1691460 + 40.5162500 97.1858540 + 40.5141460 97.1879170 + 40.5120830 97.1900210 + 40.5141880 97.1920830 + 40.5162500 97.1941880 + 40.5183540 97.1962500 + 40.5204170 97.1983130 + 40.5204170 97.2025210 + 40.5225210 97.2045830 + 40.5245830 97.2066880 + 40.5266880 97.2087500 + 40.5287500 97.2108540 + 40.5308130 97.2129170 + 40.5391880 97.2129170 + 40.5412500 97.2149790 + 40.5412500 97.2275210 + 40.5433540 97.2295830 + 40.5454170 97.2316880 + 40.5433130 97.2337500 + 40.5412500 97.2358130 + 40.5412500 97.2441880 + 40.5433540 97.2462500 + 40.5454170 97.2483540 + 40.5475210 97.2504170 + 40.5495830 97.2524790 + 40.5495830 97.2691880 + 40.5474790 97.2712500 + 40.5454170 97.2733130 + 40.5454170 97.2983540 + 40.5433130 97.3004170 + 40.5412500 97.3025210 + 40.5391460 97.3045830 + 40.5370830 97.3066460 + 40.5370830 97.3108540 + 40.5349790 97.3129170 + 40.5329170 97.3149790 + 40.5329170 97.3233540 + 40.5308130 97.3254170 + 40.5287500 97.3275210 + 40.5266880 97.3295830 + 40.5224790 97.3295830 + 40.5204170 97.3316880 + 40.5183540 97.3337500 + 40.5141460 97.3337500 + 40.5120830 97.3358540 + 40.5100210 97.3379170 + 40.5058130 97.3379170 + 40.5037500 97.3400210 + 40.5016460 97.3420830 + 40.4995830 97.3441880 + 40.4975210 97.3462500 + 40.4933130 97.3462500 + 40.4912500 97.3483540 + 40.4891880 97.3504170 + 40.4849790 97.3504170 + 40.4829170 97.3525210 + 40.4808130 97.3545830 + 40.4787500 97.3545830 + 40.4745830 97.3608130 + 40.4745830 97.3858540 + 40.4724790 97.3879170 + 40.4704170 97.3900210 + 40.4683540 97.3920830 + 40.4641460 97.3920830 + 40.4620830 97.3941880 + 40.4599790 97.3962500 + 40.4579170 97.3983540 + 40.4558130 97.4004170 + 40.4495830 97.4066460 + 40.4495830 97.4275210 + 40.4474790 97.4295830 + 40.4454170 97.4316460 + 40.4454170 97.4400210 + 40.4433130 97.4420830 + 40.4412500 97.4441880 + 40.4391460 97.4462500 + 40.4370830 97.4483130 + 40.4370830 97.4525210 + 40.4349790 97.4545830 + 40.4329170 97.4566460 + 40.4329170 97.4608540 + 40.4308540 97.4629170 + 40.4266460 97.4629170 + 40.4224790 97.4670830 + 40.4204170 97.4670830 + 40.4245830 97.5024790 + 40.4245830 97.5233540 + 40.4266880 97.5254170 + 40.4287500 97.5274790 + 40.4287500 97.5608540 + 40.4266460 97.5629170 + 40.4245830 97.5649790 + 40.4245830 97.5691880 + 40.4266880 97.5712500 + 40.4287500 97.5733130 + 40.4287500 97.5858540 + 40.4308540 97.5879170 + 40.4329170 97.5899790 + 40.4329170 97.6025210 + 40.4349790 97.6045830 + 40.4391880 97.6045830 + 40.4412500 97.6066880 + 40.4433540 97.6087500 + 40.4454170 97.6108130 + 40.4454170 97.6150210 + 40.4495830 97.6191460 + 40.4495830 97.6233540 + 40.4516460 97.6254170 + 40.4620830 97.6275210 + 40.4599790 97.6295830 + 40.4579170 97.6316460 + 40.4579170 97.6441880 + 40.4558130 97.6462500 + 40.4537500 97.6483130 + 40.4537500 97.6566880 + 40.4495830 97.6650210 + 40.4474790 97.6670830 + 40.4454170 97.6691460 + 40.4454170 97.6858540 + 40.4475210 97.6879170 + 40.4495830 97.6899790 + 40.4495830 97.6941880 + 40.4516460 97.6962500 + 40.4600210 97.6962500 + 40.4620830 97.6983130 + 40.4620830 97.7108540 + 40.4641880 97.7129170 + 40.4662500 97.7149790 + 40.4662500 97.7233540 + 40.4641460 97.7254170 + 40.4620830 97.7274790 + 40.4620830 97.7358540 + 40.4641880 97.7379170 + 40.4662500 97.7399790 + 40.4662500 97.7733540 + 40.4641460 97.7754170 + 40.4620830 97.7774790 + 40.4620830 97.7858540 + 40.4599790 97.7879170 + 40.4579170 97.7899790 + 40.4579170 97.7983540 + 40.4558130 97.8004170 + 40.4537500 97.8004170 + 40.4537500 97.8066880 + 40.4558130 97.8087500 + 40.4579170 97.8108130 + 40.4599790 97.8129170 + 40.4620830 97.8149790 + 40.4641460 97.8170830 + 40.4683540 97.8170830 + 40.4704170 97.8191460 + 40.4704170 97.8525210 + 40.4683540 97.8545830 + 40.4662500 97.8566460 + 40.4662500 97.8650210 + 40.4683130 97.8670830 + 40.4704170 97.8691460 + 40.4724790 97.8712500 + 40.4745830 97.8733130 + 40.4766460 97.8754170 + 40.4787500 97.8774790 + 40.4808130 97.8795830 + 40.5058540 97.8795830 + 40.5079170 97.8816460 + 40.5079170 97.8941880 + 40.5099790 97.8962500 + 40.5120830 97.8983130 + 40.5120830 97.9025210 + 40.5141460 97.9045830 + 40.5162500 97.9066460 + 40.5183130 97.9087500 + 40.5204170 97.9108130 + 40.5224790 97.9129170 + 40.5308540 97.9129170 + 40.5329170 97.9149790 + 40.5349790 97.9170830 + 40.5370830 97.9191460 + 40.5391460 97.9212500 + 40.5412500 97.9191880 + 40.5433130 97.9170830 + 40.5475210 97.9170830 + 40.5495830 97.9150210 + 40.5495830 97.8941460 + 40.5516460 97.8920830 + 40.5537500 97.8900210 + 40.5537500 97.8858130 + 40.5558130 97.8837500 + 40.5579170 97.8816880 + 40.5599790 97.8795830 + 40.5620830 97.8775210 + 40.5620830 97.8649790 + 40.5641460 97.8629170 + 40.5662500 97.8608540 + 40.5662500 97.8483130 + 40.5683130 97.8462500 + 40.5704170 97.8441880 + 40.5724790 97.8420830 + 40.5745830 97.8400210 + 40.5745830 97.8358130 + 40.5766460 97.8337500 + 40.5787500 97.8316880 + 40.5787500 97.8108130 + 40.5808130 97.8087500 + 40.5829170 97.8066880 + 40.5849790 97.8045830 + 40.5870830 97.8025210 + 40.5870830 97.7983130 + 40.5891460 97.7962500 + 40.5912500 97.7941880 + 40.5933130 97.7920830 + 40.5954170 97.7900210 + 40.5974790 97.7879170 + 40.5995830 97.7858540 + 40.6016460 97.7837500 + 40.6079170 97.7775210 + 40.6079170 97.7733130 + 40.6058540 97.7712500 + 40.6016460 97.7712500 + 40.5995830 97.7691880 + 40.5995830 97.7524790 + 40.6100210 97.7462500 + 40.6120830 97.7441880 + 40.6120830 97.7399790 + 40.6141460 97.7379170 + 40.6162500 97.7358540 + 40.6183130 97.7337500 + 40.6204170 97.7316880 + 40.6204170 97.7149790 + 40.6224790 97.7129170 + 40.6245830 97.7108540 + 40.6245830 97.7066460 + 40.6287500 97.6691460 + 40.6287500 97.6670830 + 40.6141460 97.6670830 + 40.6120830 97.6650210 + 40.6100210 97.6629170 + 40.6079170 97.6608540 + 40.6058540 97.6587500 + 40.6037500 97.6566880 + 40.6016880 97.6545830 + 40.5995830 97.6525210 + 40.5995830 97.6483130 + 40.5975210 97.6462500 + 40.5954170 97.6441880 + 40.5954170 97.6399790 + 40.5933540 97.6379170 + 40.5912500 97.6358540 + 40.5891880 97.6337500 + 40.5870830 97.6316880 + 40.5870830 97.6191460 + 40.5891460 97.6170830 + 40.5912500 97.6150210 + 40.5933130 97.6129170 + 40.5954170 97.6066460 + 40.5974790 97.6045830 + 40.5995830 97.6025210 + 40.5975210 97.6004170 + 40.5954170 97.5983540 + 40.5954170 97.5816460 + 40.5974790 97.5795830 + 40.5995830 97.5775210 + 40.5995830 97.5608130 + 40.6016460 97.5587500 + 40.6037500 97.5566880 + 40.6037500 97.5524790 + 40.6058130 97.5504170 + 40.6100210 97.5504170 + 40.6120830 97.5483540 + 40.6141460 97.5462500 + 40.6162500 97.5441880 + 40.6162500 97.5399790 + 40.6183130 97.5379170 + 40.6204170 97.5358540 + 40.6204170 97.5274790 + 40.6183540 97.5254170 + 40.6162500 97.5233540 + 40.6162500 97.5149790 + 40.6183130 97.5129170 + 40.6204170 97.5108540 + 40.6224790 97.5087500 + 40.6245830 97.5066880 + 40.6266460 97.5045830 + 40.6287500 97.5025210 + 40.6287500 97.4858130 + 40.6308130 97.4837500 + 40.6329170 97.4816880 + 40.6308540 97.4795830 + 40.6287500 97.4775210 + 40.6287500 97.4691460 + 40.6266880 97.4670830 + 40.6245830 97.4650210 + 40.6245830 97.4608130 + 40.6225210 97.4587500 + 40.6204170 97.4566880 + 40.6183540 97.4545830 + 40.6162500 97.4525210 + 40.6141880 97.4504170 + 40.6120830 97.4483540 + 40.6120830 97.4358130 + 40.6100210 97.4337500 + 40.6079170 97.4316880 + 40.6099790 97.4295830 + 40.6120830 97.4275210 + 40.6120830 97.4191460 + 40.6100210 97.4170830 + 40.6079170 97.4150210 + 40.6079170 97.4108130 + 40.6099790 97.4087500 + 40.6120830 97.4024790 + 40.6141460 97.4004170 + 40.6162500 97.3983540 + 40.6141880 97.3962500 + 40.6120830 97.3941880 + 40.6120830 97.3774790 + 40.6141460 97.3754170 + 40.6183540 97.3754170 + 40.6204170 97.3733540 + 40.6224790 97.3712500 + 40.6245830 97.3691880 + 40.6266460 97.3670830 + 40.6287500 97.3650210 + 40.6287500 97.3608130 + 40.6308130 97.3587500 + 40.6329170 97.3566880 + 40.6329170 97.3483130 + 40.6349790 97.3462500 + 40.6370830 97.3441880 + 40.6391460 97.3420830 + 40.6412500 97.3400210 + 40.6412500 97.3358130 + 40.6433130 97.3337500 + 40.6454170 97.3316880 + 40.6454170 97.3149790 + 40.6433540 97.3129170 + 40.6412500 97.3108540 + 40.6433130 97.3087500 + 40.6454170 97.3066880 + 40.6454170 97.3024790 + 40.6474790 97.3004170 + 40.6495830 97.2983540 + 40.6516460 97.2962500 + 40.6558540 97.2962500 + 40.6579170 97.2941880 + 40.6599790 97.2920830 + 40.6641880 97.2920830 + 40.6662500 97.2900210 + 40.6662500 97.2691460 + 40.6641880 97.2670830 + 40.6599790 97.2670830 + 40.6579170 97.2650210 + 40.6579170 97.2608130 + 40.6558540 97.2587500 + 40.6537500 97.2566880 + 40.6537500 97.2441460 + 40.6558130 97.2420830 + 40.6579170 97.2400210 + 40.6579170 97.2274790 + 40.6599790 97.2254170 + 40.6620830 97.2233540 + 40.6600210 97.2212500 + 40.6579170 97.2191880 + 40.6579170 97.2024790 + 40.6558540 97.2004170 + 40.6537500 97.1983540 + 40.6558130 97.1962500 + 40.6579170 97.1941880 + 40.6579170 97.1858130 + 40.6620830 97.1774790 + 40.6620830 97.1754170 + 40.6599790 97.1754170 + 40.6579170 97.1733540 + 40.6558540 97.1712500 + 40.6537500 97.1691880 + 40.6516880 97.1670830 + 40.6495830 97.1650210 + 40.6495830 97.1608130 + 40.6475210 97.1587500 + 40.6454170 97.1566880 + 40.6433540 97.1545830 + 40.6329170 97.1483540 + 40.6329170 97.1274790 + 40.6308540 97.1254170 + 40.6287500 97.1233540 + 40.6287500 97.1024790 + 40.6266880 97.1004170 + 40.6245830 97.0983540 + 40.6245830 97.0816460 + 40.6225210 97.0795830 + 40.6204170 97.0775210 + 40.6204170 97.0733130 + 40.6183540 97.0712500 + 40.6162500 97.0691880 + 40.6141880 97.0670830 + 40.6120830 97.0650210 + 40.6100210 97.0629170 + 40.6079170 97.0608540 + 40.6079170 97.0566460 + 40.6058540 97.0545830 + 40.5933130 97.0545830 + 40.5912500 97.0525210 + 40.5891880 97.0504170 + 40.5870830 97.0483540 + 40.5870830 97.0399790 + 40.5745830 97.0275210 + 40.5745830 97.0233130 + 40.5725210 97.0212500 + 40.5704170 97.0191880 + 40.5704170 97.0066460 + 40.5683540 97.0045830 + 40.5662500 97.0025210 + 40.5641880 97.0004170 + 40.5558130 97.0004170 + 40.5537500 97.0024790 + 40.5516880 97.0045830 + 40.5370830 97.0025210 + 40.5329170 96.9983540 + 40.5308540 96.9962500 + 40.5120830 96.9941880 + 40.5100210 96.9920830 + 40.5079170 96.9941460 + 40.5058540 96.9962500 + 40.4974790 96.9920830 + 40.4954170 96.9920830 + 40.4933540 97.0004170 + 40.4891460 97.0004170 + 40.4829170 97.0066460 + 40.4829170 97.0108540 + 40.4808130 97.0129170 + 40.4787500 97.0149790 + 40.4787500 97.0170830 +WOON1HW WAHOO CREEK AT WAHOO, NE -1 171 41.23083 96.76083 + 41.1975210 96.6212500 + 41.1787500 96.6441880 + 41.1766880 96.6462500 + 41.1641880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3329170 96.8920830 + 41.3329170 96.8899790 + 41.3349790 96.8879170 + 41.3370830 96.8858540 + 41.3370830 96.8816460 + 41.3391460 96.8795830 + 41.3433540 96.8795830 + 41.3454170 96.8775210 + 41.3474790 96.8754170 + 41.3495830 96.8733540 + 41.3495830 96.8399790 + 41.3475210 96.8379170 + 41.3454170 96.8358540 + 41.3454170 96.8316460 + 41.3433540 96.8295830 + 41.3412500 96.8275210 + 41.3412500 96.8149790 + 41.3391880 96.8129170 + 41.3349790 96.8129170 + 41.3329170 96.8108540 + 41.3308540 96.8087500 + 41.3287500 96.8066880 + 41.3266880 96.8045830 + 41.3245830 96.8025210 + 41.3225210 96.8004170 + 41.3183130 96.8004170 + 41.3162500 96.7983540 + 41.3141880 96.7962500 + 41.3120830 96.7941880 + 41.3100210 96.7920830 + 41.3079170 96.7900210 + 41.3079170 96.7816460 + 41.3058540 96.7795830 + 41.3037500 96.7775210 + 41.3037500 96.7733130 + 41.3016880 96.7712500 + 41.2995830 96.7691880 + 41.2995830 96.7649790 + 41.2975210 96.7629170 + 41.2954170 96.7608540 + 41.2974790 96.7587500 + 41.3016880 96.7587500 + 41.3037500 96.7566880 + 41.3037500 96.7358130 + 41.3016880 96.7337500 + 41.2995830 96.7316880 + 41.2975210 96.7295830 + 41.2954170 96.7275210 + 41.2974790 96.7254170 + 41.2995830 96.7233540 + 41.2995830 96.7024790 + 41.2975210 96.7004170 + 41.2954170 96.6983540 + 41.2954170 96.6858130 + 41.2933540 96.6837500 + 41.2891460 96.6837500 + 41.2870830 96.6816880 + 41.2870830 96.6733130 + 41.2850210 96.6712500 + 41.2829170 96.6691880 + 41.2808540 96.6670830 + 41.2787500 96.6650210 + 41.2787500 96.6566460 + 41.2766880 96.6545830 + 41.2724790 96.6545830 + 41.2704170 96.6525210 + 41.2683540 96.6504170 + 41.2662500 96.6483540 + 41.2641880 96.6462500 + 41.2620830 96.6441880 + 41.2600210 96.6420830 + 41.2579170 96.6400210 + 41.2579170 96.6358130 + 41.2558540 96.6337500 + 41.2537500 96.6316880 + 41.2516880 96.6295830 + 41.2474790 96.6295830 + 41.2454170 96.6275210 + 41.2433540 96.6254170 + 41.2412500 96.6274790 + 41.2391880 96.6295830 + 41.2308130 96.6295830 + 41.2287500 96.6275210 + 41.2266880 96.6254170 + 41.2183130 96.6254170 + 41.2162500 96.6233540 + 41.2141880 96.6212500 + 41.2120830 96.6191880 + 41.2100210 96.6170830 + 41.2079170 96.6150210 + 41.2058540 96.6129170 + 41.1975210 96.6212500 +1850 BIG PAPILLION CREEK AT FORT STREET, NE -1 193 41.44333 96.21917 + 41.3016460 96.1087500 + 41.3037500 96.1316880 + 41.2995830 96.1358130 + 41.2995830 96.1400210 + 41.2954170 96.1441460 + 41.2954170 96.1483540 + 41.2933130 96.1504170 + 41.2912500 96.1524790 + 41.2912500 96.1608540 + 41.2933540 96.1629170 + 41.2974790 96.1670830 + 41.3100210 96.1670830 + 41.3120830 96.1691460 + 41.3120830 96.1733540 + 41.3141460 96.1754170 + 41.3391460 96.1962500 + 41.3475210 96.1962500 + 41.3495830 96.1983540 + 41.3516880 96.2004170 + 41.3537500 96.2024790 + 41.3537500 96.2150210 + 41.3558540 96.2170830 + 41.3579170 96.2191460 + 41.3579170 96.2233540 + 41.3600210 96.2254170 + 41.3620830 96.2274790 + 41.3620830 96.2316880 + 41.3641880 96.2337500 + 41.3662500 96.2358130 + 41.3662500 96.2608540 + 41.3641460 96.2629170 + 41.3620830 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4370830 96.2941460 + 41.4391460 96.2962500 + 41.4412500 96.2983130 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4579170 96.3108130 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4183130 96.1212500 + 41.4162500 96.1233130 + 41.4141880 96.1254170 + 41.4120830 96.1274790 + 41.4100210 96.1295830 + 41.4016460 96.1295830 + 41.3995830 96.1275210 + 41.3975210 96.1254170 + 41.3891460 96.1254170 + 41.3870830 96.1233540 + 41.3850210 96.1212500 + 41.3829170 96.1191880 + 41.3808540 96.1170830 + 41.3766460 96.1170830 + 41.3745830 96.1150210 + 41.3725210 96.1129170 + 41.3683130 96.1129170 + 41.3662500 96.1108540 + 41.3641880 96.1087500 + 41.3558130 96.1087500 + 41.3537500 96.1066880 + 41.3516880 96.1045830 + 41.3495830 96.1025210 + 41.3475210 96.1004170 + 41.3433130 96.1004170 + 41.3225210 96.0795830 + 41.3141460 96.0795830 + 41.3120830 96.0774790 + 41.3120830 96.0754170 + 41.2995830 96.0774790 + 41.2995830 96.0858540 + 41.3037500 96.0899790 + 41.3037500 96.1025210 + 41.3016460 96.1045830 + 41.2995830 96.1066880 + 41.3016460 96.1087500 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/topography b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/topography new file mode 100644 index 0000000000..2bf36ac507 --- /dev/null +++ b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/geo/topography @@ -0,0 +1,2 @@ +44.000000 99.000000 5.000000 5.000000 0.500000 0.500000 + 50 51 51 49 48 48 49 50 51 51 51 50 51 51 52 52 52 52 52 52 52 52 53 53 54 54 54 54 54 54 53 52 53 54 54 54 54 54 55 55 55 55 55 56 56 56 57 56 56 54 52 51 51 49 48 47 46 45 45 44 44 43 42 41 42 42 42 42 42 41 41 41 41 41 41 41 40 40 41 41 41 41 41 40 40 41 40 40 40 40 40 40 40 40 39 38 38 38 39 39 39 39 39 39 39 39 38 38 37 36 37 39 39 39 39 39 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 40 40 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 42 42 43 43 43 44 44 44 45 45 45 46 46 46 46 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 50 51 51 51 51 51 51 52 51 51 50 51 52 52 52 52 53 53 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 52 52 51 51 51 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 52 51 51 51 52 51 50 50 50 50 49 49 49 48 48 47 46 46 46 46 46 46 47 49 49 50 50 50 50 50 50 50 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 50 51 51 51 51 52 53 53 52 52 52 53 53 54 54 54 54 53 53 53 52 52 51 51 51 52 52 52 53 53 54 54 53 54 54 55 55 55 55 55 55 55 54 53 52 52 52 52 52 52 52 51 51 51 50 50 50 50 51 52 52 52 52 51 51 51 51 50 49 49 48 48 48 48 48 48 48 48 47 47 47 48 48 48 48 48 48 48 48 47 47 46 46 45 45 45 45 45 46 46 46 46 46 47 46 44 43 44 45 45 45 44 44 44 44 44 44 43 44 44 44 44 44 44 44 45 45 45 45 45 44 44 45 45 46 45 44 45 46 47 47 46 45 45 44 43 43 43 43 42 43 42 42 42 42 41 41 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 30 30 29 29 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 29 29 29 29 29 29 30 30 30 50 50 50 49 48 49 50 50 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 53 53 54 54 53 53 52 52 53 54 54 53 53 54 55 55 55 55 55 55 56 57 57 55 54 52 51 51 50 48 47 46 46 45 45 44 44 43 43 41 42 43 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 39 39 39 39 39 39 39 39 39 39 38 38 37 37 38 39 39 39 39 39 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 43 42 42 42 43 43 43 43 44 44 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 52 51 51 50 50 51 53 54 54 54 54 54 55 55 54 54 54 53 53 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 52 51 51 50 50 49 49 49 48 47 46 46 46 46 46 46 46 47 48 48 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 49 49 49 49 49 50 50 50 51 51 51 52 52 52 53 52 52 52 53 53 54 54 54 54 54 53 53 52 52 51 50 50 51 51 51 52 52 53 53 53 53 54 55 55 54 54 54 55 55 55 54 53 52 52 52 52 52 52 51 51 50 50 50 51 51 51 52 53 53 52 52 51 51 51 51 50 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 48 47 47 47 46 46 46 45 44 45 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 44 45 45 46 45 44 43 44 46 46 46 46 45 44 44 44 44 43 43 43 43 43 43 43 43 42 42 41 40 40 40 40 41 41 41 40 39 39 39 39 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 34 34 34 33 33 33 34 34 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 32 32 32 32 32 32 32 31 31 31 30 30 30 30 30 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 48 49 49 48 48 49 50 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 53 54 53 53 53 54 54 54 54 54 54 55 56 57 56 54 52 51 51 51 50 48 47 46 46 45 45 44 44 44 43 42 41 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 37 37 37 37 38 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 43 42 42 42 43 43 43 43 44 44 45 45 45 46 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 52 51 51 50 50 50 53 54 54 54 55 55 55 55 55 55 55 54 53 52 51 51 51 51 52 52 52 52 51 51 50 49 49 49 48 48 48 49 50 50 51 51 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 51 50 50 50 51 51 51 51 51 52 51 51 50 50 50 49 49 48 46 46 46 46 47 47 47 48 48 48 48 49 49 48 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 50 50 51 51 51 52 52 52 52 52 53 53 53 53 53 53 54 54 54 53 53 53 52 52 52 51 50 50 51 51 51 52 52 52 52 52 53 54 54 55 54 54 54 54 55 56 55 54 53 52 52 51 51 51 51 51 50 50 50 51 51 51 52 53 53 53 52 52 52 52 51 50 49 49 49 48 48 47 47 48 47 47 47 46 46 46 47 47 47 48 48 48 47 47 46 46 45 45 45 44 44 44 45 45 46 45 45 44 45 46 45 45 45 45 45 44 44 44 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 44 43 44 45 45 46 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 36 36 37 37 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 32 32 32 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 29 29 29 29 30 30 30 29 29 30 29 29 30 30 30 30 31 48 48 48 48 48 49 50 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 52 52 52 52 53 52 52 53 53 54 54 55 55 55 56 56 56 54 52 51 50 51 51 49 48 47 46 46 45 45 45 44 44 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 37 37 38 38 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 43 42 42 43 44 44 44 44 45 45 46 46 46 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 51 51 51 51 50 50 50 52 53 54 54 54 54 54 54 54 54 53 53 52 52 51 51 51 52 53 53 52 52 51 50 49 48 48 48 48 48 48 48 49 49 50 51 51 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 52 52 51 50 50 49 49 49 49 48 46 46 46 47 47 48 48 49 49 49 49 49 49 48 49 50 50 49 49 49 50 49 49 49 49 49 49 49 48 48 48 48 49 49 49 50 50 50 50 51 51 52 52 52 52 52 52 53 53 53 53 53 53 53 54 53 53 53 53 52 52 52 52 51 50 51 51 51 51 51 51 51 52 52 53 54 55 54 53 53 53 54 55 55 54 54 53 52 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 52 52 51 51 50 49 48 48 48 47 46 46 47 46 46 46 46 46 46 46 47 47 48 48 48 47 47 46 46 46 45 45 45 44 44 44 44 45 44 44 44 45 45 46 46 46 46 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 45 44 43 43 44 44 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 40 40 40 40 40 39 39 38 39 40 39 39 38 38 38 37 37 37 36 36 37 37 37 36 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 33 33 32 32 32 32 32 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 32 31 31 31 31 31 32 31 31 31 31 31 31 31 32 31 31 31 31 31 31 31 30 30 31 30 30 30 29 29 29 30 30 30 30 29 29 30 30 30 30 30 30 30 31 49 49 49 49 49 50 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 52 53 53 54 55 55 55 55 56 55 54 52 51 50 51 51 50 49 48 48 47 46 45 45 45 44 44 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 37 37 38 38 38 38 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 43 43 44 44 44 44 44 45 45 45 45 46 46 46 46 47 47 47 47 47 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 51 52 52 51 51 50 49 51 52 53 53 54 54 54 54 54 53 53 53 53 52 52 52 52 52 53 53 53 52 51 51 50 49 49 49 49 48 48 48 48 48 49 49 50 51 51 51 51 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 51 50 49 49 49 49 49 47 46 46 46 47 48 48 48 49 49 49 49 49 49 48 48 49 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 50 50 50 50 50 51 51 51 52 52 52 52 52 52 53 53 53 53 53 53 53 54 53 53 53 52 52 51 51 52 51 50 50 50 51 51 51 51 51 52 53 53 53 54 54 53 52 53 53 54 55 55 55 54 53 52 51 51 51 51 52 52 52 51 51 52 52 53 53 53 52 52 52 51 50 50 49 48 48 47 47 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 48 47 47 47 46 46 46 45 45 44 44 44 44 44 44 44 45 45 46 46 46 46 46 45 45 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 44 44 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 40 41 41 41 40 40 39 38 39 40 40 39 38 38 38 38 37 37 37 37 37 37 37 37 36 36 35 35 35 35 34 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 30 30 30 30 30 29 30 29 29 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 50 50 50 50 51 51 52 51 51 51 51 51 51 50 50 50 50 51 51 51 52 52 51 51 52 52 53 53 53 53 53 52 52 53 53 53 53 54 54 54 54 55 54 54 53 52 51 50 50 51 51 50 49 48 47 46 46 45 45 45 44 44 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 37 37 37 38 38 38 38 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 43 43 44 44 44 44 44 44 45 45 45 46 46 46 46 47 47 46 46 47 48 48 48 48 49 49 49 49 49 49 50 50 50 50 51 51 51 52 52 51 51 50 49 50 51 52 53 53 54 54 54 54 54 54 54 53 53 52 52 53 53 53 54 54 54 53 52 51 51 50 49 49 49 49 48 48 48 48 48 49 50 50 51 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 50 50 49 49 50 50 51 51 50 50 49 48 48 48 48 47 46 46 46 47 48 48 48 49 49 49 49 49 48 48 49 49 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 50 50 50 51 51 52 52 51 51 51 52 52 53 53 53 53 54 54 54 54 53 53 52 52 51 51 51 51 51 50 49 50 50 50 50 51 52 52 52 52 53 53 54 53 52 52 52 53 54 54 55 54 54 53 52 51 51 51 51 52 52 52 52 52 52 53 53 52 52 51 51 51 50 50 49 49 48 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 45 45 44 44 44 44 44 45 45 45 46 45 45 45 45 45 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 44 45 45 45 44 43 44 44 44 43 43 43 43 43 44 44 43 43 43 43 43 42 42 41 41 40 40 40 39 39 39 38 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 34 34 34 33 33 32 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 30 30 30 29 29 29 29 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 51 51 51 51 51 51 51 51 51 51 51 51 50 49 49 49 50 50 50 51 53 53 52 53 54 54 55 55 56 55 54 54 54 54 54 54 54 54 54 54 54 54 53 52 51 51 50 50 51 51 51 49 48 48 47 46 46 45 45 45 44 44 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 37 37 37 37 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 44 44 44 44 44 44 45 45 45 46 46 46 46 46 47 46 46 47 48 48 48 48 48 48 49 49 49 49 49 49 49 50 51 51 51 51 51 51 50 49 48 49 50 51 52 53 53 53 54 54 54 54 54 54 53 53 53 53 54 54 54 54 54 54 53 53 52 51 50 49 49 48 48 48 48 48 48 48 49 50 50 50 50 50 51 51 51 51 51 51 52 51 51 51 52 51 51 50 49 49 49 50 51 51 50 49 49 48 47 48 48 47 46 46 46 46 47 48 48 48 49 49 49 48 48 48 49 49 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 51 51 51 51 51 52 52 53 53 53 53 54 54 54 53 53 52 52 51 51 51 51 51 50 49 49 49 49 50 51 51 51 51 52 53 53 54 53 52 52 52 53 54 54 55 55 55 55 53 51 51 51 51 51 51 52 52 52 52 52 52 52 51 51 50 50 50 50 49 48 47 47 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 44 44 44 45 45 45 44 44 44 44 45 45 45 45 44 44 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 42 43 44 45 45 45 44 44 44 44 44 43 43 43 43 43 44 44 43 43 43 43 43 43 42 42 41 41 40 40 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 37 36 36 35 35 34 34 34 34 34 33 34 33 33 33 32 33 33 33 33 33 33 33 33 32 32 32 32 32 32 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 31 31 31 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 51 51 51 51 51 51 51 51 51 51 51 50 49 48 49 49 49 50 51 51 52 53 54 54 55 55 56 57 57 56 55 55 55 54 54 54 54 54 54 53 53 52 51 51 50 50 50 51 51 50 50 49 48 48 47 46 46 45 45 45 44 44 43 42 42 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 41 40 40 40 40 40 39 39 39 39 40 40 40 39 39 39 39 39 39 39 39 39 39 39 40 40 40 39 38 38 39 39 39 38 37 37 37 37 38 38 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 44 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 48 48 48 49 49 49 49 50 50 51 51 51 51 51 50 48 48 48 49 50 51 52 52 53 53 54 54 54 54 54 54 54 54 54 54 54 54 55 54 54 54 54 53 53 52 50 49 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 51 51 51 51 51 51 52 52 52 51 51 51 50 50 50 50 50 50 49 48 48 47 47 47 47 46 46 46 46 46 47 48 48 48 48 49 49 48 47 48 49 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 51 51 51 51 51 52 52 52 53 53 53 54 54 53 53 52 52 52 51 50 50 50 50 50 49 49 49 49 50 50 51 51 51 52 52 53 53 53 52 51 51 52 54 54 54 55 55 55 54 52 51 51 51 51 51 51 51 52 52 52 52 51 51 51 50 50 50 49 49 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 45 45 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 44 44 44 44 45 45 45 45 45 44 44 44 44 44 44 44 42 42 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 44 44 43 43 43 42 42 43 43 42 42 41 41 40 40 40 39 40 40 39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 35 34 34 34 34 33 33 34 34 34 34 33 33 34 33 33 33 33 33 33 33 33 32 32 32 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 31 31 31 32 32 31 31 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 31 31 31 30 30 29 29 30 30 30 30 30 30 30 51 52 51 51 51 51 51 51 51 50 50 49 48 48 48 49 50 51 52 52 53 54 54 54 55 57 58 58 58 57 56 55 55 54 53 53 53 53 52 52 51 51 51 50 50 50 50 51 51 50 49 48 48 47 47 46 46 45 45 44 44 43 43 42 42 42 43 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 41 41 40 40 40 40 39 39 39 39 40 40 40 39 39 39 39 39 39 39 39 40 40 40 40 40 40 39 38 38 39 39 39 38 38 38 38 37 37 37 38 39 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 41 42 41 42 43 43 43 44 44 44 44 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 48 48 49 49 49 49 49 50 51 51 50 50 50 50 49 48 48 48 49 50 51 52 52 53 53 54 54 54 54 54 54 54 54 54 54 54 55 55 55 54 54 53 53 52 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 51 51 51 51 52 52 52 52 51 51 50 49 49 49 48 48 48 47 47 46 46 46 45 45 45 46 47 47 48 48 48 48 48 47 47 48 49 49 49 48 48 48 49 49 49 48 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 50 50 51 51 51 51 52 52 52 52 53 54 53 53 53 53 52 52 52 51 50 50 49 49 49 49 49 49 49 49 50 50 50 51 51 52 52 52 52 52 51 50 52 53 53 52 52 52 52 52 51 51 52 52 51 51 51 51 51 51 52 52 51 51 51 50 50 50 49 49 49 49 48 48 48 47 47 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 46 45 45 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 43 42 42 43 42 43 43 43 43 43 43 44 44 44 44 44 43 43 44 44 44 43 42 42 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 35 35 34 34 34 34 34 34 34 34 34 34 34 33 34 34 34 34 34 34 33 33 33 33 34 34 34 34 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 31 31 30 30 30 31 31 31 31 31 31 31 30 30 30 30 30 31 30 30 30 30 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 50 51 52 52 53 54 54 55 55 56 57 58 58 59 58 57 56 55 54 53 52 51 51 51 51 50 50 50 49 49 50 51 51 50 49 48 48 47 47 46 46 46 45 45 44 44 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 39 39 39 39 39 39 39 40 40 40 40 40 40 40 39 38 38 39 39 39 39 39 39 39 38 37 36 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 42 43 43 44 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 48 49 49 49 49 49 50 50 51 50 50 50 50 49 48 48 48 49 50 51 51 52 52 53 53 54 54 54 54 54 54 54 55 55 54 54 54 54 54 53 53 52 51 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 50 51 51 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 48 47 46 46 45 45 45 45 46 47 47 47 47 47 47 47 47 48 49 49 48 48 48 48 49 49 49 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 50 50 50 51 51 51 52 52 52 52 53 53 53 53 53 53 53 52 52 52 51 51 51 50 49 49 49 48 48 48 49 50 50 50 51 52 52 51 51 52 51 50 50 50 51 51 51 52 52 52 52 52 52 51 52 52 52 51 51 51 51 52 52 52 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 47 46 46 46 46 45 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 43 43 43 44 43 43 43 43 43 43 43 43 44 43 42 42 43 43 43 42 42 43 43 43 43 44 43 43 43 43 43 43 44 44 44 42 42 42 42 42 42 42 43 42 42 42 41 41 41 41 41 40 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 31 31 31 31 30 30 31 30 30 30 30 30 30 31 31 31 31 31 31 31 32 32 32 32 31 30 30 30 30 30 30 30 30 30 30 51 50 50 50 50 49 50 49 48 47 48 48 48 48 49 50 51 52 52 53 54 54 55 56 56 57 58 58 59 59 58 56 54 54 52 51 51 51 51 50 50 49 49 49 49 50 51 50 50 49 48 48 47 46 46 46 46 45 45 44 44 43 43 43 43 43 42 42 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 39 38 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 42 43 43 44 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 49 49 49 49 49 50 50 51 50 50 50 49 49 48 48 48 49 50 50 51 51 52 53 54 54 55 55 55 54 54 54 55 54 54 54 54 53 53 52 52 51 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 50 50 51 51 51 51 51 51 51 50 50 49 48 48 48 48 49 49 48 48 47 46 46 45 45 45 45 46 46 46 46 46 47 47 47 48 49 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 50 50 51 51 52 51 50 49 50 50 51 51 51 52 52 52 53 53 53 52 52 52 52 52 52 52 52 52 52 51 50 49 48 48 48 48 49 49 49 50 50 51 52 51 50 50 50 49 49 49 50 50 51 52 54 54 54 55 55 54 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 49 49 49 48 48 48 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 46 47 47 47 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 43 43 43 43 42 42 44 44 44 43 42 42 42 43 43 43 43 43 43 43 43 43 44 44 44 43 42 42 43 42 42 42 42 43 43 43 43 42 41 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 34 34 34 34 34 34 34 34 33 33 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 31 30 30 30 30 30 30 31 31 31 31 31 31 32 32 32 31 31 30 30 30 30 30 30 30 30 30 30 49 49 48 48 48 47 47 47 47 48 48 48 48 49 50 50 51 52 52 53 54 54 55 56 57 58 59 59 59 58 57 55 54 53 52 51 50 50 50 50 49 49 49 49 49 50 50 50 49 48 48 48 47 46 46 46 46 45 45 44 44 44 43 43 42 42 43 43 42 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 40 39 39 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 42 43 43 44 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 49 49 49 49 49 48 48 48 49 49 50 51 52 53 53 54 54 55 55 54 54 54 54 54 54 53 53 53 52 52 51 51 51 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 47 47 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 49 49 48 48 48 48 48 48 48 48 49 49 50 50 51 51 51 51 50 49 50 50 51 51 51 52 52 53 53 53 53 52 51 51 51 52 52 51 51 51 51 51 50 49 48 48 48 48 49 49 49 50 50 49 50 49 49 49 49 50 50 51 51 52 54 54 54 55 55 55 55 55 54 53 52 51 51 52 52 53 53 53 52 51 51 51 51 51 51 50 50 50 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 46 46 47 47 47 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 43 43 42 42 43 44 44 44 44 43 42 42 43 43 43 43 43 43 42 42 43 44 44 44 43 43 43 43 43 43 42 42 43 43 43 43 42 40 40 39 40 39 39 39 40 39 39 40 40 40 40 39 38 38 37 38 38 38 38 37 37 37 37 36 36 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 34 34 33 33 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 47 47 47 47 47 47 47 47 47 48 49 49 49 50 50 50 51 51 51 52 53 54 55 56 57 58 59 59 59 58 56 54 53 52 51 51 50 49 49 49 49 49 49 49 49 50 50 50 49 48 48 47 47 46 46 46 45 45 45 45 44 44 43 43 42 42 43 43 42 41 41 42 41 41 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 37 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 43 43 43 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 50 49 49 49 49 49 49 48 48 48 48 49 50 51 52 53 53 54 54 54 55 54 54 54 54 54 53 53 52 52 52 51 51 51 51 50 50 50 50 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 50 51 51 51 50 50 50 50 50 49 49 49 50 50 49 49 49 48 48 48 47 46 46 46 45 45 45 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 48 48 47 47 48 48 49 49 48 49 50 50 51 50 50 50 49 49 49 50 51 51 51 51 52 53 53 53 53 52 51 51 51 51 51 51 50 50 51 51 51 49 48 48 48 48 49 49 49 49 48 48 49 50 50 49 50 51 52 52 52 53 55 55 54 54 55 55 55 55 54 54 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 46 45 45 46 45 45 46 46 47 47 47 46 46 46 46 45 45 44 44 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 42 43 44 44 44 44 44 44 44 43 42 42 43 43 43 43 43 42 42 43 44 44 44 44 43 43 43 43 43 42 42 43 43 43 42 41 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 39 38 37 37 37 37 38 37 37 37 37 37 37 36 36 36 37 36 36 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 33 33 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 31 31 32 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 46 47 47 47 47 48 48 48 48 48 49 49 49 50 50 51 51 51 51 52 52 53 54 55 56 57 58 58 58 57 55 53 52 51 51 50 50 49 49 49 49 49 49 49 49 50 50 49 48 48 48 47 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 42 41 41 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 48 48 49 49 49 50 50 49 49 49 49 49 48 48 48 48 49 50 50 52 53 54 54 54 54 54 54 54 54 53 53 53 52 52 51 51 51 51 51 51 51 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 50 50 50 50 49 49 49 49 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 46 45 45 45 46 46 47 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 48 48 49 48 48 48 49 50 50 50 49 49 49 49 50 51 51 51 51 51 52 52 53 53 52 52 51 51 51 51 51 50 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 49 51 52 51 51 51 52 52 53 53 54 55 54 54 54 55 55 55 55 55 54 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 49 49 49 49 49 48 48 49 48 48 48 48 48 47 47 47 47 47 47 46 46 45 45 45 46 46 46 46 47 47 46 46 46 46 46 45 44 44 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 43 42 42 42 42 42 43 42 42 42 43 43 44 44 44 43 43 43 43 42 41 41 42 43 42 41 42 41 41 41 41 40 40 40 40 40 39 39 39 39 40 40 39 38 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 35 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 33 33 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 31 31 31 30 30 30 30 30 31 31 31 31 31 32 32 32 32 32 31 30 30 30 31 30 30 30 30 47 48 48 48 48 49 49 49 49 49 49 49 50 51 51 51 51 52 52 52 53 53 54 55 55 57 57 57 57 55 53 52 51 51 50 50 49 49 49 48 48 48 48 49 49 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 41 41 41 42 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 36 37 38 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 48 49 49 49 50 50 49 49 49 49 49 49 48 48 48 48 49 50 51 52 54 54 54 54 54 54 54 53 53 52 52 52 51 51 51 51 51 52 52 52 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 49 49 49 49 49 49 48 48 48 47 47 47 47 46 46 45 45 45 45 46 47 47 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 48 48 48 48 49 49 50 50 49 48 48 49 50 51 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 48 48 49 50 51 51 51 51 51 52 52 53 53 54 55 54 53 53 54 54 54 55 55 54 54 53 53 53 52 52 52 52 53 53 52 52 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 44 44 43 42 42 43 44 44 44 44 44 44 44 43 44 44 45 46 45 44 42 41 41 41 42 42 42 42 43 43 44 44 44 43 43 42 42 42 42 41 42 43 42 42 43 42 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 39 39 38 37 37 37 37 36 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 35 35 35 34 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 32 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 30 30 30 30 31 31 31 31 31 32 32 32 32 32 31 30 30 30 31 30 30 30 30 48 48 49 49 49 50 50 50 50 50 49 49 50 51 51 51 52 52 53 53 54 54 55 55 56 56 56 56 54 53 52 51 51 50 50 49 49 48 48 48 48 48 48 49 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 44 44 43 43 43 43 43 42 42 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 36 37 38 39 39 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 50 52 53 54 54 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 49 49 50 50 49 49 49 49 49 49 48 48 48 47 47 47 46 46 45 45 45 45 45 46 47 47 48 47 47 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 48 48 49 50 51 51 52 52 52 52 52 52 52 51 51 51 50 50 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 48 48 49 49 50 50 50 50 51 52 52 52 53 54 55 54 53 52 53 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 51 51 51 51 50 50 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 43 43 43 44 43 43 43 43 42 42 43 44 44 45 45 44 44 43 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 45 46 45 44 43 42 41 41 41 41 42 42 43 44 43 43 43 43 43 42 42 42 42 43 43 43 43 43 42 42 41 41 41 40 40 40 39 39 39 39 40 39 39 39 39 39 39 38 37 37 37 37 36 36 37 37 37 36 36 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 33 33 32 32 32 32 32 31 30 30 30 30 31 31 32 32 31 31 32 32 32 32 32 31 30 30 30 31 30 30 30 30 48 49 49 49 50 50 50 50 50 50 50 50 50 51 51 51 52 53 53 54 54 55 55 56 56 56 55 54 53 52 51 51 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 47 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 50 51 52 53 54 54 54 55 54 53 53 52 52 52 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 48 48 49 48 48 48 49 49 50 50 50 49 49 49 49 49 49 48 47 47 47 46 46 45 45 45 45 45 45 46 46 47 48 47 47 47 47 48 48 48 48 48 47 47 47 47 47 48 48 48 48 48 48 49 49 48 48 48 48 49 49 50 51 51 51 51 51 51 52 52 52 51 51 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 47 47 48 48 49 49 49 49 49 49 50 50 51 52 52 52 54 55 54 53 52 52 53 53 53 54 54 54 54 53 52 52 53 53 53 53 53 53 52 52 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 43 44 44 43 43 43 43 42 42 42 43 43 43 44 44 43 42 42 43 43 43 42 42 43 44 45 45 45 45 44 44 44 44 45 44 44 43 43 42 42 41 41 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 40 40 40 39 39 40 40 40 40 39 39 39 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 33 33 33 33 33 33 33 33 34 34 33 33 32 32 32 32 33 32 32 32 32 32 32 33 33 32 32 32 32 31 31 30 30 31 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 30 30 30 30 49 49 50 50 50 50 50 51 51 51 51 51 51 51 51 52 53 54 54 54 55 55 56 55 55 54 54 53 52 51 51 50 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 39 38 37 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 43 44 44 45 45 45 45 46 46 46 46 47 47 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 49 49 49 48 48 48 49 51 52 53 54 54 54 55 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 50 50 50 50 49 49 49 49 49 48 48 47 46 46 45 45 45 45 45 45 46 47 47 47 48 47 47 47 47 48 48 48 48 47 47 47 47 47 48 48 48 48 48 48 48 49 49 48 48 48 48 49 49 50 50 50 51 51 51 51 52 52 52 52 51 51 50 51 51 51 50 50 50 50 50 49 48 48 47 47 47 47 48 49 48 48 48 48 48 49 49 50 51 51 52 52 54 55 54 53 52 52 52 52 53 53 54 55 54 53 52 52 53 53 53 53 53 53 52 52 52 51 51 51 51 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 46 46 46 45 45 46 46 46 46 45 45 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 42 43 43 44 44 43 42 43 44 44 44 45 45 44 44 44 44 45 44 44 44 43 43 43 42 41 41 41 42 42 43 43 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 34 34 34 33 33 32 32 32 33 33 33 32 32 32 32 32 33 33 33 32 32 32 32 31 30 30 31 32 32 32 32 32 32 32 32 32 32 31 30 30 30 30 30 30 31 31 31 49 50 50 50 50 50 51 51 52 51 51 51 51 51 52 52 53 54 55 55 55 55 55 55 54 53 52 52 51 51 50 49 49 48 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 44 44 44 43 44 44 43 43 42 42 42 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 39 39 39 37 36 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 47 47 46 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 50 50 50 50 50 49 49 48 48 49 51 52 53 54 55 55 54 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 50 50 49 49 49 49 49 49 49 48 48 48 48 49 50 50 50 49 49 49 49 49 48 48 48 47 46 45 45 45 45 45 46 47 47 47 48 48 48 47 47 47 47 48 48 48 48 47 47 47 47 48 48 48 48 48 49 49 49 48 48 48 47 48 48 49 49 50 50 50 51 51 51 51 52 52 52 52 52 51 51 51 52 52 51 50 50 50 50 49 49 48 47 47 47 47 48 48 48 48 48 48 48 48 49 50 50 51 51 52 53 54 53 53 52 52 52 52 53 53 54 54 54 53 52 52 52 52 52 52 53 53 52 52 52 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 46 46 46 45 45 46 46 46 46 45 45 45 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 44 44 44 43 42 43 43 43 44 44 44 44 44 44 44 45 44 44 43 43 43 43 43 42 41 41 42 42 43 44 44 44 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 33 33 34 34 34 33 33 33 33 33 33 34 33 32 32 32 32 32 32 33 33 33 32 32 32 32 31 30 31 32 32 32 32 32 32 32 32 32 32 31 30 31 30 30 30 30 31 31 31 50 50 50 50 50 51 51 51 52 52 52 51 51 52 52 52 53 54 54 54 54 54 54 54 53 52 52 51 51 50 50 49 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 39 39 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 36 37 38 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 43 44 44 45 45 45 45 46 46 46 46 47 47 46 46 46 47 47 47 47 47 47 47 48 48 48 48 48 49 49 50 50 50 50 50 50 50 50 49 49 48 48 48 50 52 53 54 55 55 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 49 50 50 49 49 49 49 49 48 48 47 47 47 46 45 45 45 45 45 46 47 47 48 48 48 48 48 47 47 47 47 48 48 48 48 47 47 46 47 48 48 48 48 48 48 49 48 48 48 47 47 48 49 50 50 50 50 51 51 51 52 52 52 52 52 52 52 52 51 51 52 52 51 50 50 49 49 49 49 48 47 47 46 47 47 47 47 47 47 48 48 48 49 50 50 51 51 51 53 53 52 52 52 51 51 52 53 53 54 54 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 46 46 45 45 44 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 44 44 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 33 33 33 34 33 33 33 33 33 33 33 33 33 32 33 33 32 32 32 33 33 33 32 32 32 32 31 30 30 31 32 32 32 32 32 32 32 32 32 31 30 30 30 30 31 31 31 31 31 50 51 50 50 50 51 51 52 52 53 52 52 52 52 53 53 53 53 54 54 54 54 53 53 52 52 51 51 50 50 49 48 48 48 49 49 49 49 50 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 39 39 39 39 40 40 40 40 40 40 39 39 39 39 39 39 40 38 37 37 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 43 43 43 44 45 45 45 45 46 46 46 46 47 46 46 46 46 47 48 47 47 47 47 47 48 48 48 48 48 49 49 50 50 50 50 50 50 49 49 49 49 48 48 48 50 52 53 54 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 50 50 50 50 50 49 49 49 50 49 49 49 48 48 48 49 50 50 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 45 46 47 48 48 48 48 47 47 47 47 47 47 47 48 48 48 47 47 46 46 47 47 47 48 48 48 48 48 48 47 47 48 49 50 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 49 48 48 49 48 48 47 46 46 47 47 47 47 48 48 48 48 49 50 50 50 50 51 52 52 52 52 51 50 50 52 52 52 53 53 52 52 53 53 53 53 53 53 52 52 52 52 52 52 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 43 43 44 44 45 44 44 44 44 43 43 43 43 43 43 43 42 41 41 42 43 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 33 33 33 34 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 33 33 33 32 32 32 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 51 51 51 50 50 51 51 51 52 53 53 53 52 53 53 54 54 54 54 54 54 53 53 52 51 51 51 50 50 49 48 48 48 48 48 49 49 49 49 50 49 49 49 49 49 48 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 40 39 39 39 39 39 39 39 39 40 39 38 39 39 39 39 39 38 37 38 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 42 42 42 42 43 44 45 45 45 45 46 46 46 46 47 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 49 50 50 50 49 49 49 49 49 49 49 49 48 48 49 51 52 53 53 53 54 54 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 50 50 49 49 49 49 49 50 49 49 48 48 48 48 48 50 50 49 48 48 47 47 47 47 46 45 45 45 45 45 45 45 45 46 47 48 48 48 48 47 47 47 47 47 47 47 48 48 48 47 47 47 46 46 46 47 47 47 47 47 47 47 47 47 48 49 49 50 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 49 48 48 48 48 48 47 46 46 46 46 47 47 48 48 48 48 49 49 49 49 50 50 51 51 51 51 51 50 50 51 51 51 52 52 53 54 54 54 54 54 54 53 52 52 52 52 52 52 51 51 51 50 50 50 51 50 50 50 49 49 49 49 49 48 47 47 47 47 47 47 46 46 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 44 44 44 44 44 44 43 43 43 43 42 42 42 43 42 41 42 43 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 31 30 30 31 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 31 51 52 51 51 51 51 51 51 52 52 53 53 53 53 54 54 54 54 54 53 53 53 52 52 51 51 50 50 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 44 44 45 44 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 39 39 39 38 37 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 42 42 42 42 43 44 45 45 45 45 45 46 46 46 47 47 47 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 49 49 49 50 49 49 49 49 49 49 49 49 48 47 48 50 52 52 52 53 53 54 54 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 48 48 48 50 50 50 49 48 47 46 46 46 45 45 45 45 45 45 46 46 46 46 47 48 48 48 47 47 47 47 47 46 47 47 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 50 51 51 52 52 52 52 52 52 52 52 52 53 52 52 52 52 52 51 51 51 49 48 48 48 48 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 49 50 50 51 50 50 50 50 49 49 50 50 51 52 53 54 54 55 54 54 54 54 53 53 52 52 52 52 52 52 52 51 51 50 51 51 51 50 50 50 49 49 49 49 48 47 47 46 47 47 47 46 46 45 45 46 46 46 45 44 44 44 44 44 44 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 44 44 45 45 44 44 44 44 44 43 42 42 41 42 41 41 41 42 43 43 44 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 39 39 39 39 40 40 39 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 34 34 33 33 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 52 52 52 51 51 51 51 51 51 52 53 53 54 54 54 54 54 53 53 53 52 52 51 51 51 50 50 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 41 41 42 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 37 37 37 38 38 38 39 39 39 38 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 42 42 42 43 43 44 45 45 45 45 45 46 46 46 47 47 47 46 46 46 47 47 47 48 47 47 47 47 47 48 48 47 48 48 49 49 49 49 49 49 49 49 49 49 48 47 47 49 50 51 52 53 54 55 54 53 53 53 53 53 53 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 48 48 49 48 48 47 47 48 48 48 50 50 50 49 48 48 47 46 45 45 45 45 46 46 46 47 47 47 47 47 48 48 48 47 47 47 47 46 46 47 47 48 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 46 47 47 48 48 49 50 50 51 52 52 53 53 53 53 53 53 53 53 52 52 52 52 52 51 51 50 49 48 47 47 47 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 50 50 50 50 49 49 49 49 50 50 50 51 51 52 53 54 54 55 54 54 54 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 49 49 49 49 48 48 47 46 46 47 47 46 46 45 45 45 45 46 45 44 44 44 44 44 44 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 44 45 45 46 45 44 44 44 44 43 43 42 42 42 41 41 42 42 43 43 44 43 42 42 42 42 42 41 41 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 33 32 32 32 31 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 52 52 52 52 52 52 52 52 52 53 53 53 54 54 54 53 53 53 52 52 52 51 51 51 51 50 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 42 41 42 43 42 42 42 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 37 37 38 38 39 38 37 38 40 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 42 42 42 42 43 44 44 45 45 45 46 46 46 46 46 47 47 47 46 46 46 47 47 47 48 47 47 47 47 47 47 46 47 48 49 49 49 48 48 49 49 49 49 49 48 47 47 48 49 51 53 54 54 55 54 53 53 53 53 53 53 52 51 51 51 52 51 51 51 50 50 50 50 50 50 50 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 48 48 49 50 50 49 49 48 48 47 46 45 45 45 45 46 47 47 47 48 48 48 48 48 48 48 48 48 48 47 47 46 47 47 48 48 48 48 48 48 49 48 47 47 47 47 47 46 46 46 47 47 47 47 48 49 50 51 52 52 53 53 53 53 53 53 53 53 53 52 51 51 51 52 51 50 50 49 48 47 47 47 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 49 49 49 49 49 49 49 49 50 51 51 51 51 52 53 53 54 54 54 54 54 53 53 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 48 47 46 46 46 46 46 46 45 45 45 45 46 45 45 45 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 44 44 45 45 46 45 45 45 44 44 44 43 43 43 43 42 42 43 43 43 43 44 43 42 42 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 33 33 32 32 31 30 31 32 32 32 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 53 53 53 53 53 53 54 54 54 54 54 53 53 52 52 52 52 51 51 51 50 50 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 42 41 42 42 43 43 43 42 41 41 40 40 40 40 41 41 41 41 41 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 37 38 38 37 37 39 39 39 39 40 40 40 39 39 40 40 40 40 40 40 40 40 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 42 42 42 42 43 44 44 45 45 45 46 46 46 46 46 47 47 47 47 46 46 46 47 47 47 48 47 47 47 47 47 47 47 47 48 48 49 48 48 49 49 49 49 49 48 48 47 47 48 50 52 53 54 54 54 53 53 53 53 53 52 51 51 51 51 51 52 51 51 50 50 50 50 49 49 49 49 49 48 48 48 48 49 48 48 48 48 47 47 47 47 48 49 49 50 49 48 48 48 47 46 46 45 45 45 45 46 47 47 47 48 48 49 49 48 48 49 49 48 48 48 47 46 46 47 47 47 47 48 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 48 48 49 50 51 52 52 53 53 53 53 53 53 53 53 53 52 51 51 51 52 51 50 50 49 48 47 46 47 47 47 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 49 49 49 49 50 50 51 51 52 52 52 52 53 53 53 53 54 54 54 54 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 48 48 48 47 47 46 46 46 46 46 45 45 46 46 45 45 46 46 45 44 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 43 43 44 44 45 45 46 45 45 45 45 44 44 43 43 43 43 42 42 43 43 44 44 44 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 31 30 31 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 53 53 54 54 54 54 54 54 54 53 53 53 52 52 52 52 51 51 51 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 43 43 43 42 42 42 42 42 42 42 42 42 41 41 40 40 40 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 39 39 39 39 39 40 40 40 40 39 39 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 42 42 43 42 42 42 42 43 44 44 45 45 45 45 46 46 46 46 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 48 48 47 47 47 48 49 48 48 48 49 48 48 48 48 48 48 47 47 49 51 52 53 54 54 53 54 54 54 53 52 52 51 51 51 51 52 51 51 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 48 49 49 49 49 48 47 47 46 46 45 45 45 45 46 46 46 47 47 48 48 49 49 48 48 48 49 49 48 48 47 46 46 47 47 47 47 48 48 47 47 47 47 47 47 47 46 46 46 46 46 48 48 48 48 49 50 51 51 52 53 53 53 52 52 52 53 53 52 52 51 51 51 52 51 50 49 48 47 46 46 47 47 46 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 49 51 51 50 51 51 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 48 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 45 45 45 46 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 45 45 46 46 45 45 45 45 44 44 43 43 43 43 42 42 42 43 44 44 44 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 31 30 31 32 32 33 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 53 53 53 53 54 54 54 54 54 53 53 53 52 52 52 52 52 52 51 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 42 42 42 41 41 41 40 40 41 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 39 39 39 38 38 38 38 38 38 38 38 39 39 39 39 39 38 36 37 38 38 38 38 38 39 40 40 39 39 39 39 39 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 46 46 46 46 46 47 47 47 47 46 46 46 47 47 47 48 48 48 48 48 48 48 47 47 47 48 48 47 47 48 48 47 48 48 49 48 47 46 48 51 52 53 54 54 54 54 53 53 53 53 52 52 51 50 51 51 51 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 49 49 48 47 46 46 46 45 45 45 45 45 46 46 46 47 47 47 48 48 48 48 47 48 48 49 48 48 47 46 46 46 46 47 47 48 47 47 47 46 46 46 46 46 46 45 46 46 47 48 48 49 49 50 50 51 51 52 52 53 53 52 52 52 52 52 52 51 50 51 51 52 51 50 49 48 48 47 46 46 47 46 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 49 50 51 51 52 52 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 53 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 43 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 40 40 40 40 39 39 38 38 38 37 37 37 37 37 37 37 36 36 36 37 36 36 36 36 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 33 33 33 33 34 34 34 34 33 33 33 32 32 32 31 31 31 32 32 32 33 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 53 54 54 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 43 42 42 42 41 41 41 41 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 39 39 39 39 39 37 37 37 38 38 38 38 39 39 39 38 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 43 43 44 45 45 45 45 45 46 46 46 46 46 47 47 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 47 47 47 47 47 46 47 47 47 47 48 48 48 47 46 47 50 51 52 53 53 53 53 53 52 52 52 52 52 51 50 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 48 48 48 48 49 49 48 47 46 46 45 45 45 45 45 45 45 46 46 47 47 47 48 48 48 47 47 48 48 48 48 48 48 47 47 46 46 46 47 48 47 47 46 46 45 45 45 45 46 45 45 46 47 47 48 48 49 50 51 51 51 52 52 53 53 52 52 52 52 52 51 50 50 50 51 51 51 50 49 48 48 47 46 46 46 46 46 46 46 47 47 47 47 47 48 48 48 47 47 48 48 49 50 51 52 52 52 52 52 51 51 50 50 50 51 51 51 52 52 52 52 52 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 43 44 44 45 45 45 45 45 45 45 45 45 44 44 44 44 43 42 42 44 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 39 39 40 40 40 39 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 36 36 36 36 36 37 37 37 37 36 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 32 33 33 33 33 32 32 32 32 32 32 31 31 32 32 32 32 33 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 54 54 54 53 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 43 42 42 42 42 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 39 39 40 38 37 37 37 38 38 39 38 38 38 38 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 45 45 46 46 47 47 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 47 47 48 48 47 46 46 49 50 51 52 52 53 53 53 52 52 52 51 51 51 50 50 51 51 50 49 49 49 49 49 49 49 49 49 49 48 47 47 48 48 48 47 46 46 47 48 48 48 48 49 49 48 47 46 46 45 45 45 45 45 45 45 45 46 47 47 48 48 47 47 47 48 48 48 48 48 48 49 48 47 47 46 46 47 47 47 46 46 45 45 45 45 45 45 46 46 46 47 47 48 48 49 50 51 51 51 52 52 53 52 52 52 51 51 51 51 50 49 50 50 50 50 49 49 48 48 47 46 46 46 46 46 46 46 47 46 46 47 47 48 48 47 47 47 48 48 49 50 51 51 51 51 51 51 51 50 50 50 50 51 51 51 52 52 53 52 52 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 48 48 47 47 47 46 46 47 46 46 46 46 46 45 45 44 44 44 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 43 42 42 43 43 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 39 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 35 36 37 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 34 34 33 33 32 32 32 32 32 32 32 33 32 32 32 31 31 32 32 32 33 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 53 53 54 54 53 53 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 39 39 39 37 36 37 38 38 38 38 38 38 39 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 45 45 45 46 46 47 47 47 47 48 48 48 48 48 48 48 47 47 47 46 47 46 46 46 47 48 48 48 46 46 48 49 50 51 52 52 53 53 52 52 52 52 52 51 50 49 50 50 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 48 47 47 46 46 47 48 48 47 48 50 50 48 46 46 46 45 45 45 45 45 45 45 45 46 46 47 48 47 47 46 47 47 48 48 47 47 48 48 48 47 46 46 46 46 46 46 46 45 45 46 46 46 46 46 47 47 47 48 48 49 48 48 49 50 50 51 51 52 53 52 52 51 51 50 51 51 50 49 50 50 50 49 49 48 48 47 47 46 45 45 45 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 49 49 50 50 50 50 51 51 50 49 49 49 50 50 51 51 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 48 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 42 42 42 42 42 42 42 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 44 44 43 43 42 42 43 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 38 38 37 37 37 37 37 38 37 37 37 37 37 36 36 36 37 37 37 37 37 36 35 35 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 34 33 32 32 31 31 31 32 32 33 34 34 34 34 33 32 33 33 33 33 33 33 32 32 32 32 32 32 52 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 39 38 37 37 38 38 38 37 38 38 38 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 44 44 45 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 46 47 48 48 47 46 47 49 50 51 51 52 52 53 53 53 52 53 53 52 50 49 49 48 48 49 48 48 49 49 49 49 49 49 49 48 47 47 47 48 47 46 46 46 47 47 47 48 48 49 49 48 47 46 46 45 45 45 45 45 45 45 45 46 46 47 47 47 47 46 46 47 47 47 47 47 47 47 47 46 46 46 46 45 45 46 46 46 46 46 47 47 48 48 48 47 48 48 49 49 49 49 49 50 50 50 51 52 52 52 51 51 50 49 50 50 49 49 49 50 50 49 49 48 47 47 47 46 45 45 45 45 45 45 46 46 46 47 47 47 47 46 46 46 47 47 48 48 49 49 50 50 50 51 51 50 49 48 48 49 49 50 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 52 52 52 51 51 51 50 50 50 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 42 42 42 42 42 42 42 42 42 43 43 43 44 44 45 45 45 45 45 45 45 45 45 44 44 43 42 42 43 44 44 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 37 37 38 38 37 37 37 38 38 38 37 37 37 37 37 36 36 37 37 37 37 37 37 37 36 36 36 36 37 37 36 36 36 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 31 31 31 31 31 31 31 33 33 34 34 34 33 32 33 33 33 33 33 33 32 32 32 32 32 32 52 52 53 53 53 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 42 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 38 37 37 37 38 37 37 38 38 38 38 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 46 47 47 47 46 47 48 49 50 51 52 52 53 53 53 53 53 53 52 51 50 49 48 48 48 48 48 48 48 49 49 49 49 49 48 47 47 47 48 47 46 46 46 47 47 47 48 48 48 49 49 48 48 47 46 45 45 45 45 45 45 45 45 46 47 47 47 47 46 46 47 47 47 47 46 46 46 46 45 45 46 46 45 45 46 46 45 46 46 47 48 48 48 48 48 48 48 48 49 49 49 50 50 50 51 52 52 52 51 50 50 49 48 49 49 48 48 49 50 50 49 49 48 47 47 47 46 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 47 47 47 48 49 49 49 49 50 50 51 50 49 48 48 48 49 49 50 50 50 50 50 51 52 52 52 51 51 51 51 51 51 51 51 51 52 52 51 51 51 50 50 50 49 49 49 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 43 44 45 45 45 45 45 45 45 45 45 45 44 44 43 43 42 42 42 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 37 37 38 37 37 37 38 38 38 38 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 31 31 31 31 31 31 30 31 32 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 43 42 42 42 42 43 43 43 42 42 43 43 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 37 37 37 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 41 41 41 41 41 41 41 42 43 43 43 42 42 42 43 43 43 42 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 45 46 46 46 45 46 48 48 49 51 52 52 53 53 53 53 53 53 52 51 50 49 48 48 48 48 48 48 48 48 48 49 49 49 48 47 47 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 49 48 47 46 45 45 45 45 45 45 45 46 47 47 47 47 46 46 47 46 46 46 46 46 45 45 45 44 45 45 45 45 46 45 45 46 47 47 47 48 48 48 48 48 48 48 49 49 50 50 50 50 50 51 51 51 50 49 49 48 47 47 48 48 48 48 49 50 49 49 48 47 47 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 47 47 48 48 49 49 49 49 50 50 50 49 48 48 48 48 49 49 49 49 50 50 51 52 52 52 51 51 50 50 50 51 51 51 51 51 52 52 51 51 51 50 50 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 44 44 45 45 45 45 45 45 46 46 45 45 44 44 43 43 42 42 42 42 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 31 31 31 31 32 32 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 49 49 50 50 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 38 38 38 38 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 41 41 41 41 41 41 41 42 42 43 42 42 42 43 43 43 42 42 42 42 43 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 48 48 48 47 47 47 46 46 46 46 46 46 46 47 47 49 50 51 52 53 53 53 53 53 53 52 51 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 47 47 47 47 48 48 48 49 49 49 49 48 47 47 46 45 45 45 45 45 45 46 47 47 47 47 46 46 46 46 46 45 45 45 45 45 44 44 44 44 45 45 45 45 45 46 47 48 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 49 48 48 47 46 47 47 47 48 48 49 49 49 49 49 48 47 47 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 49 49 50 50 49 49 49 48 48 48 49 49 49 50 50 51 51 52 51 51 51 51 50 50 50 51 51 51 51 51 51 52 52 51 51 50 50 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 44 44 45 45 45 46 46 46 47 46 46 46 45 44 43 43 43 42 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 36 36 36 36 35 35 35 36 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 33 32 32 32 32 32 32 32 31 31 32 31 31 31 31 32 32 32 33 33 33 33 33 33 34 34 34 33 33 33 33 51 51 51 51 52 52 52 52 52 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 48 48 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 38 37 37 38 38 39 38 38 39 39 39 39 39 40 39 39 39 40 40 40 40 41 41 41 41 41 42 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 46 46 46 46 45 45 46 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 49 48 47 47 47 47 47 47 47 46 46 45 46 47 48 50 51 52 52 53 53 53 52 52 52 52 51 49 49 49 48 48 48 48 47 47 47 47 48 48 48 47 47 47 47 46 46 46 47 48 47 47 48 48 48 48 49 49 49 48 48 47 46 45 45 45 45 45 45 46 47 47 47 47 46 45 46 46 46 45 45 45 44 44 43 43 43 44 45 45 45 45 46 47 47 47 48 49 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 49 48 48 47 46 46 46 46 47 47 48 48 49 49 50 50 49 49 47 45 45 45 45 45 45 45 46 46 46 46 46 47 47 46 45 45 46 46 46 47 47 48 49 49 49 50 50 50 49 49 48 48 48 48 49 49 50 50 51 52 51 51 51 51 51 50 50 50 50 51 51 51 51 51 52 52 51 51 51 50 49 49 49 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 44 44 45 45 45 46 46 47 47 47 47 46 45 44 44 43 43 42 42 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 37 36 36 36 36 37 36 36 37 37 37 37 37 36 36 36 36 36 35 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 34 33 32 32 32 32 32 32 32 32 32 31 31 31 31 31 32 32 32 32 33 33 33 34 34 34 34 34 34 34 33 51 51 51 51 52 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 38 37 37 38 39 39 39 39 40 40 39 39 39 40 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 46 45 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 49 48 47 47 47 47 47 47 46 46 46 45 46 47 48 49 51 51 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 47 47 47 48 48 49 49 48 48 48 47 46 45 45 45 45 45 45 45 46 46 46 46 46 45 46 46 45 44 45 45 44 43 42 42 43 44 45 46 45 45 46 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 50 49 49 48 48 47 46 46 46 46 47 47 48 48 48 48 48 49 49 48 46 45 45 45 45 45 46 46 47 47 47 47 47 47 46 46 45 45 46 46 46 47 48 48 48 48 49 49 50 49 49 49 48 48 48 48 49 49 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 51 51 51 51 51 52 51 51 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 44 45 45 45 46 46 47 47 47 47 46 45 45 44 44 43 42 41 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 31 31 32 32 32 32 32 33 33 33 34 34 34 34 34 34 34 51 51 51 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 48 48 48 48 48 47 47 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 40 39 37 37 37 37 38 38 39 40 40 40 40 40 39 39 39 39 39 40 40 40 41 41 41 41 41 41 41 40 40 41 41 41 42 42 42 42 42 42 42 43 42 42 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 48 48 49 48 48 47 47 46 46 46 47 47 46 45 46 47 48 49 50 51 51 51 52 52 52 52 52 52 51 50 50 49 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 46 47 47 48 48 47 46 46 47 47 48 49 48 48 48 48 47 46 45 45 45 45 45 45 45 46 46 46 45 45 45 46 45 45 44 44 44 44 43 42 42 44 44 44 44 44 45 46 47 47 47 47 47 47 47 48 48 48 48 47 47 47 48 48 49 49 49 48 48 48 47 46 46 45 46 46 46 47 47 48 48 47 47 47 46 45 45 45 45 45 45 45 46 46 47 46 46 47 47 46 46 46 45 45 45 46 46 47 48 48 48 48 49 49 50 49 49 49 48 47 48 48 49 50 50 50 50 51 51 50 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 51 51 51 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 45 45 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 43 44 44 45 45 46 46 47 47 47 46 46 46 45 45 44 43 42 41 42 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 33 33 33 32 31 31 32 32 32 32 32 33 33 33 33 34 34 34 34 34 51 51 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 48 48 49 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 40 39 38 37 37 37 37 37 37 39 39 40 40 40 39 38 38 39 39 40 40 40 41 41 41 41 41 41 41 40 40 41 41 41 42 42 42 42 42 42 42 43 42 42 42 42 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 47 47 47 47 48 48 48 48 49 49 49 48 47 47 46 46 46 47 48 47 46 45 46 47 48 49 50 51 51 51 51 51 51 52 51 50 50 50 49 49 49 49 49 49 48 47 47 46 46 46 46 46 46 46 47 47 48 48 48 47 46 46 47 47 48 48 48 48 47 47 47 46 45 45 45 45 45 45 45 46 46 45 45 45 45 46 45 44 44 43 43 43 42 41 43 44 44 43 44 44 45 46 47 47 47 46 46 46 47 47 47 48 48 47 46 46 47 48 48 48 48 48 47 47 46 46 45 45 46 46 46 46 47 48 48 47 46 46 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 46 47 47 48 48 48 49 49 49 49 49 48 47 47 47 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 51 51 50 51 51 51 51 51 51 50 50 50 50 50 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 46 46 47 47 47 46 46 46 46 45 44 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 33 33 33 32 31 31 31 32 32 32 32 32 32 32 33 33 34 33 33 34 51 51 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 47 48 48 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 48 48 48 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 40 39 39 38 37 37 36 36 38 38 39 39 40 39 38 38 39 39 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 47 47 47 47 48 48 48 49 49 49 48 47 46 46 46 46 47 47 47 46 45 45 47 47 48 50 50 50 51 51 51 51 52 51 51 50 50 50 50 50 50 49 49 49 48 47 46 46 46 46 46 47 47 48 48 48 49 48 47 46 46 47 47 48 48 48 47 47 47 46 46 45 45 45 45 45 45 45 45 46 45 44 44 45 46 45 45 44 44 43 43 42 41 42 43 43 43 44 45 45 46 47 47 47 46 46 46 46 46 46 47 47 46 45 45 46 47 47 48 48 47 47 46 45 45 45 45 45 45 46 46 47 47 47 46 46 45 45 45 45 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 46 46 47 47 48 48 48 49 49 49 48 48 48 47 47 47 48 48 48 48 49 48 48 49 49 50 50 50 50 50 50 50 51 51 51 51 52 52 51 51 51 50 50 50 50 50 50 49 49 48 48 48 48 47 47 47 48 48 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 45 46 46 46 46 47 47 47 46 46 45 45 44 43 43 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 31 31 32 32 32 32 32 32 32 33 33 34 33 33 34 51 51 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 48 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 45 45 46 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 44 43 43 43 43 43 42 42 43 42 41 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 40 40 40 40 40 40 39 38 38 37 36 37 38 38 39 39 38 38 38 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 47 47 48 48 49 49 48 47 46 46 46 46 46 47 47 46 45 45 46 47 48 48 49 49 50 51 51 52 52 51 51 51 50 50 50 50 50 50 50 50 49 48 47 46 46 46 46 47 47 47 47 48 49 48 47 46 46 47 47 48 48 48 47 47 47 46 45 44 44 44 45 45 45 45 46 45 44 44 44 45 45 45 45 44 44 44 43 42 41 41 41 42 43 44 44 45 45 46 46 46 46 45 45 45 45 46 46 46 45 45 46 46 47 47 47 47 47 46 46 45 45 45 45 45 45 46 46 47 47 46 46 45 45 45 45 45 45 45 45 46 47 47 46 45 45 45 45 45 46 46 46 46 46 46 46 46 47 47 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 48 49 49 50 51 51 51 50 50 50 50 51 51 51 51 52 51 51 51 51 51 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 46 46 46 46 46 47 47 47 46 46 46 45 45 44 44 43 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 31 31 32 32 32 32 32 32 32 32 33 33 33 33 34 51 51 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 47 47 48 48 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 44 44 43 43 43 44 44 43 43 43 42 42 42 42 42 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 36 37 38 38 38 38 38 39 39 40 40 40 41 41 41 41 40 40 40 40 40 41 41 41 42 42 43 43 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 44 44 45 45 46 46 46 46 46 46 46 47 47 48 48 48 49 48 47 46 45 45 45 45 45 45 45 45 45 46 47 47 48 48 49 50 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 48 48 47 46 46 46 46 46 47 48 48 48 47 46 46 46 47 47 48 47 47 47 46 46 44 44 44 44 44 44 45 45 45 44 43 44 45 45 45 44 44 44 43 43 42 41 41 41 42 42 43 43 44 44 45 46 46 46 46 45 45 45 45 46 46 45 45 45 46 46 46 46 46 46 46 46 45 44 44 45 45 45 46 47 47 46 46 45 45 45 44 44 44 45 45 46 46 46 46 46 46 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 48 48 48 47 47 47 47 46 47 47 47 47 47 47 48 48 49 49 50 50 50 51 51 51 51 50 51 51 51 51 51 51 51 51 50 51 51 51 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 46 45 45 45 46 46 47 47 47 46 46 46 45 45 44 44 43 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 33 34 51 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 47 48 48 49 49 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 41 41 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 39 38 37 36 36 37 37 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 42 42 42 42 42 42 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 44 44 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 47 46 45 45 45 45 45 45 45 44 44 45 46 47 48 48 48 49 50 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 46 46 46 47 47 47 47 47 47 46 46 46 47 47 46 47 47 46 45 44 44 44 44 44 44 45 45 45 44 43 43 45 45 44 44 44 44 43 43 41 41 41 42 43 43 43 44 44 45 45 46 46 45 45 44 45 45 45 46 46 45 44 45 45 45 45 45 45 45 45 45 44 44 44 45 46 46 47 46 46 45 45 45 44 44 44 44 44 45 46 46 46 46 46 46 45 45 45 45 45 46 46 45 45 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 47 48 48 48 48 47 48 48 49 49 50 50 51 51 51 51 51 51 51 50 50 50 51 51 51 50 50 51 51 51 51 51 50 49 49 48 48 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 45 45 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 46 46 47 47 47 46 46 46 45 45 45 44 43 42 42 43 43 43 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 33 33 32 32 32 32 32 31 31 31 32 32 32 32 32 32 32 32 33 34 34 34 51 52 52 52 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 47 48 49 49 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 42 43 43 43 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 37 37 37 36 37 39 39 40 40 40 40 40 40 40 40 40 39 39 40 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 45 45 45 46 46 46 46 46 47 48 48 48 48 48 48 47 46 45 45 46 46 46 46 46 45 44 45 46 47 47 48 48 49 49 50 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 47 46 46 45 46 47 47 47 47 47 46 45 46 47 47 46 46 46 46 45 44 44 44 44 44 44 45 45 44 43 43 43 45 45 44 43 43 43 43 42 41 41 41 42 43 44 44 44 45 45 45 45 45 45 44 44 44 45 45 45 45 44 44 45 45 45 44 44 44 44 44 44 44 45 45 45 46 46 46 46 45 45 45 45 44 44 44 44 44 45 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 48 48 48 48 49 49 50 50 50 51 51 51 51 51 51 50 50 50 51 51 50 51 51 51 51 51 51 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 46 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 46 46 46 47 46 46 45 46 46 46 45 44 43 41 41 42 43 44 44 44 44 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 33 33 33 51 51 51 51 51 51 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 48 48 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 39 38 37 37 38 40 39 39 39 39 39 39 39 39 39 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 44 45 45 45 45 46 46 46 46 47 47 48 48 48 48 48 46 46 46 46 46 46 46 46 46 44 44 46 46 47 47 48 48 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 47 47 46 45 46 46 46 46 46 46 46 45 44 44 44 44 44 44 45 44 44 43 42 44 45 44 44 43 43 43 43 42 41 41 41 42 43 44 44 44 45 46 45 45 44 44 44 43 44 44 44 43 44 44 45 45 44 44 44 43 43 43 44 44 45 45 46 46 46 46 46 46 46 46 45 45 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 46 46 46 46 46 46 45 45 45 45 46 46 47 47 47 47 47 48 48 49 49 49 48 48 49 49 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 52 51 50 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 44 44 45 45 45 45 46 46 45 45 45 45 46 46 45 44 43 42 42 41 41 42 43 44 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 33 33 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 45 45 45 44 44 45 44 44 44 44 44 43 43 43 42 42 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 40 40 39 38 37 38 38 38 39 39 39 39 39 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 46 46 46 46 47 47 48 48 48 48 47 46 46 46 46 46 46 46 46 45 44 44 46 47 47 47 47 48 48 49 49 49 49 50 50 50 50 51 50 50 50 49 49 48 48 48 48 48 48 47 47 47 47 46 45 46 46 46 46 47 46 45 46 46 46 46 47 46 46 46 45 43 43 43 44 45 44 44 43 42 42 44 44 43 43 43 43 42 42 42 42 41 40 41 42 43 44 44 45 45 45 45 44 43 43 43 43 43 43 43 44 45 45 45 44 43 43 43 43 44 44 45 46 46 46 47 47 47 47 46 46 46 45 45 44 44 44 44 45 45 45 45 45 45 44 44 44 44 44 44 45 45 46 46 46 46 46 46 45 45 45 45 45 46 47 47 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 50 50 50 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 52 51 50 49 49 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 46 46 45 44 44 43 43 42 40 40 42 43 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 39 39 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 34 34 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 43 43 44 44 44 43 43 42 42 41 41 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 44 44 45 45 46 46 46 47 48 48 48 49 48 47 46 46 46 46 46 46 46 46 45 44 45 47 47 47 47 47 47 48 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 49 48 48 48 48 47 46 46 46 46 45 46 47 46 46 46 46 45 45 45 45 46 46 46 45 46 45 43 43 43 44 44 44 43 43 42 41 42 42 41 40 40 41 41 41 42 42 41 40 40 42 43 44 44 44 45 45 44 43 43 43 43 43 42 42 43 44 45 45 44 43 43 43 44 45 45 45 46 46 46 46 47 47 47 47 46 46 45 45 44 44 44 43 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 45 45 45 45 45 46 47 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 49 49 50 50 50 51 51 51 51 51 50 49 50 50 51 51 51 51 52 52 51 50 50 49 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 42 40 40 41 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 34 34 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 44 44 43 43 42 41 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 40 38 37 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 42 42 42 42 42 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 46 46 46 47 47 48 48 48 48 47 47 46 46 46 46 45 45 45 45 44 45 47 47 47 47 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 49 49 48 48 48 48 47 46 46 46 46 45 45 46 47 46 46 45 45 45 45 45 46 46 45 45 45 44 43 43 43 43 44 44 44 43 42 41 40 40 40 40 40 40 40 40 40 41 41 40 40 42 43 43 44 44 44 44 44 43 42 42 42 42 42 42 43 43 44 44 43 43 43 44 45 46 46 46 46 46 46 46 46 47 47 46 46 46 45 45 44 44 44 43 43 43 44 44 44 44 44 44 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 45 45 46 46 47 47 47 48 48 48 49 49 49 49 49 49 48 48 48 48 49 50 50 50 50 50 50 50 50 50 49 50 50 50 51 51 51 52 51 51 51 50 49 48 48 48 48 48 48 48 48 48 48 49 49 49 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 41 41 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 35 36 36 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 33 33 34 34 34 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 39 37 37 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 46 46 47 48 48 48 48 47 47 47 46 46 46 45 44 44 44 44 45 46 46 47 47 47 47 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 45 45 46 46 46 46 45 45 45 45 46 46 45 45 45 45 44 43 43 43 44 44 45 44 43 43 41 40 40 42 42 42 41 41 39 39 40 41 41 41 41 42 43 43 43 43 43 43 43 42 42 42 41 42 42 42 43 43 43 43 44 44 45 46 46 47 46 46 45 45 46 46 47 47 46 46 45 45 45 45 44 44 43 43 43 44 44 44 45 45 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 48 48 48 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 50 49 49 50 50 50 50 51 51 51 51 51 51 51 50 49 49 48 48 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 46 45 45 44 44 44 43 43 43 41 40 41 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 37 37 37 36 36 37 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 33 33 32 32 32 33 32 32 33 34 34 33 33 34 34 34 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 50 51 51 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 42 42 42 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 40 39 37 36 37 39 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 44 43 43 44 44 45 45 45 45 46 47 47 48 48 48 48 47 47 46 46 46 45 44 44 43 44 45 45 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 45 45 45 46 46 46 45 45 45 45 46 46 45 45 45 44 43 43 43 43 44 44 44 44 43 42 40 41 43 44 44 44 43 42 40 39 40 40 40 41 41 41 41 42 42 42 42 42 41 42 42 42 42 42 43 44 43 43 43 44 44 45 46 46 46 46 46 45 45 45 45 46 47 47 46 46 45 45 45 45 44 44 43 43 43 44 44 45 45 46 46 46 46 45 45 45 46 46 46 45 45 45 45 45 45 45 45 46 46 46 47 47 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 50 50 50 49 49 50 50 50 50 50 50 51 51 51 50 50 50 49 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 46 45 44 44 44 43 43 43 43 42 41 40 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 33 32 32 32 32 33 34 33 33 33 34 34 34 34 34 34 34 51 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 47 48 48 49 49 49 49 50 50 50 50 50 50 50 51 51 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 40 40 41 40 40 40 40 39 38 37 36 37 39 40 40 40 40 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 45 45 44 43 43 44 44 45 45 45 45 46 46 47 47 48 48 48 47 47 46 46 46 45 45 44 44 43 44 45 46 46 46 46 47 47 47 47 48 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 48 47 45 45 45 45 46 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 44 43 43 43 42 41 41 43 44 45 45 44 43 42 40 39 40 40 40 41 41 41 41 41 41 41 41 41 41 42 43 43 43 43 44 45 45 45 45 45 45 45 46 46 46 46 46 45 45 45 45 46 46 46 46 46 45 45 45 45 44 44 43 43 43 44 44 45 45 45 45 45 45 45 45 45 46 45 45 45 44 44 44 45 45 45 45 46 46 46 47 47 47 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 46 45 44 43 43 43 43 43 43 43 42 40 41 42 42 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 36 36 35 36 36 37 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 33 32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 48 48 49 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 50 50 50 50 50 49 49 50 50 50 49 49 48 48 48 47 47 47 46 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 39 37 36 36 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 41 41 41 42 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 45 44 44 43 43 44 44 44 45 45 45 46 46 46 47 47 48 48 47 47 46 46 46 45 45 45 44 44 43 44 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 45 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 44 43 42 42 41 41 41 42 44 45 45 44 43 42 41 39 39 39 39 40 41 41 41 41 41 41 41 41 42 43 43 43 44 44 45 45 46 46 46 46 46 46 45 45 46 45 45 45 44 45 45 45 45 46 46 46 45 45 45 44 44 44 44 43 43 43 43 44 44 44 44 45 45 45 45 45 46 45 45 45 44 44 44 44 45 45 45 45 46 46 46 46 46 46 47 48 48 48 48 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 50 50 49 49 50 50 51 51 50 50 50 50 50 50 51 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 45 44 43 43 43 43 43 43 43 42 41 40 41 42 42 43 43 43 43 42 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 36 37 37 37 37 36 36 37 37 36 35 35 35 35 35 35 36 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 33 33 33 33 32 32 32 32 32 32 32 32 33 33 34 33 33 33 33 33 34 34 34 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 48 48 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 39 37 36 37 38 39 39 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 41 41 42 42 41 41 41 42 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 44 44 44 45 45 45 46 46 46 47 47 47 48 47 47 46 46 46 46 45 45 44 43 44 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 46 46 45 45 45 45 44 44 44 44 44 44 45 44 44 43 43 43 43 43 43 42 41 41 41 42 42 44 45 45 44 44 44 43 42 40 39 39 39 39 40 40 40 40 41 41 41 42 43 43 44 44 44 45 45 45 45 45 45 45 46 46 46 45 45 45 44 44 44 45 45 45 46 46 46 46 45 45 44 44 44 44 44 43 43 43 43 44 44 44 44 44 45 45 45 46 45 45 45 44 44 43 44 44 44 44 44 45 45 45 46 46 46 46 47 47 48 48 48 49 49 49 48 48 48 48 48 49 49 49 49 49 48 48 49 49 49 49 50 51 51 51 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 47 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 43 43 44 44 45 45 45 44 43 43 43 42 42 43 43 43 41 40 40 41 42 43 43 42 42 42 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 37 37 35 34 34 35 36 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 35 35 35 35 35 34 34 34 34 34 34 34 33 33 32 33 34 33 33 33 32 32 32 32 32 32 32 32 33 33 34 34 33 33 33 33 34 34 34 50 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 51 50 50 50 50 50 51 50 50 49 49 48 48 48 47 47 47 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 40 39 37 36 38 39 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 42 42 41 40 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 44 44 44 44 43 43 43 43 44 44 44 45 45 45 45 46 46 47 47 47 47 46 46 45 45 45 45 44 43 42 44 46 46 45 45 45 46 46 47 47 47 48 48 48 48 48 48 49 48 48 49 49 48 48 48 48 48 48 48 47 47 46 46 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 44 43 42 42 43 43 43 44 45 45 44 43 43 43 43 42 40 38 38 39 40 40 41 41 41 41 41 41 41 42 43 43 43 44 44 44 44 45 45 45 45 46 46 46 45 45 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 44 44 43 43 44 44 44 44 44 44 44 45 45 45 45 46 46 47 47 48 49 49 49 49 48 48 47 47 48 48 48 48 48 48 48 48 48 48 49 50 51 51 51 51 51 51 51 51 51 51 50 50 48 48 48 48 49 48 48 48 48 48 48 48 49 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 43 43 43 44 45 45 44 44 43 43 42 42 42 43 43 42 42 41 40 40 41 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 35 35 36 36 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 36 35 35 35 35 35 34 34 34 34 34 34 33 33 33 33 34 33 33 33 33 32 32 32 32 32 32 33 34 34 34 34 34 34 34 34 34 34 34 50 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 49 49 49 49 49 49 48 48 49 49 49 49 49 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 51 51 50 50 50 49 49 50 49 49 49 49 50 50 51 50 50 49 49 49 48 48 47 47 46 46 46 46 46 45 45 45 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 39 37 37 38 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 40 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 43 43 44 44 45 45 45 45 46 46 47 47 47 46 45 45 45 44 44 44 43 42 44 45 45 45 44 45 45 46 46 46 47 47 48 48 49 49 49 50 49 49 49 48 48 47 47 48 48 47 47 46 46 46 46 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 44 44 43 43 43 44 44 44 45 45 44 44 43 42 42 41 40 38 38 39 40 41 42 43 43 42 41 41 41 41 42 43 43 43 43 43 44 44 45 45 45 46 46 45 45 45 45 44 43 43 44 44 44 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 43 43 44 44 44 44 45 45 45 45 45 44 44 43 43 43 44 44 44 44 44 44 45 45 45 45 46 46 47 48 48 49 49 49 49 48 48 47 47 47 47 48 48 48 48 48 48 49 49 50 50 50 51 51 51 51 51 51 50 50 50 50 49 48 48 48 48 49 48 48 48 49 49 49 49 49 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 43 43 43 42 41 42 42 42 42 42 42 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 36 35 36 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 32 33 34 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 46 47 48 48 49 49 49 49 49 48 48 48 48 49 49 50 50 50 50 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 48 48 48 49 49 50 50 51 51 50 50 50 49 49 48 48 47 47 46 46 46 46 46 45 45 44 44 43 43 43 43 43 42 42 42 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 39 38 37 37 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 42 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 42 42 43 44 44 44 45 45 45 45 46 46 46 46 47 46 45 45 44 44 43 43 43 42 44 45 45 44 44 44 45 46 46 46 46 47 47 48 49 49 50 49 49 49 49 48 47 47 47 47 47 47 46 46 46 46 46 45 45 44 44 44 44 44 45 44 43 43 43 43 43 43 44 45 45 44 44 43 43 44 45 45 45 44 44 43 42 41 40 39 38 38 39 40 41 42 43 43 43 42 42 42 42 43 44 44 44 44 44 45 45 45 45 45 46 45 45 45 45 45 44 43 43 43 44 44 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 42 43 44 45 45 45 45 45 45 45 45 44 44 43 43 43 43 44 44 44 44 45 45 45 45 45 45 46 47 48 48 49 49 49 49 48 48 47 47 47 47 47 48 48 48 49 49 49 49 49 50 50 51 51 52 52 51 51 50 50 49 49 49 49 48 47 48 48 48 47 48 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 41 42 42 42 43 43 43 42 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 36 35 36 36 36 37 37 37 37 37 37 37 36 35 35 35 36 36 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 32 32 33 34 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 46 46 47 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 50 50 50 50 50 51 50 50 50 50 50 50 50 50 49 49 49 50 50 50 49 49 48 48 48 48 48 49 49 50 50 51 51 51 51 50 50 49 49 48 48 47 47 46 46 46 46 46 45 45 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 39 39 40 41 41 41 41 41 41 41 40 40 40 39 38 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 41 40 41 42 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 42 42 43 44 44 45 45 45 45 45 46 46 46 46 46 46 45 44 44 43 43 43 43 42 43 44 44 44 44 44 45 45 46 46 46 46 47 48 48 49 49 49 49 49 49 48 48 48 48 48 47 47 46 46 46 46 46 45 45 44 44 45 45 45 45 45 45 44 43 43 43 44 45 45 44 44 45 44 43 43 45 45 45 45 44 44 43 42 42 40 38 38 39 40 40 41 42 43 43 43 43 43 42 43 44 44 45 45 45 45 44 45 45 45 46 45 44 44 44 45 45 44 43 44 45 45 45 46 45 45 45 44 44 44 44 44 44 43 42 42 42 42 43 43 44 44 45 45 45 45 45 44 44 44 44 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 47 48 48 49 49 49 49 48 48 47 47 46 47 47 47 48 48 48 48 48 49 49 50 50 51 51 51 51 51 50 50 50 49 48 49 49 48 47 47 48 47 47 48 48 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 42 42 41 40 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 37 37 37 35 35 35 36 36 36 36 37 37 37 37 36 35 35 35 36 36 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 33 33 33 34 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 50 50 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 47 47 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 49 49 49 49 49 50 49 49 49 49 50 50 50 49 49 49 49 49 49 50 49 48 48 48 48 48 48 49 49 50 50 51 51 51 51 51 50 50 50 49 48 48 47 47 47 46 46 46 46 45 45 45 44 44 44 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 39 39 39 40 40 40 41 41 41 41 41 40 40 40 39 37 37 39 40 40 40 40 40 40 40 40 41 41 40 40 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 41 40 41 41 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 42 43 44 44 44 45 45 45 45 45 46 46 46 46 46 45 45 44 43 43 43 43 42 43 43 43 44 44 44 45 45 46 46 46 46 46 47 47 48 48 48 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 43 43 44 44 43 43 43 44 43 43 44 45 45 45 45 45 45 44 44 44 42 39 38 39 40 40 41 42 42 43 43 44 43 43 43 44 44 44 44 44 44 44 44 45 45 46 45 45 44 44 44 44 43 43 44 45 45 45 46 46 45 45 45 45 44 44 44 43 43 42 42 42 42 43 43 44 44 45 44 45 45 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 46 46 47 47 47 48 48 49 49 49 48 48 47 46 46 46 47 47 48 48 48 48 48 49 49 50 50 51 51 51 51 50 50 50 50 49 48 48 48 48 48 47 47 48 48 48 48 48 49 49 48 48 48 48 47 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 43 43 43 43 43 42 41 40 40 39 39 40 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 36 35 36 35 34 35 35 35 36 36 36 36 36 36 36 35 35 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 50 50 50 51 50 50 50 50 50 50 50 50 50 49 49 49 49 48 48 47 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 48 48 48 48 49 49 48 47 47 47 47 48 49 49 50 50 50 50 50 51 51 51 51 50 49 49 48 48 47 47 47 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 39 39 39 39 39 40 40 40 41 41 41 40 40 40 38 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 42 43 42 42 41 40 40 41 41 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 44 44 44 45 45 45 45 46 46 46 46 46 46 46 45 43 43 43 42 42 43 43 43 43 43 44 44 45 46 46 46 46 46 46 46 47 47 48 48 49 49 49 49 49 48 48 47 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 44 44 44 43 42 39 38 39 40 40 41 41 43 43 44 44 44 43 43 44 44 44 44 44 44 44 44 45 45 46 46 45 44 44 44 44 43 43 44 44 45 45 45 45 45 45 45 45 44 44 44 43 43 42 42 42 42 42 43 44 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 46 46 46 47 47 48 48 48 49 48 48 49 48 48 47 46 46 47 47 47 48 48 48 48 48 49 49 50 50 51 50 50 50 50 50 51 50 49 48 48 48 48 47 47 48 48 48 48 48 49 49 48 48 48 48 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 42 42 41 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 37 37 37 38 38 38 38 38 38 37 36 35 34 34 34 35 36 36 36 36 35 35 35 35 35 35 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 51 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 47 47 47 47 47 47 46 46 47 47 47 47 47 47 48 48 48 48 48 48 49 49 48 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 48 48 48 47 47 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 39 40 40 40 40 40 39 37 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 43 43 42 43 43 44 44 44 45 45 45 45 45 46 46 46 46 46 45 44 43 43 42 42 42 43 42 43 43 43 43 44 45 46 46 46 46 46 46 46 47 47 47 48 48 49 49 49 48 47 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 45 44 44 43 43 43 44 44 45 45 45 45 45 44 44 43 43 43 43 43 42 41 39 38 39 39 40 41 42 43 43 44 44 44 44 44 44 44 44 44 43 44 44 45 45 45 46 46 45 44 44 43 43 43 43 43 44 45 45 45 45 45 45 45 45 44 44 44 44 43 42 42 41 41 42 43 44 44 44 43 42 43 43 44 44 44 44 44 44 45 44 44 44 44 44 45 45 45 46 46 46 47 47 47 47 48 48 48 48 49 48 48 47 46 47 47 47 47 47 47 47 47 48 48 49 49 50 50 50 49 50 50 51 50 50 49 48 48 48 48 47 48 48 49 49 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 42 41 41 41 41 40 40 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 36 34 34 34 35 36 36 36 35 35 35 35 35 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 51 50 50 50 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 48 48 47 46 46 47 47 46 46 46 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 49 49 49 49 49 49 49 49 50 51 50 50 49 49 48 48 48 47 47 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 39 40 40 40 39 38 37 38 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 45 45 44 44 44 44 43 43 43 42 42 43 43 43 44 45 45 45 45 45 45 45 46 46 46 46 45 43 43 43 42 41 41 41 42 43 43 43 44 45 45 45 46 45 45 45 46 46 46 46 47 48 48 49 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 45 45 45 46 46 46 45 45 44 43 43 43 43 43 43 42 42 40 38 38 39 40 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 45 46 45 45 44 44 43 43 43 44 44 44 44 44 45 45 45 45 45 45 44 44 44 43 43 43 42 41 41 42 43 44 44 43 42 42 43 44 44 45 45 45 45 45 45 44 44 44 44 44 45 45 45 45 45 46 46 47 47 47 47 48 48 48 49 48 47 46 46 46 46 47 47 47 47 47 48 48 48 49 49 50 50 49 49 50 51 51 50 50 49 48 48 48 47 47 48 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 41 41 41 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 37 35 34 34 35 36 36 36 35 35 35 35 36 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 35 35 35 34 34 34 34 34 34 33 33 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 51 50 50 50 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 47 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 49 49 49 49 49 49 49 50 50 51 50 49 49 49 48 48 48 47 47 46 46 45 45 45 45 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 39 40 40 39 38 37 37 39 40 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 41 41 41 40 40 41 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 43 43 43 43 42 42 42 42 43 44 44 44 45 45 45 45 45 45 46 45 45 44 43 43 43 42 42 41 41 41 42 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 46 46 45 45 46 46 46 45 45 45 45 44 43 43 43 42 42 42 43 43 42 40 38 38 40 41 42 42 43 43 42 42 42 42 42 43 43 42 42 43 44 45 45 45 46 45 44 44 44 43 43 43 44 44 44 44 44 45 45 46 46 45 45 44 44 44 43 43 43 42 41 41 42 43 43 43 42 42 43 44 44 44 44 45 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 46 46 47 47 47 47 47 48 48 48 47 46 46 46 46 46 46 46 47 47 48 48 48 49 49 50 50 49 49 50 51 51 50 49 49 49 48 48 47 47 48 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 47 48 48 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 44 45 45 44 44 43 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 43 44 44 44 44 44 44 43 43 43 42 41 42 42 41 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 35 35 36 36 36 35 35 35 35 35 36 37 37 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 34 34 34 34 34 34 33 33 34 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 51 51 50 50 50 50 49 49 49 49 49 49 49 50 50 49 49 49 48 48 49 49 49 49 49 48 48 47 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 49 49 48 48 48 48 47 47 46 46 45 45 45 45 45 44 44 43 43 43 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 39 39 38 37 38 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 42 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 44 44 44 43 43 43 43 43 42 42 42 42 43 43 44 44 44 45 45 45 45 45 45 44 44 43 43 43 43 43 42 41 41 41 42 42 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 46 46 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 43 43 42 42 41 42 42 42 42 42 40 38 39 40 41 41 41 42 41 41 41 42 42 42 42 42 43 44 44 45 45 45 46 45 44 44 44 43 42 42 43 43 43 44 44 45 45 45 46 45 45 44 44 44 43 43 43 42 41 41 41 41 42 42 42 42 43 44 44 44 44 44 44 44 44 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 47 46 46 46 46 46 46 46 47 47 47 48 48 49 49 49 49 49 49 50 50 50 50 49 49 49 49 48 47 47 48 48 49 49 49 49 48 48 48 48 48 48 49 48 47 47 47 46 46 46 47 47 47 48 47 47 47 46 46 46 46 46 46 46 45 45 45 45 44 44 44 44 44 45 44 44 43 43 43 43 44 44 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 44 44 44 43 43 43 42 42 42 42 42 42 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 36 35 35 36 36 36 36 37 37 37 36 35 35 35 35 35 35 35 34 34 35 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 47 47 48 49 49 49 49 49 48 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 49 49 50 50 50 50 49 49 49 48 48 48 47 46 46 46 45 45 45 45 44 44 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 40 40 39 38 38 38 38 37 37 39 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 42 42 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 43 43 43 44 44 45 45 45 45 45 45 44 44 44 43 44 44 43 41 41 41 41 42 42 42 43 43 44 44 44 45 44 44 44 45 45 45 45 46 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 45 45 45 45 45 44 44 43 43 43 42 41 41 41 41 41 41 41 39 38 39 39 40 40 41 41 41 42 42 42 43 43 43 43 44 44 44 45 45 46 45 45 44 44 44 43 42 42 42 43 43 44 44 45 45 45 45 45 45 45 45 44 44 44 44 43 42 41 41 41 41 42 43 43 43 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 46 46 46 46 46 47 46 46 46 46 46 46 46 47 47 48 48 48 48 48 49 49 49 49 49 50 50 50 50 49 49 49 49 48 47 47 47 48 48 49 48 48 48 47 48 48 48 49 49 49 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 44 44 43 43 42 42 42 42 43 43 42 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 40 40 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 34 34 34 35 35 35 35 35 34 33 34 35 34 34 34 35 34 34 34 34 34 35 35 35 36 36 35 35 35 35 51 50 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 47 47 48 48 49 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 47 47 47 47 47 48 48 49 49 50 50 50 49 49 49 49 48 48 47 47 46 46 45 45 44 44 44 44 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 38 37 38 37 37 39 39 39 39 40 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 41 41 41 41 40 40 40 42 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 45 44 44 44 44 43 43 43 43 43 43 42 42 41 42 42 43 43 44 44 44 45 45 45 45 45 45 44 43 43 43 43 41 41 41 41 41 41 41 42 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 42 42 41 41 41 41 40 39 39 39 40 41 41 41 42 42 43 43 43 43 43 44 44 44 44 44 45 45 45 45 44 44 44 44 43 43 43 42 42 43 43 44 44 44 45 45 45 44 44 45 44 44 44 43 43 43 42 41 41 41 42 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 46 46 45 45 45 46 45 45 46 46 46 47 47 47 47 47 48 48 48 48 48 48 48 49 50 50 51 50 50 49 49 49 49 48 47 46 47 47 48 49 48 47 47 48 48 49 49 49 49 48 48 47 47 47 47 47 47 47 48 47 47 47 47 47 47 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 44 45 44 44 45 45 44 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 44 43 42 42 42 42 43 43 43 43 42 41 40 39 39 40 41 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 34 34 35 35 34 34 35 34 33 34 35 34 34 34 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 51 51 50 50 50 50 50 50 49 49 49 49 49 48 47 47 47 47 47 47 47 47 48 47 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 47 48 48 49 50 50 50 50 50 49 49 49 48 48 47 47 46 46 46 45 44 44 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 37 37 39 39 39 40 40 40 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 41 41 41 41 40 40 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 42 41 42 42 42 43 43 44 44 44 44 44 45 45 44 43 43 42 41 41 41 40 40 41 41 41 41 42 42 43 43 43 43 44 44 43 44 44 44 44 45 45 45 44 44 44 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 42 41 41 41 41 39 38 40 41 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 44 44 44 44 44 45 44 44 44 44 43 43 42 43 43 42 41 41 41 42 43 43 43 43 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 45 46 46 45 45 44 45 45 45 45 46 46 46 47 47 47 47 47 47 48 48 48 48 48 48 48 49 49 50 50 50 50 49 49 49 49 48 47 46 46 47 48 48 48 47 47 48 48 48 49 48 48 48 48 47 47 47 46 46 46 47 48 48 48 48 47 47 46 46 45 45 44 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 44 44 44 44 45 45 45 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 46 46 45 45 44 43 42 42 42 43 43 44 44 43 42 41 40 39 39 40 40 40 40 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 34 34 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 36 36 35 35 51 51 50 50 50 50 50 50 50 50 49 49 49 48 47 47 46 46 47 47 46 46 47 47 47 48 48 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 48 46 47 48 49 49 50 50 50 50 49 49 49 49 48 48 47 47 46 46 46 45 45 44 44 44 44 44 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 39 39 40 39 39 40 40 40 40 39 38 38 37 37 38 39 40 40 40 39 39 39 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 41 41 41 40 40 41 42 43 43 43 43 42 42 43 43 43 43 43 43 44 44 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 42 42 41 42 43 43 43 45 45 45 44 43 43 42 41 41 41 40 40 40 41 41 41 41 42 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 42 41 41 40 40 39 39 40 41 43 44 44 43 43 43 42 42 43 44 44 44 44 44 44 44 44 44 43 43 44 44 44 44 43 43 43 42 42 42 43 43 43 43 44 44 44 44 44 44 43 43 42 42 42 42 42 41 41 41 41 41 41 41 42 41 41 42 42 43 43 44 44 44 44 44 43 43 44 44 44 44 44 44 45 45 45 46 46 45 44 44 45 45 45 46 46 47 47 47 47 48 47 47 47 48 48 48 48 48 48 48 48 49 49 50 50 50 49 49 49 49 48 47 46 46 47 47 47 47 46 47 48 48 48 48 48 48 48 48 47 47 47 46 46 46 47 47 47 48 48 47 46 45 45 44 44 44 44 44 45 44 44 44 44 44 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 45 44 43 43 43 43 43 43 44 44 44 45 46 46 46 46 46 45 45 44 43 43 44 44 44 45 44 44 44 42 41 39 39 38 39 39 39 40 41 41 41 41 41 40 40 40 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 35 35 51 51 51 50 50 50 50 50 50 50 50 49 49 48 48 47 47 46 46 46 46 47 47 47 47 48 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 47 47 48 48 49 49 49 50 49 49 49 49 49 48 48 48 47 46 46 46 46 45 45 45 44 44 44 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 39 39 40 40 40 40 40 40 40 39 38 37 37 37 37 39 39 39 39 39 39 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 41 41 40 40 40 40 41 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 41 42 44 45 44 43 43 43 43 42 41 41 40 40 40 40 40 41 41 41 41 42 42 43 43 43 43 42 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 42 41 41 41 41 41 40 39 38 39 42 43 43 42 42 42 42 43 43 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 43 43 42 42 42 43 43 43 43 44 44 44 44 44 44 43 43 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 44 44 45 45 46 46 47 47 47 47 47 48 47 47 47 47 48 48 48 48 48 47 47 48 49 49 50 50 50 49 49 48 48 48 47 46 46 46 47 46 46 47 47 48 48 48 48 48 48 48 47 46 46 46 46 46 46 47 47 48 48 47 46 46 46 45 45 44 44 44 45 44 44 44 44 43 43 44 43 43 43 44 44 45 44 44 44 43 43 44 44 44 44 44 44 43 43 43 43 44 44 44 45 45 46 46 47 47 46 46 45 45 44 44 45 45 45 46 45 45 44 43 42 41 40 39 39 38 39 40 41 41 41 41 40 40 40 40 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 37 37 37 38 38 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 36 36 51 51 51 51 51 50 50 49 49 49 49 49 49 48 48 47 46 46 46 46 46 47 48 48 48 48 49 49 49 49 49 49 48 48 48 48 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 48 48 48 48 48 49 48 48 49 49 48 47 47 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 47 46 46 46 46 45 45 45 44 44 44 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 39 38 38 39 38 37 38 38 38 38 39 40 40 40 40 40 40 40 40 40 41 40 40 40 39 39 40 40 40 40 40 39 40 40 41 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 43 44 43 43 43 43 43 42 42 41 41 40 40 40 40 40 41 41 41 41 42 42 43 43 43 43 42 42 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 41 42 42 41 39 39 40 42 42 41 41 42 42 43 43 43 43 43 43 43 42 42 43 43 44 44 44 44 44 44 43 43 42 42 41 41 42 44 44 44 44 44 43 43 43 44 43 43 43 42 42 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 45 46 46 46 46 46 47 47 47 48 47 47 46 47 47 47 47 47 47 47 47 48 48 49 50 50 50 50 49 48 48 48 48 47 46 46 46 46 46 47 47 47 48 48 47 48 48 48 47 46 46 46 46 46 46 47 48 48 47 47 47 47 47 47 46 45 45 45 45 45 44 44 44 43 43 44 43 43 44 45 45 46 45 44 43 43 43 43 44 44 43 43 44 44 43 43 43 43 44 44 45 46 46 46 47 47 46 46 45 45 45 45 45 45 46 46 45 45 44 43 43 43 42 41 40 39 38 39 40 40 40 40 40 40 40 40 41 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 37 37 38 37 37 37 37 37 36 36 36 36 37 37 36 36 36 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 36 36 36 36 36 51 51 52 52 52 51 50 49 49 49 49 49 49 48 47 47 46 45 46 47 47 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 48 48 48 48 48 48 48 49 49 47 46 46 47 47 48 48 48 48 49 49 49 48 48 48 48 48 48 47 47 46 46 46 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 37 37 37 36 37 39 39 39 39 39 39 39 39 40 40 41 40 40 40 39 39 40 40 40 39 39 40 41 42 42 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 45 45 45 45 44 44 44 44 43 43 44 44 44 44 44 44 44 43 43 43 43 42 41 42 42 42 43 43 43 43 42 41 41 40 40 40 40 40 40 40 41 41 41 41 42 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 40 41 42 43 43 43 42 41 39 39 39 40 42 43 43 43 43 43 42 42 42 42 42 42 43 43 44 44 44 44 45 44 43 43 43 42 42 41 42 43 43 43 43 43 42 43 43 44 43 43 43 43 42 42 42 42 42 40 40 41 41 41 42 42 42 42 42 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 45 45 45 45 46 46 46 47 47 47 48 47 47 46 47 47 47 46 46 47 47 47 48 48 49 49 50 50 49 49 48 48 48 49 48 46 46 46 46 46 46 46 47 47 47 47 48 48 47 47 46 46 46 46 46 47 47 48 48 47 47 47 46 46 46 46 45 46 45 45 44 44 44 44 43 43 43 43 44 45 45 45 45 45 44 43 43 43 44 44 44 43 43 44 44 44 43 43 43 43 44 45 46 46 46 47 47 47 46 45 45 45 45 45 45 46 45 45 44 44 43 43 43 43 42 41 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 37 37 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 37 37 36 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 36 36 36 36 36 52 52 52 52 51 51 50 49 49 49 49 48 48 47 46 46 45 46 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 48 48 47 46 46 47 47 47 48 48 48 48 48 48 48 48 48 47 45 46 46 47 47 47 47 47 48 49 49 48 48 48 48 48 48 47 47 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 39 39 40 40 40 39 38 38 38 38 37 36 36 36 37 38 37 37 37 38 38 39 40 40 40 41 40 40 39 39 40 40 39 38 39 40 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 41 41 41 41 42 43 42 42 41 40 40 40 40 40 40 40 40 40 41 41 41 42 42 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 42 43 43 43 43 43 42 40 38 38 40 41 41 41 42 42 42 41 41 41 41 42 43 43 43 44 44 44 44 45 44 44 43 43 44 43 42 41 42 43 42 42 43 43 43 43 44 44 44 44 43 43 43 43 43 42 40 40 40 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 45 45 46 46 46 47 47 47 47 48 47 47 46 46 46 46 46 46 47 47 47 47 48 48 49 49 49 49 49 48 48 48 48 48 47 47 46 46 45 45 46 46 46 46 47 47 47 47 47 46 46 45 46 46 47 47 48 48 47 47 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 44 44 45 45 45 45 44 43 43 43 43 44 43 43 43 44 44 44 44 43 43 43 45 46 46 46 47 47 47 46 46 46 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 41 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 51 52 51 51 51 50 50 49 49 48 48 48 47 46 45 46 46 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 49 49 49 49 49 49 48 47 46 46 47 47 47 48 48 48 48 48 48 48 47 48 46 45 45 46 46 46 47 47 47 48 48 49 48 48 48 48 48 48 47 47 47 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 38 38 37 37 37 37 37 37 37 36 36 37 38 39 40 40 40 40 40 40 40 39 39 38 38 39 40 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 44 43 42 42 41 41 42 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 42 42 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 42 43 43 42 42 41 41 41 41 42 42 43 43 43 43 43 43 42 41 40 39 39 39 39 40 41 41 40 40 40 41 42 42 43 43 43 43 43 44 44 45 45 44 44 44 43 43 42 41 41 42 42 42 43 44 44 44 43 43 43 43 43 44 43 43 43 42 41 40 40 40 41 41 41 42 42 42 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 44 45 45 45 46 46 47 47 47 47 48 48 48 47 46 46 46 46 46 46 46 46 46 47 47 47 48 49 49 48 48 49 48 48 48 48 49 48 47 46 45 45 45 46 46 46 46 46 46 46 47 47 46 45 45 46 47 47 47 47 47 47 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 44 44 45 45 45 44 44 43 43 43 43 43 43 43 44 44 44 44 44 43 43 45 46 46 47 47 47 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 41 39 38 39 40 40 40 40 40 40 40 40 40 40 39 39 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 51 51 51 51 50 49 49 49 48 48 48 47 46 45 46 47 47 48 48 48 48 49 49 49 49 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 48 48 48 48 48 48 48 48 47 47 47 46 45 45 46 46 46 46 46 47 48 48 48 47 47 48 48 48 48 47 47 47 47 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 37 37 38 39 38 38 39 39 39 39 39 38 37 36 37 39 40 40 40 40 40 40 40 39 39 38 39 40 41 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 42 41 41 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 42 42 41 41 42 42 42 42 42 43 43 43 43 42 42 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 42 42 41 41 41 42 43 43 43 43 42 42 42 42 41 41 40 39 39 38 39 39 40 40 39 41 42 43 43 43 43 43 43 43 44 44 45 45 44 43 43 43 42 42 42 41 41 42 43 43 43 43 44 43 43 43 42 43 43 43 43 43 42 41 40 40 40 41 41 41 42 42 42 42 42 42 43 43 43 43 43 44 44 44 43 43 43 42 42 42 42 43 43 44 44 45 46 46 46 46 46 46 47 47 47 48 47 47 47 46 46 46 46 45 45 45 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 46 45 45 45 45 45 46 46 46 46 46 46 45 45 45 46 46 46 47 47 47 47 46 46 46 45 45 45 45 45 44 44 44 45 45 45 45 45 45 44 44 44 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 42 41 39 38 39 39 40 40 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 51 50 50 50 50 49 48 48 48 48 47 46 45 45 46 47 48 48 48 49 49 49 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 48 48 48 48 48 48 48 48 48 48 47 46 46 45 45 45 45 45 45 46 47 48 48 47 47 47 48 48 48 48 47 47 47 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 38 38 39 40 39 39 40 40 40 40 40 39 38 37 37 38 39 40 39 39 40 40 40 39 39 38 39 40 40 41 42 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 40 40 40 41 41 41 41 41 42 42 41 41 41 41 41 41 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 42 42 42 42 43 43 42 42 42 42 42 42 42 41 41 41 40 40 39 38 39 40 41 41 42 42 42 43 43 44 44 44 44 44 45 45 45 45 44 43 43 42 42 42 41 41 42 43 42 42 43 43 43 42 41 41 42 42 42 43 43 42 41 40 40 40 41 41 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 44 44 44 45 45 45 46 46 46 47 47 47 48 47 47 47 46 46 46 46 45 45 45 46 46 46 47 47 48 48 48 48 48 48 47 47 47 47 47 48 47 47 46 45 45 45 45 45 45 45 46 45 45 45 45 45 45 45 46 46 46 46 47 46 46 46 45 45 45 45 45 45 45 45 45 45 45 46 46 46 45 44 44 45 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 44 44 45 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 42 40 39 39 39 39 39 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 51 50 49 49 48 48 47 47 47 47 46 45 45 45 46 47 48 48 49 49 49 50 50 50 51 51 51 50 49 49 49 49 49 49 49 48 48 48 48 48 49 49 48 48 48 48 49 49 49 49 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 48 48 48 48 48 48 48 48 48 48 47 46 45 45 45 45 45 45 45 45 46 47 47 47 47 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 39 38 37 36 37 38 38 39 40 40 40 39 39 38 38 40 40 41 42 42 42 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 42 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 40 40 39 38 39 41 42 42 42 43 43 43 43 43 43 44 44 44 44 45 45 45 45 44 43 43 42 42 42 41 41 42 43 42 43 43 43 43 42 41 41 42 42 42 43 42 41 41 40 40 40 41 41 42 43 42 41 42 42 43 43 42 42 42 42 43 43 43 43 43 42 42 42 42 42 43 43 43 43 44 44 45 46 46 47 47 47 47 48 48 47 47 46 46 46 46 46 45 45 45 46 46 46 47 47 47 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 46 45 45 45 45 45 45 45 46 46 46 46 46 47 46 46 45 45 45 46 46 45 45 45 45 45 45 46 46 46 45 44 44 44 45 45 45 45 43 43 43 43 43 43 43 43 43 44 44 45 45 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 42 40 39 39 39 39 40 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 36 36 35 35 35 35 51 50 48 47 47 47 47 46 45 44 45 46 46 47 47 48 48 48 49 50 50 50 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 47 47 47 48 48 48 48 48 48 48 48 48 47 47 46 45 45 44 44 44 45 45 45 46 46 46 46 47 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 37 37 37 38 39 40 40 39 38 39 40 41 41 41 42 42 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 41 41 41 40 40 40 40 40 39 39 39 38 38 39 39 40 40 40 40 41 41 41 41 41 41 41 40 40 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 39 38 41 42 41 42 42 43 44 44 44 43 43 44 44 44 45 45 45 45 45 44 43 43 42 41 41 41 41 42 43 43 43 43 43 43 42 41 41 41 41 42 42 42 40 40 40 40 40 41 41 42 42 41 41 42 42 43 42 42 42 42 42 43 43 43 43 43 43 42 42 42 42 42 43 43 43 44 44 45 46 47 47 47 47 47 47 48 47 47 46 46 46 46 46 45 45 45 45 46 46 47 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 47 46 45 45 45 46 46 46 46 45 45 46 45 45 46 46 46 45 44 44 44 45 45 44 43 43 43 43 43 43 43 43 44 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 43 42 41 39 39 39 39 39 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 36 36 36 36 36 51 51 49 47 46 47 46 45 45 46 46 46 47 47 48 48 48 48 49 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 47 46 46 47 48 48 48 49 48 48 48 48 47 47 46 45 44 44 44 44 44 44 45 45 46 46 46 46 47 47 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 37 36 37 38 39 39 38 39 40 40 41 41 41 41 42 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 46 46 45 45 45 45 45 44 44 43 43 43 43 42 42 42 42 42 41 41 41 40 40 40 40 39 39 39 39 38 38 38 39 39 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 41 41 40 40 39 38 38 41 42 42 42 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 43 42 42 41 41 41 42 43 43 42 42 43 43 42 42 40 40 41 41 41 41 40 40 40 40 41 41 42 42 41 41 41 42 43 42 41 41 42 43 43 42 42 43 43 43 43 42 42 42 42 42 42 43 43 44 45 45 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 45 45 45 45 46 46 46 46 47 47 47 48 48 48 47 47 47 46 46 46 47 47 47 46 45 45 45 45 44 44 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 46 45 45 45 45 46 45 44 44 45 45 45 44 43 43 43 43 43 43 43 43 44 45 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 42 40 39 39 38 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 35 35 35 35 35 35 35 35 36 36 36 36 52 51 50 47 46 46 45 45 47 48 47 46 47 48 48 48 48 48 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 47 46 46 47 48 48 48 49 48 48 47 47 47 46 46 45 44 44 44 44 44 44 44 45 46 46 46 46 47 47 47 48 48 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 43 42 42 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 38 40 40 40 40 41 41 41 41 42 43 43 43 43 44 44 44 45 45 45 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 43 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 39 39 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 40 40 40 40 40 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 38 38 40 43 43 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 44 43 43 42 41 40 41 42 42 42 42 43 43 43 42 40 40 40 40 40 40 39 39 40 40 41 41 41 41 41 41 41 42 42 41 41 41 42 43 42 42 42 43 43 43 43 43 42 42 42 42 42 43 43 44 45 45 45 46 46 46 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 46 46 46 46 46 47 47 47 47 48 48 47 47 46 46 46 46 46 46 46 45 45 44 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 44 44 45 45 44 44 43 43 43 43 43 44 43 43 43 44 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 45 45 45 45 44 44 44 44 44 44 43 42 40 40 39 38 38 38 39 39 38 38 38 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 35 35 35 35 35 35 35 36 36 36 36 37 52 50 49 46 45 45 44 46 48 49 48 48 48 48 48 48 48 48 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 51 51 50 50 50 50 50 49 49 49 48 48 46 46 47 48 48 49 49 48 48 47 47 47 46 46 45 44 44 44 44 44 44 45 45 45 45 45 46 46 46 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 36 38 40 40 40 40 40 41 41 41 41 42 42 43 43 44 44 45 45 45 46 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 42 41 41 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 40 40 40 39 38 38 38 40 42 42 43 44 43 43 43 43 44 44 44 44 45 45 45 45 45 45 46 45 44 43 43 42 41 40 41 41 41 41 42 42 43 43 42 40 40 40 40 39 39 39 40 40 41 41 41 41 40 40 41 41 41 40 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 44 44 45 45 45 46 47 47 47 47 46 46 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 47 47 47 47 48 47 47 47 46 45 45 46 46 46 46 46 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 47 47 47 47 46 46 46 45 45 45 46 44 43 44 44 44 44 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 44 43 43 43 42 42 41 40 39 38 38 38 39 38 38 38 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 36 36 36 36 36 36 37 37 50 49 47 45 44 44 44 47 49 49 49 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 50 50 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 46 46 47 48 48 49 48 48 47 47 47 46 46 46 45 45 44 44 44 44 44 45 45 45 45 45 45 45 46 47 47 46 46 46 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 37 39 39 39 39 40 40 41 41 41 41 42 43 43 44 44 45 45 45 46 46 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 42 41 41 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 40 40 39 38 38 38 40 40 41 42 42 42 43 43 44 44 44 44 45 44 44 44 44 44 44 45 45 44 43 43 42 41 40 40 40 41 41 42 42 42 43 42 40 40 39 39 39 40 40 41 41 42 42 41 41 40 40 41 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 44 44 44 44 45 45 45 46 47 47 46 46 46 46 47 47 46 45 45 45 45 45 45 46 47 47 46 46 46 46 46 46 47 47 47 47 47 47 47 46 46 45 45 46 46 46 46 45 45 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 43 43 44 44 43 43 44 44 44 43 43 43 44 45 45 45 45 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 43 43 43 42 42 42 41 39 38 38 38 38 38 38 38 39 40 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 35 36 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 36 36 36 35 35 36 36 37 37 47 45 44 44 45 46 47 48 50 50 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 49 49 50 50 49 49 49 49 49 49 49 48 47 46 46 47 48 48 48 48 47 46 46 46 46 46 46 45 45 44 43 43 44 44 45 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 37 39 39 39 39 40 40 41 41 41 42 42 43 43 43 44 45 45 46 47 48 48 48 48 48 47 47 47 46 46 47 47 47 46 46 46 45 45 45 45 44 43 43 44 43 42 42 43 43 43 42 42 41 41 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 40 40 40 40 40 40 40 40 41 40 38 38 40 41 41 41 42 42 43 43 44 44 44 44 45 44 43 43 43 44 44 44 45 44 44 43 42 41 40 40 40 40 41 42 43 42 42 41 40 39 39 39 40 41 42 42 42 42 42 41 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 44 44 44 44 44 44 44 45 45 46 46 46 46 46 46 47 47 46 45 45 45 45 45 45 45 46 46 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 46 45 45 45 45 45 45 46 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 45 45 45 45 45 44 43 43 44 44 44 44 44 43 43 43 44 45 45 45 45 45 46 46 46 45 45 45 44 44 44 44 44 44 44 44 44 43 43 44 44 44 45 45 45 45 44 43 43 43 43 43 43 43 41 39 38 38 38 38 38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 37 36 36 37 37 37 36 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 35 35 36 36 37 37 44 44 45 46 48 49 49 50 50 51 51 51 52 52 51 51 50 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 46 46 46 47 47 47 47 46 46 46 46 46 46 45 45 45 44 44 43 43 44 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 47 47 47 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 36 37 39 40 40 40 40 41 41 41 41 42 42 43 43 43 44 45 45 46 48 48 48 48 48 47 47 47 47 46 46 47 46 46 46 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 40 40 40 40 40 40 39 38 38 41 42 42 43 42 43 43 43 43 43 44 44 44 44 43 43 43 43 44 44 44 44 44 43 42 41 40 40 40 40 40 41 42 42 41 40 39 39 40 40 41 42 42 42 43 43 41 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 43 43 43 43 43 44 44 44 44 45 44 44 44 44 45 45 45 46 46 46 46 47 47 47 46 45 44 45 45 45 45 46 46 46 46 47 47 47 47 46 46 46 46 47 47 47 47 47 47 46 46 45 45 45 45 45 46 45 45 44 44 44 43 43 44 44 44 45 45 45 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 43 42 43 44 45 45 45 46 46 46 46 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 44 44 44 45 45 45 45 45 44 43 43 44 44 43 43 42 40 38 38 38 38 38 38 39 39 39 39 39 39 39 39 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 36 36 36 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 36 36 37 37 43 45 47 49 49 49 50 50 51 51 51 52 53 54 53 53 53 51 51 50 50 51 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 47 46 45 45 46 46 47 46 46 46 46 46 45 45 45 45 45 44 44 43 43 44 45 45 45 45 45 45 45 45 46 46 47 47 47 47 47 48 47 47 47 46 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 37 36 37 38 39 40 40 41 41 41 41 42 42 43 43 43 43 44 45 46 47 48 48 47 47 47 46 46 45 45 45 45 45 45 45 45 44 44 43 42 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 40 39 39 39 39 38 38 38 39 40 41 42 42 43 44 44 43 43 44 44 44 44 43 43 42 42 43 43 43 44 44 44 43 42 41 41 40 39 40 41 41 41 40 39 39 40 41 42 42 42 42 42 42 42 41 40 40 41 41 41 41 40 40 40 41 41 41 41 41 41 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 46 47 47 47 47 47 46 45 44 44 45 45 45 45 46 46 46 46 47 47 47 47 47 47 46 46 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 44 44 44 45 45 45 46 46 46 45 45 45 45 44 44 44 45 45 45 45 45 45 45 45 45 46 46 46 45 44 43 43 43 43 42 42 42 43 43 42 43 44 44 45 45 46 46 46 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 46 46 45 44 44 44 44 44 43 43 42 40 39 38 38 38 38 38 39 39 39 39 39 39 39 39 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 43 46 48 49 50 50 51 51 51 52 52 53 53 54 55 55 55 53 52 52 51 51 51 51 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 49 48 48 47 46 45 46 46 46 46 46 45 45 45 45 45 45 45 45 44 43 43 43 44 44 45 45 44 44 45 45 45 46 46 47 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 36 36 38 39 39 40 40 41 41 41 41 41 42 42 43 43 43 44 45 46 47 48 47 47 46 46 46 45 45 44 44 43 43 43 44 43 43 43 42 42 42 41 41 41 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 40 40 40 40 39 39 39 39 39 40 40 40 39 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 39 38 38 38 38 38 37 38 40 40 40 42 43 43 44 45 44 44 44 44 44 44 43 43 42 41 42 42 43 43 44 44 43 43 42 41 41 40 39 40 40 40 40 39 39 41 42 43 43 42 41 40 40 40 40 40 41 42 42 41 41 41 40 40 40 40 41 41 41 41 42 43 43 43 43 43 43 43 44 44 44 43 43 43 44 44 44 45 46 46 46 46 46 46 46 44 44 44 45 46 46 46 46 47 47 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 44 44 44 44 44 44 43 43 43 44 44 44 45 45 45 46 46 45 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 46 46 45 45 44 43 43 43 44 43 42 43 44 44 43 44 44 44 45 45 45 46 46 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 46 46 45 45 45 45 44 43 43 42 42 41 38 37 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 37 36 36 36 44 47 48 50 51 52 52 52 51 51 52 53 53 54 55 56 55 54 53 52 52 51 51 51 51 51 51 50 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 50 50 50 51 51 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 45 45 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 44 44 44 44 44 44 45 45 45 45 46 47 47 48 48 48 48 48 49 48 48 48 48 47 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 38 37 38 39 39 40 40 40 40 41 41 41 41 42 42 43 43 43 44 45 45 47 48 47 47 46 46 46 46 46 45 44 44 44 43 42 42 42 41 41 41 41 41 41 41 41 41 42 41 41 41 41 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 38 39 39 40 41 42 41 41 42 44 44 45 45 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 44 44 43 43 42 42 41 40 39 39 39 39 39 40 41 42 43 42 41 40 40 40 40 40 41 41 42 42 42 42 42 41 41 40 40 41 41 41 41 42 43 43 43 43 43 43 43 44 43 43 43 43 43 44 44 44 45 45 46 45 45 45 46 45 44 44 45 45 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 47 47 47 46 46 46 46 45 44 44 44 44 44 44 44 43 43 43 44 44 45 45 45 46 46 45 45 45 45 45 44 44 43 43 43 43 43 44 44 45 45 45 45 45 45 44 44 44 43 43 43 43 44 44 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 44 44 43 42 41 41 40 38 37 37 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 37 37 37 37 44 45 46 48 49 50 50 50 49 48 51 53 54 55 55 55 55 54 53 52 52 52 52 52 51 51 51 50 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 50 50 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 45 45 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 45 46 46 47 47 47 48 48 49 49 49 49 49 48 48 47 47 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 37 39 39 40 40 40 40 41 41 41 41 41 42 42 43 43 44 45 45 47 48 47 47 47 47 47 48 48 48 46 45 45 44 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 39 39 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 37 37 37 37 38 39 41 43 43 43 42 41 42 43 44 44 45 44 43 42 42 42 42 42 42 42 42 41 41 42 43 43 43 43 43 42 42 42 41 40 39 39 38 39 40 41 41 42 42 41 40 40 41 41 41 41 42 42 42 43 43 43 43 42 41 40 40 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 44 44 44 44 45 45 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 47 47 48 48 48 47 47 47 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 44 44 44 45 45 45 46 46 45 45 45 44 44 43 43 43 43 43 44 44 45 45 45 44 44 45 44 44 44 43 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 46 45 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 45 45 45 45 44 43 41 40 40 39 37 37 37 37 38 38 38 38 38 39 39 39 39 39 39 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 36 37 36 36 42 43 44 46 48 48 46 46 47 48 51 53 53 55 56 55 55 54 53 53 52 52 52 52 51 51 51 50 50 49 49 49 49 49 48 48 47 47 47 48 49 49 49 49 50 50 50 50 50 50 50 51 51 51 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 45 45 46 46 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 46 46 46 47 48 48 49 49 49 49 49 49 49 48 48 48 47 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 39 37 36 38 40 40 40 40 41 41 41 41 41 41 42 42 43 43 44 45 46 47 48 47 47 47 47 48 49 50 49 48 46 45 45 44 43 43 42 41 41 41 41 40 40 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 38 37 37 37 37 38 40 42 43 44 44 44 44 43 43 43 44 44 44 44 43 42 42 42 42 41 42 43 42 40 41 42 42 42 43 42 42 42 41 40 40 40 39 38 39 39 40 41 41 41 40 40 41 41 42 42 42 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 44 44 44 45 46 46 47 47 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 48 48 48 47 47 46 46 46 46 46 46 46 45 45 44 43 43 43 43 43 43 43 43 44 45 45 45 45 46 45 45 44 44 44 44 43 43 43 43 44 45 44 44 44 44 44 44 44 44 43 42 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 44 43 42 41 40 39 38 37 37 37 37 38 38 38 38 39 39 40 40 40 39 39 39 38 38 37 37 38 38 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 36 41 41 42 45 46 46 44 44 46 50 51 49 49 54 57 57 56 55 54 53 53 52 52 52 51 51 51 51 50 50 50 50 49 49 49 48 47 47 46 47 48 48 49 49 49 50 50 50 50 50 50 51 50 50 50 50 49 49 49 49 48 48 48 48 47 47 47 47 47 47 46 45 45 45 46 45 45 44 44 43 43 44 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 46 47 47 48 48 48 49 49 49 49 49 49 49 48 47 46 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 38 36 37 39 39 39 40 40 41 41 41 41 41 41 42 42 42 43 44 44 45 46 48 48 47 47 47 48 49 50 50 49 48 47 46 46 45 45 44 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 37 37 37 37 37 39 42 43 42 43 43 44 44 44 44 44 44 44 44 43 43 43 43 42 41 41 42 41 41 40 41 41 41 42 42 42 42 41 41 42 41 39 38 38 38 39 39 40 40 40 41 41 42 42 42 42 43 42 42 42 43 43 43 42 41 41 41 41 41 41 41 42 43 42 42 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 47 47 47 47 48 48 48 47 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 43 43 44 44 44 45 45 45 45 45 44 44 44 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 42 41 42 43 43 43 43 43 44 44 45 45 45 45 46 46 46 45 45 46 46 45 44 43 43 43 44 43 43 43 43 43 43 43 43 45 45 45 45 45 45 45 46 46 44 43 42 42 41 40 39 38 37 37 37 37 38 38 38 38 39 40 40 40 39 38 38 38 37 37 37 38 39 39 39 39 38 38 38 38 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 36 42 41 41 42 43 43 43 43 45 46 46 44 45 49 52 55 56 55 54 54 53 52 52 52 51 51 51 51 51 51 51 50 50 49 49 48 48 47 46 46 47 48 48 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 47 47 47 47 46 46 46 46 46 45 44 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 45 45 45 46 46 46 47 48 48 48 48 49 49 50 50 49 47 46 46 45 45 44 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 39 39 39 39 40 40 39 39 40 39 39 39 39 39 39 39 39 39 39 38 37 37 38 39 39 39 40 40 40 40 40 41 41 41 41 41 42 42 43 44 45 46 47 48 47 47 47 48 49 50 51 50 50 49 48 48 47 47 46 44 44 42 41 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 39 39 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 37 37 39 40 42 43 43 44 44 44 45 45 45 45 44 43 43 43 42 41 40 40 41 41 41 40 40 40 41 42 42 42 42 42 42 42 41 39 38 38 38 39 39 40 40 41 41 41 41 41 41 42 42 42 42 42 43 43 43 42 41 42 42 41 41 41 41 41 42 42 42 43 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 43 43 43 43 43 44 44 44 44 45 45 45 44 43 43 43 43 43 43 44 44 43 43 42 42 42 42 43 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 44 43 43 43 43 43 43 43 43 44 45 45 44 44 44 45 46 46 44 43 43 42 41 41 40 39 38 38 37 37 37 38 38 39 39 40 40 39 39 38 38 38 38 38 39 38 38 39 39 39 39 39 39 39 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 35 34 35 35 35 35 35 35 36 36 35 36 36 36 37 46 42 41 41 41 41 41 41 42 42 42 41 42 43 44 48 53 55 54 54 53 53 52 52 52 52 52 52 52 52 51 50 49 49 49 48 48 47 46 46 47 48 48 48 49 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 46 47 47 47 47 48 49 49 49 49 48 48 47 46 45 45 45 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 39 40 39 39 38 38 38 38 38 38 38 37 37 37 38 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 42 43 44 45 46 47 47 47 47 47 48 49 50 51 52 52 51 51 50 49 49 48 47 46 44 43 42 42 41 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 39 39 39 40 39 39 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 43 43 42 40 39 38 37 38 40 43 44 44 44 43 43 44 45 45 44 43 42 42 42 41 41 41 40 40 41 41 41 40 40 41 42 42 42 42 42 42 42 40 39 38 38 39 39 39 40 40 40 40 40 41 41 42 42 42 42 42 42 43 43 43 43 42 42 42 41 41 41 41 41 42 42 42 43 42 42 42 42 43 44 44 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 44 45 45 45 46 46 46 46 46 45 45 46 46 46 46 46 47 47 47 47 47 48 47 47 46 46 46 46 46 46 46 45 45 46 46 46 45 45 44 44 44 43 43 43 43 43 43 44 44 44 45 45 44 43 42 42 43 43 44 43 43 43 42 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 45 45 44 44 45 45 44 43 43 42 43 43 43 43 42 42 43 42 42 43 43 44 44 45 44 43 43 44 45 46 45 44 43 43 42 41 41 40 39 39 38 37 37 37 37 38 39 40 39 39 39 38 38 37 39 40 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 52 49 45 43 42 41 41 41 41 41 41 41 41 41 41 43 49 53 53 53 53 53 53 52 52 52 52 52 53 52 51 50 49 49 49 49 48 47 46 46 46 48 48 48 49 50 51 50 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 45 44 44 44 44 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 46 46 46 47 47 47 47 48 48 48 48 49 48 48 48 47 46 45 45 45 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 39 38 38 38 38 37 37 36 36 37 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 43 44 45 46 47 47 46 47 47 48 49 50 51 51 51 51 51 50 50 49 49 48 46 45 44 43 42 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 38 38 38 38 39 39 40 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 39 40 39 39 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 43 43 43 43 44 45 45 45 43 41 39 38 37 38 40 43 44 43 43 42 42 44 44 44 44 44 43 42 41 41 41 41 40 40 40 41 41 40 39 40 41 41 42 42 41 41 41 39 38 38 39 39 39 39 40 40 40 40 40 41 41 42 42 43 43 43 43 43 44 44 43 42 42 42 42 42 42 41 41 41 42 42 42 42 42 42 42 43 43 44 44 44 43 43 43 43 44 43 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 46 46 45 45 46 46 47 47 47 47 47 48 47 46 46 46 46 45 45 45 45 45 46 46 46 46 45 45 44 44 44 43 43 43 43 43 43 43 43 44 44 44 43 42 42 42 43 43 43 42 42 41 41 41 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 43 43 42 42 42 43 43 43 42 42 42 42 42 42 43 43 44 45 44 44 43 43 45 45 46 45 44 43 43 42 41 41 40 40 39 38 37 37 37 37 38 39 40 39 38 38 37 37 38 39 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 54 56 54 52 50 47 45 44 44 44 43 43 42 41 41 41 45 51 53 52 52 53 53 53 53 52 51 51 52 52 50 49 48 48 48 48 48 47 46 46 46 47 48 48 49 50 51 50 49 49 49 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 45 45 44 44 44 44 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 46 47 47 48 48 48 49 49 49 49 48 48 49 48 48 48 48 47 46 45 45 45 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 37 37 36 36 37 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 43 44 45 46 47 46 46 46 46 47 48 49 50 51 51 51 51 51 51 50 50 49 48 47 46 44 43 42 41 41 41 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 39 39 39 39 40 39 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 40 39 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 42 42 43 44 44 44 45 45 45 45 45 44 43 41 38 37 37 37 38 40 41 41 41 41 41 42 43 44 44 44 43 43 42 41 40 40 40 39 40 40 40 40 39 40 41 41 41 41 40 40 39 38 38 38 39 40 40 40 41 41 41 42 42 41 40 41 42 43 43 44 43 43 44 43 43 43 43 42 42 43 43 42 42 41 41 42 41 41 42 42 42 42 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 46 46 45 45 45 46 46 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 46 46 45 45 45 44 44 44 43 43 43 43 43 43 43 43 44 44 43 42 42 42 43 43 43 42 41 41 41 41 41 42 43 43 43 43 44 44 44 44 44 43 43 43 44 44 43 43 42 42 43 43 43 42 42 42 43 43 42 42 41 41 41 41 42 42 42 43 44 44 44 43 43 44 45 45 46 45 44 43 43 42 41 41 40 40 39 38 37 37 37 37 38 38 39 38 38 37 38 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 51 56 59 58 55 53 53 53 51 50 49 46 43 41 41 41 42 49 54 53 52 52 52 52 52 52 51 50 50 50 50 49 48 48 47 47 47 47 46 45 46 47 47 48 48 49 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 47 46 46 45 45 46 45 44 43 43 44 45 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 46 46 47 47 47 48 48 48 49 49 49 50 51 51 51 50 49 49 48 48 48 47 47 46 46 45 45 44 44 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 39 38 37 37 36 36 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 43 44 46 46 46 45 45 46 46 47 48 49 50 50 51 51 51 51 51 50 49 49 48 47 46 44 43 42 41 41 41 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 43 43 44 44 45 45 46 46 46 46 45 44 43 41 39 38 37 37 38 38 38 39 38 39 39 40 42 43 43 44 44 43 42 41 40 40 40 39 38 39 39 39 40 40 40 40 40 40 39 39 38 38 38 39 40 40 41 41 41 41 43 43 43 42 41 41 42 42 43 44 44 43 44 43 43 43 43 43 43 43 43 43 43 42 42 42 41 42 42 42 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 46 46 46 46 46 46 46 46 45 45 46 46 47 47 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 45 45 44 44 44 44 43 43 43 42 42 43 43 44 43 43 43 42 42 42 42 43 42 41 41 41 41 41 41 42 43 43 43 43 44 43 43 43 43 42 43 43 43 42 42 42 42 42 42 42 42 42 42 43 42 42 41 41 41 41 41 41 42 42 43 43 44 43 43 43 43 44 45 46 45 44 43 43 42 41 41 40 40 40 39 37 37 37 37 37 37 38 38 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 48 51 53 54 53 52 55 56 54 53 52 48 43 41 41 41 42 46 52 54 53 52 51 51 52 51 50 49 49 49 49 48 48 47 47 46 46 47 46 45 46 47 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 45 45 46 45 43 43 43 44 45 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 44 44 44 45 45 46 46 46 47 48 48 49 49 49 49 50 50 51 51 51 52 52 52 52 51 50 49 49 48 47 46 47 47 46 45 44 44 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 39 40 39 38 37 36 36 38 39 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 43 45 45 46 45 45 45 45 46 47 48 49 50 50 50 51 51 50 50 49 49 49 48 47 46 45 44 43 41 41 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 41 41 41 41 41 42 42 42 43 43 43 43 43 44 45 45 46 46 46 46 46 46 45 44 42 43 42 41 41 41 41 39 38 38 38 37 38 41 42 42 43 43 43 42 41 41 40 40 39 38 38 39 39 40 40 39 39 39 39 38 38 38 38 39 40 41 41 41 41 41 42 43 43 43 43 42 41 41 42 42 43 43 43 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 43 43 43 44 45 44 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 46 46 46 46 46 45 45 45 45 45 45 45 46 45 45 45 45 44 44 44 44 43 43 42 42 42 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 42 42 43 43 44 43 43 42 42 42 42 42 42 41 41 41 42 42 42 41 42 42 43 43 42 41 41 41 41 41 41 41 41 42 42 43 43 43 42 42 43 44 45 45 45 44 44 43 42 41 41 40 40 40 39 38 37 37 37 37 37 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 39 39 39 39 38 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 46 46 49 52 50 50 52 53 52 49 50 49 45 42 41 41 41 44 50 54 53 51 51 52 53 51 50 49 48 48 48 48 47 46 46 46 46 46 45 45 46 47 47 47 48 48 48 48 48 48 49 49 49 49 49 50 49 48 48 47 47 46 46 46 45 45 45 44 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 44 44 44 45 45 45 46 46 47 48 48 49 50 50 51 51 51 52 52 52 52 53 53 53 53 53 51 50 50 49 48 47 46 46 47 47 46 45 45 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 40 39 38 37 36 36 37 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 43 44 45 45 46 45 45 45 45 46 47 48 49 49 50 50 50 50 50 49 49 49 48 48 47 46 46 44 42 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 41 41 41 41 42 42 42 43 43 43 43 44 44 44 45 45 46 46 46 46 46 46 45 44 43 44 44 44 44 44 44 42 41 41 40 38 37 39 41 42 42 42 41 41 41 41 40 40 38 38 38 39 38 38 38 37 37 37 37 38 38 38 39 40 41 42 42 42 42 42 43 44 43 43 43 43 42 41 42 42 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 46 45 45 45 46 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 42 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 43 42 42 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 43 43 44 45 45 44 43 43 43 42 41 40 40 39 39 38 37 37 37 37 37 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 39 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 45 44 46 49 48 48 48 48 48 46 46 47 45 41 41 41 42 46 51 53 52 50 50 53 53 52 51 49 48 47 47 47 47 46 45 45 45 45 45 46 47 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 49 49 48 47 47 46 46 46 46 45 44 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 42 42 42 43 43 44 44 44 44 45 45 45 46 47 48 48 49 50 51 52 52 52 53 53 53 53 53 54 54 54 54 53 52 51 50 49 48 47 46 46 47 47 47 46 45 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 36 36 37 37 38 39 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 41 42 42 43 44 45 45 45 45 45 45 45 46 47 48 48 49 49 50 49 49 49 49 49 48 48 48 47 47 46 45 44 43 42 41 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 39 40 40 40 40 40 41 41 41 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 45 44 44 44 43 43 42 43 43 43 44 44 42 41 38 37 38 40 41 41 40 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 38 38 38 40 41 41 41 42 42 42 43 43 43 44 44 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 42 42 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 44 44 43 43 43 42 41 41 40 39 38 38 38 37 37 37 37 37 37 38 38 38 38 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 37 37 37 37 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 49 47 45 45 44 44 45 44 44 43 43 43 42 41 41 41 42 47 51 51 51 49 47 48 50 52 51 49 47 47 46 46 46 45 44 44 45 45 45 47 48 49 48 48 48 48 48 48 48 48 48 48 47 48 49 49 49 49 48 48 47 46 46 45 45 45 44 43 43 43 43 43 43 44 44 45 45 44 43 43 43 43 43 42 42 42 43 43 43 44 44 44 44 45 45 46 46 47 48 49 50 51 52 52 53 53 54 54 54 54 54 54 55 56 55 54 53 52 51 50 49 48 47 46 46 47 47 47 46 45 44 44 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 36 36 36 37 38 39 39 40 39 39 40 40 40 39 39 39 40 40 40 40 40 41 41 41 42 43 44 45 45 45 44 44 45 46 46 47 48 48 49 49 49 49 49 49 48 48 47 48 48 48 47 46 46 45 44 44 43 41 41 41 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 40 40 40 41 41 41 41 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 45 45 45 44 45 44 43 42 42 41 42 43 43 43 41 40 38 38 39 40 40 40 40 39 39 39 39 38 37 37 37 37 37 37 37 38 38 39 39 39 38 39 39 40 41 41 41 41 42 42 43 43 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 43 43 44 44 43 43 42 42 42 42 42 43 43 44 44 44 44 44 44 44 44 45 45 45 44 44 44 44 45 45 45 46 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 45 45 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 42 42 42 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 42 41 41 40 40 39 38 38 38 38 37 37 37 37 37 37 38 38 38 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 37 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 37 37 50 48 46 44 43 43 43 42 41 42 42 42 42 41 41 41 42 46 49 48 47 47 46 45 46 49 51 51 48 46 46 46 46 45 44 44 45 46 47 49 50 50 50 50 50 50 49 49 48 48 47 47 46 47 48 48 48 48 48 47 46 45 45 45 44 44 43 43 43 43 44 44 44 44 45 45 44 44 43 43 43 43 43 42 42 43 43 43 44 44 44 44 44 45 45 46 47 47 48 49 50 51 52 53 53 54 54 55 55 55 55 55 56 57 56 55 54 52 51 50 49 48 47 46 46 46 47 47 46 45 45 44 44 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 37 37 36 36 37 37 38 39 39 39 39 40 40 39 39 40 39 39 40 40 40 40 41 41 42 43 43 44 45 45 44 44 45 45 46 47 47 48 48 49 49 49 49 49 48 47 47 47 47 48 47 46 46 46 46 46 44 42 41 41 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 39 40 40 40 40 40 41 41 41 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 45 46 45 44 44 43 42 42 41 41 41 42 42 42 41 39 38 38 39 40 40 39 39 39 39 38 37 37 37 37 37 38 39 39 40 40 40 40 41 40 39 40 40 41 42 41 41 42 43 43 44 44 44 44 44 43 43 43 43 43 43 43 42 42 43 43 42 42 42 42 42 42 42 43 44 43 43 43 43 42 42 42 42 43 43 43 43 42 42 42 42 42 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 46 47 47 47 47 47 47 47 47 47 46 45 45 45 45 45 44 44 44 45 44 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 42 41 41 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 39 39 40 40 40 40 40 39 39 40 40 40 39 39 39 39 39 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 37 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 36 35 35 35 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 45 45 44 44 43 43 43 43 43 43 48 47 42 41 41 41 42 44 45 45 44 45 45 44 43 46 49 51 50 47 45 45 45 45 44 45 46 46 48 51 52 51 51 52 52 52 51 50 49 48 47 46 46 45 46 47 47 46 46 45 45 45 45 44 44 43 43 43 43 44 44 45 45 45 45 45 44 44 43 43 43 43 43 42 42 43 43 43 44 44 44 44 44 45 45 46 47 47 48 49 50 51 52 53 53 54 54 54 55 55 56 56 56 56 55 54 53 52 51 50 49 48 47 46 45 45 46 46 46 46 45 45 44 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 36 37 37 38 38 38 39 39 39 39 40 39 39 39 40 40 40 40 40 41 41 42 42 43 44 44 44 44 44 45 45 46 46 47 48 48 49 49 49 49 48 48 47 46 46 46 46 45 45 45 45 46 45 43 42 41 41 40 39 39 39 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 39 40 40 40 40 41 41 41 42 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 46 46 47 46 46 46 45 45 45 44 43 43 43 42 41 40 40 41 41 41 41 40 38 37 37 39 40 39 38 39 39 37 37 37 37 37 38 39 40 40 41 41 41 42 42 41 41 41 41 41 42 42 42 42 43 44 44 44 44 44 44 44 44 44 43 43 42 42 42 42 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 46 46 46 46 46 47 47 47 47 47 47 47 47 46 46 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 42 42 41 41 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 37 37 37 38 38 39 39 40 40 40 39 39 39 40 39 39 39 39 39 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 36 36 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 44 45 46 44 44 46 47 47 47 46 51 52 45 42 41 41 41 43 43 43 42 43 43 42 42 44 46 48 49 48 45 44 44 44 44 46 46 47 49 51 52 52 52 53 54 53 52 51 50 49 47 46 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 45 45 45 44 44 43 43 43 43 42 42 42 43 43 43 44 44 44 45 45 45 45 45 46 47 48 49 50 51 52 52 53 53 54 54 55 56 56 57 56 55 54 53 53 52 51 50 49 48 47 46 45 45 46 46 47 46 46 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 37 36 37 37 38 38 38 38 38 38 39 39 39 39 40 40 40 40 40 40 41 41 42 42 42 43 44 44 44 44 44 45 45 47 48 48 49 49 50 50 49 49 48 47 46 45 45 45 44 44 45 45 45 44 44 42 41 40 40 40 40 39 39 40 40 39 39 38 38 38 38 37 37 37 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 39 39 39 40 40 41 42 43 43 44 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 47 46 46 45 45 44 45 45 44 44 43 42 42 41 40 40 41 41 41 40 38 37 37 38 38 38 38 38 38 37 37 37 37 38 38 39 39 40 41 41 42 42 42 42 42 42 42 42 41 41 42 42 43 43 44 44 45 45 44 44 44 44 44 43 42 42 42 43 43 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 44 44 44 45 45 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 46 45 45 45 45 45 44 44 44 44 44 45 44 43 43 43 43 43 43 43 43 43 43 42 42 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 43 42 41 41 41 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 38 38 37 37 37 37 38 38 38 38 39 39 39 40 39 39 40 39 38 39 40 40 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 37 37 36 36 37 37 36 36 36 36 36 35 35 35 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 47 47 50 49 46 49 52 51 50 48 50 53 50 43 41 41 41 41 41 41 41 41 41 41 41 41 42 43 44 47 45 43 43 44 45 45 46 47 49 50 52 52 53 55 55 55 54 52 51 50 49 47 45 45 45 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 44 44 43 43 43 43 42 42 42 43 43 43 44 44 44 45 45 45 45 45 46 47 48 48 49 50 51 52 53 53 54 55 56 57 57 57 56 55 54 53 52 52 51 50 49 48 47 46 45 45 45 46 46 46 46 46 45 45 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 39 38 38 38 37 37 36 36 37 37 37 37 37 37 37 38 39 40 39 39 39 40 40 40 40 41 41 41 41 42 43 43 43 44 44 44 45 46 47 48 48 49 50 50 50 50 49 49 47 46 45 45 44 44 44 45 45 44 44 43 42 41 41 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 38 38 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 39 39 39 40 41 42 43 43 44 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 44 44 44 44 44 43 43 42 41 40 40 40 40 40 39 38 36 37 37 37 37 37 38 38 37 37 37 37 38 40 40 40 40 40 40 41 42 42 43 43 43 43 43 43 43 42 42 43 43 44 44 44 44 45 44 44 44 44 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 42 42 42 43 43 43 43 42 42 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 46 47 47 47 47 47 47 46 46 46 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 41 41 41 40 40 40 39 38 38 38 38 38 38 38 37 37 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 39 39 38 39 38 38 39 40 40 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 36 36 37 37 36 36 36 36 36 36 36 35 34 34 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 36 36 36 37 36 49 48 52 53 49 50 54 54 53 50 50 53 51 47 43 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 41 42 44 45 44 45 48 50 52 54 54 55 56 57 57 56 55 54 53 51 48 45 45 44 44 44 43 43 44 44 44 44 44 43 44 44 44 44 44 45 45 45 45 45 45 45 44 43 43 43 43 42 42 42 43 43 43 44 44 45 45 45 45 45 46 46 46 47 48 49 50 51 52 53 54 55 56 56 56 57 57 56 55 54 53 52 52 51 50 49 48 47 46 45 45 45 45 46 47 47 46 46 45 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 39 40 39 38 38 38 38 37 36 36 36 36 37 37 37 37 38 39 40 39 39 39 40 40 40 40 40 41 41 41 41 42 43 43 44 44 44 44 45 46 47 48 49 50 50 51 50 50 49 48 46 45 45 45 44 44 44 44 44 43 43 43 42 42 41 40 40 39 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 39 39 39 40 40 42 43 43 43 44 45 45 46 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 45 45 45 45 44 43 43 43 43 43 43 42 40 40 39 39 40 40 39 38 36 36 37 37 37 37 38 38 37 36 37 38 39 40 41 41 41 40 40 41 41 42 43 43 44 43 43 43 43 43 43 43 43 43 44 44 44 45 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 42 42 42 42 42 42 42 42 42 43 44 44 44 43 44 44 44 45 45 45 45 45 45 45 45 45 46 46 47 47 46 46 46 46 46 46 45 45 45 44 44 44 44 43 44 44 44 44 44 43 43 43 43 44 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 44 44 44 43 42 41 41 40 40 40 39 39 38 38 38 38 38 37 37 37 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 41 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 36 36 36 35 35 35 36 36 35 35 34 34 34 34 35 34 34 35 35 35 36 36 36 36 36 36 36 36 36 36 36 36 36 49 49 53 55 52 52 55 56 54 52 52 53 52 49 44 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 45 44 44 45 49 51 53 55 56 55 56 57 56 56 57 55 52 50 47 45 44 44 44 44 45 45 46 46 46 45 45 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 42 42 42 43 43 43 44 44 45 45 45 45 46 46 46 46 47 48 49 50 51 52 53 54 55 55 55 55 56 56 56 55 54 53 52 52 51 50 49 48 47 46 45 45 45 45 45 46 47 47 47 46 45 45 45 44 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 40 39 38 38 38 38 38 37 37 37 36 36 36 35 36 36 37 38 38 38 39 40 40 40 40 40 40 40 41 41 41 41 42 43 43 43 43 43 44 45 46 47 48 49 50 50 50 49 49 48 47 46 45 45 45 44 44 45 44 43 42 42 42 42 41 40 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 39 40 40 40 41 42 43 43 44 44 45 45 45 45 45 45 45 44 44 45 45 45 45 46 46 46 46 45 45 45 45 44 43 43 43 43 42 42 41 40 40 39 39 39 39 40 38 37 36 36 36 37 37 37 37 37 36 37 39 40 41 41 41 42 42 42 42 42 42 43 43 43 42 42 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 43 42 42 42 42 42 42 42 43 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 41 41 42 42 43 42 42 42 42 42 42 42 43 43 44 44 44 44 44 44 44 45 45 46 46 46 46 46 45 45 46 46 46 46 46 45 46 46 46 46 45 45 45 45 44 44 44 43 43 44 44 44 44 43 43 43 44 44 44 44 43 43 42 42 42 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 41 41 41 41 41 41 42 42 41 41 41 41 41 43 43 43 44 44 44 44 43 43 42 41 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 37 38 38 37 37 37 37 38 37 37 38 38 38 38 38 38 38 38 38 38 39 39 39 40 40 40 41 41 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 50 51 53 55 54 55 58 57 54 53 54 54 52 50 47 44 43 44 46 45 43 44 44 42 43 43 41 41 41 41 41 42 43 43 43 44 47 50 52 53 54 54 53 53 54 54 54 55 54 51 48 46 44 44 44 45 46 47 47 47 47 48 48 47 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 42 42 42 43 43 43 43 44 44 45 45 45 46 46 46 46 47 47 48 49 51 52 52 53 54 54 54 54 54 55 55 55 54 53 53 52 52 51 50 49 48 47 46 45 45 45 45 45 46 47 48 47 46 46 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 37 37 36 36 37 37 36 36 37 39 40 40 40 40 40 40 40 40 41 41 41 41 42 43 43 43 43 43 44 45 46 47 48 49 49 49 49 48 48 47 46 45 44 44 44 44 45 44 43 42 41 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 41 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 45 45 46 45 45 45 45 45 45 44 44 43 43 43 43 43 42 41 41 40 40 40 39 38 38 39 38 38 37 36 36 37 37 37 37 36 37 38 39 40 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 43 43 43 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 42 43 43 43 43 42 42 42 42 42 42 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 46 45 45 45 45 45 46 46 46 46 46 45 45 45 45 45 44 44 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 41 41 41 41 41 42 43 43 43 43 44 43 42 42 41 41 40 40 40 40 40 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 40 40 40 41 41 41 40 40 39 39 38 38 38 38 38 38 38 38 37 37 38 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 51 53 54 55 57 58 60 59 56 56 57 55 53 53 52 48 44 47 52 51 49 50 47 44 47 47 44 43 41 41 41 41 42 42 43 44 47 51 53 53 52 51 51 50 51 52 51 52 54 51 47 45 43 43 45 48 49 49 49 49 49 50 50 49 47 46 45 46 46 46 45 45 45 45 45 45 44 44 44 43 43 42 42 42 43 43 43 43 44 44 45 45 45 45 46 46 46 47 47 48 49 50 51 52 53 53 53 53 53 53 54 55 55 54 53 53 52 52 51 50 49 48 47 47 46 45 45 45 45 46 47 47 47 47 46 45 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 38 39 39 39 39 39 38 38 38 39 38 36 35 36 38 40 40 40 39 39 40 40 40 40 41 41 40 41 42 42 43 43 43 43 44 45 46 48 48 48 49 49 48 48 47 47 45 44 43 43 44 45 44 43 42 41 41 41 40 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 36 36 36 36 36 37 37 38 38 38 38 38 38 38 38 38 38 38 39 39 40 41 41 42 42 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 44 45 44 43 42 42 42 43 43 43 43 42 42 41 41 39 38 37 38 37 37 37 36 36 37 36 37 37 37 37 39 40 41 41 42 42 42 42 41 41 41 41 41 41 42 43 43 43 43 44 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 42 41 42 43 43 43 43 43 44 43 42 42 42 42 43 42 42 42 42 43 43 43 42 41 41 42 43 43 43 43 43 43 43 42 42 42 43 43 44 45 44 44 44 44 44 44 45 45 45 45 45 44 44 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 42 42 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 41 41 41 41 42 42 43 43 42 43 43 43 42 41 41 41 40 40 40 40 39 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 40 40 40 41 41 41 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 37 54 56 57 58 60 61 61 61 59 57 56 56 54 53 52 49 46 47 51 53 54 52 49 48 50 50 48 47 43 41 41 41 41 42 43 46 48 51 52 51 51 50 49 48 49 51 50 51 53 51 46 43 42 44 46 49 52 52 53 52 52 52 51 49 48 47 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 42 42 42 43 43 43 43 44 44 45 45 45 45 46 46 46 46 47 48 48 50 51 52 53 53 52 52 52 53 54 54 54 54 53 52 52 52 51 50 49 48 47 47 46 46 45 44 44 45 46 47 47 47 46 46 45 45 45 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 38 39 39 39 39 39 39 39 40 40 40 39 38 39 40 39 38 36 36 37 39 39 40 39 38 39 39 40 40 40 40 40 40 41 42 42 42 42 42 43 44 45 47 48 48 49 49 49 49 48 47 46 45 44 44 45 45 45 44 42 41 41 41 40 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 40 41 41 42 42 43 43 43 44 44 45 45 44 44 44 44 45 45 45 45 45 44 43 43 44 44 44 43 42 42 43 43 44 43 43 43 42 41 41 40 38 37 37 37 37 37 37 37 37 36 37 38 38 39 40 40 41 41 41 41 41 41 40 41 41 41 42 42 42 43 43 42 42 43 43 43 44 44 44 44 43 43 43 43 44 44 43 43 43 42 42 42 43 43 43 43 43 44 43 43 43 43 43 43 42 42 42 42 42 43 43 42 41 41 42 43 43 43 43 43 43 43 42 42 42 42 43 44 44 45 45 44 44 44 44 45 45 45 44 44 44 44 44 44 44 45 45 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 42 42 43 43 42 41 41 41 41 41 40 40 40 40 40 40 41 41 41 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 41 41 41 42 42 43 42 42 42 43 43 43 42 41 41 41 40 40 40 40 39 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 39 39 40 40 40 41 41 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 36 36 35 36 36 36 36 36 37 37 37 55 59 60 61 61 61 61 60 58 55 54 54 54 52 50 49 50 50 51 54 55 54 54 53 51 50 50 48 43 41 41 41 41 41 43 45 47 49 49 49 51 51 49 46 46 48 48 49 52 50 45 42 42 44 46 49 53 55 55 55 54 54 52 50 48 47 47 46 46 46 45 45 45 45 45 45 45 45 44 44 43 42 42 42 42 43 43 44 44 45 44 44 45 45 46 46 46 46 47 48 49 50 51 52 52 52 51 51 52 52 52 53 53 53 53 52 52 51 50 49 48 47 47 47 46 46 45 44 44 45 45 46 46 47 46 46 45 45 45 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 39 37 37 37 37 38 39 38 38 38 39 39 39 40 40 40 40 40 41 41 42 41 42 42 43 44 46 47 47 48 48 48 49 48 47 46 45 44 45 46 45 45 44 42 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 37 37 37 37 37 37 37 37 38 38 38 38 39 39 40 40 40 41 41 41 42 43 43 43 44 44 45 45 45 44 44 45 45 45 45 45 44 43 42 43 43 44 43 43 42 42 43 43 43 42 42 42 42 40 40 40 39 37 37 37 37 37 37 37 36 37 38 39 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 43 43 43 42 42 42 42 43 43 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 43 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 42 43 43 44 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 46 46 46 46 45 45 45 44 45 45 44 43 43 42 42 43 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 41 41 42 42 43 43 43 43 43 43 43 43 42 41 41 41 40 40 40 39 39 39 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 39 40 40 40 40 40 39 38 38 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 37 37 37 59 61 62 62 62 61 61 60 57 55 54 53 51 50 50 52 54 55 54 55 55 54 54 52 49 47 46 44 42 41 41 41 41 41 42 43 44 45 45 46 47 48 48 47 45 45 45 46 50 48 44 41 42 44 46 49 53 54 55 55 54 54 52 50 49 48 48 48 47 47 46 46 45 45 45 45 45 45 45 44 43 43 42 42 42 43 43 43 44 44 44 44 44 45 46 46 46 46 47 48 48 50 51 51 51 51 51 51 51 51 52 52 52 53 53 52 52 51 50 49 48 47 47 47 46 46 45 45 44 44 44 45 46 46 46 46 45 44 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 41 41 41 40 39 38 37 36 36 37 37 37 37 38 38 39 40 40 40 40 40 40 41 41 41 41 42 42 43 44 46 46 47 47 48 48 48 48 46 45 44 44 45 45 44 44 43 42 42 42 41 40 40 40 39 39 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 37 37 38 38 38 39 39 39 39 40 40 41 41 41 41 42 43 43 44 44 44 45 45 45 44 44 43 43 44 44 45 44 43 42 42 43 43 43 42 42 43 43 43 43 42 41 41 41 40 39 39 38 37 37 36 36 36 36 37 37 38 40 40 40 40 40 40 40 40 40 41 42 42 41 41 42 42 43 43 43 43 42 42 42 42 42 42 43 44 44 44 43 43 43 42 42 43 43 42 42 41 42 43 43 43 44 44 44 44 44 43 43 43 42 42 42 42 41 42 43 42 41 40 41 42 43 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 45 44 44 44 44 44 44 44 44 43 43 44 44 44 45 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 44 43 42 42 42 43 44 44 44 43 43 43 43 43 43 44 43 43 43 43 43 43 43 42 42 42 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 41 42 41 41 42 43 43 43 43 43 44 43 43 43 42 41 41 41 41 40 40 39 38 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 38 38 38 38 38 39 40 40 40 39 38 38 38 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 37 37 37 61 62 62 61 61 61 60 60 57 55 54 52 50 50 53 55 56 56 55 55 54 53 52 51 49 47 45 42 43 43 43 42 41 41 41 42 42 43 43 43 44 44 44 45 43 42 44 47 48 45 42 42 43 44 45 46 49 51 52 52 51 51 51 50 50 50 49 49 48 47 46 46 45 45 45 45 45 45 45 44 43 43 42 42 42 42 42 42 43 43 44 44 44 45 46 46 46 46 47 47 48 49 50 51 51 51 50 50 50 51 51 52 52 53 52 52 51 51 50 49 48 47 47 47 46 46 45 45 44 43 44 45 45 46 46 46 45 44 44 44 45 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 42 41 40 39 38 37 37 36 36 36 36 37 38 39 40 40 40 40 39 40 40 41 41 41 42 42 43 44 46 46 46 47 47 48 48 47 45 44 43 44 44 44 43 43 43 43 43 42 41 40 40 40 39 39 38 38 38 38 38 37 37 37 37 37 36 36 36 36 36 37 37 37 37 38 38 38 38 39 40 40 40 40 40 41 41 41 42 42 43 44 44 45 45 45 44 44 44 44 43 43 43 44 44 44 42 42 42 42 42 42 41 42 43 43 43 42 41 41 40 40 40 39 38 37 37 37 36 36 36 36 36 38 40 41 41 40 39 39 39 40 41 41 42 43 43 42 42 43 43 42 42 42 42 42 42 43 43 43 43 43 43 44 44 43 43 43 42 42 42 42 42 41 42 43 43 43 43 44 44 44 44 44 43 43 43 42 42 42 42 41 41 42 42 41 40 41 42 43 42 42 42 42 42 42 42 43 42 42 43 43 43 43 44 44 44 44 44 43 43 43 44 43 43 43 44 44 44 45 45 45 45 45 45 46 46 46 46 45 45 46 46 46 45 45 44 43 42 42 42 43 43 44 44 43 43 43 43 43 43 43 44 44 43 43 43 43 43 42 42 42 42 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 40 40 40 40 40 40 41 41 41 41 42 42 42 42 42 42 42 42 42 43 43 43 43 43 44 43 43 42 41 41 40 40 41 40 40 39 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 37 37 37 37 37 37 37 37 38 38 38 38 39 39 38 38 38 37 37 37 38 38 38 38 38 37 37 36 36 37 37 37 37 36 36 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 37 37 37 37 37 37 37 37 37 61 61 61 61 61 60 60 58 55 54 54 53 53 53 55 56 56 55 54 54 53 53 53 53 53 52 48 43 45 49 49 45 41 41 41 41 41 41 42 42 42 42 42 42 41 41 42 44 44 43 42 42 43 43 44 43 45 48 49 49 50 51 52 53 53 53 51 50 49 48 47 46 45 45 45 45 45 45 45 44 44 43 43 43 42 42 42 42 42 43 43 44 44 45 45 45 45 46 46 46 47 48 50 51 51 51 50 49 50 50 51 51 52 52 52 52 51 51 50 49 48 47 47 46 46 46 45 45 44 43 43 44 45 46 46 46 45 44 44 44 44 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 42 41 40 40 40 39 38 38 37 36 36 37 39 40 39 39 39 39 39 40 41 41 41 41 41 41 43 44 45 45 45 45 47 47 47 46 45 43 43 44 44 43 43 43 43 43 43 42 41 40 40 39 39 39 38 38 38 37 37 37 37 36 36 36 36 36 36 36 37 37 37 38 38 38 38 38 39 40 40 39 39 40 41 41 42 43 43 44 44 45 45 46 45 44 43 43 43 43 42 43 43 43 43 43 42 41 41 41 42 42 43 43 44 43 42 41 40 40 39 39 39 38 37 36 36 36 36 36 36 37 39 40 40 40 39 39 39 40 41 41 42 42 42 42 43 43 42 42 42 42 41 42 42 42 43 43 43 44 44 43 44 44 44 44 43 42 42 41 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 41 41 42 41 41 41 42 42 42 42 42 42 42 42 42 43 43 44 44 44 44 44 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 44 43 43 42 42 42 43 44 44 43 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 42 42 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 42 42 42 42 42 43 43 43 43 43 43 43 42 42 43 44 44 44 43 43 42 42 41 41 40 40 41 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 37 37 37 38 38 38 38 38 38 37 37 36 36 37 37 37 37 36 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 36 36 36 37 37 61 60 60 60 60 60 60 58 56 56 57 56 56 56 55 55 54 53 53 52 51 52 53 52 52 52 49 44 46 51 52 46 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 46 47 49 52 54 55 54 54 54 53 52 50 49 48 47 46 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 41 42 42 42 43 44 44 44 45 46 46 46 47 48 49 50 51 51 50 49 50 50 51 51 52 52 51 51 51 51 50 49 48 47 47 46 46 46 45 45 44 43 43 44 45 45 45 46 46 45 44 43 44 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 41 41 40 40 40 40 39 36 35 36 39 39 39 39 38 38 38 39 40 40 41 41 40 41 42 42 43 44 44 44 46 47 47 47 46 44 43 43 44 44 43 43 44 43 43 42 41 40 40 39 39 38 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 37 37 38 38 38 38 38 38 39 39 39 39 40 41 41 42 43 43 44 45 45 46 45 44 43 43 42 42 42 42 43 43 43 43 43 42 41 41 41 42 43 43 43 44 43 43 42 41 39 39 38 38 37 36 36 36 36 36 36 37 39 39 39 39 40 39 39 39 40 40 41 41 42 42 42 42 42 42 41 42 41 41 42 43 43 43 43 43 44 44 44 44 43 43 43 43 43 42 41 41 41 41 42 42 42 43 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 40 40 41 41 41 42 42 41 41 41 42 42 42 42 42 42 42 43 43 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 46 46 46 46 46 46 45 44 44 44 44 43 42 41 42 43 43 44 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 43 44 44 43 43 43 42 42 41 41 40 40 40 40 39 39 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 36 36 36 37 37 60 59 59 60 59 59 59 59 58 58 58 58 57 57 56 55 55 53 53 52 51 50 49 49 49 49 47 45 45 50 49 44 46 47 44 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 44 45 45 47 50 53 55 54 53 53 54 54 53 52 51 49 48 47 46 46 45 45 45 44 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 43 44 44 45 45 45 46 48 49 50 51 51 49 49 50 50 50 51 52 52 51 50 51 50 50 49 48 48 47 46 46 46 45 45 44 44 43 43 45 45 45 46 46 45 44 43 43 43 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 42 43 43 42 40 40 40 40 39 38 36 36 38 38 38 38 38 38 38 38 39 40 41 41 40 41 41 41 42 42 43 44 45 46 47 47 46 44 42 42 44 45 43 42 44 44 43 42 41 40 40 40 39 38 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 36 37 37 38 38 38 38 38 38 39 39 40 40 41 41 42 43 43 44 45 45 45 45 44 43 42 42 41 42 43 42 42 42 42 43 42 41 41 41 42 42 43 43 44 43 42 42 41 40 39 37 37 37 36 36 35 35 36 37 38 39 38 38 39 40 40 39 40 40 41 41 41 42 43 42 42 42 41 41 41 41 41 42 43 43 43 43 43 44 43 43 43 43 42 43 43 42 42 41 41 41 41 42 42 42 42 42 42 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 41 41 41 42 42 43 42 42 41 42 42 42 42 42 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 45 45 44 44 44 44 43 43 41 41 42 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 40 42 42 42 43 43 43 43 43 43 43 44 44 43 43 43 44 44 43 43 43 43 42 42 41 41 40 40 40 40 39 39 39 39 38 38 37 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 37 37 36 36 37 37 37 36 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 36 36 36 37 37 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 56 55 54 53 51 49 49 51 52 49 47 48 51 49 48 52 50 44 42 43 44 43 41 42 44 44 43 43 42 41 41 41 41 41 41 40 40 40 42 44 46 48 50 53 53 52 51 52 53 54 54 53 53 51 50 49 47 46 46 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 43 44 45 45 46 48 49 50 50 50 49 48 49 49 49 50 51 51 50 50 50 50 49 48 48 47 47 47 46 46 45 45 45 44 44 43 44 44 45 45 45 45 45 44 43 43 43 44 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 44 45 44 41 40 40 40 40 39 37 36 36 36 36 37 37 38 37 38 39 40 40 41 41 40 40 40 41 41 42 43 44 45 46 47 46 45 42 42 44 44 42 42 44 44 44 44 42 41 41 40 39 38 38 38 38 37 37 37 37 37 36 36 36 36 36 36 36 36 37 37 37 38 38 38 38 39 40 40 41 41 42 42 43 43 44 45 45 46 45 44 43 42 41 41 41 42 43 42 41 41 42 43 42 40 40 41 41 42 42 43 44 43 41 41 40 40 39 38 36 36 36 35 35 36 37 38 38 38 38 39 40 40 40 39 40 41 41 41 42 43 43 42 41 41 41 40 41 41 41 42 43 43 44 44 44 43 43 43 43 43 42 41 42 41 41 40 40 41 42 42 43 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 41 40 40 40 41 41 42 42 42 42 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 45 45 44 44 44 43 43 44 43 41 41 42 43 43 44 43 43 43 43 42 42 43 43 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 41 41 42 42 42 42 42 42 42 42 42 42 42 41 41 40 39 41 42 42 42 43 43 43 42 42 43 43 43 44 44 44 44 44 44 43 43 43 42 42 42 41 41 40 40 40 40 38 38 38 37 37 37 37 38 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 36 36 36 36 37 37 37 37 36 36 36 36 36 37 37 37 37 38 38 38 37 37 36 36 36 37 37 36 34 34 34 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 36 36 37 37 59 59 59 59 59 58 58 58 58 58 59 58 58 58 58 58 58 58 57 55 53 53 52 52 54 53 51 51 53 54 52 52 53 47 44 45 48 49 46 44 47 50 49 48 47 46 46 45 43 41 41 41 40 38 38 39 41 44 47 49 50 52 51 49 50 52 53 53 53 53 52 51 50 49 48 47 46 46 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 42 42 41 42 43 44 45 46 47 49 50 50 49 48 48 49 49 49 49 50 50 49 50 50 49 49 48 47 46 46 46 46 46 45 44 44 45 44 43 43 43 44 44 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 44 45 43 41 40 39 39 39 39 38 37 36 36 36 36 37 37 38 39 39 40 40 41 40 40 40 40 40 41 42 43 45 45 46 46 46 44 42 42 42 41 42 44 44 44 44 43 42 42 41 40 39 38 38 38 38 37 37 37 37 37 37 36 36 36 35 36 37 37 37 37 38 38 39 39 40 40 40 41 42 43 43 44 44 45 45 46 46 45 44 43 42 41 41 41 42 42 42 41 41 42 42 41 40 40 41 41 42 42 43 43 43 41 40 40 40 39 38 36 35 35 35 36 38 39 38 37 38 39 40 40 40 39 39 40 40 40 41 41 42 42 42 40 40 40 40 41 41 42 42 42 43 43 43 43 43 43 42 42 43 42 41 41 41 41 40 40 41 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 41 40 40 41 42 42 42 42 42 43 43 43 42 42 42 42 42 42 42 43 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 44 43 43 43 43 43 42 41 41 42 43 43 44 44 44 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 42 42 42 42 42 43 43 42 42 41 39 41 42 42 42 43 43 42 41 41 42 42 43 43 43 43 44 44 43 43 43 42 42 42 42 41 41 40 40 40 39 38 38 37 37 37 38 38 38 38 37 37 37 37 38 38 37 36 36 36 36 36 36 37 37 37 37 36 36 36 36 37 37 37 36 36 36 36 36 36 36 36 36 37 37 37 36 35 35 36 36 36 36 36 37 37 37 37 37 36 36 36 36 37 37 36 35 35 34 34 34 35 35 36 35 35 35 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 58 58 58 58 58 58 58 58 58 58 59 59 59 58 58 58 59 58 57 56 55 54 54 54 56 55 54 54 56 55 54 54 52 47 47 51 53 52 50 50 52 53 52 52 51 50 52 51 47 45 43 41 39 38 38 38 38 41 45 47 50 51 50 48 49 51 52 52 52 52 51 51 51 50 50 49 49 48 47 46 46 45 45 45 45 44 44 44 44 44 44 44 43 43 43 42 42 43 44 44 45 47 49 49 49 49 48 48 48 48 48 49 50 49 49 49 49 49 49 49 47 45 45 45 46 45 45 44 44 44 44 43 43 43 43 44 44 45 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 41 41 41 41 41 42 44 44 42 40 39 39 39 39 40 39 38 38 37 36 36 36 38 38 39 40 40 41 40 40 40 40 40 40 40 41 43 44 44 45 45 45 42 41 42 42 43 44 44 44 44 43 43 43 42 40 39 38 38 38 37 37 37 37 37 37 37 37 37 36 35 36 37 37 37 38 38 39 40 40 40 40 41 41 42 43 43 44 45 45 46 45 45 44 43 43 42 41 41 41 41 42 41 40 40 41 41 40 40 41 41 41 42 43 43 43 42 41 40 40 39 38 36 35 35 35 35 37 39 39 38 37 38 39 40 40 39 38 39 39 39 40 40 41 41 42 41 40 40 41 41 41 41 42 42 42 43 43 44 43 43 42 41 42 42 42 41 41 40 40 40 41 42 43 42 42 42 42 42 43 43 43 43 43 43 42 42 42 41 41 41 40 39 40 41 42 42 42 43 43 43 43 42 42 42 43 43 43 43 43 43 44 43 43 43 44 43 43 43 43 43 43 43 43 44 44 45 45 44 44 45 45 45 45 46 46 46 46 47 47 47 46 46 46 46 45 43 42 42 43 43 43 41 40 42 43 43 44 44 44 44 44 43 43 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 42 42 42 42 43 43 42 40 41 43 43 43 43 42 41 42 42 42 42 42 42 42 43 43 43 42 42 42 41 41 42 42 41 41 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 37 36 36 37 37 37 37 37 36 36 36 36 36 36 36 36 36 37 36 36 35 35 35 36 36 36 35 35 35 35 35 36 36 35 35 35 37 38 38 37 37 36 35 34 34 34 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 38 37 37 36 36 36 35 35 58 58 58 58 58 58 58 58 58 58 58 59 59 59 58 58 59 58 58 57 56 56 56 57 57 57 56 56 56 56 55 54 50 49 52 54 53 53 54 53 53 53 53 52 51 51 51 50 48 45 43 41 41 40 39 38 38 38 42 46 49 50 48 47 48 49 50 50 50 50 50 50 50 50 50 50 50 49 49 48 47 47 47 46 45 45 45 45 44 44 44 43 43 43 43 42 42 42 43 43 44 46 48 49 48 48 48 47 47 48 49 49 49 48 49 49 49 49 49 48 47 46 45 45 45 45 45 44 44 43 43 43 42 42 43 44 44 44 44 44 43 43 43 42 42 43 43 43 42 42 42 41 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 41 42 43 43 41 39 38 38 39 40 40 39 38 38 37 36 36 38 38 39 40 40 41 40 40 40 40 39 39 40 40 41 43 43 45 45 44 42 41 41 42 43 44 44 44 43 43 43 42 41 41 40 39 38 38 37 37 37 37 36 36 36 36 36 36 35 36 37 37 37 38 38 38 39 39 40 40 41 41 42 42 43 44 44 44 45 44 44 44 43 42 41 40 40 41 41 41 41 40 40 40 40 40 40 41 42 42 43 43 42 42 41 40 40 39 39 38 36 35 35 35 36 37 38 39 38 37 38 39 40 39 38 38 38 38 38 38 39 40 41 41 40 40 40 40 41 41 42 42 42 42 43 44 44 43 43 42 41 41 41 41 41 40 40 40 40 42 43 43 42 41 42 42 42 43 43 43 43 42 42 42 41 41 40 41 41 40 39 40 41 41 42 42 43 43 43 43 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 44 44 44 45 45 46 45 45 46 46 46 46 46 46 47 46 46 46 46 45 43 42 42 42 43 42 41 40 42 42 43 43 44 44 45 44 44 43 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 43 43 42 40 41 43 43 43 41 41 42 43 44 44 42 42 42 42 42 42 41 41 41 41 41 41 42 42 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 36 36 36 37 37 37 36 36 36 36 36 36 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 38 38 38 37 36 35 35 34 35 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 59 58 58 57 57 57 57 57 57 58 58 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 56 56 56 55 54 51 52 55 54 52 51 52 52 51 50 49 48 47 46 46 46 44 43 42 43 45 45 42 39 38 38 39 44 47 47 45 45 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 46 45 45 45 44 44 43 43 43 43 43 43 42 42 42 43 44 47 47 47 47 47 47 47 49 50 49 48 48 49 49 49 49 48 48 47 46 45 44 45 44 44 44 43 43 43 43 42 42 43 43 44 44 44 44 43 43 43 42 41 42 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 40 40 41 42 43 41 39 38 38 39 40 39 39 38 38 37 36 36 37 38 39 40 41 41 40 40 40 40 40 39 39 39 40 42 43 44 44 43 42 41 41 42 42 43 43 43 43 43 42 42 41 41 40 39 38 38 38 37 37 36 36 35 35 35 35 35 36 36 37 37 37 37 38 38 39 39 40 40 41 41 41 42 42 43 43 43 43 43 43 43 43 42 41 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 42 42 42 41 40 40 39 38 38 36 35 35 35 36 37 39 40 39 37 37 38 39 39 38 38 38 39 39 39 39 39 40 40 39 39 40 40 41 41 42 42 42 42 43 44 43 43 43 42 41 41 41 40 40 39 40 40 40 41 42 42 41 42 42 43 43 42 42 43 42 41 42 41 40 41 40 40 40 39 40 41 41 42 42 42 43 43 43 43 43 43 43 44 44 44 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 46 46 46 46 45 43 43 42 42 42 42 40 41 42 42 43 43 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 41 40 42 43 42 41 42 43 44 44 44 44 43 43 43 43 42 41 41 42 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 36 35 35 36 35 35 35 35 36 36 36 36 36 36 36 36 36 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 35 34 35 36 36 36 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 59 59 58 57 57 57 57 56 57 58 58 59 59 58 58 59 58 58 58 58 58 58 58 57 57 57 57 57 56 55 55 54 52 53 55 53 52 52 51 51 50 49 48 47 46 45 46 45 43 44 45 46 49 49 44 42 40 38 38 40 44 46 44 44 45 46 47 47 48 48 48 48 48 48 49 48 48 48 48 47 47 48 49 49 48 48 47 46 46 45 44 44 43 43 43 43 43 43 43 42 42 43 45 46 46 46 46 46 47 48 49 49 48 48 49 49 49 48 48 47 46 46 45 44 44 44 44 44 43 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 41 42 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 40 40 40 40 40 40 40 41 40 39 38 38 39 40 39 39 38 38 37 36 35 37 39 40 40 41 41 41 40 40 40 40 39 38 39 39 40 42 43 43 43 41 42 43 44 44 43 43 43 43 42 42 41 41 40 40 39 38 38 38 37 36 36 35 35 35 36 36 36 37 37 37 37 37 37 38 38 38 39 40 40 40 40 41 41 42 43 43 43 43 42 42 42 42 42 41 40 40 40 40 40 40 40 40 40 40 40 41 41 42 43 43 43 43 43 42 41 41 40 38 38 36 35 35 35 36 37 39 39 38 37 38 39 39 38 38 39 40 40 41 42 41 40 40 40 40 40 40 40 40 40 41 42 42 43 43 43 43 42 42 42 41 40 40 40 39 40 40 40 40 41 41 41 42 42 42 42 43 42 42 42 41 41 41 40 39 40 39 39 40 40 41 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 45 45 44 44 45 45 45 45 45 45 46 47 46 46 46 46 45 44 44 43 42 42 41 40 40 42 43 43 44 44 44 44 44 44 44 43 43 43 42 42 41 41 42 42 42 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 40 40 42 41 41 43 43 44 45 45 44 44 43 43 43 43 42 42 43 42 42 41 41 40 40 40 40 41 41 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 35 35 35 35 35 35 34 35 35 35 35 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 58 59 59 57 57 57 57 56 56 57 58 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 57 57 56 55 55 54 53 54 54 53 53 53 53 53 53 51 50 49 48 48 50 48 45 46 48 49 51 49 47 46 44 39 38 38 40 44 45 44 45 46 46 46 46 47 47 47 48 48 48 48 47 47 47 46 47 48 48 48 48 48 48 48 47 46 45 45 44 43 43 43 44 44 43 43 42 43 44 45 45 46 46 46 47 47 47 48 48 49 49 49 48 48 47 47 46 45 44 43 44 44 44 44 43 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 41 42 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 40 40 39 38 39 40 40 40 40 39 39 36 36 38 40 41 41 41 41 40 40 40 40 39 38 38 38 38 38 41 42 42 42 41 42 44 44 44 43 42 42 42 41 41 41 41 40 40 39 38 38 38 37 36 36 35 35 36 36 36 37 37 37 37 37 37 37 38 38 38 39 39 39 39 40 40 41 42 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 41 41 42 42 41 41 43 44 44 44 44 43 42 41 40 39 38 37 36 35 35 35 35 37 37 37 37 37 38 39 38 38 38 39 40 40 41 42 41 41 41 41 41 41 41 41 40 41 42 42 43 43 43 43 43 42 41 41 41 40 39 39 40 40 41 41 41 41 42 42 42 42 42 42 43 42 42 41 41 41 40 39 39 39 39 40 40 41 42 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 43 43 44 44 44 43 44 44 44 44 44 45 45 45 45 45 45 46 46 47 46 46 45 45 45 44 44 43 42 41 40 40 41 43 43 43 44 44 44 44 44 44 43 43 43 43 43 42 42 41 41 42 42 42 41 41 42 42 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 41 39 40 41 42 42 43 44 44 45 44 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 58 58 58 58 56 57 57 56 56 57 58 58 58 58 57 57 58 57 55 55 57 57 57 56 56 56 57 57 56 56 56 56 55 55 54 54 53 53 54 54 54 52 52 50 50 51 52 50 47 46 49 52 52 50 48 48 46 42 38 38 38 40 42 43 45 45 45 45 45 46 46 46 47 47 47 47 46 46 46 47 48 48 48 48 48 48 48 47 47 47 46 46 45 44 44 43 43 44 44 43 42 42 43 44 45 45 45 45 46 47 47 48 49 49 49 49 48 47 46 46 46 45 44 43 43 44 44 43 43 42 42 42 42 42 43 43 42 42 42 42 43 43 43 42 41 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 40 40 41 41 39 39 41 41 40 41 40 39 37 36 39 40 41 41 41 40 40 39 39 39 38 38 38 37 37 38 40 42 41 41 40 40 42 42 42 42 41 41 40 41 41 41 41 40 39 39 38 38 38 37 37 36 35 35 35 36 36 36 36 36 37 37 37 37 38 38 38 38 38 38 39 39 40 41 41 42 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 41 41 42 43 43 42 42 43 44 44 44 44 43 42 41 40 38 38 38 36 35 35 35 35 36 37 36 37 38 38 38 37 38 39 39 40 40 41 42 41 41 41 42 42 42 42 42 42 42 42 43 43 43 42 42 42 42 41 40 40 40 39 40 40 41 42 42 42 42 43 42 42 42 42 42 43 42 41 41 40 40 40 39 39 40 40 41 41 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 43 43 42 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 46 45 45 44 43 43 43 42 42 41 40 40 42 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 42 43 43 42 42 42 42 42 42 42 42 42 42 43 42 41 41 41 41 40 40 41 42 42 42 43 44 44 44 44 44 44 44 45 44 43 43 43 43 43 42 41 41 41 41 41 41 41 40 39 38 37 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 57 57 57 57 56 56 56 55 55 56 57 58 58 58 57 56 56 56 55 55 57 58 57 56 56 56 56 56 57 57 57 56 56 55 55 55 54 54 55 55 54 53 54 51 51 52 53 52 50 48 48 51 50 48 46 45 44 42 39 38 38 38 39 43 46 45 45 45 45 45 45 45 45 45 46 46 46 45 46 47 49 49 49 49 49 49 49 48 48 48 47 47 46 45 44 44 43 44 44 43 42 42 44 44 44 45 45 44 46 49 50 50 50 50 49 49 48 47 46 45 45 45 45 44 43 44 43 43 43 42 42 42 43 43 43 43 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 40 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 41 41 40 39 41 40 39 40 40 39 36 36 38 40 41 41 40 40 40 38 38 38 38 37 37 37 36 37 38 40 40 40 39 38 40 41 40 40 40 40 41 41 41 41 41 40 39 39 39 38 38 37 37 36 35 35 35 35 35 35 35 35 36 36 37 37 37 38 38 38 38 38 39 39 40 41 41 42 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 41 42 43 43 43 43 43 43 43 43 43 43 42 41 41 40 40 40 39 37 36 35 35 35 35 36 37 38 39 38 37 37 38 39 39 40 40 41 40 40 40 41 42 43 43 43 43 42 43 43 43 43 42 42 41 41 41 41 40 40 39 40 41 41 41 42 42 42 42 42 42 41 42 42 42 42 42 41 40 40 39 39 39 40 41 41 42 42 42 41 41 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 43 43 42 42 43 42 42 43 44 43 42 43 43 43 44 44 44 44 45 45 46 46 46 46 46 45 44 43 43 43 42 41 41 40 40 42 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 42 42 42 42 42 41 41 42 42 41 41 42 42 41 39 39 40 40 41 41 41 42 42 43 43 44 44 44 44 44 44 44 45 44 43 43 43 43 43 42 41 41 41 41 41 41 41 41 40 38 37 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 55 56 56 56 55 55 56 55 54 55 56 57 57 57 57 56 56 56 54 54 56 57 57 57 56 55 55 56 56 56 57 56 56 56 56 56 55 55 55 55 54 54 53 51 52 53 53 53 51 49 49 51 51 48 46 45 44 42 42 41 38 38 39 42 45 46 45 45 45 44 44 44 44 43 44 45 45 45 45 46 47 48 48 48 48 48 49 49 49 48 48 48 47 46 46 45 44 44 43 43 43 44 45 45 45 45 44 44 46 48 50 51 51 50 50 49 48 47 46 45 45 45 45 44 43 44 43 43 43 42 42 43 43 43 43 43 43 42 42 42 42 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 40 40 39 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 39 40 39 37 36 37 39 40 40 40 40 39 38 38 37 37 37 37 36 36 36 37 38 39 39 39 38 39 40 39 39 39 40 41 42 42 42 41 40 40 40 39 38 38 37 37 37 36 35 36 36 36 35 35 35 35 36 37 37 37 37 37 37 38 38 39 40 40 40 41 41 41 41 41 41 40 40 39 39 39 39 39 39 40 41 41 41 42 43 43 44 44 44 43 42 42 42 42 42 41 41 40 40 40 39 37 35 35 35 35 36 37 38 39 38 37 37 38 38 38 39 39 39 39 39 40 40 41 42 43 43 43 43 43 43 44 44 43 43 42 41 41 40 40 40 39 40 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 40 40 39 39 40 40 41 41 42 42 42 41 42 43 42 42 42 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 42 43 42 42 42 42 42 43 43 43 42 43 44 44 44 44 44 44 45 45 45 46 46 46 45 45 44 44 43 43 42 41 40 40 40 42 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 41 40 39 40 40 41 41 41 42 42 41 42 42 43 43 44 45 44 44 44 44 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 53 55 55 55 54 54 56 55 54 55 56 56 56 56 56 56 56 55 53 53 55 56 56 57 56 55 55 55 55 56 56 56 56 56 57 57 56 56 56 55 54 53 53 53 53 54 54 53 51 50 52 52 52 51 49 46 44 44 45 44 40 38 38 39 42 44 44 45 45 45 44 44 44 43 43 43 43 44 44 44 45 46 46 46 46 46 48 49 49 49 49 49 48 47 46 46 45 44 44 43 43 44 45 45 45 45 44 44 45 46 48 50 50 50 49 49 48 47 46 46 45 45 44 43 43 43 43 43 42 42 42 43 43 43 43 43 42 42 41 41 42 43 42 42 41 41 40 40 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 42 42 42 42 41 41 41 41 40 40 40 39 39 39 39 38 37 37 38 40 40 38 36 36 38 40 40 40 39 39 38 37 37 37 37 36 36 36 36 36 37 38 38 38 37 38 38 37 38 39 40 41 42 43 42 42 41 40 40 39 39 38 38 38 37 36 36 37 37 37 36 35 35 35 36 37 37 37 37 37 37 38 38 39 40 40 40 40 41 41 41 41 41 40 40 39 39 39 39 39 40 40 41 42 42 42 43 43 44 44 44 43 42 42 41 42 43 42 41 41 41 40 38 36 35 35 35 35 36 37 38 38 37 37 38 39 39 39 40 41 40 40 40 40 41 41 41 42 42 42 43 43 44 44 44 43 43 42 41 41 40 39 39 39 40 41 41 40 40 40 40 41 41 42 42 42 43 42 41 41 41 41 41 40 39 39 39 40 40 41 41 41 41 41 42 42 42 42 43 43 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 42 41 42 43 43 42 41 41 42 42 42 42 43 44 44 44 44 44 44 44 44 44 45 45 46 46 45 44 43 43 43 43 43 42 41 40 39 41 43 43 42 43 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 41 40 39 39 39 40 41 41 41 41 42 42 42 42 42 42 43 43 44 45 44 44 44 44 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 34 34 34 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 54 53 53 53 53 54 54 53 53 53 54 55 55 54 55 55 55 54 53 53 54 54 55 57 56 55 54 54 54 55 55 55 55 56 56 57 56 56 56 55 54 54 54 54 55 55 54 54 53 52 53 52 52 51 48 45 46 46 48 47 42 39 38 38 39 41 43 45 46 45 45 44 44 43 43 43 42 43 43 43 44 44 44 44 45 45 47 48 48 48 49 49 48 47 46 46 45 45 44 42 42 44 45 45 44 44 44 44 44 45 48 49 50 49 49 48 48 47 46 46 45 45 44 43 43 43 43 42 41 41 42 43 43 43 43 43 42 42 41 41 42 42 42 42 41 41 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 43 43 43 43 43 43 42 42 42 41 41 40 40 40 40 40 40 39 37 37 37 38 38 38 36 35 36 38 39 39 39 39 38 38 37 37 37 36 36 36 35 35 36 37 37 38 37 37 37 37 38 39 40 41 41 42 43 42 41 40 40 40 39 38 38 38 37 37 37 37 36 36 36 35 35 35 36 37 37 37 37 37 37 37 38 39 39 40 40 40 41 41 41 41 40 40 39 39 39 39 40 40 41 40 40 41 42 42 43 43 44 44 43 43 42 42 41 42 43 42 41 40 40 40 38 36 35 35 35 36 37 38 37 37 36 37 38 38 39 40 41 42 41 41 41 41 41 41 42 42 42 42 43 44 44 44 44 43 43 43 42 41 40 39 38 38 39 40 40 40 39 40 40 41 42 43 43 43 42 41 41 40 40 41 40 39 39 39 39 40 40 41 41 41 41 41 41 41 42 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 42 42 42 42 41 41 42 42 42 43 43 43 43 43 43 44 44 44 44 44 45 45 46 45 44 43 43 43 43 43 42 42 41 39 39 41 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 42 42 41 42 42 42 41 41 41 40 40 40 40 39 39 40 40 41 41 42 41 41 41 42 42 42 43 43 43 43 44 44 44 43 43 44 44 45 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 55 55 54 53 53 53 53 53 52 52 52 53 52 52 53 54 54 53 53 52 53 53 54 55 55 55 53 52 53 54 54 54 55 55 55 56 56 56 55 55 55 55 55 55 56 55 55 54 54 54 54 53 51 50 48 47 50 50 50 48 44 42 39 37 37 39 42 45 46 46 46 45 45 44 43 43 42 41 42 42 43 43 43 44 44 45 46 47 48 48 48 49 49 48 47 47 46 45 44 43 42 42 44 44 43 43 43 43 43 45 48 49 49 49 48 48 47 46 46 46 45 44 44 43 43 43 43 42 41 41 42 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 41 42 42 43 43 44 44 44 44 44 43 43 43 43 42 42 42 41 41 41 40 40 40 39 39 38 38 37 37 37 36 35 35 37 38 38 39 39 38 38 37 37 37 36 36 36 35 35 35 36 36 37 37 37 38 38 38 39 39 39 40 41 42 41 41 41 41 40 39 38 38 38 37 37 37 37 36 36 36 35 35 35 36 37 37 37 37 37 37 37 38 38 39 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 41 41 41 41 42 43 43 43 44 43 43 43 42 42 41 42 42 42 41 40 39 38 37 36 35 35 35 37 38 38 37 36 36 38 38 38 39 41 42 42 42 42 41 41 41 41 42 43 43 44 44 44 44 44 43 42 42 42 42 42 41 40 39 38 39 39 40 39 39 40 40 41 42 42 42 43 42 42 41 40 40 40 40 39 39 40 40 41 41 41 41 41 41 41 42 42 42 43 43 43 44 44 44 44 43 43 44 44 44 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 45 46 45 45 44 43 43 42 42 42 41 40 39 39 41 42 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 42 43 42 42 42 41 41 40 40 39 39 40 41 42 42 42 41 41 41 41 41 42 42 42 43 43 43 43 43 43 43 44 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 38 38 38 38 37 37 37 38 37 37 38 38 38 38 38 37 37 37 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 34 34 34 34 35 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 56 57 56 55 55 54 54 54 53 52 52 53 52 51 51 51 52 52 52 52 52 52 53 54 54 55 54 52 52 53 53 54 54 54 54 55 55 55 55 55 55 55 55 55 56 55 55 55 54 54 54 54 53 52 51 51 52 51 49 47 46 43 40 38 37 37 39 43 46 46 45 46 45 44 44 43 42 41 42 42 42 43 43 43 44 45 46 47 47 47 47 48 49 49 48 48 47 46 46 45 43 42 43 43 43 42 42 41 43 45 47 47 47 47 47 47 46 45 45 45 45 44 43 43 42 42 42 41 41 41 42 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 44 44 45 45 45 45 45 44 44 44 43 43 43 43 42 42 42 41 41 40 40 40 40 40 40 39 38 38 37 35 35 36 38 38 38 38 38 38 37 37 36 36 36 36 35 35 35 35 35 36 36 36 37 38 37 38 38 38 39 39 40 40 41 41 41 41 40 39 38 38 38 37 37 37 37 37 36 35 35 36 36 37 37 37 36 36 37 37 38 38 39 39 39 39 40 40 40 40 40 39 39 39 39 40 40 40 41 41 41 42 43 44 44 44 43 43 42 42 41 40 40 41 41 41 41 39 38 37 36 35 35 35 35 37 38 37 36 36 37 38 39 39 40 41 41 41 42 41 40 41 41 42 42 43 44 44 44 44 44 43 43 42 41 41 41 41 40 40 39 38 38 39 40 39 39 40 40 41 42 42 42 42 42 41 41 40 40 40 39 39 40 40 40 42 42 41 41 41 42 42 42 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 43 43 43 44 44 44 44 45 45 46 46 45 44 43 42 42 42 41 41 40 39 40 42 40 40 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 42 42 43 43 43 43 42 41 42 42 40 39 39 39 40 41 43 42 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 43 42 43 42 42 42 41 41 41 41 40 40 41 40 40 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 35 35 35 35 35 35 34 34 34 34 35 34 34 34 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 57 57 57 56 56 56 55 54 54 54 54 54 54 53 52 52 52 52 51 50 50 51 52 53 53 54 54 52 52 52 53 54 54 53 53 54 55 54 54 54 54 54 54 54 55 55 55 55 55 54 54 54 53 53 52 52 51 49 46 45 44 42 41 39 37 37 38 40 43 44 44 45 45 44 44 42 42 42 43 43 43 43 43 43 43 45 45 46 46 46 47 48 48 48 48 47 47 47 46 45 44 42 41 41 41 41 41 41 42 45 46 45 46 46 47 47 46 45 45 44 44 43 43 42 42 42 41 41 41 42 42 43 42 42 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 43 44 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 42 42 42 41 41 41 41 40 40 40 40 39 39 37 36 35 36 38 38 38 38 38 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 36 36 36 37 38 37 37 38 39 40 40 41 42 42 41 40 39 38 38 37 37 37 37 37 36 35 35 35 36 37 37 37 36 36 36 37 38 38 38 38 39 39 39 39 40 40 40 39 39 39 39 40 41 41 41 41 42 42 43 44 44 43 43 42 42 42 41 40 40 41 40 40 40 39 37 36 35 35 35 35 37 38 37 36 36 37 38 39 40 40 41 41 40 40 41 40 40 41 41 42 43 43 43 43 43 43 43 43 43 42 41 41 41 40 40 39 39 38 38 39 39 39 39 40 40 41 41 41 41 42 41 40 40 40 40 39 39 40 41 41 41 42 42 41 41 42 41 41 42 42 42 42 42 43 43 43 43 43 44 44 44 45 44 44 43 43 43 42 42 42 42 42 42 42 41 42 42 42 42 41 41 41 42 42 42 41 41 41 43 43 43 44 44 44 44 44 45 45 45 45 44 44 43 43 43 42 41 42 41 38 39 40 38 39 41 42 43 43 43 43 42 42 43 43 44 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 42 41 41 40 39 40 42 43 43 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 42 42 42 42 43 42 41 41 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 58 58 58 57 56 56 55 55 55 55 55 55 55 54 54 54 53 52 52 51 51 50 50 50 51 52 52 52 52 52 52 53 54 53 53 53 54 54 53 53 52 53 53 53 54 54 54 54 54 54 54 54 53 53 53 52 50 48 47 45 42 42 43 42 39 37 37 37 38 40 41 43 44 44 43 41 41 43 43 43 43 42 42 43 43 44 45 45 44 45 47 47 48 48 47 47 48 48 47 45 44 44 42 41 40 40 40 41 42 43 44 45 45 46 46 46 46 45 44 44 43 43 43 42 41 41 42 42 42 42 42 42 42 42 43 42 41 41 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 42 43 43 44 45 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 40 39 39 39 39 39 38 36 35 36 38 38 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 38 38 39 39 41 42 42 41 41 40 39 38 38 37 37 37 37 36 36 35 35 35 36 36 36 36 37 37 37 37 38 38 38 38 38 39 39 39 40 40 40 40 40 40 41 41 42 42 42 43 43 43 44 44 43 42 41 41 41 40 40 40 40 40 39 40 38 37 36 35 35 35 36 37 37 36 36 36 38 38 39 40 41 41 41 40 40 40 39 40 41 41 41 42 42 42 42 43 43 43 43 43 43 42 41 41 41 40 39 39 38 38 38 38 38 39 40 40 40 41 41 41 42 41 40 40 40 39 39 40 41 41 41 42 42 41 40 41 42 42 42 42 42 43 44 43 43 43 43 43 43 43 44 44 45 45 44 44 44 43 43 43 43 43 43 43 43 42 41 42 42 43 42 42 41 41 41 41 41 42 42 43 44 44 44 44 44 44 44 45 45 45 44 43 43 43 42 41 41 41 40 39 38 39 39 39 38 38 39 41 42 43 42 41 41 42 43 43 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 40 40 43 44 44 43 43 42 41 41 41 42 42 43 42 42 42 43 43 43 42 42 43 43 43 42 42 42 41 41 41 40 40 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 58 58 57 57 56 56 56 56 55 55 55 55 55 55 55 54 53 53 53 53 52 51 51 51 51 50 50 50 50 50 51 52 53 52 52 52 53 53 53 52 52 52 53 53 54 54 54 53 53 53 53 53 53 52 52 52 52 50 50 47 44 45 46 44 41 39 38 37 37 37 38 39 40 42 42 41 41 42 42 42 42 42 42 43 43 43 44 44 44 46 46 46 47 47 46 46 47 47 48 47 46 45 44 42 41 41 40 40 41 42 44 45 45 46 46 46 45 45 44 43 43 43 43 42 41 42 43 43 42 42 42 41 42 42 42 42 41 40 40 40 40 40 40 40 41 41 40 40 40 40 40 40 39 40 40 41 41 41 41 41 42 42 42 43 43 45 45 45 45 45 46 46 46 45 45 45 44 44 44 44 44 43 43 42 41 41 41 41 41 41 40 39 38 38 38 38 38 36 35 36 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 38 38 39 40 40 41 40 40 39 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 36 37 37 37 37 38 38 38 39 39 39 39 40 39 40 41 42 42 42 42 42 43 43 43 43 44 43 43 43 41 40 41 41 39 39 39 40 39 38 39 38 37 35 35 35 35 35 36 36 36 37 38 39 39 40 40 41 40 40 40 39 38 39 40 40 40 41 41 41 42 42 43 43 44 44 43 43 42 42 42 41 40 40 40 39 38 38 38 39 39 39 40 40 41 41 41 41 41 40 39 38 38 39 40 41 41 42 42 42 41 41 41 42 42 43 43 44 44 44 44 43 43 43 43 43 43 44 44 45 45 45 44 44 43 43 43 43 43 43 43 42 42 41 40 42 42 42 42 41 40 40 40 41 42 42 43 44 44 44 45 44 44 44 44 45 45 44 44 43 43 42 41 40 39 38 37 39 40 41 41 40 39 38 38 40 42 42 42 41 41 42 42 43 42 42 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 42 41 40 41 44 44 44 43 43 42 42 41 41 42 42 42 42 42 42 42 43 43 42 42 43 43 43 42 42 42 42 41 41 41 41 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 36 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 56 57 57 57 57 57 56 56 56 55 55 55 55 55 54 53 53 54 55 54 52 52 53 53 52 51 51 50 50 49 49 50 52 51 51 53 53 54 53 52 52 52 53 54 54 54 53 53 53 53 52 52 52 52 51 51 51 51 51 50 48 49 49 46 44 42 40 39 38 37 37 37 37 38 39 39 40 41 41 41 42 43 43 43 43 43 43 43 44 45 45 45 46 47 46 45 45 46 48 49 48 46 44 43 42 41 40 40 41 43 44 45 46 46 46 46 45 44 43 42 42 42 41 41 41 42 42 42 42 42 41 41 41 42 42 42 41 40 40 39 39 39 40 40 40 40 40 39 39 39 39 39 39 39 40 40 41 41 41 41 42 42 43 43 44 45 45 45 46 47 48 48 47 46 46 45 45 45 45 45 44 43 43 42 41 41 41 40 40 40 40 40 39 38 38 38 38 36 35 35 35 36 36 36 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 38 38 38 39 40 40 40 39 38 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 37 37 37 37 38 38 38 39 39 39 39 39 39 40 42 43 43 43 42 42 43 43 43 43 43 43 42 42 42 40 40 41 39 38 38 40 40 38 37 37 36 35 35 35 35 35 36 37 38 39 39 39 40 41 40 40 40 40 39 38 38 39 40 40 40 41 41 42 42 42 43 44 44 44 44 43 43 43 42 41 41 40 40 39 38 38 38 39 39 39 40 41 41 41 41 40 40 39 38 38 39 40 41 41 42 42 42 41 41 42 42 42 43 43 44 44 44 44 43 43 43 43 44 44 44 44 44 44 45 45 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 42 41 40 40 41 41 42 42 43 44 44 45 44 44 44 44 45 44 44 44 44 43 43 42 41 39 38 37 39 41 42 42 42 42 41 39 38 39 40 40 39 39 39 41 42 42 42 42 42 42 43 43 43 42 41 41 42 42 43 43 43 43 43 43 42 41 41 42 44 45 44 44 43 43 42 42 41 41 42 42 42 42 42 42 42 43 43 42 42 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 37 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 54 55 55 56 56 56 57 57 56 56 56 55 55 55 54 54 54 54 55 54 53 53 53 53 53 53 52 52 51 50 49 49 49 49 50 52 53 53 52 51 51 51 52 53 53 53 53 53 53 52 52 51 51 51 50 50 50 50 51 51 51 50 50 49 47 45 43 42 41 39 38 37 37 37 37 37 38 38 39 39 41 42 42 43 44 44 43 43 43 43 43 44 45 46 47 46 45 45 46 48 49 47 46 44 42 40 40 41 42 43 44 45 45 46 46 46 44 44 43 42 42 41 40 40 41 42 42 42 41 41 41 41 41 42 42 42 41 40 40 39 38 38 39 39 39 39 39 39 39 38 38 38 39 39 40 40 41 41 41 41 41 42 43 44 45 46 46 47 48 48 49 48 48 47 46 46 46 46 46 45 45 44 43 42 41 41 41 40 39 39 39 39 38 38 38 37 37 36 35 35 35 35 35 35 36 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 38 38 39 40 40 39 38 37 37 37 37 37 37 37 36 35 35 35 35 36 37 37 37 37 37 38 38 38 38 38 39 38 38 39 40 42 43 43 42 41 41 42 43 42 42 42 42 41 41 42 40 39 40 39 38 38 40 40 39 37 37 36 35 35 35 35 36 37 38 39 40 39 39 40 40 39 39 39 38 39 39 39 40 40 40 41 42 43 43 43 43 44 44 44 44 43 43 42 42 41 41 41 40 39 38 38 38 38 39 40 40 41 41 41 41 41 40 39 38 39 40 41 42 42 42 42 42 41 40 41 42 42 43 43 43 44 44 44 43 43 43 44 44 44 44 45 44 44 44 45 45 45 44 44 44 43 43 43 43 42 42 43 43 41 40 40 40 40 41 41 40 40 41 41 42 43 43 44 44 45 44 43 43 44 44 43 43 43 43 42 42 42 42 41 39 37 38 40 41 42 42 42 43 42 41 41 40 40 39 39 38 40 42 41 41 42 42 42 42 42 41 40 39 39 40 42 42 42 42 42 43 43 41 40 42 43 44 45 45 44 43 43 42 42 42 42 41 41 41 42 42 42 42 42 43 42 41 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 37 37 37 37 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 51 51 51 52 52 53 55 56 56 56 56 56 55 55 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 51 51 50 48 48 49 51 51 52 52 51 50 51 51 52 52 52 52 52 52 52 52 51 51 50 49 49 49 49 50 51 51 50 50 50 50 47 45 46 45 43 42 40 38 37 37 37 37 37 37 38 38 39 40 40 41 42 43 43 43 42 42 43 43 44 46 46 44 44 45 46 48 48 47 45 43 41 40 41 43 44 44 45 45 45 45 45 44 43 43 43 43 41 40 40 41 41 41 41 41 41 40 40 41 41 42 42 41 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 41 41 42 43 43 44 45 46 47 48 48 48 48 48 48 48 47 46 45 46 45 44 44 44 43 42 41 41 41 40 40 38 38 38 38 38 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 39 40 40 39 38 37 37 37 37 37 37 37 36 35 35 35 36 37 37 37 37 37 38 38 38 38 38 39 39 39 39 40 41 41 41 41 41 41 42 42 41 40 41 41 40 41 41 40 38 39 39 38 38 39 39 39 39 38 36 35 35 35 35 36 37 38 39 39 39 39 40 39 38 37 37 38 39 40 41 41 42 42 42 43 43 43 43 43 43 44 44 44 43 43 42 41 40 40 40 40 39 38 38 38 39 40 40 41 41 41 41 40 40 39 38 38 39 40 41 42 42 42 42 41 40 40 41 42 42 43 43 44 45 45 44 43 43 43 44 44 44 44 45 44 44 44 44 45 45 45 44 44 43 43 43 43 42 42 43 43 42 41 41 40 40 40 40 40 40 40 41 42 43 43 44 44 44 44 43 43 44 44 43 42 42 42 41 41 42 41 40 38 37 38 40 41 41 42 43 43 44 44 44 43 42 41 39 39 41 42 42 41 41 40 40 41 40 39 39 39 39 40 41 41 40 40 40 40 41 40 40 42 43 44 44 44 44 43 43 42 42 42 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 34 34 35 35 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 33 33 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 51 54 55 56 56 56 55 55 55 55 55 56 55 55 54 54 53 53 53 52 52 52 52 52 52 51 50 49 48 49 51 51 51 51 50 50 51 51 51 51 52 51 51 51 52 51 51 51 50 50 49 49 49 49 50 50 49 50 51 50 49 49 49 49 48 47 44 42 40 39 38 37 37 37 37 37 37 37 38 39 40 41 42 43 42 41 42 44 46 45 43 43 45 46 47 47 47 46 45 41 40 42 44 44 44 45 45 44 44 44 44 43 43 43 43 41 40 40 40 41 41 41 41 41 40 40 40 40 41 41 40 40 40 39 38 38 37 37 37 37 37 38 38 38 38 38 39 39 39 40 40 41 41 43 44 45 45 47 47 48 48 48 48 48 47 46 46 46 44 43 45 45 44 43 42 42 41 41 40 40 40 39 38 38 37 37 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 38 39 39 39 37 37 37 37 37 36 35 35 35 35 36 37 37 37 37 37 37 38 38 38 38 39 40 40 39 39 40 40 40 40 40 41 41 42 41 39 40 40 40 41 41 40 38 38 39 38 37 38 38 38 39 38 36 35 35 35 35 35 36 37 38 37 37 38 38 38 37 37 38 39 39 40 42 42 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 42 41 40 40 40 38 38 38 39 40 41 41 41 42 41 40 39 39 38 38 39 40 41 41 41 41 41 40 40 40 41 42 42 42 43 44 44 45 45 44 43 43 43 44 44 44 44 45 45 44 44 44 45 45 45 44 44 43 43 43 42 42 43 43 43 43 42 41 41 41 40 39 39 39 40 41 41 42 43 44 44 44 43 42 43 44 44 44 42 41 41 40 39 40 39 38 37 37 38 40 41 41 42 43 43 44 44 44 43 42 41 38 39 41 42 41 40 40 40 39 39 40 40 41 41 40 39 39 40 39 39 39 39 39 39 40 42 43 44 44 44 43 43 43 42 42 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 37 38 38 37 37 38 38 38 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 35 35 34 33 33 34 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 51 51 52 51 51 50 49 50 53 55 56 56 55 55 56 56 56 56 55 55 54 54 53 53 53 53 53 52 52 53 52 52 52 51 49 48 49 49 50 49 49 50 51 51 51 51 51 51 50 51 51 51 51 51 52 51 50 49 49 48 49 49 49 50 50 50 52 52 52 51 50 50 50 48 46 45 44 42 40 39 38 37 37 37 37 37 37 37 39 40 40 40 41 44 45 45 43 42 43 45 45 46 46 45 43 41 40 42 44 44 45 45 44 44 44 44 44 43 43 43 43 41 40 40 40 39 39 40 41 40 40 39 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 38 38 38 38 38 38 38 39 40 40 41 43 45 46 46 46 47 47 46 46 47 47 47 46 45 44 45 44 43 43 43 43 42 41 40 40 41 40 40 40 39 38 38 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 39 38 37 37 37 37 36 35 35 35 35 36 37 37 37 37 37 37 37 37 38 38 38 39 39 39 38 39 40 40 40 39 40 40 41 40 39 40 40 40 41 41 40 38 38 39 37 37 38 38 37 37 36 35 35 35 35 36 36 36 36 36 37 37 37 37 37 37 38 38 39 40 41 42 43 43 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 41 40 39 38 38 38 38 39 40 41 41 41 41 40 40 38 38 38 38 40 40 41 41 41 40 39 39 40 40 41 42 42 42 43 44 44 44 44 43 42 44 44 44 44 44 44 45 45 44 44 45 45 44 44 44 43 43 43 43 42 43 43 43 43 42 42 42 42 41 40 39 39 39 40 41 41 42 43 44 43 43 43 42 42 44 44 43 42 42 42 39 38 37 37 37 38 39 39 40 40 41 42 43 44 45 44 43 43 42 40 38 38 40 40 40 40 41 41 41 41 42 42 43 42 41 40 39 39 39 39 41 41 40 41 42 42 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 42 42 42 42 42 41 41 41 41 41 40 40 39 39 40 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 34 34 35 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 54 54 54 54 53 52 51 50 50 52 54 55 55 56 55 55 56 56 55 55 54 54 53 53 53 53 53 53 53 53 52 52 52 52 51 50 48 47 48 48 49 51 50 50 50 50 50 50 50 51 51 51 51 50 51 51 51 50 48 47 48 48 47 49 50 51 52 51 51 50 49 48 49 48 49 50 50 48 45 42 40 40 40 39 38 37 37 37 37 37 38 38 39 41 42 44 44 42 40 42 43 44 45 43 41 40 40 42 44 44 45 44 44 43 44 44 44 43 43 43 43 42 41 41 39 38 38 39 40 40 40 39 38 39 39 39 39 40 40 39 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 40 41 43 45 45 45 46 45 44 45 44 43 44 45 45 45 44 43 43 44 42 41 41 41 41 40 38 38 38 38 38 38 37 38 38 38 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 37 38 37 37 37 37 36 35 35 35 35 36 36 36 36 37 37 37 37 37 38 38 38 38 39 39 38 38 38 39 39 39 39 40 39 39 40 40 40 41 41 41 40 38 38 39 38 37 38 38 37 36 35 35 35 35 36 37 38 38 37 37 37 37 37 37 37 38 38 39 40 40 41 42 43 43 43 43 44 44 43 43 42 42 42 42 42 42 42 41 40 40 39 38 37 37 38 38 39 40 40 40 40 40 39 39 38 38 38 39 40 40 40 39 39 39 39 40 41 41 41 41 42 43 44 45 45 44 43 42 43 44 44 44 45 44 44 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 44 43 43 42 41 41 41 42 41 40 39 40 41 41 42 43 43 43 43 43 42 41 41 43 43 43 42 42 42 40 38 37 37 38 39 41 42 42 42 43 43 44 45 45 44 43 42 41 41 40 39 39 39 41 42 42 42 43 43 43 43 43 43 42 41 40 39 40 41 42 42 42 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 40 40 39 39 39 39 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 33 33 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 55 55 55 55 54 53 52 52 50 50 51 53 54 55 54 55 56 55 55 55 54 54 54 54 54 54 54 54 54 53 52 52 52 52 51 50 49 48 47 47 49 50 50 49 49 50 50 49 49 50 50 51 50 49 50 51 51 51 49 48 47 47 47 48 49 50 51 50 50 50 49 48 47 47 48 50 50 49 47 45 45 46 46 44 41 40 40 38 37 37 37 37 37 38 39 40 41 41 40 41 41 43 43 41 39 40 41 43 43 43 44 44 43 43 43 43 44 44 43 43 43 43 42 41 40 39 38 39 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 41 43 44 43 42 42 42 41 41 40 39 39 40 41 42 42 42 42 41 40 39 38 38 38 38 37 36 35 35 35 35 35 35 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 37 37 37 36 36 36 36 35 35 35 35 35 36 36 37 37 37 37 37 38 38 38 38 38 38 38 37 37 38 38 38 39 39 38 38 40 40 40 41 41 41 40 39 37 38 38 37 38 38 37 36 35 35 35 35 36 37 38 39 39 39 38 38 38 38 38 39 39 39 40 41 42 42 42 42 43 43 43 43 43 42 41 40 40 40 40 41 42 41 40 40 39 38 37 37 38 39 39 39 39 39 39 38 38 38 37 38 39 39 40 39 38 38 38 39 40 41 42 42 42 42 43 43 44 44 44 43 42 42 43 44 44 45 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 44 43 43 42 41 41 41 41 41 40 39 39 40 41 42 43 43 43 43 42 41 41 41 43 43 43 42 42 42 40 38 37 38 40 41 42 42 43 43 44 44 45 46 45 43 43 43 42 41 41 41 40 41 41 41 41 42 42 43 43 43 43 42 42 41 41 41 42 42 43 43 42 42 43 42 42 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 40 40 39 39 39 39 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 33 33 33 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 55 55 55 55 54 54 54 53 52 50 49 49 52 53 53 54 54 54 55 55 55 55 55 55 55 55 55 55 54 53 52 52 52 52 51 49 49 49 47 46 47 48 48 48 48 48 48 48 48 49 50 50 49 49 50 50 50 50 50 50 48 46 46 48 48 49 51 50 49 49 49 49 48 46 47 49 49 48 48 49 48 48 48 47 44 43 42 41 39 38 38 37 37 37 37 37 38 39 39 39 39 41 40 39 39 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 40 39 38 39 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 40 41 40 39 38 38 38 37 37 37 37 37 37 38 39 39 39 39 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 37 37 36 36 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 38 38 38 38 38 38 37 37 37 37 38 39 38 38 38 39 40 41 41 41 41 40 39 37 37 37 37 37 37 36 35 35 35 35 35 37 37 38 39 39 40 40 39 39 39 39 40 40 40 41 42 42 42 42 42 43 43 43 43 43 42 41 40 39 39 40 40 41 41 40 40 39 38 37 37 38 39 39 39 39 39 38 38 37 37 38 39 40 40 39 38 38 38 39 40 41 42 43 43 43 43 43 43 43 43 43 42 42 43 44 44 44 44 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 44 44 44 43 43 42 41 41 40 40 40 39 38 39 41 41 42 43 43 43 42 41 41 42 43 43 42 42 42 40 39 38 37 38 40 41 42 42 43 44 45 45 46 46 45 44 44 44 43 42 43 42 40 41 42 42 42 41 41 42 43 43 42 41 41 41 41 41 41 41 42 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 40 40 40 40 40 40 39 39 40 39 39 40 39 39 39 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 36 36 36 36 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 55 55 55 55 55 55 55 54 53 51 49 48 49 50 52 52 51 51 51 52 53 54 55 56 56 55 55 55 55 54 53 53 52 52 51 50 49 49 48 48 47 46 46 46 46 45 46 48 48 48 49 49 49 48 49 49 49 49 49 49 48 46 45 46 47 49 50 50 49 47 48 49 48 45 45 48 48 46 46 48 48 46 47 48 47 45 44 43 41 41 41 40 38 37 37 37 37 37 37 37 37 39 39 39 41 42 43 42 42 42 42 43 43 43 43 44 44 43 43 44 43 43 42 42 42 41 39 38 38 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 36 37 37 36 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 38 37 37 37 38 38 37 37 37 37 38 38 38 38 39 40 40 41 41 41 40 39 38 38 36 35 36 37 36 35 35 34 34 35 36 38 38 38 39 39 40 41 41 41 40 40 41 41 40 41 41 41 41 42 43 43 43 43 43 43 43 42 41 40 39 39 40 41 40 40 40 39 38 37 37 38 39 38 38 38 39 38 37 37 38 39 40 40 39 38 38 39 40 40 40 41 42 43 43 43 42 42 43 43 43 42 41 42 43 43 43 44 44 44 44 44 44 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 44 43 43 42 41 40 40 41 41 40 39 39 39 40 40 41 42 42 42 41 41 42 43 42 41 42 40 39 38 38 39 39 39 40 42 43 44 45 45 46 46 46 46 45 45 44 44 44 44 42 41 41 42 43 43 42 41 41 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 35 35 35 35 36 36 36 36 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 33 56 55 55 55 55 55 55 55 53 51 50 50 49 48 49 49 48 48 48 48 49 50 51 53 54 54 52 52 53 53 53 53 53 52 51 51 50 50 50 50 50 49 48 47 47 46 46 46 46 46 46 47 48 47 47 48 47 48 48 48 47 46 45 45 47 48 48 47 47 46 46 47 47 45 44 45 46 45 44 46 47 45 44 45 46 46 45 45 45 44 45 44 41 39 38 38 37 37 37 37 37 38 39 41 42 43 43 41 41 42 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 42 41 39 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 36 37 37 37 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 38 37 37 37 38 38 37 37 37 37 38 39 40 40 40 40 41 41 41 40 40 40 38 37 36 36 36 36 35 35 34 34 34 36 37 38 37 37 38 39 40 41 41 42 42 41 42 42 41 41 41 41 42 42 42 42 42 42 42 43 43 42 42 41 40 39 40 41 40 39 39 39 38 37 37 38 39 38 38 38 37 37 37 38 39 39 39 38 37 38 39 41 41 41 41 41 42 42 42 42 42 42 43 43 42 41 41 42 43 43 43 43 43 44 44 44 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 42 41 40 40 39 39 39 39 40 42 42 42 41 40 41 42 42 40 39 38 38 38 39 40 41 41 42 43 44 44 44 45 45 46 47 47 46 46 46 46 46 45 44 42 41 42 43 43 42 42 41 42 42 42 41 41 41 41 41 41 41 41 40 41 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 39 39 38 38 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 36 36 36 35 36 36 36 35 35 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 56 56 56 55 55 55 55 55 53 51 51 53 51 50 50 49 50 50 50 49 48 48 49 50 50 50 49 49 49 51 53 53 53 52 52 52 51 51 52 51 51 51 50 49 48 47 47 46 46 46 45 46 46 45 45 45 45 45 45 45 46 46 45 45 45 45 45 45 45 45 45 45 46 45 44 43 43 43 42 43 45 44 43 43 43 44 43 44 46 46 46 45 45 44 43 42 40 38 37 37 37 37 38 39 41 42 41 40 41 42 43 44 45 45 45 45 45 45 45 45 45 44 43 43 43 43 42 41 40 39 37 37 37 37 37 37 38 38 38 38 39 39 39 38 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 40 40 40 39 38 37 37 37 38 38 38 38 38 38 38 39 40 40 40 40 39 38 37 36 36 35 35 35 35 35 35 35 35 35 35 36 37 38 38 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 36 37 37 37 36 36 35 35 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 38 38 38 37 37 38 39 40 41 41 41 41 41 40 40 39 39 38 37 37 36 36 35 34 34 34 35 35 36 37 37 37 37 38 40 40 41 42 42 43 42 42 43 42 40 40 41 41 41 41 41 41 42 42 43 43 42 41 40 39 39 40 41 40 39 37 37 37 37 37 38 39 38 38 37 37 38 38 38 38 38 37 38 38 39 40 41 41 41 41 41 41 41 42 42 42 42 42 42 41 41 41 42 43 43 44 43 43 44 44 45 45 44 44 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 42 42 42 40 40 40 40 39 38 40 40 41 41 41 40 41 42 41 39 37 38 39 40 41 41 42 43 43 44 44 44 45 45 45 45 46 46 47 47 47 47 46 45 45 43 42 42 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 39 38 38 38 38 39 39 39 39 39 39 39 38 38 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 36 36 35 35 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 33 33 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 56 56 55 55 56 55 55 55 53 51 52 53 52 52 53 52 52 52 52 51 50 49 48 47 47 47 47 47 47 48 50 51 52 52 52 52 52 52 52 52 52 52 50 50 49 49 49 48 48 48 47 47 46 47 47 45 44 45 44 44 44 45 45 43 43 43 43 43 42 43 43 42 44 44 42 41 41 42 41 41 41 41 41 41 41 41 41 42 43 43 43 44 45 46 45 45 44 41 39 37 37 37 37 37 38 39 40 40 41 42 43 44 45 45 45 46 46 46 46 46 45 44 44 44 44 43 42 41 40 39 37 37 37 37 37 38 40 40 40 40 42 43 42 41 42 43 42 41 40 38 37 37 38 38 38 37 37 38 39 38 37 40 41 42 43 43 42 42 40 38 37 39 41 42 41 40 41 42 41 41 42 41 41 40 40 39 38 38 37 37 36 36 37 37 37 37 37 37 38 38 38 39 39 38 38 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 36 37 37 37 36 35 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 37 37 38 39 40 41 41 40 39 39 38 38 38 37 36 35 35 34 34 34 34 35 36 37 38 38 38 38 39 41 41 41 41 42 43 43 42 42 42 40 40 41 41 41 41 42 42 42 42 42 42 42 41 40 39 38 39 40 40 39 37 37 37 37 38 39 39 38 37 37 37 38 39 38 37 37 37 38 38 39 39 40 40 40 40 40 41 41 40 41 41 41 40 40 41 42 42 42 43 44 43 43 43 44 44 44 44 44 44 45 44 44 44 43 43 43 43 43 43 43 43 44 43 43 43 42 42 42 43 42 41 40 41 41 41 40 39 39 39 40 40 40 39 40 41 39 37 37 39 41 41 42 43 44 44 44 44 44 44 45 45 44 45 45 46 46 47 46 46 46 45 44 43 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 33 33 33 33 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 55 55 54 54 54 54 53 53 52 52 53 53 53 53 54 53 53 53 53 52 51 50 49 49 49 49 48 48 47 47 47 48 49 49 50 50 50 50 50 50 51 52 51 52 53 52 50 49 50 50 50 50 49 50 49 47 47 47 48 48 47 45 44 43 44 44 44 43 43 43 43 43 43 44 43 43 43 44 43 42 42 42 41 40 41 41 40 40 40 40 40 41 42 42 41 42 42 42 40 39 38 37 37 37 37 37 38 40 42 43 44 44 45 46 47 46 45 45 45 45 45 44 44 44 44 43 41 40 39 38 37 37 37 37 39 41 42 44 43 43 44 45 45 44 44 45 46 46 43 41 39 39 42 41 39 38 39 40 41 40 39 40 42 43 44 43 42 42 42 40 39 41 43 43 44 43 43 43 43 42 42 41 41 40 40 39 39 39 37 37 37 38 38 38 37 38 38 39 40 40 39 40 41 41 40 40 40 40 38 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 36 37 37 36 35 34 34 35 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 39 40 39 39 38 38 38 38 37 35 34 34 34 34 34 35 36 37 38 39 40 40 40 40 41 41 41 41 42 42 42 41 41 41 40 40 41 42 42 42 43 42 42 42 41 41 41 40 40 39 38 39 40 40 38 37 37 36 37 38 39 38 38 37 37 37 38 38 37 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 40 40 40 41 41 41 42 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 44 44 43 43 43 43 43 43 44 44 44 43 43 43 42 42 41 41 41 41 42 43 41 39 37 38 39 40 40 39 40 40 38 36 37 40 42 42 43 43 44 44 43 44 43 43 44 44 44 45 45 46 46 46 45 45 46 45 44 43 43 43 44 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 33 33 33 33 34 34 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 55 54 54 54 54 54 53 53 53 54 54 54 54 54 54 54 53 53 53 52 50 51 52 52 51 51 51 50 49 48 47 46 47 47 47 47 47 47 47 47 47 48 49 50 51 52 52 52 53 52 52 52 51 50 48 48 48 48 50 50 49 47 45 46 47 47 46 46 45 47 48 47 45 45 46 46 45 45 45 44 44 44 43 42 42 43 42 41 40 40 40 40 40 40 39 39 39 39 39 39 38 37 37 37 37 37 37 39 41 42 43 43 45 47 48 47 44 43 44 44 44 43 43 43 43 42 41 39 38 37 37 37 37 38 42 44 46 47 47 47 46 46 48 48 48 47 48 47 45 44 43 41 43 43 41 41 41 40 42 42 41 41 42 44 44 44 43 42 42 41 40 42 43 43 44 44 44 44 44 43 42 42 41 40 40 40 40 38 37 37 38 38 38 37 37 38 38 40 41 41 41 42 43 43 42 41 42 42 40 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 38 37 38 38 37 36 34 34 34 34 34 34 35 37 38 38 39 40 40 40 40 41 41 41 42 42 41 40 40 40 40 40 41 42 43 43 43 43 43 43 42 41 40 40 39 39 39 38 39 40 39 38 37 36 36 37 39 38 37 36 36 36 37 37 37 38 39 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 41 41 42 42 42 43 43 44 44 43 42 42 43 43 43 43 43 43 44 45 45 45 46 45 44 44 43 42 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 42 42 40 39 38 37 39 39 39 40 39 37 36 38 40 42 43 43 44 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 46 46 45 44 43 43 44 43 43 43 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 41 41 40 40 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 56 56 55 55 55 56 55 55 55 55 55 55 55 55 54 54 54 54 53 51 51 52 52 52 52 52 52 51 51 50 49 48 47 47 47 47 46 46 46 47 47 46 46 46 47 48 50 52 52 52 53 53 52 51 50 50 50 50 50 50 49 48 48 49 50 48 47 47 48 49 50 49 47 46 48 47 46 46 46 45 45 45 45 45 44 44 44 44 43 42 42 41 41 40 39 39 39 40 40 39 39 38 38 37 37 37 37 37 37 39 40 42 43 45 46 45 42 42 43 44 43 42 42 42 43 42 40 38 37 37 37 37 39 40 42 45 48 48 48 49 48 48 49 51 51 50 49 49 49 47 45 43 43 45 44 43 42 41 42 43 43 44 45 45 44 43 42 42 41 41 41 42 43 43 43 44 44 44 44 43 43 42 41 41 41 40 39 38 37 38 39 39 39 38 37 38 39 40 41 42 42 43 43 42 41 40 40 40 41 40 39 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 37 38 38 37 37 37 37 36 35 34 34 34 34 34 35 37 38 38 38 38 39 40 40 40 40 41 41 41 41 41 40 39 39 40 40 41 42 43 43 43 43 43 42 42 41 40 39 38 38 38 38 39 40 39 38 37 36 36 38 38 37 36 36 36 36 37 37 38 39 40 40 41 41 40 40 40 40 41 41 41 41 41 42 41 41 42 43 43 43 43 43 43 44 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 44 44 43 42 42 43 43 43 43 43 43 43 43 43 42 42 42 42 41 42 42 42 41 40 40 39 38 38 38 39 38 36 38 39 40 42 43 43 43 43 43 43 43 43 42 42 43 43 44 44 45 45 45 45 45 46 46 46 45 43 43 44 44 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 41 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 36 36 35 35 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 57 56 56 56 56 55 55 55 56 56 55 55 55 55 55 55 54 54 53 51 51 52 52 53 53 53 52 52 52 51 50 50 50 50 49 49 48 48 48 48 48 47 47 46 45 45 46 47 47 49 50 50 50 50 50 50 51 52 51 51 50 49 49 51 51 50 49 50 50 50 49 48 49 50 50 49 47 48 48 47 47 47 47 46 46 46 46 46 45 44 43 43 43 42 41 41 41 42 42 41 40 40 40 39 38 37 37 37 37 37 38 39 39 40 43 43 41 41 42 43 43 42 40 41 41 40 39 37 37 37 37 38 41 43 44 46 47 47 47 49 48 48 49 51 52 53 52 52 52 50 47 45 47 49 47 45 44 43 42 43 44 45 46 45 44 43 43 43 42 41 42 43 44 44 43 43 43 44 44 43 43 42 42 41 41 40 38 37 37 38 39 40 39 39 39 39 40 40 41 41 42 42 41 41 40 39 38 38 39 40 40 39 39 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 36 37 38 37 37 37 37 35 34 34 34 34 34 35 36 38 38 38 38 38 39 40 40 40 40 41 41 41 40 40 39 38 39 40 41 42 42 42 43 43 43 43 42 41 40 40 39 38 38 37 39 40 39 39 38 37 36 37 38 37 36 36 36 37 37 37 38 38 39 40 41 42 42 41 41 41 42 42 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 43 43 42 42 42 42 42 42 43 44 44 44 43 44 45 44 44 43 42 42 42 43 43 42 42 42 42 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 38 38 39 38 37 37 39 41 42 42 42 42 43 43 43 43 42 42 42 42 43 43 44 44 44 44 44 45 45 45 46 46 45 44 43 44 44 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 41 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 36 36 35 35 35 35 35 35 35 35 35 35 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 35 35 35 35 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 57 57 57 57 56 55 55 56 56 56 55 55 55 55 55 55 55 54 54 52 52 53 53 53 54 53 53 52 52 51 51 51 51 51 51 50 49 49 50 49 49 49 49 48 47 46 45 45 45 45 46 46 46 46 46 47 48 49 49 49 50 50 51 52 51 50 50 49 49 48 47 47 48 48 48 47 47 47 47 47 48 49 49 48 47 48 48 47 46 46 45 45 45 44 43 43 44 44 43 42 43 43 42 42 40 39 39 37 37 37 37 37 37 38 39 39 39 40 41 42 42 42 41 39 39 38 37 37 37 37 38 41 44 45 45 46 46 45 46 46 47 47 48 49 50 52 53 53 53 51 49 48 50 52 50 47 46 44 43 44 46 47 47 46 45 45 44 43 42 41 42 44 45 44 43 43 43 43 43 43 42 42 42 41 40 39 39 39 39 39 40 41 41 41 40 39 40 41 41 42 42 41 41 41 41 40 38 38 38 38 39 39 39 39 38 38 38 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 35 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 35 36 37 37 37 37 36 34 34 34 34 34 35 35 36 37 37 37 37 38 38 39 40 40 41 41 42 41 40 39 38 38 39 40 42 42 41 41 42 43 44 44 43 42 41 40 40 39 38 37 38 39 38 38 38 37 36 36 37 37 36 36 37 38 38 38 40 40 40 41 41 42 41 41 41 41 42 42 43 43 43 43 43 43 43 43 44 44 43 43 44 44 44 44 43 42 42 41 41 42 43 43 44 43 43 43 44 44 44 43 43 42 42 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 41 41 40 40 39 38 38 37 36 37 39 40 41 42 42 42 43 43 43 42 42 42 42 42 43 44 44 44 44 44 44 44 45 45 46 46 45 44 43 44 44 44 43 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 58 58 58 57 56 56 56 56 56 56 56 56 56 55 55 54 53 53 53 53 54 54 54 54 54 54 54 53 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 48 47 46 46 46 45 45 44 45 46 45 45 44 44 45 46 48 49 49 48 47 46 45 44 44 43 43 43 43 43 43 44 44 44 44 45 46 46 46 47 48 49 48 48 48 46 47 46 45 45 46 46 45 45 44 45 46 45 43 41 41 42 41 39 37 37 37 37 37 37 37 38 38 39 40 40 41 40 38 37 37 37 37 37 37 38 42 44 43 42 43 44 45 45 45 46 47 48 49 50 52 53 53 52 52 52 51 51 52 52 51 48 46 45 45 47 47 46 46 45 44 44 43 43 42 43 45 45 44 43 43 43 43 42 42 41 41 41 40 40 40 40 40 41 41 42 42 41 41 40 40 40 41 42 42 42 41 40 41 41 40 40 39 38 38 38 38 39 39 39 40 39 37 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 36 36 37 37 37 37 37 36 36 36 35 35 36 36 36 37 36 35 35 36 36 37 37 37 37 36 36 35 35 35 35 36 36 37 36 35 34 34 34 34 35 35 35 36 36 36 37 37 37 38 39 40 41 41 42 41 40 39 38 38 39 40 41 41 41 41 41 42 43 44 44 43 43 42 41 41 40 38 37 37 38 38 37 37 36 36 36 36 36 36 37 38 39 39 39 40 40 41 41 41 41 40 41 41 42 42 43 43 43 44 44 44 44 43 43 44 44 43 43 43 44 44 44 43 43 42 41 41 42 43 43 43 42 43 44 43 43 43 43 43 42 41 42 43 42 42 41 42 43 43 43 43 43 43 42 42 42 43 43 42 42 41 40 40 40 39 38 37 36 37 39 40 40 41 42 43 43 42 42 42 42 42 42 42 43 44 44 44 43 43 44 44 45 45 46 46 45 44 43 43 44 44 43 43 43 43 42 42 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 59 59 59 58 58 57 57 57 56 56 56 56 56 55 54 54 54 54 54 55 55 55 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 51 51 51 51 51 51 51 50 50 49 49 49 48 47 46 46 48 49 48 46 45 45 44 43 44 44 44 44 43 43 44 44 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 43 45 48 49 48 47 47 48 47 46 47 47 46 45 46 45 45 47 46 44 41 41 44 44 42 40 40 40 39 38 37 37 37 37 37 38 38 39 38 37 37 37 37 37 37 37 38 40 40 40 41 42 44 46 47 47 47 48 49 50 52 53 53 53 52 52 52 52 51 51 52 53 52 50 47 47 48 47 46 46 45 44 44 44 44 44 44 45 45 44 43 43 43 42 42 41 42 41 40 41 41 42 41 41 42 42 42 41 41 41 40 40 41 42 42 42 42 40 39 39 39 39 40 40 38 38 37 37 38 38 39 39 39 37 36 35 35 36 36 36 37 36 35 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 35 35 35 35 35 34 34 34 34 34 34 35 36 36 35 35 35 35 36 36 36 37 36 35 35 35 35 35 35 35 36 35 34 34 34 34 34 35 35 36 36 36 37 38 38 38 39 40 41 41 41 41 40 40 38 37 38 40 41 40 40 40 41 41 42 43 44 44 43 43 43 42 41 40 39 38 37 37 37 37 36 36 36 36 36 36 37 38 39 40 39 39 40 40 41 41 40 40 40 42 43 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 43 44 43 43 43 42 41 41 42 43 43 43 42 42 43 43 43 43 43 42 42 41 42 42 43 42 41 41 42 42 42 42 42 43 43 42 42 42 43 42 42 41 41 40 40 40 40 39 37 36 36 37 39 40 42 42 43 43 42 41 42 42 42 42 42 43 44 44 43 43 43 44 44 45 45 46 46 46 44 43 43 44 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 37 37 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 35 35 35 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 60 61 60 59 58 58 58 57 57 56 56 56 56 55 55 56 57 57 56 57 57 56 55 55 55 55 55 54 54 54 54 54 54 53 53 52 52 52 52 52 52 52 51 51 51 51 51 50 50 49 47 46 48 49 49 49 48 48 47 46 46 45 45 45 44 44 44 45 45 46 45 46 46 46 45 44 43 44 44 44 43 43 43 42 41 42 43 44 45 44 45 46 47 47 48 48 47 46 46 46 46 47 47 44 43 44 45 45 44 43 44 44 41 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 40 40 40 40 41 42 44 45 46 47 48 49 50 51 51 52 53 53 53 52 52 51 50 50 50 51 52 53 52 49 48 49 48 47 46 45 45 46 46 46 46 45 45 44 43 43 43 42 42 42 42 42 41 41 41 42 43 43 43 43 43 42 42 43 42 42 41 42 43 43 43 42 40 38 38 38 38 38 38 38 38 37 37 38 38 37 38 37 36 35 35 36 37 38 39 39 38 37 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 35 36 37 36 35 34 34 34 34 34 34 35 34 34 34 34 34 34 35 36 37 38 38 38 39 40 40 40 40 41 41 41 40 39 39 38 38 39 40 40 40 40 41 41 41 43 44 43 43 43 42 42 42 41 40 40 40 38 37 36 36 36 36 37 37 36 36 38 39 39 39 38 39 40 40 40 40 40 40 41 42 42 42 43 44 44 44 44 43 43 43 43 43 43 43 43 44 44 43 43 43 43 42 41 41 42 43 43 43 42 42 42 42 42 43 43 42 41 41 42 43 43 42 41 41 41 42 42 42 42 42 42 41 42 43 43 42 41 41 40 40 40 39 39 38 37 36 36 38 39 41 42 42 43 43 42 41 42 42 42 42 43 43 43 43 43 42 43 44 44 45 46 46 46 46 45 43 43 44 44 44 43 43 43 42 42 41 41 41 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 37 37 37 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 33 33 35 35 35 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 62 62 61 59 59 58 58 58 58 57 57 57 57 58 58 57 58 59 58 58 57 57 57 57 57 55 55 54 55 55 55 54 54 54 53 53 53 53 53 53 53 52 52 52 52 51 51 50 49 48 47 48 49 50 50 49 49 49 49 48 48 48 48 47 46 46 45 45 46 46 47 46 47 47 47 47 46 47 47 47 47 46 45 44 42 41 41 41 41 41 41 42 43 45 47 47 47 47 47 47 47 47 46 45 45 46 47 46 46 45 44 42 40 37 37 38 38 37 37 37 37 37 37 38 38 39 39 39 40 42 42 42 43 44 45 45 45 45 47 48 50 51 52 52 52 52 52 53 52 52 51 50 50 50 51 52 52 53 52 51 50 49 48 47 46 46 47 47 46 46 46 45 44 43 43 43 42 42 43 43 43 42 41 42 43 44 44 45 45 44 43 43 44 44 43 42 43 44 43 42 41 40 39 39 38 38 37 37 38 39 39 39 40 39 38 37 36 36 36 35 35 37 38 40 41 40 40 40 39 37 36 35 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 37 38 38 38 39 40 41 41 41 41 41 40 39 39 38 37 38 38 39 39 39 40 41 42 43 43 44 43 43 42 42 43 43 41 40 40 40 39 38 36 35 36 37 38 36 36 37 38 38 38 38 38 39 40 39 39 39 40 41 41 42 42 42 43 44 44 43 43 43 43 43 42 42 43 43 44 43 43 43 42 42 42 41 41 42 43 43 43 42 41 41 42 42 42 43 42 41 41 42 42 42 42 41 41 41 42 42 41 41 41 41 41 41 42 42 42 42 41 41 41 40 39 38 37 37 36 36 38 40 40 41 42 43 43 42 41 42 42 42 42 42 43 43 43 43 42 42 43 44 44 45 45 46 46 46 45 44 43 43 44 44 43 43 43 43 43 42 41 41 40 40 40 40 40 40 40 39 38 38 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 32 33 35 35 35 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 62 62 61 60 59 59 59 59 59 59 58 57 58 59 60 59 59 60 60 59 58 58 58 58 57 56 56 55 56 56 56 55 55 54 54 54 54 53 53 53 52 52 52 51 50 49 49 48 48 48 49 50 50 51 51 50 50 50 50 50 49 49 49 47 46 46 45 46 47 47 48 48 48 48 49 48 48 48 48 48 48 47 46 45 44 43 42 43 42 42 41 40 40 41 43 45 47 48 48 48 48 47 46 46 46 46 47 47 47 45 42 40 38 37 37 39 40 39 39 40 40 40 39 41 43 42 41 39 39 41 42 41 43 44 45 46 46 47 48 49 50 51 52 52 52 52 51 52 52 51 51 50 49 51 52 52 52 53 53 53 52 50 49 48 47 47 47 47 46 46 46 45 44 44 44 43 43 43 43 43 43 42 42 43 44 44 45 46 46 45 44 44 45 45 44 43 44 44 43 42 41 41 41 41 40 38 38 38 39 40 40 40 40 40 38 37 37 37 37 36 35 36 37 39 40 41 41 42 41 38 38 37 37 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 38 39 40 40 41 41 41 42 41 41 40 39 38 38 37 38 39 40 40 40 40 41 43 43 44 44 43 43 42 42 43 43 42 41 40 39 39 38 37 35 36 37 37 36 36 37 38 37 37 38 38 38 39 38 39 39 40 41 42 42 42 43 44 44 44 43 43 43 43 42 42 42 43 44 44 43 43 42 41 41 41 41 41 42 43 43 43 42 41 41 41 42 43 42 41 40 41 42 42 41 41 41 41 42 42 42 41 40 40 41 41 41 41 42 42 41 41 41 41 40 38 37 36 36 36 36 39 40 41 41 42 42 42 41 41 42 42 43 42 42 42 42 42 42 43 43 43 44 44 44 45 46 46 45 45 44 43 43 44 44 44 43 43 43 43 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 40 40 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 32 32 34 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 62 62 61 60 60 60 60 60 60 59 58 57 58 59 60 61 61 60 60 59 59 59 59 58 57 57 57 57 57 57 56 56 56 55 54 54 54 54 53 53 51 50 50 50 49 48 48 49 50 51 51 51 51 51 51 51 51 51 51 50 49 48 47 46 46 47 47 48 49 48 48 49 49 49 49 49 49 49 48 48 48 47 47 46 46 45 44 45 45 45 43 41 40 40 40 42 44 45 45 46 47 48 48 47 47 47 47 47 46 44 41 39 37 37 38 40 41 42 41 42 43 42 41 44 46 44 42 42 39 39 41 41 42 44 45 46 47 48 49 50 51 52 52 52 52 51 51 51 51 50 49 49 50 51 52 52 52 53 53 53 53 52 50 49 49 49 48 47 47 46 46 45 45 45 45 44 44 44 43 43 43 43 43 44 44 45 46 47 46 45 45 45 45 45 45 45 44 44 44 43 42 42 42 42 40 39 39 38 39 40 39 39 39 38 37 37 38 38 38 37 36 36 37 38 39 40 42 43 41 38 39 39 39 39 37 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 38 39 40 40 40 40 41 42 42 42 41 40 40 39 37 37 38 39 40 41 42 42 42 42 42 43 43 43 43 43 42 42 43 42 41 41 41 39 38 37 37 35 35 36 36 36 36 37 37 37 37 37 37 37 38 39 40 40 40 41 42 43 43 44 44 44 44 43 43 42 42 42 41 42 43 43 43 43 43 43 42 41 41 40 41 41 42 43 43 42 41 41 41 42 42 41 41 41 42 42 41 41 41 41 41 42 42 41 40 40 40 41 41 41 41 42 41 41 41 41 40 39 37 36 36 38 39 39 39 40 40 41 42 42 41 41 41 41 42 42 42 42 42 41 42 42 43 43 43 43 43 44 45 46 46 45 45 44 43 43 43 43 44 43 43 43 43 43 42 41 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 34 35 35 35 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 62 62 62 61 61 61 61 61 60 59 58 58 58 59 60 61 61 61 60 60 60 60 59 58 58 58 58 58 58 58 57 57 56 54 53 52 52 51 51 51 50 50 50 50 50 50 50 51 52 52 52 52 52 52 52 51 51 51 51 50 49 47 47 47 48 49 49 50 51 49 48 49 49 49 50 50 49 49 49 49 48 47 48 48 47 46 45 45 46 46 45 43 41 40 40 40 40 41 41 43 44 46 47 47 48 48 47 46 45 44 41 39 37 37 39 40 41 42 42 43 44 44 44 45 46 46 45 45 42 40 40 42 43 44 46 46 47 49 50 51 52 52 52 51 51 51 50 50 50 49 48 48 49 51 51 51 51 52 53 53 54 53 53 51 50 50 49 48 47 47 46 46 46 46 45 45 44 44 44 43 43 43 44 45 45 46 47 48 46 46 46 46 45 44 44 44 44 44 43 42 42 41 41 42 41 40 40 40 40 40 39 39 38 37 39 40 39 40 40 39 37 36 36 37 38 39 41 43 41 39 40 41 42 41 40 38 38 39 38 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 39 39 40 40 41 41 42 42 41 41 41 40 39 38 37 37 39 39 40 41 42 42 43 43 43 43 43 42 42 42 42 43 43 41 40 41 41 40 39 38 36 35 35 35 35 36 37 37 37 37 37 37 37 38 39 40 41 41 41 42 42 43 44 44 44 44 44 43 43 42 41 41 41 42 43 43 43 43 43 43 43 41 41 40 40 41 41 42 42 42 41 41 41 42 41 40 40 41 41 41 41 41 40 40 41 41 41 41 40 40 41 41 41 41 41 41 41 40 40 40 39 37 36 36 37 39 40 40 40 40 41 42 42 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 43 44 45 45 46 46 46 45 44 43 43 43 44 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 39 38 38 39 39 39 39 38 38 39 40 40 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 34 33 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 63 63 62 62 62 62 61 60 59 58 58 58 58 59 60 61 61 61 61 60 61 61 60 59 59 59 59 59 58 58 57 57 55 54 52 51 51 51 51 51 52 53 52 53 52 51 50 51 52 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 50 51 51 51 50 49 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 47 46 47 47 47 46 44 42 41 40 40 40 40 40 40 40 41 43 44 47 48 46 45 44 43 40 38 37 37 39 41 41 43 43 43 44 45 46 46 46 48 47 45 43 41 39 41 42 43 44 45 47 49 50 50 51 52 52 51 50 50 50 50 49 48 48 48 48 49 50 51 52 52 53 53 54 54 54 52 51 51 51 50 49 48 47 47 46 46 46 46 46 45 45 44 44 44 45 46 46 46 47 47 46 46 45 45 46 45 44 43 43 43 43 42 41 41 41 42 41 41 40 40 40 40 39 38 37 37 39 41 42 41 40 40 39 37 36 37 38 39 40 42 42 42 43 43 42 41 40 39 39 40 41 40 39 37 35 36 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 38 38 39 40 41 43 44 42 41 40 40 40 39 37 37 38 39 41 41 41 41 42 43 44 44 43 42 41 41 41 41 43 42 41 40 41 40 39 40 39 36 35 35 35 36 37 38 38 38 39 39 39 38 39 40 41 41 41 42 43 43 43 43 43 44 44 44 43 43 42 41 41 42 43 43 43 42 42 42 43 43 42 41 40 40 41 42 42 41 40 40 40 41 42 41 40 40 41 41 41 41 41 40 40 41 41 41 41 40 40 41 41 40 40 40 41 41 40 39 39 39 37 36 35 37 38 39 39 40 40 41 42 42 41 41 41 41 41 42 42 42 42 42 43 42 42 42 42 42 42 43 44 45 45 46 46 46 45 44 43 43 43 44 44 44 43 43 43 43 42 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 39 39 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 34 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 63 63 63 63 62 62 61 60 59 60 60 59 59 59 60 61 61 62 61 61 61 61 61 60 60 60 60 60 59 57 56 56 55 54 52 52 53 53 53 54 54 54 54 54 53 51 51 52 53 53 53 53 53 53 52 52 52 50 49 49 51 51 50 50 51 52 52 51 50 50 51 51 51 50 50 50 50 50 50 50 50 50 49 48 46 47 48 47 47 46 45 44 43 43 42 42 42 42 41 40 40 39 39 40 43 45 45 45 43 42 40 38 38 38 40 42 43 43 43 44 45 45 46 46 47 48 47 45 44 42 40 39 40 42 44 45 47 49 50 50 51 52 52 51 49 49 49 48 48 48 48 48 49 50 50 51 52 52 53 53 54 55 54 53 53 53 52 52 51 50 50 49 48 48 48 47 47 47 46 46 45 45 46 46 46 46 45 45 45 45 44 44 45 45 44 43 42 42 42 42 41 40 40 40 39 39 39 39 39 39 38 38 37 37 38 40 41 42 42 41 41 39 37 37 38 39 39 41 42 44 44 42 41 40 40 41 42 42 42 41 39 38 37 39 38 37 36 36 37 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 40 40 41 43 43 41 42 41 39 39 38 37 38 39 40 41 41 42 42 43 43 43 43 43 43 41 41 41 42 42 42 40 40 39 39 39 38 37 35 35 35 36 37 38 39 39 40 40 40 40 39 40 41 42 42 43 43 43 42 42 42 43 43 43 44 44 43 42 41 41 42 42 43 42 41 41 43 43 42 42 41 40 39 40 41 42 41 40 39 40 41 42 40 40 40 41 41 42 41 41 40 40 41 41 41 41 40 39 40 41 40 40 40 39 40 39 38 39 40 39 37 35 36 37 38 38 39 40 41 42 41 41 41 42 42 42 42 42 42 43 43 43 43 43 42 42 43 43 43 44 45 46 46 45 45 45 44 44 43 43 43 44 44 43 43 43 43 42 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 39 39 39 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 63 63 63 62 62 61 61 60 60 61 61 60 60 60 60 61 62 62 62 61 61 61 61 61 61 61 60 60 59 57 56 55 54 53 52 53 53 53 54 55 55 55 54 53 53 52 52 53 53 54 54 54 54 53 52 50 50 50 50 51 52 52 51 51 52 53 53 52 51 51 52 52 51 51 51 51 51 50 50 50 50 49 49 48 47 48 48 47 46 45 45 45 45 46 45 44 45 45 44 42 41 41 40 39 40 41 43 44 42 41 39 38 38 38 39 41 43 44 44 45 46 47 46 46 48 49 48 47 45 43 42 42 40 41 43 45 47 49 49 49 50 50 50 49 48 49 48 47 47 48 49 50 51 51 50 50 51 52 52 53 54 55 55 54 54 54 54 54 53 52 52 51 50 50 49 48 48 48 48 47 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 42 42 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 39 40 41 42 41 40 39 37 38 39 40 40 42 44 44 44 43 42 43 45 45 44 43 43 41 39 38 38 41 40 39 39 38 40 40 38 36 36 37 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 38 39 39 39 42 43 41 41 40 38 37 37 36 38 39 40 42 42 43 43 44 43 42 42 42 41 41 42 42 43 42 41 40 40 39 39 39 37 35 35 35 36 37 38 39 40 40 40 41 41 40 40 41 42 42 43 43 43 43 42 42 42 43 42 43 44 44 43 42 40 41 42 42 42 42 41 42 43 43 42 42 41 39 39 40 40 41 41 40 39 40 41 41 40 39 40 41 42 42 41 41 40 40 41 41 41 41 40 39 40 40 40 41 40 39 39 38 38 39 40 39 37 35 36 38 39 39 40 41 41 41 41 41 41 41 42 41 41 42 42 43 44 44 44 43 43 43 43 43 43 44 45 46 46 45 45 45 45 44 43 43 43 44 44 44 43 43 43 42 41 41 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 36 37 37 37 36 36 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 34 34 34 34 34 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 63 62 62 62 62 61 61 61 62 62 61 61 61 61 61 61 62 62 62 62 62 61 61 61 61 60 59 58 58 57 56 54 53 53 53 54 54 55 56 57 56 55 54 53 53 52 53 53 54 54 53 53 53 52 50 49 49 50 52 52 52 52 52 52 53 53 53 52 51 52 52 52 52 52 52 51 51 51 51 50 49 49 50 50 49 49 48 48 48 47 47 47 46 46 45 45 45 46 45 43 43 43 42 40 39 39 40 41 40 39 38 38 38 39 39 41 43 43 44 46 47 48 47 47 48 49 48 47 45 44 44 43 40 40 43 45 47 48 48 48 48 49 48 47 47 47 48 48 48 48 49 50 51 52 51 51 51 52 53 53 53 55 55 55 55 55 54 53 53 52 52 53 52 51 50 49 48 48 47 47 46 45 45 45 44 44 44 44 43 43 43 43 43 42 42 42 43 42 41 40 40 40 39 39 39 39 39 38 39 39 38 38 38 38 39 40 41 41 41 41 41 39 37 39 41 42 42 43 44 45 44 44 44 44 45 45 44 43 42 41 39 39 39 41 41 41 41 39 41 40 39 38 38 39 40 41 39 38 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 38 40 41 42 42 40 39 38 36 36 37 38 38 39 41 42 42 43 44 43 42 41 41 40 41 42 43 44 43 41 40 40 40 38 37 36 35 35 35 36 37 39 40 40 41 41 41 42 41 41 42 42 42 42 42 43 43 42 42 42 42 42 42 43 43 43 42 40 40 41 41 41 41 42 42 43 43 43 42 41 39 39 40 40 40 40 39 39 40 41 40 39 39 40 41 41 41 41 40 39 40 41 41 41 41 40 39 40 40 41 41 41 40 39 38 38 39 40 38 36 35 36 38 40 41 41 42 42 41 41 40 40 40 41 41 42 42 43 44 44 45 45 45 44 44 43 43 43 44 44 45 46 45 45 45 45 44 44 43 43 44 44 43 43 43 43 42 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 37 37 37 36 36 36 36 36 35 35 36 36 37 36 36 37 37 37 37 37 36 36 36 36 36 36 37 36 36 35 35 35 35 35 34 34 35 35 35 35 34 34 34 34 34 34 33 33 34 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 63 62 62 62 62 62 61 61 62 62 61 61 62 62 62 62 62 62 62 62 62 61 61 61 61 60 58 58 57 56 55 53 54 54 54 55 55 56 57 58 57 55 54 54 53 53 53 54 54 54 53 53 52 51 49 50 51 51 52 53 53 53 53 53 54 54 53 52 52 53 53 53 53 53 52 53 53 52 52 50 49 50 51 51 50 49 49 49 49 49 48 48 47 46 46 46 46 46 45 44 44 44 43 42 40 39 39 39 39 38 38 40 41 41 40 40 42 43 44 46 47 48 48 48 49 49 48 47 46 45 45 44 41 41 44 46 47 47 47 47 46 47 47 46 46 47 48 49 49 49 48 49 51 52 52 52 52 53 53 53 53 54 55 56 56 55 54 53 52 51 51 51 51 50 50 49 48 48 47 46 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 44 43 42 42 41 40 40 40 40 40 40 40 40 40 39 39 38 39 40 40 41 41 41 42 42 39 38 39 42 43 43 43 43 44 45 45 45 44 43 42 42 42 41 41 39 39 40 40 41 43 43 41 42 42 41 39 38 39 40 42 41 40 38 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 38 40 40 41 40 40 39 37 35 36 38 38 38 39 41 42 42 43 44 43 42 41 41 40 41 42 42 43 43 41 39 40 41 38 36 35 35 35 36 37 38 39 40 41 41 41 42 42 42 42 42 42 42 42 42 43 43 43 42 41 42 42 42 42 42 42 41 40 40 40 40 40 41 42 42 42 42 42 42 41 40 39 39 39 40 39 39 40 40 40 39 39 40 40 41 41 41 41 40 39 39 40 41 41 40 39 39 40 40 41 41 41 41 39 38 37 39 39 37 35 35 36 38 40 41 42 43 42 41 41 40 40 41 42 42 43 43 44 44 45 45 45 45 45 44 44 43 43 44 44 45 46 45 45 44 44 44 44 44 44 44 44 43 43 43 43 42 42 41 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 39 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 37 37 37 37 37 36 36 35 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 35 35 35 34 34 33 33 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 63 63 62 62 62 62 62 62 62 62 61 61 62 62 62 62 62 62 62 62 62 62 61 61 61 60 59 58 57 56 54 53 55 56 56 55 56 57 58 58 57 56 55 55 54 53 53 54 54 54 53 53 52 51 50 51 52 53 53 54 54 54 54 54 55 54 53 52 53 54 54 54 54 54 53 54 54 53 52 50 50 52 53 52 51 50 50 50 50 49 49 49 48 47 46 46 46 46 45 45 45 44 43 43 43 42 41 40 41 40 40 42 43 43 41 40 42 43 44 45 47 47 48 49 49 50 49 48 48 47 46 44 42 41 43 44 45 45 44 45 45 44 45 46 47 48 48 49 50 49 49 50 51 52 52 52 52 53 53 53 54 55 55 55 55 54 54 53 52 51 50 49 49 49 49 48 48 47 47 46 46 46 46 46 45 45 46 46 46 46 45 45 44 44 44 44 44 44 43 43 42 42 42 42 41 41 41 41 41 41 42 41 40 40 40 40 40 40 40 40 39 38 38 38 41 42 42 43 43 44 45 45 44 43 42 42 43 43 42 43 40 40 41 40 41 42 42 42 43 43 42 40 38 39 40 42 42 40 39 39 39 38 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 40 41 38 38 38 36 35 36 37 38 39 40 42 43 43 43 44 43 43 42 40 40 41 41 41 42 43 41 39 39 39 38 36 35 35 35 37 38 39 39 40 40 41 42 42 41 41 41 41 41 42 42 42 43 42 42 42 41 42 42 42 41 42 41 40 40 39 40 40 41 42 42 42 42 42 42 42 42 41 40 39 39 39 39 39 40 40 39 39 39 40 41 41 42 42 42 41 39 39 40 41 41 40 39 39 40 41 42 42 42 41 39 38 37 37 38 36 35 36 38 39 40 41 42 43 42 42 41 40 40 41 42 42 42 43 44 44 44 44 44 45 45 44 44 44 44 44 45 45 46 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 37 36 36 37 37 37 36 36 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 32 33 32 33 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 34 62 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 59 58 57 55 54 55 57 58 57 55 57 58 59 58 57 57 57 56 55 54 53 53 53 53 53 52 52 51 52 52 52 53 54 55 55 55 55 55 55 54 53 53 54 55 55 55 55 54 54 55 55 54 52 51 52 53 53 52 51 51 51 51 51 50 49 49 48 48 47 47 47 46 46 45 45 44 44 44 44 44 43 43 44 43 42 43 44 44 41 40 42 44 45 46 47 47 48 49 50 50 49 49 48 46 45 44 42 41 41 42 43 43 43 44 45 46 47 48 48 48 49 49 50 50 50 51 51 52 52 53 53 53 53 54 54 55 55 55 54 54 53 52 52 51 50 49 49 49 48 48 48 47 47 47 47 47 47 47 47 46 47 47 46 46 45 45 45 45 44 45 45 45 45 44 44 44 44 44 43 43 43 42 42 43 43 43 42 42 41 40 40 40 39 38 38 38 39 38 39 41 41 43 43 44 45 45 44 43 43 43 44 44 43 42 40 41 42 42 41 41 41 42 44 43 42 42 40 40 42 42 42 42 40 40 40 40 39 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 38 37 37 37 35 35 37 38 38 39 40 42 43 43 43 43 43 42 41 40 40 41 41 41 42 42 40 39 39 38 37 35 35 35 35 37 38 39 39 39 40 41 42 41 41 41 41 41 42 42 43 42 42 42 41 41 41 42 42 41 41 42 41 40 39 39 41 41 42 42 41 41 41 41 42 42 42 42 41 39 39 39 38 39 39 39 39 40 40 40 41 41 42 42 42 41 40 39 39 41 41 40 38 39 41 42 42 42 41 40 40 39 37 36 36 35 36 38 39 41 41 42 43 43 43 43 42 40 40 41 41 42 42 43 43 43 43 43 43 44 44 44 45 44 44 44 44 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 41 41 41 40 40 40 39 39 39 39 38 38 38 38 38 38 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 35 35 35 35 35 35 35 34 34 34 34 34 33 33 33 32 32 33 34 34 34 34 34 34 34 34 35 34 34 35 35 35 35 35 35 35 35 35 34 62 63 63 63 62 62 62 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 59 58 57 56 55 54 56 57 59 57 56 57 59 59 59 58 58 58 57 55 54 53 53 53 53 52 52 52 52 52 52 52 53 55 56 57 57 56 56 56 54 54 54 54 55 56 56 56 55 55 55 55 53 52 53 53 54 53 53 53 53 53 52 51 51 50 50 49 49 49 48 48 47 46 45 45 45 44 45 45 44 44 43 43 44 44 44 45 44 41 40 42 44 47 48 48 48 48 50 50 51 50 49 48 47 46 45 45 42 42 43 44 44 45 46 46 48 49 49 48 48 48 49 50 51 52 52 53 53 53 54 54 55 54 55 55 55 55 54 54 54 54 53 52 51 51 50 50 49 48 48 49 49 49 48 48 49 48 49 49 48 48 48 47 47 46 46 47 46 46 46 46 46 46 45 44 44 44 44 44 45 45 45 44 44 44 44 44 44 42 42 41 40 39 38 39 40 40 40 38 39 41 42 43 43 44 45 45 44 44 44 44 43 42 40 41 42 42 42 43 43 42 42 44 44 43 43 42 42 42 40 41 41 41 41 41 41 39 37 37 37 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 38 36 35 36 38 39 40 40 40 41 42 43 43 43 42 42 42 40 39 40 41 41 42 41 39 39 39 38 36 35 35 35 36 37 37 38 38 39 40 41 40 40 40 40 41 41 42 43 42 42 42 41 41 41 42 43 42 41 41 42 41 40 39 39 41 41 42 41 40 40 41 42 42 42 41 42 41 40 39 38 38 39 39 40 40 40 41 41 42 42 42 42 40 40 40 39 39 40 40 39 38 39 41 41 40 40 41 40 39 38 37 35 35 35 36 39 40 41 42 43 43 42 43 42 41 40 40 41 42 42 43 42 42 42 42 43 44 44 44 44 45 44 44 43 43 44 45 45 45 45 44 44 43 43 44 44 44 43 43 43 43 43 43 42 42 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 36 36 37 37 37 36 36 37 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 62 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 62 61 61 60 60 60 59 58 56 55 55 57 58 59 58 57 57 59 60 59 58 59 59 57 55 54 54 54 54 53 53 53 52 52 53 54 53 54 56 57 58 58 57 57 56 55 56 56 56 56 57 57 56 56 56 55 54 53 53 54 54 54 54 54 54 55 55 53 53 52 51 50 50 49 49 49 48 47 47 47 46 45 45 46 45 44 44 44 44 44 45 45 45 43 40 40 42 44 46 48 49 49 49 50 51 51 51 50 49 48 47 47 46 43 42 44 46 47 47 47 46 47 49 50 49 49 49 49 50 51 52 53 54 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 52 51 51 51 49 49 49 49 49 50 50 50 50 49 50 50 49 49 49 48 48 48 48 48 47 47 46 45 45 45 44 44 44 43 43 43 44 45 45 45 44 44 44 44 44 43 43 41 40 38 38 39 40 41 41 40 39 40 41 42 43 44 46 46 45 45 45 43 43 42 41 42 43 43 43 43 44 44 44 44 42 42 42 42 41 40 39 39 40 41 42 42 41 40 38 39 40 41 38 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 35 35 37 38 39 39 40 41 43 44 43 43 42 41 42 41 39 40 41 41 41 41 40 40 40 38 36 34 34 35 36 36 37 38 39 39 40 40 40 40 40 40 40 41 42 43 42 41 41 41 40 42 43 43 42 41 41 42 41 40 39 39 41 41 41 41 40 40 41 41 41 41 40 40 40 40 38 38 39 40 40 40 41 41 42 42 43 42 42 41 40 40 39 38 39 40 40 38 38 40 41 41 40 39 40 39 37 36 36 36 36 36 38 40 41 42 43 42 42 42 42 42 41 41 41 41 42 42 42 41 42 42 43 43 44 45 45 45 45 45 44 43 43 43 44 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 38 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 37 36 36 36 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 62 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 60 60 60 60 59 59 59 59 57 56 55 56 58 59 60 59 57 58 59 59 59 59 59 59 57 55 55 55 55 54 54 54 53 52 52 54 55 55 54 56 57 58 58 58 58 56 56 57 57 57 56 57 57 57 56 56 55 54 54 55 55 54 55 55 55 55 55 55 55 55 54 53 52 51 50 50 49 49 48 48 48 47 47 47 46 45 45 45 44 45 46 46 47 46 43 40 42 44 46 47 48 49 50 50 50 51 52 51 50 50 49 48 47 46 43 42 43 46 48 48 48 48 48 49 50 50 50 50 50 50 50 51 53 54 55 55 55 55 55 55 54 54 54 54 53 53 53 53 54 54 53 52 52 51 50 50 50 50 50 51 51 51 50 50 49 49 49 49 48 47 48 48 47 47 47 46 45 45 45 45 45 45 44 44 43 43 43 44 44 44 44 43 43 43 42 41 41 40 39 39 39 40 41 42 42 41 40 40 41 42 43 45 46 47 47 46 45 43 44 43 42 43 43 45 45 45 45 44 45 45 43 42 41 40 40 40 39 39 39 39 40 41 41 41 40 39 40 41 39 38 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 36 35 35 37 38 39 39 40 42 44 44 43 43 42 40 41 41 39 39 40 41 41 41 40 40 39 38 36 34 34 35 35 36 37 38 39 40 40 40 39 40 39 39 40 41 42 42 41 41 40 40 41 42 42 42 42 41 41 41 41 40 39 39 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 41 41 41 41 42 43 43 42 42 42 41 40 39 37 38 39 40 39 38 38 40 40 41 40 38 37 37 35 35 36 37 36 38 40 40 40 41 42 42 41 41 42 43 42 42 41 41 42 42 41 41 42 43 43 43 44 45 46 46 46 45 44 43 43 43 43 44 44 45 45 44 43 43 42 42 42 43 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 36 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 34 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 60 59 59 59 59 58 57 57 56 56 56 57 59 60 60 60 58 58 58 59 60 59 59 58 56 55 55 55 55 55 55 54 54 53 53 54 56 56 55 56 57 58 59 58 57 57 57 57 58 57 57 58 57 57 56 55 55 54 55 56 56 56 56 56 55 54 55 54 54 55 54 54 54 53 52 51 50 49 49 49 48 48 48 48 47 47 47 47 46 47 48 48 47 46 43 40 41 44 46 47 47 48 49 50 51 51 51 52 51 50 49 48 47 46 44 42 44 46 47 48 49 50 49 49 49 50 50 50 50 50 50 52 53 54 54 54 55 55 55 54 54 54 54 53 53 53 53 54 54 54 53 53 52 51 51 51 52 51 52 52 52 51 51 50 49 49 48 48 47 46 46 46 46 46 46 46 45 45 45 46 46 46 46 45 45 44 43 42 43 43 43 42 42 42 41 40 40 39 39 40 40 41 42 42 42 40 40 40 41 42 43 44 46 47 47 46 46 45 45 44 44 44 44 45 45 45 44 43 43 44 43 42 41 41 41 41 41 39 38 38 38 40 40 40 41 41 41 41 40 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 36 38 39 40 41 41 42 43 43 42 42 41 40 40 40 39 39 41 41 41 40 40 40 38 36 35 34 35 35 36 36 37 38 39 40 40 39 38 39 39 39 41 42 42 42 41 40 40 40 42 42 42 41 41 41 41 41 42 41 40 39 39 40 40 39 39 39 40 40 39 39 38 38 39 39 40 40 40 40 41 42 42 42 43 42 41 41 41 41 40 39 37 38 40 40 39 38 38 39 39 39 38 36 35 35 36 37 38 38 37 37 38 39 40 41 41 41 41 42 43 42 41 41 41 40 41 41 41 42 42 43 43 44 44 45 45 45 45 44 43 43 43 43 43 44 44 45 45 44 44 43 42 42 42 42 42 42 42 42 43 43 43 42 42 41 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 37 37 37 36 36 36 36 36 37 37 37 36 36 36 37 36 36 36 36 36 36 37 36 36 36 35 35 35 35 35 35 35 35 35 34 34 33 32 32 33 34 34 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 60 60 59 59 58 57 56 56 56 57 58 59 60 61 60 60 59 58 59 60 60 59 57 56 57 57 56 55 55 55 55 54 54 53 54 56 57 57 56 57 58 58 58 58 57 58 58 58 58 58 58 57 57 57 56 56 56 56 56 57 56 56 55 55 54 54 53 53 53 53 53 53 53 52 52 51 50 50 50 49 49 49 48 48 48 48 48 49 49 49 48 47 45 43 41 41 44 44 45 47 47 48 49 50 51 51 51 51 50 49 48 47 47 45 43 44 46 47 48 50 50 50 49 49 49 50 50 50 50 51 52 54 54 53 53 54 54 54 54 54 54 54 53 52 53 53 54 55 55 54 54 53 52 51 52 52 52 52 52 51 51 51 50 49 49 49 49 48 47 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 45 43 42 42 42 41 41 41 40 40 40 40 40 40 41 42 42 43 43 43 41 40 39 40 41 42 43 45 46 46 46 46 46 46 45 45 45 45 45 45 45 44 43 43 42 42 42 41 41 41 41 41 40 39 39 38 38 39 40 40 41 41 40 39 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 38 39 40 41 41 42 43 42 41 41 40 39 40 40 39 39 41 42 41 40 40 40 38 36 34 34 35 37 37 37 37 38 40 40 39 38 38 39 40 40 41 42 42 42 41 40 40 41 42 41 41 41 40 40 41 41 42 41 40 38 38 40 40 39 38 39 39 39 38 38 38 39 40 40 40 40 40 40 41 42 43 43 42 41 41 41 41 41 40 39 37 38 39 40 40 39 38 37 37 36 35 35 36 36 37 39 40 40 38 37 37 38 39 40 40 41 42 42 43 42 41 40 40 41 41 41 42 42 42 43 43 44 44 43 44 44 44 44 43 43 43 43 43 44 44 45 45 44 44 43 42 42 42 42 42 42 42 42 42 43 43 43 43 42 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 61 61 61 60 59 58 57 57 57 56 57 59 60 60 60 61 60 59 59 59 60 60 59 57 56 57 58 57 56 56 55 55 55 55 54 53 55 56 57 57 57 58 58 59 58 58 58 58 58 58 58 58 58 58 57 57 57 57 56 56 56 56 55 55 54 53 52 52 52 52 52 52 51 51 50 51 51 51 51 50 50 49 49 49 49 49 49 50 51 50 49 49 47 46 44 41 41 44 46 46 47 48 49 50 50 51 51 50 50 49 50 49 48 45 44 43 44 46 47 48 48 49 49 50 50 50 50 50 51 51 51 52 53 53 53 53 53 54 54 53 54 53 53 52 52 53 53 54 54 55 56 55 54 53 52 53 53 53 52 52 51 50 50 50 50 50 50 49 49 48 47 47 48 49 49 49 48 48 47 46 45 45 45 45 45 44 43 43 43 42 41 40 40 40 41 41 40 41 42 42 42 43 43 44 43 42 40 40 40 41 42 43 45 45 45 45 46 46 46 46 47 47 46 46 46 45 44 44 44 43 43 43 43 42 42 42 42 40 40 39 39 38 38 38 39 40 40 39 39 38 39 39 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 36 38 38 38 40 41 41 43 42 41 40 39 39 40 39 39 40 41 41 41 40 40 39 38 36 34 35 36 37 38 38 37 38 40 40 38 38 38 39 40 41 41 41 41 41 41 39 39 41 41 40 40 40 40 40 41 41 41 40 40 39 38 38 39 38 38 38 38 38 38 39 40 40 41 41 40 41 41 42 42 43 43 42 41 40 40 41 41 41 40 38 37 38 39 39 40 40 38 36 35 35 36 38 38 39 39 41 42 41 40 39 39 39 38 39 41 41 42 42 43 42 41 40 40 42 42 42 42 42 43 43 44 44 43 43 43 44 44 43 43 43 42 42 43 44 44 45 45 45 44 44 43 42 42 42 42 42 42 42 42 43 43 43 43 42 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 60 60 59 58 58 58 58 58 57 57 59 59 60 60 61 60 59 59 59 60 60 59 58 57 57 58 58 57 56 55 55 55 55 54 54 54 56 58 58 58 58 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 55 55 54 53 52 52 53 53 54 53 52 51 50 50 50 50 50 50 49 49 49 49 48 48 49 49 50 51 50 49 48 47 46 45 43 42 43 46 47 48 49 49 50 52 52 52 51 50 50 49 48 48 46 43 43 43 45 47 47 47 48 50 51 51 51 52 51 51 51 51 51 52 52 52 52 53 54 53 53 54 54 53 52 52 52 53 54 54 55 55 55 55 53 52 53 54 53 53 52 52 51 51 51 51 50 50 49 49 48 48 48 48 49 50 49 49 48 47 47 46 46 45 45 45 44 44 44 43 42 41 40 41 41 42 42 41 42 43 43 43 43 44 44 43 42 41 40 40 41 42 43 44 44 45 44 44 45 46 47 48 48 46 46 45 44 44 45 44 43 44 45 44 43 43 43 42 41 40 39 40 39 38 37 37 37 38 38 38 38 39 40 39 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 38 39 40 41 42 42 42 41 39 39 40 40 38 39 41 42 41 40 39 39 38 37 35 34 35 37 37 38 38 38 39 40 39 38 38 39 40 41 40 40 40 41 41 41 40 39 40 40 40 39 40 41 41 41 41 41 41 40 39 38 38 37 37 38 38 38 39 39 40 41 41 42 42 41 42 42 42 43 43 43 42 41 40 40 41 41 40 40 38 37 38 39 38 38 38 37 35 35 36 38 39 39 39 40 41 41 42 42 42 42 41 39 40 41 42 42 42 42 41 41 40 40 41 42 42 43 43 43 44 43 43 42 42 42 43 43 42 42 42 42 42 43 44 44 45 45 45 44 44 44 43 42 42 42 42 42 42 42 42 43 43 42 41 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 35 36 37 36 36 36 36 35 35 36 36 36 36 36 35 35 35 35 35 35 34 34 34 34 34 33 33 32 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 64 64 64 64 64 63 63 63 62 62 62 62 62 62 61 61 62 62 61 60 59 59 58 58 58 59 59 59 58 58 59 59 60 61 61 60 59 59 59 60 60 59 58 57 58 59 58 57 56 56 56 57 56 54 54 55 56 58 58 58 58 59 59 59 59 59 59 58 58 58 57 57 57 57 56 56 56 56 56 55 54 53 53 53 53 54 55 56 55 54 54 52 51 51 51 50 49 49 48 48 48 48 47 47 47 48 49 49 49 49 48 47 46 45 45 43 42 46 48 48 49 50 50 51 52 52 51 51 50 48 47 47 46 45 43 43 45 47 48 49 49 50 51 51 53 53 52 52 51 50 51 52 52 52 53 53 53 53 53 53 53 52 51 51 52 53 53 53 54 55 55 55 54 54 54 54 54 53 52 52 52 52 51 51 51 51 50 50 49 49 49 49 49 50 50 49 49 49 49 48 47 46 46 46 46 45 45 43 42 41 41 43 44 44 44 43 42 43 44 44 44 44 44 43 43 42 41 41 40 41 42 42 43 44 44 44 44 45 46 47 47 46 46 45 45 45 45 44 44 45 46 45 44 44 43 42 42 41 41 40 39 38 39 38 37 37 37 36 38 39 39 39 39 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 39 39 41 42 42 42 41 39 39 40 40 38 38 40 41 41 40 39 38 37 35 34 34 36 37 38 39 39 39 40 40 39 38 38 39 40 40 40 40 40 41 41 41 40 39 38 39 39 40 40 41 42 41 40 41 41 40 39 38 37 37 38 39 40 40 41 41 41 42 42 42 43 42 43 42 41 42 42 42 41 41 40 40 41 41 40 39 38 37 38 38 37 36 36 35 35 36 37 39 40 39 39 39 40 41 42 43 43 43 42 40 40 41 42 42 42 41 41 41 40 40 40 41 42 42 42 43 43 43 42 42 42 42 42 42 42 42 42 42 43 43 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 38 38 38 37 37 38 37 37 37 37 37 37 36 36 36 36 36 35 35 36 35 35 36 36 36 36 36 36 35 35 35 35 35 34 34 33 34 33 33 32 31 33 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 64 64 64 64 64 63 63 63 63 63 63 62 62 62 61 61 61 61 60 60 59 59 59 60 60 60 60 59 58 58 60 60 60 61 61 60 59 59 60 59 59 59 58 57 58 59 59 59 58 58 57 57 56 55 55 55 56 58 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 56 56 56 55 55 54 53 53 53 53 54 56 56 56 55 55 56 55 53 52 51 51 50 50 49 49 49 49 48 47 46 45 46 46 47 48 48 47 46 45 44 42 43 46 47 47 48 50 51 51 52 51 50 50 49 48 47 48 48 47 45 44 46 48 49 50 50 51 52 52 53 53 52 52 51 50 51 52 51 52 53 53 53 52 52 52 51 51 51 51 51 52 53 54 54 55 56 56 56 55 55 54 54 54 53 53 53 52 52 52 52 52 51 50 50 49 49 49 48 49 49 49 49 49 49 49 48 48 47 46 46 45 44 42 42 42 43 44 45 45 45 44 43 43 44 45 45 45 44 43 42 42 43 42 41 41 41 41 42 43 44 44 44 44 45 46 47 46 47 47 47 46 45 45 45 45 45 45 45 44 43 42 42 42 40 39 39 39 40 40 39 38 37 36 36 37 38 38 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 38 38 40 42 41 41 41 39 38 39 39 37 38 40 40 41 40 39 38 36 34 34 35 36 37 37 38 39 40 40 40 38 37 38 39 40 39 39 40 41 41 41 41 40 39 38 39 40 41 41 41 41 41 40 40 40 40 39 37 37 38 39 40 40 41 41 41 42 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 41 41 39 38 37 36 36 36 35 35 35 35 37 38 39 40 41 41 41 40 41 41 42 42 43 43 42 40 40 41 41 42 42 42 42 42 42 41 40 40 41 42 42 42 42 42 41 41 41 42 42 42 42 42 42 42 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 42 42 42 41 41 41 41 40 39 39 39 39 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 36 35 35 35 35 35 35 36 37 37 36 36 36 35 35 35 35 35 34 34 34 33 32 31 31 33 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 64 64 64 64 64 63 63 63 63 62 62 62 62 62 61 61 60 60 61 61 61 61 61 60 60 59 59 58 59 60 60 61 61 61 60 60 60 60 59 59 59 58 58 59 59 59 59 59 59 57 56 55 54 55 57 57 58 58 58 59 59 59 59 59 58 58 59 58 58 57 57 58 57 56 56 56 55 55 54 54 54 55 55 55 56 57 56 56 57 57 56 55 55 53 52 52 51 50 49 50 49 49 48 47 46 46 46 45 46 46 46 45 43 43 43 44 45 46 47 48 49 51 51 51 50 50 50 49 48 48 49 49 48 46 45 45 47 49 50 51 52 52 52 52 51 50 50 49 50 51 51 51 52 53 52 52 52 51 51 51 52 52 52 52 52 53 54 54 55 55 56 56 56 56 56 55 55 54 54 54 53 53 52 52 52 51 50 49 48 48 47 47 47 47 47 47 47 46 47 47 47 46 45 44 44 43 43 42 43 43 43 44 45 45 45 44 43 44 45 46 46 44 43 43 43 43 43 43 41 41 41 42 42 42 43 44 45 45 46 46 47 47 47 47 47 47 46 46 46 45 44 44 43 42 42 42 41 40 39 39 40 41 41 40 40 39 37 36 36 36 36 37 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 38 39 41 42 41 40 40 39 37 37 37 37 39 40 41 40 39 39 37 35 34 34 36 37 37 38 38 39 40 40 39 38 37 38 39 39 38 39 40 41 41 41 41 40 39 39 39 41 42 42 41 41 41 41 40 39 39 38 37 37 38 38 38 39 39 40 40 41 42 43 43 42 42 42 42 42 40 40 40 40 39 39 40 41 41 39 38 37 36 35 35 35 36 36 38 40 41 42 41 41 42 42 42 41 41 42 42 42 42 41 40 41 41 42 42 42 43 43 43 42 41 40 40 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 44 44 44 44 43 43 43 43 42 42 42 41 41 41 41 40 40 39 39 39 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 36 36 35 35 35 35 35 36 37 37 37 37 37 36 35 35 35 35 35 34 34 33 33 32 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 64 64 64 64 64 64 63 63 62 62 62 62 62 61 61 61 62 62 61 61 61 61 60 60 59 59 59 58 60 60 61 61 61 60 60 60 60 59 59 59 58 59 60 60 60 59 58 58 57 56 55 55 56 57 58 59 58 58 59 59 59 59 59 58 58 58 58 58 57 57 57 57 56 56 56 55 55 55 55 55 55 56 56 56 56 56 56 56 56 56 56 56 55 54 53 52 52 50 50 50 50 49 49 49 49 48 46 45 45 45 44 43 44 45 46 45 45 47 49 51 52 52 51 51 51 50 49 49 49 49 49 48 47 46 44 46 48 50 51 52 52 51 52 51 49 48 49 50 51 51 51 51 52 52 52 51 50 50 51 52 53 53 53 53 53 53 54 54 55 56 56 56 57 57 56 55 55 55 54 53 53 52 52 52 51 50 49 48 48 48 47 47 47 46 47 47 46 45 45 45 44 44 44 44 44 43 43 43 44 44 45 45 46 46 45 44 45 45 46 46 45 44 44 43 43 43 43 42 42 42 42 42 42 43 44 45 46 46 46 46 46 46 46 47 47 47 46 46 46 44 43 42 42 42 41 40 40 39 40 41 41 42 41 40 39 38 37 36 35 35 37 38 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 39 40 41 41 42 40 39 38 37 36 36 38 39 40 40 38 37 38 36 34 34 36 37 37 38 38 39 39 40 40 38 37 38 38 39 38 38 40 41 41 40 40 40 40 39 38 39 40 41 41 41 41 40 40 39 38 37 37 37 38 38 39 39 39 39 39 39 40 41 41 41 42 41 41 42 42 41 40 40 39 39 39 40 41 41 40 39 39 37 36 35 35 36 37 38 40 41 41 41 42 42 43 42 42 43 43 42 42 42 41 41 42 42 42 42 43 43 43 43 42 41 40 40 40 40 40 40 41 41 41 42 42 43 43 43 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 43 43 43 43 42 43 43 43 42 42 42 41 41 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 36 36 35 35 35 35 35 36 36 37 37 37 37 36 35 35 35 35 35 35 34 34 34 34 33 31 31 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 64 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 59 58 59 60 61 61 61 60 60 60 60 59 59 59 59 59 60 60 60 59 59 58 57 56 55 56 56 56 57 58 58 59 59 59 59 59 59 58 57 58 58 57 57 57 56 56 56 56 55 55 55 56 56 55 56 57 57 57 56 55 55 55 54 54 54 53 53 53 52 53 52 51 50 50 50 49 48 48 49 49 47 46 45 44 44 44 46 47 48 47 46 47 49 50 51 52 52 52 52 51 50 50 49 49 49 48 47 46 45 45 47 49 50 51 50 50 51 50 49 48 50 50 50 51 51 51 51 52 51 50 50 50 52 52 53 54 54 54 54 54 54 54 55 55 55 56 57 57 56 56 56 55 54 53 52 52 51 51 50 50 49 49 49 49 49 49 48 48 48 48 47 46 46 45 44 45 45 45 45 44 43 44 44 45 46 46 46 47 46 45 45 46 46 46 46 45 45 44 43 43 43 43 43 43 43 43 42 43 44 45 46 47 47 46 45 45 45 45 45 46 46 46 45 45 44 44 44 43 42 41 40 41 41 42 42 41 40 38 38 37 37 37 37 35 36 37 37 37 37 37 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 39 41 41 40 41 40 39 38 36 35 37 39 39 39 38 37 36 36 34 34 36 37 37 37 38 38 39 40 39 38 37 37 38 38 39 38 38 39 40 40 40 40 40 40 39 38 38 40 40 40 41 40 40 39 38 37 37 37 38 39 40 40 40 40 41 40 40 40 41 41 41 41 41 41 41 42 41 40 40 39 38 39 41 41 40 40 39 38 37 35 35 36 37 38 39 39 40 41 41 42 43 43 43 43 43 43 43 42 42 41 41 42 42 43 43 43 43 43 43 42 42 41 40 40 40 40 40 41 41 41 42 42 42 42 43 43 43 44 44 44 44 44 43 43 42 42 42 42 42 42 43 43 43 42 42 42 42 42 43 43 42 40 40 41 41 40 40 40 40 39 39 38 37 37 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 35 35 35 35 35 34 34 34 33 32 30 32 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 65 65 65 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 59 59 59 60 60 61 61 60 60 60 60 60 59 59 59 60 60 60 60 59 59 58 57 56 56 57 57 57 57 58 58 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 56 55 56 56 57 56 56 56 57 58 57 55 54 53 53 53 53 52 51 51 51 51 51 51 50 50 49 49 49 48 48 48 49 47 45 44 45 46 47 48 48 49 48 47 47 48 48 50 51 52 51 51 51 50 49 49 50 50 49 46 46 47 46 46 47 47 48 48 48 49 49 48 48 49 49 49 49 50 50 50 51 51 50 50 51 52 53 54 54 53 54 54 55 55 55 54 55 55 56 56 56 56 56 56 55 54 53 52 52 51 50 49 49 49 50 51 50 49 49 49 48 48 47 47 47 47 46 46 47 47 46 46 44 44 44 45 46 46 47 47 48 47 46 45 46 46 46 46 46 46 46 45 44 44 44 44 44 44 44 43 43 44 45 45 46 47 47 45 44 44 43 44 45 45 45 45 45 44 45 45 44 43 42 41 41 41 42 42 40 39 38 38 38 38 38 38 37 36 36 36 35 35 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 38 40 40 39 39 38 38 37 36 37 38 40 39 38 37 36 35 34 34 35 37 38 39 38 38 39 39 40 39 38 37 37 37 38 39 38 37 38 39 39 39 40 40 40 39 38 38 39 40 40 40 39 38 37 37 37 37 38 39 40 40 40 41 41 42 42 42 41 41 40 40 41 40 40 40 42 41 40 40 39 38 40 41 41 40 39 38 37 35 35 35 38 39 40 40 40 41 41 40 41 42 42 42 43 44 44 43 43 42 41 41 42 42 42 43 44 43 43 42 42 42 42 41 40 40 40 40 41 41 41 41 41 41 42 42 42 42 43 43 44 44 43 43 43 42 42 42 41 41 41 42 42 42 42 42 42 42 42 43 43 42 41 40 40 40 40 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 34 34 35 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 33 32 31 30 32 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 60 60 59 60 60 60 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 58 56 57 58 58 58 58 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 56 56 56 56 56 56 57 57 57 57 57 57 58 56 55 54 53 52 52 52 51 50 49 49 48 49 49 48 48 48 48 48 47 46 46 47 47 45 45 46 48 48 48 49 49 49 48 48 48 49 49 50 51 51 50 50 50 50 50 50 49 47 46 48 49 48 46 46 46 46 46 47 48 48 47 47 48 48 48 48 50 49 49 50 50 50 51 51 52 53 53 53 53 54 54 55 56 55 55 55 56 56 56 56 56 56 55 55 54 53 52 52 51 51 51 50 50 51 52 51 49 49 49 48 48 47 48 48 47 47 48 48 47 46 45 45 45 45 45 46 46 47 48 49 48 47 46 46 47 47 47 47 47 47 47 46 45 45 45 45 45 45 44 43 43 44 45 46 46 46 45 44 44 43 44 43 43 43 43 43 44 45 45 43 42 42 42 42 41 41 41 40 40 40 39 40 40 39 38 38 37 36 35 35 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 34 34 35 38 40 38 38 38 37 36 37 39 40 39 38 37 36 35 34 34 35 36 37 38 39 39 39 39 39 39 39 38 37 37 38 39 39 38 38 38 38 38 39 40 40 39 38 37 38 38 40 40 39 38 37 37 37 38 38 39 40 40 40 40 41 41 41 42 43 42 41 40 40 40 40 40 40 41 41 40 39 38 39 40 40 41 41 40 39 36 35 35 36 38 38 38 38 39 39 39 39 40 41 42 42 43 44 44 43 43 42 42 41 41 41 42 43 43 43 42 41 41 41 42 41 40 40 40 40 40 40 40 41 41 41 41 41 41 42 42 43 44 44 44 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 42 43 43 42 41 40 40 40 40 40 40 40 40 39 37 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 34 34 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 33 32 31 30 31 33 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 64 64 65 65 65 64 64 64 64 64 64 63 63 63 64 64 63 63 63 63 63 63 62 62 61 61 61 61 60 60 60 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 58 57 57 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 56 56 57 57 57 57 58 57 57 57 56 56 56 55 54 53 52 51 51 50 50 49 48 48 48 47 47 47 48 48 47 47 46 45 45 45 45 47 47 47 47 47 48 49 49 49 49 49 49 50 50 50 50 50 50 50 51 51 50 48 46 47 49 50 49 49 48 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 50 50 51 51 52 52 52 53 53 53 53 54 54 55 55 56 56 56 56 56 56 56 55 55 55 55 54 53 52 52 52 52 51 51 52 52 51 50 49 49 49 48 48 49 49 48 48 49 48 47 45 45 46 46 46 45 45 46 47 48 48 48 48 47 47 46 46 47 47 47 47 47 47 47 47 47 46 46 46 45 44 44 44 45 46 46 46 46 46 45 45 45 44 43 43 42 42 43 44 45 44 43 42 42 41 41 41 41 40 41 41 40 40 40 39 38 37 36 35 36 37 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 34 34 36 39 40 39 38 38 37 36 37 40 39 38 36 35 35 34 34 35 36 37 38 38 39 39 40 39 38 38 38 38 37 38 39 39 39 38 38 38 38 39 40 40 40 39 37 37 38 39 39 39 39 38 37 37 38 39 39 40 40 40 40 40 41 41 41 42 43 42 41 41 40 39 39 39 40 40 40 40 39 38 39 40 40 40 41 40 38 36 34 35 36 36 37 37 38 39 39 39 39 40 41 42 43 43 43 44 43 43 44 43 42 41 41 42 43 43 43 42 41 41 41 41 40 40 40 41 41 41 41 41 42 42 42 42 41 42 42 42 43 43 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 42 43 43 42 41 40 40 40 40 39 39 39 39 38 37 37 38 38 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 33 32 30 30 31 32 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 64 64 65 65 65 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 61 61 61 61 61 60 60 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 55 54 54 54 53 52 51 50 49 49 50 50 50 50 49 49 48 48 48 48 47 48 48 47 45 44 46 48 48 47 47 47 47 48 49 49 49 49 49 50 50 50 50 50 50 50 51 51 50 48 47 48 50 51 51 51 49 47 48 49 49 48 48 49 50 50 50 50 50 50 50 50 50 51 52 52 51 52 52 53 54 54 54 54 54 54 55 56 56 56 55 55 56 56 55 54 54 55 54 54 53 53 53 53 52 52 52 52 52 51 51 50 50 50 50 49 49 49 49 49 48 46 45 46 47 47 46 46 47 47 47 47 48 49 48 48 47 46 46 46 47 47 47 47 46 47 48 48 47 46 46 45 44 44 45 45 46 46 46 47 47 46 46 46 46 45 43 42 42 42 43 44 44 44 42 41 41 40 41 41 41 41 40 40 40 39 38 37 36 36 36 38 38 37 37 38 37 36 35 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 34 34 36 39 40 39 38 37 37 36 37 39 38 37 35 34 34 34 35 35 35 37 38 39 40 40 40 40 38 38 38 37 37 38 39 39 39 38 37 38 38 40 41 41 40 39 37 37 39 40 40 39 38 38 37 37 38 39 40 40 40 39 40 41 41 42 42 43 43 42 41 41 40 40 39 38 38 39 39 39 38 38 39 40 40 39 40 39 37 35 34 35 37 37 38 38 39 40 41 41 40 40 40 41 41 42 42 43 43 44 44 43 42 41 41 42 43 43 43 42 42 41 41 40 40 39 40 41 41 41 41 42 42 43 43 43 43 42 43 43 43 44 44 43 43 43 43 43 42 41 41 41 41 41 40 40 40 41 41 42 43 43 43 42 41 40 40 40 39 38 38 38 37 37 38 38 38 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 33 33 32 31 31 31 31 32 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 63 64 64 65 65 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 54 53 52 52 51 50 50 49 50 50 50 50 50 49 49 49 49 49 49 48 49 49 47 45 45 47 48 49 48 47 48 48 48 49 49 49 49 50 50 50 50 49 49 50 50 50 50 50 48 47 48 50 51 52 51 49 48 49 50 50 50 49 49 50 51 51 51 51 51 50 50 51 51 52 52 52 52 53 54 55 55 55 55 54 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 54 54 54 53 52 52 52 52 52 52 51 51 51 51 49 49 48 48 48 48 47 46 46 47 48 48 47 47 48 48 47 47 47 48 48 48 48 47 46 46 46 46 46 46 46 46 46 47 48 47 46 45 44 44 45 45 46 47 47 47 46 46 46 46 46 45 44 44 43 42 42 43 44 43 42 40 40 40 39 39 39 39 39 38 37 37 37 36 36 37 38 39 38 37 38 38 38 38 38 36 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 34 34 35 39 40 39 38 37 35 35 37 38 37 36 34 34 35 36 37 37 36 38 39 40 40 41 41 40 39 37 37 36 37 38 39 39 39 37 37 38 38 40 41 41 40 39 37 37 39 40 40 39 37 36 37 38 39 40 40 39 38 39 41 42 42 42 42 43 43 43 42 41 41 41 40 40 38 38 39 38 37 39 40 40 40 39 38 37 35 35 35 36 37 38 38 38 38 39 40 41 41 41 41 41 40 41 42 43 43 43 43 43 42 41 42 42 42 43 43 43 42 41 41 40 39 39 40 41 41 40 41 41 42 42 42 42 43 43 44 44 44 43 43 44 44 43 43 43 42 41 41 41 41 41 40 40 40 41 41 42 42 42 43 42 41 40 40 40 39 39 39 39 38 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 35 35 35 35 35 35 35 36 35 35 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 31 31 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 63 63 63 64 64 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 62 62 62 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 58 58 58 57 57 56 56 56 55 55 54 53 52 51 51 51 50 50 50 51 51 51 51 50 49 49 50 50 49 49 49 49 48 45 45 46 48 49 49 48 47 47 48 48 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 48 48 48 49 50 51 51 50 49 50 51 51 50 49 50 50 50 51 51 52 52 51 51 51 52 52 53 53 53 54 54 55 55 55 55 55 55 55 55 55 54 54 55 55 55 55 55 54 54 54 55 55 55 54 53 52 52 51 51 51 50 50 50 50 49 48 48 48 48 48 47 47 46 47 47 49 50 49 49 49 49 48 47 47 47 48 48 48 48 47 46 46 46 46 46 46 46 46 46 47 47 47 47 46 45 45 45 46 47 47 47 46 46 45 46 46 45 45 46 45 42 41 42 42 41 41 40 40 39 38 38 38 38 37 37 37 36 36 36 38 39 39 39 38 38 38 39 39 39 38 37 35 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 36 39 39 39 38 36 34 35 37 37 36 34 33 35 36 38 39 39 39 39 40 40 41 41 40 40 39 37 36 37 37 38 39 39 39 37 37 38 39 40 40 40 39 38 37 37 39 40 39 38 36 36 37 39 40 39 39 38 39 40 41 42 41 42 42 42 43 43 43 42 42 41 41 40 39 38 38 37 37 39 39 39 39 38 37 36 35 36 37 37 37 37 38 38 38 39 40 40 40 41 41 42 42 41 42 43 43 43 43 43 42 42 42 43 43 42 42 42 42 42 41 40 39 38 39 40 40 40 40 40 41 41 41 41 42 43 43 43 42 42 43 44 44 44 43 43 43 42 41 41 40 40 40 40 41 41 41 41 41 42 42 42 41 40 40 40 40 40 40 40 39 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 33 33 33 34 32 31 32 32 31 31 32 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 64 63 63 63 63 63 64 64 63 63 63 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 57 58 58 58 57 57 56 56 55 55 54 53 52 52 52 52 52 51 51 51 51 52 52 51 51 50 50 51 51 50 49 49 48 47 45 46 47 48 50 49 48 48 48 48 49 49 49 49 49 50 50 49 49 49 49 49 49 49 48 48 48 49 49 50 51 51 51 50 50 51 52 52 51 51 51 51 50 50 51 52 53 52 52 52 52 53 53 53 54 54 55 55 55 56 56 56 55 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 54 53 52 52 52 51 50 49 48 48 48 49 49 49 50 50 48 47 47 47 48 50 51 51 50 49 49 48 48 48 47 47 47 48 48 48 47 47 46 46 45 45 46 45 46 46 47 47 47 47 46 46 45 46 47 47 47 47 46 45 45 46 46 46 46 45 43 43 43 40 40 39 39 39 38 39 39 39 39 39 39 39 39 38 38 39 40 40 40 39 38 38 39 39 39 38 38 37 35 35 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 38 38 39 38 36 34 35 36 35 34 33 34 35 37 39 40 40 40 41 41 41 41 41 40 40 38 36 36 37 38 38 39 38 38 36 36 38 40 40 41 40 38 38 37 36 38 38 37 36 36 37 38 38 39 39 39 39 40 41 41 41 41 41 42 42 42 42 42 42 42 41 41 40 40 39 37 37 37 38 38 38 38 37 36 35 36 37 38 39 39 39 39 40 40 40 41 41 41 42 42 42 43 42 41 42 43 44 44 43 42 42 42 43 43 42 42 41 41 42 41 41 40 39 38 38 39 39 39 39 40 40 40 41 41 41 41 42 41 41 42 43 43 43 43 43 43 42 41 41 40 40 40 40 40 41 41 41 41 42 42 42 41 40 40 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 33 31 30 31 31 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 58 58 57 57 56 55 55 54 53 53 52 53 53 53 52 52 52 52 52 53 53 52 51 51 50 51 51 49 49 49 47 46 46 46 48 49 50 50 49 49 49 49 49 50 50 49 49 50 50 49 49 49 49 49 49 49 48 48 49 49 50 50 51 52 51 51 50 51 52 53 52 52 52 52 52 51 51 52 53 53 53 54 53 54 54 54 54 54 55 55 55 55 55 56 56 55 54 54 54 53 53 54 54 54 54 54 54 54 54 55 55 55 54 53 53 52 53 52 51 50 49 50 50 50 49 49 50 49 48 47 48 48 48 49 51 51 50 49 49 49 48 48 47 46 47 47 47 47 48 48 47 46 46 45 45 45 45 45 46 46 45 45 46 46 47 47 48 48 47 47 46 46 45 45 46 47 47 45 44 44 44 41 40 39 39 38 38 41 42 41 41 41 41 41 40 38 38 40 40 41 41 40 39 38 39 38 38 38 39 39 38 37 36 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 36 37 37 37 36 34 34 35 35 33 33 36 37 38 39 39 39 40 41 41 41 40 39 39 39 37 36 36 37 38 39 39 38 36 36 37 38 39 40 40 40 39 38 37 36 37 37 35 35 36 37 37 38 38 39 41 40 41 42 41 41 41 41 41 41 41 42 43 43 43 42 41 41 40 40 39 38 36 36 37 37 37 36 35 35 36 38 39 40 41 41 40 41 41 41 42 42 42 43 43 43 43 43 42 42 42 43 44 43 43 43 43 43 43 43 42 41 40 41 41 41 41 40 39 38 39 40 40 39 39 39 40 40 40 40 41 41 41 41 42 43 43 43 43 43 43 42 41 41 41 40 40 40 40 40 41 41 42 42 43 42 41 41 41 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 33 31 31 32 32 31 30 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 58 57 57 57 56 55 55 53 53 53 53 53 54 54 54 53 52 52 53 54 54 52 52 51 51 51 51 50 49 49 47 46 46 46 48 49 51 51 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 49 49 49 50 50 51 52 52 51 51 52 52 53 53 53 53 53 53 53 52 53 53 54 54 54 54 54 54 53 53 54 54 54 54 54 55 55 55 54 54 54 53 53 53 53 54 54 54 54 54 55 55 55 55 54 54 54 54 53 52 52 51 50 51 51 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 49 49 49 49 47 46 46 46 46 47 47 47 47 47 48 47 46 45 45 45 45 45 45 45 45 46 47 47 48 47 47 47 47 46 45 44 45 46 47 46 45 45 43 42 41 41 41 39 39 42 43 42 42 42 42 41 40 39 39 40 41 41 41 40 39 39 39 38 37 37 38 39 38 39 40 38 36 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 35 35 34 33 34 34 33 34 35 37 37 37 37 38 39 41 40 39 39 39 38 38 36 36 37 38 39 39 38 37 35 36 37 37 38 39 39 39 39 38 36 35 36 35 35 36 37 37 38 39 40 40 41 42 42 42 40 40 40 40 41 42 42 42 43 43 43 43 42 41 41 41 41 40 38 36 35 36 36 35 35 35 36 38 40 40 41 42 41 42 42 42 42 42 43 43 44 44 44 44 43 43 42 43 44 43 43 43 43 43 43 43 42 41 40 40 40 41 41 40 39 38 39 40 40 40 40 39 39 40 40 40 41 41 41 42 43 43 43 43 44 43 43 42 41 41 41 41 41 40 40 40 41 41 42 42 43 42 42 42 41 40 40 40 40 40 39 38 37 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 36 35 36 36 36 36 36 36 36 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 32 32 34 34 33 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 56 56 56 55 54 53 53 53 53 53 54 55 55 53 53 53 53 54 54 53 52 52 51 51 51 50 49 49 48 46 46 46 48 49 50 51 50 50 50 50 51 51 51 51 51 50 50 51 51 50 50 50 49 49 48 48 48 49 49 49 50 51 51 52 52 52 52 52 53 54 54 54 54 55 54 53 53 53 53 54 54 54 54 54 53 53 54 54 54 54 54 55 55 54 54 54 54 53 53 53 53 53 54 54 54 55 56 55 55 56 55 55 55 54 54 53 52 51 51 51 51 51 51 50 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 48 47 46 46 46 46 46 46 47 48 48 48 47 47 46 45 45 45 45 45 45 45 46 47 47 47 47 47 47 46 45 44 44 45 46 45 45 45 44 44 42 42 41 39 39 42 44 44 43 43 42 42 41 41 41 41 42 42 42 42 41 40 40 39 38 37 36 37 37 38 39 39 39 38 36 35 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 35 36 36 37 37 38 39 40 40 39 38 38 38 37 35 35 37 38 39 38 37 36 35 36 37 37 38 38 38 38 38 38 36 35 35 35 35 36 38 39 39 39 39 41 42 42 41 40 39 40 41 41 41 42 43 43 42 42 42 43 43 41 40 41 41 41 40 38 36 35 35 35 36 36 38 38 39 39 40 41 41 41 41 41 41 41 42 43 43 43 44 44 44 43 43 43 44 44 44 44 43 43 43 43 42 41 41 40 39 40 40 40 39 38 39 40 40 41 41 41 41 41 41 42 43 42 43 43 43 44 44 44 44 43 43 43 42 41 41 41 41 41 40 40 40 41 42 42 43 43 42 42 41 40 40 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 34 33 34 34 34 34 33 33 32 33 34 34 34 33 31 31 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 59 59 58 58 57 57 56 56 55 55 54 54 55 54 54 54 55 55 54 53 53 54 55 55 53 52 52 52 51 51 50 49 49 48 46 47 48 48 48 49 51 51 51 51 51 51 52 52 51 51 51 51 51 51 50 50 50 49 49 48 48 48 49 50 49 49 50 50 51 52 52 52 53 53 54 54 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 54 54 55 54 53 53 53 53 53 52 53 54 54 55 55 55 56 56 56 56 56 56 55 55 54 53 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 51 51 50 49 49 49 49 49 48 47 46 45 45 46 46 47 48 48 48 48 47 45 45 45 45 45 45 45 45 46 47 47 47 48 48 47 46 45 44 44 45 45 45 46 45 45 44 42 41 39 40 41 43 44 44 44 43 43 43 43 43 44 43 42 41 41 41 40 39 39 39 38 36 35 36 36 36 37 38 39 39 37 35 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 36 36 37 37 38 38 39 39 39 38 37 37 38 37 36 35 37 38 37 37 37 36 35 36 37 38 38 39 39 39 39 39 37 36 35 35 35 36 38 39 40 40 40 41 42 42 40 39 39 41 42 42 41 41 42 43 41 40 41 42 42 42 40 40 39 40 40 39 37 35 34 35 36 37 38 38 37 38 39 39 39 39 40 40 40 41 41 42 42 42 43 43 44 44 44 43 43 43 43 43 42 42 42 42 42 41 41 41 40 39 38 39 38 38 39 40 41 41 41 41 42 42 42 42 43 42 42 43 44 44 43 44 44 44 43 43 43 42 41 41 41 41 40 40 40 41 42 42 42 42 42 42 41 41 41 41 40 40 40 40 40 40 38 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 33 33 34 33 33 33 33 33 34 34 34 34 33 31 31 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 65 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 56 56 56 55 55 56 55 55 54 55 56 55 54 54 54 55 55 54 53 52 52 52 52 51 51 50 48 46 47 49 49 48 49 51 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 49 49 49 48 48 49 49 50 50 50 50 50 51 52 52 53 54 54 54 55 54 54 55 55 55 55 54 54 54 53 53 54 53 52 52 53 53 53 53 54 54 54 53 52 52 53 53 52 53 54 54 54 55 55 56 56 57 57 56 56 56 55 55 54 53 52 53 53 53 53 53 53 52 52 52 52 52 51 50 49 49 50 51 50 50 49 49 48 49 49 49 48 48 46 45 45 45 46 47 48 48 48 47 46 45 45 45 45 45 45 45 46 46 46 47 48 47 47 47 46 45 44 44 44 44 45 45 45 44 42 40 40 41 42 42 43 44 44 43 43 42 42 42 44 44 43 41 39 39 40 39 38 38 37 36 36 36 36 35 35 36 38 38 38 36 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 36 37 37 37 37 37 38 39 38 38 37 36 38 38 36 35 36 37 37 37 37 36 35 36 38 39 39 39 40 40 39 38 37 36 35 35 36 37 38 40 41 42 42 41 41 41 39 39 40 41 41 41 42 42 42 42 41 39 40 41 40 40 40 40 39 39 40 39 37 35 34 34 35 36 36 36 36 37 37 37 38 38 38 39 39 40 41 41 41 41 42 42 43 43 44 43 43 42 41 42 41 40 40 41 42 41 41 41 40 39 38 38 38 39 39 40 41 41 40 40 41 42 42 41 41 41 42 42 42 43 42 43 44 44 43 43 43 42 42 41 41 41 40 40 40 41 42 41 41 42 42 42 41 41 41 40 40 40 40 40 40 40 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 33 33 33 33 34 34 34 34 34 34 34 33 31 30 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 65 65 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 56 56 56 56 57 56 55 55 55 56 56 55 55 55 55 55 54 53 53 53 52 52 51 51 50 48 47 47 50 50 49 48 50 51 52 53 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 48 48 49 50 50 50 50 50 51 51 52 53 54 54 54 54 54 54 54 55 55 55 54 53 54 53 53 53 52 52 52 53 53 53 54 54 54 54 53 53 52 52 52 52 53 53 54 54 54 54 55 55 56 57 57 57 57 56 55 54 54 54 54 54 53 54 54 53 52 52 52 52 52 52 51 50 49 49 50 50 50 50 49 48 48 48 49 49 48 47 47 46 45 45 46 47 47 48 48 47 46 45 45 45 45 45 45 45 45 45 47 47 47 46 46 46 46 45 44 43 42 42 43 43 42 41 40 41 42 43 43 44 44 43 43 42 41 41 41 41 43 43 42 40 39 39 39 38 37 36 36 37 38 38 37 35 35 38 38 37 36 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 33 35 36 37 37 37 36 37 37 38 37 37 36 37 38 36 35 36 37 38 37 37 36 35 36 37 39 40 40 40 41 40 38 36 35 35 36 37 38 39 41 42 42 42 40 39 39 39 40 40 41 41 41 42 42 41 41 41 39 39 40 40 38 39 40 38 38 38 37 35 34 34 35 35 36 36 37 38 38 38 38 38 38 39 39 39 39 40 40 40 42 42 42 42 43 43 43 42 41 40 41 41 40 40 42 42 41 40 40 39 40 39 38 38 39 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 43 44 44 43 42 42 42 42 41 41 41 40 40 40 40 40 40 41 41 42 42 42 41 41 40 40 41 40 40 40 40 39 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 31 32 31 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 65 65 65 64 64 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 56 55 55 56 56 56 56 56 55 55 55 54 53 53 53 52 52 52 51 50 48 48 49 51 51 50 49 50 50 51 52 52 52 53 53 53 52 52 52 52 51 51 51 51 51 50 50 49 49 48 49 50 50 50 50 51 51 51 52 53 54 54 53 53 53 54 54 54 54 54 53 53 53 53 52 52 52 52 53 54 54 54 54 55 54 53 53 53 53 52 52 52 52 53 53 53 53 54 54 55 55 56 56 57 57 56 55 55 55 54 54 53 53 53 53 53 52 52 51 51 51 51 51 50 49 48 48 49 49 50 49 49 48 48 48 49 48 48 48 47 46 45 45 46 46 47 49 48 47 46 45 45 45 45 45 45 45 45 46 48 48 47 46 46 45 45 46 45 44 43 42 42 41 40 40 41 42 43 44 45 44 43 42 41 41 42 42 40 40 41 41 41 40 39 38 37 36 36 37 39 40 39 38 36 35 36 36 36 35 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 34 35 37 37 36 36 36 36 37 37 37 36 36 37 35 35 36 37 37 38 37 36 35 37 38 39 40 40 40 40 40 38 36 35 35 36 37 39 40 41 41 40 39 38 39 39 39 40 40 40 41 41 42 42 41 41 41 40 38 38 40 39 38 38 38 36 36 35 34 34 34 36 37 38 38 38 39 40 40 40 40 40 41 41 41 41 40 40 41 42 42 43 43 42 42 43 42 41 40 40 40 40 41 42 42 40 40 39 39 39 39 38 38 40 40 40 40 40 40 40 41 40 41 42 41 42 42 43 43 43 43 43 44 44 43 43 42 42 42 41 41 41 40 40 39 39 40 40 41 41 42 42 42 41 41 40 40 40 40 40 40 40 39 37 37 38 39 38 38 37 37 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 31 30 32 34 34 33 33 34 34 34 34 34 34 34 34 33 33 33 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 56 57 57 56 56 56 55 54 53 53 52 52 51 51 52 51 49 48 48 48 50 52 52 51 51 51 51 51 51 51 52 53 53 53 53 52 53 52 52 52 52 52 51 51 51 50 49 49 49 49 50 50 51 51 51 52 52 53 54 54 53 53 53 53 54 54 54 54 53 52 52 52 52 51 52 52 53 54 54 54 54 54 54 53 52 52 52 52 52 52 52 52 53 53 53 54 54 55 55 55 56 57 57 56 56 55 55 55 54 54 53 52 52 52 52 52 52 51 51 51 51 50 50 49 49 48 48 48 49 49 48 48 48 48 48 47 47 47 46 45 45 45 45 46 47 48 48 47 45 45 45 45 45 44 44 45 46 48 48 48 47 46 45 45 45 44 44 44 43 41 41 41 42 42 44 45 45 44 43 43 42 42 43 43 42 40 39 39 39 39 39 39 39 37 36 37 39 41 41 40 39 37 37 35 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 33 34 36 37 37 36 36 36 35 36 37 36 35 36 35 35 35 36 37 38 37 36 35 37 38 38 39 39 39 39 39 38 36 34 35 37 38 38 40 40 40 39 38 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 39 38 38 39 38 37 36 35 34 34 34 34 34 36 38 40 39 39 40 40 41 41 42 41 41 42 42 42 41 41 42 42 42 43 43 42 41 42 42 41 40 39 39 40 41 42 42 41 40 40 40 40 39 38 38 39 39 39 39 39 39 39 40 40 41 41 41 42 42 42 43 43 43 44 44 44 44 43 43 43 43 42 41 41 40 40 40 40 39 40 41 41 42 42 42 41 41 40 40 40 40 40 40 40 38 37 37 38 38 38 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 32 31 32 34 34 32 32 33 33 34 34 34 34 34 34 34 33 33 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 56 56 56 56 56 55 55 54 54 53 53 52 51 50 49 49 49 49 49 49 49 50 52 52 52 52 52 52 52 52 51 52 53 53 53 53 53 53 52 52 52 52 52 51 51 51 51 50 49 49 49 50 50 51 51 52 52 52 53 54 54 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 53 53 53 54 54 53 52 52 52 52 52 52 53 53 53 53 53 54 54 54 54 54 54 54 55 55 56 56 56 55 54 54 54 54 53 52 52 51 52 52 52 52 51 51 51 51 51 51 50 49 48 47 47 48 48 48 48 47 47 47 46 46 46 45 45 45 45 45 45 47 47 47 46 45 45 45 45 44 44 44 45 46 47 47 47 47 46 45 44 43 43 43 42 41 42 43 43 44 45 46 45 44 43 44 44 43 43 43 42 42 41 41 40 39 39 38 38 36 37 39 40 41 40 39 38 38 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 32 32 32 33 33 35 37 37 36 35 35 35 36 37 36 35 35 35 35 36 36 37 37 37 36 34 35 36 36 37 38 38 40 40 39 37 35 35 36 37 38 39 39 39 37 38 40 41 41 41 42 42 41 41 41 40 40 40 40 41 40 40 39 38 38 37 35 34 34 34 35 36 36 37 38 40 41 40 40 41 41 40 42 43 43 42 43 43 43 43 43 43 43 43 43 42 41 40 41 41 40 39 39 40 40 41 42 42 41 40 40 40 40 39 38 38 38 38 38 39 39 39 40 40 40 40 40 41 42 41 41 42 42 43 44 43 43 43 44 44 44 43 43 42 42 42 41 41 40 39 39 40 41 42 43 42 41 41 40 39 39 40 40 40 40 39 38 37 37 38 37 37 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 32 30 31 32 31 30 31 32 31 32 34 34 34 34 34 33 33 34 67 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 61 60 61 61 60 60 60 61 60 60 59 59 59 59 59 58 58 58 57 57 56 55 55 56 55 55 55 54 53 53 53 52 51 51 49 49 49 50 50 50 50 51 51 52 53 52 52 52 53 53 53 52 52 53 53 53 54 54 53 53 53 52 52 52 51 51 51 51 50 49 49 49 50 50 51 51 51 52 52 53 53 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 52 52 52 53 54 54 54 53 53 52 52 52 52 52 53 53 54 54 54 54 54 54 55 54 54 55 54 55 56 56 55 55 54 54 54 54 53 52 52 51 51 52 52 51 51 51 51 51 50 50 50 49 48 48 47 47 47 47 47 46 46 47 46 46 46 46 46 46 45 45 45 45 46 46 47 46 45 45 44 44 44 44 45 45 46 46 47 47 46 45 45 45 45 43 42 43 45 45 44 45 46 46 45 44 44 44 43 43 42 41 41 41 41 41 41 39 39 38 38 37 37 39 40 40 40 39 39 39 38 36 37 36 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 32 32 33 33 34 37 37 36 35 35 35 36 37 37 35 35 35 35 36 37 37 37 36 35 35 36 36 37 38 39 39 40 41 39 37 36 34 35 36 38 39 38 38 37 38 39 40 41 42 41 41 41 41 41 40 40 40 40 40 40 40 39 38 37 35 34 34 35 36 37 39 39 40 40 39 39 39 39 39 39 39 41 42 42 42 42 42 43 43 43 44 44 43 42 42 41 40 40 40 39 39 39 41 41 41 42 41 41 40 40 39 39 38 38 39 39 39 39 39 40 41 41 41 42 42 42 42 43 42 42 42 42 43 43 43 42 42 43 44 43 43 42 42 42 42 41 41 40 39 39 40 41 42 42 41 41 41 40 39 39 40 40 40 40 40 40 39 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 32 31 31 31 31 31 31 30 30 33 34 34 34 34 33 33 34 68 67 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 61 61 61 61 61 61 61 61 61 60 59 59 59 59 58 58 58 57 57 57 56 55 55 54 54 54 54 54 54 52 51 51 51 51 50 50 51 52 52 51 50 52 52 52 53 53 52 52 53 53 53 53 53 53 53 53 54 54 54 53 53 53 53 52 51 51 51 50 50 49 49 49 50 50 51 51 51 51 52 53 53 54 54 54 54 53 52 52 52 52 52 52 52 52 51 51 52 52 53 53 54 54 54 53 53 52 52 52 52 53 53 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 52 51 51 51 52 51 51 51 51 50 49 49 49 48 48 48 47 47 47 46 46 46 46 46 46 46 46 47 47 47 47 46 46 45 45 45 45 46 46 45 44 44 44 45 45 45 45 45 47 47 46 46 46 46 46 44 43 44 45 45 45 46 46 46 46 45 44 44 43 44 43 42 41 40 40 40 40 39 40 40 40 38 37 39 41 41 41 41 40 40 39 37 37 35 34 34 34 33 33 33 33 34 34 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 34 36 37 35 33 33 34 34 35 36 35 35 35 34 35 35 36 37 35 35 36 36 37 38 39 39 39 39 39 38 37 36 35 34 36 38 38 37 37 37 38 39 40 41 41 40 41 41 41 40 40 40 40 41 41 40 40 39 38 36 34 34 34 36 37 38 39 39 39 38 38 38 38 38 39 39 40 40 41 41 41 42 42 43 43 43 43 42 41 40 41 41 40 40 39 39 39 40 41 41 40 41 41 40 40 39 38 38 38 38 39 39 39 40 40 40 41 42 42 43 43 43 42 42 42 43 43 42 42 42 42 42 43 43 44 44 43 43 42 42 42 41 40 39 39 39 40 41 42 42 41 40 41 40 40 40 40 40 40 40 40 40 39 38 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 31 31 31 31 33 34 34 34 34 34 34 33 67 67 66 66 66 66 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 61 61 61 60 60 60 61 61 61 59 59 59 59 58 58 58 57 56 56 55 55 55 54 53 53 53 53 53 52 51 51 52 52 52 52 52 52 52 52 51 51 52 52 52 53 53 53 53 54 54 54 54 54 53 53 54 54 55 54 54 54 53 52 51 51 51 51 50 50 49 50 50 50 51 51 51 51 52 53 54 54 54 54 54 53 53 53 53 52 52 52 52 52 51 51 52 52 53 54 53 53 53 53 52 51 51 52 53 53 53 53 53 53 54 54 54 54 55 55 55 55 54 54 54 55 54 53 53 53 52 52 53 53 52 52 51 51 51 51 51 50 49 49 48 48 48 48 48 48 47 47 48 48 48 47 47 47 47 47 47 48 48 48 47 47 46 46 45 44 44 45 46 46 45 44 44 45 45 45 45 45 45 46 46 47 47 46 45 45 44 43 44 44 45 46 47 47 47 46 45 44 44 44 43 42 42 41 40 40 40 41 42 40 39 38 37 39 41 42 42 41 41 40 39 38 37 34 34 34 34 33 33 33 33 33 34 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 33 35 36 35 34 33 33 33 33 33 34 34 34 34 34 34 35 34 34 34 35 35 36 37 38 39 40 39 40 40 38 37 37 35 34 35 38 38 37 36 37 38 40 41 41 40 40 41 42 41 40 40 39 40 41 42 41 39 38 38 36 34 33 35 37 38 39 39 37 37 37 38 40 40 40 41 41 41 40 41 41 42 43 44 44 44 43 43 42 41 41 41 40 40 39 38 39 39 39 39 40 41 41 41 40 40 39 38 37 37 38 40 40 40 40 41 41 41 42 43 43 43 43 42 41 41 42 42 41 41 42 43 43 44 44 44 44 43 43 43 42 42 42 41 40 39 40 41 41 42 43 42 41 41 41 40 39 40 40 40 40 40 39 39 38 37 36 37 37 37 37 37 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 33 31 32 31 31 33 34 34 34 34 34 34 33 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 59 59 58 58 58 57 57 56 56 56 56 55 55 55 54 54 54 53 53 52 52 52 52 53 53 53 53 53 53 53 51 51 52 52 52 53 53 53 54 54 55 55 55 54 54 54 54 55 55 55 55 55 53 52 52 51 51 52 51 51 50 50 50 51 51 51 51 52 52 53 54 53 53 53 53 53 53 53 53 52 52 52 52 52 51 51 51 52 53 53 53 53 53 53 52 51 51 52 53 53 53 53 53 53 54 54 54 54 55 55 55 55 54 54 54 54 54 54 54 53 52 52 52 52 52 52 51 51 50 50 50 49 49 48 48 49 48 48 48 48 48 49 49 49 49 48 48 49 48 47 47 48 48 47 47 46 46 46 45 44 44 44 44 45 46 44 44 44 45 45 45 44 44 45 46 47 47 46 45 45 44 43 44 44 45 46 46 48 48 47 47 46 44 43 44 43 42 42 42 42 42 42 41 39 38 38 38 39 40 41 41 41 40 39 39 38 36 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 33 33 33 33 33 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 35 36 37 38 39 39 40 40 40 40 39 37 37 36 34 35 36 38 37 36 37 38 40 41 41 40 40 41 41 40 40 39 38 40 41 41 41 39 38 37 35 33 34 36 37 38 39 38 37 38 39 41 42 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 43 42 41 40 39 38 37 38 39 39 40 41 41 41 41 40 39 39 38 37 38 39 40 40 39 40 40 41 41 42 42 43 42 42 41 41 41 42 41 41 41 43 43 43 44 44 44 44 43 43 42 42 41 41 41 40 40 40 40 41 42 42 43 41 41 41 40 39 40 40 40 40 40 39 39 38 37 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 31 30 32 34 34 34 34 34 34 34 67 67 66 66 66 66 67 66 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 59 58 58 58 57 56 56 56 56 56 56 56 56 55 55 55 54 53 53 53 53 53 54 54 54 54 54 54 53 52 51 52 53 53 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 54 54 53 52 51 52 52 52 51 51 50 50 51 51 51 52 52 53 54 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 52 52 53 52 52 51 51 51 53 53 53 53 52 52 53 54 54 54 55 55 55 55 55 54 53 53 54 54 54 54 54 52 51 52 52 51 51 51 51 49 49 49 49 49 49 50 50 49 49 49 49 49 50 49 49 49 48 48 48 48 48 48 47 47 46 46 46 45 46 45 45 45 45 44 44 45 45 44 44 44 45 45 44 44 45 46 46 46 46 46 45 44 44 44 44 45 46 46 47 47 46 47 46 45 44 44 44 43 43 43 43 43 42 40 39 38 38 40 41 41 40 41 41 40 39 38 36 35 35 35 35 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 35 35 36 37 37 37 38 38 39 39 40 40 39 38 37 35 34 34 35 36 36 36 36 38 39 39 39 39 41 42 41 40 39 38 38 40 40 40 40 40 38 36 34 33 35 36 36 36 36 36 37 39 40 41 41 41 42 42 43 43 43 44 44 44 44 43 43 44 45 45 44 43 42 41 41 39 38 37 38 40 41 41 41 42 42 41 40 39 38 38 37 38 39 39 39 40 40 40 41 41 42 42 42 42 41 41 40 41 41 41 41 41 42 42 42 43 44 44 44 43 43 42 41 41 40 40 40 39 40 40 41 42 42 42 41 40 41 41 39 39 40 41 40 40 40 40 39 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 33 33 33 32 30 32 34 33 33 34 34 34 34 68 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 60 59 58 58 58 57 57 57 57 57 57 57 57 56 56 54 54 54 54 54 54 54 54 55 55 55 54 54 54 53 53 52 53 54 54 54 55 55 55 55 55 55 56 55 55 55 55 55 55 55 55 54 54 54 54 53 52 52 52 52 52 52 50 50 51 51 51 51 52 53 54 53 52 52 52 51 51 51 51 51 51 51 51 51 50 50 51 50 50 51 52 52 52 52 51 51 52 53 53 53 52 52 52 53 53 54 54 55 55 55 55 54 54 53 53 54 53 53 53 54 53 52 51 51 50 50 50 50 50 49 49 50 50 51 51 51 50 50 50 50 50 50 49 49 49 48 47 47 47 48 48 47 46 46 46 46 46 46 46 46 46 45 44 44 44 44 44 43 44 44 44 44 44 44 45 46 46 46 46 45 45 45 45 45 45 46 47 47 47 46 46 46 46 45 44 44 43 42 42 42 42 41 40 39 38 39 41 41 41 41 40 39 39 39 37 36 35 35 37 37 36 34 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 35 34 35 36 35 35 37 37 38 38 39 39 39 38 37 35 34 34 35 36 37 36 36 38 39 39 39 39 41 41 41 40 39 37 38 40 40 40 39 39 37 35 34 33 34 35 35 36 36 37 37 37 38 38 39 39 40 41 42 43 43 44 45 45 44 44 44 44 44 44 44 43 42 41 41 40 38 37 38 39 40 40 41 42 42 42 41 40 39 38 37 37 38 39 40 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 42 43 43 44 44 44 43 43 42 41 41 40 40 39 39 40 40 41 42 43 42 40 40 41 41 39 39 40 41 40 40 40 40 38 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 31 31 30 31 33 33 33 34 34 33 33 67 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 59 59 59 59 59 59 59 59 59 59 59 59 60 59 59 59 58 58 58 58 58 58 58 58 57 56 56 55 54 55 55 55 55 55 55 55 55 55 55 55 54 53 54 53 53 54 54 54 55 55 55 55 55 56 56 56 56 55 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 52 52 52 52 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 51 50 50 51 51 51 52 52 51 51 51 52 53 53 52 52 52 53 53 53 53 54 55 55 55 54 54 53 53 54 53 53 53 53 52 51 51 50 50 50 50 50 50 50 50 50 51 52 52 52 51 51 50 50 50 49 49 48 48 48 48 48 47 47 47 46 47 47 47 46 47 46 46 46 46 46 45 45 44 44 44 43 43 43 43 43 43 44 45 46 45 45 45 45 45 46 46 46 46 46 48 48 47 46 46 46 46 46 46 45 44 43 42 42 41 40 40 39 38 39 41 41 40 40 38 38 37 37 36 37 37 37 38 38 37 36 34 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 33 34 34 35 35 35 36 37 38 39 39 38 37 37 35 34 34 35 37 37 36 35 37 38 38 39 40 40 40 41 40 39 37 38 39 39 40 38 37 36 34 34 34 36 37 37 38 39 39 38 38 38 38 38 39 41 42 42 42 43 43 43 44 44 44 43 43 43 43 44 43 42 41 41 40 38 37 38 38 39 40 41 41 41 41 41 41 41 39 38 37 38 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 42 42 42 42 42 43 43 44 44 44 44 43 43 42 41 41 41 41 40 39 40 41 41 42 43 42 41 41 41 40 40 40 40 41 40 40 39 39 38 37 38 38 38 38 38 38 38 39 38 38 38 38 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 32 32 31 31 31 32 34 34 34 33 33 67 67 67 67 66 66 66 65 65 65 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 58 58 58 58 58 59 59 59 59 59 59 59 59 59 60 60 60 60 60 59 59 59 59 58 59 59 58 57 57 57 57 57 56 56 56 56 55 55 56 56 56 56 55 55 54 54 53 53 54 55 55 55 56 56 56 56 56 56 57 56 56 55 55 54 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 51 51 51 51 51 51 51 51 51 51 51 52 52 53 53 53 54 54 55 55 55 54 54 53 52 53 54 53 52 52 52 52 51 51 50 51 51 51 50 50 51 51 52 52 52 52 52 51 50 50 50 49 49 49 49 49 49 49 48 47 46 46 47 48 48 48 48 47 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 44 45 45 44 44 45 46 46 47 47 47 47 48 48 47 46 46 45 44 45 46 46 45 44 44 44 42 42 41 40 39 39 41 41 40 39 38 37 37 37 37 38 37 37 39 39 38 38 36 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 33 33 33 33 34 35 35 36 37 38 39 39 38 37 36 35 34 34 35 37 37 36 35 36 37 38 38 39 40 40 41 40 39 37 37 37 39 39 37 35 34 34 33 34 37 38 39 39 41 41 41 41 41 41 41 41 42 43 44 44 43 43 42 42 44 44 43 42 42 42 43 43 43 42 41 39 38 37 38 39 40 40 41 41 40 40 41 42 41 40 38 37 38 39 39 39 39 39 40 41 41 41 40 40 41 41 41 42 42 43 43 43 43 43 44 44 44 45 44 43 43 42 41 41 41 41 40 39 39 40 40 42 42 42 41 41 40 40 40 41 40 40 40 39 39 39 38 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 30 31 34 34 34 34 34 68 68 68 68 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 59 59 59 59 58 58 58 58 58 59 59 59 59 59 59 59 59 60 60 60 61 61 60 60 60 60 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 55 55 56 55 53 54 56 56 56 56 57 57 57 57 57 57 56 56 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 51 51 51 51 51 52 52 51 51 52 52 52 52 53 53 54 54 55 55 54 53 54 53 52 53 53 53 53 53 53 52 51 51 51 52 52 51 51 52 52 52 52 52 52 51 51 50 50 50 50 50 49 49 49 49 49 48 48 47 47 48 48 48 49 49 48 47 48 48 48 47 47 47 46 45 44 44 43 43 43 43 43 44 44 44 44 44 45 46 46 47 47 48 48 47 47 48 47 46 45 43 44 45 45 45 45 45 44 44 44 43 41 40 40 41 41 41 41 40 38 38 38 39 40 39 38 38 39 40 40 39 37 35 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 33 34 35 35 36 38 39 39 39 39 37 35 34 34 34 35 37 37 36 35 35 36 36 38 39 39 39 40 39 38 37 37 37 39 38 35 34 33 34 34 35 37 38 40 41 42 42 42 43 42 42 43 43 42 42 43 44 43 42 41 41 43 44 43 42 41 41 42 42 42 42 41 39 38 38 39 41 41 41 40 40 40 40 40 41 40 39 37 38 39 40 40 41 41 41 41 42 43 43 43 42 42 43 42 42 43 43 43 43 43 43 43 43 44 44 44 44 43 43 42 41 42 41 41 39 39 40 40 41 42 42 41 40 39 40 40 40 40 40 40 39 38 38 37 36 37 38 38 38 37 37 38 38 38 38 38 38 37 37 37 37 37 36 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 30 31 33 34 34 34 34 68 68 68 68 68 67 67 67 67 66 66 67 67 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 58 58 59 58 58 59 59 59 59 60 60 60 60 61 61 61 61 61 60 59 59 59 59 59 58 58 58 58 57 57 58 58 58 58 57 57 57 57 56 56 56 56 55 54 55 56 56 57 57 57 57 57 57 57 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 53 52 52 52 52 51 51 51 51 50 50 51 51 50 50 50 51 51 51 51 51 53 53 53 52 52 52 52 52 53 53 53 54 54 54 54 53 54 53 52 52 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 49 49 49 49 48 47 48 48 49 49 48 48 49 48 48 48 48 48 47 47 47 46 46 46 46 45 44 43 43 43 43 44 43 44 45 45 46 46 47 48 48 48 47 47 47 47 46 45 44 43 44 44 45 45 45 44 44 44 44 42 40 41 42 42 41 40 39 39 39 39 39 40 40 39 38 39 40 41 41 40 38 35 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 33 34 35 35 37 39 39 38 38 36 34 33 34 35 36 37 38 37 35 35 35 37 38 39 39 37 38 38 37 37 36 37 38 36 33 33 34 35 37 39 39 39 41 41 41 41 42 43 43 43 43 44 44 43 44 44 44 42 40 40 42 43 42 42 41 40 41 42 41 41 40 38 38 39 41 42 41 40 40 39 39 38 38 39 38 37 37 39 40 41 41 42 43 42 42 42 42 42 42 42 42 43 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 43 42 42 43 43 42 41 39 39 40 41 42 43 42 40 39 39 39 39 39 40 39 38 38 37 36 36 37 38 38 37 37 37 37 38 38 38 38 38 37 37 37 37 37 37 36 36 36 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 32 30 30 31 33 34 34 33 69 68 68 68 68 67 67 67 67 67 67 67 67 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 59 59 59 59 58 58 58 58 58 58 59 59 59 59 60 60 60 60 60 60 61 61 61 61 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 57 57 57 57 57 56 55 55 55 56 56 56 56 56 57 57 57 56 56 56 55 55 56 56 56 56 55 55 54 54 54 54 54 55 55 54 54 53 53 52 52 52 52 52 51 51 51 51 52 52 52 53 53 52 52 52 51 51 50 50 50 50 50 50 50 51 51 51 51 52 53 54 54 54 52 51 51 52 53 53 54 54 54 54 53 53 53 52 52 53 54 54 55 54 54 53 53 53 53 52 53 53 53 52 52 52 52 52 51 51 52 52 52 51 51 50 50 50 49 49 49 48 48 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 44 44 43 43 43 43 44 45 45 46 46 47 48 48 48 48 47 47 47 46 46 45 44 43 43 42 43 44 44 43 43 43 41 40 41 43 43 42 41 40 39 40 40 40 41 40 40 40 41 41 42 42 41 40 38 35 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 33 33 32 32 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 34 36 37 39 39 37 37 35 33 33 34 36 37 38 37 36 34 34 36 38 38 38 38 36 36 36 36 37 36 37 37 35 33 33 35 37 39 40 40 40 41 41 40 40 41 41 42 42 42 43 44 44 44 44 44 43 41 40 41 41 41 42 41 40 41 41 41 41 39 37 38 40 41 41 40 38 38 37 37 37 36 37 37 37 37 38 40 41 41 42 42 42 41 40 40 40 41 41 41 41 42 42 41 42 43 43 43 43 44 44 44 43 43 44 44 44 43 43 43 43 43 42 40 39 40 41 42 42 42 42 39 38 39 39 39 39 39 38 37 37 37 36 36 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 36 35 35 36 36 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 32 32 31 31 32 32 32 31 69 68 68 68 68 67 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 59 59 59 59 58 58 58 58 58 58 59 59 60 60 59 60 60 60 60 60 60 60 61 61 61 60 60 60 60 60 59 59 59 58 58 59 59 59 58 58 58 58 58 57 57 57 56 56 55 55 55 56 56 56 56 57 57 57 57 57 56 56 56 57 57 57 56 56 55 55 55 55 55 55 55 55 55 55 54 53 53 53 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 51 51 52 52 52 53 53 54 54 52 51 51 52 53 54 54 54 53 53 53 52 52 51 52 53 54 54 55 55 55 55 54 54 54 53 53 53 52 52 52 52 52 52 51 50 51 51 52 51 51 50 50 50 49 49 49 48 48 49 49 48 48 48 47 47 47 48 48 47 47 47 47 47 47 47 47 47 46 45 45 45 44 43 43 43 43 44 45 45 46 47 48 48 47 47 46 45 45 46 46 45 45 45 43 42 42 42 42 42 42 41 40 41 42 43 43 43 42 40 39 41 41 41 42 41 41 41 42 42 41 41 40 40 39 36 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 33 36 37 39 39 37 36 35 34 33 35 36 37 38 37 36 35 34 36 38 37 36 36 35 36 36 37 37 37 38 37 35 33 33 35 38 40 41 41 41 40 39 39 39 40 40 41 42 43 44 44 43 43 44 44 43 41 40 39 40 41 42 41 40 40 39 41 41 38 37 38 39 39 38 38 37 36 37 37 37 37 38 38 37 37 37 38 39 39 39 40 39 39 40 40 40 40 40 40 40 41 41 41 42 44 45 44 44 43 43 43 42 43 44 44 44 44 44 43 43 42 42 41 39 39 40 41 41 41 41 40 38 38 39 39 39 38 38 37 37 37 36 36 36 37 37 37 37 37 37 37 37 38 38 37 37 37 37 37 37 36 35 35 35 35 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 34 34 34 34 33 31 30 30 68 68 68 68 68 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 58 58 58 58 58 58 58 59 59 59 60 59 59 60 60 60 60 60 61 61 61 61 61 60 60 60 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 58 58 57 57 56 56 55 55 55 55 55 55 55 54 54 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 52 52 52 53 52 52 52 51 51 50 50 50 50 51 51 51 52 53 53 53 54 53 52 51 52 52 53 53 53 53 53 53 52 51 51 52 53 54 54 55 55 55 55 55 55 54 54 53 53 52 52 52 52 51 52 51 51 50 50 51 51 51 50 50 50 50 49 48 48 48 48 47 47 47 47 46 46 46 47 48 48 48 48 48 47 47 47 48 47 46 46 46 46 45 44 43 43 42 43 44 45 45 46 47 48 47 47 46 46 46 45 45 45 45 45 45 44 43 42 42 42 42 41 41 43 43 43 43 43 41 40 40 42 42 42 43 42 42 41 41 41 40 39 38 38 39 37 34 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 34 36 39 40 38 36 35 34 33 35 37 37 37 37 37 36 34 35 36 35 34 34 35 36 37 38 39 39 39 37 34 33 33 35 38 40 41 41 40 39 38 39 39 41 42 42 43 44 44 43 42 42 43 44 44 42 41 39 39 40 40 40 40 39 39 40 40 37 37 37 37 37 37 37 37 37 38 39 39 39 39 39 39 38 39 38 38 38 38 39 39 39 39 39 40 40 40 40 40 40 40 41 42 44 44 44 43 42 42 42 43 43 44 44 44 44 43 43 43 42 41 41 40 39 40 40 41 41 41 40 39 38 39 39 38 38 37 37 37 37 37 36 35 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 36 37 37 37 37 37 37 36 36 36 37 37 37 37 36 36 36 36 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 30 30 67 68 68 68 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 66 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 57 57 58 58 59 60 59 59 59 59 59 60 60 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 58 58 58 57 57 57 56 56 57 56 56 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 58 57 57 57 56 56 55 55 55 55 55 54 54 53 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 51 50 50 49 50 50 51 51 52 52 53 53 53 53 52 51 52 52 52 52 52 53 53 52 51 52 52 52 53 53 53 54 54 55 55 56 56 55 54 53 52 52 52 52 51 51 51 51 51 51 51 50 50 50 49 49 50 50 49 49 49 48 47 46 46 46 47 47 46 45 46 46 47 47 47 47 47 46 46 47 47 47 47 47 46 46 45 44 43 42 42 43 44 44 45 45 47 48 48 47 47 47 45 45 45 44 45 45 46 45 44 43 43 42 41 41 43 43 43 43 43 41 40 41 42 43 42 41 41 40 40 39 39 38 38 37 36 37 35 35 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 39 38 37 35 33 33 34 36 37 37 38 37 37 35 34 34 34 34 35 36 37 37 39 39 40 39 37 34 33 33 34 37 39 40 39 38 38 39 40 40 41 42 43 43 43 42 42 41 41 43 44 44 43 42 40 39 38 38 39 40 40 39 38 37 36 36 36 37 37 37 38 39 39 39 40 40 40 40 40 40 40 40 40 39 39 40 40 41 41 40 40 40 41 41 42 41 41 40 40 41 42 42 42 41 41 42 42 43 43 43 44 44 44 43 42 43 42 41 40 40 39 40 40 41 40 40 40 39 39 39 38 37 37 37 37 37 37 37 36 36 35 35 35 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 35 34 35 36 37 37 37 37 37 37 36 36 36 37 37 36 36 36 35 36 36 36 36 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 32 32 67 68 68 67 67 67 67 67 66 66 66 67 66 66 65 65 65 65 65 65 65 65 65 65 65 66 66 66 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 60 60 61 60 60 60 59 59 59 58 58 58 57 57 57 57 59 60 59 59 59 59 59 60 60 60 60 60 60 61 61 60 60 60 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 58 58 57 57 57 58 58 58 57 56 56 56 56 56 56 55 55 55 54 54 53 53 53 52 52 53 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 51 51 50 49 49 50 51 51 51 52 52 52 52 52 52 51 51 52 52 51 51 52 52 51 51 52 53 53 53 54 54 54 54 54 54 55 55 55 54 53 52 52 52 52 51 51 50 50 50 51 51 51 50 50 49 49 49 49 49 49 49 49 47 46 46 47 48 47 47 46 45 46 47 48 47 47 48 47 46 46 46 47 47 46 46 46 46 44 43 43 42 42 43 44 44 45 46 47 48 47 46 46 46 46 45 44 44 45 46 46 45 45 44 42 41 41 42 43 43 43 43 41 41 41 42 43 42 41 41 41 40 40 39 39 39 39 37 35 34 35 37 37 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 36 35 34 33 35 36 37 37 37 36 36 35 33 33 34 35 36 37 37 38 39 39 40 39 37 35 33 32 34 37 38 37 37 37 39 40 40 40 40 42 42 43 43 42 41 41 42 43 43 43 43 43 41 39 38 37 39 40 39 38 36 36 35 36 37 38 38 38 40 41 41 41 41 40 41 41 41 41 41 40 40 41 41 41 42 43 42 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 42 42 42 42 42 43 42 43 43 43 42 41 42 42 41 40 39 39 40 41 40 40 40 40 39 39 37 37 37 37 37 37 37 37 37 37 37 36 36 35 36 36 36 36 36 36 36 37 37 37 37 37 37 37 35 34 35 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 67 68 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 66 66 66 66 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 58 58 58 57 57 57 57 58 58 59 59 59 59 59 60 60 60 60 60 60 61 61 61 60 60 59 59 59 59 59 59 59 58 58 58 58 58 57 58 58 57 58 58 58 58 58 58 59 59 59 59 58 58 57 57 57 58 58 57 57 56 55 55 55 55 55 55 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 51 50 49 49 50 50 51 51 51 51 51 52 51 50 51 51 51 51 51 51 51 51 52 53 54 53 53 54 54 53 54 54 54 55 55 55 54 53 52 52 51 51 51 50 50 50 50 49 50 51 50 50 50 49 49 48 48 49 49 49 47 46 47 47 47 47 47 46 45 45 46 48 47 47 47 47 46 45 45 46 46 45 45 46 45 45 44 43 42 42 42 43 43 44 46 47 47 46 46 46 46 46 46 45 44 44 45 45 45 45 44 43 42 42 42 42 43 43 43 42 42 43 43 43 42 42 41 41 41 41 41 40 39 39 38 36 34 35 37 40 40 38 36 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 35 34 33 35 36 37 37 37 35 34 34 34 35 36 36 36 37 38 39 40 40 40 40 38 36 33 32 34 37 37 35 36 39 40 39 40 41 42 42 43 43 42 41 40 41 43 42 41 42 43 44 42 40 38 37 37 38 37 36 35 36 36 37 38 39 40 39 40 41 42 42 42 42 43 44 43 42 42 40 41 42 43 43 43 44 43 42 41 42 42 42 42 43 43 42 42 41 41 42 42 42 43 43 43 43 42 42 41 42 42 42 42 41 41 42 42 40 39 38 39 40 40 39 39 39 39 38 37 37 37 37 37 37 37 37 38 38 38 38 37 36 36 36 36 36 35 35 36 36 36 37 37 37 36 36 35 35 35 36 37 36 36 37 37 36 36 37 37 36 36 36 36 36 36 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 67 67 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 66 66 66 66 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 57 57 57 57 57 58 59 59 59 59 59 59 60 60 59 59 60 60 61 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 58 57 57 56 55 55 55 54 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 51 51 51 52 52 52 51 50 49 49 50 50 51 51 51 51 51 51 50 50 51 51 51 51 51 51 51 52 53 54 54 54 54 54 53 53 54 54 54 55 55 54 53 52 51 51 50 50 50 49 49 49 48 49 49 49 50 50 49 49 49 48 48 48 48 47 47 47 47 47 47 47 46 45 45 45 47 47 46 46 46 45 45 45 45 45 44 44 45 45 45 45 44 43 42 42 42 43 44 45 46 46 45 45 45 45 45 46 45 44 44 44 44 44 45 44 43 43 43 43 43 43 43 42 42 43 43 43 42 42 42 42 42 42 40 39 39 38 38 37 36 35 34 37 40 41 41 40 37 35 35 33 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 35 34 34 35 36 37 36 35 34 33 34 35 36 37 38 38 39 40 40 41 40 41 40 39 37 34 32 34 36 36 35 38 40 40 40 41 42 43 43 42 42 41 41 40 41 42 41 41 42 43 43 42 40 39 37 36 35 35 36 36 37 38 38 38 40 41 40 40 42 43 43 43 43 44 45 45 44 42 42 42 43 44 45 45 45 44 42 42 42 42 43 43 43 43 43 43 42 42 43 43 44 44 43 43 43 42 42 41 41 40 41 42 41 40 40 40 41 39 38 38 40 40 39 38 38 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 37 37 36 36 36 36 35 35 35 36 37 37 37 36 35 36 35 35 36 36 36 36 36 36 36 36 37 36 35 36 36 37 36 36 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 67 67 67 67 67 67 68 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 66 66 65 64 64 63 63 63 63 63 63 63 63 62 62 62 62 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 58 58 59 59 59 59 60 59 59 59 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 58 58 57 57 56 57 57 57 57 56 56 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 53 53 52 51 51 51 51 50 50 50 50 51 51 51 51 51 51 50 49 49 50 50 50 50 50 51 51 50 50 51 51 51 51 50 50 51 52 53 54 54 53 54 54 53 53 53 53 54 54 54 54 53 52 51 51 50 50 50 50 49 49 49 48 48 48 48 48 48 49 49 49 48 47 47 47 48 48 48 47 47 47 46 46 45 45 46 47 46 46 46 45 45 44 44 44 44 44 44 44 44 44 44 43 42 42 42 42 42 44 45 45 45 44 44 45 45 46 45 45 44 43 43 44 45 45 44 43 44 44 43 43 43 42 42 42 42 42 42 41 42 42 43 42 40 38 38 39 39 38 38 35 34 37 40 39 39 41 40 39 40 38 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 33 33 34 35 36 34 33 33 34 35 35 36 37 38 39 40 40 40 41 41 40 40 39 37 35 33 33 34 35 36 38 39 41 42 42 42 43 43 41 40 41 41 40 40 41 41 40 41 43 42 40 39 38 36 36 36 36 37 37 38 38 39 39 41 42 42 42 43 44 43 43 43 43 45 45 44 43 43 44 44 44 44 45 45 44 43 43 43 44 44 44 45 44 44 44 43 42 43 44 44 44 44 43 43 43 43 42 41 41 40 40 40 41 40 40 40 39 38 38 39 40 39 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 37 37 36 37 36 35 35 35 35 35 35 36 36 36 36 36 36 35 35 35 36 36 36 36 36 36 36 36 36 36 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 67 67 67 67 66 67 67 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 58 58 59 59 59 60 59 59 59 60 60 60 60 61 60 60 60 60 60 60 60 60 59 60 60 59 59 59 59 59 59 59 59 59 58 58 59 58 58 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 54 53 52 52 52 52 53 53 53 53 53 53 54 54 53 52 52 51 51 50 50 50 50 50 50 51 51 51 51 51 50 49 49 49 50 50 50 51 51 50 50 50 50 50 50 50 50 51 52 53 53 53 52 52 53 53 53 53 53 54 54 54 54 53 52 52 51 50 50 51 51 50 50 51 50 50 49 49 48 47 47 48 49 48 48 48 48 48 48 48 47 47 47 47 46 46 45 45 46 46 46 46 46 45 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 44 45 44 43 44 45 46 46 46 45 44 43 44 44 45 45 44 44 44 44 44 43 42 41 41 41 41 41 42 42 42 43 42 40 39 40 41 40 39 38 36 35 36 38 38 39 40 41 41 41 40 38 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 32 33 35 35 33 33 34 35 36 37 38 38 37 39 40 39 40 40 39 38 38 38 37 35 33 32 34 36 37 38 38 40 41 42 42 42 43 41 39 39 40 39 39 40 41 40 40 42 42 39 37 36 35 36 38 39 39 38 38 39 40 40 41 41 43 43 43 43 42 42 43 44 45 44 43 43 44 44 43 43 44 44 45 45 44 44 44 44 44 45 45 45 45 46 44 43 43 44 44 43 43 43 43 43 43 43 42 41 40 39 39 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 37 37 37 36 35 35 35 35 34 34 34 35 36 36 36 36 35 34 35 36 36 36 36 36 36 36 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 33 67 68 67 67 66 66 66 66 66 66 66 66 66 67 66 66 66 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 57 57 57 57 57 56 56 57 58 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 61 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 53 54 53 53 53 53 53 54 54 53 53 52 51 51 51 50 50 50 50 50 50 50 51 51 51 50 49 49 49 49 50 50 50 50 49 49 50 49 49 50 51 52 52 52 52 52 52 52 53 54 54 53 53 54 54 55 55 54 52 52 52 51 51 52 52 51 51 51 51 51 50 50 49 48 47 47 47 47 47 47 47 48 48 48 47 47 47 47 46 46 46 45 45 45 45 45 45 45 44 43 43 43 43 43 43 42 42 43 43 43 43 43 42 42 42 42 43 44 44 43 44 44 45 46 46 46 45 44 43 44 45 45 44 43 43 43 43 43 43 42 42 42 41 40 40 41 42 42 42 41 40 41 41 41 40 38 37 36 36 38 40 40 40 42 42 41 41 40 38 38 37 35 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 33 33 34 35 36 38 38 37 37 38 40 41 41 40 37 36 37 36 35 33 32 32 35 37 38 39 40 41 41 40 40 42 42 41 39 38 38 38 39 40 41 39 39 40 39 37 35 35 36 37 38 39 40 40 39 40 41 42 42 42 43 43 42 42 42 41 43 44 44 43 43 43 43 42 43 44 44 44 44 45 45 44 44 44 44 44 45 46 46 46 45 44 44 44 44 43 43 43 43 43 43 42 42 42 41 40 39 39 39 39 39 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 37 36 34 35 35 36 35 35 34 34 34 35 35 35 35 35 35 36 36 36 37 37 36 36 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 32 32 33 33 32 68 68 67 67 66 66 66 66 66 66 66 66 67 67 67 66 66 66 66 66 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 58 57 57 56 56 56 57 58 58 59 59 58 58 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 58 58 57 58 58 58 57 57 56 56 56 56 56 56 55 55 55 54 55 55 55 54 54 54 54 54 53 53 53 54 54 54 53 53 52 52 52 52 52 53 53 52 52 52 51 51 51 51 50 50 50 49 50 50 50 51 50 49 49 49 49 49 50 50 50 49 49 49 49 50 51 51 52 52 52 52 52 52 51 52 53 54 54 54 54 54 55 55 54 53 54 53 52 52 51 51 51 51 50 50 50 49 50 50 49 49 48 47 46 46 46 46 47 47 47 47 47 47 47 47 46 46 46 45 45 45 44 44 44 43 43 43 43 44 44 43 43 43 44 44 44 44 44 43 42 42 42 42 43 43 43 44 45 45 46 46 46 46 45 44 43 44 44 44 43 43 42 42 42 43 42 42 43 42 41 39 40 41 42 43 42 42 42 42 40 39 39 39 37 36 38 39 39 39 40 42 42 41 40 39 38 39 37 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 35 35 36 36 36 37 38 39 40 42 40 38 36 35 33 32 32 33 34 36 38 40 41 41 42 42 40 41 42 42 41 39 38 37 39 41 40 40 39 37 38 37 35 35 36 37 39 40 40 41 41 41 40 41 43 44 43 43 43 42 41 41 42 43 43 42 42 43 43 42 42 43 44 44 44 45 45 45 44 44 45 45 45 46 46 46 45 44 44 43 44 44 43 42 42 42 43 43 42 42 42 42 41 40 40 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 39 39 38 38 38 37 35 35 36 37 36 36 35 34 34 34 34 34 35 34 35 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 32 31 31 31 31 30 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 61 61 61 61 61 61 61 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 56 56 56 56 57 58 59 59 58 58 58 59 59 59 59 59 60 60 60 60 60 60 60 59 59 59 60 60 59 59 59 59 58 58 58 58 57 57 57 57 57 57 56 55 55 56 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 53 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 49 49 49 49 49 50 50 49 49 49 49 49 50 50 50 49 49 49 50 51 51 51 51 51 51 51 51 52 52 52 53 53 53 54 54 55 55 55 54 54 54 53 52 51 51 51 50 50 50 50 49 49 48 49 49 49 48 47 47 47 46 45 45 46 47 46 46 47 47 47 46 46 46 46 45 44 44 44 43 44 45 45 45 45 45 45 45 45 45 45 44 43 43 42 42 42 42 42 43 43 43 44 44 45 45 45 45 45 45 44 43 44 44 44 44 43 42 42 41 41 41 41 41 41 40 40 41 42 43 43 43 42 42 40 38 38 38 37 36 36 37 39 39 40 41 41 40 40 39 38 37 36 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 36 37 37 37 38 38 39 40 40 40 37 33 32 32 33 34 36 38 39 40 40 41 42 40 40 41 41 41 39 38 37 37 40 40 39 39 38 37 37 36 35 36 37 38 39 40 41 42 42 42 41 42 43 43 43 42 43 42 41 40 41 42 41 41 41 42 41 41 42 42 42 43 44 45 45 44 43 44 45 45 46 46 45 45 45 44 44 43 43 44 43 42 41 42 42 43 41 41 42 42 41 40 40 40 39 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 40 40 39 39 38 38 37 36 37 37 37 36 36 35 35 34 34 34 34 34 35 36 37 36 36 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 33 33 33 32 32 30 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 60 60 61 62 61 61 60 60 61 61 61 60 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 56 57 58 58 58 57 58 58 58 59 59 59 60 59 59 60 60 60 60 59 59 59 59 59 60 60 59 59 59 58 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 53 53 52 52 52 52 53 53 53 53 53 53 52 52 52 52 52 52 52 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 50 49 49 49 49 50 50 50 50 50 50 50 50 51 52 53 53 53 53 53 53 53 54 55 55 55 54 53 53 52 52 51 50 50 51 51 50 50 49 49 48 48 48 49 49 48 47 46 46 45 45 46 45 45 46 47 47 47 46 46 46 45 45 44 44 44 44 46 46 46 46 45 45 45 45 45 45 44 43 43 43 42 42 41 42 42 42 43 43 44 45 45 46 45 45 44 44 43 43 44 44 44 44 43 42 41 40 40 40 40 40 39 39 40 41 43 43 43 42 40 40 40 38 38 37 36 36 38 40 41 42 42 42 42 42 41 39 38 36 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 37 37 37 37 38 38 39 40 40 38 38 39 37 34 32 33 34 36 37 39 40 39 39 41 40 39 41 40 40 41 40 38 37 37 39 38 37 38 37 36 35 35 35 36 37 38 38 39 40 42 43 43 43 43 43 42 41 41 43 42 40 40 40 41 41 41 41 41 41 41 41 41 42 43 44 45 44 43 44 44 45 46 46 45 45 46 45 44 44 43 44 44 43 42 41 41 42 43 41 40 42 42 41 40 40 40 39 38 37 37 37 38 39 39 39 39 39 39 38 38 39 39 38 38 39 38 38 38 39 40 40 40 40 39 39 39 38 38 37 37 37 37 37 37 37 36 36 35 33 33 33 33 34 35 35 35 36 36 36 37 37 36 36 36 37 37 36 35 35 35 34 34 34 35 35 34 34 33 33 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 31 68 68 68 68 67 67 67 67 67 66 66 66 66 66 66 66 66 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 61 61 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 57 58 57 57 57 58 58 58 59 59 59 59 59 60 60 60 60 59 59 59 60 60 60 60 59 59 59 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 53 53 54 54 54 54 54 54 53 53 53 53 53 54 53 53 52 51 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 51 51 51 52 53 53 54 54 53 53 53 53 54 55 55 54 53 52 52 52 51 51 51 52 52 51 50 49 49 48 48 47 48 49 48 47 47 46 46 46 46 45 45 45 46 46 47 46 46 46 45 45 44 44 44 45 47 47 47 46 45 44 44 44 44 44 44 44 43 43 43 42 41 41 41 42 42 43 44 45 46 46 46 45 44 44 43 42 43 44 45 44 43 43 42 41 42 42 41 40 39 38 39 41 42 42 42 41 39 39 38 38 38 38 36 36 38 39 40 41 41 42 42 42 41 38 38 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 37 36 36 38 38 39 39 39 39 38 36 37 36 33 32 33 34 37 38 38 39 38 39 40 40 39 39 39 39 40 41 39 37 37 37 37 36 36 36 35 35 36 36 37 38 39 39 40 41 41 43 42 42 43 43 42 41 41 41 40 40 40 41 42 41 41 41 42 41 41 42 42 42 43 43 44 44 43 44 44 45 46 46 44 44 46 46 45 43 43 43 44 43 41 40 40 41 42 41 40 41 41 39 39 38 38 38 38 38 38 38 39 39 39 40 40 40 40 39 40 40 40 39 39 39 39 39 38 39 39 40 40 40 39 38 38 39 38 38 38 38 37 37 37 37 36 36 35 34 34 33 33 33 33 33 34 35 35 36 36 36 36 36 36 37 37 36 35 35 35 34 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 35 34 34 35 35 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 32 68 68 69 68 68 67 67 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 61 61 60 60 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 56 56 56 56 56 56 56 57 56 57 57 58 58 58 59 58 59 60 60 60 60 59 58 59 60 61 61 60 59 59 59 58 58 58 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 53 53 53 54 55 55 54 54 54 53 53 54 54 54 54 54 54 53 52 51 50 50 50 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 50 50 50 51 52 52 52 53 53 54 54 54 54 54 54 54 54 55 55 54 54 53 52 52 52 52 52 52 52 52 51 50 50 49 49 48 47 47 47 47 46 46 47 48 48 47 46 45 45 45 46 45 45 45 45 45 44 44 45 46 47 47 46 46 46 46 45 45 44 44 43 43 43 43 42 42 42 41 41 41 42 43 44 44 45 46 46 46 45 44 44 43 43 44 45 44 43 43 43 43 44 44 43 43 42 40 39 39 40 40 41 42 41 40 39 38 37 37 36 36 37 38 38 40 41 42 42 42 42 40 40 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 36 37 39 39 39 38 38 38 38 36 36 34 32 32 33 34 37 38 37 37 37 38 39 40 39 37 37 38 39 39 39 37 36 36 35 35 35 35 36 37 38 38 39 39 39 41 42 42 43 42 40 41 42 42 41 41 40 40 39 40 41 43 44 43 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 44 45 46 45 43 42 42 44 43 41 40 40 41 42 41 40 40 39 38 37 37 37 38 39 39 39 40 40 40 40 40 40 40 40 40 41 41 41 40 39 39 39 39 39 39 39 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 34 34 33 33 33 33 34 35 35 35 35 35 35 36 36 37 37 36 35 35 35 35 35 35 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 68 68 68 68 68 68 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 62 62 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 58 58 58 58 58 58 57 57 56 56 56 56 55 55 55 56 56 56 56 57 58 58 58 58 58 59 60 59 59 59 58 58 59 61 61 60 59 59 59 58 58 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 53 54 55 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 51 51 50 50 49 49 49 49 49 48 48 48 48 48 49 49 50 50 50 50 51 52 52 53 53 53 54 54 54 54 55 55 55 55 55 55 54 54 54 53 52 52 52 52 52 51 51 51 50 50 49 49 48 47 46 46 46 46 47 48 49 48 47 47 46 45 45 45 45 45 45 45 45 45 44 45 46 46 46 46 46 46 46 45 45 45 44 43 43 43 43 43 43 43 42 41 41 42 42 44 44 45 45 46 45 45 44 44 44 43 43 44 44 44 44 44 44 44 44 43 42 42 41 39 38 38 39 41 41 42 42 41 40 37 37 36 36 37 38 39 40 41 42 43 43 42 41 40 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 38 37 37 37 38 38 37 36 35 33 32 32 34 35 37 37 37 37 38 39 40 40 39 37 37 39 38 37 37 36 35 34 34 35 36 37 38 38 39 40 40 40 40 41 42 43 43 42 40 40 42 41 40 40 39 39 40 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 44 43 42 42 43 44 45 45 44 43 42 42 43 42 42 41 40 42 42 41 40 39 38 37 38 38 38 39 39 39 40 41 41 41 40 40 41 41 41 41 41 41 41 40 40 39 39 39 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 34 34 33 33 33 33 34 35 35 35 35 35 36 36 37 37 36 35 35 35 35 35 35 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 69 68 68 68 68 68 67 67 67 68 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 62 62 62 61 61 62 62 62 62 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 58 58 58 57 56 56 56 57 56 56 55 55 55 55 55 55 56 57 57 57 57 57 57 58 59 58 57 58 58 59 60 60 60 60 60 60 60 59 58 58 57 57 57 57 58 57 56 56 56 56 56 55 55 55 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 51 52 52 52 53 53 53 54 54 55 55 55 55 55 55 55 54 53 52 52 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 47 48 49 49 48 48 47 46 45 45 45 45 45 45 46 46 46 45 45 46 46 46 46 45 45 46 45 44 44 43 43 43 43 44 44 44 43 42 41 41 41 42 42 43 44 45 45 45 45 44 44 43 43 43 44 44 45 45 44 44 44 44 42 41 41 41 40 40 39 38 39 39 41 41 41 40 38 37 36 37 38 40 41 41 41 42 43 42 41 40 39 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 37 37 38 38 36 35 34 33 32 32 33 34 35 37 37 38 38 39 39 40 39 39 38 37 39 38 36 35 35 34 34 35 36 37 39 40 40 40 41 41 42 42 42 42 42 42 41 40 40 41 41 40 39 39 40 42 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 44 43 41 41 43 44 44 44 43 43 43 43 44 42 42 40 40 41 41 40 39 38 37 38 40 40 40 40 40 39 40 40 41 41 40 40 41 42 43 43 42 42 41 41 40 40 39 40 40 41 40 39 39 39 39 39 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 34 34 33 32 33 34 35 35 35 35 36 36 36 36 35 35 36 36 36 36 35 35 34 34 33 33 33 34 34 34 34 34 34 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 69 69 68 68 68 68 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 62 62 62 62 62 62 62 62 61 61 61 60 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 55 55 55 55 55 55 55 55 56 56 56 57 58 57 57 58 58 58 59 59 59 60 60 60 60 60 59 58 58 58 58 58 58 58 58 57 56 56 56 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 52 52 51 50 50 49 49 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 51 51 52 52 53 53 53 54 54 54 54 54 54 54 54 54 53 53 52 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 48 47 47 47 46 45 45 46 47 47 47 47 47 47 46 46 46 46 46 46 45 44 44 44 43 43 43 44 45 45 45 44 44 43 43 42 41 41 41 41 42 43 44 44 45 45 44 44 43 42 43 44 44 45 44 43 43 44 44 43 42 42 42 42 41 40 39 38 38 39 41 40 38 38 37 37 37 38 39 40 41 42 42 41 40 40 39 38 38 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 38 38 38 38 38 36 35 33 32 32 32 32 34 36 37 36 37 39 40 39 39 39 38 38 38 37 38 38 36 34 34 34 35 36 37 37 39 41 41 41 42 42 43 42 42 42 42 40 40 39 39 39 39 39 39 39 41 42 42 42 42 42 43 43 42 42 42 43 43 44 45 46 46 45 45 45 44 43 43 42 41 42 43 42 42 42 42 43 44 44 43 41 40 39 40 39 39 39 38 38 39 40 40 40 40 41 41 40 40 40 40 40 41 41 42 42 43 43 43 42 42 42 41 40 40 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 34 34 34 33 32 33 34 34 34 35 36 36 36 35 34 34 35 36 36 36 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 69 69 68 68 68 68 68 67 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 56 55 55 55 55 55 55 54 54 54 55 55 55 56 56 56 57 57 57 58 57 58 58 59 59 59 60 60 59 59 58 58 59 59 59 59 58 57 57 56 56 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 51 51 52 51 51 50 49 48 48 48 48 48 48 48 48 48 49 50 50 51 51 50 50 51 52 53 53 53 53 53 53 53 53 53 53 53 54 55 54 53 52 52 51 50 50 50 50 50 50 50 50 50 50 50 49 48 48 49 49 48 48 47 47 46 46 46 46 47 47 47 47 47 47 46 45 45 45 45 45 45 45 44 44 44 43 44 44 44 45 45 44 44 44 44 43 43 41 41 41 41 41 42 43 44 44 45 45 44 43 42 43 44 44 45 44 43 43 42 42 42 42 43 43 43 42 41 40 39 38 38 39 39 39 38 37 37 36 37 38 39 41 42 42 41 40 40 40 39 39 36 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 38 39 39 37 34 33 32 32 32 32 33 36 39 39 38 38 40 40 39 38 38 37 38 37 36 38 37 35 34 34 35 36 37 37 38 38 40 42 42 42 41 42 41 41 41 40 39 39 38 38 38 39 39 39 40 40 40 41 41 41 41 41 41 41 42 42 43 43 43 44 46 46 46 45 44 44 43 43 42 41 42 42 41 41 42 43 43 44 43 42 41 40 39 39 39 39 38 38 39 39 40 40 41 41 41 41 41 41 41 40 40 40 40 41 41 42 43 43 43 43 42 42 41 41 41 41 41 41 40 39 39 39 39 38 38 38 38 38 38 38 37 37 37 37 36 35 35 35 34 34 33 33 32 33 34 34 34 35 36 36 36 36 35 34 35 36 36 36 35 35 35 34 34 33 33 33 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 69 69 69 68 68 68 68 68 67 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 60 60 59 59 59 58 58 58 57 58 57 57 57 56 56 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 55 55 56 56 57 58 58 58 58 59 59 59 58 58 59 59 59 60 60 59 58 58 58 57 56 55 54 54 55 54 54 54 54 54 53 53 54 54 54 54 54 54 53 53 52 52 52 52 52 51 51 51 51 51 51 52 52 53 53 53 53 52 52 51 51 51 50 50 50 49 48 48 48 48 48 48 48 48 48 49 49 50 51 51 50 51 51 52 53 54 53 54 54 53 53 53 52 52 53 54 55 54 53 53 52 51 51 50 49 49 49 49 49 50 50 50 49 49 48 47 47 47 48 48 47 46 46 46 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 45 45 44 44 44 44 44 43 43 43 42 41 41 41 41 41 41 42 43 43 44 45 44 43 42 42 43 44 44 44 43 43 42 42 42 42 43 42 43 43 43 41 40 39 38 38 39 40 40 38 37 37 38 38 39 40 41 41 41 40 39 40 40 40 37 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 39 39 38 35 33 32 32 32 32 33 35 37 38 40 40 39 40 41 40 38 37 37 37 36 36 36 35 34 34 35 36 37 38 39 39 39 40 41 41 41 40 41 41 40 39 38 37 38 38 38 39 40 41 41 40 40 40 40 41 41 40 41 41 41 42 43 43 44 44 44 45 46 45 44 44 44 43 43 42 40 40 41 41 43 43 43 43 43 42 42 41 40 39 38 38 38 38 38 40 41 42 42 42 42 42 41 41 42 42 42 41 41 41 41 41 42 43 43 44 44 43 43 42 42 41 41 41 41 40 40 39 39 39 39 39 38 38 38 38 38 37 37 37 37 37 35 35 35 35 34 34 33 32 33 33 33 34 34 35 36 36 36 36 35 35 35 36 36 36 35 35 34 34 33 33 33 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 69 69 69 68 68 68 68 68 68 67 67 67 67 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 57 57 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 56 57 57 57 57 57 57 57 57 57 58 58 59 60 61 60 59 59 59 58 58 57 56 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 52 53 53 52 51 51 51 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 50 51 50 50 51 51 52 53 54 54 54 53 52 52 52 52 53 55 55 54 54 53 53 52 52 51 49 49 49 48 48 48 49 49 48 48 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 42 43 43 44 44 43 41 42 43 44 44 43 43 43 43 43 42 42 42 41 41 41 42 43 41 40 39 38 38 38 39 38 37 38 39 39 40 42 41 40 39 39 38 39 39 39 36 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 36 38 37 37 34 32 32 32 32 32 34 36 37 38 40 41 41 40 41 40 38 38 37 36 36 36 35 34 34 35 36 37 39 39 40 40 41 41 41 40 40 40 41 40 39 38 37 38 39 39 39 40 41 42 42 41 41 41 42 42 42 41 42 43 42 42 42 43 44 45 45 45 45 45 44 43 43 44 43 42 41 40 40 42 43 43 43 43 42 42 41 41 40 38 37 37 37 37 38 39 40 41 42 42 43 43 42 42 42 43 43 42 42 43 42 42 42 43 43 44 44 43 43 42 42 42 42 42 41 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 37 36 35 35 35 35 34 33 32 32 32 32 33 34 35 35 35 35 35 35 34 35 35 36 36 35 35 34 33 32 32 33 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 34 70 69 69 69 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 57 57 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 56 56 57 57 57 58 58 59 60 60 60 60 59 59 59 59 58 57 56 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 51 51 51 52 52 52 51 51 51 52 51 51 50 50 50 50 49 50 49 49 50 51 51 51 50 49 48 48 48 48 48 49 49 50 49 50 50 50 51 52 53 54 53 52 51 51 53 53 53 54 54 54 54 53 53 52 52 51 50 49 49 49 49 48 48 48 48 47 47 47 48 48 47 47 47 49 49 48 48 48 49 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 45 46 46 46 45 45 44 43 43 44 44 44 43 43 42 41 41 41 41 41 42 43 43 43 42 41 43 43 43 44 44 45 45 44 44 44 43 42 42 41 41 41 42 42 42 41 40 38 38 38 37 37 39 40 40 41 43 41 40 39 38 38 39 39 37 37 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 34 34 32 32 32 32 33 34 35 37 38 39 39 40 41 40 40 39 38 38 38 35 35 34 34 34 35 36 37 38 38 39 40 41 42 42 41 39 40 41 40 39 38 37 37 38 40 41 41 40 40 42 43 42 41 41 42 43 44 43 42 43 43 43 43 43 43 45 46 45 45 44 44 43 43 43 43 43 41 39 40 41 42 43 43 42 42 41 41 41 39 37 37 39 39 39 39 39 39 40 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 42 42 41 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 37 37 36 36 36 35 35 34 33 32 32 32 32 33 34 34 35 35 35 35 34 34 34 35 36 36 35 34 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 70 70 70 69 68 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 61 60 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 61 61 60 60 60 60 60 60 59 59 58 58 58 57 57 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 56 56 56 57 58 58 59 59 60 59 58 58 58 58 58 58 58 57 56 55 54 54 54 54 54 54 54 54 55 54 53 53 53 52 52 52 53 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 50 51 52 51 50 50 48 48 48 48 48 48 48 48 48 49 50 50 51 52 52 52 53 52 51 52 53 53 53 54 53 53 54 54 53 52 52 51 50 50 50 50 50 50 49 48 48 49 49 48 49 49 49 48 49 50 49 49 49 49 49 49 49 49 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 46 45 44 43 44 44 44 44 43 43 43 42 41 41 41 41 41 41 42 42 42 42 43 43 44 44 45 46 46 45 45 44 43 43 43 43 42 40 40 42 43 42 42 40 40 40 38 37 39 41 41 41 42 41 41 40 38 39 39 38 37 37 36 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 33 32 32 32 32 32 33 35 35 36 37 37 39 40 40 40 39 40 38 37 36 34 33 33 34 35 36 37 37 38 38 39 40 41 41 41 41 39 39 40 39 38 37 38 38 39 40 40 41 41 42 43 43 43 42 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 43 43 43 42 42 40 39 40 41 42 43 42 42 41 40 39 39 38 38 39 40 41 41 41 41 40 41 41 41 42 42 43 44 44 44 44 43 43 44 44 44 43 43 43 42 42 42 42 43 42 41 41 41 40 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 35 35 35 34 33 33 33 32 32 33 34 34 35 35 35 35 34 34 35 35 36 35 34 33 33 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 71 70 70 69 69 68 68 68 68 68 68 68 67 67 67 67 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 61 61 62 61 61 62 62 62 62 62 62 61 61 61 60 61 61 61 61 61 61 60 60 60 60 61 61 60 59 59 59 58 58 57 57 57 56 56 56 55 55 55 55 54 54 55 54 54 54 54 54 53 53 53 53 53 54 55 55 55 56 56 56 56 57 57 57 58 59 59 58 57 57 57 57 57 58 58 57 56 54 54 54 54 54 54 54 55 55 54 53 53 53 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 48 48 49 50 51 51 52 52 52 52 51 51 52 53 52 53 54 53 53 54 54 53 52 51 51 50 51 51 51 51 50 50 50 50 50 50 49 50 50 49 49 48 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 46 47 47 47 47 47 46 46 45 45 45 44 44 44 44 44 44 44 44 44 44 43 42 41 41 41 41 41 41 41 42 43 43 43 44 44 44 45 45 45 45 44 44 43 43 42 42 40 39 40 42 42 43 42 41 40 38 38 39 41 41 41 41 40 40 40 39 38 39 38 37 36 35 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 37 37 37 38 39 39 39 39 39 39 38 36 34 33 33 33 34 35 36 38 39 39 39 39 41 41 41 41 40 38 39 39 38 37 38 39 39 40 40 40 41 42 42 43 43 42 43 44 44 44 44 44 44 44 44 44 45 45 44 45 45 45 45 44 44 43 42 43 43 41 40 39 39 41 42 43 42 42 40 38 37 37 38 38 39 40 40 41 42 42 42 43 42 42 42 43 43 44 44 44 44 43 43 43 44 44 43 43 43 43 42 41 42 43 42 41 40 40 41 42 42 41 40 40 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 71 71 70 70 69 69 69 68 68 68 68 68 68 68 67 67 67 66 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 62 62 62 62 61 60 60 61 61 61 61 60 60 60 59 59 59 58 58 57 57 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 54 55 56 56 56 56 55 55 56 56 57 57 58 58 58 57 56 56 56 57 58 58 57 55 54 54 54 54 54 54 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 52 51 51 52 52 53 52 52 51 52 51 50 49 48 48 47 47 47 47 48 48 50 50 51 51 51 51 51 51 51 51 52 52 52 53 54 53 52 53 54 54 53 52 52 52 51 51 52 52 50 50 51 50 50 50 50 50 51 50 49 48 48 48 48 48 48 49 48 47 47 47 47 47 46 46 46 46 46 46 47 47 47 46 46 46 45 45 45 45 44 44 45 44 44 44 44 44 43 43 42 41 41 41 41 41 41 41 42 43 43 43 44 44 43 44 45 44 44 44 44 44 43 42 41 41 40 40 40 40 40 42 41 40 38 38 40 41 41 41 41 40 39 38 38 37 38 39 37 36 35 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 36 38 39 39 39 39 39 38 37 38 38 37 36 35 33 33 33 34 36 37 37 37 38 40 40 40 42 41 41 40 39 38 38 37 37 38 39 39 39 40 41 41 41 42 42 43 42 41 42 43 44 44 44 43 42 44 44 44 44 44 44 44 44 44 44 44 43 42 42 43 43 43 42 39 39 40 41 42 43 41 38 37 38 38 39 39 39 40 39 40 41 42 43 44 43 43 43 43 44 43 43 42 42 43 43 42 43 44 44 43 43 43 42 41 42 42 42 41 40 41 42 42 43 42 41 40 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 32 32 32 33 34 34 33 33 33 34 34 34 34 34 33 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 33 32 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 71 71 71 70 70 69 69 69 69 68 68 68 68 68 67 67 66 66 66 66 66 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 62 62 61 61 61 61 60 61 61 60 60 60 60 59 59 59 59 58 58 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 53 53 52 53 54 55 56 56 55 54 55 56 56 56 56 57 58 58 58 57 56 56 56 56 56 56 56 55 54 54 54 54 54 55 55 55 55 55 55 54 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 53 53 52 51 51 50 49 49 49 48 47 47 47 47 47 48 49 50 50 49 49 49 49 50 51 52 53 53 53 54 54 53 52 53 53 54 54 53 52 52 51 50 51 51 50 50 50 49 50 50 49 49 49 50 49 49 48 47 48 48 48 48 47 47 46 46 46 47 47 47 46 45 46 46 46 47 46 46 46 46 46 46 46 46 45 45 45 44 45 45 45 44 43 42 42 42 42 41 41 41 41 41 41 42 43 42 43 44 43 44 45 45 44 44 44 45 44 44 43 43 42 41 42 40 39 39 40 41 39 38 39 40 40 41 41 40 38 38 38 36 37 38 38 37 37 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 38 39 40 39 39 39 37 36 37 38 36 34 33 33 33 34 36 37 38 38 37 37 38 40 41 41 40 40 39 38 38 38 37 38 39 40 39 40 40 41 42 41 41 42 42 41 41 43 43 44 43 43 42 42 43 43 43 44 44 44 43 43 44 44 44 43 42 42 43 43 42 42 40 39 39 40 42 42 40 37 37 39 39 41 41 42 42 41 41 42 43 43 43 42 42 43 43 43 43 42 41 42 42 42 42 42 43 43 44 44 43 43 42 42 42 41 42 42 42 42 42 43 42 41 41 41 40 39 38 38 38 38 38 38 37 37 37 37 37 37 36 35 35 35 36 36 36 35 34 33 32 32 32 33 34 33 33 34 34 34 34 34 33 32 33 34 34 35 35 35 35 36 35 35 35 35 35 35 35 34 33 34 35 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 33 33 32 32 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 71 71 71 70 70 69 69 69 69 69 69 68 68 68 68 68 67 66 66 66 66 66 67 67 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 58 58 58 57 57 57 56 56 57 57 58 57 57 57 57 56 56 55 55 55 55 55 55 54 53 53 52 52 52 53 54 54 54 54 55 56 56 56 56 56 57 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 55 55 54 55 55 55 54 53 53 53 54 53 53 52 52 52 52 51 51 51 51 51 52 52 53 53 52 52 52 52 52 52 51 51 50 49 49 49 49 48 47 47 47 47 47 48 49 49 49 49 49 49 50 51 52 53 53 53 54 54 53 52 52 53 54 54 54 53 52 51 51 50 50 50 50 49 49 49 49 50 50 49 48 48 49 49 48 48 48 47 47 47 46 47 47 47 46 46 46 46 46 45 45 46 46 47 46 46 45 45 46 46 46 45 45 45 45 44 44 44 44 43 42 42 43 43 43 42 41 41 41 40 40 41 42 43 43 43 43 44 44 44 44 43 44 44 44 45 44 43 43 43 43 42 42 41 40 39 38 38 39 40 40 41 41 39 38 38 37 36 36 37 37 37 36 35 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 38 38 40 40 38 37 37 36 36 37 35 34 33 33 33 33 34 36 38 39 39 39 39 39 40 40 39 39 39 38 37 37 37 38 39 40 40 40 41 41 40 41 40 40 41 40 40 41 42 43 44 43 43 42 42 43 42 43 43 43 43 42 43 43 44 44 43 43 42 42 43 42 40 40 39 39 40 41 40 38 36 37 39 40 42 43 43 44 44 43 44 44 44 43 42 42 41 42 43 43 42 42 42 41 41 42 42 43 43 44 44 44 43 43 42 41 40 41 42 42 42 42 43 42 42 42 41 40 40 39 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 36 35 35 34 32 32 32 33 34 33 33 33 34 34 33 32 32 32 33 33 33 34 34 35 35 36 36 36 35 35 35 35 34 33 33 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 33 33 33 33 32 32 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 33 70 70 70 70 69 69 69 69 69 69 69 69 68 68 68 68 67 67 66 66 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 63 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 61 61 60 60 60 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 57 58 59 58 58 58 57 56 56 56 55 55 55 55 54 54 54 53 53 53 52 52 52 52 53 54 55 56 56 55 55 56 57 56 56 56 56 56 57 56 55 54 55 55 55 54 54 54 53 54 54 54 54 54 55 55 54 54 54 54 55 54 53 53 52 52 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 48 47 47 47 47 48 49 48 48 48 49 50 51 51 52 53 53 53 53 53 52 51 52 52 53 54 53 53 52 51 51 51 50 49 49 48 48 48 48 49 50 49 48 48 48 48 48 47 47 47 47 47 47 47 48 47 46 46 46 45 45 45 45 46 46 46 46 46 45 44 45 46 46 45 45 45 44 44 43 43 43 43 42 43 44 43 43 43 42 41 41 40 40 40 41 42 42 42 43 43 43 43 44 44 43 43 44 44 43 43 44 44 44 42 42 41 41 39 38 39 40 40 41 41 41 40 39 39 38 37 35 35 37 36 35 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 39 39 39 38 36 36 35 35 35 33 33 33 33 34 35 35 36 37 38 39 40 40 40 40 39 38 39 39 37 36 37 38 39 40 40 41 41 41 41 40 39 39 40 41 41 41 42 42 42 43 43 42 41 41 42 42 42 42 41 42 42 43 44 44 43 43 43 42 41 41 42 40 39 38 38 39 38 37 36 37 38 39 40 41 41 42 43 44 44 44 45 44 43 42 41 41 41 42 42 41 41 41 41 41 42 43 43 43 44 44 44 43 42 41 40 40 40 40 40 40 41 41 42 42 42 41 40 40 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 34 33 32 32 32 34 33 33 33 34 34 32 31 31 31 32 33 33 33 34 35 35 35 36 36 36 36 35 35 34 33 34 35 34 34 34 34 33 33 33 34 34 34 34 34 34 33 32 33 33 33 32 32 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 70 69 69 69 69 69 69 69 69 69 69 69 69 68 68 68 68 67 67 67 67 68 68 67 66 66 66 66 66 66 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 57 57 57 58 58 58 58 57 58 59 59 59 59 58 58 57 57 56 55 55 55 55 54 54 54 54 54 53 53 52 52 52 52 53 54 55 56 55 55 55 56 56 55 55 55 55 56 56 55 55 54 54 55 54 54 54 54 53 53 53 53 53 54 54 54 54 54 54 55 55 54 53 53 53 53 53 52 52 52 53 53 52 52 51 51 51 50 50 50 50 50 50 51 51 51 51 50 49 48 47 47 47 47 48 48 48 48 49 50 51 50 51 52 53 52 51 51 51 52 52 52 53 54 54 53 52 51 51 50 50 50 50 49 48 47 47 48 49 49 49 50 49 48 48 47 48 48 48 48 48 48 48 47 47 47 46 45 45 45 45 45 46 46 46 46 45 45 44 45 46 46 46 45 44 44 44 43 43 43 43 43 44 43 43 43 42 41 41 40 40 40 41 41 41 42 43 42 42 43 44 44 43 43 43 43 42 43 43 44 44 42 41 41 41 40 39 41 41 41 41 41 41 40 41 40 39 37 35 35 35 35 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 38 38 38 37 37 36 35 34 33 33 33 33 33 34 36 37 37 37 38 38 38 40 41 41 40 39 38 38 38 37 37 37 38 39 40 41 41 40 40 39 38 39 41 42 42 41 42 41 42 41 42 42 40 40 41 41 41 41 41 42 42 43 44 44 43 41 42 43 42 40 40 40 41 40 38 39 39 37 37 38 38 39 39 39 40 41 42 43 43 42 43 44 44 43 42 41 41 40 40 40 41 41 41 42 42 42 43 43 44 44 44 43 43 42 41 42 41 41 40 39 39 39 40 41 41 41 41 41 40 40 40 40 39 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 34 33 32 32 32 32 33 34 34 33 32 31 31 31 31 33 34 34 34 34 35 35 35 35 36 35 35 35 34 33 33 34 34 34 34 34 34 33 33 34 34 34 34 34 34 33 32 33 34 33 33 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 33 34 34 34 34 34 34 34 34 34 33 33 33 70 70 69 69 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 62 62 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 59 59 59 59 58 59 59 59 59 59 58 57 57 56 55 55 55 55 55 55 55 55 54 54 54 53 53 52 52 52 52 53 54 54 54 54 56 55 55 56 55 55 55 56 55 55 55 54 54 53 53 54 54 54 53 53 53 52 53 54 54 54 54 54 55 55 54 54 53 53 53 53 52 52 52 53 53 52 52 51 51 50 50 50 50 50 51 51 52 52 51 50 49 49 49 48 47 47 47 47 47 48 48 49 50 49 49 50 51 52 51 51 52 53 53 54 54 54 54 54 53 52 51 50 50 49 50 49 49 49 47 47 47 47 48 50 50 50 49 49 48 49 49 48 47 48 49 48 48 47 46 46 45 45 45 45 45 45 45 46 46 46 45 44 45 45 45 46 46 45 45 45 44 44 44 44 44 44 43 43 43 43 42 41 40 40 40 40 40 41 41 42 42 42 42 43 43 43 44 43 42 42 42 43 44 43 42 41 41 40 39 40 41 42 42 42 41 40 39 40 39 39 38 36 35 34 35 35 34 34 35 35 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 35 35 36 38 38 37 36 36 35 34 33 32 32 33 33 35 36 37 38 38 37 39 39 38 40 41 41 40 39 38 37 37 37 37 38 39 40 41 41 40 39 38 39 39 40 42 42 41 40 40 40 39 39 40 40 39 40 40 40 40 40 41 43 44 44 44 44 43 41 42 43 42 40 39 40 41 40 38 38 38 36 38 39 40 40 41 41 41 42 43 43 42 42 42 42 43 42 42 41 41 40 40 41 42 42 42 42 42 42 42 42 43 44 44 43 43 42 42 42 42 41 40 40 39 39 39 40 40 40 41 41 41 41 41 40 39 38 38 37 37 37 36 36 36 36 36 36 37 37 37 37 37 37 36 35 34 33 32 31 31 33 34 34 33 31 32 32 31 30 32 33 33 34 34 34 35 34 34 35 35 35 35 34 34 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 33 33 34 34 34 33 33 33 33 33 34 34 33 33 33 33 33 33 33 33 34 33 33 34 34 34 34 34 34 33 32 33 70 70 70 69 69 69 69 69 69 69 68 68 68 68 68 68 68 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 61 61 60 59 59 59 59 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 59 59 59 58 57 57 57 56 56 56 56 56 56 56 55 55 54 54 54 53 53 52 52 51 51 51 52 52 52 53 53 53 55 55 54 54 54 54 54 55 54 54 53 53 54 54 55 54 53 52 52 53 54 54 54 53 53 54 55 55 54 53 53 52 52 52 52 52 53 53 53 52 52 51 51 51 51 51 51 52 52 52 51 50 49 49 49 49 49 47 47 47 47 47 48 48 49 49 48 48 49 50 50 50 51 52 53 54 54 54 54 55 54 54 53 52 51 50 50 49 49 48 47 47 47 46 47 48 49 50 49 49 49 49 49 49 48 47 47 48 48 49 48 47 45 45 45 46 46 45 45 45 45 46 46 46 45 44 45 45 46 45 45 46 45 44 45 45 44 44 44 44 44 44 43 43 42 41 40 40 40 40 40 40 41 42 41 41 42 42 43 44 44 43 43 42 43 43 43 42 42 41 39 39 41 42 42 42 42 41 40 39 38 37 37 37 36 36 36 37 37 36 35 36 37 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 34 35 35 37 37 37 36 36 35 33 32 33 33 34 35 36 37 37 38 39 39 38 38 39 41 41 40 39 38 38 37 37 37 38 40 40 41 41 40 39 38 38 40 41 41 41 41 40 39 39 40 39 39 39 40 41 41 40 41 41 41 42 44 45 46 45 43 42 42 41 41 41 40 40 40 41 39 37 36 36 37 38 40 42 42 41 41 41 42 43 42 41 41 42 42 42 42 41 41 40 40 40 41 41 41 41 41 42 42 42 42 43 43 43 42 42 42 42 41 41 41 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 38 38 38 37 36 36 36 36 36 36 37 37 37 37 37 37 36 36 35 35 34 33 32 32 32 32 32 31 32 33 32 31 31 31 32 33 34 34 35 34 34 34 34 34 34 35 35 34 33 33 34 34 34 34 34 33 34 34 35 35 35 35 34 33 32 33 34 34 33 32 33 33 33 32 33 33 32 33 34 34 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 33 32 69 70 70 70 69 69 69 69 69 68 68 68 68 68 68 68 67 67 67 67 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 61 60 59 59 59 60 60 61 60 59 59 59 60 60 60 59 60 60 59 60 60 60 60 59 59 60 60 59 59 58 58 58 57 57 57 57 57 56 57 56 56 56 55 55 55 54 54 53 53 52 51 51 51 51 51 51 51 52 52 52 52 52 52 52 53 53 53 53 52 53 53 53 54 54 54 52 52 53 54 54 54 53 52 53 54 55 54 54 53 52 52 51 51 51 51 52 52 53 52 52 51 51 51 51 51 52 52 51 51 50 50 50 50 49 49 48 47 46 46 47 47 47 48 48 48 48 48 48 49 50 51 52 52 53 53 54 55 55 54 54 53 52 51 50 50 50 50 49 48 48 48 47 46 47 48 49 49 49 49 49 49 48 48 47 47 46 47 48 48 47 46 46 47 46 45 45 44 44 44 45 45 45 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 42 41 41 41 40 40 40 40 40 40 40 41 41 41 42 43 44 44 43 42 41 42 43 43 42 41 40 40 42 43 43 43 42 41 41 39 38 37 37 36 36 37 38 38 38 36 35 36 36 37 37 35 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 35 36 36 37 37 37 36 35 34 33 32 33 34 35 36 37 37 37 38 39 40 40 40 39 40 41 41 40 39 39 38 38 37 37 39 41 41 41 40 39 38 38 40 41 41 41 40 39 38 38 40 41 42 42 41 42 43 42 43 43 42 43 44 44 44 45 44 42 42 42 41 40 40 39 39 41 40 38 36 36 37 39 40 42 43 42 41 41 42 42 43 42 41 40 41 41 40 41 41 40 40 39 39 40 40 41 41 42 42 42 42 43 43 43 43 42 41 41 41 41 41 41 41 40 40 40 39 38 38 39 39 40 40 40 40 40 40 40 39 38 38 37 37 36 36 36 36 37 37 37 37 37 37 36 36 35 35 35 35 34 33 32 31 31 32 32 33 34 33 33 32 32 32 33 34 35 34 34 34 34 34 33 34 34 34 34 33 32 33 34 34 34 34 33 33 34 35 35 34 34 34 33 32 33 34 33 32 32 32 32 32 32 32 32 32 32 33 33 33 32 32 33 32 32 32 33 33 32 33 34 34 34 34 34 34 34 34 32 69 69 69 69 69 69 69 69 69 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 59 59 60 60 60 61 60 60 60 60 60 61 60 60 60 60 60 60 60 61 61 60 60 60 60 59 59 59 58 58 57 57 58 58 58 57 57 57 57 56 56 56 56 55 55 54 54 53 52 52 51 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 52 52 52 53 54 53 52 53 53 53 53 53 52 52 53 54 54 54 54 53 52 51 50 50 50 51 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 48 47 46 46 47 47 47 48 48 48 48 49 49 50 50 51 51 52 53 53 54 54 55 53 52 52 52 51 51 50 50 50 50 50 50 49 47 46 46 47 47 48 48 49 49 49 48 48 48 47 46 46 47 48 47 47 47 47 46 45 45 45 44 44 44 44 44 44 43 43 44 44 45 44 44 45 45 46 46 46 45 44 44 43 43 43 43 42 42 42 41 41 40 40 40 40 40 40 40 40 41 42 43 43 43 43 42 42 42 42 43 42 40 40 41 42 42 43 43 43 43 42 40 39 39 38 38 38 38 39 38 37 35 35 36 37 37 38 38 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 37 38 37 37 36 34 32 32 34 34 34 36 37 38 38 37 38 40 40 40 40 40 41 42 41 40 39 38 37 37 37 37 39 41 41 39 39 38 38 40 41 41 40 40 39 38 38 39 40 42 43 42 41 41 42 43 43 43 43 44 43 43 43 44 44 43 41 41 42 40 39 38 39 40 38 36 37 39 39 40 42 42 41 41 41 42 42 42 42 41 40 40 40 39 40 40 39 39 39 40 40 40 40 41 40 41 42 41 42 42 42 43 43 43 43 42 42 42 42 41 41 40 40 40 40 39 39 38 38 39 40 40 39 39 40 40 39 38 38 37 37 36 36 36 36 37 37 37 37 37 36 36 35 35 35 35 35 34 34 34 33 32 33 34 34 34 34 34 33 33 32 32 34 34 34 34 34 34 33 32 33 33 33 33 32 32 32 33 33 33 33 33 33 34 34 34 34 34 33 32 32 32 33 32 31 31 31 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 34 33 33 32 69 69 69 69 69 69 69 69 69 69 69 69 68 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 61 61 61 60 60 60 61 62 61 60 60 60 60 60 61 62 61 61 60 60 60 60 59 59 59 58 57 58 59 59 58 58 58 58 57 57 57 57 57 56 56 55 54 53 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 51 52 52 52 52 52 52 52 52 52 52 52 52 53 53 54 54 53 52 52 51 50 49 50 51 52 52 53 53 52 52 52 51 50 50 51 51 51 52 51 51 51 50 49 48 47 46 46 47 47 48 48 48 49 50 50 50 51 52 51 52 53 54 54 54 54 53 52 52 52 51 51 51 49 49 49 49 50 49 48 47 46 46 46 47 47 48 49 49 49 49 48 48 46 45 46 48 48 47 46 46 46 45 45 46 45 45 44 44 43 43 43 43 44 45 45 44 44 45 45 46 46 45 44 44 44 43 43 43 43 42 42 42 42 41 41 40 40 40 40 40 40 40 40 41 41 42 42 42 42 43 42 42 42 42 41 41 42 42 41 42 43 43 43 43 42 41 41 40 39 40 40 40 38 36 34 35 37 38 37 38 38 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 35 36 37 38 37 38 37 34 33 32 33 35 36 36 37 39 40 39 39 40 40 40 40 40 41 41 42 41 40 40 39 38 37 36 37 39 40 40 38 37 37 39 40 39 39 38 38 38 37 38 39 40 41 42 41 41 41 42 43 43 43 43 42 42 42 43 44 44 43 41 41 41 40 38 39 40 39 36 36 38 40 40 41 43 42 40 40 42 42 41 41 42 41 40 40 39 38 39 39 39 40 40 41 42 42 42 42 41 41 41 41 42 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 40 40 39 38 38 38 38 39 39 39 39 39 39 38 38 37 37 36 36 36 36 36 37 38 37 37 36 36 36 35 35 35 35 35 34 34 34 33 33 34 34 35 35 35 34 33 31 31 32 33 34 34 34 34 33 32 33 33 33 32 32 32 32 31 31 32 32 32 33 33 33 33 33 33 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 32 32 69 69 69 69 69 69 69 69 69 69 69 69 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 64 64 63 63 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 61 61 62 61 61 61 61 61 62 61 61 61 61 60 60 61 61 62 61 61 60 60 60 60 59 59 58 58 58 59 59 59 58 57 58 58 57 57 57 57 57 57 56 55 54 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 52 52 52 52 53 53 53 52 52 52 50 49 50 50 51 52 52 52 52 51 51 51 50 49 50 51 51 51 52 52 51 50 50 49 48 46 46 46 47 48 48 49 49 50 51 51 51 52 53 53 53 54 54 54 53 53 53 52 51 50 50 50 49 48 48 48 49 49 49 48 47 45 46 46 46 47 48 48 49 49 48 47 46 45 46 47 47 47 46 46 46 45 46 46 46 45 45 45 44 43 43 43 44 45 45 44 44 44 45 46 46 45 45 45 45 44 43 43 43 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 41 41 42 42 43 42 42 41 41 42 43 43 42 42 43 43 43 42 42 42 41 40 39 40 40 39 38 36 35 36 37 38 38 39 39 36 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 33 33 34 36 37 38 36 34 32 32 33 35 37 38 39 39 40 39 40 41 40 39 39 40 40 41 41 40 40 40 40 39 37 36 38 40 40 38 37 37 37 38 38 37 37 37 38 38 39 38 38 39 40 40 41 43 42 42 42 42 43 43 42 42 42 44 44 44 43 41 40 40 39 38 39 41 39 36 37 38 40 41 41 43 42 40 39 41 41 40 41 41 40 39 39 38 38 39 40 40 41 41 42 43 43 43 43 43 41 41 42 43 43 43 43 43 43 43 43 43 42 42 42 42 41 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 35 35 35 34 34 34 33 33 34 34 35 35 35 34 33 32 32 31 31 33 34 34 34 33 32 33 34 33 33 33 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 33 33 33 33 33 33 32 69 69 69 69 69 69 69 68 68 69 69 68 68 68 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 61 61 62 62 62 61 61 61 62 62 62 62 62 61 61 60 60 60 61 61 61 60 60 60 60 60 59 58 58 59 59 59 59 58 57 57 57 58 58 58 58 57 57 56 55 54 55 55 55 54 53 53 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 50 51 51 51 51 51 52 52 52 52 52 51 50 49 49 50 51 51 51 51 50 50 50 51 50 49 50 50 50 51 51 50 50 50 49 48 46 46 46 47 48 48 49 49 50 51 52 52 52 53 53 53 53 53 54 53 53 52 52 51 51 50 49 49 49 49 48 47 48 48 47 46 45 45 45 46 46 47 47 47 47 47 47 46 46 45 46 47 47 46 47 46 46 46 47 47 46 46 45 45 45 44 43 43 44 44 44 44 45 45 46 46 46 46 46 45 44 43 43 43 42 43 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 41 41 42 43 42 41 41 41 42 43 42 43 44 44 43 42 42 42 41 41 39 38 39 38 37 36 36 37 37 39 39 39 39 36 33 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 38 37 35 33 32 32 33 35 37 38 39 39 38 38 40 41 40 39 38 39 40 41 40 40 40 39 39 38 36 36 38 39 38 37 36 37 37 37 37 38 38 39 40 40 41 41 40 40 40 40 42 43 43 42 40 40 41 42 41 42 42 42 42 42 43 43 41 40 40 38 37 39 38 36 38 39 41 42 42 42 42 41 39 40 40 40 40 40 40 39 38 38 39 40 40 40 41 42 42 43 43 44 44 43 42 42 42 42 43 44 44 43 43 44 44 43 43 42 42 42 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 36 36 35 35 36 36 37 37 37 37 37 37 37 37 36 35 35 35 34 34 34 34 34 35 35 35 35 35 34 34 34 33 31 31 32 32 33 33 31 32 34 34 33 33 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 31 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 33 33 33 32 69 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 63 63 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 58 58 59 59 59 59 58 57 57 57 57 58 59 58 57 57 57 55 54 55 56 55 55 54 54 53 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 51 51 50 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 49 49 49 48 46 46 46 47 47 47 48 49 50 51 52 53 52 52 53 52 52 52 53 53 52 52 52 52 52 51 50 50 50 49 49 48 47 47 46 46 45 45 44 45 46 46 47 47 46 46 47 47 46 45 45 46 46 46 47 47 46 46 47 47 46 46 46 45 44 44 44 43 43 44 44 44 45 45 45 46 46 46 45 45 44 44 44 43 44 44 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 40 40 40 41 41 42 41 40 40 41 41 42 42 43 43 43 43 42 42 42 42 41 39 38 37 37 36 36 37 38 39 39 38 38 39 38 34 32 31 31 32 31 31 32 32 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 37 33 32 32 32 34 35 36 37 39 39 38 38 39 40 40 39 38 40 41 41 40 39 39 38 37 37 36 35 36 36 36 36 37 37 38 38 38 40 40 41 42 42 42 42 43 42 41 41 41 43 43 42 41 40 40 41 41 41 41 41 42 42 42 43 43 42 40 39 37 37 36 36 39 41 42 42 42 42 42 41 39 39 39 39 40 40 39 38 38 39 40 40 40 40 40 41 42 43 43 44 44 44 43 42 42 42 43 44 44 44 44 45 45 44 43 42 42 42 42 41 41 41 40 39 40 40 40 39 39 39 38 38 38 38 37 37 37 37 36 36 35 35 36 36 37 37 37 37 36 36 36 37 36 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 33 32 31 31 31 31 32 34 34 33 33 33 32 32 32 32 31 31 31 31 31 31 32 32 32 32 31 30 30 30 30 31 31 31 31 31 30 30 31 31 31 30 30 30 30 30 31 31 31 31 31 32 32 32 32 32 32 32 33 33 33 33 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 68 68 67 67 67 68 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 57 57 57 57 58 58 58 57 56 56 55 54 55 56 55 55 55 55 54 54 55 54 53 53 52 52 53 53 52 51 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 47 46 46 46 46 47 48 49 50 51 52 53 52 52 51 51 51 51 53 54 52 52 53 52 52 51 50 50 49 49 49 50 49 48 47 47 46 46 45 45 45 45 46 47 46 45 46 46 46 46 44 45 45 45 46 47 47 47 47 47 46 46 46 45 44 44 44 43 43 43 43 44 45 45 45 46 46 46 45 45 44 44 44 44 45 45 44 44 43 43 42 42 42 43 43 42 41 40 40 40 40 40 40 40 40 40 40 41 40 40 40 41 42 42 42 43 44 43 42 42 42 41 40 39 38 37 36 35 37 37 38 40 39 38 37 38 38 37 34 32 31 31 31 31 31 32 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 32 32 32 33 35 37 39 39 40 39 38 38 39 40 39 38 38 40 41 41 41 40 38 37 36 36 37 37 36 36 37 38 38 39 40 40 39 40 41 43 43 43 43 43 44 43 42 42 43 43 42 42 41 39 40 40 40 40 40 41 42 44 44 42 42 42 41 40 38 36 36 37 39 41 41 41 41 42 42 40 38 37 37 38 38 38 38 39 40 40 41 41 41 40 40 40 41 42 43 44 44 45 44 43 43 43 44 44 44 45 45 45 45 44 43 43 42 42 43 42 41 41 40 40 40 40 40 39 39 40 40 40 39 39 39 39 39 37 37 36 35 35 36 36 36 37 37 37 36 36 36 36 35 35 36 35 35 35 34 34 35 35 35 36 36 36 35 35 35 35 35 35 35 33 31 30 31 32 32 32 32 32 32 33 32 32 32 32 32 31 31 31 31 32 32 32 32 31 30 30 30 30 31 31 31 31 31 30 30 31 31 30 30 30 30 30 30 31 30 30 31 31 31 32 32 32 32 32 32 33 33 33 33 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 68 67 67 67 67 68 67 67 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 62 62 62 62 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 56 56 55 55 55 54 55 56 56 55 55 55 55 55 55 54 54 54 54 53 53 54 53 52 52 52 52 52 52 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 47 48 49 50 52 52 53 53 52 51 51 50 51 52 52 52 52 52 52 52 51 50 49 49 49 48 48 49 49 49 48 47 47 46 45 44 45 46 46 46 45 44 44 45 45 43 43 44 44 46 46 46 46 47 46 46 46 46 45 45 45 45 44 43 43 43 44 45 45 45 45 46 46 46 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 43 44 43 42 41 42 41 40 39 37 36 36 37 38 38 38 39 39 38 37 37 36 36 35 34 32 31 31 31 31 32 32 32 32 31 31 31 31 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 35 38 40 41 40 37 37 38 39 39 38 38 39 40 41 41 40 39 38 37 36 36 39 40 38 38 39 40 39 40 41 42 41 41 42 43 43 43 44 44 44 44 44 44 43 42 41 40 41 40 39 38 39 40 41 42 43 44 44 42 40 41 41 39 37 35 36 39 40 40 39 40 40 40 39 38 37 37 37 37 37 38 38 39 40 41 42 42 42 41 41 42 42 42 44 44 45 46 45 44 44 44 44 44 44 44 45 45 45 45 44 43 42 42 42 42 42 41 41 40 40 40 41 40 40 41 41 40 40 39 39 38 38 37 37 36 35 35 36 36 36 36 37 37 37 37 36 35 34 35 36 36 35 35 35 35 35 35 36 36 36 36 36 35 35 35 35 35 35 35 34 31 30 31 31 31 31 31 32 32 32 32 32 32 32 32 31 31 31 32 32 32 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 32 32 32 33 33 33 33 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 67 67 66 66 67 67 67 67 67 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 56 56 56 55 55 55 54 55 56 56 55 55 55 56 55 54 54 55 55 54 54 54 54 53 52 52 53 53 53 52 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 47 48 49 51 51 52 53 52 51 51 50 50 51 52 52 51 51 52 53 52 51 50 49 48 47 47 49 49 49 49 48 47 46 46 45 44 44 44 44 44 43 43 43 43 43 42 42 43 44 44 45 45 46 46 46 46 45 45 45 46 45 45 44 43 42 42 44 44 44 45 46 45 45 45 45 45 45 45 45 45 45 45 44 43 44 44 43 43 43 43 43 43 42 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 42 42 41 41 42 41 39 38 36 37 38 39 39 38 39 40 39 39 39 38 36 35 35 35 33 31 31 31 31 32 32 32 32 31 31 31 31 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 35 37 39 39 39 38 36 37 39 39 38 37 38 40 41 41 41 40 39 37 36 36 37 39 40 39 38 40 41 42 41 42 42 42 43 43 43 43 43 43 44 44 45 45 44 43 41 40 39 41 41 39 38 39 41 42 42 43 43 42 42 40 40 40 38 36 35 38 40 39 38 37 38 38 37 37 37 38 39 39 39 38 39 39 40 40 41 41 42 43 43 42 43 43 44 44 44 44 45 46 45 45 45 44 43 43 43 44 44 44 44 44 43 42 41 41 42 42 42 41 40 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 37 35 35 36 36 36 36 37 38 38 37 36 35 34 34 36 37 36 35 35 35 35 35 36 36 36 36 36 36 36 35 35 35 35 35 34 33 32 32 33 32 30 31 32 32 32 32 32 32 32 32 31 31 32 31 31 32 31 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 31 31 31 32 32 32 33 33 33 33 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 67 67 67 66 66 66 66 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 56 56 56 56 56 56 55 54 55 56 56 56 56 57 56 54 54 55 55 54 54 54 54 54 53 52 53 53 53 52 52 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 49 50 51 53 52 51 51 50 49 50 52 52 50 50 51 52 51 50 49 49 48 48 47 48 48 48 48 47 46 46 45 44 43 43 43 43 42 42 42 42 43 42 42 42 42 42 42 43 44 45 46 46 46 45 44 45 45 45 45 44 43 42 42 42 43 44 45 45 45 44 45 45 45 44 44 44 45 46 45 45 44 44 43 43 44 43 43 43 43 43 42 42 41 41 40 40 40 40 40 40 39 39 39 40 41 42 42 41 41 41 41 42 41 38 37 36 39 40 41 40 40 41 40 40 39 39 39 38 38 36 35 33 32 31 31 32 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 34 35 37 38 38 38 37 36 37 39 39 38 38 39 39 39 40 40 40 40 38 36 35 36 39 40 41 40 39 41 42 43 43 42 42 43 43 42 43 43 43 43 44 44 44 44 44 44 42 40 39 40 41 40 38 38 39 40 41 42 42 41 41 41 39 38 37 35 35 36 37 36 36 36 37 36 37 39 39 39 40 40 40 40 40 39 40 41 42 42 42 43 44 44 44 44 44 44 43 44 45 45 45 45 45 44 43 43 43 43 44 43 43 44 43 43 42 41 41 42 43 43 42 42 42 42 41 40 40 39 38 38 39 39 38 38 39 39 38 37 36 36 36 36 37 37 38 38 37 36 36 35 34 36 37 36 35 34 34 35 35 36 36 37 37 36 36 36 35 35 35 35 35 35 35 35 35 34 33 32 31 31 31 31 31 31 32 32 32 32 32 32 31 31 32 31 30 30 31 31 31 31 31 32 32 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 31 31 32 32 32 32 32 33 33 33 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 67 67 66 67 66 66 66 66 67 68 67 67 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 62 62 62 61 60 60 60 60 60 60 59 59 59 59 59 59 60 60 60 59 59 59 59 58 57 56 56 56 56 56 56 54 55 56 56 57 57 57 57 56 54 54 55 55 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 51 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 50 53 53 52 52 50 49 49 50 51 50 49 50 51 51 50 49 49 49 48 47 46 47 47 46 45 44 44 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 44 45 45 45 44 43 43 42 42 42 43 44 45 45 44 45 45 45 44 44 44 45 46 45 45 45 44 43 43 43 43 42 42 42 42 42 42 42 42 41 40 40 40 40 40 39 39 39 39 40 41 42 41 41 40 41 42 41 39 37 37 39 39 39 39 40 41 40 39 39 37 38 38 37 35 34 33 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 35 36 36 36 36 36 36 36 38 40 39 38 38 40 39 38 38 39 40 38 36 35 36 39 41 40 41 41 41 43 43 43 43 42 42 41 41 42 43 44 44 44 44 44 43 42 42 43 43 41 39 39 39 38 38 38 40 41 41 42 41 40 41 40 38 36 35 35 36 37 36 37 38 38 39 39 39 39 41 41 40 41 42 42 41 40 41 42 43 42 41 42 43 43 43 44 44 44 43 44 44 44 45 45 45 44 43 43 43 43 43 44 43 43 42 42 42 42 41 42 43 43 43 43 42 42 40 40 40 39 39 38 38 38 37 37 37 38 38 37 36 35 36 37 37 38 38 38 37 37 37 35 34 35 36 36 35 34 34 34 35 36 36 37 37 37 36 36 36 36 36 36 36 35 35 34 34 33 33 33 32 31 31 31 30 30 31 32 32 32 32 32 31 30 31 31 30 30 31 31 31 32 32 32 32 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 31 31 32 32 32 32 32 33 33 33 69 69 69 69 69 68 68 68 68 67 67 67 67 67 67 67 66 66 66 66 66 66 66 67 68 68 67 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 62 62 61 61 60 60 60 60 60 60 60 59 59 59 59 59 60 60 60 60 59 60 59 58 57 57 58 57 56 56 55 54 55 56 57 57 57 57 56 55 54 54 55 55 54 54 55 55 54 53 53 53 54 53 53 52 52 53 53 52 51 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 48 51 52 51 50 50 49 48 49 50 50 49 49 50 50 50 49 48 48 47 46 46 46 45 45 44 44 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 45 44 44 44 44 44 43 44 44 44 42 42 42 43 44 44 44 44 45 45 45 44 44 44 45 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 41 41 41 40 40 40 40 39 39 39 39 40 41 42 42 41 41 40 40 41 40 38 37 38 39 39 39 40 41 40 38 37 36 36 36 35 34 33 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 36 36 37 36 35 36 37 38 39 39 38 37 38 39 39 38 38 38 38 36 35 36 38 40 40 40 41 41 42 42 43 43 41 40 41 41 42 43 43 44 44 44 44 43 42 41 40 41 42 42 40 38 38 37 38 40 41 42 41 42 40 40 40 37 36 35 36 38 39 40 39 39 41 40 40 41 39 39 41 42 42 42 43 42 41 42 42 42 42 42 42 43 43 43 43 43 44 43 43 44 44 45 46 46 45 44 44 43 43 43 43 44 43 43 43 42 43 43 42 41 42 43 43 43 43 41 40 41 40 40 40 40 40 38 37 37 37 37 37 36 35 35 36 37 37 37 38 38 38 37 36 35 34 34 35 35 35 34 34 34 35 35 36 36 37 37 36 36 36 37 36 36 36 36 35 34 34 33 33 32 32 32 32 32 31 29 30 31 31 31 32 31 30 30 31 32 31 30 31 32 32 32 32 32 32 31 31 31 31 31 32 32 32 31 30 30 30 30 30 30 30 31 31 31 31 32 32 32 32 33 33 33 69 69 69 69 68 68 68 68 68 67 67 66 66 67 67 67 67 66 66 66 66 66 66 67 67 67 68 68 68 68 67 67 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 64 64 63 63 62 62 61 61 60 60 60 60 60 60 60 60 60 60 61 60 60 61 60 60 59 59 59 58 58 57 58 58 58 56 55 55 54 55 55 57 57 57 56 55 55 55 55 55 55 54 54 55 55 54 54 53 54 54 54 53 53 53 53 53 52 51 52 52 52 52 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 48 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 48 50 51 50 49 49 48 49 51 50 48 48 49 49 48 48 48 47 47 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 44 44 44 44 44 44 45 45 45 44 43 42 41 42 43 44 43 43 44 45 45 44 44 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 41 41 41 40 40 40 40 40 39 39 39 39 39 41 42 43 42 41 40 39 40 40 38 37 38 40 40 40 41 41 40 39 37 35 35 35 34 34 34 33 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 37 37 39 38 36 36 37 38 39 38 37 37 38 39 39 38 37 36 36 35 36 38 39 39 38 40 41 41 41 42 42 42 41 41 42 43 43 43 43 44 44 43 43 42 42 41 41 40 40 40 41 39 37 37 38 40 42 41 40 40 39 39 37 35 35 36 37 39 40 40 41 41 42 42 42 42 40 40 41 42 42 43 44 44 43 42 42 42 42 43 44 44 43 43 43 43 43 44 44 45 45 45 46 46 46 45 44 44 43 43 43 43 43 44 43 43 43 43 42 41 41 42 42 42 42 42 42 42 41 40 40 40 40 39 38 38 38 37 37 37 36 36 36 36 36 36 37 37 38 37 37 36 35 34 34 34 35 35 34 34 35 35 36 36 36 36 37 37 37 36 36 36 37 37 36 35 34 34 34 33 33 32 32 32 31 30 30 30 30 30 31 31 30 30 31 31 31 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 30 30 30 30 30 30 30 30 31 31 31 32 32 32 32 32 32 33 69 69 69 69 68 68 68 68 67 67 66 66 66 66 66 66 67 66 66 66 66 66 66 66 66 67 67 68 68 68 68 67 67 66 66 66 66 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 62 62 62 62 63 63 63 64 64 64 63 63 62 61 61 61 60 60 60 60 60 60 60 60 61 62 62 62 61 60 59 59 59 58 58 58 58 57 57 56 56 55 55 55 55 55 56 57 58 57 55 56 56 56 56 55 54 55 56 56 55 55 54 54 54 54 54 54 53 53 53 52 51 52 52 52 52 51 51 52 52 52 52 51 51 51 50 49 49 49 49 50 50 49 49 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 45 45 47 50 50 49 49 48 48 50 50 48 48 48 48 48 47 47 46 45 45 45 44 44 44 44 43 43 43 43 43 44 44 44 44 44 45 44 44 45 44 43 43 43 43 42 42 42 42 41 41 42 43 44 45 45 45 46 45 44 44 44 42 42 41 42 43 43 43 43 43 43 44 44 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 42 42 41 40 40 40 40 40 39 39 38 38 39 40 42 42 42 41 40 39 39 39 38 38 40 41 41 41 42 41 39 38 37 36 34 34 34 34 35 34 34 33 32 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 38 38 37 39 39 37 37 38 38 38 37 36 37 39 39 38 37 36 35 35 35 36 38 38 38 39 40 41 40 40 42 42 40 40 41 43 43 42 42 42 43 43 43 43 41 41 42 42 41 40 40 40 40 38 37 38 40 41 40 38 37 38 37 35 35 36 37 38 38 38 39 40 41 42 42 43 43 42 41 41 42 42 44 45 44 43 42 42 41 42 43 43 43 43 43 44 44 43 44 45 45 44 45 45 45 46 45 44 44 43 42 42 43 43 44 43 43 43 42 41 41 41 41 42 42 42 43 43 42 41 40 39 39 40 40 39 38 38 37 37 37 37 37 36 36 36 36 36 37 38 38 37 37 36 35 34 34 34 34 33 33 34 35 36 36 36 36 36 37 37 36 36 35 36 36 37 36 36 35 34 34 34 33 33 32 31 31 31 31 31 30 30 30 30 30 30 30 30 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 29 29 30 30 30 31 31 31 32 32 32 32 32 32 69 69 69 68 68 68 68 68 67 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 68 68 68 68 68 67 67 66 66 66 66 66 65 65 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 61 61 61 61 62 62 62 62 63 64 64 64 63 62 61 61 61 61 61 61 60 60 60 60 61 62 62 62 61 60 59 59 59 59 59 59 59 58 57 56 56 55 55 55 56 56 56 57 58 58 57 56 56 57 56 56 55 54 55 56 56 55 55 54 54 54 55 55 54 54 53 53 52 52 52 52 52 51 51 51 52 53 53 52 52 52 51 50 50 49 50 50 51 51 50 50 50 50 50 49 49 50 50 50 50 49 49 49 48 48 48 49 48 48 48 47 47 46 46 46 46 46 46 46 45 45 45 47 49 49 48 48 47 48 49 48 47 48 48 47 46 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 42 41 41 41 41 42 43 44 44 45 45 45 44 44 43 43 41 41 42 42 42 43 43 43 44 44 44 44 43 43 42 43 43 44 44 44 44 44 43 43 43 43 43 42 41 41 40 40 40 40 39 38 38 38 38 40 41 42 42 42 41 39 38 38 38 38 40 41 41 42 42 41 40 38 38 37 35 34 35 36 37 36 36 34 32 32 32 32 32 31 31 31 31 31 31 31 31 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 38 37 38 39 39 39 38 37 37 36 36 38 39 39 37 36 35 35 35 36 37 38 38 39 39 39 40 40 41 41 41 40 40 41 41 41 41 43 43 43 43 42 41 40 40 41 40 40 40 39 40 39 38 37 39 40 40 39 38 37 36 35 35 36 37 38 39 39 39 39 39 40 41 41 43 44 43 42 41 41 42 44 44 44 43 42 42 42 43 42 42 42 43 43 43 44 43 44 44 44 44 45 45 45 45 45 45 44 43 42 42 43 44 44 43 43 42 42 42 42 41 41 41 41 42 42 42 41 41 40 39 38 38 38 38 37 36 37 36 36 38 38 36 36 37 37 36 37 37 37 38 37 36 35 34 34 33 34 33 34 34 35 35 36 36 36 36 37 37 37 36 35 35 35 36 36 37 36 34 34 33 33 34 33 32 32 32 32 32 32 31 31 30 30 29 29 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 29 29 30 30 30 30 30 31 31 32 32 32 32 32 69 69 69 68 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 68 68 68 68 68 67 67 66 66 66 66 66 65 65 64 64 63 63 63 63 63 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 61 61 61 61 62 62 63 63 64 63 62 62 62 61 61 62 61 61 61 61 61 61 62 62 61 60 59 59 59 59 59 59 59 58 58 57 57 56 55 55 56 56 56 56 57 58 58 57 57 57 57 56 55 55 55 56 56 56 55 54 54 54 54 55 55 55 54 53 53 53 53 53 52 52 51 51 51 52 53 54 53 52 52 52 51 50 50 51 52 52 51 51 51 51 51 51 50 50 51 51 51 51 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 45 45 45 45 46 47 47 47 47 48 49 47 47 48 47 46 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 46 45 45 45 45 44 44 44 43 43 42 42 41 41 41 42 42 43 43 44 44 44 44 44 43 42 41 41 41 42 42 42 43 44 44 44 44 44 44 43 42 43 43 44 44 44 44 43 43 42 42 42 42 41 41 41 40 40 40 39 38 38 38 38 39 41 41 42 42 41 40 39 38 38 38 39 40 40 41 41 40 40 40 39 37 36 36 37 38 38 37 37 34 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 36 37 39 40 39 38 37 36 36 38 39 39 38 36 34 34 35 37 38 38 37 38 38 38 38 40 41 42 42 40 40 40 40 41 42 43 43 43 44 43 42 40 40 40 40 39 39 38 39 39 38 37 37 40 40 39 37 36 35 35 35 37 39 39 40 40 41 42 40 39 40 41 42 43 44 44 43 44 43 42 43 43 43 43 42 42 43 42 41 41 43 44 43 43 43 44 44 45 45 45 45 44 44 45 45 45 44 43 42 42 43 43 43 44 44 43 42 43 42 41 41 40 40 41 41 41 41 41 40 39 39 38 38 37 36 37 37 36 37 38 38 37 37 38 37 36 36 36 37 38 37 37 36 35 34 33 34 34 34 35 35 35 35 36 36 36 36 37 37 37 36 36 36 35 35 36 35 34 34 34 34 34 33 32 32 33 33 32 32 32 32 32 31 30 29 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 29 29 30 30 30 30 30 31 31 31 32 32 32 32 69 69 69 69 69 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 66 66 67 67 68 68 68 68 68 67 66 66 66 66 66 66 65 65 64 64 63 63 63 64 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 62 62 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 62 62 61 60 60 60 59 59 60 59 59 58 57 56 56 56 56 56 56 56 57 58 59 59 58 58 58 58 57 56 55 55 56 56 56 55 55 54 54 54 54 55 56 55 54 53 53 54 54 54 53 52 52 51 51 52 53 54 53 53 53 52 52 51 50 52 53 53 52 52 52 52 52 51 50 50 51 51 52 52 51 51 51 51 50 49 49 50 49 49 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 46 46 46 48 49 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 47 46 47 47 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 42 42 41 41 41 41 41 42 43 43 43 43 43 43 43 42 41 41 41 41 42 43 44 44 44 44 44 44 43 43 42 43 43 44 44 44 43 43 42 42 41 42 41 40 40 39 39 40 40 38 38 38 38 39 40 41 42 42 41 40 39 39 38 38 39 39 40 40 41 40 39 38 38 37 37 38 39 39 39 38 37 34 32 32 32 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 35 36 37 38 39 38 39 38 36 36 36 38 39 38 37 35 34 34 35 37 37 36 36 36 37 37 38 40 41 42 41 39 39 40 41 42 42 43 43 43 42 42 41 40 39 39 39 38 38 38 40 39 37 36 38 39 38 37 36 35 35 36 37 38 39 41 42 41 42 43 41 39 39 41 42 42 44 45 45 45 44 43 43 43 43 42 41 41 42 41 41 43 44 45 44 44 44 44 45 45 45 44 44 43 44 44 44 44 44 43 42 42 43 43 43 44 44 44 43 43 43 42 41 40 40 41 41 41 41 40 40 40 40 40 39 38 38 38 37 36 36 37 37 37 38 38 37 36 36 36 37 37 37 37 36 35 34 33 33 34 34 35 35 35 35 35 35 35 36 37 38 37 37 37 37 36 34 34 35 35 35 35 35 35 34 33 33 33 33 33 33 32 32 32 32 31 29 29 30 32 32 32 32 33 32 32 32 32 32 32 32 32 31 31 30 30 30 30 30 29 29 29 29 30 30 30 30 30 31 32 32 32 32 69 70 70 70 69 69 68 68 68 68 68 67 67 67 66 66 65 65 65 66 66 65 65 65 66 66 66 67 68 68 68 68 68 67 67 66 66 66 66 66 66 65 65 65 64 64 64 65 65 65 65 65 65 65 65 65 64 63 63 63 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 60 59 59 60 60 60 60 60 61 61 62 63 62 62 62 62 62 63 62 62 62 62 62 61 62 62 62 61 61 60 60 60 60 60 59 59 58 58 57 56 56 56 56 57 57 57 59 59 59 58 58 58 58 57 56 56 55 56 56 56 55 54 54 55 55 55 55 55 55 54 54 54 54 55 54 54 53 52 53 53 52 53 54 54 53 53 52 52 51 50 52 53 53 53 53 52 52 52 51 50 51 51 52 52 52 52 52 51 51 50 49 50 50 49 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 46 47 46 45 45 45 45 45 45 45 45 45 46 46 46 45 46 47 48 48 48 48 48 47 47 47 47 46 47 47 47 46 46 46 46 46 45 45 44 44 43 43 42 42 41 41 41 41 41 41 42 42 42 43 43 43 43 42 41 41 41 42 42 43 43 43 43 44 44 43 43 42 42 43 44 44 44 43 43 43 43 42 42 42 42 41 40 39 40 40 39 38 38 38 39 40 41 42 41 41 40 40 40 39 39 40 39 40 40 41 40 38 37 37 37 37 38 39 40 40 39 38 36 33 32 32 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 36 37 39 39 38 37 36 35 36 37 38 38 37 36 34 34 35 35 36 36 36 36 37 37 38 40 41 41 41 40 39 39 41 42 41 41 41 42 42 40 40 40 40 38 38 38 37 37 38 39 37 35 35 36 37 36 35 35 35 36 37 39 39 40 41 41 41 41 43 43 42 41 41 42 42 44 45 45 44 44 43 42 42 43 42 40 40 41 41 43 44 44 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 42 42 42 43 44 43 43 43 44 44 43 43 42 42 42 41 41 40 40 41 40 39 40 40 41 40 39 39 40 39 38 37 35 36 37 37 37 37 37 36 36 36 36 36 37 37 36 35 34 34 33 33 34 34 35 35 35 34 34 35 36 36 37 37 38 37 37 37 35 34 34 34 34 34 35 35 35 34 34 33 33 33 33 32 32 32 32 31 30 29 30 31 32 32 32 33 33 33 33 32 32 32 32 32 31 31 30 30 30 30 30 29 29 29 29 30 30 30 30 30 31 31 32 32 33 70 70 70 70 70 69 69 68 68 68 68 68 67 67 67 66 65 65 65 65 65 65 65 65 66 66 66 67 68 68 68 68 68 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 61 62 62 62 61 61 61 62 63 63 63 63 63 62 62 63 63 63 62 62 61 61 62 61 60 60 59 59 58 58 57 57 57 57 57 57 57 58 59 59 59 58 58 58 57 56 56 56 56 57 56 55 55 55 56 57 56 56 55 55 55 55 54 54 55 54 53 53 53 53 54 54 54 55 54 53 52 52 52 51 50 51 53 53 53 53 53 53 52 52 51 51 52 52 53 52 52 52 51 51 50 50 50 50 49 49 49 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 47 47 47 46 46 48 49 49 49 49 48 47 47 48 47 47 48 48 48 47 47 46 46 47 46 45 45 44 43 43 43 42 42 42 41 41 41 41 41 41 42 42 42 42 43 42 41 41 41 41 42 42 42 42 43 43 43 43 43 42 42 43 43 44 44 43 42 42 42 42 42 42 42 41 40 39 39 40 39 38 38 38 39 40 42 42 41 41 41 41 40 40 40 40 40 40 41 41 40 39 38 38 39 38 38 39 40 41 40 39 36 33 32 32 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 38 39 39 39 37 35 34 35 37 37 38 36 34 34 35 36 37 37 38 37 37 38 39 40 41 42 42 40 39 39 41 41 40 41 42 42 41 41 40 39 39 39 38 37 37 36 36 36 35 35 34 34 34 34 35 36 36 37 37 36 38 39 39 40 40 40 40 41 43 43 41 42 43 43 43 44 45 44 44 43 41 41 42 42 40 40 41 42 43 43 44 45 45 45 45 46 45 44 45 44 44 43 42 42 42 42 42 42 43 44 44 43 43 44 44 44 44 43 42 43 42 41 41 41 40 40 40 39 38 39 40 40 40 39 40 39 38 38 37 36 36 36 36 36 36 35 36 37 36 36 36 36 36 36 36 35 34 33 34 34 34 34 34 34 34 35 35 36 37 37 38 38 38 37 36 35 34 34 33 34 35 35 35 34 34 33 33 33 33 32 32 32 32 32 31 30 29 30 31 32 32 33 33 33 33 32 32 32 32 32 32 31 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 31 32 32 33 70 70 70 70 70 69 69 68 68 68 68 68 68 67 67 66 65 65 65 65 65 65 65 65 66 66 66 67 68 68 68 68 68 68 68 67 67 67 67 67 66 66 65 65 65 65 66 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 60 61 61 62 61 61 61 62 62 63 63 63 63 63 63 63 63 63 63 63 63 63 63 61 61 60 59 59 59 58 57 57 58 58 58 58 58 59 60 60 60 60 59 59 58 58 57 57 57 57 56 56 56 56 57 57 56 56 56 55 55 55 55 55 55 54 54 54 54 54 55 55 55 55 54 53 52 52 52 51 50 52 53 53 53 52 52 53 53 52 52 52 52 53 53 53 52 52 52 51 50 51 51 50 50 49 49 49 48 48 47 46 46 47 47 47 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 47 47 48 49 49 48 47 48 49 49 49 49 48 47 48 49 48 47 48 48 48 47 47 46 46 46 46 46 45 45 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 42 42 41 41 41 40 40 41 41 41 42 42 43 43 43 43 43 42 42 43 44 44 43 41 41 41 41 40 40 40 40 40 39 39 39 38 38 38 38 39 40 42 42 41 40 40 40 40 40 41 41 41 41 41 41 41 39 38 38 40 39 40 40 40 40 39 38 36 33 32 32 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 38 38 38 39 40 39 38 37 35 34 34 36 36 35 34 34 35 36 37 38 39 39 39 39 39 40 41 42 42 40 39 40 41 42 41 41 42 43 43 42 40 40 39 38 39 38 37 36 35 34 34 34 34 34 34 35 36 36 37 38 38 38 38 37 37 38 39 40 41 41 41 42 42 42 43 44 43 44 45 45 45 44 43 42 42 41 41 40 41 42 42 42 43 44 45 45 45 44 44 44 44 44 44 43 43 42 41 41 41 42 43 44 45 45 44 44 44 44 44 44 44 43 43 42 42 41 41 40 40 41 40 38 38 39 40 40 40 40 39 37 37 37 37 36 36 36 35 35 35 36 37 37 36 35 35 36 37 36 35 34 34 34 33 33 34 34 34 34 34 35 35 37 37 38 38 38 37 37 36 35 34 33 33 34 34 34 34 33 33 33 33 33 33 32 32 32 32 32 30 29 30 31 32 32 32 33 33 33 32 32 32 32 32 32 31 31 30 30 30 30 29 29 29 30 30 30 30 30 30 30 31 32 32 33 70 70 70 69 69 69 69 68 68 68 68 68 68 67 67 66 65 65 65 65 65 65 65 65 65 66 66 67 67 68 68 68 68 68 68 68 68 68 67 67 66 66 65 65 65 65 66 66 67 66 66 66 65 66 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 61 60 60 60 60 59 59 59 59 59 59 59 59 60 60 61 61 61 61 61 61 62 62 63 62 61 62 63 63 63 63 63 63 63 63 62 61 61 60 59 59 58 58 58 58 58 58 58 59 59 60 60 60 59 60 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 56 56 55 55 55 54 54 54 54 55 55 55 55 54 53 52 53 52 51 51 51 52 52 52 52 52 52 52 52 53 52 52 53 53 53 53 52 52 51 51 51 51 51 50 50 49 49 49 48 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 47 47 48 49 50 49 49 48 47 48 50 50 49 49 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 46 45 45 44 44 44 44 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 42 42 42 42 43 43 42 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 39 40 41 42 41 40 40 40 40 40 41 41 41 41 41 41 41 40 38 39 40 40 41 40 40 40 39 38 36 33 32 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 38 39 39 39 39 39 38 37 37 36 34 33 34 33 34 35 37 37 38 40 39 39 40 41 42 42 41 40 40 39 40 42 42 41 40 41 42 43 42 42 39 38 38 37 37 36 35 34 34 34 34 34 36 36 37 37 38 38 38 39 39 40 40 38 37 38 38 38 40 42 41 41 42 43 44 45 44 45 46 45 45 45 44 43 43 41 40 41 41 43 44 44 44 44 45 44 44 43 43 43 44 44 45 44 43 42 41 41 41 42 43 44 44 45 45 45 45 45 45 45 44 44 43 43 44 43 42 41 41 40 40 39 39 39 39 39 40 40 39 38 37 36 35 36 37 36 35 35 35 35 36 36 36 35 35 36 37 36 36 35 35 34 33 33 33 33 33 34 35 36 36 36 37 37 37 37 37 37 36 36 35 34 33 34 34 33 33 33 33 33 32 33 33 32 32 32 32 31 30 29 29 30 31 32 32 33 32 32 32 32 32 32 32 32 32 31 30 30 30 30 29 29 29 30 30 30 30 30 30 30 31 31 31 32 70 70 70 69 69 69 69 69 69 68 68 68 68 67 67 66 65 65 65 65 65 65 65 65 65 66 66 67 67 67 67 68 68 68 68 68 68 68 67 67 66 66 65 65 65 65 65 66 66 67 67 66 66 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 58 59 59 60 60 60 61 61 61 61 62 62 62 61 61 62 62 62 63 62 62 61 61 61 61 60 59 59 59 58 58 58 59 58 58 59 59 59 60 60 59 58 58 58 58 58 57 58 59 59 59 59 58 58 58 58 58 58 57 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 55 54 54 53 53 53 52 51 51 51 52 52 52 52 51 51 52 52 52 52 52 53 53 53 52 52 52 51 51 51 51 50 50 49 49 49 48 48 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 46 46 47 47 48 49 51 51 51 49 48 47 48 49 51 50 49 48 47 47 47 47 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 40 40 41 41 41 42 42 42 42 43 43 43 42 42 42 43 43 43 42 42 41 41 42 42 41 41 40 40 39 38 38 38 38 38 40 41 42 42 42 41 41 40 40 41 41 40 40 41 41 41 40 39 39 40 41 41 40 39 39 39 37 36 33 32 32 32 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 36 38 39 39 38 38 39 38 38 37 35 33 32 33 34 34 35 37 37 38 39 38 38 40 41 42 41 40 39 38 40 42 42 41 40 40 41 41 41 41 41 40 38 38 37 36 34 34 34 34 35 35 36 38 38 39 39 39 39 40 41 41 41 41 40 38 39 39 39 39 40 40 41 42 43 44 44 43 44 45 45 45 44 43 43 43 41 40 41 42 43 44 44 43 44 45 44 43 43 44 44 44 44 45 44 43 41 41 41 42 43 43 43 44 45 45 46 45 45 45 44 44 44 44 44 44 43 43 42 41 40 40 40 40 40 38 38 38 39 39 39 37 36 36 37 38 37 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 35 34 33 33 33 33 35 36 37 37 37 37 37 37 36 36 37 36 36 35 34 33 34 34 34 34 33 33 32 32 32 32 32 32 32 32 31 31 30 29 29 30 31 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 31 69 69 69 69 69 69 69 69 69 69 69 69 68 68 67 67 66 65 65 65 65 65 65 65 65 65 66 66 66 66 67 67 68 68 68 68 68 68 67 67 66 65 65 65 65 65 65 65 66 66 66 67 66 66 66 65 65 65 64 64 63 63 63 63 63 64 64 64 64 63 62 62 62 62 62 61 61 60 60 60 59 59 59 59 58 58 58 59 59 60 60 61 61 60 60 61 62 61 60 60 61 62 62 61 60 60 60 60 60 60 59 59 59 58 58 59 60 60 59 60 60 60 59 59 59 58 58 58 58 57 56 56 58 58 58 59 59 58 58 58 58 58 57 56 55 55 55 55 54 54 54 54 54 53 53 53 53 54 54 54 54 53 53 53 52 51 51 51 52 52 52 52 51 51 51 51 51 51 52 52 53 53 52 52 52 52 52 52 51 51 50 50 50 49 48 48 48 47 47 47 47 47 46 46 46 45 45 45 45 45 46 46 46 45 45 46 47 47 48 49 50 51 52 51 50 49 48 48 49 50 50 49 48 48 48 48 47 47 47 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 43 45 45 46 45 44 43 43 41 41 41 41 41 41 40 40 41 41 42 43 43 43 43 43 43 42 41 42 42 42 42 43 43 42 42 41 41 41 41 40 40 39 38 38 38 38 38 40 41 42 43 43 42 41 40 40 40 40 39 40 40 41 41 41 40 40 40 41 41 40 39 38 38 36 35 34 32 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 37 39 41 40 39 38 37 37 36 34 33 32 33 34 35 36 36 37 36 37 38 38 39 40 41 41 41 40 38 38 40 42 41 40 39 41 41 40 39 39 40 40 39 37 36 34 33 34 35 36 37 38 38 39 39 40 40 39 40 41 42 43 42 42 41 40 39 40 41 41 41 41 42 42 43 43 43 43 44 44 45 44 44 43 42 41 40 40 41 43 44 44 44 43 43 43 43 43 44 44 44 45 44 43 43 42 41 41 41 41 42 43 43 44 44 45 46 45 45 44 44 43 43 44 44 43 43 43 43 42 42 41 40 39 38 39 39 38 37 38 38 38 38 38 38 39 38 36 35 35 35 35 35 35 34 34 35 35 36 35 35 36 35 34 33 33 33 34 35 36 36 37 37 37 36 35 35 36 36 35 35 35 34 34 34 35 35 34 33 33 33 32 32 32 32 32 32 32 32 31 30 29 29 30 31 32 32 32 32 31 31 31 31 31 32 32 31 31 30 30 30 29 29 30 30 30 30 30 30 30 29 29 29 29 30 69 69 69 68 68 68 68 69 69 69 69 69 69 68 67 67 66 66 65 65 65 64 64 65 65 65 65 65 66 66 66 67 67 68 68 68 68 67 67 67 66 65 65 65 65 65 65 65 66 66 66 67 67 66 65 65 65 65 64 64 63 63 63 63 64 65 65 65 64 63 63 62 62 62 61 61 61 61 61 60 60 59 59 59 58 58 58 58 58 59 59 60 60 60 60 60 61 61 60 60 60 61 61 62 61 59 59 59 60 60 60 60 59 59 59 60 61 61 60 60 60 59 59 59 59 59 59 58 58 57 56 56 57 57 58 58 58 58 58 58 57 57 56 56 56 56 56 55 55 54 54 54 53 53 53 52 52 53 52 52 53 52 52 52 52 51 51 51 51 52 52 52 52 52 51 51 51 51 51 52 52 52 53 52 52 52 52 52 52 51 51 50 50 49 49 49 48 48 48 47 47 47 47 46 46 45 45 45 45 46 46 46 46 46 46 46 47 48 48 49 50 52 52 51 50 49 48 48 49 49 50 50 49 49 49 48 47 47 47 47 47 46 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 44 45 46 45 44 45 45 44 42 40 40 40 40 40 40 40 41 42 42 42 43 44 43 43 42 41 42 42 42 42 43 43 42 41 41 40 40 40 40 40 39 38 38 38 38 38 40 42 43 42 42 41 41 40 40 39 40 40 40 41 41 41 41 41 41 41 41 40 39 38 37 37 37 36 33 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 38 39 40 39 39 39 37 36 34 32 32 33 34 35 36 37 38 38 37 36 37 38 39 39 40 42 41 40 38 38 40 41 40 39 39 42 42 40 39 39 38 38 38 36 34 33 33 35 37 38 39 40 40 39 40 41 41 41 42 41 42 43 43 43 42 41 40 40 42 43 43 43 42 42 42 43 43 43 44 44 44 44 43 43 42 41 40 41 42 43 44 45 44 43 42 42 42 42 44 44 44 44 43 43 43 42 41 41 42 42 42 42 43 44 44 45 46 46 45 44 44 43 43 43 44 44 43 43 43 43 43 42 41 39 39 40 40 39 38 37 37 38 39 40 39 38 37 37 37 36 36 35 35 35 34 34 34 34 35 35 35 35 35 34 34 34 33 34 35 35 36 36 37 37 36 35 35 35 34 34 34 34 34 34 35 35 35 35 34 33 33 33 32 32 32 32 32 32 32 31 30 29 29 29 31 32 32 32 31 31 30 30 31 31 31 31 31 30 30 30 30 29 29 29 30 31 31 31 30 30 30 29 29 29 30 69 69 69 68 68 68 68 68 69 69 68 68 68 68 67 67 67 66 66 65 65 64 64 64 64 64 65 65 65 66 66 66 67 67 67 67 68 67 67 67 66 66 65 65 65 65 65 65 65 65 65 66 66 66 65 65 65 65 64 64 64 64 64 64 65 65 65 64 64 63 63 62 62 61 61 61 61 61 60 60 60 60 60 59 59 58 58 58 58 58 58 58 59 59 59 59 60 61 60 60 60 60 60 62 61 59 59 59 60 60 60 60 60 60 60 60 61 61 61 60 60 60 60 59 59 59 58 58 57 57 57 57 56 56 57 57 57 58 58 58 58 57 57 56 56 56 55 55 55 55 54 54 53 53 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 51 51 51 51 52 52 52 51 51 51 52 52 51 51 50 50 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 47 47 47 47 48 48 49 50 51 52 52 51 50 49 48 49 49 49 50 49 49 49 49 48 48 47 48 48 47 47 47 47 47 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 44 44 43 41 40 40 40 40 40 40 41 42 43 43 43 44 44 43 43 42 41 42 42 43 43 43 42 42 41 40 40 40 40 40 39 38 38 38 38 38 40 41 42 42 41 41 40 40 39 39 40 41 41 41 41 41 41 42 42 41 40 40 39 38 37 37 38 35 33 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 31 31 31 31 31 32 32 32 32 32 32 36 37 38 39 38 37 38 38 36 35 33 32 33 34 35 37 37 37 38 39 38 38 38 38 38 39 41 41 40 40 38 39 40 39 39 40 41 42 42 40 40 39 37 37 36 34 33 33 34 36 38 38 38 40 41 40 41 42 42 42 41 41 42 43 44 44 43 41 41 42 42 43 43 42 41 41 42 43 43 44 44 43 43 43 43 42 42 41 40 41 43 43 45 45 44 43 42 42 43 43 44 44 43 43 43 43 42 41 41 42 43 43 43 43 42 43 44 44 45 46 46 45 44 44 44 43 43 43 43 43 42 42 42 43 42 40 40 40 40 40 39 38 38 37 38 39 39 38 38 37 37 37 37 36 36 35 35 35 34 33 33 34 34 34 34 33 34 34 34 34 35 35 35 35 36 36 35 35 35 34 34 34 34 34 34 34 34 35 35 35 34 33 32 33 33 32 32 32 31 31 31 31 30 30 29 29 30 32 32 31 31 31 30 30 30 30 31 31 31 30 30 30 30 30 29 29 30 30 30 30 30 30 30 29 29 29 29 69 69 69 68 68 68 68 68 68 68 68 68 68 67 67 67 67 66 66 66 66 65 65 65 64 64 64 64 65 66 66 66 66 66 66 67 68 67 67 67 66 65 65 65 65 65 65 65 65 65 65 65 65 66 66 65 65 65 65 65 65 65 65 65 65 66 65 65 64 64 64 63 62 62 61 60 60 60 60 60 60 60 60 60 59 58 58 59 58 58 57 57 57 58 58 58 59 60 60 60 60 59 60 61 61 59 58 59 59 59 59 59 59 61 61 61 62 61 61 61 61 61 60 60 59 59 58 58 58 58 58 57 56 56 56 56 57 57 57 58 58 58 57 57 56 55 55 55 55 54 54 53 53 53 54 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 51 50 50 51 51 51 51 51 51 51 51 51 51 50 49 49 49 49 49 48 48 47 47 48 47 46 46 47 47 47 48 48 48 49 49 48 48 48 49 50 51 51 52 52 50 49 49 49 49 49 50 50 49 50 50 49 49 48 48 49 49 49 48 48 47 47 46 45 45 45 45 45 45 44 45 45 45 45 45 44 44 43 43 42 42 43 43 43 42 41 40 40 40 40 40 41 43 44 43 43 44 44 43 43 42 41 42 43 43 43 43 43 42 42 41 41 41 40 40 39 38 38 38 38 38 40 41 42 41 41 41 40 40 39 39 40 41 41 41 41 41 41 41 41 40 40 39 38 38 37 37 37 34 32 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 31 31 31 31 31 31 31 32 32 32 32 33 35 37 38 39 38 37 36 36 34 33 32 33 34 36 37 39 39 39 39 40 40 40 39 38 38 40 41 41 40 39 38 39 39 39 41 42 43 43 42 41 40 39 37 35 34 33 33 34 36 38 39 40 40 41 42 42 42 42 41 41 41 42 43 44 44 44 43 42 42 42 42 42 42 41 41 42 43 43 43 43 43 42 41 42 42 42 40 40 40 41 42 43 44 44 43 42 41 42 43 44 44 43 43 42 42 42 41 41 41 42 42 43 43 44 43 43 43 43 44 46 46 45 44 44 44 43 42 42 43 43 43 42 42 42 42 42 42 41 40 41 40 40 40 38 37 38 39 39 39 38 37 37 37 37 37 36 36 36 35 34 33 33 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 34 33 32 33 33 33 32 32 31 30 31 31 31 30 29 29 30 31 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 29 29 29 69 69 69 68 68 68 68 68 68 68 68 68 67 67 67 67 66 66 66 67 67 66 66 66 65 64 64 64 64 65 66 66 66 66 66 66 67 67 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 65 65 65 66 65 65 64 64 65 65 64 63 62 62 61 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 57 57 57 57 57 58 59 59 59 59 60 61 61 60 58 58 58 58 58 58 59 60 61 62 62 62 61 61 61 60 60 61 61 60 60 60 60 60 59 58 57 56 55 55 56 56 57 58 58 58 58 57 56 56 55 55 55 54 53 54 54 55 55 54 54 53 53 53 52 52 53 53 52 52 52 52 52 52 51 51 51 50 50 50 51 52 52 52 51 50 50 51 50 50 51 51 51 51 51 51 50 50 50 50 49 49 48 47 47 46 47 46 46 47 48 48 48 49 49 49 50 50 49 48 49 50 50 51 52 52 52 51 50 50 50 49 49 49 49 49 50 50 50 49 49 49 49 49 49 48 47 47 47 46 46 45 45 46 46 45 44 44 44 44 45 45 45 45 44 43 43 43 42 42 42 42 41 40 40 40 40 40 41 43 45 44 44 43 43 44 43 42 41 41 42 42 42 42 42 42 42 42 41 41 40 40 39 38 38 38 38 38 39 41 41 41 41 41 41 40 39 40 41 40 40 40 41 41 41 41 40 39 40 39 37 37 37 37 37 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 33 35 36 37 39 39 38 36 35 33 32 32 34 35 36 37 38 39 40 41 41 40 40 41 41 39 40 41 42 41 39 37 37 40 41 42 42 42 42 42 41 40 39 38 36 34 33 33 33 36 38 40 41 42 42 42 42 43 43 40 39 40 41 42 42 42 44 44 43 43 43 43 42 41 41 41 41 42 43 42 41 42 41 40 40 40 40 40 40 40 41 41 41 42 42 42 41 41 41 42 43 42 42 42 41 41 41 41 41 41 41 41 42 43 44 44 44 43 43 44 44 45 45 45 44 44 44 43 42 42 42 43 43 43 42 42 43 43 43 42 41 41 40 40 40 40 38 37 38 39 40 39 38 37 36 36 36 36 36 36 36 35 35 34 34 33 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 33 33 33 32 32 31 30 30 30 30 30 30 29 29 29 30 31 31 30 29 29 29 29 29 29 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 69 69 69 68 68 68 68 68 68 68 67 67 67 67 67 66 66 66 66 66 66 66 67 66 66 65 64 64 64 64 65 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 63 64 65 65 64 63 62 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 58 57 57 57 57 57 57 58 58 59 60 60 61 61 59 58 57 57 57 58 59 60 61 62 62 61 61 61 61 61 62 62 60 60 60 60 60 60 59 58 58 57 56 55 55 55 56 58 58 58 58 57 57 56 55 55 55 54 54 55 55 55 54 54 54 54 53 53 53 54 54 53 53 53 53 53 53 52 52 52 51 50 50 50 50 50 51 51 51 50 49 49 49 50 50 50 50 50 51 51 51 50 49 49 49 48 47 47 47 47 47 48 47 48 49 49 49 49 50 50 50 50 49 48 49 50 50 51 52 52 52 52 52 51 50 50 49 49 48 49 50 50 50 50 50 49 49 49 49 48 47 47 47 47 46 46 46 45 45 45 45 44 43 44 45 45 46 45 44 44 44 43 43 43 42 42 41 41 40 40 40 40 40 42 45 45 43 43 43 44 43 43 42 41 41 42 42 41 42 42 41 42 41 41 41 40 39 38 38 38 38 38 39 40 41 41 42 41 40 40 39 39 40 40 40 40 41 41 41 41 39 38 39 38 37 36 36 38 38 35 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 31 31 31 31 31 31 31 31 31 31 32 35 37 38 38 38 38 36 35 33 32 32 33 35 37 38 38 38 39 41 41 40 40 41 41 41 41 42 42 42 41 40 37 38 41 42 42 41 41 40 41 40 37 37 37 35 33 33 33 34 37 39 40 41 41 41 41 41 42 41 39 39 41 41 41 40 41 43 44 44 43 43 43 42 41 40 41 41 42 42 41 40 39 39 40 40 40 40 40 40 41 42 42 41 41 42 41 41 42 42 43 42 41 41 41 41 40 41 42 43 43 42 42 43 44 44 44 44 44 43 43 44 44 44 45 45 44 44 44 43 41 41 42 42 42 41 41 42 43 43 43 42 41 40 39 39 39 39 38 37 37 39 40 39 38 38 37 36 36 35 35 36 35 35 34 34 33 33 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 31 31 30 30 30 30 29 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 29 29 29 29 28 28 29 29 29 29 29 29 69 69 69 68 68 68 68 68 68 67 67 67 67 67 67 66 66 66 66 66 66 66 67 67 66 66 65 65 64 63 64 65 65 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 64 64 64 65 66 66 66 66 65 65 65 65 65 65 66 65 65 65 64 64 63 64 64 64 63 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 58 58 58 58 57 57 57 57 57 58 59 59 59 59 59 58 57 57 57 57 58 59 61 61 62 62 61 61 61 61 61 61 60 59 59 58 59 59 59 58 58 58 57 56 55 54 55 57 57 58 58 57 56 56 55 55 54 54 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 50 50 50 51 51 50 49 48 48 47 47 48 48 49 50 49 48 49 50 50 49 49 50 51 51 51 50 48 48 50 51 51 51 52 52 52 51 50 50 50 49 49 48 48 49 49 50 50 50 50 49 49 49 49 48 47 47 47 46 46 46 45 44 44 44 44 44 44 45 45 46 45 45 44 44 44 44 43 43 42 41 41 40 40 40 40 40 42 44 44 43 43 44 44 43 43 43 42 41 41 41 41 42 41 41 41 41 40 40 39 38 38 38 38 38 38 39 41 41 41 41 41 40 39 39 39 39 40 41 41 41 41 40 40 40 38 37 37 38 36 35 38 39 35 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 31 31 31 31 31 31 31 31 31 31 31 31 34 36 37 38 37 37 37 35 34 33 32 34 36 36 36 39 40 39 40 41 40 40 42 42 43 43 43 43 41 40 41 39 37 38 40 41 40 40 40 40 41 40 38 37 35 34 33 33 34 35 37 39 40 40 40 41 41 41 41 40 39 39 41 41 40 41 42 43 44 44 43 42 42 42 41 40 40 41 41 42 41 39 39 40 41 42 42 42 43 42 42 42 42 41 41 41 41 42 43 43 43 41 40 40 41 42 42 43 44 44 44 44 44 44 43 44 44 44 44 43 42 43 43 43 44 45 45 44 44 43 42 42 41 42 41 41 42 43 43 43 43 41 40 40 39 39 39 39 40 38 37 37 38 38 39 39 38 37 37 35 35 35 35 34 34 34 33 33 33 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 32 31 31 31 30 30 30 30 30 30 30 30 29 29 29 29 29 28 28 29 29 29 29 28 28 28 28 28 29 29 29 30 29 29 28 28 28 28 28 28 28 28 28 29 70 70 69 69 68 68 68 68 68 67 66 66 66 66 66 66 66 65 65 65 65 66 66 67 67 66 66 65 64 63 63 64 65 66 66 66 66 67 66 66 66 66 66 66 66 66 65 65 65 64 63 64 65 65 65 65 65 65 65 65 65 65 65 66 66 66 65 65 64 63 63 63 64 63 63 63 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 56 57 57 58 57 57 58 58 57 57 57 57 58 59 60 61 62 62 61 61 61 60 59 59 59 59 58 57 58 59 59 59 58 58 58 57 56 54 54 55 56 57 58 57 56 56 56 55 55 55 56 55 55 55 56 55 55 55 55 55 54 53 53 53 53 53 53 53 54 53 53 52 52 52 52 51 51 51 50 49 49 49 49 49 48 48 49 49 49 49 50 50 50 50 49 48 47 47 48 49 49 49 50 50 49 49 50 50 50 50 50 50 50 50 50 49 48 49 51 51 50 51 52 52 51 51 50 50 49 49 49 48 48 49 49 50 50 49 49 48 48 48 48 47 46 46 46 46 46 45 45 44 44 43 43 43 44 45 45 46 45 44 43 43 44 44 43 43 42 41 41 40 40 40 41 42 44 44 43 43 43 43 42 43 43 42 41 41 41 41 41 41 41 41 40 40 39 39 38 38 38 37 37 38 39 40 41 41 41 41 40 39 39 39 40 41 41 41 41 41 40 39 39 39 36 36 36 36 35 36 37 34 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 31 31 31 31 31 31 31 31 31 31 31 32 35 37 36 36 36 37 37 34 33 33 34 37 39 37 36 38 40 41 40 39 40 42 43 44 44 44 44 43 42 41 40 38 37 39 41 41 40 39 39 40 41 40 39 37 34 33 33 33 34 36 37 39 40 39 40 40 40 40 39 39 39 40 40 41 42 43 43 43 44 44 44 43 41 41 41 40 40 40 41 41 40 39 39 41 42 43 43 43 44 43 42 42 41 41 41 41 41 42 42 43 42 40 39 40 41 42 43 43 43 44 44 44 44 44 43 43 43 44 44 44 43 42 42 42 43 45 45 45 44 43 43 42 41 41 41 41 42 42 43 43 43 41 40 40 40 40 40 41 40 39 38 38 37 37 38 39 38 38 37 36 35 36 36 35 35 34 34 34 34 33 33 33 33 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 32 32 32 31 31 30 31 31 31 30 30 30 30 30 29 29 29 29 29 30 29 29 29 29 28 28 28 28 29 29 29 29 29 28 28 28 28 28 28 28 28 28 28 72 71 71 69 69 68 68 68 68 67 67 66 66 66 66 66 66 65 65 65 65 65 66 67 67 67 66 65 65 64 63 63 64 65 66 66 67 66 66 66 66 67 66 66 66 66 65 65 65 64 63 63 65 65 65 65 65 65 65 65 64 64 65 65 66 66 66 65 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 58 57 57 57 56 56 57 57 57 57 57 57 57 58 59 60 60 60 60 61 61 60 60 59 59 59 59 59 58 57 57 57 58 59 59 59 58 58 57 55 54 54 55 56 57 58 57 57 56 55 55 55 56 56 56 56 55 55 55 55 55 55 54 53 53 53 53 52 52 53 53 53 53 53 53 52 52 52 52 51 51 51 50 50 49 48 48 48 48 48 48 48 49 49 50 49 48 48 47 47 49 50 50 50 50 50 50 50 51 51 51 51 50 50 49 50 50 49 49 49 50 50 50 51 52 52 52 51 51 51 50 50 49 48 48 48 48 49 50 49 48 48 48 48 48 47 46 46 45 45 45 45 45 45 44 44 43 43 43 44 45 46 45 44 43 43 43 43 43 43 42 41 40 40 40 40 41 42 44 44 43 42 42 42 42 42 43 43 42 40 40 41 41 40 40 40 40 39 39 38 38 38 38 37 37 38 39 40 41 41 40 40 40 39 39 40 40 41 41 41 41 41 40 38 38 37 36 35 35 35 35 34 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 34 37 38 37 36 36 36 35 33 32 33 36 38 39 37 36 38 40 40 38 38 39 42 43 43 44 44 44 43 43 42 39 38 38 40 41 42 41 39 38 40 40 39 38 35 33 33 33 34 36 36 37 38 38 38 38 38 37 38 38 38 39 41 41 42 43 43 43 43 43 44 44 44 42 41 42 42 40 39 40 40 39 39 40 40 41 42 42 43 44 43 43 42 42 41 41 41 40 42 42 43 42 40 39 41 42 43 43 42 42 43 44 44 44 43 43 42 42 43 44 44 44 42 41 42 43 44 44 45 45 44 43 43 42 42 41 41 41 42 42 41 42 41 41 40 41 40 41 41 41 40 40 39 37 36 38 39 39 39 38 37 36 36 37 36 36 36 35 35 35 34 34 33 33 33 33 34 35 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 32 33 33 32 32 32 31 31 32 32 31 31 31 30 30 31 30 30 30 30 30 30 30 30 30 29 29 28 28 28 28 29 29 29 29 29 29 29 29 28 28 28 28 28 28 73 73 72 71 69 69 68 68 68 68 67 66 66 66 66 65 65 65 65 65 65 65 65 66 66 67 66 66 66 65 64 63 63 64 65 66 66 66 66 65 66 67 66 66 66 66 65 65 65 64 63 63 63 64 65 65 65 65 65 65 64 63 64 65 66 66 66 66 65 64 63 63 63 63 63 63 63 63 64 64 63 63 62 62 61 60 60 61 61 60 60 60 60 60 60 60 59 59 58 58 58 58 57 56 56 57 57 57 57 57 57 58 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 56 57 57 58 58 58 57 57 57 56 54 54 55 56 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 53 53 53 53 52 52 52 51 51 51 51 51 50 49 48 48 48 48 48 48 48 48 48 49 48 48 48 47 48 50 51 51 51 51 51 50 50 51 51 51 51 51 50 50 50 50 50 50 49 50 50 50 51 51 52 53 52 51 50 49 49 49 49 48 48 49 49 50 50 49 49 49 49 48 47 47 46 46 45 45 45 45 44 44 44 43 43 43 43 44 45 44 44 44 43 42 43 43 43 42 40 40 40 40 40 40 41 43 44 44 43 43 42 41 42 43 42 41 40 40 41 41 40 40 40 40 39 38 38 38 38 38 37 37 38 40 41 41 41 40 40 40 40 39 39 40 40 40 40 41 41 40 38 37 37 36 37 37 36 35 34 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 31 34 37 39 38 37 37 35 33 32 32 33 36 37 39 39 38 38 38 38 38 39 41 43 42 42 44 44 43 42 42 40 38 38 39 41 42 41 40 39 38 40 39 37 36 34 33 33 33 34 36 37 37 37 36 36 37 37 38 38 38 39 40 41 42 42 43 44 43 43 43 43 44 43 41 41 43 43 41 40 40 39 38 39 40 40 41 42 42 43 44 43 43 43 42 41 40 40 40 41 42 42 41 40 40 42 43 43 43 41 42 43 44 45 44 44 43 42 42 43 43 44 44 43 41 41 42 43 43 44 45 45 44 43 43 43 42 41 41 41 41 41 42 42 42 42 42 42 42 41 42 41 40 39 38 36 37 38 39 39 39 38 36 36 37 37 37 37 37 36 36 36 36 36 35 33 33 34 35 36 36 35 35 35 35 34 34 35 35 34 34 35 35 34 34 34 33 33 32 32 32 33 33 32 32 32 32 31 31 31 30 30 31 31 30 30 30 30 30 30 30 30 30 29 29 29 28 28 28 28 29 29 29 29 30 29 29 29 28 28 28 28 73 73 73 72 71 69 69 68 68 68 67 67 66 66 66 65 65 65 65 65 65 65 65 65 65 66 66 66 66 66 65 64 63 63 64 65 65 65 65 65 65 66 66 67 67 67 66 65 65 64 64 63 63 63 64 65 65 65 64 64 63 63 64 65 66 66 66 66 66 66 64 64 63 63 63 63 63 63 64 64 64 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 59 59 59 58 58 57 56 56 57 57 57 57 57 59 60 60 60 60 60 60 60 60 59 59 59 59 59 58 57 56 56 56 56 57 57 57 56 56 56 55 54 54 55 56 55 56 57 57 56 57 57 57 56 55 55 55 54 54 54 54 53 53 53 53 53 53 53 52 52 51 52 52 53 53 53 52 52 52 51 51 51 51 50 49 48 48 48 49 50 50 49 48 48 48 48 48 48 48 48 49 50 51 51 51 51 51 51 51 52 52 52 51 51 50 50 51 51 51 51 50 49 50 51 51 50 51 52 52 51 49 49 49 49 49 48 47 48 49 49 49 50 50 49 49 48 47 47 47 47 47 46 46 45 44 43 43 43 43 43 42 43 43 43 44 44 43 42 42 43 43 42 41 40 40 40 40 40 41 43 44 44 44 43 42 41 42 42 42 41 41 40 41 41 40 40 39 39 38 38 38 38 38 38 37 37 39 40 41 41 41 41 41 41 40 39 38 39 39 40 40 41 41 41 39 39 39 38 39 39 38 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 33 36 38 38 37 35 34 33 32 33 35 36 37 38 39 38 38 39 39 38 40 42 42 41 43 44 43 42 42 42 40 37 39 40 41 41 41 40 39 38 40 39 37 34 33 32 33 33 34 34 35 36 36 36 37 38 39 40 40 40 40 41 41 41 42 42 43 43 42 42 43 43 42 41 42 42 42 42 40 39 39 39 40 40 41 42 42 42 42 43 42 42 42 42 41 39 39 40 41 41 41 39 39 41 42 43 43 42 41 42 43 43 44 44 44 43 42 41 42 42 43 43 42 41 41 41 42 43 44 44 45 45 44 44 43 43 42 41 41 41 41 42 42 43 43 43 43 42 42 41 41 41 40 38 37 36 36 37 38 39 39 38 37 36 37 37 37 37 37 37 37 37 37 35 33 34 35 36 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 33 33 33 32 33 34 34 33 32 32 32 32 32 31 31 31 31 31 31 31 30 30 30 31 31 30 30 30 29 29 29 28 28 29 29 29 29 30 30 30 29 29 29 29 28 28 72 72 73 73 72 71 70 69 68 68 68 67 67 67 66 66 65 65 65 65 65 65 65 65 64 65 65 66 66 66 65 64 63 62 63 64 64 65 65 64 64 65 66 67 68 67 66 66 65 65 64 63 63 62 63 64 65 65 65 64 63 63 64 65 66 66 65 65 66 67 66 65 65 64 63 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 61 61 61 60 60 60 59 58 58 57 56 56 56 56 57 58 59 60 59 59 60 60 60 59 60 59 58 59 60 60 59 57 57 56 55 55 55 56 55 55 56 56 56 55 54 55 55 55 55 56 56 56 56 56 57 57 56 55 55 54 54 54 53 53 53 52 52 52 53 52 52 52 51 51 52 52 53 53 52 52 52 52 51 51 50 50 48 48 48 49 50 51 51 50 49 49 49 48 48 48 48 48 49 50 50 50 51 51 51 52 52 52 52 52 51 50 50 51 51 51 51 51 51 50 50 51 50 50 50 50 51 52 50 49 49 49 49 49 48 47 47 48 48 49 50 49 49 49 48 48 48 48 48 47 46 46 45 44 43 43 43 43 43 42 42 43 44 43 43 42 42 42 42 42 41 40 40 40 40 40 41 42 43 43 44 43 42 41 41 41 42 41 40 40 41 41 41 40 40 39 39 38 38 38 38 38 37 37 38 40 41 42 42 41 40 40 40 40 39 38 39 40 40 41 41 41 40 39 39 39 39 39 38 38 37 36 35 32 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 31 34 38 38 38 36 33 33 33 33 34 37 37 37 38 38 39 41 41 40 38 40 42 41 41 43 43 42 42 41 41 39 38 40 40 40 40 40 40 39 38 39 39 36 33 32 32 33 33 34 35 36 36 36 37 39 41 41 42 43 42 42 43 42 41 42 42 42 43 42 41 42 41 41 42 43 42 41 41 41 39 39 40 40 40 41 41 41 41 42 42 42 41 41 42 41 39 39 41 40 40 39 39 39 41 42 42 42 41 41 43 43 43 44 44 44 43 43 42 41 42 42 42 41 41 42 42 42 43 43 44 45 46 46 45 44 43 43 42 41 41 41 42 42 43 43 43 43 43 42 41 41 41 40 39 39 37 36 37 36 37 38 39 38 36 36 36 35 35 36 36 36 37 36 35 34 35 36 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 33 33 33 32 32 33 33 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 30 30 31 30 30 30 29 29 29 28 28 29 30 30 30 30 30 30 29 29 29 29 28 28 71 72 72 73 72 72 71 70 69 68 68 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 65 65 65 65 64 64 63 62 62 63 63 64 64 64 64 64 65 66 67 67 66 66 65 65 65 64 63 62 62 63 64 65 65 64 63 63 64 65 65 65 65 65 66 67 67 66 65 64 65 65 65 65 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 62 62 62 61 61 61 61 60 59 59 58 58 57 56 55 56 57 57 59 59 58 58 59 60 59 58 59 59 58 58 60 60 59 58 57 57 57 57 56 56 55 54 54 55 55 55 54 54 54 55 56 56 56 55 55 56 56 57 56 55 55 55 54 54 54 54 54 53 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 52 51 50 49 48 48 49 50 51 51 51 50 50 50 50 49 49 49 48 48 49 50 51 51 51 51 51 52 52 52 52 53 52 51 51 52 52 51 50 50 51 51 50 50 50 50 49 49 50 51 50 50 51 50 50 49 49 47 46 48 48 48 49 49 49 49 49 49 48 48 47 47 47 46 45 45 44 43 43 44 43 42 41 42 43 43 43 43 43 42 41 41 40 40 40 40 40 40 41 41 42 43 43 43 43 42 41 41 41 40 40 40 41 41 41 41 41 40 39 38 38 38 38 37 37 38 39 39 40 41 41 40 40 40 40 40 39 39 39 39 40 41 40 40 40 39 38 38 39 39 38 37 36 35 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 35 39 37 36 35 32 32 33 34 35 37 40 39 38 39 41 42 42 42 41 40 40 41 42 43 41 41 42 40 39 38 39 41 41 41 41 40 39 40 38 38 38 35 33 32 33 34 35 37 37 38 39 38 39 39 40 41 42 43 43 43 44 43 43 42 41 42 43 42 41 41 41 42 43 43 43 42 41 41 40 39 39 39 41 41 40 41 41 42 43 42 41 41 41 40 39 40 40 39 39 40 41 41 42 42 41 40 41 42 43 43 44 44 43 43 44 44 42 41 41 41 41 41 42 43 43 43 43 43 44 45 46 46 45 44 43 43 42 41 41 42 42 42 43 43 43 43 42 41 41 41 40 39 40 40 39 39 38 37 36 36 37 38 38 38 36 35 35 34 35 35 35 35 34 34 35 36 37 37 37 36 36 37 37 36 35 36 35 35 35 35 35 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 30 30 30 30 30 30 29 29 29 28 28 28 29 30 30 30 30 30 29 29 29 29 29 29 70 71 72 73 73 73 72 72 70 69 69 68 68 67 67 67 67 66 66 65 65 65 65 65 64 64 64 64 64 64 64 63 63 62 62 62 62 63 63 63 63 64 65 65 66 66 66 65 65 65 65 65 64 63 62 62 63 64 65 65 64 63 63 64 65 65 65 65 66 67 67 66 65 65 65 65 65 65 64 64 64 65 65 65 65 64 64 64 63 63 63 63 63 62 62 62 62 61 61 61 60 60 59 59 59 58 57 55 55 56 56 58 59 58 57 57 58 58 57 58 59 58 58 59 60 60 59 59 59 58 57 57 57 56 55 54 54 54 54 54 53 53 54 56 56 55 54 55 55 55 55 56 55 55 55 55 55 54 54 54 54 53 52 51 51 51 51 51 51 51 51 52 52 52 52 52 51 51 51 50 49 48 48 49 51 52 51 50 50 51 51 51 50 50 49 49 48 48 49 50 50 50 50 50 51 51 51 52 53 53 52 52 52 51 51 51 50 50 50 50 49 50 50 49 49 49 50 51 51 51 50 50 49 49 48 47 47 47 48 49 49 49 49 49 48 48 47 46 46 46 46 46 45 44 43 43 43 42 42 42 42 42 43 44 44 43 42 42 41 40 40 40 40 40 40 41 41 41 42 43 44 43 42 42 41 40 40 40 41 41 40 40 41 40 40 39 38 38 38 37 37 37 39 40 40 40 41 41 41 42 42 41 40 40 39 39 39 40 41 40 40 40 38 37 37 38 39 38 36 36 35 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 32 36 38 37 36 34 32 31 33 35 37 39 40 40 39 40 41 41 42 43 41 39 40 40 41 42 41 41 41 40 38 39 41 41 41 41 41 40 39 40 38 37 36 33 32 33 34 36 37 38 38 39 39 39 39 40 40 41 42 43 42 42 43 43 43 41 41 42 42 41 41 42 43 43 43 42 43 43 43 42 41 39 38 39 40 40 40 40 40 41 42 41 40 41 41 40 39 39 39 39 40 41 42 43 42 41 40 40 42 43 44 44 44 44 42 43 44 43 43 41 40 40 41 41 42 44 44 44 44 43 44 45 45 46 45 45 44 43 42 41 41 42 43 42 42 43 43 43 43 42 42 42 40 39 39 39 40 40 39 39 38 36 36 37 39 39 38 37 37 36 36 35 34 34 34 35 34 34 36 37 37 36 36 37 36 35 35 36 35 35 35 35 35 34 34 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 30 30 30 30 29 29 29 29 28 28 29 30 30 31 30 30 30 30 29 29 29 29 70 72 73 73 73 73 73 73 72 71 69 68 68 67 67 67 67 67 66 66 66 65 65 65 65 65 64 64 64 64 64 64 63 62 62 62 62 62 63 63 63 63 64 65 65 65 65 65 65 65 65 65 64 63 62 62 63 64 65 65 64 63 63 64 65 65 65 66 66 66 66 66 65 65 65 65 65 65 64 63 64 64 64 65 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 60 59 58 57 55 55 55 56 58 58 58 57 57 58 58 57 57 58 58 58 58 59 60 60 60 60 59 57 57 57 56 56 56 55 54 54 54 53 53 53 55 55 55 54 54 55 54 54 56 56 55 55 55 55 55 55 55 55 54 53 52 52 51 51 51 51 51 51 51 51 52 52 51 51 51 51 50 49 48 49 50 51 52 51 51 51 51 52 52 51 50 50 50 49 48 48 49 49 49 50 50 51 51 51 52 53 53 53 52 52 51 51 51 50 49 49 49 49 49 50 49 48 48 49 51 51 50 50 50 49 48 48 47 46 47 48 48 49 49 48 48 48 48 47 46 46 45 45 45 45 45 44 43 42 42 42 42 42 42 43 44 44 43 43 43 42 41 40 39 39 39 40 40 41 41 41 43 44 43 42 42 40 40 40 41 41 41 40 40 40 40 39 39 38 38 38 37 37 38 39 40 41 41 41 41 41 41 41 41 40 40 40 39 39 40 40 40 39 39 38 38 36 36 38 38 37 37 36 35 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 31 31 31 31 31 34 37 37 36 35 34 31 31 33 35 37 38 40 41 41 40 40 39 41 41 39 40 41 39 39 40 39 40 40 38 37 40 41 41 40 38 39 40 39 37 36 35 34 32 32 34 36 37 38 38 38 38 38 39 40 41 41 42 42 41 41 41 42 43 43 42 42 42 42 41 42 43 42 42 42 42 43 44 43 43 42 40 38 38 39 40 41 40 39 40 41 40 40 40 39 39 38 38 39 40 41 42 43 42 41 40 40 41 42 43 43 44 44 43 42 43 43 43 43 41 40 40 41 41 42 43 44 44 44 44 43 44 45 45 45 45 45 44 43 42 42 43 42 42 42 43 43 43 44 43 43 42 41 41 40 40 39 39 40 40 39 38 37 36 37 38 38 38 38 38 37 36 35 35 36 37 35 34 36 37 37 36 35 35 36 35 35 35 35 35 35 35 35 35 35 35 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 30 30 30 30 29 29 29 29 29 29 29 30 30 31 30 30 30 30 29 29 29 69 71 73 73 73 72 72 71 72 71 70 69 69 68 68 67 67 67 67 66 66 65 65 65 65 65 65 65 65 65 65 65 64 63 63 63 62 62 62 62 62 63 63 64 65 65 65 65 65 64 64 65 64 64 63 62 63 64 64 65 64 64 63 64 64 64 65 65 65 65 65 65 65 65 64 65 66 66 65 63 63 63 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 60 59 58 57 56 55 55 56 58 58 58 57 57 58 58 57 57 58 58 57 57 58 59 59 59 59 59 58 59 58 57 56 56 56 55 55 54 53 53 53 53 54 55 54 53 53 53 54 56 56 56 56 56 56 55 55 55 55 54 54 53 53 52 52 52 51 51 51 51 51 51 52 51 50 50 50 50 49 49 49 50 51 52 52 51 51 51 51 51 51 51 50 50 50 48 48 48 49 50 50 51 51 52 52 52 53 53 53 52 52 51 51 50 50 49 48 49 49 49 49 49 48 48 49 50 51 51 50 51 50 48 48 47 46 47 48 49 49 49 48 48 48 48 47 47 46 46 45 45 45 44 44 43 42 42 43 43 42 41 42 43 44 44 44 44 43 42 40 39 39 39 39 40 41 41 41 42 43 43 42 41 40 40 41 42 41 41 41 40 40 40 39 38 38 38 38 37 37 39 40 41 41 41 40 40 41 41 40 40 40 40 39 39 39 40 40 39 39 39 38 39 37 36 37 37 37 37 35 34 34 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 34 37 36 34 32 32 32 32 34 36 37 38 40 41 40 39 39 40 40 39 39 40 41 39 37 38 38 38 37 36 37 39 41 42 40 38 38 38 37 35 33 33 32 32 34 35 36 36 36 37 38 39 39 40 41 41 40 41 40 40 41 42 43 43 44 43 41 41 41 41 41 41 41 41 42 43 43 43 43 42 42 41 39 38 37 38 40 41 40 40 40 39 38 38 38 38 39 40 41 41 42 43 43 42 40 40 41 42 42 43 43 43 42 42 42 42 43 43 42 41 41 41 41 41 41 42 43 44 44 44 43 43 44 44 44 44 44 44 43 42 41 41 41 41 42 42 42 43 44 43 43 42 42 42 41 41 39 39 40 40 40 39 39 37 36 36 36 37 38 38 38 37 37 37 37 37 36 34 34 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 34 33 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 30 30 29 29 29 29 29 29 30 31 31 31 31 30 30 30 29 29 69 70 71 72 72 71 70 70 71 70 70 70 70 69 68 68 68 67 67 67 66 65 65 65 65 65 65 65 65 65 66 65 65 65 64 64 64 63 62 62 62 62 62 62 63 64 64 64 64 64 64 64 64 64 63 62 63 64 64 64 64 64 63 63 63 64 65 65 64 64 64 65 65 64 63 65 65 65 65 64 64 63 63 63 63 63 62 62 62 62 62 62 63 63 63 63 62 62 62 61 61 61 61 60 59 58 57 57 55 55 56 57 57 58 57 57 57 57 57 57 58 58 57 56 57 58 58 58 58 58 58 59 58 57 57 57 56 55 55 55 54 54 53 52 53 54 54 53 53 53 55 56 55 56 56 56 56 55 55 55 55 55 54 53 53 52 52 52 52 51 51 50 50 51 52 51 51 50 50 49 49 49 49 50 51 51 51 51 51 51 51 51 51 50 50 50 50 49 48 49 50 50 50 51 51 52 53 53 53 53 53 52 52 51 51 51 50 49 48 49 49 48 48 48 48 49 49 49 50 50 51 51 50 49 48 47 46 47 48 49 49 49 49 49 49 48 48 47 47 47 46 45 44 43 43 42 42 43 44 44 43 42 41 43 43 43 43 44 43 42 40 39 39 39 39 40 41 41 41 42 43 43 42 41 40 41 42 42 41 41 41 40 40 40 39 38 38 38 38 37 38 39 41 41 41 41 40 40 40 40 40 40 40 40 39 39 40 40 40 39 39 38 37 38 38 36 35 35 35 35 34 34 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 32 34 33 31 31 31 32 34 36 38 39 40 40 39 38 38 39 40 38 38 39 40 40 38 37 38 38 37 36 36 38 39 40 42 41 39 37 36 35 33 32 32 33 33 34 36 36 35 35 35 38 40 40 41 41 40 39 40 40 42 42 42 43 44 43 42 41 40 40 40 40 41 42 43 44 43 42 41 41 41 42 41 40 38 37 37 39 40 40 39 39 38 37 38 39 40 41 41 42 42 43 44 42 41 40 40 41 42 42 43 42 42 42 41 41 42 42 41 41 41 42 43 43 42 42 42 43 44 44 43 42 42 43 43 44 43 42 41 41 40 40 41 40 41 41 41 42 43 43 43 43 43 43 42 42 42 41 39 39 39 39 40 40 39 38 37 35 35 36 36 36 35 36 37 38 37 37 35 35 35 35 35 35 35 34 33 33 34 35 35 35 35 34 34 34 34 34 34 34 33 32 32 32 32 33 32 32 31 31 31 31 32 32 32 32 32 32 32 31 31 30 30 30 30 30 30 29 29 29 30 29 28 29 30 31 31 31 31 31 30 30 29 69 69 70 71 70 70 70 70 70 69 69 69 70 70 70 69 68 67 67 67 66 66 66 65 65 66 66 66 66 66 66 66 66 66 65 65 65 64 63 63 62 62 62 61 62 63 63 63 63 63 63 64 64 63 62 62 62 63 62 62 63 63 63 62 63 64 64 64 63 63 63 64 64 63 63 63 63 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 63 63 63 62 62 62 61 60 60 59 59 58 58 57 57 55 55 55 56 57 57 58 58 58 57 57 57 57 58 58 56 56 57 58 57 57 57 58 58 58 58 57 57 57 56 55 55 55 55 55 53 53 53 53 53 53 53 55 55 55 55 56 55 55 56 55 55 55 54 54 53 53 52 52 52 52 52 52 51 50 50 51 52 51 50 49 49 49 49 50 50 50 50 51 51 51 51 51 50 50 50 50 50 49 48 48 49 50 50 51 51 51 52 52 52 52 52 52 52 51 50 50 50 50 49 49 48 48 47 47 47 48 49 48 48 49 49 51 51 50 49 49 48 46 47 48 48 48 49 49 49 48 47 47 47 48 47 47 46 45 44 44 43 43 44 44 44 43 42 41 42 43 43 43 43 42 41 40 39 39 39 39 39 40 41 41 41 42 42 41 40 40 42 42 42 41 41 40 40 40 40 39 38 38 38 37 37 38 40 40 41 41 41 40 40 39 39 39 40 40 39 39 40 40 41 40 40 40 39 38 37 37 36 35 35 35 34 34 34 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 34 36 37 38 39 39 38 37 37 39 39 38 38 38 38 40 40 38 37 37 37 36 36 37 39 38 38 40 39 38 38 36 33 32 32 32 33 34 35 37 38 37 36 36 37 39 41 41 40 38 39 40 42 43 42 42 43 43 43 42 40 39 40 41 42 43 44 44 45 44 42 40 39 40 41 40 40 40 38 37 37 39 39 38 37 38 38 39 40 42 43 43 43 43 43 42 41 40 40 41 42 43 43 42 41 41 41 41 41 41 41 40 41 42 43 44 44 43 43 43 43 42 42 42 42 42 42 41 42 41 40 40 41 41 42 42 41 41 41 41 42 43 43 43 42 43 43 42 42 41 40 40 39 38 38 38 39 39 39 38 38 37 36 35 35 35 35 35 36 37 37 36 37 38 37 37 36 36 36 33 33 35 35 34 34 34 34 34 34 33 33 34 34 34 33 32 32 32 33 33 33 32 32 31 31 31 31 32 32 32 32 32 31 31 31 30 30 30 30 30 30 30 30 30 29 28 28 29 30 31 31 31 31 30 30 29 68 68 68 69 69 70 70 69 68 68 69 69 69 70 70 70 69 68 67 67 67 67 66 66 66 66 66 66 66 66 66 66 66 65 65 64 64 64 64 63 62 62 62 61 61 61 61 62 62 62 62 63 63 62 61 61 61 61 61 61 62 62 61 62 63 64 63 62 62 62 62 63 63 63 63 63 63 64 64 64 63 63 63 63 63 64 64 63 62 62 63 63 62 62 63 62 62 62 62 61 60 59 58 57 57 57 56 56 55 54 55 56 57 58 59 59 58 57 57 56 57 58 58 57 56 56 57 57 57 57 57 58 57 57 58 57 57 56 55 55 55 54 54 53 52 52 52 52 52 53 54 54 55 55 55 55 55 55 55 55 55 54 54 53 53 52 52 52 52 52 52 51 50 50 50 51 50 49 49 49 49 50 51 51 51 51 51 50 50 50 51 50 50 50 50 49 49 48 48 49 50 50 51 51 51 51 51 52 52 52 52 52 51 50 49 49 49 49 49 48 48 47 47 47 47 47 48 48 49 50 51 50 49 50 49 48 47 46 47 47 48 48 49 48 48 47 46 46 47 47 47 46 46 46 45 44 44 44 44 44 44 42 41 41 42 43 43 43 42 42 41 40 39 39 39 39 39 40 41 41 41 41 41 40 41 42 42 42 42 41 41 40 40 40 39 38 38 38 37 37 39 40 40 40 41 41 42 41 40 39 39 39 40 39 39 40 40 40 40 40 40 40 39 39 38 36 36 37 37 36 36 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 35 37 37 37 36 36 37 38 40 40 38 38 39 38 37 38 39 38 35 35 36 36 37 38 38 38 38 39 39 38 37 35 33 32 32 33 34 35 36 37 38 38 38 38 38 37 39 39 39 39 39 41 42 42 43 43 43 42 42 40 40 41 42 43 43 43 43 44 44 44 42 40 39 39 40 40 39 40 40 38 37 38 39 38 37 38 39 40 41 42 43 43 43 43 43 41 40 40 41 42 43 43 42 41 40 40 40 40 40 39 40 40 41 42 43 44 44 43 43 43 43 43 42 41 42 43 42 41 40 40 40 41 42 43 43 43 42 42 42 42 43 43 43 42 42 42 43 42 42 41 40 39 38 39 39 38 38 38 38 37 37 38 38 38 37 37 36 35 34 35 35 35 36 37 37 36 36 35 35 33 32 33 34 34 34 34 34 33 33 33 33 34 34 34 33 32 31 32 33 33 34 33 32 32 31 30 31 32 32 32 32 31 31 31 31 31 31 31 30 30 30 30 30 30 30 29 28 28 29 30 30 31 31 31 30 30 67 68 68 69 70 70 69 69 67 68 68 68 69 69 70 70 70 69 67 67 67 67 66 66 66 66 66 67 67 66 66 66 65 65 64 64 64 64 64 63 63 62 62 62 61 61 60 60 61 61 61 61 61 61 60 60 60 60 59 60 60 60 60 60 61 63 62 61 61 62 63 63 63 63 63 62 62 63 64 64 63 62 62 62 63 64 64 63 63 63 64 64 63 62 62 62 62 62 61 61 61 59 58 58 57 57 56 56 56 55 54 55 57 57 58 58 58 58 57 56 56 58 58 58 56 55 56 57 57 56 57 57 57 58 58 57 57 56 56 55 55 54 53 53 53 53 53 52 52 52 52 53 54 54 54 55 54 54 55 55 55 55 54 53 53 52 52 52 52 52 52 51 50 50 50 50 50 49 49 49 50 50 51 51 50 50 50 50 50 50 50 50 50 49 49 49 48 48 49 49 49 49 50 50 50 50 51 52 52 52 51 51 51 50 49 49 49 49 48 48 48 47 46 46 46 47 47 49 49 49 50 50 49 49 49 48 47 46 45 47 48 48 48 49 48 47 46 46 46 46 46 45 45 46 45 44 44 44 44 43 43 43 42 41 41 42 43 43 43 43 42 41 40 39 39 39 40 40 41 41 41 41 40 40 42 42 42 42 42 41 41 41 40 40 39 38 38 37 37 37 39 40 40 40 41 41 42 41 41 40 39 39 39 39 39 40 40 40 39 39 40 40 39 38 38 37 37 37 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 35 37 36 36 36 36 38 40 40 38 37 38 39 38 37 37 38 36 34 35 35 36 37 38 38 39 39 38 38 37 35 33 32 32 32 33 35 36 36 37 38 39 39 40 39 37 38 39 39 39 41 42 42 41 42 42 43 42 39 39 41 42 42 43 43 43 44 44 44 44 43 41 40 39 38 39 39 40 39 38 37 39 39 38 37 37 39 40 41 42 42 42 41 42 42 41 40 40 42 43 42 41 41 40 39 39 39 39 39 40 41 42 42 42 42 42 42 42 43 44 43 43 42 41 43 43 43 42 41 40 40 41 42 43 42 43 43 43 43 43 42 42 42 41 41 42 43 43 42 41 40 40 39 40 40 40 40 39 39 38 37 37 38 38 38 37 37 37 35 34 34 33 34 36 37 36 36 35 35 34 33 32 32 33 34 34 34 33 32 32 33 34 34 34 33 32 32 32 32 33 33 32 32 32 31 30 30 31 31 32 32 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 29 28 28 29 30 30 31 31 30 30 67 67 69 70 70 70 69 68 67 67 67 68 68 69 69 69 69 70 68 67 67 67 67 66 66 66 67 67 67 67 66 66 66 65 64 64 64 64 64 63 63 63 63 63 62 62 61 61 60 60 60 60 60 59 59 60 60 59 59 59 59 59 59 59 60 61 61 61 61 62 63 63 63 63 62 61 61 62 63 63 63 61 60 61 62 63 63 64 64 63 63 63 63 62 62 62 61 61 61 61 61 60 60 58 58 57 57 57 57 56 55 54 55 56 57 57 57 57 57 56 55 57 58 58 57 55 55 57 57 56 57 57 58 59 58 57 57 56 55 55 54 54 54 55 55 55 55 54 53 52 51 51 53 54 54 53 53 54 55 55 54 54 54 53 53 53 52 52 52 51 51 51 50 51 51 51 51 51 50 50 50 50 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 50 50 50 50 51 52 52 52 52 51 50 51 50 49 49 49 49 48 48 48 47 46 46 46 46 46 48 49 48 49 49 48 48 48 47 46 46 45 45 46 47 48 49 48 47 46 46 45 45 44 44 45 45 44 44 43 43 44 43 42 42 43 42 40 41 42 42 42 43 43 42 40 39 39 39 40 41 41 41 41 41 40 41 42 42 42 43 42 41 40 40 40 39 38 38 37 37 37 38 39 40 41 41 41 41 41 41 40 40 40 40 39 39 39 39 40 39 39 39 40 40 39 38 38 38 38 36 36 35 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 33 36 36 35 36 38 39 39 39 38 36 37 38 38 37 37 36 35 34 34 35 36 37 38 38 39 40 39 37 36 35 34 33 32 32 33 35 37 37 37 38 38 39 40 41 39 39 40 40 40 40 42 42 40 41 41 42 43 42 39 39 41 41 42 43 44 44 45 44 44 44 44 43 41 40 39 39 39 39 38 37 38 40 40 38 37 37 38 40 41 41 42 42 41 42 41 40 40 41 42 42 40 39 39 39 39 39 39 39 40 41 42 43 44 43 42 41 41 42 43 43 43 42 41 41 42 43 43 43 41 40 39 40 41 42 42 43 44 43 43 43 42 41 41 41 41 41 42 43 42 41 41 40 40 40 41 41 40 40 40 39 37 36 36 37 38 38 37 37 37 36 35 34 33 33 34 35 36 37 36 36 35 33 32 32 33 34 33 33 32 32 33 34 34 34 34 33 32 32 32 32 32 32 32 31 30 30 30 31 31 32 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 29 30 31 31 31 30 67 66 68 69 68 69 69 69 68 67 66 68 69 69 69 69 69 70 69 68 67 68 68 67 67 67 67 67 67 67 67 66 66 65 65 65 64 64 64 63 63 63 64 64 63 63 63 62 62 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 60 60 60 61 62 62 61 61 61 60 60 61 62 63 63 62 60 61 63 63 63 63 63 63 63 63 63 63 62 61 61 61 60 60 60 60 60 59 58 58 58 58 58 57 55 54 54 55 56 57 57 57 57 56 55 57 58 58 57 55 55 56 57 56 55 56 57 58 58 57 56 56 56 56 55 55 55 56 56 55 55 55 54 54 52 51 51 53 53 53 53 54 55 55 54 54 53 53 53 52 52 52 52 51 51 51 51 51 52 52 52 52 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 50 50 50 50 50 51 51 51 51 51 52 52 51 51 50 50 51 50 50 50 50 50 49 49 48 47 47 47 46 45 45 47 47 48 49 49 49 48 47 47 47 47 46 45 45 46 48 49 49 48 47 47 46 45 44 44 44 43 43 43 43 43 43 43 42 42 42 41 40 40 41 41 42 42 42 42 40 38 38 39 40 40 40 40 41 41 40 41 42 42 42 42 41 40 40 40 40 39 38 38 37 37 37 38 39 40 40 41 41 41 42 42 40 40 40 40 39 38 38 38 39 39 39 40 40 40 39 39 38 38 37 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 33 35 34 35 37 40 42 39 38 36 36 38 38 37 36 36 37 34 32 34 37 37 38 40 39 39 39 39 38 35 33 33 32 32 33 35 37 38 38 37 37 38 39 41 42 40 40 41 41 42 42 42 41 40 40 41 42 43 42 40 39 39 41 43 43 44 44 44 44 44 43 44 44 43 41 40 38 38 38 37 37 38 40 40 38 37 37 38 39 41 41 41 41 41 41 41 39 39 41 41 40 39 38 39 40 40 40 40 41 41 41 42 42 44 44 43 43 42 42 43 43 42 42 41 40 42 42 43 42 42 40 39 40 41 42 43 43 44 44 44 43 42 41 41 41 41 41 42 43 43 42 42 41 40 39 39 40 39 39 38 37 37 37 36 35 37 37 37 37 37 36 35 35 34 33 33 32 34 36 36 37 36 34 34 34 33 33 32 32 32 32 32 33 34 34 34 33 32 31 32 32 32 32 32 31 30 30 30 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 31 31 31 30 30 28 29 30 30 31 31 31 66 66 67 68 67 68 69 68 68 67 66 68 69 69 68 68 69 69 70 69 68 68 68 68 68 68 67 67 67 67 67 66 66 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 60 59 59 59 59 59 60 61 61 61 61 60 61 60 60 61 61 62 63 62 61 61 62 62 62 61 62 62 63 64 64 63 62 62 62 61 60 60 60 60 60 60 60 60 59 58 57 57 56 55 54 54 55 56 56 57 57 56 55 56 57 57 56 55 55 56 57 56 55 56 57 57 58 58 57 57 57 57 56 56 56 57 57 55 55 55 54 54 53 52 51 51 52 53 53 54 55 55 54 54 53 53 53 52 52 52 52 51 51 51 51 52 52 52 52 52 51 51 50 50 49 49 49 49 49 49 49 49 49 49 49 50 49 49 50 50 50 50 50 51 51 51 51 51 52 51 50 50 50 51 51 50 50 50 50 49 49 48 48 49 49 48 48 47 46 45 46 47 48 49 49 49 49 48 48 48 48 46 45 45 47 48 48 48 49 48 47 46 44 43 43 43 42 42 43 43 43 43 42 42 41 41 40 40 40 40 41 42 42 41 40 39 38 38 39 39 40 40 41 41 40 40 41 41 42 42 41 40 40 39 39 39 38 38 37 37 37 39 39 40 40 40 40 41 41 41 40 40 39 39 39 39 38 38 38 39 40 40 39 39 39 39 39 38 36 36 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 32 34 34 35 37 39 39 38 36 36 37 39 39 38 36 35 35 33 33 36 37 38 39 40 39 38 38 37 36 34 32 32 32 33 34 35 37 38 38 38 37 37 39 40 40 41 41 41 42 43 42 41 40 40 41 42 43 43 42 41 39 39 41 43 43 43 43 43 44 44 43 43 44 43 41 40 39 38 37 37 37 39 40 39 38 37 38 39 40 41 41 40 40 40 40 40 39 39 40 39 38 38 39 40 41 40 40 41 42 42 42 42 42 43 44 45 45 44 42 43 44 43 42 41 40 41 42 42 42 42 40 39 40 41 42 43 43 44 45 44 43 42 41 41 41 41 41 42 42 43 42 41 41 40 39 39 39 38 38 38 38 38 38 37 35 35 37 37 38 37 35 35 36 36 35 34 33 33 33 34 35 36 36 35 35 34 32 31 32 32 32 33 33 34 34 34 33 31 30 32 33 33 32 32 31 30 30 30 30 30 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 31 32 31 31 30 28 28 30 30 30 31 31 65 65 66 67 66 68 69 67 66 66 66 67 68 67 67 67 68 69 69 69 68 67 68 68 68 68 67 67 67 66 66 66 66 65 65 66 66 65 65 64 64 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 61 61 60 59 59 59 59 59 60 60 60 61 60 60 59 60 61 61 61 62 62 61 60 60 61 61 60 61 62 63 63 62 62 62 62 62 61 61 60 60 60 60 60 60 61 60 58 57 57 57 56 55 55 54 54 55 55 55 55 54 55 56 56 56 55 55 56 56 56 55 55 57 58 58 58 58 57 57 57 57 56 57 57 56 56 55 55 54 54 53 53 52 51 51 52 52 53 54 54 54 54 53 53 52 52 52 52 51 51 51 51 51 52 52 52 52 52 51 51 50 50 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 50 50 51 52 51 50 50 50 50 50 50 49 49 49 49 48 48 48 49 49 49 48 47 47 46 45 45 46 47 48 49 49 49 49 48 47 46 45 45 46 47 47 48 49 47 46 45 44 44 44 44 43 42 42 42 42 42 42 42 41 41 41 40 40 40 40 41 41 41 41 40 39 38 38 39 39 40 40 41 40 39 40 41 42 42 41 40 40 39 39 38 38 38 37 37 38 39 40 40 41 40 40 40 41 41 40 40 39 39 40 40 39 38 38 39 39 39 38 38 38 38 38 37 35 35 35 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 32 33 35 37 37 38 37 35 36 38 38 39 38 36 34 33 32 34 37 38 38 39 39 38 36 36 36 34 33 32 32 32 34 35 35 37 38 39 40 40 37 38 39 40 41 40 41 42 43 41 40 40 41 43 43 42 42 42 41 39 39 41 41 41 41 42 42 44 44 44 43 43 43 42 42 41 40 38 37 38 39 40 39 38 37 39 40 41 41 40 39 40 40 40 39 38 38 39 39 39 39 40 41 42 42 42 42 42 42 42 43 44 44 44 45 45 45 43 43 44 43 43 41 40 40 41 41 41 41 39 39 40 41 41 42 42 44 45 44 43 43 42 41 41 41 40 41 41 42 42 41 40 41 41 40 39 38 39 39 38 37 37 37 37 35 35 37 38 37 36 36 36 36 35 35 35 33 32 32 33 35 36 36 35 34 34 33 32 31 31 31 32 33 34 33 31 30 31 33 33 33 33 32 31 30 30 30 30 30 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 29 28 30 30 30 31 31 63 64 66 66 66 67 68 67 66 65 66 67 67 66 67 68 69 69 69 68 67 66 67 67 68 68 67 67 67 66 66 66 66 66 66 66 66 66 65 65 65 65 66 66 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 61 60 60 60 59 59 59 59 59 59 59 60 59 58 59 60 60 60 60 61 61 61 60 60 60 60 60 61 62 62 63 62 61 61 61 61 61 61 60 60 59 59 59 60 60 60 58 58 58 58 57 57 56 55 54 54 54 54 54 54 54 55 57 56 54 55 56 56 55 55 56 57 58 58 58 57 57 57 57 57 57 57 56 56 56 55 55 54 54 53 53 53 51 51 51 51 51 53 54 54 53 53 53 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 51 50 51 51 50 50 49 49 49 49 49 49 50 50 50 50 50 51 52 51 51 50 49 49 49 49 49 48 48 48 48 48 48 49 49 49 48 47 47 47 46 45 45 46 47 48 49 49 49 48 47 46 45 45 45 46 47 48 48 47 46 45 44 45 45 45 44 43 43 42 42 41 41 41 41 41 40 40 40 40 39 39 40 41 41 40 39 38 38 38 39 40 40 40 39 39 40 42 42 41 40 40 40 39 38 38 38 37 37 37 38 39 40 40 41 41 40 39 40 40 40 40 40 40 40 40 38 37 38 38 38 38 38 39 39 39 38 37 36 36 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 34 36 37 37 35 35 37 38 38 39 38 35 34 33 32 34 36 38 38 39 38 38 36 35 34 33 33 32 32 33 34 35 37 38 39 40 41 40 38 38 40 41 40 39 41 41 41 40 39 41 42 43 43 41 41 42 40 38 39 41 42 42 42 42 43 44 44 45 44 43 43 43 42 41 40 39 37 37 39 39 39 37 37 39 40 40 40 40 39 39 40 39 38 38 39 40 40 40 40 41 41 41 42 42 44 43 42 42 44 44 44 44 43 44 44 44 43 42 43 43 42 42 41 40 41 41 40 39 40 41 41 41 41 42 44 44 43 43 43 41 41 41 41 40 41 41 42 43 43 41 41 40 39 39 40 40 40 39 38 38 39 39 37 35 35 35 35 35 36 35 34 34 35 36 35 34 32 32 34 35 36 35 34 34 34 33 32 31 30 31 32 33 31 30 31 32 32 32 32 32 31 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 30 28 29 30 30 31 31 63 63 64 65 65 66 67 67 66 66 66 67 66 66 67 69 68 68 68 67 66 66 66 67 68 68 67 67 67 66 66 66 66 66 66 66 67 66 66 66 65 65 66 66 66 65 65 64 64 64 64 64 63 63 63 63 64 64 63 63 62 61 61 61 61 60 59 59 59 58 58 58 58 57 57 58 59 59 59 60 60 61 61 60 60 60 60 60 61 61 61 62 62 61 61 61 61 61 61 61 60 60 59 59 59 60 60 59 59 59 58 58 57 56 55 55 55 54 54 54 54 54 54 56 56 55 54 56 56 55 55 56 56 57 58 58 57 57 57 56 57 57 56 56 55 55 55 55 55 54 53 53 52 52 51 50 50 51 52 53 53 53 53 53 52 52 52 51 51 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 49 49 49 49 49 50 50 50 51 51 51 51 51 51 50 50 49 48 48 48 48 48 48 49 49 49 49 50 50 49 48 48 48 47 46 45 45 46 47 48 49 49 49 48 47 46 45 45 45 46 47 48 48 47 46 46 46 45 45 44 44 44 43 42 42 41 41 41 41 41 41 40 40 39 39 40 40 41 40 39 38 38 38 39 39 40 40 39 39 40 41 41 41 40 40 40 39 38 38 37 37 37 37 38 39 40 41 41 41 40 39 39 40 40 40 41 41 40 39 38 37 37 37 38 39 39 40 40 39 38 37 37 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 36 37 36 34 35 36 37 39 39 37 34 33 32 33 35 36 37 39 40 38 37 35 35 33 32 33 33 33 35 36 37 38 39 40 40 41 39 38 39 40 40 39 40 41 40 39 39 40 41 42 42 42 41 40 40 39 38 40 42 43 44 44 43 43 44 44 44 44 43 43 42 41 41 41 39 37 37 38 38 37 37 38 39 40 40 40 39 39 38 38 38 39 40 40 41 41 41 41 41 41 41 42 42 44 44 43 44 45 44 44 44 43 42 43 44 43 42 42 43 43 43 42 40 41 41 40 39 40 41 41 41 42 43 43 43 43 43 42 40 40 40 41 41 41 42 43 43 43 42 40 40 41 41 40 40 41 40 38 38 38 38 37 37 36 35 34 34 34 33 33 33 34 36 36 35 34 32 32 34 36 36 35 35 35 33 32 31 31 32 32 32 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 28 27 29 30 30 31 63 63 63 63 64 65 66 66 67 66 65 65 65 66 67 68 67 67 67 67 66 66 67 68 69 68 68 67 67 66 66 66 66 66 66 67 67 67 66 66 65 65 65 66 66 66 65 64 64 64 64 64 64 64 64 64 64 64 64 63 63 62 62 62 61 61 60 59 59 58 58 58 57 57 57 57 58 58 59 59 59 60 60 60 59 59 60 60 61 61 60 60 61 61 60 60 61 61 61 61 61 60 60 59 59 59 59 60 60 59 58 57 57 57 56 56 55 56 55 55 54 54 53 54 55 54 54 55 55 55 55 55 56 57 57 58 57 56 56 56 57 57 56 56 55 55 55 55 55 55 54 54 53 52 52 51 50 50 51 52 53 53 53 53 52 52 52 51 51 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 51 50 50 50 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 51 52 51 51 50 50 50 50 49 49 49 50 49 49 49 50 50 50 51 51 50 48 48 48 47 47 46 45 45 47 47 47 48 49 48 47 47 45 44 44 45 46 46 48 48 47 47 47 46 45 45 44 44 44 43 43 42 41 41 41 42 42 41 40 40 39 39 40 40 40 39 39 38 38 38 39 39 40 39 39 40 41 40 40 40 40 40 39 38 37 37 37 37 38 39 40 41 40 40 41 40 39 39 40 40 40 41 41 40 39 38 37 37 38 39 39 40 40 40 39 38 38 37 36 35 34 33 32 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 34 36 35 34 35 37 37 38 38 38 36 34 33 32 34 36 37 38 39 39 37 36 35 34 34 33 32 33 34 36 37 38 38 38 38 40 40 39 39 40 41 39 38 40 40 39 40 41 42 43 43 43 42 41 39 38 38 38 40 42 43 44 44 43 43 43 43 44 44 43 42 42 41 40 40 39 37 37 38 39 37 37 39 40 40 40 40 39 38 38 39 39 40 41 41 42 41 42 42 41 41 42 43 43 43 43 44 44 45 45 45 45 42 41 42 42 42 42 42 43 43 43 42 41 40 41 40 39 39 41 41 42 43 42 42 42 41 41 41 40 40 41 42 42 43 43 43 43 43 42 42 41 41 41 40 40 40 39 38 38 37 37 37 37 37 36 35 34 34 35 34 33 33 35 36 35 35 34 32 33 35 36 36 36 36 34 33 31 31 31 32 32 31 30 30 31 31 31 31 31 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 30 30 29 27 28 30 30 30 63 63 63 63 63 64 65 66 66 65 65 65 66 66 68 68 67 67 66 66 66 66 68 69 69 69 69 68 67 66 66 66 67 66 67 68 68 67 66 66 66 65 65 66 67 66 65 64 64 64 64 64 64 64 64 64 64 64 64 64 63 62 62 62 62 62 61 60 60 59 59 58 58 58 57 57 57 57 57 58 58 59 59 60 59 58 59 60 60 60 60 60 60 60 60 59 60 60 60 61 61 60 60 59 59 58 58 59 59 58 57 57 57 57 57 57 56 57 57 56 55 54 53 53 54 53 53 54 55 55 54 54 55 56 56 56 56 56 55 55 57 57 56 55 55 55 55 54 54 54 54 54 53 53 53 52 51 50 50 50 51 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 51 50 50 50 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 50 51 52 51 50 50 50 50 50 50 50 51 51 50 49 50 50 50 50 50 50 49 48 48 48 47 47 46 45 45 45 46 46 47 48 48 47 46 45 45 44 44 45 46 47 48 47 47 46 46 46 46 45 44 43 43 43 42 41 42 43 43 43 42 41 40 40 39 39 39 39 40 39 38 38 38 38 38 39 38 38 40 41 41 40 40 40 40 39 38 37 37 37 37 38 39 40 41 40 40 41 40 39 38 39 40 41 41 40 40 40 39 37 38 39 39 40 41 40 40 39 38 37 36 36 36 35 34 32 32 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 33 33 34 36 38 39 38 38 36 35 35 33 32 35 37 37 38 37 37 36 35 33 32 33 33 32 33 35 36 36 38 37 37 38 39 39 40 40 41 41 39 39 39 39 40 42 43 43 43 43 42 42 40 38 38 39 40 41 43 43 43 43 43 42 43 43 43 43 42 42 42 41 39 38 38 37 38 39 39 37 38 39 40 40 40 39 38 38 39 40 41 41 40 41 41 41 42 41 40 41 42 43 43 42 43 44 43 44 45 45 45 43 41 41 41 42 42 42 43 43 42 42 41 40 41 40 39 40 41 42 43 43 42 41 41 41 40 40 41 42 42 43 43 43 43 43 42 42 43 44 42 41 41 41 41 40 39 39 38 37 37 36 35 35 35 35 34 36 37 36 34 33 33 35 35 35 35 33 32 34 36 35 35 34 33 32 32 32 31 32 33 30 31 32 32 32 31 31 31 31 31 30 30 30 30 31 31 31 31 31 30 30 30 30 29 29 29 29 29 29 29 29 30 30 30 30 29 29 28 28 30 30 30 63 63 63 63 63 63 64 65 66 65 65 66 67 67 68 68 67 66 66 66 66 66 67 68 69 69 69 68 68 68 68 67 67 67 67 67 68 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 62 62 61 60 60 60 59 59 58 58 57 57 57 57 57 57 58 58 59 58 57 59 59 59 59 60 60 60 60 59 58 59 60 60 60 60 60 60 59 59 59 58 58 59 59 58 57 57 57 57 57 57 57 57 56 55 54 53 53 53 53 53 54 55 55 55 54 54 54 55 55 55 55 54 54 56 56 56 55 55 55 54 54 53 53 54 53 53 53 52 52 51 51 50 49 50 51 52 52 52 52 53 52 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 51 51 50 50 50 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 50 51 50 50 49 49 49 50 50 50 50 50 51 50 50 50 50 49 49 49 49 48 48 47 46 46 46 45 44 44 45 45 46 47 48 48 47 46 45 44 43 44 46 47 47 46 45 45 46 46 45 44 44 43 43 42 41 42 42 43 43 43 42 41 41 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 39 41 41 40 40 40 40 39 38 37 37 37 38 39 40 40 41 40 40 40 40 39 39 40 41 41 41 40 40 39 38 37 38 39 39 40 40 40 39 38 38 38 37 36 36 35 34 34 33 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 32 35 37 38 38 38 38 37 35 35 33 32 35 38 38 37 36 36 34 32 31 31 31 32 33 35 34 34 34 35 36 36 38 38 39 40 40 40 41 39 39 39 38 41 43 42 42 43 42 40 40 39 38 39 41 41 42 43 43 43 43 42 42 43 43 43 42 41 41 42 41 40 39 38 37 38 39 38 38 39 40 40 40 39 38 37 38 40 40 41 40 40 40 40 41 41 41 40 40 41 41 42 42 43 43 43 43 44 43 43 43 41 41 42 43 44 44 44 44 43 42 41 40 40 39 39 41 42 43 43 41 41 41 41 40 40 41 42 43 44 44 43 42 42 42 41 42 43 43 42 41 41 41 41 41 40 39 37 37 37 36 36 35 35 36 36 36 37 36 35 33 32 33 35 35 35 34 32 33 35 35 35 34 33 33 33 32 30 31 31 30 32 33 32 32 32 33 33 33 32 30 30 30 30 31 31 30 30 31 31 30 30 30 30 30 29 29 29 29 29 29 30 30 30 30 29 29 28 28 29 29 30 63 63 63 63 63 63 63 64 66 65 64 66 66 67 67 67 66 65 65 66 66 66 66 66 68 69 68 68 69 69 68 67 67 67 67 67 68 67 67 67 67 66 66 66 66 66 66 66 65 65 65 66 66 66 65 65 65 65 64 64 64 64 64 64 63 63 62 62 61 61 60 60 60 59 59 58 58 57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 59 59 58 58 59 59 59 60 60 60 60 60 60 59 58 58 59 59 58 58 57 57 58 58 58 58 56 55 55 54 53 53 52 52 53 54 54 55 54 53 54 54 54 54 54 54 54 55 56 56 56 56 55 55 54 53 53 54 54 53 53 53 52 52 51 51 49 49 49 51 51 51 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 49 49 49 49 50 49 49 49 50 50 50 50 50 51 51 51 51 50 49 49 48 48 48 47 47 47 46 46 45 45 44 44 45 46 47 48 48 47 45 44 44 43 44 45 46 47 46 46 45 45 45 44 43 43 42 42 43 43 43 43 42 42 43 42 41 41 41 40 40 39 39 38 38 38 38 38 38 38 38 38 38 39 40 41 40 40 40 40 39 38 37 37 37 39 40 40 41 41 40 40 40 40 39 39 40 40 41 40 40 39 38 37 37 38 39 39 40 40 40 40 40 39 38 37 36 36 35 35 36 35 32 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 32 35 37 37 36 37 38 38 36 34 32 32 35 37 36 36 36 34 32 31 31 31 32 34 34 35 35 35 35 35 35 35 36 37 38 39 40 40 40 39 38 39 40 42 42 41 42 41 40 39 38 37 39 40 40 41 42 42 41 41 41 41 42 43 43 42 41 40 41 41 41 41 40 38 37 37 37 37 39 40 41 41 40 39 37 38 40 41 40 40 40 40 40 40 41 40 40 40 40 40 41 41 42 42 41 42 43 42 41 42 42 41 41 42 43 44 45 44 44 44 42 41 41 39 39 40 41 42 42 41 40 40 40 40 39 40 41 43 43 44 45 44 42 42 42 41 42 43 43 43 42 41 41 40 39 38 38 38 39 38 37 37 37 37 38 37 36 36 36 34 33 32 32 33 34 35 35 34 33 34 35 36 36 35 34 34 33 32 31 31 31 31 32 32 32 33 34 34 33 32 31 31 30 30 30 30 30 30 31 31 31 31 30 30 30 30 30 29 29 29 29 30 30 30 29 29 28 28 29 29 29 30 63 63 63 63 63 63 63 63 64 64 64 65 66 66 66 65 65 65 66 66 66 66 66 66 67 68 67 68 69 69 69 67 66 66 66 66 67 67 67 67 67 67 66 67 67 66 67 67 66 65 66 67 67 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 62 61 61 61 61 60 60 59 59 58 57 57 56 56 56 56 56 56 57 57 57 57 58 57 57 57 58 58 57 58 58 58 59 60 60 60 60 60 59 58 57 58 59 59 58 58 58 58 58 58 58 57 56 55 55 54 53 53 52 52 52 53 55 55 53 53 53 54 55 55 54 54 55 56 56 55 55 55 55 54 53 52 53 54 53 53 53 53 52 52 52 51 50 49 49 50 51 51 51 51 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 49 49 50 50 50 49 50 50 51 51 51 50 49 49 48 47 47 47 47 48 48 47 46 46 45 44 44 45 46 48 47 46 45 44 44 43 43 44 46 47 47 47 46 44 44 45 44 43 43 43 44 44 44 43 43 42 42 42 42 41 41 40 40 40 39 39 39 38 38 38 38 38 38 38 37 38 38 40 40 40 40 40 39 38 38 37 37 38 39 40 41 41 41 41 40 39 39 39 40 40 41 40 39 38 38 37 37 38 39 39 39 39 40 39 39 39 38 38 37 37 36 36 37 36 34 32 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 33 36 36 36 37 37 37 35 33 32 33 36 36 35 35 35 33 31 31 32 33 34 36 36 36 36 37 38 36 35 37 37 36 37 40 40 39 39 38 38 40 41 41 41 41 41 39 39 39 37 38 39 40 41 42 41 40 40 40 40 41 42 42 42 41 40 40 40 40 39 40 40 38 37 37 37 39 40 40 41 41 40 39 37 38 40 40 39 39 40 41 41 40 40 40 39 40 41 42 42 42 42 41 40 41 42 42 41 41 41 41 42 42 42 43 43 43 42 42 42 42 41 39 38 40 42 42 41 40 40 40 41 41 41 41 41 42 42 43 44 45 44 43 43 42 41 42 41 42 42 41 40 38 37 38 39 40 40 38 37 37 37 38 38 37 36 36 35 33 34 33 33 33 32 34 34 34 33 33 34 35 36 36 35 35 35 34 33 33 31 30 31 31 32 33 34 33 33 33 32 32 31 30 30 29 29 31 32 32 31 31 31 30 30 30 30 29 29 29 30 30 30 30 29 28 27 27 28 29 29 29 65 65 64 63 63 63 63 62 62 63 63 64 65 65 65 64 63 65 66 66 66 66 65 65 65 66 66 67 68 69 69 68 67 66 66 66 66 66 67 67 67 67 67 67 67 66 67 67 66 66 66 67 67 67 67 66 65 66 66 66 64 63 63 63 63 63 63 63 62 62 61 61 61 61 60 60 59 58 58 58 57 56 56 56 56 56 56 56 57 57 58 57 57 57 57 58 57 57 57 58 59 60 60 60 60 60 59 58 57 57 58 58 59 59 58 58 58 58 58 58 57 56 55 55 54 53 52 52 52 53 54 55 53 52 53 55 55 56 55 55 55 56 56 55 55 55 55 55 53 52 52 53 53 54 53 53 53 52 52 52 50 49 49 50 50 51 51 51 52 52 52 51 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 48 48 49 49 49 49 49 50 51 51 51 52 51 50 49 48 48 48 47 46 46 47 47 46 46 46 44 44 44 46 47 47 46 45 44 44 43 43 44 45 46 47 47 47 46 45 46 45 44 44 44 43 44 44 44 44 43 42 42 42 42 41 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 37 38 39 39 39 39 40 39 39 38 37 37 37 39 41 41 40 40 40 40 39 39 40 40 40 40 38 38 38 37 37 38 39 40 39 39 39 38 38 38 38 39 39 38 37 37 38 36 34 33 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 33 34 36 35 35 34 33 32 32 34 35 35 36 36 35 32 31 32 32 33 35 36 37 37 38 37 37 37 37 38 38 37 38 40 40 38 37 38 39 41 41 40 41 42 41 39 38 38 38 38 39 40 41 41 41 40 40 41 41 41 42 42 42 40 40 40 40 39 38 39 38 37 36 37 39 40 40 40 41 40 40 38 37 38 39 39 39 39 40 41 41 40 40 39 39 41 42 42 41 42 41 40 40 41 41 40 40 40 41 42 42 42 42 43 43 43 41 41 40 41 40 39 39 41 42 41 40 39 39 41 42 43 43 42 41 42 43 44 45 45 45 44 43 42 41 40 40 40 41 41 40 40 39 39 41 41 41 40 38 38 38 37 37 37 38 37 35 33 34 35 35 34 32 32 32 33 32 32 32 34 35 35 35 36 36 35 34 34 32 32 32 31 32 34 33 33 33 34 33 32 31 31 31 30 29 30 31 32 32 32 32 31 31 31 30 29 29 29 30 30 30 29 29 29 28 27 27 28 29 28 66 66 65 63 63 63 63 62 62 62 63 63 63 63 63 63 63 64 66 66 66 65 64 63 65 66 66 66 67 68 69 69 68 67 65 66 66 66 66 66 66 67 67 67 67 66 66 67 67 67 67 67 67 67 67 67 66 66 66 65 64 63 63 63 63 63 63 62 61 60 60 60 60 60 59 59 59 58 58 58 57 57 56 56 56 56 55 55 56 57 57 57 57 57 57 57 57 57 57 58 59 59 59 60 60 60 59 58 57 57 57 57 58 58 58 58 58 58 58 58 57 56 56 55 55 54 53 52 52 52 53 54 53 53 54 54 55 56 56 55 55 55 55 56 55 55 55 54 54 53 52 52 53 54 54 53 52 52 53 52 51 50 49 49 50 51 51 51 51 52 52 51 51 51 51 51 51 50 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 48 49 49 48 48 47 47 47 47 48 48 48 48 48 48 48 48 49 50 50 51 51 51 51 50 49 49 48 48 48 46 45 46 47 46 46 46 45 44 44 45 46 46 45 45 44 44 43 43 44 45 46 46 47 47 46 46 45 45 45 44 43 43 43 43 44 44 43 42 41 41 41 41 41 41 41 40 40 39 39 39 40 39 39 39 39 38 38 38 37 37 38 38 38 38 38 39 38 37 37 37 38 39 40 40 40 40 40 39 39 40 40 40 39 38 38 38 37 37 38 39 40 39 38 39 38 38 38 37 39 39 38 38 38 38 36 33 35 35 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 32 33 33 32 32 31 32 34 35 34 35 36 34 33 32 32 33 33 34 35 35 36 37 38 38 37 37 37 38 37 38 39 40 40 38 36 38 40 41 40 40 40 41 41 39 38 37 38 40 40 41 41 41 41 40 40 41 42 42 42 42 41 40 40 40 40 40 39 38 37 36 36 38 40 41 41 40 40 40 39 38 37 38 39 39 40 40 40 41 41 41 41 39 39 40 41 41 40 41 41 39 39 40 39 39 41 42 42 43 43 41 41 42 43 43 42 41 40 40 39 39 40 41 41 41 40 39 40 41 42 42 42 43 43 43 44 44 44 44 45 44 43 42 41 41 40 41 42 42 42 42 41 41 40 40 41 40 39 39 38 37 36 36 37 36 35 33 35 36 34 34 34 33 33 33 33 32 32 32 33 33 34 34 35 35 35 35 34 34 34 31 31 32 31 32 34 34 34 33 32 32 32 31 30 30 31 32 32 32 32 32 32 32 31 30 29 29 29 29 29 29 29 29 28 27 27 27 28 27 66 66 66 65 63 63 63 62 62 62 63 63 63 63 63 63 63 63 65 65 65 64 63 63 64 65 64 65 67 67 67 67 67 67 66 65 65 66 65 65 66 66 66 67 67 66 65 66 67 67 67 66 66 66 66 66 65 65 65 65 64 64 64 64 64 63 62 61 61 61 61 60 59 59 59 59 59 58 57 57 57 57 57 57 57 56 56 55 55 55 56 56 56 56 56 57 57 56 57 58 58 58 57 58 60 60 60 59 58 57 57 56 57 57 57 57 58 58 58 58 57 57 56 55 55 55 54 53 52 52 52 52 52 53 54 54 55 55 55 55 55 55 55 56 55 55 54 53 54 54 53 52 53 54 54 53 52 52 52 51 51 50 49 49 49 50 51 51 51 52 52 52 51 51 51 51 50 50 50 50 50 51 51 50 51 51 50 50 50 50 49 49 49 49 48 48 48 48 48 48 47 48 48 47 46 47 48 48 49 49 49 48 48 48 49 49 49 50 51 51 50 49 49 48 47 47 47 47 46 45 47 47 46 46 45 44 43 44 46 46 46 46 45 44 43 42 43 45 45 45 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 40 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 39 38 38 39 40 41 40 39 38 38 37 37 38 38 39 39 38 37 37 37 37 38 39 38 37 37 36 36 34 34 36 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 32 33 33 34 36 35 33 34 33 31 31 32 33 34 34 35 35 36 38 38 38 38 39 39 38 38 37 37 38 39 39 38 36 38 39 40 39 39 39 40 40 39 37 37 38 40 41 41 41 40 40 40 40 40 41 42 42 41 40 40 40 40 40 39 38 38 37 36 36 38 40 41 41 40 39 39 38 37 38 39 40 40 40 40 40 40 40 41 41 40 39 39 40 40 40 40 40 39 39 40 40 41 42 42 43 43 42 41 41 42 42 42 42 41 40 40 39 38 39 41 41 40 39 38 40 41 41 41 41 42 44 44 44 43 43 43 43 43 42 41 41 41 41 43 43 41 41 42 42 41 39 39 38 38 38 38 37 36 36 35 35 34 34 34 35 36 35 34 35 35 34 35 34 34 32 31 31 31 32 32 32 34 35 35 35 34 34 33 32 32 31 32 34 33 33 34 33 33 32 31 30 29 31 32 32 32 32 32 32 31 31 30 29 29 28 29 29 29 29 29 28 27 27 27 27 27 66 66 66 66 64 62 62 62 62 62 62 62 63 63 63 62 62 63 63 63 63 63 63 63 64 64 63 64 65 65 66 66 66 67 67 65 65 65 65 65 65 66 66 66 67 66 65 65 66 66 66 66 66 66 66 65 64 64 65 66 65 64 64 64 63 63 62 62 62 62 62 61 60 60 60 60 59 58 58 59 59 58 58 58 58 57 57 56 56 55 55 55 55 55 55 56 56 56 56 57 57 57 57 57 58 59 60 59 58 58 57 57 56 57 57 57 57 58 58 58 58 58 57 56 55 55 54 53 52 52 52 52 52 53 53 53 55 55 55 55 55 54 54 55 55 55 54 54 54 53 53 52 51 53 53 53 53 52 51 50 50 51 50 49 49 49 50 51 51 51 51 52 52 51 51 50 50 50 50 50 50 50 50 50 51 51 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 49 49 48 46 47 48 49 49 49 50 50 49 49 49 49 49 50 50 50 49 49 48 47 47 46 46 46 46 45 46 46 47 46 45 44 43 44 45 46 46 46 45 44 43 42 43 44 44 45 46 46 46 45 45 44 43 43 44 44 44 43 42 43 43 43 43 42 41 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 38 37 37 39 40 41 41 40 39 38 37 37 37 38 40 40 39 38 37 37 37 37 37 36 35 35 35 34 34 36 37 36 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 34 35 35 36 37 36 33 32 31 30 31 32 34 35 35 35 36 37 38 39 38 39 40 40 40 38 37 38 38 38 38 36 37 39 40 39 39 39 39 39 38 37 36 37 38 40 40 40 41 40 39 40 40 40 41 42 41 40 40 40 40 40 40 39 38 37 36 36 36 38 40 41 41 40 39 38 38 37 38 39 40 40 40 40 40 41 40 40 40 39 39 39 40 40 40 39 39 39 40 42 42 42 41 41 42 42 40 40 41 42 41 41 43 43 41 40 39 37 39 41 41 40 39 38 39 40 41 41 41 42 44 44 44 43 42 43 42 41 41 41 42 42 43 43 43 42 42 42 41 41 40 39 37 38 38 37 37 38 38 36 36 35 36 36 36 36 36 36 36 36 36 35 35 34 33 32 32 32 32 32 32 32 33 34 35 34 34 34 33 32 31 31 32 31 31 32 33 32 31 30 29 30 31 32 31 31 31 31 31 30 30 30 29 29 28 28 29 29 29 29 28 27 27 27 27 27 66 66 65 65 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 64 64 63 63 63 65 66 65 66 67 67 65 64 64 65 64 64 65 66 66 66 66 65 65 65 66 66 65 66 66 66 65 65 64 64 65 65 63 63 63 63 63 63 63 63 63 62 60 60 61 61 60 59 58 59 60 59 59 59 60 59 58 58 57 57 56 56 55 55 55 55 55 55 55 55 55 56 57 57 57 57 58 59 59 59 59 58 58 57 56 56 57 57 58 58 57 57 56 56 56 55 55 54 53 52 52 52 52 51 52 53 53 54 55 54 54 54 54 53 53 54 55 54 54 54 53 52 52 51 51 52 52 52 52 51 51 50 50 50 49 48 48 49 50 50 50 50 51 52 51 51 51 50 49 50 50 50 50 50 50 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 48 49 49 49 48 46 46 47 48 49 49 49 50 50 50 50 50 50 50 50 50 50 49 48 48 47 47 46 46 45 45 45 46 46 46 45 45 43 43 44 45 46 45 44 44 43 42 42 43 43 45 46 46 46 45 45 45 44 43 43 43 43 43 42 42 43 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 36 36 37 37 37 38 39 40 40 40 40 39 38 38 37 37 38 40 40 40 40 39 39 38 37 36 36 36 36 36 36 35 37 38 37 35 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 34 36 36 36 36 36 33 31 30 30 31 33 34 36 36 36 37 38 38 38 37 38 39 40 40 38 37 38 38 37 36 36 38 40 40 39 37 39 39 37 36 36 37 38 39 39 39 40 41 39 39 40 40 40 41 42 41 41 41 40 40 40 40 40 38 37 36 36 37 39 40 41 41 40 39 38 37 37 37 39 39 39 39 40 40 41 41 40 40 39 38 39 39 39 39 39 40 40 41 42 42 41 40 40 41 42 40 40 41 41 41 42 43 42 41 40 39 37 38 41 41 40 38 38 39 40 40 41 41 42 42 42 42 42 42 42 40 41 41 42 43 43 43 43 43 43 43 42 41 41 41 40 38 39 39 38 39 39 38 36 37 38 37 37 37 36 36 36 36 36 36 35 36 36 34 34 34 34 34 34 33 32 31 33 34 33 34 35 34 32 31 31 31 31 31 31 30 30 30 30 29 30 32 32 31 30 30 30 30 29 29 29 29 28 27 28 29 29 30 29 29 29 28 27 27 26 67 66 65 64 63 63 63 63 62 62 62 62 62 62 61 61 62 62 61 61 61 61 61 62 64 64 63 63 63 65 65 64 65 67 67 65 63 64 64 64 64 65 66 66 66 65 65 64 65 65 65 65 65 65 66 66 66 64 63 63 64 64 63 63 63 63 64 63 63 62 61 60 61 61 61 60 58 59 59 60 60 60 60 60 59 58 58 57 57 57 57 56 56 55 54 54 54 55 55 55 55 56 57 57 57 58 59 59 59 59 59 58 57 56 55 56 57 57 58 58 57 56 56 56 55 55 55 54 53 52 52 52 51 51 52 53 53 54 54 53 53 53 53 53 54 55 54 53 53 53 52 52 51 51 51 52 52 52 51 51 50 50 50 49 49 48 48 48 48 49 49 51 52 52 51 50 50 49 49 49 49 49 50 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 47 46 46 48 49 49 49 49 50 50 49 49 49 49 49 50 50 50 49 48 48 47 47 46 46 45 44 46 46 45 45 45 44 43 43 45 46 45 44 44 43 42 42 43 44 45 45 45 46 45 44 44 44 43 43 43 43 42 41 41 42 42 41 41 41 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 37 37 37 36 36 36 36 38 39 40 40 40 41 40 39 38 38 37 37 38 40 40 40 40 40 40 39 38 38 38 38 38 38 38 37 37 38 37 35 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 35 36 37 36 35 33 31 30 30 31 33 33 33 34 35 36 37 37 37 38 38 39 39 40 39 37 37 38 37 36 35 37 39 40 40 39 37 38 38 36 37 38 39 40 40 39 40 40 39 39 39 39 40 41 41 41 40 40 41 40 39 40 39 38 37 37 36 36 37 39 40 40 40 40 39 38 37 37 38 38 38 38 39 40 40 41 41 41 40 39 38 39 39 39 39 40 40 40 41 41 42 41 40 40 41 41 40 39 40 40 41 42 42 41 40 40 39 37 38 40 40 38 38 39 40 41 41 42 42 41 41 41 41 42 41 40 41 42 43 43 44 44 44 43 43 43 42 42 42 41 41 41 41 40 39 39 39 39 38 37 38 39 38 38 37 35 35 35 35 34 34 35 35 34 34 33 33 34 35 35 34 33 32 31 32 32 33 34 34 34 33 33 33 33 32 30 29 29 29 29 28 29 31 31 30 30 29 29 29 29 29 29 29 28 28 29 30 31 30 30 30 30 29 29 28 27 67 66 65 64 63 63 64 64 63 63 63 62 62 61 61 61 61 61 61 61 60 60 60 61 62 62 62 61 62 64 65 64 65 66 66 65 63 63 63 63 64 65 66 66 66 65 65 64 64 64 64 64 64 64 65 66 66 65 63 63 63 63 63 63 64 64 64 64 63 62 63 62 62 62 61 59 59 59 60 60 60 60 60 60 60 59 58 58 59 59 59 58 57 56 55 55 54 54 54 54 54 55 56 57 57 58 58 58 58 59 59 58 58 57 56 56 56 57 57 58 58 58 57 56 55 55 54 54 54 52 52 52 51 51 51 52 53 53 53 53 53 52 53 54 54 54 54 54 53 53 53 52 51 50 51 52 52 52 51 51 50 50 50 49 49 48 48 48 48 48 48 50 51 52 51 50 50 49 49 49 49 49 50 50 50 51 51 51 50 50 50 50 49 49 49 49 50 50 49 49 49 49 48 48 47 46 46 47 48 48 48 49 50 49 49 49 49 49 49 50 50 49 48 47 47 46 46 46 46 45 44 45 46 46 45 45 44 43 43 44 45 45 45 44 43 42 42 43 44 45 45 45 46 45 44 44 43 43 42 42 42 42 42 41 41 41 41 41 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 37 36 36 36 37 39 40 39 39 40 39 38 38 38 37 37 38 40 40 39 39 40 40 39 39 39 39 39 39 39 39 38 38 39 36 35 34 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 34 35 37 37 34 33 31 30 30 30 33 35 35 33 34 35 36 36 36 38 39 40 40 41 40 37 36 37 38 36 35 36 37 39 40 39 39 38 38 37 37 39 40 40 41 40 40 40 39 38 39 40 40 40 41 41 40 40 40 40 40 40 40 40 39 38 37 36 36 37 40 40 40 39 39 38 37 37 38 39 39 39 39 39 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 40 40 40 39 39 40 40 41 42 42 41 40 40 40 40 38 37 38 38 38 39 40 41 42 43 42 42 42 41 41 42 41 40 40 41 42 42 43 44 45 45 44 43 43 42 42 42 42 41 41 41 41 40 40 41 40 39 38 39 39 39 38 36 35 36 35 34 35 35 36 34 33 33 34 33 33 33 33 33 33 33 32 31 31 31 33 33 32 33 33 34 33 33 32 31 31 30 30 29 28 29 29 29 29 28 28 28 29 29 29 29 29 29 29 31 32 31 31 30 30 30 30 29 28 66 65 64 63 63 63 65 65 64 64 64 63 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 60 62 64 64 64 65 66 66 66 64 63 63 63 63 64 65 65 65 66 65 64 64 63 63 63 63 63 64 65 65 65 64 63 63 62 62 63 63 63 64 64 63 63 63 62 62 62 60 59 59 60 60 60 61 61 61 61 60 60 60 60 60 60 60 59 58 58 57 56 54 54 54 54 54 54 55 55 57 57 57 57 58 59 59 58 58 58 57 56 55 55 56 56 57 57 57 56 56 55 55 54 54 53 52 52 51 51 51 51 52 53 53 54 53 52 52 53 53 53 54 54 53 53 53 52 51 50 50 51 51 52 51 50 51 50 50 50 50 50 49 49 48 48 48 48 50 51 51 50 50 50 49 49 48 49 50 50 50 51 51 51 50 50 50 50 50 49 49 49 50 50 50 49 49 49 48 47 47 47 46 46 47 47 48 49 49 49 49 48 48 49 50 50 50 49 48 48 47 46 46 45 45 44 44 44 45 46 46 45 44 43 42 43 44 45 45 44 43 42 42 43 44 44 45 45 45 45 44 43 43 43 43 42 41 41 42 41 41 41 42 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 40 40 39 39 40 40 39 39 39 39 39 39 39 39 39 39 37 36 36 36 36 39 40 39 39 40 40 38 38 38 37 37 38 39 40 39 38 39 40 40 40 40 39 39 38 38 38 38 39 39 36 34 35 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 34 36 36 36 34 32 30 30 30 31 34 36 36 34 34 35 36 36 37 38 39 39 39 39 38 37 36 38 37 35 35 37 38 39 40 38 37 37 37 36 38 40 40 40 40 40 40 39 38 39 39 40 41 41 40 40 40 40 39 39 39 40 40 40 40 38 36 36 36 38 40 40 40 39 38 38 37 37 38 39 40 40 40 40 40 40 40 40 39 40 39 38 39 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 41 42 42 43 42 41 40 39 39 40 40 38 37 38 39 39 40 41 42 42 41 41 41 40 41 41 40 40 41 41 41 42 42 43 44 45 44 43 43 43 42 42 41 40 40 40 40 40 40 41 40 40 40 40 39 38 38 36 36 37 35 35 37 37 36 35 34 34 36 35 33 33 33 33 32 32 32 32 31 30 31 31 30 31 32 34 34 34 33 32 33 32 31 31 29 28 28 28 27 27 27 28 30 31 31 31 30 29 29 31 32 32 31 30 29 29 29 29 29 65 64 63 63 63 64 66 66 66 66 64 64 64 63 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 62 63 63 64 65 65 66 65 63 63 63 63 63 64 64 65 66 65 64 63 63 63 63 63 63 63 64 64 64 64 64 64 62 62 62 62 62 63 64 63 63 63 63 63 61 60 60 60 61 62 62 62 61 61 60 60 60 60 60 60 60 60 58 58 58 57 56 56 56 55 54 54 54 54 54 56 57 57 57 58 58 58 58 58 58 57 56 55 54 55 55 56 57 56 56 56 55 55 54 54 53 53 52 51 51 51 51 51 52 53 53 53 52 52 52 52 53 53 54 53 52 52 52 52 50 50 50 51 52 52 52 52 51 51 51 50 50 50 49 49 48 48 48 48 50 50 49 49 50 50 49 48 48 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 50 50 49 49 49 48 46 46 46 45 46 47 47 48 49 49 49 48 47 48 49 49 49 49 49 49 49 48 47 46 46 45 45 44 44 44 45 45 46 45 43 42 42 44 45 44 44 43 43 42 42 43 44 44 44 44 45 44 43 42 42 42 41 41 40 40 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 39 39 38 38 39 39 38 38 38 38 38 38 38 38 38 38 38 36 36 36 36 39 40 39 39 40 40 39 39 38 37 37 37 39 40 39 38 39 39 40 40 40 40 39 39 38 38 38 38 38 36 35 35 35 33 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 35 36 36 34 33 31 30 30 30 33 35 36 37 36 35 35 35 37 38 38 38 38 38 37 38 36 36 38 36 34 36 38 39 40 40 39 38 37 37 36 38 40 39 39 40 40 38 38 38 39 40 40 41 42 40 40 40 40 39 39 40 40 39 38 38 37 36 36 36 38 40 40 39 38 38 37 37 38 38 39 40 40 40 41 41 41 41 40 39 39 39 38 39 40 40 39 39 39 39 39 39 39 39 40 40 41 42 42 42 41 42 42 41 41 40 40 39 39 39 38 37 39 40 40 41 41 42 42 41 40 40 39 39 39 40 40 42 43 42 42 42 43 44 45 45 43 43 43 42 42 40 40 41 41 40 39 39 40 39 40 41 40 39 38 38 37 37 38 36 37 37 36 35 35 36 36 35 34 33 34 35 35 34 32 32 32 31 30 31 32 30 30 32 33 32 33 32 32 32 31 30 30 29 28 27 28 29 28 28 28 29 30 31 31 31 28 29 31 31 31 30 30 29 29 29 29 29 65 64 64 64 64 65 66 66 67 67 66 65 65 64 65 64 63 62 62 62 62 62 62 62 61 61 60 60 60 62 63 63 63 64 65 66 65 64 63 63 62 63 63 64 66 66 65 64 63 63 63 62 62 63 63 63 63 64 63 64 64 63 63 62 61 60 62 63 63 63 64 64 63 62 62 61 61 63 63 62 61 61 61 60 59 60 60 60 60 60 60 59 58 58 58 57 57 57 56 55 54 54 54 54 55 56 57 57 57 58 57 57 57 57 58 57 56 54 54 54 55 56 56 55 55 55 54 54 54 53 53 53 52 52 51 51 51 51 52 52 52 52 51 51 52 53 53 54 54 52 52 52 52 50 49 50 51 52 52 52 52 51 51 50 49 49 49 50 49 48 48 47 48 49 50 49 49 49 49 49 48 48 48 48 49 50 50 50 50 50 50 49 49 49 49 49 49 49 50 49 49 48 48 47 46 45 45 45 46 47 48 49 49 49 47 47 47 48 49 49 49 48 49 49 48 47 46 46 46 46 44 43 43 44 44 45 45 44 42 42 43 44 45 45 44 43 42 42 42 44 44 43 44 44 42 42 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 38 38 37 36 36 36 36 38 40 39 39 39 39 40 40 39 38 37 37 39 39 38 38 39 39 39 39 39 40 40 40 39 39 38 38 37 36 36 35 35 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 35 35 33 32 30 30 30 30 31 34 36 36 37 37 37 36 35 37 38 38 37 37 37 37 37 36 36 37 35 35 37 38 39 40 40 39 38 37 36 36 38 38 38 39 40 39 38 39 39 40 40 40 41 41 40 40 40 40 40 40 41 40 38 38 37 36 35 36 37 39 40 40 38 37 37 37 37 39 40 40 40 40 40 41 42 42 42 42 41 40 38 38 39 40 39 39 39 39 39 39 39 39 40 40 41 42 43 42 41 41 41 41 41 41 41 40 38 38 37 37 37 39 40 41 42 42 42 41 41 39 39 39 39 40 41 41 42 44 44 44 44 43 43 44 44 44 43 43 43 42 41 41 42 42 41 41 40 40 39 38 39 40 39 39 38 38 38 38 37 36 36 35 36 37 37 36 34 34 34 35 35 34 34 33 33 33 32 33 33 33 31 31 31 30 30 30 30 29 30 29 29 28 28 28 28 30 31 30 29 29 29 28 28 29 30 29 28 30 30 30 29 29 29 29 29 29 30 65 64 65 65 66 67 67 66 66 66 66 66 65 65 65 64 63 63 63 63 63 63 63 62 62 61 61 60 61 62 63 63 63 63 64 65 65 64 63 62 62 63 63 64 65 65 65 65 64 64 63 63 62 62 62 63 63 63 63 63 64 64 63 63 62 61 61 62 63 64 64 64 64 63 63 63 63 63 63 62 61 61 61 60 59 59 59 60 60 59 59 59 59 58 58 58 57 57 57 56 55 54 53 53 54 55 56 57 57 57 57 57 57 57 58 58 56 55 54 54 55 56 56 56 56 55 55 54 54 53 53 53 53 52 52 51 50 50 50 51 51 51 51 51 52 53 54 54 54 53 52 52 51 50 49 49 51 52 52 52 52 51 51 51 50 50 49 49 49 48 48 47 47 48 49 49 49 48 48 49 49 48 48 49 50 50 50 50 50 50 49 49 49 49 49 49 48 48 49 48 48 48 47 47 46 46 45 46 47 48 49 48 49 49 47 46 47 48 49 50 49 48 48 48 48 47 46 46 46 45 44 43 43 43 43 43 44 44 43 42 42 44 45 45 44 43 43 43 42 42 43 42 42 42 41 41 41 40 40 40 40 40 40 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 38 38 39 40 39 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 40 40 39 38 38 39 39 39 38 37 36 38 38 37 37 38 38 38 38 39 39 40 40 40 39 38 37 37 38 38 37 37 35 33 32 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 32 30 30 30 30 30 31 33 34 35 36 37 38 38 37 36 37 38 38 37 37 37 36 35 36 37 36 34 36 38 39 38 39 41 40 39 37 36 37 38 38 39 39 39 38 39 40 40 40 40 40 41 41 40 41 41 40 40 40 41 42 40 39 39 37 35 36 39 40 41 40 37 36 36 37 38 39 39 39 39 39 40 41 41 42 42 42 42 40 39 38 38 39 39 39 40 40 40 40 41 41 40 40 41 42 42 42 40 41 41 40 40 40 40 39 37 37 36 38 38 38 39 40 42 42 41 40 39 38 39 40 40 40 41 42 42 43 44 44 45 43 43 43 43 43 44 44 43 43 43 43 42 42 42 41 41 41 40 38 38 39 40 40 39 39 38 37 36 36 35 36 38 37 36 35 34 35 36 36 36 35 34 34 34 34 34 35 34 33 31 30 30 31 31 30 30 30 30 30 30 30 30 30 31 31 32 31 31 31 31 30 29 28 29 29 28 28 28 28 28 27 27 27 27 28 28 65 65 65 66 66 68 68 68 67 66 65 65 65 65 64 63 64 65 65 64 64 64 63 63 62 61 61 60 60 62 62 62 63 63 64 65 65 64 63 62 62 63 63 63 64 65 65 66 65 65 65 63 62 62 61 62 62 63 63 62 63 64 63 62 62 61 60 60 61 62 63 63 63 64 63 63 63 63 62 61 61 61 61 60 59 58 58 58 59 58 58 59 59 58 58 58 57 57 58 57 56 55 54 53 53 54 55 56 57 57 57 56 56 57 57 57 56 55 54 54 55 56 56 57 56 56 55 55 54 54 53 52 52 52 52 51 50 50 50 50 50 50 51 52 52 53 53 53 53 53 52 52 51 51 50 50 50 51 52 52 52 52 52 51 51 51 50 49 49 49 49 47 47 47 47 48 48 47 47 48 48 47 47 49 50 50 50 50 50 50 49 49 49 49 49 48 48 47 47 47 47 47 47 48 48 47 45 46 47 48 48 48 49 48 46 46 48 49 50 50 49 48 47 47 48 47 46 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 44 44 44 44 43 43 42 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 40 40 40 40 39 39 38 38 38 38 37 38 38 37 37 37 36 36 37 37 36 36 36 36 36 39 40 39 38 38 38 39 39 38 37 36 37 37 37 38 38 37 37 38 38 39 40 39 39 39 38 37 37 39 39 38 37 36 35 34 32 32 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 34 35 35 35 36 37 37 37 37 38 39 39 37 37 36 35 35 35 36 37 36 34 36 37 38 38 39 40 39 38 36 36 38 39 40 40 39 39 39 39 40 41 40 39 40 41 41 40 41 41 40 39 41 42 42 41 40 39 37 36 36 38 40 39 38 36 36 37 38 39 39 39 38 39 39 40 41 41 41 42 41 42 41 39 38 38 38 39 40 40 40 40 41 42 42 41 41 41 41 42 42 40 40 40 40 41 40 40 38 37 36 37 38 39 39 40 41 42 41 40 39 38 39 41 41 40 40 41 42 42 42 43 44 44 42 41 42 43 44 44 45 44 43 43 43 41 40 40 40 40 41 40 39 39 39 39 40 40 40 38 37 37 37 37 37 39 38 36 35 35 36 37 37 36 35 35 35 35 34 34 33 34 33 31 30 32 33 33 31 31 32 32 32 32 33 32 32 32 31 32 32 32 32 32 32 31 30 28 28 28 28 28 28 28 27 27 27 28 27 27 65 65 65 66 66 67 68 68 67 66 65 65 65 65 65 65 66 66 65 65 64 63 63 63 62 61 61 60 59 60 61 62 63 63 63 64 63 63 63 62 62 62 62 63 63 64 65 65 66 66 66 64 62 62 61 61 61 62 62 61 62 63 62 61 61 61 60 60 60 61 62 63 63 63 64 63 63 63 61 60 60 60 60 60 59 59 59 58 57 57 57 58 58 58 58 58 58 58 58 57 56 55 54 54 53 53 54 54 55 56 57 56 55 56 57 57 57 55 54 54 54 55 56 56 56 55 55 54 54 54 53 52 52 52 52 51 51 50 50 49 49 50 51 52 52 52 52 53 53 53 52 52 52 51 50 49 50 50 51 51 52 52 52 51 51 51 50 50 50 50 49 48 48 47 47 47 46 46 46 47 47 47 47 49 50 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 48 48 49 49 47 46 45 46 47 47 47 48 47 45 46 48 49 49 49 49 49 48 47 46 45 45 45 45 45 45 45 45 45 45 44 43 43 43 42 42 42 42 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 40 40 40 39 39 39 39 38 38 38 38 38 38 37 36 36 36 36 36 36 36 36 36 38 39 39 39 38 38 38 38 38 37 36 37 37 37 37 37 37 38 38 39 40 40 39 38 39 38 37 37 39 39 38 37 36 36 35 33 32 32 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 34 36 37 36 36 37 37 37 37 38 39 38 36 36 36 35 36 37 37 37 36 34 35 36 38 39 40 40 39 38 36 36 38 40 41 40 39 39 40 40 40 40 38 39 41 41 41 40 40 40 39 39 40 41 41 40 40 39 37 36 36 38 39 38 37 36 36 38 39 40 40 40 40 40 40 41 41 41 41 41 40 41 41 40 38 38 38 39 39 40 40 41 42 42 41 40 40 41 41 41 41 40 40 40 41 41 40 38 37 36 36 38 39 39 40 41 42 42 41 39 38 39 40 42 42 41 42 43 44 43 42 43 43 42 41 41 42 43 44 44 45 45 43 42 42 41 40 40 41 41 41 41 41 40 40 39 38 39 40 39 38 38 37 37 38 39 38 37 36 37 38 37 37 36 36 36 35 35 34 33 33 33 33 32 32 34 34 34 32 31 33 33 33 33 33 33 33 33 32 32 32 32 32 31 31 31 30 29 27 28 30 29 29 29 29 29 29 29 28 28 65 65 65 65 65 65 66 66 66 66 65 65 64 64 64 64 65 65 65 65 64 64 63 63 62 61 61 60 59 59 60 61 62 63 63 63 63 62 62 62 61 61 62 63 64 64 64 64 65 65 64 64 64 63 62 61 60 61 61 61 61 62 62 62 60 60 60 60 61 62 63 62 62 63 64 63 63 62 61 61 61 60 60 60 60 60 60 59 58 57 57 57 58 59 59 59 59 58 57 57 57 56 55 54 54 53 53 53 54 55 55 55 54 55 57 57 57 56 54 54 54 54 55 56 56 55 55 54 54 53 53 53 53 53 53 52 52 51 51 49 49 49 50 52 52 51 51 52 53 53 53 52 52 51 50 49 50 51 51 50 50 51 52 51 51 50 50 50 50 50 49 49 49 48 47 47 46 46 46 46 46 47 47 48 49 49 49 49 49 49 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 46 45 45 45 46 47 47 46 45 47 47 48 49 49 48 48 47 46 46 45 45 45 45 46 46 46 46 46 46 45 44 44 43 43 42 42 42 42 42 42 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 36 36 36 35 35 37 39 40 39 39 38 38 38 38 37 36 37 37 36 37 37 38 39 39 40 40 40 39 38 39 39 37 37 38 39 39 37 37 37 36 36 34 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 33 33 34 35 36 37 37 37 36 36 37 38 38 37 36 36 35 36 37 38 38 37 35 34 36 37 38 40 40 39 40 38 36 36 38 39 40 39 38 39 40 40 39 38 38 40 41 42 41 40 40 39 38 39 40 40 40 39 38 38 37 36 36 38 39 37 36 36 38 38 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 38 38 39 39 39 40 41 41 41 41 41 40 40 40 41 40 40 40 40 41 41 40 38 37 36 36 37 38 40 40 40 41 41 41 40 38 38 39 41 41 41 41 42 43 43 42 42 42 42 42 42 42 42 42 43 43 44 45 44 43 42 42 42 42 42 41 41 41 41 41 40 40 38 38 39 40 39 39 38 38 38 38 37 37 37 38 39 38 37 37 37 37 36 35 34 34 34 34 34 33 33 34 34 33 33 33 33 34 34 34 33 32 33 33 32 31 31 32 31 31 31 31 30 29 28 29 30 30 29 30 30 30 29 29 28 28 65 65 65 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 64 64 64 64 64 64 63 62 61 60 59 59 60 60 61 62 63 63 63 62 62 61 61 62 63 64 65 64 63 64 65 65 63 63 64 64 62 61 60 60 60 61 60 60 62 63 61 60 59 60 62 62 63 62 62 63 63 63 62 62 61 61 61 61 61 61 61 60 60 60 59 58 57 57 58 58 59 59 59 58 58 58 58 57 56 55 54 53 52 53 54 54 54 54 54 56 57 57 57 56 55 54 54 54 54 55 56 56 56 55 54 54 54 55 54 53 53 53 53 52 51 50 49 49 49 50 50 50 51 52 52 53 53 52 52 51 50 49 50 51 51 50 50 50 51 51 50 50 50 50 50 49 49 49 50 49 49 48 48 47 47 46 46 46 46 46 47 48 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 46 46 46 47 48 48 47 47 46 46 46 47 47 46 46 47 47 47 47 46 46 45 44 44 43 43 42 42 42 42 41 41 41 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 39 39 40 40 39 40 40 40 40 40 40 39 39 39 39 39 38 39 38 38 38 38 38 38 38 37 36 36 35 35 37 39 39 39 39 38 37 38 38 37 36 36 36 37 37 38 39 39 39 40 39 39 39 38 38 38 36 36 37 37 38 38 38 38 37 37 36 35 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 33 34 35 34 34 36 37 37 36 35 36 38 38 38 37 36 35 35 36 37 38 38 35 33 35 37 38 40 41 40 39 39 38 36 36 37 38 39 39 38 38 39 39 38 39 39 40 41 41 40 39 39 38 38 39 40 40 40 39 37 36 35 36 37 38 37 36 35 37 39 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 39 38 38 38 39 40 40 40 40 40 40 41 41 40 40 40 39 39 39 40 41 41 40 39 38 36 36 37 37 38 41 41 41 41 41 40 38 38 39 40 40 40 40 41 42 41 42 41 41 41 41 42 44 44 43 43 43 44 45 45 43 43 42 42 42 41 41 40 40 40 40 40 40 40 39 38 37 39 40 40 40 39 38 38 38 38 38 38 39 39 37 37 37 37 36 35 35 35 35 35 34 33 33 33 33 32 33 34 34 34 34 34 33 32 33 32 31 31 31 31 31 30 30 30 30 29 29 30 31 31 30 31 31 30 29 28 28 28 66 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 64 64 64 64 63 62 61 60 59 59 59 60 60 62 63 63 63 62 61 60 61 62 63 64 64 63 63 64 66 66 64 63 63 63 62 62 61 60 60 60 60 60 60 61 61 60 59 60 61 61 62 62 61 61 62 62 61 62 61 60 60 60 60 61 61 60 60 60 59 58 57 57 57 58 58 58 58 58 59 59 58 57 56 55 54 54 52 52 54 54 54 54 54 55 56 57 57 56 55 55 55 54 53 54 55 55 56 55 55 55 55 55 55 54 54 53 53 53 52 51 50 49 49 49 49 50 52 52 52 53 53 52 52 51 50 49 49 50 51 51 50 50 50 50 50 50 49 49 50 49 49 49 49 49 49 49 49 49 48 47 46 46 46 46 46 47 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 45 45 46 46 46 45 46 46 47 47 47 47 48 47 47 46 46 46 45 44 44 44 44 43 42 42 42 42 42 42 43 43 43 42 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 39 39 40 40 39 38 38 38 38 38 38 38 38 38 37 36 36 35 35 36 38 39 39 39 39 37 38 38 37 36 36 37 38 38 39 39 39 38 39 38 39 39 38 38 38 36 36 36 38 38 38 38 39 38 38 39 38 37 36 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 33 35 35 35 37 36 35 36 36 36 35 35 37 38 38 37 36 35 34 35 36 37 38 37 35 33 35 38 39 39 41 40 38 38 36 36 37 38 39 39 39 38 38 38 38 38 39 39 40 41 40 39 38 37 38 39 39 40 40 39 39 38 36 35 36 37 37 36 35 36 38 40 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 39 38 37 38 39 40 40 40 40 40 40 40 41 40 40 39 38 39 40 41 42 41 40 39 37 36 36 37 38 39 40 41 41 41 40 39 38 38 39 40 40 41 41 42 41 40 40 41 41 41 42 43 44 45 44 43 43 44 44 44 43 42 41 41 41 41 40 40 39 39 38 39 39 39 40 39 38 38 38 39 40 39 39 38 38 38 39 38 38 38 37 37 37 38 37 36 36 36 35 35 34 34 33 33 32 32 33 34 34 34 34 34 33 33 33 33 33 32 30 30 30 30 30 30 30 31 31 31 32 31 31 31 31 30 29 28 28 29 66 66 66 66 65 64 63 63 63 63 63 62 62 62 62 63 64 64 63 62 62 63 63 63 62 61 60 60 59 59 59 59 60 61 62 62 62 61 60 60 61 62 63 63 63 63 63 64 65 64 64 63 63 62 62 63 62 60 60 60 60 60 59 59 60 60 59 59 60 60 61 61 60 60 62 62 60 61 61 61 61 60 59 59 60 60 60 60 59 58 57 57 57 57 57 58 58 58 58 58 58 57 57 56 55 54 53 52 52 53 53 54 54 55 55 56 57 56 55 55 55 54 53 54 55 55 55 56 55 55 55 55 54 54 55 54 53 53 52 52 51 50 49 49 49 50 52 52 52 53 53 52 52 51 51 49 49 50 50 50 50 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 46 46 47 47 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 44 44 44 45 45 46 46 46 46 46 46 46 46 45 44 43 44 44 43 43 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 39 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 36 35 35 35 37 38 38 39 38 37 37 37 37 36 36 37 38 38 39 39 39 38 38 38 39 40 39 39 39 38 36 36 38 38 38 38 40 40 39 39 39 39 39 36 34 34 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 35 36 37 37 37 35 35 35 35 34 34 35 36 38 38 37 35 34 34 36 37 37 37 36 34 34 36 38 38 38 40 40 38 37 35 35 37 38 40 41 40 38 37 38 38 38 38 39 40 40 40 39 38 37 38 40 40 40 40 38 37 37 35 35 36 37 36 35 36 38 40 40 40 40 40 41 41 40 40 40 41 41 40 40 40 39 39 38 37 37 38 39 39 40 39 39 40 40 40 41 40 39 38 38 39 40 41 41 40 40 39 37 36 36 37 38 39 40 40 39 39 40 38 37 38 40 40 41 41 41 41 40 39 40 40 40 41 42 42 43 44 44 43 42 42 42 42 42 42 41 41 41 41 40 39 39 39 39 38 38 38 39 39 38 37 37 38 39 40 39 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 36 35 35 34 35 34 33 34 34 34 34 34 34 34 34 34 33 33 33 32 31 30 30 31 31 31 32 31 31 31 32 31 31 31 31 30 29 28 28 29 66 66 66 65 65 64 63 63 63 63 63 63 63 62 62 64 65 64 63 62 62 62 62 61 61 60 60 60 59 59 59 59 60 61 61 62 61 60 60 61 62 63 63 63 63 63 63 63 63 63 63 64 63 62 62 63 62 62 61 60 60 60 60 59 59 60 60 60 60 60 60 60 60 61 62 61 60 60 60 60 60 60 59 58 59 59 60 60 59 58 58 57 56 56 57 57 57 58 58 58 58 58 57 57 56 55 54 53 52 52 53 54 54 55 56 56 56 56 55 54 54 54 53 53 54 55 55 55 56 56 55 55 54 54 54 54 53 53 53 53 52 51 50 50 49 50 51 51 52 52 52 52 52 52 52 50 48 49 50 50 50 51 51 50 50 50 49 49 48 49 48 48 48 47 47 47 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 39 39 39 39 39 38 38 38 38 37 37 37 37 37 37 37 36 35 35 35 36 37 38 38 38 37 37 37 37 36 36 36 37 38 39 39 38 38 37 38 39 39 39 40 39 38 37 37 37 38 37 38 39 40 40 38 38 39 38 36 37 37 35 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 37 37 38 37 36 34 33 33 34 35 36 36 37 37 37 37 35 33 34 36 37 36 34 34 34 35 36 38 38 38 39 39 37 36 35 36 37 37 39 40 39 37 37 38 39 39 40 40 40 40 40 38 36 37 38 38 40 40 40 38 37 36 35 35 36 37 36 35 36 38 39 39 39 39 40 40 41 40 40 40 40 40 40 40 40 39 38 37 37 37 38 39 39 39 38 39 40 40 41 41 40 39 38 39 40 39 40 40 40 40 38 36 36 37 38 38 39 39 40 39 39 38 38 38 39 40 40 40 40 39 39 38 39 40 40 40 40 41 42 43 43 44 44 41 41 42 42 43 43 42 41 41 40 40 39 39 40 40 39 39 38 38 38 37 37 37 37 37 38 39 38 38 38 38 38 37 37 37 37 38 37 37 37 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 32 31 31 32 32 32 31 31 32 31 31 30 29 30 30 29 29 29 30 66 66 66 65 65 64 64 64 65 65 64 63 63 63 63 63 64 63 63 63 62 61 60 61 61 60 60 60 59 59 59 59 59 60 61 61 61 60 60 61 63 63 63 63 62 62 63 63 63 63 63 63 63 62 62 62 62 62 62 61 62 61 61 60 60 60 61 60 59 59 60 60 60 62 62 60 60 60 60 60 60 60 60 58 58 58 58 59 60 59 58 57 56 55 55 56 56 57 57 57 58 58 58 58 57 56 55 54 53 52 52 53 54 55 55 55 56 56 55 55 55 54 53 52 53 54 54 55 56 56 55 55 54 54 54 53 53 53 53 53 52 52 51 50 49 48 49 50 51 51 52 52 51 51 51 50 48 48 49 49 50 50 50 50 49 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 36 37 38 37 37 37 37 37 36 36 36 37 38 39 39 38 37 37 37 38 39 39 40 38 38 37 36 37 38 37 37 39 40 40 38 37 37 36 35 36 36 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 34 37 38 37 36 36 33 33 33 35 37 37 38 38 37 36 36 34 33 34 36 37 35 33 33 35 36 36 38 38 37 38 38 37 35 35 37 38 38 39 40 39 37 38 39 39 40 40 40 40 39 40 39 36 37 38 38 39 40 40 38 37 36 35 35 37 37 36 35 37 38 38 39 39 39 40 40 41 40 40 39 40 40 40 41 40 39 37 37 36 37 39 38 38 38 38 39 39 40 40 41 40 39 38 38 39 39 40 40 41 40 38 36 36 36 38 38 38 39 40 39 38 37 37 39 40 40 40 40 39 38 39 40 40 40 41 42 42 41 41 42 43 44 43 41 41 42 42 42 43 43 42 41 41 41 39 39 40 40 40 40 39 39 38 37 38 38 37 36 36 38 39 39 38 38 39 38 37 37 37 38 38 37 37 36 36 37 37 36 36 35 35 35 34 34 34 35 34 34 34 34 34 34 33 33 33 33 33 32 32 32 32 32 32 32 31 30 29 29 29 29 29 29 29 29 30 67 66 66 65 65 65 65 65 66 65 64 64 63 63 63 63 63 62 62 62 61 60 60 61 61 60 60 60 59 59 59 59 59 59 60 60 60 60 59 61 63 63 63 63 61 61 62 62 62 63 63 63 63 62 61 60 60 61 62 62 62 61 61 62 61 61 61 60 59 59 59 60 60 61 62 61 60 60 59 59 60 60 60 60 58 57 57 57 58 59 59 58 57 56 55 55 55 55 55 56 57 57 58 57 57 57 55 54 54 52 51 52 53 55 55 54 55 56 56 56 55 54 53 52 52 53 53 54 56 56 55 55 55 54 53 52 52 52 52 53 52 52 51 50 49 48 48 49 49 50 51 52 51 50 51 50 49 48 48 48 48 49 48 48 47 47 47 46 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 36 37 38 38 37 37 36 36 36 36 37 37 39 39 38 38 38 38 37 37 38 39 38 37 38 36 36 37 36 37 38 40 39 37 37 37 36 36 34 35 35 34 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 36 38 36 35 35 33 33 35 36 37 37 38 38 37 35 34 33 32 35 36 35 34 33 33 35 36 36 37 37 37 38 38 36 35 36 37 37 38 40 40 38 37 38 39 39 39 39 39 39 39 40 39 37 37 38 38 38 39 39 38 37 36 35 35 36 36 35 35 37 38 39 40 40 40 40 41 41 40 40 40 39 39 40 40 40 39 37 36 36 38 39 38 37 38 38 38 39 39 40 40 39 38 38 38 38 38 39 40 40 39 38 36 36 36 38 38 39 39 39 38 37 37 38 39 40 40 39 39 38 38 39 41 42 41 41 42 42 41 41 42 42 43 42 41 40 41 41 42 43 43 42 41 41 41 39 39 40 41 41 40 40 39 38 39 39 38 38 37 36 36 37 38 38 39 39 38 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 32 31 32 32 33 32 32 32 31 30 30 29 29 29 30 29 29 29 30 69 68 67 66 66 66 66 66 66 65 64 64 63 63 63 62 62 62 62 61 61 61 62 62 61 60 60 60 60 59 59 59 59 59 59 59 60 60 59 61 62 62 62 62 61 60 61 61 62 63 63 63 63 62 61 60 60 60 60 61 61 60 61 62 62 61 61 61 60 58 59 59 60 61 62 61 60 60 60 59 59 59 60 59 58 57 56 56 57 58 58 58 57 57 55 55 54 54 54 54 56 57 57 57 57 57 56 55 54 53 51 51 53 55 55 54 55 55 56 56 56 54 54 53 53 52 53 54 55 56 56 55 55 54 53 53 52 51 52 52 51 51 51 51 50 49 48 48 49 50 51 52 52 50 50 50 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 36 37 38 38 37 37 36 36 36 37 38 39 40 39 39 39 38 37 37 37 37 36 37 37 36 36 37 37 38 39 40 40 38 38 38 38 38 36 35 34 35 36 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 37 35 33 32 33 35 36 37 37 37 37 37 36 35 34 33 33 35 34 33 33 33 34 36 38 38 38 37 36 38 38 36 34 35 37 37 38 39 39 37 37 38 38 39 40 39 39 39 39 40 39 37 36 37 37 38 38 39 38 37 36 35 35 35 35 35 36 37 38 39 39 40 41 40 40 40 40 40 40 40 39 39 40 40 39 37 36 37 38 39 38 37 38 38 39 38 39 39 39 38 37 38 38 38 38 39 40 39 37 37 36 36 36 38 38 39 38 38 37 36 36 38 39 38 38 38 38 39 39 40 41 42 41 41 41 41 41 41 41 42 42 41 40 40 41 42 42 42 43 43 42 40 40 39 39 40 41 41 41 40 39 39 40 40 39 38 37 37 36 36 36 38 39 38 37 37 37 36 36 37 37 37 37 37 36 35 36 36 36 36 35 35 35 35 34 34 34 35 35 35 34 34 33 33 33 32 30 30 31 32 32 32 32 32 32 31 30 30 30 30 30 31 30 30 70 70 68 66 67 67 67 67 67 66 65 64 64 63 63 62 62 62 62 62 61 62 62 62 62 61 61 60 60 59 59 59 59 58 58 58 59 59 59 60 60 61 61 61 61 60 60 62 62 63 63 63 63 63 62 62 61 60 60 60 60 60 60 61 61 61 61 60 60 59 58 59 60 61 60 60 61 60 60 59 58 58 58 57 57 57 57 57 56 56 57 57 57 57 56 55 55 54 54 54 55 56 56 57 56 56 56 55 55 53 51 51 53 54 55 55 55 55 55 55 55 55 55 54 53 52 52 53 54 55 55 55 55 54 54 54 52 52 52 51 51 50 50 51 51 50 48 48 48 49 51 52 52 51 50 49 48 48 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 36 37 37 38 37 36 35 36 37 38 38 39 39 39 39 39 39 39 39 37 36 36 36 35 35 36 37 38 40 40 40 39 39 39 38 37 36 35 34 36 36 35 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 36 34 33 32 35 37 37 35 35 36 36 35 35 35 33 32 34 34 32 33 34 35 36 36 38 39 38 37 36 37 37 35 35 36 36 38 39 39 38 37 38 38 38 40 40 40 39 39 40 40 38 37 36 37 38 38 38 39 39 37 35 34 34 35 35 36 36 37 37 38 38 39 40 40 40 40 40 40 40 40 39 39 40 39 38 37 36 36 38 38 37 37 37 38 38 38 39 39 38 38 38 38 38 39 39 40 40 39 37 36 36 36 37 38 38 38 37 37 36 36 38 39 38 38 39 39 39 40 41 41 41 42 41 40 40 41 41 40 40 41 41 41 41 41 42 42 42 41 42 42 42 41 41 41 40 40 41 41 41 40 40 40 39 40 40 39 38 38 38 37 36 37 38 38 37 37 37 36 36 37 36 37 37 37 37 36 35 36 37 36 36 36 36 35 35 35 35 35 35 34 34 33 32 32 32 32 31 31 31 31 31 31 31 31 31 31 30 30 31 31 31 31 31 30 70 71 69 67 67 68 67 67 67 67 66 65 65 65 65 64 63 63 63 63 62 62 63 63 64 63 62 62 61 60 60 59 59 58 58 58 58 59 59 60 60 61 61 60 60 60 61 63 62 62 62 63 64 63 63 63 62 62 61 61 61 60 60 60 60 60 61 60 60 60 59 59 60 60 60 61 61 60 60 59 59 58 58 58 58 58 58 57 57 56 56 56 56 56 56 56 55 55 54 54 54 55 56 57 56 55 55 55 55 53 51 51 52 54 55 55 54 54 55 55 55 55 55 54 53 52 52 52 53 54 54 55 55 54 54 54 54 54 53 52 52 51 50 50 50 50 49 48 48 48 50 51 51 51 50 48 48 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 36 37 37 35 35 37 38 38 39 39 38 39 39 39 39 39 39 38 38 36 36 36 35 35 36 37 39 39 39 39 38 38 36 35 36 35 35 36 36 35 34 34 33 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 36 33 33 35 36 37 35 34 35 35 35 34 34 33 33 32 33 33 32 33 35 37 37 37 37 38 38 37 35 36 36 34 35 36 37 38 39 38 37 37 38 38 38 39 40 39 38 39 40 40 38 37 37 38 39 39 38 38 38 37 35 34 34 35 36 38 38 37 38 37 38 39 39 40 40 41 41 41 41 40 39 39 40 40 39 37 36 35 37 38 37 38 38 38 38 38 39 40 39 37 37 38 39 39 39 38 39 38 36 36 36 36 38 38 39 38 36 36 36 37 39 40 39 40 41 41 41 41 41 42 41 41 41 40 39 39 39 39 40 41 41 41 42 42 42 42 41 40 41 42 42 42 42 42 41 40 41 42 41 40 40 40 39 39 39 39 39 39 38 38 37 36 36 37 37 37 37 37 38 37 37 36 36 37 37 37 36 35 36 36 36 35 36 36 35 35 35 35 35 34 34 33 33 33 33 33 33 33 31 30 30 29 29 29 30 30 30 29 30 30 31 31 31 30 70 71 70 68 68 68 67 67 67 67 66 67 67 67 67 66 64 63 64 64 63 63 63 64 64 63 63 63 62 61 61 61 60 59 58 58 58 59 59 59 60 61 60 60 60 60 61 62 61 60 61 62 63 64 63 63 63 63 63 63 63 61 60 60 59 60 61 61 60 60 59 58 59 59 60 61 61 60 60 60 60 60 60 60 59 59 58 57 57 57 56 55 55 54 54 54 55 55 54 54 54 54 55 56 56 55 54 54 55 54 52 51 51 52 53 53 54 54 54 54 54 55 55 54 53 52 51 51 52 53 54 55 55 55 54 53 54 54 54 53 53 52 51 50 49 49 49 48 48 48 48 50 49 49 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 36 36 35 35 36 37 38 39 38 38 38 38 38 39 38 37 37 37 36 37 37 35 35 36 38 38 38 38 39 38 38 38 38 37 35 35 37 37 35 34 35 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 35 33 34 36 36 34 33 35 36 34 33 33 32 32 32 32 32 32 33 35 36 37 38 38 38 37 37 36 34 34 34 34 36 37 38 39 39 38 37 37 39 39 39 40 40 38 38 39 40 39 38 37 38 38 39 39 39 38 37 36 35 34 34 36 37 39 39 39 39 39 39 40 40 40 40 40 41 41 41 40 40 39 40 40 39 38 36 35 36 37 37 38 39 39 39 38 39 39 39 37 38 39 39 38 37 37 37 36 36 36 36 37 38 38 37 36 36 36 37 38 39 41 41 40 41 41 42 42 41 41 40 40 39 39 39 40 40 40 40 41 41 41 42 41 41 40 40 41 41 42 42 42 43 42 41 41 41 41 41 40 40 40 40 39 38 39 39 39 38 37 37 37 36 36 36 37 38 38 38 38 37 37 36 36 37 37 36 35 35 36 36 35 35 36 35 35 35 35 35 34 34 34 34 34 34 34 34 33 32 31 31 31 30 30 29 28 28 28 28 28 29 30 31 30 69 70 70 69 68 67 67 66 66 66 66 67 67 67 67 66 65 65 65 65 65 64 65 65 64 63 63 63 63 62 62 63 62 60 59 58 58 58 58 59 59 60 60 60 59 60 61 61 60 60 61 62 63 63 64 63 63 63 62 62 63 61 61 60 60 59 60 61 60 60 59 58 59 60 60 61 61 60 60 61 60 60 60 59 59 59 58 57 58 58 57 56 55 54 54 54 54 54 54 54 54 53 54 54 55 55 54 54 54 54 53 51 51 51 52 52 54 54 54 54 54 54 54 54 54 53 52 51 51 53 54 54 54 54 54 53 52 52 52 52 53 52 52 51 50 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 36 37 38 39 39 38 38 38 38 38 38 37 37 37 37 37 36 35 35 37 39 39 37 37 39 40 39 38 38 38 36 35 37 38 35 35 36 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 32 34 36 34 33 35 36 35 32 32 32 32 32 32 32 32 33 34 35 35 37 38 38 37 37 37 35 33 33 33 34 37 38 39 40 40 38 37 38 39 39 40 40 40 38 38 40 40 39 37 36 38 38 38 39 39 38 37 36 34 34 35 36 37 38 39 40 40 40 40 40 40 40 40 40 40 41 41 40 39 39 39 40 39 38 37 36 37 37 37 38 38 39 39 38 38 38 38 37 38 38 37 37 36 36 36 36 36 37 37 38 37 36 36 36 36 37 38 39 40 40 40 40 41 41 41 41 40 39 39 39 38 38 39 41 42 42 41 40 40 41 41 40 40 40 40 41 41 41 41 42 42 42 42 42 41 41 41 41 41 40 39 38 38 38 38 39 39 38 38 38 37 36 35 36 37 39 38 38 37 37 36 36 36 37 37 36 36 35 35 35 35 36 36 36 35 35 35 34 34 34 34 34 33 33 33 33 33 32 32 32 31 30 29 29 28 28 28 27 27 28 28 28 69 70 70 69 68 67 67 66 66 66 65 65 66 66 66 66 65 64 64 64 65 65 65 65 65 64 63 63 63 63 63 62 61 61 60 58 57 57 58 58 59 60 60 60 59 60 60 60 60 60 60 62 63 63 64 63 63 63 62 61 61 60 60 60 60 59 59 60 60 60 58 58 59 60 60 60 60 60 61 61 60 60 60 59 60 59 58 58 58 58 58 57 56 56 55 54 54 54 54 54 54 54 53 53 54 54 54 55 54 53 52 51 51 51 52 53 54 54 54 54 54 54 54 54 55 54 53 52 51 52 53 53 54 54 54 53 52 52 51 52 53 53 52 52 51 50 49 50 49 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 36 37 38 39 40 39 39 39 38 37 37 37 38 38 38 37 37 35 34 36 38 39 37 37 38 39 39 38 38 37 35 36 38 37 36 36 37 37 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 36 36 33 34 36 36 33 31 31 33 35 35 34 33 33 33 34 35 36 37 37 37 37 36 36 34 33 33 34 36 37 37 38 39 39 37 37 38 38 39 40 40 40 38 39 39 39 38 36 36 38 37 38 40 40 38 37 36 34 34 35 36 37 38 40 40 41 41 40 40 40 40 40 40 40 41 40 40 39 38 39 39 38 38 36 35 36 37 37 37 38 39 39 38 38 38 37 37 37 37 36 36 36 36 36 36 37 38 38 38 37 36 36 37 38 38 39 40 40 39 39 40 42 40 40 39 38 38 39 39 38 39 40 41 41 41 41 40 40 40 40 40 40 40 40 40 39 40 41 41 41 41 42 42 41 41 41 41 42 40 39 39 38 38 37 37 38 38 38 38 38 37 36 35 35 37 38 38 37 37 37 36 36 36 36 36 36 35 35 34 35 36 36 36 36 36 36 35 35 35 35 34 34 33 32 32 32 32 32 31 30 30 30 30 30 30 30 29 28 28 28 28 70 69 69 69 68 67 67 67 66 66 65 65 65 65 65 65 64 63 63 63 63 63 63 64 64 64 64 63 63 63 63 62 61 61 61 60 58 57 57 58 59 59 60 60 60 60 60 60 60 60 60 62 63 63 63 63 63 63 62 61 60 60 60 60 60 60 59 59 59 58 58 57 58 59 59 59 60 61 61 61 61 61 60 60 60 60 59 59 59 58 58 56 56 57 56 56 56 56 55 54 54 54 54 54 53 53 53 54 54 53 52 51 51 51 51 52 53 54 54 53 53 54 53 54 54 54 53 52 52 51 52 53 54 54 54 53 52 51 51 52 53 53 52 52 52 51 50 50 50 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 41 41 41 41 41 41 40 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 39 39 39 39 39 38 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 36 38 39 39 39 39 39 39 38 37 38 38 37 37 37 37 35 34 36 38 38 37 37 37 38 39 39 38 37 36 37 38 38 38 37 37 37 36 34 32 31 32 32 31 31 30 30 30 30 30 30 30 30 30 30 30 32 35 36 36 34 33 35 33 31 31 32 33 34 35 36 35 34 34 35 37 38 37 37 36 35 35 34 32 33 34 36 37 38 38 38 38 37 36 37 37 37 39 40 40 39 38 38 38 38 38 36 37 37 38 39 40 39 38 36 35 34 34 35 36 37 39 40 40 40 41 41 40 40 39 39 40 41 41 40 40 39 38 39 39 38 38 36 35 36 37 37 38 39 40 40 39 38 38 37 37 37 36 36 36 37 37 37 37 37 37 37 37 36 36 37 38 38 39 40 39 39 38 39 39 39 38 38 38 38 38 39 40 40 40 41 41 41 40 40 39 39 39 39 40 41 40 40 40 40 40 41 41 41 42 42 42 42 42 41 41 42 41 40 40 39 38 38 38 38 37 37 37 37 37 36 36 35 36 37 38 38 38 37 37 36 36 36 36 36 35 35 35 34 34 34 35 36 37 36 36 36 36 36 36 35 34 34 33 33 33 33 33 32 32 32 33 32 32 32 31 31 31 31 30 70 69 69 69 69 68 67 66 66 66 65 65 65 65 64 63 63 63 63 63 63 63 63 63 63 64 63 63 63 62 62 63 61 61 61 60 60 59 57 58 58 58 58 58 59 59 59 60 60 61 61 62 62 62 63 63 63 63 63 63 62 62 62 61 61 60 60 60 59 58 58 57 58 58 58 59 60 61 61 61 61 61 60 60 60 60 60 60 60 59 57 57 56 57 57 57 58 58 57 56 56 55 55 54 54 54 53 52 52 52 52 51 51 51 51 51 52 52 53 53 53 53 53 54 54 53 53 53 52 51 51 52 53 53 53 53 52 51 50 51 52 52 52 52 51 51 50 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 40 40 40 40 41 41 42 42 42 42 43 44 44 44 43 43 43 42 42 41 41 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 41 41 41 41 40 39 38 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 38 39 39 38 38 39 39 39 38 38 38 37 37 36 35 35 34 36 38 37 37 37 38 38 39 39 38 38 37 37 37 38 39 38 38 37 36 36 34 32 33 33 33 33 31 30 30 30 30 30 30 30 30 30 30 33 36 36 34 32 31 31 30 31 33 34 33 33 34 36 36 36 37 37 38 39 38 37 35 34 33 32 33 35 35 36 38 38 38 38 37 37 38 38 38 38 39 40 39 38 39 38 38 38 37 37 37 38 39 39 40 39 38 36 35 34 34 34 36 37 39 39 40 40 41 41 40 40 40 40 41 41 41 40 40 39 39 40 39 38 38 36 35 35 37 38 39 39 40 40 40 39 38 37 37 36 36 36 36 37 37 37 37 36 36 36 36 36 37 38 39 39 39 39 38 38 37 37 37 37 37 38 38 39 39 39 40 40 41 42 41 40 40 40 39 38 39 40 41 41 40 40 41 41 42 42 42 42 43 43 43 43 43 41 40 41 41 41 40 40 40 39 38 38 37 37 36 36 36 36 37 37 36 36 37 37 38 38 37 37 37 37 37 35 35 35 35 35 34 34 34 35 36 36 36 37 37 37 37 36 35 35 34 35 35 34 34 34 34 33 34 34 33 33 33 33 32 32 32 70 70 69 69 69 69 68 67 66 66 65 65 65 66 65 64 63 63 63 63 63 62 62 62 62 63 63 63 63 62 61 61 61 60 60 60 60 60 58 57 57 57 57 57 58 59 60 60 61 62 61 61 61 61 63 63 63 63 63 63 63 63 62 61 61 60 61 61 60 59 58 57 57 57 58 60 60 60 61 61 61 61 61 60 60 60 61 60 60 59 58 57 57 58 58 58 58 58 57 57 57 57 56 55 55 54 53 52 52 52 52 52 51 51 51 51 51 51 51 52 52 52 52 53 53 53 53 54 53 51 50 50 51 52 52 53 52 51 49 50 50 50 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 41 42 43 44 44 44 45 44 44 45 46 45 44 44 44 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 39 38 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 37 39 38 38 38 39 40 39 39 38 38 37 37 36 36 35 34 36 37 36 36 37 38 39 39 39 39 38 38 37 36 37 38 38 37 37 35 35 35 34 35 35 36 35 33 31 30 30 30 30 30 30 30 30 31 34 35 33 31 30 31 32 33 33 35 36 35 34 35 36 36 37 37 36 38 38 37 36 34 33 32 33 35 36 36 36 38 38 37 37 37 38 38 39 39 39 39 39 37 38 39 38 38 37 36 36 37 38 39 39 39 38 38 36 35 34 34 35 37 38 39 39 39 41 41 41 40 40 41 41 41 41 41 40 39 39 40 40 39 38 38 36 35 35 37 38 39 39 40 40 40 39 38 37 36 36 36 36 36 36 36 36 36 36 37 37 37 37 38 38 39 39 39 37 37 36 36 36 37 38 38 40 40 39 40 40 40 41 41 41 41 41 40 40 40 39 39 40 41 40 40 40 41 41 42 42 41 42 43 44 43 43 42 41 40 40 41 41 40 40 40 39 38 37 37 37 37 37 37 38 38 38 36 35 36 37 38 38 38 38 37 37 37 36 36 37 36 36 36 35 35 34 34 34 34 34 35 36 36 36 36 36 36 36 36 35 34 34 34 32 33 34 34 34 34 33 32 31 31 70 69 69 68 68 68 69 68 67 66 65 65 66 66 66 64 64 65 64 63 63 63 62 61 61 62 62 62 63 62 61 60 60 59 59 59 58 58 57 57 57 57 57 57 57 59 60 60 61 62 61 61 60 61 62 63 62 62 62 62 62 62 62 61 60 60 61 61 61 60 58 57 56 57 59 60 60 60 60 60 61 61 61 60 60 60 60 60 60 60 59 58 58 58 58 58 58 58 58 58 58 58 57 56 55 54 54 54 54 54 53 54 53 52 51 51 51 51 51 51 51 51 52 52 53 53 52 53 54 53 52 50 50 50 50 51 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 42 45 46 46 45 45 46 46 45 46 46 45 44 44 44 43 43 42 41 41 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 40 40 40 41 41 41 40 40 39 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 38 39 39 39 38 37 37 37 36 36 35 35 36 36 36 36 37 38 39 39 38 38 38 39 38 36 36 37 37 37 37 35 34 35 35 36 37 36 35 34 31 30 30 30 30 30 30 30 30 33 35 32 30 30 31 33 34 35 35 34 36 36 36 37 36 36 35 35 36 38 38 36 34 33 32 33 34 35 36 37 37 38 37 37 37 37 37 38 39 40 40 40 38 37 38 39 38 38 37 36 36 37 38 39 39 39 37 36 36 35 34 34 36 38 39 40 40 40 41 41 41 40 40 40 40 40 41 41 40 39 39 40 40 40 40 38 37 36 35 37 38 38 38 39 40 39 38 37 36 35 36 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 38 38 39 39 40 40 40 41 41 41 42 42 41 41 41 41 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 42 43 42 42 41 40 39 40 40 40 41 40 40 39 38 38 37 36 37 38 38 39 39 38 37 36 35 36 37 38 38 38 38 37 37 37 36 37 36 36 36 35 35 35 34 34 34 34 33 34 34 35 34 35 36 35 35 35 34 34 34 32 31 32 33 33 32 31 30 30 28 69 69 69 68 68 67 68 69 69 67 66 66 66 66 65 65 65 65 64 63 63 63 62 61 60 61 61 61 61 62 62 61 60 59 58 58 58 58 58 57 57 57 57 57 57 58 60 60 61 61 61 60 60 61 62 62 62 61 61 61 62 62 61 61 60 60 60 60 60 60 58 57 56 57 59 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 59 58 58 58 58 58 57 57 58 58 57 56 55 55 55 55 55 54 54 54 54 53 53 52 51 51 50 50 50 50 51 51 51 52 52 52 53 53 52 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 44 45 47 47 46 46 46 46 46 46 46 46 45 44 43 43 43 43 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 41 41 40 40 40 39 39 38 37 36 36 36 35 35 35 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 38 39 39 38 38 37 36 36 35 35 34 34 35 35 36 37 37 37 38 39 37 37 38 38 37 37 36 35 36 37 37 36 35 36 36 37 38 36 35 35 32 30 30 30 30 30 30 30 30 32 32 30 30 31 32 33 34 36 36 35 36 36 37 37 36 35 36 36 37 37 36 35 34 33 33 34 36 35 36 38 38 38 37 37 37 37 37 38 38 39 40 40 38 37 38 39 39 38 38 36 36 37 38 39 39 38 37 36 35 34 34 35 36 38 39 40 40 40 40 41 40 40 40 40 40 41 42 42 41 39 39 40 40 40 40 39 38 36 36 37 38 38 38 39 40 39 37 36 35 35 37 38 38 39 39 39 39 39 38 39 38 38 37 37 37 37 37 37 37 38 38 39 39 39 39 40 41 41 41 42 42 41 41 41 41 40 41 40 40 39 38 39 40 39 40 40 40 41 41 40 40 41 41 41 42 42 42 41 40 39 40 40 40 40 40 39 39 39 38 37 37 37 38 37 39 39 38 38 36 36 35 35 36 37 37 37 37 37 37 37 37 36 36 35 35 36 36 36 35 36 36 35 34 34 34 33 33 34 34 33 32 33 33 32 30 29 30 30 30 30 29 28 28 29 69 69 68 68 67 67 67 68 69 68 66 66 66 66 66 66 65 64 63 63 63 62 61 61 60 60 60 60 60 60 60 60 60 60 59 60 61 60 60 59 58 57 57 57 57 57 59 60 61 61 60 60 60 62 62 61 61 61 61 60 61 61 61 61 61 61 60 59 59 59 58 57 57 57 58 58 59 60 60 60 60 60 60 60 60 60 59 57 57 58 60 60 59 58 58 58 58 57 57 57 57 58 57 56 55 55 55 55 56 56 55 54 54 54 54 54 53 53 52 50 50 50 50 49 49 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 44 44 45 46 47 48 47 46 45 45 44 44 44 45 44 43 43 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 41 41 41 41 41 40 40 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 38 39 39 38 37 37 36 36 36 35 35 34 34 36 37 38 37 36 38 38 37 37 37 37 37 37 36 35 36 38 38 37 36 36 38 36 36 37 36 36 33 30 30 30 30 30 30 30 30 30 30 30 30 31 33 33 34 36 36 36 37 37 37 36 34 34 36 37 37 36 35 34 33 33 34 35 36 36 36 38 38 37 36 37 37 37 38 39 39 38 39 39 37 37 39 39 38 38 37 36 36 38 39 39 39 38 37 35 34 34 34 36 38 39 40 40 39 40 40 40 40 39 40 40 41 42 42 42 41 39 39 40 41 40 40 39 38 36 36 37 38 39 38 38 39 38 36 35 36 37 39 39 40 40 40 40 39 38 37 37 37 37 37 36 37 37 37 37 38 38 39 39 39 39 39 40 40 40 41 41 41 41 41 41 40 40 41 40 40 39 38 38 39 40 40 40 40 41 41 40 40 40 40 41 41 42 42 41 40 40 40 40 40 40 40 39 39 39 38 37 38 38 38 38 39 39 39 38 38 37 36 35 35 36 36 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 37 36 35 35 33 32 33 33 31 30 31 31 30 30 30 29 29 29 30 29 29 31 33 69 69 68 67 67 67 66 67 69 69 68 68 67 66 65 65 65 64 63 62 63 62 61 61 61 61 62 61 60 60 60 59 59 61 61 61 61 61 61 60 60 58 57 57 57 57 58 60 61 61 60 60 60 61 62 61 60 60 61 60 60 61 61 61 61 61 61 59 58 58 58 58 56 56 57 58 59 60 60 59 59 60 60 60 60 60 58 57 57 57 59 60 59 58 58 58 57 57 57 57 57 57 58 57 56 55 55 56 57 57 56 54 55 55 55 55 54 54 53 52 51 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 49 48 48 48 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 44 44 44 42 42 43 44 45 46 48 48 48 46 45 45 45 44 43 43 43 43 43 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 38 39 39 38 37 37 37 38 37 36 36 34 33 35 36 37 36 36 37 37 37 37 37 37 36 36 35 35 37 37 37 38 37 37 37 35 34 34 34 32 31 30 30 30 30 30 30 30 30 30 30 31 33 35 36 35 35 35 36 37 37 38 37 36 34 33 35 36 36 36 35 33 32 33 35 35 36 37 37 37 36 36 36 37 38 38 39 40 39 38 38 37 37 38 38 37 37 36 36 36 37 38 38 39 38 38 36 35 34 34 35 36 38 40 40 39 39 40 40 39 39 40 41 41 41 42 41 41 41 39 39 40 41 40 39 38 37 36 35 36 38 39 38 38 38 37 35 36 37 38 40 40 41 40 39 39 38 36 36 37 37 37 38 38 38 38 38 38 38 38 38 39 38 38 39 40 40 40 41 41 40 40 41 41 40 40 41 40 39 39 38 37 39 40 40 40 40 40 40 39 40 41 41 41 41 41 42 42 41 40 39 39 40 40 40 40 39 38 38 38 39 39 39 39 39 38 37 38 37 37 37 36 35 36 35 36 37 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 34 33 33 33 32 31 31 30 31 33 32 31 31 31 32 32 31 33 33 68 69 69 67 67 67 66 67 68 68 68 68 68 67 66 65 64 63 63 64 64 63 62 63 62 62 63 62 61 62 62 61 61 62 62 62 62 62 61 61 61 60 58 57 57 56 58 60 61 61 60 60 61 61 61 61 60 60 60 60 60 61 61 60 60 61 61 60 59 58 58 57 56 56 58 59 60 60 60 59 59 60 59 60 60 60 58 58 57 57 58 59 59 59 58 58 57 57 57 56 56 57 58 57 57 56 55 55 56 57 56 55 55 55 55 55 55 54 54 53 52 51 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 50 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 45 45 45 44 43 42 43 45 45 46 47 48 48 46 46 46 46 44 44 43 43 43 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 39 38 38 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 40 39 39 38 38 38 37 37 36 35 34 33 33 34 35 35 35 36 36 36 36 37 37 37 36 35 35 36 36 38 38 37 37 36 35 34 34 33 31 30 30 30 30 30 30 30 30 30 30 30 32 35 36 36 36 35 36 36 37 36 37 37 36 34 34 35 35 35 35 34 33 33 33 34 35 37 37 37 36 36 35 36 37 37 38 39 39 38 38 38 37 37 38 37 36 36 36 36 37 37 37 37 38 38 37 35 34 34 34 36 37 37 39 40 39 39 39 39 38 39 40 41 41 41 41 40 41 41 40 40 40 41 40 39 38 38 36 35 37 38 38 38 38 38 36 35 36 37 38 39 40 41 40 39 37 37 36 37 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 41 41 41 41 41 41 40 40 41 40 40 40 41 40 39 39 39 38 39 40 40 39 40 40 39 38 39 41 42 41 40 41 42 42 41 40 40 39 39 40 40 40 39 39 39 40 40 40 39 39 39 38 38 37 37 38 38 37 37 37 35 34 35 35 35 35 35 36 36 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 34 33 32 31 33 34 34 34 33 33 34 33 33 32 31 67 68 69 68 67 67 66 66 67 67 66 67 67 67 66 66 64 64 64 65 66 64 63 63 63 63 63 63 62 63 63 63 62 63 63 63 63 62 61 61 61 60 59 57 57 56 56 59 61 61 60 60 60 60 61 61 60 59 59 59 60 60 60 59 60 61 61 61 60 59 58 57 56 57 58 59 60 60 59 58 58 58 58 59 60 59 58 58 57 57 58 58 59 59 58 57 57 57 57 56 56 57 58 57 57 56 55 55 55 56 56 56 56 55 55 55 55 55 54 53 52 52 51 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 43 44 46 46 46 45 44 43 42 43 44 45 46 47 48 48 47 46 46 45 44 45 45 44 43 43 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 39 40 40 41 40 40 40 40 40 40 40 40 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 38 39 40 39 39 38 38 37 37 36 36 36 34 34 33 33 34 35 35 35 36 37 36 37 37 36 34 34 36 36 38 39 37 36 36 35 36 35 33 30 30 30 30 30 30 30 30 30 30 30 30 33 34 34 34 36 36 36 38 38 35 35 36 35 34 34 34 34 34 33 32 33 35 35 35 36 37 37 36 35 36 37 38 38 38 38 38 38 39 38 37 37 38 38 37 35 36 37 38 37 37 36 37 38 38 36 34 33 34 35 37 37 38 39 40 40 39 39 39 39 40 41 41 42 41 41 40 40 41 40 39 40 41 40 39 39 38 36 35 37 39 39 38 38 36 36 36 36 38 39 39 40 40 40 39 37 36 37 38 38 39 39 38 37 38 38 38 38 38 38 38 39 40 41 41 41 42 41 41 41 40 40 40 40 40 41 41 40 40 39 39 38 38 39 39 39 39 40 39 38 40 40 41 41 41 41 41 41 40 40 40 40 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 37 36 35 35 35 35 34 34 34 34 35 36 36 37 37 37 37 36 36 36 36 36 35 35 35 35 35 34 33 33 33 34 34 34 34 34 34 33 33 33 32 31 67 68 68 68 67 67 66 66 66 66 66 66 67 67 67 67 65 65 65 65 66 66 65 64 63 64 64 63 63 63 64 64 63 63 63 63 62 61 61 60 60 60 59 58 57 56 56 57 59 60 59 59 60 60 61 61 60 58 58 59 59 60 60 59 60 61 60 60 60 59 58 57 56 57 58 59 59 59 59 58 57 58 58 59 59 59 58 58 57 57 57 58 58 59 58 57 57 57 56 55 55 56 57 57 57 56 55 55 55 55 55 56 55 55 55 54 54 54 53 52 51 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 43 44 45 46 46 47 46 46 45 43 43 43 43 44 45 46 48 48 47 47 46 45 45 46 46 45 44 43 44 44 44 43 43 42 41 41 42 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 39 40 41 41 40 40 39 39 39 40 40 40 40 39 38 37 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 39 40 40 39 39 38 38 37 37 37 36 35 35 35 33 33 33 34 34 36 37 36 37 37 37 35 34 35 35 37 38 37 36 35 35 35 34 32 30 30 30 30 30 30 30 30 30 31 32 32 34 35 34 34 36 38 38 39 38 35 34 35 34 34 33 33 33 32 32 32 33 36 36 37 38 38 37 35 35 36 38 38 38 38 38 38 38 39 38 36 37 38 37 35 35 36 38 38 37 36 36 37 37 36 35 34 33 35 36 38 38 39 40 40 39 39 39 40 40 40 41 42 42 41 41 40 40 41 39 39 40 41 40 39 39 38 36 35 37 38 38 38 37 36 36 37 37 38 38 38 39 39 38 38 37 36 37 38 39 40 40 40 39 39 39 39 39 39 39 39 38 39 40 41 40 42 41 41 41 39 39 40 41 40 40 41 41 40 40 40 39 38 38 38 39 39 40 39 38 40 41 41 40 40 40 39 39 40 40 41 41 39 39 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 39 39 38 36 36 37 37 36 36 34 34 33 33 34 35 36 37 37 37 37 37 36 36 36 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 33 33 33 67 67 67 68 67 67 66 66 66 66 66 66 67 67 67 67 66 67 67 66 66 66 66 65 65 64 64 63 63 63 63 63 63 63 63 63 62 62 61 61 61 60 60 59 57 57 56 56 57 59 59 58 58 59 60 60 60 59 58 58 58 59 59 58 59 60 60 60 60 59 58 58 56 56 58 58 57 58 58 58 57 57 57 58 59 58 58 58 57 57 57 57 57 58 58 58 57 57 56 55 54 55 56 57 57 56 55 55 55 55 55 55 54 54 54 53 53 52 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 46 47 46 46 46 46 45 44 43 43 43 44 45 46 48 48 47 47 46 46 45 45 45 45 44 44 44 44 44 44 43 43 42 42 41 41 40 40 40 40 40 40 39 39 39 39 38 38 39 39 38 38 38 38 38 39 40 41 40 40 39 38 38 39 39 39 39 39 39 38 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 39 39 40 40 40 39 38 37 37 37 37 36 36 36 35 33 32 33 34 35 36 36 36 37 37 36 34 35 35 37 37 36 35 34 33 33 33 31 30 30 30 30 30 30 30 30 30 32 34 35 35 35 36 37 38 38 38 39 38 35 34 34 34 33 32 31 32 32 33 34 34 36 37 38 38 38 36 35 35 37 38 38 38 38 38 39 38 38 37 36 38 37 35 35 36 37 38 38 37 36 36 37 36 35 34 33 34 35 37 38 39 40 40 39 38 39 40 41 41 41 41 41 41 41 41 40 40 40 39 39 41 41 40 40 38 37 36 36 37 38 38 38 37 36 36 37 38 39 38 38 37 37 36 36 37 37 37 38 39 40 40 39 39 40 40 41 41 40 40 40 39 39 40 40 41 41 41 40 40 39 40 41 41 40 40 41 41 41 41 41 40 39 38 38 39 39 39 39 39 40 41 41 39 38 39 39 39 40 41 40 40 40 39 39 39 39 39 39 40 40 41 40 40 40 39 39 38 38 38 38 38 38 38 37 38 38 37 37 36 35 34 33 33 33 34 35 36 37 37 37 37 37 37 37 36 35 34 35 35 35 35 35 35 35 36 35 34 34 34 34 34 34 33 67 66 67 67 68 67 67 67 66 66 66 66 66 67 67 66 66 66 67 67 66 66 66 66 66 65 64 64 64 64 63 63 63 62 62 62 62 62 61 61 61 61 60 59 58 57 57 56 56 57 58 58 58 59 59 60 60 59 58 58 58 58 59 58 58 59 59 59 59 58 58 58 57 56 56 57 57 57 58 58 58 57 57 58 58 58 58 57 57 56 57 57 57 57 58 58 58 58 57 56 55 54 54 56 56 55 55 54 54 54 54 54 53 53 53 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 46 46 46 47 46 46 46 46 46 45 44 44 44 44 45 46 48 48 47 47 47 46 46 45 44 44 45 45 44 43 43 44 43 43 42 43 42 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 39 39 38 38 38 39 39 38 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 39 40 39 39 38 38 38 37 37 37 36 36 36 35 35 33 33 34 35 36 37 36 35 35 36 34 34 36 37 37 35 36 35 33 33 33 32 30 30 30 30 30 30 30 30 30 31 34 36 36 35 38 39 39 38 37 38 37 35 34 33 32 31 31 32 32 33 34 36 36 36 37 38 38 38 36 35 35 37 38 38 37 37 38 38 37 36 36 36 38 37 35 36 37 38 37 36 36 35 35 36 35 34 33 33 35 36 37 38 39 40 40 38 38 39 41 41 41 41 41 41 42 41 41 40 40 39 39 40 41 41 40 39 38 37 36 36 38 38 38 38 37 36 36 37 38 38 37 36 37 36 36 37 38 38 38 38 38 38 39 39 39 39 40 41 40 40 40 40 41 41 40 41 41 40 39 39 40 40 40 40 40 41 41 41 40 40 41 41 41 39 38 37 38 38 38 39 40 40 41 41 38 37 38 39 40 40 41 41 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 39 39 39 38 37 37 38 38 38 39 39 37 37 37 36 35 34 33 33 32 33 35 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 36 37 36 35 35 35 35 34 34 34 66 66 66 67 67 67 67 67 67 66 65 65 65 66 66 66 66 66 66 66 66 66 65 66 66 65 65 65 64 64 63 63 62 62 61 62 62 61 61 61 61 61 60 59 58 57 57 56 56 55 55 56 58 59 58 59 59 58 57 57 57 58 59 58 58 58 58 58 58 58 58 58 57 56 56 57 57 57 58 59 58 57 56 57 57 57 58 57 57 56 56 56 56 57 57 58 58 57 56 55 55 54 54 54 54 54 54 54 53 53 53 52 52 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 47 47 46 47 47 47 46 46 46 45 44 44 45 44 43 44 46 47 48 47 47 46 45 46 45 43 43 43 44 45 44 43 43 43 42 41 41 41 40 40 41 41 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 40 39 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 38 39 39 39 38 38 38 37 37 37 37 37 37 36 35 35 34 33 33 34 36 36 36 35 34 35 34 34 35 36 36 36 37 37 35 35 34 32 30 30 30 30 30 30 29 29 30 32 35 36 36 37 39 39 38 37 37 37 36 35 34 32 31 31 32 34 34 34 35 37 38 37 37 37 38 37 35 35 36 38 38 37 38 38 37 37 36 36 36 37 37 36 35 36 38 39 38 37 36 36 35 35 35 34 33 34 35 37 38 38 39 40 39 38 38 40 41 41 41 41 41 41 42 42 42 41 40 39 40 42 42 41 40 39 38 37 36 36 37 38 38 39 37 36 35 36 37 37 36 37 38 38 39 40 40 39 38 38 38 38 38 38 38 39 40 39 39 40 40 40 40 40 40 39 39 39 39 39 40 41 41 40 40 41 41 41 40 40 40 41 41 40 39 38 37 38 38 39 39 40 40 40 38 37 38 40 40 40 41 41 41 40 39 38 38 38 38 39 40 41 40 40 40 40 40 39 39 39 39 38 38 37 37 38 39 39 38 37 37 36 37 36 35 34 33 33 34 35 36 37 37 36 36 36 37 37 37 37 36 36 37 36 35 36 37 37 36 35 34 34 34 33 34 64 66 67 67 66 66 67 67 67 66 66 65 65 65 66 66 66 66 65 66 66 66 65 65 65 65 65 65 64 64 64 63 63 62 61 61 61 61 60 61 61 61 60 60 59 58 57 56 56 55 55 55 56 57 57 58 58 57 57 57 57 58 58 58 58 57 57 58 58 58 58 58 57 56 55 56 57 57 58 59 58 57 57 56 56 56 57 57 57 56 55 56 57 57 57 58 57 57 56 55 54 54 53 52 53 53 53 52 52 52 52 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 45 45 45 45 45 45 45 45 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 46 47 46 46 46 46 48 47 47 47 46 46 45 45 45 45 44 45 44 43 44 46 47 48 47 46 45 45 45 44 43 42 42 43 44 44 43 43 42 42 41 40 40 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 39 38 38 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 35 37 38 39 39 39 38 38 37 37 36 36 37 37 36 35 35 34 33 32 32 33 35 36 36 36 35 34 34 34 36 37 36 37 37 36 35 34 33 31 30 30 30 30 30 29 29 29 30 33 35 36 36 37 37 36 35 36 36 35 36 33 31 32 33 33 34 35 35 35 37 37 37 37 37 37 36 34 35 37 38 37 37 38 37 36 35 36 37 38 37 37 35 34 36 38 39 38 38 37 37 36 35 34 34 34 34 36 38 39 38 38 39 38 37 38 40 40 40 40 40 40 41 42 42 41 41 39 39 41 41 41 41 40 40 39 39 37 36 38 37 37 38 37 36 36 37 37 37 38 38 39 39 40 40 40 40 39 40 40 40 39 38 38 38 38 38 39 40 40 40 39 39 39 39 39 40 41 41 41 42 42 41 41 42 41 41 41 40 40 40 41 40 40 39 37 37 39 39 38 38 38 38 38 38 38 39 39 40 41 41 41 40 38 38 39 39 39 39 40 40 40 40 39 39 38 38 38 39 39 39 39 38 37 37 38 39 38 37 37 36 37 37 37 36 34 33 33 34 35 36 36 36 35 35 35 35 36 36 36 36 36 36 36 36 35 36 36 35 33 32 33 31 30 64 65 67 67 66 66 66 67 67 67 67 66 65 64 65 66 66 65 65 65 65 65 65 65 64 63 63 64 64 64 64 64 64 63 62 61 60 60 60 60 60 61 61 60 60 60 58 57 56 56 55 55 55 56 57 57 58 57 57 57 56 57 58 58 58 57 56 57 58 58 58 57 56 55 55 55 57 57 58 58 58 58 58 57 55 56 57 57 57 56 55 55 57 57 57 57 57 56 55 54 54 53 52 52 51 51 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 45 45 46 46 47 47 47 46 46 46 46 46 46 45 45 46 46 45 46 46 45 45 45 46 46 46 46 47 47 47 47 46 46 45 46 47 48 47 46 46 47 48 48 47 46 46 46 46 46 46 45 45 45 44 44 46 47 48 47 46 45 45 44 43 42 42 41 42 42 43 43 43 43 43 42 41 41 42 41 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 41 40 39 39 39 39 38 38 38 39 38 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 36 38 38 38 39 39 38 37 37 36 36 36 37 37 36 35 34 34 33 32 32 34 35 36 37 35 34 34 35 36 36 36 36 37 36 35 34 33 32 31 30 30 30 30 29 29 29 29 30 32 35 35 36 36 35 35 36 36 35 33 32 31 32 34 35 35 36 36 36 37 36 37 37 36 35 34 34 35 37 37 37 37 37 36 35 36 37 38 38 38 37 35 35 38 39 38 37 36 36 36 35 35 34 34 34 35 37 38 38 38 38 38 37 38 39 40 40 40 40 39 40 41 41 41 40 40 39 38 40 40 40 40 40 40 40 39 37 36 38 37 36 37 37 37 38 39 39 39 39 38 39 39 40 39 39 40 40 40 41 41 40 40 39 39 39 40 40 40 39 39 39 39 39 39 40 42 42 42 42 42 42 41 41 42 41 42 42 40 39 40 40 40 40 39 37 37 37 38 37 37 37 37 38 38 38 38 39 40 40 40 40 40 38 38 39 40 40 40 40 40 40 40 39 38 38 38 39 39 38 38 38 38 37 37 37 38 37 37 37 37 36 37 37 36 35 34 34 34 34 34 34 35 35 35 35 35 35 34 34 35 34 36 36 35 33 34 34 34 32 31 30 29 29 63 64 66 66 66 66 66 66 66 67 67 66 65 64 64 65 65 64 64 64 64 64 64 64 64 63 63 63 63 63 63 64 64 63 63 62 61 60 60 60 60 60 60 60 60 60 59 58 57 56 55 55 55 56 56 57 57 58 58 57 56 57 58 58 58 57 56 57 58 58 57 56 56 55 54 54 55 57 57 57 57 57 57 57 56 55 56 56 56 56 55 55 56 56 55 56 55 54 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 49 49 48 48 48 47 47 48 47 47 47 47 47 47 47 48 47 47 46 47 48 48 47 48 49 48 47 47 47 46 45 46 47 47 47 47 48 48 48 47 46 47 47 46 46 46 45 45 46 45 45 46 47 47 47 46 45 44 44 43 43 43 42 41 41 43 43 43 44 43 42 42 42 42 41 41 41 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 41 40 40 40 40 39 39 39 39 38 37 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 37 38 38 38 38 38 37 37 37 36 35 36 36 36 35 35 35 34 33 32 33 35 36 36 35 33 34 36 36 34 35 36 36 36 34 34 33 32 31 30 30 30 30 30 30 30 29 29 30 33 35 35 34 34 35 35 35 33 31 31 32 33 34 35 35 35 36 36 35 36 37 36 34 33 34 35 37 37 36 36 37 36 35 36 37 38 39 39 38 36 35 36 39 39 38 37 36 36 36 35 35 34 33 34 36 38 38 37 38 38 38 37 38 38 39 39 39 39 38 39 40 40 40 39 39 38 38 39 40 40 40 39 39 39 38 36 35 36 36 36 37 37 38 39 39 39 40 39 39 40 39 40 40 40 40 40 40 41 41 41 40 40 40 40 40 40 39 38 39 40 40 40 40 41 42 42 43 42 42 42 42 41 40 40 41 42 40 39 40 40 40 40 39 38 37 36 36 36 37 37 38 38 38 38 39 40 40 40 39 39 40 38 37 38 39 39 40 40 40 40 40 39 39 39 39 39 39 37 37 37 38 37 37 37 37 37 37 37 38 37 36 36 36 35 35 34 34 33 33 33 33 33 35 35 35 34 33 32 33 33 34 33 32 31 31 31 31 30 29 29 29 30 63 63 64 65 65 66 66 65 66 66 66 66 66 65 64 64 64 64 63 63 63 63 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 61 61 61 60 59 60 59 58 58 58 58 57 56 55 55 55 55 56 56 57 57 57 56 56 57 57 58 57 57 57 57 58 58 57 57 56 55 53 53 54 55 55 55 56 56 56 56 55 55 55 55 55 56 55 54 54 55 54 53 53 53 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 52 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 48 49 49 50 50 49 49 49 49 49 48 47 48 48 47 48 48 48 48 48 49 49 48 48 48 48 49 48 48 49 49 48 48 48 47 46 46 46 46 47 48 48 49 48 47 47 47 47 47 46 46 45 45 46 45 45 46 46 47 48 47 46 45 45 44 44 44 44 42 41 41 42 42 43 43 42 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 39 38 38 38 38 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 36 37 37 38 37 37 37 37 37 36 35 35 36 37 36 35 35 34 33 32 33 35 36 35 34 33 33 35 35 34 34 35 36 36 34 34 33 32 31 30 30 30 30 30 30 30 29 29 29 31 34 34 33 35 35 34 33 32 31 32 33 34 34 35 35 35 36 36 34 35 37 35 34 33 35 37 38 37 36 37 36 35 35 37 37 39 39 38 37 36 35 37 38 38 38 37 38 38 37 35 34 34 33 34 36 38 38 37 38 38 37 37 38 38 39 39 38 38 38 38 38 39 40 39 38 38 38 39 40 40 39 38 38 37 37 36 35 35 35 36 36 36 38 39 39 40 40 39 40 40 40 40 40 39 39 40 40 40 40 40 40 41 40 39 39 39 38 38 39 40 39 40 41 41 42 42 42 42 40 41 42 41 40 40 40 41 40 39 40 41 40 40 40 39 38 36 36 36 37 37 38 38 38 39 40 39 39 40 39 38 38 38 38 39 39 39 40 39 39 38 38 39 39 39 39 38 38 38 38 39 38 38 37 37 37 37 37 38 38 37 36 36 35 36 37 36 35 33 34 34 33 32 32 33 33 33 33 33 32 31 32 32 30 30 29 29 30 30 30 30 32 32 63 63 63 63 64 64 65 66 66 66 66 66 66 66 65 63 63 63 63 63 63 63 63 64 64 64 64 64 63 63 62 62 62 62 62 63 62 62 62 61 60 60 60 60 59 58 58 58 57 57 56 56 55 55 55 55 55 56 56 55 55 56 57 57 57 57 57 57 57 56 56 55 55 54 53 53 53 53 53 53 54 54 54 54 54 54 53 53 53 54 54 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 46 46 46 46 46 46 47 47 47 47 48 48 49 49 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 48 48 48 47 47 46 46 46 47 48 49 49 48 48 48 47 47 46 45 45 46 46 45 45 46 47 48 47 46 46 46 45 44 44 44 43 43 42 41 40 40 41 42 41 41 40 40 40 40 40 40 41 41 40 40 39 38 38 37 37 38 38 38 38 38 37 37 37 37 37 38 38 39 40 40 39 39 39 39 39 38 37 38 38 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 37 36 36 37 37 37 37 36 35 36 37 36 35 34 34 34 32 32 33 35 35 34 33 33 34 34 34 36 36 37 36 35 34 33 32 32 31 30 30 30 30 29 29 29 29 29 32 34 34 34 35 34 33 31 32 33 34 33 34 34 35 36 36 36 36 35 35 36 35 34 35 36 37 37 36 36 37 35 34 36 36 38 39 38 37 36 35 36 37 37 37 38 37 37 38 37 35 34 34 34 34 35 36 37 38 39 37 36 37 38 39 39 39 38 37 38 38 38 39 40 39 39 39 38 38 40 40 38 37 37 36 35 34 35 36 36 36 37 37 37 38 39 40 40 39 39 39 40 40 38 37 38 40 40 40 40 40 41 40 39 38 37 38 38 39 39 40 40 40 40 41 41 41 42 41 40 40 41 42 41 40 40 39 39 39 40 40 40 40 40 39 38 37 36 37 37 37 38 38 39 39 40 39 38 39 38 38 38 39 40 40 40 40 40 40 39 38 37 37 37 38 38 38 38 39 39 40 39 38 38 38 37 37 37 37 38 37 37 36 36 37 37 36 35 34 35 35 35 34 32 32 33 34 34 35 32 30 31 31 30 30 30 31 32 33 31 32 33 33 63 63 63 63 63 63 65 66 66 66 66 66 66 65 64 64 64 63 63 63 63 63 63 63 63 64 64 64 64 63 63 62 62 62 62 62 63 63 62 61 60 60 61 61 60 60 59 58 58 58 57 57 56 55 55 55 54 54 54 54 54 55 56 56 56 56 56 55 55 55 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 47 46 46 46 46 47 47 47 48 48 49 49 48 49 50 50 50 51 51 51 50 50 50 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 50 49 49 49 49 48 48 47 47 47 47 47 48 49 49 49 48 47 47 46 45 46 47 47 46 45 45 47 48 46 45 44 45 44 43 43 43 43 42 42 42 41 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 38 37 37 37 37 37 37 37 37 37 38 38 39 40 39 39 38 38 38 37 37 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 36 36 35 35 35 35 36 35 35 36 37 37 36 35 35 34 33 31 32 34 34 34 33 32 33 34 35 37 37 37 36 35 35 34 33 31 30 30 29 29 29 29 29 29 29 29 32 34 33 34 35 33 31 32 33 33 33 33 34 35 36 37 37 36 35 35 35 35 34 34 36 36 36 35 36 37 37 35 34 36 38 38 38 38 37 35 35 36 37 37 37 38 37 37 36 36 34 34 33 33 34 35 36 37 38 38 36 37 38 38 40 40 38 37 37 37 38 39 40 40 40 40 39 37 38 39 39 38 37 36 35 34 34 35 36 38 38 38 38 38 39 39 40 40 39 38 38 40 39 37 38 38 39 40 40 40 40 40 40 38 37 37 38 39 39 38 39 39 39 40 40 41 41 42 41 39 39 40 40 42 41 39 39 39 40 40 39 39 40 40 40 38 36 36 37 38 38 38 38 39 39 40 39 38 37 37 38 40 40 40 40 40 40 40 40 39 38 37 37 37 37 39 40 39 39 40 40 39 39 38 38 37 37 37 37 38 37 37 36 36 37 37 37 36 35 35 35 35 34 33 34 35 36 36 35 33 31 32 33 31 31 32 33 34 34 33 34 33 33 63 63 63 63 63 63 64 65 66 66 66 66 66 66 65 65 65 64 64 64 64 63 63 62 63 63 63 63 64 64 63 63 63 62 62 62 63 63 62 61 62 61 61 61 61 60 59 59 59 59 58 58 57 57 56 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 52 51 51 52 52 52 51 51 52 51 51 52 52 53 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 47 47 47 47 47 47 47 47 48 49 50 50 50 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 49 48 47 48 48 49 49 48 48 47 47 47 47 47 47 46 45 45 47 48 46 45 45 44 44 44 43 42 42 42 41 41 42 41 41 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 39 40 39 39 38 38 37 37 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 36 35 35 35 34 34 34 34 36 37 37 37 36 35 34 33 32 32 33 34 34 34 33 32 33 35 36 36 36 35 35 35 35 33 31 30 29 29 29 29 29 29 30 29 29 31 32 32 34 35 32 30 32 33 32 33 34 34 35 37 37 37 37 36 36 35 34 33 34 36 36 35 35 36 37 36 35 35 37 38 38 38 37 36 35 35 36 36 37 38 38 38 37 35 34 34 33 32 33 34 35 36 37 37 36 36 38 38 38 40 39 38 37 37 38 39 40 40 40 40 39 38 36 37 39 39 38 37 36 34 34 34 35 36 38 38 39 39 38 39 39 40 40 39 38 38 39 38 37 38 38 38 39 39 39 39 40 40 39 37 37 38 38 38 38 39 39 39 39 40 40 41 41 40 39 38 39 40 42 41 39 38 40 40 39 38 39 40 39 38 37 36 36 37 38 38 37 37 38 39 39 40 38 36 37 38 39 40 40 40 40 40 40 39 39 38 38 38 38 39 40 40 39 38 39 39 39 39 38 38 37 37 36 37 38 38 37 37 37 38 38 38 37 36 36 36 35 34 34 36 36 36 36 34 33 33 34 35 34 34 34 34 35 34 34 34 34 34 63 63 63 62 62 62 63 64 65 65 65 66 66 66 66 66 65 65 65 65 65 63 63 62 62 63 63 63 63 63 63 63 63 62 61 61 62 62 62 62 62 62 62 62 61 61 60 60 60 60 59 58 58 58 58 57 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 54 54 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 49 49 49 49 49 50 51 50 50 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 49 50 50 49 49 48 48 49 48 48 49 49 48 47 47 47 47 47 47 46 46 46 45 46 47 45 45 45 44 43 42 42 41 41 41 40 40 40 41 42 41 40 40 39 39 39 38 38 38 39 39 40 40 40 40 40 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 39 39 39 39 39 38 37 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 37 36 37 37 37 36 35 34 34 35 37 37 37 35 34 34 34 33 32 32 34 34 35 33 32 32 33 34 34 35 35 34 35 35 33 33 31 30 29 29 29 29 29 29 29 29 30 31 32 34 34 31 30 31 32 33 35 36 36 35 35 35 37 37 37 36 35 35 33 33 35 36 35 36 36 36 36 34 35 37 37 37 37 36 35 35 36 37 37 37 38 38 38 37 36 34 33 32 32 33 34 35 37 37 36 35 37 38 38 38 39 38 37 37 38 38 39 40 40 40 40 39 38 36 36 38 39 38 37 35 34 34 35 35 35 37 37 38 38 37 38 39 39 39 39 38 37 37 36 36 37 37 38 38 38 38 38 39 39 38 37 37 38 38 39 39 39 40 40 40 40 40 40 39 39 38 38 40 41 41 40 39 38 39 40 39 38 38 39 39 37 36 36 36 37 38 38 38 37 37 38 38 38 37 36 37 38 39 40 40 40 40 41 40 38 38 38 37 38 38 38 39 39 39 38 37 38 39 39 38 38 38 36 36 36 36 37 37 37 38 38 38 38 37 36 36 35 34 34 35 36 36 35 34 33 33 34 35 35 36 35 34 34 35 35 34 34 34 34 63 63 63 62 62 62 62 63 64 64 65 65 66 66 66 66 66 66 66 65 64 63 63 62 62 63 63 63 63 63 63 64 63 62 61 60 61 62 62 62 62 61 61 61 61 61 60 60 61 60 59 59 58 58 58 57 57 56 56 56 55 54 54 54 54 54 54 54 54 54 53 53 53 54 54 55 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 48 49 49 48 49 49 48 47 47 48 48 48 47 47 47 46 45 46 47 45 44 44 43 43 42 42 42 42 42 41 40 40 40 41 41 41 41 40 41 41 39 39 38 38 38 39 40 39 39 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 39 39 38 38 37 37 37 36 35 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 37 38 38 37 37 36 34 34 34 35 36 37 36 35 35 34 33 32 32 33 34 34 34 33 32 32 33 33 34 34 34 35 35 34 34 32 30 29 29 29 29 29 29 29 29 29 32 34 34 32 30 31 32 33 34 35 36 34 33 33 35 37 37 37 36 35 34 33 33 35 35 34 36 36 35 34 34 35 36 37 37 37 35 34 35 36 37 37 37 38 37 37 37 36 34 33 32 32 34 35 36 37 36 36 36 38 38 38 37 38 37 36 37 38 38 38 39 40 40 39 39 37 36 37 38 39 38 37 35 34 34 35 35 35 37 37 36 37 38 38 39 39 39 38 37 36 36 36 36 36 37 38 38 38 37 37 37 37 37 37 38 39 39 39 38 38 39 40 40 40 40 39 38 37 37 38 39 39 39 39 38 38 39 39 40 38 37 38 37 36 35 36 37 38 38 38 38 37 37 38 38 37 36 36 37 38 38 39 40 40 40 40 40 39 39 38 37 37 37 37 38 38 38 37 37 37 38 38 38 38 37 35 35 35 35 36 36 38 38 37 37 37 37 37 35 35 35 34 35 35 35 35 35 34 34 35 35 36 36 36 35 35 35 34 34 34 34 33 63 63 63 62 62 62 62 62 63 63 64 65 65 66 66 66 66 66 65 64 64 63 63 63 62 62 62 62 63 63 63 64 63 62 62 61 61 61 61 61 61 61 61 61 61 61 61 61 61 60 59 59 58 58 58 58 58 57 57 57 56 56 56 56 55 55 54 54 54 54 54 54 54 54 55 56 56 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 50 50 50 51 50 50 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 49 49 48 48 49 49 49 48 47 47 47 46 46 47 46 45 43 43 44 44 44 43 43 43 42 41 40 39 39 40 41 41 41 41 41 40 40 38 37 37 38 39 38 38 39 39 38 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 36 36 36 35 35 36 36 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 37 37 37 37 37 37 37 36 35 34 34 34 36 36 36 35 35 35 34 34 33 32 33 34 34 34 33 31 32 33 34 33 35 36 35 34 33 33 32 30 29 29 29 29 29 29 29 29 31 33 33 31 31 33 34 33 33 35 34 32 33 34 35 37 37 36 35 35 34 32 33 35 35 35 35 34 34 34 35 36 36 37 37 36 34 34 35 36 37 37 38 37 37 37 37 36 34 33 32 32 34 36 37 37 35 35 37 38 38 37 37 37 36 37 38 38 38 38 39 40 39 39 38 36 36 38 39 39 38 37 35 34 34 35 35 35 36 36 36 37 38 39 39 39 38 38 36 35 36 38 38 37 36 37 37 36 36 37 37 37 37 38 39 39 38 38 37 38 39 40 39 39 39 38 37 38 39 39 38 39 39 38 38 39 39 40 39 38 37 36 35 35 36 37 37 38 38 37 37 37 37 37 37 36 36 37 38 39 39 39 40 40 40 40 40 40 40 39 39 38 38 38 38 37 37 37 37 37 37 37 38 38 36 36 36 36 36 35 35 36 38 37 37 36 37 37 36 35 35 35 36 35 35 35 36 35 34 35 35 35 35 35 35 34 34 34 34 34 34 34 64 63 63 63 62 62 62 62 63 63 63 64 65 66 66 66 66 66 65 64 64 63 63 64 63 62 62 62 62 62 63 63 64 63 63 61 60 61 61 61 61 61 60 60 60 61 61 61 61 60 59 59 59 59 58 58 58 58 58 58 57 57 57 57 56 55 54 54 54 54 54 54 55 56 56 57 56 56 56 56 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 54 54 55 55 54 54 54 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 51 51 50 50 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 47 46 47 46 45 44 45 45 45 44 43 42 42 42 41 41 40 39 39 40 40 41 40 40 40 40 39 38 37 38 39 38 38 38 38 38 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 36 35 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 36 36 36 36 36 36 37 36 35 34 34 35 35 35 35 36 35 34 34 34 33 32 32 32 34 34 32 31 32 33 33 35 36 35 34 34 35 34 32 29 29 29 29 29 29 29 29 30 31 31 30 31 34 33 33 33 34 33 33 33 35 35 36 37 36 35 35 33 32 34 36 35 34 34 34 35 36 37 37 37 36 35 35 33 34 36 37 37 36 37 37 37 37 37 36 34 34 33 33 35 36 36 36 35 35 37 37 37 36 36 36 37 38 38 38 37 38 39 39 38 38 38 36 36 38 38 38 37 36 35 34 34 34 34 34 35 36 37 38 38 39 39 38 38 37 36 35 37 38 39 38 38 37 37 37 38 38 37 38 38 38 39 38 38 37 38 38 39 40 38 38 37 37 37 38 40 40 40 40 40 40 39 40 40 40 39 38 38 36 35 35 37 38 38 38 38 38 37 37 37 37 36 36 37 38 39 40 40 40 40 39 39 39 39 40 40 40 39 38 39 39 38 37 37 38 38 39 38 38 39 38 37 38 38 37 37 36 35 35 36 37 37 36 36 36 37 36 35 36 37 36 35 34 35 35 35 36 36 35 34 34 34 33 33 34 34 34 34 34 65 65 64 63 62 62 62 62 62 63 63 63 64 65 66 66 66 66 66 65 65 64 64 64 63 62 62 62 62 62 62 62 63 63 63 61 60 60 60 60 60 60 60 60 60 60 60 60 61 60 60 59 59 59 58 58 58 58 58 58 58 57 57 56 55 55 54 54 54 54 54 54 56 56 57 56 56 56 56 56 56 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 54 54 54 55 55 55 55 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 50 51 50 51 51 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 47 46 46 48 47 46 45 45 44 44 43 43 42 41 41 41 40 39 39 38 39 39 40 40 40 40 40 40 39 37 37 38 38 38 37 37 37 36 36 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 37 36 35 35 35 35 35 35 36 35 34 33 33 34 35 36 35 35 34 34 34 34 33 32 31 32 34 33 31 32 33 34 35 35 35 35 35 35 34 31 29 29 29 29 29 29 29 29 29 29 29 30 31 32 32 33 33 32 32 33 33 34 35 36 37 36 35 35 33 32 34 37 36 34 33 34 36 36 36 37 38 36 34 34 33 34 36 37 37 36 36 36 37 37 36 35 35 34 32 33 35 36 35 34 34 36 37 37 36 36 37 37 38 38 38 37 38 39 40 39 38 38 38 36 36 37 38 39 38 36 34 33 33 33 33 34 35 37 38 38 38 39 39 38 37 37 36 35 36 38 38 38 38 38 39 39 39 37 37 37 38 38 38 37 37 38 39 39 38 38 37 36 36 37 39 39 40 40 40 40 40 40 41 40 39 39 40 40 39 38 36 35 37 38 38 38 38 38 38 37 37 36 37 37 38 38 39 40 40 40 40 39 39 40 40 40 40 40 39 38 38 39 38 38 38 39 39 39 38 38 39 38 37 39 39 38 38 36 36 35 35 36 35 35 35 35 36 36 36 37 37 36 35 35 35 35 35 35 35 35 34 34 33 33 33 33 32 32 32 32 66 66 64 63 63 62 62 62 62 62 63 63 63 63 64 65 66 66 66 66 65 65 64 64 63 63 63 62 62 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 55 55 55 54 54 54 54 54 55 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 55 55 54 54 54 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 48 48 48 48 48 49 48 48 49 49 49 50 50 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 48 48 48 49 49 49 50 50 50 50 50 50 50 49 49 49 49 48 48 48 47 47 47 47 47 47 47 46 46 45 44 43 42 42 41 41 41 40 40 40 40 39 39 38 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 36 36 36 37 37 37 37 36 36 36 36 36 36 36 37 37 37 36 36 36 37 37 38 37 37 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 37 37 36 35 36 36 35 35 34 34 34 33 32 33 34 35 35 35 34 35 34 34 34 33 32 31 32 32 32 32 33 34 35 35 34 35 35 34 31 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 33 33 31 31 32 33 33 34 36 36 36 36 35 35 33 32 34 36 36 35 33 34 35 35 36 36 37 36 35 33 34 35 36 37 37 36 35 36 37 37 35 34 34 33 32 33 36 36 35 35 36 37 36 35 35 37 38 37 37 38 37 37 38 39 40 40 39 38 38 36 36 37 38 39 38 36 34 33 33 33 33 34 36 37 37 38 39 39 39 38 37 37 36 34 36 38 37 37 37 38 39 39 37 36 37 38 38 38 37 36 37 38 38 37 37 36 36 36 36 37 39 39 39 39 39 39 40 40 40 40 39 38 39 40 40 38 36 35 36 37 37 38 38 37 37 36 36 36 38 38 38 38 39 40 40 40 40 39 39 40 40 39 40 40 39 38 38 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 35 34 34 35 36 36 36 37 37 36 36 36 35 35 35 34 34 33 33 34 34 34 34 33 32 33 32 31 66 65 64 64 63 62 62 62 62 62 63 63 63 63 63 64 65 65 65 65 65 65 64 64 63 63 63 62 62 62 61 60 60 60 60 61 61 61 61 60 60 60 60 60 60 60 59 60 59 59 59 60 59 59 59 58 58 58 57 57 57 57 56 56 55 55 54 54 54 54 55 56 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 55 55 54 54 55 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 50 50 50 50 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 47 47 47 48 48 49 49 49 49 49 48 48 48 49 49 49 49 49 50 50 50 50 50 50 49 48 48 49 49 48 48 48 48 48 47 47 47 46 45 45 44 43 42 42 42 42 42 42 41 40 40 40 39 38 38 38 39 39 39 39 38 37 37 36 36 36 36 36 36 36 35 36 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 37 37 37 36 36 35 35 34 34 34 34 34 34 34 34 34 34 35 36 37 37 37 38 37 36 36 37 37 36 36 35 35 35 34 33 33 33 33 35 35 34 35 35 35 34 33 33 32 31 31 31 32 33 34 36 36 34 34 34 32 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 31 31 31 32 33 33 34 36 37 36 35 35 35 34 33 32 34 36 36 35 33 33 34 34 35 35 36 36 34 34 34 35 37 37 36 35 36 37 36 36 34 33 33 32 32 33 35 37 35 35 36 36 35 35 36 37 37 37 37 37 37 38 38 38 39 38 38 37 37 36 35 36 38 38 36 34 33 33 33 33 33 34 35 35 36 37 38 38 39 38 37 37 35 34 35 37 37 36 37 38 38 37 36 36 37 38 38 37 35 35 36 36 35 35 35 36 37 38 38 37 38 38 38 39 39 40 40 41 40 40 39 38 38 40 39 38 37 36 35 37 37 37 38 38 36 35 35 36 38 39 39 39 40 39 39 40 39 38 38 39 39 39 39 40 40 40 39 39 40 40 40 39 38 38 38 38 38 38 38 37 38 38 38 37 37 37 37 37 36 35 34 35 36 37 37 37 36 36 36 36 35 35 35 34 34 33 33 34 35 35 34 34 34 34 34 32 65 64 63 63 63 63 62 62 62 62 62 63 63 63 63 64 64 65 65 64 65 65 65 64 64 64 63 63 63 62 61 60 60 60 60 60 60 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 56 55 54 54 54 54 55 56 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 50 51 51 51 51 51 51 51 51 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 48 48 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 48 49 49 49 48 48 48 48 48 49 49 48 48 49 49 49 49 50 50 50 49 47 46 47 48 48 48 48 48 48 48 48 47 47 46 45 44 44 44 43 43 43 42 41 42 41 39 39 38 38 38 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 36 36 36 36 36 36 35 35 36 36 36 36 36 36 36 36 36 36 36 36 36 37 37 37 37 36 35 34 34 34 34 34 34 34 34 34 35 36 37 37 37 38 38 37 37 37 37 37 37 37 36 37 36 35 35 34 32 32 33 34 34 35 36 35 34 34 33 33 31 30 31 33 34 35 36 36 35 34 33 32 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 33 33 34 36 37 37 36 35 34 34 33 32 33 34 36 36 36 34 33 33 34 34 35 36 35 33 33 34 35 36 36 35 35 36 36 35 34 33 32 32 32 32 33 35 36 35 34 36 35 35 36 37 36 36 35 36 36 37 37 37 37 37 37 38 37 36 35 35 36 38 38 35 33 33 33 33 33 33 33 34 35 36 37 38 38 39 38 37 36 34 33 35 37 36 35 37 38 37 36 36 36 38 38 37 35 34 34 35 35 35 35 36 37 37 38 39 39 39 39 40 40 40 40 40 40 40 41 40 38 37 38 39 38 37 36 35 35 36 37 37 37 36 36 36 37 38 39 39 38 39 39 40 40 39 39 39 39 40 40 40 40 41 40 39 40 40 40 39 39 39 38 38 38 38 38 37 37 37 37 37 36 36 35 36 37 36 36 35 34 36 37 37 37 36 36 36 36 36 35 35 34 34 34 35 35 35 35 35 35 34 34 34 33 65 64 63 63 64 63 62 62 62 62 62 62 63 63 63 63 63 64 65 65 64 64 64 64 64 64 63 63 63 62 62 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 56 56 55 54 54 54 55 56 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 51 51 52 52 52 52 52 52 52 51 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 51 50 50 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 50 50 49 47 46 46 47 47 47 46 47 48 47 47 46 46 46 45 45 45 44 43 43 43 42 41 41 40 39 39 38 38 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 36 36 36 36 35 35 35 35 35 35 35 36 36 36 36 36 35 35 35 36 36 37 36 35 35 34 34 34 34 34 34 34 34 34 36 37 37 38 39 39 38 37 37 37 36 36 36 36 35 36 35 35 35 34 34 33 32 33 33 34 35 36 35 35 34 33 32 31 30 32 33 34 35 36 36 34 34 33 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 33 34 34 36 37 38 37 36 35 34 32 32 33 35 36 36 36 35 33 32 33 34 34 35 34 33 33 34 34 36 36 35 35 36 36 35 33 32 32 32 32 32 33 35 36 35 34 36 35 35 37 36 35 35 35 36 36 36 36 36 37 37 37 37 37 35 35 37 38 38 38 35 33 33 33 33 33 33 34 36 37 37 37 38 38 38 38 36 35 34 33 35 37 36 35 37 38 36 35 36 37 38 37 35 34 35 36 37 37 37 37 37 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 38 37 37 38 38 38 36 35 35 36 37 36 36 36 37 38 37 38 39 39 38 38 39 39 39 39 40 40 40 40 40 41 41 40 40 39 40 40 39 39 39 40 39 38 37 37 38 37 37 37 37 36 36 35 35 35 36 36 36 35 34 35 36 36 36 37 37 37 37 37 36 35 35 36 36 36 36 36 35 35 35 34 34 34 33 65 64 64 64 64 64 63 62 62 62 62 62 62 63 63 63 63 63 64 65 64 63 63 64 64 63 63 63 63 63 62 62 61 61 60 60 60 60 59 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 56 56 55 55 55 54 55 56 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 50 51 51 52 52 52 52 52 52 52 52 51 51 51 51 51 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 49 50 50 50 49 48 46 46 46 46 46 45 46 46 47 47 46 46 46 46 46 46 45 44 44 43 43 42 41 41 40 39 38 38 38 39 39 39 38 38 37 36 36 36 36 36 37 37 37 37 36 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 36 35 34 34 34 34 34 34 34 34 34 34 35 36 37 38 38 38 38 38 37 37 36 35 35 34 34 34 34 33 33 33 34 34 33 32 32 33 35 35 35 35 34 34 33 31 30 30 32 34 35 36 36 36 35 34 32 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 35 35 35 36 37 36 36 36 34 32 32 33 34 35 36 36 35 34 33 32 33 34 34 33 33 34 34 34 35 35 34 35 36 36 35 34 33 32 32 32 32 33 35 37 35 34 35 35 35 36 35 34 35 36 37 36 35 35 36 37 38 38 37 36 34 36 38 38 37 36 34 33 33 33 33 33 34 35 36 36 37 38 38 38 38 37 37 36 34 33 35 37 35 34 36 36 35 35 36 38 38 35 34 34 35 36 36 36 37 37 37 37 38 39 39 38 38 39 40 39 38 39 40 40 40 39 39 39 37 38 38 38 38 36 35 36 37 36 35 36 37 39 38 37 38 40 40 39 38 38 38 40 40 40 40 40 40 40 40 40 40 39 40 40 40 40 39 40 40 39 38 38 37 38 38 37 37 37 37 36 36 36 36 35 36 36 35 34 35 35 35 36 36 37 37 37 37 36 36 36 36 36 36 36 35 36 36 35 35 34 34 34 65 65 65 65 65 64 63 63 62 61 61 61 62 62 63 62 63 63 64 64 64 64 63 63 64 63 63 63 63 63 62 62 61 61 61 61 60 60 59 59 59 60 60 60 59 59 59 58 58 59 59 59 59 59 59 58 58 58 57 57 57 56 55 55 55 55 55 56 56 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 50 51 52 52 52 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 50 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 48 48 48 48 48 47 47 47 47 48 49 48 48 48 48 48 48 48 48 49 49 48 48 49 49 48 48 50 50 50 50 49 47 46 45 45 46 46 46 45 45 46 47 46 46 45 46 47 46 46 45 44 43 43 42 41 41 40 39 39 39 39 40 40 40 40 39 39 38 37 37 37 37 38 38 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 35 35 34 34 34 34 34 34 34 34 34 34 34 35 36 37 38 37 37 37 37 37 36 35 35 35 34 34 34 33 32 33 33 33 33 32 32 32 33 33 34 35 34 34 33 32 30 30 31 33 35 35 35 36 36 34 33 31 30 31 30 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 36 37 36 36 36 36 34 33 32 31 32 34 34 34 35 36 35 34 34 33 32 33 32 32 33 34 34 34 34 34 34 35 35 36 37 35 34 33 32 32 32 33 35 36 35 33 34 34 34 35 35 35 36 37 36 35 36 37 37 38 38 38 37 35 34 36 38 37 36 34 33 33 33 33 33 33 33 35 35 36 37 38 37 37 38 37 36 36 34 33 35 35 34 35 36 35 34 35 36 37 37 35 34 35 35 35 35 36 37 37 36 36 37 38 39 38 38 39 39 38 38 39 40 40 40 39 38 38 37 38 37 36 36 35 34 35 36 35 35 36 38 39 39 38 39 40 40 38 38 38 39 40 40 40 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 39 38 37 37 37 38 37 37 37 37 37 36 36 36 36 36 35 35 35 34 34 35 35 36 36 37 37 36 36 36 36 36 36 36 35 34 34 35 35 35 34 34 35 65 66 66 66 65 64 64 63 63 61 61 61 61 61 62 62 62 63 63 63 64 64 63 63 63 64 63 63 63 63 63 63 62 62 61 61 61 60 60 60 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 57 57 57 56 56 55 55 55 55 56 56 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 50 51 51 52 52 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 50 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 47 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 49 47 46 46 44 44 44 45 45 45 44 45 46 45 45 45 46 46 46 45 44 43 42 41 41 40 40 40 40 40 40 41 41 41 41 40 39 38 38 37 38 39 39 38 38 37 37 37 37 36 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 38 37 36 36 36 37 36 36 36 36 35 35 35 33 34 34 33 33 32 32 32 31 31 32 33 34 34 34 34 32 31 30 30 31 33 34 34 34 35 35 33 32 33 33 32 29 29 29 29 29 29 29 29 29 29 29 29 30 32 34 35 37 37 36 37 35 33 32 31 31 33 34 34 34 35 35 34 34 34 34 32 32 33 33 34 34 34 34 33 33 34 34 34 36 37 36 34 33 32 31 32 33 35 36 34 33 33 34 34 34 36 36 36 36 35 35 37 38 38 37 37 37 37 35 34 36 38 37 35 33 33 33 33 33 33 34 34 34 35 37 38 38 37 37 37 37 35 35 34 33 35 34 34 36 35 34 34 35 34 34 34 34 34 35 36 36 36 37 36 35 35 35 37 38 38 37 38 39 37 36 37 38 39 40 39 38 38 37 37 37 36 35 35 34 34 35 35 36 35 36 38 38 39 39 39 39 39 39 38 38 38 39 39 39 38 38 38 39 39 39 39 39 40 40 40 41 40 40 39 39 38 37 37 37 38 37 37 37 37 37 37 37 36 37 36 35 35 35 35 34 34 35 35 36 36 36 36 36 36 37 37 36 35 35 34 34 34 34 34 34 33 33 66 66 67 66 66 65 65 64 63 62 61 60 60 60 60 61 62 62 62 63 63 64 64 63 63 63 63 63 63 62 62 63 63 62 62 62 61 61 61 61 60 60 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 56 56 56 56 55 55 55 55 56 56 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 51 52 52 52 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 50 50 49 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 48 48 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 50 50 50 50 50 49 49 49 50 50 48 46 46 45 44 43 43 43 44 44 44 44 44 44 44 45 46 46 45 44 43 42 42 42 41 41 41 41 41 41 42 41 41 41 40 40 39 39 38 38 39 39 39 38 38 38 38 38 37 36 36 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 38 38 38 37 37 37 37 37 37 37 36 36 35 34 34 35 36 35 34 34 34 33 33 32 31 32 32 32 33 33 32 32 31 30 30 30 31 33 34 34 34 33 33 34 35 33 30 29 29 29 29 29 29 29 29 29 30 31 32 32 33 35 36 36 36 36 35 33 32 31 31 33 33 33 34 34 34 34 33 33 33 32 33 34 35 35 34 33 33 33 33 34 33 34 35 36 35 33 32 31 31 32 33 36 35 33 33 34 35 36 36 37 37 36 35 35 36 37 38 38 37 37 37 37 35 34 36 38 37 35 33 32 32 33 33 34 36 36 35 35 37 39 38 36 37 37 36 34 34 33 33 34 34 35 36 34 32 33 33 33 34 34 35 36 37 36 35 35 35 35 35 35 36 37 37 36 37 37 37 36 37 38 38 39 39 38 37 37 37 36 36 35 34 35 36 36 35 36 37 36 36 38 38 39 40 39 38 38 39 38 38 38 39 40 39 38 38 39 40 40 40 40 39 39 40 40 40 41 40 39 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 37 36 35 34 35 34 34 34 34 34 35 36 35 35 36 37 37 36 36 35 36 35 34 34 34 34 33 33 67 67 67 67 66 65 65 64 64 63 62 61 60 60 60 60 61 61 62 63 63 63 63 63 62 62 62 62 62 62 61 62 62 62 63 62 61 61 61 61 61 60 59 59 58 59 59 59 58 58 58 58 57 57 57 57 56 56 56 56 56 55 55 55 56 56 57 57 57 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 51 52 53 53 53 53 54 54 53 53 53 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 48 48 48 48 48 47 47 48 48 48 49 48 48 49 49 49 49 49 49 50 50 50 49 48 49 50 49 48 47 46 46 45 45 44 44 44 44 43 43 43 43 43 44 45 46 46 45 44 44 44 43 43 43 43 43 42 42 43 42 41 41 40 40 40 40 38 38 39 40 40 39 39 38 38 38 37 37 37 36 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 37 37 38 37 37 37 38 37 37 37 36 35 34 35 36 36 35 34 34 34 34 34 33 32 32 32 31 31 31 31 31 31 30 30 30 30 32 33 33 32 32 32 34 35 34 31 29 29 29 29 29 29 29 29 29 31 33 34 35 35 36 35 36 36 35 34 33 31 31 32 32 32 33 35 34 33 33 32 32 32 33 34 35 35 35 35 33 32 33 34 34 34 35 35 35 34 32 31 31 31 32 34 35 34 32 33 35 36 37 37 37 36 35 35 36 37 38 38 38 37 36 36 36 35 34 36 37 36 34 33 32 32 33 33 34 36 37 36 36 38 39 38 36 36 37 37 35 34 33 33 34 35 35 35 33 32 34 35 34 34 35 35 35 35 34 34 34 34 35 35 35 35 36 36 36 36 36 36 37 38 39 39 38 38 38 37 37 36 35 34 34 34 36 37 37 37 37 37 38 37 38 39 38 39 39 38 38 38 38 38 39 40 40 38 38 38 39 40 40 40 40 39 39 39 40 40 40 40 39 38 38 38 38 36 36 37 37 38 37 37 37 37 37 37 37 36 35 35 35 34 35 34 33 33 34 35 35 35 36 36 36 36 36 36 36 35 35 35 35 35 34 34 67 67 67 67 66 65 64 64 63 63 63 62 61 60 60 60 60 60 61 62 63 64 63 63 63 62 62 62 61 61 61 61 61 62 62 62 61 61 61 61 61 60 60 59 58 58 59 59 59 59 58 58 58 58 57 57 56 56 57 56 55 55 55 55 56 57 57 57 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 51 52 52 53 54 54 54 54 53 53 53 53 53 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 48 48 48 49 49 48 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 49 48 47 46 46 46 46 46 46 46 45 44 43 42 42 43 44 46 46 45 45 45 45 43 43 43 43 43 43 43 43 43 42 41 40 40 40 40 39 38 39 40 40 40 39 39 39 38 38 38 38 37 36 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 34 33 33 34 34 34 34 34 34 34 34 34 34 35 36 36 37 37 38 38 38 38 37 37 36 36 35 35 36 36 37 36 34 34 35 35 35 35 34 34 33 34 33 32 31 31 31 31 31 31 30 30 31 31 31 30 31 32 34 35 34 30 29 29 29 29 29 29 29 29 30 32 33 34 36 37 36 35 36 35 34 34 33 31 31 32 32 32 34 35 33 32 32 32 32 33 34 34 34 34 35 35 33 33 33 33 34 35 35 35 34 33 32 31 31 31 32 34 34 32 32 34 35 36 37 38 37 35 35 37 37 37 38 38 38 37 36 35 35 35 35 37 37 35 33 32 32 32 33 34 34 35 36 37 37 39 39 37 35 36 37 37 36 35 34 33 34 36 35 33 32 33 36 37 36 36 36 36 35 34 34 34 34 34 34 34 35 34 34 35 36 36 36 37 37 38 38 37 36 38 38 37 36 34 34 34 35 36 36 36 37 37 38 38 39 38 38 38 38 39 39 38 38 38 37 37 39 40 39 38 38 39 39 39 39 39 39 39 39 39 40 40 40 40 39 39 38 38 38 37 36 36 36 37 37 36 36 37 38 37 37 36 36 36 36 35 36 36 34 33 34 35 35 35 36 36 36 36 36 35 35 36 35 35 35 35 34 35 66 66 66 66 66 66 65 64 63 63 63 63 62 61 60 60 60 60 60 61 63 63 64 64 64 63 63 62 62 61 61 60 60 61 62 62 61 61 61 60 60 61 60 59 58 58 58 59 59 59 59 58 58 58 57 56 56 56 56 55 55 55 55 56 56 57 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 52 52 52 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 50 50 49 49 49 48 48 48 48 48 48 49 48 48 48 48 49 48 48 49 49 49 49 49 48 48 48 48 48 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 49 49 48 48 48 49 49 49 49 49 49 49 48 48 49 49 49 49 48 48 47 47 46 46 46 46 46 46 45 44 42 42 43 44 46 46 46 46 45 44 42 41 41 42 42 42 42 43 43 43 41 41 40 40 40 40 40 40 39 40 40 40 40 40 39 38 38 38 37 37 36 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 33 33 33 34 34 34 34 34 34 34 34 34 34 35 35 36 37 37 38 38 37 37 37 37 37 36 35 36 36 37 36 36 35 35 35 36 36 35 34 34 35 35 34 33 32 33 33 33 32 31 30 31 31 31 30 30 30 31 34 34 32 30 29 29 29 29 29 29 29 29 30 33 35 35 37 37 35 35 36 34 33 33 32 31 32 33 33 33 34 34 33 32 32 32 33 34 35 34 34 34 35 35 33 32 33 33 34 34 34 34 34 33 31 31 31 31 32 34 33 32 32 34 35 36 37 37 35 35 36 37 37 37 38 38 38 37 36 35 34 35 37 38 36 34 33 32 32 32 33 35 35 35 36 38 38 39 39 36 35 36 37 37 36 35 34 33 33 35 34 32 32 34 36 37 37 38 39 38 37 37 37 36 36 35 34 34 35 34 34 35 36 36 38 38 38 37 37 36 36 37 36 35 34 34 34 35 35 37 37 36 37 38 39 39 39 38 38 38 37 38 38 38 38 38 37 37 38 40 39 38 39 39 39 39 39 38 38 38 39 39 39 39 39 39 40 39 38 38 38 37 37 36 35 35 36 35 36 37 38 37 37 37 37 37 36 36 36 36 35 33 34 35 35 35 36 36 36 36 36 36 36 37 36 36 36 35 34 34 66 66 66 66 67 66 66 65 64 64 63 63 63 63 62 60 60 60 60 60 62 63 63 63 63 63 63 63 63 62 61 60 60 60 61 61 61 61 61 60 60 60 60 59 59 58 58 58 58 58 58 58 58 57 56 55 55 55 55 55 55 56 56 56 57 57 57 57 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 53 53 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 51 51 51 52 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 47 47 48 48 47 46 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 48 48 48 49 49 48 47 47 48 47 47 47 46 46 46 45 44 44 43 42 42 43 45 46 46 46 45 44 43 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 40 39 39 40 40 40 40 39 38 38 37 37 37 36 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 34 33 33 33 33 33 33 33 34 34 34 34 34 34 34 35 36 37 38 38 38 37 37 37 37 37 37 36 37 37 36 36 36 36 35 36 36 35 35 34 34 35 35 34 33 33 34 34 34 33 32 32 32 33 32 31 30 30 31 32 31 30 29 29 29 29 29 29 29 29 29 31 35 37 36 37 37 35 35 36 35 33 31 31 31 32 34 35 35 34 34 33 32 32 33 35 35 34 34 33 34 35 35 34 32 32 33 34 34 32 33 33 32 31 31 31 31 31 32 32 32 33 34 34 35 37 36 35 36 37 36 36 37 38 38 38 37 36 34 34 36 39 38 36 34 33 32 32 33 33 36 37 36 37 38 39 40 39 36 35 37 37 37 36 36 35 33 33 34 33 32 32 34 36 37 36 38 39 39 38 37 37 37 36 36 36 36 36 36 35 36 37 38 38 38 37 35 36 36 35 36 35 34 34 35 35 36 37 38 38 38 38 38 39 39 39 39 39 38 37 37 37 37 38 38 37 37 38 38 38 38 39 39 38 38 38 38 38 39 39 40 39 39 39 39 40 39 39 38 37 37 37 37 36 36 36 35 35 36 38 38 37 37 37 37 37 37 37 36 35 33 33 34 34 35 36 35 35 36 36 36 36 37 37 37 36 36 35 34 66 66 66 66 66 66 66 66 65 64 63 63 64 64 63 62 60 60 60 60 60 61 62 62 63 63 63 63 63 62 61 60 60 60 60 61 61 61 61 60 60 60 60 60 59 58 58 58 58 58 58 58 57 57 56 55 55 55 55 55 56 56 56 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 49 49 50 50 50 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 48 48 48 48 47 47 47 47 46 47 47 47 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 49 49 48 47 46 46 48 47 47 47 47 46 46 45 44 43 42 41 41 42 44 45 46 46 45 45 43 42 41 41 40 40 40 40 41 41 41 41 41 41 41 40 40 40 38 38 38 39 39 39 39 39 39 38 37 37 37 37 36 36 35 34 34 34 34 34 34 35 34 34 34 35 34 34 33 33 33 33 33 33 33 34 34 34 34 34 34 34 36 37 37 38 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 36 36 35 35 35 35 35 35 34 34 34 34 35 34 34 34 33 33 32 31 29 29 30 30 30 29 29 29 29 29 29 29 29 29 29 31 34 36 36 36 36 35 34 35 35 33 31 31 32 33 34 35 35 34 33 33 32 32 33 34 34 34 33 33 33 35 35 34 33 32 32 34 33 32 32 32 31 31 31 31 31 31 31 32 33 35 35 35 35 36 35 35 37 37 35 36 37 37 37 37 37 36 34 34 37 39 39 37 35 33 32 33 33 34 35 37 38 38 39 39 39 38 35 36 37 38 37 36 36 35 33 33 34 33 32 33 35 36 36 36 37 38 37 36 36 35 35 36 36 36 36 37 37 36 36 38 37 37 37 36 35 36 36 34 34 34 34 36 36 36 37 37 38 39 39 38 38 38 38 38 39 39 39 38 37 37 37 38 38 37 38 38 39 39 38 38 37 38 38 39 38 39 39 39 40 39 39 40 40 40 40 39 38 38 37 37 38 37 37 37 36 35 36 37 37 37 37 38 37 37 37 37 36 35 34 34 33 34 35 36 35 35 35 35 36 36 37 36 36 36 36 36 35 66 66 65 65 66 66 66 65 65 65 64 64 64 64 64 63 62 60 60 60 60 60 60 61 62 63 62 63 62 62 61 61 61 60 60 60 61 61 61 61 60 60 59 59 59 59 58 58 58 57 57 57 57 56 56 55 55 55 55 56 56 57 57 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 57 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 54 54 54 54 54 54 53 53 53 53 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 50 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 46 46 46 47 48 48 48 48 49 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 48 47 46 46 46 46 46 46 46 45 45 45 45 44 43 41 41 41 43 45 46 45 45 44 44 43 42 41 41 41 40 40 40 41 41 41 42 42 41 40 40 40 39 38 37 38 38 38 39 39 39 38 38 37 37 37 37 36 36 35 34 33 33 33 33 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 34 34 34 35 37 38 37 37 36 36 37 37 37 37 37 37 37 35 35 34 34 34 34 35 36 36 36 36 36 35 35 35 35 34 33 34 35 34 34 34 34 33 32 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 31 34 37 37 35 34 35 35 35 35 33 31 31 33 35 35 35 35 34 34 33 32 32 32 33 33 33 32 33 34 35 34 33 32 32 32 33 33 32 32 31 31 30 31 31 31 31 32 33 34 35 36 37 36 36 35 35 37 36 35 37 37 37 37 37 36 34 33 35 38 39 39 38 36 33 32 34 35 36 36 37 38 40 40 40 38 36 35 36 37 37 37 36 35 34 33 33 34 33 32 34 36 35 35 37 37 36 36 36 36 36 36 36 36 35 35 36 36 35 35 37 36 35 36 35 35 35 35 33 33 35 36 37 37 37 37 38 38 39 39 38 38 38 38 39 39 40 39 38 38 37 37 37 37 38 38 39 40 39 38 38 38 38 38 39 39 39 40 40 40 39 39 39 39 40 40 39 39 39 38 37 37 38 38 37 37 36 35 36 36 36 37 37 37 37 36 36 36 36 35 35 34 33 35 36 35 34 35 35 36 37 37 36 35 35 36 37 36 67 66 65 65 65 66 66 65 64 65 65 65 64 64 63 63 63 62 60 60 60 59 59 59 60 61 61 62 62 61 61 61 61 60 59 60 60 61 61 61 61 60 59 59 58 58 58 58 58 57 57 57 57 56 56 55 55 55 56 56 57 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 50 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 49 49 48 48 48 48 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 48 49 49 49 49 49 48 48 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 46 45 45 45 45 45 44 44 44 44 44 44 43 43 41 40 41 43 44 44 44 44 44 42 41 41 41 41 40 40 40 40 40 41 42 41 41 41 40 40 39 38 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 36 35 34 33 33 33 33 33 33 34 34 34 34 34 33 32 32 33 32 32 33 33 33 33 34 34 34 35 36 37 37 37 36 36 36 36 36 36 36 36 36 35 35 34 34 33 34 35 36 36 36 36 36 35 35 34 34 34 33 33 34 34 34 35 35 34 33 33 32 30 29 29 29 29 29 29 29 29 29 29 29 29 30 33 37 37 35 34 35 36 36 35 35 33 31 31 33 35 36 35 35 35 35 34 33 32 31 32 32 33 34 34 35 35 35 34 33 33 32 32 32 32 31 31 30 30 31 31 32 33 34 34 34 35 36 37 37 36 35 36 36 35 36 37 37 37 37 36 35 33 34 37 39 39 38 37 36 33 33 34 36 37 38 38 39 40 40 38 36 35 36 36 36 37 37 36 35 34 33 32 33 33 32 35 36 35 35 35 35 35 35 36 36 37 37 37 37 36 36 36 35 34 34 36 36 34 35 34 34 34 34 33 35 36 37 38 39 38 38 38 38 38 38 37 37 38 38 39 39 40 40 38 38 37 37 36 37 38 38 38 38 38 38 39 39 39 39 39 40 40 40 41 40 39 39 38 39 40 40 40 40 40 39 37 37 37 38 38 38 37 36 35 35 35 37 37 37 37 36 36 36 37 36 35 34 33 34 35 34 34 35 35 36 37 37 36 36 35 35 36 36 66 66 65 64 65 65 66 65 64 64 64 65 64 63 63 63 62 62 62 60 60 59 59 59 59 60 60 60 61 61 61 61 61 61 60 59 60 60 60 61 60 60 59 59 59 58 58 58 58 58 58 57 57 56 56 56 56 56 56 57 57 57 57 57 57 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 51 51 51 51 52 52 51 51 51 51 51 51 51 50 50 50 49 49 50 50 50 50 50 50 50 50 49 49 50 51 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 49 49 49 49 49 49 49 49 49 49 48 48 47 47 48 48 48 48 47 46 46 47 46 45 44 44 45 45 45 44 43 43 42 42 43 43 42 40 40 42 43 42 43 43 43 42 42 41 41 41 41 40 39 38 39 40 40 41 41 41 40 40 39 38 38 37 37 37 37 37 37 38 38 38 39 38 37 37 37 36 35 35 34 33 33 33 33 33 33 33 33 34 34 33 32 32 32 32 32 32 32 33 33 33 33 33 34 36 37 37 37 35 35 35 35 35 35 35 34 34 35 34 33 32 33 34 34 35 35 35 36 35 34 34 34 34 34 34 33 33 33 33 35 35 35 34 33 32 31 30 29 29 29 29 29 29 29 29 29 29 29 30 32 36 36 33 34 36 37 36 35 34 33 31 32 34 35 35 35 36 36 35 34 34 33 31 31 32 33 34 34 35 35 36 36 35 35 33 31 32 31 31 30 30 30 31 31 33 34 35 36 36 37 37 37 37 35 35 37 35 35 36 37 36 36 37 35 33 33 35 37 37 37 37 35 33 33 33 34 35 37 38 39 40 39 38 36 35 36 36 36 37 38 37 36 35 34 33 32 32 32 32 33 34 34 35 35 35 36 36 36 36 37 37 37 36 35 35 35 34 33 34 36 35 34 33 33 33 34 33 34 36 37 38 39 40 39 38 38 37 37 38 38 38 38 38 38 39 40 40 39 39 38 36 36 37 37 37 38 38 38 39 39 40 40 40 40 40 40 41 41 40 40 39 38 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 36 35 35 36 37 37 37 37 36 36 37 36 35 34 34 33 33 34 35 36 36 36 37 37 36 35 35 34 34 35 66 66 65 64 64 65 65 65 64 63 63 64 64 63 63 63 63 63 62 61 60 60 59 59 59 59 59 59 60 60 60 61 61 61 60 59 59 59 60 60 60 59 60 59 59 58 58 59 58 58 58 57 56 56 56 56 56 56 57 57 57 57 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 52 52 53 53 54 53 53 53 53 52 52 52 52 52 53 52 52 52 52 51 51 51 51 51 52 52 51 51 51 51 51 50 50 50 49 49 49 50 51 51 50 50 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 45 45 45 45 46 46 47 47 48 48 48 48 49 49 49 49 48 48 48 47 47 47 47 48 49 48 47 46 45 45 46 45 44 43 44 45 46 45 44 43 43 42 42 42 41 40 40 41 41 42 43 44 44 43 42 41 41 41 41 40 39 38 38 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 37 37 37 38 39 38 37 37 36 36 35 35 34 34 33 33 33 33 33 33 33 33 34 33 33 32 32 32 32 32 32 32 33 33 33 33 34 36 37 37 35 35 35 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 35 35 35 34 34 34 33 33 33 32 32 32 34 34 34 34 34 33 33 33 31 29 29 29 29 29 29 29 29 29 29 29 29 31 34 34 33 35 36 36 36 36 35 33 31 32 34 34 34 35 36 36 35 34 34 33 32 31 32 33 33 34 34 35 35 35 35 34 32 31 32 31 30 30 30 31 31 32 33 35 36 37 37 37 38 37 35 34 34 35 35 36 37 36 35 36 36 34 32 32 35 36 34 34 35 33 32 32 34 36 36 36 37 37 38 38 36 35 36 36 36 37 39 38 36 36 35 34 34 32 32 32 32 32 34 36 36 36 36 36 36 37 37 36 36 36 35 34 33 34 34 33 33 34 34 33 32 33 34 35 35 36 37 38 39 39 39 39 38 37 37 38 38 39 38 38 38 38 39 39 39 40 40 39 38 37 37 37 37 38 39 39 39 40 40 40 41 41 41 40 40 40 40 40 39 39 40 40 40 40 40 40 39 38 38 38 37 37 38 39 38 37 36 35 36 36 36 37 37 36 35 36 36 36 35 34 33 33 34 35 36 36 36 36 36 35 35 35 34 34 34 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 61 60 60 59 59 59 59 59 59 59 59 59 60 60 59 58 58 58 58 58 58 59 58 58 58 57 58 57 57 57 56 56 56 56 57 57 57 57 57 57 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 52 52 53 53 53 54 53 53 53 53 53 52 52 52 52 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 49 50 50 51 51 51 50 50 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 46 46 46 47 47 47 48 49 49 49 49 48 47 47 47 47 46 47 48 48 48 48 47 45 45 45 44 44 43 44 45 45 45 45 45 45 44 44 43 42 41 40 40 40 42 43 44 44 43 42 41 41 40 40 40 40 39 38 38 38 38 38 39 39 39 39 39 39 38 38 37 36 36 36 37 37 38 37 37 37 37 36 35 35 35 35 35 35 34 33 33 33 33 33 33 33 34 33 32 32 32 32 32 32 32 32 32 32 33 34 36 37 36 36 36 36 35 35 34 33 33 34 34 34 34 33 33 33 33 33 33 33 34 34 34 34 33 33 33 33 33 33 32 32 33 33 32 33 34 33 33 33 30 29 29 29 29 29 29 29 29 29 29 29 29 30 33 33 34 35 34 35 36 35 35 33 31 31 33 33 33 34 35 36 36 34 34 33 32 32 32 32 34 35 36 36 35 35 34 33 32 31 31 30 30 30 31 31 32 33 34 36 37 37 37 37 37 36 34 33 34 34 35 36 36 35 35 35 35 33 32 32 34 35 33 32 33 32 32 32 35 37 37 37 36 37 37 37 36 35 35 35 36 38 39 39 37 37 36 35 34 32 32 32 32 34 35 36 36 35 36 35 35 36 36 35 35 35 35 34 33 33 33 32 33 33 32 32 32 33 35 36 37 38 38 38 39 40 39 38 37 37 38 38 39 39 39 39 39 39 39 39 39 39 40 40 40 38 37 37 38 39 39 39 39 40 40 40 41 41 41 40 40 40 40 39 39 40 41 41 41 41 40 40 40 40 38 38 38 37 37 38 38 37 36 36 35 35 36 36 36 35 34 35 36 36 34 33 33 33 34 35 35 36 36 35 35 34 35 35 34 34 34 64 65 65 64 63 63 63 63 63 63 63 63 63 63 64 64 63 63 63 62 63 63 62 61 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 57 57 57 57 57 57 57 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 52 52 52 53 53 53 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 46 45 45 45 45 46 47 48 48 48 49 49 49 48 48 47 46 46 46 46 47 48 48 48 48 47 46 45 44 43 43 43 44 45 45 45 46 46 45 44 44 44 43 43 41 40 40 41 43 44 44 43 43 42 41 41 40 39 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 37 37 37 37 37 37 36 36 36 35 36 37 36 35 35 34 34 33 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 34 36 37 37 37 36 36 37 36 35 34 34 33 33 34 34 34 33 32 32 32 32 32 32 33 33 32 32 31 31 31 32 32 33 33 31 31 30 30 31 32 31 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 33 34 34 34 36 35 34 34 32 31 31 32 32 33 34 35 35 35 34 34 33 31 32 32 34 36 37 37 37 35 34 34 33 33 32 30 30 30 31 31 31 33 35 36 37 37 36 37 37 36 36 34 33 34 35 36 36 35 34 35 34 33 32 32 33 33 33 32 32 32 32 32 33 35 36 37 38 37 37 38 38 36 35 35 35 36 38 38 38 39 38 37 36 35 34 32 32 32 34 34 34 35 35 35 35 34 34 34 35 35 35 35 34 32 32 32 32 32 32 32 32 33 35 36 37 38 38 37 37 38 38 38 38 38 39 39 39 39 39 39 39 39 39 40 40 39 39 39 39 39 38 37 37 38 39 38 38 38 40 41 41 40 40 40 40 40 40 40 39 40 40 40 40 40 40 40 39 40 39 38 38 39 38 37 37 37 36 36 36 35 35 35 35 35 35 34 34 36 36 35 34 33 33 34 35 36 36 36 35 34 34 35 34 33 34 34 63 63 64 64 63 63 63 63 63 63 63 63 62 63 63 64 64 63 63 62 62 62 62 62 61 61 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 51 50 50 50 51 51 51 51 51 50 50 51 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 46 46 45 45 45 45 46 47 48 48 49 49 49 48 48 47 47 46 46 46 46 47 48 48 48 48 47 46 46 45 44 44 43 43 45 44 45 45 45 44 44 44 44 44 43 41 40 40 41 42 42 44 44 44 43 42 41 40 40 39 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 37 36 35 36 37 37 37 37 37 37 37 37 37 36 37 37 37 36 35 35 35 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 33 35 37 37 36 36 35 36 36 36 35 34 34 34 33 33 33 33 33 32 32 32 31 31 31 31 30 30 30 30 30 30 30 30 31 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 33 33 35 36 35 34 33 31 31 31 33 33 33 35 35 34 34 34 33 32 31 32 34 35 36 36 36 36 35 34 35 34 34 32 30 30 30 31 31 32 34 35 36 37 36 36 37 36 35 35 34 33 34 35 36 36 34 34 33 32 32 32 32 32 32 32 32 32 32 32 33 35 36 37 37 38 38 38 39 38 36 35 34 36 37 37 38 38 39 38 37 37 37 35 33 32 32 33 34 34 33 34 34 34 34 34 34 35 35 35 34 33 32 32 32 32 32 32 32 33 34 36 37 37 37 37 36 37 37 38 38 39 40 40 40 39 38 38 37 38 38 39 39 39 38 39 39 38 38 37 36 37 38 38 38 38 38 39 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 39 39 39 39 38 39 38 38 37 37 36 36 36 36 36 35 34 34 35 35 34 34 35 36 36 35 33 33 34 35 35 36 36 35 35 34 34 33 33 34 35 62 62 63 63 63 63 63 63 63 63 62 62 62 62 63 63 63 63 62 61 61 61 61 61 61 61 61 61 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 58 58 57 57 57 57 58 58 58 58 58 58 58 59 59 59 58 58 58 58 58 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 54 54 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 53 53 52 52 53 53 54 55 54 54 54 54 53 53 53 54 53 53 53 53 53 53 54 54 54 53 53 52 52 52 52 51 51 52 51 51 51 51 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 45 45 45 45 46 47 48 49 49 49 49 48 48 47 47 46 46 46 46 47 47 48 48 48 47 47 46 46 45 44 43 43 44 44 44 44 45 44 44 44 44 44 43 42 41 40 40 41 42 43 44 44 42 41 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 36 36 36 36 37 37 38 37 37 37 37 37 37 37 36 35 35 35 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 34 36 36 36 35 35 35 36 36 36 35 35 35 35 34 33 33 33 32 32 31 31 30 30 30 30 32 33 31 31 32 31 30 30 30 30 30 29 30 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 32 33 35 34 34 34 32 31 32 33 34 34 34 35 35 34 34 34 33 32 31 32 35 35 35 36 36 35 34 34 34 34 33 31 30 30 30 31 32 33 34 34 35 35 35 36 37 36 35 35 33 33 35 36 36 35 34 34 32 32 32 32 32 32 32 32 31 31 32 32 33 36 38 39 38 38 38 38 39 38 36 35 35 36 37 37 37 38 38 38 37 37 36 35 33 32 32 32 33 33 34 35 35 35 35 35 35 34 34 34 33 32 32 32 32 32 32 32 33 35 35 36 37 36 35 36 36 36 37 38 38 39 40 39 39 38 37 37 37 37 37 38 38 37 38 39 38 37 37 36 36 37 37 37 37 38 38 38 39 40 39 39 40 40 39 39 38 38 39 39 39 39 39 39 38 38 39 39 38 38 38 37 37 36 36 36 35 35 36 36 35 35 34 35 35 34 33 34 36 35 33 32 33 34 34 36 36 35 35 34 34 34 35 35 36 61 61 62 63 63 63 62 63 63 63 63 62 61 61 61 61 61 61 61 60 60 60 60 60 61 61 60 60 60 60 60 59 59 59 59 59 58 58 58 58 59 59 59 59 59 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 53 54 54 54 54 54 54 55 55 54 54 54 53 53 53 53 53 53 53 53 53 52 53 53 53 53 53 53 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 45 45 45 46 47 48 49 49 48 48 48 49 48 47 47 46 46 46 46 47 47 48 47 47 46 46 46 46 45 44 43 42 43 44 43 43 44 45 44 43 43 43 43 42 42 40 39 40 42 42 43 43 43 41 40 40 39 39 39 40 39 39 38 37 37 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 36 35 35 34 34 33 34 34 33 33 32 32 32 33 32 32 32 32 32 34 35 35 35 34 34 35 36 37 37 35 35 35 35 35 34 34 33 31 30 30 30 30 30 30 31 34 36 35 34 34 33 32 31 31 31 31 31 32 33 32 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 32 35 35 34 33 32 31 32 33 34 34 35 35 36 36 35 34 34 34 32 31 32 33 34 35 35 35 35 34 33 34 33 31 30 30 30 30 31 32 34 34 34 34 35 36 36 36 35 35 34 33 34 35 36 35 34 34 34 33 32 32 32 33 32 32 31 31 31 32 34 35 37 39 40 39 38 38 39 39 37 35 35 35 36 37 37 37 38 38 38 38 37 36 35 33 32 32 32 33 35 36 36 35 36 36 36 35 34 33 34 33 32 32 32 32 32 33 33 34 35 36 37 36 35 35 36 37 38 38 38 39 39 39 39 37 37 37 37 37 37 37 38 37 37 37 37 37 36 36 36 37 37 37 38 38 38 38 38 38 39 39 40 40 40 39 38 38 39 39 39 39 38 38 38 39 39 40 39 38 38 37 37 37 37 35 35 36 35 35 36 36 36 34 34 34 33 33 33 34 34 33 32 32 33 35 36 36 35 34 34 34 35 36 36 36 61 61 61 61 62 62 62 62 63 63 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 59 59 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 53 54 54 55 55 54 54 55 55 55 55 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 52 52 51 51 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 46 46 45 45 45 46 47 48 49 49 48 48 48 48 48 47 46 46 46 46 46 47 48 47 46 46 45 45 46 46 45 45 44 42 42 43 43 43 44 44 45 45 44 43 43 41 41 41 39 39 41 42 43 43 42 42 41 40 40 40 40 40 40 39 39 38 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 36 36 37 37 37 36 36 36 36 36 36 35 34 34 33 32 33 33 33 33 32 33 34 34 34 33 33 32 32 32 33 35 35 34 34 35 36 37 37 35 35 36 36 35 34 34 33 31 30 30 30 30 31 31 31 33 35 35 35 34 33 33 32 33 34 34 34 34 34 33 31 29 30 31 31 30 31 31 30 29 29 29 29 29 29 29 29 29 29 29 31 33 35 34 32 31 31 32 33 34 34 35 36 37 37 35 33 33 33 32 31 31 32 34 35 34 34 34 33 34 33 32 30 30 30 30 30 31 33 33 33 34 35 36 36 35 35 35 33 33 33 35 35 34 33 34 34 34 32 32 32 33 33 32 32 31 31 32 33 34 36 38 38 39 39 38 38 38 39 38 36 35 35 36 36 36 37 37 38 37 37 37 36 34 32 32 32 33 35 36 35 35 35 36 36 36 34 33 32 33 32 32 32 32 32 33 34 35 35 35 37 36 35 35 36 37 37 38 39 40 39 38 38 38 38 36 36 37 37 37 38 37 36 36 36 36 36 36 37 37 37 37 37 38 38 38 38 38 38 39 39 40 40 40 39 38 38 39 39 39 38 38 38 39 40 39 39 39 39 38 37 37 38 37 37 35 36 36 34 35 36 36 34 34 34 34 34 33 33 33 33 32 32 33 35 36 36 35 34 33 33 35 35 35 35 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 61 61 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 53 54 55 55 55 55 54 54 55 55 55 55 55 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 50 50 49 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 48 48 48 48 48 47 47 47 46 46 46 45 45 45 46 47 48 49 48 48 47 47 48 47 47 46 46 46 46 47 48 47 46 46 45 44 45 46 46 46 45 44 42 41 42 42 42 43 44 45 45 45 44 43 42 40 40 39 39 40 41 43 42 41 42 42 41 41 41 41 40 40 39 39 38 38 37 36 36 36 37 37 37 37 37 36 36 35 35 34 35 35 35 36 37 37 36 36 35 35 35 35 34 34 33 32 32 32 32 33 32 33 35 36 35 35 35 35 34 32 31 32 33 33 33 34 35 35 37 37 35 35 36 37 36 34 33 32 31 30 31 32 31 32 33 33 33 33 34 34 34 34 33 34 34 35 35 34 34 33 32 31 31 32 33 34 33 33 34 31 29 29 29 29 29 29 29 29 29 29 29 29 31 33 32 31 31 32 33 34 35 35 35 36 36 36 36 34 33 32 32 31 30 31 33 34 34 33 33 34 33 32 30 30 30 30 30 30 30 31 32 32 33 34 34 35 35 35 34 32 32 33 35 34 33 33 34 34 33 32 32 32 32 33 32 32 31 31 32 33 34 36 36 37 38 39 39 38 38 39 38 36 35 36 36 36 35 36 37 38 37 36 36 36 33 32 32 33 34 34 35 35 36 36 35 35 34 33 32 32 32 32 32 32 32 32 33 35 36 35 35 35 35 35 36 38 38 38 38 38 38 38 37 36 37 38 36 35 37 38 38 37 36 35 35 37 37 37 37 37 37 37 37 37 38 38 38 38 39 39 40 40 39 38 38 38 38 38 39 39 38 38 38 39 39 39 39 38 39 39 39 39 39 38 38 38 36 36 36 35 34 35 36 36 36 35 35 35 35 35 34 33 32 32 33 35 36 35 34 34 33 33 33 34 34 34 63 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 61 61 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 53 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 48 48 49 49 49 49 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 45 45 45 45 47 48 48 48 48 47 47 47 47 46 46 46 46 47 47 48 47 47 46 45 44 45 46 46 45 44 44 43 42 41 41 41 42 43 43 44 44 44 43 43 41 41 39 38 39 41 42 42 41 41 41 41 41 41 40 40 39 39 38 38 37 37 37 36 37 38 38 37 37 37 37 36 35 35 34 34 34 35 35 37 37 37 36 35 34 34 35 34 34 33 32 32 33 33 33 33 34 36 36 36 36 36 35 34 33 33 33 32 31 31 32 33 35 35 35 35 34 35 35 35 33 32 31 31 32 33 32 32 33 34 34 33 33 34 35 35 35 34 34 34 34 33 32 32 32 31 32 33 33 34 34 34 34 33 32 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 32 33 33 34 36 36 36 36 36 36 35 34 34 32 32 32 31 30 32 33 33 32 33 34 33 31 30 30 30 31 32 32 31 32 32 32 32 32 32 33 33 33 32 32 32 34 35 33 33 34 34 33 32 31 32 32 32 32 32 31 31 31 31 33 34 34 34 36 38 39 38 38 39 39 38 35 34 35 36 35 35 36 37 38 37 36 36 36 34 32 32 33 35 35 36 36 36 35 34 33 32 32 32 32 32 32 32 32 32 33 33 35 36 34 34 33 34 35 36 37 37 38 37 37 37 38 37 36 36 36 35 35 36 37 37 36 35 35 37 38 39 38 37 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 39 39 39 38 37 38 39 38 38 38 38 38 39 40 40 40 40 39 39 38 37 37 37 35 34 34 35 36 36 36 35 34 35 35 34 33 32 32 33 35 36 35 35 34 33 32 33 34 34 34 63 63 63 62 62 62 62 62 62 61 60 60 61 61 61 62 62 63 63 63 63 63 63 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 53 53 53 53 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 49 49 50 50 49 49 49 48 48 48 48 49 49 48 48 48 48 48 49 49 49 49 48 48 47 48 48 47 47 48 48 48 48 47 47 47 47 48 47 47 47 46 46 45 45 45 46 47 47 47 47 47 47 47 47 46 45 45 46 47 47 48 48 47 46 45 44 45 45 45 44 44 44 44 44 42 41 40 41 42 43 43 43 43 43 43 42 42 40 39 39 40 42 41 40 41 41 40 41 41 40 40 39 39 38 38 38 37 37 37 37 38 38 37 37 37 37 36 35 35 34 34 34 35 36 36 36 37 36 35 35 34 34 34 34 33 32 32 33 34 34 35 35 36 37 37 37 37 35 35 34 34 34 34 34 33 32 32 33 34 33 33 33 33 33 33 32 31 31 32 33 33 33 33 34 34 35 34 34 34 35 35 35 34 34 34 34 33 32 32 31 31 33 34 34 35 35 35 34 33 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 34 34 34 35 36 37 36 35 35 36 35 33 33 33 33 33 31 31 32 32 32 33 33 32 30 30 30 30 31 32 33 34 34 34 33 33 33 32 32 32 33 33 33 34 34 35 34 33 33 32 31 31 31 32 32 32 32 31 31 30 30 31 32 33 33 34 36 37 38 38 38 38 39 38 36 34 34 35 35 35 36 37 38 37 36 36 37 34 32 32 34 37 37 37 37 36 35 33 31 31 32 32 32 32 33 34 33 34 34 34 35 35 34 33 33 35 36 36 37 37 37 37 37 36 36 35 35 35 35 35 35 35 36 36 35 35 36 37 37 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 38 37 38 39 39 38 38 38 38 38 39 39 39 39 40 39 39 39 38 38 37 36 36 35 34 34 35 36 36 36 34 34 34 33 32 32 33 34 35 35 35 34 33 32 33 34 33 34 64 63 63 63 63 62 62 62 61 60 60 61 61 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 54 54 53 53 53 53 53 54 53 53 53 52 52 52 52 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 48 48 48 48 49 48 47 47 48 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 45 45 45 45 46 47 47 47 47 47 47 47 46 45 45 47 47 47 47 47 47 47 46 45 44 44 44 44 44 43 44 44 43 43 41 41 41 41 42 43 43 43 42 42 42 41 40 39 39 41 41 39 40 40 39 40 40 41 41 40 39 39 39 38 38 37 37 37 38 38 38 38 37 37 36 35 35 34 34 34 34 35 35 35 36 35 35 35 34 34 33 33 33 32 32 33 34 34 35 36 36 37 38 37 36 35 36 36 34 35 36 36 34 32 31 32 32 32 31 31 31 31 31 31 31 32 34 34 34 34 34 35 35 35 35 34 35 35 35 35 34 34 34 34 33 33 32 31 31 32 33 33 34 35 35 35 33 32 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 33 34 34 34 35 36 35 34 36 36 35 34 34 34 33 33 32 30 31 32 32 33 32 31 30 30 30 31 32 33 33 35 36 36 36 35 35 34 33 33 34 34 35 35 35 35 33 32 32 31 31 32 33 33 32 32 32 31 31 30 30 31 32 33 35 36 37 37 38 38 38 39 39 38 36 34 34 35 35 35 37 37 37 37 36 36 36 34 32 32 33 36 37 37 37 37 35 32 31 33 33 33 33 34 34 35 35 35 34 35 35 34 34 34 34 36 37 38 37 37 36 36 36 35 34 34 34 35 36 36 36 36 35 35 35 37 37 37 37 38 39 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 38 38 38 37 37 39 40 39 38 38 38 38 38 39 39 38 39 40 39 38 38 38 37 36 36 37 36 34 34 35 36 36 37 35 35 35 33 32 32 32 33 34 34 34 34 33 32 34 33 33 34 64 63 63 63 63 62 61 60 60 60 61 61 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 48 48 48 48 49 49 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 45 45 45 46 47 47 47 46 47 47 47 46 45 45 46 47 47 47 47 47 47 47 46 45 44 44 44 43 42 42 42 43 43 43 42 40 40 41 41 41 42 41 41 42 41 40 39 38 39 40 39 39 39 39 39 39 40 40 40 39 39 38 38 38 38 38 38 38 39 39 38 37 37 37 36 35 34 34 34 34 34 34 35 35 35 35 35 34 34 33 33 32 32 33 33 34 34 34 35 36 37 37 37 36 35 36 36 35 36 37 37 35 33 32 32 31 31 31 32 33 33 33 33 33 34 35 35 35 34 34 35 35 35 35 35 35 35 36 35 34 34 33 33 32 32 32 31 31 32 32 32 32 33 35 35 35 34 33 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 33 33 34 36 35 34 34 35 36 35 34 34 34 33 32 31 30 30 32 32 33 32 30 30 30 30 32 33 34 34 34 36 36 36 36 36 36 35 34 34 34 36 35 35 34 32 31 31 32 32 33 34 33 32 32 31 31 30 30 32 33 34 35 35 38 38 38 38 38 38 38 39 38 35 34 34 34 35 36 37 38 37 36 36 36 36 35 33 31 32 35 37 37 37 36 34 32 32 34 35 35 35 35 35 35 35 35 34 33 33 33 33 34 35 35 36 36 36 36 36 35 35 35 35 35 36 37 37 37 37 37 37 36 37 37 37 37 37 38 39 39 39 38 38 38 38 38 38 38 37 37 38 38 38 39 40 39 38 37 37 37 38 38 39 38 38 39 38 38 39 39 39 38 39 40 39 38 38 38 37 36 36 36 35 35 35 34 35 35 36 36 36 35 34 33 33 32 32 33 34 34 34 33 33 33 33 33 35 63 64 64 63 62 62 61 60 61 61 62 62 62 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 46 46 46 46 46 47 47 47 47 47 47 46 46 47 47 46 45 45 45 45 46 46 47 47 47 47 47 46 46 45 45 46 46 47 47 47 47 46 46 46 45 43 43 42 42 41 41 41 42 43 42 41 39 39 40 40 40 41 40 41 41 40 39 38 38 40 39 38 38 39 38 38 38 39 40 40 39 38 38 38 38 38 39 39 39 39 39 38 38 37 36 36 36 35 34 34 34 34 35 36 36 35 35 35 34 33 33 33 33 33 34 34 34 34 34 35 36 37 37 37 37 37 37 36 36 37 36 35 33 33 34 34 33 32 33 34 34 35 36 34 34 35 36 35 34 34 34 35 35 35 35 35 35 35 35 34 34 34 33 33 32 31 32 33 33 33 32 31 33 34 35 35 35 36 34 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 33 34 35 36 34 33 34 35 35 34 34 33 34 33 32 31 30 31 32 32 31 31 30 30 30 31 33 34 35 35 35 35 35 36 37 37 37 36 35 34 35 36 35 34 33 31 31 33 34 34 34 34 33 32 31 30 30 30 31 33 33 34 35 36 37 38 39 39 38 38 37 37 37 36 34 34 34 35 36 37 38 37 37 36 36 35 34 33 31 32 35 37 37 36 34 32 32 33 34 36 36 36 35 34 35 35 34 33 33 33 33 34 35 35 35 35 35 35 34 34 34 35 36 36 37 37 38 38 39 39 39 38 38 38 38 38 38 37 38 39 39 39 38 38 38 38 38 38 37 37 38 38 38 38 39 39 39 39 37 37 38 38 38 39 38 38 38 38 39 39 39 38 38 39 40 39 38 38 38 37 37 37 35 35 36 36 34 33 34 36 37 36 36 36 35 35 34 32 32 32 33 34 33 33 32 33 34 35 63 63 63 62 62 62 61 61 61 62 62 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 62 62 62 62 62 61 61 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 46 47 47 47 47 47 46 46 46 46 46 45 45 46 46 47 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 47 47 46 46 47 46 45 45 46 46 47 47 47 47 47 47 46 45 44 44 43 43 42 41 40 41 41 41 41 40 39 39 39 39 40 40 39 40 40 39 38 38 39 40 39 38 38 38 38 38 38 39 40 40 39 39 39 39 39 40 39 39 38 38 39 38 37 37 37 37 36 35 34 33 34 35 36 36 35 35 34 34 33 33 34 33 33 34 34 35 35 34 34 35 36 37 38 37 37 37 37 36 36 36 35 33 34 35 35 34 33 34 34 35 36 36 35 34 35 36 36 35 34 34 34 34 35 35 35 35 36 35 35 34 34 34 34 33 33 34 34 34 33 32 31 32 34 34 35 36 37 35 34 31 29 29 29 29 29 29 29 29 29 29 29 29 29 32 34 36 37 35 33 33 34 35 36 34 34 33 33 32 32 31 30 31 31 30 30 30 30 30 30 31 32 34 35 36 36 35 35 36 37 36 36 37 36 34 35 35 35 33 32 31 32 34 35 35 35 35 33 32 31 30 30 30 31 32 32 33 35 36 38 39 39 38 37 38 38 38 38 36 34 35 35 35 36 37 38 37 37 36 36 35 35 33 31 32 35 37 37 34 32 32 33 34 35 36 35 35 34 34 35 34 34 33 33 33 34 35 35 35 34 34 34 33 34 34 35 36 37 37 37 38 39 39 40 40 39 39 39 39 39 39 39 39 38 39 40 39 38 38 38 38 38 38 37 37 38 39 38 38 38 39 39 38 37 37 38 38 38 38 38 38 39 39 39 39 38 38 38 39 39 38 38 38 38 37 37 37 36 37 37 35 35 34 34 34 35 35 35 36 36 36 35 33 32 32 32 32 32 32 32 33 35 36 63 63 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 57 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 45 45 45 45 45 46 46 45 45 45 45 46 47 47 46 46 46 46 45 46 47 47 47 47 47 47 47 47 47 47 46 45 44 43 42 41 41 40 40 40 40 39 39 39 39 39 39 38 38 38 39 38 37 38 39 40 39 38 37 37 37 37 38 38 38 39 40 40 40 40 40 39 39 38 37 37 38 38 37 37 37 36 36 35 34 33 33 35 35 35 34 34 34 33 33 34 34 34 34 34 35 35 35 35 34 35 36 37 38 37 37 37 37 36 36 36 35 34 34 35 35 34 34 34 35 36 37 37 36 34 35 36 36 36 35 34 34 34 35 35 35 36 37 36 35 35 35 34 34 34 34 34 33 33 32 32 32 33 33 33 34 35 36 36 35 32 29 29 29 29 29 29 29 29 29 29 29 29 30 33 35 35 35 34 34 35 35 36 36 35 34 33 32 33 33 32 30 30 30 30 30 30 30 30 31 33 33 34 35 36 35 34 35 35 35 35 36 36 36 36 36 35 34 33 31 32 33 34 35 35 35 35 33 32 31 30 30 30 30 31 32 34 36 37 39 39 38 37 37 37 39 40 38 35 34 35 36 36 36 37 37 37 37 36 36 37 35 33 31 32 35 36 34 33 32 33 34 35 35 35 35 34 34 34 34 34 33 33 33 33 34 34 34 33 33 33 33 34 35 36 37 37 37 38 38 38 39 39 39 39 38 38 39 38 39 39 39 39 39 38 39 39 39 38 38 37 37 37 37 37 38 38 38 38 38 39 39 38 37 37 38 37 38 38 38 38 39 39 39 38 38 37 37 38 38 37 37 38 37 37 37 37 38 37 36 35 35 36 36 34 33 33 34 35 36 35 35 33 34 33 32 32 32 31 31 32 34 36 64 63 63 62 62 62 62 62 62 63 63 63 63 63 63 63 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 57 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 46 46 47 46 46 47 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 45 46 46 46 46 46 45 45 46 46 46 46 47 47 47 47 47 47 47 46 45 45 43 42 42 42 41 41 41 40 39 39 39 39 39 38 38 38 38 38 38 37 37 38 39 39 38 37 37 36 36 37 37 38 38 40 40 39 40 40 39 38 38 37 36 37 37 37 36 35 35 35 35 35 34 33 34 34 34 34 34 33 33 34 34 34 34 34 35 36 36 36 35 35 35 36 37 38 37 37 37 37 36 36 36 35 34 35 35 35 34 34 35 35 36 37 37 35 35 35 36 37 37 35 34 35 35 35 35 36 37 37 36 36 36 36 35 34 34 35 33 33 33 33 32 32 34 33 32 32 34 35 35 34 31 29 29 29 29 29 29 29 29 30 32 32 33 33 34 35 34 33 34 35 36 37 37 37 35 33 32 32 32 32 32 31 30 30 30 30 30 30 30 32 34 34 35 36 36 35 34 34 35 35 35 36 36 36 36 36 35 34 32 31 33 34 35 35 35 35 34 34 33 31 30 30 30 30 32 34 36 36 37 38 38 37 36 37 38 39 39 38 35 34 36 38 38 38 38 38 37 36 36 36 37 35 33 31 32 34 34 32 31 32 34 35 36 35 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 35 36 36 37 38 38 38 38 38 39 39 39 38 39 38 38 39 39 39 39 39 38 38 38 38 38 39 38 37 37 37 37 37 37 38 39 38 37 38 39 38 37 37 37 38 38 38 38 38 38 39 38 37 38 37 37 38 38 37 37 37 37 36 36 37 38 38 37 37 36 36 37 36 35 34 33 33 34 34 34 35 35 35 34 33 32 32 31 31 32 33 35 64 64 63 63 63 63 63 62 63 63 63 63 63 63 63 64 64 64 63 63 63 64 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 55 56 56 57 57 57 57 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 49 49 50 49 49 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 44 45 45 45 45 46 46 45 45 45 45 45 46 46 46 47 47 47 47 47 47 45 44 43 43 43 43 43 42 42 41 41 41 41 41 40 39 39 38 38 38 37 37 37 38 39 39 39 38 37 37 36 36 37 37 38 39 38 38 39 39 38 38 37 37 36 36 36 36 36 35 34 34 34 34 34 34 34 33 33 33 33 33 34 34 35 34 34 34 35 36 36 36 36 35 35 35 37 37 38 38 38 37 36 37 37 35 35 35 36 36 35 34 35 36 37 37 37 36 36 36 36 37 37 36 35 35 35 36 36 37 37 37 36 36 36 36 35 34 35 35 34 34 34 34 33 32 34 34 33 32 32 32 32 32 30 29 29 29 29 29 29 29 30 33 35 35 36 35 35 34 33 33 34 35 36 36 36 35 35 34 33 33 33 32 32 32 30 30 30 30 30 30 31 33 34 35 35 36 35 34 34 35 35 36 36 36 35 35 35 35 34 33 32 31 33 34 34 34 35 35 34 34 33 31 30 30 30 31 34 35 35 35 36 37 37 36 36 37 38 39 38 37 35 34 36 38 39 39 38 39 38 37 36 36 36 34 32 31 32 34 34 32 31 32 34 36 35 34 33 33 33 33 33 33 33 34 35 35 35 35 34 35 35 36 36 36 37 37 37 38 38 38 38 39 39 40 38 38 39 39 39 40 40 39 39 39 39 38 38 38 38 38 38 37 38 38 37 37 37 38 38 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 37 36 36 37 37 37 38 38 38 38 38 38 38 37 36 36 35 34 33 33 34 35 35 35 34 33 32 31 31 32 33 34 35 64 64 64 64 64 64 63 63 63 63 63 63 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 55 56 56 57 57 57 57 57 57 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 44 44 45 45 45 45 46 46 45 45 45 46 46 46 46 47 47 47 47 47 46 45 45 44 44 44 43 43 44 43 42 41 41 41 41 41 40 40 40 39 39 38 37 37 37 38 39 39 38 38 38 37 36 36 36 37 37 37 37 38 38 38 38 38 37 37 36 36 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 35 35 34 34 35 35 36 37 37 37 36 36 35 36 38 39 39 38 37 37 37 37 36 36 36 37 36 35 35 36 36 37 37 37 37 37 37 37 37 37 36 35 35 36 36 37 37 37 37 36 36 36 35 35 35 36 35 34 34 34 34 32 32 33 34 34 32 31 30 30 30 29 29 29 29 29 29 29 29 31 33 34 35 36 34 34 34 33 34 34 35 35 35 35 34 34 35 34 34 34 32 32 31 30 30 30 30 30 30 32 34 34 35 35 35 34 34 34 35 35 35 36 35 35 34 35 35 34 32 31 31 32 33 34 34 35 36 35 35 33 31 30 30 31 33 34 34 35 36 37 37 36 36 36 37 38 38 37 36 35 35 37 37 38 38 38 39 38 37 37 36 35 33 31 31 32 34 33 32 31 32 34 36 35 33 33 33 33 33 33 34 35 37 37 36 36 36 36 36 37 37 37 37 37 38 38 38 38 38 39 39 40 39 38 38 38 39 39 39 39 39 39 39 39 39 39 38 38 38 39 39 39 39 38 37 36 37 38 37 37 38 38 38 37 36 37 38 38 37 37 37 38 38 37 38 38 38 37 37 37 38 37 36 36 37 37 38 38 38 38 38 38 38 38 37 37 37 36 36 35 33 32 33 33 33 34 33 32 31 31 32 34 34 36 65 64 64 65 65 64 64 64 63 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 56 56 56 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 48 48 48 47 47 46 46 46 47 46 46 45 45 45 45 45 45 45 44 44 45 45 45 45 45 44 45 46 46 47 47 47 47 48 48 48 47 46 45 44 44 44 43 43 43 43 42 42 41 41 40 40 40 41 40 40 40 39 38 37 37 37 38 38 39 39 38 37 37 36 36 36 37 37 37 38 39 38 38 38 38 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 36 35 35 35 35 36 37 38 37 37 36 36 36 37 38 38 38 37 37 38 37 37 37 37 37 37 36 36 37 37 37 38 38 37 37 37 38 37 37 36 35 36 37 37 37 38 37 37 37 37 36 36 36 37 37 35 34 34 34 34 33 33 33 34 33 33 32 31 30 30 30 29 29 29 29 29 29 29 31 33 32 33 35 33 33 33 33 34 34 34 34 35 36 34 34 34 34 34 33 33 33 31 30 30 30 30 30 30 32 34 33 34 35 34 33 33 34 34 34 35 35 35 34 34 35 35 34 32 31 31 32 32 33 33 35 35 36 36 33 31 30 31 33 34 34 35 36 37 37 37 36 35 36 37 38 37 36 35 34 35 37 37 37 38 38 38 38 37 37 36 35 33 31 31 32 33 33 31 32 33 34 35 34 33 33 33 33 34 35 36 37 37 37 37 36 36 37 37 37 37 36 37 38 38 38 38 38 39 40 40 40 39 38 38 38 39 38 38 38 38 38 38 39 40 40 39 38 39 40 39 39 38 38 37 36 36 37 37 37 38 38 37 37 36 37 37 37 37 37 37 37 37 37 38 37 37 37 37 37 38 37 36 36 36 37 38 38 38 38 38 38 38 38 38 37 37 37 36 35 34 33 32 32 32 33 33 32 31 31 32 34 35 36 65 65 65 65 65 65 65 64 64 64 64 64 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 56 56 56 56 56 56 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 53 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 48 48 48 47 47 47 47 46 46 47 47 47 46 46 45 45 45 45 45 45 44 44 44 45 45 45 44 45 45 46 46 47 47 47 48 48 48 48 47 46 45 43 43 43 43 42 41 42 42 42 41 41 40 40 40 40 40 40 39 39 39 38 37 37 37 38 40 40 38 38 37 36 36 35 36 36 37 38 38 38 37 38 38 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 36 37 36 36 36 36 36 37 38 38 37 37 37 36 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 37 38 37 37 36 35 35 37 37 37 37 38 38 37 37 36 36 36 37 37 36 35 34 34 35 35 34 34 34 34 33 32 32 31 30 29 30 29 29 29 29 29 29 29 30 32 32 32 33 32 32 33 33 33 33 34 34 36 36 35 34 34 33 33 34 33 33 31 30 30 29 29 30 30 32 33 33 34 33 33 32 33 34 34 35 35 35 34 34 34 35 35 34 32 30 31 32 32 32 33 35 35 35 34 32 30 30 31 32 33 34 35 35 36 37 37 35 36 37 38 38 38 36 34 34 36 37 37 37 37 37 37 37 37 37 36 35 33 31 31 32 32 32 31 32 34 35 34 33 33 33 33 34 35 36 37 36 36 36 37 37 37 37 36 36 37 37 37 38 38 38 39 39 40 40 39 39 38 38 38 39 38 38 38 38 39 39 39 39 40 40 39 39 40 39 39 38 38 38 37 37 37 36 36 37 37 37 37 36 37 37 37 37 37 38 37 37 38 38 38 37 37 37 37 37 37 37 37 36 36 36 37 38 38 38 38 38 38 38 38 38 38 37 37 36 35 35 33 33 33 32 32 32 31 31 32 33 35 36 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 47 47 47 47 46 46 46 45 45 44 45 45 44 44 44 45 45 44 44 45 45 45 46 46 46 47 47 47 46 46 46 46 45 43 42 42 43 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 38 38 37 37 37 38 40 40 39 38 37 37 36 35 35 36 37 37 38 37 37 37 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 36 36 36 36 37 37 37 37 37 38 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 39 39 38 38 37 37 36 36 36 37 38 38 38 38 38 37 37 37 36 37 37 37 35 35 34 35 36 35 35 34 34 33 32 31 31 31 30 30 30 29 29 29 29 29 29 29 29 30 31 33 34 32 32 33 33 33 34 35 35 35 36 36 34 34 33 32 32 32 32 31 30 29 29 29 30 31 32 33 34 33 32 32 33 33 34 34 35 35 34 33 33 34 34 34 33 31 30 31 32 33 33 34 36 36 34 33 32 30 30 31 32 33 33 34 35 35 36 36 35 36 37 37 37 37 37 35 34 36 36 37 38 37 37 37 37 37 37 36 35 32 30 30 31 31 31 32 33 34 35 33 32 32 33 34 35 36 35 35 35 36 37 37 37 37 36 36 38 38 38 38 38 38 38 39 39 39 40 39 38 37 37 38 38 38 38 39 39 39 39 39 40 40 40 40 40 39 39 39 38 38 37 37 37 37 37 36 36 37 37 36 36 37 37 36 37 38 38 37 37 38 39 39 38 38 37 36 37 37 37 37 37 36 36 37 38 38 38 38 37 37 38 38 38 38 38 38 37 35 35 35 34 34 32 31 31 31 31 32 33 34 35 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 56 56 56 56 56 56 56 56 56 56 55 55 56 55 55 55 54 54 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 45 45 45 46 46 46 47 47 47 46 45 45 45 43 42 42 41 41 42 41 41 41 40 40 39 40 40 40 39 39 38 38 38 38 37 37 37 37 38 40 39 38 38 37 37 36 35 35 36 36 37 38 37 37 36 36 36 35 34 34 34 34 34 34 34 34 34 34 35 35 35 34 35 36 37 37 36 36 36 37 37 38 38 39 40 39 39 38 37 37 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 37 37 37 38 38 38 37 37 37 37 36 37 37 37 36 35 36 37 36 34 33 33 32 31 31 32 32 31 31 31 30 29 29 29 29 29 29 29 29 30 32 34 32 32 33 33 34 34 35 35 34 36 36 34 34 33 32 32 31 31 30 29 29 29 29 30 32 33 32 33 32 32 33 34 34 35 35 35 35 34 33 34 34 34 33 32 30 30 31 33 34 35 35 36 36 35 34 31 30 30 31 32 32 33 33 34 35 36 36 35 35 36 37 37 36 35 34 34 35 36 37 38 37 37 37 37 36 36 36 35 32 30 30 30 31 32 34 35 36 35 33 32 32 33 34 35 34 34 34 35 37 37 38 36 36 37 38 39 39 38 38 38 38 38 39 38 38 39 38 37 38 37 37 38 38 38 39 39 39 39 39 40 40 40 39 39 39 39 38 37 37 37 38 38 38 37 36 36 37 37 36 37 37 36 37 38 38 37 37 37 38 38 38 38 38 37 37 37 37 37 37 36 36 37 37 38 38 38 38 37 37 38 37 37 37 37 37 37 36 35 34 35 34 33 31 31 31 31 31 32 32 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 56 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 55 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 47 47 47 47 46 45 45 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 47 47 46 45 44 43 43 42 42 41 40 40 41 41 42 41 40 40 39 39 39 40 39 38 37 38 38 38 37 36 36 38 39 39 38 38 37 36 35 35 35 35 36 37 37 37 37 36 36 35 34 34 34 34 34 34 34 35 35 35 36 36 36 36 35 35 37 37 37 37 36 36 37 37 38 38 39 39 39 38 37 38 38 38 39 38 38 38 38 38 37 37 37 36 37 37 37 38 38 38 38 38 38 37 38 38 37 37 37 37 37 36 36 37 37 37 36 36 36 36 35 36 37 36 36 36 36 37 36 34 33 33 32 32 33 33 33 33 32 32 31 29 29 29 29 29 29 29 29 29 30 32 32 32 33 33 33 34 34 34 35 36 35 34 34 34 33 32 32 30 29 29 29 29 29 30 31 32 33 32 31 32 33 34 35 36 35 35 34 33 33 34 34 34 32 31 30 30 31 32 33 34 36 36 35 35 32 30 30 30 31 32 32 32 32 33 34 35 35 35 35 36 37 36 35 33 34 35 35 37 37 37 37 36 37 37 36 35 35 35 32 30 30 30 32 34 35 36 36 36 34 32 32 33 34 34 33 35 35 36 37 37 37 36 36 38 39 39 38 37 37 37 38 38 38 38 38 37 38 38 38 38 38 39 39 38 38 38 38 39 39 40 40 40 39 39 39 38 38 38 38 39 38 38 38 37 36 36 37 37 36 37 37 37 37 38 38 37 36 37 38 38 38 38 38 37 36 36 36 36 36 36 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 37 36 34 34 34 34 32 32 32 32 32 31 31 31 65 65 65 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 56 56 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 54 54 54 53 53 53 53 52 52 52 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 45 45 44 44 44 44 44 44 45 45 45 45 46 45 45 46 47 47 46 44 43 42 42 41 41 41 41 40 40 41 41 41 41 40 39 38 38 39 38 38 37 37 38 38 36 36 36 37 38 39 38 37 37 36 35 35 35 35 35 35 36 36 36 36 35 34 34 34 34 34 34 34 35 36 36 36 37 37 37 36 35 35 36 37 37 37 37 36 37 37 38 38 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 37 37 36 36 36 37 37 37 38 38 37 37 37 37 37 37 36 36 36 36 35 35 36 37 37 35 35 35 35 34 35 36 35 35 35 36 37 36 35 35 34 34 34 34 34 34 33 32 32 31 29 29 29 29 29 29 29 29 29 29 31 32 31 32 33 34 34 34 34 36 36 35 34 34 34 33 33 32 30 29 29 29 29 29 30 31 32 32 31 32 33 34 35 36 35 34 35 34 33 32 33 33 32 31 30 30 31 32 33 33 35 35 35 35 33 31 30 30 30 32 33 33 32 31 33 34 35 35 35 35 35 35 35 34 34 35 36 37 37 36 36 36 37 37 37 36 35 35 34 32 30 30 31 33 35 36 36 36 36 35 32 32 33 34 34 34 35 35 36 37 38 38 36 36 37 39 38 37 37 37 38 38 38 38 37 37 37 38 38 38 38 39 40 39 38 38 39 39 39 39 39 39 39 40 40 39 38 38 38 39 39 38 38 38 37 37 36 36 36 36 36 37 38 38 38 38 37 36 36 37 38 38 37 37 37 36 35 35 36 36 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 34 33 33 33 33 34 34 33 31 30 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 56 56 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 55 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 44 44 45 45 45 45 45 46 46 46 45 43 42 42 41 40 40 41 41 40 40 40 41 41 41 40 40 39 38 38 37 37 37 37 37 37 36 36 36 37 38 38 38 37 37 37 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 36 36 36 36 37 37 37 36 35 35 36 37 37 38 37 37 37 37 38 39 40 40 40 40 40 40 39 39 39 39 38 38 37 37 37 37 36 37 36 36 35 35 36 37 37 36 36 37 36 36 36 36 35 34 34 35 35 36 37 37 36 35 34 34 34 33 34 35 35 35 36 37 36 35 35 35 35 35 34 34 33 33 32 31 31 29 29 29 29 29 29 29 29 29 29 30 31 32 33 33 33 35 34 34 35 35 34 34 34 34 33 32 32 30 29 29 29 29 29 30 30 31 31 32 33 34 34 35 35 35 34 35 34 33 32 33 33 31 30 30 30 32 33 33 35 36 35 35 34 33 31 30 30 31 33 34 34 33 32 33 34 36 36 34 34 35 35 33 33 35 36 37 37 36 35 36 37 37 38 38 37 36 35 34 32 30 30 31 33 34 34 35 35 36 34 33 32 33 33 33 33 34 34 35 37 38 38 36 36 37 37 36 36 37 38 38 38 38 37 37 36 37 38 39 39 39 39 40 39 38 38 39 40 39 38 38 39 39 39 40 40 39 39 39 39 39 39 38 38 37 37 37 36 36 36 36 37 37 38 38 38 37 37 36 37 37 37 37 37 37 36 35 36 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 37 37 37 36 35 34 33 32 33 33 33 33 33 31 30 67 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 56 56 56 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 44 45 45 45 45 45 45 46 46 45 44 43 43 42 41 40 40 40 40 39 39 40 41 41 40 40 40 39 39 38 38 38 38 37 37 36 36 36 36 37 38 38 37 37 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 35 35 35 36 37 37 37 37 37 37 37 36 36 36 36 37 37 38 38 38 37 38 39 39 39 40 39 39 39 39 40 40 39 38 38 38 37 37 37 37 36 36 36 35 35 35 35 36 36 35 35 36 35 36 36 36 35 34 33 34 35 36 36 37 36 35 34 34 33 32 33 34 35 36 36 36 36 35 35 34 35 34 34 33 31 32 32 31 31 29 28 28 28 29 29 29 29 29 29 29 31 33 34 33 34 35 34 34 35 35 34 34 34 33 33 32 31 30 29 29 29 29 29 30 30 31 32 33 34 34 35 34 34 34 35 35 34 33 32 33 33 31 30 30 31 31 33 34 35 36 35 34 33 32 31 30 30 31 33 33 34 33 33 34 34 35 35 34 34 35 34 33 33 34 36 37 36 35 36 37 38 37 37 37 37 36 35 33 31 30 30 32 33 34 34 35 36 36 35 34 33 32 33 34 34 34 34 35 36 38 38 36 35 36 36 36 37 38 38 39 38 38 37 36 37 38 38 39 39 39 39 39 38 38 38 39 39 38 38 38 38 39 39 40 40 40 40 39 39 39 39 39 39 38 38 38 37 35 35 36 37 37 38 38 38 37 37 37 37 37 37 37 37 37 35 36 37 37 37 38 39 39 38 38 38 38 38 37 37 38 38 38 37 37 37 37 37 37 36 34 34 33 32 33 33 32 32 33 33 33 67 67 67 66 66 66 66 67 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 56 56 57 57 57 57 57 57 57 57 56 56 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 51 50 50 50 50 50 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 48 48 49 49 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 44 43 43 43 44 45 45 45 45 46 46 46 46 45 44 44 42 42 42 40 40 40 39 38 39 40 40 40 40 40 40 40 40 39 39 39 37 37 36 36 36 36 37 38 37 37 38 37 37 36 35 34 34 35 34 34 34 34 34 34 34 35 36 36 36 36 37 38 38 37 37 37 37 37 37 36 36 36 37 38 38 38 39 39 40 40 39 39 39 38 38 38 39 39 39 39 39 38 37 37 37 37 37 36 36 36 36 36 35 34 35 35 34 34 34 35 36 35 34 34 33 33 34 34 35 35 35 35 34 34 32 31 33 35 36 36 36 35 35 34 34 34 34 34 34 32 31 30 31 31 30 29 28 28 28 29 29 29 29 29 29 30 32 33 34 34 35 34 33 34 35 34 34 34 34 33 33 32 31 30 29 29 29 29 29 30 31 33 33 33 34 34 34 34 33 34 34 34 34 33 32 32 32 30 30 31 32 32 33 35 35 36 34 33 32 31 30 30 30 31 32 32 32 34 34 34 35 35 34 34 35 34 33 33 34 35 36 36 35 36 37 37 38 37 37 37 37 37 36 34 31 30 30 32 33 34 35 36 36 36 35 34 32 33 34 35 35 35 35 36 37 38 37 36 35 36 37 37 38 38 38 38 38 37 36 36 38 39 39 39 39 39 39 39 38 37 38 39 38 37 38 38 39 39 40 40 40 40 40 40 38 38 38 39 39 38 38 38 37 36 35 36 37 38 38 38 38 37 37 36 37 37 37 37 37 35 35 37 37 37 37 38 39 39 38 37 37 38 38 37 37 37 37 38 38 37 37 37 38 37 36 35 35 34 34 35 36 34 33 33 33 33 67 67 67 67 66 66 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 53 52 52 51 51 51 51 51 52 52 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 49 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 44 44 43 43 44 44 45 46 46 46 47 46 45 46 45 44 43 43 43 42 42 41 41 39 38 38 39 39 40 40 40 40 40 40 40 39 38 36 35 35 36 36 37 38 37 37 37 37 37 36 35 34 35 35 34 35 34 34 34 34 35 35 36 36 37 37 37 38 39 39 38 37 37 37 37 37 36 36 36 37 38 38 39 40 40 40 40 39 39 38 38 38 39 38 39 39 39 38 37 37 38 37 38 37 37 37 37 36 36 35 35 35 35 35 34 34 34 33 33 33 32 32 32 32 33 34 34 34 33 32 32 32 32 34 36 37 36 34 34 34 34 34 34 33 33 32 32 30 30 29 28 28 28 28 28 28 29 29 29 29 29 31 32 34 35 35 34 33 33 34 34 33 34 34 34 33 32 32 32 31 29 29 29 29 29 31 32 33 33 33 34 33 33 33 33 34 34 34 33 33 32 32 31 30 30 32 34 35 35 34 35 35 33 32 31 30 30 30 30 31 32 32 33 34 35 34 34 34 34 34 35 33 33 33 35 36 36 35 35 35 36 37 38 38 37 36 36 36 36 34 31 30 30 32 33 34 35 35 36 36 35 33 32 33 34 34 35 36 36 37 37 37 37 35 36 37 38 37 37 37 37 37 37 37 37 37 38 39 39 39 38 38 39 39 38 37 38 38 38 38 39 39 39 40 39 39 40 39 40 40 39 38 38 38 39 38 38 37 37 37 35 35 36 37 37 37 38 37 37 36 35 36 37 37 35 35 36 37 37 38 38 38 38 38 37 37 37 38 38 38 38 37 37 37 37 37 37 38 38 38 37 37 37 36 35 35 37 36 35 35 33 32 67 67 67 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 64 64 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 48 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 44 43 43 43 44 44 45 45 45 46 46 46 45 45 44 43 43 43 43 43 43 42 41 40 39 38 38 39 39 40 40 40 40 40 39 39 38 36 35 35 36 36 36 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 38 39 39 38 38 38 38 38 37 37 37 36 37 37 38 39 40 41 40 40 39 38 38 39 39 38 38 38 38 38 37 37 38 38 38 38 38 37 38 37 37 37 36 36 37 37 36 35 34 34 33 33 33 33 33 33 32 32 33 33 33 33 32 32 31 32 35 36 37 36 34 34 34 33 32 33 34 33 32 32 32 31 29 28 28 28 28 28 28 29 28 28 28 31 33 33 35 35 34 33 32 34 33 33 33 34 35 35 34 33 32 32 31 29 29 29 29 29 31 32 32 33 34 33 32 32 33 34 33 33 33 32 32 32 32 30 30 31 33 34 35 35 34 34 34 32 30 30 30 30 30 31 32 33 34 34 34 34 34 34 34 33 35 35 33 33 34 35 36 36 35 34 35 37 38 38 38 37 36 36 36 36 33 31 30 30 32 33 34 35 35 36 36 34 33 32 32 34 35 35 35 36 37 37 37 36 35 37 38 37 36 36 37 37 36 36 37 37 38 38 38 38 37 37 38 39 38 37 37 37 38 39 40 40 40 40 40 39 39 39 39 39 40 39 38 38 38 38 37 37 37 37 37 36 35 35 36 37 37 37 38 37 35 35 35 35 35 35 36 37 38 38 39 38 38 37 37 37 38 38 39 39 39 39 39 39 38 38 37 38 39 39 38 38 37 37 36 35 36 37 36 36 37 35 33 67 67 67 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 64 64 64 64 64 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 51 51 50 50 50 50 50 50 49 49 49 50 50 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 46 45 45 45 45 45 45 44 44 43 43 43 44 45 45 45 45 45 46 46 45 44 44 43 42 42 42 43 42 41 41 40 40 39 38 38 38 39 39 39 40 40 39 38 37 36 35 35 35 35 36 37 37 37 36 36 36 35 35 35 35 35 35 36 36 36 36 36 36 35 36 36 37 38 38 39 40 40 39 39 39 39 39 37 37 38 38 38 38 38 39 40 41 40 39 39 39 39 39 38 38 39 39 38 37 37 38 39 39 39 39 38 38 38 38 38 37 37 37 38 37 37 36 35 35 34 34 35 35 35 35 33 32 32 31 31 32 32 32 31 33 36 37 36 35 34 34 34 32 32 32 33 32 31 31 32 30 29 28 28 28 28 28 28 28 28 28 28 32 34 33 34 34 33 32 32 33 33 34 35 36 35 34 34 34 33 31 30 29 29 29 29 29 30 31 33 34 34 33 32 33 34 34 33 32 31 31 32 32 31 30 30 32 33 34 35 34 33 34 34 31 30 30 30 30 31 32 33 34 34 34 34 34 34 34 34 35 35 34 33 34 36 36 36 35 34 35 36 37 38 38 38 37 36 36 37 35 33 30 30 30 31 32 33 36 36 36 36 34 32 32 33 34 35 35 35 36 37 36 36 36 37 38 38 36 35 36 36 36 36 37 37 37 37 37 36 37 36 36 37 37 38 38 38 38 39 40 40 40 40 39 39 38 39 39 38 39 39 39 38 38 38 38 37 37 37 36 36 36 35 35 35 36 37 37 38 37 35 35 35 34 34 35 36 37 38 38 38 36 36 37 38 38 38 39 40 40 40 40 39 39 39 38 37 37 38 39 38 38 37 37 37 37 37 36 35 35 35 36 35 67 67 67 67 67 67 66 66 66 66 66 65 65 66 66 66 65 65 65 64 64 64 64 64 64 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 57 57 57 57 57 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 55 55 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 51 51 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 48 48 48 48 48 48 48 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 44 44 44 44 44 45 45 46 45 44 43 42 42 41 41 42 41 41 41 40 40 40 39 38 37 38 38 38 39 39 39 39 38 38 36 35 35 35 35 36 36 36 35 35 35 35 35 35 35 36 36 37 37 37 37 37 36 36 35 36 37 38 38 39 40 40 40 40 40 40 39 37 38 39 39 39 38 38 39 39 40 40 39 40 40 40 39 38 39 40 40 39 38 38 39 40 39 39 39 39 38 39 38 38 37 37 37 38 37 37 37 37 37 35 35 36 36 36 35 34 32 31 31 31 31 31 31 31 32 34 35 35 34 33 33 33 32 31 31 32 31 31 30 29 28 28 28 28 28 28 28 28 28 28 28 28 30 32 32 33 32 31 31 32 33 34 34 36 36 35 34 33 33 33 31 30 29 29 29 29 29 30 31 33 34 34 33 32 33 33 33 33 31 31 32 32 30 29 30 31 32 33 33 34 33 33 34 32 30 30 30 30 30 31 33 33 33 33 34 34 35 35 34 34 36 35 33 33 35 36 37 35 34 35 36 36 37 38 38 37 37 35 36 36 36 33 31 30 30 31 32 33 35 36 36 36 35 33 32 33 34 34 35 36 36 37 36 35 36 37 38 38 36 35 35 35 36 37 37 37 36 36 36 36 37 37 37 38 38 39 39 39 40 39 39 39 40 39 38 37 38 39 39 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 36 36 37 37 37 36 35 35 34 34 35 35 35 36 36 36 36 36 37 38 38 38 39 39 40 40 40 39 39 38 38 37 36 37 38 39 39 38 38 38 38 37 37 35 35 35 35 35 35 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 57 57 57 57 57 57 57 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 48 48 47 46 47 48 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 46 47 47 47 47 47 46 46 46 46 46 46 45 45 46 45 44 45 44 44 44 43 43 43 43 43 44 44 44 44 45 46 46 44 43 42 42 41 41 42 42 41 40 40 40 39 38 38 37 37 37 37 38 38 38 38 39 38 37 36 35 35 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 38 37 37 37 37 36 36 37 37 38 39 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 39 39 39 40 39 38 38 38 39 40 40 39 39 39 38 39 39 38 38 38 38 38 38 37 38 37 37 36 36 36 36 36 36 35 33 33 34 33 31 30 30 30 30 32 33 33 32 31 32 32 31 31 31 31 32 32 31 29 30 29 28 28 28 28 28 28 28 28 28 28 29 30 30 30 30 30 32 34 35 35 35 36 36 34 34 33 31 31 31 29 29 29 29 29 30 31 32 33 33 32 31 31 32 32 32 32 30 31 30 30 30 30 31 32 33 33 33 33 32 32 32 31 30 30 30 30 31 32 32 32 32 32 33 35 36 35 33 34 36 35 33 33 34 36 36 34 34 35 36 36 36 38 38 37 36 35 35 36 35 34 31 30 30 31 32 34 35 36 37 36 34 33 32 33 33 34 35 36 36 36 35 34 36 37 37 36 35 35 36 37 37 37 36 36 36 36 37 37 37 38 38 39 39 39 39 39 40 40 39 39 39 38 37 37 38 39 39 37 37 37 38 38 38 38 37 37 37 37 37 37 35 35 35 35 35 36 37 37 36 35 35 34 34 34 35 35 35 35 35 37 38 38 37 37 38 40 40 40 39 39 39 39 39 37 37 37 37 38 38 38 38 38 38 38 36 36 36 36 36 35 34 35 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 48 47 47 46 46 47 47 47 47 46 46 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 45 45 44 44 43 43 43 43 44 44 44 44 45 46 46 45 44 43 42 40 40 41 41 41 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 36 37 37 37 37 37 37 37 38 38 38 37 36 36 36 37 38 38 38 39 39 40 41 40 40 40 39 39 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 39 38 38 39 40 40 40 39 39 38 38 38 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 35 35 34 32 31 31 31 31 31 32 32 31 31 31 30 30 30 30 30 30 32 32 31 32 31 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 31 35 36 36 37 37 36 34 33 33 32 32 31 30 29 29 29 29 29 30 31 31 32 31 31 31 31 31 31 32 31 30 30 29 30 31 32 32 33 33 33 33 32 31 30 30 29 30 30 30 30 30 31 31 32 32 32 33 35 37 35 33 34 36 35 33 33 35 36 35 33 34 35 35 35 36 37 38 37 36 35 35 36 35 33 31 30 30 30 32 34 35 36 35 34 33 32 32 33 34 34 35 36 36 36 35 34 36 37 36 35 36 36 36 36 36 36 35 36 37 37 37 36 36 37 37 38 38 38 39 39 39 40 39 38 38 37 37 38 38 38 38 37 37 38 38 39 38 37 37 37 37 37 37 37 36 35 35 35 35 36 37 37 37 36 35 34 33 34 34 35 36 37 37 37 38 38 37 37 39 40 39 39 39 39 39 39 39 38 37 37 37 38 39 38 38 38 38 37 37 36 36 36 36 34 34 35 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 54 54 54 53 53 53 53 53 54 53 53 53 53 53 52 52 52 52 53 52 52 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 47 47 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 46 45 44 44 43 43 43 43 43 44 44 44 45 46 46 45 44 43 42 41 40 40 40 40 40 39 39 39 38 37 38 38 38 38 37 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 36 37 37 37 38 37 37 37 37 37 38 38 37 37 36 36 37 37 37 38 38 39 40 41 40 40 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 39 39 38 37 39 39 38 38 38 37 37 37 38 37 37 37 37 37 36 36 37 37 36 35 35 35 34 33 33 33 33 32 32 32 32 31 30 30 29 29 29 29 29 30 31 31 31 30 29 28 28 28 28 28 28 28 28 28 28 28 29 30 31 33 34 34 36 37 37 36 35 34 34 33 33 32 30 29 29 29 29 29 29 29 30 30 30 31 32 31 30 31 31 30 29 29 30 32 32 32 32 32 31 32 32 31 30 29 29 29 30 30 30 30 31 31 32 32 32 33 34 36 36 35 33 34 36 35 33 33 35 35 33 33 35 35 34 35 37 38 37 36 36 36 34 35 35 33 31 30 30 30 32 34 36 36 34 33 32 32 33 34 35 35 34 35 35 35 34 35 37 36 35 35 37 36 35 35 35 35 35 36 36 37 37 37 37 37 37 38 38 38 39 39 40 39 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 35 35 35 35 35 35 36 36 36 35 34 34 33 34 35 36 37 37 37 37 37 37 37 38 39 40 39 38 38 38 39 38 38 38 37 36 36 37 38 39 38 38 37 37 38 38 37 36 35 35 34 33 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 58 58 57 57 57 58 57 57 57 57 57 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 54 54 54 54 53 53 53 53 54 54 53 53 53 53 53 52 52 52 52 52 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 46 46 46 46 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 45 45 45 44 44 43 43 43 43 43 43 44 44 44 46 45 44 43 43 42 42 41 40 40 40 40 39 38 38 38 38 39 40 39 39 38 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 36 37 37 38 38 38 38 38 37 38 39 38 38 37 37 36 36 37 37 38 39 39 40 40 40 40 39 39 39 39 39 39 38 38 38 38 39 39 39 39 40 40 40 40 40 39 39 39 39 40 40 40 39 39 39 38 37 38 39 39 38 38 37 37 37 37 37 37 36 36 37 36 35 35 36 35 35 35 35 34 34 34 35 34 32 32 32 31 31 31 31 29 29 29 29 29 29 29 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 29 31 33 34 33 33 35 37 37 37 37 36 35 34 33 32 30 29 29 29 29 29 29 29 29 29 30 30 30 30 29 30 30 30 29 29 31 33 33 33 32 31 30 30 30 30 29 29 29 29 30 30 31 31 32 32 32 33 34 34 35 36 35 34 34 35 35 34 32 33 35 35 33 34 35 34 35 36 37 37 37 35 35 35 34 34 35 33 31 30 30 30 33 35 36 36 34 32 32 32 34 35 36 35 35 36 35 34 35 37 37 35 34 34 35 35 35 35 36 36 36 36 36 36 37 38 37 37 37 38 38 38 38 39 40 39 38 37 36 37 37 38 38 39 39 38 37 37 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 36 36 34 34 33 34 35 36 37 37 37 36 37 37 37 37 38 38 39 39 38 37 37 38 37 37 38 37 36 37 37 38 39 38 37 37 37 38 37 37 36 35 35 34 33 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 48 48 48 47 47 47 47 47 47 46 45 45 45 45 45 45 45 46 46 46 47 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 44 44 44 45 45 44 42 42 42 42 41 40 40 40 40 39 39 39 39 39 40 40 40 40 40 39 38 38 37 37 37 36 36 36 36 36 35 35 35 35 36 37 37 37 37 37 38 38 38 38 39 39 39 38 38 37 37 36 37 38 39 40 39 39 40 41 40 39 38 38 38 39 39 38 37 37 37 38 39 39 38 39 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 37 38 38 38 38 38 38 38 37 36 36 36 35 35 35 35 35 34 34 34 34 33 33 34 34 34 35 34 32 33 33 31 31 32 31 30 29 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 31 33 34 33 34 36 37 37 37 36 35 34 33 32 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 32 33 33 32 31 30 29 29 29 29 29 29 30 30 31 32 32 32 32 32 33 34 35 35 35 34 33 35 36 35 33 32 34 35 35 33 33 34 34 35 37 36 36 36 35 34 34 33 33 34 32 30 30 30 31 33 36 36 35 34 32 32 32 34 35 36 36 36 36 35 34 36 37 36 34 34 35 35 35 36 36 37 37 36 37 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 37 36 37 37 37 37 38 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 36 34 34 35 35 35 35 35 34 33 34 35 36 36 37 37 37 36 36 37 36 36 37 38 39 39 37 37 37 38 37 37 37 36 36 37 38 38 38 38 37 37 37 37 37 36 36 36 35 34 34 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 45 45 45 45 45 45 44 44 45 45 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 43 43 43 43 44 44 44 44 44 43 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 39 38 38 38 38 37 37 37 36 36 35 35 35 36 37 38 37 37 37 37 37 38 38 39 39 39 39 38 38 38 38 37 37 37 38 39 39 39 40 41 40 40 40 39 38 38 39 38 37 37 36 38 38 38 38 39 40 40 39 39 40 40 40 40 40 39 38 39 38 38 38 37 37 38 38 38 37 37 37 37 36 36 36 35 35 36 36 36 35 34 34 34 33 33 32 32 33 34 32 32 34 33 31 32 33 32 31 30 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 30 32 33 33 34 34 35 37 36 36 35 35 34 32 31 31 30 29 28 28 29 29 29 29 29 30 30 30 30 30 29 29 30 30 31 32 33 33 33 32 31 30 29 29 29 29 29 29 30 31 31 32 32 32 32 33 33 34 34 34 34 33 33 34 36 35 34 33 33 34 35 34 33 33 34 35 36 36 35 36 36 35 35 34 33 33 32 31 30 30 30 31 33 35 35 33 32 32 32 33 33 34 35 36 36 36 34 34 35 36 36 34 34 36 36 36 37 37 37 37 37 37 37 37 37 36 37 38 37 37 38 38 38 37 38 39 39 37 36 37 37 37 38 38 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 34 34 35 36 35 34 34 33 33 34 36 36 36 35 36 37 36 36 36 36 36 37 38 39 39 37 37 38 38 37 37 37 36 36 37 38 38 38 37 37 37 37 37 37 36 34 35 35 34 33 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 58 58 58 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 45 45 45 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 43 43 43 43 44 44 44 44 43 42 41 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 36 36 36 35 35 37 38 38 38 38 38 38 38 38 38 38 39 40 39 39 39 39 39 38 37 37 38 38 38 39 40 40 40 40 40 40 39 38 38 38 38 37 36 37 37 37 37 38 39 39 38 38 39 39 39 39 39 39 38 38 38 38 37 37 36 37 37 38 37 37 37 37 37 37 36 36 36 37 37 37 36 35 35 35 35 34 33 32 32 32 32 32 33 33 31 32 33 33 31 30 30 30 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 31 31 31 33 34 34 36 36 35 34 35 35 33 32 31 30 28 28 28 29 29 29 30 31 31 32 31 31 30 30 31 31 31 31 32 32 33 33 31 29 29 29 29 29 29 29 30 31 32 32 33 33 32 33 34 34 34 34 34 33 33 34 36 36 35 33 33 34 34 33 33 33 34 35 35 35 35 35 36 36 36 36 35 35 33 32 31 30 30 30 31 33 35 34 32 32 32 33 34 35 35 36 36 36 35 34 35 36 36 35 34 33 34 35 36 37 37 38 37 37 36 36 36 36 36 37 37 37 38 37 37 38 38 37 38 38 36 36 37 37 37 38 39 39 38 38 38 38 38 38 39 38 38 37 37 37 37 37 36 34 34 35 36 35 34 34 33 33 35 35 36 36 35 36 37 36 35 36 36 37 38 38 38 38 37 37 38 37 37 37 37 36 36 37 38 38 38 37 36 36 37 37 37 36 35 34 34 34 33 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 49 49 49 48 48 48 48 48 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 45 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 44 44 44 44 43 42 42 42 42 42 42 41 41 41 40 39 40 39 39 39 39 38 38 37 37 37 37 37 37 36 36 36 36 36 37 36 35 36 37 37 37 37 38 39 39 38 38 38 39 40 40 40 40 40 39 39 38 38 38 39 39 40 40 40 40 40 40 39 39 38 37 37 37 36 36 36 36 36 37 38 38 38 37 37 38 38 37 37 38 38 38 38 38 38 37 37 37 36 36 37 37 37 37 37 37 37 36 36 37 37 37 37 36 35 34 34 35 34 34 33 32 32 32 33 34 33 32 32 33 33 31 30 30 31 31 30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 30 31 32 34 35 35 35 34 34 35 35 33 33 32 30 28 28 28 28 29 29 30 31 32 33 32 32 31 32 33 32 32 32 32 31 31 31 30 29 29 29 29 29 29 30 30 31 32 32 33 33 33 33 34 34 33 33 33 32 33 36 36 35 35 33 33 34 33 32 33 34 35 36 35 34 34 34 35 36 36 35 35 35 34 33 31 30 30 30 31 34 35 34 32 31 32 34 35 36 37 37 36 35 34 34 35 36 36 34 34 34 34 35 36 37 37 38 37 36 35 35 35 36 37 37 37 37 38 37 37 37 38 37 37 37 36 36 37 38 38 39 39 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 35 34 34 35 36 35 34 33 33 33 35 35 36 35 36 37 37 36 35 36 37 37 38 37 38 38 38 37 37 38 36 37 37 36 36 38 37 37 37 37 36 36 37 37 37 36 35 34 33 33 34 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 45 46 46 45 45 45 44 44 44 44 45 44 44 44 44 45 45 46 46 47 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 42 43 43 44 44 44 44 43 43 43 43 43 43 42 41 40 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 35 37 37 37 37 37 37 38 39 39 39 39 40 40 40 40 40 40 40 40 39 38 39 40 40 41 41 40 40 40 39 39 38 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 37 37 36 36 37 37 37 37 37 36 37 37 37 37 37 36 36 35 34 35 34 34 34 33 32 32 33 34 34 32 32 33 33 31 31 31 31 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 33 32 31 33 34 34 34 33 33 35 34 33 33 32 30 28 28 28 28 29 29 29 30 31 32 32 32 32 32 32 31 31 31 31 30 29 29 29 29 29 29 29 29 30 30 31 31 31 32 33 32 33 34 34 33 33 32 32 33 34 36 35 34 33 33 34 34 33 33 34 35 35 35 34 33 34 35 36 36 35 34 34 33 33 33 31 30 30 30 32 34 34 33 32 31 33 35 35 36 37 38 37 35 33 34 35 36 36 34 33 34 35 35 37 36 36 37 36 35 35 35 35 36 37 37 38 37 37 37 36 37 37 37 36 36 37 37 37 38 39 39 39 38 38 38 38 38 38 39 38 38 38 37 37 36 36 36 35 34 34 35 35 34 34 33 33 33 34 35 35 35 36 36 36 35 35 36 36 37 37 37 37 37 37 37 37 37 36 36 37 35 36 37 37 37 36 36 36 37 37 37 36 35 34 34 33 33 33 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 54 55 55 55 55 54 53 53 53 53 53 53 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 47 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 47 46 46 45 45 46 46 46 46 45 45 44 44 44 43 43 43 43 43 44 44 45 45 46 46 46 46 46 46 46 45 45 45 44 44 44 44 44 43 42 42 42 43 44 45 45 44 44 44 44 43 42 42 42 41 41 41 41 41 40 40 40 39 38 38 39 39 39 39 38 38 39 38 38 38 37 36 35 36 37 38 38 38 38 38 38 38 39 40 40 40 40 41 41 40 40 40 40 39 39 40 40 41 41 41 40 40 40 40 39 38 38 38 38 39 39 38 37 37 36 35 36 37 37 37 38 38 38 38 37 36 36 37 37 38 38 38 38 38 38 37 37 36 36 36 36 36 36 36 36 37 37 37 37 37 37 36 35 35 35 35 34 33 34 33 33 34 34 33 32 33 33 32 32 32 30 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 32 33 32 32 33 33 33 33 34 35 34 32 32 32 30 28 28 28 28 29 29 29 30 30 30 31 32 32 30 29 29 30 30 29 29 29 29 29 29 29 29 29 30 31 31 32 33 33 32 32 32 34 34 33 32 32 33 34 34 36 36 35 35 33 33 34 33 33 34 35 35 34 33 33 33 34 36 37 36 35 34 34 33 33 32 30 30 30 31 33 33 32 31 31 33 35 35 36 37 37 37 36 34 34 34 35 35 35 34 33 34 35 36 37 36 35 35 35 34 35 36 37 37 37 37 37 37 37 36 36 37 37 36 36 37 38 38 39 39 39 39 38 37 38 38 38 38 39 39 38 37 37 37 37 36 36 36 34 34 35 36 36 35 35 33 32 33 34 34 34 34 34 34 35 35 36 37 37 37 37 37 37 37 37 37 38 37 36 36 36 35 36 37 37 37 36 36 37 37 38 37 36 35 34 34 33 32 32 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 54 54 55 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 50 50 49 49 48 48 48 48 47 47 47 47 47 48 48 47 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 47 47 46 46 46 46 45 44 44 44 43 43 43 43 43 43 44 44 45 45 46 46 46 46 46 46 45 45 44 44 44 44 44 44 42 42 42 43 43 44 44 45 45 45 44 43 42 42 41 41 42 41 41 41 40 40 40 39 38 39 40 40 40 40 39 39 39 38 38 38 37 37 36 36 37 38 38 38 38 39 39 39 39 40 40 41 41 42 42 41 41 41 40 39 39 40 40 41 41 40 40 39 39 39 38 38 39 39 39 39 39 38 37 37 36 35 35 36 36 37 38 38 38 38 37 36 36 36 37 37 37 38 37 37 38 38 37 37 36 36 35 35 35 35 35 36 36 36 37 37 37 36 36 35 35 35 34 34 34 34 34 34 34 33 32 33 33 33 33 31 30 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 30 31 31 32 32 32 32 34 35 35 34 32 31 31 30 28 28 28 28 29 29 29 30 30 31 30 30 30 29 28 28 29 29 29 29 29 29 29 29 29 30 30 31 32 32 33 34 34 33 33 33 34 34 33 32 33 34 35 36 37 36 35 35 33 33 33 32 33 35 35 34 34 33 33 34 35 36 37 36 35 35 35 34 33 31 30 30 31 33 33 32 31 31 32 34 35 35 36 37 37 37 36 35 33 34 34 34 33 33 34 34 35 36 37 36 35 34 34 35 36 37 37 37 37 37 37 37 37 36 35 36 36 35 36 37 38 38 39 39 38 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 36 34 34 35 36 36 35 35 34 33 33 34 34 34 34 34 35 35 36 36 37 36 36 36 36 36 37 38 38 38 37 36 36 35 35 36 36 35 36 36 37 38 38 37 37 37 36 34 34 33 32 32 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 53 54 54 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 52 51 51 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 47 47 47 47 47 47 47 46 45 45 45 45 44 44 44 44 44 43 43 43 43 44 45 45 45 45 46 45 45 45 45 44 44 45 44 44 43 42 42 42 42 43 44 45 45 46 45 44 43 43 42 42 41 41 40 40 39 39 38 38 38 40 41 41 40 40 39 38 38 38 38 38 37 37 36 36 37 37 37 38 39 39 40 40 40 39 40 41 42 43 42 41 41 41 40 40 40 40 41 41 41 40 40 40 40 39 39 39 39 40 39 39 39 38 37 37 37 35 34 34 35 36 37 38 38 37 37 37 35 35 35 36 37 37 37 37 37 37 37 37 37 37 36 36 35 34 35 35 35 36 36 36 37 37 36 36 36 36 35 34 35 34 34 34 34 34 33 34 34 34 33 32 31 30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 31 30 31 33 34 35 34 34 33 31 30 30 28 28 28 28 29 29 30 31 31 31 30 28 28 28 28 28 29 29 29 29 29 29 29 30 30 31 31 32 33 33 33 34 34 34 34 35 35 34 33 32 33 35 35 35 36 36 35 34 34 34 33 32 33 34 33 33 33 33 34 35 36 36 36 35 34 34 35 34 32 30 30 30 32 34 33 31 30 31 32 33 34 34 35 37 37 37 36 35 34 33 34 33 32 33 35 35 36 36 37 36 35 34 35 36 37 37 37 37 37 37 36 36 36 36 35 35 36 36 36 37 38 38 38 38 37 37 37 38 38 38 37 37 38 37 37 37 37 37 37 37 37 36 34 34 35 36 35 34 34 34 34 33 33 33 33 34 36 36 36 36 35 35 35 35 36 35 36 37 38 37 37 37 35 35 35 36 36 35 34 36 37 37 37 37 37 37 37 35 34 34 34 34 33 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 56 56 56 56 56 55 55 55 55 55 55 54 53 53 53 53 53 53 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 44 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 42 43 44 45 45 46 45 45 44 44 43 42 41 40 40 39 39 39 39 39 39 40 41 40 40 39 38 38 38 38 38 38 38 37 37 36 36 36 37 38 39 39 40 40 40 40 40 42 43 43 42 42 42 41 40 40 40 41 41 41 41 40 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 36 34 34 35 35 36 36 36 37 36 36 35 34 34 35 36 36 37 37 37 37 37 38 37 36 36 36 35 34 34 34 35 35 35 36 36 36 36 37 37 37 36 35 35 35 35 35 35 34 34 34 35 34 34 33 32 30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 31 33 34 34 33 33 33 31 30 29 28 28 28 28 28 29 31 31 31 30 29 28 28 28 29 29 29 29 29 29 29 30 31 30 30 30 31 32 33 33 33 33 33 34 35 36 35 34 33 33 34 34 35 35 36 35 34 33 33 34 33 32 32 32 33 33 33 33 34 35 36 36 36 35 34 34 33 32 31 30 29 29 31 33 32 30 30 32 33 33 34 34 35 36 37 37 35 35 34 33 33 32 33 35 35 36 37 37 37 36 35 34 34 36 37 37 37 37 37 36 35 35 36 35 35 35 36 37 37 37 38 37 37 37 37 37 37 38 38 38 37 37 37 37 37 38 38 38 37 37 37 36 35 34 34 35 35 34 34 34 34 33 32 32 33 34 36 36 36 35 34 35 35 35 35 35 36 37 37 37 36 36 35 34 35 36 36 34 35 36 36 35 36 36 36 37 37 36 35 35 34 34 33 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 60 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 54 53 53 53 53 52 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 51 51 51 51 51 51 50 50 50 50 50 49 49 48 48 48 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 46 47 47 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 43 43 43 43 44 44 44 44 44 44 45 45 45 45 44 44 43 43 42 42 43 44 44 45 45 45 45 44 44 43 42 41 40 40 40 40 40 40 39 39 40 41 40 40 40 39 39 39 39 39 38 38 38 37 36 36 36 37 38 39 39 39 40 41 41 41 41 43 43 43 43 42 41 41 40 41 41 41 41 41 40 40 39 39 40 40 39 39 38 38 38 37 37 37 37 37 36 35 34 34 34 35 35 35 35 36 35 35 35 34 35 35 36 37 37 38 38 38 38 37 37 36 36 36 36 35 34 34 34 34 35 36 36 36 37 37 37 36 35 35 36 36 36 35 34 34 34 34 34 34 33 33 31 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 31 34 35 34 32 32 32 32 32 31 30 28 28 28 29 30 30 29 29 29 28 28 29 29 29 29 29 29 29 29 31 32 32 31 31 31 31 32 32 32 33 33 34 34 35 35 35 34 32 33 34 34 34 35 35 35 34 33 32 32 32 32 32 32 34 34 34 34 34 35 36 36 37 36 34 34 33 32 31 30 29 30 31 32 31 30 31 33 34 34 34 34 35 35 36 36 35 35 34 33 32 33 35 36 36 37 36 36 37 36 35 34 35 36 36 37 37 37 36 35 35 36 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 38 38 38 37 37 36 35 34 34 35 35 34 34 34 34 33 32 33 34 34 35 35 34 34 35 36 35 36 37 36 36 36 36 36 35 35 34 33 35 36 35 34 35 36 35 35 36 36 36 36 37 36 36 35 34 34 33 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 52 51 50 50 50 49 49 49 50 50 50 50 50 51 51 50 50 49 49 50 49 49 49 48 48 48 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 48 47 47 47 47 47 46 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 43 43 42 42 42 43 44 45 45 45 44 43 43 42 41 41 42 42 41 40 40 41 40 39 40 41 41 41 40 39 39 40 40 39 38 38 38 37 37 36 36 37 37 38 39 39 40 40 40 41 41 42 43 44 44 43 42 42 41 41 41 41 41 41 40 40 39 38 39 39 38 38 38 38 37 37 36 36 36 36 36 35 35 34 34 33 34 34 34 35 36 36 35 34 34 34 35 36 37 37 37 37 37 37 37 37 36 37 36 35 34 34 34 33 34 35 35 35 36 36 36 36 35 35 35 36 36 35 34 35 35 34 33 33 32 31 31 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 32 33 34 33 31 31 31 31 32 31 29 28 28 29 31 30 28 28 28 29 29 29 29 29 29 30 30 31 31 31 32 32 33 32 32 33 33 32 32 33 34 35 35 34 34 35 33 32 32 33 34 34 35 35 34 33 32 32 33 33 33 33 34 34 35 35 35 35 35 35 36 37 36 35 35 34 32 30 30 30 31 32 32 30 30 31 32 33 34 34 34 35 35 35 35 36 35 34 33 32 33 35 36 37 36 36 36 37 36 35 34 35 36 36 37 38 37 36 35 35 35 35 34 36 37 37 38 37 37 37 36 37 38 38 38 37 37 37 36 36 36 36 37 37 37 38 37 37 37 36 36 36 34 34 34 34 34 33 33 33 32 32 33 34 34 34 34 33 34 35 35 35 36 37 37 37 36 36 35 34 34 33 34 35 35 34 34 35 35 34 34 36 35 35 36 37 36 35 35 34 34 33 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 53 53 53 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 52 52 51 51 52 52 52 52 52 52 52 52 51 51 51 51 50 49 49 49 49 49 50 50 50 51 50 50 49 49 49 49 48 48 48 48 48 49 49 50 50 50 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 44 44 44 44 44 45 44 44 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 41 41 42 43 44 45 45 44 44 43 42 42 42 43 43 42 40 41 41 41 41 41 42 41 40 40 40 40 40 40 40 39 39 38 38 37 37 36 36 37 38 39 39 40 41 41 41 42 42 43 43 44 43 43 43 42 40 40 40 41 40 40 40 40 38 38 39 38 38 38 37 37 36 35 35 35 35 35 34 34 34 34 33 33 33 34 34 35 36 36 34 33 34 35 35 36 36 37 36 37 37 36 35 35 36 36 36 35 35 35 34 33 33 34 34 35 35 35 35 35 34 34 35 35 35 35 36 36 34 34 33 32 32 31 30 30 29 28 28 28 28 28 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 29 30 32 34 34 33 32 31 30 30 29 28 28 28 28 30 29 28 29 29 29 29 29 30 30 30 31 31 33 32 32 32 32 33 32 33 34 34 33 33 34 34 35 34 34 34 34 32 32 33 34 34 35 35 35 33 31 31 33 34 34 33 34 34 35 35 35 35 34 35 36 37 37 37 36 35 34 32 30 30 30 31 33 32 30 30 30 32 32 33 35 35 34 34 35 35 36 35 34 33 33 33 35 36 37 36 35 36 36 35 34 34 35 36 37 37 37 37 36 35 35 34 34 35 37 38 37 37 37 37 37 37 38 38 38 37 37 36 36 35 35 36 37 36 36 37 37 37 37 37 36 36 36 34 34 34 34 34 33 32 32 32 33 33 33 33 34 34 34 35 35 35 35 35 36 37 38 37 37 36 35 34 33 34 35 35 33 34 34 34 34 34 35 35 35 36 36 36 35 34 34 34 34 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 61 61 61 61 61 61 61 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 53 53 53 53 52 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 49 49 49 49 49 49 50 50 50 49 49 48 48 48 48 48 48 48 49 50 50 50 50 50 49 49 48 48 49 49 49 48 48 48 48 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 43 43 43 42 42 42 42 41 41 41 42 43 45 45 45 45 44 43 43 43 42 42 41 40 41 41 41 42 41 42 42 40 40 40 40 40 41 40 40 39 39 38 38 37 37 36 36 37 39 40 40 41 42 42 41 41 42 43 43 43 43 43 42 41 40 40 40 40 40 40 39 38 37 38 38 37 37 36 36 35 35 36 35 35 34 34 34 34 33 33 33 33 33 33 34 36 36 35 33 33 34 34 35 36 36 36 36 36 36 35 35 35 36 36 36 36 36 35 34 33 33 34 34 34 34 34 34 34 35 35 36 36 36 36 36 34 34 34 33 33 32 31 30 30 30 29 28 28 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 29 30 33 35 34 33 32 32 31 29 28 27 27 27 28 28 29 29 29 29 29 30 31 32 31 32 32 32 33 32 32 32 33 33 33 33 34 34 33 33 33 34 35 34 34 33 32 32 33 34 35 35 35 34 34 33 31 32 33 33 33 33 33 33 34 35 35 35 34 34 35 37 38 37 36 34 34 33 31 30 29 30 33 32 30 30 30 32 32 33 35 35 34 34 35 35 35 35 34 33 33 33 34 35 36 35 35 35 35 34 34 34 35 36 37 37 37 36 35 34 34 34 35 36 37 37 37 36 36 37 37 37 38 38 37 37 36 35 35 36 36 36 36 36 36 37 37 37 36 36 35 35 35 34 34 35 35 34 33 32 32 32 33 33 33 33 34 34 35 36 36 35 35 35 35 37 37 37 37 36 34 34 34 34 35 35 34 33 33 34 34 35 35 35 35 36 36 35 34 34 34 35 35 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 54 54 54 54 53 53 53 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 50 50 50 50 50 50 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 43 43 44 44 43 43 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 42 44 45 45 45 44 43 43 43 42 41 40 41 42 42 42 42 42 41 42 41 41 41 41 41 41 40 40 40 39 39 39 38 38 37 36 37 38 39 39 40 41 41 41 41 41 42 43 43 43 43 42 41 40 40 40 40 39 39 38 37 37 37 37 36 36 36 37 36 37 36 35 35 36 35 35 35 35 34 34 34 34 33 33 34 35 34 34 33 33 34 34 35 36 36 35 35 36 35 35 35 36 37 37 37 36 36 35 35 34 33 33 34 34 34 34 33 35 36 36 35 35 36 36 36 35 34 33 33 32 31 31 30 30 29 28 28 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 29 31 33 34 34 34 33 32 31 30 29 28 27 27 28 29 30 29 29 29 30 30 31 32 33 32 32 33 32 33 33 33 33 34 34 34 34 34 34 34 34 33 34 35 34 33 32 32 33 33 34 35 35 35 34 34 33 31 32 32 32 33 34 34 34 34 34 35 35 34 34 35 37 37 37 35 35 34 32 30 29 29 30 32 32 30 30 31 32 33 34 35 35 34 34 34 34 34 34 34 33 32 33 34 35 35 35 35 35 34 34 34 35 36 36 36 37 36 35 34 34 34 35 36 37 37 36 36 37 37 37 37 37 38 38 37 36 35 35 36 36 36 37 37 37 37 36 36 37 37 36 36 35 34 34 34 34 35 34 33 32 32 32 32 33 34 34 35 35 35 36 36 35 34 35 35 37 37 36 36 36 34 33 33 34 35 35 34 33 34 34 35 35 35 35 35 35 35 34 34 34 34 34 34 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 50 50 49 50 51 51 51 50 49 49 49 49 49 48 48 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 48 48 47 47 47 47 47 47 47 47 47 46 46 47 47 46 46 46 46 46 46 45 45 45 45 45 45 44 45 44 44 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 41 41 43 44 45 45 45 44 44 43 42 42 42 42 43 43 43 43 42 42 42 42 42 42 42 41 41 40 40 40 40 40 39 39 39 37 37 37 38 38 39 39 40 41 41 40 40 41 42 43 42 41 41 40 40 40 39 38 38 38 38 37 37 37 37 37 37 38 38 38 37 36 35 36 37 37 37 37 36 35 35 35 35 34 33 32 33 33 33 33 33 33 34 34 35 35 35 34 35 35 34 34 35 36 37 37 37 36 36 36 36 34 33 33 33 33 33 34 35 35 35 35 35 36 36 36 35 34 34 33 33 32 31 30 30 30 29 28 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 29 31 33 34 34 34 33 33 33 32 30 28 27 27 27 28 29 31 31 30 30 31 32 32 32 33 33 33 33 33 34 34 34 34 34 33 34 35 35 35 35 34 34 34 34 34 33 31 32 34 34 35 35 35 34 34 33 32 31 32 33 33 34 34 34 34 34 34 35 35 34 34 35 37 37 36 35 34 33 31 30 29 29 30 32 32 30 30 30 32 34 34 34 35 34 33 33 34 34 34 34 33 32 32 34 35 35 35 34 34 34 33 35 36 35 35 36 36 35 34 34 34 35 36 37 37 37 36 36 37 38 38 38 37 37 38 37 36 35 36 37 37 37 38 38 37 36 36 36 36 37 36 36 35 34 34 34 35 34 34 34 32 31 32 33 34 34 34 34 35 35 36 36 34 34 35 36 37 37 35 35 35 35 33 33 34 35 35 34 33 34 34 35 35 35 35 35 35 35 34 33 34 34 34 34 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 50 50 50 51 51 51 51 50 50 49 49 49 48 48 49 50 50 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 43 44 44 44 44 45 44 43 42 42 43 44 44 44 43 43 43 42 42 42 43 43 42 41 41 40 40 40 41 40 40 40 40 39 38 37 37 38 39 40 41 41 41 41 40 41 41 42 42 41 41 40 40 40 39 38 39 40 39 39 39 38 38 38 38 37 37 37 36 35 36 37 38 38 37 37 36 35 35 34 34 34 33 33 33 32 32 32 32 32 33 33 33 34 34 34 34 34 34 34 35 36 37 37 36 35 35 35 35 35 34 33 32 32 33 34 35 35 34 34 36 36 36 36 35 34 34 33 32 32 31 30 30 30 29 29 28 27 27 27 27 27 27 27 27 27 27 28 28 28 28 30 33 33 33 34 33 32 32 32 31 30 28 27 28 28 28 29 30 31 32 32 32 32 33 33 33 34 34 34 34 35 34 34 33 33 33 33 35 35 35 35 34 34 34 34 34 32 32 33 34 34 35 35 35 34 33 32 31 32 33 34 34 34 34 34 34 34 34 35 35 34 34 35 36 37 36 35 34 33 31 29 29 29 30 32 31 29 30 30 32 34 34 34 34 34 33 33 34 35 35 34 33 32 32 34 35 34 34 34 34 34 33 35 35 35 36 36 35 34 34 34 34 36 37 37 36 36 36 37 37 37 38 38 37 37 37 37 35 35 36 37 37 37 38 37 37 36 35 35 36 36 35 34 34 34 34 35 34 34 33 33 32 31 32 34 34 34 34 34 35 36 36 35 34 34 35 36 37 37 36 35 35 34 33 33 34 35 35 33 33 34 34 35 35 35 35 35 35 35 34 34 34 34 34 33 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 59 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 50 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 42 41 41 43 44 43 43 44 44 44 43 43 43 43 44 44 44 44 44 43 43 42 41 42 43 42 41 41 40 40 40 40 40 39 39 40 40 38 37 37 39 40 40 41 41 41 41 40 40 41 42 43 42 41 40 40 40 39 40 40 40 40 40 40 39 38 38 38 37 36 36 36 36 37 38 38 37 37 36 35 35 34 34 34 34 34 35 34 33 33 32 32 32 32 32 32 32 33 34 34 33 33 35 35 36 37 37 36 35 34 34 34 34 34 34 33 32 32 33 34 34 34 34 35 36 36 36 35 34 33 32 32 32 30 30 30 30 31 32 31 29 27 27 27 27 27 27 27 27 27 27 27 28 28 30 32 32 32 33 33 32 31 30 29 28 27 28 29 29 29 29 29 31 32 33 33 33 33 33 33 33 34 34 34 34 33 33 33 34 34 34 35 36 35 35 34 34 33 34 34 32 31 33 33 34 35 35 35 34 33 32 31 32 34 34 35 35 34 33 33 33 34 35 35 34 34 35 36 37 36 35 35 33 31 30 29 29 31 32 30 29 30 31 33 34 34 33 33 33 33 33 34 34 34 34 33 32 32 34 35 34 33 34 35 34 33 35 35 35 36 36 34 33 34 34 35 36 36 36 36 36 37 37 37 37 38 37 37 37 37 36 35 35 36 36 37 37 37 37 36 36 35 35 35 35 34 34 34 34 34 35 34 34 33 31 31 32 33 34 34 33 34 34 35 36 36 34 34 34 35 35 37 38 36 35 35 34 33 33 34 34 34 33 33 34 35 34 34 35 34 34 34 34 35 34 34 34 33 33 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 45 45 44 44 44 44 44 44 43 43 43 42 41 42 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 43 42 41 41 41 42 42 41 41 40 40 39 39 39 38 38 38 38 38 37 37 39 40 40 41 41 41 41 40 40 41 42 42 42 41 41 41 40 40 40 41 41 41 40 40 40 39 38 38 38 36 36 37 37 38 38 38 37 37 36 35 36 35 35 36 36 36 35 35 35 34 34 34 33 32 32 32 32 32 33 34 33 33 35 35 35 37 37 37 36 36 36 35 35 35 34 33 31 31 32 33 33 33 34 34 35 35 35 34 34 33 33 33 33 31 31 31 31 32 32 32 30 28 27 27 27 27 27 27 27 27 27 27 28 28 28 29 32 33 33 33 31 29 29 28 27 27 28 30 30 30 30 30 31 32 33 34 34 33 33 34 35 35 34 34 33 32 33 33 33 34 34 35 35 35 34 35 34 33 33 33 31 32 33 33 34 34 34 35 35 34 32 31 31 33 34 34 34 33 33 34 34 34 34 34 34 34 35 35 37 36 36 35 34 32 31 29 29 30 30 29 29 30 31 33 34 33 32 32 33 33 34 34 35 35 34 33 32 32 34 35 34 34 35 34 33 33 34 35 35 35 34 33 34 35 36 36 37 36 35 36 37 38 38 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 36 34 34 34 34 34 35 35 34 34 34 34 33 32 31 31 33 34 34 33 33 33 35 36 37 36 34 34 34 35 35 36 37 36 36 35 34 33 32 33 34 33 33 34 34 34 34 34 35 34 34 34 34 34 34 33 33 33 33 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 48 48 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 42 41 41 42 42 42 43 43 44 44 45 45 45 44 43 42 42 42 42 41 41 40 41 42 42 41 40 40 40 39 38 38 38 38 38 38 38 37 37 38 39 40 40 41 41 41 40 40 41 41 41 42 42 41 41 41 40 40 41 42 41 40 40 40 39 39 39 38 37 37 38 38 39 38 37 37 37 37 37 37 36 36 37 37 37 36 36 36 35 35 35 34 33 32 32 31 31 32 33 33 33 34 34 35 36 37 37 37 37 37 36 34 35 34 33 31 31 32 33 33 33 34 34 34 35 35 35 35 35 35 35 34 33 32 32 31 31 31 30 30 29 28 27 27 27 27 27 27 27 27 27 28 28 28 28 30 31 33 34 32 29 28 28 28 29 30 30 31 31 31 32 31 31 33 35 35 34 34 35 35 34 33 32 32 33 33 34 34 34 34 35 35 34 34 35 34 33 33 32 31 34 34 34 34 34 34 35 34 33 31 30 31 33 33 33 33 32 33 34 34 33 33 34 34 34 35 35 36 37 36 35 34 33 31 29 29 29 29 29 30 31 33 34 33 32 32 34 34 34 34 34 35 35 35 33 32 32 33 34 34 34 35 34 33 33 34 34 34 33 33 34 34 35 36 37 37 36 36 37 38 39 39 38 37 37 37 37 35 35 37 37 37 37 37 37 37 36 36 36 35 34 33 34 34 35 36 36 34 34 34 34 33 31 31 32 34 35 34 34 33 34 35 35 35 35 34 34 35 35 36 37 36 35 36 35 35 33 32 33 34 33 33 34 34 34 34 34 35 35 35 34 34 34 34 33 32 33 33 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 48 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 44 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 44 45 45 45 45 44 44 43 43 42 41 41 41 41 40 40 41 42 41 40 40 39 39 38 39 39 39 39 39 38 38 38 38 38 39 40 40 41 41 40 40 40 41 41 41 41 41 42 42 42 41 41 42 42 41 40 40 40 40 39 38 37 38 39 39 40 38 38 37 38 38 38 38 37 37 38 37 37 37 36 36 35 35 34 34 33 33 33 31 31 31 33 33 32 33 34 35 36 36 36 36 36 36 35 34 34 34 33 31 32 33 34 35 35 35 35 35 35 36 36 36 36 36 36 35 34 33 33 32 31 31 30 29 29 28 27 27 27 27 27 27 27 27 27 28 27 27 27 28 29 32 34 32 31 29 28 28 31 32 32 31 32 33 33 32 30 33 34 34 34 34 34 34 32 31 32 33 33 34 34 34 34 35 35 34 34 34 34 34 33 32 31 32 33 34 35 34 34 34 35 34 32 31 30 31 33 34 33 32 32 34 34 33 33 33 34 35 34 34 35 36 36 36 36 34 33 31 29 29 29 29 30 30 32 34 34 33 32 33 34 34 34 34 34 35 35 35 33 32 32 33 34 33 33 34 33 33 34 34 33 33 33 34 35 35 35 36 37 37 36 36 37 38 39 39 38 37 37 37 37 35 36 37 37 37 37 37 37 37 36 35 35 34 33 34 35 36 36 36 35 34 34 34 33 32 30 31 33 34 34 34 34 33 33 35 34 33 34 34 35 36 36 36 36 35 35 35 35 34 33 32 34 34 33 33 34 34 33 34 35 35 35 35 35 34 34 34 33 32 32 33 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 55 55 55 54 54 54 54 54 54 53 53 53 53 52 52 53 53 53 52 52 52 51 51 51 51 51 52 52 52 52 52 52 51 51 51 52 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 43 44 45 45 45 45 45 44 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 39 39 38 39 40 40 40 40 39 39 39 39 38 38 38 39 39 40 41 40 40 40 41 40 40 41 41 42 42 42 42 42 43 42 41 40 40 40 39 38 38 38 39 39 40 40 39 39 39 38 38 37 38 38 38 38 37 37 37 37 36 35 34 34 34 34 34 33 32 31 31 32 32 32 33 35 35 36 36 36 35 35 35 35 34 33 33 33 31 32 34 35 35 35 36 36 36 36 36 37 36 36 35 36 35 34 33 33 32 31 31 30 30 30 29 27 27 27 27 27 27 27 27 27 28 27 27 27 28 29 31 33 32 32 29 27 28 31 32 32 32 33 34 34 32 30 31 32 32 32 33 32 31 31 31 33 33 34 35 35 35 35 35 34 34 35 35 34 33 32 31 30 32 33 33 34 33 33 34 35 34 33 32 30 30 32 33 32 32 33 34 34 33 32 33 34 35 34 34 35 35 35 36 36 35 33 31 29 29 29 29 30 31 32 33 33 32 32 33 33 34 34 34 35 35 35 34 33 32 32 34 34 33 33 34 32 32 34 34 33 32 33 35 36 36 36 37 37 36 36 36 37 38 39 39 39 38 37 37 36 36 37 37 37 37 37 37 37 37 36 35 35 34 34 35 36 37 36 36 35 34 33 33 32 30 30 32 34 35 34 34 34 33 32 34 34 34 35 36 36 36 35 35 35 35 34 34 34 33 32 33 34 34 33 32 33 32 33 34 35 34 34 34 35 35 35 35 34 33 33 34 65 65 65 65 64 64 64 64 64 64 64 64 63 63 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 53 53 53 53 52 52 53 53 52 52 52 51 51 51 52 52 52 52 52 52 52 52 52 52 51 51 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 45 45 45 44 44 44 44 44 44 44 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 40 39 39 39 38 39 39 40 40 40 40 39 39 40 40 39 38 38 38 39 40 40 40 39 39 40 40 40 41 41 41 42 43 43 43 42 42 41 41 40 40 39 39 39 39 39 39 40 40 40 40 40 39 38 37 37 37 37 38 37 37 37 37 36 36 35 35 35 35 34 34 33 32 31 31 31 32 33 34 34 35 35 35 35 35 35 35 35 34 33 32 31 32 33 34 35 36 36 37 37 37 37 36 36 36 35 36 36 35 33 32 32 31 31 32 32 31 30 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 32 31 29 28 27 28 31 31 32 33 33 34 33 32 31 30 31 31 31 31 31 31 31 32 33 32 34 36 36 35 35 34 34 34 35 34 34 33 31 30 31 33 33 34 33 32 33 34 35 34 33 33 31 30 31 31 31 33 34 34 33 32 32 33 34 34 34 34 34 34 35 35 36 34 33 31 29 29 29 29 30 30 31 31 31 32 33 33 34 34 35 35 35 35 35 35 34 32 33 35 34 34 34 33 32 33 34 34 33 34 35 35 36 37 37 37 37 35 35 37 37 38 38 39 39 38 37 37 35 36 37 38 38 37 38 38 37 37 37 36 34 33 34 36 36 36 36 34 33 33 32 31 30 30 31 33 34 34 34 33 33 32 32 34 34 35 36 36 35 34 35 35 35 34 33 33 33 32 33 34 33 32 32 32 33 33 34 35 35 34 34 34 35 34 34 34 34 33 34 34 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 53 53 52 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 43 43 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 41 40 39 39 39 39 39 40 40 41 41 41 40 40 40 40 40 40 39 38 38 38 38 39 39 39 39 39 39 40 40 41 41 43 44 43 43 42 41 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 39 38 37 37 36 36 37 37 36 37 36 36 36 36 36 36 35 34 34 33 32 31 31 31 32 33 34 34 34 34 34 34 35 35 35 34 33 33 32 31 32 33 34 35 36 36 36 37 37 37 36 35 35 35 35 36 35 34 34 33 32 32 33 33 32 33 31 28 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 29 27 27 28 29 31 31 32 34 34 34 33 33 33 32 32 32 33 32 31 32 32 32 32 32 33 35 35 35 35 34 34 34 34 33 33 32 30 30 30 32 34 34 33 32 33 34 35 34 33 32 31 30 30 31 31 33 34 33 33 32 32 33 34 34 33 33 34 34 35 36 36 34 31 30 29 29 29 29 29 29 30 30 31 32 33 33 33 34 34 35 35 35 35 35 34 32 33 35 35 34 34 33 33 35 35 33 33 35 35 35 36 37 37 37 36 35 35 37 37 37 37 38 39 38 37 37 35 35 36 37 37 37 38 38 37 36 36 36 34 33 35 37 36 36 35 33 32 31 30 30 30 31 32 33 33 33 33 33 32 32 33 34 34 35 35 35 34 34 34 34 34 33 32 32 32 32 34 34 32 31 31 33 34 35 35 34 34 34 34 34 35 34 34 34 33 33 34 34 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 54 54 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 45 45 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 42 43 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 39 39 39 41 41 41 41 41 41 40 40 41 41 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 41 42 43 43 43 42 41 41 41 40 40 40 40 40 39 39 39 38 38 38 38 39 40 40 39 37 37 36 35 36 36 35 36 35 35 35 36 36 36 35 35 34 33 33 32 31 31 31 33 34 33 33 33 33 34 34 34 34 34 33 32 31 31 32 34 35 35 35 36 36 36 37 36 36 35 34 34 34 35 36 35 34 34 33 33 33 33 32 32 31 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 27 28 29 31 32 33 33 33 34 34 34 34 34 33 32 33 34 33 32 32 32 31 31 32 33 34 35 35 34 33 33 33 32 32 32 31 30 30 31 32 34 33 32 33 34 34 35 34 32 31 30 29 30 32 33 33 34 33 32 32 32 33 34 34 32 33 34 34 36 36 35 34 32 30 29 29 29 29 29 30 30 30 31 32 32 33 33 34 34 35 35 35 34 34 33 31 32 35 34 33 33 34 35 35 34 32 33 35 35 36 36 36 37 37 36 35 35 36 37 36 37 38 39 39 38 37 36 34 35 37 37 37 37 37 36 35 35 34 33 34 35 36 35 34 34 32 31 30 30 30 31 33 33 32 31 33 33 32 32 31 32 33 34 34 34 34 34 34 34 34 34 32 31 32 33 34 34 33 32 31 31 32 34 35 35 34 34 34 34 34 34 34 34 34 33 32 33 34 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 46 46 45 46 46 47 47 47 47 46 46 46 45 45 45 45 44 45 45 44 45 45 44 44 44 44 44 43 43 43 43 42 42 43 43 44 44 43 43 43 43 43 43 42 41 41 41 41 41 42 43 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 41 41 40 40 41 42 41 41 41 42 42 42 42 41 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 42 42 41 41 40 40 39 39 39 38 38 38 37 37 37 37 38 39 39 39 38 37 37 36 35 34 34 34 35 34 34 35 35 35 35 35 34 34 34 33 32 31 31 32 32 32 33 33 32 33 34 34 34 33 33 33 32 30 31 33 34 34 34 34 35 35 36 35 35 35 34 34 33 34 36 35 34 34 34 34 34 34 33 32 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 31 32 33 32 33 34 34 35 35 35 34 33 33 33 33 32 31 31 31 31 32 33 34 35 35 34 33 34 33 32 31 31 30 29 31 32 33 33 32 32 33 34 35 34 33 32 31 29 29 31 32 32 33 33 33 32 31 32 33 33 32 31 33 34 35 36 35 34 33 32 31 29 29 29 29 30 31 32 32 32 32 32 34 34 34 34 35 35 35 34 34 33 31 32 34 33 32 34 35 35 34 32 32 33 34 35 36 36 36 37 37 36 35 34 35 36 36 37 37 38 39 38 37 36 35 35 36 36 36 37 36 35 34 33 33 34 34 36 36 33 32 32 31 30 30 31 32 32 33 32 31 31 32 32 31 31 31 33 34 34 34 33 33 34 33 33 33 32 31 31 32 34 34 33 32 32 31 32 33 34 35 34 34 33 33 33 33 34 34 34 34 33 32 33 34 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 46 45 45 46 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 42 42 43 44 43 43 43 43 43 42 42 42 42 41 41 41 41 42 43 43 43 43 42 42 41 41 41 41 40 40 40 40 40 41 41 40 41 41 40 40 41 42 42 42 42 42 43 43 43 42 41 40 40 40 41 40 40 40 41 42 41 41 41 41 41 42 42 42 42 42 43 43 42 42 41 40 40 39 39 39 39 39 38 37 37 36 37 38 38 38 38 37 37 36 35 35 34 34 35 34 34 34 34 34 34 34 35 35 35 34 32 31 30 31 31 31 32 32 32 33 33 33 34 33 32 33 31 30 31 33 34 33 33 34 34 35 36 36 35 34 34 34 33 33 35 35 34 33 33 33 33 33 33 33 32 30 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 30 31 31 31 31 32 33 34 34 33 34 33 32 32 32 33 31 30 32 32 33 34 34 34 34 33 33 33 33 31 30 30 29 30 31 32 32 31 31 33 34 34 34 33 32 31 30 29 29 30 31 32 33 33 33 32 31 31 32 32 31 32 33 35 35 35 35 34 33 31 30 29 29 29 30 31 31 32 33 33 32 32 34 34 34 34 35 34 34 34 34 33 31 32 33 33 33 34 35 34 32 32 33 34 35 36 36 36 36 36 37 37 36 34 34 35 36 37 37 37 38 38 38 37 35 34 35 35 36 37 35 34 33 33 34 35 34 35 35 33 31 30 30 30 31 32 33 33 32 32 31 31 31 30 30 30 32 34 34 33 33 32 33 33 33 32 31 30 31 32 33 34 34 33 33 32 31 31 33 34 34 34 34 32 33 32 32 34 34 35 34 33 32 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 46 46 45 46 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 45 45 45 45 44 43 43 43 43 42 42 43 43 43 43 43 43 42 42 43 42 41 41 41 41 42 43 43 43 43 43 42 42 41 42 42 41 41 41 41 41 42 42 41 42 41 41 41 41 41 42 42 43 43 43 43 43 42 41 41 40 40 41 41 41 40 42 43 42 42 42 42 42 42 41 41 42 43 43 43 43 43 42 41 41 40 41 40 40 39 38 37 37 36 36 37 37 37 38 38 37 36 36 36 35 35 36 35 35 34 33 33 33 34 34 35 35 34 33 32 31 31 31 31 31 31 31 32 32 32 33 32 32 31 30 30 31 33 33 33 33 34 34 35 36 36 36 34 34 34 33 32 34 34 34 34 33 32 32 32 32 33 33 31 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 29 30 30 31 31 32 33 33 32 31 32 32 32 33 33 32 31 31 33 33 34 34 35 34 33 32 33 32 31 30 30 29 29 31 32 33 32 31 31 33 34 33 34 34 31 30 29 29 30 30 31 32 33 33 33 32 31 31 31 31 32 33 34 34 34 33 34 34 32 30 30 29 29 29 30 32 32 33 33 34 34 34 34 34 33 34 35 34 34 34 34 33 31 32 33 32 33 33 33 32 32 33 34 35 35 35 35 35 36 36 37 37 36 34 34 35 36 37 37 36 37 37 37 37 35 34 34 35 36 35 34 32 32 33 34 34 33 34 34 32 30 29 30 31 32 33 33 32 31 31 31 31 30 30 31 32 33 33 33 32 32 33 32 31 31 31 30 31 32 33 34 34 34 34 34 33 30 31 32 34 34 34 34 32 32 32 33 34 34 34 34 32 31 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 47 47 46 46 46 47 46 46 46 46 46 46 46 45 46 46 46 46 46 46 45 44 44 44 44 44 44 43 43 42 42 43 43 43 43 43 43 43 43 42 41 41 41 41 42 42 43 44 44 43 43 43 42 42 42 41 41 41 42 43 43 42 42 43 42 41 42 42 42 43 43 43 43 43 43 43 43 42 41 41 41 41 42 42 41 42 42 43 43 43 42 41 41 40 41 42 42 43 42 42 42 43 42 42 41 41 41 40 39 38 37 37 37 36 36 36 37 37 38 37 37 37 37 37 37 37 36 35 35 34 34 33 33 33 33 33 33 32 32 32 31 31 30 30 30 30 30 30 31 31 31 31 31 30 30 32 33 33 32 32 33 33 34 35 36 36 35 34 33 32 32 34 34 34 33 33 32 30 30 31 32 33 32 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 31 30 30 31 31 32 32 33 32 31 31 32 32 32 32 31 31 31 32 33 33 33 34 34 33 32 33 33 32 30 29 29 30 31 31 33 33 32 31 31 32 32 33 33 33 31 29 29 29 30 31 32 33 33 33 33 32 32 31 30 31 33 34 34 34 33 32 33 32 31 30 29 29 29 29 31 32 33 34 34 34 34 34 33 33 34 34 34 34 35 35 34 33 31 32 33 32 32 32 32 32 33 34 34 35 35 35 34 35 35 36 36 36 35 34 34 35 36 36 36 36 36 35 35 35 35 33 32 34 34 33 33 32 33 34 34 33 32 32 32 30 29 29 31 32 33 34 33 32 31 31 31 30 30 31 32 32 32 31 31 32 32 32 31 30 30 30 31 33 33 33 33 33 34 33 32 31 30 31 33 34 34 34 33 32 31 31 33 34 33 33 32 31 31 33 34 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 45 45 44 44 44 43 42 42 43 43 43 43 43 43 43 43 42 41 41 40 41 42 43 43 44 44 44 43 43 43 43 42 42 42 42 43 43 43 42 43 43 42 42 43 43 43 43 43 43 43 42 42 43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 42 41 41 40 41 42 42 42 42 41 41 42 42 42 42 42 41 40 39 38 38 38 38 37 36 36 36 37 37 37 37 37 37 37 37 37 36 35 34 34 34 33 33 32 32 32 32 32 32 31 31 31 31 30 30 30 31 31 30 30 30 30 30 30 30 32 33 33 32 32 32 32 33 35 35 35 35 34 33 32 32 33 34 34 34 33 32 31 30 30 31 31 31 30 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 31 31 30 31 32 32 33 32 31 30 31 32 31 30 30 30 31 33 33 32 33 33 33 33 32 32 33 32 31 30 29 29 31 32 32 33 33 31 30 31 32 32 32 32 31 30 29 29 30 31 32 33 33 33 34 34 32 31 30 30 31 33 33 33 33 32 32 33 31 30 30 29 28 28 29 31 32 33 33 34 35 35 34 33 33 34 34 33 34 35 35 34 33 31 31 33 32 31 32 32 33 34 34 35 35 35 34 34 34 35 35 35 35 34 33 34 35 36 36 35 35 35 34 34 34 33 32 32 32 32 32 32 33 33 33 33 32 31 30 29 29 30 31 32 33 34 34 34 34 33 32 31 30 31 32 31 31 31 31 32 32 31 30 29 30 31 32 32 32 32 32 33 33 33 32 31 30 31 33 34 34 34 34 33 32 31 31 32 33 33 32 30 31 33 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 46 46 45 45 44 43 42 41 42 42 42 42 42 43 43 43 42 41 41 40 40 41 42 43 44 44 44 44 43 43 44 43 43 42 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 43 42 42 42 43 42 42 43 43 43 42 42 42 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 41 40 40 39 39 39 38 38 38 37 36 35 35 36 36 36 36 37 37 37 37 37 36 34 34 33 33 33 34 33 33 33 32 32 32 31 32 32 31 30 31 32 32 31 30 30 30 29 29 29 30 32 33 31 31 31 32 34 34 34 34 34 34 33 33 32 32 33 34 34 32 31 32 31 30 30 30 30 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 32 31 30 31 31 32 32 30 30 32 31 29 30 31 32 32 33 32 32 33 33 32 32 32 32 32 32 31 30 29 30 31 32 32 33 33 31 30 31 32 32 32 32 31 30 29 29 30 31 33 34 34 34 34 34 33 31 30 30 31 32 32 32 32 32 32 32 30 29 29 28 28 29 29 31 32 32 33 33 34 34 33 32 33 34 33 33 34 35 34 34 32 31 31 32 32 31 32 33 34 34 35 35 36 35 34 34 35 35 35 35 35 34 34 34 35 36 36 35 34 34 34 33 32 32 32 32 33 32 32 33 33 32 31 31 30 29 29 29 30 32 32 32 33 34 34 34 34 33 32 31 30 31 31 30 30 31 32 32 31 30 29 30 31 32 32 32 31 32 32 33 32 31 31 30 30 32 34 34 35 34 34 33 33 32 31 32 33 32 31 30 32 33 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 48 48 48 47 46 46 46 47 47 47 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 46 46 46 46 45 45 45 43 42 42 41 41 41 41 42 43 43 43 42 41 41 40 40 41 42 43 44 44 44 44 44 44 45 44 43 43 43 44 44 44 44 44 44 43 43 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 42 42 41 42 42 42 43 43 43 42 42 42 41 41 40 40 40 40 40 41 41 41 41 42 41 41 40 40 40 40 39 38 38 39 38 36 35 35 35 35 35 35 36 37 37 37 36 35 34 34 34 34 35 35 34 34 33 33 33 33 32 32 32 31 31 31 31 31 31 31 30 29 29 29 29 30 31 31 30 31 33 33 33 33 34 34 34 33 32 32 31 32 34 34 32 31 31 31 30 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 30 29 29 30 31 31 30 31 31 29 30 31 33 33 32 32 32 33 33 32 32 32 33 32 31 31 30 29 29 30 31 32 32 32 33 31 30 30 31 32 32 31 30 29 29 30 30 32 33 34 34 34 33 33 32 32 31 30 31 31 31 31 32 31 31 30 29 28 28 28 28 29 30 31 32 32 33 33 33 34 32 32 33 33 33 34 34 34 34 34 33 31 31 31 32 32 32 33 34 34 35 35 35 35 34 33 35 35 35 35 35 34 33 34 35 35 35 35 34 34 34 32 31 32 33 34 33 32 32 32 31 30 30 29 29 29 29 30 31 32 32 32 34 34 34 34 34 34 33 32 30 30 30 31 31 32 32 31 30 29 29 30 32 32 31 31 30 31 31 30 30 30 30 30 31 33 34 34 34 34 34 34 33 32 31 31 32 31 30 31 33 33 33 33 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 54 54 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 46 46 46 47 47 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 48 47 47 47 46 46 45 45 45 46 46 46 46 46 45 45 44 43 43 43 42 42 41 41 41 42 43 43 42 41 41 40 40 41 42 43 43 44 44 44 45 45 45 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 41 41 41 41 41 42 42 42 43 43 42 43 43 42 42 41 40 40 39 40 40 40 40 40 42 42 41 41 40 41 41 40 39 39 39 38 37 35 35 34 34 34 35 35 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 33 32 32 31 31 31 31 31 32 32 32 31 30 29 29 29 29 30 30 31 32 32 32 32 33 34 34 34 34 33 32 32 32 33 34 34 33 32 31 30 29 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 29 30 30 29 30 30 29 31 32 32 32 31 31 32 33 32 31 32 33 33 32 30 31 30 29 29 30 31 32 32 32 31 30 30 31 31 32 32 30 29 29 29 30 31 32 33 33 34 34 33 32 31 31 30 29 30 30 30 31 31 31 31 30 28 28 28 28 29 29 30 31 32 33 33 32 33 33 32 33 33 32 32 34 34 34 34 34 34 32 30 31 32 32 33 33 34 34 35 34 34 34 34 34 34 35 36 35 34 34 33 33 34 34 35 34 34 34 33 31 31 33 34 34 33 32 31 30 30 29 29 29 30 30 31 31 32 32 32 33 34 33 32 33 33 33 33 33 31 29 30 31 32 31 31 30 29 29 30 31 32 31 30 30 30 30 30 30 30 31 32 32 32 33 34 34 34 34 34 34 33 33 31 30 31 31 30 31 32 33 32 32 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 47 47 47 47 47 46 47 47 47 47 47 47 47 48 48 47 47 46 46 46 46 46 46 47 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 44 44 43 43 42 42 43 42 41 41 41 42 43 42 41 40 40 40 40 41 42 43 43 43 44 45 45 45 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 42 42 42 42 43 43 43 43 42 40 39 38 39 39 39 39 40 41 41 41 41 41 41 41 40 39 39 38 38 37 35 35 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 34 34 34 34 33 33 32 31 31 31 32 32 31 32 33 33 32 31 30 29 29 29 29 29 30 31 31 31 32 33 33 34 34 34 33 33 32 32 33 34 34 33 32 31 30 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 29 30 30 29 29 30 31 31 30 30 31 32 33 31 31 33 33 33 33 32 31 30 29 29 30 31 32 31 31 30 30 31 32 32 32 31 30 29 29 30 31 31 32 32 33 33 34 34 32 31 30 30 29 29 29 31 31 30 31 31 29 28 28 28 29 29 30 31 32 32 33 33 32 31 31 31 32 32 33 33 34 35 35 34 34 34 32 30 31 32 32 33 33 34 34 34 34 34 34 34 35 35 35 36 35 34 34 33 33 34 34 34 34 34 34 33 31 32 33 34 34 34 33 31 30 29 29 30 31 32 32 32 32 31 31 32 33 34 33 32 32 33 32 32 31 30 29 30 32 32 31 30 29 29 29 30 32 32 30 29 30 31 31 32 32 32 33 33 33 33 34 34 33 33 33 33 33 33 33 32 31 31 31 30 31 32 33 32 31 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 48 47 47 47 47 48 48 47 47 47 46 46 46 45 45 46 46 46 46 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 44 44 44 43 43 42 42 42 42 41 41 41 42 43 42 41 40 40 40 40 41 42 43 43 43 44 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 44 44 44 44 44 44 44 44 44 44 43 43 42 42 42 42 42 41 40 40 41 42 42 41 42 42 43 42 41 40 40 39 38 38 38 38 39 40 40 41 41 41 41 41 40 40 39 39 38 37 35 35 35 36 35 34 34 34 33 33 33 33 34 34 34 34 34 35 34 34 34 33 33 32 31 31 32 33 32 32 32 33 33 33 32 32 31 30 29 29 29 29 29 29 30 31 32 32 32 33 34 34 34 33 32 31 32 33 34 33 32 32 31 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 30 29 29 30 29 29 29 30 31 33 33 32 31 31 33 33 33 33 33 32 30 29 29 31 32 32 31 30 29 30 31 31 31 31 30 29 28 29 31 31 31 32 33 33 34 34 34 33 31 31 31 30 29 29 30 30 30 32 31 28 28 28 28 29 29 31 32 33 33 33 32 31 30 30 31 31 32 33 34 35 35 36 35 34 33 31 30 31 32 32 33 34 34 34 34 33 33 33 34 35 35 35 35 35 35 34 33 33 34 35 34 34 35 34 32 31 32 34 35 34 33 32 30 29 29 30 32 33 34 33 32 31 30 30 31 32 32 32 31 33 33 32 31 30 29 30 31 32 31 30 29 29 29 29 30 31 30 29 29 31 32 32 33 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 31 31 30 30 30 31 33 33 32 31 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 48 48 48 48 48 47 47 48 48 48 47 47 47 47 47 46 46 45 45 45 45 46 46 46 46 47 47 47 47 47 46 47 46 46 45 45 44 44 44 44 43 43 43 42 42 42 41 41 42 43 43 42 41 40 40 40 40 41 41 42 43 44 44 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 44 43 43 43 44 43 43 44 44 44 43 43 43 43 43 43 43 42 40 40 40 41 41 41 41 42 42 42 41 41 40 40 39 38 38 38 38 39 40 40 40 40 41 41 40 40 39 39 38 37 36 35 36 37 36 35 35 34 34 33 33 33 33 33 33 33 33 34 33 32 32 32 32 32 32 32 33 33 32 32 33 34 34 33 32 32 31 30 29 29 29 29 29 29 29 30 30 31 31 32 33 34 34 33 32 30 31 32 33 33 32 32 32 30 29 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 29 29 29 30 30 30 30 30 32 33 33 32 31 31 33 33 33 33 32 31 30 29 29 31 31 31 30 30 30 31 31 30 31 31 29 28 29 29 30 30 30 32 33 33 33 34 34 33 32 32 32 31 30 30 30 30 31 32 30 28 28 28 28 29 29 30 32 33 32 31 30 30 31 31 31 32 33 33 34 34 35 35 35 34 33 31 30 31 32 32 33 33 34 34 33 32 33 34 34 35 36 36 35 35 35 35 34 33 34 35 34 33 34 33 31 31 32 34 34 34 33 31 30 29 29 31 33 33 34 33 32 31 30 30 31 32 31 31 31 33 33 32 31 29 29 31 32 31 30 30 29 29 29 29 29 29 29 30 31 31 32 32 34 35 35 34 34 34 34 34 33 32 32 33 34 33 33 32 31 31 30 29 29 31 33 32 31 32 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 45 45 45 45 46 46 46 46 47 46 46 46 46 46 46 46 45 45 44 44 43 43 43 43 43 42 42 41 41 41 42 43 43 42 41 40 40 40 40 41 41 42 43 44 45 45 44 44 44 44 44 44 44 43 44 44 44 44 45 45 45 44 43 43 43 43 43 43 43 44 44 44 43 43 43 44 43 43 42 41 40 40 40 40 40 41 41 42 42 42 41 40 40 40 40 38 38 38 39 40 40 39 39 41 41 40 40 39 38 37 37 37 37 37 37 37 36 35 35 34 34 34 34 33 33 33 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 34 34 34 33 32 32 31 30 30 29 29 29 29 29 29 29 29 29 30 31 32 33 32 32 31 30 30 31 32 33 32 31 31 30 29 29 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 30 29 30 30 31 31 32 32 31 33 33 33 31 31 32 33 32 32 31 31 31 29 29 29 31 31 30 29 30 30 31 31 30 30 30 28 28 29 30 30 30 30 31 32 33 33 34 34 34 33 32 31 31 30 29 29 30 31 31 29 28 28 28 28 28 29 29 30 30 30 30 30 31 32 32 33 34 34 34 34 35 35 35 35 34 34 31 30 31 31 32 33 34 34 34 32 32 33 34 35 36 36 36 36 35 35 34 34 33 33 34 33 33 34 33 31 31 32 34 34 33 33 31 30 29 29 30 31 32 33 33 32 32 30 30 31 31 30 32 33 32 31 31 30 29 30 31 31 30 30 29 29 29 29 29 29 29 30 31 32 32 32 33 34 34 34 33 33 34 34 33 32 31 33 34 34 34 34 33 33 32 31 29 29 31 32 31 31 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 48 48 48 48 48 48 48 48 48 49 49 49 49 48 47 47 47 47 47 46 46 45 45 45 46 46 45 46 46 46 46 46 46 46 46 46 46 45 45 44 44 43 43 43 43 42 42 41 41 41 42 43 42 42 42 40 40 40 40 41 42 43 43 44 45 45 44 43 43 44 43 43 44 43 43 43 44 44 45 45 45 44 44 44 43 43 43 43 43 43 44 44 44 43 43 43 43 43 42 41 41 41 41 40 40 40 40 41 42 41 41 40 40 41 40 39 38 37 38 38 39 39 39 40 40 39 39 39 38 38 37 37 38 38 37 37 36 35 35 35 35 36 35 34 34 33 33 33 33 32 32 33 33 34 34 35 34 34 33 32 33 34 34 34 33 33 32 31 30 30 30 30 29 29 29 29 29 29 29 29 30 31 32 31 31 31 30 30 31 32 33 33 31 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 33 32 30 30 31 32 33 33 33 33 33 32 32 31 30 31 32 33 32 30 30 30 29 29 29 30 30 29 29 30 31 31 30 29 29 28 28 29 29 30 31 31 31 32 33 33 33 34 34 34 33 31 31 31 30 29 29 30 31 31 29 28 28 28 28 28 29 29 29 29 29 29 31 32 32 32 33 34 35 35 35 35 35 35 35 34 34 32 30 30 31 32 33 34 34 33 32 33 34 35 35 35 36 36 36 36 35 34 34 33 33 34 33 34 34 33 31 31 32 34 34 33 32 32 31 29 29 30 31 32 33 34 33 32 30 29 30 30 30 32 33 32 30 29 29 30 31 31 30 30 29 29 28 28 28 30 31 31 31 32 32 32 33 34 34 34 33 33 32 33 33 33 32 32 33 34 33 33 33 33 33 32 32 31 30 30 30 31 31 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 61 61 61 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 46 46 45 45 45 45 45 45 46 46 46 45 46 46 45 45 46 46 46 45 45 44 43 43 43 43 43 43 42 40 40 42 43 42 42 41 40 40 40 40 41 41 43 44 44 44 44 44 43 43 44 43 43 43 43 43 44 44 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 44 43 42 42 43 43 42 42 41 42 42 40 40 39 39 40 40 41 41 41 41 41 40 40 39 38 37 37 38 38 38 39 40 39 38 39 38 38 38 38 38 38 38 38 37 36 36 36 37 37 36 35 34 34 34 34 34 34 33 34 34 34 34 35 34 34 33 32 33 34 34 34 34 34 33 31 31 31 31 30 30 29 29 29 29 29 29 29 29 30 31 31 31 31 30 30 31 33 33 33 32 30 30 31 32 32 31 30 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 31 33 32 31 31 32 33 34 33 33 33 32 32 31 30 31 32 33 33 32 31 30 29 29 28 29 30 29 29 30 31 31 30 29 29 28 28 29 30 30 31 31 32 32 33 33 33 33 34 34 34 33 31 31 31 30 29 29 30 31 31 30 28 28 28 28 28 29 30 30 30 31 30 30 31 32 32 33 34 34 34 34 34 34 35 35 34 33 32 30 30 32 33 34 34 33 32 33 34 34 35 35 35 36 36 36 36 35 34 34 33 33 34 33 34 34 33 31 32 33 34 33 32 32 32 31 29 29 30 31 32 33 33 32 31 31 29 29 30 31 32 32 32 30 29 30 31 32 31 30 30 29 28 28 29 30 31 31 32 32 33 33 33 34 34 34 34 34 34 33 32 32 32 32 32 33 33 33 33 33 33 33 33 32 32 30 29 29 30 30 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 48 47 47 48 48 49 49 49 49 49 49 50 50 50 49 49 49 49 49 48 48 47 47 46 46 46 46 46 45 44 44 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 42 41 40 41 42 42 41 41 40 40 40 40 41 41 42 43 44 44 44 44 43 43 43 43 42 43 44 44 45 45 45 45 44 44 44 44 44 44 43 42 42 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 40 39 39 39 40 40 40 40 40 40 40 39 39 38 37 37 37 37 38 39 38 38 39 39 38 38 39 38 38 37 37 37 36 37 37 37 36 35 35 35 35 36 35 35 34 34 34 34 34 35 35 34 33 33 33 35 35 34 34 34 34 33 32 32 32 31 30 31 31 30 29 29 29 28 28 28 29 29 30 30 30 29 29 31 32 33 33 32 31 32 32 32 32 31 30 30 31 31 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 31 32 32 32 32 33 34 34 32 31 31 31 30 30 32 33 33 33 32 31 31 30 29 28 29 29 29 29 30 30 29 29 28 28 29 29 29 30 31 31 31 32 32 33 33 33 34 34 34 34 34 32 31 30 29 29 28 29 30 30 29 28 28 28 29 29 30 31 32 32 32 32 31 30 31 33 34 34 34 34 34 34 34 35 35 34 33 32 31 30 31 33 34 33 32 32 34 34 35 34 34 35 36 36 36 36 35 35 34 33 33 34 33 33 34 33 31 32 33 34 33 31 32 32 30 29 28 29 31 32 32 32 32 32 31 29 29 31 32 32 31 30 29 29 30 31 31 31 30 29 28 28 29 30 31 31 30 31 32 32 33 33 33 33 34 34 34 34 33 32 31 31 31 31 32 33 33 32 32 32 33 33 32 32 31 30 29 29 30 31 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 57 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 49 50 49 49 49 49 49 50 50 49 49 48 48 47 47 47 47 46 46 46 45 44 44 44 45 45 44 44 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 42 40 40 41 41 41 41 40 40 40 40 41 41 42 42 43 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 44 44 44 44 44 44 43 42 42 42 42 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 39 38 38 38 39 40 40 40 40 39 38 38 37 37 37 36 37 37 37 38 38 38 38 39 39 39 38 38 37 37 37 38 38 37 36 35 35 36 36 36 35 34 34 35 35 34 34 34 34 34 33 33 34 35 36 35 35 34 34 33 33 33 32 31 31 31 31 30 30 30 29 28 28 28 28 28 29 29 30 29 29 30 31 33 34 33 33 34 33 32 31 31 30 30 32 32 32 32 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 28 31 33 33 33 33 33 34 33 32 31 31 30 30 32 33 33 33 33 33 32 31 30 29 28 28 29 29 30 30 30 29 28 28 29 29 30 30 31 32 32 32 32 32 33 33 33 33 34 33 33 33 32 32 31 30 29 28 28 29 29 28 27 28 28 29 29 30 30 31 31 32 33 31 30 32 33 34 34 34 34 34 34 35 35 35 34 33 32 31 30 30 31 33 32 31 32 34 34 34 34 35 35 36 36 36 35 34 34 34 32 33 34 33 33 33 32 31 32 33 33 32 31 32 31 30 28 28 30 31 32 33 32 32 32 30 29 29 31 32 32 31 29 29 29 30 31 30 30 29 28 28 29 30 30 30 30 30 31 31 31 32 33 33 33 34 34 34 34 33 31 30 30 31 32 33 33 33 32 32 32 32 32 32 31 31 31 30 29 30 31 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 51 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 46 46 46 45 45 45 45 45 44 44 44 44 44 45 44 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 42 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 43 43 43 42 42 43 44 44 45 45 45 45 45 44 44 43 43 44 44 43 43 42 42 42 42 43 43 43 43 42 42 41 41 41 41 40 40 41 40 40 40 40 40 39 38 38 38 39 38 39 39 38 38 37 37 37 37 37 36 36 36 36 37 37 38 38 39 39 39 39 39 39 38 38 38 37 36 36 37 37 37 36 35 35 35 35 35 34 34 34 34 34 33 34 34 35 36 36 35 34 34 34 34 34 33 33 32 31 30 31 31 30 30 29 29 28 28 28 28 29 30 29 29 30 31 33 33 33 34 34 33 32 31 31 31 32 32 32 33 32 32 32 30 27 27 27 27 27 27 27 27 27 27 27 27 28 31 32 33 33 33 34 34 33 32 31 30 30 31 33 32 31 33 33 32 33 32 30 30 29 28 28 29 30 29 28 28 28 29 29 29 30 31 32 33 33 32 32 32 32 33 33 33 33 33 33 33 33 32 31 30 29 28 28 29 28 27 27 28 29 29 29 29 30 31 32 33 33 32 31 32 32 34 34 34 34 34 34 35 36 35 34 33 32 32 30 30 31 32 32 32 33 34 34 34 34 35 35 35 36 35 35 34 34 33 32 33 33 32 32 31 31 31 32 32 31 30 31 32 31 29 28 28 30 32 33 33 32 32 31 29 28 28 30 32 32 30 29 29 30 31 31 30 29 29 28 28 29 30 31 30 30 31 31 32 33 33 33 33 32 34 34 33 33 33 31 30 30 32 32 33 33 33 33 32 31 31 32 32 31 30 30 29 29 30 30 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 58 57 56 56 56 56 56 56 56 55 55 55 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 48 48 49 49 48 48 49 49 49 49 48 48 47 46 46 45 45 46 46 46 45 45 44 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 42 41 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 42 42 42 43 44 45 45 45 45 46 45 44 44 44 43 43 43 43 43 42 42 42 42 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 37 37 38 38 37 37 37 38 38 37 37 36 36 36 36 36 36 37 38 38 39 40 40 40 39 38 37 37 37 37 38 37 37 36 35 36 37 36 35 35 36 35 34 34 34 35 35 35 35 36 36 35 35 34 35 34 34 34 33 31 31 32 32 31 31 30 29 29 29 28 28 28 29 29 29 30 31 32 33 33 33 34 33 33 32 32 32 32 31 31 31 30 30 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 30 32 32 32 32 34 34 34 32 30 30 31 32 33 32 31 31 32 32 33 32 31 30 29 28 27 28 29 28 27 28 29 29 30 30 31 31 32 33 33 32 32 32 33 34 34 34 33 32 33 33 33 31 30 29 29 28 27 27 27 27 28 28 29 29 30 30 30 31 32 33 34 33 31 31 33 34 34 33 34 34 34 35 36 35 34 33 33 32 31 30 31 32 32 33 34 34 34 34 34 35 35 35 36 35 34 34 33 32 32 33 33 32 31 30 31 32 33 32 31 30 31 32 30 29 28 29 31 32 33 32 32 31 30 30 29 28 30 30 30 29 28 29 31 32 31 30 29 28 28 29 30 30 30 29 31 32 32 32 32 32 32 32 33 33 33 33 33 33 32 31 30 31 32 33 34 33 32 33 31 31 32 32 32 31 30 29 29 30 30 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 56 56 56 56 56 55 55 55 56 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 48 47 47 47 46 46 47 46 46 46 45 45 44 44 44 44 44 44 44 44 44 43 43 44 44 43 43 43 43 42 42 42 43 42 42 41 40 40 40 40 40 40 40 40 41 41 41 41 42 42 41 42 44 44 44 45 45 44 45 46 45 45 44 43 43 43 43 43 43 42 42 42 43 43 43 43 42 42 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 39 38 37 37 37 37 38 39 39 38 37 37 37 37 36 36 36 36 36 36 37 38 39 39 39 40 39 37 37 37 38 38 37 37 37 37 37 37 36 36 37 37 36 35 34 34 35 36 35 36 36 36 36 36 36 35 34 34 34 33 32 33 33 33 32 32 31 31 31 30 29 29 28 28 28 29 30 31 32 32 32 32 33 33 34 33 33 32 32 31 31 30 30 30 29 30 29 27 27 27 27 27 27 27 27 27 27 27 27 28 31 31 31 32 33 33 32 31 29 29 31 32 33 32 30 30 32 33 32 31 31 30 30 28 27 27 27 27 28 29 29 30 30 31 31 31 31 32 32 32 32 33 33 34 34 34 32 32 33 33 32 31 31 30 30 29 27 27 27 28 28 29 29 30 30 31 30 31 32 33 34 33 31 31 33 34 33 33 34 34 34 35 35 35 34 34 34 32 31 30 30 31 32 33 34 34 34 34 35 35 35 35 35 35 34 34 33 31 32 33 33 32 30 30 32 33 33 32 30 29 30 31 30 29 28 29 30 32 33 32 31 32 31 30 29 28 29 28 28 29 30 30 31 32 30 29 29 28 27 29 29 29 29 29 31 31 31 31 30 31 31 32 33 33 32 32 32 32 31 30 30 31 32 33 34 33 32 32 31 31 32 31 31 31 29 29 30 31 30 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 55 55 55 55 56 56 56 56 56 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 52 52 52 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 45 44 44 44 44 43 43 44 44 44 44 44 43 43 44 43 43 43 43 42 42 42 42 42 43 43 42 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 43 44 44 44 44 44 44 45 46 46 45 44 43 43 43 42 42 42 42 42 43 43 44 43 43 42 42 42 42 43 43 43 43 43 42 42 41 41 40 40 41 41 41 41 40 40 39 39 39 39 39 39 39 39 38 37 38 38 38 38 37 36 36 36 36 36 37 37 38 38 39 39 39 38 38 39 39 38 37 37 38 38 37 36 37 37 36 36 35 34 34 35 36 37 37 37 37 37 37 37 36 35 35 35 34 34 34 34 34 33 33 32 32 33 32 31 31 30 28 27 28 29 30 31 31 31 31 32 33 33 34 33 33 32 32 32 31 30 31 31 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 28 30 31 32 33 32 31 30 29 29 31 33 33 32 30 30 31 32 31 30 30 29 29 28 27 27 27 28 30 31 31 30 31 32 32 32 32 32 32 31 32 32 33 34 34 34 32 32 33 33 32 31 31 30 29 29 27 27 27 28 29 29 29 30 31 32 32 32 33 34 34 33 31 32 33 33 32 33 34 34 34 35 35 34 34 34 34 33 31 30 30 31 32 33 34 34 34 34 35 35 34 34 35 35 34 34 33 31 32 33 34 32 30 30 32 33 33 32 30 29 29 30 29 28 28 29 30 31 33 33 31 31 32 30 29 28 28 28 29 30 31 31 31 31 29 29 28 27 27 28 28 28 29 30 31 31 30 31 31 31 32 33 33 33 32 31 32 31 30 31 32 32 33 34 33 33 32 31 31 31 32 31 30 30 28 29 30 30 30 66 66 66 66 66 66 66 66 66 66 66 65 65 65 66 66 65 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 55 55 55 55 55 56 55 55 55 55 54 54 54 54 54 54 54 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 48 48 48 48 48 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 45 45 44 44 44 43 43 44 44 44 44 43 43 43 43 43 43 43 43 42 42 42 41 41 42 42 41 40 40 40 41 40 40 40 40 40 41 41 41 41 41 42 43 44 43 43 43 43 44 45 45 45 45 44 44 44 43 42 41 41 41 42 43 44 44 44 43 42 42 42 42 43 43 43 43 43 42 42 42 41 41 41 42 42 42 41 40 40 40 40 40 39 40 39 38 38 37 38 39 40 40 39 38 38 37 37 36 35 35 35 36 37 38 39 39 39 39 39 38 39 39 38 38 38 37 37 37 37 36 36 35 34 34 35 36 37 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 34 34 34 33 33 33 33 32 31 29 28 27 28 28 30 31 31 30 31 32 33 34 33 33 33 33 32 31 31 32 32 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 30 31 31 33 32 31 30 29 30 32 33 32 31 30 30 31 31 31 30 29 29 29 28 27 27 28 29 31 32 32 31 32 32 32 33 32 31 31 31 31 32 33 33 33 33 32 32 32 33 32 31 30 29 29 28 27 27 27 29 29 30 30 30 31 33 33 33 33 33 33 33 32 31 32 32 32 33 34 34 34 34 34 34 34 33 33 33 31 30 30 32 33 33 34 34 33 34 35 35 34 34 35 35 34 34 33 32 32 33 34 32 31 31 32 32 33 33 31 30 29 29 28 28 29 29 30 31 33 34 32 30 31 31 29 27 28 29 30 31 31 32 32 31 30 30 28 28 27 28 28 29 30 31 31 30 29 31 31 32 33 33 33 32 31 31 31 30 30 32 32 33 33 32 32 32 32 32 31 30 31 31 30 29 28 29 29 30 31 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 58 57 57 58 57 57 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 48 48 47 47 48 49 48 48 49 48 47 47 47 48 47 47 47 47 47 47 46 46 45 45 44 44 43 43 43 43 44 43 43 42 42 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 41 40 40 40 39 40 40 41 41 41 42 42 43 43 43 43 42 43 44 45 45 45 45 45 44 44 43 42 41 41 42 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 42 41 42 42 42 43 43 42 41 40 40 40 40 39 39 39 38 38 38 39 40 40 40 39 39 39 38 38 37 36 36 35 35 36 37 38 38 38 38 38 38 39 40 39 39 38 37 37 38 38 38 37 36 35 34 36 36 37 38 37 37 36 36 36 37 37 37 36 35 35 36 36 36 36 36 35 34 34 34 34 33 31 29 28 28 28 27 28 30 30 29 31 31 32 33 33 33 34 33 32 32 32 33 32 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 29 32 32 33 32 30 29 29 31 32 32 32 32 31 30 30 31 31 30 29 28 28 27 27 28 29 30 31 32 32 32 32 32 32 33 31 30 31 32 32 32 33 32 32 32 32 32 33 33 32 31 30 29 29 28 27 27 28 29 30 31 31 31 33 33 33 32 32 32 33 34 33 32 31 32 33 34 34 34 34 34 34 34 33 32 32 32 30 30 30 31 33 33 34 33 33 34 34 34 34 34 35 35 34 34 33 31 32 33 32 31 30 31 32 31 32 33 32 30 29 28 28 29 30 30 31 32 33 33 32 30 31 31 29 27 28 29 31 32 32 31 32 31 31 30 29 29 28 27 28 29 30 30 29 29 29 31 32 32 31 31 31 31 31 31 30 30 32 32 32 33 33 32 31 32 31 31 30 29 30 31 30 29 28 29 29 30 31 66 66 66 66 66 66 65 65 65 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 58 58 57 57 58 57 57 57 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 49 49 48 48 47 47 48 48 48 48 48 48 47 47 47 48 48 47 47 47 46 46 46 45 45 45 45 44 43 42 42 42 43 43 43 42 42 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 39 39 39 40 40 40 41 42 42 42 42 42 43 43 43 44 44 44 44 44 44 43 43 42 41 41 42 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 42 42 42 43 43 43 43 42 41 41 40 40 41 40 40 40 39 39 40 40 41 40 40 40 39 39 38 38 37 37 37 37 36 35 35 36 36 37 37 36 36 38 39 39 38 38 38 38 38 38 38 37 37 35 35 36 37 38 38 37 37 37 36 36 36 36 37 36 36 36 36 36 36 37 37 36 35 35 34 33 32 31 30 29 29 29 28 27 28 29 29 30 31 31 31 31 32 33 33 33 32 33 33 32 31 30 29 30 28 27 27 27 27 27 27 27 27 27 27 27 28 30 33 34 32 30 29 30 31 30 30 31 32 32 31 29 29 30 29 28 27 27 27 28 29 29 31 32 32 33 32 32 32 32 31 30 30 31 32 33 33 32 32 32 32 31 32 33 33 31 30 30 30 29 28 27 27 28 29 31 32 32 32 33 32 32 32 31 32 33 34 34 33 32 32 34 34 35 34 34 34 34 34 33 33 32 32 30 30 30 30 31 33 34 33 34 34 34 34 34 35 35 34 34 34 33 31 31 32 30 30 31 32 32 31 31 32 31 31 30 28 28 29 30 31 32 32 32 32 31 30 30 30 29 27 28 29 30 31 31 31 30 31 31 30 29 29 28 27 27 28 29 29 29 30 30 32 33 32 31 30 30 31 31 30 30 30 31 31 31 33 33 31 30 31 31 30 30 29 30 31 30 29 29 29 29 30 31 66 66 66 66 66 66 65 65 65 65 65 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 64 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 61 61 61 60 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 58 58 57 57 58 58 57 57 57 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 48 48 48 48 48 48 49 48 48 48 48 47 47 48 48 48 48 47 47 47 48 48 48 47 47 48 47 47 47 47 47 47 47 47 47 46 46 45 45 44 44 44 44 43 42 42 42 42 43 43 43 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 39 39 40 40 40 41 41 41 41 41 42 43 43 43 43 43 43 44 44 43 43 43 42 41 41 42 43 43 42 42 43 43 42 41 42 43 43 43 43 43 43 43 42 42 42 42 43 43 43 43 42 42 41 41 41 42 41 41 40 40 40 40 41 41 40 40 40 39 38 38 38 38 38 38 37 37 36 35 35 35 35 35 35 36 37 37 37 37 38 38 38 38 37 37 37 36 35 35 36 37 38 38 38 38 37 37 37 36 35 35 36 36 36 36 36 36 37 36 35 35 35 35 33 32 32 31 30 29 29 28 27 27 28 28 29 30 30 30 30 31 32 33 32 31 32 33 32 31 30 31 32 30 27 27 27 27 27 27 27 27 27 27 27 27 28 31 32 32 30 28 29 30 30 30 31 32 32 31 29 29 29 28 27 27 27 27 29 30 31 31 32 32 32 32 32 32 31 30 30 31 32 32 33 32 31 31 31 30 31 32 33 33 31 31 30 29 29 28 27 27 27 29 31 32 32 32 32 31 31 31 32 33 33 34 34 34 33 33 33 34 35 34 34 34 35 34 34 34 33 32 30 30 30 30 32 33 34 33 34 34 35 34 34 35 34 34 33 33 32 31 31 30 30 32 33 33 32 31 31 31 31 31 30 28 28 29 31 32 33 32 32 32 31 29 30 30 29 28 27 28 29 30 31 31 30 30 31 30 29 29 28 27 27 28 29 30 30 30 31 32 33 32 31 30 30 31 30 29 29 30 30 30 32 33 31 30 29 30 31 30 29 29 31 31 29 29 29 29 29 30 31 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 58 58 58 57 57 58 58 57 57 57 57 57 56 56 56 56 56 56 55 55 55 54 54 55 54 54 53 53 53 53 53 53 53 53 54 54 54 54 54 54 53 53 53 53 53 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 51 51 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 47 46 46 47 48 48 48 47 47 47 47 46 46 47 47 47 47 47 46 46 45 45 45 44 44 44 44 43 43 42 42 42 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 40 41 41 41 41 41 41 42 42 42 42 43 43 44 44 43 43 43 42 41 41 42 42 42 42 42 43 42 41 41 42 43 44 43 43 42 42 42 42 42 42 42 42 43 43 43 43 42 42 42 41 41 41 41 41 40 40 41 41 41 41 40 40 40 39 39 39 39 39 38 38 37 37 36 35 35 35 35 35 35 36 36 36 37 37 37 38 38 37 37 37 36 35 36 37 37 38 38 38 38 37 37 37 37 36 35 35 35 35 35 36 36 37 36 35 35 35 35 34 34 32 31 30 30 29 29 28 27 27 27 27 28 29 30 30 30 31 31 31 31 32 33 33 32 31 32 32 31 28 27 27 27 27 27 27 27 27 27 27 27 27 29 31 32 31 28 28 30 30 31 31 32 33 31 30 29 29 28 27 27 27 29 29 30 31 32 32 32 32 32 32 31 30 30 31 32 33 33 33 32 31 30 31 31 31 32 33 33 31 30 29 29 29 28 27 27 27 28 30 31 32 32 31 30 30 32 33 33 33 33 34 34 34 33 33 34 34 33 33 34 34 34 34 34 33 32 30 30 30 31 34 34 33 33 34 34 34 34 34 35 34 34 33 32 31 31 31 30 32 33 33 33 33 32 31 30 29 30 29 28 28 29 30 31 32 31 31 31 30 29 29 30 29 28 27 27 28 30 31 31 30 30 31 30 29 28 27 27 27 28 29 29 29 29 31 32 32 31 30 30 30 30 29 29 30 31 32 32 33 33 31 31 30 29 30 29 29 30 31 30 29 28 28 29 30 31 31 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 54 54 53 53 53 53 53 53 53 53 54 53 53 53 53 53 53 53 52 52 52 52 52 51 51 51 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 47 47 46 46 47 47 47 47 47 47 47 46 46 47 47 46 46 46 46 46 45 45 44 45 44 44 43 43 43 43 42 41 42 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 40 40 40 41 41 41 41 41 42 42 43 43 43 44 43 43 43 42 41 41 41 42 42 42 43 42 42 41 41 42 43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 37 37 36 36 35 35 35 35 35 34 34 34 35 36 36 36 37 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 36 35 34 34 34 35 36 36 36 36 35 34 34 34 34 34 33 32 30 30 31 30 30 29 28 27 27 27 28 29 29 30 31 31 30 30 31 32 32 32 32 32 32 32 29 27 27 27 27 27 27 27 27 27 27 27 27 27 30 32 30 28 29 30 32 33 33 33 32 31 30 30 29 28 27 27 28 30 30 30 31 32 33 32 32 32 31 30 30 31 32 33 32 32 32 32 30 30 31 32 32 33 33 33 32 31 30 29 29 29 28 27 27 28 29 30 32 32 30 30 31 33 34 33 32 33 33 34 34 33 33 33 33 33 33 33 34 34 34 34 33 31 30 30 30 31 34 34 33 32 33 34 34 33 34 34 34 34 33 32 31 31 30 31 33 33 32 31 31 32 31 30 29 30 29 28 28 29 30 31 31 30 31 31 31 30 29 30 29 28 27 27 28 30 31 31 29 30 31 30 29 28 27 27 27 27 28 29 29 29 31 31 31 30 29 29 30 29 29 30 32 33 32 32 33 33 32 31 30 29 28 29 30 31 31 30 29 27 28 29 30 31 30 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 58 58 57 57 58 59 58 58 58 58 58 58 58 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 44 44 45 45 44 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 40 41 40 40 41 41 41 42 43 42 42 43 43 43 42 42 41 40 41 42 42 42 42 42 41 42 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 42 42 42 41 41 40 40 40 40 40 40 40 39 38 38 38 37 37 36 36 35 35 35 36 36 35 34 34 35 35 35 36 37 37 38 38 38 38 37 37 37 38 38 38 39 39 39 38 38 37 37 36 35 34 34 35 35 35 36 36 36 35 34 34 33 33 33 32 30 31 31 31 30 30 29 28 27 27 27 28 28 29 30 30 30 29 31 32 32 31 31 31 31 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 29 30 29 29 31 32 33 34 34 33 32 31 30 30 30 28 27 27 28 30 31 31 32 33 33 32 31 31 30 30 30 31 32 31 31 31 31 30 30 31 32 32 33 33 33 32 32 31 30 29 29 29 28 27 27 28 29 29 31 31 29 30 32 32 33 32 32 33 33 33 34 33 32 33 32 33 33 34 34 34 33 33 33 31 30 30 30 31 33 34 33 32 33 34 34 33 33 34 34 33 33 31 31 31 30 31 33 33 32 31 30 30 30 30 29 29 29 28 28 29 30 31 31 30 31 32 31 30 29 29 30 29 27 27 28 29 30 30 29 29 30 30 29 28 27 27 27 27 28 29 29 30 30 30 29 29 29 29 29 29 30 32 32 32 31 32 32 33 32 30 30 29 28 29 30 31 31 30 28 27 28 29 29 31 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 58 59 59 58 58 59 58 58 58 58 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 47 47 47 46 46 46 46 47 47 47 46 46 46 45 45 46 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 42 41 41 41 41 42 42 41 41 41 41 41 42 43 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 40 40 40 40 41 41 41 41 42 42 42 43 43 43 42 41 40 40 41 42 43 43 42 41 41 43 44 43 43 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 42 42 42 41 41 41 40 40 40 39 39 39 39 39 40 39 38 38 37 37 36 36 36 36 36 37 37 37 36 35 34 34 34 35 36 36 36 37 37 38 38 37 37 37 38 38 38 39 40 39 39 38 38 37 37 36 35 34 34 34 35 35 35 36 35 35 34 33 33 33 32 31 31 32 32 31 30 30 29 28 27 27 27 27 27 28 29 29 29 30 31 31 30 30 31 31 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 31 32 32 32 33 33 32 32 32 30 29 29 28 27 27 28 30 32 32 32 32 32 31 30 30 29 30 30 31 32 31 30 30 30 30 31 32 32 32 33 34 33 31 31 31 30 29 29 29 28 27 27 28 29 29 30 30 29 30 32 32 31 32 32 32 32 33 33 33 32 32 32 33 34 34 34 33 32 32 32 31 29 29 30 31 33 33 32 32 33 34 34 33 33 34 34 33 32 31 30 30 30 31 33 33 32 32 31 31 30 29 28 29 29 28 28 29 29 29 30 31 31 31 30 30 29 28 29 29 28 27 27 28 29 30 29 29 30 29 28 27 26 26 26 27 28 28 28 28 28 28 28 28 28 29 29 29 31 32 32 31 31 32 32 32 31 30 30 29 28 29 29 30 31 30 29 28 27 28 29 31 31 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 59 58 58 58 58 58 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 47 46 46 46 46 46 46 47 47 46 46 46 45 45 46 46 46 46 45 45 45 44 44 43 43 43 43 43 43 42 42 41 42 42 42 43 43 42 42 41 41 42 43 43 43 43 42 41 41 42 42 41 41 41 41 41 41 41 40 40 39 39 39 39 39 39 40 40 41 41 41 41 42 41 42 43 43 43 43 42 40 40 41 42 43 43 42 41 42 43 43 43 42 42 41 42 42 43 44 44 44 44 44 44 44 44 44 44 44 43 43 42 41 41 41 41 41 41 40 40 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 38 37 37 36 36 36 35 35 34 34 34 34 35 35 36 37 38 38 38 37 37 38 38 39 39 40 39 38 37 37 37 37 36 36 35 34 34 34 34 34 34 35 35 35 34 34 33 32 32 33 33 33 32 31 31 29 28 28 27 27 27 27 27 27 28 28 29 29 30 30 29 30 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 30 31 32 33 32 31 32 32 31 29 29 27 27 27 29 31 32 32 32 31 31 31 29 29 29 30 31 32 32 32 30 29 30 31 32 32 32 33 33 33 33 32 31 31 31 31 30 29 29 27 27 27 28 29 29 29 29 31 32 32 31 31 32 32 32 32 33 33 32 32 33 33 34 34 34 33 32 32 31 30 29 29 30 31 32 33 32 32 33 34 33 33 34 34 34 34 33 31 30 30 30 32 33 33 32 32 31 31 30 29 28 28 28 28 27 28 29 29 30 31 31 31 31 30 29 28 28 29 28 27 27 28 29 29 28 29 30 29 27 27 26 26 27 28 28 28 28 28 28 28 28 28 28 28 29 30 31 31 31 31 31 32 33 33 31 29 30 30 28 28 29 31 31 30 30 29 27 28 29 31 31 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 51 51 51 51 51 50 50 49 49 50 50 51 51 51 50 50 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 47 47 47 47 46 45 45 45 46 45 45 45 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 42 42 42 43 42 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 40 40 40 40 41 41 41 42 42 42 42 42 41 40 40 41 42 43 43 42 41 42 42 42 42 41 41 41 42 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 42 41 41 41 41 41 40 40 39 38 39 40 40 38 38 38 37 38 38 38 38 38 39 39 38 37 37 36 36 36 36 36 36 35 34 34 34 34 35 37 38 39 38 38 38 38 38 39 39 39 39 38 37 37 37 37 36 35 35 34 34 33 33 33 33 34 35 35 34 34 33 32 33 34 34 33 32 31 30 29 29 29 28 28 27 27 27 27 27 27 27 28 29 29 29 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 32 33 33 32 30 31 32 31 29 28 27 27 28 29 30 31 32 32 31 30 30 29 30 30 31 31 32 32 31 30 29 31 31 31 32 32 32 32 33 33 33 32 31 31 31 30 29 28 27 27 27 28 29 29 29 30 31 32 31 30 30 31 32 32 32 33 33 32 32 33 33 34 34 34 34 33 32 30 30 29 29 30 32 33 33 32 31 32 33 33 33 33 33 34 34 33 31 30 30 31 32 33 33 32 31 30 30 29 30 30 29 28 27 27 28 29 29 30 31 31 31 31 30 29 28 28 27 27 27 27 28 29 29 29 29 29 28 27 26 26 27 28 29 29 29 29 30 30 30 30 30 30 30 30 31 31 30 30 31 32 32 33 33 32 31 31 30 28 28 29 30 31 30 29 28 27 28 29 30 30 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 59 59 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 52 52 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 46 46 46 46 46 46 45 45 45 45 46 46 46 46 46 47 46 46 45 44 45 44 44 44 43 43 43 43 43 44 44 43 42 42 42 43 43 44 44 43 43 42 42 42 42 42 42 43 43 43 43 42 42 43 43 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 38 39 39 40 40 41 41 41 41 42 42 41 41 40 40 40 41 42 42 42 41 42 42 41 41 41 41 41 41 41 42 42 42 42 42 43 44 44 44 44 43 43 44 44 43 43 42 42 41 40 40 39 39 39 40 41 40 39 38 39 39 39 39 39 39 39 39 39 39 37 37 38 37 38 38 37 37 37 36 35 35 34 34 35 36 38 39 39 38 37 37 38 38 38 39 40 39 37 37 37 37 36 35 35 34 34 34 34 33 33 33 34 34 34 34 34 33 34 35 34 33 32 31 30 29 29 30 30 29 28 28 28 28 27 27 27 27 27 27 28 28 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 32 33 34 32 30 31 32 31 30 29 27 27 28 29 30 31 32 32 31 29 29 29 30 31 31 31 32 31 30 30 29 30 30 31 31 31 31 32 33 34 33 32 31 30 29 29 29 28 27 27 27 27 28 28 29 31 31 31 30 30 30 31 33 33 33 33 33 32 32 33 34 33 34 34 34 33 32 31 30 29 29 30 32 33 33 32 32 33 33 34 33 33 33 34 34 32 30 30 30 31 33 34 33 33 32 32 31 31 31 31 29 28 27 27 28 28 29 30 30 30 30 31 31 30 29 29 28 28 27 27 27 28 29 29 29 28 27 27 26 26 27 27 29 29 29 30 31 31 31 31 31 31 31 31 31 31 30 30 31 32 33 32 32 32 32 31 31 29 28 28 28 29 30 29 28 27 28 29 30 29 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 51 51 52 52 53 53 53 52 52 52 52 52 52 52 52 51 51 52 52 52 51 51 51 50 50 50 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 46 46 46 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 43 43 43 44 44 44 44 43 42 42 43 44 44 44 43 43 42 42 42 42 42 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 39 39 39 39 38 38 38 39 40 40 40 41 41 41 41 41 41 40 40 40 42 42 42 41 41 41 41 41 41 42 42 42 42 42 42 42 42 43 43 43 44 43 43 43 43 43 44 44 43 43 42 41 41 40 40 39 39 41 41 41 40 39 39 40 40 40 40 40 40 40 39 38 38 38 38 39 38 39 38 38 37 37 36 36 35 34 34 34 36 37 39 39 38 37 37 37 38 38 39 39 39 38 38 38 37 36 36 35 34 34 34 34 34 33 32 33 33 33 34 34 34 34 34 34 33 33 31 29 30 31 31 30 29 29 29 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 33 33 31 30 31 32 32 31 29 28 27 27 28 29 30 31 32 31 29 29 30 31 31 31 31 32 31 30 29 29 29 30 31 31 31 32 32 33 34 33 32 32 31 29 29 29 28 27 27 27 27 28 29 30 31 30 30 30 31 32 32 33 34 34 34 34 33 32 33 33 33 33 33 34 33 32 31 30 29 29 31 32 33 33 32 32 33 33 34 33 32 33 33 33 32 30 30 30 31 33 33 33 33 33 32 32 31 31 31 29 29 27 27 28 28 28 29 30 30 30 31 31 31 30 30 29 29 28 27 27 28 28 28 29 28 27 26 26 26 27 28 29 29 29 30 31 31 31 31 30 30 30 30 30 30 29 30 32 32 33 32 31 31 31 31 31 30 28 27 28 29 30 29 27 27 28 30 30 29 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 58 58 58 57 57 57 57 56 56 56 56 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 52 52 51 50 51 52 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 51 50 50 49 49 49 49 49 49 49 49 50 50 50 50 49 49 50 50 50 50 49 49 49 49 48 48 48 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 45 45 46 46 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 44 44 45 45 45 45 45 45 45 45 44 43 42 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 38 38 38 39 40 40 40 41 41 41 41 40 40 40 41 42 42 41 40 40 40 40 41 42 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 44 44 44 43 43 42 41 40 40 40 40 40 41 42 41 40 39 39 41 41 41 41 41 41 40 38 38 39 38 39 40 40 40 38 38 38 37 37 36 36 34 34 35 36 37 38 38 38 38 37 37 37 38 38 39 39 39 39 38 37 36 36 35 35 34 33 33 33 32 32 32 32 32 33 33 34 34 34 34 34 32 31 30 30 32 31 30 30 29 29 31 31 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 31 31 30 30 32 33 32 30 29 28 27 27 27 29 30 31 32 31 29 29 30 30 29 31 31 31 30 30 29 29 30 31 31 32 32 33 32 32 33 32 32 32 31 30 30 29 28 27 27 27 28 29 30 30 29 29 29 30 31 32 32 33 33 34 34 34 33 32 32 32 32 32 33 33 33 32 31 30 29 29 30 31 33 33 31 31 32 33 33 32 33 33 33 33 33 31 30 30 31 33 33 32 33 31 31 31 30 30 30 30 29 28 27 27 27 28 29 30 30 29 30 31 31 31 30 29 29 28 27 27 27 28 28 29 28 27 26 26 26 27 28 28 29 29 29 30 30 30 30 29 29 30 30 30 30 30 31 32 32 32 32 31 31 31 30 30 30 29 27 27 29 30 28 27 27 29 30 30 29 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 60 59 59 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 56 56 55 55 54 54 54 54 54 55 55 54 54 54 54 54 54 54 53 53 53 52 52 52 51 50 50 51 52 52 51 51 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 48 49 49 49 49 49 49 49 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 46 46 46 46 45 45 45 45 46 46 45 45 45 46 46 46 46 45 45 45 45 46 46 46 45 45 45 45 44 43 43 43 44 44 44 43 43 43 44 43 43 43 43 44 44 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 39 39 40 40 40 40 41 40 39 40 41 41 41 40 40 40 41 41 42 42 43 43 44 44 44 44 43 43 43 42 42 43 43 43 43 44 44 44 44 43 43 42 41 41 40 41 41 41 41 41 41 40 39 40 41 42 41 41 41 41 40 39 39 39 39 40 40 40 39 38 38 38 38 37 36 36 35 34 34 35 36 37 38 38 38 37 36 36 37 37 38 38 38 38 38 37 37 37 36 35 34 33 34 33 33 33 33 32 32 32 33 34 34 34 34 33 32 30 30 31 32 32 31 30 29 30 31 31 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 27 27 27 27 27 27 27 27 29 31 30 30 31 32 31 29 29 28 27 27 28 29 30 31 33 31 29 29 29 29 30 31 31 30 30 29 29 30 31 32 32 32 32 32 32 32 32 32 32 31 31 30 29 29 28 27 27 27 28 29 29 29 29 29 30 31 31 32 32 33 33 33 34 34 33 32 31 32 32 32 33 33 33 33 31 30 29 29 29 31 32 32 31 31 33 34 33 32 33 34 33 32 31 30 30 30 31 32 32 32 32 31 30 30 29 29 29 29 29 28 27 27 27 28 29 29 29 29 30 30 30 30 29 29 29 28 27 27 27 27 28 29 28 27 26 26 27 27 28 28 29 29 29 29 28 28 28 29 29 31 31 31 32 31 31 32 31 31 31 30 31 31 30 29 29 28 27 27 29 29 28 27 27 28 29 29 28 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 56 56 55 55 55 55 55 54 54 55 54 54 54 54 54 54 54 54 53 53 53 52 52 52 52 51 50 50 51 51 50 51 51 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 50 50 50 51 50 50 51 50 50 49 49 48 48 48 48 49 49 49 49 49 49 49 49 49 48 47 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 47 47 47 46 46 46 46 45 45 45 45 46 46 46 46 45 45 45 45 45 46 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 43 43 44 44 44 44 44 44 44 44 44 43 43 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 38 38 38 39 39 40 40 40 40 39 40 41 41 40 40 40 41 42 43 43 43 43 43 43 43 43 43 43 42 42 42 43 44 44 44 44 44 44 44 44 44 43 42 41 41 41 41 42 43 42 42 41 40 40 40 41 41 41 40 40 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 37 36 35 34 33 34 35 36 37 38 38 37 37 36 36 36 37 37 37 37 37 37 37 37 36 34 34 34 35 35 34 34 34 33 32 32 32 33 34 33 33 33 32 31 31 32 32 32 31 30 30 31 32 32 31 30 29 29 28 28 28 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 27 27 27 27 27 27 27 27 29 30 30 30 31 32 31 29 28 27 26 27 28 29 31 32 33 30 28 29 30 30 31 31 31 30 29 29 29 31 31 31 32 33 33 32 31 31 32 32 31 30 30 29 29 29 28 27 27 27 28 29 29 29 29 29 31 32 32 32 32 32 32 32 33 34 33 32 31 32 32 33 33 34 34 33 32 30 29 29 29 30 31 30 30 31 33 33 32 33 33 33 32 31 30 30 29 30 31 32 31 31 32 32 31 31 30 29 29 28 28 28 27 27 27 28 29 29 28 29 29 29 30 29 29 29 29 28 27 27 27 27 28 29 27 26 26 26 27 28 28 28 28 28 28 28 28 28 29 30 30 32 31 31 31 31 31 31 30 30 30 30 31 31 30 30 30 28 27 27 29 29 28 27 27 27 29 28 27 65 65 65 65 65 65 64 64 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 57 57 58 58 57 57 57 56 56 56 55 55 55 55 55 55 55 55 54 54 55 54 54 54 54 54 53 53 53 53 53 53 52 52 51 51 50 50 49 50 51 51 51 51 52 52 52 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 48 47 47 48 48 48 47 47 47 47 47 48 48 48 48 48 48 48 48 48 47 47 47 46 46 47 47 47 46 46 46 45 45 45 45 45 46 46 46 46 45 45 45 45 45 46 45 45 45 45 45 46 46 46 45 45 45 45 45 44 45 45 44 44 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 39 39 39 40 39 39 39 40 40 40 40 41 42 42 42 43 43 43 43 43 42 42 42 42 42 41 42 43 43 43 43 43 43 43 43 43 44 43 42 42 42 41 42 43 43 43 43 42 41 40 41 41 41 41 40 40 41 41 41 40 40 40 40 40 39 39 38 37 38 38 38 38 37 36 35 33 33 34 36 36 37 37 37 38 37 35 35 36 36 36 36 36 37 37 37 36 35 34 35 35 35 35 34 34 34 33 32 31 32 33 33 33 33 33 32 32 32 32 33 32 31 30 31 32 32 31 29 29 29 29 29 29 28 28 29 27 27 28 27 27 27 27 26 26 26 26 26 26 27 26 26 26 27 27 27 28 29 31 31 32 32 31 29 28 26 26 28 29 29 31 32 31 29 28 29 30 31 31 30 30 30 29 29 29 31 31 30 32 32 32 32 31 31 32 32 31 30 30 30 29 29 28 27 27 27 27 28 29 29 30 30 31 32 32 32 31 31 32 32 32 33 33 32 31 32 33 33 33 33 33 32 32 31 29 29 29 30 30 30 31 32 33 33 32 33 33 32 32 31 30 29 29 30 32 32 31 30 31 32 32 32 32 30 30 29 28 28 28 27 27 27 28 28 28 29 29 30 30 29 28 28 28 28 27 27 27 28 29 28 27 26 26 26 26 27 27 27 27 28 28 29 29 30 31 30 30 31 31 30 30 30 31 31 30 29 29 30 30 30 29 30 29 28 28 27 28 28 27 27 26 27 28 27 27 65 65 65 65 65 65 64 64 64 64 64 64 64 65 65 65 65 65 65 64 64 64 64 63 63 64 63 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 60 60 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 58 57 58 58 58 58 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 54 53 53 52 52 52 51 51 50 49 50 50 51 51 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 47 47 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 45 45 46 45 45 44 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 38 38 38 39 39 39 39 39 38 39 40 39 39 40 40 41 42 42 42 43 43 43 43 42 42 42 42 42 42 43 43 43 42 42 43 43 43 43 43 44 43 43 43 43 43 42 43 43 43 43 42 42 42 42 42 42 42 41 40 40 40 41 41 40 39 38 39 38 37 37 37 37 37 37 37 37 37 36 34 33 33 35 35 35 36 37 38 37 36 35 35 35 35 35 36 36 37 37 37 36 36 36 36 35 35 34 34 33 32 32 31 31 32 33 32 32 33 32 32 32 33 33 33 32 31 32 32 31 30 30 30 29 30 30 29 28 29 30 29 29 29 28 28 29 28 26 26 26 26 26 26 26 26 26 26 27 27 26 27 29 31 31 31 32 31 30 28 26 26 28 29 30 32 32 30 28 28 29 30 30 30 29 29 29 29 29 29 30 30 30 31 31 30 31 31 32 33 33 32 32 31 30 29 29 27 27 27 27 28 29 29 30 31 32 32 32 31 31 30 30 31 31 32 33 33 33 32 31 32 33 33 33 33 31 31 31 29 29 29 30 30 31 33 33 33 33 32 33 33 32 31 30 29 29 30 31 32 32 32 31 31 32 32 32 32 31 31 30 30 29 29 28 27 27 26 26 28 29 29 30 30 29 28 27 27 27 27 27 27 28 28 27 27 26 26 26 27 27 28 28 29 29 29 29 29 30 30 30 31 31 32 31 30 30 30 31 31 29 29 29 30 29 29 29 29 28 28 26 27 27 26 27 27 26 27 27 28 65 65 65 65 65 65 64 64 64 64 64 64 64 64 65 65 65 65 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 61 61 61 61 61 61 61 61 61 61 61 61 60 60 61 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 58 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 52 52 52 51 51 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 46 46 47 47 47 47 48 48 48 48 47 47 47 47 47 46 46 47 47 46 46 45 45 45 46 46 46 46 46 46 46 46 46 46 45 45 44 45 44 44 44 44 45 46 45 44 44 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 44 44 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 40 41 41 40 40 40 39 39 39 39 39 39 40 39 38 38 38 38 38 38 38 39 39 40 39 39 39 40 40 41 41 42 42 42 42 42 42 41 41 42 42 43 42 42 42 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 41 41 40 40 41 41 40 39 38 38 38 37 37 37 37 37 36 36 36 37 36 34 33 32 33 34 34 35 35 37 37 37 36 36 35 34 35 35 35 36 37 36 36 37 36 36 35 35 34 34 33 33 32 31 31 32 33 32 32 32 32 32 33 33 33 33 33 33 33 33 32 31 31 31 29 30 31 29 29 30 30 30 30 29 29 30 31 29 27 28 27 26 26 26 26 26 26 26 26 26 26 26 27 30 31 30 31 31 30 28 26 26 27 29 30 32 33 32 29 28 29 30 30 29 28 28 28 29 29 29 29 30 31 31 30 30 30 31 32 32 33 33 31 30 30 29 28 27 27 27 27 28 29 29 30 32 32 32 31 30 30 30 31 31 32 32 33 33 34 32 31 32 33 33 33 33 31 31 30 30 29 29 30 31 32 33 33 33 32 32 32 33 32 31 30 29 29 30 32 32 31 31 30 30 31 31 32 31 31 31 31 30 30 29 28 27 27 26 26 28 29 29 29 30 30 29 28 28 27 26 26 27 28 28 27 26 26 26 26 27 28 28 29 29 28 28 29 29 30 30 31 32 32 31 30 29 29 29 30 30 30 29 29 29 29 29 30 29 29 28 27 26 26 27 27 27 26 27 29 29 65 65 65 65 65 65 64 64 64 64 64 64 64 64 65 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 60 60 61 61 61 61 61 61 60 60 60 60 61 60 60 60 60 60 60 60 60 60 59 59 59 60 59 59 59 59 59 59 59 58 58 58 57 57 58 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 52 52 52 51 51 51 51 50 49 49 50 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 47 47 47 47 48 48 47 47 47 47 46 46 46 46 46 46 46 45 44 45 46 45 45 46 46 46 46 46 46 46 46 45 44 44 44 44 44 44 45 45 45 44 44 45 45 45 45 45 46 45 45 44 44 45 44 44 44 44 44 44 44 43 42 42 42 42 42 42 42 43 42 42 43 43 43 43 43 43 43 42 41 41 40 40 41 41 41 40 40 40 39 39 40 40 40 40 39 39 38 38 38 38 38 39 40 40 40 39 38 39 39 40 40 41 41 41 41 42 41 41 41 42 42 42 42 41 41 42 43 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 43 43 43 43 43 42 42 42 42 41 41 39 39 40 40 40 40 39 39 39 38 38 38 37 37 37 36 35 36 36 35 34 33 32 33 33 34 34 36 37 37 37 36 35 35 34 34 35 36 36 35 36 37 37 36 35 35 34 34 34 34 32 31 31 31 31 32 32 32 32 32 32 32 32 33 33 33 34 33 32 32 32 31 30 31 31 30 29 30 31 31 30 29 29 30 31 30 28 30 31 29 27 26 26 26 26 26 26 26 26 26 26 27 29 29 30 30 29 28 26 26 27 28 29 31 33 33 29 28 29 30 29 28 28 28 29 29 29 30 30 31 30 30 30 31 32 32 32 32 33 32 30 30 29 29 28 28 27 27 27 27 28 29 30 31 32 31 30 29 30 31 32 32 33 33 33 34 33 32 31 31 32 33 34 33 32 31 30 30 29 29 29 31 33 33 33 32 31 31 32 32 32 31 29 29 29 31 32 31 30 30 30 29 30 31 32 31 30 30 31 31 30 30 29 28 27 26 26 27 28 29 29 30 30 29 29 28 27 26 26 26 28 28 27 26 26 26 26 27 27 27 28 28 28 29 29 30 30 30 30 31 31 30 30 29 29 29 30 30 30 30 29 28 28 29 30 29 29 29 28 26 26 27 27 26 26 28 29 30 65 65 65 65 65 65 64 64 64 64 64 63 63 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 62 61 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 52 52 52 52 51 51 51 50 49 49 49 50 50 50 50 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 47 47 47 47 47 47 47 46 46 46 45 45 46 46 45 45 45 45 45 45 46 46 46 46 46 46 45 45 46 45 44 43 44 44 44 44 44 44 43 44 45 45 45 45 45 46 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 42 43 43 42 42 42 42 43 43 43 42 42 42 42 41 40 40 41 41 41 42 41 40 41 40 40 41 40 40 40 40 40 39 38 38 38 38 39 40 40 40 39 38 38 39 39 40 40 40 41 41 41 41 41 41 42 41 41 41 42 43 43 44 44 44 45 45 45 44 44 44 44 44 44 43 44 44 43 43 43 43 43 43 42 42 41 41 41 40 40 40 39 39 39 40 40 39 38 38 38 37 37 37 37 36 35 35 35 35 34 33 32 32 32 34 35 36 37 37 37 36 36 35 34 33 34 35 35 35 36 36 37 36 35 35 34 34 34 34 33 32 31 31 31 31 31 31 31 31 31 32 32 32 32 33 34 33 33 33 32 31 32 32 32 30 30 31 32 31 29 29 29 30 31 30 30 30 32 32 29 26 26 26 26 26 26 26 26 26 26 26 27 28 29 30 29 27 26 26 27 29 30 31 32 31 29 27 28 29 28 27 28 29 29 30 30 31 32 31 29 29 30 31 32 32 31 31 32 32 31 30 29 29 29 29 28 27 26 26 28 29 30 31 31 31 29 30 31 31 31 32 32 33 33 33 33 32 31 31 33 33 33 34 33 32 31 30 29 29 30 31 33 33 34 32 31 31 32 31 31 30 29 29 29 31 31 30 30 30 29 29 29 30 31 31 30 30 31 31 30 30 29 28 27 27 26 26 27 28 29 29 30 29 29 28 28 27 26 26 27 28 28 27 26 26 26 27 27 27 28 29 29 29 29 29 30 30 30 31 30 30 29 29 29 29 30 30 29 29 30 29 28 29 30 30 29 28 27 27 26 26 26 26 27 28 29 29 65 65 65 65 65 65 65 64 64 64 64 63 63 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 56 56 56 56 56 56 56 56 55 55 56 55 55 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 52 52 52 52 51 51 51 51 51 51 51 50 49 49 49 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 46 46 47 47 47 47 47 46 46 45 45 45 45 45 45 45 44 44 44 44 44 45 46 46 46 46 46 45 45 45 45 44 43 43 43 44 44 44 44 43 43 44 44 44 45 46 45 44 44 44 44 43 43 44 44 44 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 42 42 42 42 41 41 41 41 40 41 42 42 42 42 42 41 41 42 42 41 41 41 41 40 40 39 39 39 38 38 39 39 39 39 39 38 38 38 39 39 39 40 40 40 40 40 40 41 41 41 41 42 43 44 44 44 45 45 45 46 45 44 44 44 44 44 44 43 43 43 43 42 42 42 42 41 41 41 40 40 40 40 41 40 40 39 38 39 39 39 38 37 37 36 37 37 36 36 36 35 34 33 33 33 33 32 32 33 35 35 36 37 37 37 37 35 34 34 33 33 34 35 35 36 36 37 36 35 35 34 34 34 33 33 32 32 31 31 30 30 30 30 30 31 31 32 32 33 33 33 34 33 32 31 32 33 32 31 30 31 32 31 30 29 30 31 32 30 30 31 32 32 30 28 26 26 26 26 26 26 26 26 26 26 26 26 27 28 27 26 27 28 28 29 30 32 32 31 29 27 27 28 28 28 29 30 31 30 31 31 31 30 29 30 31 31 31 31 30 32 33 32 31 31 31 30 29 29 28 27 26 26 28 29 30 30 30 30 29 30 31 31 31 31 31 33 33 33 33 32 31 31 32 33 33 34 33 32 31 30 29 29 30 31 33 34 33 31 31 32 32 31 30 30 29 29 30 31 31 30 30 30 30 29 29 29 30 30 29 29 30 30 29 29 29 29 28 27 26 26 26 28 29 29 30 30 29 29 28 27 26 26 27 28 28 27 26 26 26 26 27 28 29 29 28 28 29 29 30 30 30 31 30 29 29 29 29 29 29 29 29 29 29 28 29 30 30 29 29 27 27 26 26 26 26 27 28 29 29 29 65 65 65 65 65 65 65 64 64 64 63 63 63 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 54 54 53 53 53 53 52 52 51 51 51 51 51 52 52 52 52 52 51 51 50 49 49 49 50 50 50 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 43 43 43 44 45 45 45 45 45 45 45 45 45 45 45 45 43 43 43 43 43 43 43 43 43 43 44 45 46 45 44 44 44 44 43 43 43 44 43 43 43 43 43 42 42 42 41 41 41 41 41 42 41 41 41 41 41 41 40 41 41 40 41 42 42 43 43 43 42 42 42 43 43 42 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 40 40 41 42 42 43 43 44 44 44 45 45 45 46 46 45 45 45 44 43 43 43 43 43 42 42 42 42 42 42 41 41 40 40 40 41 41 40 40 40 39 38 38 39 39 38 37 37 37 37 37 37 37 36 36 35 34 34 33 32 32 33 34 34 35 36 37 37 37 36 35 34 33 32 33 34 34 35 36 37 36 36 35 34 34 34 33 33 33 33 32 32 31 31 31 30 30 30 30 31 31 31 32 33 34 33 32 32 33 33 32 31 31 32 32 31 30 30 31 32 32 30 30 30 32 33 32 30 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 30 30 31 33 31 27 27 27 28 29 29 29 31 31 30 30 31 30 29 29 31 32 31 30 31 31 33 33 32 32 32 31 30 29 29 29 27 26 26 28 29 29 29 29 29 29 30 30 30 31 32 32 32 32 33 33 32 31 30 32 32 33 34 33 31 30 29 29 29 31 32 32 33 32 31 31 33 32 31 30 30 29 29 30 31 32 31 31 30 30 30 29 29 29 30 29 29 30 30 29 29 30 29 29 28 27 26 26 27 28 28 29 30 29 28 28 27 26 26 26 28 28 26 26 26 26 26 27 28 28 28 27 28 29 29 30 30 29 30 30 29 29 28 29 29 30 29 29 29 28 28 29 29 30 29 29 27 26 26 26 26 27 28 29 29 29 29 65 65 65 65 65 65 65 65 64 64 63 63 63 64 63 63 63 63 62 62 62 62 62 62 62 62 61 61 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 62 61 61 61 61 61 61 61 61 60 60 60 60 60 59 58 58 58 59 59 59 59 58 58 59 59 58 58 58 58 58 58 58 59 59 59 59 58 58 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 51 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 48 48 48 48 48 48 48 48 48 47 47 46 46 46 45 45 45 45 45 46 46 46 45 45 45 45 45 44 43 43 43 43 43 43 44 44 43 43 44 45 44 44 45 44 43 43 43 42 42 42 42 42 43 45 46 46 46 45 45 44 44 44 43 44 44 43 43 43 43 42 42 42 42 41 41 42 42 42 43 42 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 39 39 40 40 40 40 42 43 43 43 43 44 44 45 45 45 45 46 46 46 45 45 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 41 42 42 42 41 41 40 40 39 38 39 40 39 38 38 38 37 37 38 38 37 37 37 36 35 34 32 32 32 33 34 35 35 37 37 37 36 36 35 34 33 32 33 34 34 35 36 36 35 35 35 34 34 33 33 33 33 32 32 32 32 32 31 30 30 30 30 30 31 32 33 34 33 32 33 34 33 33 32 32 33 32 31 30 31 32 32 31 30 30 31 32 33 33 32 30 30 31 30 27 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 30 30 31 29 27 27 28 29 29 30 31 31 31 30 30 31 30 29 30 31 31 30 29 31 32 32 32 32 33 32 30 29 29 29 29 28 26 26 27 28 29 29 29 28 29 29 29 30 31 32 33 31 31 32 32 32 31 30 32 32 32 33 33 31 30 29 29 30 31 31 31 32 32 31 31 32 31 30 29 29 29 29 31 32 32 32 31 30 30 29 29 29 29 30 29 29 29 29 29 29 29 30 29 29 28 26 26 26 26 28 29 29 29 28 27 27 26 26 26 27 27 26 26 26 26 26 27 27 27 28 28 29 29 30 31 30 29 30 29 29 28 29 30 30 30 30 29 29 28 28 29 29 29 29 28 27 26 25 25 26 28 29 29 29 29 28 65 65 65 65 65 65 65 65 64 64 63 63 63 64 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 62 62 61 61 62 62 61 60 60 60 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 60 60 60 59 59 58 58 58 58 58 58 58 58 58 58 58 57 57 57 58 58 58 58 58 59 59 58 58 58 58 58 58 58 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 53 53 53 52 52 52 52 51 51 52 52 52 52 52 51 51 52 51 50 49 49 48 48 49 49 49 49 49 50 50 49 49 50 49 49 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 45 45 45 46 46 47 47 47 46 46 46 46 46 45 45 44 43 43 43 43 43 43 43 43 43 44 44 43 44 44 44 43 43 42 42 41 41 42 43 44 45 46 46 46 46 45 44 44 44 44 44 43 43 43 43 43 42 42 42 42 42 42 43 43 43 42 41 42 42 42 42 42 42 43 43 42 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 39 40 40 41 40 41 42 42 42 42 43 43 44 44 44 45 45 46 46 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 41 40 40 40 39 38 39 39 39 38 38 38 38 39 39 38 37 37 37 36 34 33 32 32 32 33 34 35 36 37 36 36 35 35 35 34 32 32 33 34 35 36 35 35 35 35 34 34 34 34 33 33 32 32 31 31 31 31 31 31 30 30 30 31 31 32 33 33 33 34 34 34 34 33 33 33 33 32 32 32 32 32 31 30 30 31 33 33 34 34 33 33 35 34 30 27 26 26 26 26 26 26 26 26 26 27 28 30 31 31 31 30 29 28 27 28 29 29 30 31 31 31 30 30 30 30 29 29 29 30 31 30 30 31 31 31 31 32 32 31 31 31 30 29 29 28 27 27 27 27 29 29 28 28 29 29 30 31 31 32 32 30 31 32 32 32 31 30 31 32 32 33 33 31 30 29 29 30 31 31 32 33 32 31 31 31 30 29 29 29 29 30 32 32 32 32 32 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 29 28 27 26 26 26 27 28 27 27 27 27 27 26 26 26 26 27 26 25 25 26 26 26 26 27 29 29 29 30 31 31 30 29 29 29 28 28 29 29 29 30 29 29 28 27 28 29 29 28 28 27 27 26 25 26 27 28 28 28 28 27 27 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 60 60 61 61 62 62 61 61 61 61 60 60 60 60 60 60 60 61 61 61 61 60 60 60 60 60 60 60 59 59 60 60 60 59 57 57 58 58 58 58 57 57 58 58 57 57 57 57 58 57 57 57 58 58 58 58 58 58 57 57 57 58 57 57 57 56 56 56 56 56 56 56 56 55 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 51 51 50 50 51 50 50 50 49 49 49 49 48 48 48 48 49 49 49 49 49 48 48 48 47 47 47 48 48 48 48 48 48 48 49 49 48 48 48 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 47 47 47 47 47 46 46 46 45 45 45 45 44 44 44 44 44 44 44 45 44 43 43 43 42 42 42 43 42 42 42 43 42 42 42 42 44 45 46 46 46 46 45 44 44 44 43 43 43 44 44 44 43 42 42 42 43 43 43 43 43 43 42 42 43 43 42 42 42 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 39 39 40 41 40 40 41 41 41 42 42 42 43 44 44 44 45 45 45 45 44 44 43 44 44 44 44 44 44 43 43 44 43 43 43 43 43 43 42 41 40 41 41 41 40 40 40 39 38 38 38 39 39 38 39 40 39 38 37 37 37 36 36 35 34 34 32 31 32 33 34 35 36 36 35 34 34 34 34 33 32 33 34 35 35 35 35 35 35 34 34 34 34 34 33 32 32 32 31 30 31 31 31 31 30 29 29 30 31 32 32 33 34 34 33 33 33 34 34 34 33 33 33 33 33 32 31 31 32 33 34 35 34 33 33 33 33 31 28 26 26 26 26 26 26 26 26 26 26 26 28 30 30 31 30 29 28 27 28 29 29 30 31 31 30 30 29 29 30 29 28 29 30 30 29 30 31 31 30 31 32 32 30 30 31 31 29 29 28 27 27 26 28 29 28 27 28 29 29 31 32 31 30 30 30 31 32 32 32 31 30 30 31 32 33 32 31 29 29 29 31 32 33 33 32 31 30 31 31 29 29 29 29 30 31 33 32 31 31 31 30 29 29 29 29 29 28 28 29 28 28 29 28 28 29 29 29 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 26 26 27 28 28 29 29 29 29 30 30 29 28 28 28 27 28 29 29 29 30 29 29 28 27 28 29 28 27 27 26 26 26 26 27 27 27 27 27 27 27 27 65 65 65 65 65 65 65 64 64 64 63 62 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 61 61 61 61 60 60 61 60 60 60 60 60 60 60 60 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 57 57 57 57 57 57 57 58 57 57 57 56 57 57 56 56 56 55 55 55 55 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 51 51 51 51 50 50 51 51 50 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 47 47 48 48 48 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 46 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 42 41 41 41 41 41 41 42 42 42 41 42 44 45 46 46 46 46 45 45 44 44 43 43 44 44 44 44 43 42 42 42 43 43 43 44 44 43 43 43 43 43 42 42 42 43 42 42 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 39 39 40 40 40 40 40 41 41 41 42 43 43 43 43 44 44 45 44 44 44 44 44 43 43 44 43 43 43 43 42 42 42 42 42 43 44 43 42 41 40 40 40 40 40 40 40 40 39 38 38 39 40 39 40 40 38 37 37 37 36 35 35 35 34 34 32 31 31 33 34 35 36 36 35 34 34 34 34 33 32 33 34 34 34 34 35 35 35 35 35 35 35 34 33 32 32 32 32 31 30 30 30 30 30 29 29 29 30 31 32 33 34 34 33 32 33 34 34 34 34 33 33 33 33 33 32 32 33 34 34 34 34 33 32 32 32 31 29 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 30 29 28 27 28 29 29 30 31 31 30 29 29 29 29 28 29 30 29 29 29 30 30 30 31 32 32 31 30 30 30 31 30 30 29 28 26 26 27 28 28 27 28 29 30 31 32 31 29 29 30 31 32 33 33 32 30 30 31 32 32 31 30 29 29 29 30 32 33 33 32 31 30 31 31 29 29 29 30 31 32 33 32 30 30 30 30 29 29 30 30 29 28 28 28 27 27 28 27 27 28 28 29 29 28 27 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 26 26 27 28 28 28 28 28 29 29 30 29 28 28 27 27 28 29 30 29 29 29 28 28 28 28 29 28 27 26 26 25 25 26 27 27 27 27 27 26 27 27 65 65 65 64 64 64 65 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 61 60 60 60 60 60 60 60 60 60 60 60 61 61 60 60 59 59 59 60 60 59 58 58 58 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 52 52 51 51 51 51 51 51 51 51 52 52 52 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 47 47 47 48 48 47 47 47 46 46 46 46 46 47 47 48 47 47 47 46 46 46 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 47 47 46 46 46 46 45 45 45 45 44 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 43 45 45 45 45 45 45 45 44 44 43 43 44 45 44 44 43 43 43 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 39 38 37 37 38 38 38 39 39 39 39 39 40 42 42 42 42 42 42 43 43 44 44 44 43 44 44 44 44 43 42 43 43 43 43 43 42 42 42 42 43 44 44 43 42 41 41 40 40 39 39 39 39 39 38 37 37 38 40 40 40 40 38 37 37 37 36 35 34 34 34 34 32 31 31 33 34 34 35 35 35 34 34 34 34 33 32 32 33 33 33 34 35 35 35 35 34 34 35 34 33 32 32 32 31 31 30 30 30 30 29 29 29 29 29 30 31 32 33 34 33 32 32 33 33 33 33 32 32 33 34 33 34 34 34 34 34 34 33 32 31 31 31 30 29 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 28 27 28 29 29 30 31 31 29 29 29 29 28 28 29 29 29 29 29 29 30 30 32 32 32 31 30 29 29 30 30 30 29 27 26 26 27 28 28 28 29 29 30 30 31 30 29 29 30 31 31 32 33 32 31 30 31 32 32 31 30 29 29 29 30 32 33 32 32 30 30 31 30 29 29 30 31 32 33 32 31 31 31 30 30 31 31 31 30 29 29 29 28 28 28 28 27 27 27 27 28 28 27 27 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 26 26 26 27 28 28 28 28 29 29 29 29 28 27 27 28 29 29 29 29 29 29 27 27 28 29 29 29 28 27 26 25 25 26 26 26 27 27 26 26 27 28 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 61 60 59 59 59 59 60 60 60 60 60 59 60 60 60 59 59 60 60 60 60 61 61 60 59 59 59 59 59 59 59 58 57 58 58 58 59 59 59 58 58 57 57 57 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 57 57 57 56 56 55 55 55 55 55 54 54 54 54 54 53 53 53 53 52 52 52 51 51 51 51 51 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 49 49 49 48 48 48 48 49 49 49 49 49 49 49 48 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 44 43 42 43 43 43 44 43 42 42 43 42 42 42 42 42 42 42 42 41 41 41 42 44 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 40 39 38 37 37 38 38 38 38 39 39 39 40 40 41 42 42 42 42 43 43 44 44 44 43 43 44 44 43 43 43 42 42 42 43 43 42 41 42 42 42 43 44 44 43 42 41 42 41 41 40 39 39 39 38 38 38 37 37 38 40 41 40 39 37 37 37 36 35 34 33 34 34 33 32 31 32 33 33 34 35 35 35 34 33 33 33 33 32 32 33 33 34 35 35 35 35 35 34 34 34 34 33 33 33 31 31 30 30 30 30 30 29 29 29 29 30 31 32 33 33 32 31 32 33 33 32 31 31 32 34 34 33 34 34 34 34 33 33 33 31 30 29 29 29 29 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 28 26 28 29 29 31 31 30 29 29 29 29 28 28 29 29 29 29 29 30 31 31 32 33 32 31 30 29 29 29 29 29 28 27 26 26 27 28 28 27 28 29 30 30 29 29 29 30 30 30 30 32 32 32 31 30 31 32 32 32 31 29 29 29 31 32 32 32 32 30 30 30 29 28 29 30 31 32 33 32 32 32 32 31 31 32 32 31 30 30 30 29 29 29 29 29 27 27 26 26 26 26 26 26 26 26 26 26 26 26 27 27 26 26 26 25 25 25 25 25 25 26 26 27 27 28 28 29 29 29 29 29 29 28 27 28 29 29 29 29 29 29 28 27 27 28 29 29 29 28 27 26 25 25 25 26 26 26 26 26 27 28 29 63 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 60 60 60 59 59 59 60 60 59 59 59 59 60 60 60 60 59 59 59 58 59 59 59 59 58 57 57 58 58 58 58 59 58 58 58 58 57 56 56 56 57 56 56 56 56 57 57 57 57 57 57 57 57 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 53 53 52 52 52 52 52 51 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 49 49 49 49 49 48 48 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 47 47 47 47 47 47 47 47 47 47 47 46 46 47 47 47 46 46 45 45 44 44 42 43 44 45 45 45 45 44 44 44 43 43 44 44 44 44 43 43 42 41 41 41 42 43 43 43 43 44 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 42 43 43 43 43 42 41 41 41 41 41 41 42 42 42 42 41 41 40 40 41 40 39 39 39 38 38 38 38 38 38 38 39 40 41 41 42 42 43 42 42 43 44 44 42 42 42 43 43 43 43 43 43 42 42 42 42 41 41 41 42 42 43 43 44 43 42 42 42 42 41 41 41 40 40 40 40 40 38 37 37 39 40 40 39 37 37 37 36 35 34 34 33 33 33 33 31 31 31 33 34 34 35 35 34 34 33 33 32 31 32 33 33 34 34 35 35 35 35 34 34 34 34 33 33 33 32 32 31 31 31 31 31 30 30 29 29 29 30 32 32 31 30 31 33 33 33 33 31 31 32 33 33 33 34 34 34 34 33 32 33 32 31 30 29 30 30 29 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 26 27 29 30 31 31 30 29 28 29 29 28 28 28 29 29 29 29 30 31 31 31 31 32 31 30 29 29 28 29 28 27 27 26 26 27 27 27 27 28 29 30 29 28 28 29 29 30 30 31 32 33 32 31 30 31 31 31 32 31 29 29 29 30 30 31 32 32 30 30 30 28 28 29 31 31 31 32 33 32 32 32 32 32 32 31 31 31 31 31 30 29 29 29 28 27 27 27 27 26 26 26 27 27 27 27 28 27 27 28 28 27 26 26 26 26 25 25 25 25 25 26 27 27 27 27 28 29 29 29 29 28 27 27 28 29 28 28 28 29 28 27 26 27 28 29 29 29 29 28 27 25 25 25 25 26 26 26 26 27 28 29 63 63 63 63 63 63 63 63 62 62 62 62 61 61 61 61 61 61 60 61 61 60 59 59 58 58 58 59 59 60 60 60 60 59 59 59 59 59 59 59 59 60 60 60 59 59 59 59 58 58 58 58 58 58 57 57 57 57 58 58 58 58 58 58 57 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 54 54 54 53 53 53 52 52 53 53 53 53 53 53 53 53 52 52 53 53 52 52 52 52 52 51 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 49 49 49 49 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 47 47 46 46 46 46 47 47 47 47 46 46 46 47 47 46 46 45 44 43 43 43 44 45 45 46 46 46 45 45 45 44 44 45 46 46 45 45 44 43 43 42 41 41 42 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 42 42 42 43 42 42 42 41 41 41 41 41 41 41 42 41 41 41 41 40 40 40 41 40 40 39 38 37 37 38 38 38 38 40 40 40 41 42 42 43 42 42 42 43 42 41 41 43 43 43 43 43 43 43 42 42 42 42 41 41 42 43 43 43 44 44 44 43 42 42 41 41 41 41 40 40 41 40 40 39 37 37 38 39 40 39 38 37 37 37 36 35 34 33 33 33 32 31 30 31 33 33 34 35 35 35 34 33 32 32 31 31 32 32 33 34 34 34 34 35 35 34 34 34 34 33 32 32 32 32 32 32 32 31 30 30 29 29 29 29 30 31 31 30 31 33 33 33 33 31 30 32 33 32 32 33 33 34 33 33 32 32 32 32 32 31 31 31 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 30 28 29 29 28 27 28 29 29 29 29 30 30 30 30 31 32 32 30 29 29 28 27 27 27 26 26 26 26 26 26 27 28 29 30 28 28 28 29 29 30 30 31 32 32 32 31 30 30 31 32 32 31 30 29 29 30 31 32 32 31 30 30 30 28 28 29 31 32 32 32 32 32 32 33 33 32 32 31 31 31 31 31 30 29 29 28 27 27 28 28 28 28 27 27 28 28 28 28 29 28 28 29 28 27 27 27 27 26 26 25 25 25 25 26 26 27 27 27 28 29 29 29 28 27 26 26 28 28 27 27 27 28 27 26 27 27 28 29 29 29 29 29 28 26 25 24 25 25 25 26 26 27 28 28 62 62 62 63 63 63 63 63 62 62 62 62 61 61 61 61 61 60 60 60 60 59 58 58 58 57 58 59 59 59 60 60 60 59 58 58 58 58 58 58 59 59 60 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 58 58 57 57 57 57 56 56 56 56 56 56 55 55 56 56 57 57 56 56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 54 53 53 53 53 53 53 53 54 53 53 53 53 53 52 52 53 53 52 52 52 52 52 51 50 50 50 50 50 49 49 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 43 43 44 45 45 46 46 46 46 46 46 46 45 45 44 45 46 47 46 45 44 44 43 43 42 41 40 41 43 43 44 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 43 43 44 44 44 43 43 44 43 43 43 42 42 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 40 40 39 38 37 37 37 38 38 39 40 40 40 41 42 43 43 42 42 42 42 41 41 42 43 43 43 43 43 43 43 42 41 41 41 41 41 42 43 43 44 44 44 43 43 42 41 41 41 40 40 39 39 40 40 40 39 37 36 37 39 39 39 39 38 37 37 36 35 34 34 33 32 32 32 31 31 31 32 33 34 35 35 33 33 33 32 31 31 31 32 32 32 32 32 33 34 35 35 35 34 34 33 32 32 32 33 33 32 32 31 30 30 29 29 29 29 29 30 30 29 30 32 32 32 32 30 30 32 32 31 31 32 33 33 33 32 32 31 32 33 33 32 32 32 30 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 29 28 29 28 27 27 28 29 29 29 29 30 30 30 31 32 32 32 30 29 29 28 28 27 26 26 26 26 26 26 26 27 28 28 28 28 28 29 30 30 31 31 32 32 32 32 32 31 29 30 32 32 31 30 29 28 30 31 32 32 30 29 30 30 28 28 29 31 32 31 31 31 32 32 33 33 32 32 31 30 30 31 30 29 29 29 28 27 28 29 29 29 28 27 27 28 29 29 29 29 29 29 29 28 27 28 28 27 27 26 26 26 25 25 25 26 27 28 28 28 29 29 28 27 27 26 26 27 27 27 27 27 26 26 26 27 27 28 29 28 28 28 28 28 27 26 24 24 24 25 26 26 27 28 29 61 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 59 59 58 58 57 57 58 59 59 59 60 60 60 59 58 58 57 57 57 57 58 59 59 59 58 58 58 58 58 57 57 57 58 58 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 56 56 55 55 56 56 56 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 53 53 53 53 54 54 54 53 53 53 53 52 52 53 53 53 53 52 52 52 51 51 51 51 50 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 45 45 45 45 46 46 46 46 45 45 44 45 45 45 45 45 45 45 44 44 44 43 43 44 45 45 45 46 47 47 47 47 46 46 46 46 46 46 46 47 46 45 45 44 44 44 43 42 40 41 43 43 43 44 43 43 43 43 44 44 44 44 44 44 44 43 43 43 44 44 44 43 43 44 43 43 43 43 44 43 43 43 42 42 43 43 42 41 42 42 41 41 41 41 40 40 40 40 40 41 41 41 41 41 41 40 39 39 40 40 39 39 38 37 37 37 37 38 39 40 40 40 41 42 42 42 41 41 42 41 41 42 43 43 42 42 42 42 42 42 41 41 40 40 41 42 43 43 43 44 44 44 44 43 42 42 41 40 40 40 39 39 40 40 40 39 38 37 36 38 39 39 38 38 37 37 36 35 34 33 33 33 33 33 33 32 31 30 32 34 35 35 34 32 32 32 31 30 30 31 31 31 31 32 33 34 34 35 35 34 34 33 33 32 33 34 33 32 32 31 31 30 30 30 29 29 29 29 29 29 30 31 31 32 31 29 30 31 31 30 31 32 33 33 34 32 31 31 31 33 33 33 33 32 31 30 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 29 28 27 27 28 29 30 30 30 30 29 29 30 30 31 32 31 30 29 29 29 28 27 27 26 26 26 26 26 27 27 27 27 27 28 28 29 30 31 31 31 32 31 31 33 33 31 29 30 31 32 31 30 29 28 29 30 32 32 31 29 29 29 28 28 29 31 32 31 30 31 32 32 32 32 32 32 31 30 30 30 30 29 29 29 29 28 28 29 29 29 29 28 27 28 30 30 30 30 30 29 28 27 27 28 28 28 28 28 27 26 25 25 25 27 28 29 29 29 29 28 29 28 27 26 26 27 27 26 26 26 26 26 27 27 27 27 28 27 28 28 27 27 26 26 25 24 24 25 26 27 28 29 28 61 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 59 59 59 59 58 58 57 57 58 59 59 59 59 59 59 58 57 57 57 57 57 59 59 59 59 58 58 58 58 57 57 56 57 58 58 57 56 56 56 57 57 57 57 56 56 56 55 54 54 55 55 55 55 55 55 55 56 56 56 56 55 55 55 55 55 55 55 55 55 56 56 56 55 55 55 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 54 55 55 54 54 54 53 53 53 53 53 53 53 52 52 52 52 51 51 51 50 50 50 50 49 49 50 51 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 46 45 45 44 44 44 45 45 44 44 44 43 43 44 44 44 44 44 44 44 44 44 43 43 44 45 45 45 46 47 47 47 47 47 47 47 47 46 46 47 47 46 46 46 45 44 43 43 42 40 40 42 43 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 41 41 41 42 42 41 41 41 40 40 40 40 40 41 41 41 41 41 41 40 39 39 39 40 39 38 38 38 37 37 37 38 39 39 39 40 41 42 42 41 41 41 41 41 40 41 43 42 41 41 42 41 41 40 40 40 40 41 42 43 43 43 43 43 43 43 43 43 43 42 42 41 40 40 39 39 39 39 40 40 39 38 36 36 38 38 38 37 36 36 35 34 33 33 33 34 35 36 35 34 33 31 30 32 34 34 34 33 32 31 30 30 30 30 30 29 29 31 32 33 34 34 34 34 34 34 33 33 33 34 34 33 32 31 31 31 30 30 29 29 28 29 29 30 31 31 31 31 30 29 29 31 31 30 31 32 32 32 33 32 32 31 31 33 33 33 33 32 32 31 30 30 29 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 27 27 28 29 29 29 31 31 29 29 30 31 31 31 32 31 31 30 29 28 28 28 27 27 26 26 26 27 28 28 28 28 29 29 29 30 30 31 30 31 31 30 31 32 32 31 29 29 30 31 31 29 29 28 28 30 32 32 32 30 29 29 28 28 29 30 32 31 31 31 32 32 32 31 31 32 31 30 30 30 30 30 30 29 29 28 28 29 29 30 30 29 27 28 29 29 29 30 30 29 28 27 28 29 29 28 28 28 27 26 25 25 25 27 28 29 29 29 28 27 28 29 28 27 26 26 26 26 26 25 26 27 27 27 27 26 27 27 27 27 26 26 26 26 25 24 24 25 27 28 28 28 27 60 61 61 61 61 61 61 61 62 61 61 61 61 61 61 61 61 61 60 60 59 59 59 59 58 57 57 57 58 58 59 59 59 59 58 57 56 56 57 57 58 59 58 59 58 58 58 57 57 57 56 56 57 57 57 56 55 56 57 57 56 56 56 56 55 54 54 54 54 55 55 54 54 54 55 55 56 56 56 55 55 55 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 53 54 54 55 55 54 54 54 54 53 53 53 52 52 52 52 52 52 52 51 51 51 50 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 44 44 44 43 44 44 45 46 46 45 45 46 45 44 44 45 46 46 46 46 46 47 47 47 47 47 46 46 47 47 47 47 46 46 46 45 44 43 43 42 41 40 41 42 42 43 42 42 43 43 43 44 44 44 44 43 43 42 42 43 43 43 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 41 40 40 39 39 39 39 38 38 38 37 37 37 37 38 39 40 41 41 42 41 40 40 41 41 40 39 41 42 41 41 42 41 41 40 40 40 40 41 42 43 43 42 43 43 43 43 43 43 43 43 43 42 42 40 40 40 39 39 39 40 40 39 38 37 36 37 37 38 37 37 35 34 33 33 34 34 34 35 36 35 34 34 33 31 31 32 32 33 32 31 30 30 30 30 30 30 30 30 30 31 32 33 33 32 33 33 33 32 33 33 33 33 33 32 32 31 31 30 30 29 29 29 28 29 30 30 30 30 30 30 29 29 30 30 30 30 31 31 32 33 32 31 30 31 33 33 32 32 31 31 31 31 30 30 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 29 30 30 29 29 30 31 31 32 32 31 31 30 29 29 29 29 28 28 26 26 26 28 28 28 29 29 29 29 30 30 30 30 30 31 30 29 31 31 31 31 30 29 30 31 31 29 28 28 28 30 31 31 32 31 30 29 28 28 28 29 31 30 30 31 31 31 32 31 30 31 31 31 30 29 29 30 29 29 29 28 28 29 30 30 30 29 28 28 28 29 29 30 30 29 28 28 29 30 29 28 27 27 27 26 25 25 26 26 27 28 29 28 27 27 27 28 28 28 27 26 26 26 25 25 26 26 26 27 27 26 26 27 27 27 26 25 25 25 25 24 24 25 27 27 27 27 26 60 60 61 61 60 60 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 58 58 57 57 57 58 58 58 59 58 58 57 56 56 56 57 58 58 58 58 58 58 58 58 57 56 56 56 56 57 56 56 55 55 56 56 56 56 56 55 55 54 54 54 54 54 54 54 54 54 55 55 55 56 56 55 55 55 54 54 54 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 54 54 54 54 55 55 55 55 54 54 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 51 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 44 45 45 46 45 45 45 46 46 46 47 46 46 46 46 46 45 46 46 46 46 46 46 47 47 47 47 46 46 46 46 47 47 46 46 46 46 45 44 43 43 42 41 40 40 41 42 42 42 42 42 42 43 44 44 44 43 43 43 42 42 42 43 43 44 43 43 43 43 42 42 42 42 42 43 42 41 42 42 42 42 41 41 41 41 41 42 41 41 41 41 40 40 40 39 40 40 40 40 40 40 40 39 39 39 39 38 38 37 37 37 38 39 39 40 41 41 41 40 40 40 40 40 39 39 40 41 41 42 42 41 40 40 40 41 41 41 42 42 42 42 42 42 42 42 42 42 43 43 43 42 41 40 40 39 39 39 39 39 40 39 38 37 37 36 37 38 38 37 36 35 34 35 35 35 34 35 36 35 34 34 33 32 31 30 30 31 31 30 30 31 30 30 30 31 32 31 30 29 30 31 31 31 32 32 32 32 32 32 31 32 33 32 32 32 31 31 30 30 30 29 28 28 29 29 30 30 30 30 29 29 30 29 29 30 30 30 32 33 32 31 30 30 32 33 32 31 31 30 30 30 30 30 30 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 29 28 28 29 29 30 31 30 31 31 30 29 30 30 30 29 29 28 27 26 26 27 27 27 27 28 29 29 30 30 29 29 30 30 29 29 30 30 31 32 31 29 29 30 30 29 28 28 28 30 31 31 32 31 30 29 29 28 28 29 29 29 30 30 30 31 32 31 30 30 31 30 29 29 29 29 29 28 28 28 28 29 30 31 31 30 29 29 28 29 29 30 30 29 29 29 29 30 29 28 28 29 28 27 26 26 25 26 27 28 29 28 27 26 26 27 28 28 28 27 27 26 26 26 26 25 25 26 26 26 26 27 27 26 25 24 24 24 24 24 25 26 27 27 27 26 26 60 59 60 60 60 60 60 60 60 60 60 60 60 60 59 59 60 60 59 59 59 59 58 58 58 58 57 57 57 57 58 58 59 58 57 56 55 56 57 57 58 58 57 57 58 58 58 58 57 56 56 55 56 57 56 55 54 54 55 56 56 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 54 54 54 54 54 54 54 54 55 55 55 54 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 47 47 46 45 45 46 45 45 46 46 46 46 45 46 46 46 46 45 45 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 46 45 45 45 45 44 44 43 43 42 40 40 40 41 41 41 42 42 41 42 43 44 44 43 43 42 42 42 42 42 43 43 43 43 42 42 42 42 42 42 42 42 42 41 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 40 40 40 40 39 39 39 38 38 38 37 37 38 39 40 40 40 41 41 41 40 40 40 40 39 39 40 41 41 41 41 41 40 39 40 41 41 41 42 41 41 41 41 42 42 42 42 43 43 42 43 43 42 41 41 40 39 39 39 38 38 39 39 39 38 37 36 36 37 37 37 37 36 35 35 36 36 36 36 36 35 34 34 34 33 32 31 31 31 31 31 32 32 32 32 32 33 32 32 31 30 30 29 29 29 30 31 31 31 31 30 30 31 32 31 32 32 32 31 31 30 30 29 29 28 28 29 29 29 29 29 29 29 30 29 29 29 30 31 31 31 32 31 30 30 31 32 32 32 31 30 30 30 29 30 30 30 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 28 27 28 29 29 30 30 30 31 32 32 31 31 30 30 30 29 29 28 27 26 26 26 26 27 28 29 29 29 29 29 29 29 29 29 30 30 29 30 31 31 30 29 29 28 28 28 28 28 30 31 31 31 31 30 29 29 28 28 28 29 30 31 30 31 31 31 32 31 30 30 29 29 29 29 29 29 29 29 29 29 29 30 31 31 30 29 29 29 29 30 30 29 29 29 29 29 29 29 29 28 28 27 26 25 25 25 26 27 28 28 28 27 26 26 27 27 27 28 28 27 27 27 27 27 26 25 25 26 26 26 26 26 26 25 24 24 24 24 24 26 27 26 26 26 26 26 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 58 58 57 57 57 57 58 58 58 58 57 55 55 56 57 57 57 57 57 57 57 57 57 57 57 56 55 55 55 56 56 55 54 54 55 56 56 55 55 55 54 54 53 54 54 54 54 53 54 54 54 54 54 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 54 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 47 47 47 47 47 47 47 47 47 46 46 46 47 47 46 47 47 47 46 46 47 47 46 45 45 45 46 46 46 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 46 46 46 46 46 45 44 45 45 45 45 45 45 45 44 44 43 43 42 41 40 40 40 40 40 41 41 42 42 43 43 43 43 43 42 42 42 41 42 42 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 40 40 40 40 40 39 39 38 38 38 37 37 37 39 40 40 39 40 41 40 40 39 39 38 38 39 41 41 41 41 41 40 39 39 40 41 41 41 41 41 40 40 41 42 43 43 44 44 44 43 43 43 42 41 41 40 40 40 39 38 37 38 39 40 39 38 36 36 37 37 37 37 37 37 36 37 37 37 37 36 36 35 35 34 34 34 34 34 33 32 33 33 33 33 34 34 33 33 33 32 32 31 29 29 29 29 29 29 29 29 29 29 30 31 30 31 32 32 31 30 30 30 30 29 29 29 28 28 28 28 28 28 28 29 29 29 29 30 31 30 30 31 31 30 29 30 31 32 32 31 30 31 31 29 29 29 30 29 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 28 28 29 29 29 30 30 31 32 32 31 30 29 29 29 29 28 28 27 26 26 26 26 27 28 29 29 28 28 28 29 29 28 29 30 29 29 29 29 30 30 30 29 28 28 28 28 29 30 30 30 31 31 31 29 29 28 28 28 28 29 30 30 30 30 30 31 31 30 30 30 29 30 31 30 30 30 30 29 29 29 30 30 30 29 29 29 29 29 30 30 29 29 29 30 30 29 29 29 28 27 27 26 25 24 25 26 27 27 26 26 26 25 26 26 27 27 28 28 28 28 28 26 26 26 25 25 26 25 25 26 25 25 24 24 24 24 24 26 27 26 26 26 26 26 27 59 59 59 59 59 59 59 58 58 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 56 57 57 57 57 57 57 57 55 55 56 56 57 57 56 57 57 57 56 57 57 57 57 55 55 55 55 56 55 54 54 55 55 55 55 55 54 54 54 53 53 54 54 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 54 54 54 53 53 53 53 53 54 54 54 54 53 54 54 53 53 53 53 53 53 53 54 54 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 47 48 48 48 48 47 47 48 48 47 46 47 48 48 47 47 47 47 46 46 46 46 45 45 45 46 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 45 45 45 45 45 45 44 43 43 43 43 42 41 40 40 40 40 40 41 42 43 43 43 43 43 42 41 42 41 41 41 42 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 41 41 41 41 40 40 41 41 41 41 41 40 40 39 40 40 40 40 39 39 38 37 37 37 37 37 37 37 38 38 39 40 40 40 39 38 38 39 40 40 40 40 40 40 40 39 39 40 41 41 41 40 40 40 40 40 41 42 43 43 44 44 44 44 43 43 42 42 42 41 40 40 39 38 37 37 38 39 38 37 37 36 35 36 36 36 37 38 37 37 38 38 37 37 37 36 35 34 34 34 35 35 34 32 32 33 34 34 33 33 32 32 32 32 32 31 31 31 30 29 30 30 29 30 29 29 29 29 29 31 32 32 31 30 29 29 30 30 30 29 29 28 28 28 28 27 27 27 28 29 29 29 29 29 30 31 30 30 29 29 30 31 31 32 32 32 31 30 29 28 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 29 29 29 30 31 31 32 32 32 31 30 29 29 29 28 27 27 26 26 26 26 26 26 28 28 28 28 28 28 29 28 28 29 29 29 29 29 29 29 31 31 29 28 27 27 28 29 30 29 29 31 32 31 29 29 28 27 27 28 29 29 29 30 30 30 30 31 31 30 30 31 31 32 31 31 30 30 29 29 29 30 30 30 29 29 30 30 30 30 30 29 29 30 30 31 30 30 30 28 28 28 27 26 25 25 26 26 26 26 25 24 25 25 26 27 27 27 29 29 28 28 27 26 26 25 25 26 25 26 26 24 24 24 24 24 25 25 26 27 26 26 26 26 26 27 58 58 58 58 58 58 58 57 58 58 58 58 58 58 58 58 58 57 57 57 56 56 56 56 56 57 56 56 56 56 57 57 57 56 56 55 54 55 56 56 56 55 56 57 55 55 56 56 56 56 55 54 54 55 56 55 54 54 54 55 55 55 55 54 54 54 53 53 53 53 53 52 53 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 48 48 49 49 48 48 48 48 48 47 47 48 48 49 48 48 48 47 47 47 46 45 45 46 47 47 47 47 48 48 48 47 47 47 46 45 44 44 44 44 44 45 46 45 45 45 44 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 42 41 42 41 40 40 40 41 42 42 42 42 42 42 41 41 41 41 41 41 42 42 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 41 40 40 40 41 41 41 40 40 40 40 41 40 40 40 39 39 39 39 40 39 38 37 37 37 37 37 37 37 37 37 37 37 38 38 39 40 39 38 39 40 40 40 40 40 39 39 39 39 40 41 40 40 40 40 40 40 41 41 42 43 43 43 43 44 44 44 44 43 43 43 42 41 40 40 39 38 38 37 36 37 37 37 37 36 35 35 35 35 36 37 38 38 38 38 38 38 37 36 35 35 35 35 35 34 34 33 32 33 34 34 33 31 31 30 30 31 31 32 32 32 31 31 31 31 31 31 30 29 29 28 29 30 31 31 31 29 29 29 29 29 29 30 30 30 29 29 29 28 28 27 27 28 28 28 28 29 30 30 30 29 29 29 30 30 32 32 33 33 31 30 30 29 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 31 30 31 32 32 32 32 32 30 29 29 30 29 28 28 27 26 26 26 26 26 26 28 28 28 29 28 28 28 27 28 28 28 28 29 29 29 30 31 31 29 28 27 27 28 29 29 29 29 31 32 31 30 29 28 28 27 28 29 29 29 30 31 31 31 31 32 31 31 32 32 32 32 31 31 30 29 29 30 30 31 31 30 31 31 31 31 31 31 30 30 30 30 31 30 30 30 29 29 28 27 26 25 25 25 25 25 24 24 24 24 25 26 26 26 27 28 29 28 28 27 26 25 25 25 25 25 25 25 24 24 25 25 26 26 26 26 27 26 25 26 26 26 27 57 57 57 57 57 57 57 57 57 57 57 58 58 58 57 57 57 57 56 56 56 55 55 55 55 56 56 55 55 56 56 57 56 55 55 54 54 55 55 54 55 54 55 55 54 54 54 54 54 55 55 54 54 55 55 55 54 53 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 53 53 53 54 54 54 54 54 53 53 53 54 54 54 53 53 53 53 53 53 53 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 49 49 49 48 48 49 49 49 48 48 48 49 49 48 48 48 47 47 46 46 46 46 47 47 48 48 48 47 47 47 47 47 46 46 45 45 44 44 44 44 45 45 45 45 45 44 44 44 45 45 44 43 44 44 44 44 44 44 44 43 43 43 42 42 43 42 41 40 40 40 40 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 39 38 38 39 39 39 38 37 37 38 38 38 39 39 38 38 37 37 37 37 38 39 39 38 38 39 39 39 39 39 38 38 39 40 41 40 39 39 39 40 41 41 42 42 42 43 43 43 43 44 44 44 44 43 43 43 42 41 41 41 40 39 38 37 36 36 36 36 36 36 35 35 35 35 36 37 38 38 38 38 38 38 37 37 36 36 36 35 34 34 34 33 33 33 33 33 32 30 30 29 29 29 29 30 31 31 32 32 32 32 32 31 31 30 29 29 28 28 29 29 30 29 28 28 28 28 29 30 31 30 30 30 29 29 29 29 27 27 27 27 27 28 29 29 29 29 29 29 30 31 32 32 32 32 32 31 30 29 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 29 31 31 31 31 32 31 31 32 32 30 29 29 29 29 29 28 27 26 26 26 26 26 27 28 27 28 28 27 27 27 27 27 28 28 28 29 29 30 31 31 31 30 29 27 27 27 28 28 29 30 31 32 31 30 29 29 28 28 28 29 29 30 31 32 32 32 33 32 32 32 32 32 31 31 32 31 30 29 29 30 31 31 31 31 32 32 32 32 31 32 31 30 30 30 30 30 29 30 29 28 26 26 25 24 24 24 24 24 25 25 24 24 25 26 25 25 26 28 29 28 28 27 26 26 26 25 24 25 25 24 24 25 26 26 27 26 26 26 26 25 26 26 26 26 27 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 54 54 54 55 54 54 55 55 55 55 55 54 54 53 54 54 53 53 53 53 53 53 53 53 53 54 54 54 54 53 54 54 54 53 53 53 53 53 54 54 53 53 53 53 52 52 53 53 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 54 53 53 53 52 52 53 53 52 52 53 53 53 53 53 53 53 52 52 53 53 52 52 52 52 53 52 52 53 53 53 53 54 54 54 54 53 53 54 54 53 53 53 53 53 52 52 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 49 49 49 49 49 49 49 48 48 48 49 49 49 49 48 48 47 47 46 46 47 47 48 48 48 48 47 47 46 46 47 46 46 46 46 46 45 45 44 44 44 44 44 45 45 45 44 43 44 44 44 43 43 44 43 43 44 43 43 43 42 42 42 42 43 43 42 41 41 39 39 40 40 41 41 41 40 41 41 42 43 43 43 43 44 43 43 43 42 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 41 41 41 40 39 40 40 40 39 39 39 38 38 38 38 38 38 37 38 39 39 39 40 40 39 38 38 37 37 37 37 38 38 37 38 38 38 38 38 38 39 39 40 40 40 39 39 40 40 41 41 42 42 43 43 43 43 44 44 44 45 44 43 43 42 42 42 42 41 41 40 39 38 37 36 37 36 36 36 36 36 36 35 35 36 37 38 37 37 38 38 38 37 37 36 35 35 34 34 34 34 33 33 32 31 31 30 29 29 29 29 29 29 29 29 30 30 31 32 32 31 30 31 30 30 29 29 28 28 28 28 28 28 28 27 28 29 29 30 31 31 31 30 30 30 30 29 28 28 27 27 27 27 28 29 28 28 29 31 31 30 30 30 31 32 31 30 30 29 28 28 27 26 26 26 26 26 26 25 24 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 30 31 31 31 32 31 31 32 31 30 29 29 28 28 29 28 26 26 26 26 26 26 28 28 27 27 27 27 27 28 28 28 28 29 29 30 30 31 31 31 31 30 29 28 27 27 28 29 30 30 31 32 31 30 29 29 28 27 28 29 30 31 31 31 32 32 33 33 33 32 32 32 31 31 31 31 30 30 30 31 31 31 32 32 32 32 32 32 31 31 31 30 30 29 29 29 28 28 28 27 25 25 25 25 25 25 25 26 26 26 25 24 24 25 24 25 26 27 28 28 28 28 28 27 26 25 24 24 24 24 24 26 26 26 27 26 25 25 24 25 26 27 27 27 27 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 52 52 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 53 52 52 52 52 52 52 51 52 52 52 52 52 53 53 53 54 54 53 53 53 52 53 53 53 53 53 53 53 53 52 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 48 48 48 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 48 47 47 47 47 48 48 49 49 48 47 47 46 46 46 46 46 46 46 46 45 46 46 45 43 43 43 44 44 44 45 45 44 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 42 42 42 42 41 40 40 39 39 40 40 40 40 41 42 43 44 43 43 44 44 43 42 42 42 42 42 43 43 43 43 43 42 41 42 42 41 40 40 40 40 40 40 40 40 40 39 40 40 39 39 39 38 38 38 38 38 38 38 38 40 40 40 40 40 39 39 39 39 38 37 37 37 38 37 38 39 39 39 39 39 40 40 39 39 39 39 40 41 41 41 42 43 43 43 44 44 45 45 45 45 45 44 44 43 42 41 41 41 41 41 40 40 38 37 38 39 38 38 37 37 37 36 35 35 36 37 38 37 36 37 38 38 37 37 36 35 35 35 34 34 33 33 33 31 30 30 29 29 30 31 31 31 30 29 29 29 29 29 30 30 30 29 29 29 29 29 30 30 30 29 29 28 29 29 28 27 28 28 29 30 31 31 30 30 30 30 30 29 29 29 28 27 27 27 28 27 28 29 30 30 29 29 29 30 30 31 30 30 29 29 29 28 26 26 26 26 26 25 23 22 23 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 31 31 31 32 31 31 30 29 28 27 28 27 26 26 26 26 26 26 27 27 26 26 27 27 28 28 29 29 29 29 29 29 31 31 31 31 32 31 29 28 27 27 28 29 30 31 31 32 31 30 29 29 28 27 28 29 31 31 30 30 31 31 32 32 33 32 32 32 31 31 31 31 31 30 31 32 32 32 32 32 32 32 32 32 31 31 31 30 30 29 28 28 27 27 27 27 26 27 27 26 26 26 26 27 26 26 26 25 25 24 24 25 25 26 26 27 28 28 27 26 25 24 25 25 24 24 25 26 26 26 27 25 24 24 25 26 26 27 27 27 27 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 52 52 51 51 51 52 51 51 52 52 52 53 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 49 50 50 50 50 49 49 49 48 48 49 49 48 48 48 48 48 47 47 47 47 48 49 49 48 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 44 44 45 45 44 44 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 40 40 41 41 41 40 40 40 39 39 39 39 39 40 41 42 43 42 43 43 44 43 43 43 43 43 43 43 43 44 44 43 43 42 42 42 41 41 40 40 39 39 39 40 40 40 39 39 40 40 39 38 38 38 38 38 39 39 38 38 40 40 40 41 40 40 40 40 39 38 37 37 37 37 38 39 39 40 40 40 40 39 39 39 39 39 40 41 41 42 43 43 43 44 44 44 45 45 45 46 46 45 44 44 43 42 41 41 40 40 40 40 39 38 38 39 40 39 38 37 37 36 35 34 34 36 37 38 37 36 36 37 38 38 37 36 35 34 34 33 33 32 31 31 31 30 30 30 30 31 33 33 32 31 30 29 29 29 29 29 29 29 29 28 28 28 29 30 30 30 30 30 30 30 30 29 28 27 27 28 29 29 30 30 30 30 30 30 30 30 29 29 28 27 27 27 27 28 29 29 29 29 29 29 29 29 30 31 30 30 30 29 28 26 26 26 26 26 25 24 22 22 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 30 30 31 31 31 31 31 30 29 29 28 27 27 26 26 26 26 27 27 27 26 27 27 27 27 27 27 28 28 28 28 29 29 30 30 29 31 31 31 29 28 27 27 28 29 29 30 31 31 32 31 30 29 28 27 28 29 30 30 30 30 31 31 32 32 33 32 32 32 32 32 31 30 30 30 31 31 31 32 32 33 32 31 31 32 31 30 31 31 30 30 29 28 28 27 27 26 27 28 28 27 27 26 27 27 26 27 27 27 27 25 24 24 24 25 27 27 27 26 26 26 25 24 25 25 24 24 26 26 27 26 26 25 24 25 26 26 26 27 27 26 26 57 57 57 57 57 58 58 57 57 57 57 57 57 57 56 56 57 57 56 56 56 56 56 56 55 55 55 54 54 53 53 53 53 53 53 53 53 53 54 53 53 54 54 54 54 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 51 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 48 48 48 49 49 49 49 50 50 50 50 50 49 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 47 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 44 44 45 44 44 43 43 43 42 42 43 42 41 41 41 41 42 42 42 42 42 41 40 40 40 40 40 39 39 40 39 39 40 39 39 40 40 41 42 42 43 43 43 43 43 43 43 44 44 45 45 44 43 43 42 43 42 41 41 40 39 39 39 39 40 40 39 39 39 39 39 38 38 39 39 40 40 40 39 38 40 41 41 41 41 40 40 40 39 38 37 37 37 37 38 38 39 40 40 39 39 38 38 39 40 40 41 41 42 43 43 43 43 44 44 44 44 45 45 46 46 45 44 43 43 42 42 42 42 41 40 39 38 38 39 40 40 39 38 37 37 36 35 35 34 35 37 37 37 36 35 36 37 37 36 35 34 34 33 32 32 31 30 30 30 30 30 30 31 33 33 31 30 30 30 30 30 29 29 29 29 29 29 29 28 28 28 28 28 28 28 30 30 29 29 28 27 27 27 27 27 28 29 29 29 29 29 29 29 29 30 29 29 28 28 28 27 27 28 28 28 28 29 28 28 29 30 30 30 30 30 29 28 26 26 26 26 26 26 26 24 24 26 26 26 26 26 26 26 26 26 26 26 26 26 27 30 31 32 32 31 29 30 31 30 30 31 31 30 30 29 28 28 27 26 26 26 27 28 28 27 26 26 27 27 27 27 27 27 27 28 29 29 29 29 29 29 31 31 31 30 28 27 27 28 28 29 30 30 30 31 31 30 29 28 27 28 29 29 30 30 31 31 32 32 32 33 32 32 32 32 32 31 31 30 30 30 30 31 32 32 32 31 31 31 32 31 30 30 31 31 31 30 30 29 28 27 27 27 28 29 28 27 27 27 27 28 28 29 28 27 26 25 25 24 25 27 27 26 26 26 26 26 24 24 25 24 24 25 26 26 26 25 24 24 24 25 25 26 26 26 26 26 58 58 58 58 58 59 59 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 57 56 56 56 56 56 55 54 54 54 54 54 55 55 54 54 55 54 54 55 55 55 55 54 54 54 53 52 52 51 51 51 51 51 51 51 52 52 53 54 54 54 54 54 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 51 50 50 51 51 51 52 51 51 52 51 51 51 51 51 51 51 51 52 51 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 48 48 49 50 49 49 50 50 50 50 49 49 48 48 48 48 48 48 49 49 49 49 48 48 48 48 49 49 48 48 48 48 47 47 46 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 43 42 42 41 41 42 43 42 42 43 43 44 44 44 42 41 41 41 40 40 40 41 41 41 41 41 40 39 38 39 39 40 41 41 41 42 43 43 43 44 44 44 45 45 45 44 43 43 43 43 42 41 40 40 39 39 39 39 40 39 39 39 38 38 39 40 40 40 40 40 40 39 39 40 41 41 41 41 40 40 40 39 39 38 37 37 37 37 38 39 39 39 38 38 39 39 40 41 41 41 42 42 42 43 43 44 44 45 45 45 45 46 46 46 45 44 43 43 43 43 43 43 42 41 39 39 39 40 40 40 39 38 37 37 36 35 35 34 34 36 37 37 36 35 35 36 36 35 35 34 34 33 32 32 31 30 30 30 30 30 32 33 33 32 31 31 31 31 31 30 30 29 29 30 31 30 29 29 29 28 28 29 28 28 28 28 28 27 27 27 28 27 27 27 27 27 28 28 28 28 29 29 29 29 29 29 29 29 28 27 27 26 27 27 28 28 28 28 29 30 29 29 29 30 29 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 30 32 31 31 32 31 29 29 30 30 31 31 30 30 29 29 28 28 27 26 26 26 26 27 28 27 26 26 26 26 28 29 29 28 28 29 30 30 30 30 30 30 31 32 31 30 29 27 27 27 28 29 30 30 31 31 31 30 29 28 28 28 29 29 30 31 32 32 31 31 32 32 32 32 32 31 31 32 31 30 30 30 31 31 32 32 32 31 31 31 31 30 29 29 30 31 31 29 29 28 28 28 28 28 28 29 28 27 27 27 28 29 29 29 28 27 26 26 26 25 24 25 26 25 24 24 25 25 24 24 25 24 23 24 25 26 26 25 24 24 24 24 25 26 26 26 26 25 59 59 59 59 59 59 59 58 58 59 59 59 58 59 59 58 58 58 58 59 58 58 57 57 57 57 57 56 56 56 56 55 55 56 56 55 54 54 55 55 55 56 55 55 55 55 55 54 54 53 53 53 52 52 52 52 53 53 53 54 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 52 52 51 51 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 50 49 49 49 49 48 48 49 49 49 49 49 49 49 49 48 48 49 48 48 47 47 47 47 47 47 46 46 45 44 44 44 44 44 44 44 45 44 44 44 44 43 43 44 43 43 43 42 42 42 41 42 42 43 43 43 43 43 45 45 45 44 43 43 42 42 42 42 42 42 42 42 42 41 40 40 39 39 38 39 39 40 41 42 43 43 43 44 44 45 45 45 45 44 44 44 43 43 42 41 41 40 39 39 39 39 39 39 39 38 38 39 40 41 41 41 41 41 41 40 40 40 41 41 41 41 40 40 40 40 39 39 38 37 37 37 38 38 38 38 38 39 40 41 41 42 42 41 42 42 42 43 43 43 44 44 44 45 45 46 46 45 45 44 43 44 44 44 43 43 42 41 40 41 41 40 40 39 38 38 37 37 36 36 35 34 34 35 36 37 37 36 35 35 35 35 35 34 34 32 32 32 31 30 30 30 30 32 33 33 32 32 32 33 33 33 32 32 31 30 29 30 32 31 31 31 30 29 30 31 30 29 29 29 29 28 28 29 30 29 27 27 27 27 27 27 27 27 28 28 28 28 29 29 29 29 28 28 28 27 26 26 27 27 27 28 29 29 29 28 28 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 29 32 31 30 31 32 30 29 29 29 30 31 31 31 29 29 29 28 27 27 27 27 27 26 27 27 26 26 26 27 28 29 30 29 28 28 29 29 30 31 31 31 32 32 32 31 30 29 28 27 27 28 29 30 31 32 32 31 30 29 28 27 29 29 29 30 31 32 32 31 31 32 32 32 32 32 31 30 31 31 30 30 31 32 32 32 32 32 32 31 31 30 29 29 29 30 31 31 29 29 28 28 29 29 29 29 29 29 28 28 28 28 29 29 29 28 27 27 27 26 25 25 24 24 24 23 23 24 24 23 23 24 24 23 23 24 25 25 25 24 24 24 24 25 25 25 25 25 25 59 59 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 56 57 56 56 57 57 56 55 54 55 55 55 56 55 55 56 55 55 55 55 54 54 54 53 53 54 54 55 54 54 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 53 53 52 52 51 51 51 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 49 49 50 50 50 51 50 49 50 50 50 50 50 50 50 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 50 49 49 49 49 49 48 48 47 47 47 47 47 47 46 46 46 46 45 44 44 45 46 45 46 46 45 44 45 45 44 44 45 45 44 43 43 43 43 43 44 45 44 44 43 43 44 46 46 45 44 44 43 42 42 43 43 43 43 43 43 42 41 41 42 41 40 39 38 38 40 41 41 42 42 42 43 43 44 45 45 45 44 44 44 43 43 42 41 41 41 40 40 40 39 39 39 39 39 39 40 41 41 41 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 39 38 37 37 37 38 38 38 38 38 39 40 41 41 41 41 41 42 42 42 43 42 43 43 43 44 44 44 45 45 45 44 43 43 43 43 43 43 43 42 41 41 41 41 40 40 39 38 37 37 37 37 37 36 34 34 36 36 37 37 36 35 34 34 33 33 33 33 32 31 31 31 31 32 32 32 33 34 33 32 33 34 34 34 33 33 33 32 31 31 31 32 32 33 33 31 30 31 32 32 31 31 30 29 29 29 30 30 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 28 28 27 27 26 26 26 26 26 28 29 28 28 27 27 28 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 31 31 30 30 31 32 30 29 29 29 29 30 31 31 29 29 29 29 28 27 28 28 28 28 27 26 26 26 27 28 29 29 29 29 29 29 29 30 31 31 31 31 32 33 32 31 30 29 29 27 27 28 29 30 31 31 31 31 30 29 27 27 28 29 29 30 31 31 31 31 31 32 32 32 32 31 31 30 30 30 30 30 31 32 32 33 32 32 32 31 31 31 29 29 29 29 30 30 30 30 29 29 30 30 29 29 29 29 29 29 29 29 29 29 29 29 28 28 27 26 25 25 24 23 24 23 23 23 23 23 23 23 23 23 23 23 24 24 24 23 23 23 23 24 24 24 25 25 25 60 60 61 61 60 60 59 59 60 60 60 60 60 60 60 59 60 60 60 60 59 58 59 59 58 58 58 57 57 57 57 57 57 57 57 56 55 55 56 56 56 56 56 56 56 56 56 56 55 55 54 55 54 54 54 55 55 54 55 56 56 56 56 55 55 55 55 55 55 54 54 54 54 53 53 53 53 54 54 54 53 53 53 53 54 54 53 52 52 52 51 50 50 51 51 50 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 50 49 49 49 50 50 50 50 50 49 49 49 49 50 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 50 50 49 49 49 49 48 47 47 47 47 47 47 47 46 46 46 46 45 44 44 46 47 47 46 46 46 45 45 45 45 46 47 46 46 45 44 44 45 45 45 46 45 45 44 44 44 46 46 45 44 44 43 42 43 45 45 44 43 44 44 43 42 42 43 42 41 40 39 38 39 40 40 41 41 41 42 42 43 44 44 45 45 44 44 43 43 43 42 42 42 41 41 41 40 40 39 39 40 41 42 42 42 42 42 43 42 41 41 41 41 41 41 40 40 40 39 39 39 39 38 37 36 36 37 37 37 38 39 39 39 40 40 41 41 41 42 42 41 42 42 42 43 43 43 43 43 44 44 45 45 45 44 43 43 42 42 42 41 41 40 40 40 40 39 39 39 38 37 37 36 36 36 35 34 34 36 37 36 36 37 36 35 33 33 33 32 32 31 30 30 32 33 33 33 34 34 35 34 33 34 34 34 34 33 34 34 33 32 32 32 32 33 34 34 32 31 31 32 31 31 30 30 31 32 31 30 31 31 30 29 28 28 27 27 27 27 27 27 27 27 26 26 27 28 28 26 26 26 26 26 26 26 26 27 27 26 26 26 26 27 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 29 30 30 31 31 30 29 29 29 29 30 31 31 31 31 30 29 28 28 29 29 29 29 28 28 27 26 26 28 28 28 28 29 29 30 30 30 31 31 31 30 31 32 31 31 31 31 30 28 27 27 29 29 30 30 31 31 30 29 27 27 28 28 29 30 31 31 30 31 32 32 32 32 32 31 31 30 30 30 30 30 31 31 32 32 32 32 32 31 31 31 30 30 29 29 29 30 30 30 30 30 29 29 29 29 29 29 29 29 28 28 28 29 30 29 29 27 26 26 25 25 25 24 24 24 24 24 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 25 60 60 61 61 61 60 60 61 61 61 61 61 61 61 61 60 60 61 61 60 59 59 60 59 58 58 58 58 57 57 57 58 57 57 57 56 55 55 56 57 57 57 56 56 57 57 57 56 56 55 55 55 55 54 54 55 55 55 56 57 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 53 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 52 52 52 51 50 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 50 50 50 50 49 49 49 50 50 50 50 50 50 50 50 49 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 44 44 44 46 47 47 47 47 47 46 46 46 45 46 47 47 46 46 44 45 46 45 45 46 46 45 45 44 45 46 46 45 46 46 43 43 44 46 46 45 44 45 45 44 43 44 44 42 41 40 39 38 38 38 39 40 41 41 41 42 43 43 44 44 44 44 44 44 44 43 43 43 43 42 41 41 41 40 40 40 41 41 42 42 42 42 42 42 42 41 41 41 41 42 41 40 40 39 39 39 39 38 37 36 36 37 37 37 38 39 40 40 40 40 40 41 41 41 42 41 41 41 41 42 42 42 42 43 43 44 44 45 46 45 44 44 43 42 41 41 41 41 40 39 39 39 38 37 38 37 36 36 35 34 34 34 34 34 35 36 36 35 36 36 36 35 34 33 32 32 31 30 31 33 34 34 34 35 35 34 33 34 35 35 34 34 34 34 34 33 33 34 34 33 34 34 34 32 32 32 32 31 31 32 32 33 34 32 31 32 32 31 30 29 29 29 28 28 28 27 27 27 27 27 27 26 26 26 26 26 27 28 28 27 26 26 26 26 26 26 26 26 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 29 28 28 28 29 30 30 31 32 32 32 32 31 29 29 29 29 30 31 30 29 29 28 26 25 27 27 27 28 29 29 31 31 31 31 30 30 30 31 32 31 30 31 30 30 29 27 27 28 29 29 31 32 32 31 29 28 28 27 28 29 30 30 30 29 31 32 32 32 32 32 32 31 30 30 29 29 30 30 31 32 32 32 32 32 31 30 30 30 30 30 29 29 29 30 30 30 30 29 29 29 30 29 28 28 29 28 27 28 29 29 29 28 27 27 26 26 26 26 26 25 25 26 24 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 25 60 61 62 62 61 61 61 62 61 61 61 62 62 62 61 61 61 62 61 61 60 59 60 60 59 59 59 58 58 58 57 58 58 58 57 56 56 55 56 57 58 58 57 57 57 57 57 57 57 55 55 55 55 55 55 56 57 56 56 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 50 49 49 50 50 50 50 49 49 50 50 50 50 50 50 50 50 49 49 49 48 48 48 48 48 47 46 46 45 45 45 45 45 45 45 45 45 46 47 48 48 48 47 46 46 46 46 46 47 47 46 46 45 45 46 46 46 46 46 46 45 45 46 48 47 46 47 46 44 45 45 45 46 46 46 46 45 45 44 44 44 43 41 40 40 39 39 38 39 40 40 41 42 42 43 43 43 43 43 43 44 44 44 44 44 43 42 42 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 39 38 38 38 38 37 36 36 37 37 37 38 39 39 40 40 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 44 44 44 45 46 45 44 43 43 42 42 42 41 41 41 40 39 39 38 37 37 37 36 35 35 35 35 35 34 34 34 35 36 35 34 35 35 35 34 33 32 31 30 30 31 32 34 35 36 35 34 33 33 34 36 36 35 35 36 35 35 35 35 35 35 34 34 35 34 32 33 33 32 31 32 34 35 34 33 32 32 33 33 31 30 30 31 31 30 29 29 28 27 27 28 28 28 26 26 27 27 26 27 29 29 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 28 28 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 28 27 29 29 30 30 31 31 33 33 32 33 31 30 30 29 29 31 31 30 29 29 28 25 25 26 26 27 27 28 29 30 31 31 30 29 30 31 31 32 31 30 30 30 30 29 28 27 28 28 29 30 31 32 31 29 29 29 28 28 28 29 29 29 30 31 32 32 31 31 31 31 30 30 30 29 29 30 30 31 32 32 32 32 32 32 31 30 29 29 29 30 29 29 30 30 30 30 29 29 29 29 29 28 28 28 27 27 28 28 29 29 28 28 27 27 27 27 27 26 26 26 26 25 23 23 23 23 23 23 23 23 23 23 24 24 23 24 23 23 23 23 23 24 25 61 61 62 62 62 62 62 62 62 62 62 63 63 62 62 62 62 62 62 61 60 60 60 60 60 59 59 59 59 58 58 58 59 58 58 57 56 56 56 57 58 58 57 57 57 58 58 58 57 56 56 56 56 56 56 57 57 57 56 56 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 51 50 49 49 49 48 48 48 48 48 48 48 48 48 47 47 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 49 49 50 50 50 50 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 48 47 47 47 47 47 47 46 45 45 45 45 45 46 46 46 46 46 47 47 48 48 48 47 47 46 46 47 48 47 47 47 47 47 47 47 47 46 46 47 47 46 46 48 48 47 48 47 46 46 45 45 46 47 47 47 46 45 44 44 44 43 41 40 40 40 39 38 38 39 40 41 42 42 43 43 42 43 43 43 44 44 44 44 44 43 42 42 41 41 41 41 41 40 40 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 39 38 38 37 37 36 36 37 37 37 37 38 38 38 39 40 40 40 40 41 41 41 41 41 41 42 42 43 43 44 44 44 44 44 45 46 45 45 44 43 43 43 42 42 41 41 40 40 40 39 37 37 38 38 37 36 36 36 35 35 34 34 35 36 35 35 34 34 34 33 32 31 31 30 31 32 33 34 36 36 35 34 33 34 35 36 37 36 36 37 37 37 37 36 36 36 35 34 34 34 33 33 33 32 33 33 35 36 35 34 33 34 34 33 32 31 31 32 32 30 29 29 28 27 28 29 29 28 26 26 27 27 27 28 29 30 30 29 29 28 27 26 26 26 26 26 26 26 26 26 26 27 29 29 30 31 30 27 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 27 28 30 31 31 31 31 32 33 31 31 33 33 31 31 30 30 31 31 29 28 28 27 25 25 26 27 27 27 29 29 30 30 30 30 30 30 31 32 32 32 31 30 30 30 29 28 27 28 28 29 30 31 32 31 30 29 30 29 28 27 27 28 29 30 31 32 32 31 31 30 30 30 30 30 29 29 30 30 31 32 32 32 31 31 32 31 30 29 29 29 29 29 29 30 30 30 30 30 29 29 29 29 29 29 28 27 27 27 28 29 28 27 27 27 28 27 27 27 26 26 25 25 25 24 23 23 23 23 23 24 24 24 25 25 25 25 25 24 23 23 23 24 25 26 62 62 62 62 62 62 63 63 63 62 63 63 63 63 63 62 62 62 62 61 61 61 61 61 60 59 59 59 59 59 59 60 60 59 59 58 57 56 57 58 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 58 58 57 57 58 58 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 54 54 54 54 54 53 53 53 52 52 52 51 51 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 47 47 47 47 48 48 49 49 49 49 49 50 50 50 50 50 50 50 50 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 47 47 47 47 46 46 45 45 45 45 46 46 47 47 46 46 47 47 48 48 48 48 47 47 47 48 48 48 48 48 48 48 48 48 48 47 47 48 48 47 47 48 48 48 48 48 48 47 47 46 46 47 47 46 46 45 44 44 44 43 42 41 39 39 38 38 38 40 40 41 42 42 42 42 42 42 42 43 44 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 41 41 40 40 41 40 39 39 39 40 41 41 41 40 40 40 39 38 37 37 36 36 37 37 37 38 38 38 39 39 39 39 39 40 40 41 41 41 41 41 41 42 43 44 45 45 44 44 45 45 46 45 44 43 43 43 43 42 42 41 41 40 40 39 39 38 38 39 39 38 37 36 36 35 34 33 33 35 36 36 35 35 35 35 34 32 31 31 31 31 32 34 35 37 36 35 34 34 36 37 38 38 37 36 37 38 39 39 38 37 37 36 35 35 35 35 34 33 33 34 35 36 35 34 34 34 34 34 33 33 31 31 32 32 30 29 29 27 28 29 29 29 28 27 27 27 28 28 29 29 30 31 30 29 29 28 27 27 27 26 26 26 26 26 26 26 28 30 31 31 32 31 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 29 30 31 30 31 32 32 32 31 30 32 32 32 31 30 30 31 30 29 28 28 28 26 25 26 27 27 28 29 30 30 30 30 31 32 31 30 32 33 32 32 31 30 29 29 29 28 28 28 28 29 31 31 32 31 30 30 29 28 27 27 28 29 30 30 31 31 32 32 31 30 30 30 29 29 30 30 30 31 32 31 31 31 30 31 31 31 30 30 30 29 28 29 29 30 30 29 29 29 29 29 29 30 29 28 27 27 28 29 30 29 27 26 27 27 27 26 26 26 26 25 25 24 24 23 23 23 24 24 24 25 25 26 26 26 26 25 24 23 23 24 25 26 26 62 63 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 61 62 62 61 60 60 60 59 59 60 60 60 60 59 58 57 57 57 58 58 59 58 58 59 59 59 58 58 58 57 57 58 58 58 58 59 59 58 58 59 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 53 53 52 52 52 52 51 51 51 51 50 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 47 48 48 48 48 49 49 49 49 49 50 50 49 49 49 50 50 50 50 50 51 50 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 45 46 46 46 46 47 47 47 47 46 46 47 47 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 49 48 48 47 46 47 47 46 45 45 44 43 43 43 43 43 42 40 39 38 38 39 40 40 41 42 42 41 41 41 42 42 43 44 44 43 43 42 42 42 41 41 41 41 40 40 40 39 40 40 40 40 40 41 40 40 39 40 40 41 41 41 41 41 40 40 39 38 38 36 36 37 38 38 38 38 40 40 39 39 39 39 40 40 40 41 41 42 42 42 42 43 44 45 45 45 45 46 46 46 46 45 44 44 44 43 43 42 41 41 41 40 40 39 38 38 39 38 37 37 37 36 35 34 33 33 35 37 37 36 36 36 36 36 34 33 32 31 31 33 35 36 37 37 36 35 35 36 37 39 39 38 38 38 39 40 40 39 38 38 37 36 36 36 36 35 34 33 35 36 36 36 35 34 34 34 33 33 33 31 31 32 32 30 29 28 28 29 30 30 29 28 27 27 27 28 29 29 30 30 31 30 30 29 28 27 27 27 27 26 26 26 26 26 26 28 30 32 31 32 32 31 28 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 28 28 29 30 30 31 31 31 30 30 30 30 31 30 30 30 30 30 29 29 29 28 27 26 26 26 26 27 28 29 29 29 30 31 32 32 32 33 34 33 33 32 30 29 29 29 29 29 28 27 28 30 31 32 32 32 31 29 28 27 27 29 30 30 30 31 31 32 31 30 30 30 29 29 29 30 30 30 31 31 31 31 31 30 30 30 31 31 31 30 29 28 29 30 30 30 30 29 29 29 29 29 30 29 28 27 27 28 29 30 29 27 26 26 26 27 26 26 25 25 25 24 24 23 23 23 23 24 24 26 26 26 26 26 26 26 26 25 24 23 24 25 25 24 63 64 64 64 64 64 63 63 62 63 62 61 62 62 62 62 62 63 63 63 62 62 62 63 62 61 61 61 61 61 60 60 59 59 58 58 57 57 58 58 58 59 59 59 59 60 59 59 59 59 58 58 59 59 59 58 59 59 59 58 59 59 58 58 58 58 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 56 56 55 55 55 55 55 55 55 54 53 53 53 53 53 52 51 52 52 51 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 47 47 48 48 48 49 49 49 49 50 49 49 49 49 49 50 50 51 51 51 50 50 50 50 50 50 50 49 49 48 48 49 48 48 48 48 48 47 47 47 46 46 46 45 46 47 47 46 46 47 48 48 48 47 47 47 48 48 48 48 48 49 49 49 49 49 48 47 47 47 47 47 47 48 48 48 48 48 49 48 48 48 47 47 48 48 48 47 47 47 46 45 45 45 43 42 42 42 42 43 42 40 40 39 38 38 39 39 39 41 41 41 41 41 41 42 43 43 44 43 42 42 42 42 41 41 41 41 41 41 41 40 39 39 39 40 40 41 41 40 39 40 41 41 41 41 41 40 40 40 39 39 38 36 36 37 38 38 39 39 39 40 40 40 40 40 40 40 40 41 42 43 43 43 43 43 43 44 45 45 46 46 46 46 46 45 45 45 45 44 43 43 42 42 41 40 39 39 38 38 38 37 36 36 36 36 35 34 33 34 36 37 37 37 37 37 37 36 35 34 33 32 32 34 35 35 37 37 37 37 36 35 37 38 39 39 39 40 40 41 40 40 39 39 38 37 37 37 37 36 34 33 35 36 36 36 36 35 34 34 33 33 32 31 30 31 30 30 29 28 29 30 30 30 29 29 28 27 27 27 29 30 30 31 31 30 30 29 28 27 28 29 29 28 28 28 28 28 27 28 30 31 31 31 31 32 30 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 28 30 29 29 30 30 30 30 30 30 30 30 30 31 30 30 30 30 29 28 27 26 27 28 28 27 27 29 29 30 31 31 32 32 32 34 35 34 33 33 32 30 30 30 30 29 27 27 28 29 30 31 32 33 31 30 29 27 27 29 30 30 30 32 32 31 31 30 30 29 29 29 30 30 30 30 31 30 31 32 31 31 30 30 30 31 30 30 29 29 30 31 31 30 30 30 30 29 29 30 30 30 29 28 27 28 30 30 30 28 28 27 26 27 27 26 26 25 24 24 23 23 23 24 25 25 26 26 27 27 27 27 27 27 26 26 25 24 24 24 24 23 64 64 63 63 63 63 63 62 61 62 61 60 61 61 61 61 62 62 63 63 63 63 63 63 63 62 62 61 61 61 61 60 59 58 58 58 58 58 59 59 59 59 60 60 59 59 59 59 59 60 59 59 59 59 59 58 58 58 59 58 58 59 58 58 58 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 56 56 56 56 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 52 51 50 50 49 49 49 50 50 49 49 49 48 49 49 49 49 49 49 49 49 49 49 48 48 47 46 46 46 46 46 46 46 47 48 48 48 48 48 49 49 49 48 48 48 49 50 50 51 51 51 51 50 50 50 50 50 50 49 49 49 48 49 48 48 48 48 48 47 47 46 46 46 46 46 46 47 47 47 46 47 48 48 48 48 48 48 48 49 49 49 49 49 49 48 48 49 49 48 47 46 46 46 47 47 47 48 47 48 49 49 48 47 47 46 46 47 47 47 47 46 46 45 45 45 44 43 42 42 42 41 41 40 40 39 39 38 38 38 39 41 41 40 40 40 41 42 42 42 43 43 42 42 43 42 41 41 40 40 41 41 41 40 39 39 39 40 40 40 40 39 39 40 41 41 41 41 40 40 40 39 38 38 37 36 36 38 39 40 40 39 39 40 41 41 41 41 41 41 41 42 42 43 44 44 44 44 43 44 45 46 46 46 45 46 46 45 45 44 44 44 43 43 43 43 42 40 39 39 39 38 37 36 35 35 35 35 34 34 33 34 36 36 37 36 36 36 36 36 35 34 33 32 32 33 34 35 37 37 37 37 36 35 36 37 38 38 39 39 39 39 40 40 40 39 37 37 37 37 36 34 34 34 35 36 36 36 36 35 34 34 34 33 31 30 30 29 29 29 29 29 29 30 30 30 30 29 29 28 27 27 28 30 32 32 31 30 30 29 28 28 30 30 30 30 29 29 30 30 29 28 28 30 31 31 30 30 29 29 28 28 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 29 29 30 30 29 29 30 30 30 30 31 32 31 31 31 30 30 29 28 27 27 28 29 29 29 30 31 32 33 32 33 33 32 34 36 34 34 34 33 32 31 30 30 29 28 27 27 29 30 30 32 33 32 30 30 28 27 29 30 30 31 32 32 31 30 30 30 29 29 29 30 30 30 30 30 30 31 32 31 31 31 30 30 30 30 30 29 29 30 31 30 30 30 30 30 28 28 30 30 30 29 28 27 29 30 30 30 29 29 28 27 27 27 27 26 25 24 24 24 24 24 25 26 26 27 27 27 27 28 28 28 27 27 27 26 25 23 23 23 24 64 64 63 62 62 62 62 61 61 61 61 60 60 60 60 61 61 61 62 62 62 63 63 63 63 62 62 61 61 61 61 60 59 59 59 59 59 59 59 60 60 60 60 60 60 59 59 59 59 60 60 60 59 59 59 58 57 58 59 58 58 58 58 58 57 57 57 56 56 56 56 56 56 56 55 55 56 56 55 55 56 55 55 55 56 56 55 55 55 55 55 54 54 55 55 55 54 54 53 53 53 53 52 52 51 51 51 50 50 50 51 50 50 50 49 49 50 50 50 50 50 50 50 49 49 49 49 49 48 48 47 47 46 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 49 49 50 51 51 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 49 48 48 47 46 46 46 47 47 47 48 48 48 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 45 46 46 46 47 48 47 48 49 48 47 46 46 46 46 46 47 47 47 46 46 46 46 45 45 44 43 43 43 41 40 40 40 40 40 39 38 38 38 40 41 40 40 40 40 41 41 42 42 42 42 41 42 42 41 41 40 40 40 40 40 40 39 39 40 39 39 39 40 39 39 40 40 41 41 40 40 39 39 38 38 37 36 36 37 38 39 40 40 40 39 40 41 41 41 41 42 42 42 42 43 43 44 44 44 44 44 45 45 45 46 46 45 45 46 46 45 44 43 43 43 43 43 43 42 41 41 40 39 38 37 36 36 36 36 35 35 34 34 34 35 35 36 36 35 34 35 36 35 33 32 32 32 33 35 36 37 38 37 38 37 36 36 36 37 38 39 39 39 39 39 40 40 39 38 37 37 37 36 35 35 35 35 36 35 34 35 34 34 34 33 32 30 30 30 29 29 29 30 30 30 30 30 31 30 30 30 29 28 27 28 31 32 32 31 30 30 30 28 28 30 30 30 30 30 30 30 30 30 29 28 29 30 30 30 30 30 30 30 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 27 29 29 29 29 29 28 28 30 30 30 30 31 32 32 31 30 30 29 29 29 27 26 27 28 28 29 30 32 33 34 34 34 33 33 34 35 35 34 34 34 33 32 31 30 29 27 27 27 27 29 30 32 33 32 31 30 29 27 28 30 30 31 32 32 31 30 30 29 29 28 29 30 30 30 30 30 30 31 31 31 30 30 30 30 30 30 30 29 29 31 31 30 30 30 30 30 29 28 28 29 29 29 27 28 29 30 30 30 30 29 27 27 27 26 26 26 24 24 25 26 25 25 26 27 27 27 27 28 28 28 28 27 27 27 27 26 25 24 24 25 24 65 64 64 63 61 61 61 61 60 60 60 60 60 60 59 60 60 60 61 62 62 62 63 63 62 62 62 62 62 61 61 60 60 60 60 60 61 60 60 61 60 60 60 60 60 59 58 59 59 59 60 60 59 58 58 58 57 57 58 58 58 58 57 58 57 57 57 56 56 56 56 55 55 56 56 55 56 55 55 55 56 55 55 55 55 55 55 55 54 54 54 54 54 54 55 55 54 54 53 53 53 53 53 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 49 49 50 50 51 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 47 47 47 47 48 48 48 48 48 48 49 49 48 48 49 48 48 48 48 48 48 48 47 47 48 48 48 47 46 45 45 46 46 47 47 47 48 48 48 47 46 46 46 46 46 46 46 46 45 45 46 46 46 45 44 44 43 43 42 40 40 40 40 40 40 39 38 38 39 40 40 39 39 39 40 41 41 41 42 42 41 40 41 41 40 40 40 40 39 39 39 39 38 39 39 39 39 39 38 39 40 40 40 40 40 39 38 38 38 37 37 36 36 38 39 39 40 40 40 40 40 40 41 41 41 42 42 43 43 43 44 44 44 44 44 44 45 45 45 45 46 45 45 46 46 45 44 44 43 43 42 42 42 42 41 40 40 38 37 36 36 37 37 37 37 36 35 34 33 33 34 35 36 35 34 35 35 34 33 32 32 33 35 36 36 38 38 38 39 38 38 38 38 38 39 40 40 40 40 39 40 40 39 39 39 38 37 37 36 36 36 35 34 34 33 33 33 33 33 32 31 31 32 32 31 31 31 31 31 32 31 31 32 31 30 30 29 29 27 28 30 32 32 31 30 29 29 29 29 30 30 30 31 31 31 30 30 30 29 28 28 29 30 30 30 30 30 30 29 29 29 28 27 26 26 26 26 26 26 26 26 26 26 26 27 27 27 28 28 28 29 30 30 30 31 32 32 31 30 29 29 28 28 28 27 26 27 28 28 28 29 31 33 34 35 35 35 34 34 35 35 35 34 34 33 32 31 29 28 27 27 27 27 29 30 31 32 32 30 29 29 28 29 30 31 32 32 32 31 30 30 29 28 28 28 29 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 28 28 30 31 30 30 30 30 30 29 28 27 27 28 28 27 28 29 30 30 29 29 28 27 26 26 26 26 25 24 24 26 27 26 26 26 27 27 28 28 29 29 28 27 27 26 26 26 25 25 26 26 26 24 64 64 64 64 63 61 61 60 59 59 60 60 59 59 60 60 60 60 61 61 61 62 62 62 62 62 62 62 62 62 62 61 61 61 62 61 61 61 61 61 61 61 60 60 59 59 58 58 58 59 59 59 59 58 58 57 57 57 58 57 58 58 58 58 57 56 56 56 56 55 56 55 55 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 54 54 55 54 54 53 53 53 52 52 52 52 51 51 52 52 52 52 51 51 51 51 50 51 51 51 51 51 50 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 46 47 47 48 48 48 47 47 48 49 49 50 50 51 51 51 51 51 50 50 50 50 50 49 48 48 48 48 48 48 48 48 47 46 46 47 47 47 48 48 48 48 48 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 48 47 46 45 45 45 46 46 46 46 46 48 48 47 46 46 45 45 46 46 45 45 46 45 44 45 45 45 45 44 43 43 42 42 41 40 39 39 39 39 39 38 37 38 40 40 39 38 39 40 40 41 41 42 42 41 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 39 38 38 38 40 40 39 40 39 38 38 38 38 37 36 36 37 38 39 39 40 40 40 40 40 40 40 40 41 41 42 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 42 41 40 40 39 39 38 37 38 37 36 36 36 35 35 35 34 33 32 33 33 33 33 33 33 33 32 32 32 33 34 35 36 37 37 38 38 38 38 39 39 39 39 40 41 41 41 41 41 40 39 39 40 39 38 37 36 36 36 35 34 34 33 33 33 33 32 32 33 33 34 33 33 33 33 33 33 33 33 32 32 32 31 30 30 29 28 28 30 31 33 32 30 29 29 30 29 30 30 31 32 31 31 30 29 29 29 29 29 29 31 31 30 30 30 30 29 29 29 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 28 29 29 30 30 30 31 32 31 31 31 31 30 29 27 27 27 27 26 27 29 29 29 30 32 33 34 34 35 35 35 33 33 34 34 33 34 33 31 30 29 29 29 28 28 28 30 30 31 31 30 30 28 27 28 30 30 31 31 31 32 31 30 30 29 28 28 28 29 30 29 29 30 30 30 31 31 30 30 30 30 30 30 30 28 28 29 30 30 30 30 30 30 30 29 28 27 27 28 27 28 29 30 29 28 27 27 27 27 27 27 26 24 24 24 25 27 27 27 27 27 28 29 30 30 29 28 27 27 26 26 26 25 26 27 27 26 25 64 64 64 64 64 62 61 60 59 59 59 60 59 60 61 60 60 60 61 61 61 62 62 62 62 62 63 63 63 63 62 61 61 62 62 62 62 62 62 61 61 61 60 60 59 59 58 57 57 59 60 59 59 59 58 57 57 57 58 57 58 58 58 57 57 57 56 55 55 55 55 55 55 56 56 55 54 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 49 49 49 49 48 48 48 47 47 47 47 46 46 46 46 45 45 46 46 47 47 47 47 47 47 47 48 49 49 50 50 50 50 51 50 50 50 50 50 50 50 49 48 48 48 48 48 48 49 48 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 49 48 48 47 47 47 48 48 48 48 47 46 46 47 47 48 47 46 45 45 45 45 45 45 46 47 47 46 46 45 45 45 46 46 45 45 45 45 44 44 45 44 44 43 43 43 42 42 41 40 39 38 38 38 38 38 37 38 39 40 39 38 39 40 41 41 41 42 42 41 40 40 40 40 40 40 40 40 40 39 39 38 38 38 37 37 37 38 38 39 39 39 39 39 38 38 38 37 37 36 36 37 38 39 39 40 41 41 41 40 40 40 40 41 41 42 42 43 44 43 43 43 43 44 44 44 44 45 45 44 44 44 45 45 45 44 44 43 43 43 43 42 40 40 39 40 40 39 38 38 36 35 36 35 35 36 36 36 35 34 33 32 32 32 32 32 32 32 32 32 32 34 35 36 36 36 36 36 36 37 38 38 39 39 40 40 40 41 41 41 41 40 39 40 40 39 38 37 37 36 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 31 30 30 29 28 29 30 32 34 32 30 29 30 30 30 30 31 33 33 31 30 29 29 29 29 30 30 30 31 32 32 30 30 30 30 29 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 31 31 31 32 33 33 31 30 30 31 31 30 29 28 27 26 26 27 29 30 30 31 32 32 31 31 33 34 34 33 33 32 31 32 34 33 33 32 32 31 30 29 28 28 29 30 31 31 30 29 29 27 27 29 30 30 30 31 32 32 31 30 30 29 28 28 29 29 29 30 30 30 30 31 30 30 30 30 30 30 30 30 29 28 28 28 28 28 28 28 29 29 28 29 29 27 26 26 27 28 29 28 27 27 27 27 27 26 26 25 24 24 24 26 27 27 27 27 27 29 30 30 30 30 29 27 27 27 26 26 26 26 27 26 26 26 63 63 63 63 63 62 61 60 59 58 59 59 59 59 60 59 59 59 60 61 61 62 62 61 61 62 62 62 62 62 62 62 62 62 62 62 61 62 62 61 60 60 60 60 59 59 59 58 57 58 59 59 59 59 58 58 57 57 57 57 58 58 57 57 57 57 56 55 55 55 54 54 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 53 54 54 53 52 52 52 52 52 51 51 51 51 50 51 51 51 51 50 51 51 50 50 50 51 51 51 50 49 49 49 49 48 48 48 47 47 47 47 46 46 46 46 45 45 45 46 46 46 46 47 47 47 48 48 49 49 49 49 50 50 51 50 50 50 50 50 49 49 49 48 48 48 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 48 48 48 49 49 49 48 47 47 47 47 48 48 48 48 47 47 47 47 47 47 46 45 44 44 45 44 44 45 46 46 45 45 44 44 44 45 46 45 44 44 45 44 43 44 44 44 45 45 44 44 43 41 40 40 39 39 38 38 38 38 37 38 38 38 37 38 39 40 41 41 41 42 41 41 41 40 40 40 41 41 41 40 40 40 40 39 39 38 37 37 37 38 38 38 38 38 38 37 38 37 37 37 36 36 37 37 38 38 40 41 41 41 40 40 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 43 44 45 43 43 44 45 45 44 44 43 43 43 43 42 42 41 40 40 40 40 39 38 37 36 37 37 36 37 37 37 37 36 35 34 34 34 33 32 32 33 34 33 32 32 34 35 35 35 35 35 36 36 36 36 37 39 39 39 39 39 40 40 40 41 40 40 40 40 39 38 37 37 36 36 36 36 36 36 36 35 36 35 35 35 34 34 34 34 34 34 34 34 34 34 33 32 30 30 29 28 28 29 31 33 33 32 30 30 30 30 30 30 32 34 33 31 29 29 29 30 30 30 30 30 31 32 32 31 30 30 29 28 28 28 27 26 27 27 26 26 26 26 25 25 26 26 26 26 26 27 29 31 32 33 32 33 33 31 29 29 30 31 30 29 29 28 26 26 28 29 30 30 31 30 29 29 30 32 33 33 32 31 31 30 31 33 34 34 34 33 32 31 28 27 27 29 30 31 31 30 30 29 28 27 28 30 29 29 30 31 32 32 31 30 29 28 28 29 29 30 30 30 30 30 30 30 30 29 29 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 28 27 26 26 26 27 28 28 27 27 26 26 26 26 25 24 24 24 25 27 27 28 29 28 29 29 30 30 30 29 29 27 27 27 26 26 26 26 27 26 26 27 63 62 62 62 62 62 62 60 59 58 58 58 58 58 58 58 58 60 60 60 61 62 62 61 60 61 62 62 61 61 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 58 58 57 57 58 59 59 59 58 58 58 56 57 57 56 57 58 58 57 57 57 56 56 56 55 55 54 54 55 55 55 55 54 54 53 53 54 54 53 53 52 52 53 52 52 52 52 52 53 53 53 53 52 52 51 51 51 51 51 50 50 50 50 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 47 47 47 46 46 45 45 45 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 49 49 49 50 50 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 48 48 49 48 48 49 49 49 49 49 49 48 47 48 48 48 48 48 47 46 46 47 48 48 48 48 47 47 47 46 46 46 45 44 43 44 44 44 44 44 45 46 45 44 44 43 43 44 45 45 44 44 44 44 43 42 43 44 45 45 45 44 43 42 40 40 40 40 39 38 39 38 38 37 37 37 37 37 37 38 39 40 40 41 42 42 41 41 41 41 42 42 41 41 41 41 40 39 39 38 37 37 37 37 37 37 38 37 37 37 37 37 36 36 36 36 37 37 38 39 40 41 41 41 41 41 41 41 42 42 42 43 43 43 43 42 42 42 42 43 43 43 44 43 43 44 44 44 44 44 43 43 43 43 43 42 41 40 40 40 39 39 39 38 37 38 38 37 37 38 38 38 37 36 36 36 36 35 34 34 34 34 34 34 33 32 33 34 34 34 34 35 36 36 36 36 37 38 38 38 38 39 39 39 39 40 40 41 40 40 39 38 37 37 36 37 38 37 37 37 36 36 37 37 36 35 34 34 34 33 32 33 33 32 32 32 31 30 30 30 29 28 29 30 30 32 33 32 31 31 31 31 31 31 33 34 33 31 30 29 30 30 31 31 31 30 30 30 30 30 30 30 29 27 28 29 27 27 28 28 27 26 26 26 25 25 25 26 26 26 26 26 26 28 30 32 31 31 31 30 29 28 29 29 29 30 30 28 26 26 28 29 30 30 30 29 28 29 30 31 31 31 30 29 29 30 31 32 33 34 33 33 32 31 28 27 28 30 30 31 31 30 29 29 27 27 27 29 29 29 30 31 31 31 31 30 29 28 28 29 29 30 30 30 30 30 30 30 29 29 29 30 30 30 29 28 28 28 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 27 27 27 27 26 26 26 26 25 24 24 24 26 27 27 27 28 29 30 30 30 30 30 29 27 27 27 26 26 27 27 27 27 27 27 27 62 62 62 62 62 61 61 61 60 59 58 57 57 58 57 58 59 59 59 60 61 61 61 60 59 60 61 61 60 60 62 62 62 62 61 61 61 61 61 61 60 60 59 59 59 58 57 57 57 57 58 58 58 58 58 58 56 56 56 56 57 57 57 56 56 56 56 56 56 56 56 55 54 54 55 55 54 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 52 52 52 52 52 51 51 51 51 51 50 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 47 47 47 47 46 46 46 45 45 45 45 45 45 45 45 45 46 46 47 48 48 48 48 48 47 48 48 49 49 50 50 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 48 48 47 48 47 46 46 46 47 47 47 47 46 47 47 45 45 45 45 44 43 43 43 44 44 44 45 45 44 44 44 43 43 44 44 45 44 43 44 44 43 42 42 42 43 43 43 43 43 42 40 39 39 39 38 38 38 38 37 37 37 37 37 37 37 37 37 38 39 40 41 41 41 41 41 41 41 42 42 41 41 40 40 39 39 38 37 37 37 37 37 37 38 37 37 37 37 37 36 35 36 37 37 38 39 39 40 41 41 41 41 41 41 41 41 41 42 43 43 43 43 42 42 42 42 42 43 44 44 42 43 44 44 44 44 44 43 43 43 43 43 42 41 40 40 40 39 39 40 39 38 38 39 38 38 39 38 38 38 37 37 37 36 36 36 36 35 34 34 34 33 32 32 33 33 34 33 34 36 36 36 36 37 37 37 37 37 39 39 38 39 39 40 40 40 40 39 39 38 37 37 38 39 39 38 37 37 37 37 37 36 35 34 34 34 33 31 31 31 30 30 30 30 30 29 29 28 28 29 30 30 30 32 33 32 32 32 32 32 33 34 34 33 32 31 30 30 30 32 32 32 31 30 30 30 30 29 29 28 28 29 28 28 29 29 29 29 28 27 26 25 25 25 26 26 26 26 26 26 26 27 29 30 29 29 30 30 28 28 29 29 30 29 29 27 25 26 28 30 29 29 29 27 27 28 29 30 30 28 28 29 30 30 31 32 33 32 32 32 30 29 27 28 29 30 31 30 29 29 29 27 27 27 27 28 29 30 30 30 30 30 30 29 28 28 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 29 29 29 29 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 26 24 24 24 26 26 27 27 28 29 30 30 30 30 30 28 27 27 27 26 26 27 27 27 27 27 27 28 62 62 62 61 61 60 60 61 61 60 59 57 57 56 56 57 58 58 58 59 60 60 59 59 58 59 59 60 59 60 61 61 62 62 61 61 60 60 60 60 60 60 59 59 59 59 58 58 58 57 57 58 57 57 58 57 57 56 56 56 57 57 57 56 56 56 56 56 56 56 56 55 55 54 54 54 54 54 53 52 52 52 53 53 52 51 51 51 51 51 50 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 48 48 49 49 49 49 49 50 50 49 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 47 46 45 45 45 45 45 45 47 48 47 47 47 47 47 47 48 48 49 50 50 50 49 49 49 49 49 49 48 49 49 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 47 46 45 46 47 47 46 46 46 45 44 45 45 45 44 43 43 43 44 43 43 44 44 43 44 44 43 43 43 44 44 44 42 43 44 44 42 41 41 42 42 41 41 41 41 40 40 39 38 38 38 37 37 38 37 37 38 38 38 37 37 37 37 38 39 40 40 40 40 40 40 41 41 42 42 41 40 40 39 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 37 38 38 39 39 39 40 41 41 41 41 41 41 41 41 41 42 43 43 43 42 41 42 42 41 41 42 43 42 42 43 44 44 44 44 43 43 43 43 43 43 43 42 41 40 40 40 40 40 39 38 38 39 38 38 38 38 38 37 37 37 37 37 36 36 36 35 34 33 33 33 32 33 33 35 35 35 34 34 35 35 35 36 36 36 36 37 38 38 38 39 39 40 40 40 39 39 39 39 38 38 39 40 40 39 37 37 37 37 37 36 36 35 34 34 34 33 31 30 30 30 30 30 29 29 29 28 29 29 30 30 30 32 33 33 33 33 33 32 33 33 33 33 32 30 30 30 31 32 33 32 31 30 30 30 30 29 29 29 29 29 27 27 29 29 29 30 29 28 27 25 25 25 26 25 25 25 25 25 25 25 25 27 27 28 29 29 28 27 27 27 27 27 27 26 25 25 26 27 26 27 28 27 27 27 28 30 29 28 27 28 28 29 30 31 32 30 31 31 29 28 27 27 29 30 30 30 29 29 28 27 26 26 27 29 30 30 30 30 30 30 30 29 28 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 29 28 28 28 28 28 29 28 27 27 27 27 26 26 26 26 26 26 26 26 27 27 27 27 27 26 25 24 25 26 26 27 27 29 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 61 61 61 61 61 60 59 60 60 60 60 58 56 55 56 57 57 57 57 58 59 59 59 58 58 59 59 59 59 59 60 60 61 61 62 61 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 58 58 57 56 56 55 56 56 56 55 55 55 55 56 55 55 56 56 55 55 54 53 54 54 54 53 52 52 52 52 52 51 51 51 50 50 49 49 50 49 49 50 50 50 50 50 49 49 49 48 48 48 48 48 48 49 48 48 48 49 49 49 49 48 48 49 48 48 49 48 48 47 47 46 46 46 46 46 47 47 47 47 47 46 45 45 45 45 45 46 47 47 47 46 47 47 48 48 48 49 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 48 47 47 47 47 46 46 47 46 46 46 47 47 46 45 45 46 46 46 46 45 44 44 45 45 44 44 44 43 43 43 43 43 43 44 43 43 43 43 42 42 43 44 44 42 42 43 43 42 41 41 41 40 40 40 40 39 39 39 38 38 38 38 37 38 39 39 38 39 40 39 38 37 37 37 37 38 39 40 40 39 40 40 41 41 41 41 40 40 39 39 39 39 38 38 37 37 37 37 37 36 36 36 35 35 35 36 37 38 38 39 39 40 40 41 41 41 40 40 41 41 41 42 42 43 43 43 42 41 41 41 41 41 41 42 41 41 43 43 44 44 43 43 43 43 43 43 43 43 42 41 41 41 40 40 41 40 39 39 39 38 38 38 38 38 37 37 37 37 37 36 35 35 34 34 33 32 33 33 33 34 35 36 36 35 34 34 35 35 36 36 36 36 37 38 39 39 40 40 40 40 40 39 39 39 39 40 39 39 40 40 39 37 37 36 36 36 36 36 35 34 34 34 34 33 31 30 30 30 29 29 29 29 29 29 30 30 30 31 32 33 33 34 33 33 32 31 31 31 31 31 30 29 30 31 33 33 33 31 30 30 30 29 29 29 29 30 29 28 28 29 30 30 29 28 28 27 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 27 26 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 28 29 29 27 27 27 28 29 30 31 31 30 31 31 28 26 26 28 30 30 30 29 29 29 28 27 26 26 28 29 30 30 30 30 30 30 30 28 27 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 29 29 29 29 29 30 30 29 29 28 27 27 26 26 26 27 26 26 25 25 26 26 27 27 26 25 24 24 26 26 27 28 28 29 30 30 30 30 30 30 29 28 27 28 28 28 28 28 27 27 27 27 27 61 60 61 61 61 60 59 59 60 60 59 58 56 55 55 56 56 56 57 58 59 59 59 58 58 58 59 59 59 58 59 60 60 60 61 61 61 60 60 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 58 57 56 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 55 54 53 53 53 53 53 52 52 51 51 51 50 50 50 49 49 49 50 49 50 50 49 49 49 49 49 48 48 49 50 50 49 49 49 49 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 47 47 47 47 47 46 45 45 45 45 46 47 46 46 46 47 48 48 48 49 49 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 49 50 49 49 49 49 49 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 44 45 45 45 45 45 44 43 44 45 44 44 44 43 42 43 43 43 43 43 43 43 43 43 42 42 42 43 44 42 42 43 43 43 42 42 41 40 40 40 40 40 39 39 38 38 38 38 39 40 41 41 40 39 40 40 39 38 37 37 37 38 38 39 39 39 39 40 41 41 41 40 40 40 40 39 40 39 38 38 37 37 37 37 37 36 36 35 35 36 36 37 37 37 38 38 39 40 41 41 41 40 40 40 41 41 42 43 43 43 44 43 42 41 40 40 40 41 41 41 41 42 43 44 44 44 43 43 43 42 42 42 42 43 42 41 41 41 41 41 41 40 40 40 39 38 38 37 37 37 37 37 36 36 36 35 35 35 35 34 33 33 34 34 34 33 34 35 36 36 36 35 36 36 36 37 37 38 39 39 39 40 40 40 40 39 39 39 39 38 39 39 39 39 40 40 39 37 37 36 35 35 34 34 34 34 34 34 33 33 32 30 30 30 29 29 29 29 30 30 30 30 30 31 32 33 33 33 34 34 33 32 32 31 31 31 30 29 30 32 33 34 34 32 30 30 30 29 29 29 30 30 30 29 29 30 30 30 29 28 28 27 26 26 27 28 29 29 27 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 25 26 28 27 27 27 28 29 30 31 32 30 29 30 30 29 27 26 28 30 30 29 29 29 29 27 27 26 26 28 29 30 30 30 30 30 30 29 28 27 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 27 27 26 26 26 27 27 27 26 26 25 25 26 26 26 25 25 25 25 26 27 27 28 29 30 30 31 30 30 30 30 29 29 29 29 29 29 28 27 27 27 27 27 26 60 60 60 60 60 59 58 59 60 59 58 58 57 56 54 55 56 56 57 59 59 58 58 57 57 58 58 58 58 58 59 59 59 60 60 61 61 61 61 59 59 59 58 58 59 59 59 58 58 58 58 58 58 57 56 57 57 56 55 55 55 55 55 54 54 54 54 54 54 54 55 55 55 56 55 54 54 53 52 52 52 52 51 50 50 50 49 49 50 50 51 51 51 52 52 51 50 50 50 50 49 49 50 51 51 51 50 50 51 52 51 51 50 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 47 48 48 47 47 47 47 47 47 47 46 45 45 45 46 46 46 46 47 47 47 48 49 49 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 49 49 49 49 48 48 48 48 48 47 47 47 47 47 46 45 45 45 45 45 46 46 45 44 44 45 45 45 45 44 43 44 45 44 44 44 44 43 43 43 43 42 43 43 43 43 43 42 42 42 43 44 42 41 42 43 43 42 42 42 41 41 40 40 41 41 40 39 38 38 39 40 41 41 41 40 40 40 40 40 39 38 37 36 37 37 37 38 39 40 40 41 41 42 41 41 41 40 40 40 39 39 38 38 37 37 37 37 37 36 35 35 36 37 37 37 37 38 39 39 40 41 41 41 40 40 41 41 41 42 43 43 44 44 43 42 41 40 40 40 41 42 42 42 43 43 44 44 44 43 43 43 42 42 41 41 42 41 41 41 41 40 40 40 41 40 40 40 39 39 38 37 37 37 36 35 35 34 34 34 34 34 34 34 33 34 35 34 34 35 36 36 36 37 37 37 37 37 37 38 39 39 39 40 40 40 40 39 39 39 38 39 38 38 38 38 38 39 38 38 37 37 36 35 34 34 33 33 33 33 32 32 32 32 30 30 29 29 29 30 30 30 30 30 31 31 32 32 33 33 33 33 33 34 34 34 33 33 33 32 30 30 31 32 33 33 32 30 30 30 29 29 29 30 30 30 29 29 30 30 30 29 28 29 28 26 26 28 30 33 31 28 26 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 25 25 26 26 27 28 29 30 30 31 30 29 30 30 29 27 26 28 30 29 28 28 29 29 28 27 26 26 27 28 30 30 30 29 29 30 29 28 27 28 29 30 30 30 30 30 30 30 29 29 29 30 30 30 31 30 30 30 30 30 30 30 29 28 28 27 27 27 26 26 27 27 28 28 28 27 26 26 25 25 25 25 26 26 26 26 27 27 27 28 29 30 30 30 30 30 29 29 30 30 30 30 29 28 27 27 26 26 26 25 59 59 59 59 60 59 58 58 59 59 58 58 57 56 55 55 55 55 57 58 59 58 56 56 57 58 58 58 58 58 59 59 59 60 60 60 61 62 61 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 56 55 55 56 55 55 54 54 54 54 54 53 53 53 54 54 54 54 55 55 54 54 54 53 52 52 51 51 50 50 50 51 51 51 52 52 52 53 53 53 52 51 51 52 52 50 50 51 52 52 52 51 50 52 53 52 52 52 51 51 51 51 49 48 47 47 47 47 47 47 49 49 47 47 48 48 48 48 47 47 46 46 47 46 45 45 45 45 45 46 46 47 47 48 48 48 49 49 49 50 50 50 50 50 50 49 49 48 48 49 48 47 47 48 48 49 50 50 49 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 45 45 46 45 44 44 45 45 45 45 45 44 43 44 44 43 44 44 44 43 42 42 42 42 42 42 43 42 42 41 42 43 43 42 41 42 43 43 42 42 42 42 42 42 41 41 41 41 40 39 38 38 39 40 40 41 41 41 40 40 40 39 38 36 36 36 37 38 39 39 40 41 42 42 43 43 42 42 41 41 41 41 40 39 38 38 38 38 38 37 36 35 35 36 37 38 38 38 38 39 39 40 40 41 40 40 40 41 41 42 42 43 44 44 44 43 42 41 40 40 40 42 43 42 42 43 43 44 44 44 43 42 42 43 43 42 42 41 41 41 40 40 40 40 40 40 41 40 40 40 39 38 38 37 37 36 35 35 35 35 35 35 35 34 34 33 34 35 34 34 35 36 36 36 37 38 38 38 38 39 39 39 39 39 40 40 40 40 39 39 39 37 38 38 37 37 37 38 38 38 37 36 36 36 35 34 34 33 32 31 31 31 30 30 30 30 29 29 29 30 30 30 30 30 30 31 32 33 33 33 34 33 33 33 34 34 34 34 34 34 32 31 31 31 32 33 33 33 31 30 30 30 29 29 30 30 30 29 29 30 30 30 29 28 28 28 27 27 27 29 32 31 29 28 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 25 25 25 26 27 28 29 30 29 29 30 30 30 29 29 27 27 28 28 28 29 30 30 28 27 26 26 27 28 30 30 30 29 29 30 29 27 27 28 29 30 30 30 30 29 29 29 29 29 30 30 30 30 31 30 30 30 30 30 30 29 29 27 27 27 27 27 26 26 27 28 29 28 28 27 27 26 25 24 24 25 27 27 27 26 27 27 27 27 28 29 30 30 29 29 29 29 29 30 30 30 29 28 27 27 26 25 24 24 58 58 59 59 60 59 58 57 58 59 59 58 57 56 55 54 55 56 57 58 59 57 56 56 57 58 57 57 57 58 58 58 59 59 60 60 61 61 61 61 60 60 59 59 59 59 59 59 59 58 57 57 58 58 58 57 55 55 55 54 54 54 54 55 54 54 54 53 53 53 53 53 53 54 54 54 54 54 53 52 52 51 50 50 50 51 52 52 51 52 52 52 54 53 52 52 52 52 52 51 50 50 52 53 53 52 51 51 52 54 54 53 52 52 53 53 51 49 49 49 49 48 47 47 48 51 51 49 48 48 49 48 47 47 47 46 46 46 46 45 45 45 45 46 46 47 47 48 48 48 48 49 49 49 49 50 50 50 50 49 49 48 48 48 49 48 47 47 48 48 48 49 49 50 49 49 48 48 48 48 47 46 46 46 46 46 45 45 45 45 45 45 45 45 44 45 45 44 44 45 44 43 43 44 43 43 43 43 43 42 42 42 42 41 41 41 42 42 41 41 42 42 42 41 41 42 43 42 42 42 42 43 43 42 41 41 40 40 39 38 38 38 39 40 41 41 41 41 40 39 38 37 36 36 36 37 38 39 40 40 41 42 42 43 44 43 43 42 42 42 41 40 40 39 38 39 39 38 37 36 35 35 35 37 38 38 38 38 39 39 40 40 41 40 40 41 41 41 42 42 43 44 44 44 43 42 41 40 40 40 42 42 41 41 42 43 44 43 43 44 43 42 42 42 42 42 41 41 41 40 40 40 39 39 40 41 40 39 39 38 38 38 37 37 36 37 37 36 36 36 36 36 35 34 33 34 35 34 34 35 36 37 37 37 37 38 38 38 39 39 39 39 39 40 40 40 39 39 39 38 37 37 37 37 37 37 38 39 38 37 36 36 35 34 34 34 34 33 31 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 31 32 33 33 33 34 33 33 33 34 34 35 34 34 34 33 32 33 33 33 33 33 33 31 30 30 30 29 29 30 31 30 30 30 30 30 29 29 29 29 28 29 28 26 28 31 32 30 28 26 27 26 25 25 25 25 25 25 25 25 25 25 25 25 26 26 27 27 27 27 26 25 24 24 24 24 24 25 25 25 26 27 27 28 29 29 29 30 30 30 30 30 28 26 27 27 28 29 30 29 28 27 26 26 27 29 30 30 30 29 29 30 29 27 27 28 29 30 30 30 30 29 29 29 28 29 30 30 30 30 30 30 30 31 30 30 29 28 28 28 27 27 27 27 26 26 27 28 29 28 27 27 27 27 26 26 25 25 26 27 27 27 27 27 28 28 29 29 30 30 30 29 29 29 29 30 29 29 28 28 27 27 26 26 25 25 58 57 58 58 59 59 58 57 57 58 58 58 57 56 55 54 54 56 56 57 58 57 55 56 57 58 57 56 56 58 58 58 59 59 59 60 61 61 60 60 61 60 59 59 59 58 58 59 59 58 57 58 58 59 59 58 56 54 54 54 55 55 55 55 55 55 55 54 54 53 52 52 52 53 53 54 53 53 53 52 51 50 50 50 51 52 52 52 52 52 53 53 54 53 52 52 52 52 51 51 50 51 53 54 54 53 51 51 52 53 54 54 53 52 53 54 52 50 49 51 52 51 49 48 49 49 49 48 48 49 48 48 47 47 46 46 46 46 46 45 45 45 45 46 47 47 47 47 47 48 48 48 48 48 49 50 49 49 49 49 48 47 47 48 48 48 47 47 47 47 48 48 49 49 50 49 49 49 49 48 47 47 48 48 48 47 47 46 46 46 45 45 45 45 44 44 43 43 44 44 44 43 43 43 43 42 42 42 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 42 43 42 42 42 42 42 42 42 42 41 40 40 40 39 38 38 39 40 41 42 42 41 40 39 38 37 36 36 36 37 38 39 40 41 41 41 43 43 43 43 43 43 43 42 41 41 41 40 40 39 39 38 37 36 35 35 36 37 38 38 39 39 39 39 40 40 41 40 40 40 40 41 41 42 43 44 44 43 43 42 41 40 39 40 41 41 41 42 42 43 43 43 43 43 42 42 41 41 41 41 40 41 41 40 40 40 40 39 40 41 40 39 39 38 38 38 37 37 37 38 38 37 37 37 36 36 35 34 34 35 35 34 34 35 36 37 37 36 36 36 36 37 38 39 39 39 40 40 40 40 39 39 39 39 38 36 37 37 36 36 37 38 38 37 37 36 34 34 34 34 34 34 33 32 31 31 30 30 30 30 30 30 31 31 31 31 31 31 32 33 33 33 33 33 32 32 33 33 34 34 34 34 34 34 34 34 34 34 34 33 33 32 31 31 30 30 30 30 31 32 31 30 30 29 29 29 30 30 29 28 27 26 28 30 30 30 29 28 29 28 28 26 26 27 27 27 28 28 26 26 27 28 28 29 30 29 29 29 28 26 24 24 24 25 25 25 25 25 26 27 27 27 28 29 29 29 31 31 30 29 27 26 26 27 28 29 30 29 28 27 27 27 27 29 30 30 29 29 29 30 29 28 27 27 29 30 30 30 30 29 29 28 28 29 30 30 30 30 30 30 30 30 30 30 29 29 28 29 28 27 27 27 27 27 27 29 30 28 27 27 27 26 26 26 25 25 26 26 28 28 28 28 29 29 30 30 30 30 30 29 29 28 28 29 29 27 27 27 27 27 27 27 26 26 57 57 57 58 59 59 59 57 57 57 58 58 57 56 55 54 54 55 56 57 58 56 55 56 57 57 56 56 56 58 58 58 58 58 59 60 60 61 60 59 60 59 59 58 58 57 57 58 59 58 58 58 59 59 59 58 56 55 56 56 56 56 56 56 55 55 55 55 54 54 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 52 53 52 52 53 54 54 54 54 54 54 53 52 51 51 51 52 53 54 54 53 52 52 53 54 54 54 53 53 53 53 52 50 49 51 52 51 49 48 48 48 47 47 48 48 48 47 47 47 46 46 46 46 45 45 45 45 46 46 46 47 47 47 47 48 48 48 48 48 49 49 49 49 49 48 47 47 47 47 47 47 47 46 46 47 47 48 48 49 49 49 49 49 49 48 48 48 49 48 48 47 47 47 47 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 44 44 44 43 43 43 43 42 41 41 41 41 41 41 40 41 41 42 42 42 42 41 41 42 42 42 43 42 41 40 40 39 38 38 38 39 41 41 41 41 41 40 40 38 37 36 36 36 38 39 40 41 42 41 41 42 43 43 43 43 43 42 42 41 41 41 40 40 40 39 38 37 36 35 35 37 38 38 38 39 39 39 39 39 40 41 40 40 39 40 41 41 42 43 44 43 43 42 42 41 40 39 40 41 41 41 42 42 43 43 43 43 43 42 41 42 41 41 41 40 40 40 40 40 40 40 39 40 41 40 39 39 39 38 38 37 37 38 38 38 38 38 37 36 36 35 34 34 35 36 35 35 36 36 36 36 36 36 36 36 37 38 39 39 39 40 40 40 40 39 39 39 39 38 36 36 37 36 36 36 37 37 37 37 36 35 34 34 34 33 33 33 32 32 32 31 30 30 30 31 32 32 32 32 32 32 33 33 33 34 34 34 33 31 31 32 32 33 34 34 34 34 34 34 34 34 33 32 31 32 33 33 31 30 30 30 30 32 32 31 30 30 29 30 30 30 29 28 28 27 26 27 28 29 30 31 30 29 29 30 28 27 29 29 30 33 32 29 29 29 29 29 31 32 30 29 28 29 27 25 24 24 24 24 25 25 25 26 27 28 28 29 30 29 30 30 30 30 28 27 26 26 26 28 29 29 28 27 26 26 26 27 29 30 30 28 28 29 30 29 27 27 27 29 30 30 30 30 29 28 28 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 28 29 29 28 27 27 27 26 26 26 26 26 27 27 27 29 29 29 30 30 30 30 30 30 30 30 29 28 27 28 27 27 26 26 26 26 27 27 27 27 57 57 57 57 59 59 59 58 56 56 57 57 57 56 55 54 54 54 55 57 57 55 54 55 56 56 55 55 57 58 58 56 57 58 59 60 61 60 59 59 59 59 59 58 57 57 56 57 58 58 59 59 59 59 59 58 57 57 57 57 57 57 57 57 57 56 56 55 55 55 54 53 53 53 52 52 51 51 52 52 52 52 52 53 53 53 54 53 53 54 55 55 55 55 54 54 53 52 53 53 51 52 53 55 55 53 52 53 54 55 55 54 53 52 52 52 50 49 48 50 51 49 48 47 47 47 46 47 47 48 48 47 47 47 46 46 46 46 46 45 45 45 45 45 45 46 47 47 47 47 47 47 47 48 49 49 49 49 49 48 47 47 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 49 49 49 49 49 48 48 48 47 47 47 46 46 45 45 45 44 44 44 43 43 43 43 44 44 43 43 43 43 44 45 44 44 43 43 43 43 42 43 43 42 41 41 41 40 40 40 41 41 40 40 41 41 41 41 42 42 41 41 40 40 39 38 39 39 40 41 40 40 40 40 40 40 39 37 36 36 36 38 40 40 41 42 42 41 41 42 42 42 42 42 41 41 40 40 40 40 40 40 39 38 38 37 35 35 37 38 38 38 39 38 38 39 39 40 40 40 39 39 40 41 41 41 42 43 43 42 41 41 40 39 39 40 41 41 41 41 41 42 42 42 43 43 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 39 39 38 38 37 38 39 39 38 38 37 37 36 35 35 34 34 36 37 36 36 35 35 36 36 36 37 36 37 38 39 39 39 40 40 40 40 40 39 38 38 39 38 37 36 36 35 35 35 35 36 36 36 36 35 34 34 34 33 32 31 31 31 31 30 30 30 30 32 32 33 33 33 33 33 34 33 33 33 34 34 33 32 31 31 32 33 34 34 33 34 34 34 34 34 32 30 30 32 34 33 32 30 30 30 30 32 33 31 30 30 30 31 31 30 29 29 29 29 27 27 27 27 29 31 31 29 29 30 28 27 29 31 32 33 32 30 30 31 30 30 32 33 31 29 27 28 28 26 26 25 24 24 24 25 24 25 28 29 29 30 30 30 30 30 30 29 28 27 26 26 26 28 29 28 27 27 26 26 27 28 29 30 29 28 28 29 30 28 27 27 28 29 30 30 30 30 30 29 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 28 29 29 29 28 27 27 27 26 26 26 27 27 28 29 28 29 30 30 30 30 30 30 30 29 29 29 29 29 28 27 27 27 27 26 26 26 26 26 26 26 57 56 56 57 57 58 58 58 57 56 57 57 58 57 54 53 53 54 55 56 56 55 54 54 55 55 55 55 57 58 57 56 57 58 59 60 60 59 59 59 59 58 58 58 58 57 56 56 57 57 58 58 58 58 59 58 58 58 57 57 57 58 57 57 58 57 57 56 56 56 55 55 54 54 52 52 52 52 53 54 53 53 54 54 54 54 55 54 54 55 55 55 55 54 54 53 53 53 54 53 52 53 54 55 55 54 53 53 54 55 54 54 53 51 51 50 49 48 48 50 49 48 47 47 46 46 46 47 48 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 46 46 47 47 47 47 47 47 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 46 46 47 47 47 47 47 48 48 49 49 48 48 49 48 48 47 47 46 46 46 45 45 45 45 44 44 44 44 44 43 44 46 46 44 44 44 44 45 45 44 43 43 44 43 42 43 43 44 43 42 41 41 41 40 40 40 40 40 40 40 40 40 41 42 42 41 41 40 40 39 38 39 40 41 41 40 40 40 39 39 39 38 37 36 36 36 38 40 40 41 41 42 41 41 41 41 41 41 42 42 41 40 39 39 39 39 39 38 38 38 37 35 35 36 36 37 38 38 38 38 38 39 39 40 40 39 39 40 41 41 41 42 43 43 42 41 39 39 39 40 40 40 40 40 40 40 41 42 42 43 42 41 40 40 40 40 40 40 40 40 39 39 40 40 39 39 40 40 40 39 38 38 38 38 38 39 39 38 37 37 36 35 35 35 34 34 36 37 37 37 36 36 36 37 37 37 38 38 38 39 39 39 40 40 40 40 39 39 38 38 38 38 38 37 35 35 35 35 34 34 35 35 35 35 35 34 34 34 33 31 32 31 30 30 30 31 32 33 33 33 33 33 33 34 34 34 33 33 33 34 34 33 32 30 31 33 33 33 33 33 33 33 34 33 32 30 31 33 33 33 32 30 30 30 30 31 33 33 31 30 31 32 31 30 30 30 30 29 29 28 27 26 28 30 30 30 31 31 28 28 30 32 33 33 32 30 31 32 32 32 33 32 31 29 29 28 28 28 28 26 24 24 24 24 24 25 28 30 30 30 30 30 31 31 30 29 28 27 26 26 26 28 28 27 27 26 26 26 28 29 29 30 29 27 28 29 30 28 27 27 28 29 29 30 30 30 29 28 28 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 28 29 30 30 29 27 27 27 27 26 26 26 27 27 29 29 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 28 28 28 28 28 27 26 26 26 26 26 56 56 56 56 57 57 57 57 57 56 56 57 57 56 54 53 53 53 54 55 55 55 54 54 54 54 55 56 57 57 56 56 57 58 59 59 59 59 58 58 58 58 58 58 57 56 55 55 56 56 57 57 57 57 58 58 58 57 56 57 58 58 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 55 55 54 54 54 54 54 54 55 54 54 55 56 56 55 54 54 54 54 55 55 54 52 53 54 55 55 54 54 54 54 54 53 53 52 50 49 49 48 47 48 48 48 47 47 47 46 46 46 47 48 47 47 46 47 47 47 46 46 45 45 45 45 45 45 45 45 46 46 47 47 47 47 47 47 47 48 48 48 47 47 47 46 46 45 46 46 46 46 46 46 46 46 46 47 47 47 48 48 49 49 48 48 48 48 47 46 46 46 45 45 46 46 46 45 44 44 45 45 45 44 45 47 46 45 44 44 45 45 45 44 44 44 44 43 43 43 44 44 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 40 40 39 39 38 39 41 42 42 41 41 41 40 38 38 37 37 36 36 37 39 40 40 40 41 42 42 41 40 40 40 40 42 42 41 40 40 39 38 38 38 37 37 38 37 35 35 35 36 36 37 37 37 37 37 37 38 38 39 39 39 40 40 40 41 42 42 41 41 40 38 38 40 41 41 40 40 40 40 41 41 42 42 42 41 40 40 41 40 40 40 39 39 39 39 39 39 40 39 38 40 40 40 39 38 38 39 39 39 39 38 38 37 36 35 35 35 34 35 36 37 37 37 37 37 37 37 38 38 38 39 39 39 39 39 40 40 40 40 40 39 39 38 37 37 38 39 38 36 37 38 37 34 33 34 34 34 35 35 34 34 34 34 33 33 32 30 30 32 33 33 33 34 33 33 33 33 34 34 34 34 34 32 31 32 32 32 31 30 31 32 32 32 32 32 31 32 31 30 29 30 31 31 31 31 31 30 30 30 31 33 33 32 31 30 31 31 30 30 30 30 29 28 27 27 28 29 30 30 31 32 32 30 29 31 32 33 33 33 32 32 33 33 33 32 30 30 30 30 30 30 30 29 27 25 24 24 24 24 25 28 30 31 30 30 30 32 32 30 29 29 27 27 26 26 27 27 27 26 26 26 26 28 29 30 29 28 27 28 29 29 27 27 27 27 28 29 30 29 29 29 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 28 29 29 30 30 30 29 28 27 27 27 26 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 30 29 27 27 27 27 27 27 56 55 55 55 56 56 57 57 57 56 55 55 55 56 55 54 53 53 54 54 55 55 54 53 54 54 56 58 58 56 55 55 57 57 58 59 59 58 58 58 58 57 57 57 56 55 54 54 55 56 56 55 56 56 57 58 58 57 56 56 57 57 56 56 56 55 55 55 55 55 54 54 55 55 54 54 55 54 54 54 54 53 53 54 54 54 54 55 55 56 56 56 55 55 55 55 55 55 55 54 53 53 55 55 55 55 55 54 53 53 52 51 51 50 49 48 48 47 47 47 47 47 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 46 47 46 46 46 46 46 47 47 48 47 47 47 46 46 45 45 45 46 46 46 46 45 46 46 46 46 47 48 48 49 48 48 49 48 48 48 47 46 46 46 46 46 46 47 46 45 45 45 46 47 46 45 47 48 47 46 45 45 46 46 46 45 44 45 45 44 43 43 44 44 43 42 42 43 42 41 41 42 42 42 42 41 40 40 40 40 40 40 40 39 39 39 39 40 42 43 43 42 41 41 40 39 38 37 36 35 36 37 38 39 39 39 41 42 41 41 40 40 40 40 41 42 41 41 40 39 39 39 38 37 37 37 37 35 35 37 38 37 36 36 37 37 37 38 39 38 38 39 39 40 40 40 41 41 41 40 40 39 38 39 41 41 41 40 40 40 41 41 41 42 42 42 41 40 40 40 40 41 40 40 39 38 39 39 39 39 39 38 39 40 40 39 38 38 39 39 39 38 37 37 36 36 36 36 35 34 35 37 37 37 37 37 38 38 38 39 39 39 39 39 39 39 39 40 40 40 39 39 39 39 38 37 37 37 37 38 38 38 39 38 36 35 34 33 34 34 34 35 34 34 34 34 33 32 31 32 33 34 34 34 35 35 34 33 33 33 34 34 34 34 32 30 30 30 31 31 30 30 30 31 30 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 31 31 32 32 31 30 29 29 29 29 29 28 28 27 27 29 29 30 30 30 31 32 32 31 30 32 31 32 33 34 34 34 34 34 34 32 30 31 32 31 30 30 30 28 26 25 25 25 25 24 24 27 31 32 30 30 30 31 31 30 29 29 27 27 26 26 27 27 27 26 26 26 28 29 29 30 28 27 27 28 29 28 27 27 27 27 28 29 29 28 28 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 28 27 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 28 28 28 29 30 29 28 28 28 28 27 55 54 54 54 54 55 57 57 57 56 55 54 55 55 55 54 53 52 53 54 54 55 53 53 54 55 56 57 57 56 55 55 56 57 57 58 58 58 57 56 56 56 56 55 55 54 53 54 54 55 55 55 55 55 56 56 56 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 55 54 53 53 54 53 52 53 53 53 54 55 55 56 56 56 55 55 55 55 55 55 55 55 54 54 55 55 54 55 55 53 52 52 52 51 50 50 49 48 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 46 45 45 46 46 47 47 47 47 47 47 46 46 45 45 45 46 46 46 45 45 45 46 46 47 47 47 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 47 47 47 46 45 47 48 47 46 46 46 47 47 46 45 45 45 44 43 44 44 44 44 44 43 44 43 42 42 43 43 42 42 42 41 40 40 40 39 39 39 40 40 39 39 40 41 42 42 43 42 41 40 40 40 38 37 36 35 36 38 37 38 39 39 40 41 41 40 40 40 39 40 41 41 41 41 40 39 39 39 38 38 37 36 35 35 36 38 39 39 38 37 37 37 37 39 40 39 39 40 40 40 40 41 40 40 40 39 39 38 38 40 41 40 39 39 40 40 41 41 41 41 41 41 41 40 39 39 40 40 40 40 39 39 39 39 38 38 39 38 38 38 39 38 38 38 39 39 39 38 37 37 37 37 37 36 35 34 34 35 36 36 37 37 37 38 39 39 39 39 39 40 40 40 40 40 40 39 39 39 39 39 38 37 37 36 36 37 38 39 39 38 37 37 35 34 34 34 34 35 35 35 34 33 33 32 33 33 34 35 34 35 36 35 34 33 33 33 33 34 34 34 33 32 31 30 30 30 30 30 29 29 29 30 30 29 29 29 29 29 29 29 30 29 29 30 30 30 30 30 30 31 31 30 30 30 29 29 28 27 27 27 28 29 29 29 29 31 31 30 32 33 31 31 32 31 32 33 34 34 33 33 34 33 32 31 31 32 31 30 30 29 28 26 25 25 25 25 24 24 27 31 31 30 30 30 30 30 30 29 28 27 27 26 26 27 27 26 26 26 27 28 30 30 29 28 27 27 27 28 27 26 26 27 28 29 29 28 27 27 27 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 29 28 26 26 27 28 27 27 29 30 30 30 30 30 29 29 30 30 30 30 30 30 30 29 29 28 27 27 28 29 30 29 28 28 27 26 55 54 54 54 54 55 57 57 57 56 55 54 54 55 55 54 53 52 52 54 54 54 53 53 54 54 55 56 56 55 55 55 56 56 57 58 58 58 57 55 55 55 55 55 54 54 53 53 54 55 54 54 54 54 54 54 55 56 56 55 55 54 54 54 54 54 54 54 54 53 53 53 54 53 53 54 54 54 53 53 54 53 52 52 52 54 54 54 55 56 56 56 55 55 55 54 54 54 55 54 54 54 54 54 53 54 53 53 51 52 52 51 50 48 48 48 47 46 46 46 46 46 46 46 46 46 45 46 47 47 47 46 46 46 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 46 47 47 47 46 46 47 47 46 46 46 45 46 46 46 45 45 45 46 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 47 47 47 48 47 47 46 47 48 48 47 46 46 46 48 48 46 47 47 47 47 47 46 46 45 44 44 44 45 45 45 45 44 44 43 42 43 44 43 42 41 41 41 41 41 40 40 39 39 40 41 41 41 41 41 41 41 41 42 41 40 40 39 38 37 36 35 36 37 36 37 39 39 40 41 42 41 40 40 39 40 40 40 41 41 40 39 38 38 38 38 36 35 35 35 37 38 39 40 40 39 38 38 38 39 40 40 40 40 40 41 40 40 40 39 39 38 37 37 38 40 41 40 39 38 39 40 40 40 41 41 41 40 41 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 37 37 37 37 36 35 35 34 35 36 35 35 35 36 36 37 38 37 38 39 39 39 40 40 41 41 40 39 39 39 39 39 39 38 37 36 36 36 37 38 39 39 38 37 36 35 34 33 34 34 35 36 35 34 33 33 34 34 35 35 35 35 36 35 34 34 34 33 32 33 33 33 33 33 32 30 30 30 30 30 29 30 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 29 28 27 28 29 30 30 30 29 29 32 32 31 32 33 31 31 33 34 34 33 32 33 33 32 32 32 31 30 30 30 30 30 30 28 26 25 25 25 25 25 24 24 28 30 29 29 29 30 30 30 30 30 29 28 27 26 26 27 27 26 26 26 27 29 30 29 28 27 27 27 27 27 27 26 26 28 29 28 27 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 29 29 29 30 30 30 30 30 30 30 29 28 27 26 26 27 29 28 27 29 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 29 28 27 27 28 28 28 28 27 27 26 55 54 54 54 54 54 56 56 57 56 56 55 54 54 54 54 53 52 52 54 53 53 53 53 54 54 55 55 55 55 54 55 56 56 56 57 57 57 56 55 55 55 55 55 54 54 53 54 55 54 54 54 54 54 54 54 54 55 55 55 55 54 54 53 54 54 54 53 54 53 53 53 54 53 53 53 53 53 53 52 53 52 52 52 52 53 54 54 54 55 56 56 55 54 54 53 53 53 54 54 53 53 53 53 53 53 53 52 51 51 52 51 50 48 47 47 46 46 46 46 46 45 45 45 45 45 45 46 47 46 46 46 46 46 45 45 46 46 46 46 46 45 45 44 44 44 45 45 45 45 45 46 46 47 47 47 46 46 46 47 47 46 46 45 45 46 47 46 45 45 45 46 46 47 47 47 47 47 47 48 48 48 48 47 47 48 48 48 48 48 48 47 47 47 48 48 48 46 46 47 47 48 47 48 48 47 47 47 47 47 46 46 45 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 42 42 41 41 40 40 40 40 41 41 42 42 42 41 40 40 40 40 40 39 38 37 36 36 36 35 36 37 38 38 39 40 41 41 40 39 39 39 40 41 40 40 40 39 38 38 38 38 37 35 35 35 37 39 39 40 40 39 38 38 38 38 39 40 40 40 40 40 40 39 39 39 39 38 37 38 39 40 40 40 38 38 39 40 40 40 41 41 40 40 40 40 40 38 38 38 39 39 39 39 39 38 38 37 37 38 39 39 39 39 39 39 39 40 39 39 39 38 37 37 37 36 36 35 35 36 37 36 36 36 36 37 37 36 37 38 39 39 40 40 41 41 40 40 39 38 39 39 39 39 38 37 36 36 36 37 38 38 37 37 37 36 34 33 33 34 35 36 36 34 33 34 35 35 36 36 36 36 36 35 35 34 34 34 33 32 32 31 31 31 30 30 30 31 30 30 30 31 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 29 28 28 29 30 30 31 32 31 30 31 32 32 33 33 32 32 33 33 32 31 30 31 31 31 30 30 30 30 30 30 30 30 30 28 26 24 24 24 24 24 24 25 27 28 29 28 29 30 30 31 30 29 28 27 26 26 26 27 27 26 26 26 27 29 29 29 27 27 27 27 27 27 26 26 26 27 27 27 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 29 29 30 30 30 30 30 29 28 28 28 28 27 26 27 28 29 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 26 26 55 54 54 53 53 54 55 56 56 56 56 55 54 53 54 54 53 52 52 53 52 52 53 54 54 54 55 55 55 54 54 54 55 55 56 57 57 56 56 55 55 55 55 54 54 53 52 53 54 54 54 54 54 54 53 54 54 55 55 55 54 54 54 53 53 53 53 53 53 53 52 52 53 53 52 52 53 53 52 52 52 52 51 52 53 53 53 53 54 54 55 55 55 54 53 53 52 52 53 53 53 53 53 52 53 54 53 51 50 50 50 49 48 47 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 46 46 46 45 44 44 44 44 45 45 46 46 46 47 47 47 46 46 45 46 47 47 46 46 45 45 46 47 47 45 44 45 46 47 47 47 47 47 47 47 48 47 48 48 47 47 48 48 48 48 47 47 48 48 48 48 49 48 47 47 48 48 48 48 48 47 47 47 47 46 47 47 46 46 46 46 46 46 45 44 44 44 43 43 43 42 42 42 43 43 43 42 42 42 40 40 40 40 41 42 42 43 42 41 40 40 40 39 39 39 38 37 37 37 36 36 35 36 37 37 38 39 39 40 40 40 39 39 40 40 40 40 40 39 38 38 38 37 37 35 35 36 38 38 38 39 40 40 39 38 38 38 39 40 41 40 40 40 39 38 39 39 39 38 37 38 38 39 40 39 38 38 39 40 40 40 41 41 40 39 40 41 40 39 38 38 38 39 39 39 38 38 37 37 38 39 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 37 36 36 35 35 37 37 38 38 38 39 39 38 37 38 39 39 40 40 41 41 40 40 39 37 37 38 38 39 38 38 38 37 36 36 37 37 37 37 37 36 35 35 34 33 34 36 36 35 34 34 36 36 36 36 36 37 37 36 36 35 34 34 33 33 32 31 31 30 30 31 32 31 30 31 32 32 30 30 31 31 30 29 30 30 30 29 29 29 28 28 28 29 29 29 29 30 30 30 30 29 28 28 28 28 29 30 31 32 33 33 31 32 33 33 33 33 33 33 34 33 32 30 30 29 29 29 29 29 29 28 28 28 28 29 30 29 26 24 24 24 24 24 24 25 26 28 28 28 28 29 30 30 30 29 28 27 26 26 26 27 26 26 26 27 27 27 29 29 28 27 27 27 27 26 26 26 27 27 27 27 27 28 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 28 29 30 30 30 30 30 30 30 30 29 29 28 28 29 29 30 30 30 30 30 30 30 30 29 28 27 27 26 26 26 26 26 55 54 54 53 53 54 55 55 56 55 55 55 54 53 53 54 53 52 52 52 52 53 53 54 54 54 55 55 54 54 54 54 54 55 56 57 56 55 55 55 55 55 55 54 53 53 52 53 54 54 53 54 54 53 53 54 54 55 55 55 54 53 53 53 53 53 53 53 53 53 52 52 52 53 52 51 52 53 52 51 52 52 52 53 53 52 52 53 54 54 54 54 55 54 53 52 52 52 51 52 53 52 52 52 53 53 53 52 51 49 48 48 47 46 46 46 46 46 45 45 46 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 46 46 46 45 44 44 44 44 44 45 46 46 47 47 47 47 46 46 45 45 46 46 46 46 45 44 45 47 47 45 44 45 46 46 47 47 47 47 46 46 47 47 48 48 47 47 48 48 47 47 47 47 48 48 48 48 49 49 48 48 48 49 49 48 48 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 44 43 43 43 43 42 41 41 41 42 42 42 42 43 43 43 42 41 40 40 40 39 38 38 37 37 37 37 36 35 35 36 37 38 38 39 40 40 40 39 38 39 39 40 40 40 40 39 39 39 38 36 35 36 38 39 38 39 39 39 40 39 38 38 38 39 40 40 40 40 39 38 38 38 38 38 38 37 37 38 38 38 38 38 38 39 40 40 41 41 40 39 39 40 40 40 39 39 38 38 38 38 38 38 37 37 37 39 40 40 39 39 39 40 40 40 40 40 40 40 40 39 39 39 38 37 37 36 35 36 37 38 39 39 39 40 39 39 38 38 39 39 40 41 41 40 40 39 38 37 37 37 38 38 39 39 38 36 36 37 37 37 36 36 37 37 37 35 33 33 35 36 35 34 34 35 36 37 37 37 37 37 37 36 35 34 34 34 34 33 33 33 32 32 32 32 31 32 33 33 33 32 32 33 32 30 30 31 32 31 30 30 29 29 28 28 28 28 28 28 29 29 29 28 28 27 28 28 29 29 30 31 32 33 33 33 34 34 33 33 33 33 34 34 34 33 31 30 30 30 29 29 29 29 28 27 27 27 28 29 28 26 24 24 24 24 24 24 24 26 28 27 27 28 29 30 30 30 30 28 27 26 26 26 27 26 26 26 27 27 28 29 29 28 26 26 27 26 26 26 26 26 26 27 27 27 29 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 31 31 31 31 31 31 31 31 30 30 30 30 30 29 28 27 27 27 27 28 29 30 30 30 29 29 29 29 29 28 28 28 27 27 28 29 30 30 30 30 30 30 30 29 29 29 28 28 27 27 27 27 54 54 53 53 53 54 54 55 55 55 55 55 54 53 53 53 53 52 52 52 52 53 53 53 54 54 55 54 54 54 54 54 55 55 56 56 55 54 54 54 55 55 55 54 53 52 52 52 53 53 53 54 53 52 52 53 54 55 55 54 53 53 53 52 52 52 53 53 52 53 52 51 52 53 52 51 52 53 52 51 51 51 52 53 53 52 52 53 53 53 53 54 54 54 54 52 51 51 51 52 53 52 51 52 52 52 53 53 52 50 48 48 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 46 46 46 46 45 45 45 45 45 46 46 46 45 44 44 44 45 46 46 47 47 47 47 47 47 46 45 45 46 46 47 46 45 44 45 46 46 45 44 45 46 46 47 47 47 47 46 45 46 48 48 48 46 46 47 47 46 46 46 47 48 48 48 48 49 49 49 49 49 48 48 47 47 46 46 45 45 45 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 44 45 44 44 44 43 42 42 42 42 42 42 43 43 43 43 43 42 42 41 40 40 40 39 38 38 38 37 37 37 36 36 36 36 36 36 37 38 39 40 40 39 38 39 39 39 40 40 39 38 38 38 37 35 36 37 38 39 40 40 40 40 40 39 38 38 38 39 40 40 40 40 39 39 39 39 38 38 38 37 37 37 37 37 37 38 38 39 39 40 41 41 40 39 39 40 39 39 39 39 38 37 37 37 37 37 37 37 37 38 39 39 39 38 38 39 39 39 39 40 40 40 41 40 40 38 38 38 37 36 36 36 36 37 38 38 39 40 40 40 39 38 39 39 40 41 40 40 40 40 39 38 37 37 37 37 38 39 38 37 36 36 37 37 36 36 36 36 37 36 34 33 34 36 35 34 34 34 36 37 37 37 36 36 36 36 35 34 34 34 34 34 34 34 33 33 33 32 32 33 33 34 33 33 33 33 31 30 29 31 32 32 30 30 30 29 29 29 29 28 28 28 29 28 28 28 28 29 29 29 29 30 30 31 32 33 34 34 35 34 33 34 34 34 34 34 34 34 33 32 32 32 31 30 31 31 30 29 28 27 26 27 27 25 24 24 24 24 24 24 24 25 26 26 27 28 29 29 29 30 29 27 27 27 26 26 26 26 26 26 27 28 29 30 29 28 26 26 26 26 26 26 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 32 32 32 31 31 30 30 30 30 29 29 27 27 27 27 28 28 28 29 30 30 29 28 27 28 28 27 27 27 27 27 27 29 29 29 30 30 30 30 29 29 30 30 30 29 28 28 28 28 54 53 53 53 53 53 54 54 54 54 54 54 54 54 53 52 52 52 52 51 51 53 53 53 54 55 54 54 53 53 53 54 55 55 55 55 55 54 53 54 54 54 55 54 53 52 52 51 52 53 53 54 53 52 52 53 53 54 54 54 54 53 52 52 52 52 52 52 52 52 53 52 51 52 51 51 52 53 52 51 50 51 52 52 52 52 53 53 53 53 53 53 53 54 54 53 52 51 51 52 53 52 51 51 51 51 52 53 52 50 48 48 47 46 46 45 45 45 45 45 45 45 44 44 45 45 45 45 46 45 45 45 46 46 46 45 45 45 45 45 45 45 46 45 44 44 45 45 46 47 47 47 47 47 47 47 46 45 45 45 46 46 47 46 45 44 45 45 44 44 45 46 46 46 46 46 47 46 45 47 48 48 47 46 46 46 46 46 46 46 47 47 47 47 48 48 49 49 49 49 48 47 47 46 45 45 45 44 44 45 46 46 45 45 45 45 45 45 45 46 45 45 44 43 45 45 45 44 44 43 42 42 43 42 42 42 43 43 43 43 43 42 41 40 40 40 39 38 39 40 39 38 38 37 37 37 37 36 36 36 36 37 38 39 39 39 38 38 38 38 39 40 39 38 38 37 35 34 36 37 38 40 41 41 40 40 39 38 37 38 38 40 41 41 40 41 41 40 40 40 39 38 38 37 36 36 36 37 37 38 38 38 39 40 40 40 39 38 38 39 39 39 38 38 38 37 37 37 37 37 37 37 37 38 39 38 39 39 39 39 39 39 40 40 40 40 41 41 40 39 39 38 38 37 37 37 36 36 36 37 39 39 39 40 39 39 39 39 40 40 40 40 40 39 39 38 38 37 37 36 37 38 38 37 36 36 36 37 37 36 35 36 36 35 34 32 33 35 35 34 34 34 36 37 37 37 36 36 36 36 35 35 35 35 35 35 34 34 34 34 33 32 33 34 34 33 33 33 34 33 31 29 29 30 32 32 31 30 30 29 29 29 29 29 29 29 30 29 29 29 29 30 30 30 30 30 30 31 32 33 34 35 34 33 33 33 34 34 34 34 33 34 34 33 32 31 31 30 31 31 30 30 30 29 27 26 26 25 24 24 24 24 24 24 24 24 24 25 26 27 27 28 29 30 29 28 27 27 26 26 26 26 26 26 27 27 28 29 28 27 26 26 26 26 26 27 27 27 27 27 27 27 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 31 32 31 31 31 31 31 31 31 30 30 30 30 29 28 27 28 29 29 29 29 29 29 30 30 30 29 27 27 27 27 27 27 27 27 27 29 29 28 29 29 29 30 29 29 29 30 29 29 29 29 29 29 54 53 53 52 52 53 54 54 54 54 54 54 54 54 53 52 52 51 51 51 52 53 54 54 54 54 54 53 53 52 53 53 54 55 55 55 55 54 53 53 53 54 54 54 54 53 52 51 52 52 52 53 53 52 52 52 53 53 54 54 54 53 52 52 51 51 52 52 51 52 53 52 52 51 51 51 52 52 52 51 50 51 52 51 51 52 52 52 52 53 53 53 53 53 53 53 52 51 51 52 53 52 50 50 50 51 52 52 51 50 48 48 47 47 47 46 45 45 45 45 44 44 44 44 44 45 45 45 46 45 45 45 46 46 46 45 45 45 45 45 45 46 46 45 43 44 44 45 46 46 46 47 47 47 47 47 46 46 45 45 45 46 47 46 46 45 44 44 44 44 45 46 46 46 46 46 46 45 45 47 48 47 46 45 45 45 46 45 45 45 45 45 45 46 47 48 49 49 49 49 49 48 46 45 45 44 44 44 44 44 44 45 45 45 45 45 44 44 44 45 45 45 44 44 45 45 45 44 43 43 42 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 40 39 40 40 40 39 38 38 38 38 37 37 37 36 35 36 37 38 38 39 39 38 37 37 39 40 39 39 38 37 35 34 35 37 39 40 41 41 41 40 38 37 38 38 39 40 41 41 41 41 42 41 41 40 40 40 39 38 37 36 36 37 38 38 38 39 40 40 39 38 38 38 39 39 39 38 37 37 37 37 37 37 38 38 38 38 38 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 39 39 38 37 37 38 37 36 36 37 39 39 39 40 39 39 39 40 40 40 40 39 39 39 38 39 39 39 37 36 36 37 37 37 36 35 36 37 37 36 35 35 35 35 34 33 33 34 34 33 33 34 35 36 36 37 36 36 35 35 35 35 35 36 36 35 34 34 33 33 32 33 34 34 34 33 33 34 34 33 32 30 30 30 32 33 31 30 30 30 30 30 30 29 30 30 30 30 30 30 30 30 30 30 30 30 31 33 33 33 34 34 34 33 32 32 32 33 33 33 33 33 34 33 31 30 31 31 30 30 30 30 29 28 27 25 24 24 24 24 24 24 24 24 24 24 24 25 26 27 28 29 29 30 30 29 28 27 26 26 26 26 26 26 26 27 27 28 28 26 26 26 26 27 27 27 28 28 27 28 28 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 31 31 31 30 30 31 30 30 30 30 29 28 28 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 28 29 29 27 28 29 29 29 28 27 28 29 29 29 29 29 29 28 54 53 53 52 52 53 53 53 53 53 53 53 54 53 53 52 52 51 51 51 52 53 54 55 54 54 53 53 52 53 53 54 54 55 55 55 55 54 53 52 53 54 54 53 53 53 52 51 51 52 52 53 53 51 51 52 52 52 53 54 55 54 53 52 51 51 51 51 51 51 52 53 52 51 50 51 52 52 51 51 50 51 51 51 51 51 51 52 52 53 53 53 52 52 52 53 53 51 50 50 52 52 50 49 50 51 51 51 51 50 48 47 46 46 46 46 46 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 46 46 46 45 45 44 44 45 46 46 45 43 43 44 44 45 46 46 47 47 47 47 47 47 46 45 45 45 45 46 46 46 45 44 43 43 44 45 46 45 46 46 45 44 44 45 47 48 47 46 45 44 44 45 45 44 44 44 45 46 47 47 48 48 49 49 49 48 47 46 45 45 44 43 43 44 44 44 44 45 45 45 44 44 44 44 44 45 45 45 45 46 45 44 44 43 43 43 43 43 44 44 43 43 43 42 42 43 43 43 42 41 40 40 40 40 40 40 39 39 38 38 38 38 37 37 37 36 36 36 37 38 39 39 38 37 37 39 40 40 39 38 37 36 34 34 37 39 40 41 42 42 41 38 37 38 39 39 40 42 42 41 42 42 42 41 40 40 39 39 38 37 36 36 37 38 38 38 38 39 39 39 38 37 38 39 39 38 37 37 37 37 36 37 37 38 39 39 38 39 40 40 40 41 40 40 40 40 40 40 41 41 41 41 41 40 40 39 39 38 37 38 38 38 38 37 37 38 39 39 40 40 39 39 40 40 40 40 40 39 38 38 39 38 38 38 36 36 37 37 37 37 35 35 37 37 36 35 34 34 34 35 34 32 33 34 33 33 34 35 35 36 37 37 36 35 35 35 35 36 36 36 35 34 34 33 33 33 33 34 34 34 33 34 34 34 34 33 31 30 31 33 33 31 30 30 30 30 30 30 30 31 31 30 31 31 30 30 31 30 30 30 31 32 33 34 34 34 34 34 34 32 30 30 32 33 32 33 33 33 33 31 30 31 31 30 29 29 29 28 26 25 24 24 24 24 24 24 24 24 24 24 24 24 25 26 27 28 28 29 29 30 29 28 27 27 26 26 26 26 26 26 27 27 28 27 26 26 26 27 27 27 28 29 28 28 29 29 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 31 31 30 30 30 31 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 29 28 27 27 26 26 27 28 29 28 27 27 28 28 28 28 27 27 29 29 28 28 28 29 28 53 53 52 52 51 52 53 53 53 53 53 53 53 53 53 52 52 51 51 51 52 53 54 54 54 53 53 52 52 53 54 55 55 55 55 55 54 54 53 53 53 53 53 53 52 52 52 51 51 51 52 53 52 51 51 51 52 52 53 54 54 54 53 52 52 51 50 50 50 50 51 52 52 51 50 50 51 52 51 50 50 51 51 50 51 51 52 52 53 54 54 53 52 52 52 52 53 52 50 49 51 51 50 49 49 50 50 49 50 49 48 48 47 46 46 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 45 45 45 46 46 45 45 45 44 43 44 45 46 46 44 43 43 44 44 45 46 47 47 47 47 47 47 46 46 45 45 44 46 46 46 46 44 43 43 44 45 46 45 45 46 44 43 45 46 47 47 47 47 46 45 44 44 44 43 43 45 46 47 47 48 48 48 48 48 49 49 48 47 46 46 45 43 43 43 43 44 45 45 45 45 44 44 44 43 43 44 45 45 46 46 45 45 44 44 44 43 43 43 44 43 43 43 42 42 42 42 42 43 43 42 40 40 40 40 40 40 40 39 39 38 39 38 37 37 37 37 36 35 36 37 38 38 38 37 38 39 40 40 39 38 37 36 34 34 37 40 41 42 41 41 40 38 37 38 39 40 41 42 43 43 43 43 42 41 41 40 40 39 38 38 37 36 37 38 38 37 37 38 39 39 38 37 38 38 37 37 36 36 36 36 36 38 38 39 39 39 39 39 40 41 41 40 40 40 39 40 40 40 41 41 41 41 41 40 40 39 38 38 38 38 39 39 38 37 37 38 39 39 39 39 40 40 40 40 40 40 40 38 37 37 38 38 37 37 37 36 36 37 37 37 36 35 36 36 36 36 35 34 34 35 35 33 33 34 33 33 34 35 35 36 37 37 36 35 34 34 35 36 36 37 36 35 34 34 34 33 34 35 35 35 34 34 35 34 34 33 31 31 33 34 33 31 31 32 31 32 31 30 32 33 32 32 33 33 32 32 32 31 30 30 32 33 34 34 34 34 34 34 33 31 30 30 31 32 32 31 31 32 32 31 30 30 29 29 28 27 27 26 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 26 26 27 27 29 29 29 28 27 27 27 26 26 26 26 26 27 27 27 27 26 26 27 27 27 27 28 30 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 31 30 30 30 30 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 26 26 27 27 28 28 27 27 27 27 28 28 27 27 28 28 27 27 28 28 28 52 53 52 51 51 52 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 53 54 54 53 53 52 52 52 54 55 54 54 54 54 54 55 54 54 54 53 52 52 52 52 52 51 51 50 50 51 52 52 51 51 51 51 52 53 54 54 54 54 53 52 51 50 50 50 50 50 52 52 52 50 50 51 51 50 49 49 50 50 50 50 52 53 53 54 54 54 54 53 52 51 51 52 51 49 49 50 50 49 49 49 49 49 49 48 48 48 47 47 47 46 46 46 46 46 45 45 44 44 44 44 44 44 44 44 45 45 46 46 46 46 45 45 45 44 43 43 44 45 45 44 43 43 43 44 45 46 47 47 47 47 47 47 46 45 45 44 44 46 46 46 46 44 43 43 43 45 46 45 44 44 43 43 45 46 46 46 47 47 46 45 43 43 44 43 43 44 45 45 46 47 48 47 47 47 48 49 48 47 47 46 45 43 43 43 42 44 45 44 44 44 45 45 44 43 43 43 44 45 45 46 46 45 45 44 44 43 43 43 43 43 43 43 42 42 42 42 42 43 43 42 41 41 41 41 40 40 40 40 39 39 40 39 38 37 37 37 37 36 35 36 37 37 36 37 38 38 39 39 39 38 36 35 34 35 38 40 41 41 40 39 38 37 38 39 40 40 41 42 43 43 43 42 42 41 40 40 40 39 38 38 36 35 36 37 37 37 37 38 38 38 37 37 37 37 36 36 35 35 36 36 37 38 38 38 38 39 39 39 39 40 40 40 39 39 39 38 39 40 40 40 40 40 41 40 40 39 39 39 38 38 39 40 39 38 37 39 39 39 39 39 39 40 40 40 40 40 39 38 36 36 37 37 37 37 37 36 35 36 36 36 35 34 35 36 36 35 35 34 33 34 34 33 32 33 33 33 34 34 35 36 37 37 36 35 34 34 34 35 36 37 36 35 34 34 34 34 35 36 36 36 35 35 35 34 34 33 31 31 33 34 32 31 32 33 33 33 31 32 33 34 33 33 34 34 33 33 33 33 31 31 32 33 33 34 34 33 33 34 33 32 30 31 31 30 30 30 30 31 32 31 30 30 30 29 28 28 28 26 24 24 24 24 24 24 24 24 24 24 24 24 24 25 27 27 27 27 27 27 28 29 28 27 27 27 27 27 26 26 26 26 26 26 27 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 31 31 30 30 30 30 31 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 26 26 27 27 27 27 27 27 27 27 28 27 27 27 28 28 27 27 27 27 28 52 52 52 52 51 51 52 52 51 52 52 52 52 52 52 52 52 51 51 51 51 53 53 53 52 52 52 52 53 54 54 54 54 54 54 54 55 55 54 54 53 52 51 51 52 51 51 51 50 50 51 51 51 51 51 51 51 52 53 53 54 54 54 53 52 51 51 51 50 49 50 51 51 51 49 49 51 50 49 49 49 49 49 50 51 53 53 53 54 54 54 54 54 53 51 50 51 50 49 49 49 49 49 48 48 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 44 45 46 46 46 46 47 47 46 46 45 45 44 44 45 46 46 45 44 43 42 43 44 45 45 43 43 43 43 44 45 45 46 47 46 45 44 43 43 43 43 43 43 44 44 45 46 46 45 46 46 46 47 47 47 47 46 44 43 43 42 42 43 44 44 44 44 44 44 44 44 43 43 43 44 44 45 45 45 44 44 44 44 44 43 43 43 43 43 43 42 41 41 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 39 39 38 38 38 37 36 35 35 35 36 35 36 38 38 38 38 38 38 37 35 34 36 38 40 41 40 40 38 36 36 38 39 41 41 41 42 42 42 42 41 41 41 40 39 39 38 37 37 36 35 35 36 37 37 37 37 37 37 37 37 36 36 35 35 35 35 36 36 37 37 37 37 37 38 38 38 38 38 39 39 38 38 38 38 39 39 39 39 39 40 40 40 40 39 39 39 38 38 39 40 39 38 37 39 39 39 39 39 39 40 40 40 40 39 38 37 36 36 36 37 37 37 37 37 36 35 35 36 35 34 35 36 36 35 34 33 33 33 34 33 32 32 32 32 33 33 34 35 36 36 37 36 34 34 34 34 35 36 35 35 35 35 35 36 36 36 37 36 36 36 35 34 34 34 32 31 33 34 33 33 33 33 34 33 33 33 34 34 33 33 32 32 31 32 33 33 32 30 31 32 33 34 33 33 33 34 34 33 31 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 29 27 24 24 24 24 24 24 24 24 24 24 24 24 24 27 29 29 29 28 27 26 28 29 28 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 27 27 27 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 30 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 27 27 27 26 26 27 27 27 26 26 27 28 28 27 27 27 27 28 28 27 27 27 27 52 52 52 52 51 51 52 52 51 51 52 52 52 51 51 51 51 51 50 51 52 53 52 52 52 52 52 52 53 54 53 54 54 53 53 54 55 55 54 53 53 52 52 52 52 51 51 51 51 50 50 50 51 50 50 50 51 52 52 53 54 54 54 53 53 52 52 51 51 50 50 50 51 50 49 49 50 50 49 48 48 49 49 50 52 53 53 53 53 54 54 53 54 53 51 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 45 45 45 46 45 45 46 46 46 45 45 45 44 44 43 43 43 43 43 43 45 46 46 46 45 47 47 46 46 45 45 44 44 44 45 46 45 43 43 42 42 43 44 44 43 42 42 42 43 45 46 46 46 45 45 44 43 43 43 43 43 43 43 44 45 45 45 44 44 45 45 45 45 46 46 45 44 43 43 42 42 42 43 43 43 44 44 44 45 44 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 44 43 43 42 42 41 42 42 42 43 43 42 42 41 41 41 41 40 40 40 40 40 40 40 39 38 38 37 37 36 35 35 35 36 37 37 37 38 38 38 37 35 34 35 37 38 39 39 39 37 36 37 38 40 41 41 41 42 41 41 41 40 40 40 39 39 39 38 37 37 36 35 35 36 37 36 36 36 36 36 36 36 36 35 35 36 36 36 36 36 36 36 37 36 36 36 37 37 36 37 37 37 37 37 38 38 39 39 39 39 39 39 40 41 40 40 40 39 38 39 40 40 39 37 37 38 39 40 39 40 40 40 40 40 39 39 38 38 37 36 35 36 37 37 37 38 37 36 35 35 35 34 34 35 35 35 34 34 33 33 33 34 34 33 32 32 33 33 33 34 35 36 37 36 34 34 34 34 35 35 35 35 35 35 36 36 36 36 36 36 35 35 35 35 35 34 32 32 34 34 34 34 34 34 34 34 34 35 34 34 33 32 32 31 30 30 31 31 30 30 31 32 33 33 32 32 33 33 34 32 30 29 30 32 32 30 29 29 29 30 29 29 30 30 29 29 29 28 25 24 24 24 24 24 24 24 24 24 24 24 25 27 28 29 30 29 28 27 29 29 29 29 29 29 28 28 28 28 27 26 26 25 25 25 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 28 29 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 28 28 28 27 27 27 27 26 26 26 27 27 26 26 27 27 27 27 27 27 27 28 27 27 26 26 27 51 51 52 51 51 51 51 52 51 51 51 51 52 51 51 51 50 50 50 52 53 53 52 51 51 51 51 52 53 53 53 53 53 53 54 54 54 54 54 54 53 53 54 54 53 52 52 53 52 51 50 50 50 50 50 51 52 51 52 53 53 53 53 53 53 53 52 51 51 50 49 50 50 49 48 49 49 49 48 48 48 49 49 50 51 51 52 53 54 54 54 52 53 53 52 51 49 49 49 48 48 48 48 48 48 48 47 47 47 48 48 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 43 44 45 45 45 46 45 45 46 46 46 46 46 46 45 45 44 42 42 43 43 44 44 45 45 45 46 46 47 47 46 45 45 44 43 44 44 44 44 43 42 42 42 43 43 42 42 42 42 42 44 46 47 46 46 45 44 43 42 42 42 42 42 42 43 45 46 45 44 44 44 44 44 44 44 44 44 44 44 43 43 42 42 42 42 42 43 43 44 44 45 45 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 42 42 42 41 42 42 43 43 43 42 41 41 41 41 40 40 40 40 40 41 41 39 39 39 39 38 37 36 35 35 35 36 36 36 36 36 36 36 35 34 34 35 36 37 37 37 36 36 37 38 39 40 40 41 41 40 40 41 40 39 39 38 39 38 37 37 37 36 35 35 35 35 35 35 35 35 35 35 36 35 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 39 39 39 40 40 41 40 40 40 39 39 40 40 38 38 38 39 39 40 40 41 40 40 39 40 39 39 39 38 37 36 36 35 36 36 37 37 37 37 36 35 35 34 33 34 35 35 34 34 34 33 32 33 33 34 33 32 32 33 33 33 35 36 37 36 35 34 33 33 34 35 35 34 34 34 35 36 36 35 35 35 35 35 36 36 36 34 33 32 33 34 34 34 34 34 34 35 36 36 34 34 33 33 34 32 30 30 29 29 29 30 32 33 33 33 31 30 31 32 33 31 29 29 30 32 31 29 28 27 28 28 28 27 29 29 27 27 29 27 24 24 24 24 24 24 24 24 24 24 24 24 25 26 27 29 30 30 28 27 29 29 30 30 30 29 29 29 29 29 28 27 26 25 25 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 29 28 28 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 28 28 28 27 27 27 27 27 26 26 26 26 26 27 27 27 26 26 27 27 27 26 26 27 27 27 27 26 26 27 51 51 51 51 51 50 51 51 51 51 51 51 51 51 51 50 50 50 51 52 53 52 52 51 51 51 52 53 53 52 52 53 53 54 55 55 54 54 54 55 54 53 54 54 54 54 54 53 52 51 50 49 49 49 50 51 51 51 51 53 53 52 52 52 53 53 53 52 51 50 49 49 49 49 48 48 49 48 48 48 48 48 49 49 50 50 51 53 54 54 53 52 52 52 52 52 50 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 44 45 45 45 45 46 46 46 46 46 46 45 45 44 43 42 42 43 43 44 45 45 46 46 46 47 47 46 46 45 44 43 43 43 44 43 43 42 42 42 42 42 42 42 42 42 43 45 46 46 46 47 46 44 43 42 42 42 42 42 42 43 44 45 44 44 44 44 44 44 43 43 44 44 44 44 43 43 42 42 42 42 42 42 43 44 44 45 45 44 43 43 42 42 42 42 42 43 44 44 44 44 44 44 44 43 43 43 42 42 42 41 41 42 42 43 43 43 42 41 41 41 41 41 41 41 40 40 41 40 40 40 39 39 38 37 36 35 35 35 35 35 35 35 34 35 34 34 34 34 34 35 36 36 35 36 37 38 38 39 40 40 40 40 40 40 40 40 38 37 38 38 37 37 37 36 35 35 35 36 36 35 35 35 35 36 37 37 37 37 37 38 38 38 38 39 39 39 38 38 38 39 39 39 38 39 39 38 39 38 38 38 38 39 39 39 39 39 40 41 41 40 40 40 40 40 39 38 39 40 39 39 40 41 41 40 40 40 40 40 39 38 37 36 36 36 35 34 35 36 36 36 36 36 34 34 34 34 33 33 34 34 34 34 33 32 32 32 33 32 31 32 32 33 33 35 36 37 36 36 35 34 33 33 35 35 34 34 34 34 35 35 35 34 34 34 35 36 36 35 33 33 33 33 33 33 34 34 34 35 35 36 35 34 34 34 34 34 33 31 30 29 29 29 30 31 32 32 32 31 30 30 31 32 30 29 29 29 31 31 29 29 27 26 26 27 27 27 27 27 27 27 26 24 24 24 24 24 24 24 24 24 24 25 25 25 26 28 30 31 30 29 27 28 29 30 30 30 29 29 29 28 28 27 26 26 25 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 29 29 29 29 29 30 30 28 27 27 28 29 29 29 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 26 26 27 27 27 27 26 26 25 52 51 51 51 50 50 50 50 50 51 51 51 51 50 50 50 49 49 51 52 52 52 51 50 51 52 53 53 52 52 52 53 53 54 54 55 54 53 54 54 54 53 53 54 55 55 54 53 52 51 51 50 50 49 49 50 50 51 52 53 53 52 52 52 52 52 53 52 51 51 49 48 48 49 49 48 48 48 48 48 48 48 49 50 50 51 52 53 54 53 52 52 52 52 52 52 51 50 49 48 48 47 47 48 48 48 47 46 46 46 47 47 47 47 46 45 45 45 45 45 45 44 44 44 45 45 45 44 43 43 43 44 44 44 45 45 45 46 46 45 45 45 45 45 44 42 42 43 43 43 45 45 45 45 46 47 47 46 46 46 45 44 43 43 43 43 42 42 42 42 42 42 42 42 42 43 43 45 45 45 45 46 46 45 44 43 42 42 42 42 42 43 43 43 44 44 43 43 43 43 43 43 43 43 44 44 43 43 42 41 41 42 42 42 42 43 44 44 44 44 44 43 42 42 42 42 43 43 43 44 44 45 44 44 44 43 43 43 43 42 41 41 40 40 41 42 42 42 42 42 42 41 41 41 42 41 41 40 40 40 40 40 39 39 39 38 36 35 35 36 36 37 37 36 35 34 34 34 34 34 34 34 34 34 34 35 36 37 37 38 40 41 40 39 39 39 40 40 39 38 37 36 36 36 36 35 35 35 36 37 38 38 37 36 36 37 38 38 38 38 37 38 39 39 39 39 40 40 39 38 39 40 40 39 39 39 39 39 39 39 39 39 39 40 40 39 40 40 40 41 41 41 41 40 40 40 39 38 39 40 40 40 40 41 40 40 40 40 40 40 39 37 36 36 36 36 35 34 34 35 35 35 35 34 33 34 35 35 33 33 33 32 32 33 32 32 32 31 31 31 31 32 32 33 33 34 36 37 36 36 35 35 33 33 34 35 35 33 33 34 34 34 34 34 33 33 34 36 36 35 34 33 33 33 33 33 33 34 34 34 35 35 35 34 34 34 34 34 33 31 30 30 28 28 29 29 30 30 30 30 29 29 31 31 29 28 28 29 30 30 30 29 27 26 26 26 26 26 25 26 27 27 25 24 24 24 24 24 24 24 24 24 25 25 26 26 26 28 30 31 31 30 29 29 29 30 30 30 30 29 28 27 27 26 26 26 26 27 27 28 27 27 27 28 29 30 29 29 30 30 30 30 29 29 29 29 30 29 29 27 27 28 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 26 26 27 27 27 27 27 25 24 53 52 51 51 50 50 50 49 49 50 50 51 51 51 50 50 50 49 50 51 52 51 50 50 52 52 53 52 51 52 52 53 53 54 54 55 54 53 53 53 53 53 53 54 54 55 54 53 53 53 52 52 51 49 49 49 50 52 53 53 53 53 52 52 52 51 52 52 52 51 50 49 48 49 48 48 48 48 48 48 48 48 49 49 49 51 53 54 54 53 52 51 51 51 51 52 52 50 48 48 47 47 47 47 47 47 47 46 46 46 46 47 47 47 46 45 45 45 45 45 45 45 45 45 46 45 45 44 44 43 43 44 44 44 45 45 45 46 46 45 45 44 44 44 43 42 42 43 43 43 44 44 45 45 46 47 47 47 47 47 46 46 44 43 43 43 42 42 42 41 41 41 41 42 42 43 43 44 44 44 44 45 45 45 44 43 42 42 42 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 42 42 43 44 44 44 43 43 43 43 42 42 42 42 42 43 44 44 45 44 44 44 43 43 44 44 43 42 42 41 40 40 40 40 41 41 41 41 41 41 41 41 42 41 40 39 39 39 39 38 37 38 37 36 36 38 38 39 38 37 37 36 36 35 35 35 35 35 35 34 34 34 34 35 35 36 38 40 40 40 39 37 38 39 40 39 38 37 36 35 35 35 34 34 35 36 37 38 39 39 38 37 37 37 38 39 39 39 39 40 40 39 40 41 41 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 39 38 38 37 36 36 36 35 34 33 33 34 35 35 33 33 34 35 34 34 33 33 33 33 33 33 33 32 31 30 31 32 33 33 33 34 36 37 36 35 35 34 34 33 33 35 34 33 33 33 34 34 34 33 33 33 34 35 35 35 34 34 35 34 34 33 33 34 34 34 34 35 35 34 34 34 34 34 33 32 30 30 29 28 27 28 29 29 30 29 29 29 30 30 29 28 28 29 29 30 30 28 27 27 26 25 25 24 24 24 25 25 24 24 24 24 24 24 24 24 24 25 25 26 26 26 27 29 30 31 31 31 31 30 29 30 30 30 30 29 28 27 26 26 25 26 27 27 28 29 28 27 28 29 29 30 29 29 30 30 30 30 30 29 28 29 30 29 28 27 27 29 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 28 27 27 26 26 26 26 26 26 27 27 26 26 27 27 27 27 26 26 26 26 26 26 27 27 27 27 27 27 27 25 24 52 52 52 52 51 51 50 50 49 49 49 50 51 51 50 50 50 49 50 51 51 51 49 50 52 52 52 51 52 52 52 53 53 54 54 55 54 53 53 53 53 52 53 54 54 55 55 54 53 53 52 52 52 50 49 49 50 51 51 51 52 52 51 51 51 51 52 53 52 52 51 49 48 48 48 48 48 48 48 48 48 48 48 48 49 51 53 53 53 52 51 50 50 50 51 51 51 50 48 48 47 47 47 47 47 47 47 46 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 45 44 44 43 43 43 43 44 44 44 45 46 46 45 44 44 43 43 42 42 42 43 43 43 43 44 45 46 46 47 47 46 46 46 46 46 45 44 44 43 42 42 42 41 41 41 41 42 43 44 43 43 43 43 43 44 44 44 44 43 42 41 41 41 41 42 42 42 43 43 43 42 42 42 43 42 42 42 42 42 42 42 42 41 41 41 41 43 44 44 45 45 44 43 42 43 43 43 42 41 42 42 43 43 44 45 45 44 43 43 44 44 44 43 42 42 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 40 38 37 38 37 36 36 36 36 37 39 39 40 39 37 38 39 38 37 37 36 37 37 36 35 34 34 34 34 34 36 37 38 40 40 39 37 37 38 39 38 37 37 35 35 34 34 34 35 36 37 38 38 39 40 40 38 37 37 38 38 39 40 40 40 40 40 41 41 41 40 40 40 41 40 40 41 41 41 40 40 40 40 40 40 41 41 40 40 40 40 41 41 41 41 41 41 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 37 37 37 36 35 34 33 33 33 34 35 34 33 33 34 35 34 34 34 33 33 33 33 33 32 32 31 31 31 32 32 33 34 35 36 36 35 34 34 34 33 32 33 33 32 32 33 34 34 33 33 33 33 34 34 35 35 35 35 36 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 32 30 30 30 29 28 26 27 27 28 29 29 29 30 30 30 29 27 27 28 29 30 30 29 29 28 27 25 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 28 28 27 26 28 30 30 31 32 32 31 30 29 30 29 28 28 28 27 27 26 25 25 26 27 27 29 29 28 28 29 29 29 28 29 29 30 30 30 30 29 28 28 29 29 29 28 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 29 29 28 27 27 27 27 27 26 26 26 27 28 27 27 27 27 27 27 27 27 27 27 26 26 26 25 25 26 26 26 27 27 27 27 26 25 50 50 50 50 50 51 50 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 50 52 52 51 51 52 53 53 53 53 53 54 54 54 53 52 52 53 52 53 53 54 54 54 54 54 52 52 52 52 51 50 49 49 50 50 51 52 52 51 50 51 51 53 53 53 52 52 50 48 47 47 47 47 48 48 48 48 48 48 48 49 51 52 52 52 51 50 50 50 50 50 50 50 49 48 48 47 47 47 47 46 46 46 46 45 45 45 46 46 46 46 46 46 46 45 45 46 46 45 46 46 45 45 45 44 44 44 43 43 43 44 45 45 46 46 46 45 44 43 43 42 42 42 43 43 43 43 44 46 46 46 46 46 46 45 46 46 46 46 46 45 43 42 42 42 41 41 41 41 42 43 43 43 43 43 43 43 43 44 44 43 43 41 41 41 41 41 41 41 42 42 42 43 42 42 42 42 42 42 42 42 42 42 41 42 41 41 41 41 42 43 44 45 44 43 43 43 43 43 42 41 41 42 42 42 43 44 45 45 44 44 44 44 44 43 42 42 42 42 41 41 41 40 40 40 40 39 39 39 39 39 39 40 40 40 39 37 37 36 37 37 37 37 38 40 40 39 38 37 39 40 40 39 39 39 39 39 38 36 36 35 34 34 34 35 36 37 38 38 38 37 36 37 37 37 36 35 35 34 34 34 35 36 37 37 37 38 39 40 40 40 39 38 37 38 38 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 41 40 40 41 41 40 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 40 40 40 40 40 39 39 38 38 37 37 36 36 36 36 35 34 33 33 33 34 34 33 33 33 34 34 34 34 33 33 33 33 33 33 33 33 32 30 30 31 32 33 34 35 36 36 35 34 34 33 32 32 33 32 32 33 33 33 32 32 33 33 33 35 36 35 35 35 36 35 35 34 34 35 35 35 34 34 34 34 34 33 31 31 30 30 29 28 29 28 27 27 26 27 28 29 29 29 30 29 29 27 26 28 28 28 28 28 28 28 27 25 24 24 24 24 24 24 24 24 24 24 24 24 24 25 27 28 30 30 28 26 28 30 30 32 32 30 30 30 29 28 27 27 26 26 27 26 26 25 26 26 27 27 29 30 29 29 29 28 28 28 29 29 30 30 30 29 28 27 27 29 29 28 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 30 30 30 31 30 30 30 30 29 28 27 27 27 27 27 27 27 28 29 28 27 27 27 28 28 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 25 25 26 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 49 50 50 49 50 51 51 50 51 51 52 53 53 52 52 53 54 54 54 53 52 52 52 52 52 52 53 54 54 54 53 53 52 51 51 51 50 48 48 48 49 50 52 52 50 50 50 51 52 53 53 52 51 50 48 47 47 47 47 47 47 47 47 47 47 48 49 50 51 51 51 50 49 49 49 50 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 46 45 45 46 46 46 46 46 45 45 45 45 45 45 43 43 43 43 45 45 45 46 46 46 45 45 43 42 42 42 42 42 42 42 44 45 45 45 45 45 45 45 45 45 45 45 46 46 44 43 43 42 42 41 41 41 41 42 43 42 42 43 43 42 43 43 43 43 42 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 42 41 41 41 42 42 43 43 44 44 45 45 44 44 44 44 43 43 43 43 43 42 41 42 41 40 40 40 40 39 39 39 38 38 38 39 40 40 38 36 37 38 39 39 39 39 40 40 39 39 38 39 40 40 40 40 40 40 40 38 37 37 36 34 34 34 34 35 36 37 37 37 37 37 37 36 35 35 34 34 34 34 35 35 37 38 38 38 38 38 39 39 40 40 39 38 37 37 38 39 39 39 40 40 41 41 41 41 42 41 41 41 42 42 42 42 41 41 41 41 41 41 41 41 40 41 41 41 41 41 40 41 40 40 41 41 41 41 42 42 42 41 41 41 40 40 39 38 37 36 36 36 36 36 36 36 36 36 34 33 33 32 33 33 33 32 33 34 33 33 33 33 34 34 34 34 34 33 33 32 31 30 31 32 33 34 36 36 35 34 34 34 33 32 32 32 31 32 32 32 32 33 33 34 34 34 35 35 35 36 36 36 35 35 35 35 35 35 34 34 34 34 34 33 31 30 30 29 28 28 29 29 28 28 27 26 26 27 27 27 28 28 29 28 26 27 27 27 27 27 27 27 26 24 24 24 24 24 24 24 24 24 24 24 24 25 26 27 29 30 31 30 28 27 28 29 31 33 32 30 30 30 29 28 28 27 26 26 26 26 25 25 26 27 27 27 28 29 30 29 28 27 28 30 30 30 30 30 30 29 28 27 27 28 28 28 27 27 28 29 30 30 30 31 30 30 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 29 28 27 27 27 27 28 27 27 27 29 30 29 28 27 28 28 27 27 26 26 26 27 27 27 27 27 27 26 26 25 25 24 24 24 24 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 50 50 50 50 51 52 52 52 52 51 52 52 53 54 54 53 53 51 51 52 52 51 52 53 53 53 52 53 53 52 51 50 49 48 48 48 49 51 52 51 50 49 49 50 51 52 53 52 50 49 48 46 46 46 46 47 47 47 47 47 47 47 48 49 49 49 50 50 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 45 45 45 45 43 43 43 43 44 45 45 45 45 45 45 45 44 42 42 42 42 42 42 42 43 43 44 45 44 45 45 44 44 44 44 45 45 45 45 44 44 43 42 42 41 41 41 42 42 42 42 42 42 42 42 43 42 42 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 42 42 43 42 42 42 43 43 42 41 41 41 42 42 43 43 44 44 45 45 44 44 44 44 44 43 43 43 43 42 41 42 42 42 41 40 40 41 40 40 39 39 38 38 38 39 38 36 37 39 40 40 40 40 40 40 40 40 39 39 39 40 40 41 41 40 40 38 37 37 36 35 34 34 34 34 35 36 37 37 36 36 36 35 34 34 34 35 35 35 35 35 37 38 39 40 39 38 39 40 40 41 40 39 38 37 37 37 37 39 40 40 40 41 41 41 41 42 41 40 41 41 41 41 41 41 40 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 41 42 42 41 41 41 42 41 40 40 39 38 38 37 36 36 35 35 35 35 35 36 35 34 33 33 32 33 33 32 32 32 32 32 32 33 33 33 33 33 33 33 33 32 32 31 30 31 31 33 34 34 34 35 34 34 34 33 31 30 31 32 33 33 33 33 34 34 33 33 33 34 35 36 36 36 35 34 34 35 35 35 34 34 34 34 34 33 32 31 30 29 28 29 30 30 29 29 29 28 27 26 26 26 26 26 27 26 25 25 27 27 27 27 27 25 24 24 24 24 24 24 24 24 24 24 24 25 26 27 28 29 30 32 31 29 27 27 29 30 32 32 32 31 30 30 29 29 30 28 27 27 26 25 25 26 27 27 27 28 28 29 29 29 27 27 28 30 30 30 30 30 30 30 29 28 27 27 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 29 28 27 27 27 29 29 28 27 28 29 30 29 28 29 29 28 27 26 26 26 27 28 28 27 27 27 27 27 26 26 25 25 24 24 24 51 51 50 50 49 49 49 50 50 50 51 51 50 49 50 49 48 48 48 48 48 48 49 49 49 51 52 52 52 52 51 51 52 52 53 54 53 53 53 52 51 52 52 51 52 52 52 52 52 54 53 52 52 51 50 49 48 48 48 49 50 50 49 49 49 50 50 51 52 52 51 49 48 47 46 46 46 46 47 47 47 46 46 47 47 48 48 48 49 49 48 48 48 49 49 49 49 49 48 47 48 48 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 43 43 43 42 42 43 43 44 44 44 44 45 44 43 42 42 41 41 41 41 41 42 42 43 44 43 43 44 44 43 43 44 44 44 44 45 44 43 43 43 43 42 41 41 41 41 41 41 42 42 41 41 42 42 41 41 41 41 40 40 41 41 41 41 41 42 42 41 41 41 41 40 40 41 41 41 41 40 40 40 40 40 41 41 42 42 42 42 42 42 42 42 42 41 41 42 42 43 43 44 44 45 45 44 43 44 44 44 44 43 44 44 43 42 42 43 43 43 42 40 41 42 42 41 40 40 39 39 38 38 37 37 38 39 39 40 40 40 41 41 41 40 40 39 39 40 40 41 41 40 40 39 38 37 37 35 34 34 34 34 34 35 37 37 36 35 34 34 34 34 35 36 36 35 35 35 36 37 38 39 39 39 40 41 42 42 41 40 39 37 37 37 38 39 40 40 40 41 41 41 41 42 41 41 40 40 40 40 40 40 40 41 41 41 41 40 41 41 41 40 40 39 39 40 40 39 39 40 42 43 41 40 40 40 41 40 40 40 40 39 39 38 37 36 35 35 35 34 34 34 34 34 34 34 33 33 33 32 32 32 31 31 31 32 32 32 32 33 33 32 31 31 31 30 30 30 30 31 33 33 34 34 34 34 33 33 32 30 31 32 33 32 32 32 32 32 33 33 33 34 35 35 36 36 34 34 34 35 35 36 35 34 34 34 34 33 32 32 30 28 29 30 30 30 30 30 30 29 27 27 27 27 27 26 26 25 25 24 26 27 26 26 25 24 24 24 24 24 24 24 24 24 24 24 24 26 27 28 29 30 32 32 32 29 28 29 31 31 32 32 31 31 30 29 29 30 30 29 27 27 27 26 25 26 27 27 28 29 29 29 29 28 27 27 28 30 30 29 29 30 30 30 30 30 29 27 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 29 28 27 27 29 30 30 28 28 29 30 29 28 28 29 29 29 27 26 27 28 28 27 27 27 27 27 27 27 26 26 26 25 25 25 25 53 52 51 51 50 50 50 51 52 52 52 52 50 50 51 51 49 48 48 48 48 48 48 48 49 51 52 52 52 51 50 51 52 52 53 53 52 52 53 52 51 51 51 51 51 51 51 51 51 53 53 53 53 52 51 49 48 47 47 48 49 50 49 48 48 49 50 51 51 52 51 49 48 47 47 46 46 46 46 46 46 46 46 47 48 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 48 48 47 47 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 41 41 41 42 41 41 41 42 42 41 41 41 41 40 40 40 41 40 40 41 41 41 41 40 40 40 40 40 41 41 40 40 40 39 39 40 40 41 41 42 42 42 41 41 42 42 42 41 41 41 41 42 42 43 43 44 44 44 44 43 43 43 44 44 43 43 44 43 43 43 43 43 43 42 41 41 42 42 41 40 40 40 40 40 39 38 38 39 39 39 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 37 36 35 34 34 34 34 34 34 35 36 36 35 34 34 35 36 38 37 36 36 36 36 35 36 38 38 38 39 40 41 43 43 42 41 39 38 38 37 38 39 39 40 40 40 40 41 41 40 41 41 40 40 40 39 39 40 40 41 41 40 39 39 40 41 41 40 39 38 39 39 39 38 38 40 41 42 41 40 40 40 40 40 40 40 40 40 40 39 38 38 38 37 36 36 35 35 35 34 33 34 34 34 34 34 33 33 32 32 32 31 31 30 31 31 31 30 30 30 31 31 31 31 31 31 31 32 33 34 34 34 33 33 31 30 30 31 32 32 32 32 33 33 33 34 34 34 35 35 35 35 34 33 34 34 35 35 35 34 34 34 33 32 31 31 29 28 29 30 30 30 30 30 30 29 28 29 29 28 28 28 27 27 26 25 24 25 24 24 24 24 24 24 24 24 24 24 24 24 24 24 26 28 29 29 30 32 33 32 31 30 29 30 31 31 30 31 30 30 30 29 29 29 30 29 28 27 27 26 25 25 26 26 27 29 29 29 28 28 27 27 27 28 29 29 29 30 29 29 29 30 29 28 26 26 27 28 29 30 30 30 30 31 31 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 29 28 27 27 28 30 30 30 29 29 30 30 29 29 29 29 28 27 27 27 28 29 29 28 27 27 27 27 26 26 26 26 26 24 25 26 25 53 52 52 51 52 51 50 52 52 52 52 52 50 50 52 52 51 50 49 48 48 48 48 48 48 49 50 50 51 50 49 50 51 52 52 52 51 52 53 53 52 51 51 50 50 51 50 50 51 52 53 53 53 52 51 49 48 47 47 47 48 49 48 48 48 48 49 50 50 51 50 49 48 47 47 46 46 45 45 46 46 46 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 44 44 45 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 42 42 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 43 42 42 42 42 42 42 41 40 40 40 41 41 41 41 41 41 41 41 41 40 41 41 41 40 40 40 40 40 41 41 41 40 40 40 40 40 41 41 41 40 40 39 39 39 40 41 41 41 41 41 41 41 41 42 41 41 40 40 41 41 41 42 43 43 43 43 44 44 42 42 43 43 43 43 43 43 43 43 44 44 43 43 42 41 41 42 42 41 40 40 41 41 40 40 39 39 40 40 40 40 40 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 37 36 35 35 35 34 34 34 34 34 35 35 34 34 35 37 39 39 37 37 37 38 37 36 36 37 38 38 39 40 41 42 42 42 42 41 40 40 38 37 38 39 40 40 40 40 40 40 40 40 40 40 39 39 39 38 39 40 40 40 39 38 38 39 40 40 40 38 38 39 38 38 39 39 40 41 42 42 40 40 40 40 40 41 41 40 40 39 39 39 39 39 39 37 37 37 37 37 36 35 35 34 34 34 34 34 34 34 34 33 33 32 32 31 31 31 31 31 32 32 33 33 33 32 31 30 31 32 33 33 33 34 33 31 30 30 30 32 32 32 33 33 34 34 34 34 34 34 34 34 34 33 33 33 34 35 35 34 34 34 33 32 31 30 29 28 28 29 31 32 32 32 31 30 29 29 29 29 28 29 29 28 27 26 25 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 27 29 30 29 30 32 33 32 30 29 29 29 30 30 30 30 30 30 30 30 30 29 29 30 29 29 27 27 26 25 24 25 26 27 28 29 29 27 27 27 27 27 27 28 28 29 29 28 28 28 28 28 27 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 29 28 27 28 29 30 30 30 29 29 30 29 29 29 29 28 27 27 27 28 29 30 30 29 28 27 27 27 26 27 27 27 27 26 26 26 24 53 52 52 52 52 51 51 52 53 53 52 52 51 51 52 52 51 50 49 48 47 47 47 47 47 48 48 49 49 49 49 50 51 52 52 52 51 51 52 53 52 51 51 50 50 50 50 50 52 52 52 52 53 52 52 50 49 47 47 47 48 48 48 48 48 48 49 49 49 49 49 48 47 47 47 46 46 45 45 45 46 46 46 47 47 47 47 47 48 48 47 47 47 48 48 48 47 47 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 46 45 45 46 45 45 45 45 45 45 45 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 40 40 40 41 41 40 40 40 40 40 40 40 41 41 40 40 39 39 40 40 41 41 41 41 41 41 40 41 41 40 40 40 40 41 41 42 43 42 42 43 43 43 43 41 41 43 43 42 43 43 43 43 43 43 43 43 43 41 41 41 41 42 41 41 42 42 42 41 40 39 40 41 41 41 41 41 42 42 41 41 41 41 41 41 40 40 40 39 39 38 37 37 37 36 36 37 36 35 34 34 34 34 34 34 34 35 36 38 40 39 38 38 38 39 38 37 36 36 37 38 39 40 40 41 41 42 42 41 41 40 39 38 38 38 39 40 40 40 40 39 39 39 40 40 39 38 38 38 39 40 41 40 39 38 38 39 40 40 40 39 38 38 37 38 40 40 40 40 41 41 40 39 39 39 40 41 41 40 40 39 38 39 39 39 39 39 38 37 37 37 37 37 36 35 33 33 33 34 35 35 34 34 34 34 34 34 33 33 33 33 33 33 34 34 34 33 31 30 30 31 32 31 31 32 32 31 30 30 30 31 31 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 35 36 36 35 34 33 31 30 30 29 29 28 29 31 32 33 33 33 32 31 30 30 29 28 28 28 28 27 26 26 26 25 24 24 24 24 24 24 24 24 24 24 26 27 28 28 29 31 31 30 31 33 33 33 31 29 29 30 31 31 30 30 30 30 30 30 30 30 30 30 30 29 29 28 27 26 25 24 26 27 28 29 28 27 26 26 27 27 27 27 28 29 28 27 27 27 26 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 29 28 27 28 30 30 30 29 29 29 30 29 29 29 27 27 27 27 27 29 30 30 30 29 28 27 27 27 27 28 27 27 26 26 27 27 26 54 53 53 52 52 52 52 52 53 53 52 52 51 51 52 52 52 50 50 49 47 47 47 47 47 47 47 47 48 48 49 50 50 51 52 51 50 50 51 53 53 52 52 50 49 50 50 50 52 52 52 52 53 52 52 52 50 47 47 47 48 48 48 48 48 48 49 49 49 49 49 48 48 47 47 47 46 46 45 45 45 46 46 46 46 46 46 47 48 48 47 47 47 47 47 47 47 47 48 48 48 48 47 47 47 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 46 46 45 44 44 44 44 44 44 44 42 42 42 42 42 42 42 42 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 41 41 40 39 39 40 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 42 42 42 43 42 42 41 41 41 42 42 42 43 43 43 43 43 43 42 42 42 41 40 40 41 42 42 42 42 43 42 42 41 40 41 42 43 42 42 42 42 43 43 42 42 42 42 41 41 41 40 40 40 39 38 37 37 37 37 38 38 36 35 34 34 34 34 34 35 36 37 38 40 40 39 39 40 40 40 39 37 36 37 38 39 40 40 40 41 42 42 41 40 40 40 39 39 38 39 40 40 40 40 39 37 38 38 38 38 37 37 38 39 39 40 40 39 38 38 39 38 38 39 39 38 37 37 38 39 40 40 40 40 40 40 39 38 39 40 41 40 40 40 39 38 39 39 38 38 38 38 37 37 36 36 36 36 35 34 33 33 33 34 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 33 32 31 30 30 30 29 29 31 31 30 30 30 30 30 31 33 33 33 33 33 33 33 33 33 33 33 33 32 33 34 35 37 37 35 34 32 31 31 31 30 30 29 30 32 33 33 32 32 32 32 31 30 29 28 27 27 27 27 26 27 28 26 24 24 24 24 24 24 24 24 25 26 28 28 29 30 30 31 32 32 32 32 33 33 32 30 29 30 32 32 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 27 25 24 26 27 28 28 27 27 26 26 27 27 27 27 27 28 27 26 26 26 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 29 29 30 29 29 28 29 29 30 30 30 31 30 30 29 29 29 29 29 30 30 30 29 29 30 30 30 30 28 27 28 28 28 29 29 30 29 29 28 27 27 27 28 28 27 27 27 27 27 28 27 27 54 53 53 52 52 52 52 52 53 53 53 53 52 52 52 53 52 51 51 50 49 48 48 47 47 47 47 47 47 48 49 49 49 50 51 51 49 49 50 52 53 53 52 51 49 49 49 50 51 51 51 52 52 52 51 51 50 48 47 47 48 48 48 48 48 48 49 49 48 48 48 49 48 48 47 47 46 46 45 45 45 46 46 46 46 46 46 47 47 47 47 47 47 47 46 46 47 47 48 48 48 48 47 47 47 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 44 43 43 43 44 44 43 42 42 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 40 40 40 40 39 40 40 40 40 39 40 40 41 40 39 39 39 39 40 40 41 41 40 40 40 40 39 39 39 40 40 40 41 41 41 41 41 42 42 42 41 41 41 41 42 41 41 43 43 42 42 43 43 42 42 42 41 40 40 41 42 42 42 42 43 43 42 41 40 40 42 43 43 43 43 43 43 43 43 42 42 43 42 41 41 41 41 41 40 39 39 39 39 38 38 38 37 36 34 34 34 34 35 36 37 37 39 40 40 40 40 40 41 40 40 39 37 37 37 38 39 39 40 40 41 42 41 40 40 41 40 39 39 40 40 40 41 40 39 37 37 38 37 37 37 37 38 38 38 39 40 39 37 37 38 37 37 38 38 37 37 38 38 39 40 40 39 39 40 40 39 38 39 39 40 40 40 40 39 37 38 38 38 37 37 37 37 36 36 36 35 35 34 35 34 33 33 34 33 33 34 35 36 36 36 36 35 34 34 34 34 34 34 34 34 33 33 32 32 31 30 29 30 30 30 30 30 30 31 33 33 33 32 33 33 32 32 33 33 33 33 33 33 34 35 36 36 36 35 34 33 33 33 33 31 31 30 30 32 33 33 31 30 30 31 30 29 28 28 29 29 28 28 28 29 29 26 24 24 24 24 24 24 24 24 26 28 27 27 29 30 30 30 31 32 33 33 32 32 31 30 29 30 32 31 30 30 31 30 30 29 29 29 30 30 30 30 30 29 29 27 25 24 25 26 27 27 27 26 26 26 27 26 26 27 27 27 26 26 26 26 26 27 27 29 30 30 30 30 30 30 30 30 30 30 29 29 29 30 29 28 28 29 29 30 30 30 31 30 30 29 29 29 29 29 30 30 30 30 30 30 30 30 30 29 29 30 29 29 30 30 29 29 28 27 27 27 29 29 29 28 27 27 27 28 29 28 27 54 54 54 53 53 53 53 53 53 54 54 54 53 52 52 53 52 51 51 51 51 50 49 48 47 47 47 47 47 47 48 48 48 49 49 50 49 48 49 51 52 52 52 51 50 49 49 49 51 51 50 51 52 51 50 50 49 48 47 47 47 47 47 48 48 48 49 49 48 48 48 48 49 48 47 47 46 46 45 45 45 45 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 47 48 48 48 48 47 47 47 46 46 46 46 46 46 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 44 44 44 43 43 43 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 39 39 40 40 40 39 39 39 39 40 40 41 41 40 39 39 39 39 39 40 40 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 40 41 42 43 42 42 43 43 42 41 42 42 40 40 40 41 41 41 42 42 42 42 42 41 41 41 42 43 43 43 43 43 42 42 41 41 42 42 41 41 42 41 41 40 39 39 39 40 39 38 37 37 36 34 34 34 34 36 38 38 39 40 40 41 40 40 41 41 41 41 40 39 38 37 37 38 38 39 40 41 42 42 41 42 41 40 40 39 40 41 41 40 40 39 38 37 37 37 37 38 38 37 37 38 39 39 38 37 37 37 37 37 38 38 37 36 37 38 38 38 39 38 39 40 40 39 38 38 39 39 40 40 40 39 38 37 37 38 38 37 36 36 36 36 37 36 35 34 35 34 34 34 33 33 32 33 34 36 35 34 34 34 34 33 34 34 34 34 34 34 34 34 34 33 32 30 29 30 29 29 30 30 31 32 32 31 31 30 31 31 31 31 31 31 33 33 33 34 35 35 35 35 36 35 35 34 34 34 33 33 32 31 32 33 33 32 30 30 30 29 29 29 29 29 30 29 29 29 30 30 28 25 24 24 24 24 24 24 24 24 26 28 28 29 30 30 30 30 30 31 33 33 32 31 30 29 29 31 32 32 31 32 32 30 30 29 29 29 30 30 30 30 30 29 27 27 25 24 25 26 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 29 29 29 29 28 29 29 28 28 29 29 29 30 30 30 31 30 29 29 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 29 29 29 28 28 28 29 30 29 28 27 27 28 28 29 29 28 56 55 55 54 54 54 53 53 54 55 55 54 53 52 53 53 53 52 52 52 51 51 51 50 48 48 47 47 47 47 47 47 47 47 47 48 48 48 49 51 52 51 51 51 50 49 48 48 50 50 50 51 52 51 49 49 48 47 46 46 47 47 47 47 48 48 48 48 48 47 47 48 48 48 47 47 46 46 45 45 45 45 45 45 46 47 48 47 46 46 46 46 46 46 45 45 46 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 43 43 43 44 45 45 45 44 44 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 39 39 39 39 39 39 39 40 40 39 39 38 39 39 40 40 40 40 40 39 39 39 40 40 41 41 41 41 41 41 41 41 40 40 41 42 41 41 40 40 40 40 41 42 42 41 41 42 43 42 41 41 41 40 40 40 40 41 41 41 41 42 42 42 41 41 41 41 42 42 43 43 43 42 41 40 40 41 41 41 42 42 41 40 39 39 38 38 39 39 38 37 36 35 34 34 34 34 36 38 39 40 40 41 42 41 41 41 42 42 41 41 40 39 38 38 37 38 39 40 41 42 42 42 43 42 41 40 39 40 40 41 40 40 39 38 37 36 36 37 38 37 37 37 38 38 38 38 37 36 36 36 37 38 38 38 36 37 37 37 37 38 39 40 41 40 39 38 38 39 39 40 40 40 39 39 38 37 37 39 38 38 37 37 37 37 36 36 35 34 33 33 33 33 32 32 32 33 34 35 34 34 34 34 33 33 34 34 34 34 34 34 34 34 33 32 30 29 30 29 29 30 31 31 31 30 30 30 30 30 30 30 31 31 32 33 34 34 34 34 33 34 35 35 35 35 35 34 34 34 34 33 32 32 33 33 32 32 32 31 29 29 29 30 30 30 30 30 29 29 28 26 24 24 24 24 24 24 24 25 26 27 29 29 29 29 29 30 30 30 30 32 33 33 32 31 30 30 31 33 33 32 33 33 31 31 30 29 29 29 30 30 30 30 28 27 26 25 24 26 27 27 27 26 26 25 25 25 25 25 25 25 26 27 27 27 28 28 28 28 29 30 30 30 30 30 30 30 29 28 28 28 28 29 29 27 28 29 30 30 30 30 31 31 30 29 29 30 30 30 30 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 29 28 27 29 29 29 30 29 29 57 55 55 55 55 54 54 54 55 55 55 54 54 53 54 54 54 53 52 52 52 52 52 52 50 48 47 47 47 46 46 47 47 46 46 47 47 47 49 50 51 51 50 51 50 49 48 48 49 50 50 50 51 51 49 49 48 47 46 46 47 47 47 47 47 47 48 48 48 48 47 47 47 47 47 47 47 46 45 45 45 45 45 45 46 47 48 47 46 46 46 46 46 46 45 45 46 47 47 47 47 47 47 47 47 46 46 46 45 45 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 45 45 46 45 45 44 44 44 44 44 45 46 45 45 45 44 43 43 43 44 43 43 43 43 42 42 42 41 41 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 39 39 39 39 39 39 38 38 38 38 38 39 39 38 38 39 39 39 39 39 39 38 38 39 40 41 40 40 39 40 41 40 40 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 40 40 40 40 41 41 42 41 41 41 42 43 41 40 40 40 39 39 40 41 41 40 41 42 42 42 41 40 40 41 41 42 43 43 43 43 42 41 40 40 40 40 41 41 41 40 39 38 37 37 38 39 38 37 35 34 34 34 35 36 36 37 38 40 41 41 41 42 42 42 42 42 41 40 40 40 40 39 38 38 39 40 41 42 42 43 43 43 42 41 40 40 40 40 40 39 39 39 37 36 36 37 37 36 36 37 37 37 37 37 38 37 35 35 36 37 38 38 37 36 36 37 37 37 39 40 40 40 40 38 38 39 39 39 40 39 39 39 38 37 37 38 39 38 37 37 37 37 37 37 36 35 34 33 33 33 33 32 32 32 33 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 32 32 31 29 29 29 29 30 31 30 30 30 30 30 31 31 31 32 33 32 33 34 35 34 33 33 33 34 34 34 34 34 35 35 35 34 34 34 34 33 33 33 33 33 33 31 30 30 30 30 30 29 29 28 28 27 26 24 24 24 24 24 24 24 24 26 29 29 29 28 28 29 29 30 30 30 30 30 31 31 32 32 32 31 32 33 33 33 33 32 31 31 30 29 29 29 29 29 30 30 29 28 26 25 24 26 27 27 26 25 24 24 24 25 26 26 26 26 26 27 27 28 29 29 29 29 30 30 30 30 30 30 30 29 29 27 27 27 29 29 28 27 28 29 29 30 30 30 31 31 30 30 30 30 31 31 31 31 31 30 30 30 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 29 29 30 30 30 30 30 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 54 53 53 52 52 52 52 51 50 49 48 48 47 47 47 47 46 46 46 46 47 48 49 51 50 49 50 51 50 48 47 48 49 49 49 50 50 49 48 48 48 47 46 46 47 47 47 47 47 47 48 48 48 47 47 47 47 47 47 47 46 45 45 45 45 45 46 47 47 48 47 46 46 46 46 46 45 45 45 46 47 47 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 47 48 47 47 47 46 46 47 47 46 46 46 45 45 46 45 45 44 45 45 45 45 45 46 45 45 45 44 43 43 44 44 44 43 43 43 42 42 42 42 41 43 44 43 43 43 43 43 43 42 42 41 42 42 42 42 42 41 41 41 41 41 41 40 40 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 39 40 40 40 40 39 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 40 40 40 39 39 40 40 41 41 40 40 41 42 42 41 40 40 40 39 38 40 40 40 40 41 42 41 42 41 40 40 40 40 41 42 43 43 43 43 42 41 41 40 39 39 40 40 40 40 39 38 37 37 38 38 36 35 34 34 34 35 36 36 38 39 40 40 40 40 41 42 43 43 43 42 41 41 42 41 40 39 38 39 40 41 41 42 43 43 43 43 42 41 41 41 40 40 39 39 38 37 36 35 36 37 36 35 36 37 36 36 37 38 37 35 35 35 36 37 38 38 37 36 36 37 37 38 39 40 40 40 38 37 38 38 39 39 39 39 39 38 37 36 37 39 38 37 36 36 36 36 36 36 35 34 34 33 34 34 34 33 32 32 32 33 33 33 33 33 33 33 34 34 34 34 33 32 32 31 31 31 29 29 29 29 30 30 29 29 29 30 31 32 33 33 33 33 33 33 34 34 34 33 33 34 34 34 33 33 34 34 35 35 34 33 33 34 34 34 34 34 34 33 32 31 31 31 30 29 27 27 26 26 26 24 24 24 24 24 24 24 24 24 27 30 29 28 27 27 28 28 29 30 30 30 30 30 30 30 31 32 32 33 33 33 33 32 31 30 30 30 29 29 29 29 29 30 30 29 28 27 26 25 25 25 26 25 24 24 25 26 26 27 28 27 27 27 27 28 29 29 30 30 30 30 30 30 29 29 30 29 28 27 27 27 27 27 27 27 28 29 29 29 29 30 30 31 31 31 30 30 31 31 32 32 31 30 30 30 30 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 55 56 55 55 55 55 55 55 55 54 55 55 55 55 55 55 55 55 54 53 52 51 51 51 51 50 50 49 48 48 48 48 47 47 46 46 46 46 46 47 48 48 48 50 51 50 49 47 47 48 48 48 49 49 48 48 48 48 47 46 46 46 46 47 47 47 47 48 48 48 47 47 46 46 46 46 47 46 46 45 45 45 45 46 47 47 48 47 46 46 45 45 45 45 45 46 46 46 46 46 46 47 46 46 46 46 47 47 47 47 46 45 45 46 47 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 45 45 45 46 46 45 45 46 45 45 45 44 44 44 45 45 45 44 43 43 43 42 42 42 42 43 44 44 43 44 44 44 44 43 43 42 42 43 43 43 42 41 42 42 42 42 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 39 39 39 40 40 40 41 41 41 41 41 41 41 42 41 41 40 40 41 40 40 40 40 39 39 40 41 40 40 40 41 42 42 41 40 40 39 38 38 40 40 40 40 41 41 41 42 41 40 39 40 40 41 42 43 43 42 42 42 41 41 40 38 38 39 39 40 40 40 39 37 35 35 36 35 34 34 34 34 35 34 36 38 39 39 40 40 39 41 42 42 43 43 43 42 43 43 42 41 41 39 39 39 40 40 41 42 43 43 43 42 42 42 41 40 40 39 39 38 37 36 35 35 36 35 35 36 36 36 36 37 38 37 35 35 35 36 37 37 37 36 35 35 36 37 37 39 40 40 39 38 37 37 38 39 39 38 38 38 38 37 36 37 38 38 37 37 36 36 36 35 35 34 34 33 33 33 33 33 33 33 32 31 31 31 31 32 33 32 32 33 34 34 34 33 32 31 31 31 29 29 29 29 29 29 29 29 29 29 31 32 33 33 34 34 34 34 34 34 33 33 33 32 33 33 33 33 33 33 34 35 34 34 33 33 34 34 34 34 34 34 33 33 32 31 30 29 27 27 26 26 26 25 24 24 24 24 24 24 24 24 24 27 30 29 27 26 27 27 28 28 29 29 29 29 29 30 30 30 31 32 33 33 31 31 31 30 30 30 30 30 30 29 29 29 30 30 29 28 27 27 26 25 25 25 25 24 24 26 27 27 28 29 29 28 28 29 29 30 30 30 30 30 30 30 30 29 29 29 28 27 27 27 27 27 27 27 27 29 30 30 30 30 31 31 31 31 31 31 31 31 32 32 31 30 30 30 30 30 30 30 29 29 28 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 55 55 55 55 55 55 55 55 55 54 54 55 55 55 56 55 55 55 54 53 52 51 52 52 51 50 50 49 49 49 48 48 48 47 47 47 46 46 46 46 46 46 47 48 49 49 49 47 47 48 48 48 48 48 48 47 47 48 47 47 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 47 47 46 46 45 45 45 46 47 47 47 47 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 45 45 46 47 47 47 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 45 45 46 46 45 44 43 43 42 42 42 42 42 44 45 44 44 45 45 45 44 44 44 42 42 43 43 43 43 42 42 42 43 43 42 41 41 41 42 41 41 40 40 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 39 40 40 39 38 39 39 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 41 40 40 40 39 38 40 41 40 39 39 41 41 41 41 41 40 39 38 38 38 39 40 41 41 40 40 41 41 40 39 39 40 41 41 42 42 42 41 40 40 40 40 39 37 38 38 39 40 39 39 39 36 34 34 34 34 35 36 37 37 36 35 36 37 38 39 40 41 41 41 42 42 43 43 43 43 43 43 42 42 41 40 39 40 40 41 42 43 44 44 43 43 42 41 40 39 38 38 38 37 37 36 35 35 35 34 35 36 35 36 37 37 37 35 35 35 35 36 36 36 35 35 36 38 38 38 39 40 40 39 37 36 37 38 39 39 37 37 37 38 37 36 36 38 38 38 37 37 36 36 35 34 34 34 34 33 33 33 33 33 32 32 32 31 30 30 30 31 30 31 32 33 33 33 34 34 33 33 32 30 29 29 29 29 29 29 29 29 30 31 32 33 33 33 34 34 34 34 33 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34 33 33 33 34 34 34 33 32 30 30 29 28 28 27 27 28 26 24 23 24 24 24 24 24 24 24 27 30 29 27 26 27 29 30 29 29 29 29 29 29 30 31 31 30 31 33 32 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 29 28 27 27 26 26 25 25 24 24 25 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 28 27 27 27 27 27 28 28 27 28 29 29 30 30 31 32 32 32 32 32 31 31 32 32 32 31 30 30 30 30 30 29 29 29 29 28 28 27 27 28 29 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 54 54 55 55 55 55 54 55 55 53 53 54 55 55 55 55 55 55 54 53 52 52 53 53 52 51 51 51 50 49 48 48 48 48 48 47 47 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 45 45 46 46 46 47 47 47 47 47 46 46 45 45 46 46 46 46 45 44 44 45 47 47 46 46 46 46 45 45 45 44 45 45 46 46 46 46 46 46 46 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 45 45 46 46 45 44 44 43 43 43 42 42 42 43 44 45 45 45 46 47 46 46 46 45 43 43 43 44 44 43 43 42 43 43 43 42 42 42 41 41 41 41 40 40 41 41 42 42 41 41 41 41 41 40 40 40 40 40 40 41 41 40 38 38 38 38 38 38 38 38 39 39 39 38 39 39 40 40 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 38 39 40 40 39 39 40 40 41 41 40 40 39 38 37 37 38 40 41 40 40 40 41 42 41 40 40 39 40 41 41 41 41 41 40 39 39 39 38 38 37 37 39 39 37 36 37 36 34 34 34 36 37 39 38 38 38 36 36 37 37 39 41 42 41 42 43 43 43 44 44 44 44 44 43 42 41 41 40 40 41 42 43 43 44 44 43 43 42 41 41 40 39 38 37 37 36 36 35 35 34 34 34 35 35 35 36 36 36 35 34 34 34 35 35 35 36 37 38 39 39 40 40 40 39 38 37 36 37 38 39 38 37 36 36 37 37 35 35 37 38 38 37 37 36 36 35 35 34 34 34 34 34 33 33 33 33 33 33 33 32 30 30 30 30 30 30 31 31 32 33 34 34 34 33 31 30 29 29 29 29 29 30 30 30 30 31 31 31 32 33 34 34 34 33 32 32 33 33 33 34 33 33 33 33 33 34 34 34 34 34 34 33 33 33 33 34 34 33 31 30 30 29 29 29 28 29 29 27 25 23 23 24 24 24 24 24 24 25 27 27 26 27 29 29 30 30 29 29 30 30 30 31 32 32 31 31 31 31 29 29 31 31 30 30 30 29 29 29 29 29 30 30 30 30 29 29 29 28 27 27 27 25 24 25 26 27 27 28 29 29 30 30 30 30 30 30 30 30 30 30 29 28 28 27 27 27 27 27 28 29 29 28 28 28 29 30 30 31 31 32 32 32 32 32 32 31 31 31 31 30 30 30 29 30 30 29 30 30 30 29 29 27 27 28 29 30 30 30 31 31 31 30 31 32 32 31 30 30 30 30 30 30 54 54 54 54 54 54 53 54 54 53 53 53 54 54 54 55 55 55 54 52 52 53 53 53 52 52 52 52 50 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 47 46 46 46 46 46 46 46 45 45 46 46 46 46 46 47 47 46 46 46 45 45 45 46 46 46 45 45 44 45 46 46 45 46 46 46 45 44 44 44 44 45 46 46 45 45 45 46 45 45 45 45 46 46 46 46 45 44 45 45 46 45 46 46 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 46 46 45 45 46 46 46 45 45 45 45 44 43 43 43 43 44 45 45 45 46 47 47 47 46 46 45 43 43 44 45 44 44 43 43 43 43 43 42 42 41 41 41 41 41 40 40 41 42 42 42 41 41 41 41 41 41 41 41 41 41 42 41 41 41 39 38 38 39 38 38 38 38 38 38 38 38 38 39 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 39 39 39 38 39 39 38 39 40 39 39 39 39 40 40 40 40 39 38 37 37 39 40 40 40 40 40 41 41 41 41 41 39 38 39 40 40 40 41 40 40 39 38 38 38 38 36 38 39 37 35 34 34 34 34 36 37 38 39 39 38 40 39 37 37 38 38 39 40 40 41 42 42 42 44 45 45 45 44 44 43 42 42 41 41 41 42 42 43 44 45 44 43 42 42 42 41 41 40 38 37 37 36 36 36 36 35 34 34 35 35 35 35 35 34 34 34 34 34 35 36 37 38 39 40 40 41 41 40 39 37 36 36 37 38 38 37 37 37 36 35 36 35 35 36 37 37 37 37 37 36 36 35 34 34 34 33 33 33 34 34 34 33 33 32 32 32 31 31 30 30 30 30 30 30 32 32 32 32 32 31 30 29 29 29 29 30 30 30 30 30 30 30 30 31 33 33 34 34 33 33 33 34 34 34 33 32 33 33 33 33 34 34 33 33 34 34 34 33 33 33 33 34 33 31 30 30 30 29 29 30 30 29 28 26 24 23 23 23 23 24 24 24 24 24 25 27 29 30 31 31 31 31 31 31 30 30 30 32 33 33 32 31 30 29 29 30 30 29 29 29 29 29 28 28 29 30 30 30 30 30 29 29 29 28 27 26 25 24 24 25 26 27 28 28 29 30 30 30 30 30 30 30 29 29 29 28 28 27 27 27 27 28 29 29 30 30 29 29 29 29 30 30 30 31 31 31 31 32 32 31 31 30 30 31 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 29 30 30 31 32 31 31 32 33 32 31 30 30 30 29 28 29 53 53 53 53 54 53 53 53 54 53 52 52 53 53 54 54 54 55 54 53 53 53 53 53 52 52 52 51 50 50 50 50 51 51 49 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 45 44 44 45 45 45 46 46 46 45 45 44 44 44 45 45 46 45 44 45 46 45 44 45 45 45 45 45 45 44 44 44 45 45 45 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 44 43 43 43 44 45 46 46 47 47 46 45 45 45 44 44 44 45 46 45 44 44 43 44 43 43 42 41 41 41 41 41 41 41 41 41 42 43 42 41 41 42 42 42 42 42 41 41 41 42 42 42 41 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 40 39 39 39 39 40 40 40 41 42 41 40 40 40 39 38 38 38 38 38 39 38 38 38 38 39 39 39 39 39 38 37 37 39 39 39 40 40 40 40 40 41 41 40 38 37 38 38 39 40 40 40 41 40 40 39 39 38 36 36 37 37 35 34 34 34 35 37 38 38 40 39 38 40 40 37 38 40 39 39 39 40 40 41 42 42 43 44 44 45 45 45 44 44 44 42 42 42 42 43 43 44 45 45 44 44 43 42 41 40 39 39 38 37 37 37 36 36 36 34 34 34 34 35 35 34 34 34 35 35 36 37 37 37 38 39 40 41 41 40 40 39 37 36 36 37 39 39 38 38 39 37 36 35 35 34 35 36 36 36 36 36 36 36 36 35 34 34 33 33 34 34 34 34 33 33 32 33 33 33 33 32 32 31 30 31 30 30 30 30 30 30 30 30 29 29 29 29 29 30 30 31 31 31 30 30 31 33 33 34 34 34 34 34 34 33 33 32 32 32 32 31 32 32 33 32 33 34 33 33 32 31 31 32 33 33 32 31 30 30 30 30 30 30 29 28 28 27 25 23 23 23 23 24 23 23 24 24 27 29 30 31 31 31 32 33 33 32 31 30 31 33 34 34 32 30 29 28 29 30 29 28 28 28 28 27 27 29 30 30 30 30 30 28 28 29 28 27 26 25 24 24 24 25 27 27 27 28 29 30 30 30 30 29 29 29 28 28 28 27 26 26 27 27 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 30 30 30 30 30 30 30 31 31 31 30 30 30 30 29 28 28 29 27 27 29 30 30 31 31 31 31 31 31 32 31 30 30 29 28 27 28 54 53 53 52 53 53 53 53 54 53 52 52 52 53 53 53 54 54 54 54 54 54 53 53 52 52 52 51 51 51 51 52 52 52 50 49 48 48 48 48 48 47 46 46 46 46 46 46 45 45 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 45 45 44 44 44 44 45 45 45 45 45 44 43 44 45 46 46 45 45 45 45 44 43 44 44 45 45 45 44 45 46 45 44 44 45 45 45 45 44 44 44 44 45 45 45 45 45 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 47 47 46 46 46 46 46 46 46 46 46 45 44 43 43 44 44 45 46 47 48 47 46 45 45 45 44 44 45 46 46 46 45 45 44 44 43 42 42 41 41 41 41 41 41 41 41 41 42 43 42 42 42 42 43 42 42 43 42 42 42 42 42 41 40 40 39 39 38 38 38 38 37 37 38 38 38 38 38 39 39 40 39 39 39 39 39 40 40 40 41 41 41 40 40 40 40 39 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 36 36 38 38 38 40 39 38 38 39 40 40 40 38 36 36 37 38 38 39 40 40 40 40 40 40 39 38 37 36 35 34 34 34 35 37 39 39 39 40 39 39 40 41 38 38 40 40 41 41 41 40 41 42 43 43 44 44 45 46 45 45 45 45 44 43 43 44 44 44 44 44 45 45 45 44 43 41 40 39 39 39 38 37 36 36 36 36 35 34 33 33 34 34 34 34 35 35 35 36 36 37 38 39 40 40 41 40 40 40 39 37 36 35 36 38 39 39 39 39 37 36 35 35 34 34 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 33 33 31 31 32 31 30 29 29 29 29 30 30 29 29 29 29 29 30 30 31 32 32 31 31 32 34 34 34 34 33 33 33 33 33 32 32 33 32 31 31 31 30 31 30 31 32 31 31 31 30 30 32 33 32 33 31 30 30 29 29 29 29 29 29 29 29 27 24 23 23 23 23 23 23 23 24 25 27 28 29 30 30 32 33 33 32 31 30 30 32 34 33 31 30 28 27 28 29 28 27 27 27 27 27 28 29 30 30 30 30 29 28 27 28 27 26 25 24 24 24 24 26 27 27 27 27 28 29 30 30 30 29 28 28 27 27 27 27 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 31 30 30 30 30 31 32 32 31 30 30 29 28 29 29 28 28 30 30 30 30 30 30 30 30 31 31 31 30 30 28 27 27 27 55 54 53 53 52 52 52 53 53 53 52 51 52 52 52 53 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 44 44 44 44 45 44 43 43 44 45 45 44 44 45 45 44 44 43 44 44 44 44 44 45 45 44 44 44 44 45 45 45 44 44 43 43 44 44 45 45 45 45 46 45 45 46 47 46 46 47 47 48 48 48 47 47 47 47 47 47 47 47 47 46 47 47 46 46 47 47 47 46 45 43 43 43 44 45 46 46 47 47 47 46 46 46 46 45 45 45 46 46 46 45 45 44 43 43 42 41 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 40 39 39 39 38 38 38 37 37 37 37 38 38 38 39 39 39 39 38 38 39 39 39 40 40 41 40 40 40 40 41 40 40 39 39 39 38 38 38 38 38 37 37 37 37 37 38 38 38 37 36 37 38 38 39 38 38 38 39 40 40 39 37 36 35 37 38 38 38 39 39 40 39 39 40 40 40 38 36 34 34 34 35 37 39 40 40 41 41 40 40 41 41 39 38 39 40 41 42 42 42 42 42 43 43 44 44 45 46 46 45 45 45 45 44 44 44 45 45 45 45 45 44 44 43 42 41 40 39 38 38 38 36 36 35 35 35 35 34 33 33 34 35 35 35 36 35 35 35 36 37 39 40 41 41 41 40 40 40 39 37 36 35 36 37 38 39 40 38 37 36 36 36 36 34 33 34 35 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 31 30 29 29 29 29 29 29 29 29 29 29 30 30 30 30 31 32 33 33 33 33 33 34 34 33 33 33 33 32 32 33 33 33 33 33 32 31 30 30 30 30 30 30 30 30 30 31 31 32 33 32 31 30 29 29 29 29 28 28 28 29 29 26 23 23 23 23 23 23 23 23 23 25 27 29 30 30 31 32 32 31 30 30 30 30 31 31 30 30 29 27 27 27 27 27 27 27 27 27 29 30 30 30 30 30 29 28 27 27 26 26 25 24 24 24 24 26 26 27 27 27 28 29 30 30 29 28 27 27 27 27 27 26 26 27 27 28 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 31 30 30 30 30 31 32 31 30 30 30 30 31 31 31 30 29 29 29 29 28 27 27 28 29 30 30 30 30 29 29 30 31 31 30 30 28 27 26 26 54 54 53 53 52 52 52 52 53 53 52 51 51 52 52 52 53 53 52 53 53 53 53 53 53 53 53 53 53 53 53 52 52 51 50 50 50 51 50 49 49 48 48 48 47 47 47 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 44 43 43 43 43 43 43 44 44 44 43 44 44 44 44 44 44 44 43 43 43 44 44 44 45 45 45 45 45 46 46 46 46 46 47 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 45 44 44 43 44 45 45 46 46 47 47 46 46 47 46 46 45 45 46 47 46 45 44 43 43 43 42 42 43 43 42 42 41 41 41 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 39 38 38 38 38 38 37 37 37 37 38 38 38 38 39 39 39 38 38 38 39 39 40 40 40 40 40 40 40 41 41 40 40 40 40 40 39 39 39 38 38 37 37 37 37 37 37 37 37 36 36 36 37 38 38 38 38 38 39 39 37 37 37 35 36 37 37 37 37 38 39 38 38 39 39 38 37 35 34 34 36 36 37 39 39 40 41 41 41 41 42 41 40 38 38 39 40 41 43 44 43 43 43 43 43 44 45 45 45 45 44 44 45 45 44 44 45 45 46 45 45 43 42 41 40 39 38 38 37 37 36 35 35 35 34 34 34 33 33 34 35 36 36 36 37 36 36 36 37 38 39 40 41 41 41 41 40 40 39 37 36 35 35 36 37 38 39 38 36 36 36 36 35 34 33 33 33 33 33 32 32 33 33 33 33 34 34 33 33 33 33 33 33 33 33 34 33 33 33 33 33 33 32 31 30 31 30 29 29 29 29 29 29 29 29 30 31 30 30 30 32 33 33 32 31 33 34 34 34 33 33 32 32 33 33 33 33 33 33 33 33 32 31 31 30 30 30 30 30 30 30 30 31 32 33 32 31 31 30 30 29 28 27 27 27 27 26 24 24 23 23 23 23 23 23 23 24 26 29 30 30 30 31 31 30 29 30 30 29 30 30 30 29 28 27 27 27 27 27 27 27 27 29 30 30 30 30 30 30 29 28 28 28 27 27 25 24 24 24 25 26 26 27 27 27 28 29 30 30 29 27 27 26 26 27 26 26 27 28 29 29 29 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 29 29 30 30 31 31 31 30 30 30 30 30 29 29 29 29 30 28 28 28 28 28 28 28 29 29 28 29 29 30 30 30 30 30 28 27 26 26 53 53 53 53 52 52 51 51 52 51 51 51 50 50 51 52 52 52 52 52 53 52 52 52 52 52 53 53 53 53 53 52 52 52 51 51 51 52 51 50 49 49 50 49 48 48 48 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 42 43 44 44 44 45 45 45 45 45 45 45 45 46 47 47 48 48 49 49 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 45 45 45 45 44 44 45 46 46 46 47 47 46 47 48 47 47 45 45 46 46 45 44 44 43 43 43 42 42 43 43 42 42 42 41 41 42 43 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 37 37 37 37 37 37 38 39 39 39 38 38 38 38 40 40 40 40 39 39 39 40 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 37 36 36 36 36 35 35 36 36 36 37 37 37 38 37 37 37 37 35 36 37 37 37 38 38 38 38 37 37 36 35 34 34 34 36 38 38 37 39 40 41 41 42 42 42 43 42 41 39 39 40 40 40 43 44 44 45 45 44 44 44 45 45 45 44 43 43 44 44 43 43 44 45 46 45 45 44 42 41 41 40 39 38 38 37 36 35 34 34 34 34 34 33 33 35 36 37 37 37 37 37 37 38 39 39 40 40 40 40 40 41 40 40 39 37 36 36 35 35 36 37 38 38 37 36 36 36 35 34 34 34 34 34 34 33 33 33 33 32 32 33 33 33 32 32 32 32 33 32 32 32 32 31 31 32 33 32 32 31 31 31 30 30 29 29 29 29 29 29 30 30 31 32 31 32 32 32 32 31 32 33 33 34 34 33 33 32 32 33 33 33 33 34 33 33 33 33 33 32 31 30 30 30 30 30 30 30 30 31 33 33 33 32 31 30 29 29 28 28 28 27 27 27 25 24 23 23 23 23 23 23 23 24 26 28 29 30 30 30 28 28 28 29 29 30 30 30 29 27 27 27 26 26 26 26 26 27 29 30 30 30 29 29 30 30 29 28 28 27 26 25 24 24 25 26 27 27 27 28 28 29 29 30 29 28 27 27 26 26 26 26 26 27 28 29 29 30 29 29 29 30 30 30 30 29 29 29 29 30 30 30 30 30 29 29 29 30 30 30 30 31 30 30 30 30 29 29 29 29 30 30 29 29 30 30 30 28 26 27 27 26 27 28 29 30 30 30 30 28 27 26 26 52 52 52 52 51 51 51 50 50 50 50 50 49 49 50 50 50 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 49 49 49 49 48 46 45 45 45 45 45 46 46 46 45 45 45 45 46 45 45 45 44 44 44 44 44 44 44 44 45 46 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 42 43 43 43 44 44 44 44 44 44 43 42 42 43 44 44 44 45 45 45 45 45 44 44 46 46 47 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 45 45 46 46 45 44 45 46 46 47 48 48 47 47 49 48 47 46 45 46 46 45 45 44 43 43 43 43 43 43 43 42 42 42 42 42 43 44 44 44 44 43 43 43 43 42 41 41 40 40 40 40 40 40 40 39 38 38 39 39 39 39 37 37 37 37 37 37 37 38 38 38 38 38 38 39 40 40 40 39 38 39 39 40 40 41 41 42 41 41 41 40 40 39 39 39 39 39 40 39 38 37 37 36 36 37 36 36 36 35 35 35 35 35 35 36 36 36 35 35 35 36 36 37 38 38 38 36 35 35 34 34 35 36 37 39 39 38 40 41 41 42 43 43 43 43 42 41 40 40 41 41 41 42 43 45 45 45 45 45 45 45 45 45 43 42 42 43 43 42 42 43 45 45 45 45 44 43 43 43 42 41 40 38 37 37 35 34 34 34 34 33 32 33 35 36 37 37 38 38 38 38 40 40 40 40 41 40 40 40 41 40 40 39 38 37 36 35 35 36 36 37 37 37 36 36 36 35 35 36 36 36 36 36 35 34 33 33 32 31 31 31 31 30 30 30 31 31 30 30 30 31 30 30 30 31 31 31 30 29 29 29 29 29 29 29 29 29 29 30 30 31 32 32 32 31 31 30 31 32 32 33 33 34 33 33 33 33 33 34 33 33 34 33 33 33 34 33 32 31 30 30 30 30 29 29 30 30 30 31 31 32 33 31 30 29 29 28 29 29 29 29 29 27 25 24 23 23 23 23 23 23 24 24 27 30 31 30 29 27 27 27 28 29 30 30 30 29 28 27 27 26 26 26 26 26 27 29 29 30 29 28 28 30 30 30 28 27 26 25 24 24 24 25 26 27 27 28 29 29 30 30 30 29 28 27 27 26 26 26 26 26 27 28 28 28 29 29 29 29 30 30 30 30 29 28 28 29 30 30 30 30 29 28 29 29 29 29 29 29 30 31 31 30 30 30 30 29 30 30 30 30 30 30 30 30 29 28 28 27 26 26 27 28 30 30 29 29 28 27 26 25 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 50 50 49 49 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 51 51 50 49 49 49 49 49 47 46 46 46 46 46 47 47 46 46 46 46 46 46 46 45 45 45 44 44 44 44 45 45 45 46 46 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 43 43 44 44 43 42 42 43 44 44 44 44 44 44 45 44 44 44 45 46 47 48 47 47 47 48 48 49 48 47 46 47 47 47 47 47 47 48 47 46 46 46 46 46 46 45 45 46 47 48 48 48 48 48 48 48 48 47 47 47 46 46 45 44 43 43 43 44 44 43 43 43 43 42 42 42 43 44 44 43 43 43 43 42 42 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 40 39 37 37 37 37 37 37 37 37 37 37 38 38 39 39 40 40 40 39 38 39 39 40 41 41 42 42 42 41 41 40 39 39 39 40 40 40 41 40 39 39 39 38 38 39 38 37 36 35 35 35 34 34 34 34 34 34 34 34 34 35 35 36 36 37 38 35 34 34 34 36 37 38 38 40 41 39 38 40 41 41 42 43 43 43 42 42 41 40 41 43 42 42 43 45 45 45 45 44 44 44 43 43 43 42 41 42 41 41 41 42 43 44 45 45 44 44 44 43 42 41 41 40 39 38 37 36 35 34 34 33 33 34 35 35 36 38 39 39 39 39 40 41 41 41 41 41 40 40 40 40 40 39 38 37 37 36 35 36 36 37 37 37 37 36 36 36 36 36 37 37 37 36 35 34 34 34 33 32 32 31 31 31 30 30 30 30 30 30 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 32 31 30 31 31 30 30 31 33 33 33 34 34 33 33 33 33 34 33 33 33 34 33 33 34 33 32 31 30 30 30 30 29 29 29 29 29 30 30 31 32 32 31 30 30 30 29 29 30 30 28 28 28 26 24 23 23 23 23 24 24 24 25 28 31 30 28 27 27 27 27 28 29 30 29 28 27 27 26 26 26 26 26 27 27 28 29 29 28 27 28 29 29 29 28 26 25 24 24 23 23 25 26 27 28 29 29 29 29 29 29 29 28 27 26 26 26 26 27 27 27 28 27 27 27 28 29 30 30 30 30 30 28 27 27 29 29 30 29 28 28 28 29 29 29 29 29 29 30 31 32 31 30 30 30 30 30 30 30 30 30 30 30 29 28 29 29 27 26 27 28 28 29 30 29 28 28 28 26 25 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 50 50 50 49 49 48 49 49 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 45 44 44 44 44 44 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 42 42 42 42 43 43 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 42 42 44 45 45 45 44 43 44 44 43 44 46 46 47 47 47 46 46 46 47 48 48 47 46 46 47 47 47 47 47 47 48 47 47 46 46 46 47 46 45 45 46 47 47 47 48 49 48 48 48 48 47 48 47 46 46 45 45 44 44 44 44 44 44 43 43 43 42 42 42 44 44 43 43 42 42 42 41 41 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 38 38 39 39 40 40 39 38 38 39 39 40 41 42 43 43 43 42 41 40 40 40 40 40 41 41 42 41 40 40 40 39 39 40 38 37 37 37 38 36 36 36 35 35 34 34 34 34 35 35 34 34 35 36 35 34 34 34 35 38 40 40 40 41 41 40 38 39 41 41 42 43 43 43 43 42 41 41 42 43 43 43 44 44 44 44 44 44 44 43 42 41 41 41 40 40 39 40 40 41 43 44 45 44 43 43 43 43 41 39 40 40 39 38 37 37 36 35 35 34 32 33 34 35 36 38 40 40 40 40 41 41 41 41 41 41 40 39 39 39 39 38 37 37 37 36 35 36 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 34 34 34 33 33 33 32 32 30 31 31 32 32 32 32 31 30 29 29 29 30 31 31 31 31 31 30 29 29 29 29 29 30 30 30 31 32 31 30 30 30 30 30 30 31 32 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 33 32 30 30 30 30 30 30 30 29 29 29 29 29 30 31 32 32 32 31 30 30 30 31 30 28 28 30 28 26 24 23 23 23 23 24 24 24 24 28 30 28 26 25 26 27 27 28 29 28 27 27 27 26 26 26 26 26 27 27 28 29 28 27 26 27 28 28 28 27 26 25 24 24 25 25 26 27 27 28 28 28 28 28 28 29 29 28 27 26 26 26 26 27 27 27 27 26 26 26 27 28 29 30 30 30 29 28 27 27 28 28 28 28 27 27 29 29 29 30 30 30 30 30 31 32 32 31 30 30 30 31 31 30 30 30 30 30 28 28 28 27 26 26 28 29 27 28 30 30 28 28 28 27 26 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 44 44 45 45 45 45 46 47 47 46 45 45 45 45 45 46 45 45 45 45 46 45 44 44 44 44 44 43 43 42 43 45 45 44 43 42 41 41 41 41 41 41 42 42 42 42 42 42 42 42 43 44 45 45 44 43 43 43 43 44 45 46 46 46 46 45 45 46 47 47 47 47 45 45 46 47 47 47 47 47 48 47 47 47 47 47 47 46 46 46 46 46 46 47 48 48 48 48 49 48 48 48 48 47 46 46 46 45 44 45 45 45 44 43 43 43 43 43 43 44 44 43 43 42 42 41 41 41 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 38 38 38 39 39 39 39 38 38 38 39 40 40 41 42 43 43 42 41 41 40 40 40 41 41 41 42 42 42 41 40 40 40 39 39 38 38 39 40 39 36 37 38 37 36 36 36 35 35 36 36 35 34 34 35 34 34 34 35 37 39 41 41 41 41 42 42 40 40 41 41 42 43 43 44 44 43 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 41 40 40 39 38 39 40 41 42 43 44 44 43 42 42 42 41 40 39 38 39 38 37 37 37 36 34 34 34 32 32 34 35 36 38 40 40 40 40 41 41 40 40 40 40 40 39 38 38 39 38 37 37 37 35 35 36 37 37 37 36 36 37 37 37 36 36 36 36 35 35 35 35 34 34 33 33 33 32 32 31 31 32 33 33 34 33 33 32 30 30 30 31 31 31 31 31 31 31 30 29 29 29 29 29 29 29 30 30 32 32 30 29 29 30 30 30 30 31 33 33 33 33 34 33 33 33 33 34 34 34 34 33 32 32 31 30 30 30 30 30 30 30 30 30 29 29 29 29 29 30 31 32 32 30 30 31 32 30 29 29 30 29 28 26 24 23 23 23 23 23 23 24 25 28 28 25 24 25 26 27 28 28 27 27 27 27 26 26 26 25 26 26 26 28 29 27 26 26 27 27 27 27 27 26 24 23 24 25 26 27 27 27 27 26 26 27 27 28 29 29 28 27 26 26 26 26 27 27 27 27 26 26 26 27 28 29 29 30 30 29 28 27 27 27 27 27 27 27 28 29 27 28 30 30 30 30 30 31 31 32 31 31 31 31 32 32 30 30 30 30 30 29 29 28 27 26 26 28 27 27 28 30 29 28 27 28 27 25 50 51 51 52 51 52 52 52 52 53 52 52 53 53 52 51 50 49 49 49 49 48 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 46 47 47 46 45 45 45 46 46 46 46 45 45 46 45 44 44 45 45 45 45 44 43 44 45 45 45 44 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 44 44 42 43 43 43 44 45 45 45 46 45 45 45 46 47 47 46 46 44 45 46 47 47 46 46 47 47 48 48 48 47 47 47 47 46 46 46 46 47 48 48 48 49 49 49 48 48 49 49 48 47 47 46 46 46 46 46 45 44 44 43 43 44 44 43 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 38 38 39 39 39 38 38 38 39 40 40 40 41 41 42 42 41 41 41 40 41 41 42 42 42 42 42 42 41 41 40 39 38 38 38 39 40 39 38 37 37 39 38 37 37 36 35 36 36 36 36 34 34 34 34 35 37 38 38 39 40 41 42 42 43 43 42 41 42 42 42 43 44 44 44 43 43 42 43 43 43 43 42 42 42 41 42 43 43 42 41 40 39 38 38 39 40 41 42 43 44 44 43 43 41 41 41 39 39 39 38 37 37 36 36 37 36 34 34 34 33 32 33 35 36 39 40 40 39 40 41 40 40 39 39 40 40 39 38 38 39 39 37 37 37 35 34 35 36 37 37 36 37 38 38 38 38 38 37 37 36 35 34 34 34 33 33 33 34 33 33 32 32 33 33 34 33 33 32 30 30 30 31 32 31 30 30 30 30 30 29 29 29 29 29 29 29 29 31 31 32 32 31 29 29 29 29 30 31 32 33 33 33 34 34 33 33 33 33 33 34 34 34 33 31 30 30 31 31 31 30 30 30 30 30 30 30 30 29 29 29 29 29 31 32 31 31 32 33 32 31 31 31 29 29 28 27 25 24 23 23 23 23 24 24 25 26 25 24 25 26 27 27 27 27 27 27 27 26 26 26 25 25 26 27 28 28 27 26 26 27 27 26 26 27 25 24 23 23 24 25 26 26 26 26 26 26 27 27 28 29 29 28 27 27 26 26 27 27 27 27 27 26 26 27 27 27 28 29 29 29 28 27 28 28 28 27 26 26 27 28 27 26 28 29 30 30 30 30 30 31 32 32 32 32 33 33 33 32 32 32 30 30 29 28 28 27 25 25 26 26 27 28 29 29 27 27 27 27 26 52 52 53 53 53 53 53 53 54 54 53 53 53 53 52 51 51 50 50 50 50 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 47 47 46 46 45 45 46 46 46 46 46 46 46 45 45 45 45 46 46 45 44 43 45 46 46 46 44 44 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 42 43 45 45 45 45 45 44 45 46 47 47 46 45 44 44 46 47 47 47 46 46 47 47 47 48 48 48 47 48 47 47 47 47 48 48 48 48 49 49 49 49 49 48 49 49 49 48 47 47 47 47 46 46 46 46 45 44 44 44 44 44 44 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 38 38 39 39 38 38 38 38 38 39 40 40 41 41 42 42 41 41 41 41 42 42 42 42 43 43 43 42 41 40 40 38 38 39 40 40 40 39 38 38 38 38 38 37 36 35 36 36 37 37 36 36 35 34 35 37 39 39 39 39 40 41 42 43 44 44 43 43 43 43 44 44 44 44 44 44 43 43 43 43 42 42 41 41 41 40 41 42 42 41 40 39 38 37 39 40 41 41 41 42 43 43 43 42 41 40 40 39 38 38 38 37 36 35 35 36 36 35 34 34 33 32 33 35 37 39 40 39 38 39 40 39 38 38 39 39 39 39 38 37 38 39 38 37 37 35 34 35 36 36 36 36 37 38 38 39 40 39 38 37 37 36 35 34 34 34 34 35 35 34 34 34 34 34 33 32 32 31 30 30 31 32 32 33 33 32 32 31 30 30 29 29 29 30 30 29 29 29 31 32 32 32 31 29 29 29 29 30 31 33 33 33 33 34 34 34 33 33 33 33 34 34 34 33 32 31 31 32 31 30 30 30 30 30 30 30 31 30 30 31 32 30 29 31 31 31 32 33 34 33 33 32 31 30 28 27 29 29 26 24 23 23 23 23 24 24 24 24 25 26 26 25 26 25 25 26 27 27 27 26 25 24 24 26 27 28 28 26 25 25 26 26 25 25 25 25 24 23 24 25 24 24 26 26 27 27 28 28 29 29 29 28 29 28 27 26 26 27 27 27 27 27 26 26 27 27 27 27 27 27 27 27 27 29 29 28 27 26 26 27 26 26 26 27 29 29 29 29 30 30 31 31 31 32 32 32 32 32 33 32 32 31 30 29 28 27 27 26 24 24 25 26 27 28 28 26 26 27 28 28 53 53 54 54 54 54 54 54 54 54 53 53 53 52 52 51 51 50 51 52 51 50 50 49 49 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 46 46 46 46 47 46 46 47 47 47 46 46 45 46 47 47 46 46 46 46 46 46 45 46 46 45 44 43 44 45 46 46 45 44 44 45 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 44 45 45 44 44 45 46 47 47 46 44 43 44 46 47 47 46 45 45 46 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 49 50 49 49 48 48 49 49 48 48 47 47 46 45 44 44 44 44 44 43 43 42 42 42 42 42 42 41 41 41 41 41 41 40 41 41 40 40 39 39 39 40 40 39 38 37 37 37 36 36 36 37 37 37 37 38 39 38 38 38 38 38 38 39 40 40 40 40 41 41 40 41 41 41 42 42 42 42 42 42 42 41 41 40 39 39 39 40 41 41 41 40 39 39 38 38 38 37 36 36 37 37 37 38 37 37 35 34 35 38 39 39 39 40 40 41 42 43 43 43 43 44 43 43 43 43 43 44 44 44 44 44 44 43 42 41 41 40 39 40 41 42 41 40 39 38 37 37 39 40 39 40 41 43 43 43 42 41 40 39 40 39 37 37 38 37 35 34 34 35 35 35 34 33 32 32 33 36 38 40 39 38 38 38 39 39 38 38 38 39 39 39 38 37 38 39 39 38 37 36 35 34 35 35 35 36 36 37 37 39 39 40 39 38 38 37 36 36 35 35 36 35 35 34 34 34 33 33 31 31 31 31 31 30 31 33 33 34 34 33 33 32 30 30 30 31 31 30 30 29 29 29 30 31 32 32 30 29 29 30 30 30 30 32 33 32 33 34 34 34 34 34 33 33 34 34 34 34 33 32 31 31 30 30 30 30 30 30 31 32 32 32 32 33 33 31 29 29 29 29 31 32 33 33 34 33 32 30 29 28 29 30 28 26 24 23 23 23 23 24 24 24 24 26 25 24 24 24 24 26 27 27 26 25 24 24 25 26 27 28 27 26 25 24 25 25 24 24 24 24 23 23 24 26 26 25 26 27 28 28 28 29 29 29 28 27 28 27 27 26 26 26 27 27 27 26 26 26 27 27 27 27 27 27 27 26 27 28 28 27 27 26 26 27 26 26 27 27 27 28 28 29 30 31 30 30 31 32 32 31 31 31 32 32 31 30 30 29 28 28 27 27 26 24 24 26 27 27 26 24 25 27 28 28 54 55 55 55 54 54 55 54 54 53 53 52 52 51 52 52 51 51 52 52 51 50 50 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 46 46 47 46 45 46 47 47 47 47 47 46 47 47 47 47 46 46 46 47 47 46 46 46 46 46 46 46 46 46 45 44 44 44 45 46 45 45 44 45 45 45 44 43 44 45 44 43 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 43 43 44 44 45 46 45 44 43 44 46 47 47 46 45 44 46 47 47 46 46 46 48 48 49 49 49 49 48 48 48 48 48 49 48 47 48 49 50 50 49 48 48 48 48 49 49 49 48 48 47 46 45 44 44 44 43 43 43 43 43 42 42 43 43 42 41 41 41 41 40 40 40 40 40 40 39 38 39 39 39 39 38 37 37 36 36 36 36 37 37 37 37 37 38 38 38 38 38 38 39 40 39 39 39 40 40 40 40 40 41 41 41 42 41 41 42 42 42 41 41 40 40 40 40 41 42 42 41 40 39 39 39 38 37 37 37 38 38 37 37 38 37 35 34 34 35 38 39 40 40 39 40 41 42 42 42 42 43 43 42 42 42 42 42 43 44 44 43 43 43 43 43 42 41 39 38 39 40 41 41 40 38 37 36 37 38 39 40 41 42 43 43 42 41 40 39 38 39 38 37 37 37 37 36 35 34 34 34 34 34 33 32 32 34 36 38 40 39 38 38 37 39 39 38 37 37 38 38 38 37 37 38 39 40 39 38 37 36 34 33 34 35 36 36 36 37 38 39 39 39 39 38 37 37 37 36 36 36 35 34 34 33 33 32 32 32 32 33 33 33 32 32 33 34 34 34 34 33 32 30 30 30 31 31 30 30 29 29 29 29 31 32 31 30 29 29 30 30 30 31 32 32 32 32 33 33 33 33 33 33 33 34 34 33 33 33 32 31 31 30 30 30 30 30 31 32 33 33 33 34 34 33 31 30 30 29 29 30 31 32 33 34 34 33 32 30 30 30 30 29 28 27 24 23 23 23 23 24 24 24 24 24 24 24 24 24 26 26 26 25 24 24 24 25 27 27 27 27 27 26 24 24 25 25 24 23 23 23 24 25 26 27 27 27 27 27 27 27 28 28 27 27 27 27 27 26 25 25 26 27 26 26 26 26 26 26 27 27 27 27 27 26 26 27 27 27 27 26 25 25 26 26 27 27 27 27 27 28 30 31 31 30 30 30 31 31 30 30 30 31 32 31 30 30 29 29 29 29 28 27 26 25 25 25 25 25 24 26 27 28 29 55 55 55 55 55 55 55 54 53 52 52 52 52 53 53 53 53 52 52 51 50 50 50 49 49 49 50 50 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 46 46 45 46 47 47 48 48 48 47 47 48 47 47 46 46 46 47 47 47 47 47 47 47 47 47 46 46 45 44 44 45 46 45 45 45 45 45 45 44 43 43 44 44 44 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 44 45 44 43 42 43 45 46 46 45 44 44 45 47 47 46 45 46 47 48 49 49 49 48 48 47 48 48 48 48 47 47 48 49 50 49 48 47 47 47 48 48 47 47 48 49 48 47 46 45 44 44 43 43 44 44 43 43 43 44 44 43 42 42 41 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 37 36 36 36 36 36 36 36 36 37 37 37 37 38 38 39 39 39 39 39 39 39 39 39 40 40 41 41 41 41 41 41 41 41 42 42 41 40 40 40 41 42 42 42 41 40 40 40 39 38 37 37 38 39 39 39 38 36 35 34 34 34 35 37 39 40 40 39 39 41 41 41 41 41 42 42 42 41 41 41 42 43 44 43 43 42 42 42 43 42 40 39 38 37 39 40 40 39 37 36 36 37 38 40 41 42 42 42 41 41 41 40 39 38 38 37 36 36 36 37 37 35 34 33 32 33 33 32 31 32 35 36 38 39 39 38 37 37 38 38 37 36 37 38 37 36 36 37 38 39 39 39 39 38 37 35 33 33 35 36 36 36 37 38 38 39 39 38 37 37 37 37 37 37 37 36 34 34 33 33 32 33 33 34 33 33 33 33 33 33 33 34 34 34 33 33 32 31 31 31 30 30 30 29 29 29 29 30 31 30 29 29 29 30 30 31 31 31 31 31 32 32 33 33 33 33 34 34 34 34 33 33 32 32 32 32 31 30 30 30 30 31 33 33 33 34 34 34 34 32 32 31 29 29 29 31 31 32 32 33 33 33 32 30 30 29 28 29 29 27 24 23 23 23 23 24 24 24 24 24 24 24 25 26 25 24 24 24 24 24 25 27 27 26 25 25 26 25 24 24 25 24 23 23 24 24 26 26 25 26 26 27 26 26 26 26 27 27 27 27 27 27 26 25 25 26 26 26 26 26 26 26 26 27 27 27 27 27 26 26 26 26 26 27 26 25 24 25 26 27 27 27 27 28 29 29 29 30 30 30 30 31 31 30 30 31 32 32 31 30 30 29 29 30 30 29 28 27 26 24 24 23 24 26 27 28 28 28 55 56 56 55 55 54 54 53 53 52 53 54 54 54 54 54 53 52 52 51 50 50 49 49 49 50 51 50 50 50 49 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 47 47 46 46 47 47 47 47 46 45 45 46 47 48 48 49 48 48 48 48 47 47 46 46 47 48 48 47 47 47 48 47 47 47 47 46 45 45 45 46 46 45 45 45 45 45 44 44 43 43 44 44 44 44 44 43 44 44 43 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 42 42 43 44 45 44 43 43 44 45 46 46 45 44 45 46 47 48 49 49 48 47 47 47 47 47 47 46 46 47 48 48 48 47 46 46 47 48 47 46 46 48 49 49 47 46 45 44 44 44 44 44 44 44 44 44 45 44 43 43 42 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 38 37 36 36 36 36 36 36 36 36 37 37 37 38 39 39 38 38 38 39 39 39 39 39 40 41 41 41 41 41 41 40 40 41 41 42 41 41 41 41 42 43 42 42 41 40 40 40 39 37 37 38 39 40 39 39 38 37 35 35 34 34 34 36 38 40 40 38 38 40 41 41 40 41 41 41 40 40 41 42 42 43 43 43 42 41 41 41 42 42 40 39 38 37 38 39 39 38 37 36 36 38 39 40 41 42 42 41 40 40 40 40 39 37 37 36 35 35 36 37 37 36 35 33 32 32 32 31 31 33 35 36 36 38 40 39 38 37 37 37 36 35 36 37 36 35 36 38 38 38 38 38 38 38 37 36 34 33 35 36 36 37 37 37 37 38 39 38 37 37 37 37 37 37 37 36 34 34 34 33 33 33 33 34 34 33 33 33 32 32 33 33 33 33 34 34 34 33 32 31 30 30 30 29 29 29 29 29 29 29 29 29 30 30 31 31 30 30 30 31 32 32 32 33 33 33 34 34 34 34 34 33 32 32 31 31 30 31 31 32 32 32 31 32 33 35 35 34 34 33 33 31 29 29 29 30 30 31 32 32 33 33 32 30 30 29 28 28 28 27 26 25 24 23 23 23 24 24 24 24 24 24 25 26 26 25 24 24 24 24 26 27 27 25 24 24 25 25 24 23 23 24 23 23 23 23 24 24 23 24 25 26 25 25 25 25 25 25 26 26 26 26 25 25 25 25 26 26 26 27 27 27 27 27 27 27 27 27 26 26 25 25 25 25 25 24 24 25 26 27 26 26 27 28 29 29 28 28 29 29 29 30 30 30 30 30 31 31 30 30 30 28 28 28 28 29 28 27 26 25 24 23 24 26 28 27 27 27 56 57 56 55 54 54 53 53 53 53 54 54 54 54 53 53 52 52 51 51 50 50 50 49 50 51 52 51 51 51 50 50 49 48 49 50 50 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 48 47 47 47 46 46 46 47 48 49 49 48 48 48 48 48 47 46 46 47 48 49 48 48 48 48 48 48 48 47 46 45 46 46 46 46 46 46 46 46 45 45 44 43 43 44 45 45 44 44 44 44 44 43 42 41 42 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 42 42 42 43 44 44 43 43 43 44 45 45 45 44 44 44 45 46 47 47 48 49 48 47 46 46 46 46 46 46 47 47 48 48 47 45 45 46 47 46 46 46 47 48 48 47 46 45 45 45 44 44 45 45 45 45 45 45 44 43 42 41 41 41 40 40 40 40 40 40 41 40 40 39 39 38 37 37 38 37 37 36 36 36 36 36 36 36 36 37 37 39 40 39 38 38 38 38 38 38 38 39 40 41 41 41 41 41 40 40 40 41 41 42 42 42 41 42 43 42 42 42 41 40 40 39 38 37 38 39 39 40 39 38 38 38 37 36 36 34 34 34 37 40 39 37 38 40 41 41 40 40 41 40 40 41 41 42 42 42 42 43 42 41 40 41 41 42 41 39 38 37 37 38 37 37 36 36 37 38 39 39 40 41 42 42 40 40 39 39 39 36 36 36 35 34 35 36 36 36 35 35 34 32 31 32 33 33 34 35 36 38 39 40 38 37 36 36 36 35 35 35 35 36 37 38 38 37 36 37 37 37 36 35 33 32 34 35 36 37 37 36 36 38 39 38 37 36 36 37 37 37 36 36 35 34 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 33 33 33 33 33 33 32 30 30 30 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 31 31 31 32 32 33 33 34 34 34 34 33 33 33 32 31 30 30 31 33 33 33 33 31 32 34 36 36 34 34 33 32 30 30 29 29 30 31 31 32 33 33 33 31 30 30 29 28 26 26 26 25 25 25 24 23 23 23 24 23 23 23 24 25 26 26 25 24 24 24 25 26 27 26 24 23 23 24 24 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 25 25 25 24 24 25 25 26 26 27 27 27 27 27 27 27 27 27 27 27 27 26 25 24 24 24 24 24 24 25 27 26 26 26 27 27 28 28 27 27 27 28 29 29 30 29 29 30 29 29 30 30 30 29 28 28 27 27 27 27 27 26 24 23 24 26 27 27 26 26 57 57 56 55 54 54 55 55 55 55 55 54 53 53 52 52 52 51 51 51 50 51 51 50 51 52 53 52 52 51 51 50 49 49 50 51 51 50 49 49 49 48 48 48 48 48 48 48 49 48 48 48 47 47 47 47 47 47 47 48 49 48 48 47 46 46 46 47 48 49 49 48 48 49 49 48 47 46 47 48 48 49 49 48 48 48 48 48 48 47 46 46 47 47 47 47 46 46 46 46 46 45 44 43 43 44 45 45 45 44 44 44 43 43 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 41 41 40 40 40 41 41 41 43 44 43 42 42 42 43 44 44 44 44 44 44 44 46 47 46 47 48 48 47 45 45 45 46 46 46 47 46 47 48 47 45 44 45 46 45 45 46 47 48 47 47 46 46 45 45 44 44 44 44 45 46 45 44 44 43 42 41 41 41 40 40 40 39 39 40 40 40 40 40 39 38 37 37 37 38 38 37 36 36 36 36 37 37 36 36 37 39 39 38 38 39 38 38 38 38 39 39 40 40 40 40 40 40 40 39 40 41 41 42 42 42 42 42 43 42 42 42 41 40 40 39 39 39 39 40 40 40 39 38 37 37 37 37 37 36 34 34 35 38 37 37 38 40 41 40 39 39 40 39 40 40 40 42 42 41 42 43 42 41 40 40 40 41 41 39 38 37 37 37 37 36 35 35 37 38 39 40 40 41 42 41 39 38 38 38 38 37 36 36 35 34 35 35 35 34 33 33 33 32 32 34 35 34 34 35 37 38 38 38 38 37 36 35 35 34 35 35 36 37 38 38 37 36 36 36 37 37 36 34 33 32 33 34 36 36 35 35 36 37 38 37 37 36 35 36 37 37 36 36 36 35 35 35 34 34 34 34 34 33 33 34 34 33 33 32 31 31 31 31 31 32 33 32 30 30 30 30 30 29 29 29 29 29 29 29 30 30 29 29 29 30 30 30 30 31 32 32 32 33 33 33 34 34 33 33 33 32 31 30 31 32 33 33 33 34 33 33 35 36 36 34 34 33 31 30 30 29 29 30 31 32 32 33 33 33 33 31 30 29 28 27 27 27 25 25 25 24 23 23 23 23 23 23 23 23 24 25 24 24 24 24 25 26 27 26 25 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 25 25 24 24 24 24 25 26 26 27 28 29 29 28 27 28 28 29 29 28 28 28 27 27 26 25 24 24 24 24 24 25 26 26 25 26 27 27 26 26 27 27 27 27 28 29 30 29 29 29 28 28 30 30 30 29 29 28 28 28 27 27 27 26 25 24 24 26 27 26 25 26 57 56 56 55 55 55 56 56 55 55 54 54 53 53 52 51 51 51 51 52 52 52 51 51 52 53 53 52 52 52 51 50 49 50 51 53 53 51 50 49 49 48 48 48 48 48 48 48 49 49 48 48 48 48 48 49 49 49 48 48 49 49 48 47 47 46 46 48 49 50 49 48 49 50 49 49 47 47 47 48 48 49 49 48 47 47 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 45 44 43 43 44 45 45 45 44 44 44 44 44 43 44 44 44 44 43 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 42 42 42 42 42 43 43 43 43 43 43 44 46 46 46 46 47 47 47 46 45 45 46 46 46 46 46 47 47 47 45 44 45 45 44 45 45 46 47 47 47 46 46 45 44 44 43 43 44 44 45 45 44 43 43 42 41 41 41 41 41 40 40 39 39 40 40 40 40 39 38 38 37 37 37 38 38 37 37 36 36 37 37 36 36 37 37 37 38 39 39 38 38 38 39 39 40 40 40 40 40 40 40 39 39 40 41 41 42 42 42 42 42 42 42 42 42 41 40 40 40 40 40 40 41 41 41 40 39 37 37 37 36 36 36 35 34 34 35 35 37 39 40 40 39 38 39 38 39 40 40 41 41 41 40 42 43 42 41 40 39 39 41 41 40 38 37 36 36 36 35 35 37 38 39 40 41 41 41 42 41 39 38 37 37 37 37 36 36 35 34 34 34 34 33 31 31 31 32 34 36 36 35 35 35 36 38 37 37 38 38 36 35 34 34 34 36 37 37 37 37 36 35 35 36 37 37 35 34 33 32 32 34 35 35 34 34 35 36 37 37 37 35 34 35 36 36 36 35 35 35 35 34 33 33 33 33 33 33 34 34 34 33 33 33 32 32 31 30 30 31 32 32 32 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 32 32 32 33 33 33 33 34 34 34 33 33 33 31 31 33 33 33 33 33 34 34 34 35 36 35 34 33 32 32 30 29 28 29 31 31 32 32 32 33 33 33 32 31 30 29 28 29 29 27 25 25 24 24 25 24 23 23 24 24 23 23 23 24 24 24 25 26 26 26 25 24 23 23 24 24 23 23 24 24 26 26 26 26 25 25 25 25 24 25 25 25 26 26 27 26 26 26 25 25 26 26 26 27 27 28 29 30 29 28 29 29 30 29 28 28 27 27 27 27 26 26 25 24 24 24 24 25 25 25 26 27 27 26 26 27 27 27 27 28 29 30 30 29 28 27 28 30 30 30 30 29 29 29 29 28 27 26 25 25 24 24 25 26 26 25 25 57 56 56 55 55 56 56 56 55 55 54 53 52 52 52 52 52 53 54 54 53 52 51 52 53 53 53 52 52 51 51 50 50 50 52 53 52 51 50 50 49 48 48 48 48 48 49 49 49 48 48 48 48 49 49 50 51 51 49 49 49 49 49 48 47 46 47 48 49 50 50 49 49 50 49 49 48 47 47 48 49 49 48 48 47 46 46 47 47 47 47 47 47 46 46 46 46 46 45 46 46 45 44 43 44 44 45 45 46 45 44 44 45 45 45 45 45 45 44 43 42 42 43 42 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 43 43 43 42 43 44 46 46 45 45 45 46 48 47 45 45 45 45 46 46 46 46 46 46 45 44 44 44 44 44 45 46 46 47 48 47 45 44 44 43 43 43 43 44 44 44 44 43 42 42 41 41 41 41 40 40 40 39 38 39 40 40 40 39 38 38 37 37 37 37 37 37 38 37 36 36 36 36 36 36 37 37 37 38 38 38 38 38 39 39 39 40 40 39 39 40 39 39 38 40 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 40 40 40 41 41 40 40 40 38 38 37 37 36 36 38 36 34 34 35 38 38 39 40 38 39 39 37 39 41 41 41 40 40 41 42 43 42 41 40 39 39 40 41 40 39 37 36 35 35 34 36 38 39 40 40 40 40 41 41 40 40 38 37 37 37 37 36 36 35 34 33 34 34 32 31 30 32 34 37 38 37 36 36 37 37 37 36 36 37 37 36 34 33 33 34 35 36 36 37 37 35 34 35 35 36 37 36 34 34 32 31 33 33 33 33 35 36 36 37 37 37 35 34 34 34 35 36 35 34 34 34 33 33 33 32 32 32 33 33 34 34 34 34 34 33 33 33 31 30 30 31 32 32 32 31 30 30 29 29 29 29 29 29 29 29 29 29 29 30 31 31 32 32 33 34 34 33 33 33 33 34 34 34 33 33 32 32 32 33 33 33 33 34 34 34 34 35 36 35 34 33 31 30 30 29 28 28 30 31 30 31 32 33 33 33 32 31 30 30 29 29 28 27 27 26 25 26 27 26 24 24 23 23 23 23 23 23 24 26 26 26 26 25 24 23 23 24 26 26 25 25 25 25 27 27 27 27 26 26 26 25 25 26 27 27 27 26 26 26 26 27 26 26 26 27 27 27 27 28 29 30 29 29 30 30 30 29 28 27 27 27 27 27 27 26 26 25 24 24 24 24 24 24 26 26 25 25 26 27 27 27 27 28 29 30 30 30 28 27 29 30 30 30 30 30 30 30 29 29 27 25 25 25 26 25 24 26 26 24 24 57 56 56 55 56 56 56 55 55 54 54 53 53 53 53 54 54 55 56 55 53 52 52 53 54 54 53 52 52 52 51 50 50 50 52 53 52 51 51 50 49 48 49 48 48 48 50 50 49 48 49 49 49 50 50 51 52 52 50 50 50 49 49 48 47 46 47 48 49 50 50 49 49 49 49 48 48 48 48 48 49 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 45 45 46 46 45 45 45 45 45 45 46 46 45 44 44 43 43 45 44 43 43 42 42 41 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 41 42 44 45 45 44 44 45 46 47 46 45 45 45 44 45 45 45 46 46 46 45 44 43 43 44 45 45 45 46 47 47 46 45 44 43 43 43 43 43 43 43 44 43 43 42 41 41 41 40 40 40 40 39 39 38 38 39 39 39 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 37 38 38 37 38 38 39 39 38 39 39 39 39 40 39 38 38 39 40 41 41 41 40 40 41 42 42 42 42 42 42 42 41 40 40 41 40 40 40 40 39 39 38 38 39 39 38 38 37 35 34 34 36 37 39 39 37 37 37 37 40 41 41 39 39 40 42 42 43 42 41 40 40 38 38 39 39 38 36 35 34 34 34 36 38 39 40 40 39 39 40 39 38 39 39 36 36 36 37 35 35 36 34 33 33 33 32 30 32 35 36 38 38 38 38 38 37 37 36 35 35 35 36 36 34 33 32 33 35 35 36 36 36 34 33 33 34 36 37 36 35 34 32 30 31 33 33 33 34 36 36 37 37 37 35 33 33 33 34 35 35 35 35 34 34 33 33 33 33 32 32 33 33 34 34 34 34 34 34 34 33 32 32 31 31 31 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 31 32 33 34 34 34 34 34 34 34 33 33 32 32 33 33 33 33 34 34 35 35 35 34 34 35 34 34 33 31 30 30 30 29 28 29 31 31 32 33 33 33 32 30 30 30 30 29 28 27 26 26 25 24 27 29 27 24 23 23 23 23 23 23 24 26 27 26 25 25 24 23 23 24 25 27 27 27 27 27 27 27 27 28 27 27 27 26 25 25 27 27 28 27 26 26 26 27 27 26 26 26 27 28 27 28 29 29 30 30 30 30 29 29 29 28 27 27 26 26 26 26 26 26 25 25 24 24 24 24 24 25 26 24 24 25 26 27 27 27 28 29 29 29 28 27 27 29 30 30 31 31 31 30 30 30 30 28 27 27 28 28 26 23 24 24 23 23 57 57 56 56 57 57 56 55 54 54 53 53 55 55 55 55 55 55 55 55 53 53 54 55 55 54 53 52 52 52 52 51 50 50 51 52 52 52 51 50 49 49 49 48 48 49 50 50 49 49 49 50 50 50 51 52 52 52 51 50 50 49 48 48 47 47 47 48 49 50 50 50 50 50 49 49 49 48 48 48 48 48 47 46 46 46 47 46 45 45 46 45 45 45 45 46 46 46 45 45 45 45 44 44 44 45 46 46 46 46 46 45 45 46 46 46 46 45 44 44 44 45 46 45 44 44 44 43 42 41 41 40 40 40 40 40 40 41 40 40 40 40 40 41 41 42 42 41 41 42 43 45 45 44 44 45 45 46 46 45 44 44 44 45 45 45 45 46 46 44 44 43 43 44 45 46 45 45 47 46 45 44 44 43 43 43 42 42 43 43 44 43 43 42 42 41 41 41 41 40 40 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 38 38 38 38 38 39 38 38 39 39 38 38 38 40 40 40 40 40 40 40 41 42 42 41 41 42 42 42 41 41 41 40 40 40 39 39 38 38 39 40 40 40 39 38 38 36 34 34 34 35 39 40 36 35 35 38 40 40 39 38 39 40 41 42 42 42 41 40 40 38 37 37 38 38 37 34 34 34 35 37 38 38 39 39 38 38 38 38 37 39 39 36 35 35 36 36 35 35 34 33 33 32 31 30 34 36 35 36 37 39 40 39 38 37 36 35 35 34 35 35 34 33 32 33 34 34 35 35 34 33 33 33 35 36 37 36 34 33 32 31 30 31 31 32 34 35 36 37 37 37 35 33 33 32 33 34 34 35 35 34 34 34 33 33 34 33 32 32 33 33 33 34 34 34 34 34 34 34 34 32 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 33 34 34 35 34 34 34 33 32 32 33 33 33 34 34 34 35 36 36 35 34 34 34 34 33 32 30 30 30 30 29 28 30 33 33 33 33 33 33 31 30 30 29 28 28 27 26 26 26 26 26 28 29 27 25 23 23 23 23 23 23 25 26 27 26 25 24 24 23 23 24 26 27 27 28 28 29 29 28 29 29 28 28 27 26 25 26 27 28 28 27 26 26 27 27 27 27 27 27 27 29 29 29 30 30 30 30 29 29 28 28 28 28 27 27 26 25 25 25 25 24 24 24 24 24 24 24 24 24 25 24 24 24 25 27 27 27 27 27 27 26 25 26 27 28 30 31 31 30 30 30 29 29 30 29 28 29 29 28 26 25 24 23 23 22 57 57 57 57 58 57 56 55 54 54 55 55 57 56 55 56 56 55 54 54 54 54 55 56 55 53 53 52 52 52 52 51 51 51 52 52 52 52 51 51 50 50 49 48 48 50 52 51 50 50 50 51 52 51 51 52 52 51 50 50 49 48 48 48 47 47 48 48 48 49 51 52 51 50 50 49 49 49 48 48 49 50 48 47 46 45 46 46 45 45 45 45 44 44 45 46 46 46 46 46 45 45 45 44 45 46 46 47 46 46 46 46 46 46 46 46 46 45 45 45 44 44 45 46 45 45 44 43 42 43 42 41 41 40 40 40 40 41 40 40 40 40 40 41 41 41 41 41 41 42 43 44 44 43 44 44 45 46 46 45 44 44 44 44 44 45 45 45 45 44 43 43 43 44 45 45 45 45 46 46 45 45 44 43 43 43 42 42 42 42 43 43 43 43 43 42 41 42 42 41 40 40 40 39 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 37 37 37 36 36 36 37 37 38 38 38 38 39 38 38 38 38 38 38 39 40 40 40 40 40 40 40 41 42 42 41 41 41 41 41 41 40 40 40 40 40 39 38 37 38 40 40 40 40 40 39 39 37 35 34 34 35 38 40 36 34 36 39 40 39 37 38 39 39 40 41 42 43 42 40 40 39 38 37 37 37 37 35 33 34 35 36 37 37 38 37 37 37 36 36 38 39 38 37 35 35 36 36 34 35 35 34 33 31 30 30 32 34 34 35 37 39 40 39 39 38 36 35 34 33 34 34 34 32 32 33 34 34 34 34 33 33 34 35 36 36 37 35 34 33 32 30 30 30 30 32 34 34 35 36 36 36 35 34 33 32 32 33 33 34 35 35 35 35 34 34 34 33 33 32 32 32 32 33 34 34 34 34 33 33 33 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 33 33 34 34 35 34 34 34 33 32 33 33 33 34 34 35 35 36 36 36 36 34 34 34 34 33 31 30 30 30 29 29 27 29 32 32 33 33 33 33 31 30 30 29 28 27 27 27 28 28 27 27 28 27 26 24 23 23 23 23 23 23 24 26 27 27 26 24 23 23 23 25 27 27 27 27 28 29 30 30 30 29 28 27 26 26 26 27 29 29 28 26 26 27 27 28 27 27 27 27 27 28 29 30 30 30 30 30 29 27 27 27 27 27 27 27 26 24 24 24 24 24 24 24 24 24 24 23 23 24 24 24 24 25 26 27 27 27 27 26 26 25 26 27 28 29 30 31 31 30 30 30 29 29 29 29 30 30 30 29 28 27 26 24 24 23 58 58 58 58 58 57 56 55 54 55 56 56 57 56 56 57 56 54 54 54 55 55 55 55 54 53 52 52 52 52 51 51 51 53 54 53 52 52 52 51 51 50 49 48 49 50 52 52 51 51 51 53 53 52 52 52 51 51 50 49 48 48 48 48 47 47 48 49 49 50 52 53 51 51 50 49 49 50 49 49 49 50 49 47 46 46 46 46 45 44 44 44 44 44 44 45 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 45 44 45 45 45 44 43 43 44 44 43 42 42 42 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 42 42 43 43 43 43 44 44 45 45 45 44 43 43 43 44 44 45 45 44 44 43 43 43 44 44 44 45 45 46 45 45 45 44 43 43 43 42 42 42 42 43 43 43 43 43 42 42 42 42 41 41 40 40 39 39 39 39 39 39 39 39 38 37 37 38 38 38 38 38 38 38 38 39 39 38 37 37 36 35 36 36 37 37 38 37 37 38 39 38 38 37 37 38 39 40 40 40 40 39 40 40 41 42 42 41 40 41 41 41 41 40 40 40 39 39 39 38 37 38 40 40 39 39 39 40 39 38 37 36 34 34 36 37 36 35 37 39 39 38 37 37 38 38 40 41 41 42 41 40 40 39 39 38 37 37 36 34 33 33 34 35 36 37 37 36 36 36 35 36 38 38 37 37 35 35 36 36 35 34 34 34 33 31 30 30 31 33 34 37 38 38 39 39 38 37 36 35 34 33 33 34 33 32 32 33 34 33 34 33 33 33 34 35 35 36 36 36 35 33 31 30 30 30 31 32 33 33 34 35 35 36 35 34 34 33 32 32 33 33 34 35 34 34 34 34 34 34 33 33 32 32 32 32 32 33 33 34 33 32 31 30 29 29 29 29 29 30 31 30 29 29 29 29 29 29 29 29 29 29 29 30 30 31 32 33 33 34 34 34 34 34 34 33 33 33 33 33 34 35 36 36 36 36 35 35 35 34 34 34 34 33 32 32 31 29 29 27 28 30 30 31 32 33 33 32 31 30 29 28 28 28 28 31 32 30 29 28 26 24 24 23 23 23 23 23 23 23 24 26 27 26 25 23 23 24 26 26 26 27 27 27 28 29 29 29 29 27 27 26 26 27 29 29 28 27 27 27 27 28 28 27 27 28 28 27 27 29 30 30 30 30 30 29 28 27 27 27 27 26 26 25 24 24 25 25 24 24 24 24 24 24 23 23 24 24 23 23 25 26 27 27 26 25 26 27 27 29 29 29 30 30 31 30 30 30 30 29 28 28 29 29 28 29 30 29 28 28 27 26 25 59 58 58 57 57 56 56 55 55 56 57 56 57 57 57 57 56 55 55 56 55 55 55 54 53 52 52 51 51 51 52 52 52 54 55 54 52 52 52 51 50 50 49 48 49 50 52 52 51 52 53 54 54 53 52 52 51 50 50 49 49 48 48 48 47 47 48 49 50 51 53 53 53 52 52 50 50 50 49 49 49 48 47 47 46 46 46 45 44 44 44 44 44 44 44 45 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 46 46 45 45 46 46 46 46 45 45 46 45 44 44 44 45 45 44 42 43 44 43 42 42 41 41 40 40 40 40 40 40 41 40 40 41 41 42 42 42 42 43 43 44 44 44 44 44 44 43 43 43 43 44 45 45 44 43 43 42 43 44 44 44 45 45 45 45 44 44 44 43 43 42 42 42 41 41 42 42 42 42 43 43 43 43 43 42 41 40 40 40 40 39 39 40 40 40 39 39 38 38 38 38 38 38 38 38 39 39 39 39 38 38 37 37 36 36 35 36 36 37 37 37 38 39 38 37 37 37 38 39 40 40 40 39 38 39 40 41 41 41 41 40 41 41 41 41 41 40 40 40 39 38 38 38 37 39 40 39 38 39 40 40 39 39 38 35 34 34 36 36 35 35 37 38 37 36 36 38 39 40 40 40 41 41 40 39 38 37 37 36 36 36 34 33 32 33 35 37 38 37 35 35 35 35 35 37 36 36 36 35 34 35 36 35 34 33 33 32 31 30 30 31 33 35 37 37 37 39 39 38 36 35 34 34 34 33 32 32 32 32 34 34 33 32 33 33 34 34 34 34 35 35 35 35 33 31 30 30 30 31 32 32 33 33 34 35 35 35 34 34 34 33 32 32 33 33 34 33 33 34 34 34 34 34 34 33 33 33 32 31 31 31 32 31 30 30 31 30 29 29 30 30 32 32 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 33 33 34 34 34 34 34 33 33 33 33 33 35 36 37 36 36 34 34 34 34 34 34 34 34 34 34 32 30 30 29 28 28 30 31 32 32 34 33 33 31 29 29 29 30 29 28 31 32 31 29 27 26 26 25 24 23 23 23 23 23 23 24 25 26 26 24 23 24 25 26 25 26 27 27 27 28 28 29 29 28 27 27 27 27 28 30 29 28 27 28 28 28 29 29 28 28 29 29 28 28 29 30 30 30 30 30 30 29 28 27 27 26 26 25 25 25 26 26 26 26 25 24 24 24 23 23 23 24 24 23 23 24 25 26 26 25 24 25 27 28 28 28 28 30 29 29 30 30 30 30 29 28 28 29 27 27 27 29 29 28 28 28 27 25 59 58 58 57 57 56 56 56 56 57 58 57 58 58 57 57 56 56 56 57 56 56 55 54 53 52 52 51 51 52 54 54 54 55 55 54 52 52 51 51 50 50 49 49 50 51 53 53 53 54 55 55 54 53 52 52 51 50 50 49 49 49 49 48 48 48 48 49 51 52 54 55 54 54 53 51 50 50 49 49 48 47 47 46 46 46 45 45 45 45 44 43 43 43 44 45 45 46 46 45 45 46 45 45 44 44 44 45 45 45 45 46 46 45 45 45 46 46 46 46 45 45 46 46 45 46 45 45 45 43 43 45 45 43 42 43 42 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 43 43 43 43 43 44 44 44 43 42 43 43 44 45 44 43 42 42 43 44 44 44 44 44 44 45 44 44 43 43 43 42 41 41 41 41 41 41 41 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 41 40 40 39 38 38 38 38 38 38 38 39 39 39 39 39 38 38 38 38 38 36 35 35 35 35 36 37 38 39 38 37 37 37 38 39 39 39 39 39 38 39 40 41 41 40 41 40 40 40 41 40 40 41 41 40 39 39 39 38 37 38 38 38 38 38 40 40 39 38 38 37 35 34 35 35 35 36 38 38 36 35 36 38 40 39 39 39 40 41 41 40 38 38 37 36 35 35 34 33 32 33 35 37 38 36 35 34 34 34 35 36 35 35 35 34 34 34 35 35 35 34 33 33 32 31 30 31 33 36 36 36 37 38 39 39 37 36 35 34 34 33 32 31 31 32 33 33 32 32 32 34 34 34 34 34 34 35 35 34 33 31 30 30 30 30 30 31 33 33 33 34 34 35 35 34 33 33 32 32 32 33 33 33 33 34 34 34 34 34 34 34 34 34 33 32 31 30 31 31 31 32 33 32 31 30 31 31 31 31 30 30 30 29 29 30 29 29 29 29 29 29 29 30 31 31 31 32 33 34 34 35 34 34 33 33 34 34 35 36 36 36 35 34 33 33 33 33 33 33 33 33 33 32 31 30 29 29 27 27 30 32 33 33 33 33 32 30 30 30 30 30 29 29 31 32 31 28 27 27 27 26 24 23 23 23 23 23 23 24 25 26 25 23 23 23 25 25 25 26 27 28 29 29 29 29 29 28 28 29 28 28 29 29 29 28 28 29 29 29 29 30 29 29 30 30 29 29 30 30 30 30 30 30 29 29 28 27 27 26 26 25 26 27 27 27 26 26 25 24 24 24 23 23 23 23 23 23 23 24 24 24 24 24 24 25 27 26 26 27 28 29 28 28 29 30 30 30 30 28 27 28 28 28 27 27 28 27 27 27 26 26 58 58 58 58 58 57 56 56 57 58 58 58 58 58 58 57 57 57 57 57 57 56 55 54 53 52 52 52 52 54 55 56 55 55 55 53 52 52 51 50 50 50 49 50 50 52 54 54 54 55 55 55 54 53 52 52 51 51 50 50 50 50 49 48 48 48 48 50 51 52 54 54 54 53 52 51 51 50 49 50 50 49 47 47 47 47 46 46 46 46 44 43 42 42 43 44 45 46 45 45 45 45 45 45 44 44 44 44 45 45 45 46 46 45 45 45 46 46 46 46 46 46 46 46 46 46 45 44 44 44 45 45 44 42 42 43 42 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 42 43 43 43 44 44 43 42 42 42 43 44 44 44 43 42 42 43 44 43 43 43 43 44 45 45 44 44 44 43 43 42 41 41 41 40 40 41 41 42 41 41 42 42 43 42 41 41 40 40 40 41 42 41 40 40 39 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 37 36 35 35 35 35 35 36 37 39 39 37 36 37 38 39 39 38 38 38 38 39 40 40 40 40 40 40 39 39 40 40 40 40 40 41 40 40 40 39 39 38 38 37 37 38 39 39 38 37 36 36 36 34 34 34 34 37 39 38 36 35 36 38 39 38 38 39 40 41 41 40 39 38 37 36 35 34 34 33 32 32 33 36 37 36 35 35 35 34 34 35 34 35 35 34 33 34 34 34 35 34 34 33 32 30 30 31 33 35 35 36 37 38 39 39 39 37 36 35 34 34 33 32 31 31 32 33 32 32 32 33 34 33 33 33 33 35 35 34 32 30 30 30 30 30 31 31 32 32 33 34 35 35 35 34 33 33 32 31 32 33 33 32 33 33 34 34 34 35 34 34 34 34 34 34 33 31 32 33 33 33 34 34 32 31 32 32 32 32 32 32 31 30 30 30 29 29 29 29 29 29 30 31 33 33 33 33 34 34 35 35 34 34 34 34 34 35 36 36 34 34 34 34 33 32 31 31 31 32 32 32 32 30 30 30 29 28 27 27 29 33 33 33 33 34 32 30 30 30 30 30 29 29 30 32 31 28 27 27 27 26 25 23 23 23 23 23 23 23 25 26 25 23 23 23 23 24 25 26 27 28 29 29 29 29 29 29 29 30 29 29 29 29 28 28 29 30 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 26 26 26 27 27 27 27 26 26 24 24 25 25 24 23 23 23 23 23 23 23 24 23 23 24 24 26 27 25 25 27 28 28 25 26 28 30 30 30 30 29 28 27 28 28 27 26 27 27 27 27 26 25 59 59 59 59 58 57 57 56 57 58 59 59 59 59 59 58 58 58 57 57 56 55 55 54 53 52 52 53 55 56 56 56 56 55 54 53 52 52 51 50 50 50 50 50 51 53 55 55 56 56 55 55 54 53 52 52 51 51 50 50 50 49 49 49 48 48 50 52 53 53 54 54 53 52 52 52 51 50 51 52 52 50 48 48 47 47 47 47 46 46 45 44 43 42 43 44 45 46 45 44 44 44 45 45 44 43 43 44 44 45 45 46 45 45 45 45 45 46 46 46 46 46 46 46 46 45 44 44 45 45 45 45 44 43 44 44 42 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 42 43 43 43 43 43 42 42 43 43 44 44 44 43 42 42 43 43 43 42 43 43 44 45 45 44 44 44 43 43 42 41 41 41 40 40 41 41 41 41 41 41 42 42 42 42 41 41 41 41 42 42 41 40 40 39 39 38 38 38 38 38 38 39 39 39 39 38 38 38 38 37 37 37 36 36 36 36 35 35 37 39 39 37 36 36 38 38 38 37 37 38 38 39 40 40 39 39 40 40 40 39 39 39 39 39 40 40 40 40 41 40 40 39 39 38 37 37 36 36 36 35 34 34 35 34 34 34 34 35 37 37 35 35 37 38 37 37 38 39 39 40 40 39 37 37 37 37 35 34 33 33 32 32 33 36 37 35 34 35 35 33 33 33 34 34 34 33 33 32 32 32 33 33 32 31 30 30 30 31 33 34 35 35 36 37 38 38 39 38 37 36 35 34 34 33 31 30 31 32 31 31 32 33 33 33 33 33 33 34 35 34 31 30 30 30 30 31 32 31 30 31 33 34 35 35 34 34 34 33 32 31 31 32 32 32 33 33 34 35 36 35 35 34 35 34 34 34 33 33 33 33 34 34 34 34 32 31 33 33 33 33 32 32 31 30 30 30 30 29 29 29 29 29 30 32 33 34 34 34 35 35 36 36 35 35 35 35 36 36 36 35 34 34 34 34 33 32 30 30 30 30 31 31 30 30 30 30 29 28 27 28 30 32 32 32 34 34 33 32 32 32 32 32 30 30 30 31 32 30 30 29 27 27 26 24 23 23 23 23 23 23 24 26 26 24 23 23 25 24 25 27 27 28 29 30 30 29 29 30 30 30 30 30 29 29 29 29 30 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 28 28 27 27 27 26 26 26 26 25 24 24 24 24 24 23 23 23 23 23 23 24 26 27 26 25 25 26 27 26 24 27 29 29 30 30 30 30 29 27 25 26 26 26 26 26 25 25 25 24 60 60 60 60 59 58 58 57 58 58 58 59 60 60 60 59 59 58 57 57 56 55 55 54 53 52 53 55 56 57 56 55 55 54 53 52 51 51 51 51 50 50 50 51 51 53 56 57 57 55 54 54 54 53 52 51 51 51 50 50 50 49 49 49 48 48 51 53 55 55 54 54 54 54 53 52 52 51 52 52 51 50 49 48 47 47 46 46 46 46 45 45 44 43 43 44 45 46 45 44 44 44 44 45 45 44 43 43 43 45 45 46 45 44 44 45 45 45 45 45 45 46 46 46 46 45 45 45 46 46 46 45 45 45 45 44 43 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 42 42 43 44 43 42 42 42 42 43 44 43 43 42 42 43 43 42 42 42 43 43 44 44 44 43 43 43 42 42 41 41 41 40 40 40 40 41 41 40 41 41 41 42 42 42 42 42 42 42 42 41 41 40 40 39 39 39 39 38 38 39 39 40 40 39 39 38 38 38 38 38 37 37 37 38 37 36 35 36 38 38 37 36 37 38 38 37 37 37 38 38 39 40 40 39 39 39 40 40 40 39 39 38 38 39 40 40 41 41 41 40 40 39 38 38 37 36 36 36 36 36 36 36 36 35 34 34 34 35 36 34 35 37 38 36 36 38 38 39 40 40 39 38 37 36 36 35 34 33 33 33 32 32 34 35 34 34 34 33 32 32 32 33 34 34 34 33 31 31 31 32 32 31 30 30 30 30 31 33 34 34 34 35 36 36 37 38 38 38 37 36 34 34 33 33 32 30 30 30 30 32 32 32 32 31 31 32 34 34 33 31 30 30 30 30 31 32 31 30 31 33 34 34 34 34 34 34 33 32 31 30 30 30 31 32 33 33 34 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 33 33 34 34 32 30 30 30 30 30 30 29 29 29 29 29 29 29 30 32 33 34 34 35 35 36 36 36 36 36 36 36 35 35 35 34 34 34 33 33 32 30 29 29 30 30 30 30 30 29 29 29 28 27 28 29 30 30 31 33 34 33 33 34 34 33 32 32 31 31 31 31 31 31 30 28 26 25 24 23 23 23 23 23 23 23 25 26 24 23 24 26 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 29 29 29 29 30 30 30 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 28 28 28 28 29 29 28 27 27 27 27 27 26 24 24 24 24 25 24 23 23 23 23 23 23 24 25 25 24 24 24 24 25 26 25 27 28 29 29 29 30 30 29 28 26 25 25 25 25 25 23 23 24 25 61 61 61 61 59 59 58 58 58 58 59 60 61 60 60 60 59 58 57 57 56 55 54 54 53 53 55 57 57 56 55 55 54 53 53 52 51 51 51 51 51 51 51 51 52 53 56 57 56 55 54 53 53 52 52 51 51 50 50 49 49 49 49 49 48 49 50 52 54 55 54 54 55 55 54 53 52 52 52 52 51 49 48 48 47 46 46 45 45 45 45 45 44 43 42 43 44 45 45 44 43 43 44 45 45 44 44 43 43 44 45 45 45 45 44 45 45 45 45 45 45 46 46 46 46 46 45 46 46 47 47 46 46 46 46 44 43 42 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 43 43 43 42 41 42 42 42 43 43 42 41 42 43 42 42 42 42 42 43 45 45 44 44 43 43 43 42 41 41 41 40 40 40 40 40 41 40 40 41 41 42 42 42 43 44 43 43 43 43 42 41 40 40 40 40 39 39 39 40 40 40 39 39 39 38 38 38 39 39 38 38 38 38 38 36 35 36 37 37 36 36 37 38 38 37 37 37 38 38 39 39 39 38 38 39 40 41 40 40 39 39 38 38 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 38 38 38 38 36 34 34 34 34 34 35 36 38 38 36 36 37 37 38 39 40 39 38 37 36 35 34 34 33 32 33 32 32 32 33 33 33 33 33 32 32 32 34 34 34 34 33 31 30 30 31 31 30 30 30 31 33 33 34 33 32 33 34 34 35 36 37 38 38 37 36 35 34 34 33 33 31 30 30 30 31 31 31 30 30 30 31 33 34 33 32 31 30 30 30 30 31 30 30 31 33 33 33 33 34 34 34 33 32 30 30 30 30 30 31 32 33 33 34 34 34 34 33 33 33 33 34 34 34 34 34 33 33 34 34 34 34 34 33 31 30 30 29 29 30 30 29 29 29 29 29 29 30 31 32 33 34 34 34 34 35 36 36 36 35 35 35 34 34 34 34 34 34 32 31 30 30 29 29 29 29 30 30 29 28 28 28 27 27 27 28 30 30 30 32 33 32 31 32 33 32 31 32 33 32 31 30 29 28 28 27 25 25 26 25 23 23 23 23 23 23 24 24 23 24 25 26 27 27 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 28 29 29 29 27 27 28 29 30 29 28 28 28 28 28 27 27 27 27 26 25 25 25 26 26 25 24 24 24 23 22 23 24 23 23 23 23 23 24 25 26 25 26 27 27 28 28 28 28 28 28 27 26 25 25 25 25 25 25 25 26 62 62 62 62 60 59 58 58 59 59 59 60 61 60 59 59 59 58 58 57 56 55 54 54 55 55 55 57 57 56 55 55 54 53 53 53 53 52 52 52 52 52 51 51 52 54 55 57 56 55 54 53 52 52 51 51 50 50 50 49 49 49 49 49 49 49 50 51 52 53 52 53 55 55 55 53 53 53 53 52 50 49 48 48 47 46 46 46 45 45 45 44 44 43 43 42 43 43 44 44 43 43 43 45 45 44 44 43 43 43 45 45 45 44 44 44 44 45 45 46 46 46 46 46 46 46 46 46 47 47 48 48 47 47 48 46 45 44 43 42 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 43 43 43 43 42 41 42 42 43 43 42 41 42 42 42 42 42 42 43 43 44 45 45 45 44 43 43 43 42 41 41 42 41 41 41 40 40 40 40 40 41 42 41 41 43 44 43 42 43 43 43 42 41 40 41 41 40 40 40 40 40 39 39 39 38 38 39 39 39 39 39 39 39 38 38 36 35 35 37 37 36 35 37 37 38 37 37 37 38 39 39 38 38 38 38 39 40 41 40 40 40 40 39 38 38 38 39 39 39 39 40 40 40 39 39 39 39 38 39 40 38 36 35 34 35 35 34 34 34 35 37 38 38 36 35 36 36 37 38 39 39 38 37 37 35 35 34 33 32 32 32 32 32 32 32 32 32 33 32 32 32 33 33 32 32 32 32 31 30 30 30 30 30 31 34 34 34 33 32 32 33 34 34 35 36 38 38 38 38 38 37 36 35 34 33 32 31 30 30 30 30 30 30 30 30 31 32 33 33 32 30 30 30 30 30 30 30 30 31 33 33 33 33 34 35 34 34 33 31 30 30 30 30 31 33 33 33 33 33 34 34 34 33 32 32 32 33 33 34 34 33 33 33 33 33 34 34 32 30 30 29 29 29 29 29 29 29 29 29 29 30 31 33 34 33 33 33 33 34 35 35 36 35 35 34 34 33 33 34 34 34 34 32 30 30 30 30 30 29 29 29 28 27 28 29 27 27 27 27 28 29 30 30 30 31 31 30 31 33 32 31 31 32 33 31 29 28 27 27 26 25 26 27 26 24 23 23 23 23 23 23 23 23 24 26 26 27 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 29 29 28 28 27 28 29 29 28 28 29 30 29 28 27 27 27 27 28 27 27 27 27 27 26 26 27 27 26 26 25 25 25 24 23 22 23 23 22 22 22 23 25 26 25 25 25 26 26 27 27 27 27 27 28 28 27 27 27 27 27 26 26 26 26 63 62 62 62 61 59 59 59 59 59 60 61 61 60 59 58 58 58 57 56 55 54 55 55 57 56 56 58 58 57 56 56 55 54 54 55 54 53 53 53 53 52 52 52 53 55 57 57 56 55 54 53 52 52 51 51 51 50 50 50 50 49 49 50 50 50 50 51 51 51 50 51 52 54 54 52 52 52 51 51 49 48 48 48 47 46 46 46 45 45 45 44 44 44 43 42 42 42 42 42 43 43 42 43 44 44 43 43 42 42 45 46 44 43 43 44 45 46 46 46 46 46 46 46 47 47 46 47 47 46 47 48 48 48 48 48 47 46 44 42 41 40 40 40 39 39 39 39 40 40 40 40 40 41 41 41 42 42 42 43 42 42 42 41 41 42 42 43 43 42 41 42 42 41 42 42 42 43 43 44 45 45 44 44 44 43 43 43 42 42 43 42 42 42 41 40 39 39 40 40 40 41 42 42 42 42 42 43 43 43 43 42 41 41 41 40 40 40 40 39 39 39 38 38 39 40 40 40 40 39 38 38 38 37 36 35 35 36 36 36 35 36 37 37 37 37 37 38 39 38 38 38 37 38 39 39 40 40 40 39 39 39 38 38 38 38 39 39 39 39 39 39 39 40 39 39 40 40 39 38 36 36 36 37 37 35 34 34 34 35 36 36 34 34 35 36 36 38 39 40 40 39 38 37 36 35 34 33 32 32 32 32 32 31 31 31 31 31 31 32 32 32 32 32 32 32 31 30 30 30 31 31 33 35 35 34 33 32 32 32 33 34 36 37 37 37 37 37 38 37 37 36 36 35 34 31 30 30 30 30 30 30 30 30 31 32 32 33 32 31 30 30 30 30 30 30 30 31 32 32 32 33 34 35 34 34 33 31 30 30 30 30 32 33 33 33 32 33 33 33 34 34 33 32 31 31 32 33 33 33 31 32 33 33 34 33 32 30 30 29 29 29 29 29 29 29 29 29 29 31 32 33 33 32 33 33 34 34 35 35 35 35 34 34 33 33 33 34 34 34 33 32 31 32 31 30 29 29 29 29 28 28 29 30 29 28 28 27 27 28 29 30 30 30 30 29 31 32 31 30 30 31 33 31 28 28 28 28 27 27 27 27 26 25 23 23 23 23 23 23 23 23 24 25 26 26 27 28 29 29 30 29 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 29 29 30 29 29 28 27 27 27 28 29 29 30 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 25 24 24 24 23 23 23 22 22 22 22 23 25 25 24 24 25 26 27 27 27 27 26 26 27 28 28 28 27 27 27 26 25 25 25 62 62 62 62 61 60 59 60 60 61 61 62 61 60 59 58 57 57 57 56 55 56 56 56 57 57 57 58 58 58 58 57 56 55 56 56 55 54 54 55 53 52 52 53 54 56 57 57 56 55 54 54 54 53 53 52 52 51 51 51 50 50 50 50 51 51 51 51 50 50 50 50 51 52 52 50 50 50 49 49 48 47 47 47 46 45 45 45 46 45 44 44 44 43 43 43 43 43 42 42 41 41 41 42 43 42 42 41 41 42 44 45 43 42 44 46 46 46 45 45 46 46 46 46 47 47 46 46 46 46 47 48 48 48 48 48 47 46 46 43 41 41 40 40 39 38 38 39 40 40 40 40 40 41 41 42 42 42 42 42 42 41 41 41 41 42 43 43 43 42 41 41 41 41 42 42 42 43 43 44 45 44 43 43 43 43 43 43 43 43 43 43 43 42 41 40 39 39 39 40 40 41 42 41 41 41 41 43 43 42 41 41 40 42 42 40 40 40 40 39 39 39 39 39 40 41 41 40 40 39 38 37 37 37 36 36 36 35 35 35 35 35 37 37 36 37 38 38 38 37 38 38 37 37 39 39 39 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 39 40 39 38 39 40 39 38 38 39 39 39 38 36 34 34 34 33 34 34 33 34 36 36 38 38 38 39 39 38 38 38 38 36 36 35 33 33 32 32 32 31 31 31 31 31 31 31 31 31 31 31 32 32 31 30 30 30 31 32 32 34 34 34 33 32 31 32 32 34 35 35 35 36 35 36 37 37 37 37 36 36 36 33 31 30 30 30 30 30 30 30 31 31 32 32 32 32 30 30 30 29 29 30 30 31 31 31 33 33 33 34 34 34 33 31 30 30 30 31 32 33 34 33 32 32 32 32 33 33 33 33 31 30 31 33 33 31 30 32 34 34 34 33 31 30 29 29 29 29 29 29 29 29 29 29 30 31 32 32 31 32 33 34 33 34 34 35 35 34 33 33 32 32 33 33 34 34 33 32 33 33 31 30 29 30 30 30 30 30 30 30 30 30 29 29 27 27 27 29 30 30 29 29 30 30 30 29 29 31 32 31 29 29 29 28 27 27 27 26 25 24 23 23 23 23 23 23 23 23 23 24 26 27 27 27 28 28 28 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 29 28 29 30 30 29 29 27 26 27 27 27 28 29 29 30 29 27 27 26 25 25 26 27 27 27 27 27 27 26 26 26 26 24 24 23 22 22 23 23 23 23 22 22 22 23 24 23 23 25 26 25 27 27 26 26 25 25 27 27 27 28 27 26 26 24 24 24 24 62 62 62 62 62 61 61 61 60 61 62 62 61 60 59 59 58 57 57 56 56 57 58 57 57 58 57 59 59 59 59 58 56 56 57 57 57 56 56 56 54 52 53 54 56 56 57 57 56 55 56 56 56 55 54 53 52 52 51 50 50 50 51 51 52 52 52 51 50 49 49 50 50 50 50 49 49 49 49 48 48 48 47 46 46 45 45 45 45 44 43 43 43 43 44 45 44 43 43 43 42 41 41 41 41 41 41 41 41 41 43 43 42 43 45 46 46 45 44 45 46 46 46 46 46 46 45 45 45 46 47 47 47 47 48 47 46 45 45 44 42 41 40 40 39 38 38 38 39 39 39 40 40 41 41 41 41 42 42 42 41 41 41 41 41 42 43 42 42 41 41 41 41 42 43 43 43 43 44 44 44 44 43 42 42 42 42 43 43 43 43 43 43 42 42 41 40 40 39 39 40 40 41 41 41 40 40 42 43 42 41 40 40 41 41 41 40 40 40 39 39 39 39 40 40 41 41 40 40 39 39 38 37 37 37 37 37 36 35 35 35 36 37 37 36 37 38 38 37 37 37 38 37 37 38 39 39 40 40 40 39 39 38 38 38 38 37 37 38 38 38 38 39 40 39 38 39 40 40 40 40 40 39 38 37 36 35 33 32 32 32 32 32 35 38 38 39 38 37 38 38 36 37 38 38 36 35 34 34 34 34 33 33 32 32 32 31 31 31 31 31 30 30 30 31 31 31 30 30 29 29 30 30 31 32 33 33 32 30 30 32 33 33 34 34 34 34 35 35 36 36 36 35 35 35 34 32 31 30 30 30 29 29 29 30 30 30 31 31 32 30 30 30 29 29 30 30 30 30 32 33 33 33 33 34 33 32 30 30 30 30 31 32 32 33 34 33 32 31 31 32 33 33 33 32 30 30 32 33 31 30 31 33 33 33 32 31 30 29 29 29 29 29 29 29 29 29 29 30 31 32 31 31 32 32 32 33 34 34 35 34 33 32 32 31 32 33 34 34 34 34 33 33 32 30 29 30 31 31 30 30 30 30 30 30 30 30 29 29 27 26 28 29 28 29 30 30 30 30 29 29 30 31 31 30 29 29 29 27 27 27 26 24 24 24 23 23 23 23 23 23 23 23 25 27 28 28 27 27 27 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 29 27 27 29 29 29 29 27 26 26 26 27 27 27 28 28 28 27 27 26 24 24 25 26 27 27 27 27 27 26 25 25 24 24 23 22 22 22 22 22 22 23 22 22 22 22 22 21 22 24 24 24 26 26 24 25 25 24 26 26 27 28 28 26 25 24 24 24 23 61 61 61 61 62 62 61 61 60 61 62 62 61 60 59 58 57 57 57 57 57 57 58 58 57 58 58 59 60 59 58 58 57 57 58 58 58 57 57 56 54 53 53 55 57 58 59 58 57 57 57 58 56 55 54 53 52 52 51 50 50 50 51 51 51 51 51 50 50 50 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 45 45 45 45 44 44 44 44 44 45 45 44 43 44 44 43 43 42 42 42 41 42 42 41 41 41 41 42 43 45 46 45 44 45 45 46 46 46 46 46 46 45 44 44 46 47 46 46 47 47 48 47 45 44 43 42 41 40 40 39 39 38 38 38 38 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 42 42 43 43 43 44 44 44 44 44 43 43 42 42 42 42 42 43 43 43 43 43 43 42 40 40 39 39 39 40 40 40 40 40 40 41 41 41 40 40 39 39 40 40 40 40 40 39 39 39 39 40 41 40 40 40 39 39 38 37 37 38 38 38 37 36 35 35 36 37 37 36 36 37 38 38 37 37 37 37 37 37 38 39 39 40 40 40 40 40 39 39 38 38 37 37 38 38 38 37 38 39 38 38 39 39 40 40 40 40 39 37 36 35 34 33 32 31 31 30 31 35 38 38 37 37 37 38 37 35 36 37 36 35 34 34 35 35 35 34 34 33 32 32 32 32 32 32 31 31 30 30 30 30 30 30 30 29 29 29 29 29 30 30 31 31 30 30 31 32 32 33 33 33 33 34 34 34 35 36 35 34 33 33 34 32 30 30 30 29 29 29 30 30 30 30 30 31 31 30 30 29 29 30 30 30 32 33 33 33 32 33 34 33 31 30 30 30 30 30 31 32 33 34 33 33 31 30 31 31 31 32 31 30 30 32 32 30 30 31 33 33 33 32 31 30 29 29 29 29 29 29 29 29 29 29 30 31 31 30 31 32 31 32 33 34 34 33 32 31 31 30 31 33 33 33 34 34 34 34 34 33 31 30 31 31 30 30 30 29 29 30 29 29 29 28 28 27 26 27 27 27 29 30 30 30 30 30 30 30 31 31 30 30 30 30 29 27 27 25 24 24 25 25 24 23 23 23 23 23 23 24 26 28 28 27 26 26 26 27 29 29 30 29 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 26 27 28 28 27 27 26 26 26 26 26 26 26 26 27 27 27 26 26 24 24 25 26 26 26 25 25 25 25 24 24 23 22 22 22 22 22 22 22 22 22 22 22 22 22 21 21 22 22 24 26 25 24 24 24 24 24 26 28 29 27 27 26 25 24 24 23 60 61 60 61 61 61 61 60 60 61 61 61 61 61 60 58 58 58 59 58 57 57 58 58 58 58 58 58 59 59 58 57 58 58 58 59 58 58 58 56 54 53 54 56 58 58 58 58 56 57 58 58 57 55 55 54 53 52 51 51 50 50 50 50 50 50 50 50 50 50 49 48 48 48 49 48 48 48 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 45 44 44 45 44 44 45 45 45 44 44 44 42 40 40 41 42 43 44 45 44 44 45 45 45 46 46 45 45 46 46 44 43 45 46 45 46 46 46 46 47 46 45 44 42 41 41 40 39 39 39 38 38 38 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 40 41 41 42 42 42 43 43 43 43 43 43 43 44 45 43 43 43 42 41 41 41 43 43 42 42 42 43 42 41 40 40 39 38 39 39 39 40 39 39 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 41 40 40 39 38 38 38 38 38 39 40 39 36 35 35 35 35 35 35 35 36 37 38 38 37 37 36 37 37 37 38 38 39 39 40 40 40 40 39 39 38 38 37 36 36 37 38 37 37 37 37 37 38 38 39 38 39 40 39 38 37 36 35 35 34 32 30 30 30 33 35 36 36 36 37 36 35 35 36 37 35 35 35 35 35 35 35 35 34 33 33 33 33 32 32 32 32 32 31 31 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 33 32 31 33 34 34 34 34 35 35 34 33 33 34 33 32 31 30 29 29 29 29 29 30 30 30 30 30 30 29 29 29 30 30 31 32 33 33 32 33 34 34 33 31 30 30 30 30 30 31 32 33 33 33 33 31 30 30 30 30 30 30 30 30 31 31 30 29 31 32 32 32 32 32 30 30 30 30 29 29 29 29 29 29 29 30 30 30 29 30 30 31 33 34 34 33 31 30 30 30 30 31 32 32 33 33 34 34 34 34 34 33 32 32 30 30 30 30 29 29 29 28 27 27 27 27 26 26 27 27 28 29 30 30 30 29 29 29 30 31 31 30 30 30 30 29 28 27 26 24 24 26 27 26 24 23 23 23 23 23 23 24 27 29 27 26 26 26 28 30 29 28 28 28 29 30 30 30 30 29 29 30 30 30 30 29 29 29 29 29 28 27 26 27 26 26 25 26 26 25 24 25 25 26 26 26 26 26 26 26 24 24 25 25 25 24 24 24 24 23 22 22 21 21 21 21 21 21 21 22 22 22 22 22 22 22 21 21 21 22 24 25 24 24 24 24 25 26 27 27 27 26 25 25 25 24 25 60 60 60 60 60 60 60 59 60 61 61 60 60 61 60 59 59 59 59 58 58 58 58 59 59 58 57 57 58 59 58 58 58 58 57 58 58 58 58 56 56 55 55 56 58 57 57 57 55 55 56 57 58 58 57 56 53 53 53 52 51 50 49 49 50 50 50 49 49 50 49 49 48 48 48 48 48 48 48 48 47 47 47 47 46 46 47 47 46 46 46 46 46 45 45 45 44 44 44 45 44 45 45 45 45 46 44 43 43 41 41 41 41 42 43 44 43 44 44 44 45 46 46 45 45 46 46 45 44 43 44 44 45 45 45 46 46 45 45 44 42 41 41 40 40 39 39 38 38 38 39 40 40 40 40 40 40 41 42 41 41 40 40 40 40 40 40 41 42 42 43 43 43 43 43 42 42 42 43 44 45 44 43 43 43 42 41 41 41 41 42 41 41 42 42 41 41 41 40 39 38 38 38 39 39 39 39 39 40 40 40 39 38 38 39 39 39 39 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 39 37 35 35 35 35 35 35 36 36 37 37 37 37 36 36 36 37 38 38 39 39 39 40 40 40 40 39 38 38 38 37 37 36 36 36 36 36 36 36 36 37 37 37 37 38 39 39 38 38 38 36 35 35 33 30 30 30 30 32 34 35 35 36 35 34 34 35 35 35 35 35 35 35 35 35 35 33 33 34 34 34 33 33 33 33 32 32 32 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 32 31 30 32 34 33 32 32 33 34 34 33 32 33 34 33 32 31 30 30 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 32 33 32 31 32 33 33 33 31 30 30 30 30 30 31 33 33 33 33 33 31 30 30 30 30 30 30 30 30 30 32 31 29 30 32 31 30 32 32 31 30 30 30 30 30 29 29 29 29 29 29 29 29 30 31 31 32 33 33 33 31 30 30 31 31 30 30 31 31 32 33 34 34 34 34 34 34 34 33 31 30 30 30 29 29 29 28 28 28 28 27 26 26 26 27 28 29 29 29 29 28 28 29 30 30 31 30 30 30 29 28 27 27 26 25 26 26 26 25 25 24 23 23 23 23 23 23 26 29 28 25 25 27 29 29 28 27 27 28 30 30 30 30 30 29 29 29 29 29 29 28 28 29 30 30 30 28 27 26 25 24 25 25 25 24 24 24 24 24 24 24 24 24 24 25 24 24 24 25 26 25 24 23 22 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 21 21 21 21 22 22 23 24 24 24 24 25 27 27 27 27 26 25 25 24 24 25 60 59 59 59 59 60 60 59 59 60 60 60 60 60 60 60 60 60 60 59 58 58 58 58 59 58 56 57 58 59 58 57 57 56 56 56 56 56 57 57 57 57 56 57 58 56 56 56 55 54 54 55 56 57 57 57 54 53 53 53 51 50 49 49 49 50 49 48 48 49 49 48 48 47 48 48 47 47 47 47 48 48 48 48 47 47 47 46 46 46 45 45 46 45 44 44 43 42 43 43 43 44 44 44 44 44 43 43 43 43 43 41 40 41 42 43 43 43 43 44 46 46 45 44 44 44 45 45 43 42 43 43 44 44 45 46 45 44 43 42 41 41 41 40 40 39 39 38 38 38 38 39 39 39 40 40 41 41 41 41 40 40 40 40 40 41 41 42 43 43 43 43 43 43 42 42 42 43 43 44 45 44 44 43 43 43 42 42 41 41 41 41 40 41 41 40 40 41 41 40 39 38 38 38 38 38 38 38 39 39 39 38 38 38 39 39 39 39 40 41 41 41 41 40 40 40 39 39 40 40 40 40 40 40 40 39 37 36 35 35 35 35 35 36 36 36 36 37 37 36 36 36 37 37 38 38 39 39 40 40 40 40 39 39 39 39 39 38 38 37 36 36 35 35 34 35 35 36 36 36 37 38 38 37 38 38 36 34 33 32 31 30 30 30 31 33 33 34 34 33 33 33 34 34 34 34 34 35 35 34 35 35 34 35 35 34 34 34 34 34 33 32 32 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 29 30 32 32 31 31 33 34 34 33 32 33 34 34 33 32 31 30 30 29 29 29 29 30 30 30 30 29 29 29 30 30 30 32 32 30 31 31 32 33 33 31 30 29 29 30 30 32 32 32 32 33 33 31 30 30 30 30 30 30 29 29 30 32 31 29 30 30 30 30 31 32 31 31 30 30 30 29 29 29 29 29 29 29 29 29 31 33 34 33 32 31 31 30 30 30 32 33 32 32 32 31 32 33 33 34 34 34 34 34 34 34 33 31 30 30 29 29 29 29 29 30 29 28 26 26 26 26 26 27 28 28 27 27 27 29 30 30 30 30 30 30 29 28 27 27 27 27 27 26 26 25 25 24 23 23 23 23 23 23 25 28 28 25 25 28 29 28 27 27 27 28 29 30 30 30 30 30 29 28 27 27 27 27 29 30 30 30 30 29 28 27 25 24 25 25 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 25 23 22 21 21 21 21 21 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 23 22 23 25 25 26 27 26 25 26 26 24 23 24 60 59 58 58 57 58 59 58 58 60 60 59 59 60 61 61 61 61 61 60 59 58 57 57 58 56 56 56 58 58 57 55 55 54 54 54 54 55 57 57 57 57 55 56 56 55 54 54 53 53 52 53 53 54 55 56 54 52 52 52 51 50 49 49 49 49 49 48 48 48 49 48 48 47 47 47 47 47 47 47 47 48 49 48 48 48 47 46 46 46 45 45 44 44 44 43 42 42 41 41 42 42 42 42 42 41 41 42 42 43 43 42 41 40 41 43 43 43 43 43 44 44 44 44 43 43 44 44 43 42 42 43 43 44 45 45 45 44 43 41 41 40 40 40 40 39 39 38 38 38 38 38 39 39 40 40 41 41 40 40 40 39 40 40 41 41 42 42 43 43 43 42 42 42 42 42 42 43 43 44 44 44 44 43 43 43 43 42 42 42 41 41 40 40 40 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 41 40 40 40 40 40 40 40 40 39 39 40 40 39 38 37 35 35 35 35 35 35 35 36 36 37 37 35 35 36 36 37 38 38 38 38 40 40 40 40 40 40 40 40 40 39 39 39 38 37 37 36 36 35 34 35 35 35 36 38 38 36 36 36 35 33 33 32 32 31 30 30 30 31 31 32 32 32 32 32 33 33 33 33 34 34 34 33 34 35 35 36 36 34 34 35 35 34 32 32 31 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 32 33 33 33 32 32 33 34 34 33 33 31 30 29 29 29 29 30 30 30 30 30 29 29 29 30 30 31 31 30 31 31 30 31 31 30 30 29 29 30 31 32 31 31 31 33 33 32 32 32 32 32 31 30 29 29 30 31 31 30 29 29 30 30 30 31 31 31 30 29 29 29 29 29 29 29 29 29 29 30 31 32 33 31 29 29 29 29 30 30 32 34 33 33 33 32 32 33 33 33 34 34 34 35 34 34 34 33 31 30 30 30 30 31 30 30 30 28 27 27 26 26 26 26 27 27 27 27 27 28 29 30 30 30 30 30 29 28 27 27 27 27 27 27 27 26 25 25 25 24 23 23 23 23 23 26 27 25 25 28 29 28 26 26 27 28 29 29 29 30 29 29 29 29 27 27 27 27 29 30 30 30 30 29 28 28 26 24 24 24 24 24 24 24 24 23 23 24 24 24 24 24 23 23 23 24 25 23 22 21 21 21 21 21 22 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 21 21 21 23 24 24 25 24 24 24 25 24 23 22 59 59 59 58 58 57 57 58 58 60 59 58 58 60 61 61 61 60 60 60 60 58 57 56 57 56 54 55 56 57 57 54 53 53 53 53 53 54 56 56 56 56 54 53 53 53 53 52 52 52 51 52 52 52 52 53 53 52 52 51 51 50 49 49 49 49 48 48 47 48 48 48 47 47 47 47 47 47 47 47 47 48 48 49 49 48 47 46 46 46 45 45 44 44 44 43 44 43 43 42 41 41 41 41 41 42 42 41 41 41 41 41 41 40 40 42 42 42 43 43 43 43 43 44 43 42 42 43 44 42 41 41 42 43 44 44 43 43 43 42 41 41 41 40 39 39 38 38 38 38 38 38 39 40 40 40 40 40 39 39 39 40 40 41 41 42 42 43 43 42 42 42 42 42 42 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 42 41 40 40 40 40 39 39 39 39 39 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 41 41 40 41 41 41 40 40 39 39 39 39 38 38 37 35 35 35 35 35 35 35 35 35 36 36 35 35 36 37 37 37 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 37 37 35 34 34 35 36 37 36 35 35 34 34 33 33 33 32 30 30 30 30 30 30 31 31 31 31 32 32 32 32 33 34 33 33 34 34 35 36 35 34 33 35 35 34 32 32 31 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 32 33 31 30 32 33 33 33 33 32 30 30 29 29 29 29 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 29 30 32 32 30 30 30 31 33 33 33 33 33 32 31 30 29 29 30 31 31 31 30 29 29 30 30 30 31 31 30 29 29 29 29 29 29 30 30 30 30 31 31 31 31 30 30 30 29 29 30 31 32 33 33 34 34 34 33 33 33 33 33 34 35 36 35 34 34 34 33 31 31 31 31 31 30 30 30 28 27 27 27 26 26 26 26 27 27 28 27 28 29 29 28 29 30 30 29 29 28 28 29 28 28 27 27 26 26 27 26 25 23 23 23 23 23 23 24 24 25 26 27 27 24 24 27 29 29 27 28 29 27 28 29 29 28 26 26 27 28 29 30 29 28 27 27 27 27 25 24 24 24 24 24 24 24 23 23 24 24 25 24 23 22 22 22 23 23 22 22 21 21 21 21 21 22 23 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21 21 21 22 21 21 21 21 22 23 24 24 24 24 24 23 22 21 57 58 59 59 59 58 56 56 58 59 58 58 59 60 60 61 61 60 59 60 59 58 56 55 56 55 54 53 54 55 55 53 52 52 52 52 52 53 54 55 54 53 53 53 52 52 53 53 52 51 51 51 51 51 51 52 52 52 52 52 51 50 50 50 49 49 48 47 47 47 48 48 47 47 46 47 47 47 47 47 47 48 48 48 48 48 47 46 46 45 45 45 46 45 45 45 45 45 45 44 43 42 42 43 44 44 43 42 42 41 40 40 40 40 40 41 41 41 42 42 42 42 42 43 43 42 41 42 43 42 41 41 41 42 43 42 42 42 42 42 42 41 41 40 39 39 38 38 38 38 38 38 39 40 40 40 40 40 39 39 40 41 41 41 41 42 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 43 43 43 42 42 42 43 44 43 43 42 41 42 41 41 41 40 40 39 39 39 39 39 39 38 37 37 37 37 37 37 38 38 38 38 38 38 39 39 39 39 40 40 40 41 41 41 41 41 40 40 40 40 39 38 38 37 36 35 35 35 35 35 35 35 35 35 36 35 36 37 37 38 37 37 38 38 39 40 40 40 40 40 40 40 39 39 39 39 39 38 39 39 38 38 38 37 34 34 34 34 35 35 35 35 34 34 34 33 33 33 31 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 32 33 34 34 35 35 33 33 33 34 33 31 30 30 29 29 29 29 29 29 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 31 30 31 32 32 32 32 32 31 30 29 29 29 29 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 30 31 32 31 30 30 30 31 33 33 33 33 32 31 30 30 29 29 29 30 30 30 30 29 29 29 30 30 30 30 30 29 29 29 29 29 29 30 30 30 31 31 30 29 29 30 32 32 32 32 32 32 32 33 33 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 33 33 33 32 31 30 30 30 30 28 27 27 27 26 26 26 26 27 27 28 27 27 28 28 27 29 30 30 30 30 29 29 30 29 28 27 27 27 26 26 25 25 25 24 23 23 23 23 23 23 24 24 24 24 23 24 25 27 27 26 28 29 27 27 28 28 27 25 25 26 27 28 29 28 27 27 27 26 26 26 25 25 24 24 23 23 23 23 23 23 24 24 23 22 22 22 22 22 22 22 21 21 22 22 22 22 23 23 23 23 23 23 23 24 24 23 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 23 23 23 23 22 21 21 56 56 57 58 59 58 57 56 56 57 57 59 60 59 59 60 60 59 59 59 59 58 56 54 54 53 53 53 53 54 54 53 52 52 52 51 51 52 53 53 53 52 52 52 52 51 52 53 52 51 51 50 50 51 51 52 52 52 53 52 51 51 51 50 50 49 48 48 47 46 47 48 48 47 46 46 47 46 47 47 47 48 47 47 48 48 47 46 45 45 45 46 46 46 46 46 46 45 45 44 43 44 44 45 46 45 44 43 42 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 42 41 41 41 42 42 41 40 41 41 41 41 41 41 41 41 41 41 40 40 39 39 38 38 38 38 38 38 39 40 40 40 39 39 39 39 40 41 41 42 42 41 41 41 41 41 42 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 42 42 43 42 42 43 42 42 41 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 38 38 38 39 38 38 39 40 40 40 41 41 41 41 40 40 40 40 39 39 38 38 37 37 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 38 38 39 40 40 40 39 39 39 40 39 39 39 38 38 38 39 39 39 39 38 37 36 35 35 35 34 34 34 34 33 33 34 33 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 32 32 32 31 31 31 31 31 29 29 29 29 29 29 29 29 30 31 32 32 32 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 31 32 31 30 31 30 29 29 29 29 30 30 30 30 30 29 29 29 30 29 29 29 30 30 30 29 29 29 29 29 30 30 32 32 30 30 29 29 31 33 33 32 32 31 30 30 30 29 29 28 29 29 29 30 30 29 29 29 29 30 30 30 30 30 29 29 29 29 29 29 29 31 31 29 29 29 31 31 32 33 33 33 33 33 34 34 34 34 34 33 33 34 34 35 35 34 34 34 33 33 34 33 32 32 32 31 30 30 30 29 28 27 27 27 27 26 26 26 27 27 27 27 27 27 27 28 29 29 30 30 30 30 30 29 28 27 27 27 26 26 26 25 26 26 25 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 25 27 27 27 27 27 26 24 24 25 26 28 28 28 27 27 27 26 26 27 27 26 24 24 23 23 23 22 22 22 22 22 22 22 22 22 22 22 22 21 21 21 22 23 23 23 24 25 25 24 24 24 24 24 24 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 21 21 21 21 55 55 55 56 58 58 58 56 55 55 57 59 60 59 59 59 58 58 58 60 60 59 58 56 54 53 52 52 52 53 53 53 52 51 51 51 51 51 52 52 52 52 52 52 51 51 52 52 52 50 49 49 50 51 51 52 52 51 52 52 52 51 50 50 50 49 49 49 48 47 46 48 48 47 46 46 46 46 46 47 47 48 47 47 47 48 48 47 46 46 46 46 47 47 47 46 46 45 44 44 44 45 45 44 44 44 44 43 42 41 41 42 42 41 42 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 41 41 41 41 40 40 41 41 41 40 39 38 38 38 38 38 38 38 38 39 40 40 40 39 39 39 40 41 41 41 42 41 41 41 40 41 42 42 43 43 43 44 44 44 44 43 43 43 43 43 43 42 41 42 42 42 43 43 43 43 43 43 43 44 44 42 41 41 41 41 40 40 39 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 39 39 39 40 40 40 40 41 40 40 40 39 38 38 38 37 36 36 35 35 35 35 35 36 35 35 35 35 35 36 36 36 35 36 37 38 39 40 40 40 40 39 38 38 38 38 38 38 37 37 37 38 38 39 39 39 38 37 38 38 37 36 36 35 34 33 32 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 31 33 33 33 33 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 31 30 30 29 29 29 29 29 30 30 30 30 30 29 29 29 29 29 29 29 30 30 30 29 29 29 29 29 30 30 31 31 30 29 29 29 30 31 32 30 30 32 31 30 30 30 29 28 28 29 29 30 30 30 29 29 29 29 29 30 30 30 29 29 29 29 29 29 30 30 30 29 29 30 31 31 31 33 33 33 34 33 32 33 33 33 33 33 33 33 33 34 34 33 33 33 33 33 33 32 30 30 30 31 30 30 29 29 28 27 28 28 27 26 26 26 26 27 27 27 27 27 27 27 28 29 29 30 30 30 30 29 29 27 27 27 26 26 26 26 26 26 25 24 25 24 23 23 23 23 23 23 23 23 23 22 22 22 22 22 23 24 25 25 25 24 24 25 26 26 27 27 27 27 27 26 26 26 26 26 27 26 24 24 23 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21 22 23 23 22 23 25 27 25 24 24 24 24 24 24 24 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 55 54 55 56 56 57 57 55 54 55 56 58 58 58 57 57 57 58 59 60 60 59 58 57 55 53 52 52 51 52 53 52 52 51 50 50 50 51 52 52 52 52 51 51 51 51 52 51 51 51 49 49 50 50 50 51 51 51 51 51 51 51 50 50 49 49 48 48 48 48 46 47 48 48 47 46 46 46 46 47 48 48 47 47 47 48 48 47 47 46 46 47 47 47 47 47 47 46 46 45 46 45 44 43 42 43 43 42 42 42 43 44 43 42 43 43 43 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 40 41 40 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 40 40 40 39 38 39 40 40 41 41 41 41 41 40 40 41 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 42 42 43 44 44 43 42 42 42 42 41 41 40 40 39 38 38 38 38 37 37 38 38 37 36 36 37 37 38 38 38 38 39 39 39 39 39 39 40 41 40 40 40 39 39 38 37 37 36 36 36 36 36 36 36 37 36 36 35 35 35 35 35 35 35 36 37 39 39 40 40 40 40 39 39 38 38 38 37 37 37 36 36 36 37 38 38 38 37 36 36 38 37 36 36 36 35 34 33 32 31 30 30 30 31 32 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 30 31 33 34 34 33 32 31 29 30 30 30 30 29 29 29 29 29 29 29 29 29 28 28 28 29 29 29 29 29 29 29 29 30 30 29 29 29 29 29 29 30 30 30 30 30 30 29 29 29 29 29 29 30 30 30 29 29 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 30 31 31 30 30 29 29 28 28 29 29 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 29 29 29 29 29 30 31 33 34 34 34 33 31 31 32 31 32 33 34 34 34 34 33 33 32 32 32 32 33 32 30 30 30 30 30 30 30 30 29 29 29 28 27 26 25 25 26 27 27 27 27 27 27 27 27 28 29 30 30 29 29 29 29 28 27 27 27 27 27 27 27 26 26 26 26 25 24 24 23 23 23 23 23 23 23 22 22 23 23 22 22 22 23 23 23 23 23 25 26 27 27 27 27 26 26 26 25 24 25 25 26 27 25 24 23 22 22 22 22 22 21 21 21 21 21 21 21 21 22 23 23 23 22 22 23 25 27 26 25 25 24 24 24 24 24 24 24 23 23 22 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 57 55 54 55 56 56 56 55 54 55 56 57 57 57 56 56 57 58 59 59 59 58 57 58 56 53 52 52 51 52 52 52 52 51 50 50 50 51 51 51 51 51 51 50 50 50 51 51 51 50 50 49 50 50 50 51 50 50 50 51 51 50 50 50 49 49 48 47 47 47 46 46 47 47 47 46 45 45 46 47 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 44 43 43 43 43 42 42 42 43 44 44 43 43 43 45 44 42 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 39 40 39 38 38 39 40 40 40 40 40 40 40 40 41 41 42 43 42 41 42 43 43 43 43 43 43 43 42 41 41 42 41 40 40 41 41 42 43 44 44 43 42 42 42 41 41 40 40 40 39 39 39 38 38 38 38 38 38 37 37 36 36 37 37 37 37 37 39 39 38 38 38 38 40 41 41 40 40 40 39 39 38 38 38 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 37 37 38 39 39 40 40 39 39 39 39 39 38 38 39 38 37 36 35 36 37 36 36 35 33 33 33 34 33 33 34 35 35 33 31 31 31 30 30 33 35 35 37 36 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 30 32 33 34 34 33 32 32 31 31 31 31 30 30 30 30 30 30 30 29 29 29 29 28 28 28 28 28 28 28 29 28 28 29 28 28 28 28 28 28 29 30 30 30 30 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 31 30 29 29 29 29 30 30 30 29 29 30 31 30 30 29 29 28 28 29 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 29 29 29 29 29 30 32 33 34 34 34 34 32 30 30 31 32 34 34 34 33 32 32 33 32 31 31 32 33 32 31 30 30 29 29 29 29 30 30 30 29 28 27 26 25 25 26 26 26 26 27 27 29 29 28 29 29 30 30 29 27 28 29 27 27 28 28 28 27 27 27 26 26 27 26 26 26 26 25 26 26 25 26 25 25 24 23 23 23 23 22 22 22 22 22 22 22 22 24 25 26 27 27 26 25 25 24 24 24 24 25 25 24 23 22 22 22 22 22 21 21 21 22 22 21 21 22 23 24 23 23 23 23 23 24 26 27 26 25 25 25 24 24 24 24 24 24 24 24 24 23 23 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 58 56 54 54 55 55 56 56 54 54 56 56 55 56 55 55 57 58 57 57 58 57 55 57 56 53 52 52 51 51 51 51 51 51 50 49 50 51 51 51 51 51 51 49 49 50 51 51 50 50 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 48 47 46 46 46 46 45 46 47 47 45 45 46 47 47 48 48 47 46 46 47 47 46 46 47 48 47 47 47 46 46 47 46 46 45 44 44 44 45 44 43 42 43 45 45 44 43 43 45 46 44 43 42 41 41 42 41 41 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 39 39 38 38 38 38 38 38 38 38 38 38 39 39 38 38 38 39 40 40 39 39 40 40 40 41 41 41 42 43 42 41 42 43 42 42 42 43 44 43 43 42 41 41 41 40 40 41 41 42 43 43 44 44 43 42 41 40 41 40 40 40 40 41 40 39 39 39 39 38 38 37 37 37 37 36 36 36 37 37 38 38 37 38 38 39 40 41 41 40 40 40 39 39 40 39 38 37 37 37 37 37 37 36 36 37 36 35 35 35 35 36 37 37 37 38 38 39 40 39 39 38 38 38 38 38 38 38 38 38 37 35 34 35 35 34 33 32 32 31 31 31 31 31 32 34 33 31 31 31 30 30 34 36 36 38 39 36 34 32 31 31 31 31 30 31 31 30 30 31 32 32 31 30 30 30 30 30 29 29 29 29 30 30 32 33 34 35 34 33 32 33 33 32 33 32 31 30 31 31 31 31 30 30 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 29 28 29 30 30 30 29 29 30 30 30 30 30 29 28 28 29 30 30 30 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 29 29 29 29 30 31 32 32 33 33 34 34 32 30 30 31 33 33 33 34 32 31 31 32 31 30 30 31 31 31 31 31 30 30 29 28 28 28 29 30 30 29 27 27 26 26 25 26 26 26 27 28 29 30 30 30 30 30 30 28 27 27 27 27 28 29 29 29 28 27 28 27 27 28 26 26 27 28 28 29 29 29 29 28 28 27 26 25 24 25 24 23 22 22 22 22 22 22 22 23 24 25 25 24 24 24 23 22 22 22 22 22 22 22 22 22 22 22 21 21 22 24 24 23 23 23 24 24 24 24 23 23 23 24 26 27 27 25 24 24 24 24 24 24 23 23 23 23 23 23 23 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 59 56 54 54 54 54 55 55 54 54 55 55 55 54 54 55 56 57 56 55 56 55 54 55 54 53 52 51 51 50 51 51 51 51 51 49 50 51 51 51 50 51 50 49 50 51 51 51 50 49 49 48 49 50 50 49 49 50 50 50 50 49 49 49 49 49 48 48 47 46 45 45 45 46 47 47 46 45 46 46 47 47 47 46 46 46 47 47 46 47 47 48 48 48 47 47 47 49 48 47 46 45 45 46 45 44 43 43 45 46 45 44 45 45 45 45 44 43 43 42 42 44 44 43 41 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 41 41 41 41 41 42 43 42 41 42 42 42 41 42 43 43 43 43 42 41 40 40 40 41 42 42 42 43 43 44 44 43 42 41 41 41 41 40 41 41 41 41 39 39 40 39 38 38 38 38 38 37 36 35 35 36 37 37 37 37 38 38 39 40 40 40 41 40 40 39 39 40 39 38 38 38 38 38 37 37 36 35 36 36 35 35 35 35 36 38 37 37 38 39 40 40 39 38 38 37 37 37 37 37 36 36 36 36 35 34 34 35 35 34 32 31 31 31 31 31 31 31 31 31 31 31 30 30 31 35 39 38 40 41 39 38 36 34 34 35 33 32 33 32 30 31 33 34 33 32 31 31 31 31 30 30 30 30 30 32 33 33 33 35 35 34 33 33 34 34 34 34 33 31 32 33 33 33 32 31 31 31 30 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 30 30 30 30 30 30 30 30 29 29 29 29 29 28 28 29 29 29 30 30 30 30 29 28 27 28 30 30 29 29 29 29 30 30 30 30 29 28 27 28 29 30 31 31 31 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 31 31 31 31 32 33 33 33 31 30 29 31 32 33 32 32 31 30 30 31 30 30 30 30 30 30 30 31 30 30 30 29 29 28 28 29 30 29 28 27 27 26 26 25 26 27 27 27 28 29 29 29 30 30 29 28 27 27 27 27 27 29 30 29 28 29 29 29 29 28 27 27 28 29 30 30 30 30 30 29 29 29 29 26 26 27 28 27 24 24 23 23 23 22 22 22 23 23 23 23 23 22 21 21 21 21 21 21 21 22 22 22 22 21 21 23 26 26 25 24 24 25 26 26 26 25 24 23 23 25 26 26 26 25 24 24 24 24 24 23 23 23 23 23 23 23 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 59 56 55 54 54 53 53 54 54 53 53 54 54 54 54 54 56 56 55 54 54 54 54 54 53 53 52 51 50 50 50 50 50 51 51 49 49 50 50 51 50 50 50 49 49 50 51 51 50 49 49 48 48 49 49 48 49 50 50 50 50 49 49 48 48 48 47 47 47 46 46 45 45 45 46 47 47 46 45 46 47 47 46 46 46 47 47 46 46 47 48 48 49 48 47 47 48 49 49 48 47 47 47 47 46 45 43 43 46 47 45 46 47 46 45 44 44 45 45 43 43 45 45 44 42 40 40 40 39 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 39 40 41 41 41 41 41 41 42 42 41 41 42 42 41 41 42 42 43 43 43 42 41 40 39 39 41 43 43 42 43 43 43 43 43 42 42 42 43 42 41 41 41 41 40 40 40 40 39 38 39 39 39 38 37 37 36 35 36 37 37 36 37 37 38 39 39 39 40 40 40 40 40 40 40 39 39 38 38 38 37 37 36 36 35 35 35 35 35 35 35 36 37 37 38 38 39 39 40 39 38 38 37 37 37 36 35 35 35 36 35 34 34 33 34 35 34 32 31 31 31 31 31 31 31 31 31 31 31 30 30 32 35 39 40 41 41 39 38 37 37 36 35 33 33 33 31 30 31 33 34 34 33 32 33 33 32 31 31 31 31 31 33 35 35 36 36 36 34 34 35 36 35 35 35 34 33 33 33 34 34 33 32 32 31 30 29 29 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 30 30 30 30 30 30 30 29 29 28 28 28 28 29 29 29 29 30 29 29 29 28 27 28 29 30 29 28 28 29 30 30 29 29 29 28 27 27 29 29 30 31 30 30 31 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 32 32 31 31 31 30 29 30 31 31 30 30 30 30 30 31 30 30 29 29 30 30 30 30 29 29 30 30 30 28 27 28 28 28 28 27 27 27 27 26 25 26 26 26 27 27 28 29 29 30 29 28 27 27 27 27 28 29 30 29 29 30 30 30 29 28 28 28 30 30 30 30 29 29 29 28 29 29 28 27 28 28 28 27 26 26 25 23 23 22 22 22 22 23 23 22 21 21 21 21 21 21 21 21 21 21 21 22 21 21 23 27 27 26 25 25 25 26 27 27 27 26 24 23 23 24 25 26 25 24 24 24 24 24 23 23 23 23 23 23 23 23 23 23 22 22 22 21 21 21 21 21 21 21 21 21 21 22 22 23 24 23 58 56 55 55 54 54 53 53 53 53 52 53 53 53 54 53 54 55 55 54 53 53 53 53 53 52 52 51 51 51 50 49 49 51 50 49 49 49 50 50 50 50 50 49 48 50 51 51 50 50 50 49 48 48 47 48 49 49 50 50 50 49 49 48 48 47 47 47 46 46 47 46 46 45 45 46 47 46 45 45 46 47 47 46 46 47 46 45 46 47 48 48 48 48 48 48 48 49 49 49 48 48 48 47 46 45 44 44 46 47 46 47 47 47 45 44 46 47 45 44 44 44 44 43 42 41 41 40 40 41 42 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 39 39 39 39 40 40 40 41 41 41 41 41 41 40 40 41 41 40 41 42 42 43 43 43 42 41 40 39 39 41 41 42 42 41 41 42 43 44 44 43 43 42 42 42 42 42 41 41 40 40 40 39 39 39 40 39 38 37 37 37 36 35 35 36 36 37 37 38 38 38 38 39 39 40 40 40 40 40 39 39 38 38 38 37 37 37 37 36 36 36 35 35 35 35 35 36 36 38 39 39 39 39 39 39 38 38 38 38 37 35 34 35 36 36 35 34 33 33 34 33 32 31 31 33 33 32 31 31 31 31 31 31 30 31 32 34 38 40 40 39 38 37 36 35 34 33 32 32 32 31 32 33 33 34 34 33 34 34 33 32 32 32 32 31 32 34 34 35 37 37 36 36 36 36 36 36 36 35 35 34 34 33 34 34 33 32 31 30 29 30 30 30 30 30 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 30 30 30 30 30 29 29 28 27 28 28 28 28 29 29 29 30 30 28 27 27 28 29 29 28 28 29 29 30 29 29 29 28 27 27 28 29 30 30 30 29 30 31 30 30 30 30 29 29 29 29 29 29 29 29 29 30 30 29 29 30 31 32 30 30 30 30 31 29 29 30 30 30 30 30 30 30 31 30 30 29 29 30 30 30 29 29 29 30 30 30 28 27 27 27 27 27 27 27 27 26 25 25 26 26 26 26 27 27 28 29 29 29 27 27 27 28 29 29 29 30 30 30 30 30 30 30 29 29 29 30 30 29 29 29 28 27 27 27 28 27 28 29 28 27 26 26 25 24 23 23 22 22 22 22 22 22 21 21 21 22 22 22 22 22 22 21 21 21 21 22 24 27 29 27 27 27 27 26 27 27 27 27 27 26 24 23 23 24 25 25 24 24 24 24 23 23 23 23 24 24 23 23 23 23 23 23 23 23 23 22 22 22 22 22 21 21 22 23 23 23 25 26 24 58 57 56 56 55 54 53 53 53 53 52 53 53 53 53 53 53 54 55 55 55 54 53 52 52 51 51 51 51 52 51 49 49 49 49 49 48 48 49 49 49 50 50 48 48 50 51 51 51 51 50 50 49 47 47 47 49 49 49 49 49 49 49 49 48 48 47 47 47 48 48 47 47 46 45 45 46 46 44 44 45 46 46 45 45 46 46 45 47 48 48 47 48 48 49 48 48 48 48 48 49 49 48 47 46 46 45 45 46 47 47 47 46 46 44 45 47 47 45 45 46 45 44 43 42 42 41 40 40 41 42 42 41 40 40 39 39 40 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 37 38 39 40 40 39 38 39 39 39 39 40 40 41 41 41 41 41 40 39 40 40 41 42 43 43 42 42 43 42 40 40 39 39 40 40 40 41 41 41 42 43 44 44 43 42 41 41 41 41 42 42 41 40 40 40 40 40 40 40 39 39 38 38 37 37 36 35 35 36 37 38 38 38 37 38 38 38 38 38 39 39 40 39 38 38 38 38 38 38 37 36 36 35 35 35 35 35 35 35 35 36 37 38 38 38 39 39 40 39 39 38 39 38 36 34 34 36 37 36 34 33 32 33 32 32 31 32 34 34 32 31 31 31 31 31 32 32 33 33 35 39 41 40 39 37 37 36 34 33 33 32 32 32 32 33 34 34 35 34 34 34 34 34 33 33 33 33 32 34 35 35 35 37 37 37 37 37 37 36 35 35 34 34 34 34 34 34 34 32 31 31 30 29 30 31 32 32 31 31 30 29 29 28 28 28 28 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 29 29 30 30 30 30 30 29 28 27 27 27 28 29 29 29 29 29 27 27 27 27 28 28 28 27 28 29 30 30 29 29 28 28 28 27 28 29 30 30 29 29 29 29 30 30 30 30 29 29 29 29 29 29 28 29 29 30 29 29 30 31 32 31 30 30 30 30 28 28 30 30 29 29 30 30 30 30 30 30 29 29 29 30 29 29 29 30 30 30 29 28 27 26 26 27 27 27 27 27 26 25 25 26 27 27 27 27 27 27 28 28 27 26 26 27 29 30 30 30 30 31 31 30 30 30 30 29 29 30 30 30 29 28 28 28 27 26 26 26 27 28 29 28 27 26 26 25 25 24 23 22 22 22 22 21 21 22 23 24 24 24 23 22 22 22 22 22 22 23 25 28 30 29 28 28 29 29 28 27 27 27 26 26 26 26 25 24 23 24 24 24 24 24 24 23 23 23 24 25 25 24 24 24 24 24 24 24 24 24 23 23 24 24 23 23 23 24 25 24 24 25 26 24 58 58 58 57 56 55 54 53 52 52 52 52 53 52 52 52 53 54 54 54 55 54 53 52 51 51 51 51 51 51 51 50 48 48 48 48 48 47 47 47 47 49 49 48 48 49 50 50 51 51 50 50 49 48 47 47 48 48 48 48 49 49 49 49 49 48 48 47 48 49 49 48 47 47 46 45 45 45 44 44 44 45 45 45 44 45 45 45 46 47 48 46 47 48 48 48 48 48 47 47 48 49 48 47 48 47 46 45 47 47 48 47 46 45 45 46 47 46 45 46 46 45 43 42 42 41 41 41 41 42 42 41 42 41 40 40 41 40 40 40 41 41 40 40 40 40 39 38 38 38 38 38 38 37 37 37 38 39 38 38 39 39 39 39 40 40 40 40 40 41 40 39 39 40 40 41 42 43 42 41 41 42 41 40 39 38 39 39 39 40 41 41 42 43 43 42 42 42 41 40 40 41 41 42 42 41 41 41 41 41 40 40 40 40 39 39 38 38 37 37 36 35 35 36 37 37 37 37 37 38 38 38 38 38 39 39 39 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 36 37 37 38 37 37 37 38 39 39 40 39 39 38 37 36 34 34 35 35 34 33 32 32 32 32 32 32 34 35 34 32 31 32 32 33 35 35 37 37 36 36 39 41 40 39 38 37 35 34 35 35 34 33 33 33 34 35 36 36 36 35 35 34 35 35 35 34 33 34 36 38 37 37 37 36 36 37 37 37 36 35 34 34 33 33 33 33 33 34 33 32 32 31 31 32 32 33 33 32 31 31 31 30 29 28 28 28 27 27 27 27 27 27 27 27 28 28 28 28 28 28 27 27 27 28 28 29 29 29 29 29 28 28 27 27 27 28 27 27 28 27 27 27 27 27 27 27 27 27 28 29 29 30 30 29 28 29 29 27 27 29 29 29 29 28 27 28 29 30 30 30 30 29 29 28 27 27 27 28 29 29 29 29 30 31 32 30 29 30 30 30 29 28 29 30 29 29 30 30 30 31 31 31 30 29 29 29 29 29 30 30 30 30 30 28 27 26 26 26 26 26 27 26 26 25 25 26 27 27 27 27 27 28 28 27 27 26 26 27 29 30 30 30 32 31 31 30 30 30 29 29 30 30 29 29 28 27 27 27 26 25 25 25 26 26 27 27 27 27 27 27 26 24 22 22 22 23 24 24 25 26 26 27 27 26 24 23 22 22 23 23 24 27 29 30 30 29 29 29 29 29 29 27 27 27 26 25 25 25 25 24 23 23 23 24 24 24 24 24 25 24 24 25 26 26 25 24 24 24 24 25 25 24 24 24 24 24 24 24 24 24 25 24 24 24 25 24 58 58 58 58 57 56 55 54 53 52 52 51 52 52 52 52 52 53 53 53 54 54 53 52 52 51 51 51 51 51 50 50 49 49 49 48 48 49 48 47 47 47 48 48 47 49 49 49 50 51 50 50 50 49 47 47 47 47 48 48 49 50 49 49 49 49 48 48 48 48 49 49 48 47 47 46 46 45 44 44 44 44 44 44 44 44 44 45 46 47 47 45 46 48 48 47 47 47 47 47 48 49 48 48 48 47 47 46 47 48 48 48 46 45 46 47 46 46 46 46 46 45 43 43 43 42 42 43 43 43 43 43 42 41 41 41 42 41 40 41 42 42 40 40 41 40 39 39 39 39 38 38 38 37 37 37 37 37 38 38 39 40 39 39 39 40 40 40 40 40 39 39 40 41 41 41 42 43 42 41 41 41 41 39 38 38 39 39 40 41 41 41 42 43 43 42 41 41 40 40 40 40 41 42 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 37 37 36 35 35 36 36 37 37 37 37 37 37 37 38 38 39 39 38 38 37 37 36 36 37 37 35 35 35 35 35 35 36 37 37 38 38 36 36 37 38 39 39 40 39 39 38 38 36 34 34 33 33 33 32 32 32 32 33 34 35 35 35 33 34 34 34 34 35 36 37 38 38 39 39 40 40 39 38 38 36 35 35 37 38 37 37 36 35 35 36 37 38 38 38 37 37 37 36 35 35 34 35 37 39 38 38 37 36 35 36 36 36 36 35 35 34 33 32 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 31 29 28 28 28 27 27 28 27 27 27 27 27 27 27 27 28 28 28 27 27 27 27 27 27 28 28 28 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 29 29 28 27 28 28 27 27 27 27 27 28 27 27 28 29 29 29 29 29 29 28 27 26 26 26 27 28 28 28 29 30 30 31 30 29 29 30 30 29 28 28 30 29 28 29 30 30 31 32 32 32 31 30 29 28 29 30 30 30 30 31 29 27 26 26 26 26 26 26 26 25 24 26 27 27 27 28 29 28 28 28 27 27 26 26 27 28 30 30 30 31 30 30 30 30 30 29 28 28 28 27 27 27 26 26 26 25 24 24 23 23 23 24 25 26 27 27 27 25 23 22 22 23 25 26 26 28 29 28 27 26 24 24 23 22 23 25 24 25 28 30 30 30 30 30 30 29 28 27 27 27 26 26 26 25 24 23 23 23 23 23 23 23 24 24 26 26 26 25 25 25 26 26 25 24 24 25 26 25 24 24 24 24 24 24 24 24 24 24 23 23 24 23 23 58 57 57 56 57 57 56 55 54 53 53 52 51 51 51 51 52 52 52 52 53 54 54 53 52 52 52 51 51 51 50 50 51 51 51 49 50 50 50 49 48 46 46 46 46 47 48 48 48 50 50 49 49 49 48 46 46 47 49 49 50 50 50 49 50 50 49 49 49 49 49 49 49 48 47 47 47 46 46 46 44 43 43 43 43 43 43 44 45 46 45 45 47 48 47 47 46 46 46 46 47 48 48 49 48 48 48 48 49 49 49 48 47 47 47 47 46 46 46 46 45 45 44 45 45 43 43 43 43 44 45 44 42 42 42 42 42 41 41 42 42 42 41 41 41 40 40 40 40 39 39 39 38 37 37 37 37 37 38 38 39 39 39 39 39 39 39 40 41 40 39 39 40 40 42 42 42 42 42 42 40 40 40 40 38 38 39 40 40 41 41 42 43 43 43 43 42 40 40 40 39 39 40 40 41 40 40 40 40 40 40 41 40 40 40 40 39 39 39 38 37 36 36 35 35 35 36 37 36 36 36 36 37 38 39 39 39 39 38 38 37 36 36 36 36 35 35 35 35 35 35 36 36 36 36 36 36 36 37 38 39 39 39 39 38 39 38 36 35 33 32 32 32 32 32 32 33 35 36 37 35 34 34 36 38 37 36 36 36 36 38 39 40 41 41 40 38 39 38 36 35 36 37 39 40 40 39 38 38 39 40 41 41 40 39 39 38 37 36 35 35 36 36 37 37 37 37 37 35 35 36 36 35 35 34 34 34 33 32 31 32 32 32 32 32 32 32 32 31 31 31 31 31 32 32 30 29 28 28 28 28 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 27 27 27 27 27 27 27 27 26 26 26 27 27 27 27 27 28 28 28 28 27 27 26 26 26 26 26 26 27 27 28 29 30 30 30 30 28 28 30 30 30 28 28 30 28 27 28 30 30 32 33 32 32 32 30 29 28 28 29 29 29 30 30 29 27 27 26 26 26 26 26 26 24 24 25 26 27 27 28 29 29 29 29 28 27 26 26 27 28 30 30 30 30 29 29 30 29 29 29 28 27 27 26 26 27 26 25 24 23 23 23 22 22 22 22 23 24 25 25 25 24 23 22 22 25 26 26 26 26 27 27 26 25 25 25 24 23 24 25 25 26 28 30 30 30 30 30 29 28 27 26 26 25 25 25 25 25 24 23 23 24 24 24 24 23 24 25 27 27 27 26 26 26 26 27 26 26 25 26 26 25 24 24 25 24 24 24 24 23 23 22 22 22 22 22 21 57 57 56 55 57 57 57 57 55 54 53 52 51 51 50 50 50 51 52 52 52 54 54 54 53 52 52 52 52 51 51 51 52 52 51 50 51 51 51 51 49 48 47 47 46 46 46 46 47 49 49 48 48 49 49 46 45 47 49 49 50 50 50 49 49 50 50 49 49 50 50 49 49 48 48 48 48 47 48 48 47 45 44 43 43 43 43 43 44 44 44 45 47 48 48 46 46 45 44 45 46 47 47 48 48 48 49 49 48 48 49 48 48 48 48 47 47 47 46 46 46 45 45 46 46 44 44 44 44 44 44 44 43 43 43 43 42 42 43 43 43 43 42 42 42 42 42 41 41 41 41 40 39 38 37 37 37 37 38 38 38 38 38 39 39 39 39 39 40 40 39 39 40 40 41 41 41 41 42 41 40 40 40 40 38 38 38 39 40 40 41 42 42 43 43 42 41 40 40 39 39 39 39 39 40 40 40 39 39 39 40 40 40 40 40 40 40 40 39 38 37 37 37 36 36 35 35 35 35 36 36 36 37 38 39 38 38 39 39 38 37 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 36 36 37 38 38 38 38 38 37 36 35 34 32 32 32 32 32 32 33 35 37 38 37 35 33 34 37 38 39 39 39 39 38 39 41 41 42 41 39 38 39 38 36 36 39 40 40 42 41 41 42 43 43 43 43 42 40 40 39 37 37 37 37 37 38 37 36 36 35 36 37 36 35 34 34 34 34 34 33 33 32 31 30 30 31 31 32 33 31 31 32 31 31 30 29 29 30 30 30 29 28 28 28 29 29 30 30 29 29 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 26 26 26 26 26 26 26 26 26 26 26 27 28 30 31 31 30 29 28 29 30 29 29 28 29 30 28 27 28 29 30 31 33 32 30 30 30 30 28 27 28 28 28 29 29 29 27 27 27 27 26 26 26 26 25 24 25 26 26 27 29 30 29 29 29 28 27 26 26 27 29 30 30 29 28 27 28 30 29 28 28 27 27 27 25 25 26 24 23 23 23 23 23 23 23 23 23 22 22 23 23 23 23 23 22 23 24 25 25 26 27 27 27 27 27 27 26 24 23 23 25 25 26 27 29 30 30 30 30 29 28 27 26 26 25 24 24 24 23 23 23 23 25 26 26 26 24 24 25 27 27 27 27 27 27 27 28 27 27 27 26 26 26 25 24 24 24 24 23 23 22 22 22 22 22 22 21 21 56 56 55 55 56 56 56 57 56 55 54 53 53 52 51 50 49 50 50 51 52 53 55 54 53 53 52 52 52 52 51 51 52 52 51 51 52 52 52 51 50 49 48 48 47 46 45 45 46 47 48 47 46 48 49 47 45 46 48 48 49 50 49 48 48 49 50 49 49 49 50 49 49 48 48 48 48 48 48 48 48 47 45 44 43 43 43 42 42 43 43 44 45 46 47 46 45 44 44 44 46 47 47 47 48 48 47 46 46 47 47 47 49 49 48 46 46 46 47 46 46 46 47 47 46 45 45 46 44 44 44 43 43 43 43 43 43 43 43 45 44 44 44 44 44 43 43 42 41 42 42 40 39 39 38 37 37 37 37 38 38 38 38 38 38 39 39 39 40 40 39 39 39 40 41 40 40 40 41 41 40 39 39 39 38 38 38 39 40 40 40 41 41 42 42 42 41 40 40 39 39 39 39 39 39 39 40 39 39 39 39 40 40 41 40 40 40 40 39 38 37 37 37 37 36 36 35 35 35 35 35 36 37 38 38 38 38 39 39 38 37 36 36 36 36 35 35 35 35 36 35 35 34 33 33 33 34 34 34 35 36 36 36 36 37 37 35 33 32 32 32 32 32 32 34 37 37 38 38 37 35 33 35 37 37 39 40 41 41 40 40 42 42 42 41 40 39 39 38 36 36 38 40 41 41 40 41 42 44 44 44 44 42 40 39 39 38 38 38 39 39 40 39 37 35 34 35 36 36 35 33 33 33 33 33 32 31 30 30 30 30 30 30 31 31 30 30 31 30 30 29 29 29 29 29 29 29 29 28 28 29 30 31 31 30 29 29 29 30 29 28 28 28 28 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 30 29 28 27 29 29 28 27 27 28 30 28 27 28 29 30 31 32 32 31 30 30 30 29 27 27 28 28 29 29 28 28 28 27 27 27 27 26 25 24 24 25 26 26 28 29 29 29 29 28 27 27 26 26 27 28 28 28 27 27 27 27 28 28 27 26 26 26 26 25 24 24 23 23 23 23 24 25 25 25 24 23 23 23 22 22 22 22 23 23 23 24 26 27 28 29 29 28 28 27 27 25 23 23 24 26 26 26 27 28 29 30 30 30 30 29 28 27 27 27 26 24 23 23 23 24 24 25 27 27 27 25 24 26 27 27 27 28 28 28 28 28 27 27 27 26 25 25 24 24 24 24 24 23 22 22 23 23 23 23 23 22 21 55 55 55 54 55 55 55 56 56 55 55 54 54 53 52 52 51 49 49 51 52 53 54 54 54 54 53 53 52 52 52 52 52 52 51 51 52 52 52 50 49 49 49 49 48 47 46 45 45 46 46 46 46 46 47 46 45 45 46 47 48 49 49 48 47 49 50 49 48 49 49 49 49 49 49 48 47 47 47 47 47 47 47 46 45 44 43 42 42 42 43 43 44 44 46 46 45 44 43 44 45 46 46 46 47 47 47 45 45 45 46 47 48 48 47 45 45 45 46 47 46 47 47 47 45 44 46 46 44 43 43 43 42 42 43 43 43 43 44 45 45 44 44 45 44 43 43 42 42 42 40 40 40 40 39 39 38 37 37 37 37 37 38 38 38 38 39 39 39 39 39 39 40 40 41 40 40 40 41 40 39 38 38 38 37 37 38 39 39 39 40 40 40 41 41 41 41 41 40 40 40 40 39 39 38 39 40 39 38 38 39 39 40 41 41 41 40 40 39 38 38 38 37 36 36 36 36 36 35 35 35 35 36 37 37 37 37 38 39 38 37 37 37 37 36 35 35 35 35 36 36 36 34 33 33 33 33 33 33 33 33 34 34 34 36 37 35 32 32 32 33 33 32 33 36 38 39 38 38 37 35 34 35 36 37 38 39 40 40 41 41 41 41 42 43 42 40 39 39 38 37 39 39 39 39 40 41 42 43 44 45 44 42 40 40 39 38 38 39 39 39 40 40 38 36 35 34 34 34 34 33 32 32 32 31 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 28 28 29 30 31 31 31 30 30 29 29 30 30 29 28 29 30 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 25 26 26 26 26 27 27 27 26 27 28 27 27 26 26 28 30 29 27 27 29 30 30 31 32 31 30 30 30 29 27 27 28 29 29 29 27 27 28 27 27 27 27 26 25 24 24 25 26 26 27 28 29 28 28 28 28 27 26 26 26 27 27 26 25 25 25 24 24 25 25 25 25 25 24 24 23 23 23 23 23 25 26 26 27 28 27 25 25 26 26 25 24 24 24 24 25 27 29 29 30 30 30 29 28 27 26 24 23 24 26 27 28 28 28 28 29 30 30 30 30 29 28 27 27 26 25 24 23 23 25 25 24 25 27 27 27 26 26 27 27 27 28 29 29 28 27 27 27 26 26 25 24 24 24 24 24 24 24 23 23 23 24 24 24 24 24 23 22 54 55 54 54 55 55 54 54 55 55 56 56 55 55 54 52 52 50 49 50 52 53 54 54 54 54 54 54 53 53 52 52 53 52 52 52 52 52 51 50 50 49 49 49 48 47 46 45 45 45 45 45 45 45 45 45 45 45 45 46 48 48 48 47 47 49 49 48 48 49 49 49 49 49 49 48 47 46 46 46 45 45 46 46 46 45 45 43 42 42 42 42 43 44 44 44 44 43 42 43 44 45 45 45 45 46 46 45 44 44 45 46 46 47 46 45 44 44 46 47 47 47 46 45 44 43 44 44 43 42 42 42 41 41 42 43 43 43 43 44 45 44 44 44 44 43 43 42 42 42 40 40 40 40 40 40 40 38 37 37 37 37 37 38 38 38 38 38 38 38 38 39 40 40 40 40 39 40 40 40 38 38 38 37 37 38 38 38 38 38 39 40 40 40 41 41 41 41 41 41 41 40 40 38 38 38 39 38 38 38 38 39 39 40 40 41 40 40 39 38 38 38 37 37 37 37 37 37 37 36 35 34 35 36 37 36 37 38 39 39 38 37 37 36 36 35 35 36 36 36 36 36 36 34 33 33 33 33 32 32 32 32 32 32 33 34 33 32 32 32 34 34 32 34 36 37 39 40 39 37 36 34 34 36 37 37 38 39 40 40 40 39 40 41 42 42 41 40 39 38 39 40 40 40 39 41 41 41 42 44 45 44 43 41 40 38 37 37 37 37 38 40 40 38 37 36 34 33 32 33 32 31 31 30 30 30 30 31 32 31 30 30 30 30 31 30 29 29 30 30 31 31 30 30 30 29 29 29 29 30 31 32 31 30 30 29 30 31 30 29 29 29 30 30 29 29 28 27 27 27 27 27 27 27 27 28 27 27 28 28 28 27 27 27 27 27 27 26 26 26 26 26 26 26 26 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 28 26 28 30 30 30 31 32 31 30 30 28 27 26 26 27 28 28 27 27 27 27 27 27 26 25 24 24 24 25 26 26 27 28 29 28 27 27 27 27 27 26 25 26 26 25 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 28 28 28 28 29 29 28 28 29 29 28 26 25 25 26 28 29 29 29 29 30 29 29 28 27 25 23 23 25 26 28 29 30 29 29 29 30 30 30 29 28 27 26 25 24 24 23 23 24 26 26 25 26 27 27 27 27 27 27 28 29 28 28 27 27 27 27 26 25 24 24 24 24 24 24 24 24 23 23 23 24 24 24 24 24 23 23 22 53 54 53 53 54 55 54 53 54 55 55 56 56 55 54 53 51 50 49 49 51 52 53 53 52 53 54 54 54 53 53 53 53 53 53 53 52 52 51 51 52 51 50 49 48 47 47 46 46 46 46 45 46 45 45 45 45 45 45 45 46 47 47 46 47 49 48 47 48 49 49 49 49 49 48 49 48 47 46 45 44 44 44 45 45 45 45 44 42 42 42 42 42 42 43 42 42 42 42 42 42 43 44 43 44 45 45 44 43 43 44 44 44 45 45 44 43 43 45 46 46 45 44 44 43 43 43 43 43 42 42 41 41 41 42 42 42 42 42 44 44 43 43 43 43 43 42 43 43 42 40 40 41 40 40 40 40 38 38 38 37 37 37 37 38 38 38 38 38 38 38 39 39 39 39 39 39 40 40 40 38 38 38 37 37 38 38 38 38 39 39 40 41 41 40 40 40 40 41 41 41 40 40 39 38 38 38 38 38 38 38 38 38 39 40 41 40 40 40 39 38 38 38 38 38 38 38 37 37 36 36 35 35 35 35 35 36 37 38 39 38 37 37 37 36 36 37 37 37 36 36 36 36 35 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 33 34 33 33 35 36 37 39 40 39 38 37 36 35 35 36 37 38 39 39 39 39 38 40 41 42 43 43 42 40 39 39 40 42 42 42 42 42 42 43 44 44 43 42 41 40 39 38 37 37 37 37 38 39 39 37 35 35 34 32 31 31 30 30 30 30 30 33 34 34 33 31 30 30 32 33 34 32 31 31 32 34 35 33 31 31 30 29 29 30 31 30 30 30 30 30 30 31 31 30 30 29 29 30 30 29 28 28 28 28 29 29 29 28 28 29 29 28 27 29 29 29 28 28 28 28 28 27 27 27 26 26 26 26 26 26 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 28 28 28 27 26 26 26 25 25 25 25 26 26 26 26 26 26 26 26 25 25 26 28 30 29 27 27 29 30 30 31 32 31 30 29 28 27 26 26 26 26 27 27 27 27 27 27 26 26 24 24 24 25 26 27 27 27 29 29 27 27 27 27 27 27 26 24 24 24 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 25 27 29 29 29 30 30 29 29 28 28 27 27 26 26 27 29 30 29 28 28 28 28 28 28 27 26 24 23 23 24 26 27 29 30 30 30 30 30 30 29 29 27 27 26 25 25 24 23 23 25 27 26 26 27 27 27 28 28 28 28 29 29 27 27 27 27 26 26 25 24 24 24 24 24 24 23 23 23 23 23 23 24 24 24 24 23 23 23 23 52 53 52 52 53 54 54 53 53 54 55 56 56 55 55 53 51 51 49 48 50 51 52 52 52 53 54 53 54 53 53 53 54 54 54 54 53 52 52 52 52 51 50 49 48 48 47 48 48 49 49 48 48 47 46 46 45 45 45 44 45 45 46 46 46 48 48 47 47 48 48 48 49 48 48 48 47 47 46 45 44 44 43 43 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 42 43 43 43 43 43 45 44 42 42 43 44 44 44 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 42 42 43 43 42 43 43 42 41 41 42 42 41 41 41 40 40 39 39 39 39 39 39 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 37 37 37 37 38 38 38 38 39 40 41 40 40 40 39 39 40 40 41 41 40 40 40 39 38 38 38 38 38 38 38 38 39 40 41 40 40 40 39 39 39 39 39 38 37 37 37 37 37 36 36 35 34 35 36 37 37 38 38 39 38 37 37 37 38 38 38 37 37 37 37 36 36 36 36 36 34 33 32 32 32 32 32 32 32 32 32 34 36 34 33 33 34 36 38 38 39 40 40 38 38 38 36 35 36 37 38 38 38 38 39 40 41 42 43 43 43 42 41 40 40 41 42 43 43 43 44 44 44 43 42 41 41 41 40 39 39 39 38 36 36 37 37 36 35 34 33 32 31 32 32 32 31 31 32 36 36 35 34 32 30 31 34 35 36 35 32 32 34 36 36 35 33 32 31 30 29 30 31 31 30 30 30 30 31 32 31 30 30 30 30 30 30 29 28 28 29 29 30 31 31 31 31 30 29 28 28 29 30 30 29 29 29 29 29 28 27 27 27 27 27 27 27 27 28 28 27 27 26 26 26 27 27 26 26 27 28 28 28 28 28 27 29 30 30 30 30 29 27 26 26 26 27 26 25 25 25 25 26 26 25 25 25 25 25 25 26 28 29 28 26 27 29 30 30 31 31 30 29 28 27 27 26 26 26 26 27 26 26 27 27 26 25 24 24 24 26 27 27 28 28 29 28 27 27 27 27 27 26 25 24 24 23 23 23 23 23 24 25 24 23 23 23 23 24 24 24 25 27 28 29 30 31 31 30 30 28 27 27 26 27 27 28 28 29 29 28 27 26 26 26 26 25 26 26 24 23 23 24 25 25 26 27 29 30 30 30 30 30 29 28 27 27 26 26 26 24 24 24 25 27 27 27 27 27 27 29 29 29 28 28 27 27 26 26 25 25 24 24 24 24 24 23 23 23 23 23 23 23 23 24 24 24 24 23 23 22 23 24 51 51 51 51 52 54 54 52 53 54 54 55 55 55 54 53 53 52 50 48 49 50 52 51 51 53 53 52 53 53 53 53 53 54 54 54 53 53 52 52 51 50 50 49 49 49 48 49 50 50 50 49 49 48 47 47 46 46 46 45 44 44 45 45 45 46 47 46 46 47 47 48 48 47 47 46 46 46 45 45 44 44 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 43 43 42 42 41 42 43 43 42 42 42 42 42 41 41 41 41 41 41 40 40 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 40 40 39 39 39 39 39 40 40 39 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 38 39 39 39 39 40 40 40 39 39 39 38 39 40 40 41 40 40 40 39 38 38 37 37 37 38 38 38 39 40 40 40 40 40 40 40 40 39 38 38 37 37 37 36 36 36 35 35 34 34 36 37 37 37 38 38 38 39 38 38 38 38 38 38 37 37 37 37 37 37 36 36 35 33 33 32 32 32 33 34 33 33 34 36 37 34 33 34 35 35 36 37 38 40 40 40 39 40 39 37 36 36 37 37 37 38 39 40 41 41 41 41 42 43 43 43 42 41 42 43 44 44 43 42 42 43 42 40 41 41 40 40 39 39 38 36 35 35 35 35 34 33 32 32 33 34 36 35 34 32 33 36 37 37 35 33 31 32 34 36 36 36 34 33 35 37 37 35 33 32 31 31 30 29 31 32 32 31 30 31 32 31 30 30 31 32 32 31 30 29 28 29 30 30 30 31 31 31 32 31 30 31 30 30 30 30 29 29 29 28 28 28 27 27 27 27 27 27 27 29 29 29 29 27 27 27 27 28 28 27 27 29 30 30 31 31 29 29 31 32 30 30 29 28 27 26 27 28 29 28 26 25 25 25 25 25 25 25 25 25 25 25 25 26 27 27 26 26 28 29 29 30 31 30 29 29 27 27 27 26 26 26 26 26 26 27 27 26 24 24 24 25 26 27 27 28 28 28 27 27 27 26 26 26 26 25 24 24 23 23 24 25 25 26 26 25 23 23 24 25 26 26 25 26 28 30 30 31 32 31 30 29 28 27 28 28 29 29 29 29 29 28 27 26 26 26 26 26 25 25 24 23 23 24 26 26 26 26 27 28 30 30 30 30 29 28 27 27 27 26 26 25 24 24 24 25 27 27 27 27 27 28 29 29 28 27 27 27 27 26 25 24 24 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 23 22 23 23 24 52 51 51 51 51 52 53 52 51 52 53 54 55 55 54 53 53 52 51 49 48 49 51 51 50 52 52 52 52 52 52 52 52 53 53 53 53 53 53 52 51 50 50 50 50 50 50 51 51 50 49 49 48 47 47 47 46 46 46 45 44 44 44 44 45 45 46 46 46 46 46 47 47 46 46 46 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 37 37 37 38 38 39 39 39 39 39 40 40 39 39 39 38 39 39 40 40 40 40 39 39 38 38 37 37 37 38 38 39 39 39 40 40 40 40 40 40 39 38 38 39 38 37 37 37 37 36 36 35 34 34 35 36 37 37 37 37 38 39 39 38 37 37 37 37 38 38 38 38 37 37 36 36 35 34 33 32 32 32 34 34 34 34 36 37 37 35 33 35 36 34 34 36 38 39 40 40 41 41 41 39 37 36 36 37 37 37 38 40 41 40 40 41 41 42 43 44 43 43 43 44 44 44 43 42 41 42 42 40 40 40 40 40 39 38 38 37 37 36 35 34 33 32 32 34 36 37 37 36 35 32 33 35 37 37 35 34 32 31 33 35 36 37 36 35 35 37 37 35 33 32 33 32 31 30 31 33 33 33 32 32 32 31 30 32 33 33 32 31 29 29 29 29 31 31 29 30 30 31 32 31 30 31 31 30 30 29 29 28 28 28 27 27 27 27 27 28 29 28 28 29 30 30 29 29 29 29 28 29 29 29 29 29 30 32 33 32 30 30 32 32 30 30 29 28 27 27 29 29 29 29 28 27 27 26 26 26 25 25 25 25 25 25 25 25 25 25 25 25 26 27 28 29 29 29 30 29 28 27 27 27 27 26 26 25 25 26 26 26 25 24 24 24 26 27 27 27 28 28 28 27 27 26 26 26 26 25 24 23 23 24 26 27 26 26 26 25 24 24 26 27 27 26 26 27 29 29 31 32 31 30 30 29 28 29 30 30 30 30 29 28 27 27 28 28 27 28 28 28 27 26 24 23 24 26 27 28 28 28 27 29 30 30 30 30 29 27 27 27 26 25 25 24 24 24 24 26 27 27 27 28 28 28 28 28 27 27 27 27 27 26 25 24 23 23 23 24 24 23 23 23 23 23 24 24 24 24 24 24 24 23 23 23 23 23 23 53 53 52 51 51 52 52 51 50 50 52 53 53 54 54 53 52 52 52 52 49 48 49 49 50 52 51 51 52 52 51 51 51 52 52 51 52 53 53 53 52 51 51 51 51 50 50 52 52 50 49 49 48 48 47 47 46 46 46 46 45 44 44 44 44 44 45 45 45 45 45 45 46 46 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 42 42 42 42 42 43 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 40 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 39 39 39 40 39 39 39 39 38 38 39 40 40 40 39 39 38 38 38 37 37 37 37 38 39 39 39 39 39 40 40 40 40 39 39 39 39 38 37 37 37 37 36 35 35 34 34 35 36 36 37 36 37 37 37 38 38 37 37 37 37 37 37 37 38 37 37 37 37 37 35 34 33 32 33 35 35 35 36 37 39 38 35 33 35 37 36 35 35 36 37 39 40 41 41 41 40 39 37 36 38 39 39 38 39 39 39 40 41 42 42 43 44 44 44 44 44 43 43 42 42 41 40 41 40 39 39 40 40 40 39 39 38 38 38 36 35 33 32 32 35 38 38 37 36 34 33 34 35 37 37 36 35 34 33 33 35 36 37 37 37 37 37 38 37 34 34 34 33 32 31 32 33 33 34 33 33 32 31 31 33 33 33 32 30 29 29 29 29 31 31 30 31 32 32 32 31 30 30 30 30 29 29 29 28 27 27 27 27 28 28 29 30 30 29 29 29 30 30 30 30 29 29 28 29 29 29 30 30 32 33 34 32 31 31 33 32 30 30 30 30 29 29 30 30 30 30 28 28 29 29 28 28 27 26 25 25 25 24 24 24 24 24 25 25 25 25 26 27 28 28 28 28 27 27 28 28 27 27 27 26 25 24 25 25 25 24 24 23 25 26 26 26 27 28 29 28 28 27 27 27 26 25 24 23 23 25 26 26 26 25 25 25 24 25 28 28 27 27 28 29 29 30 31 31 30 30 29 29 29 30 31 30 30 30 29 27 27 28 29 29 29 29 29 28 27 27 26 24 24 26 27 28 29 29 29 29 30 30 30 29 28 27 26 25 24 24 24 25 25 25 25 27 27 27 27 27 28 28 28 27 27 27 27 27 27 26 25 24 23 23 25 25 24 24 24 24 24 24 24 24 25 25 24 24 24 23 23 23 23 24 24 54 54 53 51 50 51 50 51 51 50 51 51 51 53 54 54 53 52 52 52 51 49 48 48 50 51 51 51 52 51 50 50 50 51 51 51 51 51 52 53 53 52 52 52 51 50 50 51 51 50 51 50 49 49 48 47 46 46 46 46 46 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 44 44 43 43 43 43 43 43 43 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 40 40 39 38 38 39 39 38 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 36 37 37 38 38 39 39 39 39 39 39 39 38 38 38 38 39 40 40 40 40 39 38 38 38 38 37 36 37 37 38 39 39 39 39 39 39 39 39 40 40 40 39 38 38 37 37 37 37 36 36 35 34 34 35 35 35 36 36 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 35 32 32 34 36 36 37 37 38 39 37 35 34 36 38 38 38 36 35 36 38 40 40 40 41 42 41 39 37 38 40 41 41 40 39 39 40 41 43 43 44 44 45 44 43 42 42 42 41 41 41 39 39 40 39 39 39 39 40 41 40 39 38 37 35 34 33 32 33 36 38 39 37 36 35 34 35 37 38 38 37 36 35 35 33 33 34 35 36 37 38 38 39 38 37 36 35 34 33 32 32 33 33 33 34 34 33 32 33 33 33 31 31 30 30 29 29 30 31 32 31 32 33 33 31 30 30 30 29 29 29 29 29 29 28 27 28 29 29 29 30 30 30 29 29 29 29 30 30 30 29 29 29 30 29 29 30 31 33 34 34 33 32 33 34 33 32 31 31 31 30 30 30 30 30 30 29 29 30 30 30 29 28 26 26 26 25 24 24 24 24 24 24 24 24 24 24 26 26 26 27 27 27 27 27 28 28 27 27 26 26 24 24 24 24 24 23 23 24 25 24 25 26 27 28 28 28 27 27 26 25 24 23 23 24 26 26 26 26 25 25 24 23 25 27 28 28 29 30 30 30 30 31 31 30 30 29 29 30 31 32 30 30 30 29 29 28 29 30 30 29 28 28 28 27 27 26 25 24 26 27 27 29 30 30 30 30 30 29 27 27 26 25 25 25 24 25 26 27 26 25 26 27 27 27 27 27 28 27 27 27 27 27 27 26 25 24 23 24 25 26 26 25 24 25 25 24 24 24 24 24 25 25 24 24 24 23 23 24 24 24 54 54 53 51 51 51 51 53 53 51 50 49 50 53 55 54 54 53 52 51 52 52 50 48 49 50 50 50 50 50 49 49 49 50 49 50 49 49 51 52 53 53 52 52 52 52 52 52 52 51 52 50 50 50 48 48 48 47 48 48 47 46 46 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 44 45 44 44 44 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 40 41 40 40 40 40 39 40 39 39 40 39 40 40 40 40 41 41 40 40 39 39 39 39 40 40 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 37 37 38 38 39 39 39 38 38 39 40 39 38 38 39 39 40 40 40 40 40 39 38 38 38 37 36 36 37 37 38 39 40 39 39 39 39 39 40 40 40 39 39 38 38 37 37 37 37 37 36 35 34 34 34 35 35 36 37 37 36 36 36 36 36 35 35 35 35 36 36 36 36 36 36 36 35 33 32 32 35 37 37 37 38 39 38 37 35 34 37 39 39 40 39 37 36 37 39 40 41 42 42 41 39 38 38 39 40 41 42 41 40 41 41 42 43 43 44 45 44 43 43 42 41 40 40 40 39 38 39 40 39 39 38 38 39 39 38 37 35 34 34 33 33 35 37 37 39 39 38 36 35 35 37 38 39 38 37 37 36 34 34 34 34 35 36 37 38 39 38 38 37 36 34 33 33 32 32 33 33 33 34 34 34 33 32 31 31 30 29 30 30 31 31 33 32 32 33 33 32 30 30 30 30 29 30 30 31 31 30 29 29 29 30 30 29 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 31 32 34 34 34 33 33 32 33 33 33 33 32 32 32 32 31 31 31 31 30 30 30 30 30 29 28 27 27 26 25 26 27 26 24 24 24 24 24 24 24 24 25 26 26 26 27 27 27 27 27 27 27 27 27 26 25 25 24 24 23 23 24 23 23 24 25 25 26 26 25 25 25 24 23 23 23 23 26 27 27 27 27 28 28 26 24 25 26 27 28 28 28 29 29 29 30 30 30 30 29 29 30 32 32 31 30 29 29 29 30 30 30 30 29 28 28 29 28 27 26 25 24 26 27 28 30 30 30 30 30 29 28 27 26 25 25 26 27 25 25 26 27 27 26 26 26 26 26 27 27 28 28 27 27 26 27 27 26 26 24 23 24 25 26 26 26 26 26 26 25 24 24 24 24 25 26 25 24 24 23 23 23 24 24 \ No newline at end of file diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/grid/misc/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/grid/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/image/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/image/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/import/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/import/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/create_gagradloc/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/create_gagradloc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/db_purge/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/db_purge/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/floodseq/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/floodseq/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/metar2shef/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/metar2shef/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/misc/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/obsfcst_monitor/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/obsfcst_monitor/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/pdc_pp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/pdc_pp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/precip_accum/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/precip_accum/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/qcalarm/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/qcalarm/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/rivermon/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/rivermon/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/riverpro/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/riverpro/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/sshp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/sshp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/vacuum/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/log/vacuum/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/metar_input/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/metar_input/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/metar_output/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/metar_output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/pdc_pp/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/pdc_pp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/product/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/product/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/report/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/report/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp/forecast/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp/forecast/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp/precip/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp/precip/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/incoming/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/incoming/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/ingest_xml/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/ingest_xml/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/outgoing/.gitignore b/nativeLib/files.native/awipsShare/hydroapps/whfs/local/data/sshp_transfer/outgoing/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/bin/runso b/nativeLib/files.native/edex/bin/runso new file mode 100755 index 0000000000..7ee690b5d8 Binary files /dev/null and b/nativeLib/files.native/edex/bin/runso differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/bin/runso b/nativeLib/files.native/edex/data/hdf5/hydroapps/bin/runso new file mode 100755 index 0000000000..52f82c20b2 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/bin/runso differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/data/fxa/radar/envData/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/data/fxa/radar/envData/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/coord_host.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/coord_host.dat new file mode 100644 index 0000000000..43a5da2d9a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/coord_host.dat @@ -0,0 +1,4 @@ +525 +440 +81 +91 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/county.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/county.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/cwaus.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/cwaus.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/fg_basin.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/fg_basin.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/flights.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/flights.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/forecastpt.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/forecastpt.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/map_basin.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/map_basin.dat new file mode 100644 index 0000000000..9abe1c55cc --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/map_basin.dat @@ -0,0 +1,6 @@ +xxx xxx -1 5 +40.5 97.0 +40.5 79.0 +28.5 79.0 +28.5 97.0 +40.5 97.0 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/rfc_boundary.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/rfc_boundary.dat new file mode 100644 index 0000000000..a1ce58263f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/rfc_boundary.dat @@ -0,0 +1,6 @@ +xxx xxx -1 5 +43.3 -98.4 +42.9 -94.2 +39.9 -98.9 +39.4 -95.0 +43.3 -98.4 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/river.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/river.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/state.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/state.dat new file mode 100644 index 0000000000..ac1133d32a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/state.dat @@ -0,0 +1,6 @@ +xxx xxxxxx -1 5 +40.5 97.0 +39.8 93.6 +38.4 88.1 +37.1 85.0 +36.7 82.4 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/town.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/town.dat new file mode 100644 index 0000000000..807a0a375b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/ascii/town.dat @@ -0,0 +1,40 @@ +Alexander City 32.57 85.57 +Anniston AP 33.35 85.51 +Auburn 32.36 85.30 +Birmingham AP 33.34 86.45 +Decatur 34.37 86.59 +Dothan AP 31.19 85.27 +Florence AP 34.48 87.40 +Gadsden 34.1 86.0 +Huntsville AP 34.42 86.35 +Mobile AP 30.41 88.15 +Mobile Co 30.40 88.15 +Montgomery AP 32.23 86.22 +Selma-Craig AFB 32.20 87.59 +Talladega 33.27 86.6 +Tuscaloosa AP 33.13 87.37 +Anchorage AP 61.10 150.1 +Barrow (S) 71.18 156.47 +Fairbanks AP (S) 64.49 147.52 +Juneau AP 58.22 134.35 +Kodiak 57.45 152.29 +Nome AP 64.30 165.26 +Douglas AP 31.27 109.36 +Flagstaff AP 35.8 111.40 +Fort Huachuca AP (S) 31.35 110.20 +Kingman AP 35.12 114.1 +Nogales 31.21 110.55 +Phoenix AP (S) 33.26 112.1 +Prescott AP 34.39 112.26 +Tucson AP (S) 32.7 110.56 +Winslow AP 35.1 110.44 +Yuma AP 32.39 114.37 +Blytheville AFB 35.57 89.57 +Camden 33.36 92.49 +El Dorado AP 33.13 92.49 +Fayetteville AP 36.0 94.10 +Fort Smith AP 35.20 94.22 +Hot Springs 34.29 93.6 +Jonesboro 35.50 90.42 +Little Rock AP (S) 34.44 92.14 +Pine Bluff AP 34.18 92.5 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/binary/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/host/binary/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat new file mode 100644 index 0000000000..3139bc0f22 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat @@ -0,0 +1,4 @@ +561 +130 +491 +437 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/util/run_create_bas_bound b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/util/run_create_bas_bound new file mode 100755 index 0000000000..ac7e9edae4 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/geo_data/util/run_create_bas_bound @@ -0,0 +1,5 @@ +#!/bin/ksh +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +runso rary.ohd.util create_bas_bound_main $1 $2 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/libgfortran.so.1 b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/libgfortran.so.1 new file mode 100644 index 0000000000..cd5c69bd93 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/libgfortran.so.1 differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/libjasper.so.1 b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/libjasper.so.1 new file mode 100755 index 0000000000..ecc44ba9bb Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/libjasper.so.1 differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/library.empty.motif.so b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/library.empty.motif.so new file mode 100755 index 0000000000..2eb2cb1f82 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/library.empty.motif.so differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/library.ohd.util.so b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/library.ohd.util.so new file mode 100755 index 0000000000..9182263384 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/lib/native/linux32/library.ohd.util.so differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DHRgather b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DHRgather new file mode 100755 index 0000000000..ec27da131f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DHRgather @@ -0,0 +1,392 @@ +#!/bin/ksh + +# +# script for gathering DHR products from fxa directories +# and moving them to the OHD precip_proc world +# October 16, 2007 +# David T. Miller RSIS OHD/HSEB +# this script is modified based on DPAgather script. + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export DSP_PROD_DIR=$(get_apps_defaults dsp_prod_dir) +export DHR_LOG_DIR=$(get_apps_defaults dhr_log_dir) +export DHR_DIRNAME2=$(get_apps_defaults dhr_dirname2) +export DHR_DIRNAME1=$(get_apps_defaults dhr_dirname1) +export DHR_PROD_DIR=$(get_apps_defaults dhr_prod_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# define function for checking for a stop file to bypass the gather process + +checkcronstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_hpe_crons + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + + return 1 + + else + return 0 + fi +} + +checkHPErun() +{ + # Check to see if age on file is more than 10 minutes + # If it is stop the start_hpe script until data arrives. + tnow=`date +%s` + tfile=`date +%s -r $HPE_LOG_DIR/processhpe_log` + agesecs=$(($tnow-$tfile)) + echo "Checking age of processhpe_log $agesecs secs " >> $hpefnm + if [[ $agesecs -ge 600 ]] + then + return 1 + else + return 2 + fi +} + +# setup log files +# + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp +fnm=$DHR_LOG_DIR/dhrgather_log +tmp=$DHR_LOG_DIR/dhrgather_tmp + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +checkcronstop $HPE_LOG_DIR +STOP_FOUND=$? + +if test STOP_FOUND -eq 1 +then + +# Instead of using kill, will introduce a delayed stop. +# This is especially important if radar files are separate in time +# and only 1 radar is indicating precip but the rest are not +# The time of this file is checked in start_hpe script. +# If greater than 20 min, the start_hpe script will exit + + if [[ ! -r $HPE_LOG_DIR/stop_hpe_process ]] + then + touch $HPE_LOG_DIR/stop_hpe_process + echo "stop_hpe_process file created " $Dte >> $hpefnm + echo "HPE decoders and field generator will stop after 20 min " >> $hpefnm + echo "unless precipitation occurs at a radar before that time " >> $hpefnm + fi + + + exit 0 +fi + + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# the AMIRUNNING_DIR variable is required by the amirunning script + +AMIRUNNING_DIR=$DHR_LOG_DIR + +. $RFCLX/public/bin/amirunning + + +if [[ $AmIRunning = "yes" ]]; then + echo DHRgather script cancelled due to other instance running >> $fnm + exit 1 + fi + + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin gather at "$Dte >> $fnm + +if [[ ! -d $DHR_PROD_DIR ]] +then + echo "The DHR PROD DIR $DHR_PROD_DIR is invalid or " >> $fnm + echo "does not exist. Exiting DHRgather script. " $Dte >> $fnm + exit 1 +fi + +# +# touch dhrgather control temp file +# + +touch $DHR_LOG_DIR/dhrgather_control.temp + +# +# check if radarloc table has any radars with use_radar="T" +# if not, then stop +# the sed command strips off all non-numeric characters +# + +Num_Rad=$( +echo "select count(*) from Radarloc WHERE use_radar='T'; " | \ +$POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +if [[ $Num_Rad = 0 ]] +then + + echo no radars defined for use -- gather not done >> $fnm + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + +elif [[ -z $Num_Rad ]] +then + + echo number of radars defined for use is undetermined -- gather continuing >> $fnm +fi + +# +# write radar identifiers and prefixes to temp file +# + +echo "select lower(radid_prefix), lower(radid) from Radarloc WHERE use_radar='T';" | \ +$POSTGRESQLBINDIR/psql -q -A -t $DB_NAME > $DHR_LOG_DIR/radid.temp + + +# +# if radid.temp is not created or is 0 bytes in length, then print message and exit gather script +# + +if [[ ! -s $DHR_LOG_DIR/radid.temp ]] + then + rm -f $DHR_LOG_DIR/radid.temp + rm -f $DHR_LOG_DIR/dhrgather_control.temp + echo radid.temp file not created properly -- gather not done >> $fnm + + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + fi + +# +# for each radar id in file, construct directory name and search for products +# note that the radar id in the directory name is lower case and 4 char +# +FileCheck=0 +RainCheck=0 +for rid in `cat $DHR_LOG_DIR/radid.temp` +do + +radid_dir=$(echo "$rid" | sed 's/|//g') +radid=${radid_dir#?} + +PRODUCT_DIR_NAME=$DHR_DIRNAME1/$radid_dir/$DHR_DIRNAME2 + +# +# Look for raw products in the directory satisfying the time test. +# If found, then copy to a temporary location and mv to the gather directory. +# Change radar id to upper case. +# Successfully processed products will be deleted from the gather directory +# as part of the decoding process. +# Write old name, new name to log file. +# +# In addition, this now checks the DHR data for precip status category. +# If category is 1 or 2, it will kick off the start_hpe script +# which will run the DHR and DSP decoders and +# the HPE field generator +# + + +num_files=`ls -F $PRODUCT_DIR_NAME 2>>$fnm | grep -v "*" | grep -v "/" | wc -l` +if test $num_files -ne 0 +then + RADID=$(print $radid | tr '[a-z]' '[A-Z]') + + i=0 + + for pname in `find $PRODUCT_DIR_NAME -type f -name '*' -newer $DHR_LOG_DIR/dhrgather_control` + do + + GATHER_FILENAME=$DHR_PROD_DIR/DHR$RADID.`date -u +%Y%m%d%H%M%S.$i` + + + i=`expr $i + 1` + + cp $pname $DHR_LOG_DIR/radar_temp + + mv $DHR_LOG_DIR/radar_temp $GATHER_FILENAME + + echo $pname "copied to" $GATHER_FILENAME >> $fnm + + # check to see if the SUPL info in the DHR data indicates rain + + result=`runso rary.ohd.pproc get_dhrpsm_main $pname` + Get_DHRPsm=`expr $result` + + # debug statement to log file + echo "$GATHER_FILENAME Get_DHRPsm = $Get_DHRPsm" >> $hpefnm + + FileCheck=1 + + if [[ $Get_DHRPsm > 0 ]] + then + RainCheck=1 + fi + + done + +fi + +done +# +# mv dhrgather control file +# + +mv $DHR_LOG_DIR/dhrgather_control.temp $DHR_LOG_DIR/dhrgather_control + +# +# delete radid.temp file +# + +rm $DHR_LOG_DIR/radid.temp + +# +# end write to log +# + +Dte=`date -u` +echo "End gather at "$Dte >> $fnm + +# In order to execute gather every minute need to not stop or start HPE rapidly +# If there were files last minute but not any now, +# need to just continue with whatever RainCheck did last time + +# echo "FileCheck = $FileCheck" >> $hpefnm + +if [[ $FileCheck -gt 0 ]] +then + +# based on precip category in new DHR products for the radars, +# start or stop HPE processes + +echo "checking to start or stop start_hpe script" $Dte >> $hpefnm + +phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}'` + +if [[ -n "$phpe" ]] + then + checkHPErun + RUN_FOUND=$? + if test RUN_FOUND -eq 1 + then + echo "We are going to stop start_hpe " $Dte >> $hpefnm + `kill $phpe` + phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}'` + if [[ -n "$phpe" ]] + then + `kill -9 $phpe` + fi + phpe=`ps -ef|grep start_hpe|grep -v grep|grep -v vi|awk '{print $2}'` + fi +fi + +if [[ $RainCheck -le 0 ]] +then + if [[ -z "$phpe" ]] + then + echo "start_hpe script not running " $Dte >> $hpefnm + +# if HPE process isn't running, there's no precip in area. +# remove the temp files in the DHR and DSP product directories +# + if [[ -d $DHR_PROD_DIR && -n "$DHR_PROD_DIR" ]] + then + echo "Removing temp DHR files in $DHR_PROD_DIR due to no rain " $Dte >> $hpefnm + rm -f $DHR_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DHR PROD DIR $DHR_PROD_DIR invalid " $Dte >> $hpefnm + fi + if [[ -d $DSP_PROD_DIR && -n "$DSP_PROD_DIR" ]] + then + echo "Removing temp DSP files in $DSP_PROD_DIR due to no rain " $Dte >> $hpefnm + rm -f $DSP_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DSP PROD DIR $DSP_PROD_DIR invalid " $Dte >> $hpefnm + fi + else + +# Instead of using kill, will introduce a delayed stop. +# This is especially important if radar files are separate in time +# and only 1 radar is indicating precip but the rest are not +# The time of this file is checked in start_hpe script. +# If greater than 20 min, the start_hpe script will exit + + if [[ ! -r $HPE_LOG_DIR/stop_hpe_process ]] + then + touch $HPE_LOG_DIR/stop_hpe_process + echo "stop_hpe_process file created " $Dte >> $hpefnm + echo "HPE decoders and field generator will stop after 20 min " >> $hpefnm + echo "unless precipitation occurs at a radar before that time " >> $hpefnm + else + echo "stop_hpe_process file already created " $Dte >> $hpefnm + echo "HPE process will stop in less than 20 min unless new precip occurs " >> \ + $hpefnm + fi + + + fi + + + +elif [[ $RainCheck -gt 0 ]] +then + + if [[ -z "$phpe" ]] + then + + echo "starting HPE processes via start_hpe script " $Dte >> $hpefnm + exec $PPROC_BIN/start_hpe + else + +# Remove the stop file if it exists because at least one radar has +# indicated there's precip and don't want the processes to stop +# prematurely. +# +# Script will check if one has been entered after it starts. + + if [[ -r $HPE_LOG_DIR/stop_hpe_process ]] + then + rm -f $HPE_LOG_DIR/stop_hpe_process + fi + echo "start_hpe script already running " $Dte >> $hpefnm + fi +fi +else + echo "no radar files found to process " $Dte >> $hpefnm +# next statement goes with FileCheck if test +fi +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DPAgather b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DPAgather new file mode 100755 index 0000000000..8eee267cc7 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DPAgather @@ -0,0 +1,186 @@ +#!/bin/ksh +# +# +# script for gathering DPA products from fxa directories +# and moving them to the OHD precip_proc world +# August 22, 2003 +# updated for PostgreSQL - Oct 22, 2004 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DPA_DIRNAME2=$(get_apps_defaults dpa_dirname2) +export DPA_DIRNAME1=$(get_apps_defaults dpa_dirname1) +export DPA_PROD_DIR=$(get_apps_defaults dpa_prod_dir) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# this script uses the following set_hydro_env variables: +# DPA_LOG_DIR, DPA_PROD_DIR, DPA_DIRNAME1, DPA_DIRNAME2, DB_NAME +# + +# setup log files +# + +fnm=$DPA_LOG_DIR/dpagather_log +tmp=$DPA_LOG_DIR/dpagather_tmp + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# the AMIRUNNING_DIR variable is required by the amirunning script + +AMIRUNNING_DIR=$DPA_LOG_DIR + +. /awips/hydroapps/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo DPAgather script cancelled due to other instance running >> $fnm + exit 1 + fi + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin gather at "$Dte >> $fnm + +# +# touch dpagather control temp file +# + +touch $DPA_LOG_DIR/dpagather_control.temp + +# +# check if radarloc table has any radars with use_radar="T" +# if not, then stop +# the sed command strips off all non-numeric characters +# + +Num_Rad=$( +echo "select count(*) from Radarloc WHERE use_radar='T'; " | \ +$POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +if [[ $Num_Rad = 0 ]] +then + + echo no radars defined for use -- gather not done >> $fnm + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + +elif [[ -z $Num_Rad ]] +then + + echo number of radars defined for use is undetermined -- gather continuing >> $fnm +fi + +# +# write radar identifiers and prefixes to temp file +# + + +#$POSTGRESQLBINDIR/psql -q -t $DB_NAME +#unload to "$DPA_LOG_DIR/radid.temp" +#select lower(radid_prefix), lower(radid) +#from Radarloc +#WHERE use_radar='T'; + +echo "select lower(radid_prefix), lower(radid) from Radarloc WHERE use_radar='T';" | \ +$POSTGRESQLBINDIR/psql -q -A -t $DB_NAME > $DPA_LOG_DIR/radid.temp + + +# +# if radid.temp is not created or is 0 bytes in length, then print message and exit gather script +# + +if [[ ! -s $DPA_LOG_DIR/radid.temp ]] + then + rm -f $DPA_LOG_DIR/radid.temp + rm -f $DPA_LOG_DIR/dpagather_control.temp + echo radid.temp file not created properly -- gather not done >> $fnm + + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + fi + +# +# for each radar id in file, construct directory name and search for products +# note that the radar id in the directory name is lower case and 4 char +# + +for rid in `cat $DPA_LOG_DIR/radid.temp` +do + +radid_dir=$(echo "$rid" | sed 's/|//g') +radid=${radid_dir#?} + +PRODUCT_DIR_NAME=$DPA_DIRNAME1/$radid_dir/$DPA_DIRNAME2 + +# +# look for raw products in the directory satisfying the time test +# if found, then copy to a temporary location and mv to the gather directory +# change radar id to upper case +# successfully processed products will be deleted from the gather directory as part of +# the decoding process +# write old name, new name to log file +# + +num_files=`ls -F $PRODUCT_DIR_NAME 2>>$fnm | grep -v "*" | grep -v "/" | wc -l` +if test $num_files -ne 0 +then + RADID=$(print $radid | tr '[a-z]' '[A-Z]') + + i=0 + + for pname in `find $PRODUCT_DIR_NAME -type f -name '*' -newer $DPA_LOG_DIR/dpagather_control` + do + + GATHER_FILENAME=$DPA_PROD_DIR/DPA$RADID.`date -u +%Y%m%d%H%M%S.$i` + i=`expr $i + 1` + + cp $pname $DPA_LOG_DIR/radar_temp + + mv $DPA_LOG_DIR/radar_temp $GATHER_FILENAME + + echo $pname "copied to" $GATHER_FILENAME >> $fnm + + done + +fi + +done + +# +# mv dpagather control file +# + +mv $DPA_LOG_DIR/dpagather_control.temp $DPA_LOG_DIR/dpagather_control + +# +# delete radid.temp file +# + +rm $DPA_LOG_DIR/radid.temp + +# +# end write to log +# + +Dte=`date -u` +echo "End gather at "$Dte >> $fnm diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DSPgather b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DSPgather new file mode 100755 index 0000000000..d4a3dd97bc --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/DSPgather @@ -0,0 +1,227 @@ +#!/bin/ksh + +# +# script for gathering DSP products from fxa directories +# and moving them to the OHD precip_proc world +# October 16, 2007 +# David T. Miller RSIS OHD/HSEB +# this script is modified based on DPAgather script. + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export DSP_LOG_DIR=$(get_apps_defaults dsp_log_dir) +export DSP_DIRNAME2=$(get_apps_defaults dsp_dirname2) +export DSP_DIRNAME1=$(get_apps_defaults dsp_dirname1) +export DSP_PROD_DIR=$(get_apps_defaults dsp_prod_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# define function for checking for a stop file to bypass the gather process + +checkcronstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_hpe_crons + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + + return 1 + + else + return 0 + fi +} + + +checkcronstop $HPE_LOG_DIR +STOP_FOUND=$? + +if test STOP_FOUND -eq 1 +then + exit 0 +fi + +# Note that this is slightly different than the DHR log as that +# is the primary data gather process. DSP is secondary and will +# not have stop_hpe_crons info in the log. +# + +# setup log files +# + +fnm=$DSP_LOG_DIR/dspgather_log +tmp=$DSP_LOG_DIR/dspgather_tmp +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# the AMIRUNNING_DIR variable is required by the amirunning script + +AMIRUNNING_DIR=$DSP_LOG_DIR + +. $RFCLX/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo DSPgather script cancelled due to other instance running >> $fnm + exit 1 + fi + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin gather at "$Dte >> $fnm + +if [[ ! -d $DSP_PROD_DIR ]] +then + echo "The DSP PROD DIR $DSP_PROD_DIR is invalid or " >> $fnm + echo "does not exist. Exiting DHRgather script. " $Dte >> $fnm + exit 1 +fi + +# +# touch dspgather control temp file +# + +touch $DSP_LOG_DIR/dspgather_control.temp + +# +# check if radarloc table has any radars with use_radar="T" +# if not, then stop +# the sed command strips off all non-numeric characters +# + +Num_Rad=$( +echo "select count(*) from Radarloc WHERE use_radar='T'; " | \ +$POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +if [[ $Num_Rad = 0 ]] +then + + echo no radars defined for use -- gather not done >> $fnm + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + +elif [[ -z $Num_Rad ]] +then + + echo number of radars defined for use is undetermined -- gather continuing >> $fnm +fi + +# +# write radar identifiers and prefixes to temp file +# + + +#$POSTGRESQLBINDIR/psql -q -t $DB_NAME +#unload to "$DSP_LOG_DIR/radid.temp" +#select lower(radid_prefix), lower(radid) +#from Radarloc +#WHERE use_radar='T'; + +echo "select lower(radid_prefix), lower(radid) from Radarloc WHERE use_radar='T';" | \ +$POSTGRESQLBINDIR/psql -q -A -t $DB_NAME > $DSP_LOG_DIR/radid.temp +# +# if radid.temp is not created or is 0 bytes in length, then print message and exit gather script +# + +if [[ ! -s $DSP_LOG_DIR/radid.temp ]] + then + rm -f $DSP_LOG_DIR/radid.temp + rm -f $DSP_LOG_DIR/dspgather_control.temp + echo "radid.temp file not created properly -- gather not done" >> $fnm + + Dte=`date -u` + echo "End gather at "$Dte >> $fnm + exit 1 + fi + +# +# for each radar id in file, construct directory name and search for products +# note that the radar id in the directory name is lower case and 4 char +# +echo "DSP_DIRNAME1 = $DSP_DIRNAME1" >> $fnm +echo "DSP_DIRNAME2 = $DSP_DIRNAME2" >> $fnm +for rid in `cat $DSP_LOG_DIR/radid.temp` +do + +radid_dir=$(echo "$rid" | sed 's/|//g') +radid=${radid_dir#?} + +PRODUCT_DIR_NAME=$DSP_DIRNAME1/$radid_dir/$DSP_DIRNAME2 +echo "PRODUCT_DIR_NAME = $PRODUCT_DIR_NAME radid dir=$radid_dir" + +# +# look for raw products in the directory satisfying the time test +# if found, then copy to a temporary location and mv to the gather directory +# change radar id to upper case +# successfully processed products will be deleted from the gather directory as part of +# the decoding process +# write old name, new name to log file +# + +num_files=`ls -F $PRODUCT_DIR_NAME 2>>$fnm | grep -v "*" | grep -v "/" | wc -l` +echo "num_files = $num_files" +if test $num_files -ne 0 +then + RADID=$(print $radid | tr '[a-z]' '[A-Z]') + + i=0 + + for pname in `find $PRODUCT_DIR_NAME -type f -name '*' -newer $DSP_LOG_DIR/dspgather_control` + do + + GATHER_FILENAME=$DSP_PROD_DIR/DSP$RADID.`date -u +%Y%m%d%H%M%S.$i` + echo "GATHER_FILENAME = $GATHER_FILENAME" + + i=`expr $i + 1` + + cp $pname $DSP_LOG_DIR/radar_temp + + mv $DSP_LOG_DIR/radar_temp $GATHER_FILENAME + echo $pname "copied to" $GATHER_FILENAME >> $fnm + + done + +fi + +done + +# +# mv dspgather control file +# + +mv $DSP_LOG_DIR/dspgather_control.temp $DSP_LOG_DIR/dspgather_control + +# +# delete radid.temp file +# + +rm $DSP_LOG_DIR/radid.temp + +# +# end write to log +# + +Dte=`date -u` +echo "End gather at "$Dte >> $fnm + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDHR b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDHR new file mode 100755 index 0000000000..8ffd9df19f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDHR @@ -0,0 +1,120 @@ +#!/bin/ksh +# +# This script retrieves Digital Hybrid Reflectivity (DHR) +# radar products from the temporary data gathering directory +# and sends them to the decode_dhr_dsp executable for decoding. +# +# Adapted from the Run_DecodeDPA script +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + + +DHRPRODDIR=`get_apps_defaults dhr_prod_dir` +DHRLOGDIR=`get_apps_defaults dhr_log_dir` + +# +# set up log filename +# + +Dte=`date +%m%d%Y` +fnm=$DHRLOGDIR/decodedhr_log_$Dte +ctlfnm=$DHRLOGDIR/decodedhr_ctl + +echo "fnm is $fnm" + +test -e $DHRLOGDIR/decodedhr_log_$Dte +FOUND=$? +if test FOUND -eq 1 +then + touch $DHRLOGDIR/decodedhr_log_$Dte +fi + +test -e $DHRLOGDIR/decodedhr_ctl +FOUND=$? +if test FOUND -eq 1 +then + touch $DHRLOGDIR/decodedhr_ctl +fi +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway + +AMIRUNNING_DIR=$(get_apps_defaults dhr_log_dir) +. $RFCLX/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo Run_DecodeDHR cancelled due to other instance running >> $fnm + exit 1 + fi + +# Check to see if age on file is more than 1 minute + runfreq=$((60)) + tnow=`date +%s` + tfile=`date +%s -r $ctlfnm` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -lt $runfreq ]] + then + exit 1 + else + touch $ctlfnm + fi + +#---------------------------------------------------------------------- + +# +# define delete messages written to log file +# + +delete_message=" product deleted" +no_delete_message=" product not deleted" + +# +# check for products in the gather directory +# if found, then decode +# note that products in the gather dir will not be decoded if they have "x" +# permission +# +echo "Log file: " $fnm + + for pname in `ls -1F $DHRPRODDIR | grep -v "*" | grep -v "/" ` + do + runso rary.ohd.pproc decode_dhr_dsp_main $DHRPRODDIR/$pname >> $fnm + +# +# return codes from decode_dhr_dsp +# +# 0 -- valid product (precip > 0 or supplemental message = "no precip detected") +# 1 -- valid product, no decoded file created +# (product not top-of-hour, supplemental message = "bad rate scan" etc) +# 2 -- invalid product +# (loss of data, unexpected EOF, invalid date or time, etc) +# 3 -- problem outside of product +# (error opening Informix db, error opening product) +# 4 -- radar not in radarloc table OR use_radar=F + + fstat=$? + if test $fstat -lt 3 + then + rm -f $DHRPRODDIR/$pname + fi + + if test $fstat -eq 2 + then + echo "$delete_message" >> $fnm + elif test $fstat -eq 3 + then + echo "$no_delete_message" >> $fnm + fi + + if test $fstat -eq 4 + then + rm -f $DHRPRODDIR/$pname + echo "$delete_message" >> $fnm + fi + + done +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDPA b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDPA new file mode 100755 index 0000000000..1f3ee3c466 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDPA @@ -0,0 +1,90 @@ +#!/bin/ksh +# +# this script gathers the DPA (Digital Precip Array) radar products +# into the proper directory and decodes them +# +# the decodedpa executable decodes the products +# +# a decoded radar product is a 131x131 array of REAL*4 values where each value +# represents the average hourly rainfall at the center of each bin +# +# beginning in OB3, the decoded radar products are in Little Endian format +# + +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + + +DPAPRODDIR=`get_apps_defaults dpa_prod_dir` +DPALOGDIR=`get_apps_defaults dpa_log_dir` +BIN_DIR=`get_apps_defaults pproc_bin` + +# +# set up log filename +# + +Dte=`date +%m%d%Y` +fnm=$DPALOGDIR/decodedpa_log_$Dte + +# +# define delete messages written to log file +# + +delete_message=" product deleted" +no_delete_message=" product not deleted" +file=$1 + +if [[ -e $file.LCK ]] + then + return +else + `touch $file.LCK` +fi + +runso rary.ohd.pproc decode_dpa_main $1 >> $fnm + +# +# return codes from decodedpa +# +# 0 -- valid product (precip > 0 or supplemental message = "no precip detected") +# 1 -- valid product, no decoded file created +# (product not top-of-hour, supplemental message = "bad rate scan" etc) +# 2 -- invalid product +# (loss of data, unexpected EOF, invalid date or time, etc) +# 3 -- problem outside of product +# (error opening database, error opening product) +# 4 -- radar not in radarloc table OR use_radar=F +# 5 -- problem converting raw product from Big Endian to Little Endian format +# (Linux only) + + fstat=$? +# echo "decode dpa return code for file: $1 " $fstat >> $fnm + if test $fstat -lt 3 + then + rm -f $file + rm -f $file.LE + fi + + if test $fstat -eq 2 + then + echo "$delete_message" >> $fnm + elif test $fstat -eq 3 + then + echo "$no_delete_message" >> $fnm + fi + + if test $fstat -eq 4 + then + rm -f $file + rm -f $file.LE + echo "$delete_message" >> $fnm + fi + if test $fstat -eq 5 + then + rm -f $file + rm -f $file.LE + echo "$delete_message" >> $fnm + fi +`rm $file.LCK` +exit $fstat \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDSP b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDSP new file mode 100755 index 0000000000..525d48a03a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDSP @@ -0,0 +1,122 @@ +#!/bin/ksh +# +# This script retrieves Digital Storm total Precipitation +# (DSP) radar products from the temporary data gathering directory +# and sends them to the decode_dhr_dsp executable for decoding. +# +# Adapted from the Run_DecodeDPA script +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env + + +export DSPPRODDIR=`get_apps_defaults dsp_prod_dir` +export DSPLOGDIR=`get_apps_defaults dsp_log_dir` + +# +# set up log filename +# + +Dte=`date +%m%d%Y` +fnm=$DSPLOGDIR/decodedsp_log_$Dte +ctlfnm=$DSPLOGDIR/decodedsp_ctl + +test -e $DSPLOGDIR/decodedsp_log_$Dte +FOUND=$? +if test FOUND -eq 1 +then + touch $DSPLOGDIR/decodedsp_log_$Dte +fi + +test -e $DSPLOGDIR/decodedsp_ctl +FOUND=$? +if test FOUND -eq 1 +then + touch $DSPLOGDIR/decodedsp_ctl +fi +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway + +AMIRUNNING_DIR=$(get_apps_defaults dsp_log_dir) + +. $RFCLX/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]]; then + echo Run_DecodeDSP cancelled due to other instance running >> $fnm + exit 1 + fi + +# Check to see if age on file is more than 1 minute + runfreq=$((60)) + tnow=`date +%s` + tfile=`date +%s -r $ctlfnm` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -lt $runfreq ]] + then + exit 1 + else + touch $ctlfnm + fi + +#---------------------------------------------------------------------- +# +# define delete messages written to log file +# + +delete_message=" product deleted" +no_delete_message=" product not deleted" + +# +# check for products in the gather directory +# if found, then decode +# note that products in the gather dir will not be decoded if they have "x" +# permission +# +echo "Log file: " $fnm + + for pname in `ls -1F $DSPPRODDIR | grep -v "*" | grep -v "/" ` + do + echo $pname + runso rary.ohd.pproc decode_dhr_dsp_main $DSPPRODDIR/$pname >> $fnm + + + +# +# return codes from decode_dhr_dsp +# +# 0 -- valid product (precip > 0 or supplemental message = "no precip detected") +# 1 -- valid product, no decoded file created +# (product not top-of-hour, supplemental message = "bad rate scan" etc) +# 2 -- invalid product +# (loss of data, unexpected EOF, invalid date or time, etc) +# 3 -- problem outside of product +# (error opening Informix db, error opening product) +# 4 -- radar not in radarloc table OR use_radar=F + + fstat=$? + if test $fstat -lt 3 + then + rm -f $DSPPRODDIR/$pname + fi + + if test $fstat -eq 2 + then + echo "$delete_message" >> $fnm + elif test $fstat -eq 3 + then + echo "$no_delete_message" >> $fnm + fi + + if test $fstat -eq 4 + then + rm -f $DSPPRODDIR/$pname + echo "$delete_message" >> $fnm + fi + + done +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/bias_trans.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/bias_trans.jar new file mode 100755 index 0000000000..aa93bc7535 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/bias_trans.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/gribit.LX b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/gribit.LX new file mode 100755 index 0000000000..0e61f132ac Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/gribit.LX differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql new file mode 100755 index 0000000000..0760e20080 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql @@ -0,0 +1,33 @@ +-- gather distinct lid,ts combinations from Location and Ingestfilter tables + +select l.lid, i.ts +into temp temptable +from location l, ingestfilter i +where l.lid = i.lid +and l.lat is not null +and l.lon is not null +and i.pe in ('PP', 'PC') +and substr(i.ts, 1, 1) = 'R' +and i.stg2_input = 'T' +group by 1, 2 +order by 1, 2; + + +-- add info from location table for the lid + +select + l.lid, + 'PPH'||t.ts||'ZZ', + to_char(l.lat,'99.99'), + to_char(l.lon,'999.99'), + case + when l.elev >= 0 then to_char(l.elev,'99999') + else ' -999' + end, + '9', + case + when l.name ISNULL then 'XXXXXXXXXX' + else l.name + end +from temptable t, location l +where t.lid=l.lid; diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/precip_station_gen.sql b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/precip_station_gen.sql new file mode 100755 index 0000000000..5493606c16 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/precip_station_gen.sql @@ -0,0 +1,43 @@ +-- gather distinct lid,ts combinations from HourlyPP, HourlyPC and DailyPP tables +-- do not include ts = P* + +select lid, ts +into temp temptable +from hourlypp +where substr(ts, 1, 1) != 'P' +group by 1,2 + +union + +select lid, ts +from hourlypc +where substr(ts, 1, 1) != 'P' +group by 1,2 + +union + +select lid, ts +from dailypp +where substr(ts, 1, 1) != 'P' +group by 1,2 +; + +-- add info from location table for the lid + +select + l.lid, + 'PPD'||t.ts||'ZZ', + to_char(l.lat,'99.99'), + to_char(l.lon,'999.99'), + case + when l.elev >= 0 then to_char(l.elev,'99999') + else ' -999' + end, + '9', + case + when l.name ISNULL then 'XXXXXXXXXX' + else l.name + end +from temptable t, location l +where t.lid=l.lid +order by l.lid asc; diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/prism.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/prism.jar new file mode 100755 index 0000000000..53b519d5ef Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/prism.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_dpa b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_dpa new file mode 100755 index 0000000000..498c2c4d2b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_dpa @@ -0,0 +1,103 @@ +#!/bin/ksh +# +# process_dpa +# +# October 10, 2000 +# run script for process dpa +# processes single file by decoding it +# +# Modified: Oct 29, 2001 Russ added OS_SUFFIX logic +# Nov 5, 2002 Mark removed read_dpainfo, bld_latest +# Sep 02, 2003 paul added delete of ".LE" (Little Endian) files +# +# check the input args +# currently, the bin_dir argument is not used. + +USAGE="process_dpa input_data_file output_log_file err_dir bin_dir" + +if [ $# -ne 4 ] +then + print -u2 "\nUSAGE: $USAGE\n" + exit 3 +fi + +# setup file names +# note: the bin directory arg is not used currently + +DATA_FNM=$1 +LOG_FNM=$2 +ERR_DIR=$3 + + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + + +# echo the current time +# +DTZ=`date -u +%a@%H:%M:%S` +echo "Decoding product: " $DTZ >> $LOG_FNM + + +# now run the decoder ************************************************* +# get and save the return status for later use. + +$PPROC_BIN/decodedpa$OS_SUFFIX $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM +#echo Awaiting proper decodedpa return codes >> $LOG_FNM +DECODE_STATUS=$? + +# +# now dispense of the input file accordingly and continue accoringly +# depending on the status of the decoding operation. +# + +if [ $DECODE_STATUS -eq 0 ] +then + echo Decode status=$DECODE_STATUS ok, removing file. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + rm -f $DATA_FNM.LE >> $LOG_FNM 2>>$LOG_FNM + +elif [ $DECODE_STATUS -eq 1 ] +then + echo Decode status=$DECODE_STATUS data unavailable, removing file. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + rm -f $DATA_FNM.LE >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 2 ] +then + echo Decode status=$DECODE_STATUS decode error, moving file to error dir. >> $LOG_FNM + mv -f $DATA_FNM $ERR_DIR >> $LOG_FNM 2>>$LOG_FNM + mv -f $DATA_FNM.LE $ERR_DIR >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 3 ] +then + echo Decode status=$DECODE_STATUS processing error, moving file to error dir. >> $LOG_FNM + mv -f $DATA_FNM $ERR_DIR >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 4 ] +then + echo Decode status=$DECODE_STATUS radar undefined or inactive, removing file. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + exit + +elif [ $DECODE_STATUS -eq 5 ] +then + echo Decode status=$DECODE_STATUS error converting raw product from Big Endian to Little Endian format. >> $LOG_FNM + rm -f $DATA_FNM >> $LOG_FNM 2>>$LOG_FNM + exit +fi + + +# +DTZ=`date -u +%a@%H:%M:%S` +echo "Completed job at: " $DTZ >> $LOG_FNM + +exit +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_dpafiles b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_dpafiles new file mode 100755 index 0000000000..3f6a8bb700 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_dpafiles @@ -0,0 +1,152 @@ +#!/bin/ksh +# +# process_dpafiles +# +# May 10, 2002 +# script for processing dpa products for the WHFS. +# +# the script takes the input data directory, +# output log directory, and bin directory as arguments. +# it is possible that the calling script may be redirecting +# all standard output from this script to the same log file. +# +# Modified: Nov 5, 2002 Mark removed update_latestFFG +# Aug 15, 2003 Paul - replaced "test -r" with "ls -1F ..." +# + +# check for input args +# + +USAGE="process_dpafiles input_data_dir output_log_dir output_error_dir bin_dir1 bin_dir2 " +if [ $# -ne 5 ] +then + print -u2 "\nUSAGE: $USAGE\n" + exit 1 +fi + + +# set some local variables +# the bin_dir1 arg is for the precip_proc/bin dir +# the bin_dir2 arg is for the whfs/bin dir, which is currently not used + +DATA_DIR=$1 +LOG_DIR=$2 +ERR_DIR=$3 +BIN_DIR1=$4 +BIN_DIR2=$5 + +# define the log file name + +LOG_FILE=$LOG_DIR/`date -u +process_dpa_log_%m%d` + +echo "Data directory: " $DATA_DIR >> $LOG_FILE +echo "Log directory: " $LOG_DIR >> $LOG_FILE +echo "Error directory:" $ERR_DIR >> $LOG_FILE +echo "Bin directory:" $BIN_DIR1 >> $LOG_FILE + +# +# define functions for checking for a stop file and +# logging a message. note that for the +# shell function "test", a true condition returns 0. + +checkDPAstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_dpadecode + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + return 1 + else + return 0 + fi +} + + +logDPAstop() +{ + LOG_FILE=$1 + + DTZ=`date -u` + echo "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> $LOG_FILE + echo "Terminating process." >> $LOG_FILE + echo "Stopfile found at:" $DTZ >> $LOG_FILE + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" >> $LOG_FILE + + return 0 +} + + +# +# enter an infinite loop. for each pass thru main loop, +# look for input files and process them individually. +# check for stop file after each loop and after any +# data file that may be processed. +# after the raw input file is processed, the called +# processing script handles the file (either deletes or moves it) +# + +let loop_cnt=0 + +while test 1=1 +do + +# define the log file name + +LOG_FILE=$LOG_DIR/`date -u +process_dpa_log_%m%d` + +# +# this script also performs a secondary function of +# creating the mosaicked FFG grids, and computing areal FFG values +# via the gen_areal_ffg processes. +# + +let loop_cnt=loop_cnt+1 +if ((loop_cnt > 12)) +then + DTZ=`date -u +%a@%H:%M:%S` + echo Running gen_areal_ffg. $DTZ >> $LOG_FILE + $BIN_DIR1/run_gen_areal_ffg + let loop_cnt=0 +fi + +checkDPAstop $DATA_DIR +STOP_FOUND=$? + +if test STOP_FOUND -eq 1 +then + logDPAstop $LOG_FILE + exit +fi + +FILES_FOUND=`ls -F $DATA_DIR | grep -v "*" | grep -v "/" | wc -l` +if test $FILES_FOUND -ne 0 +then + for DATA_FILE in `ls $DATA_DIR` + do + + checkDPAstop $DATA_DIR + STOP_FOUND=$? + if test STOP_FOUND -eq 1 + then + logDPAstop $LOG_FILE + exit + fi + + + #name=`basename $DATA_FILE` + echo "----------------" >> $LOG_FILE + echo Processing $DATA_DIR/$DATA_FILE >> $LOG_FILE + $BIN_DIR1/process_dpa $DATA_DIR/$DATA_FILE $LOG_FILE $ERR_DIR $BIN_DIR1 2>>$LOG_FILE + + done + +else + DTZ=`date -u +%a@%H:%M:%S` + echo "No files awaiting decoding at:" $DTZ >> $LOG_FILE + sleep 45 +fi + +done + + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_grib_files b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_grib_files new file mode 100755 index 0000000000..d202c0df5f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_grib_files @@ -0,0 +1,165 @@ +#!/bin/ksh +# process_grib_files + +# This script is called from MPE to create grib format files. If the +# mpe_d2d_display_grib token is set to "ON", then the grib file is copied to +# another directory and the notif_mpe.csh script is run. This script +# notifies the grib decoder that a file is available for decoding into netCDF +# format. The netCDF file will then be made available for display in D2D. + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +# This has been added to allow the D2D log dir variable to be defined. +# +# An addition for OB7.2, this script will create a separate set of +# GRIB files in the qpe_grib_sbn directory which have the sub center +# code set to the id of the sending office. GRIB files created in the +# standard qpe_grib directory have the sub center code set to 0. +# +# export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +# . $FXA_HOME/readenv.sh + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +export grib_bin_dir=$(get_apps_defaults pproc_bin) +export grib_out_dir=$(get_apps_defaults mpe_grib_dir) +export grib_in_dir=$(get_apps_defaults rfcwide_xmrg_dir) +export MPE_SEND_QPE_TO_SBN=$(get_apps_defaults mpe_send_qpe_to_sbn) +export MPE_QPE_SBN_DIR=$(get_apps_defaults mpe_qpe_sbn_dir) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export RFCWIDE_OUTPUT_DIR=$(get_apps_defaults rfcwide_output_dir) + +# +# Define input file name and output file name +# in_file=xmrg file name +# out_file=grib file name +# + +in_file=$1 +out_file=$2 +# +# Create log file name +# +griblog=$MPE_LOG_DIR/process_grib_files.log +tempname=$MPE_LOG_DIR/process_grib_files.tmp +# +#save only the latest in the log file +# +echo "-------------------------------" >> $griblog + +tail -1200 $griblog > $tempname +mv $tempname $griblog + +Dte=`date -u` +echo Starting process_grib_files at $Dte >> $griblog + +echo Input xmrg file $grib_in_dir/$in_file >> $griblog +echo Output grib file $grib_out_dir/$out_file >> $griblog + +# +# Run gribit to generate grib format file +# input to gribit is xmrg format file, output from gribit is grib format file +# grib_bin_dir is defined in set_hydro_env +# + +export grib_in_file=$in_file +export grib_out_file=$out_file + +# +# Force the subcenter code to 0 in the created GRIB message. +# +export grib_set_subcenter_0=on + +Dte=`date -u` +echo Invoking $grib_bin_dir/gribit at $Dte >> $griblog + +$grib_bin_dir/gribit.LX + +# +# At RFCs, a second version of the grib file needs to be created for +# transmission over the SBN. This version of the GRIB file will contain +# the code of the sending office. +# + +echo "The value of the mpe_send_qpe_to_sbn token is $MPE_SEND_QPE_TO_SBN" >> \ + $griblog + +if [[ $MPE_SEND_QPE_TO_SBN = "ON" || $MPE_SEND_QPE_TO_SBN = "on" ]] +then + + echo "Producing GRIB file for transmission over the SBN." >> $griblog +# +# Build the path to the qpe SBN grib directory. +# + export grib_in_dir=$MPE_QPE_SBN_DIR + export grib_out_dir=$MPE_QPE_GRIB_SBN_DIR +# +# This is important. Must make sure thet sub_center code is set to the +# sending RFC. + export grib_set_subcenter_0=off + echo "The subcenter code will be set to represent the sending office." >> \ + $griblog + echo Input xmrg file $grib_in_dir/$in_file >> $griblog + echo Output grib file $grib_out_dir/$out_file >> $griblog + +# +# Call gribit +# + Dte=`date -u` + echo Invoking $grib_bin_dir/gribit at $Dte >> $griblog + $grib_bin_dir/gribit.LX + +fi + +# +# If token set to ON, then +# (1) Copy grib file to temp file +# (2) mv temp file to $d2d_grib_dir to ensure that file is complete +# (3) Rename file by adding DDHHMMSS of creation time to name +# (4) Run script notif_mpe.csh +# + +D2D_DISPLAY=$(get_apps_defaults mpe_d2d_display_grib) + +echo Token mpe_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + +if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $RFCWIDE_OUTPUT_DIR/qpe_grib/$out_file >> $griblog + echo to $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp >> $griblog + cp $RFCWIDE_OUTPUT_DIR/qpe_grib/$out_file $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp >> $griblog 2>&1 + + echo Move and rename grib file $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $RFCWIDE_OUTPUT_DIR/qpe_grib/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + +# echo Invoking $FXA_BIN_DIR/notif_mpe.csh >> $griblog +# $FXA_BIN_DIR/notif_mpe.csh + +else + echo Grib files are not converted to netCDF files to display on D2D >> $griblog + +fi + + +# +# If token set to ON, then send file to NPVU +# + +#SEND_GRIB=$(get_apps_defaults mpe_send_grib) +#if [[ $SEND_GRIB = "ON" || $SEND_GRIB = "on" ]]; then + +#fi + +Dte=`date -u` +echo Completed process_grib_files at $Dte >> $griblog diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_hpe_grib_files b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_hpe_grib_files new file mode 100755 index 0000000000..5303433502 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_hpe_grib_files @@ -0,0 +1,280 @@ +#!/bin/ksh +# process_hpe grib_files + +# This script is called to create grib format files for the +# High-resolution Precipitation Estimator (HPE). These +# are local xmrg mosaic files and will be converted to AWIPS GRIB1 +# format for conversion into AWIPS netCDF and display in D2D. If the +# *_d2d_display_grib token is set to "ON", then the grib file is copied to +# another directory and the notif_mpe.csh script is run. This script +# notifies the grib decoder that a file is available for decoding into netCDF +# format. The netCDF file will then be made available for display in D2D. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +export grib_bin_dir=$(get_apps_defaults pproc_bin) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + +in_file=$1 +out_file=$2 +process=$3 +# +# Create log file name +# + +griblog=$HPE_LOG_DIR/process_grib_files.log +tempname=$HPE_LOG_DIR/process_grib_files.tmp + +# +#save only the latest in the log file +# +echo "-------------------------------" >> $griblog + +tail -1200 $griblog > $tempname +mv $tempname $griblog + +Dte=`date -u` +echo Starting process_hpe_grib_files at $Dte >> $griblog + +if [[ $process = DHR* ]] +then + + export HPE_DHRMOSAIC_DIR=$(get_apps_defaults hpe_dhrmosaic_dir) + export HPE_DHRMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_dhrmosaic_grib_dir) + echo $HPE_DHRMOSAIC_DIR >> $griblog + echo $HPE_DHRMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_DHRMOSAIC_DIR + export grib_out_dir=$HPE_DHRMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_DHRMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_DHRMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = BDHR* ]] +then + + export HPE_BDHRMOSAIC_DIR=$(get_apps_defaults hpe_bdhrmosaic_dir) + export HPE_BDHRMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_bdhrmosaic_grib_dir) + echo $HPE_BDHRMOSAIC_DIR >> $griblog + echo $HPE_BDHRMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_BDHRMOSAIC_DIR + export grib_out_dir=$HPE_BDHRMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_BDHRMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_BDHRMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = BDSP* ]] +then + + export HPE_EBMOSAIC_DIR=$(get_apps_defaults hpe_ebmosaic_dir) + export HPE_EBMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_ebmosaic_grib_dir) + echo $HPE_EBMOSAIC_DIR >> $griblog + echo $HPE_EBMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_EBMOSAIC_DIR + export grib_out_dir=$HPE_EBMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_EBMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_EBMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = DSP* ]] +then + + if [[ $in_file = ERMOSAIC*z ]] + then + + export HPE_ERMOSAIC_DIR=$(get_apps_defaults hpe_ermosaic_dir) + elif [[ $in_file = MAXRMOSAIC*z ]] + then + + export HPE_ERMOSAIC_DIR=$(get_apps_defaults hpe_max_ermosaic_dir) + elif [[ $in_file = AVGRMOSAIC*z ]] + then + + export HPE_ERMOSAIC_DIR=$(get_apps_defaults hpe_avg_ermosaic_dir) + else + echo "Incorrect RMOSAIC filename. Should be ER, AVGR, or MAXRMOSAIC " >> $griblog + exit 1 + fi + export HPE_ERMOSAIC_GRIB_DIR=$(get_apps_defaults hpe_ermosaic_grib_dir) + echo $HPE_ERMOSAIC_DIR >> $griblog + echo $HPE_ERMOSAIC_GRIB_DIR >> $griblog + export grib_in_dir=$HPE_ERMOSAIC_DIR + export grib_out_dir=$HPE_ERMOSAIC_GRIB_DIR + echo Input xmrg file $HPE_ERMOSAIC_DIR/$in_file >> $griblog + echo Output grib file $HPE_ERMOSAIC_GRIB_DIR/$out_file >> $griblog +elif [[ $process = BTP* ]] +then + + echo "Nowcast process flag passed to script. $process - exiting..." >> $griblog + exit 1 +elif [[ $process = BPRT* ]] +then + + echo "Nowcast process flag passed to script. $process - exiting..." >> $griblog + exit 1 +else + echo "Unknown process flag passed to script. exiting..." >> $griblog + exit 1 +fi + + +# +# Run gribit to generate grib format file +# input to gribit is xmrg format file, output from gribit is grib format file +# grib_bin_dir is defined in set_hydro_env +# + +export grib_in_file=$in_file +export grib_out_file=$out_file + +# +# Force the subcenter code to 0 in the created GRIB message. +# +export grib_set_subcenter_0=on + +Dte=`date -u` +echo Invoking $grib_bin_dir/gribit at $Dte >> $griblog + +$grib_bin_dir/gribit.LX >> $griblog + +#runso rary.ohd.pproc gribit_main_main_ + +if [[ $process = DHR* ]] +then + + D2D_DISPLAY=$(get_apps_defaults dhrmosaic_d2d_display_grib) + + echo Token dhrmosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_DHRMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_DHRMOSAIC_GRIB_DIR/$out_file $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_DHRMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_DHRMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo DHR Mosaic Grib files were not created for display on D2D >> $griblog + + fi +elif [[ $process = BDHR* ]] +then + + D2D_DISPLAY=$(get_apps_defaults bdhrmosaic_d2d_display_grib) + + echo Token bdhrmosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_BDHRMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_BDHRMOSAIC_GRIB_DIR/$out_file $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_BDHRMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_BDHRMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo BDHR Mosaic Grib files were not created for display on D2D >> $griblog + + fi +elif [[ $process = BDSP* ]] +then + + D2D_DISPLAY=$(get_apps_defaults ebmosaic_d2d_display_grib) + + echo Token ebmosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_EBMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_EBMOSAIC_GRIB_DIR/$out_file $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_EBMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_EBMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo EB Mosaic Grib files were not created for display on D2D >> $griblog + + fi +elif [[ $process = DSP* ]] +then + + D2D_DISPLAY=$(get_apps_defaults ermosaic_d2d_display_grib) + + echo Token ermosaic_d2d_display_grib is defined as $D2D_DISPLAY >> $griblog + + if [[ $D2D_DISPLAY = "ON" || $D2D_DISPLAY = "on" ]]; then + + new_string=`date -u +%d%H%M%S` + new_file_name=ZETA98_${out_file%.*}_$new_string.grib + + INPUT_DIR=$(get_apps_defaults d2d_input_dir) + + echo Copy grib file $HPE_ERMOSAIC_GRIB_DIR/$out_file >> $griblog + echo to $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + cp $HPE_ERMOSAIC_GRIB_DIR/$out_file $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog 2>&1 + + if [[ -s $HPE_ERMOSAIC_GRIB_DIR/$out_file ]]; + then + echo Move and rename grib file $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp >> $griblog + echo to $INPUT_DIR/$new_file_name >> $griblog + mv $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp $INPUT_DIR/$new_file_name >> $griblog 2>&1 + + else + echo Not moving grib file, zero bytes, removing temp file. >> $griblog + rm $HPE_ERMOSAIC_GRIB_DIR/gribfile.tmp + fi + + else + echo ER Mosaic Grib files were not converted to netCDF files to display on D2D >> $griblog + + fi +else + + echo HPE Grib files were not moved to display on D2D >> $griblog + +fi +Dte=`date -u` +echo Completed process_hpe_grib_files at $Dte >> $griblog +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_rfc_bias b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_rfc_bias new file mode 100755 index 0000000000..b635bed868 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/process_rfc_bias @@ -0,0 +1,103 @@ +#!/bin/ksh +# +############################################################################### +# FILENAME: process_rfc_bias +# DESCRIPTION: This script is invoked via the message handling service (MHS) +# mechanisms. It is called when a rfc bias message file +# from a RFC is received at the local WFO. This script copies +# this file to a local directory where it is then processed +# by the process_rfc_bias program. +# +# The MHS places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# This script copies this file to the directory: +# /awips/hydroapps/precip_proc/local/data/rfc_bias_input +# +# +# The arguments to this script are provided via the +# message handling system (MHS) and are translated +# from the MHS args %ENCLOSE(1) %SUBJECT %MSGTYPE +# +# +# USAGE: process_rfc_bias filename subject_string msgtype +# +# AUTHOR: Bryon Lawrence +# CREATION DATE: April 5, 2007 +# ORGANIZATION: OHD-11/HSEB +# MACHINE/SHELL: Korn shell +# MODIFICATION HISTORY: +# DATE PROGRAMMER DESCRIPTION/REASON +# 4/5/2007 B. Lawrence Created. +################################################################################ +# + +# This allows this script to be run from outside of the bin directory +RUN_FROM_DIR=`dirname $0` + +# Set up the WHFS runtime environment +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh +. $RUN_FROM_DIR/../../set_hydro_env +export RFC_BIAS_INPUT_DIR=$(get_apps_defaults rfc_bias_input_dir) +export PROCESS_BIAS_LOG_DIR=$(get_apps_defaults process_bias_log_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +export CLASSPATH=$DB_DRIVER_PATH:$PPROC_BIN/bias_trans.jar + +# Prepare the log file. +process_bias_log=`date +$PROCESS_BIAS_LOG_DIR/process_rfc_bias_%m%d` + +echo "--------------------------------------------------" >> $process_bias_log +echo "Starting process_rfc_bias as $LOGNAME at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") on $HOSTNAME" >> $process_bias_log + +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 + +echo "The filename supplied by the MHS: $FILENAME" >> $process_bias_log +echo "The subject line supplied by the MHS: $SUBJECT" >> $process_bias_log +echo "The type of message supplied by the MHS: $MSGTYPE" >> $process_bias_log + +# +# Use a shell function to extract the argument from the subject line +# the subject string is a quoted string with a filename, followed +# by a space, followed by the product identifier. +parseSubject() +{ + DESCRIP=$1 + PRODUCTID=$2 + return +} + +# +# Create the destination filename and path. +parseSubject $SUBJECT +DATESTR=`date -u +%m%d` +TIMESTR=`date -u +%H%M%S` +DESTINATION_FILENAME=$RFC_BIAS_INPUT_DIR/$PRODUCTID.$DATESTR.$TIMESTR + +# +# Copy the MHS rfc bias file to the rfc_bias_input directory +echo "Copying $FILENAME to $DESTINATION_FILENAME" >> $process_bias_log +cp -f $FILENAME $DESTINATION_FILENAME >> $process_bias_log 2>&1 + +if [[ $? -ne 0 ]] +then + echo "The copy of $FILENAME to $DESTINATION_FILENAME failed." >> \ + $process_bias_log + exit 1 +fi + +# +# Start the process_rfc_bias.LX program +echo "Starting the bias message reading program" >> $process_bias_log +echo "${SYS_JAVA_DIR}/bin/java ohd.hseb.bias_trans/BiasMessageReader $JDBCURL $DESTINATION_FILENAME" >> $process_bias_log + +${SYS_JAVA_DIR}/bin/java ohd.hseb.bias_trans/BiasMessageReader $JDBCURL \ + $DESTINATION_FILENAME >> $process_bias_log 2>&1 +# +# Remove the bias message file +rm -f $DESTINATION_FILENAME >> $process_bias_log 2>&1 + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/purge_hpe_files b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/purge_hpe_files new file mode 100755 index 0000000000..d461518561 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/purge_hpe_files @@ -0,0 +1,494 @@ +#! /bin/ksh +# purge_hpe_files +# This script purges HPE (High-resolution Precipitation Estimator) files +# according to retention period requirements. + +# David T. Miller RSIS OHD/HSEB +# October 30 2007 (adapted from purge_mpe_files) + +# This allows you to run this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOme environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export DSP_LOG_DIR=$(get_apps_defaults dsp_log_dir) +export DHR_LOG_DIR=$(get_apps_defaults dhr_log_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export PPROC_LOCAL_DATA=$(get_apps_defaults pproc_local_data) + +HPELOGS=$HPE_LOG_DIR + +hpe_purge_error=`date -u +error_hpepurge.%Y%m%d%H%M%S` + +if [[ -d $HPELOGS ]] +then +# set errorlog + + errorlog=$HPELOGS/$hpe_purge_error + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) + +# +# get purge file settings + + LOGAGE=`get_apps_defaults hpe_purge_logage` + FILEAGE=`get_apps_defaults hpe_purge_fileage` + XMRGAGE=`get_apps_defaults hpe_purge_xmrgage` + +# set defaults should the tokens above be missing or set incorrectly + + if [[ $LOGAGE -le 0 ]] + then + LOGAGE=720 + fi + + if [[ $FILEAGE -le 0 ]] + then + FILEAGE=180 + fi + + if [[ $XMRGAGE -le 0 ]] + then + XMRGAGE=75 + fi + +# remove empty error logs + + if [[ ! -s $errorlog ]] + then + rm -f $errorlog + fi + + Dte=`date -u` + + # Setup file names + # + fnm=$HPELOGS/purge_hpe_files.log + tmp=$HPELOGS/purge_hpe_files.tmp + +echo `basename $0` log location: $fnm + + # Save only the latest events in the log file + # +if [ -e "${fnm}" ] +then + tail -1200 $fnm > $tmp + mv $tmp $fnm + chmod 777 $fnm +fi + + + # Log a header line to the output file + # + echo "----------------------------------------------------" >> $fnm + echo "Begin purge_hpe_files at: " $Dte >> $fnm + +else + echo "HPE log directory $HPELOGS incorrect " >> $errorlog + echo "Check .Apps_defaults and set_hydro_env for correctness " >> $errorlog + echo "purge_hpe_files exiting with error " >> $errorlog + exit 1 +fi + +# Note that the line below is the way this should be established +# However, since files are being purged, best to hard code to ensure +# that the files to be deleted are the correct ones + +#HPE_OUTPUT_DIR=$PPROC_LOCAL_DATA/hpe +HPE_OUTPUT_DIR=${apps_dir}/precip_proc/local/data/hpe + +if [[ -d $HPE_OUTPUT_DIR ]] +then + HPEHEIGHT=$HPE_OUTPUT_DIR/height + HPEINDEX=$HPE_OUTPUT_DIR/index + HPEDHRMOSAIC=$HPE_OUTPUT_DIR/dhrmosaic + HPEERMOSAIC=$HPE_OUTPUT_DIR/ermosaic + HPEEBMOSAIC=$HPE_OUTPUT_DIR/ebmosaic + HPEBDHRMOSAIC=$HPE_OUTPUT_DIR/bdhrmosaic + HPEAVGMOSAIC=$HPE_OUTPUT_DIR/avgrmosaic + HPEMAXMOSAIC=$HPE_OUTPUT_DIR/maxrmosaic + HPENOWCAST=$HPE_OUTPUT_DIR/nowcast + + + HPEDHRGRIB=$HPEDHRMOSAIC/grib + HPEDHRNETCDF=$HPEDHRMOSAIC/netcdf + HPEDHRGIF=$HPEDHRMOSAIC/gif + + HPEBDHRGRIB=$HPEBDHRMOSAIC/grib + HPEBDHRNETCDF=$HPEBDHRMOSAIC/netcdf + HPEBDHRGIF=$HPEBDHRMOSAIC/gif + + HPEERGRIB=$HPEERMOSAIC/grib + HPEERNETCDF=$HPEERMOSAIC/netcdf + HPEERGIF=$HPEERMOSAIC/gif + + HPEEBGRIB=$HPEEBMOSAIC/grib + HPEEBNETCDF=$HPEEBMOSAIC/netcdf + HPEEBGIF=$HPEEBMOSAIC/gif +else + echo "HPE directory $HPE_OUTPUT_DIR not valid. " >> $fnm + echo "Check for correct directory name " >> $fnm + + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm + + echo "Exiting purge_hpe_files with error at: " $Dte >> $fnm + + exit 1 +fi + + +DHRXMRG=${apps_dir}/precip_proc/local/data/dhr_decoded +DHRARCHIVE=${apps_dir}/precip_proc/local/data/dhr_archive +DHRERROR=${apps_dir}/precip_proc/local/data/dhr_error + + +DSPXMRG=${apps_dir}/precip_proc/local/data/dsp_decoded +DSPARCHIVE=${apps_dir}/precip_proc/local/data/dsp_archive +DSPERROR=${apps_dir}/precip_proc/local/data/dsp_error + +# Note kept these lines in case there's enough confidence to +# use the $PPROC_LOCAL_DATA value +# But with purging, must ensure what's purged is what was +# meant to be. + +#DHRXMRG=$PPROC_LOCAL_DATA/dhr_decoded +#DHRARCHIVE=$PPROC_LOCAL_DATA/dhr_archive +#DHRERROR=$PPROC_LOCAL_DATA/dhr_error + + +#DSPXMRG=$PPROC_LOCAL_DATA/dsp_decoded +#DSPARCHIVE=$PPROC_LOCAL_DATA/dsp_archive +#DSPERROR=$PPROC_LOCAL_DATA/dsp_error + +# Purge hpe log files generated by hpe_fieldgen +# + +echo " " >> $fnm +echo " hpe_fieldgen log files " >> $fnm + +if [[ -d $HPELOGS && -n "$HPELOGS" ]] +then + find $HPELOGS -type f -name 'HPE*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm + find $HPELOGS -type f -name 'error.*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm + find $HPELOGS -type f -name 'print.*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE LOG DIR not valid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm + exit 1 +fi + +if [[ -d $DHR_LOG_DIR && -n "$DHR_LOG_DIR" ]] +then + find $DHR_LOG_DIR -type f -name 'decodedhr*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DHR LOG DIR not valid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $DSP_LOG_DIR && -n "$DSP_LOG_DIR" ]] +then + find $DSP_LOG_DIR -type f -name 'decodedsp*' -mmin +$LOGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DSP LOG DIR not valid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +#Purge hpe gridded field files +# + +echo " " >> $fnm +echo " hpe gridded field files " >> $fnm + +if [[ -d $HPEHEIGHT && -n "$HPEHEIGHT" ]] +then + find $HPEHEIGHT -type f -name '*HEIGHT*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE height directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEINDEX && -n "$HPEINDEX" ]] +then + find $HPEINDEX -type f -name '*INDEX*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE index directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEDHRMOSAIC && -n "$HPEDHRMOSAIC" ]] +then + find $HPEDHRMOSAIC -type f -name 'DHRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRMOSAIC && -n "$HPEBDHRMOSAIC" ]] +then + find $HPEBDHRMOSAIC -type f -name 'BDHRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEERMOSAIC && -n "$HPEERMOSAIC" ]] +then + find $HPEERMOSAIC -type f -name 'ERMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE ER Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEAVGMOSAIC && -n "$HPEAVGMOSAIC" ]] +then + find $HPEAVGMOSAIC -type f -name 'AVGRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE AVG Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEMAXMOSAIC && -n "$HPEMAXMOSAIC" ]] +then + find $HPEMAXMOSAIC -type f -name 'MAXRMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE MAX Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBMOSAIC && -n "$HPEEBMOSAIC" ]] +then + find $HPEEBMOSAIC -type f -name 'EBMOSAIC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi +if [[ -d $HPENOWCAST && -n "$HPENOWCAST" ]] +then + find $HPENOWCAST -type f -name 'BPRT*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'BPRT*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + find $HPENOWCAST -type f -name 'PRT*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'PRT*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + find $HPENOWCAST -type f -name 'ACC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'ACC*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + find $HPENOWCAST -type f -name 'BACC*z' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPENOWCAST -type f -name 'BACC*z.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + + +else + echo "HPE Nowcast directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" >> $fnm +# exit 1 +fi + + +if [[ -d $HPEDHRGRIB && -n "$HPEDHRGRIB" ]] +then + find $HPEDHRGRIB -type f -name 'DHRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEDHRNETCDF && -n "$HPEDHRNETCDF" ]] +then + find $HPEDHRNETCDF -type f -name 'DHRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEDHRGIF && -n "$HPEDHRGIF" ]] +then + find $HPEDHRGIF -type f -name 'DHRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE DHR Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRGRIB && -n "$HPEBDHRGRIB" ]] +then + find $HPEBDHRGRIB -type f -name 'BDHRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRNETCDF && -n "$HPEBDHRNETCDF" ]] +then + find $HPEBDHRNETCDF -type f -name 'BDHRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEBDHRGIF && -n "$HPEBDHRGIF" ]] +then + find $HPEBDHRGIF -type f -name 'BDHRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE Bias DHR Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEERGRIB && -n "$HPEERGRIB" ]] +then + find $HPEERGRIB -type f -name 'ERMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGRIB -type f -name 'AVGRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGRIB -type f -name 'MAXRMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + +else + echo "HPE ER Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEERNETCDF && -n "$HPEERNETCDF" ]] +then + find $HPEERNETCDF -type f -name 'ERMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERNETCDF -type f -name 'AVGRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERNETCDF -type f -name 'MAXRMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + +else + echo "HPE ER Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEERGIF && -n "$HPEERGIF" ]] +then + find $HPEERGIF -type f -name 'ERMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGIF -type f -name 'AVGRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + find $HPEERGIF -type f -name 'MAXRMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm + +else + echo "HPE ER Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBGRIB && -n "$HPEEBGRIB" ]] +then + find $HPEEBGRIB -type f -name 'EBMOSAIC*.grib' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic GRIB directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBNETCDF && -n "$HPEEBNETCDF" ]] +then + find $HPEEBNETCDF -type f -name 'EBMOSAIC*.nc' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic NetCDF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $HPEEBGIF && -n "$HPEEBGIF" ]] +then + find $HPEEBGIF -type f -name 'EBMOSAIC*.gif' -mmin +$FILEAGE -print -exec rm {} \; \ + >> $fnm +else + echo "HPE EB Mosaic GIF directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $DHRXMRG && -n "$DHRXMRG" ]] +then + find $DHRXMRG -type f -name 'DHR*Z' -mmin +$XMRGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DHR XMRG directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + +if [[ -d $DSPXMRG && -n "$DSPXMRG" ]] +then + find $DSPXMRG -type f -name 'DSP*Z' -mmin +$XMRGAGE -print -exec rm {} \; \ + >> $fnm +else + echo "DSP XMRG directory invalid. " >> $fnm + echo "Check .Apps_defaults settings or set_hydro_env script" \ + >> $fnm +# exit 1 +fi + + +Dte=`date -u` +echo "End purge_hpe_files at: " $Dte >> $fnm + +exit 0 + +#End of purge_hpe_files diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/purge_mpe_files b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/purge_mpe_files new file mode 100755 index 0000000000..041fefef2d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/purge_mpe_files @@ -0,0 +1,293 @@ +#! /bin/ksh +# purge_mpe_files +# This script purges mpe (Multi-sensor-Precipitation Estimator)files +# History: Deng, Jingtao August 09, 2001 +# modified by P. Tilles 4/22/2002 +# - removed stage3 directories +# - added jpeg, netCDF, grib directories +# modified by P. Tilles 10/2002 +# - added DISAGG_LOG_DIR purge +# modified by P. Tilles 9/2003 +# - added LIGHTNING_LOG_DIR purge +# March 9 2004 - added purge of mlmosaic files - pst +# March 25 2004 - added purge of lsatpre files - pst +# - removed delete from satel_precip dir +# March 30 2004 - added purge of state var files +# for local bias corr satellite - pst +# May 5, 2006 - Modified to fix mistakes made in logic +# to purge MAXRMOSAIC, AVGRMOSAIC, and +# P3LMOSAIC fields. Added logic to purge +# GAGETRIANGLES. +# May 5, 2006 - Modified to purge DailyQC files. +# Nov 17, 2006 - Modified to purge sbn grib and sbn qpe directories. +# May 2007 - Added SRG related fields (3 new fields) +# - added "-type f" to all find commands +# - added directories for RFC bias transfer RFC bias fields +# Sep 2007 - removed stray "i" from delete on FREEZEGRID directory +# Nov 2007 - added purge of disagg logs from mpe_editor dir +# - changed purge of mpe_fieldgen logs to purge filenames mpe_* +# Dec 2007 - removed purge of old disagg logs from old disagg app +# Jan 2008 - added purge of DailyQC freezing level preprocessor logs. + +# This allows you to run this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# set up some environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export LIGHTNING_LOG_DIR=$(get_apps_defaults lightning_log_dir) +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export MPE_QPE_SBN_DIR=$(get_apps_defaults mpe_qpe_sbn_dir) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) +export MPE_GAGEQC_DIR=$(get_apps_defaults mpe_gageqc_dir) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export RFCWIDE_OUTPUT_DIR=$(get_apps_defaults rfcwide_output_dir) +export PPROC_LOG=$(get_apps_defaults pproc_log) + +# +# Define directories for MPE data. +MPELOGS=$MPE_LOG_DIR +MPEEDITLOGS=$PPROC_LOG/mpe_editor +RFCBIASLOGS=$PPROC_LOG/process_bias_message +GAQLOGS=$GAQ_LOG_DIR + +GAGETRIANGLES=$RFCWIDE_OUTPUT_DIR/gagetriangles +RWHEIGHT=$RFCWIDE_OUTPUT_DIR/height +RWINDEX=$RFCWIDE_OUTPUT_DIR/index +MAXRMOSAIC=$RFCWIDE_OUTPUT_DIR/maxrmosaic +AVGRMOSAIC=$RFCWIDE_OUTPUT_DIR/avgrmosaic +P3LMOSAIC=$RFCWIDE_OUTPUT_DIR/p3lmosaic +RWBMOSAIC=$RFCWIDE_OUTPUT_DIR/bmosaic +RWRMOSAIC=$RFCWIDE_OUTPUT_DIR/rmosaic +RWMMOSAIC=$RFCWIDE_OUTPUT_DIR/mmosaic +RWMLMOSAIC=$RFCWIDE_OUTPUT_DIR/mlmosaic +RWLSATPRE=$RFCWIDE_OUTPUT_DIR/lsatpre +RWLMOSAIC=$RFCWIDE_OUTPUT_DIR/lmosaic +RWLOCSPAN=$RFCWIDE_OUTPUT_DIR/locspan +RWLOCBIAS=$RFCWIDE_OUTPUT_DIR/locbias +RWSTATEVAR=$RFCWIDE_OUTPUT_DIR/state_var +RWSATSTVAR=$RFCWIDE_OUTPUT_DIR/sat_state_var +RWGAG=$RFCWIDE_OUTPUT_DIR/gageonly +RWXMRG=$RFCWIDE_OUTPUT_DIR/qpe +RWDRAWPRECIP=$RFCWIDE_OUTPUT_DIR/draw_precip + +MPESRMOSAIC=$RFCWIDE_OUTPUT_DIR/srmosaic +MPESGMOSAIC=$RFCWIDE_OUTPUT_DIR/sgmosaic +MPESRGMOSAIC=$RFCWIDE_OUTPUT_DIR/srgmosaic + +MPERFCBMOSAIC=$RFCWIDE_OUTPUT_DIR/rfcbmosaic +MPERFCMMOSAIC=$RFCWIDE_OUTPUT_DIR/rfcmmosaic + +MPEGIF=$RFCWIDE_OUTPUT_DIR/qpe_gif +MPEGRIB=$RFCWIDE_OUTPUT_DIR/qpe_grib +MPEGRIBSBN=$MPE_QPE_GRIB_SBN_DIR +MPEQPESBN=$MPE_QPE_SBN_DIR +MPEJPEG=$RFCWIDE_OUTPUT_DIR/qpe_jpeg +MPENETCDF=$RFCWIDE_OUTPUT_DIR/qpe_netcdf + +LIGHTNING_LOG=$LIGHTNING_LOG_DIR + +RFCQPETEMP=$RFCWIDE_OUTPUT_DIR/rfcqpe_temp +RFCQPE01=$RFCWIDE_OUTPUT_DIR/rfcqpe01 +RFCQPE06=$RFCWIDE_OUTPUT_DIR/rfcqpe06 +RFCQPE24=$RFCWIDE_OUTPUT_DIR/rfcqpe24 + +RFCBIASINDIR=$RFCWIDE_OUTPUT_DIR/bias_message_input +RFCBIASOUTDIR=$RFCWIDE_OUTPUT_DIR/bias_message_output + +# +# Define directories for DailyQC data +SCRATCH=$MPE_GAGEQC_DIR/scratch + +PRECIPPOINT=$MPE_GAGEQC_DIR/precip/point +PRECIPMAP=$MPE_GAGEQC_DIR/precip/MAP +PRECIPGRID=$MPE_GAGEQC_DIR/precip/grid +PRECIPBAD=$MPE_GAGEQC_DIR/precip/bad +PRECIPDEV=$MPE_GAGEQC_DIR/precip/dev + +TEMPPOINT=$MPE_GAGEQC_DIR/temperature/point +TEMPMAT=$MPE_GAGEQC_DIR/temperature/MAT +TEMPGRID=$MPE_GAGEQC_DIR/temperature/grid +TEMPBAD=$MPE_GAGEQC_DIR/temperature/bad +TEMPDEV=$MPE_GAGEQC_DIR/temperature/dev + +FREEZEPOINT=$MPE_GAGEQC_DIR/freezing_level/point +FREEZEMAZ=$MPE_GAGEQC_DIR/freezing_level/MAZ +FREEZEGRID=$MPE_GAGEQC_DIR/freezing_level/grid + +Dte=`date -u` + +# Setup file names +# +fnm=$PPROC_LOG/misc/purge_mpe_files.log +tmp=$PPROC_LOG/misc/purge_mpe_files.tmp + +echo `basename $0` log location: $fnm + +# Save only the latest events in the log file +# +if [ -e "${fnm}" ] +then + tail -1200 $fnm > $tmp + mv $tmp $fnm + chmod 777 $fnm +fi + + +# Log a header line to the output file +# +echo "----------------------------------------------------" >> $fnm +echo "Begin purge_mpe_files at: " $Dte >> $fnm + + +# Purge mpe log files generated by mpe_fieldgen +# + +echo " " >> $fnm +echo " mpe_fieldgen log files " >> $fnm +find $MPELOGS -name 'mpe_*' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPELOGS -name 'error.*' -type f -mtime +10 -print -exec rm {} \; \ +>> $fnm + +find $MPEEDITLOGS -name 'disagg*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm +find $MPEEDITLOGS -name 'mpe_editor*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm +find $MPEEDITLOGS -name 'mpe_pre*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm +find $MPEEDITLOGS -name 'freez*' -type f -mtime +2 -print -exec rm {} \; \ +>> $fnm + + +find $GAQLOGS -name 'process_qpe*' -type f -mtime +3 -print -exec rm {} \; \ +>> $fnm +find $GAQLOGS -name 'transmit_rfc*' -type f -mtime +3 -print -exec rm {} \; \ +>> $fnm + + + +#Purge mpe gridded field files older than 2 days +#For gif/jpeg/grib/netcdf and state variables, purge files older than 1 day +# +echo " " >> $fnm +echo " mpe gridded field files " >> $fnm +find $RWMMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLSATPRE -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWMLMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWBMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLOCSPAN -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $P3LMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $GAGETRIANGLES -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $AVGRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MAXRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWLOCBIAS -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWSTATEVAR -name '*z' -type f -mtime +0 -print -exec rm {} \; \ +>> $fnm +find $RWSATSTVAR -name '*z' -type f -mtime +0 -print -exec rm {} \; \ +>> $fnm +find $RWHEIGHT -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWINDEX -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWGAG -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWXMRG -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $RWDRAWPRECIP -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPEQPESBN -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +find $MPESRMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPESGMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm +find $MPESRGMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ +>> $fnm + +find $MPEGIF -name '*.gif' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPEGRIB -name '*.grib' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPEGRIBSBN -name '*.grib' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPEJPEG -name '*.jpg' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm +find $MPENETCDF -name '*.nc' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm + +find $LIGHTNING_LOG -name 'lightning_proc*' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +# +# Purge the GageQC directories +find $PRECIPPOINT -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPGRID -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPMAP -name 'map*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPBAD -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $PRECIPDEV -name 'precip*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm + +find $TEMPPOINT -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPGRID -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPMAT -name 'mat*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPBAD -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $TEMPDEV -name 'temp*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm + +find $FREEZEPOINT -name 'freez*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $FREEZEGRID -name 'freez*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm +find $FREEZEMAZ -name 'maz*' -type f -mtime +20 -print -exec rm {} \; \ + >> $fnm + +find $SCRATCH -name 'pcp.*' -type f -mtime +0 -print -exec rm {} \; \ + >> $fnm + +find $RFCQPETEMP -name '*[A-Z]*' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCQPE01 -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCQPE06 -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCQPE24 -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +find $RFCBIASLOGS -name '*[0-9]' -type f -mtime +3 -print -exec rm {} \; \ + >> $fnm +find $MPERFCBMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $MPERFCMMOSAIC -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCBIASINDIR -name '*[0-9]' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm +find $RFCBIASOUTDIR -name '*z' -type f -mtime +1 -print -exec rm {} \; \ + >> $fnm + +Dte=`date -u` +echo "End purge_mpe_files at: " $Dte >> $fnm + +#End of purge_mpe_files diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/rerun_mpe_fieldgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/rerun_mpe_fieldgen new file mode 100755 index 0000000000..c047ad068f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/rerun_mpe_fieldgen @@ -0,0 +1,30 @@ +#!/bin/ksh +# rerun_mpe_fieldgen +# updated July 11, 2007 to remove +# call to build_hourly. +# +# Updated March 18, 2008 to remove the call to MPE Fieldgen and error +# log information which is not used. Also removed commented out +# call to set_hydro_env to clean up this script some more. +# Actions which need to be performed in addition to rerunning +# MPE Fieldgen can be placed in this script. This script is +# run after MPE Fieldgen is rerun. + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# +# Transmit the RFC bias message if the user has +# elected to do so on reruns. +# +if [[ "$MPE_TRANSMIT_BIAS" = "ON" && "$TRANSMIT_BIAS_ON_RERUN" = "YES" ]] +then + year=`echo $2 | cut -c5-8` + monthday=`echo $2 | cut -c1-4` + $PPROC_BIN/transmit_rfc_bias $year$monthday$1 +fi + +if [ "$SSHP_INVOKE_MAP_PREPROCESS" = "ON" ] +then + $WHFS_BIN_DIR/run_SSHP_MAP_preprocess >$SSHP_LOG_DIR/MAPPreprocessor.stdout.log 2>>$SSHP_LOG_DIR/MAPPreprocessor.stdout.log & +fi diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/ruc.pl.template b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/ruc.pl.template new file mode 100755 index 0000000000..833fb28acc --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/ruc.pl.template @@ -0,0 +1,104 @@ +#!/usr/bin/perl -w +use File::Copy; + + +# setup the grid +use AGRID; +my($file,$AGID,@temp,@hght); + +#set file name +$file=$ARGV[0]; +#print "file is $file\n"; + +$AGID=&AGRID::setup($file,0); +if ($AGID<0) { die &AGRID::geterrorstring; } +if (&AGRID::setupcoord($AGID)) { die &AGRID::geterrorstring; } + + +for ($i=0; $i<=#####; $i++) { + $lat = $lat[$i]; + $lon = $lon[$i]; + + #get the temp and hght data at all levels + if (&AGRID::getvertpointll($AGID,"t",0,$lat,$lon,1,\@temp)) { &AGRID::geterrorstring; next; } + if (&AGRID::getvertpointll($AGID,"gh",0,$lat,$lon,1,\@hght)) { &AGRID::geterrorstring; next; } + if (&AGRID::getlevs($AGID,"gh",\@ghlevels)) { &AGRID::geterrorstring; next; } + if (&AGRID::getlevs($AGID,"t",\@tlevels)) { &AGRID::geterrorstring; next; } + + #get mb levels of all variables + @mblevs=(); + &getmblevs(\@tlevels,\@mblevs); + &getmblevs(\@ghlevels,\@mblevs); + + #loop over sorted levels + + $fzlvl[$i]=0; + + foreach $mb (sort(Numerically @mblevs)) { + + if (($j=&findmb($mb,\@tlevels))>=0) { + if (($k=&findmb($mb,\@ghlevels))>=0) { + #print "Hght & Temp at ",$mb,"\n"; + #print "j= ",$j,"\n"; + #print "k= ",$k,"\n"; + #print "hght= ",$hght[$k],"\n"; + #print "temp= ",$temp[$j],"\n"; + if ($hght[$k]>-9000) { + if ($temp[$j]>273.16) { + #print "jtop= ",$jtop,"\n"; + #print "ktop= ",$ktop,"\n"; + #print "hght at top= ",$hght[$ktop],"\n"; + #print "temp at top= ",$temp[$jtop],"\n"; + $fzlvl[$i] = ($hght[$ktop] - + (($hght[$ktop] - $hght[$k]) * + ((273.16 - $temp[$jtop])/($temp[$j] - + $temp[$jtop])))) *.00328; + $fzlvl[$i] = substr($fzlvl[$i], 0, 4); + #print "fzlvl= ",$fzlvl[$i],"\n"; + last; + } else { + $jtop=$j; + $ktop=$k; + } + } + } + } + } +} + +$j=0; +while ($j <= #####) { + print "$fzlvl[$j]\n"; + $j++; +} + +#find level index that has the specified MB value +sub findmb { + my($mb,$Rlev)=@_; + my($search,$j,$lev); + + $search=sprintf("MB %d",$mb); + $j=0; + foreach $lev (@$Rlev) { + if ($lev eq $search) { + return($j); + } + $j++; + } + return(-1); +} + +#find any levels that contain the text MB at the beginning +sub getmblevs { + my($Rlev,$Rmblev)=@_; + my($lev,$mb); + + foreach $lev (@$Rlev) { + if (!($lev=~/^MB (\d+)$/)) { next; } + $mb=$1; + if (grep(/$mb/,@$Rmblev)==0) { push(@$Rmblev,$mb); } + } + return; +} + +sub Numerically { $a <=> $b } diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/ruc.tcl b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/ruc.tcl new file mode 100755 index 0000000000..bf30f9020e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/ruc.tcl @@ -0,0 +1,413 @@ +#!/usr/bin/tclsh +# + +# +# Open the log freezing level processing log file. This will +# be written into the MPE Editor log directory. +# This script is called from the run_freezing_level script which +# sources set_hydro_env and defines several environmental variables +# used in this script. +# +# October 17, 2007 - This script was modified to take an optional +# command line argument specifying the number of days to process +# +# March 11, 2008 - Updated to log the names of the files in +# the RUC80. Fixed variable reference typos. +# +# Dec 2009 - Changed date on .E line to be one day earlier +# +# Usage: ruc.tcl [number of days to process] +# +set run_from_dir [lindex $argv 0] +package require Tclx + +# +# Check for a command line argument specifying the number of days to process. +# If no argument is present, then assume that only one day is being processed. +if { $argc == 3 } { + + set days_to_process [lindex $argv 1 ] + set siteid [lindex $argv 2 ] + +} else { + + set days_to_process 1 + set siteid $env(MPE_SITE_ID) + +} + +# +# Set the freezing level data input and output directories +set rucdir $env(RUC_MODEL_DATA_DIR) +set mmdir $env(MPE_POINT_FREEZING_DIR) +#set siteid $env(MPE_SITE_ID) + +# get env variable DQC_PREPROCESSOR_BASETIME, if it is 18Z, load +#freezing level data at12~18Z, 18~00Z, 00~06Z, 06~12Z. IF it is +#12Z, load freezing level data at 6~12Z, 12~18Z, 18~00Z and +#00~06Z. If it is 00Z, load freezing level data at 18~00Z, +#00~06Z, 06~12Z, 12~18Z. If it is 06Z, load the freezing level +#data from 00~06Z, 06~12Z, 12~18Z, 18~00Z + +set dqc_preprocessor_basetime $env(DQC_PREPROCESSOR_BASETIME) +puts "The dqc_preprocessor_basetime is $dqc_preprocessor_basetime" +puts "The number of days to process is $days_to_process" + +# test purpose + +set rucscript $run_from_dir/ruc.pl + +proc mformat {x} { + if {$x == ""} { + return M + } elseif {$x == 0} { + return 0.00S + } else { + set x [format %.1f $x] + return [set x]0S + } +} + +# Force the dqc_preprocessor_basetime string to be lower case. +set dqc_preprocessor_basetime [string tolower $dqc_preprocessor_basetime] + +#setup dates +set csecs [clock seconds] +set tsecs $csecs + +set hour [clock format $csecs -format "%H" -gmt 1] +puts "current hour is $hour" + +# set cdates and tdates. Nothing needs to be done when the base hour is 00z. +if { $dqc_preprocessor_basetime == "12z" && $hour < 12 } { + + set csecs [expr $csecs-24*60*60] + +} elseif { $dqc_preprocessor_basetime == "12z" && $hour >= 12 } { + + set tsecs [ expr $csecs+24*60*60] + +} elseif { $dqc_preprocessor_basetime == "18z" && $hour < 18 } { + + set csecs [expr $csecs-24*60*60] + +} elseif { $dqc_preprocessor_basetime == "18z" && $hour >= 18 } { + + set tsecs [expr $csecs+24*60*60] + +} elseif { $dqc_preprocessor_basetime == "06z" && $hour < 6 } { + + set csecs [ expr $csecs-24*60*60 ] + +} elseif { $dqc_preprocess_basetime == "06z" && $hour >= 6 } { + + set tsecs [expr $csecs+24*60*60] +} + +# +# List the available RUC80 files. + +puts "Contents of $rucdir:" + +set ruc_files [glob "$rucdir/*"] + +foreach f $ruc_files { + if {![file isdirectory $f]} { + puts $f + } +} + +# Loop over the number of days to process freezing level +# data for. Take the user specified number of days minus 1. + +set days_to_process [ expr $days_to_process-1 ] + +for { set k $days_to_process } {$k >= 0 } { incr k -1 } { +# Simultaneously subtract from csecs and tsecs the number of days +# + +set begin_secs [expr $csecs-24*60*60*$k] +set end_secs [expr $tsecs-24*60*60*$k] + +#set k1 [expr $k +1] +#puts "k1 is $k1" +#set end_secs1 [expr $tsecs-24*60*60*$k1] +#set otdate1 [clock format $end_secs1 -format "%Y%m%d" -gmt 1] +#puts "otdate1 is $otdate1" +set otdate1 [clock format $begin_secs -format "%Y%m%d" -gmt 1] + +set cdate [clock format $begin_secs -format "%Y%m%d" -gmt 1] +set tdate [clock format $end_secs -format "%Y%m%d" -gmt 1] + +puts "current days being processed are $cdate and $tdate" + +#set file +set otdate [clock format $end_secs -format "%Y%m%d" -gmt 1] +set ofile $mmdir/freezing_1_${siteid}_point_$otdate +puts "output file is $ofile" + +#get values for hours + +if { $dqc_preprocessor_basetime == "18z" } { + + set dates [list $cdate $tdate $tdate $tdate] + set hrs [list 1800 0000 0600 1200] + +} elseif { $dqc_preprocessor_basetime == "00z" } { + + set dates [list $tdate $tdate $tdate $tdate] + set hrs [list 0000 0600 1200 1800] + +} elseif { $dqc_preprocessor_basetime == "06z" } { + + set dates [list $cdate $cdate $cdate $tdate] + set hrs [list 0600 1200 1800 0000] + +} else { + + # dqc_preprocessor_basetime must be 12z + set dates [list $cdate $cdate $tdate $tdate] + set hrs [list 1200 1800 0000 0600] +} + +set i 0 +foreach hr $hrs dt $dates { + puts "hour $hr" + set file $rucdir/[set dt]_$hr + puts "rucfile is $file" + if {[file exists $file]} { + puts "$rucscript $file $siteid" + set vals$i [exec $rucscript $file $siteid] + } else { + puts "File $file not found. Continuing." + set vals$i "" + } + puts [set vals$i] + incr i +} + +# +# If there was no data, do not overwrite the existing freezing level file. +set len0 [ string length $vals0 ] +set len1 [ string length $vals1 ] +set len2 [ string length $vals2 ] +set len3 [ string length $vals3 ] + +if { $len0 == 0 && $len1 == 0 && $len2 == 0 && $len3 == 0 } { +# Probably want to continue here. + puts "No data found for $ofile." + continue; +} + +# +# Check if the output file already exists. If it does, then open it. +# Process each record. For each blank freezing level value computed +# above, see if there was already one in the file from a previous +# run of this script. If there is, use it. This needs to be +# done because RUC80 data files are only kept around for 8 hours or +# so. + +if [catch {open $ofile r} fileId] { +# +# The file does not exist or could not be opened. + set i 0 + set out "" + puts "file does not exist" + + foreach v0 $vals0 v1 $vals1 v2 $vals2 v3 $vals3 { + set stn [format %05d $i] + set v0 [mformat $v0] + set v1 [mformat $v1] + set v2 [mformat $v2] + set v3 [mformat $v3] + + if { $dqc_preprocessor_basetime == "18Z" || + $dqc_preprocessor_basetime == "18z"} { + append out ".E Z$stn $otdate1 DH18/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "00Z" || + $dqc_preprocessor_basetime == "00z" } { + append out ".E Z$stn $otdate1 DH00/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "06Z" || + $dqc_preprocessor_basetime == "06z" } { + append out ".E Z$stn $otdate1 DH06/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } else { + append out ".E Z$stn $otdate1 DH12/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + } + + incr i + } + + puts -nonewline $out +} else { +# +# The file does exist. + set i 0 + set out "" + + puts "file exist" + foreach v0 $vals0 v1 $vals1 v2 $vals2 v3 $vals3 { + + set stn [format %05d $i] + set v0 [mformat $v0] + set v1 [mformat $v1] + set v2 [mformat $v2] + set v3 [mformat $v3] + + # Read the record. + gets $fileId line + + set len [ string length $line ] + + if {$len > 0} { + + if { $dqc_preprocessor_basetime == "18Z" || + $dqc_preprocessor_basetime == "18z"} { + + # Parse the line for the four freezing level values. + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v18 v00 v06 v12 + + set v18 [ string trimright $v18 / ] + set v00 [ string trimright $v00 / ] + set v06 [ string trimright $v06 / ] + set v12 [ string trimright $v12 / ] + set v18 [ string trimleft $v18 ] + set v00 [ string trimleft $v00 ] + set v06 [ string trimleft $v06 ] + set v12 [ string trimleft $v12 ] + + if { $v0 == "M" && $v18 != "M" } { + set v0 $v18 + } + if { $v1 == "M" && $v00 != "M" } { + set v1 $v00 + } + if { $v2 == "M" && $v06 != "M" } { + set v2 $v06 + } + if { $v3 == "M" && $v12 != "M" } { + set v3 $v12 + } + + } elseif { $dqc_preprocessor_basetime == "00Z" || + $dqc_preprocessor_basetime == "00z"} { + + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v00 v06 v12 v18 + + set v18 [ string trimright $v00 / ] + set v00 [ string trimright $v06 / ] + set v06 [ string trimright $v12 / ] + set v12 [ string trimright $v18 / ] + set v18 [ string trimleft $v00 ] + set v00 [ string trimleft $v06 ] + set v06 [ string trimleft $v12 ] + set v12 [ string trimleft $v18 ] + + if { $v0 == "M" && $v00 != "M" } { + set v0 $v00 + } + if { $v1 == "M" && $v06 != "M" } { + set v1 $v06 + } + if { $v2 == "M" && $v12 != "M" } { + set v2 $v12 + } + if { $v3 == "M" && $v18 != "M" } { + set v3 $v18 + } + + } elseif { $dqc_preprocessor_basetime == "06Z" || + $dqc_preprocessor_basetime == "06z"} { + + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v06 v12 v18 v00 + + set v18 [ string trimright $v06 / ] + set v00 [ string trimright $v12 / ] + set v06 [ string trimright $v18 / ] + set v12 [ string trimright $v00 / ] + set v18 [ string trimleft $v06 ] + set v00 [ string trimleft $v12 ] + set v06 [ string trimleft $v18 ] + set v12 [ string trimleft $v00 ] + + if { $v0 == "M" && $v06 != "M" } { + set v0 $v06 + } + if { $v1 == "M" && $v12 != "M" } { + set v1 $v12 + } + if { $v2 == "M" && $v18 != "M" } { + set v2 $v18 + } + if { $v3 == "M" && $v00 != "M" } { + set v3 $v00 + } + + } else { + + # Parse the line for the four freezing level values. + scan $line {%s %s %s %s %s %s %s %s} sheftype hb5 date rest v12 v18 v00 v06 + + set v12 [ string trimright $v12 / ] + set v18 [ string trimright $v18 / ] + set v00 [ string trimright $v00 / ] + set v06 [ string trimright $v06 / ] + set v12 [ string trimleft $v12 ] + set v18 [ string trimleft $v18 ] + set v00 [ string trimleft $v00 ] + set v06 [ string trimleft $v06 ] + + if { $v0 == "M" && $v12 != "M" } { + set v0 $v12 + } + if { $v1 == "M" && $v18 != "M" } { + set v1 $v18 + } + if { $v2 == "M" && $v00 != "M" } { + set v2 $v00 + } + if { $v3 == "M" && $v06 != "M" } { + set v3 $v06 + } + } + } + + if { $dqc_preprocessor_basetime == "18Z" || + $dqc_preprocessor_basetime == "18z"} { + + append out ".E Z$stn $otdate1 DH18/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "00Z" || + $dqc_preprocessor_basetime == "00z"} { + + append out ".E Z$stn $otdate1 DH00/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } elseif { $dqc_preprocessor_basetime == "06Z" || + $dqc_preprocessor_basetime == "06z"} { + + append out ".E Z$stn $otdate1 DH06/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + + } else { + + append out ".E Z$stn $otdate1 DH12/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n" + } + + incr i + } + + # + # Close the freezing level data file. + close $fileId + + puts -nonewline $out + +} + +# Write the Freezing Level File. +write_file $ofile $out + +#Continue with the next day to process. +} + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_biasmesgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_biasmesgen new file mode 100755 index 0000000000..a71772aec4 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_biasmesgen @@ -0,0 +1,63 @@ +#!/bin/ksh + +# Bias Table Message File Generation Script + +# +# This allows you to call this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +#export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +#. $FXA_HOME/readenv.sh + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export FXA_LOCAL_SITE=$(get_apps_defaults fxa_local_site) +TZ=GMT +export TZ + +# +# setup log file +# + +BIASMESSLOGDIR=$(get_apps_defaults rfcwide_logs_dir) + +fnm=$BIASMESSLOGDIR/biasmesgen.log +tmp=$BIASMESSLOGDIR/biasmesgen.tmp + +# +# save latest entries in log file +# + +if [[ -s $fnm ]] + then + tail -1200 $fnm > $tmp + mv $tmp $fnm + fi + +# +# begin write to log +# + +echo "-------------------------------------------" >> $fnm +Dte=`date -u` +echo "Begin at "$Dte >> $fnm + +# +# Generate Bias Table Message +# + +runso rary.ohd.pproc biasmesgen_main >> $fnm + +# +# end write to log +# + +Dte=`date -u` +echo "End at "$Dte >> $fnm +exit 0 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_basin_format b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_basin_format new file mode 100755 index 0000000000..e5e8e3665b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_basin_format @@ -0,0 +1,95 @@ +#!/bin/sh + +############################################################################### +# run_convert_basin_format +# +# This script converts a CBRFC formatted basin file to whfs formatted file. +# +# This script takes three arguments: +# +# : The cbrfc formatted basin file to be converted +# +# : The whfs formatted output file +# +# : The location of the input file +# +# The reformatted output file will be placed in the directory pointed to +# by the whfs_geodata_dir token. +# +# Modification History +# June 5, 2006 Ram Varma Original Coding. +# +############################################################################### + +# +# The user must supply the input file name, output file name and location of the input file + + + +if [[ $# -ne 3 ]] +then + printf "Usage: run_convert_basin_format " + printf "\twhere input_file is the file to be converted" + printf "\tand output file is the converted file" + printf "\tand the input file directory is the location of the source file" + exit 1; +fi + +input_file=$1 +output_file=$2 +input_file_directory=$3 + +# +# Set up environment variables +# Define FILENAME variable + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_GEODATA_DIR=$(get_apps_defaults whfs_geodata_dir) + +printf "The geo data directory is: $WHFS_GEODATA_DIR" + +printf "converting $WHFS_GEODATA_DIR/$input_file to whfs basin file format and storing it in $output_file" + +$RUN_FROM_DIR/convert_basin_format.LX $input_file_directory/$input_file $output_file + +printf "done converting..." + +printf "checking for prior existance of $output_file in $WHFS_GEODATA_DIR/" + +# +# Check for the existence of the output file. If it exists, warn the user +# that this file will be overwritten. If the choice is to overwrite, +# a backup of the original file will be created wit a ".bak" extension. +# Give the user the chance to quit. +# +if [[ -a $WHFS_GEODATA_DIR/$output_file ]] +then + + printf "The $WHFS_GEODATA_DIR/$output_file file exists.\n" + printf "It will be overwritten. Procede?\n" + read overwrite?" (Y/N):" + + while [[ $overwrite != "N" && $overwrite != "Y" ]] + do + read overwrite?" Please enter Y or N:" + done + + if [ $overwrite == "N" ] + then + printf "The basin file conversion has been aborted.\n" + exit 1; + elif [ $overwrite == "Y" ] + then + printf "creating a backup of the original $WHFS_GEODATA_DIR/$output_file file" + printf "Moving the $WHFS_GEODATA_DIR/$output_file to $WHFS_GEODATA_DIR/$output_file.bak" + mv $WHFS_GEODATA_DIR/$output_file $WHFS_GEODATA_DIR/$output_file.bak + fi + +fi + +printf "\n" +printf "Copying $output_file in $WHFS_GEODATA_DIR/" + +cp $output_file $WHFS_GEODATA_DIR/ + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_climo_list b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_climo_list new file mode 100755 index 0000000000..81021db24e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_climo_list @@ -0,0 +1,77 @@ +#!/bin/ksh + +############################################################################### +# convert_dqc_climo_list +# +# This script converts a CBRFC-formatted climatology list into the format +# required by MPE Editor. +# +# This script takes three arguments: +# +# : The path and name of the station list file to be +# converted. +# : cbrfc, for an example. +# +# +# Modification History +# June 5, 2006 Ram Varma Original Coding. +# +############################################################################### + +# +# The user must supply the input file name and the area_id. + +# +if [[ $# -ne 2 ]] +then + print "Usage: convert_dqc_climo_list " + print "\twhere input_file is the path and name of the input file" + print "\t area_id cbrfc, as an example" + exit 1; +fi + +input_file=$1 +area_id=$2 + +# +# Set up environment variables +# Define FILENAME variable + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_CLIMO_DIR=$(get_apps_defaults mpe_climo_dir) + +FILENAME=$MPE_CLIMO_DIR/${area_id}_station_climo_list + +print "Reading $input_file" +print "Reformatted climo station list will be written to $FILENAME" + +rm -f $FILENAME + +# +# Get a count of the number of PPM records in the climo file. +export num_ppm_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^PPM/ {count=count+1} END{print count}'` + +# +# Get a count of the number of TAI records in the climo file. +export num_tai_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^TAI/ {count=count+1} END{print count}'` + +print "$input_file contains $num_ppm_records PPM records" +print "$input_file contains $num_tai_records TAI records" + +echo $num_ppm_records >> $FILENAME +awk '{if(FNR <= ENVIRON["num_ppm_records"]) print $0}' $input_file \ + >> $FILENAME + +# +# There are two tai climo records for each station. +((num_temp_records=$num_tai_records/2)) + +echo $num_temp_records >> $FILENAME +awk '{if(FNR > ENVIRON["num_ppm_records"] && \ + FNR <= ( ENVIRON["num_tai_records"] + ENVIRON["num_ppm_records"])) \ + print $0}' $input_file >> $FILENAME + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_station_list b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_station_list new file mode 100755 index 0000000000..db3dc56b6d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_station_list @@ -0,0 +1,133 @@ +#!/bin/ksh + +############################################################################### +# convert_dqc_station_list +# +# This script converts a CBRFC-formatted station list into the format +# expected by MPE Editor. +# +# This script takes three arguments: +# +# : The path and name of the station list file to be +# converted. +# : Y or N. Indicates whether or not to place the PPH +# station list at the top of the file. If this is a +# subarea station list, then this should be N. If this is +# the master DailyQC station list then this should be Y. +# : cbrfc, for an example. +# +# The reformatted station list will be placed in the directory pointed to +# by the mpe_station_list_dir token. This file will be named as +# _station_list. +# +# Modification History +# May 24, 2006 Bryon Lawrence Original Coding. +# +############################################################################### + +# +# The user must supply the input file name, the Y or N flag indicating +# whether or not to include the PPH station list and the area_id. + +# +if [[ $# -ne 3 ]] +then + print "Usage: convert_dqc_station_list " + print "\twhere input_file is the path and name of the input file" + print "\t pph_flag = Y to load PPH station list" + print "\t N to not load PPH station list" + print "\t area_id cbrfc, as an example" + exit 1; +fi + +input_file=$1 +pph_flag=$2 +area_id=$3 + +# +# Set up environment variables +# Define FILENAME variable +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_STATION_LIST_DIR=$(get_apps_defaults mpe_station_list_dir) +export DB_NAME=$(get_apps_defaults db_name) + +FILENAME=$MPE_STATION_LIST_DIR/${area_id}_station_list + +print "Reading $input_file" +print "Reformatted station list will be written to $FILENAME" + +rm -f $FILENAME + +if [[ $pph_flag = "Y" ]] +then + print "Including PPH station list." +else + print "Excluding PPH station list. " +fi + +#Check if the PPH list needs to be appended. +if [[ $pph_flag = "Y" ]] +then + ############################################################################ + # + # Generate station list for 1 hr MPE + # + $POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME \ + -f $RUN_FROM_DIR/hourly_precip_station_gen.sql \ + > hourly_precip_station_list + + # + # Get count of records from above and write to station_list file + # + wc -l < hourly_precip_station_list > $FILENAME + + # + # Write precip station info to station_list file + # + cat hourly_precip_station_list >> $FILENAME + +fi + +# +# Get a count of the number of PPD records in the CBRFC station file. +export num_ppd_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^PPD/ {count=count+1} END{print count}'` + +# +# Get a count of the number of TAI records in the CBRFC station file. +export num_tai_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^TAI/ {count=count+1} END{print count}'` + +# +# Get a count of the number of HZI records in the CBRFC station file. +export num_hzi_records=`awk '{print $2}' $input_file | \ + awk 'BEGIN{count=0} /^HZI/ {count=count+1} END{print count}'` + +print "$input_file contains $num_ppd_records PPD records" +print "$input_file contains $num_tai_records TAI records" +print "$input_file contains $num_hzi_records HZI records" + +# +# Insert a dummy record for the PPH stations. +# Or insert the the PPH block as created by the create station list +# script. +echo $num_ppd_records >> $FILENAME +awk '{if(FNR <= ENVIRON["num_ppd_records"]) print $0}' $input_file \ + >> $FILENAME + +echo $num_tai_records >> $FILENAME +awk '{if(FNR > ENVIRON["num_ppd_records"] && \ + FNR <= ( ENVIRON["num_tai_records"] + ENVIRON["num_ppd_records"])) \ + print $0}' $input_file >> $FILENAME + +echo $num_hzi_records >> $FILENAME +awk '{if(FNR > (ENVIRON["num_tai_records"] + ENVIRON["num_ppd_records"])) \ + print $0}' $input_file >> $FILENAME + + +rm -f hourly_precip_station_list + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_freezing_station_list b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_freezing_station_list new file mode 100755 index 0000000000..eb9b803f35 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_freezing_station_list @@ -0,0 +1,12 @@ +#!/bin/ksh +# run_create_gage_file + +# This script is called from Build_Station_List. +# It should not be run alone. It assumes that set_hydro_env has already +# been sourced. + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +runso rary.ohd.pproc create_freezing_station_list_main diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file new file mode 100755 index 0000000000..ba1df26b80 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file @@ -0,0 +1,11 @@ +#!/bin/ksh +# run_create_gage_file + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export RFCWIDE_BEAMHEIGHT_DIR=$(get_apps_defaults rfcwide_beamheight_dir) + +runso rary.ohd.pproc create_mpe_beam_height_main $RFCWIDE_BEAMHEIGHT_DIR diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_climo_lists b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_climo_lists new file mode 100755 index 0000000000..7f23951b13 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_climo_lists @@ -0,0 +1,16 @@ +#!/bin/ksh +# run_create_mpe_climo_lists +# +# Usage: run_create_mpe_climo_lists + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables. +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_EDITOR_LOGS_DIR=$(get_apps_defaults mpe_editor_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +#$RUN_FROM_DIR/dqc_preproc_setup +#$PPROC_BIN/dqc_preproc_setup_main +runso rary.ohd.pproc dqc_preproc_setup_main \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_gage_file b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_gage_file new file mode 100755 index 0000000000..7c6fba6c7c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_gage_file @@ -0,0 +1,12 @@ +#!/bin/ksh +# run_create_gage_file + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export RFCWIDE_GAGELOC_DIR=$(get_apps_defaults rfcwide_gageloc_dir) +export DB_NAME=$(get_apps_defaults db_name) + +runso rary.ohd.pproc create_mpe_gage_file_main -d$DB_NAME $RFCWIDE_GAGELOC_DIR diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_station_lists b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_station_lists new file mode 100755 index 0000000000..8a8227e34c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_station_lists @@ -0,0 +1,133 @@ +#!/bin/ksh +# +# Script to generate a list of stations and related information for +# (1) 1 hr precip stations for hourly MPE +# (2) 6 hr/daily precip stations +# (3) 6 hr and max/min temperature stations +# (4) 6 hr freezing level grid points +# + +# Inputs: +# MPE_STATION_LIST_DIR - defined in set_hydro_env +# - dir containing station info list +# +# MPE_SITE_ID - defined in set_hydro_env +# - used to create filename containing station info +# +# Output +# The station information is written to a file named "station_info_list". +# This file is located in the directory pointed to by the mpe_station_list_dir token. +# +# Temporary Files +# This script writes results of queries to the following temporary files: +# temperature_station_list +# precip_station_list +# These files are deleted at the end of the script. +#################################################################################### +# +# Set up environment variables +# Define FILENAME variable +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_STATION_LIST_DIR=$(get_apps_defaults mpe_station_list_dir) +export DB_NAME=$(get_apps_defaults db_name) +export MPE_SITE_ID=$(get_apps_defaults mpe_site_id) + +FILENAME=$MPE_STATION_LIST_DIR/${MPE_SITE_ID}_station_list +#################################################################################### +# +# Generate station list for 1 hr MPE +# +$POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME -f $RUN_FROM_DIR/hourly_precip_station_gen.sql > $RUN_FROM_DIR/hourly_precip_station_list + +# +# Get count of records from above and write to station_list file +# +wc -l < $RUN_FROM_DIR/hourly_precip_station_list > $FILENAME + +# +# Write precip station info to station_list file +# +cat $RUN_FROM_DIR/hourly_precip_station_list >> $FILENAME + +#################################################################################### +# +# Generate station list for 6 hr and 24 hr precip stations +# +# Generate station info for precip stations and write results to temporary file +# +$POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME -f $RUN_FROM_DIR/precip_station_gen.sql > $RUN_FROM_DIR/precip_station_list + +# +# Get count of records from above and write to station_list file +# +wc -l < $RUN_FROM_DIR/precip_station_list >> $FILENAME + +# +# Write precip station info to station_list file +# +cat $RUN_FROM_DIR/precip_station_list >> $FILENAME + +#################################################################################### +# +# Generate station list for 6 hr and max/min temperature stations +# +# Generate station info for temperature stations and write results to temporary file +# +$POSTGRESQLBINDIR/psql -q -t -A -F ' ' $DB_NAME -f $RUN_FROM_DIR/temperature_station_gen.sql > $RUN_FROM_DIR/temperature_station_list + +# +# Get count of records from above and write to station_list file +# +wc -l < $RUN_FROM_DIR/temperature_station_list >> $FILENAME + +# +# Write temperature station info to station_list file +# +cat $RUN_FROM_DIR/temperature_station_list >> $FILENAME + +# +# Delete temporary files +# + +rm -f $RUN_FROM_DIR/temperature_station_list + +rm -f $RUN_FROM_DIR/precip_station_list + +rm -f $RUN_FROM_DIR/hourly_precip_station_list + +#################################################################################### +# +# Generate grid points for freezing level data +# + +# +# Create the temporary file of freezing level stations +# +$RUN_FROM_DIR/run_create_freezing_station_list + +# +# Concatentate this temporary file to the end of the +# station file list. +# +cat $MPE_STATION_LIST_DIR/${MPE_SITE_ID}_freezing_station_list >> $FILENAME + +# +# Create the ruc.pl script from the ruc.pl.template file. +# This file is responsible for retrieving freezing level +# data from the RUC80 model for grid points contained in the +# offices MPE forecast area. +# +$RUN_FROM_DIR/run_freezing_station_setup + +# +# Remove the temporary freezing station list file. +# +rm -f $MPE_STATION_LIST_DIR/${MPE_SITE_ID}_freezing_station_list + +# +# Done +# +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_prism b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_prism new file mode 100755 index 0000000000..98298d15fa --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_prism @@ -0,0 +1,75 @@ +#!/bin/ksh + +# run_create_prism +# +# Bryon Lawrence October 5, 2006 OHD +# +# Purpose: +# +# This is the run script for the MPEClimo PRISM generating program. It takes +# the national precipitation and temperature PRISM files available from Orgeon State +# University and crops them to a office's MPE forecast area. These cropped PRISM +# files are stored in XMRG format. They can be displayed in MPE Editor. +# +# This script requires three arguments: +# +# 1) Input Prism File Prefix +# 2) Output Prism File Suffix +# 3) Temperature/Precipitation PRISM flag. This may be either "t" or "p" +# +# The prism_input_dir token provides the path to the raw PRISM files. +# The prism_output_dir token provides the path to the cropped XMRG PRISM files. +# +# This routine expects there to be 13 raw PRISM files, one for each month and one +# for the entire year. This routine will create XMRG files corresponding to the +# raw PRISM files. +# +# This routine assumes that the input prism files have the suffix "_MM" where MM +# is the 2 digit month number. When generating the output PRISM files, this +# routine will append a "_MMM" to each month's XMRG PRISM filename. MMM is the +# lower case 3 character month abbreviation. +# +# For example, run_create_prism us_tmax prism_max_temp t +# +# Will look for the files +# +# us_tmax_01 us_tmax_04 us_tmax_07 us_tmax_10 us_tmax_14 +# us_tmax_02 us_tmax_05 us_tmax_08 us_tmax_11 +# us_tmax_03 us_tmax_06 us_tmax_09 us_tmax_12 +# +# in the input directort specified by the prism_input_dir token. +# +# It will generate the following files in the prism_output_dir token: +# +# prism_max_temp_jan prism_max_temp_apr prism_max_temp_jul prism_max_temp_oct +# prism_max_temp_feb prism_max_temp_may prism_max_temp_aug prism_max_temp_nov +# prism_max_temp_mar prism_max_temp_jun prism_max_temp_sep prism_max_temp_dec +# prism_max_temp_ann +# +# +# + +if [[ $# -ne 3 ]] +then + print "Usage: run_create_prism " + print " " + print " " + exit 1; +fi +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +# Temporarily set here. +export CLASSPATH=${PPROC_BIN}/prism.jar + +# Temporarily set here. +export prism_input_dir=/awips2/edex/data/hdf5/hydroapps/precip_proc/local/data/log/disagg +export prism_output_dir=/awips2/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism +#export prism_input_dir=/fs/hseb/whfs/site_data/mpe_data/PRISM +#export prism_output_dir=/fs/hseb/whfs/cbrfc_historical/cbrfc/mpe_editor/local/data/app/MPE/PRISM + +# Start the MPEClimo program +$SYS_JAVA_BIN_DIR/java -classpath ${CLASSPATH} ohd.hseb.prism.MPEClimo $1 $2 $3 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_topo b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_topo new file mode 100755 index 0000000000..969eca2795 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_topo @@ -0,0 +1,10 @@ +#!/bin/ksh +# run_create_gage_file + +# This allows this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env + +runso rary.ohd.pproc read_topo_main diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_triangles b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_triangles new file mode 100755 index 0000000000..065dc68879 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_create_triangles @@ -0,0 +1,19 @@ +#!/usr/bin/ksh + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env +export UTILTRI_DIR=$(get_apps_defaults rfcwide_utiltriangles_dir) +utiltri=$UTILTRI_DIR/utiltriangles +if [[ -f $utiltri ]] +then + echo triangle files exist! + exit 0 +fi +echo creating triangles ..... + +#$RUN_FROM_DIR/create_triangles.LX +runso rary.ohd.pproc create_triangles_main + +echo Finished creating triangles !!!!! \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg new file mode 100755 index 0000000000..67f822228f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg @@ -0,0 +1,28 @@ +#!/bin/ksh +# run_disagg +# Oct 31, 2002 + +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DISAGG_LOG_DIR=$(get_apps_defaults disagg_log_dir) +export HYDRO_PUBLICBIN=$(get_apps_defaults hydro_publicbin) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# +# AMIRUNNIN_DIR env is REQUIRED by name by amirunning script +# + +#AMIRUNNING_DIR=$DISAGG_LOG_DIR +#echo $HYDRO_PUBLICBIN +#. $HYDRO_PUBLICBIN/amirunning + +#if [[ $AmIRunning = "yes" ]]; then + #echo Run_disagg script canceled due to disagg is currently running + #exit 1 + # fi + +$PPROC_BIN/disagg$OS_SUFFIX diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg_fieldgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg_fieldgen new file mode 100755 index 0000000000..61037e215c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg_fieldgen @@ -0,0 +1,37 @@ +# ============================================================================ +# pgm: run_disagg_fieldgen .. test ver of script to run run_disagg/run_mpe_fieldgen +# +# use: test_run_all [num-hours] +# +# in: num-hours .... (optional) if given, input into mpe_fieldgen as the +# in: number of hours, else default to 3 +# in: CURRENTLY NOT IMPLEMENTED +# +# rqd: commands - run_disagg, run_mpe_fieldgen, set_hydro_env +# +# ver: 20021022 +# ============================================================================ + type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null + +Optns="$@" + +# This allows you to call this script from outside of ./whfs/bin +# RUN_FROM_DIR=`dirname $0` +# WhfsDir=$RUN_FROM_DIR/../.. + + ## -------------------------------------- set current dir for scripts + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + + ## -------------------------------------- run run_disagg +$PPROC_BIN/run_disagg $Optns +RtnCod=$? + +if [ "$RtnCod" != 0 ]; then exit 1; fi + + ## -------------------------------------- run run_mpe_fieldgen + +$PPROC_BIN/run_mpe_fieldgen $Optns + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_dqc_preprocessor b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_dqc_preprocessor new file mode 100755 index 0000000000..17529cb897 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_dqc_preprocessor @@ -0,0 +1,71 @@ +#!/bin/ksh +# run_dqc_preprocessor +# +# Usage: run_dqc_preprocessor [-d num_days] [-t run_date] [-a sub_areas] [-z] +# where num_days = NN +# run_date = YYYYMMDD +# sub_areas = sub1,sub2 + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Set up SOME environmental variables. +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_EDITOR_LOGS_DIR=$(get_apps_defaults mpe_editor_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# +# Initialize the parameters +# +NUM_DAYS=10 +RUN_DATE=`date -u +%Y%m%d` +SUBAREA_LIST="ALL" +SET_ZERO="OFF" + +# +# Setup log file +# +LOG_DATE=`date -u +%Y%m%d%H%M%S` +LOGNAME=$MPE_EDITOR_LOGS_DIR/mpe_preprocessor_$LOG_DATE + +# +# Parse the command parameters +# +args=`getopt d:t:a:z $*` +if [ $? != 0 ] +then + echo "Usage: run_dqc_preprocessor [-d num_days] [-t run_date] [-a sub_areas] [-z]" + echo " num_days = N" + echo " run_date = YYYYMMDD" + echo " sub_areas = sub1,sub2,..." + echo " z option = set precip value to zero" + exit 1 +fi + +set -- $args +for i +do + case "$i" in + -d) shift; NUM_DAYS="$1"; shift;; + -t) shift; RUN_DATE="$1"; shift;; + -a) shift; SUBAREA_LIST="$1"; shift;; + -z) shift; SET_ZERO="ON";; + esac +done + +if [ $SET_ZERO = "ON" ] +then + if [ $SUBAREA_LIST = "ALL" ] + then + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -t$RUN_DATE -z > $LOGNAME 2>&1 + else + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -a$SUBAREA_LIST -t$RUN_DATE -z > $LOGNAME 2>&1 + fi +else + if [ $SUBAREA_LIST = "ALL" ] + then + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -t$RUN_DATE > $LOGNAME 2>&1 + else + runso rary.ohd.pproc dqc_preproc_main -d$NUM_DAYS -t$RUN_DATE -a$SUBAREA_LIST > $LOGNAME 2>&1 + fi +fi diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen new file mode 100755 index 0000000000..24fadaabc4 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen @@ -0,0 +1,41 @@ +# ============================================================================ +# pgm: run_fieldgen_disagg_fieldgen .. script to run run_mpe_fielgen/run_disagg# /run_mpe_fieldgen +# +# +# in: num-hours .... (optional) if given, input into mpe_fieldgen as the +# in: number of hours, else default to 3 +# in: CURRENTLY NOT IMPLEMENTED +# +# rqd: commands - run_mpe_fieldgen, run_disagg, run_mpe_fieldgen, set_hydro_env +# +# ver: 20030113 +# ============================================================================ + type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null + +Optns="$@" + +# This allows you to call this script from outside of ./whfs/bin +# RUN_FROM_DIR=`dirname $0` +# WhfsDir=$RUN_FROM_DIR/../.. + + ## -------------------------------------- set current dir for scripts + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) + + ## -------------------------------------- run run_mpe_fieldgen +$PPROC_BIN/run_mpe_fieldgen $Optns +#RtnCode=$? +#if [ "$RtnCode" != 0 ]; then exit 1; fi + + ## -------------------------------------- run run_disagg +$PPROC_BIN/run_disagg $Optns +RtnCod=$? + +if [ "$RtnCod" != 0 ]; then exit 1; fi + + ## -------------------------------------- run run_mpe_fieldgen + +$PPROC_BIN/run_mpe_fieldgen $Optns + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_level b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_level new file mode 100755 index 0000000000..ec4f6c3b2c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_level @@ -0,0 +1,76 @@ +#!/bin/ksh +############################################################################## +# run_freezing_level +# +# Description: Runs the scripts which extract freezing level data from +# the RUC80 model and store it in a SHEF-formatted +# format for use in the MPE Editor GageQC tools. +# +# This script is setup to be run from the cron. It will +# produce log files in the mpe_editor directory in +# /awips/hydroapps/precip_proc/local/data/log or as +# specified by the mpe_editor_logs_dir token. +# +# Usage: +# run_freezing_level [number of days to process] +# +# Revision History: +# +# April 19, 2006 Bryon Lawrence Original Coding +# October 16, 2007 Bryon Lawrence Added option to supply the +# number days of freezing level +# data to process. +# October 17, 2007 Bryon Lawrence Modified how the freezing level +# logs are purged. Setup so +# that daily log files are created, +# and they are purged by +# the purge_mpe_files script. +############################################################################## +# + +# +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# +# Set up environment variables +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_EDITOR_LOGS_DIR=$(get_apps_defaults mpe_editor_logs_dir) + +# +# Check for the optional command line argument specifying the number +# of days to process. If the number of days is not specified +# then default to 1. +if [ $# -eq 1 ] +then + number_of_days=$1 +else + number_of_days=1 +fi + +# +# Set up the log directory. +freezinglog_file=`date +freezing_level_log_%m%d` +freezinglog=$MPE_EDITOR_LOGS_DIR/${freezinglog_file} + +# +# Write a startup message to the log. +date_string=`date` +echo "############################################################" >> \ + $freezinglog +echo "Running freezing level data retrieval script at $date_string" \ + >> $freezinglog + +# +# Run the scripts to retrieve the freezing level data from the RUC80 +# model for the model grid points which are located within the +# office's MPE forecast area. +${RUN_FROM_DIR}/ruc.tcl $RUN_FROM_DIR $number_of_days >> $freezinglog 2>&1 + +# +# Write a completion message to the freezing level log. +date_string=`date` +echo "Done retrieving freezing level data at $date_string" >> $freezinglog + +# +# End of Script. diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_station_setup b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_station_setup new file mode 100755 index 0000000000..e06a939a76 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_station_setup @@ -0,0 +1,134 @@ +#!/usr/bin/ksh + +############################################################################### +# FILENAME: run_freezing_station_setup +# GENERAL INFORMATION: +# DESCRIPTION: Using the template ruc.pl.template, this script will +# produce a version of ruc.pl which contains the +# RUC80 points within the office's MPE forecast area. +# The ruc.pl script is used by ruc.tcl to extract +# RUC80 data from the AWIPS netCDF files. +# +# This routine reads the freezing station list in the +# /awips/hydroapps/precip_proc/local/data/app/MPE/station_lists +# directory. It formats the latitude/longitude coordinates into +# the format required by the ruc.pl script. It then inserts +# these latitude/longitude coordinates into the ruc.pl script +# as well as updating references to the count of freezing +# stations. +# +# The ruc.pl.template file should never be edited. +# +# This script is meant to be called from the Build_Station_List +# script. It should not be run alone. It assumes that +# /awips/hydroapps/set_hydro_env has already been sourced. +# +# +# ORIGINAL AUTHOR: Bryon Lawrence +# CREATION DATE: April 3, 2006 +# ORGANIZATION: OHD/HSEB +# MACHINE: Linux +# MODIFICATION HISTORY: +# DATE PROGRAMMER DESCRIPTION/REASON +# April 3, 2006 Bryon Lawrence Initial Coding +################################################################################ +# + +# This allows this script to be run from outside of precip_proc/bin. +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env + +export MPE_SITE_ID=$(get_apps_defaults mpe_site_id) +export MPE_STATION_LIST_DIR=$(get_apps_defaults mpe_station_list_dir) + +# +# Retrieve the directory to read the freezing level station list data from. +# +FREEZING_LIST_PATH=$MPE_STATION_LIST_DIR + +# +# Retrieve the identifier of the office. +# +SITE_ID=$MPE_SITE_ID + +# +# Create the freezing station file name. +# +FREEZING_STATION_FILE=$FREEZING_LIST_PATH/${SITE_ID}_freezing_station_list + +# +# Create the file to temporarily contain the lat/lon coords. These +# will be inserted into the ruc.pl script. +# +FREEZING_STATION_COORD_FILE=$FREEZING_LIST_PATH/${SITE_ID}_freezing_coords + +# +# Check for the existence of the ruc.pl file. If it exists, warn the user +# that this file will be overwritten. Give the user the chance to quit. +# +if [[ -a $RUN_FROM_DIR/ruc.pl ]] +then + + printf "The $RUN_FROM_DIR/ruc.pl file exists.\n" + printf "It will be overwritten. Procede?\n" + read overwrite?" (Y/N):" + + while [[ $overwrite != "N" && $overwrite != "Y" ]] + do + read overwrite?" Please enter Y or N:" + done + + if [ $overwrite == "N" ] + then + printf "The freezing station setup has been aborted.\n" + exit 1; + fi + +fi + +# +# Create the list of RUC80 point latitude/longitude coordinates in the format +# required by the ruc.pl script. Skip the first record in the freezing +# station list file. This is the number of records in the file. +# +awk 'BEGIN{count=0} + {if(FNR > 1){print "$lat["count"] = "$3";\n$lon["count"] = -"$4";"; + count=count+1}}' $FREEZING_STATION_FILE > $FREEZING_STATION_COORD_FILE + +# +# Retrieve the number of records in the coodinate file. +# +num_coord_records=`wc -l $FREEZING_STATION_COORD_FILE | cut -f1 -d' '` + +num_coord_records=`echo $num_coord_records | xargs -i expr {} / 2` +num_coord_records=`echo $num_coord_records | xargs -i expr {} - 1` + +# +# Insert the lat/lon coords into the ruc.pl script. +# +echo $FREEZING_STATION_COORD_FILE | \ + xargs -i sed '3r{}' $RUN_FROM_DIR/ruc.pl.template > ruc.pl.temp + +# +# Modify the ruc.pl script to contain the correct number of lat/lon +# coordinate pairs to process. +# +echo $num_coord_records | xargs -i sed 's/#####/{}/g' ruc.pl.temp > ruc.pl + +# +# Remove the temporary file. +# +rm -f ruc.pl.temp +rm -f $FREEZING_STATION_COORD_FILE + +# +# Change the permissions on the ruc.pl script so that they are executable +# by all. +# +chmod 755 ruc.pl + +# +# Done +# + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_ffg b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_ffg new file mode 100755 index 0000000000..ea56ae8cbd --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_ffg @@ -0,0 +1,41 @@ +#!/bin/ksh +# run_gen_areal_ffg +# July 19, 2002 + +# This allows you to call this script from outside of ./whfs/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) + +# +# Check if gaff execution is desired +# + +GAFFEXEC=$(get_apps_defaults gaff_execution) + +if [[ $GAFFEXEC = "OFF" || $GAFFEXEC = "off" ]]; then + exit 1 + fi + +# +# Setup log file +# + +Date=`date -u +%m%d` +LOG_FILE=$DPA_LOG_DIR/gen_areal_ffg_log_$Date + +# +# Run gen_areal_ffg from the appropriate directory +# + +runso rary.ohd.pproc gen_areal_ffg_main >> $LOG_FILE + +# Write ending info to log file + + +DTZ=`date -u +%a@%H:%M:%S` +echo $DTZ: Completed job. >>$LOG_FILE +echo "-------------" >>$LOG_FILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_qpe b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_qpe new file mode 100755 index 0000000000..223b57313a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_qpe @@ -0,0 +1,36 @@ +#!/bin/ksh +# +# process_qpe_files + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# Create error log file name +logname=`date -u +error.%Y%m%d%H%M%S` +errorlog=$MPE_LOG_DIR/$logname + +# +# Run mpe_fieldgen for the number of hours specified +# Delete error log if empty +# + +RFC_LIST=XXXXX,YYYYY +DURATION_LIST=1,3,6 + +export geo_data=/awips/hydroapps/geo_data +export st3_rfc=host +export gaq_input_dir=. +export gaq_output_xmrg_dir=. +export gaq_output_netcdf_dir=. + +$PPROC_BIN/gen_areal_qpe$OS_SUFFIX -r$RFC_LIST -h$DURATION_LIST + +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gribit b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gribit new file mode 100755 index 0000000000..efedd56f6c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_gribit @@ -0,0 +1,272 @@ +#!/bin/ksh +# ===================================================================== +# +# run_gribit script +# +# This script was previously known as "gribits" +# + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export grib_out_dir=$(get_apps_defaults mpe_grib_dir) +export grib_in_dir=$(get_apps_defaults rfcwide_xmrg_dir) + +USAGE="usage:run_gribit [-p pgm] [-b bin_dir] [-f file_set] [-i in_file] +[-n in_dir] [-o out_file] [-t out_dir] [-c control] [-g geo_dir] +[-h hrap_coord_file] [-d debug_level] [-l logfile] [-v verbose] +[-s search_order]" + +# ===================================================================== +# Switch Description Default value +# ------ ------------------------------ -------------------------- +# -p Program name. gribit +# +# -f File set override for st3_rfc, Sets indicated by st3_rfc, +# ofs_level, ffg_level tokens. ofs_level, ffg_level tokens. +# +# -i Input file name. None. Program prompt. +# +# -n Input directory and path OR: Use input directory and path +# sat - $rfcwide_satpre_dir indicated by the $grib_in_dir +# token token. +# mpe - $rfcwide_xmrg_dir token +# s3 - $ofs_griddb_dir token +# ffg - $ffg_gridff_dir token +# ro - $ffg_gridro_dir token +# +# -o Output file name. None. Program prompt. +# +# -t Output directory and path. Use output directory and path +# indicated by the $grib_out_dir +# token. +# +# -c Control: g - Encode XMRG into GRIB. +# g - encode XMRG into GRIB +# u - unpack GRIB and output to +# log file +# x - decode GRIB to XMRG file +# +# -g Geo directory (HRAP coordinates Use directory indicated by +# directory) the $geo_st3_ascii token. +# +# -h HRAP coordinate domain file coord.dat +# +# -d Debug level (d1, d2, or d3). Debug off (level = 0) +# +# -l Log file on. Log file off. +# +# -v Verbose program prompts. Suppress program prompts. +# +# -s Parameter table search sequence Parameter table search +# - use user-defined table, if sequence: +# available - use built-in Table 2 NCEP +# - use built-in Table 128 - use built-in Table 128 +# - use built-in Table 2 (NCEP) - use user-defined table, +# if available +# +# Note: -g and -h commands used only with command -c x. +# +# ===================================================================== + +# Initialize command line parameters + + Pgm_cl="" + Fl_set_cl="" + Infil_cl="" + Nindir_cl="" + Otfil_cl="" + Toutdir_cl="" + Control_cl="" + Geo_cl="" + Hcoord_cl="" + Dbug_set_cl="" + Log_prt="off" + Vrb_set_cl="no" + Search_set_cl="0" + +# check parameters were entered on the command line +while getopts :p:f:i:n:o:t:c:g:h:d:b:lvs cl_args ; do + case $cl_args in + p) Pgm_cl=$OPTARG;; + f) Fl_set_cl=$OPTARG;; + i) Infil_cl=$OPTARG;; + n) Nindir_cl=$OPTARG;; + o) Otfil_cl=$OPTARG;; + t) Toutdir_cl=$OPTARG;; + c) Control_cl=$OPTARG;; + g) Geo_cl=$OPTARG;; + h) Hcoord_cl=$OPTARG;; + d) Dbug_set_cl=$OPTARG;; + l) Log_prt="on";; + v) Vrb_set_cl="yes";; + s) Search_set_cl="1";; + \?) bad_sw=YES;; + esac + done + +# set parameters for program execution + +if [[ $Pgm_cl = "" ]] ; then + Pgm="gribit.LX" + else + Pgm=$Pgm_cl + fi + +if [[ $Infil_cl != "" ]] ; then + export grib_in_file=$Infil_cl + fi + +if [[ $Otfil_cl != "" ]] ; then + export grib_out_file=$Otfil_cl + fi + +if [[ $Fl_set_cl = "" ]] ; then + Rfcname=$(get_apps_defaults st3_rfc) + Ofs_lev=$(get_apps_defaults ofs_level) + Ffg_lev=$(get_apps_defaults ffg_level) + else + Rfcname=$Fl_set_cl + Ofs_lev=$Fl_set_cl + Ffg_lev=$Fl_set_cl + export st3_rfc=$Fl_set_cl + export Rfcw_rfcname=$Fl_set_cl + export ofs_level=$Ofs_lev + export ffg_level=$Ffg_lev + fi + +export hrap_domain_id=$Rfcname + +# set input and output directories - can override output directory using -t +P1="" +if [[ $Nindir_cl = "sat" ]] ; then + P1=$(get_apps_defaults pproc_dir) + export grib_in_dir=$P1/"input/rfcwide"/$Rfcname/"satpre" + export grib_out_dir=$(get_apps_defaults grib_dir)/output + elif [[ $Nindir_cl = "mpe" ]] ; then + P1=$(get_apps_defaults ofs_files) + export grib_in_dir=$P1/$Ofs_lev/"griddb/xmrg" + export grib_out_dir=$(get_apps_defaults grib_dir)/output + elif [[ $Nindir_cl = "s3" ]] ; then + P1=$(get_apps_defaults ofs_files) + export grib_in_dir=$P1/$Ofs_lev/"griddb" + export grib_out_dir=$(get_apps_defaults grib_dir)/output + elif [[ $Nindir_cl = "ffg" ]] ; then + P1=$(get_apps_defaults ffg_files) + P2=$(get_apps_defaults ffg_gff_level) + export grib_in_dir=$P1/$Ffg_lev/$P2 + export grib_out_dir=$(get_apps_defaults ffg_out_dir)/grib + elif [[ $Nindir_cl = "ro" ]] ; then + P1=$(get_apps_defaults ffg_files) + P2=$(get_apps_defaults ffg_gro_level) + export grib_in_dir=$P1/$Ffg_lev/$P2 + export grib_out_dir=$(get_apps_defaults ffg_out_dir)/grib + fi + +if [[ $Control_cl != "" ]] ; then + export grib_ctl=$Control_cl + fi + +if [[ $Control_cl != "x" ]] ; then + if [[ $P1 = "" && $Nindir_cl != "" ]] ; then + export grib_in_dir=$Nindir_cl + fi + if [[ $Toutdir_cl != "" ]] ; then + export grib_out_dir=$Toutdir_cl + fi + elif [[ $Control_cl = "x" ]] ; then + if [[ $P1 = "" && $Nindir_cl != "" ]] ; then + export grib_out_dir=$Nindir_cl + fi + if [[ $Toutdir_cl != "" ]] ; then + export grib_in_dir=$Toutdir_cl + fi + if [[ $Geo_cl = "" ]] ; then + P3=$(get_apps_defaults geo_data) + export hrap_domain_dir=$P3/$Rfcname/"ascii" + else + export hrap_domain_dir=$Geo_cl + fi + if [[ $Hcoord_cl = "" ]] ; then + export hrap_domain_file="coord_"$Rfcname".dat" + else + export hrap_domain_file=$Hcoord_cl + fi + fi + +if [[ $Dbug_set_cl != "" ]] ; then + export grib_debug_output=$Dbug_set_cl + fi + +if [[ $Log_prt = "on" ]] ; then + export grib_log_output="on" + fi + +if [[ $Search_set_cl = "1" ]] ; then + export grib_ptbl_search="1" + fi + +if [[ $Vrb_set_cl = "yes" ]] ; then + export grib_verbose="yes" + #echo "Script gribits : Release $Release - $Date" + echo "Script gribits" + echo "The GRIB output directory is : $(get_apps_defaults grib_out_dir)" + echo "The XMRG input directory is : $(get_apps_defaults grib_in_dir)" + echo "The GRIB output file is : $(get_apps_defaults grib_out_file)" + echo "The XMRG input file is : $(get_apps_defaults grib_in_file)" + if [ "$P1" != "" ] ; then + echo " $P1" + fi + if [ "$P2" != "" ] ; then + echo " $P2" + fi + echo "Rfcname is : $Rfcname" + if [[ $Control_cl = "x" ]] ; then + echo "The hrap_domain directory is : $(get_apps_defaults hrap_domain_dir)" + echo "The hrap_domain file is : $(get_apps_defaults hrap_domain_file)" + fi + fi + +#if [[ $Bin_set_cl = "" ]] ; then +# Ex_dir=$(get_apps_defaults grib_dir)/bin/RELEASE +# #Added by Guoxian Zhou 06/17/2003 +# [ -n "$(get_apps_defaults grib_rls) +# elif [[ $Bin_set_cl = "d" ]] ; then +# Ex_dir=$(get_apps_defaults my_dir)/bin +# #Added by Guoxian Zhou 06/17/2003 +# [ -n "$(get_apps_defaults my_rls) +# elif [[ $Bin_set_cl = "a" ]] ; then +# Ex_dir=$(get_apps_defaults grib_dir)/bin/ARCHIVE +# elif [[ $Bin_set_cl = "m" ]] ; then +# Ex_dir=$(get_apps_defaults +# #Added by Guoxian Zhou 06/17/2003 +# [ -n "$(get_apps_defaults mgr_rls) +# elif [[ $Bin_set_cl = "ma" ]] ; then +# Ex_dir=$(get_apps_defaults mgr_dir)/bin/ARCHIVE +# else +# Ex_dir=$Bin_set_cl +# fi + +Ex_dir=$(get_apps_defaults pproc_bin) + +#if [ ! -d $Ex_dir ] ; then +# print "ERROR: directory $Ex_dir not found." +# exit 1 +# fi +#if [ ! -f $Ex_dir/$Pgm ] ; then +# print "ERROR: program $Pgm not found in directory $Ex_dir." + # exit 1 +# fi + +if [[ $Vrb_set_cl = "yes" ]] ; then + echo "Executing from : $Ex_dir/$Pgm" + fi + +eval $Ex_dir/$Pgm +#runso rary.ohd.pproc gribit_main_main_ +echo GRIBIT DONE +#=============================================================== + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_hpe_fieldgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_hpe_fieldgen new file mode 100755 index 0000000000..547c61f909 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_hpe_fieldgen @@ -0,0 +1,42 @@ +#!/bin/ksh +# run_hpe_fieldgen +# +# This script calls the High-resolution Precipitation Estimator (HPE) +# Field Generator executable. Adapted from run_mpe_fieldgen +# +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env + +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export FXA_LOCAL_SITE=OAX + +# Create error log file name +logname=`date -u +error.%Y%m%d%H%M%S` +normalprint=`date -u +print.%Y%m%d%H%M%S` +errorlog=$HPE_LOG_DIR/$logname +printlog=$HPE_LOG_DIR/$normalprint + +# +# Run hpe_fieldgen for the number of runs specified + +export HPE_TIMELAG=`get_apps_defaults hpe_timelag` + +if [[ $1 -gt $HPE_TIMELAG ]] +then + HPE_TIMELAG=$1 +fi + +runso rary.ohd.pproc hpe_fieldgen_main -l $HPE_TIMELAG >> $printlog 2>> $errorlog + +# Delete error and normal print logs if empty +if [[ ! -s $errorlog ]] + then + rm -f $errorlog +fi +if [[ ! -s $printlog ]] +then + rm -f $printlog +fi +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_lightning_proc b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_lightning_proc new file mode 100755 index 0000000000..c7f18d3e56 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_lightning_proc @@ -0,0 +1,131 @@ +#!/bin/ksh +# +# This script gathers the lightning data from the file in netcdf format and +# inserts them in the "lightning" table. +# + +# umask 002 # which is 775 (rwxrwxr_x) or umask 001 = 776 (rwxrwxrw_) + +RUN_FROM_DIR=`dirname $0` + +. $RUN_FROM_DIR/../../set_hydro_env +export LIGHTNING_LOG_DIR=$(get_apps_defaults lightning_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + +echo Starting... +INFILE=`get_apps_defaults lightning_input_dir` + +TEMPDIR=$LIGHTNING_LOG_DIR +export INFILE TEMPDIR + +# +# set up log filename +# + +TZ=GMT +export TZ + +Dte=`date +%m%d%Y` +logfnm=$LIGHTNING_LOG_DIR/lightning_proc_log_$Dte +echo $logfnm + +Starttime=`date` +echo "-------- Run_lightning_proc started at: $Starttime --------" >> $logfnm +echo "****** Operating system is " `uname` >> $logfnm +echo "****** Database name is $DB_NAME " >> $logfnm +### Get current the year, Month, Day +YY=`date '+%Y'` +MM=`date '+%m'` +DD=`date '+%d'` +HR=`date '+%H'` + +### Compute 1 hour behind from current time +hour=`expr $HR - 1` + +### Compute ending day of a month or month of a year +if [ $hour -le 9 ] + then + hour=0${hour} + else + hour=${hour} +fi + +if [ $hour -lt 0 ] +then + hour=23 + DD=`expr $DD - 1` + + if [ $DD -le 9 ] + then + DD=0${DD} + else + DD=${DD} + fi + + if [ $DD -eq 0 ] + then + MM=`expr $MM - 1` + if [ $MM -le 9 ] + then + MM=0${MM} + else + MM=${MM} + fi + + if [ $MM -eq 0 ] + then + MM=12 + YY=`expr $YY - 1` + fi + case $MM in + 02) YRMOD=`expr $YY % 4` #Leap year + if [ $YRMOD -eq 0 -o $YY -eq 00 ] #do not change -eq 0 and -eq 00 + then + DD=29 + else + DD=28 + fi + ;; + 04|06|09|11) DD=30 + ;; + 01|03|05|07|08|10|12) DD=31 + ;; + *) echo "ERROR!!! Invalid month $MM" >> $logfnm + exit + ;; + esac + fi +fi + +Datetime=${YY}${MM}${DD}_${hour}00 +echo "$Datetime is the file that will be processed." >> $logfnm + +#** Copy file to data dir +if [ -f "$INFILE/$Datetime" ]; then + cp $INFILE/$Datetime $TEMPDIR/. + fstat=$? + if test $fstat -ne 0; then + echo "ERROR: copy $TEMPDIR/$Datetime failed." >> $logfnm + else + echo "copy $TEMPDIR/$Datetime succeeded." >> $logfnm + chmod 755 $TEMPDIR/2* + fi +else + echo "WARNING: CAN NOT FIND FILE $INFILE/$Datetime !!!" >> $logfnm + Endtime=`date` + echo "-------- Run_lightning_proc ended at: $Endtime --------" >> $logfnm + echo " " >> $logfnm + exit +fi + +#*** Run lightning_proc program to process data +for fname in `ls -1F $TEMPDIR/2*` +do + echo Processing $fname >> $logfnm + runso rary.ohd.pproc lightning_proc_main $fname >> $logfnm 2>>$logfnm + rm -f $fname +done + +Endtime=`date` +echo "-------- Run_lightning_proc ended at: $Endtime --------" >> $logfnm +echo " " >> $logfnm diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_fieldgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_fieldgen new file mode 100755 index 0000000000..be440efc6b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_fieldgen @@ -0,0 +1,53 @@ +#!/bin/ksh +# run_mpe_fieldgen + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_INVOKE_MAP_PREPROCESS=$(get_apps_defaults sshp_invoke_map_preprocess) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export MPE_GAGE_QC=$(get_apps_defaults mpe_gage_qc) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_LOCAL_BIN=$(get_apps_defaults pproc_local_bin) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export FXA_LOCAL_SITE=$(get_apps_defaults fxa_local_site) + +# Create error log file name +logname=`date -u +error.%Y%m%d%H%M%S` +errorlog=$MPE_LOG_DIR/$logname + + +# +# run build_hourly script which generates hourly +# PP reports based on sub-hourly PP reports. +# it defaults to the top of the current hour + +$PPROC_LOCAL_BIN/run_build_hourly + +# +# Run mpe_fieldgen for the number of hours specified +# Delete error log if empty +# + +runso rary.ohd.pproc mpe_fieldgen_main $@ 2>>$errorlog +echo mpe_fieldgen error log located at: $errorlog + +if [ "$SSHP_INVOKE_MAP_PREPROCESS" = "ON" ] +then + $WHFS_BIN_DIR/run_SSHP_MAP_preprocess >$SSHP_LOG_DIR/MAPPreprocessor.stdout.log 2>>$SSHP_LOG_DIR/MAPPreprocessor.stdout.log & + +fi + +if [[ ! -s $errorlog ]] + then + rm -f $errorlog + fi + + # Run Biasmesgen. +# this should only be run at WFOs +$PPROC_BIN/run_biasmesgen + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_whfs b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_whfs new file mode 100755 index 0000000000..8cc81d14b5 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_whfs @@ -0,0 +1,110 @@ +#!/bin/ksh + +# run_mpe_whfs +# run script for set of programs to complete mpe analysis +# 06/06/2006 + +# This allows you to run this script outside of ./standard/bin +# +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +#. $FXA_HOME/readenv.sh + +# Set up some environment variables for WHFS applications +# +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_INVOKE_MAP_PREPROCESS=$(get_apps_defaults sshp_invoke_map_preprocess) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export MPE_GAGE_QC=$(get_apps_defaults mpe_gage_qc) +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_LOCAL_BIN=$(get_apps_defaults pproc_local_bin) +export PPROC_LOG=$(get_apps_defaults pproc_log) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# Setup log output file name +# +fnm=$PPROC_LOG/misc/run_mpe_whfs.log +tmp=$PPROC_LOG/misc/run_mpe_whfs.tmp + +# Save only the latest events in the log file +# +tail -1200 $fnm > $tmp +mv $tmp $fnm +chmod 777 $fnm + +# Run the series of programs +# +echo "---------------------------------------------" >> $fnm + +# build hourly precip reports from sub-hourly data. +# +Dte=`date -u` +echo "Initiating build_hourly job at: "$Dte >> $fnm +$PPROC_LOCAL_BIN/run_build_hourly + +# Run lightning data retrieval process if token set +# +if [ $MPE_GAGE_QC = "ON" ] +then + Dte=`date -u` + echo "Initiating lightning proc job at: "$Dte >> $fnm + $PPROC_BIN/run_lightning_proc +else + echo "Not running lightning proc job since mpe_gage_qc is OFF" >> $fnm +fi + +# run mpe_fieldgen +# Create fieldgen error log file name; later, delete error log if empty + +Dte=`date -u` +echo "Initiating mpe_fieldgen at: "$Dte >> $fnm + +logname=`date -u +error.%Y%m%d%H%M%S` +errorlog=$MPE_LOG_DIR/$logname + +NUM_HOURS=$1 +echo $errorlog +runso rary.ohd.pproc mpe_fieldgen_main $NUM_HOURS 1>>$fnm 2>>$errorlog + +if [[ ! -s $errorlog ]] +then + rm -f $errorlog +fi + +# Run the SiteSpecific MAP preprocessor if token set, to get basin MAP estimates +# +if [ "$SSHP_INVOKE_MAP_PREPROCESS" = "ON" ] +then + echo "Initiating run_SSHP_MAP_preprocess at: "$Dte >> $fnm + $WHFS_BIN_DIR/run_SSHP_MAP_preprocess \ + >$SSHP_LOG_DIR/MAPPreprocessor.stdout.log 2>>$SSHP_LOG_DIR/MAPPreprocessor.stdout.log & +fi + +# Run Biasmesgen. +# this should only be run at WFOs + +Dte=`date -u` +echo "Initiating run_biasmesgen at: "$Dte >> $fnm + +$PPROC_BIN/run_biasmesgen + +# +# initiate the script to transmit the best estimate QPE +# from the RFCs to the WFOs. This should not be +# enabled at the WFOs. + +#Dte=`date -u` +#echo "Initiating transmit_rfc_qpe at: "$Dte >> $fnm +#$PPROC_LOCAL_BIN/transmit_rfc_qpe + +# wrap it up +# +Dte=`date -u` +echo "Completed run_mpe_whfs job at: "$Dte >> $fnm diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_post_analysis b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_post_analysis new file mode 100755 index 0000000000..561019e71f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/run_post_analysis @@ -0,0 +1,55 @@ +#!/bin/ksh +# run_post_analysis +# October 18, 2005 + +# This allows you to call this script from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export MPE_LOG_DIR=$(get_apps_defaults rfcwide_logs_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export DB_NAME=$(get_apps_defaults db_name) + +#set the resource file searching directory +XAPPLRESDIR=$RUN_FROM_DIR +export XAPPLRESDIR + +#---------------------------------------------------------------------- +# Setup log file name +# +LOGFILE=$MPE_LOG_DIR/post_analysis.log +TEMPFILE=$MPE_LOG_DIR/post_analysis.tmp +# +HOSTNAME=`hostname` +# +# save only the latest events in the log file +# +if [ -f $LOGFILE ] + then + { + tail -1200 $LOGFILE > $TEMPFILE + mv $TEMPFILE $LOGFILE + } + else + echo "--------------------------" > $LOGFILE + fi + +# log start of script +# +echo "------------------------------ " >> $LOGFILE +Dte=`date -u` +echo Invoking $PPROC_BIN/post_analysis$OS_SUFFIX at $Dte >> $LOGFILE +echo Current system: $HOSTNAME >> $LOGFILE +echo Current database: $DB_NAME >> $LOGFILE + +# +# program usage: +# post_analysis [-ddebug] [-t> $LOGFILE 2>&1 + +Dte=`date -u ` +echo Completed post_analysis at $Dte >> $LOGFILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/send_message.py b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/send_message.py new file mode 100644 index 0000000000..3a77ef38cf --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/send_message.py @@ -0,0 +1,24 @@ +###!$(awips_home)/bin/python + +import qpid +import sys +import os +from qpid.util import connect +from qpid.connection import Connection +from qpid.datatypes import Message, RangedSet, uuid4 +from qpid.queue import Empty + +host="QPID_SERVER" +port=5672 +user="guest" +password="guest" + +# Create a connection. +socket = connect(host, port) +connection = Connection (sock=socket) +connection.start() +session = connection.session(str(uuid4())) + +props = session.delivery_properties(routing_key="edex.HPE") +session.message_transfer(destination="amq.topic", message=Message(props,"HPE Fieldgen finished run.")) + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_gage_pp b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_gage_pp new file mode 100755 index 0000000000..cad17b539e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_gage_pp @@ -0,0 +1,165 @@ +#!/bin/ksh +# ============================================================== +# start_gage_pp - script to start up the Gage Precip Processor +# +# This script will return one of the following completion codes +# to the operating system indicating success or failure of its attempt +# to start the Gage Precip Processor program: +# +# 0 The attempt to start Gage Precip Processor was successful. +# 1 An invalid argument was passed to this script. +# 2 The gage_pp_userid token is not defined. +# 3 The user does not have permission to start Gage Precip Processor. +# 4 The directory specified for data files does not exist. +# 5 The directory specified for the log files does not exist. +# 6 The directory specified for the error files does not exist. +# 7 The directory specified for the executables does not exist. +# 8 The Gage Precip Processor is already running. +# 9 The Gage Precip Processor is not allowed to run on this system. +# Check the gage_pp_host token for the valid system name. +# 10 The gage_pp_enable token is off. There will be no data for gage_pp +# to process. Gage_pp will not be started. +# +# Revision History +# Moria Shebsovich July 2, 2004 Created. +# +# ================================================================= + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` +HOSTNAME=`hostname` + +# +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export GAGE_PP_USERID=$(get_apps_defaults gage_pp_userid) +export GAGE_PP_HOST=$(get_apps_defaults gage_pp_host) +export GAGE_PP_ENABLE=$(get_apps_defaults gage_pp_enable) +export GAGE_PP_DATA=$(get_apps_defaults gage_pp_data) +export GAGE_PP_LOG=$(get_apps_defaults gage_pp_log) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +GAGE_PP_LOGDIR=$GAGE_PP_LOG + +if [[ ! -d $GAGE_PP_LOGDIR ]] + then + print "start_gage_pp: Directory specified for log files does not " \ + "exist " $GAGE_PP_LOGDIR + exit 5 +fi + +# +# define the gage_pp daily log file name +LOGFILE=`date +gage_pp_log_%m%d` +GAGE_PP_LOGFILE=$GAGE_PP_LOGDIR/$LOGFILE + +# Check to make sure that the gage_pp_enable token is set to ON. +if [[ $GAGE_PP_ENABLE != "ON" ]] +then + + print "gage_pp_enable token must be set to 'ON'. Gage Precip Processor" \ + "not started." | tee -a $GAGE_PP_LOGFILE + exit 10 +fi + +# Check which system the Gage Precip Processor is allowed to run on. +# This is specified by the gage_pp_host token which is represented +# by the GAGE_PP_HOST variable set in set_hydro_env. +# If this script is not being run on that system, then log an error message. + +COMPARISON_STRING=`echo $HOSTNAME $GAGE_PP_HOST | awk -F' ' 'match ($1, $2)'` + +if test -z "$COMPARISON_STRING" +then + + print "Gage Precip Processor cannot be started on '$HOSTNAME'" \ + "It can only be started from '$GAGE_PP_HOST'." >> $GAGE_PP_LOGFILE + exit 9 +fi + +# First check to see if the user trying to start process is the one +# allowed to do it +if [[ $GAGE_PP_USERID = "" ]] + then + print start_gage_pp: User allowed to start Gage Precip Processor \ + has not been assigned. >> $GAGE_PP_LOGFILE + print " "Please assign a user id to the 'gage_pp_userid' >> $GAGE_PP_LOGFILE + print " "token for the get_apps_defaults process. >> $GAGE_PP_LOGFILE + exit 2 +fi + +if [ $LOGNAME != $GAGE_PP_USERID ] + then + print start_gage_pp: User $LOGNAME is not allowed to start \ + Gage Precip Processor. >> $GAGE_PP_LOGFILE + print " "Only user $GAGE_PP_USERID can start Gage Precip Processor! >> $GAGE_PP_LOGFILE + exit 3 +fi + +# +# get the directory specifications + + GAGEPPDATA=$GAGE_PP_DATA + GAGEPPBIN=$PPROC_BIN + +# +# Check to see if Gage Precip Processor data, log, and error directories exists + + if [[ ! -d $GAGEPPDATA ]] + then + print "start_gage_pp: Directory specified for data files does not " \ + "exist " $GAGEPPDATA >> $GAGE_PP_LOGFILE + exit 4 + fi + + + if [[ ! -d $GAGEPPBIN ]] + then + print "start_gage_pp: Directory specified for executables does not " \ + "exist " $GAGEPPBIN >> $GAGE_PP_LOGFILE + exit 7 + fi + +# Check if there is an instance of the Gage Precip Processor already running +# for this input data directory, and on this machine +# first, get the pid of the most recent run of the gage_pp +# for this input data directory + +export DUPSTART_LOGFILE=$GAGE_PP_LOGDIR/duplicate_start.log + +export PIDFILE=$GAGEPPDATA/gage_pp_pid.dat +export FILEPID=`cat $PIDFILE` + +if [[ $FILEPID != "" ]] +then + if ps -p $FILEPID | grep gage_pp > /dev/null 2>&1 + then + print "***********************************************" >> $DUPSTART_LOGFILE + print "Gage Precip Processor ALREADY running (pid $FILEPID)." >> $DUPSTART_LOGFILE + print "Additional run prevented. $(date -u) " >> $DUPSTART_LOGFILE + print " " >> $DUPSTART_LOGFILE + + exit 8 + fi +fi + + +# Announce startup of gage_pp + +print ===================================================================== >> $GAGE_PP_LOGFILE +print Starting gage_pp$OS_SUFFIX as $LOGNAME at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") on $HOSTNAME >> $GAGE_PP_LOGFILE +print ===================================================================== >> $GAGE_PP_LOGFILE +print " " >> $GAGE_PP_LOGFILE + + +# Remove stop flag file if it exists + + rm -f $GAGEPPDATA/stop_gage_pp + +# Start program in background +# Redirect standard input and output to /dev/null so that +# gage_pp.OS does not hang up when called from ssh. + $GAGEPPBIN/gage_pp$OS_SUFFIX < /dev/null > /dev/null 2>&1 & + + exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe new file mode 100755 index 0000000000..abb8f1afc5 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe @@ -0,0 +1,240 @@ +#!/bin/ksh +# +# This script is normally started by or stopped from the DHRgather script +# which runs via cron at set user time to check what precipitation cat +# all the radars in a WFO or RFC AOR are in. +# If any are in precip mode, the decoders and HPE field generator below +# will start if they're not running. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DSP_PROD_DIR=$(get_apps_defaults dsp_prod_dir) +export DHR_PROD_DIR=$(get_apps_defaults dhr_prod_dir) +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +test -e $HPE_LOG_DIR/start_hpe_ctl +FOUND=$? +if test FOUND -eq 1 +then + touch $HPE_LOG_DIR/start_hpe_ctl +fi + +# +# define functions for checking for a stop file and +# logging a message. note that for the +# shell function "test", a true condition returns 0. + +checkHPEstop() +{ + STOP_DIR=$1 + test -r $STOP_DIR/stop_hpe_process + FILES_FOUND=$? + if test $FILES_FOUND -eq 0 + then + +# delay stopping just to make sure that there really isn't any precip +# for all radars within the CWFA +# check the time for the file against the current time +# if greater than 20 minutes then stop HPE + + tnow=`date +%s` + tfile=`date +%s -r $STOP_DIR/stop_hpe_process` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -ge 1200 ]] + then + return 1 + else + echo "stop_hpe_process file found. Will stop HPE after 1200 sec (20min) " >> $hpefnm + echo "unless new precip occurs within that time. Time elapsed = $agesecs seconds " \ + >> $STOP_DIR/processhpe_log + return 2 + fi + + else + return 0 + fi +} + +checkDataRun() +{ + # Check to see if age on file is more than 20 minutes + tnow=`date +%s` + tfile=`date +%s -r $HPE_LOG_DIR/start_hpe_log` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -ge 1200 ]] + then + return 1 + else + return 2 + fi +} + +logHPEstop() +{ + LOG_FILE=$1 + + DTZ=`date -u` + echo "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> $LOG_FILE + echo "Terminating HPE processes." >> $LOG_FILE + echo "Stopfile found at:" $DTZ >> $LOG_FILE + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" >> $LOG_FILE + + return 0 +} + + + +hpefnm=$HPE_LOG_DIR/processhpe_log +hpetmp=$HPE_LOG_DIR/processhpe_tmp + +# Remove the stop file because either at least one radar has +# indicated there's precip or this script was started manually. +# Script will check if one has been entered after it starts. + +if [[ -r $HPE_LOG_DIR/stop_hpe_process ]] +then + rm -f $HPE_LOG_DIR/stop_hpe_process +fi + +# get the time lag variable to check against data files +# + +TIMELAG=`get_apps_defaults hpe_timelag` + +# +# enter an infinite loop. for each pass thru main loop, +# run the DHR and DSP decoders every minute. Then check to +# see when the HPE field generator should be run according to +# the users frequency token. Will do this until there's no more +# precip in the WFO or RFC AOR and this script is stopped. +# + +Dte=`date -u` +echo "" >> $hpefnm +echo "HPE processing starting up " $Dte >> $hpefnm +echo "DHR and DSP decoders running every minute" >> $hpefnm + +let "loop_cnt=0" + +HPE_RUNFREQ=`get_apps_defaults hpe_runfreq` +echo "HPE Run Frequency $HPE_RUNFREQ minutes " >> $hpefnm + +while true +do + +# +# save log latest entries +# + + if [[ -s $hpefnm ]] + then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm + fi + + checkHPEstop $HPE_LOG_DIR + STOP_FOUND=$? + + if test STOP_FOUND -eq 1 + then + + echo "Elapsed time reached, stopping..." >> $hpefnm + + +# if there's no precip in area, remove the temp files +# + if [[ -d $DHR_PROD_DIR && -n "$DHR_PROD_DIR" ]] + then + echo "Removing temp DHR files in $DHR_PROD_DIR due to no rain " $Dte \ + >> $hpefnm + rm -f $DHR_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DHR PROD DIR $DHR_PROD_DIR invalid " $Dte >> $hpefnm + fi + + if [[ -d $DSP_PROD_DIR && -n "$DSP_PROD_DIR" ]] + then + echo "Removing temp DSP files in $DSP_PROD_DIR due to no rain " $Dte >> $hpefnm + rm -f $DSP_PROD_DIR/* + else + echo "Attempted to remove files but " >> $hpefnm + echo "DSP PROD DIR $DSP_PROD_DIR invalid " $Dte >> $hpefnm + fi + + logHPEstop $hpefnm + exit 0 + elif test STOP_FOUND -eq 2 + then + echo "Stop condition not met, continuing..." >> $hpefnm + fi + + checkDataRun $HPE_LOG_DIR + DATA_RUN=$? + + if test DATA_RUN -eq 1 + then + echo "No data received in 20 minutes, exiting. " `date -u` >> $hpefnm + exit 0 + fi + + $PPROC_BIN/Run_DecodeDHR + DHRDECODE_RUN=$? + if test $DHRDECODE_RUN -eq 0 + then + echo "Finished running dhr decoders " `date -u` >> $hpefnm + fi + $PPROC_BIN/Run_DecodeDSP + DSPDECODE_RUN=$? + if test $DSPDECODE_RUN -eq 0 + then + echo "Finished running dsp decoders " `date -u` >> $hpefnm + fi + + sleep 60 + +# Check to see if age on file is more than $HPE_RUNFREQ minutes + runfreq=$(($HPE_RUNFREQ * 60)) + tnow=`date +%s` + tfile=`date +%s -r $HPE_LOG_DIR/start_hpe_ctl` + agesecs=$(($tnow-$tfile)) + if [[ $agesecs -lt $runfreq ]] + then + let "loop_cnt=1" + else + let "loop_cnt=2" + fi + +# checking every run allows the user to change this run frequency + + if [[ loop_cnt -eq 2 ]] + then +# +# get the time lag variable again in case it has changed +# + + touch $HPE_LOG_DIR/start_hpe_ctl + echo "touching start_hpe_ctl file before starting hpe_fieldgen " $Dte >> $hpefnm + Dte=`date -u` + TIMELAG=`get_apps_defaults hpe_timelag` + echo "starting HPE field generator with time lag of $TIMELAG minutes " $Dte >> $hpefnm + $PPROC_BIN/run_hpe_fieldgen $TIMELAG + + # checking every run allows the user to change this run frequency + HPE_RUNFREQ2=`get_apps_defaults hpe_runfreq` + + if [[ $HPE_RUNFREQ -ne $HPE_RUNFREQ2 ]] + then + HPE_RUNFREQ=$HPE_RUNFREQ2 + echo "HPE run freq changed to $HPE_RUNFREQ minutes " >> $hpefnm + fi + fi +done +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe_crons b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe_crons new file mode 100755 index 0000000000..df223a65d2 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe_crons @@ -0,0 +1,72 @@ +#!/bin/ksh + +# +# script for allowing the restart of the HPE crons +# +# HPE crons to gather radar information run every minute +# This script just removes the stop file if present which the crons +# are looking for so that they can start again via the cron. +# +# David T. Miller RSIS OHD/HSEB +# October 31, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + +# this script uses the following set_hydro_env variables: +# HPE_LOG_DIR +# + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# setup log files +# + +if [[ ! -d $HPE_LOG_DIR ]] +then + print "Directory specified for placing stop_hpe_crons file does not exist " $HPE_LOG_DIR + echo "Directory specified for placing stop_hpe_crons file does not exist " $HPE_LOG_DIR + + exit -1 +fi + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp + + +# +# save latest entries in log file +# + + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +echo "Attempting to remove stop_hpe_crons file... " >> $hpefnm + +if [[ -r $HPE_LOG_DIR/stop_hpe_crons ]] +then + rm -f $HPE_LOG_DIR/stop_hpe_crons + echo "stop_hpe_crons file has been removed." >> $hpefnm + echo "HPE radar data processes should now restart via cron " >> $hpefnm + +# so user will see this on the screen as well since this is a manual process + + echo "stop_hpe_crons file has been removed." + echo "HPE radar data processes should now restart via cron " + +else + echo "stop_hpe_crons file does not exist. " >> $hpefnm + echo "stop_hpe_crons file does not exist. " + +fi + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_mpe_editor b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_mpe_editor new file mode 100755 index 0000000000..aeb6331dbf --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_mpe_editor @@ -0,0 +1,28 @@ +#!/bin/ksh +# start_hmap_mpe + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +. $FXA_HOME/readenv.sh + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +XAPPLRESDIR=$RUN_FROM_DIR +export XAPPLRESDIR + +# for calling Java (for the ColorManager in this case) from withing a C program +# already added LD_LIBRARY_PATH to set_hydro_env +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/timeserieslite.jar:$WHFS_BIN_DIR/MiscDialogs.jar + +xterm -T mpe_editor$OS_SUFFIX -iconic -n mpe_editor \ + -e $RUN_FROM_DIR/mpe_editor$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_process_dpafiles b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_process_dpafiles new file mode 100755 index 0000000000..88a3dba095 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/start_process_dpafiles @@ -0,0 +1,101 @@ +#!/bin/ksh +# ========================================================================= +# start_process_dpafiles - script to start up the process_dpafiles process +# ========================================================================= + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export DPA_PROD_DIR=$(get_apps_defaults dpa_prod_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) +export SHEFDECODE_USERID=$(get_apps_defaults shefdecode_userid) +export DPA_ERROR_DIR=$(get_apps_defaults dpa_error_dir) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# First check to see if the user trying to start process is +# allowed to do it + +if [[ $SHEFDECODE_USERID = "" ]] +then + print The user allowed to start the decoders has not been assigned. + print " "Please assign a user id to the 'shefdecode_userid' + print " "token for the get_apps_defaults process. + exit -1 +fi + +if [ $LOGNAME != $SHEFDECODE_USERID ] +then + print User $LOGNAME is not allowed to start process_dpafiles. + print " "Only user $SHEFDECODE_USERID can start this process. + exit -2 +fi + + +# get the directory specifications + +DATA_DIR=$DPA_PROD_DIR +LOG_DIR=$DPA_LOG_DIR +ERR_DIR=$DPA_ERROR_DIR +BIN_DIR1=$PPROC_BIN +BIN_DIR2=$WHFS_BIN_DIR + +# Check to see if directories exist + +if [[ ! -d $DATA_DIR ]] +then + print "Directory specified for data files does not exist " $DATA_DIR + exit -3 +fi + +if [[ ! -d $LOG_DIR ]] +then + print "Directory specified for log files does not exist " $LOG_DIR + exit -4 +fi + +if [[ ! -d $ERR_DIR ]] +then + print "Directory specified for error files does not exist " $ERR_DIR + exit -5 +fi + +if [[ ! -d $BIN_DIR1 ]] +then + print "Directory specified for executables does not exist " $BIN_DIR1 + exit -6 +fi + +if [[ ! -d $BIN_DIR2 ]] +then + print "Directory specified for executables does not exist " $BIN_DIR2 + exit -7 +fi + + + +# define the log file name + +LOG_NAME=`date -u +process_dpa_log_%m%d` +LOG_FILE=$LOG_DIR/$LOG_NAME + + +# Announce startup of process_dpafiles + +print ======================================================== >> $LOG_FILE +print Starting process_dpafiles at $(date -u) >> $LOG_FILE +print ======================================================== >> $LOG_FILE +print " " >> $LOG_FILE + + +# Remove stop flag file if it exists + +rm -f $DATA_DIR/stop_dpadecode + + +# Start script in background +# note that ihe script requires arguments + +$BIN_DIR1/process_dpafiles $DATA_DIR $LOG_DIR $ERR_DIR $BIN_DIR1 $BIN_DIR2 >> $LOG_FILE & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_gage_pp b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_gage_pp new file mode 100755 index 0000000000..fe4246706c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_gage_pp @@ -0,0 +1,110 @@ +#!/bin/ksh +# ============================================================ +# stop_gage_pp - script to stop the gage_pp process +# +# This script will return one of the following completion codes +# to the operating system indicating success or failure of its +# attempt to stop the Gage Precip Processor. +# +# 0 The attempt to stop the Gage Precip Processor was successful. +# 1 An invalid command line argument has been passed into this script. +# 2 The gage_pp_userid token is not defined. +# 3 The user is not allowed to stop the Gage Precip Processor. +# 4 The directory specified for the data files does not exist. +# 5 The Gage Precip Process is not running. There is no process to stop. +# 6 The Gage Precip Processor log directory has not been defined. +# 7 The Gage Precip Processor cannot be stopped from this system. +# Check the gage_pp_host token for the valid system name. +# +# Revision History +# Moria Shebsovich July 7, 2004 Created. +# ============================================================ +# +# This allows you to call this script from outside of ./bin +HOSTNAME=`hostname` +RUN_FROM_DIR=`dirname $0` + +# +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export GAGE_PP_USERID=$(get_apps_defaults gage_pp_userid) +export GAGE_PP_HOST=$(get_apps_defaults gage_pp_host) +export GAGE_PP_DATA=$(get_apps_defaults gage_pp_data) +export GAGE_PP_LOG=$(get_apps_defaults gage_pp_log) + +GAGE_PP_LOG_DIR=$GAGE_PP_LOG +if [[ ! -d $GAGE_PP_LOG_DIR ]] +then + print "Directory specified for log files does not exist " $GAGE_PP_LOG_DIR + exit 6 +fi + +# +# define the Gage Precip Processor daily log file name +LOGFILE=`date +gage_pp_log_%m%d` +GAGE_PP_LOG_FILE=$GAGE_PP_LOG_DIR/$LOGFILE + +# Check to see which system the Gage Precip Processor is allowed +# to be stopped from. +# This is specified by the gage_pp_host token which is represented +# by the GAGE_PP_HOST variable set in set_hydro_env. +# If this script is not being run on that system, then log an error message. + +COMPARISON_STRING=`echo $HOSTNAME $GAGE_PP_HOST | awk -F' ' 'match ($1, $2)'` +if test -z "$COMPARISON_STRING" +then + + print "Gage Precip Processor cannot be stopped from '$HOSTNAME'" \ + "It can only be stopped from '$GAGE_PP_HOST'." >> $GAGE_PP_LOG_FILE + exit 7 + +fi + +# +# Check to see if the user trying to stop process is the one +# allowed to do it + +if [[ $GAGE_PP_USERID = "" ]] + then + print stop_gage_pp: User allowed to stop gage_pp has not \ + been assigned. >> $GAGE_PP_LOG_FILE + print " "Please assign a user id to the \ + 'gage_pp_userid' >> $GAGE_PP_LOG_FILE + print " "token for the get_apps_defaults process. + >> $GAGE_PP_LOG_FILE + exit 2 +fi + +if [ $LOGNAME != $GAGE_PP_USERID ] + then + print stop_gage_pp: User $LOGNAME is not allowed to stop \ + Gage Precip Processor. >> $GAGE_PP_LOG_FILE + print " "Only user $GAGE_PP_USERID can stop \ + Gage Precip Processor! >> $GAGE_PP_LOG_FILE + exit 3 +fi + +# Check to determine if the Gage Precip Processor is running before +# an attempt is made to stop it. + +export PIDFILE=$GAGE_PP_DATA/gage_pp_pid.dat +export FILEPID=`cat $PIDFILE` + +if [[ $FILEPID != "" ]] +then + ps -p $FILEPID | grep gage_pp > /dev/null 2>&1 + if [ $? -eq 1 ] + then + print "stop_gage_pp: GagePP is not running." >> $GAGE_PP_LOG_FILE + exit 5 + fi + +fi + +# +# touch the stop file, which the gage_pp program checks for +# and if it exists, then it initiates an orderly abort of the system + +touch $GAGE_PP_DATA/stop_gage_pp + + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe new file mode 100755 index 0000000000..8df1138614 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe @@ -0,0 +1,77 @@ +#!/bin/ksh + +# +# script for stopping the HPE processes +# +# This introduces a delayed stop of 20 min to the hpe processes +# However, note that the DHRgather script executed via cron should +# be stopped first. Otherwise, at the next precipitation report +# The HPE processes will be started again. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + + + +# this script uses the following set_hydro_env variables: +# HPE_LOG_DIR +# + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# setup log files +# + +if [[ ! -d $HPE_LOG_DIR ]] +then + print "Directory specified for placing stop file does not exist " $HPE_LOG_DIR + exit -1 +fi + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp + + +# +# save latest entries in log file +# + + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +echo "Attempting to stop start_hpe... " >> $hpefnm + +phpe=`ps -ef|grep start_hpe|grep -v grep|awk '{print $2}'` + + + +if [[ -z "$phpe" ]] +then + echo "start_hpe not running, stop not required " >> $hpefnm +else + if [[ ! -r $HPE_LOG_DIR/stop_hpe_process ]] + then + touch $HPE_LOG_DIR/stop_hpe_process + echo "stop_hpe_process file has been created." >> $hpefnm + echo "HPE process will stop after 20 min unless new precip is detected. " >> $hpefnm + echo "Use kill -9 (pid of start_hpe) if immediate shutdown is needed. " >> $hpefnm + else + echo "stop_hpe_process file exists already. " >> $hpefnm + echo "HPE processes will end in less than 20 min unless new precip is detected. " >> $hpefnm + echo "Use kill -9 (pid of start_hpe) if immediate shutdown is needed. " >> $hpefnm + fi +fi + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe_crons b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe_crons new file mode 100755 index 0000000000..32bb65242f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe_crons @@ -0,0 +1,74 @@ +#!/bin/ksh + +# +# script for bypassing the HPE radar gather crons +# +# HPE crons to gather radar information run every minute +# This script just creates a file the crons are looking for +# and if found, it will exit the gather script before beginning. +# +# David T. Miller RSIS OHD/HSEB +# October 30, 2007 + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS applications +. $RUN_FROM_DIR/../../set_hydro_env +export HPE_LOG_DIR=$(get_apps_defaults hpe_log_dir) + + + +# this script uses the following set_hydro_env variables: +# HPE_LOG_DIR +# + +# GAD_DIR is directory which holds the gad program (get_apps_defaults.LX) +GAD_DIR=/awips/hydroapps/public/bin + +# setup log files +# + +if [[ ! -d $HPE_LOG_DIR ]] +then + print "Directory specified for placing stop_hpe_crons file does not exist " $HPE_LOG_DIR + exit -1 +fi + +hpefnm=$HPE_LOG_DIR/start_hpe_log +hpetmp=$HPE_LOG_DIR/start_hpe_tmp + + +# +# save latest entries in log file +# + + +if [[ -s $hpefnm ]] +then + tail -1200 $hpefnm > $hpetmp + mv $hpetmp $hpefnm +fi + +echo "Attempting to create stop_hpe_crons file... " >> $hpefnm + +if [[ ! -r $HPE_LOG_DIR/stop_hpe_crons ]] +then + touch $HPE_LOG_DIR/stop_hpe_crons + echo "stop_hpe_crons file has been created." >> $hpefnm + echo "HPE radar data processes will not be executed via cron until this file " >> $hpefnm + echo "removed by the start_hpe_crons script. " >> $hpefnm + +# so user sees it on the screen as well since this is a manual process + + echo "stop_hpe_crons file has been created." + echo "HPE radar data processes will not be executed via cron until this file " + echo "removed by the start_hpe_crons script. " + +else + echo "stop_hpe_crons file exists already. " >> $hpefnm + echo "stop_hpe_crons file exists already. " + +fi + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_process_dpafiles b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_process_dpafiles new file mode 100755 index 0000000000..25dea36fda --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/stop_process_dpafiles @@ -0,0 +1,44 @@ +#!/bin/ksh +# ==================================================================== +# stop_process_dpafiles - script to stop the process_dpafiles process +# ==================================================================== + +# This allows you to call this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for AWIPS Team applications +. $RUN_FROM_DIR/../../set_hydro_env +export DPA_PROD_DIR=$(get_apps_defaults dpa_prod_dir) +export SHEFDECODE_USERID=$(get_apps_defaults shefdecode_userid) + +# First check to see if the user trying to stop process is the one +# allowed to do it. note that it uses the same token as shefdecode +# Error if user id is not the one to do it or no allowed id has been +# assigned + +if [[ $SHEFDECODE_USERID = "" ]] +then + print The user allowed to stop the decoders has not been assigned. + print " "Please assign a user id to the 'shefdecode_userid' + print " "token for the get_apps_defaults process. + exit -1 +fi + +if [ $LOGNAME != $SHEFDECODE_USERID ] +then + print User $LOGNAME is not allowed to stop process_dpafiles. + print " "Only user $SHEFDECODE_USERID can issue this command. + exit -2 +fi + + +# touch the stop file, which the process script checks for +# and if it exists, then it initiates an orderly abort of the process. + +if [[ ! -d $DPA_PROD_DIR ]] +then + print "Directory specified for placing stop file does not exist " $DPA_PROD_DIR + exit -3 +fi + +touch $DPA_PROD_DIR/stop_dpadecode diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/temperature_station_gen.sql b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/temperature_station_gen.sql new file mode 100755 index 0000000000..f8c0e47388 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/temperature_station_gen.sql @@ -0,0 +1,29 @@ +-- gather distinct lid,ts combinations from temperature table where extremum='X' + +select lid, ts +into temp temptable +from temperature +where extremum='X' +group by 1,2 +order by lid +; + +-- add info from location table for the lid + +select + l.lid, + ' TAI'||t.ts||'XZ', + to_char(l.lat,'99.99'), + to_char(l.lon,'999.99'), + case + when l.elev >= 0 then to_char(l.elev,'99999') + else ' -999' + end, + '9', + case + when l.name ISNULL then 'XXXXXXXXXX' + else l.name + end +from temptable t, location l +where t.lid=l.lid +order by l.lid asc; diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_bias b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_bias new file mode 100755 index 0000000000..17f2448b5a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_bias @@ -0,0 +1,133 @@ +#!/bin/ksh + +############################################################################### +# transmit_rfc_bias +# +# This script creates a rfc bias message and transmits it across the WAN. +# +# The office must set the PRODUCT_ID and RECIPIENTS variables at the +# beginning of this script. The PRODUCT_ID is the 10 character WMO id - +# CCCCNNNXXX. The product category (NNN) should be left as "RRM" indicating +# miscellaneous hydrologic data. For example for MARFC, the WMO id could +# be set as "KRHARRMRHA". +# +# The RECIPIENTS variable contains a comma-separated list of offices the +# RFC would like to send the bias message to. For example for MARFC, +# this list could be defined as: +# RECIPIENTS="LWX,CTP,PHI,PBZ,BGM,BUF,OKX" +# +# Usage: +# +# transmit_rfc_bias +# YYYY is the year +# MM is the month +# DD is the day +# HH is the hour +# +# Logs for this script are written to: +# /awips/hydroapps/precip_proc/local/data/log/process_bias_message +# +# Modification History +# March 26, 2007 Bryon Lawrence Script Written +# September 21, 2007 Bryon Lawrence Added -e option to distributeProduct call. +# +############################################################################### +export PRODUCT_ID="CCCCRRMXXX" +export RECIPIENTS="" + +# +# Export WHFS environmental variables. +# +RUN_FROM_DIR=`dirname $0` + +# These lines are commented out because this script will be run +# from mpe_editor using mpe_editor's environment. If this script +# is run stand alone, these lines must be uncommented. +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh +. $RUN_FROM_DIR/../../set_hydro_env +export RFC_BIAS_OUTPUT_DIR=$(get_apps_defaults rfc_bias_output_dir) +export PROCESS_BIAS_LOG_DIR=$(get_apps_defaults process_bias_log_dir) +export MPE_TRANSMIT_BIAS=$(get_apps_defaults mpe_transmit_bias) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$PPROC_BIN/bias_trans.jar + +# +# Open the log file to track the status of the transmission of the RFC Bias +# Message. +# +transmit_log=`date +$PROCESS_BIAS_LOG_DIR/transmit_rfc_bias_%m%d` + +echo "------------------------------------------------" >> $transmit_log + +Dte=`date -u` +echo "Starting transmit_rfc_bias at $Dte" >> $transmit_log + +# +# Check the mpe_transmit_bias token to make sure it is on. +# +if [[ $MPE_TRANSMIT_BIAS = "OFF" || $MPE_TRANSMIT_BIAS = "off" ]] +then + echo "Token mpe_transmit_bias is off. RFC Bias Message not generated." + exit 1 +fi + +if [[ -z "$RECIPIENTS" ]] +then + echo "No recipients specified in transmit_rfc_bias script." >> $transmit_log + exit 1 +fi + +# +# Create the RFC Bias message. +# +echo "Calling the bias message creating program" >> $transmit_log +echo "${SYS_JAVA_DIR}/bin/java/ ohd.hseb.bias_trans/BiasMessageCreator $JDBCURL $1" >> $transmit_log +${SYS_JAVA_DIR}/bin/java ohd.hseb.bias_trans/BiasMessageCreator $JDBCURL $1 \ + >> $transmit_log 2>&1 + +# +# Call distribute product and send the RFC Bias Message across the WAN. +# +FILENAME=${FXA_LOCAL_SITE}${1}z +FILEPATH=$RFC_BIAS_OUTPUT_DIR/$FILENAME + +# +# Check to make sure this file exists. +if [[ ! -a $FILEPATH ]] +then + echo "$FILEPATH does not exist." + exit 1 +fi + +SUBJECT="$FILENAME $PRODUCT_ID RADAR_PRECIP_BIAS" + +# +# Call distributeProduct for the recipients. +echo "Sending file:$FILENAME product_ID:$PRODUCT_ID to '$RECIPIENTS' via "\ + "distributeProduct" >> $transmit_log +echo "distributeProduct -c RADAR_PRECIP_BIAS -s\"$SUBJECT\" "\ + "-a\"$RECIPIENTS\" -e $FILEPATH $PRODUCT_ID dummy" >> $transmit_log +/awips/fxa/bin/distributeProduct -c RADAR_PRECIP_BIAS -s "$SUBJECT" -a \ + "$RECIPIENTS" -e $FILEPATH $PRODUCT_ID \ + dummy >> $transmit_log 2>&1 + +# +# Test the exit status of distributeProduct. +# +if [[ $? -ne 0 ]] +then + echo "The call to distributeProduct failed." >> $transmit_log + exit 1 +else + echo "The call to distributeProduct was successful." >> $transmit_log +fi + +# +# Remove the RFC bias message +rm -f $FILEPATH >> $transmit_log 2>&1 + +# End of script. +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_qpe b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_qpe new file mode 100755 index 0000000000..70d65e4a47 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_qpe @@ -0,0 +1,186 @@ +#!/bin/ksh +############################################################################### +# transmit_rfc_qpe +# +# This script transmits the 1 hour MPE generated Best Estimate QPE mosaics +# over the SBN. Normally, these QPE products will be created at an RFC +# and sent over the SBN for WFOs to use in their daily operations. These +# products are displayable through MPE Editor and Hydroview, and they +# can be used perationally in applications like the Site Specific Head Water +# Model. +# +# This script is called by MPE Fieldgen when run from the cron and +# MPE Editor from the Transmit Best Estimate QPE option on the MPE Control +# menu. +# +# The mpe_send_qpe_to_sbn token must be set to "ON" and the mpe_save_grib token +# must be set to "save" for this script to function. Also, the section +# of this script which calls distributeProduct must be uncommented. +# +# Example of PRODUCT ID: KALRQPEBIN +# Where NNN should be QPE +# Where XXX should be BIN +# Where CCCC should be: +# +# PACR : APRFC +# KALR : SERFC +# KTAR : NERFC +# KTIR : OHRFC +# KFWR : WGRFC +# KKRF : MBRFC +# KMSR : NCRFC +# KORN : LMRFC +# KTUA : ABRFC +# KPTR : NWRFC +# KRHA : MARFC +# KRSA : CNRFC +# KSTR : CBRFC +# +# Modification History +# June 1, 2006 Bryon Lawrence Original Coding +# November 8, 2006 Bryon Lawrence Updated to read GRIB +# files from qpe_grib_sbn +# directory. Removed +# logic using touch file. +############################################################################### + +# +# The product id must be locally defined for the office. +# +export PRODUCT_ID=CCCCQPEBIN + +export FXA_HOME=/awips/fxa + +# +# Set up the D2D environment... +. $FXA_HOME/readenv.sh + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export MPE_SEND_QPE_TO_SBN=$(get_apps_defaults mpe_send_qpe_to_sbn) +export MPE_SAVE_GRIB=$(get_apps_defaults mpe_save_grib) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) + +# +# Open the transmit_rfc_qpe log file. +# +transmit_qpe_log=`date +$GAQ_LOG_DIR/transmit_rfc_qpe_%m%d` + +# +# Save only the latest information in the log file. +echo "-------------------------------------------" >> $transmit_qpe_log + +Dte=`date -u` +echo "Starting transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +# Check to make sure that the mpe_save_grib token is set to 'save' +# +if [[ $MPE_SAVE_GRIB != "save" && $MPE_SAVE_GRIB != "SAVE" ]] +then + echo "The mpe_save_grib token is not set to save." >> transmit_qpe_log + echo "No QPE files transmitted." >> transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check the mpe_send_qpe_to_sbn token to make sure that the office +# wants to send the 1 HR QPE over the SBN. +# +if [[ $MPE_SEND_QPE_TO_SBN != "ON" && $MPE_SEND_QPE_TO_SBN != "on" ]] +then + echo "The mpe_send_qpe_to_sbn token is not set to 'ON'." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Determine the list of QPE grib files to transmit over the SBN +# Any files in the qpe_grib_sbn directory need to be sent over the SBN. +# Files are removed from this directory after each successful call to +# distributeProduct. +# +echo "Searching directory $MPE_QPE_GRIB_SBN_DIR for grib " >> $transmit_qpe_log +echo "files to transmit." >> $transmit_qpe_log + +grib_file_list=`ls $MPE_QPE_GRIB_SBN_DIR/*.grib` >> $transmit_qpe_log 2>&1 + +if [[ $? -ne 0 ]] +then + echo "An error was encountered while searching for grib files in" >> \ + $transmit_qpe_log + echo "the $MPE_QPE_GRIB_SBN_DIR directory." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check if there are any files to process. +# +if [[ -z "$grib_file_list" ]] +then + echo "No grib files found to process." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 0 +fi + +# +# Loop over the grib files +# +for i in $grib_file_list +do + echo "Processing grib file $i." >> $transmit_qpe_log + +# +# The GRIB files normally created by the process_grib_files +# script have a subcenter code of 0. GRIB files with a subcenter +# code representing the tranmitting RFC need to be created. +# + +# +# Send product using distributeProduct +# The GRIB file is sent to the DEFAULTNCF. Upon arrival at the NCF +# the GRIB file is placed on the SBN uplink. The GRIB file is sent +# as an attachment to the call to distributeProduct. The dummy file +# does not exist. It is just a dummy argument. +# + echo "Sending file: $i product ID $PRODUCT_ID to distributeProduct" >> \ + $transmit_qpe_log + echo "/awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy" >> \ + $transmit_qpe_log + /awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy >> \ + $transmit_qpe_log 2>&1 + + if [[ $? -eq 0 ]] + then + echo "The call to distributeProduct was successful." >> $transmit_qpe_log + echo "Removing grib file $i." >> $transmit_qpe_log + rm -f $i >> $transmit_qpe_log 2>&1 + else + echo "The call to distrbuteProduct failed with code $?." + echo "Grib file $i not removed." + fi + +# +done + +# +# This script can be locally configured here. + +# +# +Dte=`date -u` +echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/mpe_internal_script b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/mpe_internal_script new file mode 100755 index 0000000000..997162bbf9 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/mpe_internal_script @@ -0,0 +1,2 @@ +#!/bin/ksh +echo "Test of mpe_internal_script" >/tmp/internal_script_test diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/process_qpe_mosaic b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/process_qpe_mosaic new file mode 100755 index 0000000000..d29792467a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/process_qpe_mosaic @@ -0,0 +1,189 @@ +#!/bin/ksh +############################################################################### +# process_qpe_mosaic +# +# This script grib encodes the RFC QPE mosaics and sends them to awips for +# display in D2D. +# +# In order for the generate_areal_qpe (GAQ) program to run and produce a +# mosaicked RFC QPE product, the mpe_generate_areal_qpe token must be set +# to "ON". +# +# In order for the RFC QPE product to be sent to D2D, the mpe_d2d_display_grib +# token must be set to "ON". +# +# The RFC and DURATION list variables (below) must be locally defined at +# each office. +# +# Modification History +# June 6, 2006 Bryon Lawrence Script Written +# September 12, 2006 Bryon Lawrence Setup to source readenv.sh +# November 7, 2006 Bryon Lawrence Modified to set the +# grib_set_subcenter_0 token to 'on'. +# +############################################################################### + +# These must be defined for the office GAQ is running at. +# The RFC_LIST will contain all of the RFCs which cover all or part +# of the office's MPE forecast area. The DURATION_LIST will contain +# the durations to create RFC QPE products for. The acceptable durations +# are 1,6,24. +RFC_LIST=MARFC,OHRFC,LMRFC +DURATION_LIST=1,6,24 + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +. $FXA_HOME/readenv.sh + +# Allow this script to be run from outside of ./precip_proc/bin +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export grib_bin_dir=$(get_apps_defaults pproc_bin) +export grib_out_dir=$(get_apps_defaults mpe_grib_dir) +export D2D_INPUT_DIR=$(get_apps_defaults d2d_input_dir) +export MPE_D2D_DISPLAY_GRIB=$(get_apps_defaults mpe_d2d_display_grib) +export MPE_GENERATE_AREAL_QPE=$(get_apps_defaults mpe_generate_areal_qpe) +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export GAQ_TEMP_XMRG_DIR=$(get_apps_defaults gaq_temp_xmrg_dir) +export PPROC_BIN=$(get_apps_defaults pproc_bin) + +# +# Open the process qpe mosaic log. +# +process_qpe_log=`date +$GAQ_LOG_DIR/process_qpe_mosaic_%m%d` + +# +# Save only the latest information in the log file. +echo "-----------------------------------------------" >> $process_qpe_log + +Dte=`date -u` +echo "Starting process_qpe_mosaic at $Dte" >> $process_qpe_log + +echo "Token mpe_generate_areal_qpe is defined as $MPE_GENERATE_AREAL_QPE" >> \ + $process_qpe_log +echo "Token mpe_d2d_display_grib is defined as $MPE_D2D_DISPLAY_GRIB" >> \ + $process_qpe_log + +# +# If the mpe_generate_areal_qpe token is not on, then do not generate +# QPE Mosaics. +# +if [[ $MPE_GENERATE_AREAL_QPE != "ON" && $MPE_GENERATE_AREAL_QPE != "on" ]] +then + echo "Token mpe_generate_areal_qpe must be set to 'ON'." >> $process_qpe_log + echo "RFC QPE mosaics not created." >> $process_qpe_log + exit 1 +fi + +# +# Call the StoreHydroGrids program to ungrib the QPE GRIB messages stored in +# the /data/fxa/Grid/SBN/HydroRaw directory and place the resulting netCDF +# files into the /data/fxa/GRID/SBN/netCDF/HRAP/QPE and +# /data/fxa/Grid/SBN/HydroBad directories. +# +echo "Invoking $FXA_BIN_DIR/StoreHydroGrids" >> $process_qpe_log +$FXA_BIN_DIR/StoreHydroGrids >> $process_qpe_log 2>&1 + +# +# Call the gen_areal_qpe program +# +$PPROC_BIN/gen_areal_qpe.LX -r$RFC_LIST -h$DURATION_LIST >> \ + $process_qpe_log 2>&1 + +# +# Retrieve a list of the files in the temporary QPE xmrg directory. +# +echo "Searching for QPE Mosaic files in $GAQ_TEMP_XMRG_DIR" >> \ + $process_qpe_log + +file_list=`ls $GAQ_TEMP_XMRG_DIR/RFC*` >> $process_qpe_log 2>&1 + +# +# Only send the RFC QPE mosaics to D2D if the mpe_d2d_displag_grib +# token is set to 'on'. +# +if [[ $MPE_D2D_DISPLAY_GRIB = "ON" || $MPE_D2D_DISPLAY_GRIB = "on" ]] +then + + if [[ -z "$file_list" ]] + then + echo "No QPE mosaic files found in $GAQ_TEMP_XMRG_DIR" >> \ + $process_qpe_log + Dte=`date -u` + echo "Finished process_qpe_mosaic at $Dte" >> $process_qpe_log + exit 1; + fi + +# +# Set the directory to read the GRIB files from. +# Also set the directory to write the QPE files to. +# + + export grib_in_dir=$GAQ_TEMP_XMRG_DIR + export grib_out_dir=$GAQ_TEMP_XMRG_DIR +# +# Force the subcenter code in the GRIB message to be 0. +# This will allow the QPE products contained within the GRIB +# messages to be displayed in the local D2D. +# + export grib_set_subcenter_0=on + + for i in $file_list + do +# +# Build the input and output paths for GRIBIT. +# + export grib_in_file=`basename $i` + export grib_out_file=$grib_in_file.grib + + echo "Grib in file: $grib_in_file" >> $process_qpe_log + echo "Grib out file: $grib_out_file" >> $process_qpe_log + + Dte=`date -u` + echo "Invoking $grib_bin_dir/gribit.LX at $Dte" >> $process_qpe_log + $grib_bin_dir/gribit.LX >> $process_qpe_log 2>&1 +# +# Move the grib file to the SBN/Raw directory +# + new_string=`date -u +%d%H%M%S` + new_file_name=${grib_out_file%.*}_$new_string.grib + + echo "Move and rename grib file $grib_out_dir/$grib_out_file" >> \ + $process_qpe_log + echo "to $D2D_INPUT_DIR/$new_file_name" >> $process_qpe_log + mv $grib_out_dir/$grib_out_file $D2D_INPUT_DIR/$new_file_name >> \ + $process_qpe_log 2>&1 + + if [[ $? -ne 0 ]] + then + # The move failed. Remove the grib file. + rm -f $grib_out_dir/$grib_out_file >> $process_qpe_log 2>&1 + fi + +# +# Notify D2D about the grib file. +# + echo "Invoking $FXA_BIN_DIR/notif_mpe.csh" >> $process_qpe_log + $FXA_BIN_DIR/notif_mpe.csh >> $process_qpe_log 2>&1 + + done + +fi + +# +# Remove the files from the GAQ output XMRG directory. +# +rm -f $file_list >> $process_qpe_log 2>&1 + +Dte=`date -u` +echo "Finished process_qpe_mosaic at $Dte" >> $process_qpe_log + +exit 0 + +# +# End of process_qpe_mosaic script +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/transmit_rfc_qpe b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/transmit_rfc_qpe new file mode 100755 index 0000000000..70d65e4a47 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/bin/transmit_rfc_qpe @@ -0,0 +1,186 @@ +#!/bin/ksh +############################################################################### +# transmit_rfc_qpe +# +# This script transmits the 1 hour MPE generated Best Estimate QPE mosaics +# over the SBN. Normally, these QPE products will be created at an RFC +# and sent over the SBN for WFOs to use in their daily operations. These +# products are displayable through MPE Editor and Hydroview, and they +# can be used perationally in applications like the Site Specific Head Water +# Model. +# +# This script is called by MPE Fieldgen when run from the cron and +# MPE Editor from the Transmit Best Estimate QPE option on the MPE Control +# menu. +# +# The mpe_send_qpe_to_sbn token must be set to "ON" and the mpe_save_grib token +# must be set to "save" for this script to function. Also, the section +# of this script which calls distributeProduct must be uncommented. +# +# Example of PRODUCT ID: KALRQPEBIN +# Where NNN should be QPE +# Where XXX should be BIN +# Where CCCC should be: +# +# PACR : APRFC +# KALR : SERFC +# KTAR : NERFC +# KTIR : OHRFC +# KFWR : WGRFC +# KKRF : MBRFC +# KMSR : NCRFC +# KORN : LMRFC +# KTUA : ABRFC +# KPTR : NWRFC +# KRHA : MARFC +# KRSA : CNRFC +# KSTR : CBRFC +# +# Modification History +# June 1, 2006 Bryon Lawrence Original Coding +# November 8, 2006 Bryon Lawrence Updated to read GRIB +# files from qpe_grib_sbn +# directory. Removed +# logic using touch file. +############################################################################### + +# +# The product id must be locally defined for the office. +# +export PRODUCT_ID=CCCCQPEBIN + +export FXA_HOME=/awips/fxa + +# +# Set up the D2D environment... +. $FXA_HOME/readenv.sh + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export GAQ_LOG_DIR=$(get_apps_defaults gaq_log_dir) +export MPE_SEND_QPE_TO_SBN=$(get_apps_defaults mpe_send_qpe_to_sbn) +export MPE_SAVE_GRIB=$(get_apps_defaults mpe_save_grib) +export MPE_QPE_GRIB_SBN_DIR=$(get_apps_defaults mpe_qpe_grib_sbn_dir) + +# +# Open the transmit_rfc_qpe log file. +# +transmit_qpe_log=`date +$GAQ_LOG_DIR/transmit_rfc_qpe_%m%d` + +# +# Save only the latest information in the log file. +echo "-------------------------------------------" >> $transmit_qpe_log + +Dte=`date -u` +echo "Starting transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +# Check to make sure that the mpe_save_grib token is set to 'save' +# +if [[ $MPE_SAVE_GRIB != "save" && $MPE_SAVE_GRIB != "SAVE" ]] +then + echo "The mpe_save_grib token is not set to save." >> transmit_qpe_log + echo "No QPE files transmitted." >> transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check the mpe_send_qpe_to_sbn token to make sure that the office +# wants to send the 1 HR QPE over the SBN. +# +if [[ $MPE_SEND_QPE_TO_SBN != "ON" && $MPE_SEND_QPE_TO_SBN != "on" ]] +then + echo "The mpe_send_qpe_to_sbn token is not set to 'ON'." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Determine the list of QPE grib files to transmit over the SBN +# Any files in the qpe_grib_sbn directory need to be sent over the SBN. +# Files are removed from this directory after each successful call to +# distributeProduct. +# +echo "Searching directory $MPE_QPE_GRIB_SBN_DIR for grib " >> $transmit_qpe_log +echo "files to transmit." >> $transmit_qpe_log + +grib_file_list=`ls $MPE_QPE_GRIB_SBN_DIR/*.grib` >> $transmit_qpe_log 2>&1 + +if [[ $? -ne 0 ]] +then + echo "An error was encountered while searching for grib files in" >> \ + $transmit_qpe_log + echo "the $MPE_QPE_GRIB_SBN_DIR directory." >> \ + $transmit_qpe_log + echo "No QPE files transmitted." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 1 +fi + +# +# Check if there are any files to process. +# +if [[ -z "$grib_file_list" ]] +then + echo "No grib files found to process." >> $transmit_qpe_log + Dte=`date -u` + echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + exit 0 +fi + +# +# Loop over the grib files +# +for i in $grib_file_list +do + echo "Processing grib file $i." >> $transmit_qpe_log + +# +# The GRIB files normally created by the process_grib_files +# script have a subcenter code of 0. GRIB files with a subcenter +# code representing the tranmitting RFC need to be created. +# + +# +# Send product using distributeProduct +# The GRIB file is sent to the DEFAULTNCF. Upon arrival at the NCF +# the GRIB file is placed on the SBN uplink. The GRIB file is sent +# as an attachment to the call to distributeProduct. The dummy file +# does not exist. It is just a dummy argument. +# + echo "Sending file: $i product ID $PRODUCT_ID to distributeProduct" >> \ + $transmit_qpe_log + echo "/awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy" >> \ + $transmit_qpe_log + /awips/fxa/bin/distributeProduct -a DEFAULTNCF -e $i $PRODUCT_ID dummy >> \ + $transmit_qpe_log 2>&1 + + if [[ $? -eq 0 ]] + then + echo "The call to distributeProduct was successful." >> $transmit_qpe_log + echo "Removing grib file $i." >> $transmit_qpe_log + rm -f $i >> $transmit_qpe_log 2>&1 + else + echo "The call to distrbuteProduct failed with code $?." + echo "Grib file $i not removed." + fi + +# +done + +# +# This script can be locally configured here. + +# +# +Dte=`date -u` +echo "Finished transmit_rfc_qpe at $Dte" >> $transmit_qpe_log + +# +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/gen_areal_qpe/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/gen_areal_qpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe/projection.con b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe/projection.con new file mode 100644 index 0000000000..4af4ff3294 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe/projection.con @@ -0,0 +1,14 @@ +1.00 F4.2 RESET TIME (HRS) +1.00 F4.2 PROJECTION INTERVAL (HRS) +4.00 F5.2 nominal grid size (km) +1.00 F4.2 ERROR PROPORTION FACTOR +0.2500 F6.4 NOMINAL SCAN INTERVAL (HRS) +0.10 F4.2 MINIMUM THRESHOLD PRECIP RATE (MM) +0 I2 MINIMUM NUMBER OF SAMPLES +1.0000 F6.4 Max. allowable missing period of radar data (hr) for reset +200.0 f6.1 PDF min. area threshold (km^2) +0.6 f6.1 PDF min. rainrate threshold (dBR)(modified to rainrate) +n logical Account for growth/decay? +1 I1 Storm motion vectors used (1=local, 2=uniform hrly-avg) +0.8 f6.1 lamda (for rate smooth) +1.3 f6.1 kappa (for rate smooth) diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/beam_height/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/beam_height/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/climo/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/climo/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/gage_locations/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/gage_locations/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/grid_masks/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/grid_masks/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/help/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/help/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/misbin/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/misbin/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann new file mode 100644 index 0000000000..e74d17c6f3 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr new file mode 100644 index 0000000000..610b64379b Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug new file mode 100644 index 0000000000..ddf4d87e08 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec new file mode 100644 index 0000000000..fae866c52d Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb new file mode 100644 index 0000000000..e73dee7e18 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan new file mode 100644 index 0000000000..684645c6bf Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul new file mode 100644 index 0000000000..680d186ac9 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun new file mode 100644 index 0000000000..a97571b750 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar new file mode 100644 index 0000000000..11368e0bf4 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may new file mode 100644 index 0000000000..d2c0674459 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov new file mode 100644 index 0000000000..cd16bf8988 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct new file mode 100644 index 0000000000..a5403a2359 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep new file mode 100644 index 0000000000..4be38e0519 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann new file mode 100644 index 0000000000..1a148aa6b3 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr new file mode 100644 index 0000000000..1a3e1db805 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug new file mode 100644 index 0000000000..bfbe2b1fda Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec new file mode 100644 index 0000000000..4b3ce84ddf Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb new file mode 100644 index 0000000000..13c4821f3d Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan new file mode 100644 index 0000000000..3ca6fcf53f Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul new file mode 100644 index 0000000000..9c21a42d2b Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun new file mode 100644 index 0000000000..a3f927637b Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar new file mode 100644 index 0000000000..bda3ae31eb Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may new file mode 100644 index 0000000000..880b6e4974 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov new file mode 100644 index 0000000000..16110e70a4 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct new file mode 100644 index 0000000000..819b88272f Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep new file mode 100644 index 0000000000..c07bfb85fe Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann new file mode 100644 index 0000000000..04a3f23564 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr new file mode 100644 index 0000000000..1dd46ef024 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug new file mode 100644 index 0000000000..fdc7759c36 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec new file mode 100644 index 0000000000..c23fc80d44 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb new file mode 100644 index 0000000000..843a924c20 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan new file mode 100644 index 0000000000..9861ca01ff Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul new file mode 100644 index 0000000000..5fa21e4176 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun new file mode 100644 index 0000000000..e36cd07167 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar new file mode 100644 index 0000000000..c48200a6ed Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may new file mode 100644 index 0000000000..849e132b86 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov new file mode 100644 index 0000000000..9dfd90a339 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct new file mode 100644 index 0000000000..3eaaefa206 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep new file mode 100644 index 0000000000..c4da1b76f6 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/station_lists/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/station_lists/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/utiltriangles/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/utiltriangles/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/radclim/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/radclim/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/stage3/help/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/app/stage3/help/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_archive/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_archive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_decoded/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_decoded/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_error/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_error/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_gather/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_gather/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_archive/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_archive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_decoded/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_decoded/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_error/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_error/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_gather/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_gather/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/gpp_input/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/gpp_input/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/avgrmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/avgrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/gif/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/height/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/height/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_gif/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_jpeg/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_jpeg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_netcdf/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_xmrg/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_xmrg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/index/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/index/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/lsatpre/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/lsatpre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/maxrmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/maxrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/nowcast/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/nowcast/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedhr/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedhr/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedpa/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedpa/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedsp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedsp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/disagg/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/disagg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/gage_pp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/gage_pp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/gen_areal_qpe/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/gen_areal_qpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/hpe/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/hpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/lightning_proc/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/lightning_proc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/misc/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_editor/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_editor/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_fieldgen/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_fieldgen/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/process_bias_message/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/process_bias_message/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/siipp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/log/siipp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/avgrmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/avgrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bad_gages/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bad_gages/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_input/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_input/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_output/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/d2d_files/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/d2d_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/draw_precip/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/draw_precip/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/edit_polygon/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/edit_polygon/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gageonly/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gageonly/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gagetriangles/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gagetriangles/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/height/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/height/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/index/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/index/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield1/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield1/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield2/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield2/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield3/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield3/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locbias/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locbias/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locspan/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locspan/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lqmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lqmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lsatpre/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lsatpre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/maxrmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/maxrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlqmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlqmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mrmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mrmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/p3lmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/p3lmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/q2_state_var/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/q2_state_var/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_gif/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_gif/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_jpeg/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_jpeg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_netcdf/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_netcdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_sbn/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_sbn/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcbmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcbmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcmmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcmmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe01/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe01/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe06/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe06/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe24/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe24/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sat_state_var/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sat_state_var/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/satpre/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/satpre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sgmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sgmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srgmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srgmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srmosaic/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srmosaic/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/state_var/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/state_var/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_archive/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_archive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_decoded/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_decoded/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_error/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_error/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage3/post_analysis/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/precip_proc/local/data/stage3/post_analysis/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/public/bin/amirunning b/nativeLib/files.native/edex/data/hdf5/hydroapps/public/bin/amirunning new file mode 100644 index 0000000000..444ac03524 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/public/bin/amirunning @@ -0,0 +1,39 @@ +# ============================================================================ +# pgm: amirunning .. insert script to check if same named program is running +# +# use: . amirunning +# +# in: (env-var) ... (optional) global variable "AMIRUNNING_DIR" defines the +# in: directory to place a temproary file; if not defined use +# in: directory "/tmp" +# out: AmIRunning .. variable set to "yes" if running, else set to "no" +# oth: (file) ...... a temporary file "temp_ps.$$" is made in the directory +# oth: defined by global variable "AmIRunning" or in "/tmp" +# +# rqd: env vars - AMIRUNNING_DIR +# +# cmt: MUST BE RUN WITH THE DOT COMMAND. +# cmt: SCRIPT NAME MUST BE UNIQUE TO 14 PLACES. +# cmt: (ps -e only gets 14 char names) +# cmt: THE CALLING SCRIPT MUST HAVE "#!/bin/ksh" AS THE TOP LINE +# +# cmt: Add blank in front of lines comming from "ps -e". +# +# ver: 20031006 +# ============================================================================ + type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null + +Fil=${AMIRUNNING_DIR:-/tmp}/temp_ps.$$ +touch "$Fil" || exit + + ## Limit the caller name to 15 chars since "ps -e" only outputs 15 + +Nam=${0##*/}; [ "${#Nam}" -gt 14 ] && Nam=$(expr $Nam : '\(..............\)') +ps -e | sed 's/^/ /' | awk '/ '$$' /{next};/ '$Nam'/{print $1}' > $Fil +ps -e | sed 's/^/ /' | awk '/ '$$' /{next};/ '$Nam'/{print $1}' >> $Fil + +Lin=$(cat $Fil | sort | uniq -d); rm -f $Fil +[[ -n "$Lin" ]] && AmIRunning="yes" || AmIRunning="no" + +unset Fil Nam Lin + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/public/bin/dd_help b/nativeLib/files.native/edex/data/hdf5/hydroapps/public/bin/dd_help new file mode 100644 index 0000000000..e45873628f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/public/bin/dd_help @@ -0,0 +1,88 @@ +# ============================================================================ +# pgm: dd_help .. dot cmd - list header or run gvn cmds on current script text +# +# use: type dd_help 1>/dev/null 2>&1 && . dd_help 2>/dev/null +# +# in: -hh ........ (optional) list current script header and quit +# in: -hhver ..... (optional) output the version number ("# ver:" line) +# in: -hhuse ..... (optional) output the "# use:" statement only +# in: -hhargs .... (optional) output the "# use:" and i/o stmts only +# in: -hhpgm ..... (optional) output the "# pgm:" statement only +# in: -hhcat ..... (optional) cat the current script and quit +# in: -hhex ...... (optional) run ex session on current script +# in: -hhvi ...... (optional) echo the vi command on current script +# in: -hhwc ...... (optional) run wc on current script +# in: -hhls ...... (optional) run ls -l on current script +# in: -hhgrep . (optional) run grep -ni for string on current script +# in: (env var) .. DS_HH - if exists turn shell debug on using the value +# in: of DS_HH (minus sign optional, ex. set -$DS_HH +# in: (currently commented out) +# i/o: (env var) .. DS_BUG - if set and not null, then turn off debug tracing +# i/o: (env var) .. dd_help - skip rtn if "on", else run and set "on" +# out: (stdout) ... outputs the current script's header from "# ===" to +# out: the first line not starting with # +# out: (file) ..... (optional) log info in $HOME/hhlog if it exists +# +# ver: 20051115 +# ============================================================================ + +set +u + +# type dd_help_sup1 1>/dev/null 2>&1 && . dd_help_sup1 2>/dev/null +# type dd_help_sup2 1>/dev/null 2>&1 && . dd_help_sup2 2>/dev/null +# type dd_help_sup3 1>/dev/null 2>&1 && . dd_help_sup3 2>/dev/null + +[ -n "$DS_BUG" ] && set +x + +if [ "$dd_help" != "on" ]; then + + u_Fl=/fs/home/dws/hhlog; [ -w $u_Fl ] && [ "${HHLOG:-:}" != "${0##*/}" ] && + >> $u_Fl 2>&1 printf '%10s %8s %s\n' "`uname -n`" "$LOGNAME" \ + "$(date +%d-%H:%M) ${0##*/} ${*:-}" && export HHLOG="${0##*/}" + unset u_Fl + + u_On=${1:-'a'}; u_Cm=${u_On#-hh} + if [ "$u_Cm" != "$u_On" ]; then + u_Sc=${0##*/}; u_Sc=${u_Sc#-} + if [ "$u_Sc" != ksh -a "$u_Sc" != zsh -a "$u_Sc" != rsh -a \ + "$u_Sc" != bash -a "$u_Sc" != sh ]; then + u_Ln="" + case $u_Cm in + "" ) u_Ln="sed -n '/^# *======/,/^[^#]/{/^#/p;/^[^#]/q;/^$/q;}'";; + ver ) u_Ln="sed -n '/^# ver: \( *[^ ].*\) *$/s//\1/p'";; + use ) u_Ln="sed -n '/^# use: \( *[^ ].*\) *$/s//\1/p'";; + arg* ) u_Ln="sed -n '/^# use: \( *[^ ].*\) *$/s//\1/p + /^# \( in: *[^ ].*\) *$/s// \1/p + /^# \(i\/o: *[^ ].*\) *$/s// \1/p + /^# \(out: *[^ ].*\) *$/s// \1/p + /^# \(oth: *[^ ].*\) *$/s// \1/p'";; + pgm ) u_Ln="sed -n '/^# pgm: \( *[^ ].*\) *$/s//\1/p'";; + rqd ) u_Ln="sed -n '/^# rqd: \( *[^ ].*\) *$/s//\1/p'";; + cat ) u_Ln="cat";; + ex ) u_Ln="ex";; + wc ) u_Ln="wc";; + ls ) u_Ln="ls -l";; + vi ) u_Ln="echo vi";; + type ) type "$u_Sc";; + grep?* ) u_Ln="grep -ni ${u_Cm#grep}";; + ?* ) type $u_Cm 1>/dev/null 2>&1 && u_Ln="$u_Cm";; + esac + + if [ -n "$u_Ln" ]; then + u_Sc=$(type $0 | sed -n "/t *found/d;/^.* \(\.*\/*..*\) *$/s//\1/p" | + sed "/^\./s#^#$(pwd)/#" | + sed "s#^\./#$(pwd)/#;s#/\./#/#g;s#///*#/#g" | + sed "s#/\./#/#g;s#/\./#/#g;s/[')]$//" | + sed "s#/[^/][^/]*/\.\./#/#g") + [ -r "$u_Sc" ] && [ "$u_Cm" = "" ] && echo " PATHNAME: $u_Sc" + [ -r "$u_Sc" ] && eval exec "$u_Ln" $u_Sc + fi + unset u_Sc u_Ln; exit + fi; unset u_Sc + fi; unset u_Cm u_On + +# [ "${DS_HH:-}" ] && { echo " ---------------- ${0##*/}"; set -${DS_HH#-}; } + + dd_help="on" +fi + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/data/products/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/data/products/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/fld/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/fld/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/fld/bin/RELEASE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/fld/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/fldview/floodmapdata/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/fldview/floodmapdata/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/grib/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/grib/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/grib/output/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/grib/output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/app-defaults/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/app-defaults/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/bin/RELEASE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/help_files/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/help_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/scripts/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/hdb/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/RELEASE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/lib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/lib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/output/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/doc/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/doc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/RELEASE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/espts/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/espts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/input/oper/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/input/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/output/oper/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/output/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/scripts/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid new file mode 100755 index 0000000000..6432a2ea8b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid @@ -0,0 +1,17 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +runso rary.ohd.ffg ffmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen new file mode 100755 index 0000000000..221f4a493e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen @@ -0,0 +1,17 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +runso rary.ohd.ffg pgmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid new file mode 100755 index 0000000000..11fa4f632d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid @@ -0,0 +1,17 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +runso rary.ohd.ffg zgrid_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/affg/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/affg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/cary/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/cary/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/define/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/define/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grff/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grff/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grro/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grro/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/prod/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/prod/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/text/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/text/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/user/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/user/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/include_me.ksh b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/include_me.ksh new file mode 100644 index 0000000000..7775afeb18 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/include_me.ksh @@ -0,0 +1,3 @@ +#!/bin/ksh + +echo "work!" diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/grib/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/grib/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/oper/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg new file mode 100755 index 0000000000..696c012e17 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg @@ -0,0 +1,556 @@ +#!/bin/ksh +# ======================================================================== +# pgm: ffg .. run FFGS programs +# +# Release 1.31 01/09/2001 +# +USAGE="usage:ffg -p pgm [-i in_file] [-o out_file_prefix] \ +[-f ffg_&_ofs_filesets] [-g ffg_fileset_only] [-h hydrologist_on_duty] \ +[-m message_filename] [-a apend_name] [-c copy_method] [-b bin_dir] \ +[-u user] [-q user_qulf] [-r] [-l] [-x] [-t] [-s]" +# +# The only required parameter is the program to be executed indicated by the +# -p switch. +# +# All switches are documented further down in this script where they are +# output when the script executes with no switches,i.e. ffg. +#=========================================================================== +# HISTORY: +# 09/14/1998 - Release 1.0 - Tim Sweeney +# +# 10/07/1998 - Release 1.1 - Tim Sweeney +# Added token ffg_out_dir +# Added -b for executable directory +# +# 08/20/1999 - Release 1.2 - Tim Sweeney +# Added -r for alternate grid directories +# Changed program GRIBIT to DEGRIB +# +# 05/03/2000 - Release 1.30 - Tim Sweeney +# Changed tokens that point to .../devl/bin +# and .../ffg/bin/RELEASE and .../ffg/bin/ARCHIVE +# +# 01/09/2001 - Release 1.31 - Tim Sweeney +# Removed command -d to point to ../devl/bin directory. Use +# -b d. +# Corrected -b name so name is the complete path and directory of +# the executable. +#=========================================================================== + +Dte=$(date -u +%Y%m%d.%H%M%S) + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ./${env_file} +cd ${prev_dir} + +# initialize command line parameters +Pgm_cl="" +Infil_cl="tty" +Otfil_cl="" +Fl_set_cl="" +Gl_set_cl="" +Hod_set_cl="" +Msg_set_cl="" +Apname_cl="" +Copy_meth_cl="copy" +Bin_set_cl="" +User_cl="" +User_qulf="" +Grid_set="off" +Log_prt="on" +Xqt_pgm="on" +Redir="on" +##Devl="off" +Remsh_request="off" + +# check command line arguments +while getopts p:i:o:f:g:h:m:a:c:b:u:q:rlxtds cl_args ; do + #print "cl_args=$cl_args" + case $cl_args in + p) Pgm_cl=$OPTARG;; + i) Infil_cl=$OPTARG;; + o) Otfil_cl=$OPTARG;; + f) Fl_set_cl=$OPTARG;; + g) Gl_set_cl=$OPTARG;; + h) Hod_set_cl=$OPTARG;; + m) Msg_set_cl=$OPTARG;; + a) Apname_cl=$OPTARG;; + c) Copy_meth_cl=$OPTARG;; + b) Bin_set_cl=$OPTARG;; + u) User_cl=$OPTARG;; + q) User_qulf=$OPTARG;; + r) Grid_set="on";; + l) Log_prt=off;; + x) Xqt_pgm=off;; + t) Redir="off";; +## d) Devl="on";; + s) Remsh_request="on";; + :) Ms_arg=$OPTARG;; + \?) bad_sw=YES;; + esac + done + +# check if command line args were entered properly +bad_cl=0 +if [[ $Ms_arg != "" || $bad_sw != "" || $Pgm_cl = "" ]] ; then + bad_cl=1 + fi +for Ck_arg in $Pgm_cl $Infil_cl $Otfil_cl $Fl_set_cl $User_cl ; do + if [[ $Ck_arg = -[a-zA-Z] ]] ; then + bad_cl=1 + break + fi + done + +# create output directory for user if it does not exist +Usr=${User_cl:-$LOGNAME} +Out_dir=$(get_apps_defaults ffg_output) +if [[ $Out_dir = "" ]] ; then + Out_dir=$(get_apps_defaults ffg_out_dir) + fi +Out_dir=$(get_apps_defaults ofs_output)/$Usr +if [[ ! -d $Out_dir ]] ; then + mkdir -p $Out_dir + chmod ug+rw $Out_dir + fi + +Pgm=${Pgm_cl:-"No_pgm"} +#print "User_qulf=$User_qulf" +Cofil=$Out_dir/$Pgm$User_qulf"_log".$Dte + +# check if messages are to be returned to terminal +if [[ $Redir = "on" ]] ; then + Log_actn=">> $Cofil" + else + Log_actn="" + fi + +# stop if bad command line arguments entered +if (( $bad_cl == 1 )) ; then + eval print ============================================================================$Log_actn + eval print "' '"Stopping FFG script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' $USAGE '" $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + echo + echo "The only required parameter is the program to be executed indicated " + echo "by the -p switch." + echo "--------------------------------------------------------------------" + echo "All other parameters are optional and will be successfully provided " + echo "values if not supplied on the command line. However, certain switch" + echo "values become meaningless unless provided with values by the user. " + echo " Switches are:" + echo + echo " Switch Description Default value" + echo " ------ ------------------------------ --------------------------" + echo " -i Input file/control of program 'tty' to interact with " + echo " execution. Enter 'auto' for the menu." + echo " automatic selection of first" + echo " item in ffguid or prodgen" + echo " menus. Enter 'chain' to " + echo " execute ffguid then prodgen" + echo " and functions as 'auto'." + echo + echo " -o Output file prefix or 'tty'. 'program name'" + echo " Files are date-time stamped" + echo " and placed in the output" + echo " directory. If 'tty' is given," + echo " output goes to the terminal." + echo " (Use -m switch for single" + echo " message file ffgout.)" + echo + echo " -f ffg and ofs file sets override. The file sets indicated" + echo " by the get_apps_defaults" + echo " tokens 'ffg_level' and" + echo " 'ofs_level'." + echo + echo " -g ffg file set override. The file set indicated" + echo " by the get_apps_defaults" + echo " token 'ffg_level' only." + echo + echo " -h Initials of hydrologist on None" + echo " duty" + echo + echo " -m Change name of single ffgout (Used only when a" + echo " message file that contains single file is specified" + echo " all the messages for all messages." + echo + echo " -a Append name to message None" + echo " filename(s). OR Enter 'date'" + echo " to append date-time stamp." + echo + echo " -c Method of copying files to Copy file(s) to append" + echo " append a suffix name to the filename(s)." + echo " message filename(s):" + echo " 'copy' - copy file(s)" + echo " 'move' - move file(s)" + echo + echo " -b Use executable directory Use directory indicated" + echo " indicated as by the 'ffg_dir'/bin/ " + echo " a - 'ffg_dir'/bin/ARCHIVE token RELEASE token." + echo " d - 'my_dir'/bin token (devl)" + echo " m - 'mgr_dir'/bin/RELEASE token" + echo " ma - 'mgr_dir'/bin/ARCHIVE token " + echo " name - path and directory" + echo + echo " -u User name override. Used to Log-in user id ($LOGNAME)." + echo " place output in output dir." + echo " other than the submitting" + echo " user's." + echo + echo " -q User name qualifier. Used None" + echo " when creating" + echo " [progname][user_qulf].[date]" + echo " files." + echo + echo " -r Use alternate directores for Use the default directories" + echo " gridded guidance and runoff, for gridded guidance and" + echo " grfft and grrot, respectively. runoff, grff and grro" + echo + echo " -l Suppress info log message Log message will be printed." + echo " generation." + echo + echo " -x Conduct execution check only, Program will be executed." + echo " displaying add'l info, but" + echo " program is not executed." + echo + echo " -t Have log information displayed Output into log file." + echo " at terminal." + echo + echo " -s Execute program on machine Execute program on machine" + echo " designated as ofs_server via from which ofs command is" + echo " get_apps_defaults mechanism. issued." + echo " end of switch descriptions" + #---------------------------------------------------------------------------" + exit 1 + fi + +if [[ $Log_prt = "on" && $Redir = "on" ]] ; then + print "FFG execution log information will be written to:" + print " ==> $Cofil <==" + fi + +# set parameters for program execution +if [[ $Fl_set_cl != "" ]] ; then + export ofs_level=$Fl_set_cl + export ffg_level=$Fl_set_cl + fi +if [[ $Gl_set_cl != "" ]] ; then + export ffg_level=$Gl_set_cl + fi +if [[ $Grid_set = "on" ]] ; then + export ffg_gff_level="grfft" + export ffg_gro_level="grrot" + fi +if [[ $Bin_set_cl = "" ]] ; then + Ex_dir=$(get_apps_defaults ffg_dir)/bin/RELEASE + # Added by Guoxian Zhou 06/17/2003 + [ -n "$(get_apps_defaults ffg_rls)" ] && Ex_dir=$(get_apps_defaults ffg_rls) + elif [[ $Bin_set_cl = "d" || $Bin_set_cl = "D" ]] ; then + Ex_dir=$(get_apps_defaults my_dir)/bin + # Added by Guoxian Zhou 06/17/2003 + [ -n "$(get_apps_defaults my_rls)" ] && Ex_dir=$(get_apps_defaults my_rls) + elif [[ $Bin_set_cl = "a" || $Bin_set_cl = "A" ]] ; then + Ex_dir=$(get_apps_defaults ffg_dir)/bin/ARCHIVE + elif [[ $Bin_set_cl = "m" ]] ; then + Ex_dir=$(get_apps_defaults mgr_dir)/bin/RELEASE + # Added by Guoxian Zhou 06/17/2003 + [ -n "$(get_apps_defaults mgr_rls)" ] && Ex_dir=$(get_apps_defaults mgr_rls) + elif [[ $Bin_set_cl = "ma" ]] ; then + Ex_dir=$(get_apps_defaults mgr_dir)/bin/ARCHIVE + else + Ex_dir=$Bin_set_cl + fi + +##if [[ $Devl = on ]] ; then +## Ex_dir=$(get_apps_defaults my_dir)/bin +## else +## Ex_dir=$(get_apps_defaults ffg_dir)/bin/RELEASE +## fi + +# check if program found +if [[ ! -a $Ex_dir/$Pgm || ! -f $Ex_dir/$Pgm || ! -x $Ex_dir/$Pgm ]] ; then + eval print ============================================================================$Log_actn + eval print "' '"Stopping FFG script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Ex_dir/$Pgm"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is not executable. $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + +##Inflx=${Infil_cl:-stop} +##Infil=$In_dir/$Inflx + +# check program name to see if to set output to tty +if [[ $Pgm = zgrid ]]; then + Otfil_cl=tty + elif [[ $Infil_cl != auto && $Infil_cl != chain ]] ; then + Otfil_cl=tty + fi + +if [[ $Otfil_cl = tty ]]; then + Otflx=tty + Otfil=tty + Otfil_actn="" + else + Otflx=${Otfil_cl:-$Pgm}$User_qulf.$Dte + Otfil=$Out_dir/$Otflx + Otfil_actn="> $Otfil" + export ffg_print_filename=$Otfil + #print "ffg_print_filename=$(get_apps_defaults ffg_print_filename)" + fi + +# check if input file exists as a file and is not empty +##if [[ ! -a $Infil || ! -f $Infil || ! -s $Infil ]] ; then +## eval print ============================================================================$Log_actn +## eval print "' '"Stopping OFS script at $(date -u +"%T %Z") on \ +## $(date -u +"%a %b %d %Y") $Log_actn +## eval print "' ==> '"$Infil"' <=='" $Log_actn +## eval print "' '"does not exist, is not a file, or is empty. $Log_actn +## eval print ============================================================================$Log_actn +## eval print "''" $Log_actn +## exit 1 +## fi + +## remove tabs from input file +##if grep -l ' ' "$Infil" >&-; then +## tab_out $Infil ${Infil}_temp \ +## && mv ${Infil}_temp $Infil \ +## || rm -f ${Infil}_temp +## chmod 664 $Infil +## fi + +# check if request made to execute program on ofs_server +This_cpu=$(hostname | cut -f1 -d".") +Xqt_prefix="" +if [[ $Remsh_request = "on" ]] ; then + ofs_server=$(get_apps_defaults ofs_server) + ofs_server_defined="no" +# cannot do remote execution if token not defined + if [[ $ofs_server != "" ]] ;then + ofs_server_defined="yes" + # check if already on ofs_server + if [[ $This_cpu != $ofs_server ]] ; then + # check if can remsh to that machine + remsh $ofs_server -n date >> /dev/null 2>> /dev/null + remsh_code=$? + if (( $remsh_code == 0 )) ; then + Xqt_prefix="remsh "$ofs_server" " + valid_request="yes" + else + valid_request="no" + fi + fi + fi + fi + +zbeglog () { + eval print ============================================================================$Log_actn + if [[ $Xqt_pgm = "on" ]] ; then + eval print "' '"Starting FFG program execution at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + else + eval print "' '"Starting FFG execution check at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + fi + eval print "' FFG command issued on: '"$This_cpu $Log_actn + eval print "' Program to be executed: '"$Pgm $Log_actn + if [[ $Remsh_request = "off" ]] ; then + eval print "' Local execution on: '"$This_cpu $Log_actn + else + eval print "' Remote exec requested. '" $Log_actn + if [[ $This_cpu = $ofs_server ]] ; then + eval print "' This cpu is ofs server. '" $Log_actn + eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $ofs_server_defined = "no" ]] ; then + eval print "' OFS Server not defined. '" $Log_actn + eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $valid_request = "no" ]] ; then + eval print "' Cannot execute on: '"$ofs_server $Log_actn + eval print "' Local execution on: '"$This_cpu $Log_actn + else + eval print "' Remote execution on: '"$ofs_server $Log_actn + fi + fi + fi + fi + eval print "' Executable directory: '"$Ex_dir $Log_actn + ##eval print "' Input file: '"$Inflx $Log_actn + ##eval print "' Input directory: '"$In_dir $Log_actn + eval print "' Output file: '"$Otflx $Log_actn + eval print "' Output directory: '"$Out_dir $Log_actn + eval print ============================================================================$Log_actn + } + +zendlog () { + elapsed_time=$SECONDS + ((min = elapsed_time / 60)) + ((sec = elapsed_time % 60)) + ms="s" + ss="s" + if (( min == 1 )) ; then + ms="" + fi + if (( sec == 1 )) ; then + ss="" + fi + eval print "''" $Log_actn + if [[ $Xqt_pgm = "on" ]] ; then + eval print "' Execution of $Pgm took $min minute$ms and $sec second$ss.'" $Log_actn + else + eval print "' Execution check for $Pgm took $min minute$ms and $sec second$ss.'" $Log_actn + fi + eval print "''" $Log_actn + eval print ============================================================================$Log_actn + eval print "' '"Ending $Pgm run at $(date -u +"%T %Z") on $(date -u +"%a %b %d %Y") $Log_actn + eval print ============================================================================$Log_actn + } + +zbeglog + +blank=" " + +#set -o xtrace + +# check if to run program +if [[ $Xqt_pgm = "on" ]] ; then + if [[ $Pgm = ffguid ]] ; then + if [[ $Otfil != tty ]] ; then + set -o xtrace + #print "Pgm=$Pgm blank=$blank" + eval $Xqt_prefix $Ex_dir/$Pgm << eof $Otfil_actn 2$Log_actn +c +$blank +eof + set +o xtrace + else + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + fi + if [[ $Infil_cl = "chain" ]] ; then + zendlog + Pgm="prodgen" +# eval print "' change pgm to '"$Pgm $Log_actn + if [[ $Otfil_cl != tty ]] ; then + Otflx=${Otfil_cl:-$Pgm}$User_qulf.$Dte + Otfil=$Out_dir/$Otflx + Otfil_actn="> $Otfil" + export ffg_print_filename=$Otfil + #print "ffg_print_filename=$(get_apps_defaults ffg_print_filename)" + Cofil=$Out_dir/$Pgm$User_qulf"_log".$Dte + Log_actn=">> $Cofil" + if [[ $Log_prt = "on" && $Redir = "on" ]] ; then + print "FFG execution log information will be written to:" + print " ==> $Cofil <==" + zbeglog + fi + fi + fi + fi + if [[ $Pgm = prodgen ]] ; then + #set -o xtrace + #print "Pgm=$Pgm blank=$blank Hod_set_cl=$Hod_set_cl" + if [[ $Otfil != tty ]] ; then + if [[ $Hod_set_cl = "" || $Hod_set_cl = "." ]] ; then + #set -o xtrace + eval $Xqt_prefix $Ex_dir/$Pgm << eof $Otfil_actn 2$Log_actn +1 +$blank +eof + #set +o xtrace + else + eval $Xqt_prefix $Ex_dir/$Pgm << eof $Otfil_actn 2$Log_actn +1 +$Hod_set_cl +$Otfil +eof + fi + else + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + fi + elif [[ $Pgm = zgrid ]] ; then + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + elif [[ $Pgm = sfcst ]] ; then + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + elif [[ $Pgm != ffguid ]] ; then + eval $Xqt_prefix $Ex_dir/$Pgm $Otfil_actn 2$Log_actn + fi + else +# print execution check information + Ffoper_dir=$(get_apps_defaults ffg_gsfiles) + Oper_dir=$(get_apps_defaults ofs_fs5files) + Sys_dir=$(get_apps_defaults rfs_sys_dir) + eval print "' '"Execution check information: $Log_actn + eval print "' FFG data files directory: '"$Ffoper_dir $Log_actn + eval print "' OFS data files directory: '"$Oper_dir $Log_actn + eval print "' System files directory: '"$Sys_dir $Log_actn + eval print "" $Log_actn + zendlog + exit + fi + +# time stamp ffgout file or individual product files when used and +# option to change name of ffgout file +if [[ $Pgm = prodgen ]]; then + if [[ $Copy_meth_cl = copy ]]; then + Cpactn="cp" + elif [[ $Copy_meth_cl = move ]]; then + Cpactn="mv" + fi + if [[ $Apname_cl = date ]]; then + Part2_name=$Dte + elif [[ $Apname_cl != "" ]]; then + Part2_name=$Apname_cl + else + Part2_name="" + fi + if [ -f $Out_dir/ffgout ] ; then + # for single file + if [[ $Msg_set_cl = "" ]]; then + Part_name="ffgout" + else + Part_name=$Msg_set_cl + fi + if [[ $Apname_cl != "" ]]; then + $Cpactn $Out_dir/ffgout $Out_dir/$Part_name.$Part2_name + elif [[ $Msg_set_cl != "" ]]; then + $Cpactn $Out_dir/ffgout $Out_dir/$Part_name + fi + fi +# for individual files + if [[ $Apname_cl != "" ]]; then + #for Pth in $(ls $Dir/*[0-9][0-9][0-9] 2>&-); do + for Pth in $(ls $Out_dir/[A-Z]*[!.][!0-9][!a-z] 2>&-); do + Part_name=${Pth##*/} + Date_name=$Part_name.$Part2_name + echo " $Out_dir/$Date_name" + $Cpactn $Out_dir/$Part_name $Out_dir/$Date_name + done + fi + fi + +# remove any output files that are empty +Ck_list="$Otfil $Pufil $Cofil" +for Ck_fil in $Ck_list ; do + if [[ -a $Ck_fil && -f $Ck_fil && ! -s $Ck_fil ]] ; then + eval print "''" $Log_actn + eval print Deleting $Ck_fil because nothing was written to it. $Log_actn + rm $Ck_fil + fi + done + +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit new file mode 100755 index 0000000000..cdac785616 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit @@ -0,0 +1,29 @@ +# transmit gridded FFG to AWIPS +# add to script that transmits current FFG products to AWIPS + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh + +DPBIN=/awips/fxa/bin;export DPBIN +FFGGRIB=`get_apps_defaults ffg_grib_out`;export FFGGRIB +FFGA2AID='KcccFFGBIN' +# where ccc is your old AFOS id, i.e. MKC +${DPBIN}/distributeProduct -a DEFAULTNCF -e ${FFGGRIB}/FFGBIN1 ${FFGA2AID} crazy2 +${DPBIN}/distributeProduct -a DEFAULTNCF -e ${FFGGRIB}/FFGBIN3 ${FFGA2AID} crazy2 +${DPBIN}/distributeProduct -a DEFAULTNCF -e ${FFGGRIB}/FFGBIN6 ${FFGA2AID} crazy2 + +# end diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit new file mode 100755 index 0000000000..cba9d04b7e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit @@ -0,0 +1,1177 @@ +#!/bin/ksh + +# script to test the Flash Flood Guidance System programs + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + +set +o xtrace + + ##################################################################### + ## Variable "TesPgmLis" is required by other scripts to determine + ## which programs are used by this script. + ##################################################################### + +TesPgmLis=" + zgrid prodgen ffguid + " + +# get script name +scrname=${0##*/} +#print "scrname=$scrname" + +# set commands to execute if interrupt signal encountered +signal=2 +trap " \ + set +o xtrace ; \ + print 'NOTE: in $scrname - interrupt encountered.' ; \ + set +o xtrace ; \ + xexit 0 $scrname ; exit 0 ; \ + " \ + $signal + +xscrhdr () { + print "Script $scrname started." + } + +xscrtlr () { + print "Script $scrname ended." + } + +xexit () { + print "Script $scrname ended." + } + +xrunning () { + print "RUNNING: $string" + } + +# function to set the Development System build level +xsetbuild () { + read ans?"Enter build level or for $DS_BUILD: " + #set -o xtrace + if [ "$ans" != "" ] ; then + ido=1 + while [ $ido = 1 ] ; do + if [ "$ans" = "ob2" -o "$ans" = "2" -o \ + "$ans" = "ob3" -o "$ans" = "3" -o \ + "$ans" = "ob4" -o "$ans" = "4" ] ; then + if [[ $ans = [1-9]* ]] ; then + ans="ob$ans" + fi + set -o xtrace + export DS_BUILD=$ans + set +o xtrace + ido=0 + else + print "ERROR: '$ans' is an invalid build level." + read ans?"Enter build level or for $DS_BUILD: " + if [ "$ans" = "" ] ; then + ido=0 + fi + fi + done + fi + } + +# function to check if to continue execution. +xcontinue () { +#set -o xtrace +# set prefix for options +optprefix="-" + +allval_f= +chkval_f=yes +prtstr_f= +quitval_f= + +#print "command line arguments: $*" + +# check number of command line arguments +if [ $# -gt 0 ] ; then + ichkval_f= + iprtstr_f= + iquitval_f= + while [ "$1" != "" ] ; do + #set -o xtrace + # check for optional dash + option=${1##$optprefix} + if [ "$option" = "" ] ; then + option=$1 + fi + # get option name + option=${option%%=*} + if [ "$option" = "" ] ; then + option=$1 + fi + option=${option##*=} + #print "option=$option" + # get value for option + #value=${1##*=} + value=${1#*=} + #print "value=$value" + if [ "$value" = "$option" ] ; then + value= + fi + ioption=0 + # check option name + if [[ $option = all* ]] ; then + allval_f=$value + iallval_f=1 + ioption=1 + fi + if [[ $option = chk* ]] ; then + if [[ $value = y* || $value = n* ]] ; then + chkval_f=$value + ichkval_f=1 + else + print "WARNING: in $funcname - '$value' is an invalid $option value." + fi + ioption=1 + fi + if [[ $option = command ]] ; then + command=$value + ioption=1 + fi + if [[ $option = prt* ]] ; then + prtstr_f=$value + #print "prtstr_f=$prtstr_f" + iprtstr_f=1 + ioption=1 + fi + if [[ $option = quit* ]] ; then + quitval_f=$value + iquitstr_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$iprtstr" = "" ] ; then + prtstr_f=$option + iprtstr_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$iallval" = "" ] ; then + allval_f=$option + iallval_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$ichkval" = "" ] ; then + chkval_f=$option + ichkval_f=1 + ioption=1 + fi + if [ $ioption = 0 -a "$iquitkval" = "" ] ; then + quitval_f=$option + iquitval_f=1 + fi + if [ $ioption = 0 ] ; then + print "ERROR: '$option' is an invalid option." + fi + shift + done + fi + +#print prtstr_f=$prtstr_f +#print chkval_f=$chkval_f +#print quitval_f=$quitval_f + +#set -o xtrace + +if [ "$prtstr_f" = "" ] ; then + prtstr_f="Okay to continue" + fi + +ireturn_f= + +while [ "$ireturn_f" = "" ] ; do + if [ "$command" != "" ] ; then + print "$prtstr_f" + eval $command + print -n "( for ${chkval_f})? " + else + print -n "$prtstr_f ( for ${chkval_f})? " + fi + read ans? + if [[ "$ans" = "" ]] ; then + if [[ $chkval_f = n* ]] ; then + ireturn_f=0 + fi + if [[ $chkval_f = N* ]] ; then + ireturn_f=0 + fi + if [[ $chkval_f = y* ]] ; then + ireturn_f=1 + fi + if [[ $chkval_f = Y* ]] ; then + ireturn_f=1 + fi + fi + if [[ $ans = n* ]] ; then + ireturn_f=0 + fi + if [[ $ans = N* ]] ; then + ireturn_f=0 + fi + if [[ $ans = y* ]] ; then + ireturn_f=1 + fi + if [[ $ans = Y* ]] ; then + ireturn_f=1 + fi + if [ "$quitval_f" != "" ] ; then + if [ "$ans" = "$quitval_f" ] ; then + ireturn_f=2 + fi + fi + if [ "$allval_f" != "" ] ; then + if [ "$ans" = "$allval_f" ] ; then + ireturn_f=3 + fi + fi + if [ "$ireturn_f" = "" ] ; then + print "ERROR: '$ans' is invalid. Valid values are 'yes' or 'no'." + #ireturn_f=0 + fi + done + +#print "ireturn_f=$ireturn_f" + +set +o xtrace +return $ireturn_f +set +o xtrace +} + +# print script header +xscrhdr $scrname $pid + +# set build level for running programs +xsetbuild + +# set build level for comparing files +default=$DS_BUILD +ido=1 +while [ $ido = 1 ] ; do + read ans?"Enter build level for comparing files or for $default: " + if [ "$ans" = "" ] ; then + ds_build_compare=$default + else + ds_build_compare=$ans + fi + compdir=$(get_apps_defaults ffg_dir)/output/ofstest/$ds_build_compare + #print "compdir=$compdir" + if [ ! -d $compdir ] ; then + print "ERROR: directory $compdir not found." + #set -o xtrace + string=ob + buildnum=${default##*$string} + let buildnum=$buildnum-1 + default=$string$buildnum + ds_build_compare=$default + continue + fi + ido=0 + done +print "NOTE: directory $compdir will be used for comparing files." + +# check operating system +if [ "$(uname)" = "Linux" ] ; then + unamez=lx + moreopt="-d" + redir="1> " + else + unamez=hp + moreopt="-d -e" + redir="2> " + fi +#print "moreopt=$moreopt" + +outdir=$PWD +#outdir=$HOME/$scrname + +#ffguser=ofstest_new +ffguser=ffg_testit_new +#ofsuser=ofstest +ofsuser=ffg_testit +ifpuser=ofstest + +# set environment values +#set -o xtrace +export ffg_level=$ffguser +export ofs_level=$ofsuser +export ifp_rfc=$ifpuser +export ffg_out_dir=$outdir/_prod +export ffg_grib_out=$outdir/_grib +ffg_files=$(get_apps_defaults ffg_files) +ofs_files=$(get_apps_defaults ofs_files) +ffg_duty_fcstr="." +#export $ffg_duty_fcst +set +o xtrace +print "ffg_level=$(get_apps_defaults ffg_level)" +print "ofs_level=$(get_apps_defaults ofs_level)" +print "ifp_rfc=$(get_apps_defaults ifp_rfc)" +print "ffg_files=$ffg_files" +print "ffg_ffgfiles=$(get_apps_defaults ffg_files)/$ffg_level" +print "ffg_dir=$(get_apps_defaults ffg_dir)" +print "ffg_out_dir=$(get_apps_defaults ffg_out_dir)" +print "ffg_grib_out=$(get_apps_defaults ffg_grib_out)" +print "ffg_dir=$(get_apps_defaults ffg_dir)" +#print "ffg_duty_fcstr=$(get_apps_defaults ffg_duty_fcstr)" +print "ofs_files=$ofs_files" +print "ofs_fs5files=$(get_apps_defaults ofs_fs5files)" + +#set -o xtrace +iexit=0 +if [ ! -d $ffg_files ] ; then + #print "ERROR: ffg_files $ffg_files not found." + #iexit=1 + set -o xtrace + mkdir -p $ffg_files + set +o xtrace + else + dirname=$ffg_files/$ffg_level + if [ ! -d $dirname ] ; then + #print "ERROR: dirname $dirname not found." + #iexit=1 + set -o xtrace + mkdir -p $dirname + set +o xtrace + fi + fi +if [ ! -d $ofs_files ] ; then + print "ERROR: ofs_files $ofs_files not found." + iexit=1 + else + dirname=$ofs_files/$ofs_level + if [ ! -d $dirname ] ; then + print "ERROR: dirname $dirname not found." + iexit=1 + fi + fi +if [ $iexit = 1 ] ; then + xexit 0 $scrname ; exit 0 + fi + +filename_errors=${scrname}_errors +filename_warnings=${scrname}_warnings + +zfilesize () { +# check file sizes + for filename in * ; do + if [ ! -s $filename ] ; then + print "WARNING: file $filename is a zero length file." + fi + done + } + +#zfilesize ; xcontinue + +dir_separator="#" +file_separator="=" + +zseparator () { + nrepeat=100 + line= + ncount=0 + #char="#" + char=$1 + while [ $ncount -lt $nrepeat ] ; do + let ncount=$ncount+1 + line="$line$char" + done + print "" >> $filename_compare + print "$line" >> $filename_compare + } + +zgrep () { + #set -o xtrace + string="grep" + xcontinue -prtstr="Okay to run '$string' to check output files for errors and warning" -chkstr=yes + condcode=$? + if [ $condcode = 1 ] ; then + suffix=$1 + grepfile=${filename_errors}$suffix + #set -o xtrace + string="grep "ERROR:" $filenames > $grepfile" + xrunning "$string" + eval $string + if [ -s $grepfile ] ; then + string="vi $grepfile" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + vi $grepfile + set +o xtrace + fi + else + print "NOTE: no errors found." + fi + grepfile=${filename_warnings}$suffix + string="grep "WARNING:" $filenames > $grepfile" + xrunning "$string" + eval $string + if [ -s $grepfile ] ; then + string="vi $grepfile" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + vi $grepfile + set +o xtrace + fi + else + print "NOTE: no warnings found." + fi + set +o xtrace + fi + } + +#filenames="ffguid* prodgen* zgrid*" ; zgrep ; xcontinue + +zcompare () { +# compare files + cmdname="diff" + xcontinue -prtstr="Okay to run '$cmdname' to compare output files" -chkstr=yes + condcode=$? + if [ $condcode = 1 ] ; then + compdir=$(get_apps_defaults ffg_dir)/output/ofstest/$ds_build_compare + if [ ! -d $compdir ] ; then + print "ERROR: directory $compdir not found." + else + options="-b -w" # ignore white space + filename_comparez=${scrname}_compare + filename_compare=$PWD/$filename_comparez + if [ -f $filename_compare ] ; then + rm $filename_compare + fi + #set -o xtrace + new_filenames=@.$scrname.new.filenames + old_filenames=@.$scrname.old.filenames + sedstr="/$new_filenames/d" + sedstr="$sedstr ; /$old_filenames/d" + sedstr="$sedstr ; /$filename_errors*/d" + sedstr="$sedstr ; /$filename_warnings*/d" + sedstr="$sedstr ; /$filename_comparez*/d" + #print "sedstr=$sedstr" + ls $PWD | sed "$sedstr" > $new_filenames + ls $compdir | sed "$sedstr" > $old_filenames + print "BEGIN COMPARING DIRECTORIES:" >> $filename_compare + print " $PWD" >> $filename_compare + print "AND" >> $filename_compare + print " $compdir:" >> $filename_compare + string="diff $new_filenames $old_filenames" + xrunning "$string" + $string >> $filename_compare + rm $new_filenames $old_filenames + print "END COMPARING DIRECTORIES" >> $filename_compare + #sedstr="/\/fs\/awips/d" # delete lines with pathname + #sedstr="$sedstr ; /\/fs\/hseb/d" # delete lines with pathname + sedstr="$sedstr ; /RUN DATE=/d" # delete lines with run date + sedstr="$sedstr ; /RUN DATE = /d" # delete lines with run date + for filename in * ; do + #print "filename=$filename" + if [ "$filename" = "$new_filenames" -o \ + "$filename" = "$old_filenames" -o \ + "$filename" = "$filename_errors" -o \ + "$filename" = "$filename_warnings" -o \ + "$filename" = "$filename_comparez" ] ; then + print "NOTE: skipping file /$PWD/$filename." + print "NOTE: skipping file /$PWD/$filename." >> $filename_compare + continue + fi + file1=$PWD/$filename + #print "file1=$file1" + file2=$compdir/$filename + #print "file2=$file2" + if [ -f $file1 ] ; then + string="FILES" + stringz=$file_separator + else + string="DIRECTORIES" + stringz=$dir_separator + fi + zseparator $stringz + if [ -f $file1 ] ; then + if [ ! -f $file2 ] ; then + print "ERROR: file $file2 not found." + print "ERROR: file $file2 not found." >> $filename_compare + continue + fi + fi + print "BEGIN COMPARING $string:" >> $filename_compare + print " $file1" >> $filename_compare + print "AND" >> $filename_compare + print " $file2:" >> $filename_compare + if [ ! -d $file1 ] ; then + string="$cmdname $options $file1 $file2" + xrunning "$string" + $string | + sed "$sedstr" >> $filename_compare + else + cd $filename + for filenamez in * ; do + #print "filenamez=$filenamez" + iskip=0 + if [[ $filenamez = ${scrname}*ffg ]] ; then + iskip=1 + fi + if [[ $filenamez = *$ffguser*[0-9]* ]] ; then + iskip=1 + fi + if [ $iskip = 1 ] ; then + print "NOTE: skipping file $PWD/$filenamez." + print "NOTE: skipping file $PWD/$filenamez." >> $filename_compare + continue + fi + file1=$PWD/$filenamez + #print "file1=$file1" + file2=$compdir/$filename/$filenamez + #print "file2=$file2" + if [ -f $file1 ] ; then + string="FILES" + stringz=$file_separator + else + string="DIRECTORIES" + stringz=$dir_separator + fi + zseparator $stringz + if [ -f $file1 ] ; then + if [ ! -f $file2 ] ; then + print "ERROR: file $file2 not found." + print "ERROR: file $file2 not found." >> $filename_compare + continue + fi + fi + print "BEGIN COMPARING $string:" >> $filename_compare + print " $file1" >> $filename_compare + print "AND" >> $filename_compare + print " $file2:" >> $filename_compare + string="$cmdname $options $file1 $file2" + xrunning "$string" + $string | + sed "$sedstr" >> $filename_compare + done + print "END COMPARING DIRECTORIES" >> $filename_compare + cd - + fi + set +o xtrace + done + print "END COMPARING FILES" >> $filename_compare + string="vi $filename_compare" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + vi $filename_compare + set +o xtrace + fi + fi + fi + } + +#zcompare ; xcontinue + +#set -o xtrace + +default=dvl +#string="dvl, mgr, rls, arc" +string="dvl, rls, arc" +read using?"Enter $string or for $default: " +if [ "$using" = "" ] ; then + using=$default + fi + +iexit=0 + +# set program pathname +if [[ $using = d* ]] ; then + progpath=$(get_apps_defaults my_rls) + fi +if [[ $using = m* ]] ; then + progpath=$(get_apps_defaults mgr_rls) + fi +if [[ $using = r* ]] ; then + progpath=$(get_apps_defaults ffg_rls) + fi +if [[ $using = a* ]] ; then + progpath=$(get_apps_defaults ffg_arc) + fi +if [ ! -d $progpath ] ; then + print "ERROR: directory $progpath not found." + iexit=1 + else + print "NOTE: progpath is $progpath." + fi + +# set directory for definition input file +ffgdir_define=$(get_apps_defaults ffg_files)/$ofsuser/define +if [ ! -d $ffgdir_define ] ; then + print "ERROR: directory $ffgdir_define not found." + iexit=1 + fi + +# set directory for definition output files +ffgdir_files=$(get_apps_defaults ffg_files)/$ffguser + +if [ $iexit = 1 ] ; then + xexit 0 $scrname ; exit 0 + fi + +xcontinue +condcode=$? +if [ $condcode = 0 ] ; then + xexit 0 $scrname ; exit 0 + fi + +#set -o xtrace + +# check if to delete output files and directories +ideloutdir=1 +if [ $ideloutdir = 1 ] ; then +# check if any files found + dirname=$PWD + ifound=0 + for filename in * ; do + if [ -d $filename ] ; then + ifound=1 + break + fi + if [ -f $filename ] ; then + ifound=1 + break + fi + done + if [ $ifound = 1 ] ; then + print "WARNING: the following files in $dirname will be deleted:" + ls -C -1 -l $dirname | sed '/^total /d' | more $moreopt + xcontinue + condcode=$? + if [ $condcode = 1 ] ; then + #set -o xtrace + #string="rm prodgen* ffguid* zgrid*" + #string="rm -r -f $ffg_out_dir" + #string="rm -r -f $ffg_grib_out" + string="rm -r -f *" + xrunning "$string" + $string + set +o xtrace + fi + fi + fi + +# check if to delete ffg file directory +idelffgdir=1 +if [ $idelffgdir = 1 ] ; then + dirname=$(get_apps_defaults ffg_files)/$ffguser + if [ -d $dirname ] ; then +# check if any files found + cd $dirname + ifound=0 + for filename in * ; do + if [ -d $filename ] ; then + ifound=1 + break + fi + if [ -f $filename ] ; then + ifound=1 + break + fi + done + cd - + if [ $ifound = 1 ] ; then + print "WARNING: the following files in $dirname will be deleted:" + ls -C -1 -l $dirname | sed '/^total /d' | more $moreopt + xcontinue + condcode=$? + if [ $condcode = 1 ] ; then + #set -o xtrace + string="rm -r -f $dirname" + xrunning "$string" + $string + set +o xtrace + fi + fi + fi + fi + +# check if need to create output directories +if [ ! -d $ffg_out_dir ] ; then + set -o xtrace + mkdir -p $ffg_out_dir + set +o xtrace + fi +if [ ! -d $ffg_grib_out ] ; then + set -o xtrace + mkdir -p $ffg_grib_out + set +o xtrace + fi + +blank=" " + +zchkffgdir () { + #print "in zchkffgdir - ffgdir=$ffgdir" + if [ ! -d $ffgdir ] ; then + set -o xtrace + mkdir -p $ffgdir + set +o xtrace + fi + } + +set -o xtrace + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# run program to assign threshold runoff values by areas to each HRAP bin in +# the area using the boundary defined for the area + +progname=zgrid + +export zgrid_file_prefix=$progname + +prefix=$progname +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +$blank # debug/logfile options +$ffgdir_define/defaffg # pathname of old area runoff define file +${progname}_defaffg_new # pathname of new area runoff define file +eof +set +o xtrace + +#xcontinue + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# run flash flood guidance computation program + +progname=ffguid + +# define user controls +type=user +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +u # User Controls +f # file +$ffgdir_define/defuinf +$blank +eof +set +o xtrace + +#xcontinue + +# define area parameters +type=affg +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +a # Areas +c # change +f # file +$ffgdir_define/defaffg +$blank +eof +set +o xtrace + +#xcontinue + +# define grid parameters +type=grro +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +g # Grid +f # file +$ffgdir_define/defgro01 +1 +yes +$ffgdir_define/defgro03 +3 +yes +$ffgdir_define/defgro06 +6 +yes +$ffgdir_define/defgro12 +12 +yes +$ffgdir_define/defgro24 +24 +yes +$blank +$blank # not needed for my_rls version +eof +set +o xtrace + +#xcontinue + +# define runoff adjust for grids parameters +type=gdpm +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +r # Runoff Adjust for Grids +c # change +f # file +$ffgdir_define/defgdpm +$blank +eof +set +o xtrace + +#xcontinue + +# define headwater parameters +type=hffg +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +h # Headwaters +c # change +f # file +$ffgdir_define/defhffg +$blank +eof +set +o xtrace + +#xcontinue + +# define water supply parameters +type=wsup +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +w # Water Supply +c # change +f # file +$ffgdir_define/defwsup +$blank +eof +set +o xtrace + +#xcontinue + +# output parametric information +set -o xtrace +type=dump +prefix=${progname}_$type +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +a # Areas +l # list +${progname}_${type}_parm_affg +1 # first +$blank # last +$blank +$blank +h # Headwater +l # list +${progname}_${type}_parm_hffg +1 # first +$blank # last +$blank +$blank +r # Runoff Adjust for Grids +l # list +${progname}_${type}_parm_gdpm +1 # first +$blank # last +$blank +$blank +u # User controls +l # list +${progname}_${type}_parm_uinf +$blank +w # Water Supply +l # list +${progname}_${type}_parm_wsup +1 # first +$blank # last +$blank +$blank +$blank +quit +eof +set +o xtrace + +#xcontinue + +# create other directories +type=cary +ffgdir=$ffgdir_files/$type +zchkffgdir +type=grff +ffgdir=$ffgdir_files/$type +zchkffgdir + +# compute guidance +set -o xtrace +prefix=${progname}_compute +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +eval $progpath/$progname << eof > $prtfile $logfile +c # Compute all +$blank +eof +set +o xtrace + +#xcontinue + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# run flash flood guidance product generation program + +progname=prodgen + +type=grpp +ffgdir=$ffgdir_files/$type # checked for at start of program +zchkffgdir + +# define user controls +type=user +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +u # User Controls +f # file +$ffgdir_define/defuinf +$blank +eof +set +o xtrace + +#xcontinue + +# define products +type=prod +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +p # Products +c # change +f # file +$ffgdir_define/defprod +$blank +eof +set +o xtrace + +#xcontinue + +# define groups of products +type=grpp +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +g # Groups of Products +c # change +f # file +$ffgdir_define/defgrpp +$blank +$blank +eof +set +o xtrace + +#xcontinue + +# define text parameters +type=text +ffgdir=$ffgdir_files/$type +zchkffgdir +prefix=${progname}_setup_${type} +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +T # Text +c # change +f # file +$ffgdir_define/deftext +$blank +$blank +eof +set +o xtrace + +#xcontinue + +# output parametric information +set -o xtrace +type=dump +prefix=${progname}_$type +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +eval $progpath/$progname << eof > $prtfile $logfile +s # Setup +p # Products +l # list +${progname}_${type}_parm_prod +1 # first +$blank # last +$blank +$blank +$blank +g # Groups of Products +l # list +${progname}_${type}_parm_grpp +1 # first +$blank # last +$blank +$blank +$blank +t # Text +l # list +${progname}_${type}_parm_text +1 # first +$blank # last +$blank +$blank +$blank +u # User controls +l # list +${progname}_${type}_parm_uinf +$blank +$blank +eof +set +o xtrace + +#xcontinue + +# generate products +prefix=${progname}_generate +prtfile=${prefix}_print ; export ffg_print_filename=$prtfile +logfile=$redir${prefix}_log +set -o xtrace +eval $progpath/$progname << eof > $prtfile $logfile +1 # Generate +$blank +eof +set +o xtrace + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# check file size +zfilesize + +# check files for errors and warnings +filenames="ffguid* prodgen* zgrid*" +zgrep + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# test using script ffg + +irun=1 +if [ $irun = 1 ] ; then + if [[ $using = d* ]] ; then + using="-b d" # for my_rls + fi + if [[ $using = m* ]] ; then + using="-b m" # for mgr_rls + fi + if [[ $using = r* ]] ; then + using="" # for ffg_rls + fi + if [[ $using = a* ]] ; then + using="-b ma" # for ffg_arc + fi + runopt="auto" ; progname=${PWD##*/} # run program using first item on menu + runopt="chain" ; progname=ffguid # run program ffguid then prodgen and functions as auto + logqulf="-q _$ffguser" # qualifer for [progname][user_qulf].[date] files + copyopt="-c copy" # copy files when appending suffix name + #copyopt="-c move" # move files when appending suffix name + append="-a $ffguser" # append name to message filenames + #append="-a date" # append date-time stamp to message filenames + duty_fcstr="-h $ffg_duty_fcstr" # duty forecaster + ffgscr="ffg" + string="$ffgscr -p $progname $using -i $runopt $logqulf $copyopt $append $duty_fcstr" + xcontinue -prtstr="Okay to run '$string'" + condcode=$? + if [ $condcode = 1 ] ; then + set -o xtrace + eval $string + set +o xtrace + cd $ffg_out_dir + # check file size + zfilesize + # check files for errors and warnings + filenames="ffguid* prodgen*" + set +o xtrace + zgrep "_ffg" + cd - + fi + fi + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# compare files +zcompare + +#xcontinue + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# print script trailer +xscrtlr $scrname $SECONDS + +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/work.ksh b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/work.ksh new file mode 100644 index 0000000000..11329615a7 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/work.ksh @@ -0,0 +1,4 @@ +#!/bin/ksh + +source include_me.ksh + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/RELEASE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/scripts/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/help_files/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/help_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/options/colors/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/options/colors/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/scripts/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/scripts/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/system/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/system/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/locks/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/locks/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst new file mode 100755 index 0000000000..5f54823ac5 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs batchpst_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit new file mode 100755 index 0000000000..820d1079f7 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs einmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit new file mode 100755 index 0000000000..efa94c7f02 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs fcinmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst new file mode 100755 index 0000000000..1323656fcd --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs fcstmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat new file mode 100755 index 0000000000..b8382f9d2e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs uxmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize new file mode 100755 index 0000000000..cd8ce08114 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs uzmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb new file mode 100755 index 0000000000..d100bda26b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs goesdb_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh new file mode 100755 index 0000000000..713e9a4afa --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ${env_file} +cd ${prev_dir} + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs new file mode 100755 index 0000000000..08a79aea38 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs ndfd2rfs_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil new file mode 100755 index 0000000000..44a8a2ee2c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs pdutmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit new file mode 100755 index 0000000000..b56ea47fd8 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs ppinmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil new file mode 100755 index 0000000000..7daebc8a06 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs prutmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder new file mode 100755 index 0000000000..ffb47cbc67 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs urmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb new file mode 100755 index 0000000000..f59d0ea3db --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs sasmdb_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars new file mode 100755 index 0000000000..bdfc0406e7 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs dfprmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost new file mode 100755 index 0000000000..5ff6e836e7 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost @@ -0,0 +1,14 @@ +#!/bin/sh + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + + +runso rary.ohd.ofs dfpsmain_main_ $@ \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/mods/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/mods/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/input/oper/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/input/oper/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/jelkins/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/jelkins/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group new file mode 100755 index 0000000000..c66d90de90 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group @@ -0,0 +1,98 @@ +#!/bin/ksh +#========================================================================== +# Create file directories for an OFS files group +# +USAGE="Usage: create_files_group group_name" +# +# The script create_files_group will create a new branch in the ofs files +# directory structure. The command usage is: +# +# create_files_group group_name +# +# The group_name parameter is required. The top-level of the files group branch +# is created directly under the "ofs_files" directory ("" indicating the use of +# a gad token). The names of the sub-directories created under +# group_name held in the file ofs.files_dir.list in the "rfs_sys_dir" +# directory. All directories in the chain are tested for existence and are +# created if they don't exist. +# Permissions are read for all users and write for the user and group. +#========================================================================== + +if [[ -z $1 ]] + then + print $USAGE + exit + fi + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + +print ' 'Creating OFS files directories for $1 group +print ' 'at `date -u +"%T %Z"` on `date -u +"%a %b %d %Y"` +print "" + +# Now create the ofs groups as indicated in the "groups" files +# First see if the directory above the fs5files needs to be created +# then create the fs5files, shefdata, mods, and griddb directories + +Files_dir=$(gad ofs_files) +List_dir=$(gad rfs_sys_dir) +List_file=$List_dir/ofs.files_dir.list + +print " Check to create: $Files_dir" + +if [[ ! -a $Files_dir ]] + then + mkdir $Files_dir + chmod ug+rw $Files_dir + print " Directory $Files_dir created." + fi + +Grp_dir=$Files_dir/$1 +print "" +print " Check to create: $Grp_dir" + +if [[ ! -a $Grp_dir ]] + then + mkdir $Grp_dir + chmod ug+rwx $Grp_dir + print " Directory $Grp_dir created." + fi +if [[ -a $List_dir && -d $List_dir && -a $List_file ]] + then + while read -r sub_dir_name + do + print " Check to create: $Grp_dir/$sub_dir_name" + + if [[ ! -a $Grp_dir/$sub_dir_name ]] + then + mkdir $Grp_dir/$sub_dir_name + chmod ug+rwx $Grp_dir/$sub_dir_name + print " Directory $Grp_dir/$sub_dir_name created." + if [[ $sub_dir_name = dhmdata ]] + then + mkdir $Grp_dir/$sub_dir_name/parameters + chmod ug+rwx $Grp_dir/$sub_dir_name/parameters + print " Directory $Grp_dir/$sub_dir_name/parameters created." + mkdir $Grp_dir/$sub_dir_name/states + chmod ug+rwx $Grp_dir/$sub_dir_name/states + print " Directory $Grp_dir/$sub_dir_name/states created." + mkdir $Grp_dir/$sub_dir_name/pet + chmod ug+rwx $Grp_dir/$sub_dir_name/pet + print " Directory $Grp_dir/$sub_dir_name/pet created." + mkdir $Grp_dir/$sub_dir_name/channelflow + chmod ug+rwx $Grp_dir/$sub_dir_name/channelflow + print " Directory $Grp_dir/$sub_dir_name/channelflow created." + fi + fi + done < $List_file + fi + +return diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group new file mode 100755 index 0000000000..4ea34e1e41 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group @@ -0,0 +1,83 @@ +#!/bin/ksh +#========================================================================== +# Create input file directories for OFS +# +USAGE="Usage: create_input_group group_name" +# +# The script create_input_group will create a new branch in the ofs input +# directory structure. The command usage is: +# +# create_input_group group_name +# +# The group_name parameter is required. The top-level of the input group +# branch is created directly under the "ofs_dir"/input directory ("" +# indicating the use of a gad token). The names of the +# sub-directories created under group_name correspond to the collection of +# batch ofs programs that exist on the scientific workstations. A list of +# those programs is held in the file ofs.program.list in the "rfs_sys_dir" +# directory. All directories in the chain are tested for existence and are +# created if they don't exist. Permissions are read for all users and write +# for the user and group. +#========================================================================== + +if [[ -z $1 ]] + then + print $USAGE + exit + fi + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + +print Creating OFS input directories for $1 group +print ' 'at `date -u +"%T %Z"` on `date -u +"%a %b %d %Y"` +print "" + +# First create default input directories + +List_dir=$(gad rfs_sys_dir) +List_file=$List_dir/ofs.program.list +Inpt_dir=$(gad ofs_dir)/input + +print " Check to create: $Inpt_dir" + +if [[ ! -a $Inpt_dir ]] + then + mkdir $Inpt_dir + chmod ug+rwx $Inpt_dir + print " Directory $Inpt_dir created." +fi + +Inpt_dir=$Inpt_dir/$1 +print " Check to create: $Inpt_dir" + +if [[ ! -a $Inpt_dir ]] + then + mkdir $Inpt_dir + chmod ug+rwx $Inpt_dir + print " Directory $Inpt_dir created." +fi + +if [[ -a $List_dir && -d $List_dir && -a $List_file ]] + then + while read -r pgm_name + do + print " Check to create: $Inpt_dir/$pgm_name" + + if [[ ! -a $Inpt_dir/$pgm_name ]] + then + mkdir $Inpt_dir/$pgm_name + chmod ug+rwx $Inpt_dir/$pgm_name + print " Directory $Inpt_dir/$pgm_name created." + fi + done < $List_file + fi + + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh new file mode 100755 index 0000000000..b84331febf --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# find set_hydro_env and initialize the environment +prev_dir=`pwd` +env_file="set_hydro_env" +while [ ! -e ${env_file} ] +do + cd .. + if [ "/" = "`pwd`" ] + then + break + fi +done +. ./${env_file} +cd ${prev_dir} + +gad() { + get_apps_defaults $@ +} + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/ofs b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/ofs new file mode 100755 index 0000000000..d02a20c9fc --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/ofs @@ -0,0 +1,631 @@ +#!/bin/ksh +# ======================================================================== +# pgm: ofs .. run OFS program +# +USAGE="usage:ofs -p pgm [-i in_file] [-o out_file_prefix] [-f fileset] \ +[-u user] [-g input_group] [-r reor_set] [-h shefout_file_name] \ +[-d] [-m] [-a] [-t] [-x] [-s]" +# +# The only required parameter is the program to be executed indicated by the +# -p switch. +#--------------------------------------------------------------------------- +# All other parameters are optional and will be successfully provided values +# if not supplied on the command line. However, certain switch values +# become meaningless unless provided with values by the user. Switches are: +# +# Switch Description Default value +# ------ ------------------------------ -------------------------- +# -i Input file to be used with stop +# program. File must be +# located in the appropriate +# program's input directory. +# +# -o Output file prefix or "tty". "program name" +# Files are date-time stamped +# and placed in the user's output +# directory. If "tty" is given, +# output goes to the terminal. +# +# -f ofs file set override. The file set indicated +# by the gad +# token "ofs_level". +# +# -g Input file group override. The group indicated by the +# gad token +# "ofs_inpt_grp" +# +# -u User name override. Used to Log-in user id ($LOGNAME). +# place output in output dir. +# other than the submitting +# user's. +# +# -r Reorder file set override. The file set indicated +# by the gad +# token "ofs_reor_lvl". +# +# -h Name of shefout file used as shefout +# output from shefpars and as +# input to shefpost +# +# -d Use "development" executable Use directory indicated +# directory indicated by the by the "ofs_rls" token. +# token "my_rls". +# +# -a Use "manager" executable Use directory indicated +# directory indicated by the by the "ofs_rls" token. +# token "mgr_rls". +# +# -m Suppress "info" message Message will be printed. +# generation. +# +# -t Have log information displayed Output into log file. +# at terminal. +# +# -x Conduct execution check only, Program will be executed. +# displaying add'l info, but +# program is not executed. +# +# -s Execute program on machine Execute program on machine +# designated as ofs_server via from which ofs command is +# gad mechanism. issued. +#--------------------------------------------------------------------------- +# rqd: gad +# +# ver: 20020122 +#=========================================================================== + +# Change Information +# +# Disable the -s switch for HPs since it doesn't work and the HP is +# faster anyway. jto - 3/98 +# Update to include ndfd2rfs temperature pre-processor 10/10/04 Edwin +# Update to put -m back to suppressing messages, and made -c the mgr option +# no known reason why the -m became mgr, but this returns the script to the +# configuration in the field 2/3/05 Edwin +# +#=========================================================================== + +# returns a fully resolved path +get_full_path() { + cd "$1" + echo $(pwd) +} + +script_dir=$(get_full_path $(dirname $0)) + +. $script_dir/include_hydro_env.sh + +# Make sure the temporary input file is removed at script exit + + trap '[ -f "$Tmpfile" ] && /bin/rm $Tmpfile 2>> /dev/null' 0 + + Dte=$(date -u +%Y%m%d.%H%M%S) + +# Umask patch + + umask 002 + +# On Linux we output log messages to stdout, on HP to stderr: + + [ "`uname`" = Linux ] && Num_actn=1 || Num_actn=2 + +# Initialize command line parameters + + Pgm_cl="" + Infil_cl="" + Otfil_cl="" + Fl_set_cl="" + Inpt_grp_cl="" + User_cl="" + Reor_cl="" + Sho_fil_cl="" + Devl="off" + Mgr="off" + Msg_prt="on" + Redir="on" + Xqt_pgm="on" + Remsh_request="off" + +# Determine which parameters were entered on the command line + +while getopts :p:i:o:f:g:u:r:h:damtxs cl_args +do + case $cl_args in + p) Pgm_cl=$OPTARG;; + i) Infil_cl=$OPTARG;; + o) Otfil_cl=$OPTARG;; + f) Fl_set_cl=$OPTARG;; + u) User_cl=$OPTARG;; + g) Inpt_grp_cl=$OPTARG;; + r) Reor_cl=$OPTARG;; + h) Sho_fil_cl=$OPTARG;; + d) Devl="on";; + a) Mgr="on";; + m) Msg_prt=off;; + t) Redir="off";; + x) Xqt_pgm=off;; + s) [ "`uname`" = HP-UX ] && { Remsh_request="on"; RshCmd="ssh"; } + [ "`uname`" = Linux ] && { Remsh_request="on"; RshCmd="ssh"; };; + :) Ms_arg=$OPTARG;; + \?) bad_sw=YES;; + esac +done + +# See if command line args were entered properly + +bad_cl=0 +if [[ $Ms_arg != "" || $bad_sw != "" || $Pgm_cl = "" ]] + then + bad_cl=1 + fi + +for Ck_arg in $Pgm_cl $Infil_cl $Otfil_cl $Fl_set_cl $User_cl $Reor_cl \ + $Sho_fil_cl +do + if [[ $Ck_arg = -[a-zA-Z0-9.] ]] + then + bad_cl=1 + break + fi +done + +# create output directory for user if it doesn't exist + + Usr=${User_cl:-$LOGNAME} + Out_dir=$(gad ofs_output)/$Usr + if [[ ! -d $Out_dir ]] + then + + AccRit=775 + if [ "$Usr" = ofstest ]; then + [ "$LOGNAME" = testmgr ] && AccRit=755 || AccRit=555 + fi + + mkdir -p $Out_dir + chmod $AccRit $Out_dir + fi + + Pgm=${Pgm_cl:-"No_pgm"} + Cofil=$Out_dir/$Pgm"_log".$Dte + +# Check to see if messages are to be returned to terminal + + if [[ $Redir = "on" ]] + then + Log_actn=">> $Cofil" + else + Log_actn="" + fi + +# Check to see if "informatory" message is to be displayed + + if [[ $Msg_prt = "on" && $Redir = "on" ]] + then + print "OFS execution log information will be written to:" + print " ==> $Cofil <==" + fi + +# Kick out if bad command line arguments entered + +if (( $bad_cl == 1 )) + then + eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' $USAGE '" $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + +# Establish key parameters for program execution + + if [[ $Fl_set_cl != "" ]] + then + export ofs_level=$Fl_set_cl + fi + + if [[ $Inpt_grp_cl != "" ]] + then + export ofs_inpt_grp=$Inpt_grp_cl + fi + + if [[ $Reor_cl != "" ]] + then + export ofs_reor_lvl=$Reor_cl + fi + + + if [[ $Devl = on ]] + then + Ex_dir=$(gad my_rls) + elif [[ $Mgr = on ]] + then + Ex_dir=$(gad mgr_rls) + else + Ex_dir=$(gad ofs_rls) + fi + +############################################################################## +# Added by DHM Team (11/06)... +# add the following jars and so's to the approriate ENV paths for executing DHM through FCST +############################################################################## + + shared_jars=$(gad util_rls)/toolsUI-2.2.12.jar:$(gad util_rls)/jgrapht-0.6.0.jar:$(gad util_rls)/commons-io-1.3.1.jar:$(gad util_rls)/commons-collections-3.1.jar + util_nwsrfs_jars=$(gad util_rls)/ofs.jar:$(gad util_rls)/dhm.jar:$(gad util_rls)/rdhmutilities.jar:$(gad util_rls)/distrouting.jar + + export CLASSPATH=$shared_jars:$util_nwsrfs_jars + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(gad util_rls):$(gad sys_java_dir)/lib/i386:$(gad sys_java_dir)/lib/i386/native_threads:$(gad sys_java_dir)/lib/i386/client + + In_dir=$(gad ofs_input)/$Pgm + Shef_dir=$(gad ofs_shefdata_dir) + Sho_dir=$(gad ofs_shefout_dir) + + +############################################################################## +# Added by Hank Herr (12/4/01)... +# If the Pgm is convert_espts, then I need to change the Ex_dir to point to +# the scripts directory. I also need a different Num_actn. +############################################################################## +if [[ $Pgm = "convert_griddb" ]] +then + Ex_dir="$(gad ofs_scripts)" + Num_actn=2 +fi + +# Check to see if program exists at exec directory + + if [[ ! -a $Ex_dir/$Pgm || ! -f $Ex_dir/$Pgm || ! -x $Ex_dir/$Pgm ]] + then + eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script for $Pgm at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Ex_dir/$Pgm"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is not executable. $Log_actn + eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + +# Establish file names that can be used by any OFS program + + Inflx=${Infil_cl:-stop} + Infil=$In_dir/$Inflx + +if [[ $Otfil_cl = tty ]]; then + Otflx=tty + Otfil=tty + Otfil_actn="" + else + Otflx=${Otfil_cl:-$Pgm}.$Dte + Otfil=$Out_dir/$Otflx + Otfil_actn="> $Otfil" +fi + + Pufil=$Out_dir/$Pgm"_pun".$Dte + Shofl=${Sho_fil_cl:-shefout} + X1fil=$Out_dir/$Pgm"_unit1".$Dte + X8fil=$Out_dir/$Pgm"_unit8".$Dte + X9fil=$Out_dir/$Pgm"_unit9".$Dte + X97fil=$Out_dir/$Pgm"_unit97".$Dte + Tmpfile=/tmp/${0##*/}.$LOGNAME.$$ + + if [[ $Pgm = shefpars || $Pgm = shefpost ]] + then + Inflx=$Pgm.in + Infil=$In_dir/$Inflx + Xxfil=$Sho_dir/$Shofl + if [[ $Pgm = shefpars ]] + then + Shflx=${Infil_cl:-shin} + Shfil=$Shef_dir/$Shflx + + # Check to see if SHEF input file exists as a file + # and is not empty + + if [[ ! -a $Shfil || ! -f $Shfil || ! -s $Shfil ]] + then +eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script for $Pgm at $(date -u +"%T %Z") on\ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Shfil"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is empty. $Log_actn +eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + + fi + fi + +# Check to see if input file exists as a file and is not empty. +# Note, skip this section if program "ndfd2rfs" is used. + +if [[ $Pgm != ndfd2rfs ]] + then + if [[ ! -a $Infil || ! -f $Infil || ! -s $Infil ]] + then +eval print ============================================================================$Log_actn + eval print "' '"Stopping OFS script at $(date -u +"%T %Z") on \ + $(date -u +"%a %b %d %Y") $Log_actn + eval print "' ==> '"$Infil"' <=='" $Log_actn + eval print "' '"does not exist, is not a file, or is empty. $Log_actn +eval print ============================================================================$Log_actn + eval print "''" $Log_actn + exit 1 + fi + + +# Take tabs out of input file: +# ... routine "tab_out" MUST EXIST in the user environment +# ... use "if [[ "`uname -s`" = "AIX" ]]; then" if only IBM usage + + if grep -l ' ' "$Infil" >/dev/null; then + tab_out $Infil ${Infil}_temp \ + && mv ${Infil}_temp $Infil \ + || rm -f ${Infil}_temp + [ "$LOGNAME" = testmgr ] && chmod 644 $Infil || chmod 664 $Infil + fi + +fi # end of if on ndfd +# +# See if request made to execute program on ofs_server +# + +This_cpu=$(hostname | cut -f1 -d".") +##=## Xqt_prefix='$Ex_dir/$Pgm < $Tmpfile $Otfil_actn' + +if [[ $Remsh_request = "on" ]] + then + ofs_server=$(gad ofs_server) + ofs_server_defined="no" + +# Can't do remote execution if g_a_d token not defined. + + if [[ $ofs_server != "" ]] + then + ofs_server_defined="yes" + +# See if we're already on ofs_server, and +# if not, see if we can remsh to that box. + + if [[ $This_cpu != $ofs_server ]] + then + eval $RshCmd $ofs_server -n date >> /dev/null 2>> /dev/null + remsh_code=$? + if (( $remsh_code == 0 )) + then + lvl=$(gad ofs_level) +##=## Xqt_prefix='remsh $ofs_server -n \"{ export ofs_level=$lvl; $Ex_dir/$Pgm < $Tmpfile $Otfil_actn; }\"' + valid_request="yes" + else + valid_request="no" + fi + fi + fi + fi + +eval print ============================================================================$Log_actn +if [[ $Xqt_pgm = "on" ]] + then +eval print "' '"Starting OFS program execution at $(date -u +"%T %Z") on \ +$(date -u +"%a %b %d %Y") $Log_actn +else +eval print "' '"Starting OFS execution check at $(date -u +"%T %Z") on \ +$(date -u +"%a %b %d %Y") $Log_actn +fi + +eval print "' OFS command issued on: '"$This_cpu $Log_actn +eval print "' Program to be executed: '"$Pgm $Log_actn + +if [[ $Remsh_request = "off" ]] + then +eval print "' Local execution on: '"$This_cpu $Log_actn + + else +eval print "' Remote exec requested. '" $Log_actn + if [[ $This_cpu = $ofs_server ]] + then +eval print "' This cpu is ofs server. '" $Log_actn +eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $ofs_server_defined = "no" ]] + then +eval print "' OFS Server not defined. '" $Log_actn +eval print "' Local execution on: '"$This_cpu $Log_actn + else + if [[ $valid_request = "no" ]] + then +eval print "' Cannot execute on: '"$ofs_server $Log_actn +eval print "' Local execution on: '"$This_cpu $Log_actn + else +eval print "' Remote execution on: '"$ofs_server $Log_actn + fi + fi + fi + fi + +eval print "' Executable directory: '"$Ex_dir $Log_actn +eval print "' Input file: '"$Inflx $Log_actn +eval print "' Input directory: '"$In_dir $Log_actn +eval print "' Output file: '"$Otflx $Log_actn +eval print "' Output directory: '"$Out_dir $Log_actn +if [[ $Pgm = shefpars ]] + then + eval print "' SHEF file: '"$Shflx $Log_actn + eval print "' SHEF directory: '"$Shef_dir $Log_actn + fi +eval print ============================================================================$Log_actn + +# Execute OFS program, unless "execute program" switch is off + +if [[ $Xqt_pgm = "on" ]] + then + +############################################################################## +# Added by Hank Herr (12/4/01)... +# The convert_griddb runs differently than the others, so I'll handle it +# in a special way right here. +############################################################################## +if [[ $Pgm = convert_griddb ]] +then + # execute the pgm + eval $Ex_dir/$Pgm $In_dir/$Inflx > $Out_dir/$Otflx $Num_actn$Log_actn + exit 0 +fi +############################################################################## + +############################################################################## +# Added by Edwin Welles... +# +############################################################################## +if [[ $Pgm = ndfd2rfs ]] +then + # execute the wrapper script + scr_Dir=$(get_apps_defaults ofs_scripts) + # execute the pgm + eval $scr_Dir/${Pgm}.ksh $Out_dir/$Otflx $Num_actn$Log_actn + exit 0 +fi +############################################################################## + +# Set up temporary file for use in input redirection +# for program execution + +if [[ $Pgm = fcst ]]; then +cat > $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < $Tmpfile < Basins overlay +# resvrs_latlon.OS --> Reservoirs overlay +# grid_to_basin_hrap.OS --> HRAP grid to basin +# navigation file +# grid_to_county_hrap.OS --> HRAP grid to county +# navigation file +# +# GeoLine-based files: +# +# hiways_latlon.OS --> Highways overlays +# roads_latlon.OS --> Road overlay +# rivers_latlon.OS --> Rivers overlay +# streams_latlon.OS --> Streams overlay +# +# ORIGINAL AUTHOR: Bryon Lawrence +# CREATION DATE: November 20, 2003 +# ORGANIZATION: HSEB-OHD +# MACHINE: HP-UX, Redhat Linux. +# MODIFICATION HISTORY: +# DATE PROGRAMMER DESCRIPTION/REASON +# 11/20/2003 Bryon Lawrence Original Coding +################################################################################ +# + +geo_area_types_filenames="BASIN:basins.dat COUNTY:counties.dat RESRVR:resvrs.dat ZONE:zones.dat" +geo_line_types_filenames="ROAD:HIWAYS:hiways.dat:1 ROAD:ROADS:roads.dat:2 STREAM:RIVERS:rivers.dat:1 STREAM:STREAMS:streams.dat:2" + +# +# Source set_hydro_env +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_GEODATA_DIR=$(get_apps_defaults whfs_geodata_dir) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# Create the log directory. +LOGNAME=$WHFS_UTIL_LOG_DIR/create_whfs_geodata.log + +rm -f $LOGNAME + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` + +echo "=====================================" | tee -a $LOGNAME +echo "Starting create_whfs_geodata on $date ..." | tee -a $LOGNAME +printf "Logging to $LOGNAME.\n" + +# Check the existence of each of the .dat files. If the .dat file +# does not exist for a particular GeoArea or GeoLine type, then +# unload it from the database. + +# First the existence of the .dat files containing GeoArea data is checked. +# Any files that are missing are created by unloading data for the +# correct boundary_type from the GeoArea table. +for i in $geo_area_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + filename=`echo $i | cut -d: -f2` + + if [[ ! -a $WHFS_GEODATA_DIR/$filename || \ + ! -r $WHFS_GEODATA_DIR/$filename ]] + then + + printf "\nFile $filename does not exist. Unloading it from the\n" \ + | tee -a $LOGNAME + printf "GeoArea table\n" | tee -a $LOGNAME + printf "Running $WHFS_BIN_DIR/process_geoarea -u\n" \ + | tee -a $LOGNAME + printf "-d$DB_NAME -t$filetype $WHFS_GEODATA_DIR/$filename\n" \ + | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoarea -u -d$DB_NAME -t$filetype \ + $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + printf "\nThe call to process_geoarea failed.\n" | tee -a $LOGNAME + fi + fi + +done + +# Now, the existence of the .dat files containing geoline data is checked. +# Any missing files are created by unloading data from the GeoLine table +# for the correct vector type. +for i in $geo_line_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + typename=`echo $i | cut -d: -f2` + filename=`echo $i | cut -d: -f3` + rank=`echo $i | cut -d: -f4` + + if [[ ! -a $WHFS_GEODATA_DIR/$filename || \ + ! -r $WHFS_GEODATA_DIR/$filename ]] + then + + printf "\nFile $filename does not exist. Unloading it from the\n" \ + | tee -a $LOGNAME + printf "GeoLine table\n" | tee -a $LOGNAME + printf "Running $WHFS_BIN_DIR/process_geoline -u \n" \ + | tee -a $LOGNAME + printf "-d$DB_NAME -t$filetype -n$typename -r$rank " \ + | tee -a $LOGNAME + printf "$WHFS_GEODATA_DIR/$filename\n" | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoline -u -d$DB_NAME -t$filetype \ + -n$typename -r$rank $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + printf "The call to process_geoline failed.\n" | tee -a $LOGNAME + fi + fi + +done + +# +# Any .dat files which needed to be created have been created. It is now +# time to load them into the GeoArea and GeoLine tables. First the +# .dat files containing GeoArea data are loaded into the GeoArea table. +# +# Load all of the GeoArea .dat files into the database. The process_geoarea +# routine will decide which overlay and navigation files to create. + +for i in $geo_area_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + filename=`echo $i | cut -d: -f2` + + printf "Running $WHFS_BIN_DIR/process_geoarea -l -d$DB_NAME\n" \ + | tee -a $LOGNAME + printf "-t$filetype $WHFS_GEODATA_DIR/$filename\n" \ + | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoarea -l -d$DB_NAME -t$filetype \ + $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + printf "The call to process_geoarea failed.\n" | tee -a $LOGNAME + fi + +done + +# Load all of the GeoLine .dat files into the database. The process_geoline +# routine will decide which overlay files to create. +for i in $geo_line_types_filenames +do + + filetype=`echo $i | cut -d: -f1` + typename=`echo $i | cut -d: -f2` + filename=`echo $i | cut -d: -f3` + rank=`echo $i | cut -d: -f4` + + printf "Running $WHFS_BIN_DIR/process_geoline -l -d$DB_NAME\n" \ + | tee -a $LOGNAME + printf "-t$filetype -n$typename -r$rank $WHFS_GEODATA_DIR/$filename\n" \ + | tee -a $LOGNAME + + $WHFS_BIN_DIR/process_geoline -l -d$DB_NAME -t$filetype \ + -n$typename -r$rank $WHFS_GEODATA_DIR/$filename 2>&1 > /dev/null + + if [ $? -ne 0 ] + then + + printf "The call to process_geoline failed.\n" | tee -a $LOGNAME + + fi + +done + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` +printf "create_whfs_geodata completed on $date\n" | tee -a $LOGNAME diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/crs2awips.ksh b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/crs2awips.ksh new file mode 100755 index 0000000000..6666651f77 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/crs2awips.ksh @@ -0,0 +1,34 @@ +#!/bin/ksh +# +# crs2awips.ksh +# +# given CRS id, find best-fit awips +# the input file contains 3 fields: +# 1) afos cccnnnxxx 2) wmo ttaaoo 3) awips cccc +# +# Last Modified: 01/31/2002 +# +export FILENAME=/awips/fxa/data/afos2awips.txt + +if [[ $1 = "" ]] +then + echo NO_ID_GIVEN + exit +fi + +export CRS_ID=$1 + +CCCNNN=`echo $CRS_ID | cut -c1-6` +LINE=`grep "$CCCNNN" $FILENAME` + + +if [ -n "$LINE" ] +then + CCCC=`echo $LINE | cut -f3 -d" " ` + NNNXXX=`echo $LINE | cut -c4-9 ` + AWIPSID=$CCCC$NNNXXX + echo $AWIPSID +else + echo NO_MATCH +fi +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/damcrest.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/damcrest.jar new file mode 100755 index 0000000000..3860561b34 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/damcrest.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/fcstservice.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/fcstservice.jar new file mode 100755 index 0000000000..32d6ba07af Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/fcstservice.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/fldat.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/fldat.jar new file mode 100755 index 0000000000..c3cb6a36fc Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/fldat.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/init_rivermon_tables.ksh b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/init_rivermon_tables.ksh new file mode 100755 index 0000000000..7c0620fcd8 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/init_rivermon_tables.ksh @@ -0,0 +1,35 @@ +#!/bin/ksh + +#Author: Varalakshmi Rajaram +#Date : May 10th 2006 +#Initialize rivermonlocation and rivermongroup tables + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +###################### function +fn(){ + psql $DB_NAME -e << END + \copy rpffcstgroup (group_id, group_name, ordinal) to './input.grp' with delimiter '|' + \copy rivermongroup(group_id, group_name, ordinal) from './input.grp' with delimiter '|' + insert into rivermongroup values('DEFAULT', 'DEFAULT GROUP', 1); + update rivermongroup set hsa=(select hsa from admin) where hsa is null; + \copy rpffcstpoint (lid, group_id, ordinal) to './input.lid1' with delimiter '|' + create table dummytable(lid varchar(8)); + insert into dummytable select lid from location where lid not in(select lid from rpffcstpoint); + \copy dummytable (lid) to './input.lid2' with delimiter '|' + \copy rivermonlocation(lid, group_id, ordinal) from './input.lid1' with delimiter '|' + \copy rivermonlocation(lid) from './input.lid2' with delimiter '|' + update rivermonlocation set ordinal=1 where ordinal is null; + update rivermonlocation set group_id='DEFAULT' where group_id is null; + drop table dummytable; +END + + rm -f ./input.grp ./input.lid1 ./input.lid2 +} + +fn diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/load_rpf_backup_msg b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/load_rpf_backup_msg new file mode 100755 index 0000000000..20bdf9c5c0 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/load_rpf_backup_msg @@ -0,0 +1,177 @@ +#!/bin/ksh +# +# load_rpf_backup_msg +# +# version: July 6, 2006 +# +# This script performs the real work in posting the +# RiverPro information associated with backup information +# from neighboring sites. It is called from the process_rpf_backup_msg +# +# The script takes the incoming message, cleans up the file, then +# extracts the info within the file for the three database +# tables, and loads the information into the database. +# + +# set up SOME environment variables for WHFS applications + +RUN_FROM_DIR=`dirname $0` +#. $RUN_FROM_DIR/../../set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export DB_NAME=$(get_apps_defaults db_name) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# assign the args to local variables + +FILENAME=$1 +PRODUCTID=$2 +PACKEDTIME=$3 +WFO_SOURCE=$4 + +# +# define the log file names. +# this name must be consistent with the name in the calling script. +# + +LOGFILE=$RPF_LOG_DIR/process_backup_$PACKEDTIME.log.from$WFO_SOURCE + +Dte=`date -u` +/bin/echo Begin load_rpf_backup_msg at $Dte >> $LOGFILE + +# +# create a new output file by removing the two header lines +# from the product and the extra carriage returns that are added by +# the distributeProduct operations. also change the backslash-newline +# sequence to be newline +# + +NEWFILENAME=$WHFS_PRODUCT_DIR/$PRODUCTID.$PACKEDTIME.from$WFO_SOURCE +/bin/sed -e '1,2d' $FILENAME | /usr/bin/tr -d '\015' > $NEWFILENAME + + +# for testing possibilities... +#cat $FILENAME | /usr/bin/tr -d '\015' | sed 's/\\n\\n/\\n/g' | sed 's/\\n/\n/g' > $NEWFILENAME +#cat $FILENAME | /usr/bin/tr -d '\015' > $NEWFILENAME + +# +# parse the three sets of data in the file into individual load files. +# use an embedded awk script to do this. just in case, +# remove any files beforehand since the files is always appended to. +# these work files get purged from the product dir via a cron. +# + +VTECEVENT_FILE=$WHFS_PRODUCT_DIR/VTECevent_$PACKEDTIME.load.$WFO_SOURCE +FPPREVPROD_FILE=$WHFS_PRODUCT_DIR/FpPrevProd_$PACKEDTIME.load.$WFO_SOURCE +TEXTPRODUCT_FILE=$WHFS_PRODUCT_DIR/TextPoduct_$PACKEDTIME.load.$WFO_SOURCE + +if [ -s $VTECEVENT_FILE ] +then + rm -f $VTECEVENT_FILE +fi + +if [ -s $FPPREVPROD_FILE ] +then + rm -f $FPPREVPROD_FILE +fi + +if [ -s $TEXTPRODUCT_FILE ] +then + rm -f $TEXTPRODUCT_FILE +fi + +awk 'BEGIN {FS=" "; + header_mode=0 + file_name="" + } + +$1=="table:vtecevent" { header_mode=1; file_name=file1 } +$1=="table:fpprevprod" { header_mode=1; file_name=file2 } +$1=="table:textproduct" { header_mode=1; file_name=file3 } + +$1!="table:vtecevent" && $1!="table:fpprevprod" && $1!="table:textproduct" { + if ( header_mode == 1 ) print >> file_name; + }' file1=$VTECEVENT_FILE file2=$FPPREVPROD_FILE file3=$TEXTPRODUCT_FILE $NEWFILENAME + +# +# load the three data sets by using \copy table from file in Postgres, note that +# the load will fail if there is duplicate data +# + +/bin/echo Loading VTECevent, FpPrevProd, TextProduct records. >> $LOGFILE +/bin/echo Duplicate record errors can be ignored. >> $LOGFILE + +# +# load the VTECevent data +# + +/bin/echo Loading VTECevent table......... >> $LOGFILE +$POSTGRESQLBINDIR/psql -d $DB_NAME -c "\COPY VTECevent FROM $VTECEVENT_FILE USING DELIMITERS '|' WITH NULL as ''" >> $LOGFILE 2>&1 + +# +# load the FpPrevProd table +# + +/bin/echo Loading FpPrevProd table......... >> $LOGFILE +$POSTGRESQLBINDIR/psql -d $DB_NAME -c "\COPY FpPrevProd FROM $FPPREVPROD_FILE USING DELIMITERS '|' WITH NULL as ''" >> $LOGFILE 2>&1 + +# +# load the TextProduct table +# + +/bin/echo Loading TextProduct table......... >> $LOGFILE +$POSTGRESQLBINDIR/psql -d $DB_NAME -c "\COPY TextProduct FROM $TEXTPRODUCT_FILE USING DELIMITERS '|' WITH NULL as ''" >> $LOGFILE 2>&1 + + +# When a new product id arrives for the first time, make an entry to the +# PurgeProduct table for the product id. This is needed to ensure +# that there are not unlimited number of products for the product id in +# the TextProduct table. + + +/bin/echo Make entry to PurgeProduct per product id >> $LOGFILE + +TIMESTR=`date -u +"%F %k:%M:%S"` + +YEARSTR=`echo $PACKEDTIME | cut -c1-4` +MONSTR=`echo $PACKEDTIME | cut -c5-6` +DAYSTR=`echo $PACKEDTIME | cut -c7-8` +HOURSTR=`echo $PACKEDTIME | cut -c9-10` +MINSTR=`echo $PACKEDTIME | cut -c11-12` +SECSTR=`echo $PACKEDTIME | cut -c13-14` +PRODUCTTIME="$YEARSTR-$MONSTR-$DAYSTR $HOURSTR:$MINSTR:$SECSTR" + +product_id_num=$(echo "SELECT count(*) FROM PurgeProduct "\ + "WHERE product_id='$PRODUCTID';" | $POSTGRESQLBINDIR/psql -d $DB_NAME -t) + + + +if [ $product_id_num -eq 0 ] +then + + echo "INSERT INTO PurgeProduct "\ + "VALUES ('$PRODUCTID',"\ + "3, '$PRODUCTTIME','$TIMESTR');" | $POSTGRESQLBINDIR/psql -d $DB_NAME + +else + + echo "UPDATE PurgeProduct "\ + "SET producttime='$PRODUCTTIME', "\ + "postingtime='$TIMESTR'" \ + "WHERE product_id='$PRODUCTID';" | $POSTGRESQLBINDIR/psql -d $DB_NAME +fi + +# +# + +Dte=`date -u` +/bin/echo Completed load_rpf_backup_msg at $Dte >> $LOGFILE + + +return 0 + +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pa/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pa/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pdc_pp.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pdc_pp.jar new file mode 100755 index 0000000000..1f3cf5be27 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pdc_pp.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pdc_pp_test b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pdc_pp_test new file mode 100755 index 0000000000..e189b93223 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/pdc_pp_test @@ -0,0 +1,29 @@ +#!/bin/ksh + +# File name: run_pdc_pp +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +export CONNECTION_STRING=$JDBCURL + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +# set java classpath + +export CLASSPATH=.:$SYS_JAVA_DIR\ +:$SYS_JAVA_BIN_DIR\ +:$DB_DRIVER_PATH\ +:$WHFS_BIN_DIR/pdc_pp.jar + +# set up an X Terminal window to write stdout and run the DamCrest +# application using java +$SYS_JAVA_BIN_DIR/java ohd.hseb.pdc_pp.sample_data_set.PDCPreProcessorTest $CONNECTION_STRING $PDC_PP_LOG_DIR diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/post_remote_CRS_msg b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/post_remote_CRS_msg new file mode 100755 index 0000000000..daae9c85c4 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/post_remote_CRS_msg @@ -0,0 +1,87 @@ +#!/bin/ksh +# +# post_remote_CRS_msg +# +# version: January 30, 2002 +# +# usage: post_remote_CRS_msg filename subject_string msgtype +# where the arguments are provided via the mhs receive process +# and are translated from the mhs args %ENCLOSE(1) %SUBJECT %MSGTYPE args. +# +# This script is invoked via the message handling service (MHS) mechanisms. +# It is called when a CRS product file from a remote (i.e. nonlocal) WFO +# is received at the local WFO. This script is used so the local WFO can +# pass the file to the local CRS. The arguments passed to this function +# are provided by the mhs receive process, and originate in the +# arguments provides on the mhs send process at the remote system. +# +# mhs places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# transferNWR copies the file into the directory: +# /data/fxa/workFiles/nwr/pending +# + +# This allows you to run this script outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) + +# +# +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 +# +LOGFILE=$WHFS_UTIL_LOG_DIR/post_remote_CRS_msg.log +TMPFILE=$WHFS_UTIL_LOG_DIR/post_remote_CRS_msg.tmp +# +# save only the latest events in the log file +# +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE +# +# +Dte=`date -u` +echo "----" >> $LOGFILE +echo Processing file: $FILENAME at $Dte >> $LOGFILE +echo Subject: $SUBJECT Msgtype: $MSGTYPE >> $LOGFILE +# +export FXA_HOME=/awips/fxa +. $FXA_HOME/readenv.sh +# +# +# use a shell function to extract the argument from the subject line +# +parseSubject() +{ +DESCRIP=$1 +PRODUCTID=$2 +return +} +# +# get the product id from the subject, then use it to build the +# new filename, which is written to when the two header lines +# are stripped off the product and the extra carriage returns +# are added by the distributeproduct operations. +# +parseSubject $SUBJECT +NEWFILENAME=$WHFS_PRODUCT_DIR/$PRODUCTID.remote +/bin/sed -e '1,2d' $FILENAME | /bin/tr -d '\015' > $NEWFILENAME +# +# issue the product as appropriate +# +echo Sending product $NEWFILENAME to transferNWR as pending. >> $LOGFILE +/awips/fxa/bin/transferNWR -d $NEWFILENAME +RETURN_STATUS=$? + +if [ $RETURN_STATUS -eq 0 ] +then + echo Request successfully completed >> $LOGFILE +else + echo Error detected; return status= $RETURN_STATUS >> $LOGFILE +fi +# +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/print_image b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/print_image new file mode 100755 index 0000000000..be0cf0f06b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/print_image @@ -0,0 +1,130 @@ +#!/usr/bin/ksh +# +# print_image +# +# Bryon Lawrence September 26, 2001 OHD +# +# Russ Erb / Bryon Lawrence June 5, 2002 Modified to provide ability +# to print color images on +# from a HP workstation. +# +# Purpose: +# +# This script will capture an image on the screen and print it. +# It was designed to be called from a program such as timeseries +# or hydromap which provide the option of capturing an image +# on the screen and sending it to a printer. +# +# The commands that must be called to do this are different on the +# HP/UX and Linux operating systems. So this script has the logic +# built into it to determine which operating system it is being run +# on. +# +# The caller of this script must provide three arguments: the name of the +# window to be "captured" and printed, the print command followed +# by any print options, and a flag indicating whether or not to print +# the image in reverse color ( 0 = print normal, and 1 = print reverse ). +# +############################################################################### + +TEMP_DIR="/tmp" + +# +# Trap any malicious signals and make a sure the temporary file needed +# by the Linux operating system is cleaned up before the program +# terminates. +trap 'rm -f ; rm -f $TEMP_DIR/junk.gif; exit 1' 1 2 15 + +# Specify the device for xpr to use when formatting a X window screen dump +# file to be printed out as a black and white image. For HP only. +# Do a "man" on "xpr" to learn about the acceptable device options. +HP_BLACK_AND_WHITE_DEVICE="ps -gray 2" + +# Specify the device for xpr to use when formatting a X window screen dump +# file to be printed out as a color image. For HP only. +# Do a "man" on "xpr" to learn about the acceptable device options. +HP_COLOR_DEVICE="dj1200" + +# Specify the the option for xpr to use to format a X window screen dump +# file to be printed in reverse color. For HP only. +HP_REVERSE_PRINT_OPTION="-rv" + +# Test to make certain that the proper number of command line parameters +# have been passed into this script. +if [[ $# -ne 3 ]] +then + + print "\nThe attempt to print the image has failed." + print "An incorrect number of arguments have been passed to the" + print "print_image script. An argument specifying the name of" + print "the window to print, an argument specifiying the print" + print "command, and an argument specifying whether or not to print" + print "the image in "reverse" color must be supplied to this script.\n" + exit 1 + +fi + +# Assign the script arguments to the variables that correspond to them. +WINDOW_NAME=$1 +PRINTCOMMAND=$2 +REVERSE=$3 + +# Determine the operating system that this script is running on. +OPER_SYSTEM=`uname` + +# +# Depending upon the type of operating system being used, choose the +# correct command to capture the screen image and print it. +if [[ $OPER_SYSTEM = "Linux" ]] +then + + # This is the Linux sequence of commands. + rm -f $TEMP_DIR/junk.gif + import -window "$WINDOW_NAME" $TEMP_DIR/junk.gif + + # Does the user want to print in "reverse"? + if [[ $REVERSE -eq 1 ]] + then + + mogrify -negate $TEMP_DIR/junk.gif + + fi + + $PRINTCOMMAND $TEMP_DIR/junk.gif 2>&1 + rm -f $TEMP_DIR/junk.gif + +else + + # This is the HP-UX sequence of commands. + # Retrieve the token "whfs_print_color" which indicates + # whether or not the image should be printed in color. + PRINT_IN_COLOR=`/fs/awips/whfs/dev/get_apps_defaults$OS_SUFFIX whfs_print_color` + + if [[ $PRINT_IN_COLOR = "YES" ]] + then + + DEVICE=$HP_COLOR_DEVICE + + else + + DEVICE=$HP_BLACK_AND_WHITE_DEVICE + + fi + + if [[ $REVERSE -eq 1 ]] + then + + REVERSE_OPTION=$HP_REVERSE_PRINT_OPTION + + else + + REVERSE_OPTION="" + + fi + + xwd -name "$WINDOW_NAME" | xpr -cutoff 87.5 -device $DEVICE \ + $REVERSE_OPTION | $PRINTCOMMAND 2>&1 + +fi + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_geoarea b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_geoarea new file mode 100755 index 0000000000..37bbdb0a25 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_geoarea @@ -0,0 +1,385 @@ +#!/bin/ksh +# +# process_geoarea +# +# Bryon Lawrence May 15, 2002 OHD +# Moria Shebsovich Jul 30, 2003 OHD +# Bryon Lawrence Nov 14, 2003 OHD +# - Modified this script to delete and load +# LineSegs information for the boundary type +# being processed. Formerly, Hydrobase would +# delete ALL LineSegs data when importing areal data. +# It would load ALL lineSegs data when the user +# closed the Hydrobase Areal Data GUI. This script +# uses sqlcmd to delete information from +# the LineSegs database table. +# +# Bryon Lawrence Nov 19, 2003 OHD +# - Modified this script to delete the data from the +# GeoArea table. This functionality used to be +# in the Hydrobase in the import_geoarea routine. +# Process_geoarea is being setup to be standalone. +# That is, it should be able to handling all of the +# details of processing WHFS geodata files on its +# own. +# +# Bryon Lawrence January 7, 2004 OHD +# - Added the redirection of standard error to +# standard output for the calls to executables +# (unload_geoarea, load_geoarea, load_linesegs, +# convert_ascii_to_latlon, grid_to_area, and +# sqlcmd). +# +# Moria Shebsovich October 12, 2004 OHD +# - The script is modified to read geodata from the +# set of ascii files and write to the geoarea table. +# The unload functionality was eliminated, now +# ascii files are the master files, they should be +# edited as needed, and updated data loaded into +# the geoarea table. +# Mark Glaudemans February 3, 2005 +# Removed RESVRS from consideration in GeoArea, +# LineSegs loading +# +# This script is responsible for manipulating the geoarea data sets used +# to populate files and tables in the ihfs database. These data sets +# can then be used to plot graphical overlays in an application such as +# Hydromap. +# +# The script creates two types of binary files: +# 1) Geographic overlay files. +# 2) Navigation files which tell the user of Hydroview/MPE which county +# and basin the mouse pointer is currently over. +# +# This script provides the logic to load geodata to the +# geoarea table. When loading geoarea data into the database, it also +# executes a sequence of commands that updates the "grid_to_basin_hrap.[OS]" and +# "grid_to_county_hrap.[OS]" navigation files which provide cursor location +# information at a HRAP grid resolution for Hydroview/MPE. These are also +# referred to as the navigation files because they indicate to the user +# which basin and county the mouse pointer is currently in. +# +# The overlay and navigation files created are as follows. +# The binary files are created during load operations. +# +# Overlay Data File (load) Binary File +# ======= =============== ==================== +# Basins basins.dat basins_latlon.OS +# Counties counties.dat counties_latlon.OS +# Reservoirs resvrs.dat resvrs_latlon.OS +# Zones zones.dat zones_latlon.OS +# +# Navigation File Binary File +# =============== =========== +# Basin grid_to_basin_hrap.OS +# County grid_to_county_hrap.OS +# +# Usage: +# +# process_geoarea -l -d -t filename +# +# Where -l specifies that the data in will be loaded into the +# geoarea database table. +# -d specifies the name of the database that the geoarea table +# resides in. +# -t indicates the type of the GEOAREA data being loaded. +# Valid types: +# COUNTY, STATE, RESRVR, ZONE, BASIN +# +# "Filename" is the full path and name of the file containing the +# geoarea data. If the file is in the same directory as the +# this script is being run in, "./filename" can be used. +# +# All other options (-l, -d , -t, filename) must be supplied +# or the script will not run. +# +# Programs run from this script: +# Option combination: -ldt filename +# load_geoarea +# grid_to_area, which runs +# if type is "BASIN" or "COUNTY" only. +# +# Error Returns: +# +# This script will exit with a value of "0" upon successful completion. +# This script will exit with a value of "1" when an invalid combination +# of arguments has been passed to it. +# This script will exit with a value of "2" when a geoarea data filename +# has not been supplied to it. +# This script will exit with a value of "3" when an invalid geoarea +# boundary type has been passed to it. +# This script will exit with a value of "4" when rows from the LineSegs +# database table cannot be deleted. +# This script will exit with a value of "5" when rows from the GeoArea +# table cannot be deleted. +# +# Assumptions: +# In order for this script to work the following must be done first: +# 1) set_hydro_env must be sourced before this script is run. +# +# Log Files: +# There are two possible log files depending on the error return: +# Error returns 1, 2, 3: The log file will be process_geoarea.log +# Error returns 0, 4, 5: The log file will be process_geoarea_TYPE.log +# where TYPE is BASIN, COUNTY, RESRVR, or ZONE. +# +############################################################################### +# +# +# Function which describes the correct useage of this script. +useage () +{ + printf "Useage: process_geoarea -l -d(database name) -t(type) filename" + printf "\n where -l means to load the contents of the geoarea" + printf "\n table" + printf "\n where -d is the name of the database in which the" + printf "\n geoarea table resides" + printf "\n where -t is the type of the geoarea being processed:" + printf "\n COUNTY, STATE, RESRVR, ZONE, BASIN" + printf "\n where filename is the full path and name of the file" + printf "\n containing the ascii geoarea data.\n" + +} + +# +# Initialize the variables that will contain the command line options. +found=0 # Flag indicating whether or not a type is valid. +load=0 # Flag indicating that the "-l" option was specified. +db_found=0 # Flag indicating that the database name was found. +type_found=0 # Flag indicating that the geoarea type was found. +load_found=0 # Flag indicating that the load flag was supplied. + +valid_types="COUNTY STATE RESRVR ZONE BASIN" + +# +# Create the log directory. +LOGNAME=$WHFS_UTIL_LOG_DIR/process_geoarea.log +rm -f $LOGNAME + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` + +echo "=====================================" | tee -a $LOGNAME +echo "Starting process_geoarea on $date ..." | tee -a $LOGNAME +printf "Processing command line arguments.\n" | tee -a $LOGNAME + printf "Logging to $LOGNAME.\n" + + # Test the supplied options to make sure that they are valid. + while getopts d:t:l name 2>/dev/null + do + case $name in + + d) + # This is the database name. + dbname=$OPTARG + db_found=1 + ;; + + t) + # This is the geoarea type. + type=$OPTARG + type_found=1 + ;; + + l) + # This option specifies that the file be loaded. + load=1 + load_found=1 + ;; + + ?) + useage | tee -a $LOGNAME + exit 1 + ;; + esac +done + +if [ $load -eq 0 ] +then + + useage | tee -a $LOGNAME + exit 1 + +fi + +if [[ $db_found -eq 0 || $type_found -eq 0 ]] +then + + useage | tee -a $LOGNAME + exit 1 + +fi + +# +# Retrieve the filename. +if [[ $OPTIND -le $# ]] +then + + # Shift the parameters to dispose of the ones we do not need. + while [ $OPTIND -gt 1 ] + do + (( OPTIND = OPTIND - 1 )) + shift + done + + # Retrieve the filename. + filename=$1 + +else + + printf "Could not find the filename for the ascii geoarea data.\n" + useage | tee -a $LOGNAME + exit 2 +fi + +# Test to determine if the type is valid. +for i in $valid_types +do + + if [[ $type = $i ]] + then + found=1 + break + fi + +done + +if [ found -eq 0 ] +then + + printf "The type $type supplied via the \"-t\" option is invalid.\n" + useage | tee -a $LOGNAME + exit 3 + +fi + +# Build the name of the log file. This will include the boundary type +# being processed. +FINALNAME=$WHFS_UTIL_LOG_DIR/process_geoarea_$type.log +rm -f $FILENAME + +if [[ $load -eq 1 ]] +then + printf "Running process_geoarea to load $type data\n" | tee -a $LOGNAME + printf "from file $filename.\n" | tee -a $LOGNAME +fi + +if [ load -eq 1 ] +then + + # Delete the information from the GeoArea and LineSegs table + # for the boundary type being processed. + + if [ $type != "RESRVR" ] + then + delete_linesegs="DELETE FROM LineSegs\n \ + WHERE area_id IN (\n \ + SELECT area_id\n \ + FROM GeoArea\n \ + WHERE boundary_type='$type');\n" + + printf "Deleting LineSegs using query: $delete_linesegs\n" | \ + tee -a $LOGNAME + +# echo $delete_linesegs | \ +# $SQLCMD_BIN_DIR/sqlcmd -d $DB_NAME@$INFORMIXSERVER \ +# 2>&1 | tee -a $LOGNAME + + echo $delete_linesegs | $POSTGRESQLBINDIR/psql $DB_NAME 2>&1 | tee -a $LOGNAME + + if [ $? -ne 0 ] + then + printf "Could not delete rows corresponding to GeoArea type\n" | \ + tee -a $LOGNAME + printf "$type from the LineSegs database table.\n" | \ + tee -a $LOGNAME + mv $LOGNAME $FINALNAME + exit 4 + + fi + + delete_geoarea="DELETE FROM GeoArea\n \ + WHERE boundary_type='$type';" + + printf "Deleting GeoArea info using query: $delete_geoarea\n" | \ + tee -a $LOGNAME + +# echo $delete_geoarea | $SQLCMD_BIN_DIR/sqlcmd -d $DB_NAME@$INFORMIXSERVER |\ +# tee -a $LOGNAME + + echo $delete_geoarea | $POSTGRESQLBINDIR/psql $DB_NAME 2>&1 | tee -a $LOGNAME + + if [ $? -ne 0 ] + then + printf "Could not delete rows from the GeoArea table\n" | \ + tee -a $LOGNAME + printf "corresponding to boundary_type $type.\n" | \ + tee -a $LOGNAME + mv $LOGNAME $FINALNAME + exit 5 + + fi + + printf "Running $WHFS_BIN_DIR/load_geoarea$OS_SUFFIX -d$dbname\n" \ + | tee -a $LOGNAME + printf "-i$filename -t$type\n" | tee -a $LOGNAME + + $WHFS_BIN_DIR/load_geoarea$OS_SUFFIX -d"$dbname" -i"$filename" -t"$type" \ + 2>&1 | tee -a $LOGNAME + + + printf "Running $WHFS_BIN_DIR/load_linesegs$OS_SUFFIX -d"$dbname" -i"$filename"\n" \ + | tee -a $LOGNAME + printf "-t$type\n" | tee -a $LOGNAME + + $WHFS_BIN_DIR/load_linesegs$OS_SUFFIX -d"$dbname" -i"$filename" -t"$type" \ + 2>&1 | tee -a $LOGNAME + + fi + + + if [ $type = "BASIN" ] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" | \ + tee -a $LOGNAME + printf "$filename basins_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + basins_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + printf "Running $PPROC_BIN/grid_to_area$OS_SUFFIX -d$dbname\n" \ + | tee -a $LOGNAME + printf "-tBASIN grid_to_basin_hrap$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/grid_to_area$OS_SUFFIX -d"$dbname" -t"BASIN" \ + grid_to_basin_hrap$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [ $type = "COUNTY" ] + then + + printf "Running $PPROC_BIN/grid_to_area$OS_SUFFIX -d$dbname\n" \ + | tee -a $LOGNAME + printf "-tCOUNTY grid_to_county_hrap$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/grid_to_area$OS_SUFFIX -d"$dbname" -t"COUNTY" \ + grid_to_county_hrap$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [ $type = "RESRVR" ] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "-d$dbname -i$filename -t$type\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + resvrs_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + fi + +fi + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` +printf "Process_geoarea completed on $date\n" | tee -a $LOGNAME + +# Copy the running log file into the log file which contains, in its name, +# the geoarea boundary type that was processed during by the process_geoarea +# script. +mv $LOGNAME $FINALNAME + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_geoline b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_geoline new file mode 100755 index 0000000000..741d899c6d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_geoline @@ -0,0 +1,238 @@ +#!/bin/ksh +# +# process_geoline +# +# Bryon Lawrence May 15, 2002 OHD +# Moria Shebsovich July 30, 2003 OHD +# Bryon Lawrence November 20, 2003 OHD +# - Added a log file, error diagnostics, and +# extra documentation. +# Bryon Lawrence January 7, 2004 OHD +# - Added redirection of standard error to standard +# output for the calls to executables (load_geoline, +# unload_geoline, convert_ascii_to_latlon, and +# sqlcmd). +# Moria Shebsovich October 18, 2004 OHD +# - The script is modified to read geodata from the +# set of ascii files and create binary files. +# The unload functionality was eliminated, +# GeoLine table does not exist any more +# in the database. Now ascii files are the master +# files, they should be edited as needed. +# +# This script is responsible for manipulating the geoline data sets. +# These data sets +# can then be used to plot graphical overlays on an application such as +# Hydromap. +# +# The script provides logic to create a set of binary files which can +# be then displayed as overlays in a graphical application such as +# Hydroview/MPE. +# +# The user has the option of modifying the geoline data to update the +# appearance of the geological data that it represents. It could be done by +# editing an ascii formatted file. +# The data can then be edited in a standard text +# editor or loaded into a geographical data editor such as Arcview. Once +# updated, the binary file must be created. +# +# The following files are created: +# +# Geoline overlay Data File Binary File +# =============== ========= =========== +# Highways hiways.dat hiways_latlon.OS +# Roads roads.dat roads_latlon.OS +# Rivers rivers.dat rivers_latlon.OS +# Streams streams.dat streams_latlon.OS +# +# Useage: +# +# process_geoline -t -n filename +# +# Where -t indicates the type of the geoline data. +# Valid types: +# ROAD STREAM +# -n indicates the geoline name options being used. +# Valid geoline names: +# RIVERS STREAMS HIWAYS ROADS +# +# All options (-t,-n, filename) must be +# supplied or this script will not run. +# +# Programs run from this script: +# convert_ascii_to_latlon +# +# Error Returns: +# This script will exit with a value of "0" upon successful completion. +# This script will exit with a value of "1" when an invalid combination +# of arguments has been passed to it. +# This script will exit with a value of "2" when it cannot find the +# filename containing the ascii data. +# This script will exit with a value of "3" when an invalid overlay +# type was passed into this routine. +# +# Assumptions: +# In order for this script to work the following must be true: +# 1) set_hydro_env must be sourced before this script is run. +# +# Log Files: +# Two log files may be created, depending on the error return: +# +# For error returns 1, 2, 3: The log file will be process_geoline.log +# For error return 0: The log file will be +# process_geoline_TYPE.log, where TYPE is the type of vector being +# processed, i.e. RIVERS, STREAMS, HIWAYS, or ROADS. +# +############################################################################### +# + +# +# Function which describes the correct useage of this script. +useage () +{ + printf "Useage: process_geoline -t(type)" + printf " -n(name_geoline) filename" + printf "\n where -t is the type of the geoline being processed:" + printf "\n ROAD STREAM" + printf "\n where -n is the geoline type name to distinguish" + printf "\n between rivers and streams geoline type names" + printf "\n where filename is the name of the file containing the" + printf "\n ascii geoline data.\n" +} + +# +# Initialize the variables that will contain the command line options. +found=0 +name_geoline_found=0 +type_found=0 + +valid_types="ROAD STREAM" + +# +# Create the log directory. +LOGNAME=$WHFS_UTIL_LOG_DIR/process_geoline.log +rm -f $LOGNAME + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` + +echo "=====================================" | tee -a $LOGNAME +echo "Starting process_geoline on $date ..." | tee -a $LOGNAME +printf "Processing command line arguments.\n" | tee -a $LOGNAME +printf "Logging to $LOGNAME.\n" + +# Test the supplied options to make sure that they are valid. +while getopts t:n: name 2>/dev/null +do + case $name in + + n) # This option specifies geoline names. + name_geoline=$OPTARG + name_geoline_found=1 + ;; + + t) + # This is the geoline type. + type=$OPTARG + type_found=1 + ;; + + ?) printf "I am in default case\n" + useage | tee -a $LOGNAME + exit 1 + ;; + esac + +done + +if [[ $OPTIND -le $# ]] +then + + # Shift the parameters to dispose of the ones we do not need. + while [ $OPTIND -gt 1 ] + do + (( OPTIND = OPTIND - 1 )) + shift + done + + # Retrieve the filename. + filename=$1 + +else + + printf "Could not find the filename for the ascii geoline data.\n" + useage | tee -a $LOGNAME + exit 2 + +fi + +# Test to determine if the type is valid. +for i in $valid_types +do + + if [[ $type = $i ]] + then + found=1 + break + fi + +done + +if [ found -eq 0 ] +then + + printf "The type $type supplied via the \"-t\" option is invalid.\n" \ + | tee -a $LOGNAME + useage | tee -a $LOGNAME + exit 3 + +fi + +FINALNAME=$WHFS_UTIL_LOG_DIR/process_geoline_$name_geoline.log +rm -f $FINALNAME + + + if [[ $type = "STREAM" && $name_geoline = "RIVERS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename rivers_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + rivers_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [[ $type = "STREAM" && $name_geoline = "STREAMS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename streams_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + streams_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [[ $type = "ROAD" && $name_geoline = "HIWAYS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename hiways_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + hiways_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + + elif [[ $type = "ROAD" && $name_geoline = "ROADS" ]] + then + + printf "Running $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX\n" \ + | tee -a $LOGNAME + printf "$filename roads_latlon$OS_SUFFIX\n" | tee -a $LOGNAME + $PPROC_BIN/convert_ascii_to_latlon$OS_SUFFIX $filename \ + roads_latlon$OS_SUFFIX 2>&1 | tee -a $LOGNAME + fi + +date=`date -u +"%A, %B %d, %Y %H:%M:%S"` +printf "Process_geoline completed on $date\n" | tee -a $LOGNAME + +# Copy the running log file to the log file which contains the name of the +# geoline vector in its title. +mv $LOGNAME $FINALNAME + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_hydro_model_data b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_hydro_model_data new file mode 100755 index 0000000000..9902e79197 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_hydro_model_data @@ -0,0 +1,55 @@ +#!/bin/ksh +# file name: process_hydro_model_data +# Created: 04/01/2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SSHP_INCOMING_DIR=$(get_apps_defaults sshp_incoming_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# setup the AWIPS environment +# +. $FXA_HOME/readenv.sh + +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 + +# use a shell function to extract the argument from the subject line +# the subject string is a quoted string with the a descriptive term, +# followed by a space, followed by the product identifier. +# +parseSubject() +{ +ORIGINAL_FILE_NAME=$1 +PRODUCTID=$2 +return +} +# +# get the product id from the subject +# +parseSubject $SUBJECT + +ORIGINAL_FILE_PATH=$SSHP_INCOMING_DIR/$ORIGINAL_FILE_NAME + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/process_hydro_model_data.log +TMPFILE=$SSHP_LOG_DIR/process_hydro_model_data.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +cp -f $FILENAME $ORIGINAL_FILE_PATH + +# used to remove the header and ^Ms from the transferred XML file +sed '1,2d' $ORIGINAL_FILE_PATH > $SSHP_INCOMING_DIR/temp.xml +cat $SSHP_INCOMING_DIR/temp.xml | tr -d '\015' > $ORIGINAL_FILE_PATH +rm -f $SSHP_INCOMING_DIR/temp.xml + +ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/run_SSHP_data_decode >$LOGFILE 2>>$LOGFILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_rpf_backup_msg b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_rpf_backup_msg new file mode 100755 index 0000000000..bbc03ad494 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_rpf_backup_msg @@ -0,0 +1,136 @@ +#!/bin/ksh +# +# process_rpf_backup_msg +# +# version: July 6, 2006 +# +# This script handles the receipt of externally generated messages +# containing product issuance data used to support service backup operations. +# It is invoked via the message handling service (MHS) mechanisms and +# is called when the rpf_sendbackup operation, which is invoked from +# RiverPro, is executed. This occurs in two cases: +# 1) When RiverPro issues a product, a messages are sent to the offices +# providing backup. For each forecast point included in the product, +# its info is sent to its primary and secondary backup sites. The info +# consists of entries for the VTECevent, FpPrevProd, and TextProduct tables. +# There is also entry made to PurgeProduct table to ensure no unlimited +# number of products for a product id in the TextProduct table. +# 2) When a site providing backup services no longer needs to provide +# the services since the office is backed up has returned to its +# operational status. This is referred to as a restoration of service. +# In this case, the messages are sent to the offices formerly +# receiving backup services. +# +# The script calls the load_rpf_backup_msg to do the real work, +# since it must use postgres which is not available on the DS +# machine upon which the MHS operates and calls this script. +# +# Usage: +# process_rpf_backup_msg filename subject_string msgtype +# +# The arguments are provided via the mhs receive process and are +# translated from the mhs args %ENCLOSE(1) %SUBJECT %MSGTYPE args. +# +# MHS places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# + +# set up SOME environment variables for WHFS applications + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# +# assign the args to local variables +# + +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 + +# +# parse out info from the command line +# + +parseSubject() +{ + PRODUCTID=$1 + PACKEDTIME=$2 + WFO_SOURCE=$3 + return +} + +# +# get the product id from the subject, which is needed when loading the data +# + +parseSubject $SUBJECT + +# +# define the log file names. +# write to a temp log file, then concatenate to the +# daily log file later. +# + +DATESTR=`date -u +%Y%m%d` +LOGFILE=$RPF_LOG_DIR/process_backup_$PACKEDTIME.log.from$WFO_SOURCE + +LOGFILE_DAILY=$RPF_LOG_DIR/process_backup.log.$DATESTR + +# +# the first write to the log file, specific to the sender, overwrites +# any existing info. at the end of the script, the session log file is then +# concatenated to the daily log file. +# +Dte=`date -u` + +echo "-----------------------------" > $LOGFILE +echo Starting process_rpf_backup_msg at $Dte >> $LOGFILE +echo File: $FILENAME >> $LOGFILE +echo Subject: $SUBJECT >> $LOGFILE +echo Msgtype: $MSGTYPE >> $LOGFILE +echo ProductId, PackedTime: $PRODUCTID $PACKEDTIME >> $LOGFILE +echo WFOsource: $WFO_SOURCE >> $LOGFILE + +# +# use ssh to execute the postgres-dependent script on a +# separate system which can access postgres. +# only the dynamic info is passed to the script. +# the logfile name must be consistent between the scripts. +# + +echo Copying file to product directory >> $LOGFILE +LOADFILENAME=$WHFS_PRODUCT_DIR/$PRODUCTID.$PACKEDTIME.raw$WFO_SOURCE +/bin/cp $FILENAME $LOADFILENAME + +Dte=`date -u` +echo ssh execution of load_rpf_backup_msg on $SSHP_JAVA_PROCESS_HOST at $Dte >> $LOGFILE + +ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/load_rpf_backup_msg $LOADFILENAME $PRODUCTID $PACKEDTIME $WFO_SOURCE + +# +# copy the product specific log info to the daily log file +# + +Dte=`date -u` +echo ssh call completed at $Dte >> $LOGFILE + +/bin/cat $LOGFILE >> $LOGFILE_DAILY + +if [ -s $LOGFILE ] +then + rm -f $LOGFILE +fi + +return 0 + +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_shef_msg b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_shef_msg new file mode 100755 index 0000000000..9c933f1e3a --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/process_shef_msg @@ -0,0 +1,123 @@ +#!/bin/ksh +# process_shef_msg +# +# version: April 12, 2000 for Bld 5.0 +# +# usage: process_shef_msg filename subject_string msgtype +# +# where the arguments are provided via the mhs receive process +# and are translated from the mhs args %ENCLOSE(1) %SUBJECT %MSGTYPE +# +# This script is invoked via the message handling service (MHS) mechanisms. +# It is called when a shef-encoded product file from a remote (i.e. nonlocal) +# office is received at the local WFO. This script copies the file to the +# local directory used as input to the shefdecode application. +# +# mhs places the incoming file in the directory: +# /data/x400/mhs/msg/hydro +# this script copies the file into the directory: +# /data/fxa/ispan/hydro +# if archiving is enabled, this script also copies the file into the directory: +# /data/fxa/ispan/hydro_adbs/ +# + + +# define the following via environment variables: +# WHFS_UTIL_LOG_DIR +# WHFS_PRODUCT_DIR +# WHFS_BIN_DIR + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export ARCHIVE_ENABLE=$(get_apps_defaults archive_enable) +export ARCHIVE_SHEFDATA_DIR=$(get_apps_defaults archive_shefdata_dir) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# +# +FILENAME=$1 +SUBJECT=$2 +MSGTYPE=$3 +# +LOGFILE=$WHFS_UTIL_LOG_DIR/process_shef_msg.log +TMPFILE=$WHFS_UTIL_LOG_DIR/process_shef_msg.tmp +# +# +# save only the latest events in the log file +# +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE +# +# +# log this event +# +Dte=`date -u` +echo "----" >> $LOGFILE +echo Processing file: $FILENAME at $Dte >> $LOGFILE +echo Subject: $SUBJECT Msgtype: $MSGTYPE >> $LOGFILE +# +# +# setup the AWIPS environment +# +. $FXA_HOME/readenv.sh +# +# +# use a shell function to extract the argument from the subject line +# the subject string is a quoted string with the a descriptive term, +# followed by a space, followed by the product identifier. +# +parseSubject() +{ +DESCRIP=$1 +PRODUCTID=$2 +return +} +# +# get the product id from the subject +# +parseSubject $SUBJECT +# +# +# define the current date time info. use MPER to avoid SCCS conflict. +# use this info to define the new file name +# +MPER="%M" +DATESTR=`date -u +%m%d` +TIMESTR=`date -u +%H$MPER%S` +COPYNAME=$WHFS_PRODUCT_DIR/$PRODUCTID.$DATESTR.$TIMESTR +# +# +# strip off extra carriage returns added by message handling by sender +# +cat $FILENAME | /bin/tr -d '\015' > $COPYNAME +# +# send a copy of the product to the text database +# after determining the equivalent AFOS id required by textdb +# +AFOSID=`$WHFS_BIN_DIR/awips2afos.ksh $PRODUCTID` +echo Writing $COPYNAME to textdb as $AFOSID >> $LOGFILE +/awips/fxa/bin/textdb -w $AFOSID < $COPYNAME >> $LOGFILE 2>&1 +# +# +# copy the file into the RFC archive directory if archiving is enabled +# +if [ "$ARCHIVE_ENABLE" = "ON" ] +then + echo Copying $COPYNAME to RFC archive input directory >> $LOGFILE + cp -f $COPYNAME $ARCHIVE_SHEFDATA_DIR >> $LOGFILE 2>&1 +fi +# +# +# move the file to the shef input directory. +# +echo Moving $COPYNAME to input shef directory >> $LOGFILE +mv -f $COPYNAME /data/fxa/ispan/hydro >> $LOGFILE 2>&1 +# +# +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/purge_files b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/purge_files new file mode 100755 index 0000000000..c949ed67fc --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/purge_files @@ -0,0 +1,220 @@ +#! /bin/ksh +# purge_files +# +# This script purges WHFS UNIX files +# revised: 10/24/2001 +# revised: 05/29/2002 - added purging of GAFF_MOSAIC_DIR +# revised: 08/15/2002 - added purging of DPA_ARCH_DIR +# revised: 09/12/2003 - replaced wc | cut -f 1 d " " with wc -l (6 places) +# - latter version works on both HP and Linux +# - former version does not work on Linux +# revised: 02/18/2004 - removed delete of stage2 log files +# revised: 08/06/2004 - Added the purging of the GAGE_PP_LOG directory. +# revised: 12/29/2004 - Added the purging of the VACUUM_LOG_DIR dir. +# - Removed purge of siipp logs +# revised: 8/19/2005 - Added purge of metar_input dir. +# - removed purge of vacuum logs +# (vacuum now done via postgres cron and log files +# purged with scour) +# revised: 9/7/2006 - added purge of gage pp input directory +# +# revised: 5/9/2007 - commented out purge from DAILY_QC_LOG dir +# - added "-type f" to all find commands +# revised 1/15/08 - added purging of PrecipMonitor log files by changing RiverMonitor.* to +# *Monitor.* +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export GAGE_PP_DATA=$(get_apps_defaults gage_pp_data) +export GAGE_PP_LOG=$(get_apps_defaults gage_pp_log) +export SSHP_INGEST_XML_DIR=$(get_apps_defaults sshp_ingest_xml_dir) +export SSHP_OFS_EXTRACT_XML_DIR=$(get_apps_defaults sshp_ofs_extract_xml_dir) +export SSHP_OFS_EXTRACT_TEXT_DIR=$(get_apps_defaults sshp_ofs_extract_text_dir) +export GAFF_MOSAIC_DIR=$(get_apps_defaults gaff_mosaic_dir) +export DPA_ARCH_DIR=$(get_apps_defaults dpa_arch_dir) +export DPA_ERROR_DIR=$(get_apps_defaults dpa_error_dir) +export DPA_LOG_DIR=$(get_apps_defaults dpa_log_dir) +export SHEF_ERROR_DIR=$(get_apps_defaults shef_error_dir) +export SHEFDECODE_LOG=$(get_apps_defaults shefdecode_log) +export QCALARM_LOG_DIR=$(get_apps_defaults qcalarm_log_dir) +export FLOODSEQ_LOG_DIR=$(get_apps_defaults floodseq_log_dir) +export DB_PURGE_LOG_DIR=$(get_apps_defaults db_purge_log_dir) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export OBSFCSTMONITOR_LOG_DIR=$(get_apps_defaults obsfcstmonitor_log_dir) +export RIVERMON_LOG_DIR=$(get_apps_defaults rivermon_log_dir) +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export METAR_LOG_DIR=$(get_apps_defaults metar_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) + + +Dte=`date -u` + +# Setup file names +# +fnm=$WHFS_UTIL_LOG_DIR/purge_files.log +tmp=$WHFS_UTIL_LOG_DIR/purge_files.tmp + +echo `basename $0` log location: $fnm + +if [ -e "${fnm}" ] +then + tail -1200 $fnm > $tmp + mv $tmp $fnm +fi + +# Log a header line to the output file +# +echo "----------------------------------------------------" >> $fnm +echo "Begin purge_files at: " $Dte >> $fnm + + +# Purge SHEF Decoder product log files older than 1 day +# +echo " Purging SHEF Decoder product log files..." >> $fnm +Num=`ls $SHEF_ERROR_DIR | wc -l` +echo " Number of files before purge: " $Num >> $fnm +find $SHEF_ERROR_DIR -name '*.*.*' -type f -mtime +0 -print | xargs rm -f >> $fnm +Num=`ls $SHEF_ERROR_DIR | wc -l` +echo " Number of files after purge: " $Num >> $fnm + + +# Purge SHEF Decoder daily log files older than 2 days +# +echo " Purging SHEF Decoder daily log files..." >> $fnm +find $SHEFDECODE_LOG -name 'shef_decode_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge Gage PP daily log files older than 2 days +# +echo " Purging Gage Precipitation Processor daily log files..." >> $fnm +find $GAGE_PP_LOG -name 'gage_pp_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge obsfcst monitor daily log files older than 2 days +# +echo " Purging ObsFcst Monitor daily log files..." >> $fnm +find $OBSFCSTMONITOR_LOG_DIR -name 'obsfcst_monitor_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge river monitor daily log files older than 2 days +# +echo " Purging RiverMonitor and PrecipMonitor daily log files..." >> $fnm +find $RIVERMON_LOG_DIR -name '*Monitor.*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge build hourly daily log files older than 2 days +# +echo " Purging build hourly daily log files..." >> $fnm +find $GAGE_PP_LOG -name 'build_hourly_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge any undecoded metar input file. They would only be there +# if the decoder fails to run normally. +# This directory is hardcoded here as it is not centrally defined; +# it is expected to have the below value, as defined in the file: +# ${apps_dir}/whfs/local/data/app/metar2shef/metar.cfg +# +echo " Purging undecoded metar input files..." >> $fnm +echo " If any files are purged, check metar2shef processing..." >> $fnm +METAR_INPUT_DIR=${apps_dir}/whfs/local/data/metar_input +find $METAR_INPUT_DIR -name '*[A-Z]*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +# Purge undecodable DPA files older than 1 day +# +echo " Purging undecodable DPA files..." >> $fnm +find $DPA_ERROR_DIR -name '*[A-Z]*' -type f -mtime +0 -print | xargs rm -f >> $fnm + + +# Purge DPA Decoder daily log files older than 2 days +# +echo " Purging DPA Decoder daily log files..." >> $fnm +find $DPA_LOG_DIR -name 'process_dpa_log_*' -type f -mtime +1 -print | xargs rm -f >> $fnm + + +# Purge DPA Archive files older than 1 day +# +echo " Purging DPA Archive files..." >> $fnm +find $DPA_ARCH_DIR -name '*[A-Z]*' -type f -mtime +0 -print | xargs rm -f >> $fnm + + +# Purge METAR-to-SHEF Translator log files older than 1 day +# +echo " Purging METAR-to-SHEF Translator log files..." >> $fnm +Num=`ls $METAR_LOG_DIR | wc -l` +echo " Number of files before purge: " $Num >> $fnm +find $METAR_LOG_DIR -type f \! -name '*.log' -type f -mtime +0 -print | xargs rm -f >> $fnm +Num=`ls $METAR_LOG_DIR | wc -l` +echo " Number of files after purge: " $Num >> $fnm + + +# Purge QC/Alert/Alarm log files older than 1 day +# +echo " Purging QC/Alert/Alarm log files..." >> $fnm +find $QCALARM_LOG_DIR -name '*.*.*' -type f -mtime +0 -print | xargs rm -f >> $fnm + + +# Purge db_purge log files older than 4 days +# +echo " Purging db_purge log files..." >> $fnm +find $DB_PURGE_LOG_DIR -name '*.*.*' -type f -mtime +3 -print | xargs rm -f >> $fnm + +# Purge FloodSeq log files older than 2 days +# +echo " Purging FloodSeq log files..." >> $fnm +find $FLOODSEQ_LOG_DIR -name '*.*.*' -type f -mtime +1 -print | xargs rm -f >> $fnm + + +# Purge RiverPro log files older than 2 days +# +echo " Purging RiverPro log files..." >> $fnm +find $RPF_LOG_DIR -name '*.log.*' -type f -mtime +1 -print | xargs rm -f >> $fnm + + +# Purge RiverPro, SHEF Encoder, and Alarm output product files older than 2 days +# +echo " Purging RiverPro, SHEF Encoder, and Alarm output product files..." >> $fnm +Num=`ls $WHFS_PRODUCT_DIR | wc -l` +echo " Number of files before purge: " $Num >> $fnm +find $WHFS_PRODUCT_DIR -name '*.*' -type f -mtime +1 -print | xargs rm -f >> $fnm +Num=`ls $WHFS_PRODUCT_DIR | wc -l` +echo " Number of files after purge: " $Num >> $fnm + + +# Purge DailyQC logs older than 1 day +#DAILY_QC_LOG_DIR=/fs/hseb/ob7/wfo_rfc/precip_proc/local/data/log/daily_qc +#echo "Purging DailyQC logs older than 1 day..." >> $fnm +#find $DAILY_QC_LOG_DIR -name '*.*' -type f -mtime +1 -print | xargs rm -f >> $fnm +#Num=`ls $DAILY_QC_LOG_DIR | wc -l` +#echo " Number of files after purge: " $Num >> $fnm + + +# Purge GAFF mosaic ffg files older than 3 days +# +echo " Purging GAFF mosaic ffg files..." >> $fnm +find $GAFF_MOSAIC_DIR -name '*.ffg' -type f -mtime +2 -print | xargs rm -f >> $fnm + +# Purge GAFF log files older than 3 days +# +echo " Purging GAFF log files..." >> $fnm +find $DPA_LOG_DIR -name 'gen_areal_ffg_log_*' -type f -mtime +2 -print | xargs rm -f >> $fnm + +# Purge SSHP OFS extract text files older than 15 days +echo " Purging SSHP OFS extract text files..." >> $fnm +find $SSHP_OFS_EXTRACT_TEXT_DIR -name '*.txt' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge SSHP OFS extract text log files older than 15 days +echo " Purging SSHP OFS extract text log files..." >> $fnm +find $SSHP_OFS_EXTRACT_TEXT_DIR -name '*.log' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge SSHP OFS extract xml files older than 15 days +echo " Purging SSHP OFS extract XML files..." >> $fnm +find $SSHP_OFS_EXTRACT_XML_DIR -name '*.xml' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge SSHP ingest XML files older than 15 days +echo " Purging SSHP ingest XML files..." >> $fnm +find $SSHP_INGEST_XML_DIR -name '*.xml' -type f -mtime +14 -print | xargs rm -f >> $fnm + +# Purge the GagePP input directory of files older than 2 days. +echo " Purging GagePP input files..." >> $fnm +find $GAGE_PP_DATA -name '*[A-Z0-9]*' -type f -mtime +1 -print | xargs rm -f >> $fnm + +Dte=`date -u` +echo "End purge_files at: " $Dte >> $fnm + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rax_apps.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rax_apps.jar new file mode 100755 index 0000000000..a4bc218d47 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rax_apps.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup new file mode 100755 index 0000000000..e4aa02abcd --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup @@ -0,0 +1,260 @@ +#!/bin/ksh +# +# rpf_sendbackup +# +# version: July 06, 2006 +# +# This script is used to send RiverPro product issuance info +# to other offices so that they can have the data to support RiverPro +# product issuances in the event that they need to provide service +# backup for the source office. This is normally executed from RiverPro. +# This script is called under two circumstances: +# 1) It is called when issuing a product. It is called once for each +# office to which is should send data to; so for a given Riverpro +# product which may include forecast points with differing backup +# office assignment, this script will be called more than once. +# 2) A site performing backup service for an office can send the info +# for any product it issued for that office back to the backed-up +# office after that has is restored to service level +# +# It dumps info for the given product_id/time from the tables +# VTECevent, FpPrevProd, TextProduct, and only rows for the forecast points +# which have a service backup relationship with the given destination +# office. It packages this info and then sends it to the destination. +# +# +# Usage: +# rpf_sendbackup product_id product_time wfo_source wfo_destination +# +# where: +# product_id - is the official identifier for the product, whether +# it be the 10-character WMO id or the 9-character CRS id +# product_time - yyyy-mm-dd hh:mm:ss +# wfo_source - office identifier sending data from +# wfo_destination - office identifier to send data to +# +# +#-------------------------------------------------------------------- +# +# Log file discussion: +# +# when sending files to remote WFOs, the distributeProduct script is +# used. it returns 0 for success, -1 for error. its log files are in: +# +# ds1-xxx:/data/logs/fxa/yymmdd/dis* (where yymmdd is the date info). +# +# if not there, try looking on local workstation in: +# ws#-xxx:/data/logs/fxa/display/ws#-xxx:0.0/yymmdd +# +# distributeProduct uses the msg_send program to actually send the +# message across the WAN. its log files for msg_send can be found in: +# +# /awips/ops/logs/ds1-xxx, the filenames are either +# msgreq_svr.log for sending and +# msgrcv_svr.log for receiving. +# +# Note that the locations given above are dependent upon instructions +# given in scripts outside of the WHFS control and are subject to change. +# +#-------------------------------------------------------------------- +# +# set up SOME environment variables for WHFS applications +# + +RUN_FROM_DIR=`dirname $0` +. $RUN_FROM_DIR/../../../set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# Initialize the status to bad +# + +RETURN_STATUS=1 + +# +# define the log file name, use the same log that is used for local +# riverpro issuances. + +DATESTR=`date -u +%Y%m%d` +LOGNAME=$RPF_LOG_DIR/rpf_issue.log.$DATESTR + +# +# Load the arguments into local variables + +PRODUCT_ID=$1 +PRODUCT_TIME=$2 +WFO_SOURCE=$3 +WFO_DESTINATION=$4 + +# +# log the initial info +# + +print "**************" +print Sending backup info for $PRODUCT_ID $PRODUCT_TIME from $WFO_SOURCE to $WFO_DESTINATION + +echo ">>>>>>>>>>>> " >> $LOGNAME +Dte=`date -u` +echo Invoking rpf_sendbackup at: $Dte >> $LOGNAME +echo Sending backup info for $PRODUCT_ID $PRODUCT_TIME from $WFO_SOURCE to $WFO_DESTINATION >> $LOGNAME + +# +# check that the source and the destination are not the same +# + +if [[ $WFO_SOURCE = $WFO_DESTINATION ]] +then + print Source and destination are identical. Send aborted. + echo Source and destination are identical. Send aborted. >> $LOGNAME + return $RETURN_STATUS +fi + +# +# define the input file which contains the dynamic SQL commands +# the check for an hsa is needed for the special case of the +# restoration of service backup information. +# + +SQL_INPUT_FILE=$WHFS_PRODUCT_DIR/rpf_sendbackup_sql.$WFO_DESTINATION + +echo "Write SQL commands to " $SQL_INPUT_FILE >> $LOGNAME + +if [ -f $SQL_INPUT_FILE ] +then + rm -f $SQL_INPUT_FILE +fi + +echo "SELECT * INTO TEMP vtecevent_temp FROM VTECevent \ +WHERE producttime='"$PRODUCT_TIME"' AND geoid IN \ +(SELECT lid FROM FpInfo WHERE hsa='"$WFO_DESTINATION"' OR \ +primary_back='"$WFO_DESTINATION"' OR \ +secondary_back='"$WFO_DESTINATION"');" > $SQL_INPUT_FILE + +echo "\COPY vtecevent_temp TO vtecevent_temp.output USING DELIMITERS '|' \ +WITH NULL as ''" >> $SQL_INPUT_FILE + + +echo "SELECT * INTO TEMP fpprevprod_temp from FpPrevProd WHERE \ +producttime='"$PRODUCT_TIME"' AND lid IN (SELECT lid FROM FpInfo \ +WHERE hsa='"$WFO_DESTINATION"' OR primary_back='"$WFO_DESTINATION"' OR \ +secondary_back='"$WFO_DESTINATION"');" >> $SQL_INPUT_FILE + +echo "\COPY fpprevprod_temp to fpprevprod_temp.output USING DELIMITERS '|' \ +WITH NULL as ''" >> $SQL_INPUT_FILE + + +echo "SELECT * INTO TEMP textproduct_temp FROM TextProduct WHERE \ +product_id='"$PRODUCT_ID"' AND producttime='"$PRODUCT_TIME"';" >> $SQL_INPUT_FILE + +echo "\COPY textproduct_temp TO textproduct_temp.output USING DELIMITERS '|' \ +WITH NULL as ''" >> $SQL_INPUT_FILE + +# +# define the output data file names +# the product time is expected to be passed in with +# the format YYYY-MM-DD HH:MM:SS + +VTECEVENT_FILE=$WHFS_PRODUCT_DIR/VTECevent.$WFO_DESTINATION.unload +FPPREVPROD_FILE=$WHFS_PRODUCT_DIR/FpPrevProd.$WFO_DESTINATION.unload +TEXTPRODUCT_FILE=$WHFS_PRODUCT_DIR/TextProduct.$WFO_DESTINATION.unload + +PACKED_TIME=`echo $PRODUCT_TIME | cut -c1-4,6-7,9-10,12-13,15-16,18-19` + +MHS_FILE=$WHFS_PRODUCT_DIR/$PRODUCT_ID.$PACKED_TIME.to$WFO_DESTINATION + +print MHS transmit file $MHS_FILE +echo MHS transmit file $MHS_FILE >> $LOGNAME + +# +# extract the necessary data from the database. +# note that for a site providing backup, RiverPro will not invoke this +# script to have info sent back to the out-of-operation host office. +# this info needs to be sent by invoking the restoration button in the gui. +# this may be changed in the future with a change to RiverPro. +# + +print $POSTGRESQLBINDIR/psql -d $DB_NAME -f $SQL_INPUT_FILE +echo $POSTGRESQLBINDIR/psql -d $DB_NAME -f $SQL_INPUT_FILE >> $LOGNAME + +$POSTGRESQLBINDIR/psql -d $DB_NAME -f $SQL_INPUT_FILE >> $LOGNAME 2>&1 + +# +# move the temporary files to the three files in product directory +# + +echo Move vtecevent_temp.output to $VTECEVENT_FILE >> $LOGNAME +echo Move fpprevprod_temp.output to $FPPREVPROD_FILE >> $LOGNAME +echo Move textproduct_temp.output to $TEXTPRODUCT_FILE >> $LOGNAME +print Move three temporary files to product directory and rename + +if [ -f vtecevent_temp.output ] +then + mv vtecevent_temp.output $VTECEVENT_FILE +else + echo vtecevent_temp.output can not be found. +fi + +if [ -f fpprevprod_temp.output ] +then + mv fpprevprod_temp.output $FPPREVPROD_FILE +else + echo fpprevprod_temp.output can not be found. +fi + +if [ -f textproduct_temp.output ] +then + mv textproduct_temp.output $TEXTPRODUCT_FILE +else + echo textproduct_temp.output can not be found. +fi + +# +# concatenate the 3 data sets into one file. +# the header lines preceding each data set are set specifically +# to match the header lines searched for by the receive +# script which later processes this data +# + +echo "table:vtecevent" > $MHS_FILE +cat $VTECEVENT_FILE >> $MHS_FILE +echo "table:fpprevprod" >> $MHS_FILE +cat $FPPREVPROD_FILE >> $MHS_FILE +echo "table:textproduct" >> $MHS_FILE +cat $TEXTPRODUCT_FILE >> $MHS_FILE + +# +# prepare the environment for the actions to come +# + +. $FXA_HOME/readenv.sh >> $LOGNAME 2>&1 + +# +# send the data set +# the subject line content is specifically recognized by the receive script +# + +SUBJECT="$PRODUCT_ID $PACKED_TIME $WFO_SOURCE" + +print Using distributeProduct with subject $SUBJECT +echo Using distributeProduct with subject $SUBJECT >> $LOGNAME + +/awips/fxa/bin/distributeProduct -c RIVPROD_BACKUP -a $WFO_DESTINATION -s "$SUBJECT" $PRODUCT_ID $MHS_FILE >> $LOGNAME 2>>$LOGNAME +RETURN_STATUS=$? + +if [ $RETURN_STATUS -eq 0 ] +then + echo Send backup info request success >> $LOGNAME + print Send backup info request success + +else + echo Send backup info request failed status= $RETURN_STATUS >> $LOGNAME + print Send backup info request failed status= $RETURN_STATUS +fi + +# + +return $RETURN_STATUS +# diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup_latest b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup_latest new file mode 100755 index 0000000000..ffcdf562b9 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup_latest @@ -0,0 +1,193 @@ +#!/bin/ksh +# +# rpf_sendbackup_latest +# +# version: August 25, 2006 +# +# This script is used to send the latest RiverPro product issuance info +# to other offices if for some abnormal reason the info was not sent +# previously using routine operations. +# +# It will only send info for products/events which have a phenom=FL and +# a signif=W,A,Y, and which are for host office +# +# + +#-------------------------------------------------------------------- +# +# set up SOME environment variables for WHFS applications +# +. /awips/hydroapps/set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export WHFS_LOCAL_BIN_DIR=$(get_apps_defaults whfs_local_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# Initialize the status to bad +# + +RETURN_STATUS=1 + +# +# define the log file name. + +DATESTR=`date -u +%Y%m%d` +LOGNAME=$RPF_LOG_DIR/rpf_send_backup_latest.log.$DATESTR + +# +# log the initial info +# + +echo ">>>>>>>>>>>> " >> $LOGNAME +Dte=`date -u` +echo Invoking rpf_sendbackup_latest at: $Dte >> $LOGNAME + +# +# ----------------------------------------------------- +# define a function that can be used repeatedly for each +# of the VTEC signif codes being processed +# + +invoke_backup_script() +{ + +# check if data exist + + NUM_EVENT=$( + echo "SELECT COUNT(*) FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00';" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + if [ $NUM_EVENT -eq 0 ] + then + print No records found for signif=$signif + echo "No records found for signif=$signif" >> $LOGNAME + return + elif [ -z "$NUM_EVENT" ] + then + print The number of events is undetermined + echo The number of events is undetermined >> $LOGNAME + return + fi + + echo There are $NUM_EVENT events in VTECevent table with signif as $signif >> $LOGNAME + +# +# load the rpf_sendbackup arguments into local variables +# + + PRODUCT_ID=$( + echo "SELECT product_id FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + PRODUCT_TIME=$( + echo "SELECT producttime FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + WFO_SOURCE=$( + echo "SELECT office_id FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + +# print information + + echo For signif as $signif >> $LOGNAME + echo PRODUCT_ID:$PRODUCT_ID, PRODUCT_TIME:$PRODUCT_TIME, WFO_SOURCE:$WFO_SOURCE >> $LOGNAME + +# +# find the two office destinations for the forecast point +# + + WFO_DESTINATION1=$( + echo "SELECT primary_back FROM rpffcstpoint WHERE lid= \ + (SELECT geoid FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1) \ + ORDER BY 1 DESC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + WFO_DESTINATION2=$( + echo "SELECT secondary_back FROM rpffcstpoint WHERE lid= \ + (SELECT geoid FROM VTECevent \ + WHERE phenom='FL' AND signif='$signif' AND office_id = (SELECT hsa FROM Admin) \ + AND producttime > '2006-01-01 00:00:00' \ + ORDER BY etn DESC, producttime DESC LIMIT 1) \ + ORDER BY 1 ASC LIMIT 1;" | \ + $POSTGRESQLBINDIR/psql -q -t $DB_NAME + ) + + +# +# invoke backup send for each defined destination +# + + print Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION1 + echo Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION1 >> $LOGNAME + + $WHFS_LOCAL_BIN_DIR/rpf_sendbackup $PRODUCT_ID $PRODUCT_TIME $WFO_SOURCE $WFO_DESTINATION1 + + RETURN_STATUS=$? + + if [ $RETURN_STATUS -eq 0 ] + then + print Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION1 + echo Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION1 >> $LOGNAME + else + print Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION1 + echo Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION1 >> $LOGNAME + fi + + print Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION2 + echo Invoking rpf_sendbackup from $WFO_SOURCE to $WFO_DESTINATION2 >> $LOGNAME + + $WHFS_LOCAL_BIN_DIR/rpf_sendbackup $PRODUCT_ID $PRODUCT_TIME $WFO_SOURCE $WFO_DESTINATION2 + + RETURN_STATUS=$? + + if [ $RETURN_STATUS -eq 0 ] + then + print Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION2 + echo Send latest backup info request success from $WFO_SOURCE to $WFO_DESTINATION2 >> $LOGNAME + else + print Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION2 + echo Send latest backup info request failed status= $RETURN_STATUS from $WFO_SOURCE to $WFO_DESTINATION2 >> $LOGNAME + fi + + return $RETURN_STATUS +} + +# end of embedded function +# ---------------------------------------------------------- + +# +# +# select FL.W, FL.A, FL.Y products with highest etn +# +for signif in W A Y +do + print Send latest backup product with hightest etn and signif code as $signif + echo "Send latest backup product with hightest etn and signif code as $signif" >> $LOGNAME + invoke_backup_script +done + +Dte=`date -u` +echo Completed rpf_sendbackup_latest at: $Dte >> $LOGNAME + + + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_ColorChooserDialog b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_ColorChooserDialog new file mode 100755 index 0000000000..b6b08da8dd --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_ColorChooserDialog @@ -0,0 +1,44 @@ +#!/bin/ksh +# file name: run_ColorChooserDialog +# Created: 07/12/2007 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_LOCAL_DATA_DIR=$(get_apps_defaults whfs_local_data_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# need to add a path to the jar file for this application +export CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/MiscDialogs.jar:$DB_DRIVER_PATH + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +Dte=`date +%m%d%Y` + +LOG_FILE=$WHFS_LOCAL_DATA_DIR/log/color_scale/ColorChooserDialog_$Dte.log +TMPLOGFILE=$WHFS_LOCAL_DATA_DIR/log/color_scale/ColorChooserDialog.tmp + +tail -1200 $LOG_FILE > $TMPLOGFILE +mv $TMPLOGFILE $LOG_FILE + +if [ $# -ne 3 ] +then + echo "run_ColorChooserDialog " + exit 1 +else + APPLICATION_NAME=$1 + LOGIN_ID=`whoami` + DEFAULT_COLOR_SCALE_FILE=$2 + RGB_COLOR_FILE=$3 +fi + +######################################################################## + +# set up an X Terminal window to write stdout and run the ColorChooser Dialog +# application using java +xterm -T ColorChooserDialog -iconic -n ColorChooserDialog -e $JBINDIR/java ohd.hseb.color_chooser.ColorChooserDialog $JDBCURL $LOG_FILE $APPLICATION_NAME $LOGIN_ID $DEFAULT_COLOR_SCALE_FILE $RGB_COLOR_FILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_MAP_preprocess b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_MAP_preprocess new file mode 100755 index 0000000000..d64a098766 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_MAP_preprocess @@ -0,0 +1,39 @@ +#!/bin/ksh +# file name: run_MapPreprocessor +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=. +CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$JAVA_HOME/bin + +# Trims, but keeps the last 12000 lines of the internal, java-created log file +tail -12000 $SSHP_LOG_DIR/MAPPreprocessor.log > $SSHP_LOG_DIR/MAPPreprocessor.log.tmp +mv $SSHP_LOG_DIR/MAPPreprocessor.log.tmp $SSHP_LOG_DIR/MAPPreprocessor.log + +# Trims, but keeps the last 12000 lines of the stdout and stderr log file +export LOGFILE=$SSHP_LOG_DIR/MAPPreprocessor.stdout2.log +export TMPFILE=$SSHP_LOG_DIR/MAPPreprocessor.stdout2.tmp +tail -12000 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +# run the MAPPreprocessor +$JBINDIR/java ohd.hseb.sshp.precip.MAPPreprocessor $JDBCURL $SSHP_LOG_DIR >>$LOGFILE 2>&1 + + + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_SAC_state_update b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_SAC_state_update new file mode 100755 index 0000000000..fa3de4cbc5 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_SAC_state_update @@ -0,0 +1,61 @@ +#!/bin/ksh +# file name: run_SSHP_SAC_state_update +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=. +CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +export WHFS_LOCAL_DATA_SSHP_DIR=$WHFS_BIN_DIR/../local/data/app/sshp + + +EXPIRATION_HOURS=$(get_apps_defaults sshp_sac_update_expiration_hours) +if [ -z "$EXPIRATION_HOURS" ] +then + EXPIRATION_HOURS=25 +fi + +HOURS_FORWARD=$(get_apps_defaults sshp_sac_update_hours_forward) +if [ -z "$HOURS_FORWARD" ] +then + HOURS_FORWARD=-2 +fi + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SacStateUpdate.log +STDLOGFILE=$SSHP_LOG_DIR/SacStateUpdate.stdout.log +TMPFILE=$SSHP_LOG_DIR/SacStateUpdate.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +tail -1200 $STDLOGFILE > $TMPFILE +mv $TMPFILE $STDLOGFILE +# run the SacStateUpdater if on Linux or ssh to a linux machine if not. + +if [[ `uname` = "Linux" ]] +then + $JBINDIR/java ohd.hseb.sshp.SacStateUpdater $JDBCURL $EXPIRATION_HOURS $HOURS_FORWARD $LOGFILE >>$STDLOGFILE 2>>$STDLOGFILE +elif [[ `uname` = "HP-UX" ]] +then + ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/run_SSHP_SAC_state_update >>$STDLOGFILE 2>>$STDLOGFILE +fi diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_decode b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_decode new file mode 100755 index 0000000000..3ce7a8f881 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_decode @@ -0,0 +1,40 @@ +#!/bin/ksh +# file name: run_SSHP_data_decoder +# Created: 12/15/2003 +# Last Modified: 04/01/2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SSHP_INCOMING_DIR=$(get_apps_defaults sshp_incoming_dir) +export SSHP_INGEST_XML_DIR=$(get_apps_defaults sshp_ingest_xml_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +wait_time=$1 + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SacXMLDecoder.log +TMPFILE=$SSHP_LOG_DIR/SacXMLDecoder.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +# set up an X Terminal window to write stdout and run the SacXMLDecoder application +$JBINDIR/java ohd.hseb.sshp.messaging.SacXMLDecoder $JDBCURL $SSHP_INCOMING_DIR $SSHP_INGEST_XML_DIR $SSHP_LOG_DIR $wait_time >>$LOGFILE 2>>$LOGFILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_send b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_send new file mode 100755 index 0000000000..f264f6c5eb --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_send @@ -0,0 +1,41 @@ +#!/bin/ksh +# file name: run_sshp_data_sender +# Purpose: this will contain the code to send a message over the AWIPS +# Message Handling System (MHS) +# For now, in order to test the overall system, though, it just does a copy +# Created: 03-05-2004 +# Last Modified: 04-01-2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) + + +# setup the AWIPS environment +# +. $FXA_HOME/readenv.sh + +FILEPATH=$1 +FILENAME=$2 +MHS_SITE_ID=$3 +PRODUCT_ID=$4 + +cp $FILEPATH SSHP_OUTGOING_DIR/. +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SshpDataSender.log +TMPFILE=$SSHP_LOG_DIR/SshpDataSender.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + + +# Send product to specific location +# add the one-word description and the office id +# +echo "Sending file:$FILENAME product_ID:$PRODUCT_ID to $MHS_SITE_ID via distributeProduct" >> $LOGFILE +SUBJECT="$FILENAME $PRODUCT_ID Hydro_Model_Data" +/awips/fxa/bin/distributeProduct -c HYDRO_MODEL_DATA -s "$SUBJECT" -a $MHS_SITE_ID $PRODUCT_ID $FILEPATH diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_transfer b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_transfer new file mode 100755 index 0000000000..8534101f4b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_transfer @@ -0,0 +1,49 @@ +#!/bin/ksh +# file name: run_SSHP_data_transfer +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_JAVA_PROCESS_HOST=$(get_apps_defaults sshp_java_process_host) +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SSHP_CONTROL_DIR=$(get_apps_defaults sshp_control_dir) +export SSHP_OFS_EXTRACT_XML_DIR=$(get_apps_defaults sshp_ofs_extract_xml_dir) +export SSHP_OFS_EXTRACT_TEXT_DIR=$(get_apps_defaults sshp_ofs_extract_text_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +export CONTROL_FILE=$SSHP_CONTROL_DIR/SSHPTransfer.xml + +# Keeps the last 1200 lines of the log file + +LOGFILE=$SSHP_LOG_DIR/SshpDataTransferMgr.log +STDLOGFILE=$SSHP_LOG_DIR/SshpDataTransferMgr.stdout.log +TMPFILE=$SSHP_LOG_DIR/SshpDataTransferMgr.tmp + +tail -1200 $LOGFILE > $TMPFILE +mv $TMPFILE $LOGFILE + +tail -1200 $STDLOGFILE > $TMPFILE +mv $TMPFILE $STDLOGFILE + +if [[ `uname` = "Linux" ]] +then + $JBINDIR/java ohd.hseb.sshp.messaging.SshpDataTransferMgr $CONTROL_FILE $SSHP_OFS_EXTRACT_TEXT_DIR $SSHP_OFS_EXTRACT_XML_DIR $SSHP_LOG_DIR >>$STDLOGFILE 2>>$STDLOGFILE +elif [[ `uname` = "HP-UX" ]] +then + ssh -oBatchMode=yes $SSHP_JAVA_PROCESS_HOST $WHFS_BIN_DIR/run_SSHP_data_transfer >>$STDLOGFILE 2>>$STDLOGFILE +fi diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_ofs_extract b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_ofs_extract new file mode 100755 index 0000000000..3aed57bcac --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_ofs_extract @@ -0,0 +1,19 @@ +#!/bin/ksh +# run_sshp_ofs_extract + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +SEGID=$1 +OUTPUT_FILE=$2 + +export TZ=GMT + +### Comment out the line below if you need to reset apps_dir back to the value in .Apps_defaults! +export apps_dir=/awips/hydroapps/lx + +$WHFS_BIN_DIR/sshp_ofs_extract.LX $SEGID $OUTPUT_FILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SiteSpecific b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SiteSpecific new file mode 100755 index 0000000000..b8a1ac914c --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_SiteSpecific @@ -0,0 +1,34 @@ +#!/bin/ksh +# file name: run_SiteSpecific +# Created: 12/15/2003 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# trim log file +SSHPLOGFILE=$SSHP_LOG_DIR/SSHP.log +SSHPTMPFILE=$SSHP_LOG_DIR/SSHP.tmp +tail -1200 $SSHPLOGFILE > $SSHPTMPFILE +mv $SSHPTMPFILE $SSHPLOGFILE + +# set up an X Terminal window to write stdout and run the SiteSpecific +# application using java +xterm -T "SiteSpecific standard output window" -iconic -hold \ +-e $JBINDIR/java ohd.hseb.sshp.SSHP $JDBCURL $SSHP_LOG_DIR $LID_PASSED_IN & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_UnitHydrographEditor b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_UnitHydrographEditor new file mode 100755 index 0000000000..351e98e763 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_UnitHydrographEditor @@ -0,0 +1,35 @@ +#!/bin/ksh +# file name: run_UnitHydrographEditor +# Created: 10/07/2004 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SSHP_LOG_DIR=$(get_apps_defaults sshp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# set initial lid to the first command line argument passed into the script +LID_PASSED_IN=$1 + +export CLASSPATH=$CLASSPATH:$DB_DRIVER_PATH +# need to add a path to the jar file for this application +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/SiteSpecific.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +Dte=`date +%m%d%Y` + +LOG_FILE=$SSHP_LOG_DIR/UnitHydrographEditor_$Dte.log +TMPLOGFILE=$SSHP_LOG_DIR/UnitHydrographEditor.tmp + +tail -1200 $LOG_FILE > $TMPLOGFILE +mv $TMPLOGFILE $LOG_FILE + +# set up an X Terminal window to write stdout and run the SiteSpecific +# application using java +xterm -T UnitHydrographEditor -iconic -hold -n UnitHydrographEditor -e $JBINDIR/java ohd.hseb.sshp.window.UnitHydrographEditor $JDBCURL $LID_PASSED_IN $LOG_FILE >$LOG_FILE 2>>$LOG_FILE & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_alarm_whfs b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_alarm_whfs new file mode 100755 index 0000000000..7db67df67f --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_alarm_whfs @@ -0,0 +1,57 @@ +#!/bin/ksh +# run_alarm_whfs +# +# script to call the scheduled alarm component of the whfs +# this includes running the roc checker and the alerm reporter scripts +# +# Date: August 23, 2000 +# + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_LOCAL_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# +# +LOGFILE=$WHFS_UTIL_LOG_DIR/alarm_whfs.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/alarm_whfs.tmp +# +# +# save only the latest events in the log file +# + +echo `basename $0` log location: $LOGFILE + +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# +echo "------------------------------ " >> $LOGFILE + +# run the two scripts +# +Dte=`date -u ` +echo Starting alarm_whfs at $Dte >> $LOGFILE + +Dte=`date -u` +echo Invoking roc_checker at $Dte >> $LOGFILE + +$WHFS_LOCAL_BIN_DIR/run_roc_checker + +# TODO re-enabled report_alarm if needed + +#Dte=`date -u` +#echo Invoking report_alarm at $Dte >> $LOGFILE + +#$WHFS_LOCAL_BIN_DIR/run_report_alarm + +#Dte=`date -u ` +#echo Completed alarm_whfs at $Dte >> $LOGFILE + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_check_outlier b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_check_outlier new file mode 100755 index 0000000000..590a0aaaa3 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_check_outlier @@ -0,0 +1,77 @@ +#!/bin/ksh +# run_check_outlier +# +# +# ALL roc's HAVE BEEN CHANGED TO check_outlier +# +# +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# +# Normal output, including function errors, goes to dedicated files named by +# basis time of run. Only other, system-type error messages should appear +# in the redirected output of the program +# +# +LOGFILE=$WHFS_UTIL_LOG_DIR/check_outlier_checker.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/check_outlier_checker.tmp +# +# +# save only the latest events in the log file +# +tail -1200 $LOGFILE > $TEMPNAME +mv $TEMPNAME $LOGFILE + +# echo the current time +# +echo "------------------------------ " >> $LOGFILE + +# run the program with the ending time the current time, and for +# the most recent hours. +# +# program usage: +# +# +#check_outlier_checker -d -t
        <--required args +# database : name of database, supplied by script +# table : name of the table whose data will be reviewed. The names are +# one of the following tables in the Informix database which +# contain observed data: agricultural, discharge, +# evaporation, gatedam, ground, height, ice, lake, moisture, precip, +# pressure, procvalue, radiation, snow, temperature, weather, +# wind, yunique +# optional args: +# -h : default=current system time; can specify time as 1-4 digit +# number which is the numbers of hours preceding the current +# time, or an absolute time can be specified in the format +# yyyymmddhh. +# -n : default = 6 hrs; defines the starting time as the given +# number of hours before the ending time +# -l : default = all stations; can specify single station id +# -p : default = all SHEF pe codes; can specify single SHEF pe code +# -err : default = show all messages; if arg specified, only err +# msgs written +# -u : type of data used in quality code checks. +# 'G' denotes the use of "good" data; +# 'GQ' denotes the use of "good questionable" data; +# default = 'G' ("good data"). + +Dte=`date -u` +echo Calling check_outlier$OS_SUFFIX at $Dte >> $LOGFILE + +$WHFS_BIN_DIR/check_outlier$OS_SUFFIX -d$DB_NAME -theight >> $LOGFILE +$WHFS_BIN_DIR/check_outlier$OS_SUFFIX -d$DB_NAME -tprecip -pPC >> $LOGFILE +#$WHFS_BIN_DIR/check_outlier_checker -d$DB_NAME -ttemperature >> $LOGFILE + + + +Dte=`date -u ` +echo Completed run_check_outlier at $Dte >> $LOGFILE diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_damcrest b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_damcrest new file mode 100755 index 0000000000..2fbcfa2742 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_damcrest @@ -0,0 +1,35 @@ +#!/bin/ksh + +# File name: run_damcrest +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + + +export CONNECTION_STRING=$DAMCREST_JDBCURL + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +# set java classpath + +export CLASSPATH=.:$SYS_JAVA_DIR\ +:$SYS_JAVA_BIN_DIR\ +:$SYS_JAVA_DIR/JClassDesktopViews/lib/jcchart.jar\ +:$DB_DRIVER_PATH\ +:$WHFS_BIN_DIR/damcrest.jar\ +:$WHFS_BIN_DIR/fldat.jar + +export DBDRIVER=org.postgresql.Driver +export DAMCREST_HOME=$WHFS_BIN_DIR + +# set up an X Terminal window to write stdout and run the DamCrest +# application using java +xterm -T "DamCrest standard output window" -iconic -hold \ +-e "$SYS_JAVA_BIN_DIR/java -Ddamcrest.home=$DAMCREST_HOME gov.dambreak.menu.Launcher $1" diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_db_purge b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_db_purge new file mode 100755 index 0000000000..70379cdc69 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_db_purge @@ -0,0 +1,23 @@ +#!/bin/ksh +# run_db_purge +# April 20, 2005 + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_PURGE_LOG_DIR=$(get_apps_defaults db_purge_log_dir) + + +# Create log file name +# + +name=`date -u +db_purge.log.%m%d_%H%M` +fnm=$DB_PURGE_LOG_DIR/$name + +# +# Run db_purge from the appropriate directory +# +echo IHFS database purge log located at: $fnm +runso rary.ohd.whfs db_purge_main >> $fnm diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_floodseq b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_floodseq new file mode 100755 index 0000000000..99e2e4eb00 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_floodseq @@ -0,0 +1,25 @@ +#!/bin/ksh +# run_floodseq + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export FLOODSEQ_LOG_DIR=$(get_apps_defaults floodseq_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Setup file name, based on system clock +# use extra var to avoid SCCS problem +# +hstr="%H" +name=`date -u +floodseq_auto.%m%d.$hstr%M` +fnm=$FLOODSEQ_LOG_DIR/$name + +echo `basename $0` log location: $fnm + +# Run floodseq +# +runso rary.ohd.whfs floodseq_main -d$DB_NAME >> $fnm 2>> $fnm diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_floodseq_interactive b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_floodseq_interactive new file mode 100755 index 0000000000..045d25cbe1 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_floodseq_interactive @@ -0,0 +1,33 @@ +#!/bin/ksh +# run_floodseq_interactive +# job for running the flood sequencer via HydroBase +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export FLOODSEQ_LOG_DIR=$(get_apps_defaults floodseq_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Setup file names +# use extra var to avoid SCCS problem +# +hstr="%H" +name=`date -u +floodseq_hb.%m%d.$hstr%M` +fnm=$FLOODSEQ_LOG_DIR/$name + + +# Run floodseq +# +if $WHFS_BIN_DIR/x_notify$OS_SUFFIX -tWHFS "Update flood sequences?" "This may take a few minutes." \ +"Press 'OK' to proceed, 'Cancel' to abort." +then + if $WHFS_BIN_DIR/floodseq$OS_SUFFIX -d$DB_NAME >> $fnm 2>> $fnm + then + $WHFS_BIN_DIR/x_notify$OS_SUFFIX -n -tWHFS "Update of flood sequences complete." + fi +fi diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_hydrobrief b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_hydrobrief new file mode 100755 index 0000000000..dc6a01d9fd --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_hydrobrief @@ -0,0 +1,14 @@ +#!/bin/ksh +# run_hydrobrief +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + + +echo $RUN_FROM_DIR/hydrobrief -d$DB_NAME +$RUN_FROM_DIR/hydrobrief$OS_SUFFIX -d$DB_NAME diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_metar2shef b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_metar2shef new file mode 100755 index 0000000000..b7a8b664eb --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_metar2shef @@ -0,0 +1,104 @@ +#!/bin/ksh +# +# run script for metar2shef (metar to shef) +## +# usage: run_metar2shef +# no args are used; it does create its own detailed log file +# +# if archiving is NOT enabled, then metar.cfg (located in $METAR_CONFIG_DIR) should be modified so +# the 2nd line has the shef directory instead of the temp directory +# if archiving is enabled, the 2nd line in metar.cfg should have the temp directory listed instead of +# the shef directory. This script will then copy the files from the temp directory to: +# /data/fxa/ispan/hydro_adbs/ +# + + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export METAR_OUTPUT_DIR=$(get_apps_defaults metar_output_dir) +export ARCHIVE_ENABLE=$(get_apps_defaults archive_enable) +export ARCHIVE_SHEFDATA_DIR=$(get_apps_defaults archive_shefdata_dir) +export HYDRO_PUBLICBIN=$(get_apps_defaults hydro_publicbin) +export SHEF_DATA_DIR=$(get_apps_defaults shef_data_dir) +export METAR2SHEF_OPTIONS=$(get_apps_defaults metar2shef_options) +export METAR_LOG_DIR=$(get_apps_defaults metar_log_dir) +export METAR_CONFIG_DIR=$(get_apps_defaults metar_config_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + + +# setup log output file names +# +fnm=$METAR_LOG_DIR/metar2shef.log +tmp=$METAR_LOG_DIR/metar2shef.tmp + +#---------------------------------------------------------------------- +# Don't start another instance of this script if one is currently running +# + +AMIRUNNING_DIR=$METAR_LOG_DIR + +. $HYDRO_PUBLICBIN/amirunning + +if [[ $AmIRunning = "yes" ]]; then + Dte=`date -u` + echo run_metar2shef aborted at $Dte due to other instance running >> $fnm + exit 1 +fi + +#---------------------------------------------------------------------- + +# save only the latest events in the log file +# +tail -1200 $fnm > $tmp +mv $tmp $fnm + +# echo the current time +# +echo "-------------------------------------------------- " >> $fnm +Dte=`date -u` +echo "Running metar2shef"$OS_SUFFIX " version OB8.1 (03/26/2007) at: " $Dte >> $fnm + +# now run the application +# -a strip 1st char off of id +# -b accept collectives +# -fcfg config filename +# -p1, -p6, -p24 account for non-reporting 0 precip +# -round round the non-special times to nearest hour +# -w generate WMO header +# -strip convert bad ascii characters to blanks +# -q1 express wind direction in degrees, not tens of degrees +# +$WHFS_BIN_DIR/metar2shef$OS_SUFFIX \ + -fcfg $METAR_CONFIG_DIR/metar.cfg $METAR2SHEF_OPTIONS \ + >> $fnm 2>>$fnm + +# +# Checks to see if archiving is enabled. If it is enabled, then this script will copy +# the files from the temp directory to the archive directory as well as the shef directory +# + +num_files=`ls -1F $METAR_OUTPUT_DIR | grep -v "/" | wc -l` # Checks to see if the directory + # is empty. If it is, then no + # copy/move command will be issued +if (( $num_files > 0 )) +then + for metarfile in `ls -1F $METAR_OUTPUT_DIR | grep -v "/"` + do + if [ "$ARCHIVE_ENABLE" = "ON" ] # Checks to see if archiving is enabled. The token + # for this is located in .Apps_defaults_site + then + cp -f $METAR_OUTPUT_DIR/$metarfile $ARCHIVE_SHEFDATA_DIR + mv -f $METAR_OUTPUT_DIR/$metarfile $SHEF_DATA_DIR + else + mv -f $METAR_OUTPUT_DIR/$metarfile $SHEF_DATA_DIR + fi + done +fi +# +# +Dte=`date -u ` +echo "Completed metar2shef"$OS_SUFFIX "at: " $Dte >> $fnm diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_obsfcst_monitor b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_obsfcst_monitor new file mode 100755 index 0000000000..f7a7a3559b --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_obsfcst_monitor @@ -0,0 +1,28 @@ +#!/bin/ksh +# file name: run_obsfcst_monitor +# Created: August 2005 Author : Varalakshmi Rajaram + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Command line arguments to the program obsfcst_monitor + +DATABASE_NAME=$DB_NAME +LOCATION_FILTER=hsa +BASISTIME_LOOKBACK_HRS=36 +VALIDTIME_LOOKBACK_HRS=6 +MATCHING_VALID_TIMEWINDOW_MINS=120 + +# obsfcst_monitor -d dbname -f location filter -t forecast table name +# -b basis time lookback hrs -v valid time lookback hrs +# -w matching valid time window in mins + +$WHFS_BIN_DIR/obsfcst_monitor.LX -d $DATABASE_NAME -f $LOCATION_FILTER -t FcstHeight -b $BASISTIME_LOOKBACK_HRS -v $VALIDTIME_LOOKBACK_HRS -w $MATCHING_VALID_TIMEWINDOW_MINS + +$WHFS_BIN_DIR/obsfcst_monitor.LX -d $DATABASE_NAME -f $LOCATION_FILTER -t FcstDischarge -b $BASISTIME_LOOKBACK_HRS -v $VALIDTIME_LOOKBACK_HRS -w $MATCHING_VALID_TIMEWINDOW_MINS diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_pp b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_pp new file mode 100755 index 0000000000..0a35bcc99d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_pp @@ -0,0 +1,47 @@ +#!/bin/ksh + +# File name: run_pdc_pp +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +export CONNECTION_STRING=$JDBCURL +#export CONNECTION_STRING=jdbc:postgresql://lx1-nhdr:5432/hd_ob6rhax?user=oper + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +#truncate the preprocessor log +export LOGFILE=$PDC_PP_LOG_DIR/PDCPreprocessor.log +export LOGFILE_TMP=$PDC_PP_LOG_DIR/PDCPreprocessor.tmp + +echo `basename $0` log location: $LOGFILE + +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $LOGFILE_TMP + mv $LOGFILE_TMP $LOGFILE +fi + + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/pdc_pp.jar + +#AMIRUNNING_DIR=$PDC_PP_LOG_DIR +#. /awips/hydroapps/public/bin/amirunning + +#if [[ $AmIRunning = "yes" ]] +#then +# echo Startup cancelled because of prior running instance >> $LOGFILE +# exit 1 +#fi + +#Execute the PDC Preprocessor +java ohd.hseb.pdc_pp.PDCPreprocessor $CONNECTION_STRING $1 >>$LOGFILE 2>&1 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_precip_pp b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_precip_pp new file mode 100755 index 0000000000..8d2adc7a53 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_precip_pp @@ -0,0 +1,53 @@ +#!/bin/ksh +# run_pdc_precip_pp +# +# +# +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +# +# Normal output, including function errors, goes to dedicated files named by +# basis time of run. Only other, system-type error messages should appear +# in the redirected output of the program +# +# +LOGFILE=$PDC_PP_LOG_DIR/pdc_precip_pp.log +TEMPNAME=$PDC_PP_LOG_DIR/pdc_precip_pp.tmp + +echo `basename $0` log location: $LOGFILE +# +# +# save only the latest events in the log file +# +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# echo the current time +# +echo "------------------------------ " >> $LOGFILE + +# program usage: +# +# +# pdc_precip_pp -e +# +# endtime : end time for the timeseries + +Dte=`date -u` +echo Calling pdc_precip_pp at $Dte >> $LOGFILE 2>&1 + +echo runso rary.ohd.whfs pdc_precip_main -e$1 -h$2 >> $LOGFILE 2>&1 +runso rary.ohd.whfs pdc_precip_main -e$1 -h$2 >> $LOGFILE 2>&1 + +Dte=`date -u ` +echo Completed run_pdc_precip_pp at $Dte >> $LOGFILE 2>&1 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_tsl b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_tsl new file mode 100755 index 0000000000..cf1d34c972 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_pdc_tsl @@ -0,0 +1,50 @@ +#!/bin/ksh + +# File name: run_pdc_pp +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export PDC_PP_LOG_DIR=$(get_apps_defaults pdc_pp_log_dir) +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +export CONNECTION_STRING=$JDBCURL +#export CONNECTION_STRING=jdbc:postgresql://lx1-nhdr:5432/hd_ob6rhax?user=oper + +#get java dir +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export SYS_JAVA_BIN_DIR=$SYS_JAVA_DIR/bin + +#truncate the timeseries lite log +#export LOGFILE=$PDC_PP_LOG_DIR/PDCPreprocessor.log +#export LOGFILE_TMP=$PDC_PP_LOG_DIR/PDCPreprocessor.tmp +#tail -12000 $LOGFILE > $LOGFILE_TMP +#mv $LOGFILE_TMP $LOGFILE + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/timeserieslite.jar + +#AMIRUNNING_DIR=$PDC_PP_LOG_DIR +#. /awips/hydroapps/public/bin/amirunning + +#if [[ $AmIRunning = "yes" ]] +#then +# echo Startup cancelled because of prior running instance >> $LOGFILE +# exit 1 +#fi + +echo + +export LID=$1 +export PARAMCODE1=$2 +export PARAMCODE2=$3 +export PARAMCODE3=$4 +export PARAMCODE4=$5 +export PARAMCODE5=$6 + + +#Execute TimeSeries Lite +$SYS_JAVA_BIN_DIR/java ohd.hseb.timeserieslite.TimeSeriesLite ohd.hseb.timeserieslite.pdc.PDCDrawingMgr $CONNECTION_STRING $LID $PARAMCODE1 $PARAMCODE2 $PARAMCODE3 $PARAMCODE4 $PARAMCODE5 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_raxdb_sync b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_raxdb_sync new file mode 100755 index 0000000000..504694ebd1 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_raxdb_sync @@ -0,0 +1,21 @@ +#!/bin/ksh +# file name: run_IHFS_RAX_Sync_batch +# Created: 05/24/2007 +# Edited : 08/03/2007 - Added unix remove command to delete log files +# Edited : 09/06/2007 - Removed delete log file logic +# Edited : 10/24/2007 - Renamed jar from raxdb_sync.jar to rax_apps.jar + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for RAX applications +. /rfc_arc/lib/rax.profile + +# need to add a path to the jar file for this application +export CLASSPATH=$DB_DRIVER_PATH:$RUN_FROM_DIR/rax_apps.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# run application using java +$JBINDIR/java ohd.hseb.raxdb_sync.RaxDbSyncBatch $IHFS_JDBCURL $RAX_JDBCURL diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_report_alarm b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_report_alarm new file mode 100755 index 0000000000..beaf9c4b2e --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_report_alarm @@ -0,0 +1,210 @@ +#!/bin/ksh +# run_report_alarm +# +# script to review the current alert/alarm values and report them in +# a product and send them to the text database +# +# Revised:July 20, 2001 +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +# Run from local bin dir +. $RUN_FROM_DIR/../../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# Report output goes to dedicated files named by product_id and the +# file suffix, which is normally set according to the system tiem. +# Log output and error messages should appear in the redirected output of the program. +# + +LOGFILE=$WHFS_UTIL_LOG_DIR/report_alarm.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/report_alarm.tmp + +# setup the AWIPS environment +# redirect any output from this script to the log file +# +. $FXA_HOME/readenv.sh >> $LOGFILE 2>&1 + +# +# save only the latest events in the log file +# +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# log start of script +# +echo "------------------------------ " >> $LOGFILE +Dte=`date -u` +echo Invoking report_alarm$OS_SUFFIX at $Dte >> $LOGFILE + +# +# program usage: +# report_alarm -d -p <--required args +# -r -s -m <-- optional args +# -f -e <-- optional args +# + +# define the product id as per local needs - SET LOCALLY !!!!!!!!!!!!!!!!!!!!! +# + +PRODUCT_ID=CCCACRXXX + +# +# define the file suffix based on the system time +# use extr var to avoid SCCS problem + +hstr="%H" +SUFFIX=`date -u +%m%d.$hstr%M` + +# +# the name of the created file is set according to how the program +# builds the name + +FILENAME=$WHFS_PRODUCT_DIR/$PRODUCT_ID.$SUFFIX + +# +# run the application + +$WHFS_BIN_DIR/report_alarm$OS_SUFFIX -d$DB_NAME -p$PRODUCT_ID -s$SUFFIX -rNEAREST >> $LOGFILE 2>&1 +NUM_ALARMS=$? + + +if [ $NUM_ALARMS -eq 0 ] +then + print No alarms reported, info sent to $FILENAME >> $LOGFILE + print File NOT sent to text database >> $LOGFILE + +else + print $NUM_ALARMS alarms reported, report written to $FILENAME >> $LOGFILE + + echo Writing $FILENAME to textdb as id $PRODUCT_ID >> $LOGFILE + /awips/fxa/bin/textdb -w $PRODUCT_ID < $FILENAME >> $LOGFILE 2>&1 + RETURN_STATUS=$? + + if [ $RETURN_STATUS -eq 0 ] + then + print Product successfully sent >> $LOGFILE + else + print Product send error detected, status= $RETURN_STATUS >> $LOGFILE + fi +fi + +Dte=`date -u ` +echo Completed report_alarm at $Dte >> $LOGFILE + +#---------------------------------------------------------------------- +#---------------------------------------------------------------------- +# USAGES NOTES: +# +# program usage: +# +# report_alarm -d -p <--required args +# -r -s -m <-- optional args +# -f -e <-- optional args +# +# database : name of database, supplied by script +# product_id : nine-character product_id, used to set the output filename +# and for sending the product to the text database +# !!!!!! THE LOCAL OFFICE SHOULD SET THIS ACCORDINGLY !!!!!!!! +# +# optional args: +# +# filter : set of characters which instruct the program to only consider +# certain types of alert/alarms for reporting. +# O - Read observed alert/alarms, which has a type-source of either R* or P* +# F - Read forecast alert/alarms, which has a type-source of either F* or C* +# R - Read exceed rate-of-change alert/alarms. +# U - Read exceed upper limit alert/alarms. +# L - Read exceed lower limit alert/alarms. +# D - Read exceed diff limit alert/alarms. +# M - Read alarm data. +# T - Read alert data. +# e.g.: -fORT == read observed rate-of-change alerts only. +# Note that one can specify O and F, or R and V, or M and T together, +# but that is equivalent to specifying nothing since the default is +# to include both observed and forecast alert/alarms, both rate-of-change +# and value exceed alerts/alarms, and both alerts and alarms +# (i.e. the default is -fOFRULDMT). +# +# report_mode : reporting mode, set to one of the following: +# ALL - Report all records - and that means ALL records. +# +# RECENT - Report all observed or forecast records posted within the +# past xxx minutes. +# +# NEAR_NOW - Reported observed values within the past xxx minutes and +# forecast values within the next xxx minutes. +# +# NEAREST - Reporting most recent observed value and earliest +# forecast value. +# +# LATEST_MAXFCST - Reporting most recent observed value and maximum +# forecast value. +# +# UNREPORTED - Report all records that were not previously reported, +# as noted by the action_time field being not equal to null. +# +# NEAREST - Report the most recent record for observed data, or the earliest +# record for forecast data, for each "group" of data, where a +# group is for a unique lid/pe/ts. This is done regardless of +# whether it has been previously reported. +# +# FRESH - For observed data, listing all records that are later than xxx +# minutes after the time of the most recent reported value. +# For forecast data, listing the maximum forecast value if it +# was not reported within the past xxx minutes. +# +# NEW_OR_INCREASED - For observed data, listing unreported records if, +# the previous reported was later than xxx minutes ago OR if the +# report has a higher value than the last reported record. +# For forecasted data, listing the maximum forecast value if it +# was not reported within the past xxx minutes. +# +# minutes : the number of minutes used for time window purposes in +# the reporting modes: RECENT, NEAR_NOW, FRESH, NEW_OR_INCREASED. +# +# file_suffix : string appended to the end of the product id to form +# the output file name. the file suffix is set by this script +# to be based on the system time. +# +# - Whenever a record is reported, the action_time field is updated!!! +# - Regardless of the report_mode, the data are always filtered by +# and filter options; i.e. the filter is applied FIRST!!! +# +# ALL and UNREPORTED are very simple modes; all mean all and +# unreported means unreported. These modes are handled easily +# by filtering the retrieved data when it is read from the database. +# +# RECENT and NEAR_NOW are also simple modes. RECENT means +# recently posted, NEAR_NOW means observed or forecast data +# near now. +# +# NEAREST is also pretty simple, in that it reports the nearest +# observed of forecast data, in terms of time. +# +# LATEST_MAXFCST is also straightforward in that it reports the +# latest (i.e. nearest) observed data, but unlike the NEAREST mode, +# reports the maximum forecast value. +# +# FRESH and NEW_OR_INCREASED use the most complex concepts. +# +# The following modes do not consider the action_time: +# ALL, RECENT, NEAR_NOW, NEAREST, LATEST_MAXFCST +# These other modes do consider the action_time: +# UNREPORTED, FRESH, NEW_OR_INCREASED +# +# PEfilter: filter by pe specified by users diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_roc_checker b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_roc_checker new file mode 100755 index 0000000000..e037a18ab0 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_roc_checker @@ -0,0 +1,78 @@ +#!/bin/ksh +# run_roc_checker +# + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +# Source set_hydro_env from local bin +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_UTIL_LOG_DIR=$(get_apps_defaults whfs_util_log_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +# +# Normal output, including function errors, goes to dedicated files named by +# basis time of run. Only other, system-type error messages should appear +# in the redirected output of the program +# +# +LOGFILE=$WHFS_UTIL_LOG_DIR/roc_checker.log +TEMPNAME=$WHFS_UTIL_LOG_DIR/roc_checker.tmp +# +# +# save only the latest events in the log file +# +echo `basename $0` log location: $LOGFILE + +if [ -e "${LOGFILE}" ] +then + tail -1200 $LOGFILE > $TEMPNAME + mv $TEMPNAME $LOGFILE +fi + +# echo the current time +# +echo "------------------------------ " >> $LOGFILE + +# run the program with the ending time the current time, and for +# the most recent hours. +# +# program usage: +# +# roc_checker -d -t
        <--required args +# database : name of database, supplied by script +# table : name of the table whose data will be reviewed. The names are +# one of the following tables in the Informix database which +# contain observed data: agricultural, discharge, +# evaporation, gatedam, ground, height, ice, lake, moisture, precip, +# pressure, procvalue, radiation, snow, temperature, weather, +# wind, yunique +# optional args: +# -h : default=current system time; can specify time as 1-4 digit +# number which is the numbers of hours preceding the current +# time, or an absolute time can be specified in the format +# yyyymmddhh. +# -n : default = 6 hrs; defines the starting time as the given +# number of hours before the ending time +# -l : default = all stations; can specify single station id +# -p : default = all SHEF pe codes; can specify single SHEF pe code +# -err : default = show all messages; if arg specified, only err +# msgs written +# -u : type of data used in quality code checks. +# 'G' denotes the use of "good" data; +# 'GQ' denotes the use of "good questionable" data; +# default = 'G' ("good data"). + +Dte=`date -u` +echo Calling roc_checker at $Dte >> $LOGFILE + +runso rary.ohd.whfs roc_checker_main -d$DB_NAME -theight >> $LOGFILE +runso rary.ohd.whfs roc_checker_main -d$DB_NAME -tprecip -pPC >> $LOGFILE +#$WHFS_BIN_DIR/roc_checker -d$DB_NAME -ttemperature >> $LOGFILE + + + +Dte=`date -u ` +echo Completed run_roc_checker at $Dte >> $LOGFILE \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_rpf_batch b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_rpf_batch new file mode 100755 index 0000000000..d5fe9224e1 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_rpf_batch @@ -0,0 +1,112 @@ +#! /bin/ksh +# +# run_rpf_batch +# April, 2005 +# +# +# Sample file for running the non-interactive version of RiverPro. +# This file should be configured to your local office needs. +# +# To run the rpf_batch program, its three arguments need to be defined. +# +# -d dbname = Required name of the IHFS Informix database. +# +# -p pccfile = Required name of the product content control (pcc) +# file that contains the high-level instructions for +# generating the product. The pcc filename should include +# the suffix identifying the office +# name such as fls_def.pcc.XXX with the full path name +# -s filesuffix = Optional name of the suffix to be appended onto the +# output product and log files created by the program. +# If not specified, the process id will be used. +# Use of the file suffix is strongly suggested to facilitate +# the dissemination of the generated product by allowing +# its filename to be known. +# +# Note: The product only inlcude the information for +# points specified after keyword "INCLUDE_POINTS:" in +# the pcc file +# +# After creating the product, the product can be issued to the +# appropriate communications circuits using the rpf_issue script. +# +# Define some environment variables, including the log directories +# and the database name. + +# Modification: JIngtao +# Revision: 03/17/2006 +# change the generated product name from rpf_product.$SUFFIX +# to work_product.$SUFFIX + +# This allows you to run this script outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../../set_hydro_env +export RPF_LOG_DIR=$(get_apps_defaults rpf_log_dir) +export RPF_TEMPLATE_DIR=$(get_apps_defaults rpf_template_dir) +export WHFS_PRODUCT_DIR=$(get_apps_defaults whfs_product_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + + + +# Log some info. Change this as desired. Writes to the log +# file can be added later in the script as desired. + +LOGFILE=$RPF_LOG_DIR/run_rpf_batch.log +Dte=`date -u` +echo Invoking run_rpf_batch$OS_SUFFIX at $Dte > $LOGFILE + +# This command will create a product using instructions given in the +# specified pcc file, and with the specified file suffix. +# Uncomment this line after defining the two arguments. + +SUFFIX=RVS_test +PCCFILE=filexxx.pcc.ooo + +#echo Generating product using pccfile$PCCFILE and suffix $SUFFIX > $LOGFILE + +#$WHFS_BIN_DIR/rpf_batch$OS_SUFFIX -d$DB_NAME -p$RPF_TEMPLATE_DIR/$PCCFILE -s$SUFFIX > $LOGFILE + + +# The script rpf_issue which has the following arguments: +# The name of the output product file created by rpf_batch +# it is uniquely identified by using the suffix argument. + +FILENAME=$WHFS_PRODUCT_DIR/work_product.$SUFFIX + +# The AWIPS product id is CRITICAL - it should match the definition +# in the .pcc file and must be a valid ID recognized by AWIPS + +PRODUCT_ID=CCCCNNNXXX + +# Specify OUP [Official User Product] as the product type; rpf_batch does not +# currently support NWR products + +PRODUCT_TYPE=OUP + +# Specifies NORMAL issuance of product for the mode; i.e. not test mode. + +ISSUE_MODE=NORMAL + +# Specify LOCAL destination; the NON-LOCAL is not supported +# since rpf_batch does not support NWR products + +DESTINATION=LOCAL + +# Specify the identifier for the sending office. This is used for +# non-local NWR products only so its value is not important. + +WFO_ID=xxx + +# The formal specification for the call to rpf_issue is: +# rpf_issue $FILENAME $PRODUCT_ID $PRODUCT_TYPE $ISSUE_MODE $DESTINATION $WFO_ID +# +# Using the fixed/known arguments, to make this script operational, +# uncomment the call below after specifying the suffix and product id above: +# +# echo Issuing file $FILENAME > $LOGFILE +#rpf_issue $FILENAME $PRODUCT_ID OUP NORMAL LOCAL $WFO_ID + +# end of script diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_vacuum b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_vacuum new file mode 100755 index 0000000000..4287270fd3 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/run_vacuum @@ -0,0 +1,50 @@ +#!/bin/ksh +# run_vacuum +# December 29, 2004 + +# this script runs from the cron every 2 hours +# it does a vacuum of the IHFS db + +#------------------------------------------------------------------- + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export VACUUM_LOG_DIR=$(get_apps_defaults vacuum_log_dir) +export DB_NAME=$(get_apps_defaults db_name) + + +# Create log file name +# + +name_vac=`date -u +vacuum.log.%m%d_%H%M` +fnm_vac=$VACUUM_LOG_DIR/$name_vac + +#---------------------------------------------------------------------- +# Don't fire up another instance if one is underway +# If another instance is running, write a message to the log file and stop + +AMIRUNNING_DIR=$VACUUM_LOG_DIR + +. /awips/hydroapps/public/bin/amirunning + +if [[ $AmIRunning = "yes" ]] +then + echo run_vacuum script cancelled due to other instance running >> $fnm_vac + exit 1 +fi + +#---------------------------------------------------------------------- +# run vacuum with verbose option on IHFS db +# + +DTZ=`date -u +%T` +echo begin vacuum at $DTZ >> $fnm_vac + +echo database name = $DB_NAME >> $fnm_vac +$POSTGRESQLBINDIR/vacuumdb -v $DB_NAME >> $fnm_vac 2>>$fnm_vac + +DTZ=`date -u +%T` +echo end vacuum at $DTZ >> $fnm_vac diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/save_image b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/save_image new file mode 100755 index 0000000000..442da91696 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/save_image @@ -0,0 +1,99 @@ +#!/usr/bin/ksh +# +# save_image +# +# Bryon Lawrence September 26, 2001 OHD +# +# Purpose: +# +# This script will capture an image on the screen and save it. +# It was designed to be called from a program such as +# timeseries or hydromap which provides the option of +# capturing an image on the screen and storing it in a file. +# The commands that must be called to do this are different on the +# HP-UX and Linux operating systems. So, this script has the logic +# built into it to determine which operating system it is being run +# on. +# +# The caller of this script must provide two arguments: the name of the +# window to be "captured" and the name of the file (including the +# full path) to save the image to. Note that the extension of the +# filename must reflect the desired image format. For example if the +# user wants to capture a window named "test window" and save it as a +# GIF image in his home directory, then he should use the following +# command structure: +# +# save_image "test window" "~/test_window.gif" +# +# If the user does not supply an extension identifying the image format, +# then an extension of ".gif" is appended onto the filename, and the file +# is saved as a gif image. +# +############################################################################### + +TEMP_DIR="/tmp" + +# +# Trap any malicious signals and make sure the temporary file needed +# by the HP-UX operating system is cleaned up before the program +# terminates. +trap 'rm -f ; rm -f $TEMP_DIR/junk.gif; exit 1' 1 2 15 + +# Test to make certain that the proper number of command line parameters +# have been passed into this script. +if [[ $# -ne 2 ]] +then + + print "\nThe attempt to save the image has failed." + print "An incorrect number of arguments have been passed to the" + print "save_image script. An argument specifying the name of" + print "window to save and an argument specifiying the name of" + print "the file to save it to must be supplied to this script.\n" + exit 1 + +fi + +WINDOW_NAME=$1 +FILENAME=$2 + +# Determine if an extension was included on the filename. If no +# extension was provided, then the image format of the file +# will default to "*.gif". The test for an extension is simple. +# Check to determine if there is a "." in the filename. If so, then +# assume there is an extension. If not, then there is no extension, and +# a ".gif" will be appended to the filename. If an extension specifying +# an image file format is supplied, then it is up to the user to make sure +# that the extension and the image format that it represents are valid. +echo $FILENAME | grep "\." + +if [ $? -ne 0 ] +then + FILENAME="$FILENAME.gif" +fi + +# Determine the operating system that this script is running on. +OPER_SYSTEM=`uname` + +if [[ $OPER_SYSTEM = "Linux" ]] +then + + # This is the Linux sequence of commands. + import -window "$WINDOW_NAME" $FILENAME + +else + + # This is the HP-UX sequence of commands. + rm -f $TEMP_DIR/junk.xwd + xwd -name "$WINDOW_NAME" -out "$TEMP_DIR/junk.xwd" + + if [[ -z "$HYDRO_PUBLICBIN" ]] + then + imconv "$TEMP_DIR/junk.xwd" "$FILENAME" + else + ${HYDRO_PUBLICBIN}/imconv "$TEMP_DIR/junk.xwd" -gif "$FILENAME" + fi + + rm -f $TEMP_DIR/junk.xwd +fi + +exit 0 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/sdbj.LX b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/sdbj.LX new file mode 100755 index 0000000000..b15c81c0b1 Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/sdbj.LX differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_fcstservice b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_fcstservice new file mode 100755 index 0000000000..0e20afd06d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_fcstservice @@ -0,0 +1,23 @@ +#!/bin/ksh + +# File name: start_fcstservice +# Author : Ram Varma + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + + +#LHVM_LOG=$LHVM_LOG_DIR/fcstservice + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH +CLASSPATH=$CLASSPATH:$WHFS_BIN_DIR/fcstservice.jar + +#Execute Lhvm +xterm -T "fcstservice" -iconic -hold \ +-e $SYS_JAVA_DIR/bin/java ohd.hseb.fcstservice.LhvmApplicationWindow $JDBCURL & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_hydrobase b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_hydrobase new file mode 100755 index 0000000000..57a426efbe --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_hydrobase @@ -0,0 +1,11 @@ +#!/bin/ksh +# start_hydrobase + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +xterm -T HydroBase$OS_SUFFIX -iconic -n HydroBase -e $RUN_FROM_DIR/hb$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_hydroview b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_hydroview new file mode 100755 index 0000000000..dbcd03e37d --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_hydroview @@ -0,0 +1,29 @@ +#!/bin/ksh +# start_hydroview + +# This allows this script to be run from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# Export the value of FXA_HOME here. This allows read_env.sh to be +# sourced before set_hydro_env. This prevents set_hydro_env environment +# and token settings from being overwritten by read_env.sh. +export FXA_HOME=/awips/fxa + +# Set up the AWIPS environment. +. $FXA_HOME/readenv.sh + +# Set up SOME environmental variables required by hmap_mpe. +. $RUN_FROM_DIR/../../set_hydro_env +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) + +XAPPLRESDIR=$RUN_FROM_DIR +export XAPPLRESDIR + +# for calling Java (TimeSeriesLite in this case) from withing a C program +# already added LD_LIBRARY_PATH to set_hydro_env +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/timeserieslite.jar:$WHFS_BIN_DIR/MiscDialogs.jar + + +xterm -T HydroView$OS_SUFFIX -iconic -n Hydroview \ + -e $RUN_FROM_DIR/hydroview$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_ldv b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_ldv new file mode 100755 index 0000000000..8232b556b9 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_ldv @@ -0,0 +1,11 @@ +#!/bin/ksh +# filename: start_ldv + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +xterm -T LiveDataViewer$OS_SUFFIX -iconic -e $RUN_FROM_DIR/ldv$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_raxbase b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_raxbase new file mode 100755 index 0000000000..08e0e418fc --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_raxbase @@ -0,0 +1,18 @@ +#!/bin/ksh +# file name: start_raxbase +# Last Updated: 01/02/2008 + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for RAX applications +. /rfc_arc/lib/rax.profile + +# need to add a path to the jar file for this application +export CLASSPATH=$DB_DRIVER_PATH:$RUN_FROM_DIR/rax_apps.jar + +# Java bin directory +JBINDIR=$SYS_JAVA_DIR/bin + +# run application using java +xterm -T RaxBase -iconic -n RaxBase -e $JBINDIR/java -Xmx512m -Xms32m ohd.hseb.raxbase.RaxBase $RAX_JDBCURL $IHFS_JDBCURL $ADB_NAME . diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_rivermonitor b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_rivermonitor new file mode 100755 index 0000000000..acbe9742b0 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_rivermonitor @@ -0,0 +1,30 @@ +#!/bin/ksh + +# File name: start_rivermonitor +# Author : Varalakshmi Rajaram + +# This allows you to run this script from outside of ./bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export SYS_JAVA_DIR=$(get_apps_defaults sys_java_dir) +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/RiverMonitor.jar:$CLASSPATH + +MISSING_REPRESENTATION=' ' + +#Execute the RiverMonitor + +if [[ $# > 0 ]] +then +MONITOR_NAME="$1" +else +MONITOR_NAME="River" +fi + +xterm -T $MONITOR_NAME"Monitor" -iconic -hold \ +-e $SYS_JAVA_DIR/bin/java -Xms64m -Xmx512m ohd.hseb.monitor.Monitor $JDBCURL "$MISSING_REPRESENTATION" $MONITOR_NAME & + diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_riverpro b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_riverpro new file mode 100755 index 0000000000..8392126de9 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_riverpro @@ -0,0 +1,56 @@ +#!/bin/ksh +# start_riverpro +# +# AWIPS OB8.3 +# + +# This allows you to run this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export TZ=CST6CDT +export WHFS_BIN_DIR=$(get_apps_defaults whfs_bin_dir) +export DB_NAME=$(get_apps_defaults db_name) +export WHFS_CONFIG_DIR=$(get_apps_defaults whfs_config_dir) +export rpf_template_dir=$WHFS_CONFIG_DIR/riverpro +export WHFS_LOG_DIR=$(get_apps_defaults whfs_log_dir) +export RPF_LOG_DIR=$WHFS_LOG_DIR/riverpro + + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/MiscDialogs.jar:$CLASSPATH +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/jre/lib/i386:/usr/local/jre/lib/i386/client:/usr/local/jre/lib/i386/native_threads + + +# execute the application in TEST MODE + +#xterm -T RiverPro$OS_SUFFIX -iconic -name RiverPro \ +#-e $RUN_FROM_DIR/rpf$OS_SUFFIX -d$DB_NAME -m$MODE_ARG & + +$RUN_FROM_DIR/rpf$OS_SUFFIX -d$DB_NAME -mT > $RPF_LOG_DIR/riverpro.log 2>&1 + + + +if test WORKSTATION_MODE -eq OPERATIONAL_MODE +then + MODE_ARG="O" +elif test WORKSTATION_MODE -eq TEST_MODE +then + MODE_ARG="T" +elif test WORKSTATION_MODE -eq PRACTICE_MODE +then + MODE_ARG="P" +else + MODE_ARG="O" + echo Assuming operational workstation mode +fi + +# set java classpath +export CLASSPATH=$DB_DRIVER_PATH:$WHFS_BIN_DIR/MiscDialogs.jar:$CLASSPATH + + +# execute the application + +xterm -T RiverPro$OS_SUFFIX -iconic -hold -name RiverPro \ +-e $RUN_FROM_DIR/rpf$OS_SUFFIX -d$DB_NAME -m$MODE_ARG & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_timeseries b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_timeseries new file mode 100755 index 0000000000..4d9e11a2e7 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/start_timeseries @@ -0,0 +1,11 @@ +#!/bin/ksh +# start_timeseries + +# This allows you to call this script from outside of ./standard/bin +RUN_FROM_DIR=`dirname $0` + +# set up SOME environment variables for WHFS applications +. $RUN_FROM_DIR/../../set_hydro_env +export DB_NAME=$(get_apps_defaults db_name) + +xterm -T TimeSeries$OS_SUFFIX -iconic -name TimeSeries -e $RUN_FROM_DIR/timeseries$OS_SUFFIX -d$DB_NAME & diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/timeserieslite.jar b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/timeserieslite.jar new file mode 100755 index 0000000000..239c45098c Binary files /dev/null and b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/bin/timeserieslite.jar differ diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/bin/whfs_editor b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/bin/whfs_editor new file mode 100755 index 0000000000..24fa7cf5f2 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/bin/whfs_editor @@ -0,0 +1,133 @@ +#! /bin/ksh +# whfs_editor - Launches a standalone editor from an application. +# +# The "dtpad" editor is invoked from the "HP" operating system. +# The "kwrite" editor is invoked from the "Linux" operating system. +# +# This script was modified to use a "hard-wired" +# editor based upon which operating system it is being run under. +# If the user wants to use an editor of their preference, then this +# script may be modified. Alternatively, the token "whfs_editor:" +# can be set to use a different file in this local/bin directory. +# +# The script must recognize the following args from the command line. +# Argument "0" is the command name. +# Argument "1" is the title to display across the top of the editor. +# Argument "2" is the name of the file to be opened. +# Argument "3" is the type of the file which is important +# +# Note that this script has been created on the premise that it will be +# launched from an application that has already had "set_hydro_env" sourced +# by a start script. This script relies on set_hydro_env being sourced +# to set values for: "RPF_LINEWIDTH", "OS_SUFFIX", "WHFS_UTIL_LOG_DIR". +# If "OS_SUFFIX" is not set, then this script will issue an error message +# and exit with a return value of "1". +# If "RFC_LINEWIDTH" is not set, then it will default to a value of "80". +# If "WHFS_UTIL_LOG_DIR" is not set, then if the editor command is +# logging to the file, the edit command will fail. +# +# modified 01/28/2002 +# removed "-geometry" option when calling kwrite editor on Linux machines +# added error logging feature for kwrite +# +TITLE=$1 +FILENAME=$2 +FILETYPE=$3 + +LOGFILENAME=$WHFS_UTIL_LOG_DIR/whfs_editor.log + +# +# This allows you to run this script from outside of ./local/bin +RUN_FROM_DIR=`dirname $0` + +# +# get line_limit value from the RPF_LINEWIDTH environmental variable. +if [[ -z "`echo $RPF_LINEWIDTH | tr -d ' /\t'`" ]] +then + NUM_COLS="80" +else + NUM_COLS=$RPF_LINEWIDTH +fi + +BY="x" +NUM_LINES="30" +GEOMETRY=$NUM_COLS$BY$NUM_LINES + +#--------------------------------- +# + +# +# Is the OS_SUFFIX variable defined in the environment? +if [[ -z "`echo $OS_SUFFIX | tr -d ' /\t'`" ]] +then + print "\nOS_SUFFIX is not defined. This variable needs to be defined" + print "for the whfs_editor script to properly function.\n" + exit 1 +fi + +# +# Determine the operating system that this script is being run under. +if [[ $OS_SUFFIX = ".HP" ]] +then + + DTPAD_EDITOR=/usr/dt/bin/dtpad + + if [[ $FILETYPE = "OUP" ]] + then + echo $DTPAD_EDITOR -wrapToFit -geometry $GEOMETRY $FILENAME -standAlone + $DTPAD_EDITOR -wrapToFit -geometry $GEOMETRY $FILENAME -standAlone + fi + + if [[ $FILETYPE = "NWR" ]] + then + echo $DTPAD_EDITOR -geometry $GEOMETRY $FILENAME -standAlone + $DTPAD_EDITOR -geometry $GEOMETRY $FILENAME -standAlone + fi + + if [[ $FILETYPE = "SHEFENCODE" ]] + then + echo $DTPAD_EDITOR $FILENAME -standAlone + $DTPAD_EDITOR $FILENAME -standAlone + fi + + if [[ $FILETYPE = "" ]] + then + echo $DTPAD_EDITOR $FILENAME -standAlone + $DTPAD_EDITOR $FILENAME -standAlone + fi + + +# for the $KWRITE_EDITOR invocations, send any error output to a log file. + +else + if [ -e /usr/bin/kwrite ]; then + KWRITE_EDITOR=/usr/bin/kwrite + else + KWRITE_EDITOR=/usr/bin/gedit + fi + + if [[ $FILETYPE = "OUP" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + + if [[ $FILETYPE = "NWR" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + + if [[ $FILETYPE = "SHEFENCODE" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + + if [[ $FILETYPE = "" ]] + then + echo "$KWRITE_EDITOR $FILENAME 2>$LOGFILENAME" + $KWRITE_EDITOR $FILENAME 2>$LOGFILENAME + fi + +fi diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/damcrest/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/damcrest/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/hydroview/help/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/hydroview/help/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/metar2shef/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/metar2shef/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/rivermon/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/rivermon/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/riverpro/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/riverpro/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/sshp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/sshp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/timeseries/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/app/timeseries/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/damcrest/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/damcrest/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat new file mode 100644 index 0000000000..09de0b12d3 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat @@ -0,0 +1,13335 @@ +105 105 -1 25 40.10000 98.14803 + 40.2029900 98.2218000 + 40.1545600 98.1811800 + 40.1655000 98.1163200 + 40.1364600 98.0893900 + 40.1471400 98.0375500 + 40.1277000 98.0239600 + 40.0990600 97.9710500 + 40.0994700 97.9450000 + 39.9719800 97.9285400 + 39.9707600 98.0065400 + 39.9410900 98.0187100 + 39.9308500 98.0444100 + 39.9504900 98.0449800 + 39.9684000 98.1495200 + 39.9478600 98.2009000 + 39.9770900 98.2148100 + 39.9651600 98.3314800 + 39.9845600 98.3451200 + 40.0341500 98.3207000 + 40.1618200 98.3248400 + 40.2102000 98.3655600 + 40.2691300 98.3675100 + 40.2504600 98.3146700 + 40.2308200 98.3140300 + 40.2029900 98.2218000 +106 106 -1 27 39.90240 98.37499 + 39.9410900 98.0187100 + 39.8723400 98.0167800 + 39.8328500 98.0286500 + 39.8418200 98.0808300 + 39.8023200 98.0926600 + 39.8213100 98.1321500 + 39.8092200 98.2615400 + 39.8286200 98.2751300 + 39.8239100 98.5215900 + 39.8432900 98.5352600 + 39.8326800 98.5738200 + 39.8812400 98.6015400 + 39.8796000 98.6794200 + 39.9079400 98.7324600 + 39.9275900 98.7332100 + 39.9990800 98.6058100 + 39.9701600 98.5787500 + 40.0024700 98.4367800 + 39.9833300 98.4101200 + 39.9845600 98.3451200 + 39.9651600 98.3314800 + 39.9770900 98.2148100 + 39.9478600 98.2009000 + 39.9684000 98.1495200 + 39.9504900 98.0449800 + 39.9308500 98.0444100 + 39.9410900 98.0187100 +107 107 -1 21 39.94800 97.86219 + 39.9553600 97.7200800 + 39.9358900 97.7066100 + 39.8966000 97.7056800 + 39.8964200 97.7186700 + 39.8866000 97.7184300 + 39.8862500 97.7444000 + 39.7973100 97.7811700 + 39.7965600 97.8330300 + 39.8737700 97.9259100 + 39.8635500 97.9516100 + 39.8527000 98.0162300 + 39.8723400 98.0167800 + 39.9410900 98.0187100 + 39.9707600 98.0065400 + 39.9719800 97.9285400 + 40.0994700 97.9450000 + 40.0707900 97.8921400 + 40.0317000 97.8780900 + 40.0041100 97.7472700 + 39.9648200 97.7463100 + 39.9553600 97.7200800 +108 108 -1 22 39.68160 98.05697 + 39.8635500 97.9516100 + 39.7663300 97.8841300 + 39.7172200 97.8828500 + 39.7077900 97.8566900 + 39.5408400 97.8523900 + 39.4909700 97.9027900 + 39.5298500 97.9296600 + 39.5480600 98.0206500 + 39.6150900 98.1260500 + 39.6142000 98.1777900 + 39.6429700 98.2174900 + 39.7021200 98.2063600 + 39.7213000 98.2328600 + 39.7802200 98.2347000 + 39.8092200 98.2615400 + 39.8213100 98.1321500 + 39.8023200 98.0926600 + 39.8418200 98.0808300 + 39.8328500 98.0286500 + 39.8723400 98.0167800 + 39.8527000 98.0162300 + 39.8635500 97.9516100 +109 109 -1 19 39.64590 97.80373 + 39.8866000 97.7184300 + 39.7392800 97.7149200 + 39.6808800 97.6746700 + 39.4744800 97.6828100 + 39.4257200 97.6558600 + 39.4052100 97.7199000 + 39.4626600 97.8245700 + 39.4715200 97.8893700 + 39.4909700 97.9027900 + 39.5408400 97.8523900 + 39.7077900 97.8566900 + 39.7172200 97.8828500 + 39.7663300 97.8841300 + 39.8635500 97.9516100 + 39.8737700 97.9259100 + 39.7965600 97.8330300 + 39.7973100 97.7811700 + 39.8862500 97.7444000 + 39.8866000 97.7184300 +110 110 -1 31 39.66770 97.56583 + 39.8966000 97.7056800 + 39.8778200 97.6403000 + 39.9177800 97.5892400 + 39.8984600 97.5628400 + 39.8793000 97.5234500 + 39.8013400 97.4699200 + 39.6931500 97.4806600 + 39.5959700 97.3881100 + 39.6356800 97.3500500 + 39.7141200 97.3644800 + 39.7538200 97.3263400 + 39.7832800 97.3268900 + 39.8033300 97.2883400 + 39.7842100 97.2361200 + 39.7254100 97.2221500 + 39.7160800 97.1701700 + 39.5583200 97.2322500 + 39.4983300 97.3345700 + 39.5174100 97.3866100 + 39.4680100 97.4114800 + 39.4775400 97.4375000 + 39.4281400 97.4623300 + 39.4177000 97.5137300 + 39.4268900 97.5655500 + 39.4257200 97.6558600 + 39.4744800 97.6828100 + 39.6808800 97.6746700 + 39.7392800 97.7149200 + 39.8866000 97.7184300 + 39.8964200 97.7186700 + 39.8966000 97.7056800 +111 111 -1 32 39.51920 97.28186 + 39.7070700 97.0793400 + 39.6481400 97.0784500 + 39.5594100 97.1159100 + 39.4715800 97.0500000 + 39.4713600 97.0758100 + 39.4021500 97.1263900 + 39.3234700 97.1380500 + 39.3231100 97.1767000 + 39.2443000 97.2011700 + 39.2440500 97.2269100 + 39.2731200 97.2660400 + 39.2727300 97.3046600 + 39.3215600 97.3313100 + 39.3306700 97.3959200 + 39.3797700 97.3968700 + 39.3991200 97.4230400 + 39.3785800 97.5000200 + 39.3882400 97.5131100 + 39.4177000 97.5137300 + 39.4281400 97.4623300 + 39.4775400 97.4375000 + 39.4680100 97.4114800 + 39.5174100 97.3866100 + 39.4983300 97.3345700 + 39.5583200 97.2322500 + 39.7160800 97.1701700 + 39.7254100 97.2221500 + 39.7842100 97.2361200 + 39.7944100 97.1973800 + 39.7262600 97.1314500 + 39.7266000 97.0925900 + 39.7070700 97.0793400 +112 112 -1 24 39.25080 97.01398 + 39.3843000 96.9068600 + 39.3844800 96.8810700 + 39.3746600 96.8809500 + 39.3157300 96.8802300 + 39.2277000 96.8276900 + 39.1491400 96.8268000 + 39.1193200 96.8778500 + 39.0307500 96.9024600 + 39.0501100 96.9412100 + 39.0300700 96.9922900 + 39.0496100 97.0053900 + 39.1278500 97.0450300 + 39.1470500 97.0967300 + 39.1961500 97.0974700 + 39.2443000 97.2011700 + 39.3231100 97.1767000 + 39.3234700 97.1380500 + 39.4021500 97.1263900 + 39.4713600 97.0758100 + 39.4715800 97.0500000 + 39.4324000 97.0365200 + 39.4425400 96.9979500 + 39.3839100 96.9584400 + 39.3843000 96.9068600 +117 117 -1 8 39.69910 97.40350 + 39.7538200 97.3263400 + 39.7141200 97.3644800 + 39.6356800 97.3500500 + 39.5959700 97.3881100 + 39.6931500 97.4806600 + 39.8013400 97.4699200 + 39.8022300 97.3921000 + 39.7538200 97.3263400 +1407 1407 -1 11 41.06810 98.88040 + 41.1598700 99.0189800 + 41.1605000 98.9925500 + 41.0649600 98.8696300 + 41.0476400 98.7632800 + 41.0187300 98.7357600 + 40.9756300 98.9055900 + 41.0146300 98.9203900 + 40.9943800 98.9459500 + 40.9925200 99.0250400 + 41.0131100 98.9863200 + 41.1598700 99.0189800 +1411 1411 -1 16 41.41380 99.08044 + 41.5238300 99.0213200 + 41.4756100 98.9793900 + 41.4657800 98.9789700 + 41.4461300 98.9781300 + 41.3281800 98.9731500 + 41.2787300 98.9843200 + 41.2670300 99.0633100 + 41.2854000 99.1171100 + 41.3725500 99.1740300 + 41.3722200 99.1872900 + 41.3820500 99.1877400 + 41.4432900 99.0975400 + 41.5124200 99.0873000 + 41.5606000 99.1293200 + 41.5232000 99.0478800 + 41.5238300 99.0213200 +1412 1412 -1 15 41.18790 98.92117 + 41.3281800 98.9731500 + 41.3192700 98.9330100 + 41.2897800 98.9317900 + 41.2227800 98.8495700 + 41.1447500 98.8199800 + 41.0878000 98.7252200 + 41.0476400 98.7632800 + 41.0649600 98.8696300 + 41.1605000 98.9925500 + 41.1598700 99.0189800 + 41.2277200 99.0616000 + 41.2854000 99.1171100 + 41.2670300 99.0633100 + 41.2787300 98.9843200 + 41.3281800 98.9731500 +1413 1413 -1 26 41.03090 98.65353 + 41.2230800 98.8363400 + 41.2048700 98.7694400 + 41.1658500 98.7546800 + 41.1568700 98.7146500 + 41.0796400 98.6456400 + 41.1011700 98.5539500 + 41.1208300 98.5546600 + 41.1213500 98.5282400 + 41.1017000 98.5275300 + 41.0323800 98.5514600 + 40.9990800 98.7350000 + 40.9204700 98.7319600 + 40.8988100 98.8233700 + 40.8493900 98.8345700 + 40.8485100 98.8740500 + 40.8386800 98.8736500 + 40.8482100 98.8872000 + 40.8467000 98.9529800 + 40.9348100 98.9698300 + 40.9756300 98.9055900 + 41.0187300 98.7357600 + 41.0476400 98.7632800 + 41.0878000 98.7252200 + 41.1447500 98.8199800 + 41.2227800 98.8495700 + 41.2230800 98.8363400 +1414 1414 -1 12 41.33440 98.88117 + 41.3511400 98.8282400 + 41.3126900 98.7869300 + 41.2930400 98.7861600 + 41.2439000 98.7842100 + 41.2230800 98.8363400 + 41.2227800 98.8495700 + 41.2897800 98.9317900 + 41.3192700 98.9330100 + 41.3281800 98.9731500 + 41.4461300 98.9781300 + 41.3499600 98.8812300 + 41.3511400 98.8282400 +1415 1415 -1 11 41.18630 98.69514 + 41.2930400 98.7861600 + 41.2444700 98.7577500 + 41.1208300 98.5546600 + 41.1011700 98.5539500 + 41.0796400 98.6456400 + 41.1568700 98.7146500 + 41.1658500 98.7546800 + 41.2048700 98.7694400 + 41.2230800 98.8363400 + 41.2439000 98.7842100 + 41.2930400 98.7861600 +1416 1416 -1 18 41.19180 98.62523 + 41.3332100 98.7479600 + 41.2663700 98.6526400 + 41.2193700 98.5449800 + 41.1999800 98.5310500 + 41.2209300 98.4656200 + 41.2020300 98.4252600 + 41.1135700 98.4222300 + 41.0334300 98.4987000 + 41.0323800 98.5514600 + 41.1017000 98.5275300 + 41.1213500 98.5282400 + 41.1208300 98.5546600 + 41.2444700 98.7577500 + 41.2930400 98.7861600 + 41.3126900 98.7869300 + 41.3511400 98.8282400 + 41.3323500 98.7877000 + 41.3332100 98.7479600 +1420 1420 -1 18 41.68590 99.05527 + 41.7975200 99.0998600 + 41.8485800 99.0219700 + 41.7247000 98.8433100 + 41.6749500 98.8679400 + 41.6740500 98.9078700 + 41.6347300 98.9062400 + 41.5843600 98.9573800 + 41.5253800 98.9549000 + 41.5238300 99.0213200 + 41.5232000 99.0478800 + 41.5606000 99.1293200 + 41.5799400 99.1434900 + 41.5691300 99.1829100 + 41.6654200 99.2672300 + 41.6766000 99.2144400 + 41.7260900 99.2033800 + 41.7575500 99.1247700 + 41.7975200 99.0998600 +1421 1421 -1 16 41.57800 98.86229 + 41.7247000 98.8433100 + 41.6579000 98.7473600 + 41.6191400 98.7192200 + 41.5506000 98.7032700 + 41.4317900 98.7385300 + 41.4312200 98.7650700 + 41.4508800 98.7658400 + 41.4657800 98.9789700 + 41.4756100 98.9793900 + 41.5238300 99.0213200 + 41.5253800 98.9549000 + 41.5843600 98.9573800 + 41.6347300 98.9062400 + 41.6740500 98.9078700 + 41.6749500 98.8679400 + 41.7247000 98.8433100 +1422 1422 -1 19 41.49120 98.68251 + 41.6500200 98.6538200 + 41.6210700 98.6261100 + 41.5424200 98.6231700 + 41.4531300 98.6596800 + 41.3750300 98.6302000 + 41.3733700 98.7097300 + 41.3332100 98.7479600 + 41.3323500 98.7877000 + 41.3511400 98.8282400 + 41.3499600 98.8812300 + 41.4461300 98.9781300 + 41.4657800 98.9789700 + 41.4508800 98.7658400 + 41.4312200 98.7650700 + 41.4317900 98.7385300 + 41.5506000 98.7032700 + 41.6191400 98.7192200 + 41.6489100 98.7070500 + 41.6500200 98.6538200 +1423 1423 -1 13 41.38090 98.60086 + 41.5424200 98.6231700 + 41.4845100 98.5678600 + 41.4257900 98.5524400 + 41.4170000 98.4990300 + 41.2605000 98.4537600 + 41.2305000 98.4791900 + 41.2193700 98.5449800 + 41.2663700 98.6526400 + 41.3332100 98.7479600 + 41.3733700 98.7097300 + 41.3750300 98.6302000 + 41.4531300 98.6596800 + 41.5424200 98.6231700 +1424 1424 -1 20 41.46640 98.49505 + 41.5468400 98.3972700 + 41.4684300 98.3813200 + 41.4200100 98.3398600 + 41.3118700 98.3362700 + 41.2819000 98.3617700 + 41.2909900 98.4018200 + 41.4175200 98.4725000 + 41.4170000 98.4990300 + 41.4257900 98.5524400 + 41.4845100 98.5678600 + 41.5424200 98.6231700 + 41.6210700 98.6261100 + 41.6500200 98.6538200 + 41.6508400 98.6139000 + 41.6311800 98.6131700 + 41.6319800 98.5732600 + 41.6327700 98.5333400 + 41.5939700 98.5053300 + 41.5949900 98.4521400 + 41.5468400 98.3972700 +1425 1425 -1 19 41.27230 98.33995 + 41.4020100 98.2463700 + 41.2856300 98.1499300 + 41.2268800 98.1349100 + 41.1145700 98.3694000 + 41.1135700 98.4222300 + 41.2020300 98.4252600 + 41.2209300 98.4656200 + 41.1999800 98.5310500 + 41.2193700 98.5449800 + 41.2305000 98.4791900 + 41.2605000 98.4537600 + 41.4170000 98.4990300 + 41.4175200 98.4725000 + 41.2909900 98.4018200 + 41.2819000 98.3617700 + 41.3118700 98.3362700 + 41.4200100 98.3398600 + 41.4310300 98.2738500 + 41.4020100 98.2463700 +1426 1426 -1 11 41.31990 98.07302 + 41.3762700 98.0200600 + 41.3680600 97.9137300 + 41.3387700 97.8996700 + 41.2793900 97.9245600 + 41.2268800 98.1349100 + 41.2856300 98.1499300 + 41.4020100 98.2463700 + 41.4129800 98.1803700 + 41.3741100 98.1526300 + 41.3649400 98.1125600 + 41.3762700 98.0200600 +1427 1427 -1 14 41.78970 98.69801 + 41.8312500 98.4470600 + 41.8216700 98.4333700 + 41.8020000 98.4326900 + 41.7233300 98.4299600 + 41.7018700 98.5225100 + 41.7215300 98.5232200 + 41.7385200 98.6571700 + 41.7857200 98.7523700 + 41.7969700 98.6860800 + 41.7502400 98.5642600 + 41.8095100 98.5530900 + 41.8775600 98.5956500 + 41.7512900 98.5109600 + 41.8312500 98.4470600 +1428 1428 -1 19 41.66610 98.33966 + 41.7761200 98.2316800 + 41.7171100 98.2298000 + 41.6207900 98.1069600 + 41.5912900 98.1060700 + 41.5307400 98.1973100 + 41.5302800 98.2238800 + 41.5693800 98.2384200 + 41.5979400 98.2925600 + 41.5468400 98.3972700 + 41.5949900 98.4521400 + 41.5939700 98.5053300 + 41.6327700 98.5333400 + 41.6319800 98.5732600 + 41.7016100 98.5358300 + 41.7018700 98.5225100 + 41.7233300 98.4299600 + 41.8020000 98.4326900 + 41.7857200 98.2453300 + 41.7761200 98.2316800 +1429 1429 -1 17 41.49290 98.20386 + 41.6207900 98.1069600 + 41.5042900 98.0104400 + 41.3762700 98.0200600 + 41.3649400 98.1125600 + 41.3741100 98.1526300 + 41.4129800 98.1803700 + 41.4020100 98.2463700 + 41.4310300 98.2738500 + 41.4200100 98.3398600 + 41.4684300 98.3813200 + 41.5468400 98.3972700 + 41.5979400 98.2925600 + 41.5693800 98.2384200 + 41.5302800 98.2238800 + 41.5307400 98.1973100 + 41.5912900 98.1060700 + 41.6207900 98.1069600 +1430 1430 -1 19 41.55790 97.97990 + 41.7672000 98.1780500 + 41.7184700 98.1498700 + 41.6319100 98.0274100 + 41.5925800 98.0262800 + 41.5833700 97.9861000 + 41.5245700 97.9711500 + 41.4185800 97.8222000 + 41.4297000 97.7295700 + 41.3707000 97.7281200 + 41.3692300 97.8341800 + 41.3387700 97.8996700 + 41.3680600 97.9137300 + 41.3762700 98.0200600 + 41.5042900 98.0104400 + 41.6207900 98.1069600 + 41.7171100 98.2298000 + 41.7761200 98.2316800 + 41.7770300 98.1783500 + 41.7672000 98.1780500 +1431 1431 -1 21 41.87420 98.27620 + 41.9346300 98.1698900 + 41.9162800 98.0891200 + 41.8777800 98.0345400 + 41.8482700 98.0336800 + 41.8083000 98.0725600 + 41.7689600 98.0713900 + 41.7672000 98.1780500 + 41.7770300 98.1783500 + 41.7761200 98.2316800 + 41.7857200 98.2453300 + 41.8020000 98.4326900 + 41.8216700 98.4333700 + 41.8312500 98.4470600 + 41.8229100 98.3666700 + 41.8728200 98.3282800 + 41.9212600 98.3700000 + 41.9288400 98.4905900 + 41.9676600 98.5187200 + 41.9812500 98.3185100 + 41.9428600 98.2637500 + 41.9346300 98.1698900 +1432 1432 -1 19 41.63380 97.95381 + 41.8482700 98.0336800 + 41.8491100 97.9802900 + 41.7905000 97.9519500 + 41.7523500 97.8708700 + 41.7228400 97.8700900 + 41.7237900 97.8034700 + 41.6742400 97.8288300 + 41.5475100 97.7457700 + 41.4297000 97.7295700 + 41.4185800 97.8222000 + 41.5245700 97.9711500 + 41.5833700 97.9861000 + 41.5925800 98.0262800 + 41.6319100 98.0274100 + 41.7184700 98.1498700 + 41.7672000 98.1780500 + 41.7689600 98.0713900 + 41.8083000 98.0725600 + 41.8482700 98.0336800 +1434 1434 -1 18 41.54720 97.70525 + 41.5485700 97.6660200 + 41.5194100 97.6387500 + 41.5009000 97.5453100 + 41.4714000 97.5446600 + 41.4724800 97.4517200 + 41.4340200 97.3712800 + 41.4143600 97.3709000 + 41.4027300 97.5298800 + 41.4010700 97.6625300 + 41.3812400 97.6753200 + 41.3712300 97.6883500 + 41.3707000 97.7281200 + 41.4297000 97.7295700 + 41.5475100 97.7457700 + 41.6742400 97.8288300 + 41.7237900 97.8034700 + 41.7048600 97.7496800 + 41.5485700 97.6660200 +1601 1601 -1 43 42.04000 95.64500 + 42.1200000 95.7500000 + 42.1700000 95.7200000 + 42.2000000 95.6700000 + 42.2200000 95.6300000 + 42.3000000 95.5200000 + 42.2800000 95.4500000 + 42.3000000 95.4300000 + 42.3000000 95.4000000 + 42.2700000 95.3800000 + 42.2800000 95.3500000 + 42.2700000 95.3200000 + 42.2300000 95.3300000 + 42.2200000 95.3700000 + 42.2000000 95.3800000 + 42.2000000 95.4000000 + 42.1700000 95.4200000 + 42.1200000 95.3800000 + 42.1000000 95.4200000 + 42.0800000 95.4800000 + 42.0300000 95.5500000 + 42.0300000 95.5800000 + 42.0200000 95.6300000 + 42.0000000 95.6700000 + 42.0000000 95.6800000 + 41.9300000 95.7000000 + 41.9200000 95.7500000 + 41.8700000 95.7500000 + 41.8500000 95.8200000 + 41.8000000 95.8500000 + 41.8000000 95.8700000 + 41.7800000 95.9000000 + 41.8300000 95.9300000 + 41.8500000 95.9700000 + 41.9000000 95.9500000 + 41.9200000 95.9300000 + 41.9700000 95.9200000 + 41.9800000 95.8700000 + 42.0200000 95.8500000 + 42.0300000 95.8300000 + 42.0700000 95.8300000 + 42.0800000 95.8000000 + 42.0800000 95.7700000 + 42.1200000 95.7500000 +1602 1602 -1 74 42.12500 95.20283 + 42.6300000 95.2800000 + 42.6000000 95.2000000 + 42.5800000 95.1300000 + 42.5200000 95.1000000 + 42.5000000 95.1200000 + 42.4700000 95.1000000 + 42.3700000 95.0800000 + 42.3200000 95.0700000 + 42.3200000 95.0300000 + 42.2700000 95.0500000 + 42.2300000 95.0300000 + 42.2200000 95.0000000 + 42.2000000 95.0200000 + 42.1500000 95.0300000 + 42.1200000 95.0200000 + 42.0800000 95.0200000 + 42.0700000 95.0200000 + 42.0500000 95.0300000 + 42.0300000 95.0300000 + 42.0200000 95.0500000 + 42.0300000 95.0800000 + 42.0200000 95.1300000 + 42.0200000 95.1500000 + 42.0000000 95.1800000 + 41.9800000 95.2300000 + 41.9500000 95.2300000 + 41.9500000 95.2800000 + 41.9200000 95.2800000 + 41.9200000 95.3000000 + 41.9000000 95.3800000 + 41.8700000 95.4000000 + 41.8800000 95.4300000 + 41.8500000 95.4200000 + 41.8000000 95.4800000 + 41.7800000 95.4800000 + 41.7700000 95.5200000 + 41.7200000 95.5500000 + 41.7300000 95.5800000 + 41.6500000 95.6300000 + 41.6300000 95.6300000 + 41.6200000 95.6500000 + 41.6200000 95.7200000 + 41.6500000 95.7800000 + 41.6500000 95.8000000 + 41.7000000 95.8000000 + 41.7700000 95.7300000 + 41.8000000 95.7300000 + 41.8200000 95.7000000 + 41.8700000 95.7000000 + 41.8800000 95.6700000 + 41.9200000 95.6500000 + 41.9300000 95.6200000 + 41.9800000 95.5800000 + 42.0000000 95.5700000 + 42.0300000 95.5500000 + 42.0800000 95.4800000 + 42.1000000 95.4200000 + 42.1200000 95.3800000 + 42.1700000 95.4200000 + 42.2000000 95.4000000 + 42.2000000 95.3800000 + 42.2200000 95.3700000 + 42.2300000 95.3300000 + 42.2700000 95.3200000 + 42.2800000 95.2500000 + 42.3200000 95.2200000 + 42.3500000 95.2200000 + 42.3700000 95.2300000 + 42.4300000 95.2300000 + 42.4500000 95.2700000 + 42.5200000 95.2800000 + 42.5300000 95.3000000 + 42.5700000 95.3000000 + 42.6300000 95.2800000 +1603 WEEPING WATER CR. AT UNION NE -1 262 40.81000 96.30667 + 40.7912500 95.9108130 + 40.7850210 95.9087500 + 40.7808130 95.9087500 + 40.7787500 95.9066880 + 40.7766880 95.9004170 + 40.7683130 95.9004170 + 40.7620830 95.9066460 + 40.7620830 95.9108540 + 40.7599790 95.9129170 + 40.7579170 95.9150210 + 40.7516880 95.9212500 + 40.7433130 95.9212500 + 40.7412500 95.9233540 + 40.7391460 95.9254170 + 40.7370830 95.9233130 + 40.7308130 95.9212500 + 40.7287500 95.9233130 + 40.7287500 95.9400210 + 40.7266880 95.9420830 + 40.7224790 95.9420830 + 40.7204170 95.9441880 + 40.7183540 95.9462500 + 40.7141460 95.9462500 + 40.7120830 95.9483540 + 40.7099790 95.9504170 + 40.7079170 95.9525210 + 40.7058540 95.9545830 + 40.7016460 95.9545830 + 40.6995830 95.9545830 + 40.6954170 95.9733540 + 40.6975210 95.9754170 + 40.6995830 95.9775210 + 40.7058130 95.9837500 + 40.7141880 95.9837500 + 40.7162500 95.9858540 + 40.7183540 95.9879170 + 40.7204170 95.9899790 + 40.7204170 96.0316880 + 40.7225210 96.0337500 + 40.7245830 96.0358130 + 40.7245830 96.0400210 + 40.7224790 96.0420830 + 40.7204170 96.0441880 + 40.7225210 96.0462500 + 40.7245830 96.0483130 + 40.7245830 96.0525210 + 40.7266880 96.0545830 + 40.7287500 96.0566880 + 40.7308540 96.0587500 + 40.7329170 96.0608130 + 40.7329170 96.0733540 + 40.7349790 96.0754170 + 40.7391880 96.0754170 + 40.7412500 96.0775210 + 40.7433540 96.0795830 + 40.7454170 96.0816460 + 40.7474790 96.0879170 + 40.7516880 96.0879170 + 40.7620830 96.0983130 + 40.7620830 96.1275210 + 40.7641880 96.1295830 + 40.7662500 96.1316460 + 40.7662500 96.1358540 + 40.7683540 96.1379170 + 40.7704170 96.1399790 + 40.7704170 96.1441880 + 40.7725210 96.1462500 + 40.7745830 96.1483130 + 40.7745830 96.1816880 + 40.7766880 96.1837500 + 40.7787500 96.1858540 + 40.7808540 96.1879170 + 40.7829170 96.1899790 + 40.7829170 96.1941880 + 40.7849790 96.1962500 + 40.7891880 96.1962500 + 40.7912500 96.1983540 + 40.7933130 96.2004170 + 40.8016880 96.2004170 + 40.8037500 96.2025210 + 40.8058130 96.2045830 + 40.8141880 96.2045830 + 40.8162500 96.2066880 + 40.8183540 96.2087500 + 40.8204170 96.2108540 + 40.8225210 96.2129170 + 40.8245830 96.2150210 + 40.8266460 96.2170830 + 40.8308540 96.2170830 + 40.8329170 96.2191460 + 40.8329170 96.2358540 + 40.8350210 96.2379170 + 40.8370830 96.2399790 + 40.8370830 96.2441880 + 40.8391880 96.2462500 + 40.8412500 96.2483130 + 40.8412500 96.2525210 + 40.8391460 96.2545830 + 40.8370830 96.2566460 + 40.8370830 96.2608540 + 40.8349790 96.2629170 + 40.8329170 96.2691880 + 40.8308130 96.2712500 + 40.8287500 96.2733540 + 40.8266880 96.2754170 + 40.8058130 96.2754170 + 40.8037500 96.2775210 + 40.8016880 96.2795830 + 40.7933130 96.2795830 + 40.7912500 96.2816880 + 40.7891460 96.2837500 + 40.7870830 96.2858130 + 40.7870830 96.2900210 + 40.7891880 96.2920830 + 40.7912500 96.2941460 + 40.7912500 96.3066880 + 40.7933540 96.3087500 + 40.7954170 96.3108130 + 40.7954170 96.3233540 + 40.7975210 96.3254170 + 40.7995830 96.3275210 + 40.8016880 96.3295830 + 40.8037500 96.3316880 + 40.8058540 96.3337500 + 40.8079170 96.3358540 + 40.8100210 96.3379170 + 40.8120830 96.3399790 + 40.8120830 96.3650210 + 40.8141460 96.3670830 + 40.8183540 96.3670830 + 40.8204170 96.3691460 + 40.8204170 96.3775210 + 40.8183130 96.3795830 + 40.8162500 96.3816880 + 40.8183540 96.3837500 + 40.8204170 96.3858540 + 40.8225210 96.3879170 + 40.8245830 96.3899790 + 40.8245830 96.3941880 + 40.8245830 96.3962500 + 40.8266880 96.3962500 + 40.8287500 96.3983130 + 40.8308130 96.4004170 + 40.8391880 96.4004170 + 40.8412500 96.3983540 + 40.8433130 96.3962500 + 40.8766880 96.3962500 + 40.8787500 96.3941880 + 40.8808130 96.3920830 + 40.8829170 96.3900210 + 40.8829170 96.3858130 + 40.8849790 96.3837500 + 40.8870830 96.3816880 + 40.8870830 96.3399790 + 40.8850210 96.3379170 + 40.8808130 96.3379170 + 40.8787500 96.3358540 + 40.8787500 96.3274790 + 40.8808130 96.3254170 + 40.8850210 96.3254170 + 40.8891460 96.3212500 + 40.8933540 96.3212500 + 40.8954170 96.3191880 + 40.8954170 96.3108130 + 40.8974790 96.3087500 + 40.9016880 96.3087500 + 40.9037500 96.3066880 + 40.9058130 96.3045830 + 40.9079170 96.3025210 + 40.9079170 96.2941460 + 40.9225210 96.2837500 + 40.9245830 96.2837500 + 40.9245830 96.2816460 + 40.9266460 96.2795830 + 40.9287500 96.2775210 + 40.9287500 96.2691460 + 40.9266880 96.2670830 + 40.9245830 96.2650210 + 40.9245830 96.2566460 + 40.9225210 96.2545830 + 40.9204170 96.2525210 + 40.9204170 96.2399790 + 40.9183540 96.2379170 + 40.9162500 96.2358540 + 40.9141880 96.2337500 + 40.9120830 96.2316880 + 40.9120830 96.1983130 + 40.9141460 96.1962500 + 40.9162500 96.1941880 + 40.9162500 96.1899790 + 40.9183130 96.1879170 + 40.9204170 96.1858540 + 40.9224790 96.1837500 + 40.9266880 96.1837500 + 40.9287500 96.1816880 + 40.9287500 96.1733130 + 40.9162500 96.1545830 + 40.9141460 96.1545830 + 40.9120830 96.1441460 + 40.9100210 96.1420830 + 40.9079170 96.1400210 + 40.9058540 96.1337500 + 40.9037500 96.1316880 + 40.9037500 96.1149790 + 40.9016880 96.1129170 + 40.8995830 96.1108540 + 40.8995830 96.0899790 + 40.9016460 96.0879170 + 40.9141880 96.0879170 + 40.9162500 96.0774790 + 40.9141880 96.0754170 + 40.9120830 96.0441460 + 40.9141460 96.0420830 + 40.9162500 96.0400210 + 40.9162500 96.0024790 + 40.9141880 96.0004170 + 40.9120830 95.9983540 + 40.9100210 95.9962500 + 40.9079170 95.9941880 + 40.9079170 95.9899790 + 40.9099790 95.9879170 + 40.9120830 95.9858540 + 40.9100210 95.9837500 + 40.9079170 95.9816880 + 40.9079170 95.9774790 + 40.9058540 95.9754170 + 40.9037500 95.9733540 + 40.9037500 95.9608130 + 40.8891460 95.9587500 + 40.8870830 95.9566880 + 40.8870830 95.9399790 + 40.8850210 95.9379170 + 40.8808130 95.9379170 + 40.8787500 95.9358540 + 40.8787500 95.9316460 + 40.8766880 95.9295830 + 40.8745830 95.9275210 + 40.8725210 95.9254170 + 40.8683130 95.9254170 + 40.8662500 95.9233540 + 40.8641880 95.9212500 + 40.8620830 95.9191880 + 40.8620830 95.9149790 + 40.8600210 95.9129170 + 40.8558130 95.9129170 + 40.8537500 95.9108540 + 40.8516880 95.9087500 + 40.8495830 95.9108130 + 40.8475210 95.9129170 + 40.8412500 95.9108540 + 40.8391880 95.9087500 + 40.8370830 95.9066880 + 40.8350210 95.9045830 + 40.8329170 95.9066460 + 40.8308540 95.9087500 + 40.8287500 95.9108130 + 40.8266880 95.9129170 + 40.8120830 95.9149790 + 40.8100210 95.9170830 + 40.8079170 95.9150210 + 40.7974790 95.9129170 + 40.7912500 95.9108130 +1604 1604 -1 40 41.62500 94.86500 + 41.7200000 94.9700000 + 41.7300000 94.9700000 + 41.7700000 94.9700000 + 41.8000000 94.9000000 + 41.8800000 94.9700000 + 41.9200000 94.9800000 + 41.9200000 94.9500000 + 41.9200000 94.9000000 + 41.8800000 94.8700000 + 41.8700000 94.8300000 + 41.8000000 94.8000000 + 41.7700000 94.7500000 + 41.7000000 94.7200000 + 41.6500000 94.6700000 + 41.6300000 94.6700000 + 41.6200000 94.6500000 + 41.6000000 94.7000000 + 41.5800000 94.7000000 + 41.5700000 94.6700000 + 41.5300000 94.6700000 + 41.5200000 94.7000000 + 41.5000000 94.7200000 + 41.5000000 94.7300000 + 41.4500000 94.8200000 + 41.4700000 94.8300000 + 41.4500000 94.8700000 + 41.4300000 94.8700000 + 41.3800000 95.0300000 + 41.3300000 95.0700000 + 41.3500000 95.0800000 + 41.4300000 95.0800000 + 41.4500000 95.0700000 + 41.5300000 95.0500000 + 41.5500000 95.0500000 + 41.5800000 94.9800000 + 41.5800000 94.9700000 + 41.6200000 94.9300000 + 41.6500000 94.9700000 + 41.6800000 94.9500000 + 41.7200000 94.9700000 +1605 1605 -1 22 41.41500 94.85500 + 41.5300000 94.6700000 + 41.4800000 94.6300000 + 41.4500000 94.7300000 + 41.4000000 94.7500000 + 41.4000000 94.7800000 + 41.3700000 94.8200000 + 41.3500000 94.8200000 + 41.3000000 94.9200000 + 41.3000000 94.9500000 + 41.3000000 95.0500000 + 41.3200000 95.0700000 + 41.3200000 95.0800000 + 41.3300000 95.0700000 + 41.3800000 95.0300000 + 41.4300000 94.8700000 + 41.4500000 94.8700000 + 41.4700000 94.8300000 + 41.4500000 94.8200000 + 41.5000000 94.7300000 + 41.5000000 94.7200000 + 41.5200000 94.7000000 + 41.5300000 94.6700000 +1606 1606 -1 27 41.22500 95.16000 + 41.3300000 95.0700000 + 41.3200000 95.0800000 + 41.3200000 95.0700000 + 41.3000000 95.0500000 + 41.2300000 95.0500000 + 41.2000000 95.0500000 + 41.2000000 95.0700000 + 41.1200000 95.1000000 + 41.1000000 95.1200000 + 41.0500000 95.1300000 + 41.0300000 95.1500000 + 41.0500000 95.1700000 + 41.0200000 95.2200000 + 41.0200000 95.2300000 + 41.0200000 95.2700000 + 41.1500000 95.2000000 + 41.2300000 95.1700000 + 41.2700000 95.1700000 + 41.2800000 95.1800000 + 41.3200000 95.2000000 + 41.3200000 95.1700000 + 41.3200000 95.1300000 + 41.3200000 95.1200000 + 41.4200000 95.1200000 + 41.4300000 95.0800000 + 41.3500000 95.0800000 + 41.3300000 95.0700000 +1607 W. NISHNABOTNA RIVER AT HANCOCK IA -1 516 41.71000 95.18167 + 41.3891460 95.3712500 + 41.4037500 95.3941460 + 41.4037500 95.4066880 + 41.4058130 95.4087500 + 41.4141880 95.4087500 + 41.4162500 95.4066460 + 41.4224790 95.4004170 + 41.4266880 95.4004170 + 41.4287500 95.4025210 + 41.4308130 95.4045830 + 41.4350210 95.4045830 + 41.4370830 95.4024790 + 41.4391460 95.4004170 + 41.4433540 95.4004170 + 41.4454170 95.3983130 + 41.4474790 95.3962500 + 41.4516880 95.3962500 + 41.4537500 95.3983130 + 41.4558130 95.4087500 + 41.4600210 95.4087500 + 41.4620830 95.4066460 + 41.4641460 95.4045830 + 41.4683540 95.4045830 + 41.4704170 95.4025210 + 41.4704170 95.3941460 + 41.4725210 95.3920830 + 41.4745830 95.3900210 + 41.4745830 95.3858130 + 41.4766460 95.3837500 + 41.4933540 95.3837500 + 41.4954170 95.3858540 + 41.4974790 95.3879170 + 41.5016880 95.3879170 + 41.5037500 95.3899790 + 41.5100210 95.4004170 + 41.5120830 95.3983130 + 41.5141880 95.3962500 + 41.5162500 95.3941460 + 41.5183130 95.3920830 + 41.5266880 95.3920830 + 41.5287500 95.3899790 + 41.5308540 95.3879170 + 41.5329170 95.3858130 + 41.5350210 95.3837500 + 41.5370830 95.3816460 + 41.5391880 95.3795830 + 41.5412500 95.3774790 + 41.5474790 95.3712500 + 41.5516880 95.3712500 + 41.5537500 95.3733130 + 41.5537500 95.3816880 + 41.5558540 95.3837500 + 41.5579170 95.3858540 + 41.5599790 95.3879170 + 41.5683540 95.3879170 + 41.5704170 95.3858130 + 41.5724790 95.3837500 + 41.5766880 95.3837500 + 41.5787500 95.3816460 + 41.5808130 95.3795830 + 41.5850210 95.3795830 + 41.5870830 95.3774790 + 41.5891460 95.3754170 + 41.5933540 95.3754170 + 41.5954170 95.3733130 + 41.5974790 95.3712500 + 41.6016880 95.3712500 + 41.6037500 95.3691460 + 41.6058130 95.3670830 + 41.6100210 95.3670830 + 41.6120830 95.3649790 + 41.6141460 95.3629170 + 41.6433540 95.3629170 + 41.6454170 95.3650210 + 41.6474790 95.3670830 + 41.6558540 95.3670830 + 41.6579170 95.3649790 + 41.6599790 95.3629170 + 41.6641880 95.3629170 + 41.6662500 95.3608130 + 41.6683540 95.3587500 + 41.6704170 95.3566460 + 41.6724790 95.3545830 + 41.7016880 95.3545830 + 41.7037500 95.3524790 + 41.7058130 95.3504170 + 41.7100210 95.3504170 + 41.7120830 95.3525210 + 41.7141880 95.3545830 + 41.7162500 95.3566460 + 41.7162500 95.3608540 + 41.7183540 95.3629170 + 41.7204170 95.3650210 + 41.7225210 95.3670830 + 41.7245830 95.3691880 + 41.7266460 95.3712500 + 41.7370830 95.3774790 + 41.7370830 95.3816880 + 41.7391880 95.3837500 + 41.7412500 95.3858130 + 41.7412500 95.3900210 + 41.7412500 95.3920830 + 41.7600210 95.3920830 + 41.7620830 95.3941460 + 41.7641460 95.3962500 + 41.7683540 95.3962500 + 41.7704170 95.3941880 + 41.7724790 95.3920830 + 41.7745830 95.3900210 + 41.7766460 95.3879170 + 41.7787500 95.3858540 + 41.7787500 95.3816460 + 41.7808130 95.3795830 + 41.7829170 95.3775210 + 41.7829170 95.3691460 + 41.7849790 95.3670830 + 41.7891880 95.3670830 + 41.7912500 95.3691460 + 41.7933130 95.3712500 + 41.7954170 95.3733130 + 41.7974790 95.3754170 + 41.8016880 95.3754170 + 41.8037500 95.3774790 + 41.8058130 95.3795830 + 41.8100210 95.3795830 + 41.8120830 95.3816460 + 41.8141460 95.3837500 + 41.8183540 95.3837500 + 41.8204170 95.3858130 + 41.8224790 95.3879170 + 41.8245830 95.3899790 + 41.8245830 95.3983540 + 41.8266460 95.4004170 + 41.8287500 95.4024790 + 41.8412500 95.4149790 + 41.8412500 95.4191880 + 41.8433130 95.4212500 + 41.8558130 95.4254170 + 41.8600210 95.4254170 + 41.8620830 95.4274790 + 41.8641460 95.4295830 + 41.8725210 95.4295830 + 41.8745830 95.4316460 + 41.8766460 95.4337500 + 41.8808540 95.4337500 + 41.8829170 95.4316880 + 41.8849790 95.4295830 + 41.8870830 95.4275210 + 41.8870830 95.4191460 + 41.8850210 95.4170830 + 41.8829170 95.4150210 + 41.8829170 95.4108130 + 41.8808540 95.4087500 + 41.8787500 95.4066880 + 41.8766880 95.4045830 + 41.8724790 95.4045830 + 41.8704170 95.4025210 + 41.8724790 95.4004170 + 41.8745830 95.3983540 + 41.8766460 95.3962500 + 41.8850210 95.3962500 + 41.8870830 95.3941880 + 41.8891460 95.3920830 + 41.8912500 95.3900210 + 41.8891880 95.3879170 + 41.8870830 95.3858540 + 41.8870830 95.3733130 + 41.8891460 95.3712500 + 41.8912500 95.3691880 + 41.8933130 95.3670830 + 41.8954170 95.3650210 + 41.8974790 95.3629170 + 41.8995830 95.3608540 + 41.8995830 95.3524790 + 41.9016460 95.3504170 + 41.9037500 95.3483540 + 41.9058130 95.3462500 + 41.9079170 95.3441880 + 41.9099790 95.3420830 + 41.9120830 95.3400210 + 41.9141460 95.3379170 + 41.9162500 95.3358540 + 41.9162500 95.3274790 + 41.9183130 95.3254170 + 41.9204170 95.3233540 + 41.9204170 95.3108130 + 41.9224790 95.3087500 + 41.9245830 95.3066880 + 41.9245830 95.2899790 + 41.9266460 95.2879170 + 41.9391880 95.2879170 + 41.9475210 95.2962500 + 41.9495830 95.2962500 + 41.9495830 95.2941460 + 41.9516460 95.2920830 + 41.9537500 95.2900210 + 41.9537500 95.2858130 + 41.9558130 95.2837500 + 41.9579170 95.2816880 + 41.9579170 95.2774790 + 41.9558540 95.2754170 + 41.9537500 95.2733540 + 41.9537500 95.2608130 + 41.9558130 95.2587500 + 41.9579170 95.2566880 + 41.9579170 95.2524790 + 41.9599790 95.2504170 + 41.9641880 95.2504170 + 41.9683130 95.2462500 + 41.9808540 95.2462500 + 41.9829170 95.2441880 + 41.9829170 95.2399790 + 41.9849790 95.2379170 + 41.9870830 95.2358540 + 41.9850210 95.2337500 + 41.9829170 95.2316880 + 41.9829170 95.2191460 + 41.9849790 95.2170830 + 41.9870830 95.2150210 + 41.9891460 95.2129170 + 41.9912500 95.2108540 + 41.9912500 95.2024790 + 41.9933130 95.2004170 + 41.9975210 95.2004170 + 41.9995830 95.1983540 + 42.0016460 95.1962500 + 42.0037500 95.1941880 + 42.0058130 95.1920830 + 42.0079170 95.1900210 + 42.0079170 95.1858130 + 42.0099790 95.1837500 + 42.0120830 95.1816880 + 42.0141460 95.1795830 + 42.0162500 95.1775210 + 42.0183130 95.1754170 + 42.0204170 95.1733540 + 42.0183540 95.1712500 + 42.0162500 95.1691880 + 42.0141880 95.1670830 + 42.0120830 95.1650210 + 42.0120830 95.1441460 + 42.0141460 95.1420830 + 42.0162500 95.1400210 + 42.0162500 95.1274790 + 42.0183130 95.1254170 + 42.0225210 95.1254170 + 42.0245830 95.1233540 + 42.0245830 95.1191460 + 42.0266460 95.1170830 + 42.0287500 95.1150210 + 42.0287500 95.1066460 + 42.0308130 95.1045830 + 42.0329170 95.1025210 + 42.0308540 95.1004170 + 42.0287500 95.0983540 + 42.0266880 95.0962500 + 42.0245830 95.0941880 + 42.0225210 95.0920830 + 42.0204170 95.0900210 + 42.0204170 95.0816460 + 42.0224790 95.0795830 + 42.0245830 95.0775210 + 42.0245830 95.0649790 + 42.0370830 95.0525210 + 42.0370830 95.0441460 + 42.0391880 95.0420830 + 42.0412500 95.0420830 + 42.0412500 95.0358130 + 42.0391880 95.0337500 + 42.0370830 95.0316880 + 42.0370830 95.0233130 + 42.0350210 95.0212500 + 42.0266460 95.0212500 + 42.0245830 95.0191880 + 42.0225210 95.0170830 + 42.0183130 95.0170830 + 42.0162500 95.0150210 + 42.0141880 95.0129170 + 42.0099790 95.0129170 + 42.0079170 95.0108540 + 42.0079170 95.0066460 + 42.0058540 95.0045830 + 41.9933130 95.0045830 + 41.9912500 95.0025210 + 41.9912500 94.9983130 + 41.9850210 94.9920830 + 41.9724790 94.9920830 + 41.9704170 94.9900210 + 41.9704170 94.9858130 + 41.9683540 94.9837500 + 41.9641460 94.9837500 + 41.9620830 94.9816880 + 41.9620830 94.9774790 + 41.9600210 94.9754170 + 41.9558130 94.9754170 + 41.9537500 94.9733540 + 41.9537500 94.9691460 + 41.9516880 94.9670830 + 41.9433130 94.9670830 + 41.9412500 94.9650210 + 41.9391880 94.9629170 + 41.9308130 94.9629170 + 41.9287500 94.9608540 + 41.9266880 94.9587500 + 41.9224790 94.9587500 + 41.9204170 94.9608130 + 41.9204170 94.9650210 + 41.9183540 94.9670830 + 41.9162500 94.9691460 + 41.9141880 94.9712500 + 41.9120830 94.9733130 + 41.9141460 94.9754170 + 41.9162500 94.9774790 + 41.9162500 94.9858540 + 41.9141880 94.9879170 + 41.9120830 94.9899790 + 41.9100210 94.9920830 + 41.9016460 94.9920830 + 41.8995830 94.9900210 + 41.8995830 94.9858130 + 41.8975210 94.9837500 + 41.8933130 94.9837500 + 41.8891880 94.9795830 + 41.8766460 94.9795830 + 41.8745830 94.9733130 + 41.8725210 94.9712500 + 41.8704170 94.9691880 + 41.8683540 94.9670830 + 41.8662500 94.9650210 + 41.8641880 94.9629170 + 41.8620830 94.9608540 + 41.8600210 94.9587500 + 41.8579170 94.9566880 + 41.8558540 94.9545830 + 41.8516460 94.9545830 + 41.8495830 94.9525210 + 41.8495830 94.9441460 + 41.8475210 94.9420830 + 41.8454170 94.9400210 + 41.8454170 94.9358130 + 41.8433540 94.9337500 + 41.8370830 94.9316880 + 41.8350210 94.9295830 + 41.8308130 94.9295830 + 41.8287500 94.9275210 + 41.8266880 94.9212500 + 41.8120830 94.9191880 + 41.8100210 94.9170830 + 41.8058130 94.9170830 + 41.7954170 94.9274790 + 41.7933540 94.9295830 + 41.7912500 94.9316460 + 41.7912500 94.9441880 + 41.7891880 94.9462500 + 41.7849790 94.9462500 + 41.7829170 94.9441880 + 41.7808540 94.9420830 + 41.7787500 94.9441460 + 41.7766880 94.9462500 + 41.7745830 94.9483130 + 41.7745830 94.9566880 + 41.7725210 94.9587500 + 41.7704170 94.9608130 + 41.7683540 94.9629170 + 41.7662500 94.9649790 + 41.7641880 94.9670830 + 41.7620830 94.9691460 + 41.7620830 94.9733540 + 41.7600210 94.9754170 + 41.7474790 94.9754170 + 41.7454170 94.9733540 + 41.7433540 94.9712500 + 41.7308130 94.9712500 + 41.7287500 94.9733130 + 41.7266880 94.9754170 + 41.7183130 94.9712500 + 41.7162500 94.9712500 + 41.7100210 94.9837500 + 41.7058130 94.9837500 + 41.7037500 94.9858130 + 41.7037500 94.9983540 + 41.7058130 95.0004170 + 41.7100210 95.0004170 + 41.7120830 95.0024790 + 41.7100210 95.0129170 + 41.7037500 95.0149790 + 41.7037500 95.0400210 + 41.7016460 95.0420830 + 41.6995830 95.0441880 + 41.6975210 95.0462500 + 41.6933130 95.0462500 + 41.6912500 95.0483130 + 41.6912500 95.0608540 + 41.6933540 95.0629170 + 41.6954170 95.0649790 + 41.6954170 95.0691880 + 41.6933130 95.0712500 + 41.6912500 95.0733540 + 41.6891460 95.0754170 + 41.6870830 95.0774790 + 41.6870830 95.1066880 + 41.6891880 95.1087500 + 41.6912500 95.1108130 + 41.6912500 95.1191880 + 41.6891460 95.1212500 + 41.6870830 95.1233130 + 41.6870830 95.1275210 + 41.6849790 95.1295830 + 41.6829170 95.1316880 + 41.6808130 95.1337500 + 41.6787500 95.1358540 + 41.6766460 95.1379170 + 41.6745830 95.1400210 + 41.6725210 95.1420830 + 41.6683130 95.1420830 + 41.6495830 95.1608130 + 41.6495830 95.1650210 + 41.6475210 95.1670830 + 41.6391460 95.1670830 + 41.6370830 95.1691880 + 41.6350210 95.1712500 + 41.6308130 95.1712500 + 41.6287500 95.1733540 + 41.6266880 95.1754170 + 41.6224790 95.1754170 + 41.6204170 95.1733130 + 41.6183130 95.1712500 + 41.6162500 95.1691460 + 41.6141460 95.1670830 + 41.6120830 95.1649790 + 41.6100210 95.1629170 + 41.6058130 95.1629170 + 41.6037500 95.1649790 + 41.6037500 95.1691880 + 41.6016460 95.1712500 + 41.5995830 95.1733540 + 41.5974790 95.1754170 + 41.5954170 95.1774790 + 41.5954170 95.1816880 + 41.5933540 95.1837500 + 41.5891460 95.1837500 + 41.5870830 95.1858540 + 41.5850210 95.1879170 + 41.5808130 95.1879170 + 41.5787500 95.1900210 + 41.5766460 95.1920830 + 41.5745830 95.1899790 + 41.5725210 95.1879170 + 41.5683130 95.1879170 + 41.5662500 95.1900210 + 41.5641880 95.1920830 + 41.5558130 95.1920830 + 41.5537500 95.1941880 + 41.5516880 95.1962500 + 41.5474790 95.1962500 + 41.5454170 95.1983130 + 41.5454170 95.2066880 + 41.5433540 95.2087500 + 41.5391460 95.2087500 + 41.5370830 95.2108540 + 41.5350210 95.2129170 + 41.5308130 95.2129170 + 41.5287500 95.2150210 + 41.5308540 95.2170830 + 41.5329170 95.2191460 + 41.5329170 95.2275210 + 41.5350210 95.2295830 + 41.5370830 95.2316460 + 41.5266880 95.2504170 + 41.5224790 95.2504170 + 41.5204170 95.2483130 + 41.5183540 95.2462500 + 41.5141460 95.2462500 + 41.5120830 95.2441880 + 41.5120830 95.2399790 + 41.5100210 95.2379170 + 41.4891460 95.2379170 + 41.4870830 95.2400210 + 41.4849790 95.2420830 + 41.4829170 95.2400210 + 41.4829170 95.2358130 + 41.4808540 95.2337500 + 41.4683130 95.2337500 + 41.4662500 95.2337500 + 41.4495830 95.2524790 + 41.4495830 95.2608540 + 41.4475210 95.2629170 + 41.4433130 95.2629170 + 41.4412500 95.2649790 + 41.4412500 95.2816880 + 41.4391880 95.2837500 + 41.4141460 95.2837500 + 41.4120830 95.2858540 + 41.4100210 95.2879170 + 41.4058130 95.2879170 + 41.4037500 95.2899790 + 41.4037500 95.3066880 + 41.4058540 95.3087500 + 41.4079170 95.3108130 + 41.4079170 95.3150210 + 41.4058540 95.3170830 + 41.4016460 95.3170830 + 41.3995830 95.3191880 + 41.3975210 95.3212500 + 41.3849790 95.3212500 + 41.3829170 95.3233540 + 41.3808130 95.3254170 + 41.3787500 95.3274790 + 41.3787500 95.3316880 + 41.3808540 95.3337500 + 41.3829170 95.3358130 + 41.3829170 95.3608540 + 41.3850210 95.3629170 + 41.3870830 95.3649790 + 41.3870830 95.3691880 + 41.3891460 95.3712500 +1608 1608 -1 51 41.31000 95.43500 + 41.4700000 95.2300000 + 41.4300000 95.2000000 + 41.4200000 95.2200000 + 41.4000000 95.2000000 + 41.3800000 95.2300000 + 41.3500000 95.2300000 + 41.2800000 95.2300000 + 41.2700000 95.2200000 + 41.2200000 95.2200000 + 41.1300000 95.2800000 + 41.0800000 95.3200000 + 41.0700000 95.3300000 + 41.0200000 95.3500000 + 41.0000000 95.3700000 + 40.9700000 95.3800000 + 40.9800000 95.4200000 + 40.9300000 95.4300000 + 40.8700000 95.5300000 + 40.8700000 95.5800000 + 40.8700000 95.6000000 + 40.8800000 95.6700000 + 40.9300000 95.6700000 + 41.0300000 95.6700000 + 41.0700000 95.6700000 + 41.1500000 95.6500000 + 41.1800000 95.6200000 + 41.2200000 95.6300000 + 41.2700000 95.6300000 + 41.3500000 95.6000000 + 41.4200000 95.5200000 + 41.5000000 95.5000000 + 41.5300000 95.4500000 + 41.6000000 95.4300000 + 41.6700000 95.3800000 + 41.7000000 95.3800000 + 41.7300000 95.4000000 + 41.7500000 95.3800000 + 41.7000000 95.3500000 + 41.6000000 95.3700000 + 41.5700000 95.3800000 + 41.5500000 95.3800000 + 41.5200000 95.4000000 + 41.4700000 95.3800000 + 41.4700000 95.4000000 + 41.4000000 95.4200000 + 41.3800000 95.3800000 + 41.3800000 95.3300000 + 41.4000000 95.3200000 + 41.4000000 95.3000000 + 41.4300000 95.2800000 + 41.4700000 95.2300000 +1609 1609 -1 63 41.08500 95.27550 + 41.5700000 95.1800000 + 41.5700000 95.1700000 + 41.4500000 95.1700000 + 41.3200000 95.2000000 + 41.2800000 95.1800000 + 41.2700000 95.1700000 + 41.2300000 95.1700000 + 41.1500000 95.2000000 + 41.0200000 95.2700000 + 41.0200000 95.2300000 + 41.0200000 95.2200000 + 41.0500000 95.1700000 + 41.0300000 95.1500000 + 41.0000000 95.1700000 + 40.9800000 95.1700000 + 40.9700000 95.1800000 + 40.8800000 95.2000000 + 40.8700000 95.2300000 + 40.8000000 95.2300000 + 40.7700000 95.3000000 + 40.7300000 95.3200000 + 40.6700000 95.3700000 + 40.6700000 95.3800000 + 40.6300000 95.4300000 + 40.6300000 95.4500000 + 40.6000000 95.5000000 + 40.6000000 95.5700000 + 40.6200000 95.6000000 + 40.6300000 95.6300000 + 40.6500000 95.6700000 + 40.7000000 95.6500000 + 40.7200000 95.6700000 + 40.7500000 95.6500000 + 40.8000000 95.6500000 + 40.8000000 95.6700000 + 40.8200000 95.6800000 + 40.8500000 95.6700000 + 40.8800000 95.6700000 + 40.8700000 95.6000000 + 40.8700000 95.5800000 + 40.8700000 95.5300000 + 40.9300000 95.4300000 + 40.9800000 95.4200000 + 40.9700000 95.3800000 + 41.0000000 95.3700000 + 41.0200000 95.3500000 + 41.0700000 95.3300000 + 41.0800000 95.3200000 + 41.1300000 95.2800000 + 41.2200000 95.2200000 + 41.2700000 95.2200000 + 41.2800000 95.2300000 + 41.3500000 95.2300000 + 41.3800000 95.2300000 + 41.4000000 95.2000000 + 41.4200000 95.2200000 + 41.4300000 95.2000000 + 41.4700000 95.2300000 + 41.5000000 95.2500000 + 41.5300000 95.2500000 + 41.5300000 95.2200000 + 41.5500000 95.2000000 + 41.5700000 95.1800000 +1610 LITTLE NEMAHA RIVER AT AUBURN NE -1 486 40.58083 96.18583 + 40.3870830 95.8129170 + 40.3787500 95.8400210 + 40.3829170 95.8441880 + 40.3808130 95.8462500 + 40.3787500 95.8525210 + 40.3766880 95.8545830 + 40.3558130 95.8545830 + 40.3537500 95.8566880 + 40.3474790 95.8629170 + 40.3454170 95.8608130 + 40.3245830 95.8587500 + 40.3329170 95.8774790 + 40.3329170 95.8900210 + 40.3349790 95.8920830 + 40.3433540 95.8920830 + 40.3454170 95.8941880 + 40.3475210 95.8962500 + 40.3495830 95.8983540 + 40.3516880 95.9004170 + 40.3537500 95.9024790 + 40.3537500 95.9066880 + 40.3558540 95.9087500 + 40.3579170 95.9108540 + 40.3600210 95.9129170 + 40.3620830 95.9149790 + 40.3620830 95.9191880 + 40.3641880 95.9212500 + 40.3662500 95.9233540 + 40.3683540 95.9254170 + 40.3704170 95.9275210 + 40.3725210 95.9295830 + 40.3787500 95.9358130 + 40.3787500 95.9400210 + 40.3808540 95.9420830 + 40.3829170 95.9441460 + 40.3829170 95.9483540 + 40.3849790 95.9504170 + 40.4079170 95.9649790 + 40.4079170 95.9983540 + 40.4100210 96.0004170 + 40.4120830 96.0024790 + 40.4120830 96.0066880 + 40.4141880 96.0087500 + 40.4162500 96.0108130 + 40.4162500 96.0191880 + 40.4183130 96.0212500 + 40.4225210 96.0212500 + 40.4245830 96.0233130 + 40.4245830 96.0316880 + 40.4266880 96.0337500 + 40.4287500 96.0358540 + 40.4308540 96.0379170 + 40.4329170 96.0399790 + 40.4329170 96.0650210 + 40.4308130 96.0670830 + 40.4287500 96.0691460 + 40.4287500 96.0775210 + 40.4266880 96.0795830 + 40.4224790 96.0795830 + 40.4204170 96.0816880 + 40.4183130 96.0837500 + 40.4162500 96.0858540 + 40.4141880 96.0879170 + 40.4058130 96.0879170 + 40.4037500 96.0900210 + 40.4016460 96.0920830 + 40.3995830 96.0941880 + 40.3975210 96.0962500 + 40.3933130 96.0962500 + 40.3912500 96.0983540 + 40.3891460 96.1004170 + 40.3870830 96.0983130 + 40.3850210 96.0962500 + 40.3808130 96.0962500 + 40.3787500 96.0941460 + 40.3766460 96.0920830 + 40.3745830 96.0900210 + 40.3704170 96.0775210 + 40.3704170 96.0691460 + 40.3683540 96.0670830 + 40.3599790 96.0670830 + 40.3579170 96.0670830 + 40.3537500 96.0774790 + 40.3537500 96.0858540 + 40.3558540 96.0879170 + 40.3579170 96.0899790 + 40.3579170 96.1025210 + 40.3558540 96.1045830 + 40.3516460 96.1045830 + 40.3495830 96.1066460 + 40.3495830 96.1191880 + 40.3474790 96.1212500 + 40.3454170 96.1233540 + 40.3474790 96.1254170 + 40.3516880 96.1254170 + 40.3537500 96.1274790 + 40.3537500 96.1316880 + 40.3558130 96.1337500 + 40.3600210 96.1337500 + 40.3620830 96.1358540 + 40.3641460 96.1379170 + 40.3766880 96.1379170 + 40.3787500 96.1399790 + 40.3787500 96.1608540 + 40.3808130 96.1629170 + 40.3850210 96.1629170 + 40.3891460 96.1670830 + 40.3975210 96.1670830 + 40.3995830 96.1691880 + 40.4016880 96.1712500 + 40.4037500 96.1733130 + 40.4037500 96.1816880 + 40.4037500 96.1837500 + 40.4141460 96.1920830 + 40.4183540 96.1920830 + 40.4204170 96.1941460 + 40.4204170 96.2191880 + 40.4224790 96.2212500 + 40.4266880 96.2212500 + 40.4287500 96.2233540 + 40.4308540 96.2254170 + 40.4329170 96.2274790 + 40.4329170 96.2316880 + 40.4370830 96.2358130 + 40.4370830 96.2400210 + 40.4350210 96.2420830 + 40.4308130 96.2420830 + 40.4287500 96.2525210 + 40.4308540 96.2545830 + 40.4329170 96.2566460 + 40.4329170 96.2608540 + 40.4308130 96.2629170 + 40.4287500 96.2650210 + 40.4308540 96.2670830 + 40.4329170 96.2691880 + 40.4350210 96.2712500 + 40.4370830 96.2733540 + 40.4391460 96.2754170 + 40.4433540 96.2754170 + 40.4454170 96.2775210 + 40.4475210 96.2795830 + 40.4495830 96.2816460 + 40.4495830 96.2858540 + 40.4537500 96.2899790 + 40.4537500 96.3066880 + 40.4558540 96.3087500 + 40.4579170 96.3108540 + 40.4600210 96.3129170 + 40.4620830 96.3149790 + 40.4620830 96.3233540 + 40.4641460 96.3254170 + 40.4683540 96.3254170 + 40.4704170 96.3274790 + 40.4704170 96.3358540 + 40.4683130 96.3379170 + 40.4662500 96.3400210 + 40.4683540 96.3420830 + 40.4704170 96.3441460 + 40.4704170 96.3525210 + 40.4725210 96.3545830 + 40.4745830 96.3566460 + 40.4745830 96.3608540 + 40.4766460 96.3629170 + 40.4933540 96.3629170 + 40.4954170 96.3650210 + 40.4974790 96.3670830 + 40.5016880 96.3670830 + 40.5037500 96.3691880 + 40.5058130 96.3712500 + 40.5204170 96.3774790 + 40.5204170 96.3941880 + 40.5225210 96.3962500 + 40.5245830 96.3983130 + 40.5329170 96.4191460 + 40.5329170 96.4275210 + 40.5350210 96.4295830 + 40.5370830 96.4316880 + 40.5391460 96.4337500 + 40.5433540 96.4337500 + 40.5454170 96.4358540 + 40.5475210 96.4379170 + 40.5495830 96.4400210 + 40.5516460 96.4420830 + 40.5579170 96.4441460 + 40.5579170 96.4483540 + 40.5600210 96.4504170 + 40.5620830 96.4524790 + 40.5620830 96.4566880 + 40.5641880 96.4587500 + 40.5662500 96.4608130 + 40.5662500 96.4650210 + 40.5683540 96.4670830 + 40.5704170 96.4691880 + 40.5725210 96.4712500 + 40.5745830 96.4733540 + 40.5766880 96.4754170 + 40.5787500 96.4774790 + 40.5787500 96.4900210 + 40.5808540 96.4920830 + 40.5829170 96.4941880 + 40.5850210 96.4962500 + 40.5870830 96.4983540 + 40.5891880 96.5004170 + 40.5912500 96.5025210 + 40.5933130 96.5045830 + 40.6016880 96.5045830 + 40.6037500 96.5066880 + 40.6058130 96.5087500 + 40.6120830 96.5108540 + 40.6120830 96.5129170 + 40.6224790 96.5212500 + 40.6308540 96.5212500 + 40.6329170 96.5233130 + 40.6329170 96.5275210 + 40.6350210 96.5295830 + 40.6370830 96.5316880 + 40.6391460 96.5337500 + 40.6433540 96.5337500 + 40.6495830 96.5399790 + 40.6495830 96.5441880 + 40.6537500 96.5483130 + 40.6579170 96.5566460 + 40.6599790 96.5629170 + 40.6683540 96.5629170 + 40.6724790 96.5670830 + 40.6808130 96.5712500 + 40.6891880 96.5712500 + 40.6912500 96.5733540 + 40.6933130 96.5754170 + 40.6975210 96.5754170 + 40.6995830 96.5754170 + 40.6995830 96.5649790 + 40.7016460 96.5629170 + 40.7058540 96.5629170 + 40.7079170 96.5608540 + 40.7079170 96.5524790 + 40.7099790 96.5504170 + 40.7120830 96.5483540 + 40.7120830 96.5274790 + 40.7141460 96.5254170 + 40.7162500 96.5233540 + 40.7183130 96.5212500 + 40.7225210 96.5212500 + 40.7245830 96.5233130 + 40.7266460 96.5254170 + 40.7308540 96.5254170 + 40.7329170 96.5233540 + 40.7349790 96.5212500 + 40.7370830 96.5191880 + 40.7391460 96.5170830 + 40.7412500 96.5150210 + 40.7433130 96.5129170 + 40.7579170 96.5108540 + 40.7620830 96.5066880 + 40.7620830 96.4983130 + 40.7641460 96.4962500 + 40.7683130 96.4920830 + 40.7725210 96.4920830 + 40.7745830 96.4941460 + 40.7766460 96.4962500 + 40.7829170 96.4941880 + 40.7849790 96.4920830 + 40.8100210 96.4920830 + 40.8120830 96.4941460 + 40.8141460 96.4962500 + 40.8183540 96.4962500 + 40.8204170 96.4941880 + 40.8204170 96.4899790 + 40.8183540 96.4879170 + 40.8162500 96.4858540 + 40.8162500 96.4733130 + 40.8141880 96.4712500 + 40.8120830 96.4691880 + 40.8162500 96.4566880 + 40.8162500 96.4066460 + 40.8204170 96.4025210 + 40.8204170 96.3983130 + 40.8225210 96.3962500 + 40.8245830 96.3962500 + 40.8245830 96.3899790 + 40.8225210 96.3879170 + 40.8204170 96.3858540 + 40.8183540 96.3837500 + 40.8162500 96.3816880 + 40.8183130 96.3795830 + 40.8204170 96.3775210 + 40.8204170 96.3691460 + 40.8183540 96.3670830 + 40.8141460 96.3670830 + 40.8120830 96.3650210 + 40.8120830 96.3399790 + 40.8100210 96.3379170 + 40.8079170 96.3358540 + 40.8058540 96.3337500 + 40.8037500 96.3316880 + 40.8016880 96.3295830 + 40.7995830 96.3275210 + 40.7975210 96.3254170 + 40.7954170 96.3233540 + 40.7954170 96.3108130 + 40.7933540 96.3087500 + 40.7912500 96.3066880 + 40.7912500 96.2941460 + 40.7891880 96.2920830 + 40.7870830 96.2900210 + 40.7870830 96.2858130 + 40.7891460 96.2837500 + 40.7912500 96.2816880 + 40.7933130 96.2795830 + 40.8016880 96.2795830 + 40.8037500 96.2775210 + 40.8058130 96.2754170 + 40.8266880 96.2754170 + 40.8287500 96.2733540 + 40.8308130 96.2712500 + 40.8329170 96.2691880 + 40.8329170 96.2649790 + 40.8349790 96.2629170 + 40.8370830 96.2608540 + 40.8370830 96.2566460 + 40.8391460 96.2545830 + 40.8412500 96.2525210 + 40.8412500 96.2483130 + 40.8391880 96.2462500 + 40.8370830 96.2441880 + 40.8370830 96.2399790 + 40.8350210 96.2379170 + 40.8329170 96.2358540 + 40.8329170 96.2191460 + 40.8308540 96.2170830 + 40.8266460 96.2170830 + 40.8245830 96.2150210 + 40.8225210 96.2129170 + 40.8204170 96.2108540 + 40.8183540 96.2087500 + 40.8162500 96.2066880 + 40.8141880 96.2045830 + 40.8058130 96.2045830 + 40.8037500 96.2025210 + 40.8016880 96.2004170 + 40.7933130 96.2004170 + 40.7912500 96.1983540 + 40.7891880 96.1962500 + 40.7849790 96.1962500 + 40.7829170 96.1941880 + 40.7829170 96.1899790 + 40.7808540 96.1879170 + 40.7766880 96.1837500 + 40.7745830 96.1816880 + 40.7745830 96.1483130 + 40.7725210 96.1462500 + 40.7704170 96.1441880 + 40.7704170 96.1399790 + 40.7683540 96.1379170 + 40.7662500 96.1358540 + 40.7662500 96.1316460 + 40.7641880 96.1295830 + 40.7620830 96.1275210 + 40.7620830 96.0983130 + 40.7600210 96.0962500 + 40.7579170 96.0941880 + 40.7558540 96.0920830 + 40.7537500 96.0900210 + 40.7516880 96.0879170 + 40.7474790 96.0879170 + 40.7454170 96.0858540 + 40.7454170 96.0816460 + 40.7433540 96.0795830 + 40.7412500 96.0775210 + 40.7391880 96.0754170 + 40.7349790 96.0754170 + 40.7329170 96.0733540 + 40.7329170 96.0608130 + 40.7308540 96.0587500 + 40.7287500 96.0566880 + 40.7266880 96.0545830 + 40.7245830 96.0525210 + 40.7245830 96.0483130 + 40.7225210 96.0462500 + 40.7204170 96.0441880 + 40.7224790 96.0420830 + 40.7245830 96.0400210 + 40.7245830 96.0358130 + 40.7225210 96.0337500 + 40.7204170 96.0316880 + 40.7204170 95.9899790 + 40.7058130 95.9837500 + 40.6974790 95.9712500 + 40.6995830 95.9691880 + 40.6995830 95.9524790 + 40.6975210 95.9504170 + 40.6891460 95.9504170 + 40.6870830 95.9483540 + 40.6870830 95.9441460 + 40.6850210 95.9420830 + 40.6808130 95.9420830 + 40.6787500 95.9441460 + 40.6766880 95.9462500 + 40.6683130 95.9462500 + 40.6662500 95.9441880 + 40.6641880 95.9420830 + 40.6558130 95.9420830 + 40.6537500 95.9400210 + 40.6516880 95.9379170 + 40.6474790 95.9379170 + 40.6454170 95.9358540 + 40.6454170 95.9316460 + 40.6433540 95.9295830 + 40.6308130 95.9295830 + 40.6287500 95.9316460 + 40.6287500 95.9358540 + 40.6245830 95.9358540 + 40.6245830 95.9274790 + 40.6266460 95.9254170 + 40.6287500 95.9233540 + 40.6308130 95.9212500 + 40.6329170 95.9191880 + 40.6329170 95.8983130 + 40.6287500 95.8941880 + 40.6266880 95.8920830 + 40.6224790 95.8920830 + 40.6204170 95.8900210 + 40.6183540 95.8879170 + 40.6099790 95.8879170 + 40.6079170 95.8858540 + 40.6037500 95.8816880 + 40.6016880 95.8754170 + 40.5766460 95.8754170 + 40.5745830 95.8733540 + 40.5745830 95.8691460 + 40.5725210 95.8670830 + 40.5683130 95.8670830 + 40.5662500 95.8650210 + 40.5641880 95.8629170 + 40.5433130 95.8629170 + 40.5412500 95.8608540 + 40.5391880 95.8587500 + 40.5370830 95.8566880 + 40.5329170 95.8525210 + 40.5308540 95.8504170 + 40.5266460 95.8504170 + 40.5245830 95.8483540 + 40.5225210 95.8462500 + 40.5141460 95.8462500 + 40.5120830 95.8441880 + 40.5100210 95.8420830 + 40.5058130 95.8420830 + 40.5037500 95.8400210 + 40.5016880 95.8379170 + 40.4933130 95.8379170 + 40.4912500 95.8399790 + 40.4891880 95.8420830 + 40.4870830 95.8400210 + 40.4850210 95.8379170 + 40.4829170 95.8358540 + 40.4808540 95.8337500 + 40.4787500 95.8316880 + 40.4766880 95.8295830 + 40.4683130 95.8295830 + 40.4662500 95.8275210 + 40.4641880 95.8254170 + 40.4620830 95.8233540 + 40.4620830 95.8191460 + 40.4600210 95.8170830 + 40.4579170 95.8150210 + 40.4579170 95.8108130 + 40.4537500 95.8024790 + 40.4516880 95.8004170 + 40.4495830 95.7983540 + 40.4475210 95.7962500 + 40.4454170 95.7941880 + 40.4433540 95.7920830 + 40.4412500 95.7900210 + 40.4391880 95.7879170 + 40.4349790 95.7879170 + 40.4266460 95.7920830 + 40.4245830 95.7941460 + 40.4245830 95.7983540 + 40.4225210 95.8004170 + 40.4204170 95.8024790 + 40.4183540 95.8045830 + 40.4141460 95.8045830 + 40.4120830 95.8066460 + 40.4100210 95.8087500 + 40.3974790 95.8087500 + 40.3870830 95.8129170 +1611 1611 -1 30 40.95000 95.17500 + 41.2000000 95.0500000 + 41.1300000 95.0500000 + 41.1200000 95.0500000 + 41.0800000 95.0500000 + 41.0700000 95.0300000 + 41.0000000 95.0500000 + 41.0000000 95.0700000 + 40.9500000 95.0500000 + 40.9300000 95.0500000 + 40.8700000 95.0700000 + 40.7800000 95.0800000 + 40.7700000 95.0800000 + 40.7500000 95.0800000 + 40.7300000 95.1000000 + 40.7000000 95.1300000 + 40.7000000 95.2200000 + 40.7300000 95.3200000 + 40.7700000 95.3000000 + 40.8000000 95.2300000 + 40.8700000 95.2300000 + 40.8800000 95.2000000 + 40.9700000 95.1800000 + 40.9800000 95.1700000 + 41.0000000 95.1700000 + 41.0300000 95.1500000 + 41.0500000 95.1300000 + 41.1000000 95.1200000 + 41.1200000 95.1000000 + 41.2000000 95.0700000 + 41.2000000 95.0500000 +1612 1612 -1 29 40.53000 95.30500 + 40.7300000 95.3200000 + 40.7000000 95.2200000 + 40.7000000 95.1300000 + 40.6800000 95.1300000 + 40.6200000 95.1800000 + 40.5700000 95.1800000 + 40.5500000 95.1800000 + 40.5000000 95.1800000 + 40.4800000 95.2000000 + 40.4800000 95.2300000 + 40.4200000 95.2800000 + 40.4200000 95.3200000 + 40.4000000 95.3500000 + 40.3800000 95.3700000 + 40.3500000 95.3800000 + 40.3300000 95.4200000 + 40.3300000 95.4300000 + 40.3500000 95.4500000 + 40.3700000 95.4500000 + 40.3800000 95.4700000 + 40.4200000 95.4700000 + 40.4300000 95.4800000 + 40.4700000 95.4700000 + 40.4800000 95.4500000 + 40.5300000 95.4500000 + 40.6300000 95.3800000 + 40.6700000 95.3800000 + 40.6700000 95.3700000 + 40.7300000 95.3200000 +1613 1613 -1 29 40.43770 96.48228 + 40.6243200 96.5290300 + 40.5264900 96.4103700 + 40.5266100 96.3710600 + 40.4677200 96.3445700 + 40.4189000 96.2004200 + 40.3697900 96.1872100 + 40.3696300 96.2787300 + 40.3204000 96.3177300 + 40.3203000 96.3569300 + 40.2711400 96.3697400 + 40.2807500 96.4350800 + 40.2511900 96.4610100 + 40.2510900 96.4871100 + 40.3395200 96.4877100 + 40.3688300 96.5271400 + 40.4179600 96.5275000 + 40.3980800 96.5796700 + 40.4372600 96.6061600 + 40.4664100 96.6718700 + 40.5057800 96.6591400 + 40.5253000 96.6855300 + 40.5346000 96.7773500 + 40.5741300 96.7384500 + 40.5744300 96.6860000 + 40.5450900 96.6595100 + 40.5649400 96.6203600 + 40.5454100 96.5939700 + 40.5751800 96.5286600 + 40.6243200 96.5290300 +1614 1614 -1 22 40.09950 96.28455 + 40.1729200 96.3561900 + 40.2220500 96.3564400 + 40.2315800 96.4478300 + 40.2511900 96.4610100 + 40.2807500 96.4350800 + 40.2711400 96.3697400 + 40.3203000 96.3569300 + 40.3204000 96.3177300 + 40.1144000 96.1474600 + 40.1046000 96.1213900 + 39.9277800 96.1080900 + 39.9179500 96.1210700 + 39.9277100 96.1730700 + 39.8785700 96.1859300 + 39.8785100 96.2248800 + 39.8981600 96.2249500 + 39.9273300 96.3549700 + 39.9960900 96.3553200 + 40.0844700 96.3687700 + 40.1140500 96.3298500 + 40.1533500 96.3300200 + 40.1729200 96.3561900 +1615 1615 -1 17 39.81000 96.01058 + 39.9179500 96.1210700 + 39.9278100 96.0691100 + 39.9671100 96.0431500 + 39.9670900 95.9131400 + 39.9277200 95.8352300 + 39.8786600 95.8872800 + 39.6822500 95.9782300 + 39.6724300 96.0041300 + 39.6527900 95.9911900 + 39.6527800 96.0300200 + 39.6724100 96.0688700 + 39.7214900 96.1207400 + 39.7804300 96.1078700 + 39.7902100 96.1468000 + 39.8785700 96.1859300 + 39.9277100 96.1730700 + 39.9179500 96.1210700 +1616 1616 -1 18 40.24700 96.12182 + 40.1046000 96.1213900 + 40.1144000 96.1474600 + 40.3204000 96.3177300 + 40.3696300 96.2787300 + 40.3697900 96.1872100 + 40.4189000 96.2004200 + 40.3600500 96.1218300 + 40.3600800 96.0826000 + 40.3011500 95.9780400 + 40.1930500 95.9259100 + 40.1341100 95.9390000 + 40.1341300 95.9781000 + 40.1046500 95.9781000 + 40.1046600 96.0171800 + 40.0751700 96.0562400 + 40.0751500 96.0953000 + 40.1046200 96.0953400 + 40.1046000 96.1213900 +1617 1617 -1 27 40.04560 95.86095 + 40.1930500 95.9259100 + 40.1733900 95.8998600 + 40.1733000 95.8216200 + 40.0845600 95.6655800 + 40.0745500 95.6005200 + 39.9468400 95.6012300 + 39.9273100 95.6403200 + 39.9469900 95.6532200 + 39.9471000 95.6922100 + 39.9176900 95.7183200 + 39.8981900 95.7963300 + 39.8982100 95.8093200 + 39.9277200 95.8352300 + 39.9670900 95.9131400 + 39.9671100 96.0431500 + 39.9278100 96.0691100 + 39.9179500 96.1210700 + 39.9277800 96.1080900 + 40.1046000 96.1213900 + 40.1046200 96.0953400 + 40.0751500 96.0953000 + 40.0751700 96.0562400 + 40.1046600 96.0171800 + 40.1046500 95.9781000 + 40.1341300 95.9781000 + 40.1341100 95.9390000 + 40.1930500 95.9259100 +1618 NODAWAY RIVER AT CLARINDA IA -1 540 41.11000 94.86083 + 40.7370830 95.0129170 + 40.7412500 95.0566880 + 40.7454170 95.0608130 + 40.7454170 95.0733540 + 40.7475210 95.0754170 + 40.7495830 95.0774790 + 40.7495830 95.0816880 + 40.7516880 95.0837500 + 40.7537500 95.0858540 + 40.7537500 95.0879170 + 40.7600210 95.0879170 + 40.7620830 95.0858540 + 40.7724790 95.0754170 + 40.7745830 95.0774790 + 40.7766460 95.0795830 + 40.7787500 95.0816460 + 40.7808130 95.0837500 + 40.7850210 95.0837500 + 40.7870830 95.0858130 + 40.7891460 95.0879170 + 40.7933540 95.0879170 + 40.7954170 95.0858540 + 40.7974790 95.0837500 + 40.7995830 95.0858130 + 40.8016460 95.0879170 + 40.8058540 95.0879170 + 40.8079170 95.0899790 + 40.8099790 95.0920830 + 40.8120830 95.0900210 + 40.8141460 95.0879170 + 40.8225210 95.0879170 + 40.8245830 95.0858540 + 40.8266460 95.0837500 + 40.8350210 95.0837500 + 40.8370830 95.0816880 + 40.8391460 95.0795830 + 40.8558540 95.0795830 + 40.8579170 95.0775210 + 40.8599790 95.0754170 + 40.8766880 95.0754170 + 40.8787500 95.0733540 + 40.8787500 95.0691460 + 40.8808130 95.0670830 + 40.8829170 95.0650210 + 40.8829170 95.0608130 + 40.8849790 95.0587500 + 40.8870830 95.0566880 + 40.8891460 95.0545830 + 40.8912500 95.0566460 + 40.8933130 95.0587500 + 40.8954170 95.0608130 + 40.8974790 95.0629170 + 40.9058540 95.0629170 + 40.9079170 95.0608540 + 40.9099790 95.0587500 + 40.9120830 95.0566880 + 40.9141460 95.0545830 + 40.9162500 95.0525210 + 40.9183130 95.0504170 + 40.9245830 95.0483540 + 40.9266460 95.0462500 + 40.9350210 95.0462500 + 40.9370830 95.0483130 + 40.9370830 95.0566880 + 40.9391460 95.0587500 + 40.9412500 95.0608130 + 40.9474790 95.0670830 + 40.9641880 95.0670830 + 40.9662500 95.0650210 + 40.9683130 95.0629170 + 40.9725210 95.0629170 + 40.9745830 95.0649790 + 40.9766460 95.0670830 + 40.9975210 95.0670830 + 40.9995830 95.0650210 + 41.0016460 95.0629170 + 41.0058540 95.0629170 + 41.0079170 95.0608540 + 41.0099790 95.0587500 + 41.0120830 95.0566880 + 41.0141460 95.0545830 + 41.0183540 95.0545830 + 41.0204170 95.0566460 + 41.0224790 95.0587500 + 41.0266880 95.0587500 + 41.0287500 95.0566880 + 41.0308130 95.0545830 + 41.0350210 95.0545830 + 41.0370830 95.0525210 + 41.0391460 95.0504170 + 41.0412500 95.0483540 + 41.0433130 95.0462500 + 41.0454170 95.0441880 + 41.0474790 95.0420830 + 41.0516880 95.0420830 + 41.0537500 95.0441460 + 41.0558130 95.0462500 + 41.0600210 95.0462500 + 41.0620830 95.0483130 + 41.0620830 95.0525210 + 41.0641460 95.0545830 + 41.0725210 95.0545830 + 41.0745830 95.0566460 + 41.0745830 95.0608540 + 41.0766460 95.0629170 + 41.0808130 95.0670830 + 41.0954170 95.0650210 + 41.0974790 95.0629170 + 41.0995830 95.0608540 + 41.1016460 95.0587500 + 41.1058540 95.0587500 + 41.1079170 95.0566880 + 41.1099790 95.0545830 + 41.1141880 95.0545830 + 41.1162500 95.0566460 + 41.1183130 95.0587500 + 41.1266880 95.0587500 + 41.1287500 95.0608130 + 41.1308130 95.0629170 + 41.1329170 95.0649790 + 41.1349790 95.0670830 + 41.1370830 95.0650210 + 41.1391460 95.0629170 + 41.1516880 95.0629170 + 41.1537500 95.0649790 + 41.1558130 95.0670830 + 41.1579170 95.0650210 + 41.1766880 95.0629170 + 41.1787500 95.0649790 + 41.1850210 95.0670830 + 41.1870830 95.0650210 + 41.1975210 95.0629170 + 41.1995830 95.0608540 + 41.2016460 95.0587500 + 41.2079170 95.0608130 + 41.2099790 95.0629170 + 41.2433540 95.0629170 + 41.2454170 95.0608540 + 41.2474790 95.0587500 + 41.2558540 95.0587500 + 41.2579170 95.0566880 + 41.2599790 95.0545830 + 41.2641880 95.0545830 + 41.2662500 95.0525210 + 41.2683130 95.0504170 + 41.2808540 95.0504170 + 41.2933540 95.0462500 + 41.2954170 95.0462500 + 41.2974790 95.0045830 + 41.3037500 95.0025210 + 41.3037500 94.9483130 + 41.3058130 94.9462500 + 41.3079170 94.9441880 + 41.3079170 94.9274790 + 41.3058540 94.9254170 + 41.2974790 94.9254170 + 41.2954170 94.9233540 + 41.2954170 94.9108130 + 41.2974790 94.9087500 + 41.2995830 94.9066880 + 41.3016460 94.9045830 + 41.3058540 94.9045830 + 41.3079170 94.9025210 + 41.3079170 94.8858130 + 41.3099790 94.8837500 + 41.3120830 94.8816880 + 41.3141460 94.8795830 + 41.3183540 94.8795830 + 41.3204170 94.8775210 + 41.3204170 94.8608130 + 41.3224790 94.8587500 + 41.3245830 94.8566880 + 41.3266460 94.8545830 + 41.3308540 94.8545830 + 41.3329170 94.8525210 + 41.3349790 94.8504170 + 41.3370830 94.8483540 + 41.3370830 94.8441460 + 41.3391460 94.8420830 + 41.3412500 94.8400210 + 41.3412500 94.8274790 + 41.3391880 94.8254170 + 41.3370830 94.8233540 + 41.3391460 94.8212500 + 41.3412500 94.8191880 + 41.3433130 94.8170830 + 41.3454170 94.8150210 + 41.3474790 94.8129170 + 41.3641880 94.8129170 + 41.3662500 94.8108540 + 41.3662500 94.8066460 + 41.3683130 94.8045830 + 41.3704170 94.8025210 + 41.3704170 94.7983130 + 41.3808130 94.7879170 + 41.3829170 94.7899790 + 41.3849790 94.7920830 + 41.3891880 94.7920830 + 41.3912500 94.7900210 + 41.3933130 94.7879170 + 41.3954170 94.7858540 + 41.3974790 94.7837500 + 41.4016880 94.7837500 + 41.4037500 94.7816880 + 41.4037500 94.7566460 + 41.4058130 94.7545830 + 41.4100210 94.7545830 + 41.4120830 94.7525210 + 41.4120830 94.7483130 + 41.4141460 94.7462500 + 41.4162500 94.7441880 + 41.4183130 94.7420830 + 41.4225210 94.7420830 + 41.4245830 94.7400210 + 41.4266460 94.7379170 + 41.4308540 94.7379170 + 41.4329170 94.7358540 + 41.4329170 94.7316460 + 41.4349790 94.7295830 + 41.4391880 94.7295830 + 41.4412500 94.7275210 + 41.4412500 94.7191460 + 41.4495830 94.7108540 + 41.4495830 94.7024790 + 41.4516460 94.7004170 + 41.4537500 94.6983540 + 41.4537500 94.6899790 + 41.4558130 94.6879170 + 41.4579170 94.6858540 + 41.4599790 94.6837500 + 41.4620830 94.6816880 + 41.4620830 94.6774790 + 41.4641460 94.6754170 + 41.4662500 94.6733540 + 41.4683130 94.6712500 + 41.4704170 94.6691880 + 41.4724790 94.6670830 + 41.4745830 94.6650210 + 41.4745830 94.6566460 + 41.4766460 94.6545830 + 41.4787500 94.6525210 + 41.4808130 94.6504170 + 41.4829170 94.6483540 + 41.4829170 94.6358130 + 41.4808540 94.6337500 + 41.4787500 94.6316880 + 41.4787500 94.6233130 + 41.4766880 94.6212500 + 41.4745830 94.6191880 + 41.4725210 94.6170830 + 41.4704170 94.6150210 + 41.4683540 94.6129170 + 41.4558130 94.6129170 + 41.4537500 94.6108540 + 41.4537500 94.5983130 + 41.4516880 94.5962500 + 41.4495830 94.5941880 + 41.4475210 94.5920830 + 41.4454170 94.5900210 + 41.4454170 94.5816460 + 41.4433540 94.5795830 + 41.4349790 94.5795830 + 41.4329170 94.5775210 + 41.4308540 94.5754170 + 41.4225210 94.5712500 + 41.4120830 94.5650210 + 41.4079170 94.5566880 + 41.4079170 94.5524790 + 41.4099790 94.5504170 + 41.4120830 94.5483540 + 41.4120830 94.5399790 + 41.4141460 94.5379170 + 41.4162500 94.5358540 + 41.4162500 94.5316460 + 41.4183130 94.5295830 + 41.4204170 94.5316460 + 41.4224790 94.5337500 + 41.4308540 94.5337500 + 41.4329170 94.5358130 + 41.4349790 94.5379170 + 41.4475210 94.5379170 + 41.4495830 94.5399790 + 41.4516460 94.5420830 + 41.4537500 94.5400210 + 41.4558130 94.5379170 + 41.4579170 94.5358540 + 41.4579170 94.5274790 + 41.4558540 94.5254170 + 41.4537500 94.5233540 + 41.4537500 94.5191460 + 41.4516880 94.5170830 + 41.4495830 94.5191460 + 41.4475210 94.5212500 + 41.4349790 94.5212500 + 41.4329170 94.5191880 + 41.4308540 94.5170830 + 41.4287500 94.5150210 + 41.4266880 94.5129170 + 41.4224790 94.5129170 + 41.4204170 94.5108540 + 41.4183540 94.5087500 + 41.4016460 94.5087500 + 41.3891460 94.5004170 + 41.3808130 94.4962500 + 41.3787500 94.4941880 + 41.3766880 94.4920830 + 41.3724790 94.4920830 + 41.3704170 94.4900210 + 41.3704170 94.4858130 + 41.3683540 94.4837500 + 41.3641460 94.4837500 + 41.3620830 94.4816880 + 41.3620830 94.4566460 + 41.3641460 94.4545830 + 41.3662500 94.4525210 + 41.3641880 94.4379170 + 41.3516460 94.4379170 + 41.3495830 94.4399790 + 41.3475210 94.4420830 + 41.3391460 94.4420830 + 41.3370830 94.4400210 + 41.3350210 94.4379170 + 41.3329170 94.4399790 + 41.3308540 94.4420830 + 41.3141460 94.4420830 + 41.3120830 94.4441460 + 41.3100210 94.4462500 + 41.3079170 94.4483130 + 41.3079170 94.4566880 + 41.3058540 94.4587500 + 41.3037500 94.4608130 + 41.3016880 94.4629170 + 41.2891460 94.4629170 + 41.2870830 94.4608540 + 41.2850210 94.4587500 + 41.2787500 94.4733540 + 41.2766880 94.4754170 + 41.2745830 94.4774790 + 41.2725210 94.4795830 + 41.2683540 94.4754170 + 41.2662500 94.4733540 + 41.2641880 94.4712500 + 41.2599790 94.4754170 + 41.2579170 94.4754170 + 41.2495830 94.4899790 + 41.2495830 94.4941880 + 41.2474790 94.4962500 + 41.2454170 94.4983540 + 41.2433540 94.5004170 + 41.2370830 94.5024790 + 41.2370830 94.5191880 + 41.2349790 94.5212500 + 41.2329170 94.5233540 + 41.2308540 94.5254170 + 41.2224790 94.5254170 + 41.2204170 94.5275210 + 41.2183540 94.5295830 + 41.2079170 94.5358130 + 41.2079170 94.5441880 + 41.2058130 94.5462500 + 41.2037500 94.5483540 + 41.2016880 94.5504170 + 41.1891460 94.5504170 + 41.1849790 94.5545830 + 41.1829170 94.5524790 + 41.1808540 94.5504170 + 41.1766460 94.5504170 + 41.1745830 94.5524790 + 41.1724790 94.5629170 + 41.1704170 94.5649790 + 41.1683540 94.5712500 + 41.1620830 94.5733130 + 41.1620830 94.5775210 + 41.1579170 94.5816460 + 41.1558540 94.5879170 + 41.1474790 94.5879170 + 41.1454170 94.5899790 + 41.1454170 94.6108540 + 41.1433130 94.6129170 + 41.1412500 94.6149790 + 41.1391880 94.6212500 + 41.1287500 94.6233130 + 41.1245830 94.6358130 + 41.1245830 94.6400210 + 41.1224790 94.6420830 + 41.1204170 94.6441460 + 41.1204170 94.6483540 + 41.1183130 94.6504170 + 41.1162500 94.6524790 + 41.1162500 94.6566880 + 41.1183540 94.6587500 + 41.1204170 94.6608540 + 41.1183130 94.6629170 + 41.1162500 94.6650210 + 41.1141880 94.6670830 + 41.1099790 94.6670830 + 41.1079170 94.6691460 + 41.1079170 94.6733540 + 41.1058130 94.6754170 + 41.1037500 94.6774790 + 41.1037500 94.6816880 + 41.1016460 94.6837500 + 41.0995830 94.6858130 + 41.0995830 94.6983540 + 41.0974790 94.7004170 + 41.0954170 94.7025210 + 41.0933130 94.7045830 + 41.0912500 94.7066460 + 41.0912500 94.7150210 + 41.0891460 94.7170830 + 41.0870830 94.7191460 + 41.0870830 94.7233540 + 41.0849790 94.7254170 + 41.0829170 94.7274790 + 41.0829170 94.7358540 + 41.0808130 94.7379170 + 41.0787500 94.7400210 + 41.0766460 94.7420830 + 41.0745830 94.7441880 + 41.0724790 94.7462500 + 41.0704170 94.7483130 + 41.0704170 94.7566880 + 41.0683130 94.7587500 + 41.0662500 94.7608130 + 41.0662500 94.7650210 + 41.0641460 94.7670830 + 41.0620830 94.7691880 + 41.0599790 94.7712500 + 41.0579170 94.7733540 + 41.0558540 94.7754170 + 41.0516460 94.7754170 + 41.0495830 94.7775210 + 41.0474790 94.7795830 + 41.0454170 94.7816880 + 41.0433130 94.7837500 + 41.0412500 94.7858540 + 41.0391460 94.7879170 + 41.0370830 94.7900210 + 41.0349790 94.7920830 + 41.0329170 94.7941460 + 41.0329170 94.7983540 + 41.0308130 94.8004170 + 41.0287500 94.8025210 + 41.0308540 94.8045830 + 41.0329170 94.8066880 + 41.0308130 94.8087500 + 41.0287500 94.8108540 + 41.0266880 94.8129170 + 41.0183130 94.8129170 + 41.0162500 94.8150210 + 41.0141880 94.8170830 + 41.0099790 94.8170830 + 41.0079170 94.8191460 + 41.0079170 94.8400210 + 41.0058540 94.8420830 + 41.0016460 94.8420830 + 40.9995830 94.8441460 + 40.9995830 94.8525210 + 41.0016880 94.8545830 + 41.0037500 94.8566880 + 41.0016460 94.8587500 + 40.9995830 94.8608130 + 40.9995830 94.8691880 + 40.9974790 94.8712500 + 40.9954170 94.8733540 + 40.9933130 94.8754170 + 40.9912500 94.8774790 + 40.9912500 94.8941880 + 40.9891880 94.8962500 + 40.9808130 94.8962500 + 40.9787500 94.8983130 + 40.9787500 94.9025210 + 40.9766880 94.9045830 + 40.9724790 94.9045830 + 40.9704170 94.9066880 + 40.9683130 94.9087500 + 40.9662500 94.9108130 + 40.9662500 94.9150210 + 40.9641460 94.9170830 + 40.9620830 94.9191880 + 40.9599790 94.9212500 + 40.9579170 94.9233540 + 40.9558540 94.9254170 + 40.9433130 94.9254170 + 40.9412500 94.9275210 + 40.9391880 94.9295830 + 40.9349790 94.9295830 + 40.9329170 94.9316460 + 40.9329170 94.9358540 + 40.9308540 94.9379170 + 40.9224790 94.9379170 + 40.9204170 94.9400210 + 40.9183540 94.9420830 + 40.9120830 94.9441880 + 40.9099790 94.9462500 + 40.9079170 94.9483540 + 40.9058130 94.9504170 + 40.9037500 94.9483130 + 40.9016460 94.9462500 + 40.8995830 94.9441460 + 40.8974790 94.9420830 + 40.8954170 94.9399790 + 40.8891880 94.9420830 + 40.8474790 94.9420830 + 40.8454170 94.9441880 + 40.8433540 94.9462500 + 40.8308130 94.9462500 + 40.8287500 94.9483540 + 40.8266460 94.9504170 + 40.8245830 94.9524790 + 40.8245830 94.9566880 + 40.8225210 94.9587500 + 40.8058130 94.9587500 + 40.8037500 94.9608130 + 40.8037500 94.9650210 + 40.8016880 94.9670830 + 40.7933130 94.9670830 + 40.7912500 94.9691880 + 40.7891460 94.9712500 + 40.7870830 94.9691460 + 40.7849790 94.9670830 + 40.7829170 94.9691880 + 40.7808540 94.9712500 + 40.7724790 94.9712500 + 40.7704170 94.9733540 + 40.7683540 94.9754170 + 40.7641460 94.9754170 + 40.7620830 94.9775210 + 40.7599790 94.9795830 + 40.7579170 94.9816880 + 40.7558130 94.9837500 + 40.7537500 94.9858540 + 40.7516460 94.9879170 + 40.7495830 94.9900210 + 40.7475210 94.9920830 + 40.7433130 94.9920830 + 40.7412500 94.9941880 + 40.7391460 94.9962500 + 40.7370830 94.9983130 + 40.7370830 95.0129170 +1619 1619 -1 56 40.82500 94.89768 + 41.2700000 94.4700000 + 41.2000000 94.4200000 + 41.2000000 94.4000000 + 41.1700000 94.3800000 + 41.1300000 94.4200000 + 41.0800000 94.4300000 + 41.0300000 94.5000000 + 41.0200000 94.5300000 + 41.0200000 94.5500000 + 40.9800000 94.5500000 + 40.9700000 94.5800000 + 40.9738500 94.5992300 + 40.9800000 94.6300000 + 40.9800000 94.6700000 + 40.9300000 94.7700000 + 40.9200000 94.8000000 + 40.8700000 94.8200000 + 40.8700000 94.8300000 + 40.8000000 94.8500000 + 40.8000000 94.8700000 + 40.7300000 94.8800000 + 40.6800000 94.8500000 + 40.6300000 94.8700000 + 40.6200000 94.8800000 + 40.5800000 94.8800000 + 40.5500000 94.8700000 + 40.5000000 94.8700000 + 40.4700000 94.8800000 + 40.4300000 94.8800000 + 40.4000000 94.9200000 + 40.3800000 94.9500000 + 40.4300000 94.9800000 + 40.4200000 95.0200000 + 40.4500000 95.0300000 + 40.4500000 95.0800000 + 40.4700000 95.0800000 + 40.4800000 95.0700000 + 40.5200000 95.0800000 + 40.6000000 95.0700000 + 40.6300000 95.0500000 + 40.6500000 95.0700000 + 40.7300000 95.1000000 + 40.7500000 95.0800000 + 40.7300000 95.0200000 + 40.7300000 95.0000000 + 40.8300000 94.9500000 + 40.9000000 94.9500000 + 40.9800000 94.9000000 + 41.0000000 94.8500000 + 41.0200000 94.8200000 + 41.0700000 94.7700000 + 41.1200000 94.6700000 + 41.1500000 94.6000000 + 41.1800000 94.5500000 + 41.2000000 94.5500000 + 41.2700000 94.4700000 +1620 1620 -1 21 40.78500 94.60000 + 40.8800000 94.5500000 + 40.9000000 94.5200000 + 40.8800000 94.5200000 + 40.8800000 94.5000000 + 40.8700000 94.4700000 + 40.8500000 94.4800000 + 40.8300000 94.4800000 + 40.8300000 94.5000000 + 40.8000000 94.5000000 + 40.7700000 94.5500000 + 40.7300000 94.6000000 + 40.7000000 94.6500000 + 40.6800000 94.6500000 + 40.6700000 94.6800000 + 40.6700000 94.7000000 + 40.6800000 94.7300000 + 40.7000000 94.7200000 + 40.7300000 94.7200000 + 40.8300000 94.6200000 + 40.8700000 94.5700000 + 40.8800000 94.5500000 +1621 1621 -1 41 40.66500 94.71500 + 40.9738500 94.5992300 + 40.9500000 94.5800000 + 40.9200000 94.5800000 + 40.9200000 94.5700000 + 40.8800000 94.5500000 + 40.8700000 94.5700000 + 40.8300000 94.6200000 + 40.7300000 94.7200000 + 40.7000000 94.7200000 + 40.6800000 94.7300000 + 40.6700000 94.7000000 + 40.6700000 94.6800000 + 40.6200000 94.7000000 + 40.5700000 94.7000000 + 40.5200000 94.7200000 + 40.4800000 94.7500000 + 40.4500000 94.7700000 + 40.3500000 94.7800000 + 40.3500000 94.8300000 + 40.3500000 94.8700000 + 40.3700000 94.8800000 + 40.4000000 94.8500000 + 40.4200000 94.8700000 + 40.4300000 94.8700000 + 40.4700000 94.8800000 + 40.5000000 94.8700000 + 40.5500000 94.8700000 + 40.5800000 94.8800000 + 40.6200000 94.8800000 + 40.6300000 94.8700000 + 40.6800000 94.8500000 + 40.7300000 94.8800000 + 40.8000000 94.8700000 + 40.8000000 94.8500000 + 40.8700000 94.8300000 + 40.8700000 94.8200000 + 40.9200000 94.8000000 + 40.9300000 94.7700000 + 40.9800000 94.6700000 + 40.9800000 94.6300000 + 40.9738500 94.5992300 +1622 1622 -1 37 40.27500 94.83500 + 40.5200000 94.7200000 + 40.5000000 94.7000000 + 40.4700000 94.7300000 + 40.4200000 94.7300000 + 40.4000000 94.7500000 + 40.3000000 94.7700000 + 40.3000000 94.7800000 + 40.2300000 94.7800000 + 40.2200000 94.8000000 + 40.1800000 94.8000000 + 40.1000000 94.7700000 + 40.0800000 94.7800000 + 40.0700000 94.7700000 + 40.0500000 94.7800000 + 40.0500000 94.8300000 + 40.0500000 94.8500000 + 40.0300000 94.8500000 + 40.0500000 94.8800000 + 40.1200000 94.8800000 + 40.1300000 94.8800000 + 40.2000000 94.9200000 + 40.2800000 94.9300000 + 40.3300000 94.9700000 + 40.3800000 94.9500000 + 40.4000000 94.9200000 + 40.4300000 94.8800000 + 40.4700000 94.8800000 + 40.4300000 94.8700000 + 40.4200000 94.8700000 + 40.4000000 94.8500000 + 40.3700000 94.8800000 + 40.3500000 94.8700000 + 40.3500000 94.8300000 + 40.3500000 94.7800000 + 40.4500000 94.7700000 + 40.4800000 94.7500000 + 40.5200000 94.7200000 +1623 1623 -1 58 40.76000 94.49500 + 41.1700000 94.3800000 + 41.1000000 94.3300000 + 41.0800000 94.3200000 + 41.0300000 94.3000000 + 41.0200000 94.2800000 + 41.0000000 94.2700000 + 40.9800000 94.2700000 + 40.9700000 94.2800000 + 40.9200000 94.3300000 + 40.9300000 94.3500000 + 40.9200000 94.3700000 + 40.8300000 94.3700000 + 40.8000000 94.3800000 + 40.7300000 94.4000000 + 40.7300000 94.3800000 + 40.6800000 94.4000000 + 40.6500000 94.4500000 + 40.6200000 94.4500000 + 40.5500000 94.5300000 + 40.5500000 94.5700000 + 40.4800000 94.5800000 + 40.4000000 94.6300000 + 40.4000000 94.6500000 + 40.3500000 94.6500000 + 40.3500000 94.6800000 + 40.3500000 94.7000000 + 40.3800000 94.7200000 + 40.4200000 94.7200000 + 40.5000000 94.7000000 + 40.5200000 94.7200000 + 40.5700000 94.7000000 + 40.6200000 94.7000000 + 40.6700000 94.6800000 + 40.6800000 94.6500000 + 40.7000000 94.6500000 + 40.7300000 94.6000000 + 40.7700000 94.5500000 + 40.8000000 94.5000000 + 40.8300000 94.5000000 + 40.8300000 94.4800000 + 40.8500000 94.4800000 + 40.8700000 94.4700000 + 40.8800000 94.5000000 + 40.8800000 94.5200000 + 40.9000000 94.5200000 + 40.8800000 94.5500000 + 40.9200000 94.5700000 + 40.9200000 94.5800000 + 40.9500000 94.5800000 + 40.9738500 94.5992300 + 40.9700000 94.5800000 + 40.9800000 94.5500000 + 41.0200000 94.5500000 + 41.0200000 94.5300000 + 41.0300000 94.5000000 + 41.0800000 94.4300000 + 41.1300000 94.4200000 + 41.1700000 94.3800000 +1624 1624 -1 65 40.07500 94.66500 + 40.5000000 94.7000000 + 40.4200000 94.7200000 + 40.3800000 94.7200000 + 40.3500000 94.7000000 + 40.3500000 94.6800000 + 40.3500000 94.6500000 + 40.3000000 94.6700000 + 40.2800000 94.6800000 + 40.2200000 94.7000000 + 40.2000000 94.6800000 + 40.1300000 94.6700000 + 40.1200000 94.6500000 + 40.1200000 94.6200000 + 40.1200000 94.5800000 + 40.0800000 94.5700000 + 40.0800000 94.5500000 + 40.0800000 94.5200000 + 40.0700000 94.5300000 + 40.0200000 94.5000000 + 40.0000000 94.4800000 + 40.0000000 94.4700000 + 39.9500000 94.4700000 + 39.9300000 94.4800000 + 39.9200000 94.4500000 + 39.9000000 94.4700000 + 39.8500000 94.4800000 + 39.8000000 94.5200000 + 39.7800000 94.5300000 + 39.7300000 94.5500000 + 39.7200000 94.5800000 + 39.7300000 94.6200000 + 39.6800000 94.6200000 + 39.6500000 94.6700000 + 39.6800000 94.6700000 + 39.6800000 94.7000000 + 39.7000000 94.7300000 + 39.6800000 94.7700000 + 39.6800000 94.7800000 + 39.7200000 94.8000000 + 39.7500000 94.7800000 + 39.7500000 94.7983400 + 39.7499500 94.8000000 + 39.8300000 94.8200000 + 39.9200000 94.8000000 + 39.9300000 94.8200000 + 39.9700000 94.8700000 + 39.9800000 94.8700000 + 40.0000000 94.8800000 + 40.0500000 94.8800000 + 40.0300000 94.8500000 + 40.0500000 94.8500000 + 40.0500000 94.8300000 + 40.0500000 94.7800000 + 40.0700000 94.7700000 + 40.0800000 94.7800000 + 40.1000000 94.7700000 + 40.1800000 94.8000000 + 40.2200000 94.8000000 + 40.2300000 94.7800000 + 40.3000000 94.7800000 + 40.3000000 94.7700000 + 40.4000000 94.7500000 + 40.4200000 94.7300000 + 40.4700000 94.7300000 + 40.5000000 94.7000000 +1628 1628 -1 31 39.49000 94.70000 + 39.6700000 94.8300000 + 39.6800000 94.7800000 + 39.6800000 94.7700000 + 39.7000000 94.7300000 + 39.6800000 94.7000000 + 39.6800000 94.6700000 + 39.6500000 94.6700000 + 39.5800000 94.6800000 + 39.5500000 94.6700000 + 39.5700000 94.6300000 + 39.5300000 94.5800000 + 39.5200000 94.5700000 + 39.4800000 94.5800000 + 39.4700000 94.5700000 + 39.4200000 94.5700000 + 39.4011800 94.5747100 + 39.3800000 94.5800000 + 39.3700000 94.6300000 + 39.2800000 94.6800000 + 39.3000000 94.7300000 + 39.3300000 94.7200000 + 39.3500000 94.7200000 + 39.3700000 94.7800000 + 39.3800000 94.8000000 + 39.4000000 94.8200000 + 39.4700000 94.7700000 + 39.5000000 94.7700000 + 39.5200000 94.7500000 + 39.5800000 94.7500000 + 39.6300000 94.7800000 + 39.6700000 94.8300000 +1630 1630 -1 26 41.52000 95.06500 + 41.7200000 94.9700000 + 41.6800000 94.9500000 + 41.6500000 94.9700000 + 41.6200000 94.9300000 + 41.5800000 94.9700000 + 41.5800000 94.9800000 + 41.5500000 95.0500000 + 41.5300000 95.0500000 + 41.4500000 95.0700000 + 41.4300000 95.0800000 + 41.4200000 95.1200000 + 41.3200000 95.1200000 + 41.3200000 95.1300000 + 41.3200000 95.1700000 + 41.3200000 95.2000000 + 41.4500000 95.1700000 + 41.5700000 95.1700000 + 41.5700000 95.1800000 + 41.6000000 95.1700000 + 41.6300000 95.1700000 + 41.6500000 95.1700000 + 41.6800000 95.1200000 + 41.6800000 95.1000000 + 41.7200000 95.0200000 + 41.7000000 94.9800000 + 41.7200000 94.9700000 +1634 1634 -1 18 40.58000 95.11500 + 40.7000000 95.1300000 + 40.7300000 95.1000000 + 40.6500000 95.0700000 + 40.6300000 95.0500000 + 40.6000000 95.0700000 + 40.5200000 95.0800000 + 40.4800000 95.0700000 + 40.4700000 95.0800000 + 40.4500000 95.0800000 + 40.4500000 95.1000000 + 40.4300000 95.1700000 + 40.4800000 95.1700000 + 40.5000000 95.1800000 + 40.5500000 95.1800000 + 40.5700000 95.1800000 + 40.6200000 95.1800000 + 40.6800000 95.1300000 + 40.7000000 95.1300000 +1635 1635 -1 20 40.32500 95.06500 + 40.4500000 95.0800000 + 40.4500000 95.0300000 + 40.4200000 95.0200000 + 40.4300000 94.9800000 + 40.3800000 94.9500000 + 40.3300000 94.9700000 + 40.3300000 94.9800000 + 40.2800000 95.0300000 + 40.2200000 95.0500000 + 40.2000000 95.0700000 + 40.2000000 95.1000000 + 40.2300000 95.1200000 + 40.2500000 95.1500000 + 40.2700000 95.1700000 + 40.3000000 95.1700000 + 40.3300000 95.1700000 + 40.3500000 95.1800000 + 40.4300000 95.1700000 + 40.4500000 95.1000000 + 40.4500000 95.0800000 +1801 1801 -1 49 42.77990 97.24212 + 43.2743500 97.4489400 + 43.2152200 97.4476900 + 43.0588400 97.3221300 + 42.9603200 97.3202400 + 42.8544100 97.0473000 + 42.7761300 96.9784600 + 42.7968600 96.8298800 + 42.8955400 96.8039600 + 42.8662300 96.7629800 + 42.7482600 96.7211000 + 42.6995000 96.6259800 + 42.5620500 96.5303300 + 42.5228700 96.4761100 + 42.4738300 96.4218900 + 42.4540000 96.4621700 + 42.4536300 96.5564300 + 42.3842800 96.6500500 + 42.3251500 96.6629500 + 42.2756500 96.7162100 + 42.3247900 96.7301600 + 42.3729100 96.9055300 + 42.4610200 96.9740200 + 42.5006000 96.9476200 + 42.4804000 97.0147200 + 42.5485500 97.1101200 + 42.5477100 97.2045100 + 42.4688200 97.2166100 + 42.4974400 97.3114400 + 42.4676300 97.3378200 + 42.4470900 97.4182300 + 42.4566300 97.4453600 + 42.5736900 97.5422400 + 42.6418000 97.6112800 + 42.7007100 97.6261700 + 42.8100300 97.5475200 + 42.8305200 97.4802600 + 42.8797600 97.4813200 + 42.9275800 97.6043900 + 42.9168800 97.6719400 + 43.1020700 97.8259900 + 43.1304700 97.9083600 + 43.2477100 97.9797400 + 43.2760200 98.0623400 + 43.2770700 97.9942100 + 43.1803200 97.8689000 + 43.1735600 97.6373400 + 43.2836000 97.5036500 + 43.2842100 97.4491400 + 43.2743500 97.4489400 +1802 1802 -1 41 42.26140 96.44726 + 42.5500000 96.2800000 + 42.5300000 96.2700000 + 42.5200000 96.3000000 + 42.5200000 96.3200000 + 42.4800000 96.3200000 + 42.4700000 96.3500000 + 42.4300000 96.3500000 + 42.4200000 96.3300000 + 42.3305100 96.2584100 + 42.1986200 96.2592200 + 42.1495500 96.1785800 + 42.0413000 96.1783100 + 42.0018800 96.2183500 + 42.0213300 96.3254800 + 41.9228600 96.3517500 + 41.9227900 96.3784700 + 41.9423000 96.4320500 + 41.9618400 96.4722900 + 42.0504000 96.4728900 + 42.0698200 96.5399900 + 42.1091800 96.5402900 + 42.1679300 96.6078000 + 42.1677300 96.6480400 + 42.1774400 96.6749600 + 42.2266500 96.6754300 + 42.2756500 96.7162100 + 42.3251500 96.6629500 + 42.3842800 96.6500500 + 42.4536300 96.5564300 + 42.4540000 96.4621700 + 42.4738300 96.4218900 + 42.5228700 96.4761100 + 42.5500800 96.4703800 + 42.5500000 96.4300000 + 42.5300000 96.4200000 + 42.5300000 96.4000000 + 42.5800000 96.3500000 + 42.6000000 96.3500000 + 42.5700000 96.3200000 + 42.5700000 96.3000000 + 42.5500000 96.2800000 +1803 1803 -1 43 41.92520 96.12587 + 41.9000000 95.9500000 + 41.8500000 95.9700000 + 41.8300000 95.9300000 + 41.7800000 95.9000000 + 41.7300000 95.9500000 + 41.7200000 95.9500000 + 41.6700000 95.9700000 + 41.6500000 96.0000000 + 41.6300000 96.0500000 + 41.6000000 96.0200000 + 41.5700000 96.0300000 + 41.5500000 96.1000000 + 41.5300000 96.1200000 + 41.5200000 96.1200000 + 41.5200000 96.1500000 + 41.5297200 96.1903000 + 41.5984800 96.2437000 + 41.5787600 96.2702300 + 41.6179800 96.3236100 + 41.6769900 96.3238800 + 41.7066000 96.2840400 + 41.7261800 96.3241000 + 41.8540600 96.3247000 + 41.8836400 96.2981200 + 41.9228600 96.3517500 + 42.0213300 96.3254800 + 42.0018800 96.2183500 + 42.0413000 96.1783100 + 42.1495500 96.1785800 + 42.1986200 96.2592200 + 42.3305100 96.2584100 + 42.3200000 96.2500000 + 42.2800000 96.2000000 + 42.1700000 96.1300000 + 42.0800000 96.1000000 + 42.0700000 96.0700000 + 42.0200000 96.0500000 + 41.9700000 96.0200000 + 41.9700000 96.0000000 + 41.9700000 95.9800000 + 41.9700000 95.9700000 + 41.9700000 95.9500000 + 41.9000000 95.9500000 +1804 1804 -1 71 41.64000 95.81500 + 42.0300000 95.5500000 + 42.0000000 95.5700000 + 41.9800000 95.5800000 + 41.9300000 95.6200000 + 41.9200000 95.6500000 + 41.8800000 95.6700000 + 41.8700000 95.7000000 + 41.8200000 95.7000000 + 41.8000000 95.7300000 + 41.7700000 95.7300000 + 41.7000000 95.8000000 + 41.6500000 95.8000000 + 41.6500000 95.7800000 + 41.6200000 95.7200000 + 41.6200000 95.6500000 + 41.6300000 95.6300000 + 41.6500000 95.6300000 + 41.7300000 95.5800000 + 41.7200000 95.5500000 + 41.7700000 95.5200000 + 41.7800000 95.4800000 + 41.7300000 95.4800000 + 41.7200000 95.5200000 + 41.7000000 95.5200000 + 41.6800000 95.5500000 + 41.6500000 95.5800000 + 41.6000000 95.6200000 + 41.5500000 95.6200000 + 41.5200000 95.6300000 + 41.4800000 95.6500000 + 41.4300000 95.6800000 + 41.4000000 95.7500000 + 41.3500000 95.8200000 + 41.3200000 95.8200000 + 41.2700000 95.8500000 + 41.2700000 95.9200000 + 41.2700000 95.9500000 + 41.2500000 95.9700000 + 41.2550200 95.9700000 + 41.2700000 95.9700000 + 41.2800000 96.0000000 + 41.3200000 96.0000000 + 41.3500000 96.0000000 + 41.3800000 96.0300000 + 41.4200000 96.0500000 + 41.4300000 96.0800000 + 41.4200000 96.1000000 + 41.4800000 96.1500000 + 41.5200000 96.1500000 + 41.5200000 96.1200000 + 41.5300000 96.1200000 + 41.5500000 96.1000000 + 41.5700000 96.0300000 + 41.6000000 96.0200000 + 41.6300000 96.0500000 + 41.6500000 96.0000000 + 41.6700000 95.9700000 + 41.7200000 95.9500000 + 41.7300000 95.9500000 + 41.7800000 95.9000000 + 41.8000000 95.8700000 + 41.8000000 95.8500000 + 41.8500000 95.8200000 + 41.8700000 95.7500000 + 41.9200000 95.7500000 + 41.9300000 95.7000000 + 42.0000000 95.6800000 + 42.0000000 95.6700000 + 42.0200000 95.6300000 + 42.0300000 95.5800000 + 42.0300000 95.5500000 +1806 1806 -1 77 41.28000 95.65000 + 41.8700000 95.4000000 + 41.8500000 95.3800000 + 41.8200000 95.3800000 + 41.8000000 95.4000000 + 41.7800000 95.3700000 + 41.7700000 95.4000000 + 41.7500000 95.3800000 + 41.7300000 95.4000000 + 41.7000000 95.3800000 + 41.6700000 95.3800000 + 41.6000000 95.4300000 + 41.5300000 95.4500000 + 41.5000000 95.5000000 + 41.4200000 95.5200000 + 41.3500000 95.6000000 + 41.2700000 95.6300000 + 41.2200000 95.6300000 + 41.1800000 95.6200000 + 41.1500000 95.6500000 + 41.0700000 95.6700000 + 41.0300000 95.6700000 + 40.9300000 95.6700000 + 40.8800000 95.6700000 + 40.8500000 95.6700000 + 40.8200000 95.6800000 + 40.8200000 95.7000000 + 40.7800000 95.7300000 + 40.8000000 95.7500000 + 40.8000000 95.7800000 + 40.7800000 95.8200000 + 40.7300000 95.8500000 + 40.7000000 95.8300000 + 40.6800000 95.8500000 + 40.7000000 95.8500000 + 40.7200000 95.8800000 + 40.7500000 95.8800000 + 40.7800000 95.8300000 + 40.8000000 95.8500000 + 40.8300000 95.8300000 + 40.8700000 95.8500000 + 40.8800000 95.8200000 + 40.9000000 95.8200000 + 40.9200000 95.8300000 + 40.9500000 95.8300000 + 40.9800000 95.8300000 + 41.0000000 95.8700000 + 41.0200000 95.8700000 + 41.0300000 95.8500000 + 41.0500000 95.8700000 + 41.0800000 95.8700000 + 41.1500000 95.8800000 + 41.1700000 95.8800000 + 41.1700000 95.8500000 + 41.1800000 95.8500000 + 41.1800000 95.9200000 + 41.2000000 95.9300000 + 41.2300000 95.9200000 + 41.2700000 95.9200000 + 41.2700000 95.8500000 + 41.3200000 95.8200000 + 41.3500000 95.8200000 + 41.4000000 95.7500000 + 41.4300000 95.6800000 + 41.4800000 95.6500000 + 41.5200000 95.6300000 + 41.5500000 95.6200000 + 41.6000000 95.6200000 + 41.6500000 95.5800000 + 41.6800000 95.5500000 + 41.7000000 95.5200000 + 41.7200000 95.5200000 + 41.7300000 95.4800000 + 41.7800000 95.4800000 + 41.8000000 95.4800000 + 41.8500000 95.4200000 + 41.8800000 95.4300000 + 41.8700000 95.4000000 +1807 1807 -1 54 40.97500 96.04416 + 41.2700000 95.9200000 + 41.2300000 95.9200000 + 41.2000000 95.9300000 + 41.1800000 95.9200000 + 41.1800000 95.8500000 + 41.1700000 95.8500000 + 41.1700000 95.8800000 + 41.1500000 95.8800000 + 41.0800000 95.8700000 + 41.0500000 95.8700000 + 41.0300000 95.8500000 + 41.0200000 95.8700000 + 41.0000000 95.8700000 + 40.9800000 95.8300000 + 40.9500000 95.8300000 + 40.9200000 95.8300000 + 40.9000000 95.8200000 + 40.8800000 95.8200000 + 40.8700000 95.8500000 + 40.8300000 95.8300000 + 40.8000000 95.8500000 + 40.7800000 95.8300000 + 40.7500000 95.8800000 + 40.7200000 95.8800000 + 40.7000000 95.8500000 + 40.6800000 95.8500000 + 40.7000000 95.8700000 + 40.7000000 95.9200000 + 40.6842800 95.9278600 + 40.6942100 95.9516500 + 40.7040300 95.9516400 + 40.7531400 95.8990300 + 40.7531300 95.8858900 + 40.8514300 95.8989000 + 40.9202700 95.9778500 + 40.9005600 96.1227500 + 40.9299900 96.1755100 + 41.0184600 96.1757400 + 41.0380100 96.2417700 + 41.0675000 96.2418700 + 41.0772700 96.2683100 + 41.1264600 96.2552900 + 41.1168800 95.9910000 + 41.0972100 95.9645800 + 41.1168800 95.9645800 + 41.1168600 95.9249400 + 41.1463400 95.8984800 + 41.1758500 95.9248800 + 41.1856800 95.9248700 + 41.2446900 95.9777500 + 41.2550200 95.9700000 + 41.2500000 95.9700000 + 41.2700000 95.9500000 + 41.2700000 95.9200000 +1808 1808 -1 44 40.61000 95.68000 + 40.8200000 95.6800000 + 40.8000000 95.6700000 + 40.8000000 95.6500000 + 40.7500000 95.6500000 + 40.7200000 95.6700000 + 40.7000000 95.6500000 + 40.6500000 95.6700000 + 40.6300000 95.6300000 + 40.6200000 95.6000000 + 40.6000000 95.5700000 + 40.6000000 95.5000000 + 40.6300000 95.4500000 + 40.6300000 95.4300000 + 40.5800000 95.4500000 + 40.4800000 95.5000000 + 40.4800000 95.5200000 + 40.4500000 95.5300000 + 40.4700000 95.6000000 + 40.4000000 95.6300000 + 40.4000000 95.6500000 + 40.4000000 95.6700000 + 40.4000000 95.6800000 + 40.4200000 95.7300000 + 40.4000000 95.7300000 + 40.4300000 95.7700000 + 40.4700000 95.8300000 + 40.4800000 95.8300000 + 40.5000000 95.8300000 + 40.6300000 95.8800000 + 40.6300000 95.9200000 + 40.6700000 95.9300000 + 40.6800000 95.9300000 + 40.6842800 95.9278600 + 40.7000000 95.9200000 + 40.7000000 95.8700000 + 40.6800000 95.8500000 + 40.7000000 95.8300000 + 40.7300000 95.8500000 + 40.7800000 95.8200000 + 40.8000000 95.7800000 + 40.8000000 95.7500000 + 40.7800000 95.7300000 + 40.8200000 95.7000000 + 40.8200000 95.6800000 +1809 1809 -1 54 40.36000 95.61000 + 40.6700000 95.3800000 + 40.6300000 95.3800000 + 40.5300000 95.4500000 + 40.4800000 95.4500000 + 40.4700000 95.4700000 + 40.4300000 95.4800000 + 40.4200000 95.4700000 + 40.3800000 95.4700000 + 40.3700000 95.4500000 + 40.3500000 95.4500000 + 40.3300000 95.4300000 + 40.3300000 95.4200000 + 40.3500000 95.3800000 + 40.3300000 95.3700000 + 40.2500000 95.3800000 + 40.2500000 95.4000000 + 40.2300000 95.4200000 + 40.2000000 95.4000000 + 40.1800000 95.4000000 + 40.0800000 95.3800000 + 40.0700000 95.3800000 + 40.0500000 95.4200000 + 40.0500000 95.4300000 + 40.0700000 95.4500000 + 40.1500000 95.5300000 + 40.1700000 95.5300000 + 40.2200000 95.5700000 + 40.2000000 95.6000000 + 40.2000000 95.6200000 + 40.2200000 95.6300000 + 40.2300000 95.7200000 + 40.2700000 95.7500000 + 40.2800000 95.7800000 + 40.3000000 95.8300000 + 40.3300000 95.8500000 + 40.3328900 95.8488500 + 40.3800000 95.8300000 + 40.3800000 95.8200000 + 40.4000000 95.8000000 + 40.4200000 95.8000000 + 40.4300000 95.7700000 + 40.4000000 95.7300000 + 40.4200000 95.7300000 + 40.4000000 95.6800000 + 40.4000000 95.6700000 + 40.4000000 95.6500000 + 40.4000000 95.6300000 + 40.4700000 95.6000000 + 40.4500000 95.5300000 + 40.4800000 95.5200000 + 40.4800000 95.5000000 + 40.5800000 95.4500000 + 40.6300000 95.4300000 + 40.6700000 95.3800000 +1810 1810 -1 48 40.10440 95.59246 + 40.3328900 95.8488500 + 40.3300000 95.8500000 + 40.3000000 95.8300000 + 40.2800000 95.7800000 + 40.2700000 95.7500000 + 40.2300000 95.7200000 + 40.2200000 95.6300000 + 40.2000000 95.6200000 + 40.2000000 95.6000000 + 40.2200000 95.5700000 + 40.1700000 95.5300000 + 40.1500000 95.5300000 + 40.0700000 95.4500000 + 40.0500000 95.4300000 + 40.0500000 95.4200000 + 40.0443700 95.4184800 + 40.0443100 95.4054600 + 39.9751500 95.3280200 + 39.9260300 95.3284800 + 39.9262400 95.3674600 + 39.8672300 95.3550000 + 39.8479600 95.4330400 + 39.8973000 95.4846100 + 39.8678800 95.4978000 + 39.8679800 95.5237700 + 39.8385100 95.5239600 + 39.8289600 95.6018800 + 39.7995700 95.6279900 + 39.7799600 95.6410600 + 39.7898900 95.6799200 + 39.8587800 95.7315400 + 39.8981900 95.7963300 + 39.9176900 95.7183200 + 39.9471000 95.6922100 + 39.9469900 95.6532200 + 39.9273100 95.6403200 + 39.9468400 95.6012300 + 40.0745500 95.6005200 + 40.0845600 95.6655800 + 40.1733000 95.8216200 + 40.1733900 95.8998600 + 40.1930500 95.9259100 + 40.3011500 95.9780400 + 40.3600800 96.0826000 + 40.4092000 96.0957400 + 40.4288800 96.0303400 + 40.3305800 95.8865700 + 40.3328900 95.8488500 +1811 1811 -1 37 40.24000 95.27000 + 40.4300000 95.1700000 + 40.3500000 95.1800000 + 40.3300000 95.1700000 + 40.3000000 95.1700000 + 40.2700000 95.1700000 + 40.2500000 95.1500000 + 40.2200000 95.1500000 + 40.1800000 95.1300000 + 40.1700000 95.1500000 + 40.0800000 95.1300000 + 40.0700000 95.1300000 + 40.0300000 95.1300000 + 40.0200000 95.1200000 + 40.0200000 95.1700000 + 39.9800000 95.2200000 + 39.9800000 95.2700000 + 40.0000000 95.3000000 + 40.0300000 95.3500000 + 40.0500000 95.4200000 + 40.0700000 95.3800000 + 40.0800000 95.3800000 + 40.1800000 95.4000000 + 40.2000000 95.4000000 + 40.2300000 95.4200000 + 40.2500000 95.4000000 + 40.2500000 95.3800000 + 40.3300000 95.3700000 + 40.3500000 95.3800000 + 40.3800000 95.3700000 + 40.4000000 95.3500000 + 40.4200000 95.3200000 + 40.4200000 95.2800000 + 40.4800000 95.2300000 + 40.4800000 95.2000000 + 40.5000000 95.1800000 + 40.4800000 95.1700000 + 40.4300000 95.1700000 +1812 1812 -1 29 40.14000 95.01000 + 40.3300000 94.9700000 + 40.2800000 94.9300000 + 40.2000000 94.9200000 + 40.1300000 94.8800000 + 40.1200000 94.8800000 + 40.0500000 94.8800000 + 40.0000000 94.8800000 + 39.9800000 94.8700000 + 39.9700000 94.8700000 + 39.9500000 94.9200000 + 39.9700000 95.0000000 + 39.9800000 95.0700000 + 40.0000000 95.0800000 + 40.0200000 95.1000000 + 40.0200000 95.1200000 + 40.0300000 95.1300000 + 40.0700000 95.1300000 + 40.0800000 95.1300000 + 40.1700000 95.1500000 + 40.1800000 95.1300000 + 40.2200000 95.1500000 + 40.2500000 95.1500000 + 40.2300000 95.1200000 + 40.2000000 95.1000000 + 40.2000000 95.0700000 + 40.2200000 95.0500000 + 40.2800000 95.0300000 + 40.3300000 94.9800000 + 40.3300000 94.9700000 +1813 1813 -1 44 39.84070 95.21405 + 40.0200000 95.1200000 + 40.0200000 95.1000000 + 40.0000000 95.0800000 + 39.9800000 95.0700000 + 39.9700000 95.0000000 + 39.9500000 94.9200000 + 39.9700000 94.8700000 + 39.9300000 94.8200000 + 39.9200000 94.8000000 + 39.8300000 94.8200000 + 39.7499500 94.8000000 + 39.7464300 94.9283400 + 39.8156200 94.9792100 + 39.8163300 95.0700200 + 39.7673100 95.0836200 + 39.7292900 95.2784800 + 39.7000400 95.3176300 + 39.6313600 95.3312200 + 39.6708500 95.3697000 + 39.6710900 95.4214900 + 39.7203200 95.4470100 + 39.7207400 95.5506600 + 39.7601200 95.5763400 + 39.7799300 95.6280900 + 39.7995700 95.6279900 + 39.8289600 95.6018800 + 39.8385100 95.5239600 + 39.8679800 95.5237700 + 39.8678800 95.4978000 + 39.8973000 95.4846100 + 39.8479600 95.4330400 + 39.8672300 95.3550000 + 39.9262400 95.3674600 + 39.9260300 95.3284800 + 39.9751500 95.3280200 + 40.0443100 95.4054600 + 40.0443700 95.4184800 + 40.0500000 95.4200000 + 40.0300000 95.3500000 + 40.0000000 95.3000000 + 39.9800000 95.2700000 + 39.9800000 95.2200000 + 40.0200000 95.1700000 + 40.0200000 95.1200000 +1814 1814 -1 26 39.67320 95.05579 + 39.6800000 94.7800000 + 39.6700000 94.8300000 + 39.6500000 94.8500000 + 39.6300000 94.8500000 + 39.5700000 94.8700000 + 39.5500000 94.8800000 + 39.6000000 94.9300000 + 39.5800000 94.9800000 + 39.5700000 95.0300000 + 39.5500000 95.1200000 + 39.5800000 95.1500000 + 39.5300000 95.2000000 + 39.5720600 95.2671200 + 39.5920700 95.3315900 + 39.6313600 95.3312200 + 39.7000400 95.3176300 + 39.7292900 95.2784800 + 39.7673100 95.0836200 + 39.8163300 95.0700200 + 39.8156200 94.9792100 + 39.7464300 94.9283400 + 39.7499500 94.8000000 + 39.7500000 94.7983400 + 39.7500000 94.7800000 + 39.7200000 94.8000000 + 39.6800000 94.7800000 +1815 1815 -1 30 39.47500 94.97500 + 39.5300000 95.2000000 + 39.5800000 95.1500000 + 39.5500000 95.1200000 + 39.5700000 95.0300000 + 39.5800000 94.9800000 + 39.6000000 94.9300000 + 39.5500000 94.8800000 + 39.5700000 94.8700000 + 39.6300000 94.8500000 + 39.6500000 94.8500000 + 39.6700000 94.8300000 + 39.6300000 94.7800000 + 39.5800000 94.7500000 + 39.5200000 94.7500000 + 39.5000000 94.7700000 + 39.4700000 94.7700000 + 39.4000000 94.8200000 + 39.3800000 94.8000000 + 39.3500000 94.8300000 + 39.3300000 94.8500000 + 39.3200000 94.9200000 + 39.3200000 94.9300000 + 39.2800000 94.9800000 + 39.3200000 95.0500000 + 39.3500000 95.0500000 + 39.3538300 95.0500000 + 39.3700000 95.0500000 + 39.4200000 95.0500000 + 39.4800000 95.1700000 + 39.5300000 95.2000000 +1850 BIG PAPILLION CREEK AT FORT STREET, NE -1 193 41.44333 96.21917 + 41.3016460 96.1087500 + 41.3037500 96.1316880 + 41.2995830 96.1358130 + 41.2995830 96.1400210 + 41.2954170 96.1441460 + 41.2954170 96.1483540 + 41.2933130 96.1504170 + 41.2912500 96.1524790 + 41.2912500 96.1608540 + 41.2933540 96.1629170 + 41.2974790 96.1670830 + 41.3100210 96.1670830 + 41.3120830 96.1691460 + 41.3120830 96.1733540 + 41.3141460 96.1754170 + 41.3391460 96.1962500 + 41.3475210 96.1962500 + 41.3495830 96.1983540 + 41.3516880 96.2004170 + 41.3537500 96.2024790 + 41.3537500 96.2150210 + 41.3558540 96.2170830 + 41.3579170 96.2191460 + 41.3579170 96.2233540 + 41.3600210 96.2254170 + 41.3620830 96.2274790 + 41.3620830 96.2316880 + 41.3641880 96.2337500 + 41.3662500 96.2358130 + 41.3662500 96.2608540 + 41.3641460 96.2629170 + 41.3620830 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4370830 96.2941460 + 41.4391460 96.2962500 + 41.4412500 96.2983130 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4579170 96.3108130 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4183130 96.1212500 + 41.4162500 96.1233130 + 41.4141880 96.1254170 + 41.4120830 96.1274790 + 41.4100210 96.1295830 + 41.4016460 96.1295830 + 41.3995830 96.1275210 + 41.3975210 96.1254170 + 41.3891460 96.1254170 + 41.3870830 96.1233540 + 41.3850210 96.1212500 + 41.3829170 96.1191880 + 41.3808540 96.1170830 + 41.3766460 96.1170830 + 41.3745830 96.1150210 + 41.3725210 96.1129170 + 41.3683130 96.1129170 + 41.3662500 96.1108540 + 41.3641880 96.1087500 + 41.3558130 96.1087500 + 41.3537500 96.1066880 + 41.3516880 96.1045830 + 41.3495830 96.1025210 + 41.3475210 96.1004170 + 41.3433130 96.1004170 + 41.3225210 96.0795830 + 41.3141460 96.0795830 + 41.3120830 96.0774790 + 41.3120830 96.0754170 + 41.2995830 96.0774790 + 41.2995830 96.0858540 + 41.3037500 96.0899790 + 41.3037500 96.1025210 + 41.3016460 96.1045830 + 41.2995830 96.1066880 + 41.3016460 96.1087500 +201 201 -1 17 39.26190 97.36923 + 39.2731200 97.2660400 + 39.2439200 97.2397800 + 39.1653600 97.2384400 + 39.1254200 97.3020200 + 39.1247400 97.3662600 + 39.1344100 97.3793000 + 39.1735500 97.3929000 + 39.2216100 97.4839000 + 39.2608900 97.4847100 + 39.3000100 97.4983900 + 39.3785800 97.5000200 + 39.3991200 97.4230400 + 39.3797700 97.3968700 + 39.3306700 97.3959200 + 39.3215600 97.3313100 + 39.2727300 97.3046600 + 39.2731200 97.2660400 +208 208 -1 36 39.11710 96.67976 + 39.2583000 96.6349300 + 39.2288400 96.6346700 + 39.1802100 96.5313600 + 39.1017000 96.5179400 + 39.0720700 96.5562500 + 39.0232900 96.4788900 + 38.9741900 96.4785600 + 38.9641600 96.5297900 + 38.8679000 96.5290900 + 38.8679000 96.5333000 + 38.8659300 96.5333000 + 38.8595000 96.5333000 + 38.8595000 96.5416000 + 38.8659000 96.5416000 + 38.8679000 96.5416000 + 38.8679000 96.5750000 + 38.8595000 96.5750000 + 38.8595000 96.5833000 + 38.8679000 96.5833000 + 38.8679000 96.5916000 + 38.8762000 96.5916000 + 38.8762000 96.6079600 + 38.9342800 96.6192900 + 38.9732200 96.6837400 + 39.0222500 96.6970300 + 39.0024700 96.7225000 + 39.0121400 96.7482500 + 39.1003600 96.7748600 + 39.1491400 96.8268000 + 39.2277000 96.8276900 + 39.3157300 96.8802300 + 39.3746600 96.8809500 + 39.3554600 96.8162600 + 39.3260000 96.8159300 + 39.2772900 96.7509900 + 39.2583000 96.6349300 +209 209 -1 23 39.18530 96.45445 + 39.3472300 96.5197000 + 39.2785800 96.4934500 + 39.2689100 96.4547600 + 39.2394000 96.4674500 + 39.2297100 96.4287700 + 39.2494000 96.4160200 + 39.2298000 96.4030400 + 39.2003800 96.3900100 + 39.2201000 96.3643800 + 39.2006300 96.2999600 + 39.1319400 96.2739800 + 39.0728900 96.3251200 + 39.0726700 96.4021700 + 39.0234800 96.4275600 + 39.0232900 96.4788900 + 39.0720700 96.5562500 + 39.1017000 96.5179400 + 39.1802100 96.5313600 + 39.2288400 96.6346700 + 39.2583000 96.6349300 + 39.2586100 96.5705600 + 39.3175900 96.5581400 + 39.3472300 96.5197000 +210 210 -1 26 39.47590 96.15276 + 39.6527900 95.9911900 + 39.6527800 95.9782400 + 39.6429600 95.9782400 + 39.6429600 96.0041300 + 39.4956300 96.0170400 + 39.4661200 96.1074100 + 39.3777200 96.1072800 + 39.3482200 96.1459000 + 39.2794000 96.1972700 + 39.2793600 96.2230300 + 39.3479800 96.2876900 + 39.4264800 96.3138000 + 39.4854800 96.2882400 + 39.4952400 96.3141100 + 39.5247300 96.3013200 + 39.5246700 96.3271600 + 39.5541300 96.3272900 + 39.5542600 96.2755800 + 39.6034200 96.2499000 + 39.6230100 96.2758500 + 39.6230700 96.2499700 + 39.6722100 96.2371900 + 39.6527500 96.0947400 + 39.6724100 96.0688700 + 39.6527800 96.0300200 + 39.6527900 95.9911900 +211 211 -1 19 39.36250 96.41074 + 39.4952400 96.3141100 + 39.4854800 96.2882400 + 39.4264800 96.3138000 + 39.3969900 96.3265800 + 39.3772000 96.3780700 + 39.2495600 96.3645300 + 39.2298000 96.4030400 + 39.2494000 96.4160200 + 39.2297100 96.4287700 + 39.2394000 96.4674500 + 39.2689100 96.4547600 + 39.2785800 96.4934500 + 39.3472300 96.5197000 + 39.4258000 96.5202600 + 39.4355600 96.5332400 + 39.4752000 96.4431500 + 39.4754100 96.3785800 + 39.4950600 96.3786800 + 39.4952400 96.3141100 +213 213 -1 21 39.25470 96.19714 + 39.3482200 96.1459000 + 39.2795000 96.1200100 + 39.2697300 96.0298600 + 39.1715200 95.9912400 + 39.1617100 95.9912400 + 39.1617000 96.0298200 + 39.0829800 96.1967400 + 39.1319700 96.2611300 + 39.1319400 96.2739800 + 39.2006300 96.2999600 + 39.2201000 96.3643800 + 39.2003800 96.3900100 + 39.2298000 96.4030400 + 39.2495600 96.3645300 + 39.3772000 96.3780700 + 39.3969900 96.3265800 + 39.4264800 96.3138000 + 39.3479800 96.2876900 + 39.2793600 96.2230300 + 39.2794000 96.1972700 + 39.3482200 96.1459000 +215 215 -1 13 39.42200 95.92045 + 39.6429600 95.9782400 + 39.5938400 95.9394600 + 39.5054400 95.9524500 + 39.4169700 95.8492900 + 39.2597900 95.8238700 + 39.2009300 95.8754700 + 39.2107700 95.9011800 + 39.2893700 95.9525900 + 39.4170500 95.9654100 + 39.4465200 96.0041200 + 39.4956300 96.0170400 + 39.6429600 96.0041300 + 39.6429600 95.9782400 +216 216 -1 15 39.24990 95.81093 + 39.3972500 95.7977400 + 39.3185000 95.7077600 + 39.2988600 95.7078500 + 39.2202900 95.7081600 + 39.1908800 95.7340100 + 39.0730300 95.7344400 + 39.1125500 95.8884700 + 39.1715000 95.9140900 + 39.2009600 95.9140600 + 39.2107700 95.9011800 + 39.2009300 95.8754700 + 39.2597900 95.8238700 + 39.4169700 95.8492900 + 39.4267500 95.8234600 + 39.3972500 95.7977400 +217 217 -1 15 39.76550 95.77772 + 39.8981900 95.7963300 + 39.8587800 95.7315400 + 39.7898900 95.6799200 + 39.7799600 95.6410600 + 39.7995700 95.6279900 + 39.7799300 95.6280900 + 39.6127800 95.5772000 + 39.6032000 95.6548700 + 39.6033900 95.7324800 + 39.6428200 95.8099900 + 39.6822500 95.9782300 + 39.8786600 95.8872800 + 39.9277200 95.8352300 + 39.8982100 95.8093200 + 39.8981900 95.7963300 +219 219 -1 20 39.64210 95.49305 + 39.6313600 95.3312200 + 39.5920700 95.3315900 + 39.5531700 95.4095100 + 39.5236400 95.3968300 + 39.5139400 95.4227400 + 39.5140000 95.4356700 + 39.5042400 95.4486600 + 39.5239900 95.4743500 + 39.5243400 95.5648000 + 39.5538500 95.5775500 + 39.5540100 95.6292600 + 39.6032000 95.6548700 + 39.6127800 95.5772000 + 39.7799300 95.6280900 + 39.7601200 95.5763400 + 39.7207400 95.5506600 + 39.7203200 95.4470100 + 39.6710900 95.4214900 + 39.6708500 95.3697000 + 39.6313600 95.3312200 +2207 2207 -1 82 43.48620 99.35506 + 43.9733100 99.5985900 + 43.9846600 99.5440700 + 43.9565300 99.4875100 + 43.9766200 99.4747600 + 43.8611000 99.3588500 + 43.8216600 99.3569000 + 43.8223500 99.3294400 + 43.7829100 99.3275200 + 43.7451800 99.2570300 + 43.7468500 99.1884700 + 43.6896500 99.1034900 + 43.6778400 99.1021300 + 43.4928200 99.0809000 + 43.4349500 99.0236400 + 43.3942600 99.0764800 + 43.3761300 99.0073900 + 43.3967700 98.9673200 + 43.4559000 98.9698700 + 43.4672800 98.9020100 + 43.5476300 98.8369700 + 43.6166300 98.8398300 + 43.6746000 98.8970900 + 43.6740000 98.9244900 + 43.7337600 98.8996000 + 43.7635300 98.9232700 + 43.8646300 98.7814000 + 43.8112800 98.6335900 + 43.6882500 98.7193600 + 43.6488100 98.7178000 + 43.6003500 98.6747700 + 43.6025300 98.5652800 + 43.5441600 98.5220300 + 43.5332500 98.5763600 + 43.4730200 98.6287900 + 43.4510800 98.7373000 + 43.3412300 98.8011500 + 43.3221100 98.7730900 + 43.3240800 98.6776600 + 43.2854900 98.6352500 + 43.2460800 98.6337400 + 43.2191800 98.4964900 + 43.3187400 98.4455500 + 43.4463600 98.4774300 + 43.4473800 98.4228100 + 43.4483800 98.3681700 + 43.3899600 98.3252000 + 43.3298500 98.3777300 + 43.2510100 98.3750000 + 43.2517400 98.3341400 + 43.2320400 98.3334700 + 43.0825200 98.4235700 + 43.0700900 98.5590500 + 43.0400000 98.5851100 + 43.0276800 98.7069000 + 42.9877200 98.7324900 + 43.0259700 98.7883500 + 43.0239100 98.8833500 + 43.0815000 98.9537400 + 43.0701000 99.0212200 + 43.0783700 99.0895600 + 43.1263200 99.1461400 + 43.1250000 99.2005000 + 43.2095700 99.3679100 + 43.2489700 99.3698400 + 43.2231300 99.6002300 + 43.2795800 99.6986600 + 43.3477600 99.7296400 + 43.3773200 99.7312500 + 43.3879400 99.7045000 + 43.4269600 99.7202800 + 43.4285000 99.6656900 + 43.4690400 99.6268200 + 43.5566000 99.6725500 + 43.5690800 99.5773500 + 43.6574200 99.5956800 + 43.6975900 99.5703500 + 43.6987000 99.5292400 + 43.7176800 99.5576700 + 43.7866900 99.5612700 + 43.8071500 99.5348500 + 43.8838000 99.6213800 + 43.9733100 99.5985900 +221 221 -1 26 39.52990 95.72639 + 39.6822500 95.9782300 + 39.6428200 95.8099900 + 39.6033900 95.7324800 + 39.6032000 95.6548700 + 39.5540100 95.6292600 + 39.5538500 95.5775500 + 39.5243400 95.5648000 + 39.5239900 95.4743500 + 39.5042400 95.4486600 + 39.4749400 95.4876300 + 39.4454200 95.4749200 + 39.4261200 95.5653900 + 39.3967000 95.5784700 + 39.4164700 95.6170600 + 39.4166500 95.6815600 + 39.3775100 95.7462200 + 39.3972500 95.7977400 + 39.4267500 95.8234600 + 39.4169700 95.8492900 + 39.5054400 95.9524500 + 39.5938400 95.9394600 + 39.6429600 95.9782400 + 39.6527800 95.9782400 + 39.6527900 95.9911900 + 39.6724300 96.0041300 + 39.6822500 95.9782300 +2214 2214 -1 46 42.79310 99.38328 + 42.9519200 99.0160400 + 42.9420700 99.0156200 + 42.8312800 98.6721200 + 42.7429400 98.6551800 + 42.7108700 98.7756600 + 42.6494600 98.8812800 + 42.6396100 98.8808700 + 42.6393100 98.8943700 + 42.6390100 98.9078700 + 42.6159300 99.0554500 + 42.6251300 99.0828700 + 42.6740300 99.0985600 + 42.6730600 99.1390700 + 42.7212900 99.1818400 + 42.7199700 99.2358800 + 42.6704100 99.2470900 + 42.6673300 99.3685800 + 42.6465900 99.4081200 + 42.6634100 99.5170700 + 42.6327800 99.5560500 + 42.6316700 99.5965300 + 42.6687700 99.6795700 + 42.6880700 99.6941100 + 42.6959800 99.7621600 + 42.6424100 99.9079100 + 42.7235400 99.8313100 + 42.7424200 99.8594200 + 42.7309700 99.9129100 + 42.7006400 99.9382500 + 42.7178400 100.0204100 + 42.7576200 100.0091900 + 42.7752100 100.0779100 + 42.8248300 100.0672900 + 42.8239900 100.0943500 + 42.8826200 100.1113800 + 42.8732000 100.0972600 + 42.8679500 99.9477900 + 42.7864900 99.6993800 + 42.7986100 99.6187600 + 42.7716700 99.5225800 + 42.8518700 99.4724600 + 42.8265500 99.3086100 + 42.8702800 99.1344800 + 42.9690700 99.1254000 + 42.9703500 99.0711500 + 42.9519200 99.0160400 +2215 2215 -1 23 42.64960 98.60373 + 42.7512500 98.2090400 + 42.7217100 98.2081000 + 42.6809300 98.2878900 + 42.6213800 98.3129300 + 42.6194200 98.4208900 + 42.5689300 98.4866000 + 42.4795600 98.5238300 + 42.4684000 98.5907900 + 42.4678500 98.6177200 + 42.4737600 98.8066100 + 42.5032900 98.8078000 + 42.5679700 98.9993500 + 42.6291700 98.9074500 + 42.6390100 98.9078700 + 42.6393100 98.8943700 + 42.6396100 98.8808700 + 42.6494600 98.8812800 + 42.7108700 98.7756600 + 42.7429400 98.6551800 + 42.8312800 98.6721200 + 42.7759300 98.4805000 + 42.7789200 98.3181900 + 42.7512500 98.2090400 +2216 2216 -1 29 42.51500 98.26291 + 42.7613300 98.1958300 + 42.7132100 98.1267000 + 42.7434100 98.0870500 + 42.7442600 98.0329700 + 42.7061100 97.9507400 + 42.6566800 97.9628500 + 42.6275400 97.9350200 + 42.6172900 97.9617400 + 42.5090000 97.9586800 + 42.4987500 97.9853400 + 42.3906700 97.9688000 + 42.3502700 98.0349000 + 42.3211600 98.0071700 + 42.2706800 98.0863200 + 42.2792100 98.1672000 + 42.2686800 98.2071700 + 42.3068800 98.2756000 + 42.4228000 98.4005700 + 42.4306100 98.5085800 + 42.4684000 98.5907900 + 42.4795600 98.5238300 + 42.5689300 98.4866000 + 42.6194200 98.4208900 + 42.6213800 98.3129300 + 42.6809300 98.2878900 + 42.7217100 98.2081000 + 42.7512500 98.2090400 + 42.7514800 98.1955200 + 42.7613300 98.1958300 +2217 2217 -1 20 43.11570 99.40417 + 43.2795800 99.6986600 + 43.2231300 99.6002300 + 43.2489700 99.3698400 + 43.2095700 99.3679100 + 43.1250000 99.2005000 + 43.1263200 99.1461400 + 43.0783700 99.0895600 + 43.0701000 99.0212200 + 43.0116300 98.9914900 + 42.9519200 99.0160400 + 42.9703500 99.0711500 + 42.9690700 99.1254000 + 42.9749300 99.2885700 + 43.1250100 99.5814900 + 43.1231300 99.6494300 + 43.1523000 99.6645900 + 43.1503800 99.7325600 + 43.1972800 99.8168400 + 43.2473100 99.7923500 + 43.2795800 99.6986600 +2218 2218 -1 21 42.91640 98.60837 + 42.9877200 98.7324900 + 42.9488900 98.7038100 + 42.9699700 98.6367800 + 42.9609400 98.5957200 + 42.8749200 98.4569500 + 42.8764200 98.3756800 + 42.8302600 98.1980200 + 42.7613300 98.1958300 + 42.7514800 98.1955200 + 42.7512500 98.2090400 + 42.7789200 98.3181900 + 42.7759300 98.4805000 + 42.8312800 98.6721200 + 42.9420700 99.0156200 + 42.9519200 99.0160400 + 43.0116300 98.9914900 + 43.0701000 99.0212200 + 43.0815000 98.9537400 + 43.0239100 98.8833500 + 43.0259700 98.7883500 + 42.9877200 98.7324900 +2219 2219 -1 26 42.55930 97.78151 + 42.5736900 97.5422400 + 42.5443200 97.5281100 + 42.5133000 97.6487400 + 42.4632000 97.7149000 + 42.4522700 97.7954500 + 42.4231100 97.7677700 + 42.3737100 97.7799700 + 42.3229800 97.8862200 + 42.3211600 98.0071700 + 42.3502700 98.0349000 + 42.3906700 97.9688000 + 42.4987500 97.9853400 + 42.5090000 97.9586800 + 42.6172900 97.9617400 + 42.6275400 97.9350200 + 42.6566800 97.9628500 + 42.7061100 97.9507400 + 42.7457000 97.9383200 + 42.7179100 97.8158600 + 42.7673400 97.8036300 + 42.7677100 97.7765800 + 42.7974400 97.7638000 + 42.7302600 97.6268600 + 42.7007100 97.6261700 + 42.6418000 97.6112800 + 42.5736900 97.5422400 +2220 2220 -1 46 43.12430 98.10638 + 43.5476800 98.3305500 + 43.5479300 98.3168700 + 43.4221000 98.1760100 + 43.3629600 98.1741400 + 43.2755900 98.0895800 + 43.2760200 98.0623400 + 43.2477100 97.9797400 + 43.1304700 97.9083600 + 43.1020700 97.8259900 + 42.9168800 97.6719400 + 42.9275800 97.6043900 + 42.8797600 97.4813200 + 42.8305200 97.4802600 + 42.8100300 97.5475200 + 42.7007100 97.6261700 + 42.7302600 97.6268600 + 42.7974400 97.7638000 + 42.7677100 97.7765800 + 42.7673400 97.8036300 + 42.7179100 97.8158600 + 42.7457000 97.9383200 + 42.7061100 97.9507400 + 42.7442600 98.0329700 + 42.7434100 98.0870500 + 42.7132100 98.1267000 + 42.7613300 98.1958300 + 42.8302600 98.1980200 + 42.8764200 98.3756800 + 42.8749200 98.4569500 + 42.9609400 98.5957200 + 42.9699700 98.6367800 + 42.9488900 98.7038100 + 42.9877200 98.7324900 + 43.0276800 98.7069000 + 43.0400000 98.5851100 + 43.0700900 98.5590500 + 43.0825200 98.4235700 + 43.2320400 98.3334700 + 43.2517400 98.3341400 + 43.2510100 98.3750000 + 43.3298500 98.3777300 + 43.3899600 98.3252000 + 43.4483800 98.3681700 + 43.4473800 98.4228100 + 43.5452000 98.4673200 + 43.5476800 98.3305500 +223 223 -1 24 39.39630 95.55903 + 39.5042400 95.4486600 + 39.5140000 95.4356700 + 39.5139400 95.4227400 + 39.4351800 95.3846600 + 39.4152100 95.3203200 + 39.3563500 95.3337600 + 39.3666200 95.4239200 + 39.2981000 95.4759900 + 39.2983100 95.5275100 + 39.2787100 95.5405200 + 39.2985700 95.6048000 + 39.2789300 95.6049000 + 39.3184100 95.6691100 + 39.2988600 95.7078500 + 39.3185000 95.7077600 + 39.3972500 95.7977400 + 39.3775100 95.7462200 + 39.4166500 95.6815600 + 39.4164700 95.6170600 + 39.3967000 95.5784700 + 39.4261200 95.5653900 + 39.4454200 95.4749200 + 39.4749400 95.4876300 + 39.5042400 95.4486600 +224 224 -1 22 39.23400 95.40574 + 39.3563500 95.3337600 + 39.2974200 95.3343000 + 39.2776400 95.3087300 + 39.3167000 95.2697100 + 39.2478800 95.2575200 + 39.1984600 95.2065700 + 39.1790600 95.2453700 + 39.1989300 95.2837500 + 39.1792900 95.2839500 + 39.1696800 95.3226200 + 39.1013900 95.4131800 + 39.1115500 95.4901900 + 39.1609500 95.5669800 + 39.1903700 95.5539400 + 39.2101400 95.5924100 + 39.2789300 95.6049000 + 39.2985700 95.6048000 + 39.2787100 95.5405200 + 39.2983100 95.5275100 + 39.2981000 95.4759900 + 39.3666200 95.4239200 + 39.3563500 95.3337600 +225 225 -1 29 39.13180 95.58001 + 39.2789300 95.6049000 + 39.2101400 95.5924100 + 39.1903700 95.5539400 + 39.1609500 95.5669800 + 39.1115500 95.4901900 + 39.1013900 95.4131800 + 39.1696800 95.3226200 + 39.0814300 95.3491300 + 39.0816300 95.3876500 + 39.0521700 95.3879000 + 39.0325900 95.4009000 + 39.0030600 95.3883100 + 39.0134000 95.5037000 + 38.9547200 95.5682100 + 38.9744500 95.5937300 + 38.9548800 95.6194800 + 38.9746700 95.6706800 + 38.9452400 95.6836200 + 38.9651800 95.8374000 + 39.0044600 95.8373200 + 39.0338700 95.7987500 + 39.0434500 95.6832000 + 39.0630600 95.6702700 + 39.0730300 95.7344400 + 39.1908800 95.7340100 + 39.2202900 95.7081600 + 39.2988600 95.7078500 + 39.3184100 95.6691100 + 39.2789300 95.6049000 +226 226 -1 15 39.31390 96.02354 + 39.4956300 96.0170400 + 39.4465200 96.0041200 + 39.4170500 95.9654100 + 39.2893700 95.9525900 + 39.2107700 95.9011800 + 39.2009600 95.9140600 + 39.1715000 95.9140900 + 39.1322400 95.9655500 + 39.1715200 95.9912400 + 39.2697300 96.0298600 + 39.2795000 96.1200100 + 39.3482200 96.1459000 + 39.3777200 96.1072800 + 39.4661200 96.1074100 + 39.4956300 96.0170400 +229 229 -1 18 39.43480 95.23637 + 39.3563500 95.3337600 + 39.4152100 95.3203200 + 39.4351800 95.3846600 + 39.5139400 95.4227400 + 39.5236400 95.3968300 + 39.5531700 95.4095100 + 39.5920700 95.3315900 + 39.5720600 95.2671200 + 39.5300000 95.2000000 + 39.4800000 95.1700000 + 39.4200000 95.0500000 + 39.3700000 95.0500000 + 39.3538300 95.0500000 + 39.3653300 95.1918600 + 39.3167000 95.2697100 + 39.2776400 95.3087300 + 39.2974200 95.3343000 + 39.3563500 95.3337600 +230 230 -1 17 39.23190 95.10308 + 39.3538300 95.0500000 + 39.3500000 95.0500000 + 39.3200000 95.0500000 + 39.2800000 94.9800000 + 39.2300000 94.9700000 + 39.2300000 94.9500000 + 39.1971600 94.9364500 + 39.1080600 94.9377600 + 39.0985600 94.9764400 + 39.1280300 94.9760200 + 39.1188200 95.0532500 + 39.1681100 95.0783200 + 39.1984600 95.2065700 + 39.2478800 95.2575200 + 39.3167000 95.2697100 + 39.3653300 95.1918600 + 39.3538300 95.0500000 +2619 2619 -1 47 43.94200 97.85540 + 44.3683900 97.5693000 + 44.3190000 97.5681500 + 44.2997400 97.5262000 + 44.2503600 97.5250900 + 44.2497200 97.5803800 + 44.0231600 97.5337800 + 44.0223400 97.6026600 + 43.9924000 97.6295000 + 43.7654600 97.6240800 + 43.7351800 97.6782500 + 43.6763500 97.6493900 + 43.6460600 97.7034800 + 43.5567700 97.7423200 + 43.5156500 97.8643700 + 43.6225200 97.9768800 + 43.6004600 98.1269000 + 43.5598900 98.1940800 + 43.5476800 98.3305500 + 43.7029600 98.4730100 + 43.7597700 98.5986400 + 43.7992100 98.6001400 + 43.8112800 98.6335900 + 43.8646300 98.7814000 + 43.9449700 98.7158400 + 43.9266300 98.6462900 + 43.9770500 98.5931500 + 44.0263800 98.5950400 + 44.0450300 98.6509000 + 44.1149300 98.6122200 + 44.1234200 98.6815600 + 44.1826400 98.6839000 + 44.1864000 98.4906200 + 44.1087100 98.4187900 + 44.0709600 98.3209000 + 43.9927300 98.2769100 + 43.9445600 98.2064700 + 43.8952300 98.2048700 + 43.8961300 98.1498800 + 43.9268300 98.0820400 + 43.9663000 98.0832400 + 44.0491000 97.8238500 + 44.1487400 97.7575000 + 44.1693800 97.6889900 + 44.2093800 97.6485300 + 44.2888800 97.6089600 + 44.3677200 97.6246800 + 44.3683900 97.5693000 +2620 2620 -1 32 43.59840 97.56263 + 44.0231600 97.5337800 + 43.8068500 97.4602400 + 43.6983300 97.4579200 + 43.6594700 97.4022800 + 43.4129500 97.3972400 + 43.4121900 97.3980000 + 43.3730800 97.4373700 + 43.3237900 97.4363400 + 43.3040700 97.4359300 + 43.2842100 97.4491400 + 43.2836000 97.5036500 + 43.1735600 97.6373400 + 43.1803200 97.8689000 + 43.2770700 97.9942100 + 43.2760200 98.0623400 + 43.2755900 98.0895800 + 43.3629600 98.1741400 + 43.4221000 98.1760100 + 43.5479300 98.3168700 + 43.5476800 98.3305500 + 43.5598900 98.1940800 + 43.6004600 98.1269000 + 43.6225200 97.9768800 + 43.5156500 97.8643700 + 43.5567700 97.7423200 + 43.6460600 97.7034800 + 43.6763500 97.6493900 + 43.7351800 97.6782500 + 43.7654600 97.6240800 + 43.9924000 97.6295000 + 44.0223400 97.6026600 + 44.0231600 97.5337800 +2646 2646 -1 21 43.02550 97.12052 + 43.0434100 96.7921000 + 43.0235300 96.8190300 + 42.8955400 96.8039600 + 42.7968600 96.8298800 + 42.7761300 96.9784600 + 42.8544100 97.0473000 + 42.9603200 97.3202400 + 43.0588400 97.3221300 + 43.2152200 97.4476900 + 43.2743500 97.4489400 + 43.2749400 97.3944300 + 43.2263700 97.3253500 + 43.1968000 97.3247800 + 43.1685400 97.1881600 + 43.0895800 97.2003900 + 43.0607400 97.1183600 + 42.9721800 97.1033600 + 42.9732500 96.9676900 + 43.0135100 96.8460600 + 43.0431600 96.8328500 + 43.0434100 96.7921000 +2647 2647 -1 37 43.28290 97.27369 + 43.5934000 97.0860000 + 43.5935200 97.0723000 + 43.5248100 97.0302000 + 43.5148400 97.0437200 + 43.2803300 96.7266800 + 43.2015500 96.7122400 + 43.2174300 96.6487100 + 43.1800000 96.6300000 + 43.1522000 96.7253300 + 43.0434100 96.7921000 + 43.0431600 96.8328500 + 43.0135100 96.8460600 + 42.9732500 96.9676900 + 42.9721800 97.1033600 + 43.0607400 97.1183600 + 43.0895800 97.2003900 + 43.1685400 97.1881600 + 43.1968000 97.3247800 + 43.2263700 97.3253500 + 43.2749400 97.3944300 + 43.2743500 97.4489400 + 43.2842100 97.4491400 + 43.3040700 97.4359300 + 43.3237900 97.4363400 + 43.3249300 97.3272500 + 43.3620500 97.2672800 + 43.3258600 97.2318000 + 43.3169800 97.1225400 + 43.2385800 97.0667700 + 43.2191900 97.0256200 + 43.2293600 96.9849200 + 43.2786400 96.9856200 + 43.3579100 96.9321700 + 43.4262100 97.0287200 + 43.4755100 97.0294600 + 43.5439800 97.0988900 + 43.5934000 97.0860000 +2648 2648 -1 24 43.48010 97.09973 + 43.7410100 97.1295100 + 43.7215200 97.1017500 + 43.6326300 97.1140200 + 43.5934000 97.0860000 + 43.5439800 97.0988900 + 43.4755100 97.0294600 + 43.4262100 97.0287200 + 43.3579100 96.9321700 + 43.2786400 96.9856200 + 43.2293600 96.9849200 + 43.2191900 97.0256200 + 43.2385800 97.0667700 + 43.3169800 97.1225400 + 43.3258600 97.2318000 + 43.3620500 97.2672800 + 43.3750200 97.2463200 + 43.4444200 97.2066000 + 43.4446700 97.1792800 + 43.4738700 97.2207900 + 43.5624900 97.2360500 + 43.5819600 97.2637900 + 43.6805700 97.2667200 + 43.6812200 97.1970700 + 43.7410100 97.1295100 +2650 2650 -1 29 43.78710 97.43668 + 44.2503600 97.5250900 + 44.2213700 97.4691600 + 44.1233800 97.3980500 + 44.1033500 97.4252200 + 44.0441200 97.4239900 + 44.0237800 97.4786800 + 43.9551500 97.4358900 + 43.8071400 97.4327800 + 43.7778400 97.4047000 + 43.7589600 97.3219600 + 43.6805700 97.2667200 + 43.5819600 97.2637900 + 43.5624900 97.2360500 + 43.4738700 97.2207900 + 43.4446700 97.1792800 + 43.4444200 97.2066000 + 43.3750200 97.2463200 + 43.3620500 97.2672800 + 43.3249300 97.3272500 + 43.3237900 97.4363400 + 43.3730800 97.4373700 + 43.4121900 97.3980000 + 43.4129500 97.3972400 + 43.6594700 97.4022800 + 43.6983300 97.4579200 + 43.8068500 97.4602400 + 44.0231600 97.5337800 + 44.2497200 97.5803800 + 44.2503600 97.5250900 +309 309 -1 25 39.44030 98.02153 + 39.4909700 97.9027900 + 39.4715200 97.8893700 + 39.4626600 97.8245700 + 39.4035600 97.8359800 + 39.3251900 97.8211100 + 39.3246200 97.8597600 + 39.2951600 97.8590000 + 39.2755200 97.8585000 + 39.2655100 97.8711200 + 39.2737400 97.9743700 + 39.2835600 97.9746300 + 39.3228300 97.9757000 + 39.3504000 98.0924900 + 39.3294400 98.1692200 + 39.3678100 98.2219600 + 39.3883500 98.1709900 + 39.4278500 98.1592600 + 39.4285200 98.1205700 + 39.5760300 98.1119700 + 39.5945600 98.1771900 + 39.6142000 98.1777900 + 39.6150900 98.1260500 + 39.5480600 98.0206500 + 39.5298500 97.9296600 + 39.4909700 97.9027900 +311 311 -1 15 39.35650 97.66035 + 39.4177000 97.5137300 + 39.3882400 97.5131100 + 39.3785800 97.5000200 + 39.3000100 97.4983900 + 39.2608900 97.4847100 + 39.2605800 97.5104500 + 39.2504500 97.5359900 + 39.2790900 97.6009900 + 39.3251900 97.8211100 + 39.4035600 97.8359800 + 39.4626600 97.8245700 + 39.4052100 97.7199000 + 39.4257200 97.6558600 + 39.4268900 97.5655500 + 39.4177000 97.5137300 +601 601 -1 18 41.02060 97.86402 + 41.0478500 97.6014300 + 41.0178600 97.6403400 + 41.0162700 97.7590600 + 40.9669500 97.7710200 + 40.9652500 97.8896600 + 40.9544300 97.9552900 + 40.9247400 97.9676500 + 40.9437800 98.0077300 + 40.9322400 98.1128500 + 40.9516800 98.1266200 + 41.0219800 98.0363500 + 41.0228100 97.9835700 + 41.0525000 97.9712100 + 41.0731600 97.9057500 + 41.0550400 97.7996300 + 41.0763200 97.6813100 + 41.1164900 97.6162000 + 41.0478500 97.6014300 +602 602 -1 20 41.16030 97.25434 + 41.2211500 96.9966300 + 41.1818200 96.9960800 + 41.1815100 97.0357500 + 41.0824200 97.1267500 + 41.1020800 97.1270600 + 41.1016000 97.1798900 + 41.0520800 97.2186700 + 41.0513000 97.2978700 + 41.0609900 97.3112500 + 41.0608600 97.3244500 + 41.1395000 97.3259200 + 41.1578700 97.4452600 + 41.2160800 97.5126100 + 41.2269800 97.4202000 + 41.2665900 97.3945200 + 41.2483000 97.2617700 + 41.2682300 97.2356500 + 41.2693200 97.1164900 + 41.2304500 97.0629300 + 41.2211500 96.9966300 +603 603 -1 14 40.99860 97.19780 + 41.0824200 97.1267500 + 41.0232000 97.1521900 + 40.9741700 97.1382100 + 40.9548600 97.0983500 + 40.9155500 97.0977400 + 40.8951800 97.1764600 + 40.9250300 97.1374200 + 40.9933500 97.1912800 + 41.0122500 97.2707600 + 41.0513000 97.2978700 + 41.0520800 97.2186700 + 41.1016000 97.1798900 + 41.1020800 97.1270600 + 41.0824200 97.1267500 +604 604 -1 13 40.90340 98.04480 + 40.9652500 97.8896600 + 40.9361500 97.8625200 + 40.8773800 97.8478100 + 40.8457100 97.9917900 + 40.8824500 98.1508900 + 40.8415500 98.2418000 + 40.9210800 98.1916000 + 40.9516800 98.1266200 + 40.9322400 98.1128500 + 40.9437800 98.0077300 + 40.9247400 97.9676500 + 40.9544300 97.9552900 + 40.9652500 97.8896600 +605 605 -1 18 40.97810 97.63250 + 41.0501800 97.4034600 + 40.9620100 97.3753400 + 40.9222600 97.4141000 + 40.9221100 97.4272800 + 40.9024500 97.4268800 + 40.9307100 97.5328800 + 40.9005900 97.5849200 + 40.8777600 97.8214700 + 40.8773800 97.8478100 + 40.9361500 97.8625200 + 40.9652500 97.8896600 + 40.9669500 97.7710200 + 41.0162700 97.7590600 + 41.0178600 97.6403400 + 41.0478500 97.6014300 + 41.0787700 97.4832600 + 41.0696900 97.4170500 + 41.0501800 97.4034600 +606 606 -1 15 40.97780 97.27576 + 41.0608600 97.3244500 + 41.0609900 97.3112500 + 41.0513000 97.2978700 + 41.0122500 97.2707600 + 40.9933500 97.1912800 + 40.9250300 97.1374200 + 40.8951800 97.1764600 + 40.8946800 97.2291400 + 40.9041300 97.2688200 + 40.9229700 97.3482300 + 40.9222600 97.4141000 + 40.9620100 97.3753400 + 41.0501800 97.4034600 + 41.0510300 97.3242600 + 41.0608600 97.3244500 +607 607 -1 17 40.82140 98.10301 + 40.8777600 97.8214700 + 40.8282400 97.8465300 + 40.8276600 97.8859900 + 40.7981800 97.8852200 + 40.7975900 97.9246600 + 40.7763000 98.0293000 + 40.7955300 98.0561600 + 40.7832900 98.2005000 + 40.8013100 98.2931600 + 40.7603200 98.3838800 + 40.7799700 98.3845400 + 40.8317300 98.2414900 + 40.8415500 98.2418000 + 40.8824500 98.1508900 + 40.8457100 97.9917900 + 40.8773800 97.8478100 + 40.8777600 97.8214700 +608 608 -1 11 40.85700 97.65644 + 40.9024500 97.4268800 + 40.7942000 97.4378600 + 40.7832900 97.5297000 + 40.8214600 97.6226300 + 40.7981800 97.8852200 + 40.8276600 97.8859900 + 40.8282400 97.8465300 + 40.8777600 97.8214700 + 40.9005900 97.5849200 + 40.9307100 97.5328800 + 40.9024500 97.4268800 +609 609 -1 23 40.68330 98.19797 + 40.7975900 97.9246600 + 40.7288100 97.9228000 + 40.7183800 97.9619400 + 40.6485700 98.0256600 + 40.6671600 98.0918500 + 40.6269800 98.1431700 + 40.6258500 98.2087600 + 40.5760400 98.2465600 + 40.5753400 98.2858800 + 40.5652800 98.2986800 + 40.5844500 98.3255200 + 40.5827300 98.4172900 + 40.6018800 98.4441800 + 40.6799600 98.4731400 + 40.7207700 98.3957000 + 40.7502400 98.3967000 + 40.7504900 98.3835500 + 40.7603200 98.3838800 + 40.8013100 98.2931600 + 40.7832900 98.2005000 + 40.7955300 98.0561600 + 40.7763000 98.0293000 + 40.7975900 97.9246600 +610 610 -1 19 40.67020 97.88813 + 40.7832900 97.5297000 + 40.7045200 97.5411500 + 40.6738900 97.6324000 + 40.6344200 97.6446200 + 40.6233700 97.7362300 + 40.5937200 97.7486200 + 40.5321000 97.9306000 + 40.5189100 98.1399200 + 40.5760400 98.2465600 + 40.6258500 98.2087600 + 40.6269800 98.1431700 + 40.6671600 98.0918500 + 40.6485700 98.0256600 + 40.7183800 97.9619400 + 40.7288100 97.9228000 + 40.7975900 97.9246600 + 40.7981800 97.8852200 + 40.8214600 97.6226300 + 40.7832900 97.5297000 +611 611 -1 26 40.74950 97.40932 + 40.9041300 97.2688200 + 40.8455400 97.2282900 + 40.7767500 97.2271000 + 40.7772400 97.1745100 + 40.7477600 97.1740200 + 40.7181600 97.1866700 + 40.7172700 97.2786300 + 40.7369200 97.2789800 + 40.7463500 97.3185900 + 40.7165900 97.3443100 + 40.6854900 97.4882000 + 40.6460300 97.5005000 + 40.6458800 97.5136200 + 40.6260700 97.5263200 + 40.5759700 97.6039300 + 40.6049400 97.6439400 + 40.6344200 97.6446200 + 40.6738900 97.6324000 + 40.7045200 97.5411500 + 40.7832900 97.5297000 + 40.7942000 97.4378600 + 40.9024500 97.4268800 + 40.9221100 97.4272800 + 40.9222600 97.4141000 + 40.9229700 97.3482300 + 40.9041300 97.2688200 +612 612 -1 19 40.68260 97.26440 + 40.6503100 97.0805200 + 40.6498500 97.1330200 + 40.6693800 97.1464600 + 40.6493700 97.1855200 + 40.6483400 97.2905200 + 40.6181800 97.3555800 + 40.6168600 97.4736400 + 40.6460300 97.5005000 + 40.6854900 97.4882000 + 40.7165900 97.3443100 + 40.7463500 97.3185900 + 40.7369200 97.2789800 + 40.7172700 97.2786300 + 40.7181600 97.1866700 + 40.7477600 97.1740200 + 40.7483500 97.1083000 + 40.6998800 97.0287300 + 40.6703900 97.0283100 + 40.6503100 97.0805200 +613 613 -1 33 40.89170 97.07623 + 41.1818200 96.9960800 + 41.1130100 96.9951100 + 41.0142800 97.0464900 + 40.9750700 97.0327300 + 40.9557300 96.9929000 + 40.9360700 96.9926200 + 40.9358600 97.0189800 + 40.8768900 97.0181400 + 40.7688800 97.0034300 + 40.7298700 96.9634600 + 40.7003900 96.9630600 + 40.6518300 96.8836400 + 40.6318900 96.9227700 + 40.6122400 96.9225100 + 40.6016000 97.0273100 + 40.6503100 97.0805200 + 40.6703900 97.0283100 + 40.6998800 97.0287300 + 40.7483500 97.1083000 + 40.7477600 97.1740200 + 40.7772400 97.1745100 + 40.7767500 97.2271000 + 40.8455400 97.2282900 + 40.9041300 97.2688200 + 40.8946800 97.2291400 + 40.8951800 97.1764600 + 40.9155500 97.0977400 + 40.9548600 97.0983500 + 40.9741700 97.1382100 + 41.0232000 97.1521900 + 41.0824200 97.1267500 + 41.1815100 97.0357500 + 41.1818200 96.9960800 +614 614 -1 17 40.53160 97.65487 + 40.6260700 97.5263200 + 40.5580600 97.4593100 + 40.5294600 97.3801000 + 40.4803400 97.3791400 + 40.4403000 97.4438200 + 40.4300300 97.4828600 + 40.4287600 97.5875300 + 40.4767000 97.6802700 + 40.4650700 97.8109400 + 40.4741300 97.8635500 + 40.5321000 97.9306000 + 40.5937200 97.7486200 + 40.6233700 97.7362300 + 40.6344200 97.6446200 + 40.6049400 97.6439400 + 40.5759700 97.6039300 + 40.6260700 97.5263200 +615 615 -1 21 40.56490 97.26287 + 40.6460300 97.5005000 + 40.6168600 97.4736400 + 40.6181800 97.3555800 + 40.6483400 97.2905200 + 40.6493700 97.1855200 + 40.6210400 97.0538300 + 40.6016000 97.0273100 + 40.5918800 97.0140500 + 40.4839000 96.9994300 + 40.4829200 97.1172700 + 40.5219800 97.1441000 + 40.5215000 97.1965000 + 40.5507300 97.2232100 + 40.5499500 97.3018400 + 40.4806200 97.3529600 + 40.4803400 97.3791400 + 40.5294600 97.3801000 + 40.5580600 97.4593100 + 40.6260700 97.5263200 + 40.6458800 97.5136200 + 40.6460300 97.5005000 +616 616 -1 17 40.40830 97.14268 + 40.4839000 96.9994300 + 40.3664900 96.9324100 + 40.3661000 96.9847000 + 40.2965800 97.0751800 + 40.2658000 97.2183300 + 40.2753700 97.2446100 + 40.3244900 97.2454700 + 40.3044500 97.2843100 + 40.3531700 97.3244000 + 40.4514200 97.3262300 + 40.4806200 97.3529600 + 40.5499500 97.3018400 + 40.5507300 97.2232100 + 40.5215000 97.1965000 + 40.5219800 97.1441000 + 40.4829200 97.1172700 + 40.4839000 96.9994300 +617 617 -1 23 40.39550 96.93874 + 40.6122400 96.9225100 + 40.5631100 96.9218800 + 40.5241700 96.8689600 + 40.5346000 96.7773500 + 40.5253000 96.6855300 + 40.5057800 96.6591400 + 40.4664100 96.6718700 + 40.3878000 96.6711300 + 40.2005300 96.7737300 + 40.2293200 96.8784300 + 40.1793300 96.9951800 + 40.1985500 97.0476200 + 40.1786800 97.0734100 + 40.1974000 97.1780400 + 40.2268800 97.1785200 + 40.2658000 97.2183300 + 40.2965800 97.0751800 + 40.3661000 96.9847000 + 40.3664900 96.9324100 + 40.4839000 96.9994300 + 40.5918800 97.0140500 + 40.6016000 97.0273100 + 40.6122400 96.9225100 +618 618 -1 18 40.26010 96.63042 + 40.4664100 96.6718700 + 40.4372600 96.6061600 + 40.3980800 96.5796700 + 40.4179600 96.5275000 + 40.3688300 96.5271400 + 40.3395200 96.4877100 + 40.2510900 96.4871100 + 40.2018600 96.5128600 + 40.2015800 96.5780800 + 40.0935100 96.5772100 + 40.0834400 96.6292100 + 40.0539000 96.6419800 + 40.0537600 96.6680100 + 40.1224600 96.6816800 + 40.1417400 96.7470200 + 40.2005300 96.7737300 + 40.3878000 96.6711300 + 40.4664100 96.6718700 +619 619 -1 16 40.12620 96.85772 + 40.2005300 96.7737300 + 40.1417400 96.7470200 + 40.1224600 96.6816800 + 40.0537600 96.6680100 + 40.0341100 96.6678200 + 40.0237000 96.7718200 + 40.0230100 96.8759000 + 40.0423900 96.9151800 + 40.0522100 96.9153100 + 40.0521100 96.9283200 + 40.0709500 97.0327300 + 40.1496500 97.0208300 + 40.1985500 97.0476200 + 40.1793300 96.9951800 + 40.2293200 96.8784300 + 40.2005300 96.7737300 +620 620 -1 13 40.15250 96.49908 + 40.1729200 96.3561900 + 40.1530300 96.4343000 + 40.0543300 96.5508600 + 40.0539000 96.6419800 + 40.0834400 96.6292100 + 40.0935100 96.5772100 + 40.2015800 96.5780800 + 40.2018600 96.5128600 + 40.2510900 96.4871100 + 40.2511900 96.4610100 + 40.2315800 96.4478300 + 40.2220500 96.3564400 + 40.1729200 96.3561900 +621 621 -1 25 40.00030 96.62252 + 40.1729200 96.3561900 + 40.1533500 96.3300200 + 40.1140500 96.3298500 + 40.0844700 96.3687700 + 39.9960900 96.3553200 + 39.9665400 96.3811700 + 39.9663300 96.4461700 + 39.9269400 96.4719200 + 39.9167400 96.5628000 + 39.8872100 96.5755500 + 39.8277600 96.6788900 + 39.8473300 96.6920500 + 39.8664400 96.7831100 + 39.8662000 96.8220600 + 39.9252200 96.8097400 + 39.9247800 96.8747000 + 40.0423900 96.9151800 + 40.0230100 96.8759000 + 40.0237000 96.7718200 + 40.0341100 96.6678200 + 40.0537600 96.6680100 + 40.0539000 96.6419800 + 40.0543300 96.5508600 + 40.1530300 96.4343000 + 40.1729200 96.3561900 +622 622 -1 14 39.76410 96.68445 + 39.9269400 96.4719200 + 39.8286100 96.4972200 + 39.7791600 96.5746800 + 39.7789200 96.6265600 + 39.7592000 96.6393400 + 39.6412700 96.6512500 + 39.6013200 96.7673000 + 39.7587100 96.7300900 + 39.8664400 96.7831100 + 39.8473300 96.6920500 + 39.8277600 96.6788900 + 39.8872100 96.5755500 + 39.9167400 96.5628000 + 39.9269400 96.4719200 +623 623 -1 17 39.72380 96.90471 + 39.8664400 96.7831100 + 39.7587100 96.7300900 + 39.6013200 96.7673000 + 39.6010800 96.8061100 + 39.5912600 96.8059900 + 39.5910900 96.8318600 + 39.5810900 96.8576000 + 39.6201100 96.8968900 + 39.6194200 96.9874500 + 39.6481400 97.0784500 + 39.7070700 97.0793400 + 39.7665400 97.0154000 + 39.7666500 97.0024300 + 39.7177400 96.9758500 + 39.7182300 96.9110600 + 39.8662000 96.8220600 + 39.8664400 96.7831100 +626 626 -1 21 40.39370 98.28368 + 40.5652800 98.2986800 + 40.5161600 98.2970900 + 40.4686700 98.2038900 + 40.4296000 98.1895900 + 40.3724300 98.0832100 + 40.3333500 98.0690000 + 40.3121700 98.1598600 + 40.2530100 98.1711300 + 40.2521000 98.2233300 + 40.2029900 98.2218000 + 40.2308200 98.3140300 + 40.2504600 98.3146700 + 40.2691300 98.3675100 + 40.2789600 98.3678400 + 40.2764400 98.4983700 + 40.4046500 98.4766800 + 40.4741700 98.4398000 + 40.4744200 98.4267200 + 40.5827300 98.4172900 + 40.5844500 98.3255200 + 40.5652800 98.2986800 +627 627 -1 26 40.29910 98.04586 + 40.4686700 98.2038900 + 40.4704400 98.0991700 + 40.3241600 98.0295300 + 40.3249900 97.9772800 + 40.2676400 97.8712200 + 40.2685900 97.8059600 + 40.2303900 97.7266900 + 40.2314400 97.6484100 + 40.2028000 97.5825200 + 40.1731700 97.5949100 + 40.1796200 97.8428400 + 40.1301200 97.8676400 + 40.1772300 97.9992800 + 40.1277000 98.0239600 + 40.1471400 98.0375500 + 40.1364600 98.0893900 + 40.1655000 98.1163200 + 40.1545600 98.1811800 + 40.2029900 98.2218000 + 40.2521000 98.2233300 + 40.2530100 98.1711300 + 40.3121700 98.1598600 + 40.3333500 98.0690000 + 40.3724300 98.0832100 + 40.4296000 98.1895900 + 40.4686700 98.2038900 +628 628 -1 24 40.38940 97.88874 + 40.5321000 97.9306000 + 40.4741300 97.8635500 + 40.4650700 97.8109400 + 40.3684500 97.6908000 + 40.3313100 97.5200300 + 40.2826600 97.4798100 + 40.2335400 97.4788000 + 40.2329200 97.5309800 + 40.2032900 97.5434000 + 40.2028000 97.5825200 + 40.2314400 97.6484100 + 40.2303900 97.7266900 + 40.2685900 97.8059600 + 40.2676400 97.8712200 + 40.3249900 97.9772800 + 40.3241600 98.0295300 + 40.4704400 98.0991700 + 40.4686700 98.2038900 + 40.5161600 98.2970900 + 40.5652800 98.2986800 + 40.5753400 98.2858800 + 40.5760400 98.2465600 + 40.5189100 98.1399200 + 40.5321000 97.9306000 +629 629 -1 18 40.33060 97.47400 + 40.4300300 97.4828600 + 40.3908800 97.4689700 + 40.3716800 97.4293500 + 40.3225600 97.4283700 + 40.3228500 97.4022400 + 40.2247500 97.3872700 + 40.1845700 97.4647400 + 40.2040700 97.4781900 + 40.2032900 97.5434000 + 40.2329200 97.5309800 + 40.2335400 97.4788000 + 40.2826600 97.4798100 + 40.3313100 97.5200300 + 40.3684500 97.6908000 + 40.4650700 97.8109400 + 40.4767000 97.6802700 + 40.4287600 97.5875300 + 40.4300300 97.4828600 +630 630 -1 42 40.21800 97.28934 + 40.4806200 97.3529600 + 40.4514200 97.3262300 + 40.3531700 97.3244000 + 40.3044500 97.2843100 + 40.3244900 97.2454700 + 40.2753700 97.2446100 + 40.2658000 97.2183300 + 40.2268800 97.1785200 + 40.1974000 97.1780400 + 40.0991600 97.1764200 + 40.0984100 97.2545600 + 40.1666500 97.3079100 + 40.1658100 97.3861200 + 40.0953900 97.5280500 + 40.0261500 97.5656100 + 40.0248100 97.6696900 + 39.9755300 97.6815500 + 39.9553600 97.7200800 + 39.9648200 97.7463100 + 40.0041100 97.7472700 + 40.0317000 97.8780900 + 40.0707900 97.8921400 + 40.0994700 97.9450000 + 40.0990600 97.9710500 + 40.1277000 98.0239600 + 40.1772300 97.9992800 + 40.1301200 97.8676400 + 40.1796200 97.8428400 + 40.1731700 97.5949100 + 40.2028000 97.5825200 + 40.2032900 97.5434000 + 40.2040700 97.4781900 + 40.1845700 97.4647400 + 40.2247500 97.3872700 + 40.3228500 97.4022400 + 40.3225600 97.4283700 + 40.3716800 97.4293500 + 40.3908800 97.4689700 + 40.4300300 97.4828600 + 40.4403000 97.4438200 + 40.4803400 97.3791400 + 40.4806200 97.3529600 +631 631 -1 25 39.85400 97.28263 + 39.9815300 97.1484800 + 39.8933500 97.1211000 + 39.8741600 97.0688600 + 39.7666500 97.0024300 + 39.7665400 97.0154000 + 39.7070700 97.0793400 + 39.7266000 97.0925900 + 39.7262600 97.1314500 + 39.7944100 97.1973800 + 39.7842100 97.2361200 + 39.8033300 97.2883400 + 39.7832800 97.3268900 + 39.7538200 97.3263400 + 39.8022300 97.3921000 + 39.8013400 97.4699200 + 39.8793000 97.5234500 + 39.8984600 97.5628400 + 39.9383900 97.5117100 + 39.9489700 97.4469400 + 39.9687700 97.4343300 + 39.9696300 97.3563400 + 39.9995200 97.3178800 + 39.9809200 97.2135000 + 40.0009300 97.1748100 + 39.9815300 97.1484800 +632 632 -1 32 40.03820 97.32420 + 40.1985500 97.0476200 + 40.1496500 97.0208300 + 40.0709500 97.0327300 + 40.0521100 96.9283200 + 39.9729300 97.0053200 + 40.0212800 97.0970800 + 40.0210500 97.1230900 + 39.9815300 97.1484800 + 40.0009300 97.1748100 + 39.9809200 97.2135000 + 39.9995200 97.3178800 + 39.9696300 97.3563400 + 39.9687700 97.4343300 + 39.9489700 97.4469400 + 39.9383900 97.5117100 + 39.8984600 97.5628400 + 39.9177800 97.5892400 + 39.8778200 97.6403000 + 39.8966000 97.7056800 + 39.9358900 97.7066100 + 39.9553600 97.7200800 + 39.9755300 97.6815500 + 40.0248100 97.6696900 + 40.0261500 97.5656100 + 40.0953900 97.5280500 + 40.1658100 97.3861200 + 40.1666500 97.3079100 + 40.0984100 97.2545600 + 40.0991600 97.1764200 + 40.1974000 97.1780400 + 40.1786800 97.0734100 + 40.1985500 97.0476200 +633 633 -1 16 39.88500 96.97911 + 40.0521100 96.9283200 + 40.0522100 96.9153100 + 40.0423900 96.9151800 + 39.9247800 96.8747000 + 39.9252200 96.8097400 + 39.8662000 96.8220600 + 39.7182300 96.9110600 + 39.7177400 96.9758500 + 39.7666500 97.0024300 + 39.8741600 97.0688600 + 39.8933500 97.1211000 + 39.9815300 97.1484800 + 40.0210500 97.1230900 + 40.0212800 97.0970800 + 39.9729300 97.0053200 + 40.0521100 96.9283200 +634 634 -1 12 39.83870 96.45166 + 39.9960900 96.3553200 + 39.9273300 96.3549700 + 39.8488100 96.3286300 + 39.7600900 96.4319300 + 39.6814200 96.4573600 + 39.7203400 96.5483000 + 39.7791600 96.5746800 + 39.8286100 96.4972200 + 39.9269400 96.4719200 + 39.9663300 96.4461700 + 39.9665400 96.3811700 + 39.9960900 96.3553200 +635 635 -1 20 39.74070 96.26311 + 39.8785700 96.1859300 + 39.7902100 96.1468000 + 39.7804300 96.1078700 + 39.7214900 96.1207400 + 39.6724100 96.0688700 + 39.6527500 96.0947400 + 39.6722100 96.2371900 + 39.6230700 96.2499700 + 39.6230100 96.2758500 + 39.6034200 96.2499000 + 39.5542600 96.2755800 + 39.5541300 96.3272900 + 39.6620300 96.3795600 + 39.6814200 96.4573600 + 39.7600900 96.4319300 + 39.8488100 96.3286300 + 39.9273300 96.3549700 + 39.8981600 96.2249500 + 39.8785100 96.2248800 + 39.8785700 96.1859300 +636 636 -1 15 39.51600 96.97315 + 39.5810900 96.8576000 + 39.4926100 96.8694800 + 39.4634100 96.8303900 + 39.4533200 96.8690000 + 39.3943000 96.8812000 + 39.3843000 96.9068600 + 39.3839100 96.9584400 + 39.4425400 96.9979500 + 39.4324000 97.0365200 + 39.4715800 97.0500000 + 39.5594100 97.1159100 + 39.6481400 97.0784500 + 39.6194200 96.9874500 + 39.6201100 96.8968900 + 39.5810900 96.8576000 +637 637 -1 21 39.60200 96.55371 + 39.6814200 96.4573600 + 39.6620300 96.3795600 + 39.5541300 96.3272900 + 39.5246700 96.3271600 + 39.5247300 96.3013200 + 39.4952400 96.3141100 + 39.4950600 96.3786800 + 39.4754100 96.3785800 + 39.4752000 96.4431500 + 39.4355600 96.5332400 + 39.4249100 96.7009100 + 39.5034100 96.7145900 + 39.5912600 96.8059900 + 39.6010800 96.8061100 + 39.6013200 96.7673000 + 39.6412700 96.6512500 + 39.7592000 96.6393400 + 39.7789200 96.6265600 + 39.7791600 96.5746800 + 39.7203400 96.5483000 + 39.6814200 96.4573600 +638 638 -1 22 39.42480 96.71328 + 39.5912600 96.8059900 + 39.5034100 96.7145900 + 39.4249100 96.7009100 + 39.4355600 96.5332400 + 39.4258000 96.5202600 + 39.3472300 96.5197000 + 39.3175900 96.5581400 + 39.2586100 96.5705600 + 39.2583000 96.6349300 + 39.2772900 96.7509900 + 39.3260000 96.8159300 + 39.3554600 96.8162600 + 39.3746600 96.8809500 + 39.3844800 96.8810700 + 39.3843000 96.9068600 + 39.3943000 96.8812000 + 39.4533200 96.8690000 + 39.4634100 96.8303900 + 39.4926100 96.8694800 + 39.5810900 96.8576000 + 39.5910900 96.8318600 + 39.5912600 96.8059900 +640 640 -1 18 41.13600 97.61501 + 41.2160800 97.5126100 + 41.1578700 97.4452600 + 41.1395000 97.3259200 + 41.0608600 97.3244500 + 41.0510300 97.3242600 + 41.0501800 97.4034600 + 41.0696900 97.4170500 + 41.0787700 97.4832600 + 41.0478500 97.6014300 + 41.1164900 97.6162000 + 41.0763200 97.6813100 + 41.0550400 97.7996300 + 41.0731600 97.9057500 + 41.1230900 97.8542300 + 41.1438700 97.7754500 + 41.1252900 97.6956900 + 41.2241100 97.6583600 + 41.2160800 97.5126100 +701 701 -1 15 42.51360 99.10980 + 42.4678500 98.6177200 + 42.4284900 98.6162300 + 42.3767900 98.7354000 + 42.4794000 98.9955300 + 42.4762200 99.1301700 + 42.5214300 99.2940700 + 42.5033800 99.6033700 + 42.5627900 99.5929600 + 42.5948800 99.5001000 + 42.6346100 99.4885900 + 42.6503900 99.2596600 + 42.5679700 98.9993500 + 42.5032900 98.8078000 + 42.4737600 98.8066100 + 42.4678500 98.6177200 +702 702 -1 15 42.29350 98.58879 + 42.3068800 98.2756000 + 42.2473700 98.3005100 + 42.1934000 98.5537300 + 42.1327600 98.6319700 + 42.1186800 98.8325500 + 42.1371700 98.8869500 + 42.1762200 98.9019900 + 42.2474400 98.7974900 + 42.3767900 98.7354000 + 42.4284900 98.6162300 + 42.4678500 98.6177200 + 42.4684000 98.5907900 + 42.4306100 98.5085800 + 42.4228000 98.4005700 + 42.3068800 98.2756000 +703 703 -1 24 42.12080 98.43000 + 42.1731300 98.0297400 + 42.0944200 98.0274500 + 42.0940000 98.0542400 + 42.0542100 98.0798600 + 42.0535600 98.1200100 + 41.9945400 98.1182300 + 41.9840400 98.1580400 + 41.9346300 98.1698900 + 41.9428600 98.2637500 + 41.9812500 98.3185100 + 42.0412300 98.2669400 + 42.0705100 98.2812900 + 42.0473900 98.4680300 + 42.0665500 98.4955000 + 42.0717900 98.7234600 + 42.1186800 98.8325500 + 42.1327600 98.6319700 + 42.1934000 98.5537300 + 42.2473700 98.3005100 + 42.3068800 98.2756000 + 42.2686800 98.2071700 + 42.2792100 98.1672000 + 42.2210500 98.1116900 + 42.1731300 98.0297400 +704 704 -1 35 42.00820 97.78967 + 42.1004300 97.5987900 + 42.0714000 97.5579400 + 42.0726500 97.4508100 + 42.0140500 97.4094400 + 41.8860100 97.4202200 + 41.8952500 97.4738500 + 41.9247600 97.4744700 + 41.9231600 97.6081100 + 41.8843100 97.5671400 + 41.8644700 97.5800500 + 41.8228800 97.7526200 + 41.8319800 97.8062500 + 41.9002700 97.8481100 + 41.9282100 97.9557900 + 41.9278000 97.9825100 + 41.8980800 97.9950300 + 41.8974600 98.0351100 + 41.8777800 98.0345400 + 41.9162800 98.0891200 + 41.9346300 98.1698900 + 41.9840400 98.1580400 + 41.9945400 98.1182300 + 42.0535600 98.1200100 + 42.0542100 98.0798600 + 42.0940000 98.0542400 + 42.0944200 98.0274500 + 42.1731300 98.0297400 + 42.1934400 97.9900700 + 42.1639200 97.9892300 + 42.1653300 97.8953700 + 42.1267400 97.8407000 + 42.1466100 97.8278100 + 42.1473600 97.7741900 + 42.1182000 97.7466400 + 42.1004300 97.5987900 +705 NF ELKHORN RIVER NR PIERCE NE -1 496 42.33500 97.62750 + 42.1787500 97.4879170 + 42.1745830 97.4983540 + 42.1620830 97.5108540 + 42.1641880 97.5129170 + 42.1662500 97.5149790 + 42.1662500 97.5275210 + 42.1641880 97.5295830 + 42.1558130 97.5295830 + 42.1537500 97.5274790 + 42.1516880 97.5254170 + 42.1454170 97.5274790 + 42.1412500 97.5399790 + 42.1412500 97.5691880 + 42.1391460 97.5712500 + 42.1370830 97.5733130 + 42.1370830 97.5775210 + 42.1349790 97.5795830 + 42.1329170 97.5816460 + 42.1329170 97.5858540 + 42.1308130 97.5879170 + 42.1287500 97.5899790 + 42.1287500 97.6025210 + 42.1266460 97.6045830 + 42.1245830 97.6066880 + 42.1225210 97.6087500 + 42.1183130 97.6087500 + 42.1162500 97.6108540 + 42.1141880 97.6129170 + 42.1058130 97.6129170 + 42.1037500 97.6150210 + 42.1016460 97.6170830 + 42.0995830 97.6170830 + 42.0954170 97.6358540 + 42.0975210 97.6379170 + 42.0995830 97.6399790 + 42.0995830 97.6483540 + 42.1016880 97.6504170 + 42.1037500 97.6524790 + 42.1037500 97.6691880 + 42.1016460 97.6712500 + 42.0995830 97.6858540 + 42.1016880 97.6879170 + 42.1037500 97.6941880 + 42.1058540 97.6962500 + 42.1079170 97.6983130 + 42.1079170 97.7025210 + 42.1100210 97.7045830 + 42.1120830 97.7066460 + 42.1120830 97.7108540 + 42.1141880 97.7129170 + 42.1162500 97.7150210 + 42.1183540 97.7170830 + 42.1204170 97.7191880 + 42.1183130 97.7212500 + 42.1162500 97.7233130 + 42.1162500 97.7316880 + 42.1141460 97.7337500 + 42.1120830 97.7358130 + 42.1120830 97.7441880 + 42.1141880 97.7462500 + 42.1162500 97.7483540 + 42.1183540 97.7504170 + 42.1204170 97.7525210 + 42.1225210 97.7545830 + 42.1245830 97.7566460 + 42.1245830 97.7650210 + 42.1266880 97.7670830 + 42.1287500 97.7691880 + 42.1308540 97.7712500 + 42.1329170 97.7733130 + 42.1329170 97.7775210 + 42.1350210 97.7795830 + 42.1370830 97.7816460 + 42.1370830 97.7858540 + 42.1391880 97.7879170 + 42.1412500 97.7899790 + 42.1412500 97.7983540 + 42.1433130 97.8004170 + 42.1475210 97.8004170 + 42.1495830 97.8025210 + 42.1516460 97.8045830 + 42.1683540 97.8045830 + 42.1704170 97.8066880 + 42.1725210 97.8087500 + 42.1745830 97.8108540 + 42.1766880 97.8129170 + 42.1787500 97.8149790 + 42.1787500 97.8233540 + 42.1766460 97.8254170 + 42.1745830 97.8274790 + 42.1745830 97.8525210 + 42.1724790 97.8545830 + 42.1704170 97.8566880 + 42.1683130 97.8587500 + 42.1662500 97.8608130 + 42.1662500 97.8650210 + 42.1641460 97.8670830 + 42.1620830 97.8691460 + 42.1620830 97.8733540 + 42.1599790 97.8754170 + 42.1579170 97.8774790 + 42.1579170 97.8816880 + 42.1558130 97.8837500 + 42.1537500 97.8858130 + 42.1537500 97.8900210 + 42.1558540 97.8920830 + 42.1579170 97.8941880 + 42.1600210 97.8962500 + 42.1620830 97.8983130 + 42.1620830 97.9066880 + 42.1641880 97.9087500 + 42.1662500 97.9108130 + 42.1662500 97.9150210 + 42.1683540 97.9170830 + 42.1704170 97.9191460 + 42.1704170 97.9233540 + 42.1683130 97.9254170 + 42.1662500 97.9275210 + 42.1683540 97.9295830 + 42.1704170 97.9316460 + 42.1704170 97.9525210 + 42.1725210 97.9545830 + 42.1745830 97.9608540 + 42.1724790 97.9629170 + 42.1704170 97.9691880 + 42.1725210 97.9712500 + 42.1745830 97.9733130 + 42.1745830 97.9816880 + 42.1766460 97.9837500 + 42.1808540 97.9837500 + 42.1829170 97.9858540 + 42.1849790 97.9879170 + 42.1912500 97.9899790 + 42.1912500 97.9941880 + 42.1933540 97.9962500 + 42.1954170 97.9983540 + 42.1933130 98.0004170 + 42.1912500 98.0024790 + 42.1912500 98.0108540 + 42.1891460 98.0129170 + 42.1870830 98.0149790 + 42.1870830 98.0275210 + 42.1891880 98.0295830 + 42.1912500 98.0316460 + 42.1912500 98.0441880 + 42.1933540 98.0462500 + 42.1954170 98.0483540 + 42.1975210 98.0504170 + 42.1995830 98.0524790 + 42.1995830 98.0566880 + 42.2016880 98.0587500 + 42.2037500 98.0608540 + 42.2058540 98.0629170 + 42.2079170 98.0649790 + 42.2079170 98.0775210 + 42.2100210 98.0795830 + 42.2120830 98.0816460 + 42.2120830 98.0983540 + 42.2141880 98.1004170 + 42.2162500 98.1024790 + 42.2162500 98.1066880 + 42.2183130 98.1087500 + 42.2225210 98.1087500 + 42.2245830 98.1108540 + 42.2266460 98.1129170 + 42.2350210 98.1129170 + 42.2370830 98.1150210 + 42.2391460 98.1170830 + 42.2433540 98.1170830 + 42.2454170 98.1191880 + 42.2474790 98.1212500 + 42.2516880 98.1212500 + 42.2537500 98.1233540 + 42.2558130 98.1254170 + 42.2641880 98.1254170 + 42.2662500 98.1254170 + 42.2662500 98.1149790 + 42.2683130 98.1129170 + 42.2704170 98.1108540 + 42.2704170 98.1024790 + 42.2724790 98.1004170 + 42.2766880 98.1004170 + 42.2787500 98.0983540 + 42.2787500 98.0858130 + 42.2808130 98.0837500 + 42.2829170 98.0816880 + 42.2829170 98.0649790 + 42.2849790 98.0629170 + 42.2870830 98.0608540 + 42.2870830 98.0483130 + 42.2891460 98.0462500 + 42.2912500 98.0441880 + 42.2933130 98.0420830 + 42.2954170 98.0400210 + 42.2974790 98.0379170 + 42.2995830 98.0358540 + 42.3037500 98.0316880 + 42.3037500 98.0108130 + 42.3058130 98.0087500 + 42.3079170 98.0066880 + 42.3099790 98.0045830 + 42.3120830 98.0025210 + 42.3120830 97.9941460 + 42.3141460 97.9920830 + 42.3162500 97.9900210 + 42.3183130 97.9879170 + 42.3204170 97.9858540 + 42.3204170 97.9733130 + 42.3224790 97.9712500 + 42.3245830 97.9691880 + 42.3245830 97.9524790 + 42.3266460 97.9504170 + 42.3287500 97.9483540 + 42.3266880 97.9462500 + 42.3245830 97.9441880 + 42.3245830 97.9358130 + 42.3225210 97.9337500 + 42.3204170 97.9316880 + 42.3183540 97.9295830 + 42.3162500 97.9275210 + 42.3162500 97.9191460 + 42.3183130 97.9170830 + 42.3204170 97.9150210 + 42.3204170 97.9108130 + 42.3183540 97.9087500 + 42.3162500 97.9066880 + 42.3183130 97.9045830 + 42.3204170 97.9025210 + 42.3224790 97.9004170 + 42.3266880 97.9004170 + 42.3287500 97.8983540 + 42.3308130 97.8962500 + 42.3329170 97.8941880 + 42.3329170 97.8774790 + 42.3349790 97.8754170 + 42.3370830 97.8733540 + 42.3391460 97.8712500 + 42.3412500 97.8691880 + 42.3433130 97.8670830 + 42.3475210 97.8670830 + 42.3495830 97.8650210 + 42.3516460 97.8629170 + 42.3537500 97.8608540 + 42.3537500 97.8483130 + 42.3558130 97.8462500 + 42.3579170 97.8441880 + 42.3599790 97.8420830 + 42.3641880 97.8420830 + 42.3662500 97.8400210 + 42.3683130 97.8379170 + 42.3704170 97.8358540 + 42.3745830 97.8275210 + 42.3745830 97.8066460 + 42.3787500 97.7983130 + 42.3870830 97.7941460 + 42.3891460 97.7962500 + 42.3912500 97.7983130 + 42.3933130 97.8004170 + 42.4079170 97.7983540 + 42.4079170 97.7774790 + 42.4099790 97.7754170 + 42.4141880 97.7754170 + 42.4162500 97.7774790 + 42.4183130 97.7795830 + 42.4204170 97.7816460 + 42.4224790 97.7837500 + 42.4245830 97.7858130 + 42.4266460 97.7879170 + 42.4287500 97.7899790 + 42.4308130 97.7920830 + 42.4350210 97.7920830 + 42.4370830 97.7941460 + 42.4391460 97.7962500 + 42.4412500 97.7983130 + 42.4433130 97.8004170 + 42.4454170 97.7983540 + 42.4474790 97.7962500 + 42.4495830 97.7941880 + 42.4516460 97.7920830 + 42.4558540 97.7920830 + 42.4579170 97.7900210 + 42.4599790 97.7879170 + 42.4620830 97.7858540 + 42.4641460 97.7837500 + 42.4662500 97.7816880 + 42.4683130 97.7795830 + 42.4704170 97.7775210 + 42.4745830 97.7691880 + 42.4745830 97.7524790 + 42.4725210 97.7504170 + 42.4704170 97.7483540 + 42.4704170 97.7399790 + 42.4724790 97.7379170 + 42.4745830 97.7358540 + 42.4745830 97.7316460 + 42.4725210 97.7295830 + 42.4704170 97.7275210 + 42.4704170 97.7066460 + 42.4683540 97.7045830 + 42.4662500 97.7025210 + 42.4683130 97.7004170 + 42.4704170 97.6983540 + 42.4724790 97.6962500 + 42.4745830 97.6941880 + 42.4766460 97.6920830 + 42.4808540 97.6920830 + 42.4829170 97.6900210 + 42.4849790 97.6879170 + 42.4891880 97.6879170 + 42.4912500 97.6858540 + 42.5037500 97.6733540 + 42.5037500 97.6649790 + 42.5079170 97.6608540 + 42.5079170 97.6441460 + 42.5099790 97.6420830 + 42.5120830 97.6400210 + 42.5120830 97.6274790 + 42.5141460 97.6254170 + 42.5162500 97.6233540 + 42.5141880 97.6212500 + 42.5120830 97.6191880 + 42.5120830 97.6066460 + 42.5141460 97.6045830 + 42.5162500 97.6025210 + 42.5183130 97.6004170 + 42.5204170 97.5983540 + 42.5224790 97.5962500 + 42.5266880 97.5962500 + 42.5287500 97.5941880 + 42.5308130 97.5920830 + 42.5329170 97.5900210 + 42.5349790 97.5879170 + 42.5370830 97.5858540 + 42.5391460 97.5837500 + 42.5412500 97.5816880 + 42.5412500 97.5733130 + 42.5433130 97.5712500 + 42.5454170 97.5691880 + 42.5454170 97.5524790 + 42.5474790 97.5504170 + 42.5495830 97.5524790 + 42.5516460 97.5545830 + 42.5537500 97.5525210 + 42.5537500 97.5399790 + 42.5558130 97.5379170 + 42.5579170 97.5358540 + 42.5599790 97.5337500 + 42.5641880 97.5337500 + 42.5662500 97.5358130 + 42.5683130 97.5379170 + 42.5725210 97.5379170 + 42.5745830 97.5358540 + 42.5745830 97.5149790 + 42.5725210 97.5129170 + 42.5683130 97.5129170 + 42.5662500 97.5108540 + 42.5641880 97.5087500 + 42.5558130 97.5087500 + 42.5537500 97.5066880 + 42.5516880 97.5045830 + 42.5433130 97.5045830 + 42.5412500 97.5025210 + 42.5391880 97.5004170 + 42.5349790 97.5004170 + 42.5287500 97.4899790 + 42.5266880 97.4879170 + 42.5245830 97.4858540 + 42.5225210 97.4837500 + 42.5204170 97.4816880 + 42.5183540 97.4795830 + 42.5162500 97.4775210 + 42.5162500 97.4691460 + 42.5141880 97.4670830 + 42.5120830 97.4650210 + 42.5100210 97.4629170 + 42.5079170 97.4649790 + 42.5058540 97.4670830 + 42.5016460 97.4670830 + 42.4995830 97.4650210 + 42.4954170 97.4608540 + 42.4912500 97.4566880 + 42.4870830 97.4525210 + 42.4870830 97.4483130 + 42.4725210 97.4337500 + 42.4683130 97.4337500 + 42.4662500 97.4358130 + 42.4641880 97.4379170 + 42.4558130 97.4379170 + 42.4495830 97.4316460 + 42.4495830 97.4295830 + 42.4474790 97.4295830 + 42.4454170 97.4275210 + 42.4433540 97.4254170 + 42.4349790 97.4254170 + 42.4329170 97.4274790 + 42.4308540 97.4295830 + 42.4287500 97.4275210 + 42.4266880 97.4254170 + 42.4245830 97.4233540 + 42.4225210 97.4212500 + 42.4099790 97.4212500 + 42.4079170 97.4191880 + 42.4058540 97.4170830 + 42.4037500 97.4150210 + 42.4016880 97.4129170 + 42.3995830 97.4149790 + 42.3975210 97.4170830 + 42.3954170 97.4191460 + 42.3933540 97.4212500 + 42.3808130 97.4212500 + 42.3724790 97.4170830 + 42.3704170 97.4150210 + 42.3683540 97.4129170 + 42.3662500 97.4108540 + 42.3641880 97.4087500 + 42.3620830 97.4066880 + 42.3620830 97.4024790 + 42.3600210 97.4004170 + 42.3579170 97.3983540 + 42.3558540 97.3962500 + 42.3537500 97.3941880 + 42.3516880 97.3920830 + 42.3474790 97.3920830 + 42.3454170 97.3900210 + 42.3433540 97.3879170 + 42.3391460 97.3879170 + 42.3370830 97.3858540 + 42.3370830 97.3774790 + 42.3287500 97.3649790 + 42.3266880 97.3629170 + 42.3245830 97.3608540 + 42.3245830 97.3524790 + 42.3225210 97.3504170 + 42.3204170 97.3483540 + 42.3183540 97.3462500 + 42.3058130 97.3462500 + 42.2975210 97.3379170 + 42.2766460 97.3379170 + 42.2745830 97.3358540 + 42.2725210 97.3337500 + 42.2516460 97.3337500 + 42.2454170 97.3191460 + 42.2433540 97.3170830 + 42.2391460 97.3170830 + 42.2370830 97.3191460 + 42.2350210 97.3212500 + 42.2266460 97.3212500 + 42.2224790 97.3170830 + 42.2204170 97.3170830 + 42.2141880 97.3254170 + 42.2058130 97.3254170 + 42.2037500 97.3275210 + 42.2016460 97.3295830 + 42.1995830 97.3316460 + 42.1995830 97.3358540 + 42.1974790 97.3379170 + 42.1954170 97.3399790 + 42.1954170 97.3441880 + 42.1933130 97.3462500 + 42.1912500 97.3483130 + 42.1912500 97.3608540 + 42.1891880 97.3629170 + 42.1849790 97.3629170 + 42.1829170 97.3650210 + 42.1808130 97.3670830 + 42.1787500 97.3691460 + 42.1787500 97.3816880 + 42.1808540 97.3837500 + 42.1829170 97.3858540 + 42.1850210 97.3879170 + 42.1870830 97.3900210 + 42.1891880 97.3920830 + 42.1912500 97.3941460 + 42.1912500 97.3983540 + 42.1891460 97.4004170 + 42.1870830 97.4024790 + 42.1870830 97.4108540 + 42.1891880 97.4129170 + 42.1912500 97.4149790 + 42.1912500 97.4400210 + 42.1891460 97.4420830 + 42.1870830 97.4441880 + 42.1891880 97.4462500 + 42.1912500 97.4483130 + 42.1912500 97.4525210 + 42.1933540 97.4545830 + 42.1954170 97.4608540 + 42.1933130 97.4629170 + 42.1912500 97.4650210 + 42.1891460 97.4670830 + 42.1870830 97.4691460 + 42.1870830 97.4775210 + 42.1849790 97.4795830 + 42.1829170 97.4816880 + 42.1808130 97.4837500 + 42.1787500 97.4879170 +706 706 -1 38 41.92570 97.39318 + 42.1447400 97.1305100 + 42.0760800 97.1026100 + 42.0665800 97.0622800 + 42.0371700 97.0484400 + 41.9487200 97.0337400 + 41.8990900 97.0864600 + 41.8795300 97.0727900 + 41.8494400 97.1390900 + 41.8001400 97.1516300 + 41.7997700 97.1916500 + 41.8193200 97.2053300 + 41.7896900 97.2181600 + 41.7695000 97.2711600 + 41.6809800 97.2695500 + 41.6793000 97.4293600 + 41.6395100 97.4684800 + 41.6293700 97.4949000 + 41.6672600 97.6155600 + 41.7649300 97.6711600 + 41.7837200 97.7383100 + 41.8228800 97.7526200 + 41.8644700 97.5800500 + 41.8843100 97.5671400 + 41.9231600 97.6081100 + 41.9247600 97.4744700 + 41.8952500 97.4738500 + 41.8860100 97.4202200 + 42.0140500 97.4094400 + 42.0726500 97.4508100 + 42.0714000 97.5579400 + 42.1004300 97.5987900 + 42.1302800 97.5726600 + 42.1409100 97.5058600 + 42.1702800 97.5199100 + 42.1821900 97.3323400 + 42.2221000 97.2794100 + 42.1436300 97.2511600 + 42.1447400 97.1305100 +707 707 -1 20 41.99950 96.90828 + 42.0783400 96.7945600 + 42.0292200 96.7806100 + 42.0195400 96.7537300 + 41.9606600 96.7263600 + 41.9412000 96.6860500 + 41.8328300 96.7116800 + 41.8424400 96.7518300 + 41.9013100 96.7791800 + 41.8701200 97.0192300 + 41.8503400 97.0323000 + 41.8696900 97.0726400 + 41.8795300 97.0727900 + 41.8990900 97.0864600 + 41.9487200 97.0337400 + 42.0371700 97.0484400 + 42.0665800 97.0622800 + 42.0760800 97.1026100 + 42.1447400 97.1305100 + 42.1661100 96.9162600 + 42.0783400 96.7945600 +708 708 -1 20 41.79820 96.75809 + 41.8503400 97.0323000 + 41.8701200 97.0192300 + 41.9013100 96.7791800 + 41.8424400 96.7518300 + 41.8328300 96.7116800 + 41.9412000 96.6860500 + 41.9606600 96.7263600 + 42.0195400 96.7537300 + 42.0198400 96.7002000 + 41.8826900 96.5786100 + 41.7941500 96.5778800 + 41.7841300 96.6178200 + 41.7448400 96.6041400 + 41.7060000 96.4838900 + 41.6174200 96.4965900 + 41.5977000 96.5097500 + 41.5968300 96.6959900 + 41.5766200 96.7888800 + 41.6151700 96.9090700 + 41.8503400 97.0323000 +PEDN1HW LOGAN CR. AT PENDER NE -1 506 42.31833 97.04833 + 42.1079170 96.7024790 + 42.1183130 96.7212500 + 42.1225210 96.7212500 + 42.1245830 96.7233130 + 42.1329170 96.7358130 + 42.1329170 96.7441880 + 42.1350210 96.7462500 + 42.1370830 96.7483130 + 42.1370830 96.7566880 + 42.1349790 96.7587500 + 42.1329170 96.7608540 + 42.1266880 96.7670830 + 42.1224790 96.7670830 + 42.1204170 96.7691880 + 42.1183540 96.7712500 + 42.1141460 96.7712500 + 42.1120830 96.7733130 + 42.1100210 96.7795830 + 42.1058130 96.7795830 + 42.1037500 96.7816880 + 42.0995830 96.7858130 + 42.0995830 96.7941880 + 42.0974790 96.7962500 + 42.0954170 96.7983540 + 42.0933540 96.8004170 + 42.0891460 96.8004170 + 42.0870830 96.8025210 + 42.0849790 96.8045830 + 42.0829170 96.8045830 + 42.0870830 96.8108130 + 42.0870830 96.8150210 + 42.0891880 96.8170830 + 42.0912500 96.8191880 + 42.0995830 96.8275210 + 42.0974790 96.8295830 + 42.0954170 96.8316460 + 42.0954170 96.8358540 + 42.0975210 96.8379170 + 42.0995830 96.8400210 + 42.1016880 96.8420830 + 42.1037500 96.8441460 + 42.1037500 96.8483540 + 42.1058540 96.8504170 + 42.1079170 96.8524790 + 42.1079170 96.8608540 + 42.1099790 96.8629170 + 42.1141880 96.8629170 + 42.1162500 96.8649790 + 42.1162500 96.8691880 + 42.1183540 96.8712500 + 42.1204170 96.8733540 + 42.1370830 96.8899790 + 42.1370830 96.8983540 + 42.1391880 96.9004170 + 42.1412500 96.9025210 + 42.1433540 96.9045830 + 42.1454170 96.9066880 + 42.1475210 96.9087500 + 42.1495830 96.9108540 + 42.1516460 96.9129170 + 42.1558540 96.9129170 + 42.1579170 96.9150210 + 42.1600210 96.9170830 + 42.1620830 96.9191460 + 42.1620830 96.9275210 + 42.1599790 96.9295830 + 42.1579170 96.9316460 + 42.1579170 96.9400210 + 42.1600210 96.9420830 + 42.1620830 96.9441880 + 42.1641880 96.9462500 + 42.1662500 96.9483540 + 42.1683540 96.9504170 + 42.1704170 96.9524790 + 42.1704170 96.9566880 + 42.1683130 96.9587500 + 42.1662500 96.9608130 + 42.1662500 96.9858540 + 42.1683540 96.9879170 + 42.1704170 96.9899790 + 42.1704170 97.0066880 + 42.1683130 97.0087500 + 42.1662500 97.0108130 + 42.1662500 97.0316880 + 42.1641460 97.0337500 + 42.1620830 97.0358130 + 42.1620830 97.0525210 + 42.1599790 97.0545830 + 42.1579170 97.0566880 + 42.1558130 97.0587500 + 42.1537500 97.0608130 + 42.1537500 97.0691880 + 42.1558540 97.0712500 + 42.1579170 97.0941880 + 42.1558130 97.0962500 + 42.1537500 97.0983130 + 42.1537500 97.1025210 + 42.1516460 97.1045830 + 42.1495830 97.1066880 + 42.1474790 97.1087500 + 42.1454170 97.1108540 + 42.1433130 97.1129170 + 42.1412500 97.1150210 + 42.1433540 97.1170830 + 42.1454170 97.1191880 + 42.1475210 97.1212500 + 42.1495830 97.1233540 + 42.1516880 97.1254170 + 42.1537500 97.1274790 + 42.1537500 97.1358540 + 42.1516460 97.1379170 + 42.1495830 97.1399790 + 42.1495830 97.1525210 + 42.1474790 97.1545830 + 42.1454170 97.1545830 + 42.1495830 97.2025210 + 42.1474790 97.2045830 + 42.1454170 97.2066880 + 42.1475210 97.2087500 + 42.1495830 97.2275210 + 42.1474790 97.2295830 + 42.1454170 97.2316460 + 42.1454170 97.2358540 + 42.1433130 97.2379170 + 42.1412500 97.2399790 + 42.1412500 97.2608540 + 42.1433540 97.2629170 + 42.1454170 97.2650210 + 42.1475210 97.2670830 + 42.1495830 97.2691880 + 42.1516880 97.2712500 + 42.1537500 97.2733540 + 42.1558540 97.2754170 + 42.1579170 97.2775210 + 42.1599790 97.2795830 + 42.1683540 97.2795830 + 42.1704170 97.2816880 + 42.1724790 97.2837500 + 42.1766880 97.2837500 + 42.1787500 97.2858130 + 42.1808130 97.3004170 + 42.1891880 97.3004170 + 42.1912500 97.2983130 + 42.1933130 97.2962500 + 42.2016880 97.2962500 + 42.2037500 97.2983540 + 42.2058130 97.3004170 + 42.2100210 97.3004170 + 42.2120830 97.3025210 + 42.2141880 97.3045830 + 42.2162500 97.3066460 + 42.2162500 97.3150210 + 42.2183130 97.3170830 + 42.2225210 97.3170830 + 42.2245830 97.3191880 + 42.2266460 97.3212500 + 42.2350210 97.3212500 + 42.2370830 97.3191460 + 42.2391460 97.3170830 + 42.2433540 97.3170830 + 42.2454170 97.3191460 + 42.2454170 97.3275210 + 42.2475210 97.3295830 + 42.2495830 97.3316880 + 42.2516460 97.3337500 + 42.2725210 97.3337500 + 42.2745830 97.3358540 + 42.2766460 97.3379170 + 42.2975210 97.3379170 + 42.2995830 97.3400210 + 42.3016880 97.3420830 + 42.3037500 97.3441880 + 42.3058130 97.3462500 + 42.3183540 97.3462500 + 42.3204170 97.3483540 + 42.3225210 97.3504170 + 42.3245830 97.3524790 + 42.3245830 97.3608540 + 42.3266880 97.3629170 + 42.3287500 97.3649790 + 42.3287500 97.3691880 + 42.3308540 97.3712500 + 42.3370830 97.3774790 + 42.3370830 97.3858540 + 42.3391460 97.3879170 + 42.3454170 97.3900210 + 42.3474790 97.3920830 + 42.3516880 97.3920830 + 42.3537500 97.3941880 + 42.3558540 97.3962500 + 42.3579170 97.3983540 + 42.3600210 97.4004170 + 42.3620830 97.4024790 + 42.3620830 97.4066880 + 42.3724790 97.4170830 + 42.3808130 97.4212500 + 42.3933540 97.4212500 + 42.3954170 97.4191460 + 42.3975210 97.4170830 + 42.3995830 97.4149790 + 42.4016880 97.4129170 + 42.4037500 97.4150210 + 42.4058540 97.4170830 + 42.4079170 97.4191880 + 42.4099790 97.4212500 + 42.4225210 97.4212500 + 42.4245830 97.4233540 + 42.4266880 97.4254170 + 42.4287500 97.4275210 + 42.4308540 97.4295830 + 42.4329170 97.4274790 + 42.4349790 97.4254170 + 42.4433540 97.4254170 + 42.4454170 97.4275210 + 42.4475210 97.4295830 + 42.4495830 97.4295830 + 42.4495830 97.4108130 + 42.4516460 97.4087500 + 42.4537500 97.4066880 + 42.4537500 97.3983130 + 42.4558130 97.3962500 + 42.4579170 97.3941880 + 42.4579170 97.3899790 + 42.4620830 97.3858540 + 42.4620830 97.3816460 + 42.4641460 97.3795830 + 42.4662500 97.3775210 + 42.4662500 97.3566460 + 42.4641880 97.3545830 + 42.4620830 97.3525210 + 42.4620830 97.3233130 + 42.4641460 97.3212500 + 42.4662500 97.3191880 + 42.4662500 97.3149790 + 42.4683130 97.3129170 + 42.4704170 97.3108540 + 42.4724790 97.3087500 + 42.4745830 97.3066880 + 42.4745830 97.3024790 + 42.4766460 97.3004170 + 42.4850210 97.3004170 + 42.4870830 97.2983540 + 42.4891460 97.2962500 + 42.4912500 97.2941880 + 42.4912500 97.2774790 + 42.4891880 97.2754170 + 42.4870830 97.2733540 + 42.4870830 97.2691460 + 42.4891460 97.2670830 + 42.4912500 97.2650210 + 42.4912500 97.2566460 + 42.4891880 97.2545830 + 42.4849790 97.2545830 + 42.4829170 97.2525210 + 42.4829170 97.2483130 + 42.4808540 97.2462500 + 42.4787500 97.2441880 + 42.4787500 97.2358130 + 42.4766880 97.2337500 + 42.4724790 97.2337500 + 42.4704170 97.2316880 + 42.4724790 97.2254170 + 42.4766880 97.2254170 + 42.4787500 97.2233540 + 42.4787500 97.2108130 + 42.4808130 97.2087500 + 42.4891880 97.2087500 + 42.4912500 97.2108130 + 42.4933130 97.2129170 + 42.5058540 97.2129170 + 42.5079170 97.2108540 + 42.5099790 97.2087500 + 42.5120830 97.2066880 + 42.5141460 97.2045830 + 42.5162500 97.2025210 + 42.5183130 97.2004170 + 42.5204170 97.1983540 + 42.5224790 97.1962500 + 42.5266880 97.1962500 + 42.5287500 97.1941880 + 42.5308130 97.1920830 + 42.5350210 97.1920830 + 42.5370830 97.1941460 + 42.5391460 97.1962500 + 42.5412500 97.1983130 + 42.5433130 97.2004170 + 42.5454170 97.2024790 + 42.5474790 97.2045830 + 42.5516880 97.2045830 + 42.5537500 97.2025210 + 42.5558130 97.2004170 + 42.5579170 97.1983540 + 42.5579170 97.1774790 + 42.5558540 97.1754170 + 42.5537500 97.1733540 + 42.5537500 97.1441460 + 42.5516880 97.1420830 + 42.5495830 97.1400210 + 42.5495830 97.1358130 + 42.5475210 97.1337500 + 42.5454170 97.1316880 + 42.5454170 97.1274790 + 42.5474790 97.1254170 + 42.5495830 97.1233540 + 42.5495830 97.1108130 + 42.5475210 97.1087500 + 42.5454170 97.1066880 + 42.5454170 97.0983130 + 42.5433540 97.0962500 + 42.5412500 97.0941880 + 42.5412500 97.0858130 + 42.5391880 97.0837500 + 42.5370830 97.0816880 + 42.5350210 97.0795830 + 42.5329170 97.0775210 + 42.5308540 97.0754170 + 42.5287500 97.0733540 + 42.5266880 97.0712500 + 42.5245830 97.0691880 + 42.5245830 97.0608130 + 42.5225210 97.0587500 + 42.5204170 97.0566880 + 42.5204170 97.0524790 + 42.5183540 97.0504170 + 42.5162500 97.0483540 + 42.5162500 97.0441460 + 42.5141880 97.0420830 + 42.5120830 97.0400210 + 42.5120830 97.0358130 + 42.5100210 97.0337500 + 42.5058130 97.0337500 + 42.5037500 97.0316880 + 42.5037500 97.0274790 + 42.5016880 97.0254170 + 42.4995830 97.0233540 + 42.4995830 97.0191460 + 42.4975210 97.0170830 + 42.4954170 97.0150210 + 42.4933540 97.0129170 + 42.4912500 97.0108540 + 42.4912500 97.0024790 + 42.4891880 97.0004170 + 42.4870830 96.9983540 + 42.4891460 96.9962500 + 42.4933540 96.9962500 + 42.4954170 96.9941880 + 42.4974790 96.9920830 + 42.5016880 96.9920830 + 42.5037500 96.9900210 + 42.5037500 96.9858130 + 42.4995830 96.9774790 + 42.4891460 96.9754170 + 42.4850210 96.9712500 + 42.4724790 96.9712500 + 42.4704170 96.9733130 + 42.4683540 96.9754170 + 42.4662500 96.9733540 + 42.4641880 96.9712500 + 42.4620830 96.9691880 + 42.4600210 96.9670830 + 42.4516460 96.9670830 + 42.4495830 96.9650210 + 42.4475210 96.9629170 + 42.4454170 96.9608540 + 42.4433540 96.9587500 + 42.4412500 96.9566880 + 42.4391880 96.9545830 + 42.4370830 96.9525210 + 42.4370830 96.9483130 + 42.4350210 96.9462500 + 42.4308130 96.9462500 + 42.4287500 96.9441880 + 42.4266880 96.9420830 + 42.4245830 96.9400210 + 42.4225210 96.9379170 + 42.4204170 96.9358540 + 42.4183540 96.9337500 + 42.4162500 96.9316880 + 42.4162500 96.9191460 + 42.4141880 96.9170830 + 42.4099790 96.9170830 + 42.4079170 96.9150210 + 42.4058540 96.9129170 + 42.4016460 96.9129170 + 42.3975210 96.9087500 + 42.3933540 96.9045830 + 42.3912500 96.9025210 + 42.3933130 96.9004170 + 42.3954170 96.8983540 + 42.3954170 96.8941460 + 42.3933540 96.8920830 + 42.3891460 96.8920830 + 42.3870830 96.8900210 + 42.3850210 96.8879170 + 42.3829170 96.8858540 + 42.3808540 96.8837500 + 42.3745830 96.8775210 + 42.3745830 96.8649790 + 42.3725210 96.8629170 + 42.3704170 96.8608540 + 42.3704170 96.8566460 + 42.3683540 96.8545830 + 42.3662500 96.8525210 + 42.3641880 96.8504170 + 42.3620830 96.8483540 + 42.3620830 96.8441460 + 42.3641460 96.8420830 + 42.3662500 96.8400210 + 42.3683130 96.8379170 + 42.3704170 96.8358540 + 42.3724790 96.8337500 + 42.3745830 96.8316880 + 42.3745830 96.8233130 + 42.3725210 96.8212500 + 42.3704170 96.8191880 + 42.3683540 96.8170830 + 42.3662500 96.8150210 + 42.3641880 96.8129170 + 42.3620830 96.8108540 + 42.3600210 96.8087500 + 42.3516460 96.8087500 + 42.3495830 96.8066880 + 42.3495830 96.7983130 + 42.3475210 96.7962500 + 42.3454170 96.7941880 + 42.3433540 96.7920830 + 42.3412500 96.7900210 + 42.3370830 96.7691460 + 42.3350210 96.7670830 + 42.3329170 96.7650210 + 42.3308540 96.7629170 + 42.3287500 96.7608540 + 42.3266880 96.7587500 + 42.3245830 96.7566880 + 42.3245830 96.7524790 + 42.3225210 96.7504170 + 42.3204170 96.7483540 + 42.3183540 96.7462500 + 42.3162500 96.7441880 + 42.3141880 96.7420830 + 42.3120830 96.7400210 + 42.3120830 96.7316460 + 42.3100210 96.7295830 + 42.3058130 96.7295830 + 42.3037500 96.7275210 + 42.3016880 96.7254170 + 42.2974790 96.7254170 + 42.2954170 96.7233540 + 42.2933540 96.7212500 + 42.2912500 96.7191880 + 42.2912500 96.7149790 + 42.2891880 96.7129170 + 42.2808540 96.7087500 + 42.2683130 96.7087500 + 42.2662500 96.7066880 + 42.2641880 96.7045830 + 42.2620830 96.7025210 + 42.2600210 96.7004170 + 42.2579170 96.6983540 + 42.2558540 96.6962500 + 42.2537500 96.6941880 + 42.2537500 96.6899790 + 42.2516880 96.6879170 + 42.2495830 96.6858540 + 42.2495830 96.6816460 + 42.2475210 96.6795830 + 42.2349790 96.6795830 + 42.2329170 96.6775210 + 42.2308540 96.6754170 + 42.2183130 96.6754170 + 42.2162500 96.6733540 + 42.2162500 96.6649790 + 42.2141880 96.6629170 + 42.2016460 96.6629170 + 42.1995830 96.6649790 + 42.1975210 96.6670830 + 42.1954170 96.6691460 + 42.1933540 96.6712500 + 42.1808130 96.6712500 + 42.1787500 96.6691880 + 42.1766880 96.6670830 + 42.1745830 96.6650210 + 42.1745830 96.6566460 + 42.1725210 96.6545830 + 42.1704170 96.6525210 + 42.1683540 96.6504170 + 42.1599790 96.6504170 + 42.1579170 96.6524790 + 42.1579170 96.6566880 + 42.1558540 96.6587500 + 42.1516460 96.6587500 + 42.1495830 96.6608130 + 42.1475210 96.6629170 + 42.1433130 96.6629170 + 42.1349790 96.6670830 + 42.1329170 96.6691460 + 42.1308540 96.6712500 + 42.1287500 96.6733130 + 42.1287500 96.6775210 + 42.1266880 96.6795830 + 42.1245830 96.6816460 + 42.1225210 96.6837500 + 42.1204170 96.6858130 + 42.1204170 96.6941880 + 42.1141880 96.7004170 + 42.1079170 96.7024790 +710 710 -1 24 41.93700 96.61285 + 42.1677300 96.6480400 + 42.1679300 96.6078000 + 42.1091800 96.5402900 + 42.0698200 96.5399900 + 42.0504000 96.4728900 + 41.9618400 96.4722900 + 41.9423000 96.4320500 + 41.8831700 96.4584000 + 41.8734300 96.4316300 + 41.8536600 96.4582100 + 41.7947200 96.4311400 + 41.7847400 96.4711000 + 41.7356100 96.4574400 + 41.7060000 96.4838900 + 41.7448400 96.6041400 + 41.7841300 96.6178200 + 41.7941500 96.5778800 + 41.8826900 96.5786100 + 42.0198400 96.7002000 + 42.0195400 96.7537300 + 42.0292200 96.7806100 + 42.0783400 96.7945600 + 42.1183200 96.6877900 + 42.1677300 96.6480400 +711 MAPLE CR. NR NICKERSON NE -1 408 41.69333 97.10667 + 41.5579170 96.5399790 + 41.5495830 96.5525210 + 41.5454170 96.5566460 + 41.5454170 96.5650210 + 41.5433130 96.5670830 + 41.5412500 96.5691460 + 41.5412500 96.5775210 + 41.5433540 96.5795830 + 41.5454170 96.5816460 + 41.5454170 96.5941880 + 41.5433130 96.5962500 + 41.5370830 96.6024790 + 41.5370830 96.6150210 + 41.5349790 96.6170830 + 41.5329170 96.6191460 + 41.5329170 96.6275210 + 41.5350210 96.6295830 + 41.5370830 96.6316460 + 41.5370830 96.6358540 + 41.5349790 96.6379170 + 41.5329170 96.6399790 + 41.5329170 96.6441880 + 41.5349790 96.6462500 + 41.5391880 96.6462500 + 41.5454170 96.6524790 + 41.5454170 96.6858540 + 41.5433130 96.6879170 + 41.5412500 96.6899790 + 41.5412500 96.7025210 + 41.5433540 96.7045830 + 41.5454170 96.7108540 + 41.5433130 96.7129170 + 41.5412500 96.7150210 + 41.5433540 96.7170830 + 41.5454170 96.7191460 + 41.5454170 96.7358540 + 41.5475210 96.7379170 + 41.5495830 96.7399790 + 41.5495830 96.7775210 + 41.5516880 96.7795830 + 41.5537500 96.7816460 + 41.5537500 96.7941880 + 41.5516460 96.7962500 + 41.5495830 96.7983130 + 41.5495830 96.8025210 + 41.5474790 96.8045830 + 41.5454170 96.8066880 + 41.5433130 96.8087500 + 41.5412500 96.8108130 + 41.5412500 96.8358540 + 41.5391460 96.8379170 + 41.5370830 96.8399790 + 41.5370830 96.8650210 + 41.5349790 96.8670830 + 41.5329170 96.8691460 + 41.5329170 96.8733540 + 41.5308130 96.8754170 + 41.5287500 96.8775210 + 41.5266460 96.8795830 + 41.5245830 96.8816460 + 41.5245830 96.8983540 + 41.5266880 96.9004170 + 41.5287500 96.9025210 + 41.5266460 96.9045830 + 41.5245830 96.9066460 + 41.5245830 96.9150210 + 41.5224790 96.9170830 + 41.5204170 96.9191460 + 41.5204170 96.9233540 + 41.5183130 96.9254170 + 41.5162500 96.9274790 + 41.5162500 96.9316880 + 41.5141460 96.9337500 + 41.5120830 96.9358130 + 41.5120830 96.9483540 + 41.5141880 96.9504170 + 41.5162500 96.9524790 + 41.5162500 96.9608540 + 41.5141460 96.9629170 + 41.5120830 96.9650210 + 41.5141880 96.9670830 + 41.5162500 96.9691460 + 41.5162500 97.0025210 + 41.5183540 97.0045830 + 41.5204170 97.0066460 + 41.5204170 97.0108540 + 41.5183130 97.0129170 + 41.5162500 97.0149790 + 41.5162500 97.0191880 + 41.5141460 97.0212500 + 41.5120830 97.0233130 + 41.5120830 97.0608540 + 41.5141880 97.0629170 + 41.5162500 97.0650210 + 41.5183540 97.0670830 + 41.5204170 97.0691460 + 41.5204170 97.0733540 + 41.5183130 97.0754170 + 41.5162500 97.0774790 + 41.5162500 97.1066880 + 41.5183540 97.1087500 + 41.5204170 97.1108130 + 41.5204170 97.1233540 + 41.5225210 97.1254170 + 41.5245830 97.1316880 + 41.5266880 97.1337500 + 41.5287500 97.1358130 + 41.5287500 97.1441880 + 41.5266460 97.1462500 + 41.5245830 97.1483130 + 41.5245830 97.1566880 + 41.5266880 97.1587500 + 41.5287500 97.1608130 + 41.5287500 97.1733540 + 41.5308540 97.1754170 + 41.5329170 97.1775210 + 41.5349790 97.1795830 + 41.5516880 97.1837500 + 41.5537500 97.1816880 + 41.5537500 97.1774790 + 41.5558540 97.1754170 + 41.5579170 97.1733130 + 41.5599790 97.1712500 + 41.5891880 97.1712500 + 41.5912500 97.1691460 + 41.5933130 97.1670830 + 41.5975210 97.1670830 + 41.5995830 97.1650210 + 41.5995830 97.1608130 + 41.6016460 97.1587500 + 41.6100210 97.1587500 + 41.6120830 97.1608130 + 41.6120830 97.1650210 + 41.6141460 97.1670830 + 41.6308540 97.1670830 + 41.6329170 97.1691880 + 41.6350210 97.1712500 + 41.6370830 97.1733540 + 41.6391460 97.1754170 + 41.6433540 97.1754170 + 41.6454170 97.1775210 + 41.6474790 97.1795830 + 41.6516880 97.1795830 + 41.6537500 97.1816880 + 41.6558130 97.1837500 + 41.6600210 97.1837500 + 41.6620830 97.1858130 + 41.6620830 97.1941880 + 41.6704170 97.2024790 + 41.6704170 97.2275210 + 41.6725210 97.2295830 + 41.6745830 97.2316880 + 41.6766880 97.2337500 + 41.6787500 97.2358130 + 41.6787500 97.2400210 + 41.6808540 97.2420830 + 41.6829170 97.2441880 + 41.6850210 97.2462500 + 41.6870830 97.2483130 + 41.6870830 97.2566880 + 41.6891880 97.2587500 + 41.6912500 97.2608130 + 41.6912500 97.2691880 + 41.6933130 97.2712500 + 41.6975210 97.2712500 + 41.6995830 97.2733130 + 41.6995830 97.2775210 + 41.6995830 97.2795830 + 41.7016880 97.2795830 + 41.7037500 97.2816460 + 41.7058130 97.2837500 + 41.7183540 97.2837500 + 41.7308540 97.2795830 + 41.7349790 97.2754170 + 41.7433540 97.2754170 + 41.7454170 97.2733540 + 41.7725210 97.2712500 + 41.7745830 97.2691880 + 41.7745830 97.2649790 + 41.7766460 97.2629170 + 41.7787500 97.2608540 + 41.7808130 97.2587500 + 41.7829170 97.2566880 + 41.7829170 97.2483130 + 41.7849790 97.2462500 + 41.7870830 97.2441880 + 41.7870830 97.2399790 + 41.7891460 97.2379170 + 41.7912500 97.2358540 + 41.7933130 97.2337500 + 41.7954170 97.2316880 + 41.7974790 97.2295830 + 41.7995830 97.2275210 + 41.8016460 97.2254170 + 41.8058540 97.2254170 + 41.8079170 97.2233540 + 41.8099790 97.2212500 + 41.8225210 97.2212500 + 41.8245830 97.2191880 + 41.8245830 97.2108130 + 41.8225210 97.2087500 + 41.8204170 97.2066880 + 41.8204170 97.1983130 + 41.8183540 97.1962500 + 41.8162500 97.1941880 + 41.8141880 97.1920830 + 41.8120830 97.1900210 + 41.8100210 97.1879170 + 41.8079170 97.1858540 + 41.8058540 97.1837500 + 41.8037500 97.1816880 + 41.8037500 97.1649790 + 41.8058130 97.1629170 + 41.8079170 97.1608540 + 41.8099790 97.1587500 + 41.8225210 97.1587500 + 41.8245830 97.1566880 + 41.8245830 97.1524790 + 41.8266460 97.1504170 + 41.8287500 97.1483540 + 41.8308130 97.1462500 + 41.8329170 97.1441880 + 41.8329170 97.1399790 + 41.8349790 97.1379170 + 41.8391880 97.1379170 + 41.8412500 97.1399790 + 41.8433130 97.1420830 + 41.8454170 97.1441460 + 41.8474790 97.1462500 + 41.8600210 97.1462500 + 41.8620830 97.1441880 + 41.8620830 97.1399790 + 41.8641460 97.1379170 + 41.8662500 97.1358540 + 41.8662500 97.1274790 + 41.8641880 97.1254170 + 41.8620830 97.1233540 + 41.8620830 97.1191460 + 41.8704170 97.1108540 + 41.8704170 97.1066460 + 41.8724790 97.1045830 + 41.8745830 97.1025210 + 41.8745830 97.0899790 + 41.8766460 97.0879170 + 41.8787500 97.0858540 + 41.8787500 97.0733130 + 41.8766880 97.0712500 + 41.8745830 97.0691880 + 41.8745830 97.0608130 + 41.8766460 97.0587500 + 41.8787500 97.0566880 + 41.8787500 97.0524790 + 41.8766880 97.0504170 + 41.8683130 97.0504170 + 41.8537500 97.0358130 + 41.8537500 97.0337500 + 41.8433130 97.0337500 + 41.8412500 97.0316880 + 41.8391880 97.0295830 + 41.8349790 97.0295830 + 41.8329170 97.0275210 + 41.8287500 97.0233540 + 41.8266880 97.0170830 + 41.8225210 97.0129170 + 41.8204170 97.0108540 + 41.8183540 97.0045830 + 41.8099790 97.0045830 + 41.8079170 97.0025210 + 41.8058540 97.0004170 + 41.8016460 97.0004170 + 41.7995830 96.9983540 + 41.7975210 96.9962500 + 41.7954170 96.9941880 + 41.7933540 96.9920830 + 41.7808130 96.9920830 + 41.7787500 96.9900210 + 41.7766880 96.9879170 + 41.7724790 96.9879170 + 41.7704170 96.9858540 + 41.7704170 96.9816460 + 41.7683540 96.9795830 + 41.7558130 96.9795830 + 41.7537500 96.9775210 + 41.7537500 96.9733130 + 41.7516880 96.9712500 + 41.7433130 96.9712500 + 41.7412500 96.9691880 + 41.7391880 96.9670830 + 41.7308130 96.9670830 + 41.7287500 96.9650210 + 41.7266880 96.9629170 + 41.7245830 96.9608540 + 41.7225210 96.9587500 + 41.7204170 96.9566880 + 41.7204170 96.9524790 + 41.7183540 96.9504170 + 41.7099790 96.9504170 + 41.7079170 96.9483540 + 41.7058540 96.9462500 + 41.6974790 96.9462500 + 41.6912500 96.9400210 + 41.6912500 96.9358130 + 41.6891880 96.9337500 + 41.6766460 96.9337500 + 41.6745830 96.9316880 + 41.6725210 96.9295830 + 41.6558130 96.9295830 + 41.6537500 96.9275210 + 41.6537500 96.9191460 + 41.6516880 96.9170830 + 41.6474790 96.9170830 + 41.6454170 96.9191460 + 41.6433540 96.9212500 + 41.6349790 96.9212500 + 41.6329170 96.9191880 + 41.6308540 96.9170830 + 41.6287500 96.9150210 + 41.6287500 96.9108130 + 41.6266880 96.9087500 + 41.6245830 96.9066880 + 41.6225210 96.9045830 + 41.6204170 96.9025210 + 41.6204170 96.8899790 + 41.6183540 96.8879170 + 41.6162500 96.8858540 + 41.6162500 96.8816460 + 41.6141880 96.8795830 + 41.6120830 96.8775210 + 41.6120830 96.8649790 + 41.6100210 96.8629170 + 41.6079170 96.8608540 + 41.6079170 96.8566460 + 41.6058540 96.8545830 + 41.6037500 96.8525210 + 41.6037500 96.8399790 + 41.6016880 96.8379170 + 41.5995830 96.8358540 + 41.5975210 96.8337500 + 41.5954170 96.8316880 + 41.5954170 96.8191460 + 41.5933540 96.8170830 + 41.5912500 96.8150210 + 41.5912500 96.8066460 + 41.5891880 96.8045830 + 41.5870830 96.8025210 + 41.5870830 96.7399790 + 41.5891460 96.7379170 + 41.5912500 96.7358540 + 41.5912500 96.7233130 + 41.5891880 96.7212500 + 41.5870830 96.7191880 + 41.5870830 96.7024790 + 41.5933130 96.6962500 + 41.5954170 96.6941880 + 41.5974790 96.6920830 + 41.5995830 96.6900210 + 41.6016460 96.6879170 + 41.6037500 96.6858540 + 41.6037500 96.6816460 + 41.6058130 96.6795830 + 41.6079170 96.6775210 + 41.6099790 96.6754170 + 41.6141880 96.6754170 + 41.6162500 96.6733540 + 41.6183130 96.6712500 + 41.6204170 96.6691880 + 41.6204170 96.6608130 + 41.6183540 96.6587500 + 41.6162500 96.6566880 + 41.6162500 96.6483130 + 41.6141880 96.6462500 + 41.6120830 96.6441880 + 41.6100210 96.6420830 + 41.6079170 96.6400210 + 41.6079170 96.6358130 + 41.6058540 96.6337500 + 41.6016460 96.6337500 + 41.5995830 96.6316880 + 41.5995830 96.6274790 + 41.5975210 96.6254170 + 41.5954170 96.6233540 + 41.5954170 96.6149790 + 41.5974790 96.6129170 + 41.5995830 96.6108540 + 41.5975210 96.5962500 + 41.5954170 96.5941880 + 41.5954170 96.5899790 + 41.5974790 96.5879170 + 41.5995830 96.5858540 + 41.5995830 96.5733130 + 41.5975210 96.5712500 + 41.5954170 96.5691880 + 41.5995830 96.5608130 + 41.5995830 96.5587500 + 41.5974790 96.5587500 + 41.5954170 96.5566880 + 41.5954170 96.5441460 + 41.5933540 96.5420830 + 41.5912500 96.5400210 + 41.5912500 96.5358130 + 41.5891880 96.5337500 + 41.5870830 96.5358130 + 41.5850210 96.5379170 + 41.5724790 96.5379170 + 41.5704170 96.5399790 + 41.5683540 96.5420830 + 41.5641460 96.5420830 + 41.5579170 96.5399790 +712 712 -1 32 41.61300 96.46915 + 41.9228600 96.3517500 + 41.8836400 96.2981200 + 41.8540600 96.3247000 + 41.7261800 96.3241000 + 41.7066000 96.2840400 + 41.6769900 96.3238800 + 41.6179800 96.3236100 + 41.5787600 96.2702300 + 41.5394400 96.2567800 + 41.5196900 96.2965800 + 41.4508500 96.2962900 + 41.3526000 96.2561000 + 41.3034100 96.2691700 + 41.2836800 96.2955900 + 41.4111800 96.4155300 + 41.4501300 96.5219600 + 41.4498400 96.5883300 + 41.5084600 96.6685400 + 41.5477300 96.6822100 + 41.5288000 96.5225400 + 41.5977000 96.5097500 + 41.6174200 96.4965900 + 41.7060000 96.4838900 + 41.7356100 96.4574400 + 41.7847400 96.4711000 + 41.7947200 96.4311400 + 41.8536600 96.4582100 + 41.8734300 96.4316300 + 41.8831700 96.4584000 + 41.9423000 96.4320500 + 41.9227900 96.3784700 + 41.9228600 96.3517500 +713 713 -1 30 40.62750 98.85050 + 40.8290900 98.3861900 + 40.7799700 98.3845400 + 40.7603200 98.3838800 + 40.7504900 98.3835500 + 40.7502400 98.3967000 + 40.7207700 98.3957000 + 40.6799600 98.4731400 + 40.6784000 98.5519000 + 40.6268500 98.6681900 + 40.5957000 98.7457400 + 40.5936800 98.8375200 + 40.5323600 98.9399600 + 40.5200600 99.0443100 + 40.4386100 99.1586800 + 40.4068300 99.2488900 + 40.4457700 99.2637600 + 40.4738700 99.3174500 + 40.5151900 99.2407200 + 40.5168500 99.1752500 + 40.5757800 99.1778900 + 40.5973700 99.1001100 + 40.6563000 99.1026800 + 40.6765800 99.0772900 + 40.7130100 98.7765700 + 40.7517300 98.8043700 + 40.7635500 98.7127800 + 40.8036900 98.6748400 + 40.8273400 98.4782700 + 40.8482500 98.4131700 + 40.8290900 98.3861900 +714 714 -1 29 41.09130 97.99108 + 41.4027300 97.5298800 + 41.3637100 97.5025200 + 41.2527300 97.7252300 + 41.1941000 97.6973400 + 41.1438700 97.7754500 + 41.1230900 97.8542300 + 41.0731600 97.9057500 + 41.0525000 97.9712100 + 41.0228100 97.9835700 + 41.0219800 98.0363500 + 40.9516800 98.1266200 + 40.9210800 98.1916000 + 40.8415500 98.2418000 + 40.8317300 98.2414900 + 40.7799700 98.3845400 + 40.8290900 98.3861900 + 40.8986100 98.3490100 + 40.8784700 98.3746900 + 40.8666400 98.4796400 + 40.9177700 98.3760000 + 40.9772300 98.3516200 + 41.0086100 98.2470900 + 41.2292200 97.9893800 + 41.2803600 97.8583600 + 41.2820400 97.7392000 + 41.3320800 97.6741600 + 41.3812400 97.6753200 + 41.4010700 97.6625300 + 41.4027300 97.5298800 +720 720 -1 26 41.09120 98.25436 + 41.3812400 97.6753200 + 41.3320800 97.6741600 + 41.2820400 97.7392000 + 41.2803600 97.8583600 + 41.2292200 97.9893800 + 41.0086100 98.2470900 + 40.9772300 98.3516200 + 40.9177700 98.3760000 + 40.8666400 98.4796400 + 40.8020000 98.7537200 + 40.8011400 98.7931700 + 40.8493900 98.8345700 + 40.8988100 98.8233700 + 40.9204700 98.7319600 + 40.9990800 98.7350000 + 41.0323800 98.5514600 + 41.0334300 98.4987000 + 41.1135700 98.4222300 + 41.1145700 98.3694000 + 41.2268800 98.1349100 + 41.2793900 97.9245600 + 41.3387700 97.8996700 + 41.3692300 97.8341800 + 41.3707000 97.7281200 + 41.3712300 97.6883500 + 41.3812400 97.6753200 +721 SHELL CR. NR COLUMBUS NE -1 404 41.70583 97.82333 + 41.5245830 97.2795830 + 41.4912500 97.2983540 + 41.4954170 97.3024790 + 41.4954170 97.3108540 + 41.4975210 97.3129170 + 41.5016460 97.3170830 + 41.5058540 97.3170830 + 41.5079170 97.3191460 + 41.5079170 97.3400210 + 41.5058130 97.3420830 + 41.5037500 97.3441460 + 41.5037500 97.3566880 + 41.5016460 97.3587500 + 41.4995830 97.3608130 + 41.4995830 97.3775210 + 41.5016880 97.3795830 + 41.5037500 97.3816460 + 41.5037500 97.3858540 + 41.5016460 97.3879170 + 41.4995830 97.3899790 + 41.4995830 97.3941880 + 41.5016880 97.3962500 + 41.5037500 97.3983130 + 41.5037500 97.4025210 + 41.5016880 97.4045830 + 41.4891460 97.4045830 + 41.4870830 97.4066460 + 41.4870830 97.4483540 + 41.4891460 97.4504170 + 41.4933540 97.4504170 + 41.4954170 97.4524790 + 41.4954170 97.4566880 + 41.4933130 97.4587500 + 41.4912500 97.4608130 + 41.4912500 97.4858540 + 41.4933540 97.4879170 + 41.4954170 97.4900210 + 41.4974790 97.4920830 + 41.5058540 97.4920830 + 41.5079170 97.4941460 + 41.5079170 97.4983540 + 41.5100210 97.5004170 + 41.5120830 97.5024790 + 41.5120830 97.5066880 + 41.5141880 97.5087500 + 41.5162500 97.5108540 + 41.5204170 97.5149790 + 41.5204170 97.5191880 + 41.5225210 97.5212500 + 41.5245830 97.5233130 + 41.5245830 97.5608540 + 41.5266460 97.5629170 + 41.5308540 97.5629170 + 41.5329170 97.5649790 + 41.5329170 97.5775210 + 41.5350210 97.5795830 + 41.5370830 97.5816460 + 41.5370830 97.5900210 + 41.5391880 97.5920830 + 41.5412500 97.5941460 + 41.5412500 97.6025210 + 41.5433540 97.6045830 + 41.5454170 97.6066460 + 41.5454170 97.6108540 + 41.5475210 97.6129170 + 41.5495830 97.6149790 + 41.5495830 97.6233540 + 41.5516880 97.6254170 + 41.5537500 97.6274790 + 41.5537500 97.6483540 + 41.5516460 97.6504170 + 41.5495830 97.6524790 + 41.5495830 97.6566880 + 41.5516880 97.6587500 + 41.5537500 97.6608540 + 41.5558540 97.6629170 + 41.5579170 97.6649790 + 41.5579170 97.6691880 + 41.5599790 97.6712500 + 41.5725210 97.6712500 + 41.5745830 97.6733130 + 41.5745830 97.6816880 + 41.5766880 97.6837500 + 41.5787500 97.6858540 + 41.5808130 97.6879170 + 41.5891880 97.6879170 + 41.5912500 97.6900210 + 41.5933540 97.6920830 + 41.5954170 97.6941880 + 41.6058130 97.7045830 + 41.6183540 97.7045830 + 41.6204170 97.7066880 + 41.6224790 97.7087500 + 41.6266880 97.7087500 + 41.6287500 97.7108130 + 41.6287500 97.7191880 + 41.6308130 97.7212500 + 41.6350210 97.7212500 + 41.6391460 97.7254170 + 41.6475210 97.7254170 + 41.6495830 97.7274790 + 41.6599790 97.7420830 + 41.6641880 97.7420830 + 41.6662500 97.7441880 + 41.6683130 97.7462500 + 41.6808540 97.7462500 + 41.6829170 97.7483130 + 41.6829170 97.7608540 + 41.6849790 97.7629170 + 41.6891880 97.7629170 + 41.6912500 97.7650210 + 41.6933540 97.7670830 + 41.6954170 97.7691460 + 41.6954170 97.7733540 + 41.6975210 97.7754170 + 41.6995830 97.7774790 + 41.6995830 97.7816880 + 41.7016880 97.7837500 + 41.7037500 97.7858540 + 41.7058540 97.7879170 + 41.7079170 97.7899790 + 41.7079170 97.7941880 + 41.7100210 97.7962500 + 41.7162500 97.8024790 + 41.7162500 97.8066880 + 41.7141460 97.8087500 + 41.7120830 97.8108540 + 41.7099790 97.8129170 + 41.7079170 97.8150210 + 41.7058130 97.8170830 + 41.7037500 97.8191460 + 41.7037500 97.8275210 + 41.7058540 97.8295830 + 41.7079170 97.8316460 + 41.7079170 97.8358540 + 41.7100210 97.8379170 + 41.7120830 97.8399790 + 41.7120830 97.8525210 + 41.7099790 97.8545830 + 41.7079170 97.8566460 + 41.7079170 97.8775210 + 41.7099790 97.8795830 + 41.7141880 97.8795830 + 41.7162500 97.8774790 + 41.7183130 97.8754170 + 41.7225210 97.8754170 + 41.7245830 97.8775210 + 41.7266880 97.8795830 + 41.7287500 97.8816880 + 41.7308540 97.8837500 + 41.7329170 97.8858540 + 41.7350210 97.8879170 + 41.7370830 97.8900210 + 41.7391880 97.8920830 + 41.7412500 97.8899790 + 41.7433540 97.8879170 + 41.7454170 97.8858130 + 41.7475210 97.8837500 + 41.7495830 97.8858540 + 41.7516880 97.8879170 + 41.7537500 97.8900210 + 41.7558540 97.8920830 + 41.7579170 97.8941460 + 41.7579170 97.9066880 + 41.7599790 97.9087500 + 41.7641880 97.9087500 + 41.7662500 97.9066460 + 41.7683130 97.9045830 + 41.7766880 97.9045830 + 41.7787500 97.9066460 + 41.7787500 97.9233540 + 41.7808540 97.9254170 + 41.7829170 97.9274790 + 41.7829170 97.9316880 + 41.7850210 97.9337500 + 41.7870830 97.9358540 + 41.7891880 97.9379170 + 41.7912500 97.9400210 + 41.7891460 97.9420830 + 41.7870830 97.9441460 + 41.7870830 97.9525210 + 41.7891460 97.9545830 + 41.7933540 97.9545830 + 41.7954170 97.9566460 + 41.7954170 97.9608540 + 41.7975210 97.9629170 + 41.7995830 97.9650210 + 41.8016460 97.9670830 + 41.8100210 97.9670830 + 41.8120830 97.9691460 + 41.8120830 97.9733540 + 41.8141880 97.9754170 + 41.8162500 97.9775210 + 41.8183540 97.9795830 + 41.8204170 97.9816880 + 41.8224790 97.9837500 + 41.8266880 97.9837500 + 41.8287500 97.9858540 + 41.8308130 97.9879170 + 41.8350210 97.9879170 + 41.8370830 97.9900210 + 41.8391460 97.9920830 + 41.8474790 97.9962500 + 41.8537500 97.9983130 + 41.8537500 98.0108540 + 41.8516460 98.0129170 + 41.8495830 98.0149790 + 41.8537500 98.0275210 + 41.8537500 98.0295830 + 41.8725210 98.0295830 + 41.8745830 98.0275210 + 41.8766460 98.0254170 + 41.8787500 98.0274790 + 41.8808130 98.0295830 + 41.8850210 98.0295830 + 41.8870830 98.0275210 + 41.8870830 98.0149790 + 41.8891460 98.0129170 + 41.8912500 98.0108540 + 41.8933130 98.0087500 + 41.8954170 98.0066880 + 41.8974790 98.0045830 + 41.8995830 98.0025210 + 41.8995830 97.9983130 + 41.9016460 97.9962500 + 41.9037500 97.9941880 + 41.9037500 97.9899790 + 41.9058130 97.9879170 + 41.9100210 97.9879170 + 41.9120830 97.9858540 + 41.9141460 97.9837500 + 41.9162500 97.9816880 + 41.9162500 97.9733130 + 41.9183130 97.9712500 + 41.9204170 97.9691880 + 41.9224790 97.9670830 + 41.9266880 97.9670830 + 41.9287500 97.9650210 + 41.9287500 97.9566460 + 41.9266880 97.9545830 + 41.9245830 97.9525210 + 41.9245830 97.9441460 + 41.9225210 97.9420830 + 41.9204170 97.9400210 + 41.9204170 97.9191460 + 41.9183540 97.9170830 + 41.9162500 97.9066460 + 41.9141880 97.9045830 + 41.9120830 97.9025210 + 41.9120830 97.8816460 + 41.9100210 97.8795830 + 41.9079170 97.8775210 + 41.9079170 97.8733130 + 41.9058540 97.8712500 + 41.9016460 97.8712500 + 41.8995830 97.8691880 + 41.9016460 97.8670830 + 41.9037500 97.8650210 + 41.9037500 97.8566460 + 41.8995830 97.8525210 + 41.8995830 97.8483130 + 41.8975210 97.8462500 + 41.8891460 97.8462500 + 41.8870830 97.8441880 + 41.8870830 97.8399790 + 41.8850210 97.8379170 + 41.8829170 97.8358540 + 41.8808540 97.8337500 + 41.8787500 97.8316880 + 41.8787500 97.8233130 + 41.8766880 97.8212500 + 41.8683130 97.8212500 + 41.8662500 97.8191880 + 41.8641880 97.8170830 + 41.8558130 97.8170830 + 41.8537500 97.8150210 + 41.8516880 97.8129170 + 41.8474790 97.8129170 + 41.8349790 97.8045830 + 41.8329170 97.8025210 + 41.8329170 97.7983130 + 41.8245830 97.7900210 + 41.8225210 97.7795830 + 41.8183130 97.7795830 + 41.8162500 97.7524790 + 41.8162500 97.7504170 + 41.8099790 97.7504170 + 41.8079170 97.7483540 + 41.8058540 97.7462500 + 41.8016460 97.7462500 + 41.7995830 97.7441880 + 41.7995830 97.7399790 + 41.7975210 97.7379170 + 41.7933130 97.7379170 + 41.7849790 97.7337500 + 41.7829170 97.7316880 + 41.7808540 97.7295830 + 41.7787500 97.7275210 + 41.7787500 97.7191460 + 41.7766880 97.7170830 + 41.7745830 97.7150210 + 41.7725210 97.7129170 + 41.7704170 97.7108540 + 41.7724790 97.7087500 + 41.7745830 97.7066880 + 41.7745830 97.7024790 + 41.7725210 97.7004170 + 41.7704170 97.6983540 + 41.7704170 97.6941460 + 41.7683540 97.6920830 + 41.7662500 97.6900210 + 41.7641880 97.6879170 + 41.7599790 97.6879170 + 41.7579170 97.6858540 + 41.7558540 97.6837500 + 41.7516460 97.6837500 + 41.7495830 97.6816880 + 41.7475210 97.6795830 + 41.7349790 97.6795830 + 41.7329170 97.6775210 + 41.7308540 97.6754170 + 41.7224790 97.6754170 + 41.7204170 97.6733540 + 41.7204170 97.6691460 + 41.7183540 97.6670830 + 41.7058130 97.6670830 + 41.7037500 97.6650210 + 41.7016880 97.6629170 + 41.6995830 97.6608540 + 41.6975210 97.6587500 + 41.6933130 97.6587500 + 41.6912500 97.6566880 + 41.6891880 97.6545830 + 41.6849790 97.6545830 + 41.6829170 97.6525210 + 41.6808540 97.6504170 + 41.6787500 97.6483540 + 41.6787500 97.6399790 + 41.6766880 97.6379170 + 41.6745830 97.6358540 + 41.6745830 97.6191460 + 41.6725210 97.6170830 + 41.6704170 97.6150210 + 41.6704170 97.6066460 + 41.6683540 97.6045830 + 41.6641460 97.6045830 + 41.6620830 97.6025210 + 41.6620830 97.5566460 + 41.6600210 97.5545830 + 41.6579170 97.5525210 + 41.6579170 97.5483130 + 41.6558540 97.5462500 + 41.6537500 97.5441880 + 41.6537500 97.5399790 + 41.6516880 97.5379170 + 41.6495830 97.5358540 + 41.6495830 97.5274790 + 41.6475210 97.5254170 + 41.6454170 97.5233540 + 41.6454170 97.5149790 + 41.6433540 97.5129170 + 41.6412500 97.5108540 + 41.6391880 97.5087500 + 41.6370830 97.5066880 + 41.6370830 97.4983130 + 41.6391460 97.4962500 + 41.6412500 97.4941880 + 41.6391880 97.4920830 + 41.6370830 97.4900210 + 41.6370830 97.4858130 + 41.6391460 97.4837500 + 41.6433540 97.4837500 + 41.6454170 97.4816880 + 41.6474790 97.4795830 + 41.6495830 97.4775210 + 41.6454170 97.4629170 + 41.6183130 97.4629170 + 41.5891880 97.4545830 + 41.5870830 97.4525210 + 41.5870830 97.4358130 + 41.5808130 97.4337500 + 41.5766880 97.4295830 + 41.5662500 97.4233540 + 41.5662500 97.4108130 + 41.5641880 97.4087500 + 41.5620830 97.4066880 + 41.5600210 97.4004170 + 41.5475210 97.3920830 + 41.5433130 97.3920830 + 41.5412500 97.3900210 + 41.5391880 97.3879170 + 41.5370830 97.3858540 + 41.5370830 97.3733130 + 41.5350210 97.3712500 + 41.5329170 97.3691880 + 41.5349790 97.3670830 + 41.5370830 97.3650210 + 41.5391460 97.3129170 + 41.5412500 97.3108540 + 41.5412500 97.3024790 + 41.5433130 97.3004170 + 41.5454170 97.2983540 + 41.5454170 97.2941460 + 41.5245830 97.2795830 +722 722 -1 41 41.40310 97.26144 + 41.6809800 97.2695500 + 41.6720200 97.1761600 + 41.5245000 97.1737000 + 41.5158200 97.0406700 + 41.4669600 97.0001100 + 41.4686000 96.7611200 + 41.4293400 96.7474200 + 41.3994400 96.8134300 + 41.3990000 96.8797500 + 41.2121900 96.8774300 + 41.2017900 96.9566700 + 41.2211500 96.9966300 + 41.2304500 97.0629300 + 41.2693200 97.1164900 + 41.2682300 97.2356500 + 41.2483000 97.2617700 + 41.2665900 97.3945200 + 41.2269800 97.4202000 + 41.2160800 97.5126100 + 41.2241100 97.6583600 + 41.1252900 97.6956900 + 41.1438700 97.7754500 + 41.1941000 97.6973400 + 41.2527300 97.7252300 + 41.3637100 97.5025200 + 41.4027300 97.5298800 + 41.4143600 97.3709000 + 41.4340200 97.3712800 + 41.4724800 97.4517200 + 41.4714000 97.5446600 + 41.5009000 97.5453100 + 41.5194100 97.6387500 + 41.5485700 97.6660200 + 41.5492500 97.6128500 + 41.5015300 97.4921800 + 41.5136500 97.2798200 + 41.5329200 97.3200500 + 41.5317800 97.4263600 + 41.6395100 97.4684800 + 41.6793000 97.4293600 + 41.6809800 97.2695500 +723 723 -1 15 41.03800 96.25488 + 41.1559300 96.2686200 + 41.1559500 96.2553900 + 41.1264600 96.2552900 + 41.0772700 96.2683100 + 41.0675000 96.2418700 + 41.0380100 96.2417700 + 41.0184600 96.1757400 + 40.9299900 96.1755100 + 40.9201400 96.1886700 + 40.9199700 96.2808900 + 40.9297000 96.3204700 + 40.9591600 96.3337800 + 41.0574600 96.3342400 + 41.1361400 96.3214000 + 41.1559300 96.2686200 +724 SALT CR. AT ROCA NE -1 256 40.61417 96.71917 + 40.6620830 96.6712500 + 40.6579170 96.6566880 + 40.6579170 96.6524790 + 40.6599790 96.6504170 + 40.6620830 96.6483540 + 40.6620830 96.6399790 + 40.6662500 96.6358540 + 40.6641880 96.6337500 + 40.6620830 96.6316880 + 40.6620830 96.6274790 + 40.6641460 96.6254170 + 40.6662500 96.6233540 + 40.6662500 96.6191460 + 40.6683130 96.6170830 + 40.6725210 96.6170830 + 40.6745830 96.6150210 + 40.6766460 96.6129170 + 40.6850210 96.6129170 + 40.6870830 96.6149790 + 40.6974790 96.6254170 + 40.6995830 96.6233540 + 40.7016460 96.6212500 + 40.7037500 96.6191880 + 40.7037500 96.6149790 + 40.7079170 96.6108540 + 40.7079170 96.5983130 + 40.7058540 96.5962500 + 40.7037500 96.5941880 + 40.7079170 96.5900210 + 40.7079170 96.5816460 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6524790 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5308540 96.7545830 + 40.5287500 96.7566460 + 40.5266880 96.7587500 + 40.5245830 96.7608130 + 40.5266460 96.7629170 + 40.5287500 96.7649790 + 40.5308130 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5349790 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391460 96.7920830 + 40.5412500 96.7941460 + 40.5391880 96.7962500 + 40.5370830 96.7983130 + 40.5391460 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391880 96.8129170 + 40.5370830 96.8149790 + 40.5350210 96.8170830 + 40.5329170 96.8191460 + 40.5308540 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8774790 + 40.5308130 96.8795830 + 40.5329170 96.8816460 + 40.5349790 96.8837500 + 40.5370830 96.8858130 + 40.5391460 96.8879170 + 40.5412500 96.8899790 + 40.5433130 96.8920830 + 40.5454170 96.8941460 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983130 + 40.5599790 96.9004170 + 40.5620830 96.9024790 + 40.5641460 96.9045830 + 40.5662500 96.9066460 + 40.5683130 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808130 96.9212500 + 40.5829170 96.9191880 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191460 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233130 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308130 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6349790 96.9004170 + 40.6370830 96.8983540 + 40.6412500 96.8900210 + 40.6412500 96.8858130 + 40.6433130 96.8837500 + 40.6475210 96.8837500 + 40.6495830 96.8816880 + 40.6495830 96.8774790 + 40.6516460 96.8754170 + 40.6600210 96.8754170 + 40.6620830 96.8733540 + 40.6662500 96.8691880 + 40.6662500 96.8608130 + 40.6641880 96.8587500 + 40.6620830 96.8566880 + 40.6620830 96.8441460 + 40.6641460 96.8420830 + 40.6662500 96.8400210 + 40.6662500 96.8358130 + 40.6683130 96.8337500 + 40.6704170 96.8316880 + 40.6704170 96.8274790 + 40.6724790 96.8254170 + 40.6745830 96.8233540 + 40.6766460 96.8212500 + 40.6787500 96.8191880 + 40.6787500 96.8108130 + 40.6766880 96.8087500 + 40.6745830 96.8066880 + 40.6745830 96.7983130 + 40.6725210 96.7962500 + 40.6704170 96.7941880 + 40.6704170 96.7899790 + 40.6724790 96.7879170 + 40.6766880 96.7879170 + 40.6787500 96.7858540 + 40.6808130 96.7837500 + 40.6829170 96.7816880 + 40.6829170 96.7691460 + 40.6849790 96.7670830 + 40.6870830 96.7650210 + 40.6870830 96.7566460 + 40.6829170 96.7525210 + 40.6808540 96.7504170 + 40.6787500 96.7483540 + 40.6766880 96.7462500 + 40.6745830 96.7441880 + 40.6745830 96.7399790 + 40.6725210 96.7379170 + 40.6704170 96.7358540 + 40.6704170 96.7149790 + 40.6683540 96.7129170 + 40.6662500 96.7108540 + 40.6662500 96.6941460 + 40.6620830 96.6712500 +725 725 -1 23 40.97550 96.86758 + 41.2121900 96.8774300 + 41.1437200 96.8237100 + 41.1338900 96.8235900 + 41.1046400 96.7836200 + 40.9671100 96.7689100 + 40.9280200 96.7289600 + 40.8788800 96.7284500 + 40.8496100 96.6886600 + 40.7805100 96.7405900 + 40.7995100 96.8460200 + 40.7298700 96.9634600 + 40.7688800 97.0034300 + 40.8768900 97.0181400 + 40.9358600 97.0189800 + 40.9360700 96.9926200 + 40.9557300 96.9929000 + 40.9750700 97.0327300 + 41.0142800 97.0464900 + 41.1130100 96.9951100 + 41.1818200 96.9960800 + 41.2211500 96.9966300 + 41.2017900 96.9566700 + 41.2121900 96.8774300 +726 726 -1 14 40.74650 96.77946 + 40.8496100 96.6886600 + 40.7908400 96.6486400 + 40.7812700 96.5959500 + 40.7223100 96.5954500 + 40.6730400 96.6213000 + 40.6432900 96.6735400 + 40.6919100 96.7659400 + 40.6814900 96.8577500 + 40.6518300 96.8836400 + 40.7003900 96.9630600 + 40.7298700 96.9634600 + 40.7995100 96.8460200 + 40.7805100 96.7405900 + 40.8496100 96.6886600 +727 WAHOO CR. AT ITHACA NE -1 234 41.26000 96.74417 + 41.1412500 96.5379170 + 41.1266460 96.5504170 + 41.1225210 96.5545830 + 41.1183130 96.5545830 + 41.1162500 96.5566880 + 41.1141880 96.5587500 + 41.1099790 96.5587500 + 41.1079170 96.5608540 + 41.1058540 96.5629170 + 41.1016460 96.5629170 + 41.0995830 96.5629170 + 41.1099790 96.5795830 + 41.1141880 96.5795830 + 41.1162500 96.5816460 + 41.1162500 96.5941880 + 41.1183540 96.5962500 + 41.1245830 96.6024790 + 41.1245830 96.6108540 + 41.1266460 96.6129170 + 41.1308540 96.6129170 + 41.1329170 96.6149790 + 41.1329170 96.6275210 + 41.1349790 96.6295830 + 41.1391880 96.6295830 + 41.1412500 96.6316880 + 41.1433130 96.6337500 + 41.1475210 96.6337500 + 41.1495830 96.6358540 + 41.1516880 96.6379170 + 41.1537500 96.6399790 + 41.1537500 96.6483540 + 41.1516880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1391460 96.6587500 + 41.1370830 96.6608540 + 41.1349790 96.6629170 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3308540 96.8920830 + 41.3329170 96.8941880 + 41.3350210 96.8962500 + 41.3370830 96.8983540 + 41.3391460 96.9004170 + 41.3433540 96.9004170 + 41.3454170 96.8983130 + 41.3475210 96.8962500 + 41.3495830 96.8983540 + 41.3516460 96.9004170 + 41.3683540 96.9004170 + 41.3704170 96.9025210 + 41.3724790 96.9045830 + 41.3766880 96.9045830 + 41.3787500 96.9066880 + 41.3808130 96.9087500 + 41.3891880 96.9087500 + 41.3912500 96.9066880 + 41.3912500 96.9024790 + 41.3933540 96.9004170 + 41.3954170 96.8983540 + 41.3954170 96.8816460 + 41.3975210 96.8795830 + 41.3995830 96.8775210 + 41.4037500 96.8400210 + 41.4037500 96.8316460 + 41.4058540 96.8295830 + 41.4079170 96.8275210 + 41.4079170 96.8066460 + 41.4099790 96.8045830 + 41.4141880 96.8045830 + 41.4162500 96.8024790 + 41.4183130 96.8004170 + 41.4225210 96.8004170 + 41.4245830 96.7983540 + 41.4245830 96.7649790 + 41.4224790 96.7629170 + 41.4204170 96.7608540 + 41.4204170 96.7524790 + 41.4183130 96.7504170 + 41.4162500 96.7483540 + 41.4162500 96.7358130 + 41.4141460 96.7337500 + 41.4120830 96.7316880 + 41.4120830 96.6941460 + 41.4099790 96.6920830 + 41.4079170 96.6629170 + 41.3891460 96.6629170 + 41.3870830 96.6608540 + 41.3870830 96.6566460 + 41.3850210 96.6545830 + 41.3829170 96.6525210 + 41.3808540 96.6504170 + 41.3787500 96.6483540 + 41.3766880 96.6462500 + 41.3745830 96.6441880 + 41.3745830 96.6316460 + 41.3725210 96.6295830 + 41.3704170 96.6275210 + 41.3683540 96.6254170 + 41.3641460 96.6254170 + 41.3620830 96.6233540 + 41.3600210 96.6212500 + 41.3558130 96.6212500 + 41.3537500 96.6191880 + 41.3516880 96.6170830 + 41.3391460 96.6170830 + 41.3370830 96.6191460 + 41.3350210 96.6212500 + 41.3308130 96.6212500 + 41.3287500 96.6233130 + 41.3266880 96.6254170 + 41.3099790 96.6254170 + 41.3079170 96.6233540 + 41.3058540 96.6212500 + 41.3016460 96.6212500 + 41.2995830 96.6191880 + 41.2975210 96.6170830 + 41.2933130 96.6170830 + 41.2912500 96.6150210 + 41.2891880 96.6129170 + 41.2870830 96.6108540 + 41.2870830 96.6066460 + 41.2850210 96.6045830 + 41.2766460 96.6045830 + 41.2745830 96.6025210 + 41.2725210 96.6004170 + 41.2704170 96.5983540 + 41.2683540 96.5962500 + 41.2662500 96.5941880 + 41.2641880 96.5920830 + 41.2516460 96.5920830 + 41.2495830 96.5900210 + 41.2475210 96.5879170 + 41.2433130 96.5879170 + 41.2412500 96.5858540 + 41.2391880 96.5837500 + 41.2370830 96.5816880 + 41.2350210 96.5795830 + 41.2266460 96.5795830 + 41.2245830 96.5775210 + 41.2245830 96.5733130 + 41.2225210 96.5712500 + 41.2016460 96.5712500 + 41.1995830 96.5733130 + 41.1975210 96.5754170 + 41.1933130 96.5754170 + 41.1912500 96.5733540 + 41.1912500 96.5608130 + 41.1891880 96.5587500 + 41.1870830 96.5566880 + 41.1850210 96.5545830 + 41.1808130 96.5545830 + 41.1787500 96.5525210 + 41.1766880 96.5504170 + 41.1745830 96.5483540 + 41.1745830 96.5399790 + 41.1725210 96.5379170 + 41.1558130 96.5379170 + 41.1537500 96.5358540 + 41.1516880 96.5337500 + 41.1495830 96.5316880 + 41.1475210 96.5295830 + 41.1412500 96.5379170 +728 728 -1 26 41.15040 96.48756 + 41.4198100 96.6942400 + 41.4204000 96.5748200 + 41.3910700 96.5347900 + 41.3222900 96.5210100 + 41.3224000 96.4945100 + 41.2929500 96.4810600 + 41.2931800 96.4148300 + 41.2736000 96.3882400 + 41.2146500 96.3746800 + 41.1852600 96.3348500 + 41.0770100 96.3739500 + 41.0574600 96.3342400 + 40.9591600 96.3337800 + 40.9297000 96.3204700 + 40.9199700 96.2808900 + 40.8805500 96.3202400 + 40.8804100 96.3729200 + 40.9000700 96.3730200 + 40.9195600 96.4258300 + 40.9687100 96.4261200 + 40.9685200 96.4788600 + 41.1254300 96.5724200 + 41.1551500 96.5197800 + 41.3513200 96.6272800 + 41.3608800 96.6804000 + 41.4198100 96.6942400 +729 729 -1 27 40.92870 96.59826 + 41.1254300 96.5724200 + 40.9685200 96.4788600 + 40.9687100 96.4261200 + 40.9195600 96.4258300 + 40.9000700 96.3730200 + 40.8804100 96.3729200 + 40.8803700 96.3860900 + 40.8213600 96.3989200 + 40.8209800 96.5041800 + 40.7719400 96.4775300 + 40.7717900 96.5169800 + 40.7226500 96.5166200 + 40.7027700 96.5690200 + 40.7027100 96.5821500 + 40.7223100 96.5954500 + 40.7812700 96.5959500 + 40.7908400 96.6486400 + 40.8496100 96.6886600 + 40.8788800 96.7284500 + 40.9280200 96.7289600 + 40.9671100 96.7689100 + 41.1046400 96.7836200 + 41.1338900 96.8235900 + 41.1442100 96.7444100 + 41.1249800 96.6649200 + 41.1546700 96.6255300 + 41.1254300 96.5724200 +730 730 -1 12 40.80920 98.67616 + 40.8493900 98.8345700 + 40.8011400 98.7931700 + 40.8020000 98.7537200 + 40.8666400 98.4796400 + 40.8273400 98.4782700 + 40.8036900 98.6748400 + 40.7635500 98.7127800 + 40.7517300 98.8043700 + 40.7812000 98.8055400 + 40.8386800 98.8736500 + 40.8485100 98.8740500 + 40.8493900 98.8345700 +757 757 -1 7 40.86300 98.41433 + 40.8290900 98.3861900 + 40.8482500 98.4131700 + 40.8273400 98.4782700 + 40.8666400 98.4796400 + 40.8784700 98.3746900 + 40.8986100 98.3490100 + 40.8290900 98.3861900 +770 770 -1 30 41.30260 96.39942 + 41.5477300 96.6822100 + 41.5084600 96.6685400 + 41.4498400 96.5883300 + 41.4501300 96.5219600 + 41.4111800 96.4155300 + 41.2836800 96.2955900 + 41.3034100 96.2691700 + 41.2837700 96.2558500 + 41.1559300 96.2686200 + 41.1361400 96.3214000 + 41.0574600 96.3342400 + 41.0770100 96.3739500 + 41.1852600 96.3348500 + 41.2146500 96.3746800 + 41.2736000 96.3882400 + 41.2931800 96.4148300 + 41.2929500 96.4810600 + 41.3224000 96.4945100 + 41.3222900 96.5210100 + 41.3910700 96.5347900 + 41.4204000 96.5748200 + 41.4198100 96.6942400 + 41.4196600 96.7207800 + 41.4293400 96.7474200 + 41.4686000 96.7611200 + 41.4669600 97.0001100 + 41.5158200 97.0406700 + 41.4965700 96.9872500 + 41.5468600 96.8284300 + 41.5477300 96.6822100 +804 804 -1 24 42.83000 95.30000 + 42.8800000 95.2200000 + 42.8200000 95.2300000 + 42.8200000 95.2700000 + 42.7800000 95.2700000 + 42.6800000 95.2200000 + 42.6800000 95.2700000 + 42.7200000 95.2800000 + 42.7200000 95.3000000 + 42.7700000 95.3200000 + 42.7800000 95.3000000 + 42.8200000 95.3200000 + 42.8500000 95.3700000 + 42.8700000 95.3800000 + 42.9000000 95.3500000 + 42.9200000 95.3700000 + 42.9200000 95.3500000 + 42.9300000 95.3500000 + 42.9500000 95.3500000 + 42.9800000 95.3000000 + 42.9500000 95.2500000 + 42.9200000 95.2700000 + 42.9000000 95.2500000 + 42.8800000 95.2500000 + 42.8800000 95.2200000 +805 805 -1 39 43.00000 95.46500 + 43.1800000 95.6000000 + 43.2700000 95.6000000 + 43.2700000 95.5700000 + 43.2500000 95.5000000 + 43.2200000 95.4700000 + 43.1700000 95.4800000 + 43.1300000 95.4700000 + 43.1300000 95.4500000 + 43.0800000 95.4200000 + 43.0300000 95.3700000 + 43.0200000 95.3700000 + 43.0000000 95.3500000 + 43.0000000 95.3300000 + 42.9800000 95.3000000 + 42.9500000 95.3500000 + 42.9300000 95.3500000 + 42.9200000 95.3500000 + 42.9200000 95.3700000 + 42.9000000 95.3500000 + 42.8700000 95.3800000 + 42.8300000 95.4300000 + 42.8200000 95.4500000 + 42.7800000 95.4700000 + 42.7500000 95.4800000 + 42.7300000 95.5300000 + 42.7500000 95.5500000 + 42.7700000 95.5800000 + 42.7800000 95.6300000 + 42.8000000 95.6000000 + 42.7800000 95.5700000 + 42.7800000 95.5500000 + 42.8000000 95.5300000 + 42.8800000 95.5200000 + 42.9500000 95.5200000 + 43.0200000 95.5300000 + 43.0800000 95.5500000 + 43.0800000 95.5700000 + 43.1500000 95.5700000 + 43.1800000 95.6000000 +806 806 -1 31 42.98000 95.67000 + 42.8800000 95.8200000 + 42.8800000 95.8000000 + 42.9300000 95.8200000 + 42.9700000 95.8200000 + 42.9800000 95.8200000 + 43.0200000 95.8200000 + 43.0200000 95.7800000 + 43.0300000 95.7700000 + 43.0500000 95.7700000 + 43.0800000 95.7500000 + 43.1000000 95.7300000 + 43.1300000 95.7300000 + 43.1500000 95.6700000 + 43.1500000 95.6200000 + 43.1800000 95.6200000 + 43.1800000 95.6000000 + 43.1500000 95.5700000 + 43.0800000 95.5700000 + 43.0800000 95.5500000 + 43.0200000 95.5300000 + 42.9500000 95.5200000 + 42.8800000 95.5200000 + 42.8000000 95.5300000 + 42.7800000 95.5500000 + 42.7800000 95.5700000 + 42.8000000 95.6000000 + 42.7800000 95.6300000 + 42.8000000 95.6800000 + 42.8200000 95.7200000 + 42.8500000 95.7200000 + 42.8800000 95.8200000 +807 807 -1 25 42.64500 95.70000 + 42.7800000 95.6300000 + 42.7700000 95.5800000 + 42.7500000 95.5500000 + 42.7300000 95.5300000 + 42.7500000 95.4800000 + 42.7000000 95.5000000 + 42.7000000 95.5200000 + 42.6500000 95.5000000 + 42.5800000 95.5300000 + 42.5700000 95.5200000 + 42.4800000 95.5300000 + 42.4800000 95.6000000 + 42.5000000 95.6500000 + 42.5000000 95.7300000 + 42.4700000 95.8000000 + 42.5000000 95.8500000 + 42.5000000 95.8800000 + 42.5300000 95.9200000 + 42.5800000 95.9000000 + 42.6200000 95.8300000 + 42.6800000 95.7700000 + 42.7300000 95.7700000 + 42.8200000 95.7200000 + 42.8000000 95.6800000 + 42.7800000 95.6300000 +808 808 -1 33 42.28500 95.86675 + 42.4800000 95.6000000 + 42.4300000 95.6000000 + 42.4300000 95.6300000 + 42.4000000 95.6300000 + 42.3800000 95.7000000 + 42.3500000 95.7200000 + 42.3500000 95.7300000 + 42.3000000 95.8000000 + 42.2500000 95.8200000 + 42.2300000 95.8200000 + 42.2000000 95.8500000 + 42.1800000 95.8500000 + 42.1800000 95.8800000 + 42.1500000 95.9000000 + 42.1300000 95.9200000 + 42.0800000 95.9500000 + 42.0700000 95.9800000 + 42.0800000 96.0100000 + 42.1000000 96.0000000 + 42.1800000 96.0000000 + 42.2300000 95.9500000 + 42.2800000 95.9300000 + 42.3000000 95.9200000 + 42.3200000 95.9200000 + 42.4500000 95.8800000 + 42.4700000 95.9000000 + 42.4800000 95.9000000 + 42.5000000 95.8800000 + 42.5000000 95.8500000 + 42.4700000 95.8000000 + 42.5000000 95.7300000 + 42.5000000 95.6500000 + 42.4800000 95.6000000 +809 809 -1 55 42.49500 95.40238 + 42.7200000 95.3000000 + 42.6800000 95.3000000 + 42.6500000 95.2800000 + 42.6300000 95.2800000 + 42.5700000 95.3000000 + 42.5300000 95.3000000 + 42.5200000 95.2800000 + 42.4500000 95.2700000 + 42.4300000 95.2300000 + 42.3700000 95.2300000 + 42.3500000 95.2200000 + 42.3200000 95.2200000 + 42.2800000 95.2500000 + 42.2700000 95.3200000 + 42.2800000 95.3500000 + 42.2700000 95.3800000 + 42.3000000 95.4000000 + 42.3000000 95.4300000 + 42.2800000 95.4500000 + 42.3000000 95.5200000 + 42.2200000 95.6300000 + 42.2000000 95.6700000 + 42.1700000 95.7200000 + 42.1200000 95.7500000 + 42.1200000 95.7700000 + 42.1300000 95.7800000 + 42.1500000 95.8000000 + 42.1800000 95.8500000 + 42.2000000 95.8500000 + 42.2300000 95.8200000 + 42.2500000 95.8200000 + 42.3000000 95.8000000 + 42.3500000 95.7300000 + 42.3500000 95.7200000 + 42.3800000 95.7000000 + 42.4000000 95.6300000 + 42.4300000 95.6300000 + 42.4300000 95.6000000 + 42.4800000 95.6000000 + 42.4800000 95.5300000 + 42.5700000 95.5200000 + 42.5800000 95.5300000 + 42.6500000 95.5000000 + 42.7000000 95.5200000 + 42.7000000 95.5000000 + 42.7500000 95.4800000 + 42.7800000 95.4700000 + 42.8200000 95.4500000 + 42.8300000 95.4300000 + 42.8700000 95.3800000 + 42.8500000 95.3700000 + 42.8200000 95.3200000 + 42.7800000 95.3000000 + 42.7700000 95.3200000 + 42.7200000 95.3000000 +810 810 -1 29 42.04000 95.88500 + 42.1200000 95.7500000 + 42.0800000 95.7700000 + 42.0800000 95.8000000 + 42.0700000 95.8300000 + 42.0300000 95.8300000 + 42.0200000 95.8500000 + 41.9800000 95.8700000 + 41.9700000 95.9200000 + 41.9200000 95.9300000 + 41.9000000 95.9500000 + 41.9700000 95.9500000 + 41.9700000 95.9700000 + 41.9700000 95.9800000 + 42.0000000 95.9800000 + 42.0300000 96.0000000 + 42.0500000 96.0200000 + 42.1000000 96.0200000 + 42.1000000 96.0000000 + 42.0800000 96.0100000 + 42.0700000 95.9800000 + 42.0800000 95.9500000 + 42.1300000 95.9200000 + 42.1500000 95.9000000 + 42.1800000 95.8800000 + 42.1800000 95.8500000 + 42.1500000 95.8000000 + 42.1300000 95.7800000 + 42.1200000 95.7700000 + 42.1200000 95.7500000 +811 811 -1 33 42.55500 95.93500 + 42.8200000 95.7200000 + 42.7300000 95.7700000 + 42.6800000 95.7700000 + 42.6200000 95.8300000 + 42.5800000 95.9000000 + 42.5300000 95.9200000 + 42.5300000 95.9300000 + 42.5000000 95.9800000 + 42.4700000 96.0000000 + 42.4300000 96.0500000 + 42.3800000 96.0300000 + 42.3300000 96.0300000 + 42.3000000 96.0700000 + 42.2300000 96.0700000 + 42.2700000 96.0800000 + 42.3200000 96.1300000 + 42.4300000 96.1200000 + 42.5000000 96.1500000 + 42.5700000 96.1200000 + 42.6500000 96.1300000 + 42.6800000 96.1000000 + 42.7200000 96.1000000 + 42.7300000 96.0800000 + 42.7300000 96.0500000 + 42.7800000 96.0200000 + 42.7800000 96.0000000 + 42.7800000 95.9700000 + 42.8000000 95.9500000 + 42.8000000 95.9300000 + 42.8800000 95.8700000 + 42.8800000 95.8200000 + 42.8500000 95.7200000 + 42.8200000 95.7200000 +812 812 -1 54 42.34500 96.19886 + 42.6800000 96.1500000 + 42.7200000 96.1000000 + 42.6800000 96.1000000 + 42.6500000 96.1300000 + 42.5700000 96.1200000 + 42.5000000 96.1500000 + 42.4300000 96.1200000 + 42.3200000 96.1300000 + 42.2700000 96.0800000 + 42.2300000 96.0700000 + 42.3000000 96.0700000 + 42.3300000 96.0300000 + 42.3800000 96.0300000 + 42.4300000 96.0500000 + 42.4700000 96.0000000 + 42.5000000 95.9800000 + 42.5300000 95.9300000 + 42.5300000 95.9200000 + 42.5000000 95.8800000 + 42.4800000 95.9000000 + 42.4700000 95.9000000 + 42.4500000 95.8800000 + 42.3200000 95.9200000 + 42.3000000 95.9200000 + 42.2800000 95.9300000 + 42.2300000 95.9500000 + 42.1800000 96.0000000 + 42.1000000 96.0000000 + 42.1000000 96.0200000 + 42.0500000 96.0200000 + 42.0300000 96.0000000 + 42.0000000 95.9800000 + 41.9700000 95.9800000 + 41.9700000 96.0000000 + 41.9700000 96.0200000 + 42.0200000 96.0500000 + 42.0700000 96.0700000 + 42.0800000 96.1000000 + 42.1700000 96.1300000 + 42.2800000 96.2000000 + 42.3200000 96.2500000 + 42.3305100 96.2584100 + 42.4200000 96.3300000 + 42.4300000 96.3500000 + 42.4700000 96.3500000 + 42.4800000 96.3200000 + 42.5200000 96.3200000 + 42.5200000 96.3000000 + 42.5300000 96.2700000 + 42.5500000 96.2800000 + 42.5700000 96.2500000 + 42.6800000 96.1800000 + 42.6800000 96.1700000 + 42.6800000 96.1500000 +813 813 -1 29 43.80070 97.02903 + 44.1251500 97.2186900 + 44.1061400 97.1355700 + 44.0279600 97.0378100 + 43.9790300 96.9819900 + 43.9306300 96.8437000 + 43.8912500 96.8294600 + 43.8817100 96.7743500 + 43.8125600 96.7872900 + 43.7138200 96.7998700 + 43.6746100 96.7582900 + 43.5956200 96.7711100 + 43.5265000 96.7840100 + 43.4965000 96.8520300 + 43.4762200 96.9337800 + 43.5248100 97.0302000 + 43.5935200 97.0723000 + 43.5934000 97.0860000 + 43.6326300 97.1140200 + 43.7215200 97.1017500 + 43.7410100 97.1295100 + 43.7899800 97.1715100 + 43.8295700 97.1584500 + 43.8786600 97.1867800 + 43.9284800 97.1326100 + 43.9960500 97.2990200 + 44.0355300 97.2997700 + 44.0459300 97.2448300 + 44.1248900 97.2462800 + 44.1251500 97.2186900 +819 819 -1 32 42.99500 96.37500 + 43.1700000 96.2700000 + 43.1500000 96.2000000 + 43.1700000 96.1500000 + 43.1200000 96.1800000 + 43.0800000 96.1700000 + 43.0700000 96.1800000 + 43.0500000 96.2200000 + 43.0200000 96.2200000 + 43.0000000 96.2700000 + 42.9700000 96.2800000 + 42.9300000 96.2700000 + 42.8800000 96.3300000 + 42.8700000 96.4000000 + 42.8300000 96.4500000 + 42.8200000 96.5200000 + 42.8300000 96.5700000 + 42.8700000 96.5800000 + 42.9000000 96.5700000 + 42.9200000 96.5800000 + 42.9500000 96.5800000 + 42.9800000 96.5800000 + 43.0200000 96.5800000 + 43.0300000 96.6000000 + 43.0500000 96.5800000 + 43.1000000 96.5800000 + 43.1300000 96.5700000 + 43.1200000 96.5500000 + 43.0500000 96.4800000 + 43.0500000 96.4700000 + 43.1300000 96.3500000 + 43.1500000 96.3000000 + 43.1700000 96.2700000 +820 820 -1 29 43.38410 96.71186 + 43.5480300 96.5770600 + 43.5300000 96.5500000 + 43.5200000 96.5300000 + 43.5000000 96.5000000 + 43.5200000 96.4700000 + 43.5300000 96.4700000 + 43.5300000 96.4000000 + 43.4700000 96.4200000 + 43.4300000 96.3800000 + 43.3700000 96.3800000 + 43.3500000 96.4200000 + 43.3200000 96.4300000 + 43.3000000 96.4700000 + 43.2700000 96.4700000 + 43.2700000 96.5000000 + 43.2300000 96.5800000 + 43.2200000 96.6500000 + 43.2174300 96.6487100 + 43.2015500 96.7122400 + 43.2803300 96.7266800 + 43.5148400 97.0437200 + 43.5248100 97.0302000 + 43.4762200 96.9337800 + 43.4965000 96.8520300 + 43.4670900 96.8243300 + 43.4674200 96.7696700 + 43.5271100 96.6745900 + 43.5666300 96.6612900 + 43.5480300 96.5770600 +825 825 -1 38 42.85140 96.66654 + 43.1300000 96.5700000 + 43.1000000 96.5800000 + 43.0500000 96.5800000 + 43.0300000 96.6000000 + 43.0200000 96.5800000 + 42.9800000 96.5800000 + 42.9500000 96.5800000 + 42.9200000 96.5800000 + 42.9000000 96.5700000 + 42.8700000 96.5800000 + 42.8300000 96.5700000 + 42.8200000 96.5200000 + 42.8300000 96.4500000 + 42.8700000 96.4000000 + 42.8800000 96.3300000 + 42.8700000 96.3300000 + 42.8500000 96.3000000 + 42.8300000 96.3200000 + 42.8200000 96.3500000 + 42.7800000 96.3500000 + 42.7300000 96.3800000 + 42.7000000 96.4200000 + 42.6200000 96.4300000 + 42.5800000 96.4700000 + 42.5518600 96.4700000 + 42.5500800 96.4703800 + 42.5228700 96.4761100 + 42.5620500 96.5303300 + 42.6995000 96.6259800 + 42.7482600 96.7211000 + 42.8662300 96.7629800 + 42.8955400 96.8039600 + 43.0235300 96.8190300 + 43.0434100 96.7921000 + 43.1522000 96.7253300 + 43.1800000 96.6300000 + 43.1800000 96.5800000 + 43.1300000 96.5700000 +826 826 -1 21 43.21000 96.46000 + 43.1700000 96.2700000 + 43.1500000 96.3000000 + 43.1300000 96.3500000 + 43.0500000 96.4700000 + 43.0500000 96.4800000 + 43.1200000 96.5500000 + 43.1300000 96.5700000 + 43.1800000 96.5800000 + 43.1800000 96.6300000 + 43.2174300 96.6487100 + 43.2200000 96.6500000 + 43.2300000 96.5800000 + 43.2700000 96.5000000 + 43.2700000 96.4700000 + 43.3000000 96.4700000 + 43.3200000 96.4300000 + 43.3500000 96.4200000 + 43.3700000 96.3800000 + 43.2300000 96.2800000 + 43.2200000 96.2800000 + 43.1700000 96.2700000 +855 855 -1 32 42.90500 96.00000 + 42.9700000 96.0800000 + 42.9800000 96.0700000 + 42.9800000 96.0300000 + 42.9800000 96.0000000 + 42.9700000 95.9800000 + 42.9700000 95.9500000 + 43.0000000 95.9300000 + 43.0200000 95.9200000 + 43.0300000 95.8800000 + 43.0200000 95.8200000 + 42.9800000 95.8200000 + 42.9700000 95.8200000 + 42.9300000 95.8200000 + 42.8800000 95.8000000 + 42.8800000 95.8200000 + 42.8800000 95.8700000 + 42.8000000 95.9300000 + 42.8000000 95.9500000 + 42.7800000 95.9700000 + 42.7800000 96.0000000 + 42.7800000 96.0200000 + 42.8000000 96.0800000 + 42.7800000 96.1000000 + 42.7800000 96.1300000 + 42.8000000 96.1700000 + 42.8200000 96.2000000 + 42.8500000 96.1800000 + 42.8700000 96.1800000 + 42.8800000 96.1700000 + 42.9000000 96.1300000 + 42.9500000 96.0800000 + 42.9700000 96.0800000 +856 856 -1 25 43.07500 96.11500 + 43.2200000 96.0700000 + 43.2300000 96.0200000 + 43.2000000 95.9800000 + 43.1800000 95.9800000 + 43.1700000 95.9500000 + 43.1200000 95.9800000 + 43.1000000 96.0000000 + 43.0800000 95.9800000 + 43.0700000 96.0200000 + 43.0500000 96.0200000 + 43.0200000 96.0500000 + 42.9800000 96.0700000 + 42.9700000 96.0800000 + 42.9200000 96.1500000 + 42.9200000 96.1800000 + 42.9300000 96.2700000 + 42.9700000 96.2800000 + 43.0000000 96.2700000 + 43.0200000 96.2200000 + 43.0500000 96.2200000 + 43.0700000 96.1800000 + 43.0800000 96.1700000 + 43.1200000 96.1800000 + 43.1700000 96.1500000 + 43.2200000 96.0700000 +857 857 -1 30 42.82500 96.26583 + 42.9700000 96.0800000 + 42.9500000 96.0800000 + 42.9000000 96.1300000 + 42.8800000 96.1700000 + 42.8700000 96.1800000 + 42.8500000 96.1800000 + 42.8200000 96.2000000 + 42.8000000 96.1700000 + 42.7800000 96.1300000 + 42.7800000 96.1000000 + 42.8000000 96.0800000 + 42.7800000 96.0200000 + 42.7300000 96.0500000 + 42.7300000 96.0800000 + 42.7200000 96.1000000 + 42.6800000 96.1500000 + 42.7200000 96.2300000 + 42.7500000 96.3200000 + 42.7700000 96.3200000 + 42.7800000 96.3300000 + 42.7800000 96.3500000 + 42.8200000 96.3500000 + 42.8300000 96.3200000 + 42.8500000 96.3000000 + 42.8700000 96.3300000 + 42.8800000 96.3300000 + 42.9300000 96.2700000 + 42.9200000 96.1800000 + 42.9200000 96.1500000 + 42.9700000 96.0800000 +858 858 -1 14 42.65000 96.25000 + 42.6800000 96.1500000 + 42.6800000 96.1700000 + 42.6800000 96.1800000 + 42.5700000 96.2500000 + 42.5500000 96.2800000 + 42.5700000 96.3000000 + 42.5700000 96.3200000 + 42.6000000 96.3500000 + 42.6200000 96.3500000 + 42.6300000 96.3300000 + 42.7000000 96.3300000 + 42.7500000 96.3200000 + 42.7200000 96.2300000 + 42.6800000 96.1500000 +865 865 -1 19 42.65500 96.39519 + 42.7500000 96.3200000 + 42.7000000 96.3300000 + 42.6300000 96.3300000 + 42.6200000 96.3500000 + 42.6000000 96.3500000 + 42.5800000 96.3500000 + 42.5300000 96.4000000 + 42.5300000 96.4200000 + 42.5500000 96.4300000 + 42.5500800 96.4703800 + 42.5518600 96.4700000 + 42.5800000 96.4700000 + 42.6200000 96.4300000 + 42.7000000 96.4200000 + 42.7300000 96.3800000 + 42.7800000 96.3500000 + 42.7800000 96.3300000 + 42.7700000 96.3200000 + 42.7500000 96.3200000 +904 904 -1 30 40.79660 94.31000 + 41.0200000 94.2800000 + 41.0232900 94.2712300 + 41.0200000 94.2500000 + 40.9500000 94.2200000 + 40.9200000 94.2200000 + 40.8800000 94.2300000 + 40.8500000 94.1800000 + 40.8200000 94.1800000 + 40.8200000 94.1700000 + 40.7500000 94.1800000 + 40.7300000 94.2000000 + 40.7200000 94.2300000 + 40.6700000 94.2200000 + 40.5800000 94.2700000 + 40.5700000 94.3000000 + 40.6000000 94.4200000 + 40.6200000 94.4500000 + 40.6500000 94.4500000 + 40.6800000 94.4000000 + 40.7300000 94.3800000 + 40.7300000 94.4000000 + 40.8000000 94.3800000 + 40.8300000 94.3700000 + 40.9200000 94.3700000 + 40.9300000 94.3500000 + 40.9200000 94.3300000 + 40.9700000 94.2800000 + 40.9800000 94.2700000 + 41.0000000 94.2700000 + 41.0200000 94.2800000 +905 905 -1 16 40.46000 94.47500 + 40.5700000 94.3000000 + 40.5500000 94.3300000 + 40.4500000 94.3800000 + 40.4200000 94.3800000 + 40.3800000 94.3700000 + 40.3000000 94.3800000 + 40.3200000 94.5300000 + 40.3500000 94.6500000 + 40.4000000 94.6500000 + 40.4000000 94.6300000 + 40.4800000 94.5800000 + 40.5500000 94.5700000 + 40.5500000 94.5300000 + 40.6200000 94.4500000 + 40.6000000 94.4200000 + 40.5700000 94.3000000 +906 906 -1 23 40.21500 94.53500 + 40.3000000 94.3800000 + 40.2500000 94.3800000 + 40.2000000 94.3700000 + 40.1800000 94.3800000 + 40.1800000 94.4000000 + 40.1500000 94.4200000 + 40.1200000 94.4300000 + 40.1000000 94.4700000 + 40.1000000 94.4800000 + 40.0800000 94.5200000 + 40.0800000 94.5500000 + 40.0800000 94.5700000 + 40.1200000 94.5800000 + 40.1200000 94.6200000 + 40.1200000 94.6500000 + 40.1300000 94.6700000 + 40.2000000 94.6800000 + 40.2200000 94.7000000 + 40.2800000 94.6800000 + 40.3000000 94.6700000 + 40.3500000 94.6500000 + 40.3200000 94.5300000 + 40.3000000 94.3800000 +907 907 -1 34 40.73500 94.17500 + 40.9500000 94.2200000 + 40.9500000 94.1800000 + 40.9300000 94.1700000 + 40.9300000 94.1500000 + 40.9000000 94.1200000 + 40.8500000 94.1200000 + 40.8300000 94.1000000 + 40.8300000 94.0800000 + 40.8000000 94.0700000 + 40.7700000 94.0500000 + 40.7500000 94.0700000 + 40.7200000 94.0500000 + 40.7000000 94.0500000 + 40.6800000 94.0800000 + 40.6700000 94.0800000 + 40.6200000 94.1000000 + 40.6000000 94.1300000 + 40.5800000 94.1200000 + 40.5500000 94.1300000 + 40.5300000 94.1200000 + 40.5200000 94.1200000 + 40.5500000 94.2800000 + 40.5700000 94.3000000 + 40.5800000 94.2700000 + 40.6700000 94.2200000 + 40.7200000 94.2300000 + 40.7300000 94.2000000 + 40.7500000 94.1800000 + 40.8200000 94.1700000 + 40.8200000 94.1800000 + 40.8500000 94.1800000 + 40.8800000 94.2300000 + 40.9200000 94.2200000 + 40.9500000 94.2200000 +908 908 -1 21 40.37500 94.25000 + 40.5200000 94.1200000 + 40.5000000 94.1300000 + 40.4700000 94.1200000 + 40.4200000 94.1300000 + 40.3500000 94.1500000 + 40.3200000 94.2200000 + 40.2800000 94.2200000 + 40.2500000 94.2500000 + 40.2000000 94.2700000 + 40.2000000 94.3500000 + 40.1800000 94.3800000 + 40.2000000 94.3700000 + 40.2500000 94.3800000 + 40.3000000 94.3800000 + 40.3800000 94.3700000 + 40.4200000 94.3800000 + 40.4500000 94.3800000 + 40.5500000 94.3300000 + 40.5700000 94.3000000 + 40.5500000 94.2800000 + 40.5200000 94.1200000 +909 909 -1 32 40.18500 94.29500 + 40.3500000 94.1500000 + 40.3500000 94.1300000 + 40.3300000 94.1300000 + 40.3200000 94.1200000 + 40.2700000 94.1200000 + 40.2300000 94.1300000 + 40.2000000 94.1300000 + 40.1800000 94.1200000 + 40.0800000 94.1500000 + 40.0300000 94.1300000 + 40.0200000 94.1300000 + 40.0200000 94.1500000 + 40.0200000 94.1700000 + 40.0200000 94.1800000 + 40.0200000 94.2500000 + 40.0500000 94.3000000 + 40.0500000 94.3300000 + 40.0500000 94.3500000 + 40.0300000 94.3800000 + 40.0300000 94.4200000 + 40.0500000 94.4300000 + 40.1000000 94.4700000 + 40.1200000 94.4300000 + 40.1500000 94.4200000 + 40.1800000 94.4000000 + 40.1800000 94.3800000 + 40.2000000 94.3500000 + 40.2000000 94.2700000 + 40.2500000 94.2500000 + 40.2800000 94.2200000 + 40.3200000 94.2200000 + 40.3500000 94.1500000 +910 910 -1 38 39.90000 94.32500 + 40.1000000 94.4700000 + 40.0500000 94.4300000 + 40.0300000 94.4200000 + 40.0300000 94.3800000 + 40.0500000 94.3500000 + 40.0500000 94.3300000 + 40.0500000 94.3000000 + 40.0200000 94.2500000 + 40.0200000 94.1800000 + 40.0200000 94.1700000 + 40.0200000 94.1500000 + 40.0200000 94.1300000 + 39.9500000 94.1200000 + 39.9200000 94.1300000 + 39.8700000 94.1300000 + 39.8500000 94.1800000 + 39.8300000 94.1800000 + 39.8000000 94.2200000 + 39.7800000 94.2300000 + 39.7500000 94.2300000 + 39.7300000 94.2800000 + 39.7000000 94.3200000 + 39.7200000 94.3700000 + 39.7800000 94.3800000 + 39.7800000 94.4200000 + 39.8300000 94.4200000 + 39.8500000 94.4300000 + 39.9000000 94.4700000 + 39.9200000 94.4500000 + 39.9300000 94.4800000 + 39.9500000 94.4700000 + 40.0000000 94.4700000 + 40.0000000 94.4800000 + 40.0200000 94.5000000 + 40.0700000 94.5300000 + 40.0800000 94.5200000 + 40.1000000 94.4800000 + 40.1000000 94.4700000 +933 933 -1 25 41.19500 94.24500 + 41.3700000 94.4300000 + 41.3700000 94.3700000 + 41.3300000 94.3200000 + 41.3000000 94.3200000 + 41.2500000 94.2500000 + 41.2700000 94.2200000 + 41.2200000 94.2000000 + 41.1800000 94.1700000 + 41.1800000 94.1300000 + 41.1300000 94.0800000 + 41.1300000 94.0300000 + 41.1200000 94.0200000 + 41.0800000 94.1200000 + 41.0232900 94.2712300 + 41.0200000 94.2800000 + 41.0300000 94.3000000 + 41.0800000 94.3200000 + 41.1000000 94.3300000 + 41.1700000 94.3800000 + 41.2000000 94.4000000 + 41.2000000 94.4200000 + 41.2700000 94.4700000 + 41.3000000 94.4700000 + 41.3200000 94.4500000 + 41.3700000 94.4300000 +934 934 -1 26 40.94500 94.03562 + 41.1200000 94.0200000 + 41.1200000 93.9800000 + 41.0800000 93.9800000 + 41.0500000 93.9300000 + 41.0700000 93.9200000 + 41.0500000 93.8800000 + 41.0300000 93.9000000 + 41.0200000 93.8800000 + 40.9800000 93.8800000 + 40.9800000 93.8200000 + 40.9300000 93.8000000 + 40.8300000 93.9300000 + 40.7700000 94.0500000 + 40.8000000 94.0700000 + 40.8300000 94.0800000 + 40.8300000 94.1000000 + 40.8500000 94.1200000 + 40.9000000 94.1200000 + 40.9300000 94.1500000 + 40.9300000 94.1700000 + 40.9500000 94.1800000 + 40.9500000 94.2200000 + 41.0200000 94.2500000 + 41.0232900 94.2712300 + 41.0800000 94.1200000 + 41.1200000 94.0200000 +BAYI4 BAYI4 -1 18 41.99500 94.76000 + 42.2200000 95.0000000 + 42.1800000 94.8900000 + 42.1200000 94.7500000 + 42.0200000 94.6100000 + 41.9900000 94.5300000 + 41.9700000 94.5100000 + 41.8600000 94.5100000 + 41.8400000 94.4900000 + 41.7800000 94.5000000 + 41.7700000 94.5300000 + 41.8300000 94.6700000 + 41.9000000 94.7500000 + 41.9300000 94.8200000 + 42.0500000 94.9500000 + 42.1200000 95.0200000 + 42.1500000 95.0300000 + 42.2000000 95.0200000 + 42.2200000 95.0000000 +EFWI4 EFWI4 -1 43 42.28000 94.74000 + 42.6200000 94.7300000 + 42.6000000 94.6900000 + 42.5900000 94.6600000 + 42.5400000 94.5800000 + 42.5200000 94.4900000 + 42.5100000 94.4500000 + 42.4900000 94.4200000 + 42.4300000 94.3700000 + 42.4200000 94.3600000 + 42.4000000 94.3800000 + 42.2700000 94.4900000 + 42.2200000 94.5100000 + 42.1700000 94.5100000 + 42.1200000 94.4900000 + 42.0700000 94.4400000 + 42.0200000 94.3600000 + 42.0000000 94.3600000 + 41.9900000 94.3800000 + 41.9500000 94.3800000 + 41.9400000 94.4000000 + 41.9800000 94.4700000 + 41.9900000 94.5300000 + 42.0200000 94.6100000 + 42.1200000 94.7500000 + 42.1800000 94.8900000 + 42.2200000 95.0000000 + 42.2300000 95.0300000 + 42.2700000 95.0500000 + 42.3200000 95.0300000 + 42.3200000 95.0700000 + 42.3700000 95.0800000 + 42.4700000 95.1000000 + 42.5000000 95.1200000 + 42.5200000 95.1000000 + 42.5000000 95.0800000 + 42.4500000 95.0500000 + 42.3800000 95.0300000 + 42.3000000 94.9800000 + 42.3700000 94.9400000 + 42.3800000 94.8900000 + 42.4300000 94.8500000 + 42.5300000 94.8000000 + 42.6200000 94.7300000 +FCKN1HW PAPILLION CR. NR FT. CROOK NE -1 369 41.34750 96.14417 + 41.1183130 95.9379170 + 41.1204170 95.9608540 + 41.1183540 95.9629170 + 41.1099790 95.9629170 + 41.1058540 95.9670830 + 41.1016460 95.9670830 + 41.0995830 95.9691460 + 41.0995830 95.9733540 + 41.1162500 95.9899790 + 41.1162500 96.0025210 + 41.1183130 96.0045830 + 41.1225210 96.0045830 + 41.1245830 96.0066460 + 41.1245830 96.0108540 + 41.1224790 96.0129170 + 41.1204170 96.0150210 + 41.1162500 96.0191460 + 41.1162500 96.0275210 + 41.1141460 96.0295830 + 41.1120830 96.0400210 + 41.1141880 96.0420830 + 41.1162500 96.0483540 + 41.1183540 96.0504170 + 41.1204170 96.0525210 + 41.1225210 96.0545830 + 41.1245830 96.0608540 + 41.1224790 96.0629170 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1225210 96.1004170 + 41.1245830 96.1025210 + 41.1266880 96.1045830 + 41.1287500 96.1066880 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1649790 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1183130 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2066460 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3058540 96.2587500 + 41.3079170 96.2608130 + 41.3099790 96.2629170 + 41.3120830 96.2608540 + 41.3141460 96.2587500 + 41.3162500 96.2566880 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3245830 96.2483130 + 41.3266460 96.2462500 + 41.3287500 96.2483130 + 41.3308130 96.2504170 + 41.3329170 96.2524790 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566460 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4412500 96.2983130 + 41.4412500 96.3025210 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5329170 96.2858130 + 41.5349790 96.2837500 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5558540 96.2712500 + 41.5579170 96.2691880 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5558540 96.2045830 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4224790 96.1212500 + 41.4204170 96.1191880 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4287500 96.0733540 + 41.4308130 96.0712500 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3600210 96.0254170 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3245830 96.0191880 + 41.3245830 96.0024790 + 41.3225210 96.0004170 + 41.3141460 96.0004170 + 41.3120830 95.9983540 + 41.3100210 95.9962500 + 41.2933130 95.9962500 + 41.2912500 95.9983130 + 41.2891880 96.0004170 + 41.2870830 96.0024790 + 41.2850210 96.0045830 + 41.2829170 96.0025210 + 41.2829170 95.9858130 + 41.2725210 95.9754170 + 41.2704170 95.9733540 + 41.2683540 95.9712500 + 41.2599790 95.9712500 + 41.2474790 95.9670830 + 41.2454170 95.9670830 + 41.2454170 95.9691880 + 41.2433540 95.9712500 + 41.2391460 95.9712500 + 41.2370830 95.9733130 + 41.2350210 95.9754170 + 41.2099790 95.9754170 + 41.2079170 95.9733540 + 41.2058540 95.9712500 + 41.1974790 95.9712500 + 41.1954170 95.9691880 + 41.1933540 95.9670830 + 41.1912500 95.9650210 + 41.1912500 95.9608130 + 41.1891880 95.9587500 + 41.1849790 95.9587500 + 41.1829170 95.9566880 + 41.1829170 95.9524790 + 41.1808540 95.9504170 + 41.1787500 95.9483540 + 41.1808130 95.9462500 + 41.1891880 95.9462500 + 41.1912500 95.9441880 + 41.1912500 95.9399790 + 41.1787500 95.9233130 + 41.1766880 95.9212500 + 41.1724790 95.9212500 + 41.1704170 95.9191880 + 41.1683540 95.9170830 + 41.1641460 95.9170830 + 41.1620830 95.9150210 + 41.1620830 95.9108130 + 41.1600210 95.9087500 + 41.1579170 95.9066880 + 41.1558540 95.9045830 + 41.1474790 95.9045830 + 41.1454170 95.9066460 + 41.1433540 95.9087500 + 41.1391460 95.9087500 + 41.1370830 95.9108130 + 41.1350210 95.9129170 + 41.1329170 95.9149790 + 41.1308540 95.9170830 + 41.1266460 95.9170830 + 41.1245830 95.9191460 + 41.1225210 95.9212500 + 41.1204170 95.9233130 + 41.1204170 95.9316880 + 41.1183130 95.9379170 +HBLN1HW N.F. BIG NEMAHA RIVER AT HUMBOLT NE -1 528 40.34333 96.27750 + 40.1537500 95.9420830 + 40.1287500 95.9691880 + 40.1245830 95.9733130 + 40.1245830 95.9775210 + 40.1225210 95.9795830 + 40.1141460 95.9795830 + 40.1120830 95.9816460 + 40.1120830 95.9858540 + 40.1099790 95.9879170 + 40.1058540 95.9920830 + 40.1016460 95.9920830 + 40.0995830 95.9941880 + 40.0954170 95.9983130 + 40.0954170 96.0108540 + 40.0975210 96.0129170 + 40.0995830 96.0149790 + 40.0995830 96.0233540 + 40.0974790 96.0254170 + 40.0954170 96.0274790 + 40.0954170 96.0358540 + 40.0933540 96.0379170 + 40.0891460 96.0379170 + 40.0870830 96.0399790 + 40.0870830 96.0650210 + 40.0850210 96.0670830 + 40.0808130 96.0670830 + 40.0787500 96.0691880 + 40.0766460 96.0712500 + 40.0745830 96.0733130 + 40.0745830 96.0858540 + 40.0766460 96.0879170 + 40.0808540 96.0879170 + 40.0829170 96.0900210 + 40.0850210 96.0920830 + 40.0891460 96.0962500 + 40.0933540 96.0962500 + 40.0954170 96.0983540 + 40.0974790 96.1004170 + 40.1016880 96.1004170 + 40.1037500 96.1025210 + 40.1058540 96.1045830 + 40.1079170 96.1066880 + 40.1120830 96.1108540 + 40.1099790 96.1129170 + 40.1079170 96.1149790 + 40.1079170 96.1295830 + 40.1141460 96.1337500 + 40.1183540 96.1337500 + 40.1204170 96.1358130 + 40.1245830 96.1441460 + 40.1245830 96.1525210 + 40.1266460 96.1545830 + 40.1308540 96.1545830 + 40.1329170 96.1566460 + 40.1329170 96.1608540 + 40.1350210 96.1629170 + 40.1391460 96.1670830 + 40.1433540 96.1670830 + 40.1495830 96.1733130 + 40.1495830 96.1775210 + 40.1516460 96.1795830 + 40.1558540 96.1795830 + 40.1579170 96.1774790 + 40.1600210 96.1754170 + 40.1620830 96.1775210 + 40.1641460 96.1795830 + 40.1683540 96.1795830 + 40.1704170 96.1816460 + 40.1704170 96.1858540 + 40.1766460 96.1920830 + 40.1808540 96.1920830 + 40.1829170 96.1941460 + 40.1829170 96.1983540 + 40.1849790 96.2004170 + 40.1933540 96.2004170 + 40.1954170 96.2024790 + 40.1974790 96.2129170 + 40.2100210 96.2129170 + 40.2120830 96.2150210 + 40.2141880 96.2170830 + 40.2162500 96.2191880 + 40.2183540 96.2212500 + 40.2204170 96.2233540 + 40.2224790 96.2254170 + 40.2266880 96.2254170 + 40.2287500 96.2275210 + 40.2308540 96.2295830 + 40.2329170 96.2316880 + 40.2350210 96.2337500 + 40.2370830 96.2358130 + 40.2433130 96.2462500 + 40.2475210 96.2462500 + 40.2599790 96.2587500 + 40.2683540 96.2587500 + 40.2704170 96.2608130 + 40.3037500 96.3024790 + 40.3037500 96.3150210 + 40.3058130 96.3170830 + 40.3204170 96.3233130 + 40.3204170 96.3316880 + 40.3225210 96.3337500 + 40.3245830 96.3358130 + 40.3245830 96.3483540 + 40.3225210 96.3504170 + 40.2891460 96.3504170 + 40.2870830 96.3524790 + 40.2870830 96.3566880 + 40.2891880 96.3587500 + 40.2912500 96.3608130 + 40.2912500 96.3650210 + 40.2891880 96.3670830 + 40.2849790 96.3670830 + 40.2829170 96.3691460 + 40.2829170 96.3733540 + 40.2808130 96.3754170 + 40.2787500 96.3775210 + 40.2766460 96.3795830 + 40.2745830 96.3816460 + 40.2745830 96.3941880 + 40.2766880 96.3962500 + 40.2787500 96.3983130 + 40.2787500 96.4150210 + 40.2766460 96.4170830 + 40.2745830 96.4191460 + 40.2745830 96.4233540 + 40.2724790 96.4254170 + 40.2704170 96.4274790 + 40.2704170 96.4400210 + 40.2683130 96.4420830 + 40.2662500 96.4441460 + 40.2662500 96.4525210 + 40.2641880 96.4545830 + 40.2599790 96.4545830 + 40.2579170 96.4566880 + 40.2558130 96.4587500 + 40.2537500 96.4608130 + 40.2537500 96.4650210 + 40.2516460 96.4670830 + 40.2495830 96.4670830 + 40.2454170 96.4733130 + 40.2454170 96.4941880 + 40.2454170 96.4962500 + 40.2599790 96.5004170 + 40.2641880 96.5004170 + 40.2662500 96.4983130 + 40.2683130 96.4962500 + 40.2725210 96.4962500 + 40.2745830 96.4941460 + 40.2766880 96.4920830 + 40.2787500 96.4900210 + 40.2787500 96.4733130 + 40.2808540 96.4712500 + 40.2829170 96.4691460 + 40.2850210 96.4670830 + 40.2870830 96.4691880 + 40.2891460 96.4712500 + 40.2933540 96.4712500 + 40.2954170 96.4733540 + 40.2975210 96.4754170 + 40.2995830 96.4775210 + 40.3016460 96.4795830 + 40.3058540 96.4795830 + 40.3079170 96.4816460 + 40.3079170 96.4858540 + 40.3100210 96.4879170 + 40.3120830 96.4900210 + 40.3141460 96.4920830 + 40.3266880 96.4920830 + 40.3287500 96.4899790 + 40.3308130 96.4879170 + 40.3391880 96.4879170 + 40.3412500 96.4900210 + 40.3433540 96.4920830 + 40.3454170 96.4941880 + 40.3474790 96.4962500 + 40.3516880 96.4962500 + 40.3537500 96.4983540 + 40.3558540 96.5004170 + 40.3579170 96.5024790 + 40.3579170 96.5066880 + 40.3600210 96.5087500 + 40.3620830 96.5108130 + 40.3620830 96.5191880 + 40.3641460 96.5212500 + 40.3725210 96.5212500 + 40.3745830 96.5233540 + 40.3766460 96.5254170 + 40.3891880 96.5254170 + 40.3912500 96.5275210 + 40.3933540 96.5295830 + 40.3954170 96.5316460 + 40.3954170 96.5358540 + 40.3975210 96.5379170 + 40.3995830 96.5358130 + 40.4016460 96.5337500 + 40.4058540 96.5337500 + 40.4079170 96.5358130 + 40.4079170 96.5400210 + 40.4100210 96.5420830 + 40.4120830 96.5441460 + 40.4120830 96.5775210 + 40.4141880 96.5795830 + 40.4162500 96.5816460 + 40.4162500 96.5900210 + 40.4183130 96.5920830 + 40.4266880 96.5920830 + 40.4287500 96.5941880 + 40.4308540 96.5962500 + 40.4329170 96.5983130 + 40.4329170 96.6150210 + 40.4350210 96.6170830 + 40.4370830 96.6191880 + 40.4391880 96.6212500 + 40.4412500 96.6233130 + 40.4412500 96.6316880 + 40.4433540 96.6337500 + 40.4454170 96.6358540 + 40.4475210 96.6379170 + 40.4495830 96.6400210 + 40.4516880 96.6420830 + 40.4537500 96.6441880 + 40.4558130 96.6462500 + 40.4600210 96.6462500 + 40.4620830 96.6483540 + 40.4641880 96.6504170 + 40.4662500 96.6525210 + 40.4683540 96.6545830 + 40.4704170 96.6566880 + 40.4724790 96.6587500 + 40.4766880 96.6587500 + 40.4787500 96.6566460 + 40.4808540 96.6545830 + 40.4829170 96.6524790 + 40.4849790 96.6504170 + 40.4933130 96.6545830 + 40.4975210 96.6545830 + 40.4995830 96.6566460 + 40.5120830 96.6774790 + 40.5120830 96.6858540 + 40.5141880 96.6879170 + 40.5162500 96.6900210 + 40.5183540 96.6920830 + 40.5204170 96.6941460 + 40.5224790 96.7004170 + 40.5266880 96.7004170 + 40.5287500 96.7024790 + 40.5329170 96.7108540 + 40.5308130 96.7129170 + 40.5287500 96.7150210 + 40.5266460 96.7170830 + 40.5245830 96.7191460 + 40.5245830 96.7233540 + 40.5266880 96.7254170 + 40.5287500 96.7274790 + 40.5287500 96.7358540 + 40.5308540 96.7379170 + 40.5329170 96.7399790 + 40.5329170 96.7483540 + 40.5329170 96.7504170 + 40.5350210 96.7504170 + 40.5370830 96.7524790 + 40.5391460 96.7545830 + 40.5516880 96.7545830 + 40.5537500 96.7525210 + 40.5558130 96.7504170 + 40.5579170 96.7483540 + 40.5599790 96.7462500 + 40.5620830 96.7441880 + 40.5620830 96.7191460 + 40.5641460 96.7170830 + 40.5662500 96.7150210 + 40.5683130 96.7129170 + 40.5704170 96.7108540 + 40.5704170 96.7066460 + 40.5724790 96.7045830 + 40.5745830 96.7025210 + 40.5745830 96.6941460 + 40.5725210 96.6920830 + 40.5704170 96.6900210 + 40.5704170 96.6816460 + 40.5683540 96.6795830 + 40.5662500 96.6775210 + 40.5662500 96.6608130 + 40.5641880 96.6587500 + 40.5620830 96.6566880 + 40.5620830 96.6524790 + 40.5600210 96.6504170 + 40.5558130 96.6504170 + 40.5537500 96.6483540 + 40.5537500 96.6399790 + 40.5558130 96.6379170 + 40.5579170 96.6358540 + 40.5599790 96.6337500 + 40.5620830 96.6316880 + 40.5600210 96.6295830 + 40.5579170 96.6275210 + 40.5579170 96.6191460 + 40.5558540 96.6170830 + 40.5537500 96.6150210 + 40.5537500 96.5941460 + 40.5558130 96.5920830 + 40.5579170 96.5900210 + 40.5599790 96.5879170 + 40.5620830 96.5858540 + 40.5641460 96.5837500 + 40.5662500 96.5816880 + 40.5641880 96.5795830 + 40.5620830 96.5775210 + 40.5641460 96.5754170 + 40.5662500 96.5733540 + 40.5662500 96.5691460 + 40.5683130 96.5670830 + 40.5704170 96.5650210 + 40.5704170 96.5608130 + 40.5724790 96.5587500 + 40.5745830 96.5566880 + 40.5745830 96.5524790 + 40.5766460 96.5504170 + 40.5787500 96.5483540 + 40.5808130 96.5462500 + 40.5829170 96.5441880 + 40.5829170 96.5316460 + 40.5849790 96.5295830 + 40.5891880 96.5295830 + 40.5912500 96.5275210 + 40.5933130 96.5254170 + 40.5975210 96.5254170 + 40.6100210 96.5129170 + 40.6120830 96.5129170 + 40.6120830 96.5108130 + 40.6100210 96.5087500 + 40.6058130 96.5087500 + 40.6037500 96.5066880 + 40.6016880 96.5045830 + 40.5933130 96.5045830 + 40.5912500 96.5025210 + 40.5891880 96.5004170 + 40.5870830 96.4983540 + 40.5850210 96.4962500 + 40.5829170 96.4941880 + 40.5808540 96.4920830 + 40.5787500 96.4900210 + 40.5787500 96.4774790 + 40.5766880 96.4754170 + 40.5745830 96.4733540 + 40.5725210 96.4712500 + 40.5704170 96.4691880 + 40.5683540 96.4670830 + 40.5662500 96.4650210 + 40.5662500 96.4608130 + 40.5641880 96.4587500 + 40.5620830 96.4566880 + 40.5620830 96.4524790 + 40.5600210 96.4504170 + 40.5579170 96.4483540 + 40.5579170 96.4441460 + 40.5558540 96.4420830 + 40.5516460 96.4420830 + 40.5495830 96.4400210 + 40.5475210 96.4379170 + 40.5454170 96.4358540 + 40.5433540 96.4337500 + 40.5391460 96.4337500 + 40.5350210 96.4295830 + 40.5329170 96.4275210 + 40.5329170 96.4191460 + 40.5308540 96.4170830 + 40.5287500 96.4150210 + 40.5266880 96.4129170 + 40.5245830 96.4108540 + 40.5245830 96.3983130 + 40.5225210 96.3962500 + 40.5204170 96.3941880 + 40.5204170 96.3774790 + 40.5183540 96.3754170 + 40.5162500 96.3733540 + 40.5141880 96.3712500 + 40.5058130 96.3712500 + 40.5037500 96.3691880 + 40.5016880 96.3670830 + 40.4974790 96.3670830 + 40.4954170 96.3650210 + 40.4933540 96.3629170 + 40.4766460 96.3629170 + 40.4745830 96.3608540 + 40.4745830 96.3566460 + 40.4725210 96.3545830 + 40.4704170 96.3525210 + 40.4704170 96.3441460 + 40.4683540 96.3420830 + 40.4662500 96.3400210 + 40.4683130 96.3379170 + 40.4704170 96.3358540 + 40.4704170 96.3274790 + 40.4683540 96.3254170 + 40.4620830 96.3233540 + 40.4600210 96.3129170 + 40.4558540 96.3087500 + 40.4537500 96.3066880 + 40.4537500 96.2899790 + 40.4516880 96.2879170 + 40.4495830 96.2858540 + 40.4495830 96.2816460 + 40.4475210 96.2795830 + 40.4454170 96.2775210 + 40.4433540 96.2754170 + 40.4391460 96.2754170 + 40.4370830 96.2733540 + 40.4350210 96.2712500 + 40.4329170 96.2691880 + 40.4308540 96.2670830 + 40.4287500 96.2650210 + 40.4308130 96.2629170 + 40.4329170 96.2608540 + 40.4329170 96.2566460 + 40.4308540 96.2545830 + 40.4287500 96.2525210 + 40.4287500 96.2441460 + 40.4308130 96.2420830 + 40.4350210 96.2420830 + 40.4370830 96.2400210 + 40.4370830 96.2358130 + 40.4350210 96.2337500 + 40.4329170 96.2316880 + 40.4329170 96.2274790 + 40.4308540 96.2254170 + 40.4287500 96.2233540 + 40.4266880 96.2212500 + 40.4224790 96.2212500 + 40.4204170 96.2191880 + 40.4204170 96.1941460 + 40.4183540 96.1920830 + 40.4141460 96.1920830 + 40.4037500 96.1733130 + 40.4016880 96.1712500 + 40.3995830 96.1691880 + 40.3975210 96.1670830 + 40.3891460 96.1670830 + 40.3870830 96.1650210 + 40.3850210 96.1629170 + 40.3808130 96.1629170 + 40.3787500 96.1608540 + 40.3787500 96.1399790 + 40.3766880 96.1379170 + 40.3641460 96.1379170 + 40.3620830 96.1358540 + 40.3600210 96.1337500 + 40.3558130 96.1337500 + 40.3537500 96.1316880 + 40.3537500 96.1274790 + 40.3516880 96.1254170 + 40.3474790 96.1254170 + 40.3454170 96.1233540 + 40.3474790 96.1212500 + 40.3495830 96.1191880 + 40.3495830 96.1066460 + 40.3516460 96.1045830 + 40.3558540 96.1045830 + 40.3579170 96.1025210 + 40.3579170 96.0899790 + 40.3558540 96.0879170 + 40.3537500 96.0858540 + 40.3537500 96.0774790 + 40.3579170 96.0691460 + 40.3579170 96.0670830 + 40.3558130 96.0670830 + 40.3537500 96.0650210 + 40.3516880 96.0629170 + 40.3495830 96.0608540 + 40.3475210 96.0587500 + 40.3433130 96.0587500 + 40.3412500 96.0566880 + 40.3391880 96.0545830 + 40.3370830 96.0525210 + 40.3350210 96.0504170 + 40.3329170 96.0483540 + 40.3329170 96.0399790 + 40.3308540 96.0379170 + 40.3287500 96.0358540 + 40.3287500 96.0274790 + 40.3266880 96.0254170 + 40.3224790 96.0254170 + 40.3204170 96.0233540 + 40.3183540 96.0212500 + 40.3141460 96.0212500 + 40.3120830 96.0191880 + 40.3100210 96.0170830 + 40.3079170 96.0150210 + 40.3058540 96.0129170 + 40.2954170 96.0025210 + 40.2954170 95.9899790 + 40.2933540 95.9879170 + 40.2912500 95.9858540 + 40.2912500 95.9774790 + 40.2891880 95.9754170 + 40.2849790 95.9754170 + 40.2829170 95.9733540 + 40.2808540 95.9712500 + 40.2724790 95.9712500 + 40.2704170 95.9691880 + 40.2683540 95.9670830 + 40.2662500 95.9650210 + 40.2641880 95.9629170 + 40.2558540 95.9587500 + 40.2516460 95.9587500 + 40.2495830 95.9566880 + 40.2475210 95.9545830 + 40.2391460 95.9545830 + 40.2370830 95.9525210 + 40.2350210 95.9504170 + 40.2329170 95.9483540 + 40.2225210 95.9337500 + 40.2141460 95.9337500 + 40.2058130 95.9254170 + 40.2037500 95.9254170 + 40.2016880 95.9295830 + 40.1974790 95.9295830 + 40.1933540 95.9337500 + 40.1891460 95.9337500 + 40.1870830 95.9358540 + 40.1849790 95.9379170 + 40.1829170 95.9399790 + 40.1829170 95.9441880 + 40.1808540 95.9462500 + 40.1641460 95.9462500 + 40.1620830 95.9441460 + 40.1600210 95.9420830 + 40.1537500 95.9420830 +IDNI4 IDNI4 -1 48 41.37000 93.66875 + 41.6200000 94.6500000 + 41.6000000 94.6300000 + 41.5700000 94.5500000 + 41.5300000 94.5100000 + 41.5100000 94.4700000 + 41.4800000 94.4500000 + 41.4200000 94.3900000 + 41.3900000 94.3400000 + 41.3300000 94.2400000 + 41.3100000 94.1600000 + 41.3100000 94.0800000 + 41.3200000 93.9900000 + 41.3400000 93.9100000 + 41.3800000 93.7200000 + 41.4000000 93.6700000 + 41.4300000 93.6500000 + 41.4300000 93.5700000 + 41.3800000 93.5600000 + 41.3500000 93.5900000 + 41.2900000 93.7600000 + 41.2500000 93.8000000 + 41.2200000 93.8300000 + 41.1700000 93.8600000 + 41.1400000 93.9100000 + 41.1300000 93.9900000 + 41.1200000 94.0200000 + 41.1300000 94.0300000 + 41.1300000 94.0800000 + 41.1800000 94.1300000 + 41.1800000 94.1700000 + 41.2200000 94.2000000 + 41.2700000 94.2200000 + 41.2500000 94.2500000 + 41.3000000 94.3200000 + 41.3300000 94.3200000 + 41.3700000 94.3700000 + 41.3700000 94.4300000 + 41.3700000 94.4700000 + 41.3700000 94.4800000 + 41.4700000 94.5700000 + 41.4500000 94.5700000 + 41.4700000 94.6200000 + 41.4800000 94.6300000 + 41.5300000 94.6700000 + 41.5700000 94.6700000 + 41.5800000 94.7000000 + 41.6000000 94.7000000 + 41.6200000 94.6500000 +IRVN1HW LTL PAPILLION CRK AT IRVINGTON, NE -1 76 41.36833 96.06917 + 41.3079170 96.0504170 + 41.3120830 96.0775210 + 41.3141460 96.0795830 + 41.3225210 96.0795830 + 41.3433130 96.1004170 + 41.3475210 96.1004170 + 41.3495830 96.1025210 + 41.3516880 96.1045830 + 41.3558130 96.1087500 + 41.3641880 96.1087500 + 41.3662500 96.1108540 + 41.3683130 96.1129170 + 41.3725210 96.1129170 + 41.3745830 96.1150210 + 41.3766460 96.1170830 + 41.3808540 96.1170830 + 41.3829170 96.1191880 + 41.3850210 96.1212500 + 41.3870830 96.1233540 + 41.3891460 96.1254170 + 41.3975210 96.1254170 + 41.3995830 96.1275210 + 41.4016460 96.1295830 + 41.4100210 96.1295830 + 41.4120830 96.1274790 + 41.4141880 96.1254170 + 41.4162500 96.1233130 + 41.4183540 96.1212500 + 41.4204170 96.1212500 + 41.4204170 96.1191460 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3183130 96.0212500 + 41.3162500 96.0233130 + 41.3141880 96.0254170 + 41.3120830 96.0274790 + 41.3120830 96.0316880 + 41.3079170 96.0358130 + 41.3058540 96.0379170 + 41.3037500 96.0399790 + 41.3079170 96.0504170 +LCNN1HW SALT CR. AT LINCOLN NE -1 485 40.87250 96.86500 + 40.8454170 96.6795830 + 40.8224790 96.6670830 + 40.8141880 96.6587500 + 40.8058130 96.6587500 + 40.8037500 96.6566880 + 40.8016880 96.6545830 + 40.7995830 96.6525210 + 40.7995830 96.6483130 + 40.7975210 96.6462500 + 40.7954170 96.6441880 + 40.7954170 96.6274790 + 40.7933540 96.6254170 + 40.7912500 96.6233540 + 40.7891880 96.6212500 + 40.7870830 96.6191880 + 40.7870830 96.6108130 + 40.7850210 96.6087500 + 40.7724790 96.6087500 + 40.7704170 96.6066880 + 40.7683540 96.6045830 + 40.7662500 96.6025210 + 40.7600210 96.5962500 + 40.7558130 96.5962500 + 40.7537500 96.5941880 + 40.7516880 96.5920830 + 40.7308130 96.5920830 + 40.7287500 96.5941460 + 40.7266880 96.5962500 + 40.7245830 96.5941880 + 40.7225210 96.5920830 + 40.7183130 96.5920830 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6399790 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5245830 96.7608540 + 40.5266880 96.7629170 + 40.5287500 96.7650210 + 40.5308540 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5350210 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391880 96.7920830 + 40.5412500 96.7941880 + 40.5391460 96.7962500 + 40.5370830 96.7983540 + 40.5391880 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391460 96.8129170 + 40.5370830 96.8150210 + 40.5349790 96.8170830 + 40.5329170 96.8191880 + 40.5308130 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8587500 + 40.5245830 96.8608540 + 40.5224790 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8775210 + 40.5308540 96.8795830 + 40.5329170 96.8816880 + 40.5350210 96.8837500 + 40.5370830 96.8858540 + 40.5391880 96.8879170 + 40.5412500 96.8900210 + 40.5433540 96.8920830 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983540 + 40.5600210 96.9004170 + 40.5620830 96.9025210 + 40.5641880 96.9045830 + 40.5662500 96.9066880 + 40.5683540 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808540 96.9212500 + 40.5829170 96.9191460 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191880 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233540 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308540 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6350210 96.9004170 + 40.6370830 96.8983540 + 40.6370830 96.8941460 + 40.6391880 96.8920830 + 40.6412500 96.8899790 + 40.6433540 96.8879170 + 40.6454170 96.8900210 + 40.6475210 96.8920830 + 40.6495830 96.8941460 + 40.6495830 96.9025210 + 40.6516460 96.9045830 + 40.6725210 96.9045830 + 40.6745830 96.9066460 + 40.6745830 96.9150210 + 40.6724790 96.9170830 + 40.6704170 96.9191460 + 40.6704170 96.9233540 + 40.6725210 96.9254170 + 40.6745830 96.9275210 + 40.6870830 96.9399790 + 40.6870830 96.9525210 + 40.6891880 96.9545830 + 40.6912500 96.9566880 + 40.6933130 96.9587500 + 40.7016880 96.9587500 + 40.7037500 96.9608540 + 40.7058130 96.9629170 + 40.7391880 96.9629170 + 40.7412500 96.9649790 + 40.7412500 96.9691880 + 40.7433540 96.9712500 + 40.7454170 96.9733130 + 40.7454170 96.9775210 + 40.7475210 96.9795830 + 40.7495830 96.9816880 + 40.7516880 96.9837500 + 40.7537500 96.9858540 + 40.7558540 96.9879170 + 40.7579170 96.9899790 + 40.7579170 96.9941880 + 40.7599790 96.9962500 + 40.7683540 96.9962500 + 40.7704170 96.9983540 + 40.7725210 97.0004170 + 40.7766880 97.0045830 + 40.7787500 97.0024790 + 40.7808130 97.0004170 + 40.7850210 97.0004170 + 40.7870830 96.9983130 + 40.7891460 96.9962500 + 40.7933540 96.9962500 + 40.7954170 96.9983540 + 40.7974790 97.0004170 + 40.8225210 97.0004170 + 40.8245830 97.0025210 + 40.8266880 97.0045830 + 40.8287500 97.0066880 + 40.8308130 97.0087500 + 40.8516880 97.0087500 + 40.8537500 97.0108540 + 40.8558130 97.0129170 + 40.8641880 97.0129170 + 40.8662500 97.0108130 + 40.8683130 97.0087500 + 40.8933540 97.0087500 + 40.8954170 97.0108540 + 40.8975210 97.0129170 + 40.8995830 97.0150210 + 40.9016880 97.0170830 + 40.9037500 97.0149790 + 40.9058130 97.0129170 + 40.9100210 97.0129170 + 40.9120830 97.0108130 + 40.9183540 97.0087500 + 40.9204170 97.0108540 + 40.9224790 97.0129170 + 40.9266880 97.0129170 + 40.9287500 97.0108130 + 40.9308540 97.0087500 + 40.9329170 97.0066460 + 40.9350210 97.0045830 + 40.9370830 97.0025210 + 40.9370830 96.9941460 + 40.9391880 96.9920830 + 40.9412500 96.9899790 + 40.9433130 96.9879170 + 40.9475210 96.9879170 + 40.9495830 96.9858130 + 40.9516460 96.9837500 + 40.9558540 96.9837500 + 40.9579170 96.9858540 + 40.9600210 96.9879170 + 40.9620830 96.9899790 + 40.9620830 97.0025210 + 40.9641460 97.0045830 + 40.9683540 97.0045830 + 40.9704170 97.0066880 + 40.9725210 97.0087500 + 40.9745830 97.0108130 + 40.9745830 97.0233540 + 40.9766460 97.0254170 + 40.9975210 97.0254170 + 40.9995830 97.0275210 + 41.0016460 97.0295830 + 41.0058540 97.0295830 + 41.0079170 97.0316460 + 41.0141460 97.0420830 + 41.0225210 97.0420830 + 41.0245830 97.0441880 + 41.0266880 97.0462500 + 41.0287500 97.0441460 + 41.0308130 97.0420830 + 41.0350210 97.0420830 + 41.0370830 97.0399790 + 41.0391880 97.0379170 + 41.0412500 97.0358130 + 41.0433130 97.0337500 + 41.0475210 97.0337500 + 41.0495830 97.0316460 + 41.0516880 97.0295830 + 41.0537500 97.0275210 + 41.0537500 97.0233130 + 41.0558540 97.0212500 + 41.0579170 97.0191460 + 41.0599790 97.0170830 + 41.0766880 97.0170830 + 41.0787500 97.0191880 + 41.0808540 97.0212500 + 41.0829170 97.0233540 + 41.0849790 97.0254170 + 41.0975210 97.0254170 + 41.0995830 97.0233130 + 41.1016880 97.0212500 + 41.1037500 97.0191460 + 41.1058540 97.0170830 + 41.1079170 97.0150210 + 41.1079170 97.0108130 + 41.1141880 97.0087500 + 41.1162500 97.0066460 + 41.1183540 97.0045830 + 41.1204170 97.0024790 + 41.1225210 97.0004170 + 41.1245830 96.9983130 + 41.1266460 96.9962500 + 41.1391880 96.9962500 + 41.1412500 96.9941460 + 41.1433540 96.9920830 + 41.1454170 96.9941460 + 41.1454170 96.9983540 + 41.1474790 97.0004170 + 41.1766880 97.0004170 + 41.1787500 97.0025210 + 41.1808540 97.0045830 + 41.1829170 97.0066880 + 41.1891880 97.0087500 + 41.1912500 97.0066460 + 41.1933130 97.0045830 + 41.2016880 97.0045830 + 41.2037500 97.0066880 + 41.2100210 97.0087500 + 41.2120830 97.0108540 + 41.2183540 97.0129170 + 41.2204170 97.0129170 + 41.2204170 97.0024790 + 41.2224790 97.0004170 + 41.2245830 96.9983540 + 41.2245830 96.9899790 + 41.2225210 96.9879170 + 41.2204170 96.9858540 + 41.2183540 96.9837500 + 41.2162500 96.9816880 + 41.2162500 96.9774790 + 41.2183130 96.9754170 + 41.2204170 96.9733540 + 41.2183540 96.9712500 + 41.2141460 96.9712500 + 41.2120830 96.9691880 + 41.2120830 96.9649790 + 41.2100210 96.9629170 + 41.2079170 96.9608540 + 41.2079170 96.9274790 + 41.2058540 96.9254170 + 41.2037500 96.9233540 + 41.2037500 96.9149790 + 41.2058130 96.9129170 + 41.2079170 96.9108540 + 41.2058540 96.9087500 + 41.2037500 96.9066880 + 41.2120830 96.8941460 + 41.2120830 96.8920830 + 41.2099790 96.8920830 + 41.2079170 96.8900210 + 41.2079170 96.8858130 + 41.2058540 96.8837500 + 41.2016460 96.8837500 + 41.1995830 96.8816880 + 41.1975210 96.8795830 + 41.1954170 96.8775210 + 41.1933540 96.8754170 + 41.1891460 96.8754170 + 41.1870830 96.8733540 + 41.1850210 96.8712500 + 41.1829170 96.8691880 + 41.1808540 96.8670830 + 41.1787500 96.8650210 + 41.1766880 96.8629170 + 41.1745830 96.8608540 + 41.1745830 96.8524790 + 41.1725210 96.8504170 + 41.1683130 96.8504170 + 41.1600210 96.8420830 + 41.1391460 96.8420830 + 41.1370830 96.8400210 + 41.1370830 96.8358130 + 41.1329170 96.8316460 + 41.1329170 96.8295830 + 41.1266460 96.8295830 + 41.1245830 96.8275210 + 41.1245830 96.8149790 + 41.1183540 96.8087500 + 41.1141460 96.8087500 + 41.1120830 96.8066880 + 41.1100210 96.8004170 + 41.1016460 96.8004170 + 41.0995830 96.7983540 + 41.0975210 96.7962500 + 41.0808130 96.7962500 + 41.0787500 96.7983130 + 41.0766880 96.8004170 + 41.0745830 96.7983540 + 41.0725210 96.7962500 + 41.0704170 96.7941880 + 41.0683540 96.7920830 + 41.0662500 96.7900210 + 41.0641880 96.7879170 + 41.0391460 96.7879170 + 41.0370830 96.7858540 + 41.0350210 96.7837500 + 41.0183130 96.7837500 + 41.0162500 96.7858130 + 41.0141880 96.7879170 + 41.0120830 96.7858540 + 41.0100210 96.7837500 + 41.0016460 96.7837500 + 40.9995830 96.7816880 + 40.9975210 96.7795830 + 40.9933130 96.7795830 + 40.9912500 96.7775210 + 40.9891880 96.7754170 + 40.9766460 96.7754170 + 40.9745830 96.7733540 + 40.9725210 96.7712500 + 40.9704170 96.7691880 + 40.9683540 96.7670830 + 40.9641460 96.7670830 + 40.9620830 96.7650210 + 40.9600210 96.7629170 + 40.9558130 96.7629170 + 40.9537500 96.7608540 + 40.9516880 96.7587500 + 40.9495830 96.7566880 + 40.9475210 96.7545830 + 40.9454170 96.7525210 + 40.9433540 96.7504170 + 40.9412500 96.7483540 + 40.9391880 96.7462500 + 40.9349790 96.7462500 + 40.9329170 96.7441880 + 40.9308540 96.7420830 + 40.9058130 96.7420830 + 40.9037500 96.7400210 + 40.9016880 96.7379170 + 40.8891460 96.7379170 + 40.8787500 96.7233130 + 40.8766880 96.7212500 + 40.8745830 96.7191880 + 40.8725210 96.7170830 + 40.8704170 96.7150210 + 40.8683540 96.7129170 + 40.8641460 96.7129170 + 40.8620830 96.7108540 + 40.8600210 96.7087500 + 40.8579170 96.7066880 + 40.8579170 96.6899790 + 40.8454170 96.6795830 +NEWI4 NEWI4 -1 24 42.78500 95.09000 + 42.9300000 94.9500000 + 42.8700000 94.9200000 + 42.8000000 94.9100000 + 42.7700000 94.9200000 + 42.6800000 94.9700000 + 42.6300000 95.0200000 + 42.6200000 95.0200000 + 42.6000000 95.0800000 + 42.6500000 95.1500000 + 42.6800000 95.2200000 + 42.7800000 95.2700000 + 42.8200000 95.2700000 + 42.8200000 95.2300000 + 42.8800000 95.2200000 + 42.8800000 95.2000000 + 42.8700000 95.1700000 + 42.8700000 95.1500000 + 42.8700000 95.1300000 + 42.8800000 95.1000000 + 42.9000000 95.0700000 + 42.9200000 95.0700000 + 42.9200000 95.0200000 + 42.9700000 94.9800000 + 42.9300000 94.9500000 +NRWI4 NRWI4 -1 28 41.42000 94.08000 + 41.5300000 94.5100000 + 41.5300000 94.4700000 + 41.5200000 94.3800000 + 41.5000000 94.2600000 + 41.5100000 94.2300000 + 41.4800000 94.1500000 + 41.4800000 94.1200000 + 41.4800000 94.0300000 + 41.5000000 93.9800000 + 41.4900000 93.9000000 + 41.4700000 93.8400000 + 41.4800000 93.7700000 + 41.5000000 93.7200000 + 41.4700000 93.6600000 + 41.4600000 93.6500000 + 41.4300000 93.6500000 + 41.4000000 93.6700000 + 41.3800000 93.7200000 + 41.3400000 93.9100000 + 41.3200000 93.9900000 + 41.3100000 94.0800000 + 41.3100000 94.1600000 + 41.3300000 94.2400000 + 41.3900000 94.3400000 + 41.4200000 94.3900000 + 41.4800000 94.4500000 + 41.5100000 94.4700000 + 41.5300000 94.5100000 +PANI4 PANI4 -1 9 41.65500 94.34500 + 41.7000000 94.4400000 + 41.7000000 94.3800000 + 41.7000000 94.3500000 + 41.7200000 94.3000000 + 41.6000000 94.2500000 + 41.5900000 94.3200000 + 41.6000000 94.4000000 + 41.6500000 94.4300000 + 41.7000000 94.4400000 +PNLI4 PNLI4 -1 10 41.77000 94.44000 + 41.8400000 94.4900000 + 41.8200000 94.4100000 + 41.7500000 94.3700000 + 41.7000000 94.3500000 + 41.7000000 94.3800000 + 41.7000000 94.4400000 + 41.7300000 94.4400000 + 41.7700000 94.5300000 + 41.7800000 94.5000000 + 41.8400000 94.4900000 +PPLN1HW W BR PAPILLION CREEK AT PAPILLION, NE -1 159 41.23917 96.18583 + 41.1495830 96.0420830 + 41.1391460 96.0462500 + 41.1370830 96.0483130 + 41.1370830 96.0566880 + 41.1350210 96.0587500 + 41.1245830 96.0587500 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2183130 96.2587500 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3100210 96.2629170 + 41.3120830 96.2608130 + 41.3141880 96.2587500 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3266880 96.2462500 + 41.3287500 96.2483540 + 41.3308540 96.2504170 + 41.3329170 96.2525210 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566880 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3600210 96.2670830 + 41.3620830 96.2670830 + 41.3620830 96.2649790 + 41.3641460 96.2629170 + 41.3662500 96.2608540 + 41.3662500 96.2358130 + 41.3641880 96.2337500 + 41.3620830 96.2316880 + 41.3620830 96.2274790 + 41.3600210 96.2254170 + 41.3579170 96.2233540 + 41.3579170 96.2191460 + 41.3558540 96.2170830 + 41.3537500 96.2150210 + 41.3537500 96.2024790 + 41.3516880 96.2004170 + 41.3495830 96.1983540 + 41.3475210 96.1962500 + 41.3391460 96.1962500 + 41.3183540 96.1754170 + 41.3120830 96.1733540 + 41.3120830 96.1691460 + 41.3100210 96.1670830 + 41.2974790 96.1670830 + 41.2912500 96.1566460 + 41.2912500 96.1545830 + 41.2891460 96.1545830 + 41.2599790 96.1462500 + 41.2579170 96.1441880 + 41.2558540 96.1420830 + 41.2516460 96.1420830 + 41.2495830 96.1400210 + 41.2495830 96.1316460 + 41.2475210 96.1295830 + 41.2454170 96.1275210 + 41.2433540 96.1254170 + 41.2412500 96.1233540 + 41.2412500 96.1149790 + 41.2391880 96.1129170 + 41.2370830 96.1108540 + 41.2350210 96.1087500 + 41.2308130 96.1087500 + 41.2287500 96.1066880 + 41.2266880 96.1045830 + 41.2204170 96.1025210 + 41.2204170 96.0899790 + 41.2016880 96.0754170 + 41.1974790 96.0754170 + 41.1954170 96.0733540 + 41.1954170 96.0649790 + 41.1912500 96.0566460 + 41.1891880 96.0545830 + 41.1870830 96.0566460 + 41.1850210 96.0587500 + 41.1829170 96.0566880 + 41.1683540 96.0379170 + 41.1599790 96.0379170 + 41.1495830 96.0420830 +PROI4 PROI4 -1 40 42.10000 94.30000 + 42.4100000 94.2700000 + 42.3900000 94.2600000 + 42.3600000 94.2400000 + 42.3300000 94.2100000 + 42.3100000 94.2000000 + 42.3100000 94.1600000 + 42.3000000 94.1400000 + 42.2800000 94.1400000 + 42.2400000 94.1500000 + 42.1500000 94.2300000 + 42.0900000 94.2400000 + 42.0200000 94.2400000 + 41.9800000 94.2200000 + 41.9300000 94.1500000 + 41.8400000 94.0800000 + 41.8000000 94.0700000 + 41.8100000 94.1100000 + 41.8300000 94.2100000 + 41.8200000 94.2300000 + 41.7800000 94.2400000 + 41.8100000 94.2900000 + 41.8400000 94.3400000 + 41.9200000 94.4600000 + 41.9700000 94.5100000 + 41.9900000 94.5300000 + 41.9800000 94.4700000 + 41.9400000 94.4000000 + 41.9500000 94.3800000 + 41.9900000 94.3800000 + 42.0000000 94.3600000 + 42.0200000 94.3600000 + 42.0700000 94.4400000 + 42.1200000 94.4900000 + 42.1700000 94.5100000 + 42.2200000 94.5100000 + 42.2700000 94.4900000 + 42.4000000 94.3800000 + 42.4200000 94.3600000 + 42.3900000 94.3200000 + 42.4100000 94.2700000 +PSGI4HW SOLDIER RIVER AT PISGAH IA -1 404 42.03917 95.68167 + 41.8287500 95.9337500 + 41.8350210 95.9379170 + 41.8474790 95.9504170 + 41.8516880 95.9504170 + 41.8558130 95.9545830 + 41.8600210 95.9545830 + 41.8620830 95.9524790 + 41.8641460 95.9504170 + 41.8891880 95.9504170 + 41.8912500 95.9483130 + 41.8933130 95.9462500 + 41.8975210 95.9462500 + 41.8995830 95.9441460 + 41.9016460 95.9420830 + 41.9058540 95.9420830 + 41.9079170 95.9399790 + 41.9141880 95.9337500 + 41.9162500 95.9337500 + 41.9162500 95.9191460 + 41.9183130 95.9170830 + 41.9225210 95.9170830 + 41.9245830 95.9150210 + 41.9266460 95.9129170 + 41.9308540 95.9129170 + 41.9329170 95.9108540 + 41.9349790 95.9087500 + 41.9558540 95.9087500 + 41.9579170 95.9108130 + 41.9599790 95.9129170 + 41.9662500 95.9024790 + 41.9683540 95.8962500 + 41.9662500 95.8941880 + 41.9662500 95.8899790 + 41.9683130 95.8879170 + 41.9704170 95.8858540 + 41.9724790 95.8837500 + 41.9766880 95.8837500 + 41.9787500 95.8816880 + 41.9787500 95.8733130 + 41.9766880 95.8712500 + 41.9745830 95.8691880 + 41.9766460 95.8670830 + 41.9787500 95.8650210 + 41.9808130 95.8629170 + 41.9891880 95.8629170 + 41.9912500 95.8608540 + 41.9933130 95.8587500 + 41.9954170 95.8566880 + 42.0016460 95.8504170 + 42.0141880 95.8504170 + 42.0162500 95.8483540 + 42.0183130 95.8462500 + 42.0225210 95.8462500 + 42.0245830 95.8441880 + 42.0245830 95.8399790 + 42.0266460 95.8379170 + 42.0350210 95.8379170 + 42.0516880 95.8295830 + 42.0537500 95.8316460 + 42.0558130 95.8337500 + 42.0579170 95.8316880 + 42.0599790 95.8295830 + 42.0620830 95.8275210 + 42.0641460 95.8254170 + 42.0683540 95.8254170 + 42.0704170 95.8191460 + 42.0787500 95.8108540 + 42.0787500 95.8024790 + 42.0829170 95.7733130 + 42.0849790 95.7712500 + 42.0870830 95.7691880 + 42.0870830 95.7649790 + 42.0891460 95.7629170 + 42.0933540 95.7629170 + 42.0954170 95.7649790 + 42.0974790 95.7670830 + 42.0995830 95.7650210 + 42.1016460 95.7629170 + 42.1037500 95.7608540 + 42.1058130 95.7587500 + 42.1079170 95.7566880 + 42.1099790 95.7545830 + 42.1183540 95.7545830 + 42.1204170 95.7525210 + 42.1224790 95.7504170 + 42.1245830 95.7483540 + 42.1266460 95.7462500 + 42.1308540 95.7462500 + 42.1329170 95.7441880 + 42.1349790 95.7420830 + 42.1391880 95.7420830 + 42.1412500 95.7400210 + 42.1412500 95.7358130 + 42.1433130 95.7337500 + 42.1474790 95.7295830 + 42.1558540 95.7295830 + 42.1579170 95.7275210 + 42.1599790 95.7212500 + 42.1641880 95.7212500 + 42.1662500 95.7191880 + 42.1683130 95.7087500 + 42.1725210 95.7087500 + 42.1745830 95.7066880 + 42.1745830 95.7024790 + 42.1766460 95.7004170 + 42.1787500 95.6983540 + 42.1808130 95.6962500 + 42.1829170 95.6941880 + 42.1849790 95.6920830 + 42.1933540 95.6920830 + 42.1954170 95.6900210 + 42.1954170 95.6816460 + 42.1974790 95.6795830 + 42.2016880 95.6795830 + 42.2037500 95.6775210 + 42.2037500 95.6691460 + 42.2058130 95.6670830 + 42.2079170 95.6650210 + 42.2079170 95.6399790 + 42.2099790 95.6379170 + 42.2120830 95.6358540 + 42.2141460 95.6337500 + 42.2162500 95.6316880 + 42.2183130 95.6295830 + 42.2204170 95.6275210 + 42.2224790 95.6254170 + 42.2245830 95.6233540 + 42.2266460 95.6212500 + 42.2308130 95.6170830 + 42.2350210 95.6170830 + 42.2370830 95.6150210 + 42.2391460 95.6129170 + 42.2412500 95.6108540 + 42.2454170 95.6025210 + 42.2433540 95.6004170 + 42.2412500 95.5983540 + 42.2412500 95.5899790 + 42.2579170 95.5733540 + 42.2579170 95.5691460 + 42.2620830 95.5608130 + 42.2662500 95.5566880 + 42.2683130 95.5545830 + 42.2704170 95.5525210 + 42.2724790 95.5504170 + 42.2808540 95.5504170 + 42.2829170 95.5483540 + 42.2808540 95.5462500 + 42.2787500 95.5441880 + 42.2787500 95.5399790 + 42.2808130 95.5379170 + 42.2829170 95.5358540 + 42.2829170 95.5316460 + 42.2870830 95.5275210 + 42.2891460 95.5254170 + 42.2912500 95.5233540 + 42.2912500 95.5024790 + 42.2870830 95.4858130 + 42.2870830 95.4837500 + 42.2849790 95.4837500 + 42.2829170 95.4816880 + 42.2829170 95.4733130 + 42.2808540 95.4712500 + 42.2787500 95.4691880 + 42.2787500 95.4524790 + 42.2808130 95.4504170 + 42.2829170 95.4483540 + 42.2849790 95.4462500 + 42.2870830 95.4441880 + 42.2870830 95.4399790 + 42.2891460 95.4379170 + 42.2912500 95.4358540 + 42.2933130 95.4337500 + 42.2954170 95.4316880 + 42.2954170 95.4274790 + 42.2933540 95.4254170 + 42.2912500 95.4233540 + 42.2912500 95.4108130 + 42.2933130 95.4087500 + 42.2954170 95.4066880 + 42.2933540 95.4045830 + 42.2912500 95.4025210 + 42.2891880 95.4004170 + 42.2808130 95.4004170 + 42.2787500 95.4024790 + 42.2766880 95.4045830 + 42.2745830 95.4025210 + 42.2725210 95.3962500 + 42.2704170 95.3941880 + 42.2704170 95.3899790 + 42.2724790 95.3879170 + 42.2745830 95.3858540 + 42.2745830 95.3816460 + 42.2766460 95.3795830 + 42.2787500 95.3775210 + 42.2787500 95.3691460 + 42.2808130 95.3670830 + 42.2829170 95.3650210 + 42.2829170 95.3483130 + 42.2808540 95.3462500 + 42.2787500 95.3441880 + 42.2787500 95.3358130 + 42.2745830 95.3233130 + 42.2745830 95.3212500 + 42.2662500 95.3274790 + 42.2662500 95.3316880 + 42.2641880 95.3337500 + 42.2579170 95.3358130 + 42.2579170 95.3525210 + 42.2558130 95.3545830 + 42.2537500 95.3524790 + 42.2516880 95.3504170 + 42.2391460 95.3504170 + 42.2370830 95.3524790 + 42.2370830 95.3566880 + 42.2349790 95.3587500 + 42.2329170 95.3608130 + 42.2329170 95.3650210 + 42.2287500 95.3691460 + 42.2287500 95.3775210 + 42.2266460 95.3795830 + 42.2245830 95.3816880 + 42.2224790 95.3837500 + 42.2141880 95.3920830 + 42.1995830 95.3983130 + 42.1995830 95.4066880 + 42.1954170 95.4108130 + 42.1954170 95.4150210 + 42.1933540 95.4170830 + 42.1787500 95.4191880 + 42.1683540 95.4295830 + 42.1641460 95.4295830 + 42.1620830 95.4274790 + 42.1599790 95.4254170 + 42.1579170 95.4233540 + 42.1579170 95.4191460 + 42.1558540 95.4170830 + 42.1433130 95.4170830 + 42.1412500 95.4149790 + 42.1391880 95.4129170 + 42.1308130 95.4129170 + 42.1287500 95.4108130 + 42.1224790 95.4087500 + 42.1204170 95.4108540 + 42.1183130 95.4129170 + 42.1162500 95.4150210 + 42.1141460 95.4170830 + 42.1120830 95.4191880 + 42.1058130 95.4212500 + 42.1037500 95.4233130 + 42.1037500 95.4316880 + 42.1016460 95.4337500 + 42.0995830 95.4358540 + 42.0975210 95.4379170 + 42.0933130 95.4379170 + 42.0912500 95.4379170 + 42.0829170 95.4649790 + 42.0829170 95.4816880 + 42.0808130 95.4837500 + 42.0766880 95.4879170 + 42.0704170 95.4899790 + 42.0704170 95.5025210 + 42.0683130 95.5045830 + 42.0662500 95.5066880 + 42.0641460 95.5087500 + 42.0620830 95.5108540 + 42.0599790 95.5129170 + 42.0579170 95.5149790 + 42.0579170 95.5275210 + 42.0558130 95.5295830 + 42.0537500 95.5274790 + 42.0516880 95.5254170 + 42.0433540 95.5295830 + 42.0391460 95.5295830 + 42.0370830 95.5316460 + 42.0329170 95.5399790 + 42.0329170 95.5483540 + 42.0308130 95.5504170 + 42.0287500 95.5525210 + 42.0266460 95.5545830 + 42.0245830 95.5545830 + 42.0287500 95.5608130 + 42.0287500 95.5816880 + 42.0308540 95.5837500 + 42.0329170 95.5858130 + 42.0329170 95.5900210 + 42.0350210 95.5920830 + 42.0370830 95.5941460 + 42.0370830 95.6066880 + 42.0349790 95.6087500 + 42.0329170 95.6108540 + 42.0308540 95.6129170 + 42.0266460 95.6129170 + 42.0245830 95.6149790 + 42.0204170 95.6233130 + 42.0204170 95.6275210 + 42.0183130 95.6295830 + 42.0162500 95.6316880 + 42.0141460 95.6337500 + 42.0120830 95.6358130 + 42.0120830 95.6608540 + 42.0099790 95.6629170 + 42.0079170 95.6650210 + 42.0058130 95.6670830 + 42.0037500 95.6691880 + 42.0016460 95.6712500 + 41.9995830 95.6733540 + 41.9975210 95.6754170 + 41.9891460 95.6754170 + 41.9870830 95.6774790 + 41.9870830 95.6816880 + 41.9850210 95.6837500 + 41.9808130 95.6837500 + 41.9787500 95.6858540 + 41.9766880 95.6879170 + 41.9683130 95.6879170 + 41.9662500 95.6900210 + 41.9641460 95.6920830 + 41.9620830 95.6941880 + 41.9600210 95.6962500 + 41.9516880 95.7004170 + 41.9433540 95.7045830 + 41.9349790 95.7045830 + 41.9329170 95.7066460 + 41.9329170 95.7233540 + 41.9308130 95.7254170 + 41.9287500 95.7275210 + 41.9266460 95.7295830 + 41.9245830 95.7316880 + 41.9224790 95.7337500 + 41.9204170 95.7358540 + 41.9162500 95.7399790 + 41.9162500 95.7441880 + 41.9141880 95.7462500 + 41.8849790 95.7462500 + 41.8829170 95.7483540 + 41.8808540 95.7504170 + 41.8683130 95.7504170 + 41.8662500 95.7524790 + 41.8662500 95.7566880 + 41.8641460 95.7587500 + 41.8620830 95.7608540 + 41.8599790 95.7629170 + 41.8579170 95.7650210 + 41.8558130 95.7670830 + 41.8537500 95.7691460 + 41.8537500 95.7733540 + 41.8516460 95.7754170 + 41.8495830 95.7775210 + 41.8474790 95.7795830 + 41.8454170 95.7816460 + 41.8454170 95.7858540 + 41.8475210 95.7879170 + 41.8495830 95.7900210 + 41.8474790 95.7920830 + 41.8454170 95.7941880 + 41.8475210 95.7962500 + 41.8495830 95.7983130 + 41.8433540 95.8170830 + 41.8308540 95.8212500 + 41.8266460 95.8212500 + 41.8245830 95.8233540 + 41.8225210 95.8254170 + 41.8183130 95.8254170 + 41.8162500 95.8275210 + 41.8141460 95.8295830 + 41.8120830 95.8316880 + 41.8099790 95.8337500 + 41.8079170 95.8358540 + 41.8058130 95.8379170 + 41.8037500 95.8399790 + 41.8037500 95.8441880 + 41.8016460 95.8462500 + 41.7995830 95.8483540 + 41.7974790 95.8504170 + 41.7954170 95.8525210 + 41.7974790 95.8545830 + 41.8016880 95.8545830 + 41.8037500 95.8566460 + 41.8037500 95.8691880 + 41.8016460 95.8712500 + 41.7995830 95.8733540 + 41.7974790 95.8754170 + 41.7954170 95.8775210 + 41.7933130 95.8795830 + 41.7912500 95.8816460 + 41.7912500 95.8858540 + 41.7891460 95.8879170 + 41.7870830 95.8899790 + 41.7870830 95.8983540 + 41.7870830 95.9004170 + 41.7933130 95.9045830 + 41.7975210 95.9045830 + 41.7995830 95.9066880 + 41.8016460 95.9087500 + 41.8058540 95.9087500 + 41.8079170 95.9108540 + 41.8100210 95.9129170 + 41.8120830 95.9150210 + 41.8183130 95.9212500 + 41.8225210 95.9212500 + 41.8245830 95.9233540 + 41.8266880 95.9254170 + 41.8287500 95.9274790 + 41.8287500 95.9337500 +RDOI4HW E. NISHNABOTNA RIVER AT REDOAK IA -1 596 41.46417 94.92333 + 41.0099790 95.2420830 + 41.0162500 95.2483130 + 41.0162500 95.2525210 + 41.0183130 95.2545830 + 41.0329170 95.2691460 + 41.0329170 95.2733540 + 41.0349790 95.2754170 + 41.0391880 95.2754170 + 41.0412500 95.2733540 + 41.0433130 95.2712500 + 41.0558540 95.2712500 + 41.0579170 95.2691880 + 41.0579170 95.2649790 + 41.0599790 95.2629170 + 41.0641880 95.2629170 + 41.0662500 95.2608540 + 41.0683130 95.2587500 + 41.0704170 95.2566880 + 41.0724790 95.2545830 + 41.0766880 95.2545830 + 41.0787500 95.2525210 + 41.0808130 95.2504170 + 41.0891880 95.2504170 + 41.0912500 95.2483540 + 41.0933130 95.2462500 + 41.0954170 95.2441880 + 41.0974790 95.2420830 + 41.1016880 95.2420830 + 41.1037500 95.2400210 + 41.1037500 95.2358130 + 41.1058130 95.2337500 + 41.1100210 95.2337500 + 41.1120830 95.2316880 + 41.1141460 95.2295830 + 41.1183540 95.2295830 + 41.1204170 95.2275210 + 41.1224790 95.2254170 + 41.1308540 95.2254170 + 41.1329170 95.2233540 + 41.1349790 95.2212500 + 41.1475210 95.2212500 + 41.1495830 95.2191880 + 41.1516460 95.2170830 + 41.1537500 95.2150210 + 41.1558130 95.2129170 + 41.1600210 95.2129170 + 41.1620830 95.2108540 + 41.1641460 95.2087500 + 41.1683540 95.2087500 + 41.1704170 95.2108130 + 41.1724790 95.2129170 + 41.1850210 95.2129170 + 41.1870830 95.2108540 + 41.1870830 95.2066460 + 41.1891460 95.2045830 + 41.1912500 95.2025210 + 41.1912500 95.1983130 + 41.1933130 95.1962500 + 41.2058540 95.1962500 + 41.2079170 95.1941880 + 41.2099790 95.1920830 + 41.2183540 95.1920830 + 41.2204170 95.1900210 + 41.2224790 95.1879170 + 41.2433540 95.1879170 + 41.2454170 95.1858540 + 41.2474790 95.1837500 + 41.2683540 95.1837500 + 41.2704170 95.1858130 + 41.2704170 95.1900210 + 41.2724790 95.1920830 + 41.2975210 95.1920830 + 41.2995830 95.1900210 + 41.3016460 95.1879170 + 41.3037500 95.1858540 + 41.3100210 95.1837500 + 41.3120830 95.1858130 + 41.3141460 95.1879170 + 41.3162500 95.1858540 + 41.3183130 95.1837500 + 41.3266880 95.1837500 + 41.3287500 95.1858130 + 41.3308130 95.1879170 + 41.3329170 95.1858540 + 41.3475210 95.1837500 + 41.3495830 95.1816880 + 41.3516460 95.1795830 + 41.3579170 95.1775210 + 41.3599790 95.1754170 + 41.3787500 95.1774790 + 41.3808130 95.1795830 + 41.3850210 95.1795830 + 41.3870830 95.1775210 + 41.3891460 95.1754170 + 41.4058540 95.1754170 + 41.4079170 95.1774790 + 41.4141880 95.1795830 + 41.4162500 95.1775210 + 41.4308540 95.1754170 + 41.4329170 95.1774790 + 41.4433540 95.1795830 + 41.4454170 95.1775210 + 41.4474790 95.1754170 + 41.4516880 95.1754170 + 41.4537500 95.1733540 + 41.4558130 95.1712500 + 41.4579170 95.1733130 + 41.4599790 95.1754170 + 41.4620830 95.1733540 + 41.4641460 95.1712500 + 41.4891880 95.1712500 + 41.4912500 95.1733130 + 41.4933130 95.1754170 + 41.5016880 95.1754170 + 41.5037500 95.1774790 + 41.5058130 95.1795830 + 41.5225210 95.1795830 + 41.5349790 95.1920830 + 41.5391880 95.1920830 + 41.5412500 95.1941460 + 41.5412500 95.1983540 + 41.5433540 95.2004170 + 41.5454170 95.2004170 + 41.5454170 95.1983130 + 41.5474790 95.1962500 + 41.5516880 95.1962500 + 41.5537500 95.1941880 + 41.5558130 95.1920830 + 41.5641880 95.1920830 + 41.5662500 95.1900210 + 41.5683130 95.1879170 + 41.5725210 95.1879170 + 41.5745830 95.1899790 + 41.5766460 95.1920830 + 41.5850210 95.1879170 + 41.5870830 95.1858540 + 41.5891460 95.1837500 + 41.5933540 95.1837500 + 41.5954170 95.1816880 + 41.5954170 95.1774790 + 41.5974790 95.1754170 + 41.5995830 95.1733540 + 41.6016460 95.1712500 + 41.6037500 95.1691880 + 41.6037500 95.1649790 + 41.6058130 95.1629170 + 41.6100210 95.1629170 + 41.6120830 95.1649790 + 41.6141460 95.1670830 + 41.6162500 95.1691460 + 41.6183130 95.1712500 + 41.6204170 95.1733130 + 41.6224790 95.1754170 + 41.6266880 95.1754170 + 41.6287500 95.1733540 + 41.6350210 95.1712500 + 41.6370830 95.1691880 + 41.6391460 95.1670830 + 41.6475210 95.1670830 + 41.6495830 95.1650210 + 41.6495830 95.1608130 + 41.6516460 95.1587500 + 41.6537500 95.1566880 + 41.6558130 95.1545830 + 41.6579170 95.1525210 + 41.6599790 95.1504170 + 41.6620830 95.1483540 + 41.6641460 95.1462500 + 41.6662500 95.1441880 + 41.6683130 95.1420830 + 41.6725210 95.1420830 + 41.6745830 95.1400210 + 41.6870830 95.1275210 + 41.6870830 95.1233130 + 41.6912500 95.1191880 + 41.6912500 95.1108130 + 41.6891880 95.1087500 + 41.6870830 95.1066880 + 41.6870830 95.0774790 + 41.6891460 95.0754170 + 41.6912500 95.0733540 + 41.6933130 95.0712500 + 41.6954170 95.0691880 + 41.6954170 95.0649790 + 41.6933540 95.0629170 + 41.6912500 95.0608540 + 41.6912500 95.0483130 + 41.6933130 95.0462500 + 41.6975210 95.0462500 + 41.6995830 95.0441880 + 41.7016460 95.0420830 + 41.7037500 95.0400210 + 41.7037500 95.0149790 + 41.7120830 95.0024790 + 41.7100210 95.0004170 + 41.7058130 95.0004170 + 41.7037500 94.9983540 + 41.7037500 94.9858130 + 41.7058130 94.9837500 + 41.7100210 94.9837500 + 41.7120830 94.9816880 + 41.7141460 94.9795830 + 41.7162500 94.9775210 + 41.7162500 94.9733130 + 41.7183130 94.9712500 + 41.7225210 94.9712500 + 41.7245830 94.9733130 + 41.7266460 94.9754170 + 41.7287500 94.9733540 + 41.7308130 94.9712500 + 41.7433540 94.9712500 + 41.7454170 94.9733130 + 41.7474790 94.9754170 + 41.7600210 94.9754170 + 41.7620830 94.9733540 + 41.7620830 94.9691460 + 41.7641460 94.9670830 + 41.7662500 94.9650210 + 41.7683130 94.9629170 + 41.7704170 94.9608540 + 41.7724790 94.9587500 + 41.7745830 94.9566880 + 41.7745830 94.9483130 + 41.7766460 94.9462500 + 41.7787500 94.9441880 + 41.7808130 94.9420830 + 41.7829170 94.9441460 + 41.7849790 94.9462500 + 41.7891880 94.9462500 + 41.7912500 94.9441880 + 41.7912500 94.9316460 + 41.7933130 94.9295830 + 41.7954170 94.9275210 + 41.8058130 94.9170830 + 41.8100210 94.9170830 + 41.8120830 94.9191460 + 41.8141460 94.9212500 + 41.8266880 94.9212500 + 41.8287500 94.9233130 + 41.8287500 94.9275210 + 41.8350210 94.9295830 + 41.8370830 94.9316460 + 41.8391460 94.9337500 + 41.8433540 94.9337500 + 41.8454170 94.9358130 + 41.8454170 94.9400210 + 41.8474790 94.9420830 + 41.8495830 94.9441460 + 41.8495830 94.9525210 + 41.8558540 94.9545830 + 41.8579170 94.9566460 + 41.8599790 94.9587500 + 41.8620830 94.9608130 + 41.8641460 94.9629170 + 41.8662500 94.9649790 + 41.8683130 94.9670830 + 41.8704170 94.9691460 + 41.8724790 94.9712500 + 41.8745830 94.9733130 + 41.8766460 94.9795830 + 41.8891880 94.9795830 + 41.8912500 94.9816460 + 41.8933130 94.9837500 + 41.8975210 94.9837500 + 41.8995830 94.9858130 + 41.9016460 94.9920830 + 41.9100210 94.9920830 + 41.9120830 94.9900210 + 41.9141460 94.9879170 + 41.9162500 94.9858540 + 41.9162500 94.9774790 + 41.9141880 94.9754170 + 41.9120830 94.9733540 + 41.9204170 94.9650210 + 41.9204170 94.9608130 + 41.9245830 94.9587500 + 41.9245830 94.9566460 + 41.9225210 94.9545830 + 41.9204170 94.9525210 + 41.9204170 94.9274790 + 41.9141460 94.9170830 + 41.9162500 94.9150210 + 41.9162500 94.9066460 + 41.9016460 94.8962500 + 41.8995830 94.8941880 + 41.8995830 94.8858130 + 41.8975210 94.8837500 + 41.8954170 94.8816880 + 41.8954170 94.8733130 + 41.8912500 94.8649790 + 41.8850210 94.8587500 + 41.8808130 94.8587500 + 41.8745830 94.8525210 + 41.8745830 94.8483130 + 41.8725210 94.8462500 + 41.8704170 94.8441880 + 41.8704170 94.8399790 + 41.8683540 94.8379170 + 41.8662500 94.8358540 + 41.8641880 94.8337500 + 41.8558130 94.8337500 + 41.8537500 94.8358130 + 41.8516880 94.8379170 + 41.8474790 94.8379170 + 41.8454170 94.8358540 + 41.8433540 94.8337500 + 41.8412500 94.8316880 + 41.8391880 94.8295830 + 41.8370830 94.8275210 + 41.8350210 94.8254170 + 41.8287500 94.8233540 + 41.8266880 94.8170830 + 41.8204170 94.8150210 + 41.8183540 94.8004170 + 41.8058130 94.8004170 + 41.8037500 94.7983540 + 41.8016880 94.7962500 + 41.7995830 94.7941880 + 41.7995830 94.7899790 + 41.7975210 94.7879170 + 41.7933130 94.7879170 + 41.7912500 94.7858540 + 41.7891880 94.7837500 + 41.7870830 94.7816880 + 41.7850210 94.7795830 + 41.7829170 94.7775210 + 41.7808540 94.7754170 + 41.7599790 94.7754170 + 41.7579170 94.7691460 + 41.7558540 94.7670830 + 41.7537500 94.7650210 + 41.7516880 94.7629170 + 41.7495830 94.7608540 + 41.7495830 94.7566460 + 41.7516460 94.7545830 + 41.7683540 94.7545830 + 41.7704170 94.7525210 + 41.7704170 94.7399790 + 41.7683540 94.7379170 + 41.7662500 94.7358540 + 41.7641880 94.7337500 + 41.7516460 94.7337500 + 41.7495830 94.7358130 + 41.7475210 94.7379170 + 41.7454170 94.7399790 + 41.7433540 94.7420830 + 41.7412500 94.7400210 + 41.7391880 94.7379170 + 41.7308130 94.7379170 + 41.7287500 94.7358540 + 41.7266880 94.7337500 + 41.7245830 94.7316880 + 41.7225210 94.7295830 + 41.7204170 94.7275210 + 41.7183540 94.7254170 + 41.7141460 94.7254170 + 41.7120830 94.7233540 + 41.7100210 94.7212500 + 41.7058130 94.7212500 + 41.7016880 94.7170830 + 41.6933130 94.7170830 + 41.6912500 94.7150210 + 41.6891880 94.7129170 + 41.6870830 94.7108540 + 41.6850210 94.7087500 + 41.6829170 94.7066880 + 41.6829170 94.6983130 + 41.6808540 94.6962500 + 41.6745830 94.6941880 + 41.6725210 94.6920830 + 41.6704170 94.6900210 + 41.6683540 94.6879170 + 41.6662500 94.6858540 + 41.6641880 94.6837500 + 41.6599790 94.6837500 + 41.6579170 94.6858130 + 41.6579170 94.6900210 + 41.6558540 94.6920830 + 41.6516460 94.6920830 + 41.6495830 94.6941460 + 41.6475210 94.6962500 + 41.6454170 94.6983130 + 41.6454170 94.7025210 + 41.6433540 94.7045830 + 41.6412500 94.7025210 + 41.6391880 94.7004170 + 41.6370830 94.6983540 + 41.6350210 94.6962500 + 41.6308130 94.6962500 + 41.6287500 94.6941880 + 41.6266880 94.6920830 + 41.6099790 94.6920830 + 41.6079170 94.6941460 + 41.6058540 94.6962500 + 41.6037500 94.6983130 + 41.6016880 94.7004170 + 41.5995830 94.7024790 + 41.5975210 94.7045830 + 41.5954170 94.7025210 + 41.5933540 94.7004170 + 41.5912500 94.6983540 + 41.5849790 94.6962500 + 41.5829170 94.6941880 + 41.5808540 94.6920830 + 41.5787500 94.6900210 + 41.5724790 94.6879170 + 41.5704170 94.6858540 + 41.5704170 94.6774790 + 41.5683540 94.6754170 + 41.5662500 94.6733540 + 41.5662500 94.6691460 + 41.5641880 94.6670830 + 41.5516460 94.6670830 + 41.5495830 94.6650210 + 41.5475210 94.6629170 + 41.5454170 94.6608540 + 41.5433540 94.6587500 + 41.5391460 94.6587500 + 41.5370830 94.6566880 + 41.5350210 94.6545830 + 41.5329170 94.6566460 + 41.5308540 94.6587500 + 41.5266460 94.6587500 + 41.5245830 94.6566880 + 41.5225210 94.6545830 + 41.5183130 94.6545830 + 41.5100210 94.6462500 + 41.4974790 94.6462500 + 41.4954170 94.6441880 + 41.4954170 94.6399790 + 41.4849790 94.6379170 + 41.4829170 94.6379170 + 41.4745830 94.6566460 + 41.4745830 94.6650210 + 41.4724790 94.6670830 + 41.4704170 94.6691880 + 41.4683130 94.6712500 + 41.4662500 94.6733540 + 41.4641460 94.6754170 + 41.4620830 94.6774790 + 41.4620830 94.6816880 + 41.4599790 94.6837500 + 41.4579170 94.6858540 + 41.4558130 94.6879170 + 41.4537500 94.6899790 + 41.4537500 94.6983540 + 41.4516460 94.7004170 + 41.4495830 94.7024790 + 41.4495830 94.7108540 + 41.4474790 94.7129170 + 41.4454170 94.7150210 + 41.4433130 94.7170830 + 41.4412500 94.7191460 + 41.4412500 94.7275210 + 41.4391880 94.7295830 + 41.4349790 94.7295830 + 41.4329170 94.7316460 + 41.4329170 94.7358540 + 41.4308540 94.7379170 + 41.4266460 94.7379170 + 41.4245830 94.7400210 + 41.4225210 94.7420830 + 41.4183130 94.7420830 + 41.4162500 94.7441880 + 41.4120830 94.7483130 + 41.4120830 94.7525210 + 41.4100210 94.7545830 + 41.4037500 94.7566460 + 41.4037500 94.7816880 + 41.4016880 94.7837500 + 41.3974790 94.7837500 + 41.3954170 94.7858540 + 41.3933130 94.7879170 + 41.3912500 94.7900210 + 41.3891880 94.7920830 + 41.3849790 94.7920830 + 41.3829170 94.7899790 + 41.3704170 94.7983130 + 41.3704170 94.8025210 + 41.3683130 94.8045830 + 41.3662500 94.8066460 + 41.3662500 94.8108540 + 41.3641880 94.8129170 + 41.3370830 94.8233540 + 41.3391880 94.8254170 + 41.3412500 94.8274790 + 41.3412500 94.8400210 + 41.3391460 94.8420830 + 41.3370830 94.8441460 + 41.3370830 94.8483540 + 41.3349790 94.8504170 + 41.3329170 94.8525210 + 41.3308540 94.8545830 + 41.3204170 94.8608130 + 41.3204170 94.8775210 + 41.3183540 94.8795830 + 41.3141460 94.8795830 + 41.3120830 94.8816880 + 41.3099790 94.8837500 + 41.3079170 94.8858130 + 41.3079170 94.9025210 + 41.3058540 94.9045830 + 41.3016460 94.9045830 + 41.2995830 94.9066880 + 41.2974790 94.9087500 + 41.2954170 94.9108130 + 41.2954170 94.9233540 + 41.2974790 94.9254170 + 41.3058540 94.9254170 + 41.3079170 94.9274790 + 41.3079170 94.9441880 + 41.3058130 94.9462500 + 41.3037500 94.9483130 + 41.3037500 95.0025210 + 41.3016880 95.0045830 + 41.2974790 95.0045830 + 41.2954170 95.0066460 + 41.2954170 95.0441880 + 41.2933540 95.0462500 + 41.2849790 95.0462500 + 41.2829170 95.0483540 + 41.2808540 95.0504170 + 41.2683130 95.0504170 + 41.2662500 95.0525210 + 41.2641880 95.0545830 + 41.2599790 95.0545830 + 41.2579170 95.0566880 + 41.2558540 95.0587500 + 41.2474790 95.0587500 + 41.2454170 95.0608540 + 41.2433540 95.0629170 + 41.2099790 95.0629170 + 41.2079170 95.0608130 + 41.2058540 95.0587500 + 41.2016460 95.0587500 + 41.1995830 95.0608540 + 41.1974790 95.0629170 + 41.1954170 95.0629170 + 41.1912500 95.0816460 + 41.1912500 95.0858540 + 41.1891460 95.0879170 + 41.1870830 95.0900210 + 41.1850210 95.0920830 + 41.1558130 95.0920830 + 41.1516880 95.0962500 + 41.1433540 95.1004170 + 41.1308130 95.1004170 + 41.1287500 95.1025210 + 41.1266880 95.1045830 + 41.1224790 95.1045830 + 41.1204170 95.1066880 + 41.1183130 95.1087500 + 41.1162500 95.1108130 + 41.1162500 95.1191880 + 41.1141460 95.1212500 + 41.1120830 95.1233540 + 41.1100210 95.1254170 + 41.1058130 95.1254170 + 41.1037500 95.1275210 + 41.1016460 95.1295830 + 41.0995830 95.1316460 + 41.0995830 95.1358540 + 41.0974790 95.1379170 + 41.0954170 95.1358130 + 41.0933540 95.1337500 + 41.0891460 95.1337500 + 41.0870830 95.1316460 + 41.0849790 95.1295830 + 41.0829170 95.1316880 + 41.0808540 95.1337500 + 41.0641460 95.1337500 + 41.0620830 95.1358540 + 41.0600210 95.1379170 + 41.0474790 95.1379170 + 41.0454170 95.1400210 + 41.0433130 95.1420830 + 41.0412500 95.1441460 + 41.0412500 95.1525210 + 41.0391460 95.1545830 + 41.0370830 95.1566460 + 41.0370830 95.1608540 + 41.0349790 95.1629170 + 41.0329170 95.1650210 + 41.0329170 95.1670830 + 41.0412500 95.1691460 + 41.0412500 95.1733540 + 41.0454170 95.1774790 + 41.0412500 95.1858130 + 41.0412500 95.1941880 + 41.0370830 95.1983540 + 41.0349790 95.2004170 + 41.0120830 95.2233130 + 41.0120830 95.2358540 + 41.0099790 95.2379170 + 41.0079170 95.2400210 + 41.0099790 95.2420830 +REDI4 REDI4 -1 58 41.81000 94.71381 + 42.1200000 95.0200000 + 42.0500000 94.9500000 + 41.9300000 94.8200000 + 41.9000000 94.7500000 + 41.8300000 94.6700000 + 41.7700000 94.5300000 + 41.7300000 94.4400000 + 41.7000000 94.4400000 + 41.6500000 94.4300000 + 41.6000000 94.4000000 + 41.5900000 94.3200000 + 41.6000000 94.2500000 + 41.7200000 94.3000000 + 41.7000000 94.3500000 + 41.7500000 94.3700000 + 41.8200000 94.4100000 + 41.8400000 94.4900000 + 41.8600000 94.5100000 + 41.9700000 94.5100000 + 41.9200000 94.4600000 + 41.8400000 94.3400000 + 41.8100000 94.2900000 + 41.7800000 94.2400000 + 41.7500000 94.2200000 + 41.7300000 94.2100000 + 41.6600000 94.1800000 + 41.6300000 94.1500000 + 41.6100000 94.1400000 + 41.5800000 94.1800000 + 41.5400000 94.1900000 + 41.5300000 94.2200000 + 41.5100000 94.2300000 + 41.5000000 94.2600000 + 41.5200000 94.3800000 + 41.5300000 94.4700000 + 41.5300000 94.5100000 + 41.5700000 94.5500000 + 41.6200000 94.6500000 + 41.6300000 94.6700000 + 41.6500000 94.6700000 + 41.7000000 94.7200000 + 41.7700000 94.7500000 + 41.8000000 94.8000000 + 41.8700000 94.8300000 + 41.8800000 94.8700000 + 41.9200000 94.9000000 + 41.9200000 94.9500000 + 41.9200000 94.9800000 + 41.9500000 94.9800000 + 41.9500000 94.9700000 + 42.0000000 94.9800000 + 42.0000000 95.0000000 + 42.0300000 95.0200000 + 42.0300000 95.0300000 + 42.0500000 95.0300000 + 42.0700000 95.0200000 + 42.0800000 95.0200000 + 42.1200000 95.0200000 +SCRI4 SCRI4 -1 35 42.61500 95.01500 + 42.7700000 94.7600000 + 42.6900000 94.7700000 + 42.6500000 94.7600000 + 42.6200000 94.7300000 + 42.5300000 94.8000000 + 42.4300000 94.8500000 + 42.3800000 94.8900000 + 42.3700000 94.9400000 + 42.3000000 94.9800000 + 42.3800000 95.0300000 + 42.4500000 95.0500000 + 42.5000000 95.0800000 + 42.5200000 95.1000000 + 42.5800000 95.1300000 + 42.6000000 95.2000000 + 42.6300000 95.2800000 + 42.6500000 95.2800000 + 42.6800000 95.3000000 + 42.7200000 95.3000000 + 42.7200000 95.2800000 + 42.6800000 95.2700000 + 42.6800000 95.2200000 + 42.6500000 95.1500000 + 42.6000000 95.0800000 + 42.6200000 95.0200000 + 42.6300000 95.0200000 + 42.6800000 94.9700000 + 42.7700000 94.9200000 + 42.8000000 94.9100000 + 42.8700000 94.9200000 + 42.9300000 94.9500000 + 42.9200000 94.8800000 + 42.9000000 94.8500000 + 42.8700000 94.8000000 + 42.7700000 94.7600000 +SRBN1HW Pebble Creek near Scribner, NE -1 220 41.73917 96.86500 + 41.6537500 96.6795830 + 41.6266460 96.6837500 + 41.6183540 96.6754170 + 41.6099790 96.6754170 + 41.6079170 96.6775210 + 41.6058130 96.6795830 + 41.6037500 96.6816460 + 41.6037500 96.6858540 + 41.6016460 96.6879170 + 41.5995830 96.6900210 + 41.5870830 96.7024790 + 41.5870830 96.7191880 + 41.5891880 96.7212500 + 41.5912500 96.7233130 + 41.5912500 96.7358540 + 41.5891460 96.7379170 + 41.5870830 96.7399790 + 41.5870830 96.8025210 + 41.5891880 96.8045830 + 41.5912500 96.8066460 + 41.5912500 96.8150210 + 41.5933540 96.8170830 + 41.5954170 96.8191460 + 41.5954170 96.8316880 + 41.5975210 96.8337500 + 41.5995830 96.8358540 + 41.6016880 96.8379170 + 41.6037500 96.8399790 + 41.6037500 96.8525210 + 41.6058540 96.8545830 + 41.6079170 96.8566460 + 41.6079170 96.8608540 + 41.6100210 96.8629170 + 41.6120830 96.8649790 + 41.6120830 96.8775210 + 41.6141880 96.8795830 + 41.6162500 96.8816460 + 41.6162500 96.8858540 + 41.6183540 96.8879170 + 41.6204170 96.8899790 + 41.6204170 96.9025210 + 41.6225210 96.9045830 + 41.6245830 96.9066880 + 41.6266880 96.9087500 + 41.6287500 96.9108130 + 41.6287500 96.9150210 + 41.6308540 96.9170830 + 41.6329170 96.9191880 + 41.6349790 96.9212500 + 41.6433540 96.9212500 + 41.6454170 96.9191460 + 41.6474790 96.9170830 + 41.6516880 96.9170830 + 41.6537500 96.9191460 + 41.6537500 96.9275210 + 41.6558130 96.9295830 + 41.6766460 96.9337500 + 41.6891880 96.9337500 + 41.6912500 96.9358130 + 41.6912500 96.9400210 + 41.6933540 96.9420830 + 41.6954170 96.9441880 + 41.6974790 96.9462500 + 41.7058540 96.9462500 + 41.7079170 96.9483540 + 41.7099790 96.9504170 + 41.7183540 96.9504170 + 41.7204170 96.9524790 + 41.7204170 96.9566880 + 41.7225210 96.9587500 + 41.7245830 96.9608540 + 41.7266880 96.9629170 + 41.7287500 96.9650210 + 41.7308130 96.9670830 + 41.7391880 96.9670830 + 41.7412500 96.9691880 + 41.7433130 96.9712500 + 41.7516880 96.9712500 + 41.7537500 96.9733130 + 41.7537500 96.9775210 + 41.7558130 96.9795830 + 41.7683540 96.9795830 + 41.7704170 96.9816460 + 41.7704170 96.9858540 + 41.7724790 96.9879170 + 41.7766880 96.9879170 + 41.7787500 96.9900210 + 41.7808130 96.9920830 + 41.7933540 96.9920830 + 41.7954170 96.9941880 + 41.7975210 96.9962500 + 41.7995830 96.9983540 + 41.8016460 97.0004170 + 41.8058540 97.0004170 + 41.8079170 97.0025210 + 41.8099790 97.0045830 + 41.8183540 97.0045830 + 41.8204170 97.0066460 + 41.8204170 97.0108540 + 41.8225210 97.0129170 + 41.8245830 97.0150210 + 41.8266880 97.0170830 + 41.8287500 97.0191460 + 41.8349790 97.0295830 + 41.8391880 97.0295830 + 41.8412500 97.0316880 + 41.8433130 97.0337500 + 41.8516880 97.0337500 + 41.8537500 97.0337500 + 41.8537500 97.0233130 + 41.8558130 97.0212500 + 41.8579170 97.0191880 + 41.8579170 97.0149790 + 41.8599790 97.0129170 + 41.8620830 97.0149790 + 41.8641460 97.0170830 + 41.8725210 97.0170830 + 41.8745830 97.0150210 + 41.8745830 96.9858130 + 41.8766460 96.9837500 + 41.8808540 96.9837500 + 41.8829170 96.9816880 + 41.8849790 96.9795830 + 41.8870830 96.9775210 + 41.8850210 96.9754170 + 41.8829170 96.9733540 + 41.8829170 96.9566460 + 41.8808540 96.9545830 + 41.8787500 96.9525210 + 41.8808130 96.9504170 + 41.8829170 96.9483540 + 41.8829170 96.9399790 + 41.8849790 96.9379170 + 41.8870830 96.9358540 + 41.8891460 96.9337500 + 41.8912500 96.9316880 + 41.8912500 96.9274790 + 41.8891880 96.9254170 + 41.8870830 96.9233540 + 41.8870830 96.8983130 + 41.8850210 96.8962500 + 41.8829170 96.8858130 + 41.8808540 96.8837500 + 41.8787500 96.8816880 + 41.8787500 96.8774790 + 41.8829170 96.8649790 + 41.8829170 96.8629170 + 41.8808130 96.8629170 + 41.8787500 96.8608540 + 41.8766880 96.8587500 + 41.8724790 96.8587500 + 41.8704170 96.8566880 + 41.8683540 96.8545830 + 41.8662500 96.8525210 + 41.8641880 96.8504170 + 41.8620830 96.8483540 + 41.8600210 96.8462500 + 41.8579170 96.8441880 + 41.8558540 96.8420830 + 41.8537500 96.8400210 + 41.8516880 96.8379170 + 41.8433130 96.8379170 + 41.8412500 96.8358540 + 41.8391880 96.8337500 + 41.8349790 96.8337500 + 41.8329170 96.8316880 + 41.8308540 96.8295830 + 41.8287500 96.8275210 + 41.8266880 96.8254170 + 41.8245830 96.8233540 + 41.8225210 96.8212500 + 41.8204170 96.8191880 + 41.8183540 96.8170830 + 41.8162500 96.8191460 + 41.8141880 96.8212500 + 41.8099790 96.8212500 + 41.8079170 96.8191880 + 41.8058540 96.8170830 + 41.8037500 96.8150210 + 41.8037500 96.8108130 + 41.8016880 96.8087500 + 41.7995830 96.8066880 + 41.7975210 96.8045830 + 41.7933130 96.8045830 + 41.7912500 96.8025210 + 41.7912500 96.7983130 + 41.7891880 96.7962500 + 41.7766880 96.7879170 + 41.7641460 96.7879170 + 41.7620830 96.7858540 + 41.7620830 96.7816460 + 41.7600210 96.7795830 + 41.7516460 96.7795830 + 41.7495830 96.7775210 + 41.7475210 96.7754170 + 41.7454170 96.7733540 + 41.7454170 96.7649790 + 41.7433540 96.7629170 + 41.7412500 96.7608540 + 41.7391880 96.7587500 + 41.7308130 96.7587500 + 41.7287500 96.7566880 + 41.7266880 96.7545830 + 41.7245830 96.7525210 + 41.7225210 96.7504170 + 41.7183130 96.7504170 + 41.7162500 96.7483540 + 41.7141880 96.7462500 + 41.7099790 96.7462500 + 41.6995830 96.7316460 + 41.6954170 96.7275210 + 41.6933540 96.7254170 + 41.6891460 96.7254170 + 41.6870830 96.7233540 + 41.6850210 96.7212500 + 41.6829170 96.7191880 + 41.6808540 96.7170830 + 41.6787500 96.7150210 + 41.6787500 96.6899790 + 41.6537500 96.6795830 +WLBN1HW TURKEY CR. NR WILBUR NE -1 464 40.54333 97.24000 + 40.4787500 97.0170830 + 40.4704170 97.0316880 + 40.4662500 97.0358130 + 40.4662500 97.0400210 + 40.4683540 97.0420830 + 40.4745830 97.0483130 + 40.4745830 97.0566880 + 40.4766880 97.0587500 + 40.4787500 97.0608130 + 40.4787500 97.0816880 + 40.4766460 97.0837500 + 40.4745830 97.0858130 + 40.4745830 97.0900210 + 40.4766880 97.0920830 + 40.4787500 97.0941460 + 40.4787500 97.1025210 + 40.4808130 97.1045830 + 40.4850210 97.1045830 + 40.4870830 97.1066460 + 40.4870830 97.1150210 + 40.4891880 97.1170830 + 40.4912500 97.1191460 + 40.4912500 97.1316880 + 40.4933130 97.1337500 + 40.5016880 97.1337500 + 40.5037500 97.1358540 + 40.5058540 97.1379170 + 40.5079170 97.1400210 + 40.5141460 97.1462500 + 40.5183540 97.1462500 + 40.5204170 97.1483130 + 40.5204170 97.1650210 + 40.5183130 97.1670830 + 40.5162500 97.1691460 + 40.5162500 97.1858540 + 40.5141460 97.1879170 + 40.5120830 97.1900210 + 40.5141880 97.1920830 + 40.5162500 97.1941880 + 40.5183540 97.1962500 + 40.5204170 97.1983130 + 40.5204170 97.2025210 + 40.5225210 97.2045830 + 40.5245830 97.2066880 + 40.5266880 97.2087500 + 40.5287500 97.2108540 + 40.5308130 97.2129170 + 40.5391880 97.2129170 + 40.5412500 97.2149790 + 40.5412500 97.2275210 + 40.5433540 97.2295830 + 40.5454170 97.2316880 + 40.5433130 97.2337500 + 40.5412500 97.2358130 + 40.5412500 97.2441880 + 40.5433540 97.2462500 + 40.5454170 97.2483540 + 40.5475210 97.2504170 + 40.5495830 97.2524790 + 40.5495830 97.2691880 + 40.5474790 97.2712500 + 40.5454170 97.2733130 + 40.5454170 97.2983540 + 40.5433130 97.3004170 + 40.5412500 97.3025210 + 40.5391460 97.3045830 + 40.5370830 97.3066460 + 40.5370830 97.3108540 + 40.5349790 97.3129170 + 40.5329170 97.3149790 + 40.5329170 97.3233540 + 40.5308130 97.3254170 + 40.5287500 97.3275210 + 40.5266880 97.3295830 + 40.5224790 97.3295830 + 40.5204170 97.3316880 + 40.5183540 97.3337500 + 40.5141460 97.3337500 + 40.5120830 97.3358540 + 40.5100210 97.3379170 + 40.5058130 97.3379170 + 40.5037500 97.3400210 + 40.5016460 97.3420830 + 40.4995830 97.3441880 + 40.4975210 97.3462500 + 40.4933130 97.3462500 + 40.4912500 97.3483540 + 40.4891880 97.3504170 + 40.4849790 97.3504170 + 40.4829170 97.3525210 + 40.4808130 97.3545830 + 40.4787500 97.3545830 + 40.4745830 97.3608130 + 40.4745830 97.3858540 + 40.4724790 97.3879170 + 40.4704170 97.3900210 + 40.4683540 97.3920830 + 40.4641460 97.3920830 + 40.4620830 97.3941880 + 40.4599790 97.3962500 + 40.4579170 97.3983540 + 40.4558130 97.4004170 + 40.4495830 97.4066460 + 40.4495830 97.4275210 + 40.4474790 97.4295830 + 40.4454170 97.4316460 + 40.4454170 97.4400210 + 40.4433130 97.4420830 + 40.4412500 97.4441880 + 40.4391460 97.4462500 + 40.4370830 97.4483130 + 40.4370830 97.4525210 + 40.4349790 97.4545830 + 40.4329170 97.4566460 + 40.4329170 97.4608540 + 40.4308540 97.4629170 + 40.4266460 97.4629170 + 40.4224790 97.4670830 + 40.4204170 97.4670830 + 40.4245830 97.5024790 + 40.4245830 97.5233540 + 40.4266880 97.5254170 + 40.4287500 97.5274790 + 40.4287500 97.5608540 + 40.4266460 97.5629170 + 40.4245830 97.5649790 + 40.4245830 97.5691880 + 40.4266880 97.5712500 + 40.4287500 97.5733130 + 40.4287500 97.5858540 + 40.4308540 97.5879170 + 40.4329170 97.5899790 + 40.4329170 97.6025210 + 40.4349790 97.6045830 + 40.4391880 97.6045830 + 40.4412500 97.6066880 + 40.4433540 97.6087500 + 40.4454170 97.6108130 + 40.4454170 97.6150210 + 40.4495830 97.6191460 + 40.4495830 97.6233540 + 40.4516460 97.6254170 + 40.4620830 97.6275210 + 40.4599790 97.6295830 + 40.4579170 97.6316460 + 40.4579170 97.6441880 + 40.4558130 97.6462500 + 40.4537500 97.6483130 + 40.4537500 97.6566880 + 40.4495830 97.6650210 + 40.4474790 97.6670830 + 40.4454170 97.6691460 + 40.4454170 97.6858540 + 40.4475210 97.6879170 + 40.4495830 97.6899790 + 40.4495830 97.6941880 + 40.4516460 97.6962500 + 40.4600210 97.6962500 + 40.4620830 97.6983130 + 40.4620830 97.7108540 + 40.4641880 97.7129170 + 40.4662500 97.7149790 + 40.4662500 97.7233540 + 40.4641460 97.7254170 + 40.4620830 97.7274790 + 40.4620830 97.7358540 + 40.4641880 97.7379170 + 40.4662500 97.7399790 + 40.4662500 97.7733540 + 40.4641460 97.7754170 + 40.4620830 97.7774790 + 40.4620830 97.7858540 + 40.4599790 97.7879170 + 40.4579170 97.7899790 + 40.4579170 97.7983540 + 40.4558130 97.8004170 + 40.4537500 97.8004170 + 40.4537500 97.8066880 + 40.4558130 97.8087500 + 40.4579170 97.8108130 + 40.4599790 97.8129170 + 40.4620830 97.8149790 + 40.4641460 97.8170830 + 40.4683540 97.8170830 + 40.4704170 97.8191460 + 40.4704170 97.8525210 + 40.4683540 97.8545830 + 40.4662500 97.8566460 + 40.4662500 97.8650210 + 40.4683130 97.8670830 + 40.4704170 97.8691460 + 40.4724790 97.8712500 + 40.4745830 97.8733130 + 40.4766460 97.8754170 + 40.4787500 97.8774790 + 40.4808130 97.8795830 + 40.5058540 97.8795830 + 40.5079170 97.8816460 + 40.5079170 97.8941880 + 40.5099790 97.8962500 + 40.5120830 97.8983130 + 40.5120830 97.9025210 + 40.5141460 97.9045830 + 40.5162500 97.9066460 + 40.5183130 97.9087500 + 40.5204170 97.9108130 + 40.5224790 97.9129170 + 40.5308540 97.9129170 + 40.5329170 97.9149790 + 40.5349790 97.9170830 + 40.5370830 97.9191460 + 40.5391460 97.9212500 + 40.5412500 97.9191880 + 40.5433130 97.9170830 + 40.5475210 97.9170830 + 40.5495830 97.9150210 + 40.5495830 97.8941460 + 40.5516460 97.8920830 + 40.5537500 97.8900210 + 40.5537500 97.8858130 + 40.5558130 97.8837500 + 40.5579170 97.8816880 + 40.5599790 97.8795830 + 40.5620830 97.8775210 + 40.5620830 97.8649790 + 40.5641460 97.8629170 + 40.5662500 97.8608540 + 40.5662500 97.8483130 + 40.5683130 97.8462500 + 40.5704170 97.8441880 + 40.5724790 97.8420830 + 40.5745830 97.8400210 + 40.5745830 97.8358130 + 40.5766460 97.8337500 + 40.5787500 97.8316880 + 40.5787500 97.8108130 + 40.5808130 97.8087500 + 40.5829170 97.8066880 + 40.5849790 97.8045830 + 40.5870830 97.8025210 + 40.5870830 97.7983130 + 40.5891460 97.7962500 + 40.5912500 97.7941880 + 40.5933130 97.7920830 + 40.5954170 97.7900210 + 40.5974790 97.7879170 + 40.5995830 97.7858540 + 40.6016460 97.7837500 + 40.6079170 97.7775210 + 40.6079170 97.7733130 + 40.6058540 97.7712500 + 40.6016460 97.7712500 + 40.5995830 97.7691880 + 40.5995830 97.7524790 + 40.6100210 97.7462500 + 40.6120830 97.7441880 + 40.6120830 97.7399790 + 40.6141460 97.7379170 + 40.6162500 97.7358540 + 40.6183130 97.7337500 + 40.6204170 97.7316880 + 40.6204170 97.7149790 + 40.6224790 97.7129170 + 40.6245830 97.7108540 + 40.6245830 97.7066460 + 40.6287500 97.6691460 + 40.6287500 97.6670830 + 40.6141460 97.6670830 + 40.6120830 97.6650210 + 40.6100210 97.6629170 + 40.6079170 97.6608540 + 40.6058540 97.6587500 + 40.6037500 97.6566880 + 40.6016880 97.6545830 + 40.5995830 97.6525210 + 40.5995830 97.6483130 + 40.5975210 97.6462500 + 40.5954170 97.6441880 + 40.5954170 97.6399790 + 40.5933540 97.6379170 + 40.5912500 97.6358540 + 40.5891880 97.6337500 + 40.5870830 97.6316880 + 40.5870830 97.6191460 + 40.5891460 97.6170830 + 40.5912500 97.6150210 + 40.5933130 97.6129170 + 40.5954170 97.6066460 + 40.5974790 97.6045830 + 40.5995830 97.6025210 + 40.5975210 97.6004170 + 40.5954170 97.5983540 + 40.5954170 97.5816460 + 40.5974790 97.5795830 + 40.5995830 97.5775210 + 40.5995830 97.5608130 + 40.6016460 97.5587500 + 40.6037500 97.5566880 + 40.6037500 97.5524790 + 40.6058130 97.5504170 + 40.6100210 97.5504170 + 40.6120830 97.5483540 + 40.6141460 97.5462500 + 40.6162500 97.5441880 + 40.6162500 97.5399790 + 40.6183130 97.5379170 + 40.6204170 97.5358540 + 40.6204170 97.5274790 + 40.6183540 97.5254170 + 40.6162500 97.5233540 + 40.6162500 97.5149790 + 40.6183130 97.5129170 + 40.6204170 97.5108540 + 40.6224790 97.5087500 + 40.6245830 97.5066880 + 40.6266460 97.5045830 + 40.6287500 97.5025210 + 40.6287500 97.4858130 + 40.6308130 97.4837500 + 40.6329170 97.4816880 + 40.6308540 97.4795830 + 40.6287500 97.4775210 + 40.6287500 97.4691460 + 40.6266880 97.4670830 + 40.6245830 97.4650210 + 40.6245830 97.4608130 + 40.6225210 97.4587500 + 40.6204170 97.4566880 + 40.6183540 97.4545830 + 40.6162500 97.4525210 + 40.6141880 97.4504170 + 40.6120830 97.4483540 + 40.6120830 97.4358130 + 40.6100210 97.4337500 + 40.6079170 97.4316880 + 40.6099790 97.4295830 + 40.6120830 97.4275210 + 40.6120830 97.4191460 + 40.6100210 97.4170830 + 40.6079170 97.4150210 + 40.6079170 97.4108130 + 40.6099790 97.4087500 + 40.6120830 97.4024790 + 40.6141460 97.4004170 + 40.6162500 97.3983540 + 40.6141880 97.3962500 + 40.6120830 97.3941880 + 40.6120830 97.3774790 + 40.6141460 97.3754170 + 40.6183540 97.3754170 + 40.6204170 97.3733540 + 40.6224790 97.3712500 + 40.6245830 97.3691880 + 40.6266460 97.3670830 + 40.6287500 97.3650210 + 40.6287500 97.3608130 + 40.6308130 97.3587500 + 40.6329170 97.3566880 + 40.6329170 97.3483130 + 40.6349790 97.3462500 + 40.6370830 97.3441880 + 40.6391460 97.3420830 + 40.6412500 97.3400210 + 40.6412500 97.3358130 + 40.6433130 97.3337500 + 40.6454170 97.3316880 + 40.6454170 97.3149790 + 40.6433540 97.3129170 + 40.6412500 97.3108540 + 40.6433130 97.3087500 + 40.6454170 97.3066880 + 40.6454170 97.3024790 + 40.6474790 97.3004170 + 40.6495830 97.2983540 + 40.6516460 97.2962500 + 40.6558540 97.2962500 + 40.6579170 97.2941880 + 40.6599790 97.2920830 + 40.6641880 97.2920830 + 40.6662500 97.2900210 + 40.6662500 97.2691460 + 40.6641880 97.2670830 + 40.6599790 97.2670830 + 40.6579170 97.2650210 + 40.6579170 97.2608130 + 40.6558540 97.2587500 + 40.6537500 97.2566880 + 40.6537500 97.2441460 + 40.6558130 97.2420830 + 40.6579170 97.2400210 + 40.6579170 97.2274790 + 40.6599790 97.2254170 + 40.6620830 97.2233540 + 40.6600210 97.2212500 + 40.6579170 97.2191880 + 40.6579170 97.2024790 + 40.6558540 97.2004170 + 40.6537500 97.1983540 + 40.6558130 97.1962500 + 40.6579170 97.1941880 + 40.6579170 97.1858130 + 40.6620830 97.1774790 + 40.6620830 97.1754170 + 40.6599790 97.1754170 + 40.6579170 97.1733540 + 40.6558540 97.1712500 + 40.6537500 97.1691880 + 40.6516880 97.1670830 + 40.6495830 97.1650210 + 40.6495830 97.1608130 + 40.6475210 97.1587500 + 40.6454170 97.1566880 + 40.6433540 97.1545830 + 40.6329170 97.1483540 + 40.6329170 97.1274790 + 40.6308540 97.1254170 + 40.6287500 97.1233540 + 40.6287500 97.1024790 + 40.6266880 97.1004170 + 40.6245830 97.0983540 + 40.6245830 97.0816460 + 40.6225210 97.0795830 + 40.6204170 97.0775210 + 40.6204170 97.0733130 + 40.6183540 97.0712500 + 40.6162500 97.0691880 + 40.6141880 97.0670830 + 40.6120830 97.0650210 + 40.6100210 97.0629170 + 40.6079170 97.0608540 + 40.6079170 97.0566460 + 40.6058540 97.0545830 + 40.5933130 97.0545830 + 40.5912500 97.0525210 + 40.5891880 97.0504170 + 40.5870830 97.0483540 + 40.5870830 97.0399790 + 40.5745830 97.0275210 + 40.5745830 97.0233130 + 40.5725210 97.0212500 + 40.5704170 97.0191880 + 40.5704170 97.0066460 + 40.5683540 97.0045830 + 40.5662500 97.0025210 + 40.5641880 97.0004170 + 40.5558130 97.0004170 + 40.5537500 97.0024790 + 40.5516880 97.0045830 + 40.5370830 97.0025210 + 40.5329170 96.9983540 + 40.5308540 96.9962500 + 40.5120830 96.9941880 + 40.5100210 96.9920830 + 40.5079170 96.9941460 + 40.5058540 96.9962500 + 40.4974790 96.9920830 + 40.4954170 96.9920830 + 40.4933540 97.0004170 + 40.4891460 97.0004170 + 40.4829170 97.0066460 + 40.4829170 97.0108540 + 40.4808130 97.0129170 + 40.4787500 97.0149790 + 40.4787500 97.0170830 +WOON1HW WAHOO CREEK AT WAHOO, NE -1 171 41.23083 96.76083 + 41.1975210 96.6212500 + 41.1787500 96.6441880 + 41.1766880 96.6462500 + 41.1641880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3329170 96.8920830 + 41.3329170 96.8899790 + 41.3349790 96.8879170 + 41.3370830 96.8858540 + 41.3370830 96.8816460 + 41.3391460 96.8795830 + 41.3433540 96.8795830 + 41.3454170 96.8775210 + 41.3474790 96.8754170 + 41.3495830 96.8733540 + 41.3495830 96.8399790 + 41.3475210 96.8379170 + 41.3454170 96.8358540 + 41.3454170 96.8316460 + 41.3433540 96.8295830 + 41.3412500 96.8275210 + 41.3412500 96.8149790 + 41.3391880 96.8129170 + 41.3349790 96.8129170 + 41.3329170 96.8108540 + 41.3308540 96.8087500 + 41.3287500 96.8066880 + 41.3266880 96.8045830 + 41.3245830 96.8025210 + 41.3225210 96.8004170 + 41.3183130 96.8004170 + 41.3162500 96.7983540 + 41.3141880 96.7962500 + 41.3120830 96.7941880 + 41.3100210 96.7920830 + 41.3079170 96.7900210 + 41.3079170 96.7816460 + 41.3058540 96.7795830 + 41.3037500 96.7775210 + 41.3037500 96.7733130 + 41.3016880 96.7712500 + 41.2995830 96.7691880 + 41.2995830 96.7649790 + 41.2975210 96.7629170 + 41.2954170 96.7608540 + 41.2974790 96.7587500 + 41.3016880 96.7587500 + 41.3037500 96.7566880 + 41.3037500 96.7358130 + 41.3016880 96.7337500 + 41.2995830 96.7316880 + 41.2975210 96.7295830 + 41.2954170 96.7275210 + 41.2974790 96.7254170 + 41.2995830 96.7233540 + 41.2995830 96.7024790 + 41.2975210 96.7004170 + 41.2954170 96.6983540 + 41.2954170 96.6858130 + 41.2933540 96.6837500 + 41.2891460 96.6837500 + 41.2870830 96.6816880 + 41.2870830 96.6733130 + 41.2850210 96.6712500 + 41.2829170 96.6691880 + 41.2808540 96.6670830 + 41.2787500 96.6650210 + 41.2787500 96.6566460 + 41.2766880 96.6545830 + 41.2724790 96.6545830 + 41.2704170 96.6525210 + 41.2683540 96.6504170 + 41.2662500 96.6483540 + 41.2641880 96.6462500 + 41.2620830 96.6441880 + 41.2600210 96.6420830 + 41.2579170 96.6400210 + 41.2579170 96.6358130 + 41.2558540 96.6337500 + 41.2537500 96.6316880 + 41.2516880 96.6295830 + 41.2474790 96.6295830 + 41.2454170 96.6275210 + 41.2433540 96.6254170 + 41.2412500 96.6274790 + 41.2391880 96.6295830 + 41.2308130 96.6295830 + 41.2287500 96.6275210 + 41.2266880 96.6254170 + 41.2183130 96.6254170 + 41.2162500 96.6233540 + 41.2141880 96.6212500 + 41.2120830 96.6191880 + 41.2100210 96.6170830 + 41.2079170 96.6150210 + 41.2058540 96.6129170 + 41.1975210 96.6212500 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat.OAX b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat.OAX new file mode 100644 index 0000000000..e594f8d679 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat.OAX @@ -0,0 +1,13335 @@ +105 105 -1 25 40.10000 98.14803 + 40.2029900 98.2218000 + 40.1545600 98.1811800 + 40.1655000 98.1163200 + 40.1364600 98.0893900 + 40.1471400 98.0375500 + 40.1277000 98.0239600 + 40.0990600 97.9710500 + 40.0994700 97.9450000 + 39.9719800 97.9285400 + 39.9707600 98.0065400 + 39.9410900 98.0187100 + 39.9308500 98.0444100 + 39.9504900 98.0449800 + 39.9684000 98.1495200 + 39.9478600 98.2009000 + 39.9770900 98.2148100 + 39.9651600 98.3314800 + 39.9845600 98.3451200 + 40.0341500 98.3207000 + 40.1618200 98.3248400 + 40.2102000 98.3655600 + 40.2691300 98.3675100 + 40.2504600 98.3146700 + 40.2308200 98.3140300 + 40.2029900 98.2218000 +106 106 -1 27 39.90240 98.37499 + 39.9410900 98.0187100 + 39.8723400 98.0167800 + 39.8328500 98.0286500 + 39.8418200 98.0808300 + 39.8023200 98.0926600 + 39.8213100 98.1321500 + 39.8092200 98.2615400 + 39.8286200 98.2751300 + 39.8239100 98.5215900 + 39.8432900 98.5352600 + 39.8326800 98.5738200 + 39.8812400 98.6015400 + 39.8796000 98.6794200 + 39.9079400 98.7324600 + 39.9275900 98.7332100 + 39.9990800 98.6058100 + 39.9701600 98.5787500 + 40.0024700 98.4367800 + 39.9833300 98.4101200 + 39.9845600 98.3451200 + 39.9651600 98.3314800 + 39.9770900 98.2148100 + 39.9478600 98.2009000 + 39.9684000 98.1495200 + 39.9504900 98.0449800 + 39.9308500 98.0444100 + 39.9410900 98.0187100 +107 107 -1 21 39.94800 97.86219 + 39.9553600 97.7200800 + 39.9358900 97.7066100 + 39.8966000 97.7056800 + 39.8964200 97.7186700 + 39.8866000 97.7184300 + 39.8862500 97.7444000 + 39.7973100 97.7811700 + 39.7965600 97.8330300 + 39.8737700 97.9259100 + 39.8635500 97.9516100 + 39.8527000 98.0162300 + 39.8723400 98.0167800 + 39.9410900 98.0187100 + 39.9707600 98.0065400 + 39.9719800 97.9285400 + 40.0994700 97.9450000 + 40.0707900 97.8921400 + 40.0317000 97.8780900 + 40.0041100 97.7472700 + 39.9648200 97.7463100 + 39.9553600 97.7200800 +108 108 -1 22 39.68160 98.05697 + 39.8635500 97.9516100 + 39.7663300 97.8841300 + 39.7172200 97.8828500 + 39.7077900 97.8566900 + 39.5408400 97.8523900 + 39.4909700 97.9027900 + 39.5298500 97.9296600 + 39.5480600 98.0206500 + 39.6150900 98.1260500 + 39.6142000 98.1777900 + 39.6429700 98.2174900 + 39.7021200 98.2063600 + 39.7213000 98.2328600 + 39.7802200 98.2347000 + 39.8092200 98.2615400 + 39.8213100 98.1321500 + 39.8023200 98.0926600 + 39.8418200 98.0808300 + 39.8328500 98.0286500 + 39.8723400 98.0167800 + 39.8527000 98.0162300 + 39.8635500 97.9516100 +109 109 -1 19 39.64590 97.80373 + 39.8866000 97.7184300 + 39.7392800 97.7149200 + 39.6808800 97.6746700 + 39.4744800 97.6828100 + 39.4257200 97.6558600 + 39.4052100 97.7199000 + 39.4626600 97.8245700 + 39.4715200 97.8893700 + 39.4909700 97.9027900 + 39.5408400 97.8523900 + 39.7077900 97.8566900 + 39.7172200 97.8828500 + 39.7663300 97.8841300 + 39.8635500 97.9516100 + 39.8737700 97.9259100 + 39.7965600 97.8330300 + 39.7973100 97.7811700 + 39.8862500 97.7444000 + 39.8866000 97.7184300 +110 110 -1 31 39.66770 97.56583 + 39.8966000 97.7056800 + 39.8778200 97.6403000 + 39.9177800 97.5892400 + 39.8984600 97.5628400 + 39.8793000 97.5234500 + 39.8013400 97.4699200 + 39.6931500 97.4806600 + 39.5959700 97.3881100 + 39.6356800 97.3500500 + 39.7141200 97.3644800 + 39.7538200 97.3263400 + 39.7832800 97.3268900 + 39.8033300 97.2883400 + 39.7842100 97.2361200 + 39.7254100 97.2221500 + 39.7160800 97.1701700 + 39.5583200 97.2322500 + 39.4983300 97.3345700 + 39.5174100 97.3866100 + 39.4680100 97.4114800 + 39.4775400 97.4375000 + 39.4281400 97.4623300 + 39.4177000 97.5137300 + 39.4268900 97.5655500 + 39.4257200 97.6558600 + 39.4744800 97.6828100 + 39.6808800 97.6746700 + 39.7392800 97.7149200 + 39.8866000 97.7184300 + 39.8964200 97.7186700 + 39.8966000 97.7056800 +111 111 -1 32 39.51920 97.28186 + 39.7070700 97.0793400 + 39.6481400 97.0784500 + 39.5594100 97.1159100 + 39.4715800 97.0500000 + 39.4713600 97.0758100 + 39.4021500 97.1263900 + 39.3234700 97.1380500 + 39.3231100 97.1767000 + 39.2443000 97.2011700 + 39.2440500 97.2269100 + 39.2731200 97.2660400 + 39.2727300 97.3046600 + 39.3215600 97.3313100 + 39.3306700 97.3959200 + 39.3797700 97.3968700 + 39.3991200 97.4230400 + 39.3785800 97.5000200 + 39.3882400 97.5131100 + 39.4177000 97.5137300 + 39.4281400 97.4623300 + 39.4775400 97.4375000 + 39.4680100 97.4114800 + 39.5174100 97.3866100 + 39.4983300 97.3345700 + 39.5583200 97.2322500 + 39.7160800 97.1701700 + 39.7254100 97.2221500 + 39.7842100 97.2361200 + 39.7944100 97.1973800 + 39.7262600 97.1314500 + 39.7266000 97.0925900 + 39.7070700 97.0793400 +112 112 -1 24 39.25080 97.01398 + 39.3843000 96.9068600 + 39.3844800 96.8810700 + 39.3746600 96.8809500 + 39.3157300 96.8802300 + 39.2277000 96.8276900 + 39.1491400 96.8268000 + 39.1193200 96.8778500 + 39.0307500 96.9024600 + 39.0501100 96.9412100 + 39.0300700 96.9922900 + 39.0496100 97.0053900 + 39.1278500 97.0450300 + 39.1470500 97.0967300 + 39.1961500 97.0974700 + 39.2443000 97.2011700 + 39.3231100 97.1767000 + 39.3234700 97.1380500 + 39.4021500 97.1263900 + 39.4713600 97.0758100 + 39.4715800 97.0500000 + 39.4324000 97.0365200 + 39.4425400 96.9979500 + 39.3839100 96.9584400 + 39.3843000 96.9068600 +117 117 -1 8 39.69910 97.40350 + 39.7538200 97.3263400 + 39.7141200 97.3644800 + 39.6356800 97.3500500 + 39.5959700 97.3881100 + 39.6931500 97.4806600 + 39.8013400 97.4699200 + 39.8022300 97.3921000 + 39.7538200 97.3263400 +1407 1407 -1 11 41.06810 98.88040 + 41.1598700 99.0189800 + 41.1605000 98.9925500 + 41.0649600 98.8696300 + 41.0476400 98.7632800 + 41.0187300 98.7357600 + 40.9756300 98.9055900 + 41.0146300 98.9203900 + 40.9943800 98.9459500 + 40.9925200 99.0250400 + 41.0131100 98.9863200 + 41.1598700 99.0189800 +1411 1411 -1 16 41.41380 99.08044 + 41.5238300 99.0213200 + 41.4756100 98.9793900 + 41.4657800 98.9789700 + 41.4461300 98.9781300 + 41.3281800 98.9731500 + 41.2787300 98.9843200 + 41.2670300 99.0633100 + 41.2854000 99.1171100 + 41.3725500 99.1740300 + 41.3722200 99.1872900 + 41.3820500 99.1877400 + 41.4432900 99.0975400 + 41.5124200 99.0873000 + 41.5606000 99.1293200 + 41.5232000 99.0478800 + 41.5238300 99.0213200 +1412 1412 -1 15 41.18790 98.92117 + 41.3281800 98.9731500 + 41.3192700 98.9330100 + 41.2897800 98.9317900 + 41.2227800 98.8495700 + 41.1447500 98.8199800 + 41.0878000 98.7252200 + 41.0476400 98.7632800 + 41.0649600 98.8696300 + 41.1605000 98.9925500 + 41.1598700 99.0189800 + 41.2277200 99.0616000 + 41.2854000 99.1171100 + 41.2670300 99.0633100 + 41.2787300 98.9843200 + 41.3281800 98.9731500 +1413 1413 -1 26 41.03090 98.65353 + 41.2230800 98.8363400 + 41.2048700 98.7694400 + 41.1658500 98.7546800 + 41.1568700 98.7146500 + 41.0796400 98.6456400 + 41.1011700 98.5539500 + 41.1208300 98.5546600 + 41.1213500 98.5282400 + 41.1017000 98.5275300 + 41.0323800 98.5514600 + 40.9990800 98.7350000 + 40.9204700 98.7319600 + 40.8988100 98.8233700 + 40.8493900 98.8345700 + 40.8485100 98.8740500 + 40.8386800 98.8736500 + 40.8482100 98.8872000 + 40.8467000 98.9529800 + 40.9348100 98.9698300 + 40.9756300 98.9055900 + 41.0187300 98.7357600 + 41.0476400 98.7632800 + 41.0878000 98.7252200 + 41.1447500 98.8199800 + 41.2227800 98.8495700 + 41.2230800 98.8363400 +1414 1414 -1 12 41.33440 98.88117 + 41.3511400 98.8282400 + 41.3126900 98.7869300 + 41.2930400 98.7861600 + 41.2439000 98.7842100 + 41.2230800 98.8363400 + 41.2227800 98.8495700 + 41.2897800 98.9317900 + 41.3192700 98.9330100 + 41.3281800 98.9731500 + 41.4461300 98.9781300 + 41.3499600 98.8812300 + 41.3511400 98.8282400 +1415 1415 -1 11 41.18630 98.69514 + 41.2930400 98.7861600 + 41.2444700 98.7577500 + 41.1208300 98.5546600 + 41.1011700 98.5539500 + 41.0796400 98.6456400 + 41.1568700 98.7146500 + 41.1658500 98.7546800 + 41.2048700 98.7694400 + 41.2230800 98.8363400 + 41.2439000 98.7842100 + 41.2930400 98.7861600 +1416 1416 -1 18 41.19180 98.62523 + 41.3332100 98.7479600 + 41.2663700 98.6526400 + 41.2193700 98.5449800 + 41.1999800 98.5310500 + 41.2209300 98.4656200 + 41.2020300 98.4252600 + 41.1135700 98.4222300 + 41.0334300 98.4987000 + 41.0323800 98.5514600 + 41.1017000 98.5275300 + 41.1213500 98.5282400 + 41.1208300 98.5546600 + 41.2444700 98.7577500 + 41.2930400 98.7861600 + 41.3126900 98.7869300 + 41.3511400 98.8282400 + 41.3323500 98.7877000 + 41.3332100 98.7479600 +1420 1420 -1 18 41.68590 99.05527 + 41.7975200 99.0998600 + 41.8485800 99.0219700 + 41.7247000 98.8433100 + 41.6749500 98.8679400 + 41.6740500 98.9078700 + 41.6347300 98.9062400 + 41.5843600 98.9573800 + 41.5253800 98.9549000 + 41.5238300 99.0213200 + 41.5232000 99.0478800 + 41.5606000 99.1293200 + 41.5799400 99.1434900 + 41.5691300 99.1829100 + 41.6654200 99.2672300 + 41.6766000 99.2144400 + 41.7260900 99.2033800 + 41.7575500 99.1247700 + 41.7975200 99.0998600 +1421 1421 -1 16 41.57800 98.86229 + 41.7247000 98.8433100 + 41.6579000 98.7473600 + 41.6191400 98.7192200 + 41.5506000 98.7032700 + 41.4317900 98.7385300 + 41.4312200 98.7650700 + 41.4508800 98.7658400 + 41.4657800 98.9789700 + 41.4756100 98.9793900 + 41.5238300 99.0213200 + 41.5253800 98.9549000 + 41.5843600 98.9573800 + 41.6347300 98.9062400 + 41.6740500 98.9078700 + 41.6749500 98.8679400 + 41.7247000 98.8433100 +1422 1422 -1 19 41.49120 98.68251 + 41.6500200 98.6538200 + 41.6210700 98.6261100 + 41.5424200 98.6231700 + 41.4531300 98.6596800 + 41.3750300 98.6302000 + 41.3733700 98.7097300 + 41.3332100 98.7479600 + 41.3323500 98.7877000 + 41.3511400 98.8282400 + 41.3499600 98.8812300 + 41.4461300 98.9781300 + 41.4657800 98.9789700 + 41.4508800 98.7658400 + 41.4312200 98.7650700 + 41.4317900 98.7385300 + 41.5506000 98.7032700 + 41.6191400 98.7192200 + 41.6489100 98.7070500 + 41.6500200 98.6538200 +1423 1423 -1 13 41.38090 98.60086 + 41.5424200 98.6231700 + 41.4845100 98.5678600 + 41.4257900 98.5524400 + 41.4170000 98.4990300 + 41.2605000 98.4537600 + 41.2305000 98.4791900 + 41.2193700 98.5449800 + 41.2663700 98.6526400 + 41.3332100 98.7479600 + 41.3733700 98.7097300 + 41.3750300 98.6302000 + 41.4531300 98.6596800 + 41.5424200 98.6231700 +1424 1424 -1 20 41.46640 98.49505 + 41.5468400 98.3972700 + 41.4684300 98.3813200 + 41.4200100 98.3398600 + 41.3118700 98.3362700 + 41.2819000 98.3617700 + 41.2909900 98.4018200 + 41.4175200 98.4725000 + 41.4170000 98.4990300 + 41.4257900 98.5524400 + 41.4845100 98.5678600 + 41.5424200 98.6231700 + 41.6210700 98.6261100 + 41.6500200 98.6538200 + 41.6508400 98.6139000 + 41.6311800 98.6131700 + 41.6319800 98.5732600 + 41.6327700 98.5333400 + 41.5939700 98.5053300 + 41.5949900 98.4521400 + 41.5468400 98.3972700 +1425 1425 -1 19 41.27230 98.33995 + 41.4020100 98.2463700 + 41.2856300 98.1499300 + 41.2268800 98.1349100 + 41.1145700 98.3694000 + 41.1135700 98.4222300 + 41.2020300 98.4252600 + 41.2209300 98.4656200 + 41.1999800 98.5310500 + 41.2193700 98.5449800 + 41.2305000 98.4791900 + 41.2605000 98.4537600 + 41.4170000 98.4990300 + 41.4175200 98.4725000 + 41.2909900 98.4018200 + 41.2819000 98.3617700 + 41.3118700 98.3362700 + 41.4200100 98.3398600 + 41.4310300 98.2738500 + 41.4020100 98.2463700 +1426 1426 -1 11 41.31990 98.07302 + 41.3762700 98.0200600 + 41.3680600 97.9137300 + 41.3387700 97.8996700 + 41.2793900 97.9245600 + 41.2268800 98.1349100 + 41.2856300 98.1499300 + 41.4020100 98.2463700 + 41.4129800 98.1803700 + 41.3741100 98.1526300 + 41.3649400 98.1125600 + 41.3762700 98.0200600 +1427 1427 -1 14 41.78970 98.69801 + 41.8312500 98.4470600 + 41.8216700 98.4333700 + 41.8020000 98.4326900 + 41.7233300 98.4299600 + 41.7018700 98.5225100 + 41.7215300 98.5232200 + 41.7385200 98.6571700 + 41.7857200 98.7523700 + 41.7969700 98.6860800 + 41.7502400 98.5642600 + 41.8095100 98.5530900 + 41.8775600 98.5956500 + 41.7512900 98.5109600 + 41.8312500 98.4470600 +1428 1428 -1 19 41.66610 98.33966 + 41.7761200 98.2316800 + 41.7171100 98.2298000 + 41.6207900 98.1069600 + 41.5912900 98.1060700 + 41.5307400 98.1973100 + 41.5302800 98.2238800 + 41.5693800 98.2384200 + 41.5979400 98.2925600 + 41.5468400 98.3972700 + 41.5949900 98.4521400 + 41.5939700 98.5053300 + 41.6327700 98.5333400 + 41.6319800 98.5732600 + 41.7016100 98.5358300 + 41.7018700 98.5225100 + 41.7233300 98.4299600 + 41.8020000 98.4326900 + 41.7857200 98.2453300 + 41.7761200 98.2316800 +1429 1429 -1 17 41.49290 98.20386 + 41.6207900 98.1069600 + 41.5042900 98.0104400 + 41.3762700 98.0200600 + 41.3649400 98.1125600 + 41.3741100 98.1526300 + 41.4129800 98.1803700 + 41.4020100 98.2463700 + 41.4310300 98.2738500 + 41.4200100 98.3398600 + 41.4684300 98.3813200 + 41.5468400 98.3972700 + 41.5979400 98.2925600 + 41.5693800 98.2384200 + 41.5302800 98.2238800 + 41.5307400 98.1973100 + 41.5912900 98.1060700 + 41.6207900 98.1069600 +1430 1430 -1 19 41.55790 97.97990 + 41.7672000 98.1780500 + 41.7184700 98.1498700 + 41.6319100 98.0274100 + 41.5925800 98.0262800 + 41.5833700 97.9861000 + 41.5245700 97.9711500 + 41.4185800 97.8222000 + 41.4297000 97.7295700 + 41.3707000 97.7281200 + 41.3692300 97.8341800 + 41.3387700 97.8996700 + 41.3680600 97.9137300 + 41.3762700 98.0200600 + 41.5042900 98.0104400 + 41.6207900 98.1069600 + 41.7171100 98.2298000 + 41.7761200 98.2316800 + 41.7770300 98.1783500 + 41.7672000 98.1780500 +1431 1431 -1 21 41.87420 98.27620 + 41.9346300 98.1698900 + 41.9162800 98.0891200 + 41.8777800 98.0345400 + 41.8482700 98.0336800 + 41.8083000 98.0725600 + 41.7689600 98.0713900 + 41.7672000 98.1780500 + 41.7770300 98.1783500 + 41.7761200 98.2316800 + 41.7857200 98.2453300 + 41.8020000 98.4326900 + 41.8216700 98.4333700 + 41.8312500 98.4470600 + 41.8229100 98.3666700 + 41.8728200 98.3282800 + 41.9212600 98.3700000 + 41.9288400 98.4905900 + 41.9676600 98.5187200 + 41.9812500 98.3185100 + 41.9428600 98.2637500 + 41.9346300 98.1698900 +1432 1432 -1 19 41.63380 97.95381 + 41.8482700 98.0336800 + 41.8491100 97.9802900 + 41.7905000 97.9519500 + 41.7523500 97.8708700 + 41.7228400 97.8700900 + 41.7237900 97.8034700 + 41.6742400 97.8288300 + 41.5475100 97.7457700 + 41.4297000 97.7295700 + 41.4185800 97.8222000 + 41.5245700 97.9711500 + 41.5833700 97.9861000 + 41.5925800 98.0262800 + 41.6319100 98.0274100 + 41.7184700 98.1498700 + 41.7672000 98.1780500 + 41.7689600 98.0713900 + 41.8083000 98.0725600 + 41.8482700 98.0336800 +1434 1434 -1 18 41.54720 97.70525 + 41.5485700 97.6660200 + 41.5194100 97.6387500 + 41.5009000 97.5453100 + 41.4714000 97.5446600 + 41.4724800 97.4517200 + 41.4340200 97.3712800 + 41.4143600 97.3709000 + 41.4027300 97.5298800 + 41.4010700 97.6625300 + 41.3812400 97.6753200 + 41.3712300 97.6883500 + 41.3707000 97.7281200 + 41.4297000 97.7295700 + 41.5475100 97.7457700 + 41.6742400 97.8288300 + 41.7237900 97.8034700 + 41.7048600 97.7496800 + 41.5485700 97.6660200 +1601 1601 -1 43 42.04000 95.64500 + 42.1200000 95.7500000 + 42.1700000 95.7200000 + 42.2000000 95.6700000 + 42.2200000 95.6300000 + 42.3000000 95.5200000 + 42.2800000 95.4500000 + 42.3000000 95.4300000 + 42.3000000 95.4000000 + 42.2700000 95.3800000 + 42.2800000 95.3500000 + 42.2700000 95.3200000 + 42.2300000 95.3300000 + 42.2200000 95.3700000 + 42.2000000 95.3800000 + 42.2000000 95.4000000 + 42.1700000 95.4200000 + 42.1200000 95.3800000 + 42.1000000 95.4200000 + 42.0800000 95.4800000 + 42.0300000 95.5500000 + 42.0300000 95.5800000 + 42.0200000 95.6300000 + 42.0000000 95.6700000 + 42.0000000 95.6800000 + 41.9300000 95.7000000 + 41.9200000 95.7500000 + 41.8700000 95.7500000 + 41.8500000 95.8200000 + 41.8000000 95.8500000 + 41.8000000 95.8700000 + 41.7800000 95.9000000 + 41.8300000 95.9300000 + 41.8500000 95.9700000 + 41.9000000 95.9500000 + 41.9200000 95.9300000 + 41.9700000 95.9200000 + 41.9800000 95.8700000 + 42.0200000 95.8500000 + 42.0300000 95.8300000 + 42.0700000 95.8300000 + 42.0800000 95.8000000 + 42.0800000 95.7700000 + 42.1200000 95.7500000 +1602 1602 -1 74 42.12500 95.20283 + 42.6300000 95.2800000 + 42.6000000 95.2000000 + 42.5800000 95.1300000 + 42.5200000 95.1000000 + 42.5000000 95.1200000 + 42.4700000 95.1000000 + 42.3700000 95.0800000 + 42.3200000 95.0700000 + 42.3200000 95.0300000 + 42.2700000 95.0500000 + 42.2300000 95.0300000 + 42.2200000 95.0000000 + 42.2000000 95.0200000 + 42.1500000 95.0300000 + 42.1200000 95.0200000 + 42.0800000 95.0200000 + 42.0700000 95.0200000 + 42.0500000 95.0300000 + 42.0300000 95.0300000 + 42.0200000 95.0500000 + 42.0300000 95.0800000 + 42.0200000 95.1300000 + 42.0200000 95.1500000 + 42.0000000 95.1800000 + 41.9800000 95.2300000 + 41.9500000 95.2300000 + 41.9500000 95.2800000 + 41.9200000 95.2800000 + 41.9200000 95.3000000 + 41.9000000 95.3800000 + 41.8700000 95.4000000 + 41.8800000 95.4300000 + 41.8500000 95.4200000 + 41.8000000 95.4800000 + 41.7800000 95.4800000 + 41.7700000 95.5200000 + 41.7200000 95.5500000 + 41.7300000 95.5800000 + 41.6500000 95.6300000 + 41.6300000 95.6300000 + 41.6200000 95.6500000 + 41.6200000 95.7200000 + 41.6500000 95.7800000 + 41.6500000 95.8000000 + 41.7000000 95.8000000 + 41.7700000 95.7300000 + 41.8000000 95.7300000 + 41.8200000 95.7000000 + 41.8700000 95.7000000 + 41.8800000 95.6700000 + 41.9200000 95.6500000 + 41.9300000 95.6200000 + 41.9800000 95.5800000 + 42.0000000 95.5700000 + 42.0300000 95.5500000 + 42.0800000 95.4800000 + 42.1000000 95.4200000 + 42.1200000 95.3800000 + 42.1700000 95.4200000 + 42.2000000 95.4000000 + 42.2000000 95.3800000 + 42.2200000 95.3700000 + 42.2300000 95.3300000 + 42.2700000 95.3200000 + 42.2800000 95.2500000 + 42.3200000 95.2200000 + 42.3500000 95.2200000 + 42.3700000 95.2300000 + 42.4300000 95.2300000 + 42.4500000 95.2700000 + 42.5200000 95.2800000 + 42.5300000 95.3000000 + 42.5700000 95.3000000 + 42.6300000 95.2800000 +1603 WEEPING WATER CR. AT UNION NE -1 262 40.81000 96.30667 + 40.7912500 95.9108130 + 40.7850210 95.9087500 + 40.7808130 95.9087500 + 40.7787500 95.9066880 + 40.7766880 95.9004170 + 40.7683130 95.9004170 + 40.7620830 95.9066460 + 40.7620830 95.9108540 + 40.7599790 95.9129170 + 40.7579170 95.9150210 + 40.7516880 95.9212500 + 40.7433130 95.9212500 + 40.7412500 95.9233540 + 40.7391460 95.9254170 + 40.7370830 95.9233130 + 40.7308130 95.9212500 + 40.7287500 95.9233130 + 40.7287500 95.9400210 + 40.7266880 95.9420830 + 40.7224790 95.9420830 + 40.7204170 95.9441880 + 40.7183540 95.9462500 + 40.7141460 95.9462500 + 40.7120830 95.9483540 + 40.7099790 95.9504170 + 40.7079170 95.9525210 + 40.7058540 95.9545830 + 40.7016460 95.9545830 + 40.6995830 95.9545830 + 40.6954170 95.9733540 + 40.6975210 95.9754170 + 40.6995830 95.9775210 + 40.7058130 95.9837500 + 40.7141880 95.9837500 + 40.7162500 95.9858540 + 40.7183540 95.9879170 + 40.7204170 95.9899790 + 40.7204170 96.0316880 + 40.7225210 96.0337500 + 40.7245830 96.0358130 + 40.7245830 96.0400210 + 40.7224790 96.0420830 + 40.7204170 96.0441880 + 40.7225210 96.0462500 + 40.7245830 96.0483130 + 40.7245830 96.0525210 + 40.7266880 96.0545830 + 40.7287500 96.0566880 + 40.7308540 96.0587500 + 40.7329170 96.0608130 + 40.7329170 96.0733540 + 40.7349790 96.0754170 + 40.7391880 96.0754170 + 40.7412500 96.0775210 + 40.7433540 96.0795830 + 40.7454170 96.0816460 + 40.7474790 96.0879170 + 40.7516880 96.0879170 + 40.7620830 96.0983130 + 40.7620830 96.1275210 + 40.7641880 96.1295830 + 40.7662500 96.1316460 + 40.7662500 96.1358540 + 40.7683540 96.1379170 + 40.7704170 96.1399790 + 40.7704170 96.1441880 + 40.7725210 96.1462500 + 40.7745830 96.1483130 + 40.7745830 96.1816880 + 40.7766880 96.1837500 + 40.7787500 96.1858540 + 40.7808540 96.1879170 + 40.7829170 96.1899790 + 40.7829170 96.1941880 + 40.7849790 96.1962500 + 40.7891880 96.1962500 + 40.7912500 96.1983540 + 40.7933130 96.2004170 + 40.8016880 96.2004170 + 40.8037500 96.2025210 + 40.8058130 96.2045830 + 40.8141880 96.2045830 + 40.8162500 96.2066880 + 40.8183540 96.2087500 + 40.8204170 96.2108540 + 40.8225210 96.2129170 + 40.8245830 96.2150210 + 40.8266460 96.2170830 + 40.8308540 96.2170830 + 40.8329170 96.2191460 + 40.8329170 96.2358540 + 40.8350210 96.2379170 + 40.8370830 96.2399790 + 40.8370830 96.2441880 + 40.8391880 96.2462500 + 40.8412500 96.2483130 + 40.8412500 96.2525210 + 40.8391460 96.2545830 + 40.8370830 96.2566460 + 40.8370830 96.2608540 + 40.8349790 96.2629170 + 40.8329170 96.2691880 + 40.8308130 96.2712500 + 40.8287500 96.2733540 + 40.8266880 96.2754170 + 40.8058130 96.2754170 + 40.8037500 96.2775210 + 40.8016880 96.2795830 + 40.7933130 96.2795830 + 40.7912500 96.2816880 + 40.7891460 96.2837500 + 40.7870830 96.2858130 + 40.7870830 96.2900210 + 40.7891880 96.2920830 + 40.7912500 96.2941460 + 40.7912500 96.3066880 + 40.7933540 96.3087500 + 40.7954170 96.3108130 + 40.7954170 96.3233540 + 40.7975210 96.3254170 + 40.7995830 96.3275210 + 40.8016880 96.3295830 + 40.8037500 96.3316880 + 40.8058540 96.3337500 + 40.8079170 96.3358540 + 40.8100210 96.3379170 + 40.8120830 96.3399790 + 40.8120830 96.3650210 + 40.8141460 96.3670830 + 40.8183540 96.3670830 + 40.8204170 96.3691460 + 40.8204170 96.3775210 + 40.8183130 96.3795830 + 40.8162500 96.3816880 + 40.8183540 96.3837500 + 40.8204170 96.3858540 + 40.8225210 96.3879170 + 40.8245830 96.3899790 + 40.8245830 96.3941880 + 40.8245830 96.3962500 + 40.8266880 96.3962500 + 40.8287500 96.3983130 + 40.8308130 96.4004170 + 40.8391880 96.4004170 + 40.8412500 96.3983540 + 40.8433130 96.3962500 + 40.8766880 96.3962500 + 40.8787500 96.3941880 + 40.8808130 96.3920830 + 40.8829170 96.3900210 + 40.8829170 96.3858130 + 40.8849790 96.3837500 + 40.8870830 96.3816880 + 40.8870830 96.3399790 + 40.8850210 96.3379170 + 40.8808130 96.3379170 + 40.8787500 96.3358540 + 40.8787500 96.3274790 + 40.8808130 96.3254170 + 40.8850210 96.3254170 + 40.8891460 96.3212500 + 40.8933540 96.3212500 + 40.8954170 96.3191880 + 40.8954170 96.3108130 + 40.8974790 96.3087500 + 40.9016880 96.3087500 + 40.9037500 96.3066880 + 40.9058130 96.3045830 + 40.9079170 96.3025210 + 40.9079170 96.2941460 + 40.9225210 96.2837500 + 40.9245830 96.2837500 + 40.9245830 96.2816460 + 40.9266460 96.2795830 + 40.9287500 96.2775210 + 40.9287500 96.2691460 + 40.9266880 96.2670830 + 40.9245830 96.2650210 + 40.9245830 96.2566460 + 40.9225210 96.2545830 + 40.9204170 96.2525210 + 40.9204170 96.2399790 + 40.9183540 96.2379170 + 40.9162500 96.2358540 + 40.9141880 96.2337500 + 40.9120830 96.2316880 + 40.9120830 96.1983130 + 40.9141460 96.1962500 + 40.9162500 96.1941880 + 40.9162500 96.1899790 + 40.9183130 96.1879170 + 40.9204170 96.1858540 + 40.9224790 96.1837500 + 40.9266880 96.1837500 + 40.9287500 96.1816880 + 40.9287500 96.1733130 + 40.9162500 96.1545830 + 40.9141460 96.1545830 + 40.9120830 96.1441460 + 40.9100210 96.1420830 + 40.9079170 96.1400210 + 40.9058540 96.1337500 + 40.9037500 96.1316880 + 40.9037500 96.1149790 + 40.9016880 96.1129170 + 40.8995830 96.1108540 + 40.8995830 96.0899790 + 40.9016460 96.0879170 + 40.9141880 96.0879170 + 40.9162500 96.0774790 + 40.9141880 96.0754170 + 40.9120830 96.0441460 + 40.9141460 96.0420830 + 40.9162500 96.0400210 + 40.9162500 96.0024790 + 40.9141880 96.0004170 + 40.9120830 95.9983540 + 40.9100210 95.9962500 + 40.9079170 95.9941880 + 40.9079170 95.9899790 + 40.9099790 95.9879170 + 40.9120830 95.9858540 + 40.9100210 95.9837500 + 40.9079170 95.9816880 + 40.9079170 95.9774790 + 40.9058540 95.9754170 + 40.9037500 95.9733540 + 40.9037500 95.9608130 + 40.8891460 95.9587500 + 40.8870830 95.9566880 + 40.8870830 95.9399790 + 40.8850210 95.9379170 + 40.8808130 95.9379170 + 40.8787500 95.9358540 + 40.8787500 95.9316460 + 40.8766880 95.9295830 + 40.8745830 95.9275210 + 40.8725210 95.9254170 + 40.8683130 95.9254170 + 40.8662500 95.9233540 + 40.8641880 95.9212500 + 40.8620830 95.9191880 + 40.8620830 95.9149790 + 40.8600210 95.9129170 + 40.8558130 95.9129170 + 40.8537500 95.9108540 + 40.8516880 95.9087500 + 40.8495830 95.9108130 + 40.8475210 95.9129170 + 40.8412500 95.9108540 + 40.8391880 95.9087500 + 40.8370830 95.9066880 + 40.8350210 95.9045830 + 40.8329170 95.9066460 + 40.8308540 95.9087500 + 40.8287500 95.9108130 + 40.8266880 95.9129170 + 40.8120830 95.9149790 + 40.8100210 95.9170830 + 40.8079170 95.9150210 + 40.7974790 95.9129170 + 40.7912500 95.9108130 +1604 1604 -1 40 41.62500 94.86500 + 41.7200000 94.9700000 + 41.7300000 94.9700000 + 41.7700000 94.9700000 + 41.8000000 94.9000000 + 41.8800000 94.9700000 + 41.9200000 94.9800000 + 41.9200000 94.9500000 + 41.9200000 94.9000000 + 41.8800000 94.8700000 + 41.8700000 94.8300000 + 41.8000000 94.8000000 + 41.7700000 94.7500000 + 41.7000000 94.7200000 + 41.6500000 94.6700000 + 41.6300000 94.6700000 + 41.6200000 94.6500000 + 41.6000000 94.7000000 + 41.5800000 94.7000000 + 41.5700000 94.6700000 + 41.5300000 94.6700000 + 41.5200000 94.7000000 + 41.5000000 94.7200000 + 41.5000000 94.7300000 + 41.4500000 94.8200000 + 41.4700000 94.8300000 + 41.4500000 94.8700000 + 41.4300000 94.8700000 + 41.3800000 95.0300000 + 41.3300000 95.0700000 + 41.3500000 95.0800000 + 41.4300000 95.0800000 + 41.4500000 95.0700000 + 41.5300000 95.0500000 + 41.5500000 95.0500000 + 41.5800000 94.9800000 + 41.5800000 94.9700000 + 41.6200000 94.9300000 + 41.6500000 94.9700000 + 41.6800000 94.9500000 + 41.7200000 94.9700000 +1605 1605 -1 22 41.41500 94.85500 + 41.5300000 94.6700000 + 41.4800000 94.6300000 + 41.4500000 94.7300000 + 41.4000000 94.7500000 + 41.4000000 94.7800000 + 41.3700000 94.8200000 + 41.3500000 94.8200000 + 41.3000000 94.9200000 + 41.3000000 94.9500000 + 41.3000000 95.0500000 + 41.3200000 95.0700000 + 41.3200000 95.0800000 + 41.3300000 95.0700000 + 41.3800000 95.0300000 + 41.4300000 94.8700000 + 41.4500000 94.8700000 + 41.4700000 94.8300000 + 41.4500000 94.8200000 + 41.5000000 94.7300000 + 41.5000000 94.7200000 + 41.5200000 94.7000000 + 41.5300000 94.6700000 +1606 1606 -1 27 41.22500 95.16000 + 41.3300000 95.0700000 + 41.3200000 95.0800000 + 41.3200000 95.0700000 + 41.3000000 95.0500000 + 41.2300000 95.0500000 + 41.2000000 95.0500000 + 41.2000000 95.0700000 + 41.1200000 95.1000000 + 41.1000000 95.1200000 + 41.0500000 95.1300000 + 41.0300000 95.1500000 + 41.0500000 95.1700000 + 41.0200000 95.2200000 + 41.0200000 95.2300000 + 41.0200000 95.2700000 + 41.1500000 95.2000000 + 41.2300000 95.1700000 + 41.2700000 95.1700000 + 41.2800000 95.1800000 + 41.3200000 95.2000000 + 41.3200000 95.1700000 + 41.3200000 95.1300000 + 41.3200000 95.1200000 + 41.4200000 95.1200000 + 41.4300000 95.0800000 + 41.3500000 95.0800000 + 41.3300000 95.0700000 +1607 W. NISHNABOTNA RIVER AT HANCOCK IA -1 516 41.71000 95.18167 + 41.3891460 95.3712500 + 41.4037500 95.3941460 + 41.4037500 95.4066880 + 41.4058130 95.4087500 + 41.4141880 95.4087500 + 41.4162500 95.4066460 + 41.4224790 95.4004170 + 41.4266880 95.4004170 + 41.4287500 95.4025210 + 41.4308130 95.4045830 + 41.4350210 95.4045830 + 41.4370830 95.4024790 + 41.4391460 95.4004170 + 41.4433540 95.4004170 + 41.4454170 95.3983130 + 41.4474790 95.3962500 + 41.4516880 95.3962500 + 41.4537500 95.3983130 + 41.4558130 95.4087500 + 41.4600210 95.4087500 + 41.4620830 95.4066460 + 41.4641460 95.4045830 + 41.4683540 95.4045830 + 41.4704170 95.4025210 + 41.4704170 95.3941460 + 41.4725210 95.3920830 + 41.4745830 95.3900210 + 41.4745830 95.3858130 + 41.4766460 95.3837500 + 41.4933540 95.3837500 + 41.4954170 95.3858540 + 41.4974790 95.3879170 + 41.5016880 95.3879170 + 41.5037500 95.3899790 + 41.5100210 95.4004170 + 41.5120830 95.3983130 + 41.5141880 95.3962500 + 41.5162500 95.3941460 + 41.5183130 95.3920830 + 41.5266880 95.3920830 + 41.5287500 95.3899790 + 41.5308540 95.3879170 + 41.5329170 95.3858130 + 41.5350210 95.3837500 + 41.5370830 95.3816460 + 41.5391880 95.3795830 + 41.5412500 95.3774790 + 41.5474790 95.3712500 + 41.5516880 95.3712500 + 41.5537500 95.3733130 + 41.5537500 95.3816880 + 41.5558540 95.3837500 + 41.5579170 95.3858540 + 41.5599790 95.3879170 + 41.5683540 95.3879170 + 41.5704170 95.3858130 + 41.5724790 95.3837500 + 41.5766880 95.3837500 + 41.5787500 95.3816460 + 41.5808130 95.3795830 + 41.5850210 95.3795830 + 41.5870830 95.3774790 + 41.5891460 95.3754170 + 41.5933540 95.3754170 + 41.5954170 95.3733130 + 41.5974790 95.3712500 + 41.6016880 95.3712500 + 41.6037500 95.3691460 + 41.6058130 95.3670830 + 41.6100210 95.3670830 + 41.6120830 95.3649790 + 41.6141460 95.3629170 + 41.6433540 95.3629170 + 41.6454170 95.3650210 + 41.6474790 95.3670830 + 41.6558540 95.3670830 + 41.6579170 95.3649790 + 41.6599790 95.3629170 + 41.6641880 95.3629170 + 41.6662500 95.3608130 + 41.6683540 95.3587500 + 41.6704170 95.3566460 + 41.6724790 95.3545830 + 41.7016880 95.3545830 + 41.7037500 95.3524790 + 41.7058130 95.3504170 + 41.7100210 95.3504170 + 41.7120830 95.3525210 + 41.7141880 95.3545830 + 41.7162500 95.3566460 + 41.7162500 95.3608540 + 41.7183540 95.3629170 + 41.7204170 95.3650210 + 41.7225210 95.3670830 + 41.7245830 95.3691880 + 41.7266460 95.3712500 + 41.7370830 95.3774790 + 41.7370830 95.3816880 + 41.7391880 95.3837500 + 41.7412500 95.3858130 + 41.7412500 95.3900210 + 41.7412500 95.3920830 + 41.7600210 95.3920830 + 41.7620830 95.3941460 + 41.7641460 95.3962500 + 41.7683540 95.3962500 + 41.7704170 95.3941880 + 41.7724790 95.3920830 + 41.7745830 95.3900210 + 41.7766460 95.3879170 + 41.7787500 95.3858540 + 41.7787500 95.3816460 + 41.7808130 95.3795830 + 41.7829170 95.3775210 + 41.7829170 95.3691460 + 41.7849790 95.3670830 + 41.7891880 95.3670830 + 41.7912500 95.3691460 + 41.7933130 95.3712500 + 41.7954170 95.3733130 + 41.7974790 95.3754170 + 41.8016880 95.3754170 + 41.8037500 95.3774790 + 41.8058130 95.3795830 + 41.8100210 95.3795830 + 41.8120830 95.3816460 + 41.8141460 95.3837500 + 41.8183540 95.3837500 + 41.8204170 95.3858130 + 41.8224790 95.3879170 + 41.8245830 95.3899790 + 41.8245830 95.3983540 + 41.8266460 95.4004170 + 41.8287500 95.4024790 + 41.8412500 95.4149790 + 41.8412500 95.4191880 + 41.8433130 95.4212500 + 41.8558130 95.4254170 + 41.8600210 95.4254170 + 41.8620830 95.4274790 + 41.8641460 95.4295830 + 41.8725210 95.4295830 + 41.8745830 95.4316460 + 41.8766460 95.4337500 + 41.8808540 95.4337500 + 41.8829170 95.4316880 + 41.8849790 95.4295830 + 41.8870830 95.4275210 + 41.8870830 95.4191460 + 41.8850210 95.4170830 + 41.8829170 95.4150210 + 41.8829170 95.4108130 + 41.8808540 95.4087500 + 41.8787500 95.4066880 + 41.8766880 95.4045830 + 41.8724790 95.4045830 + 41.8704170 95.4025210 + 41.8724790 95.4004170 + 41.8745830 95.3983540 + 41.8766460 95.3962500 + 41.8850210 95.3962500 + 41.8870830 95.3941880 + 41.8891460 95.3920830 + 41.8912500 95.3900210 + 41.8891880 95.3879170 + 41.8870830 95.3858540 + 41.8870830 95.3733130 + 41.8891460 95.3712500 + 41.8912500 95.3691880 + 41.8933130 95.3670830 + 41.8954170 95.3650210 + 41.8974790 95.3629170 + 41.8995830 95.3608540 + 41.8995830 95.3524790 + 41.9016460 95.3504170 + 41.9037500 95.3483540 + 41.9058130 95.3462500 + 41.9079170 95.3441880 + 41.9099790 95.3420830 + 41.9120830 95.3400210 + 41.9141460 95.3379170 + 41.9162500 95.3358540 + 41.9162500 95.3274790 + 41.9183130 95.3254170 + 41.9204170 95.3233540 + 41.9204170 95.3108130 + 41.9224790 95.3087500 + 41.9245830 95.3066880 + 41.9245830 95.2899790 + 41.9266460 95.2879170 + 41.9391880 95.2879170 + 41.9475210 95.2962500 + 41.9495830 95.2962500 + 41.9495830 95.2941460 + 41.9516460 95.2920830 + 41.9537500 95.2900210 + 41.9537500 95.2858130 + 41.9558130 95.2837500 + 41.9579170 95.2816880 + 41.9579170 95.2774790 + 41.9558540 95.2754170 + 41.9537500 95.2733540 + 41.9537500 95.2608130 + 41.9558130 95.2587500 + 41.9579170 95.2566880 + 41.9579170 95.2524790 + 41.9599790 95.2504170 + 41.9641880 95.2504170 + 41.9683130 95.2462500 + 41.9808540 95.2462500 + 41.9829170 95.2441880 + 41.9829170 95.2399790 + 41.9849790 95.2379170 + 41.9870830 95.2358540 + 41.9850210 95.2337500 + 41.9829170 95.2316880 + 41.9829170 95.2191460 + 41.9849790 95.2170830 + 41.9870830 95.2150210 + 41.9891460 95.2129170 + 41.9912500 95.2108540 + 41.9912500 95.2024790 + 41.9933130 95.2004170 + 41.9975210 95.2004170 + 41.9995830 95.1983540 + 42.0016460 95.1962500 + 42.0037500 95.1941880 + 42.0058130 95.1920830 + 42.0079170 95.1900210 + 42.0079170 95.1858130 + 42.0099790 95.1837500 + 42.0120830 95.1816880 + 42.0141460 95.1795830 + 42.0162500 95.1775210 + 42.0183130 95.1754170 + 42.0204170 95.1733540 + 42.0183540 95.1712500 + 42.0162500 95.1691880 + 42.0141880 95.1670830 + 42.0120830 95.1650210 + 42.0120830 95.1441460 + 42.0141460 95.1420830 + 42.0162500 95.1400210 + 42.0162500 95.1274790 + 42.0183130 95.1254170 + 42.0225210 95.1254170 + 42.0245830 95.1233540 + 42.0245830 95.1191460 + 42.0266460 95.1170830 + 42.0287500 95.1150210 + 42.0287500 95.1066460 + 42.0308130 95.1045830 + 42.0329170 95.1025210 + 42.0308540 95.1004170 + 42.0287500 95.0983540 + 42.0266880 95.0962500 + 42.0245830 95.0941880 + 42.0225210 95.0920830 + 42.0204170 95.0900210 + 42.0204170 95.0816460 + 42.0224790 95.0795830 + 42.0245830 95.0775210 + 42.0245830 95.0649790 + 42.0370830 95.0525210 + 42.0370830 95.0441460 + 42.0391880 95.0420830 + 42.0412500 95.0420830 + 42.0412500 95.0358130 + 42.0391880 95.0337500 + 42.0370830 95.0316880 + 42.0370830 95.0233130 + 42.0350210 95.0212500 + 42.0266460 95.0212500 + 42.0245830 95.0191880 + 42.0225210 95.0170830 + 42.0183130 95.0170830 + 42.0162500 95.0150210 + 42.0141880 95.0129170 + 42.0099790 95.0129170 + 42.0079170 95.0108540 + 42.0079170 95.0066460 + 42.0058540 95.0045830 + 41.9933130 95.0045830 + 41.9912500 95.0025210 + 41.9912500 94.9983130 + 41.9850210 94.9920830 + 41.9724790 94.9920830 + 41.9704170 94.9900210 + 41.9704170 94.9858130 + 41.9683540 94.9837500 + 41.9641460 94.9837500 + 41.9620830 94.9816880 + 41.9620830 94.9774790 + 41.9600210 94.9754170 + 41.9558130 94.9754170 + 41.9537500 94.9733540 + 41.9537500 94.9691460 + 41.9516880 94.9670830 + 41.9433130 94.9670830 + 41.9412500 94.9650210 + 41.9391880 94.9629170 + 41.9308130 94.9629170 + 41.9287500 94.9608540 + 41.9266880 94.9587500 + 41.9224790 94.9587500 + 41.9204170 94.9608130 + 41.9204170 94.9650210 + 41.9183540 94.9670830 + 41.9162500 94.9691460 + 41.9141880 94.9712500 + 41.9120830 94.9733130 + 41.9141460 94.9754170 + 41.9162500 94.9774790 + 41.9162500 94.9858540 + 41.9141880 94.9879170 + 41.9120830 94.9899790 + 41.9100210 94.9920830 + 41.9016460 94.9920830 + 41.8995830 94.9900210 + 41.8995830 94.9858130 + 41.8975210 94.9837500 + 41.8933130 94.9837500 + 41.8891880 94.9795830 + 41.8766460 94.9795830 + 41.8745830 94.9733130 + 41.8725210 94.9712500 + 41.8704170 94.9691880 + 41.8683540 94.9670830 + 41.8662500 94.9650210 + 41.8641880 94.9629170 + 41.8620830 94.9608540 + 41.8600210 94.9587500 + 41.8579170 94.9566880 + 41.8558540 94.9545830 + 41.8516460 94.9545830 + 41.8495830 94.9525210 + 41.8495830 94.9441460 + 41.8475210 94.9420830 + 41.8454170 94.9400210 + 41.8454170 94.9358130 + 41.8433540 94.9337500 + 41.8370830 94.9316880 + 41.8350210 94.9295830 + 41.8308130 94.9295830 + 41.8287500 94.9275210 + 41.8266880 94.9212500 + 41.8120830 94.9191880 + 41.8100210 94.9170830 + 41.8058130 94.9170830 + 41.7954170 94.9274790 + 41.7933540 94.9295830 + 41.7912500 94.9316460 + 41.7912500 94.9441880 + 41.7891880 94.9462500 + 41.7849790 94.9462500 + 41.7829170 94.9441880 + 41.7808540 94.9420830 + 41.7787500 94.9441460 + 41.7766880 94.9462500 + 41.7745830 94.9483130 + 41.7745830 94.9566880 + 41.7725210 94.9587500 + 41.7704170 94.9608130 + 41.7683540 94.9629170 + 41.7662500 94.9649790 + 41.7641880 94.9670830 + 41.7620830 94.9691460 + 41.7620830 94.9733540 + 41.7600210 94.9754170 + 41.7474790 94.9754170 + 41.7454170 94.9733540 + 41.7433540 94.9712500 + 41.7308130 94.9712500 + 41.7287500 94.9733130 + 41.7266880 94.9754170 + 41.7183130 94.9712500 + 41.7162500 94.9712500 + 41.7100210 94.9837500 + 41.7058130 94.9837500 + 41.7037500 94.9858130 + 41.7037500 94.9983540 + 41.7058130 95.0004170 + 41.7100210 95.0004170 + 41.7120830 95.0024790 + 41.7100210 95.0129170 + 41.7037500 95.0149790 + 41.7037500 95.0400210 + 41.7016460 95.0420830 + 41.6995830 95.0441880 + 41.6975210 95.0462500 + 41.6933130 95.0462500 + 41.6912500 95.0483130 + 41.6912500 95.0608540 + 41.6933540 95.0629170 + 41.6954170 95.0649790 + 41.6954170 95.0691880 + 41.6933130 95.0712500 + 41.6912500 95.0733540 + 41.6891460 95.0754170 + 41.6870830 95.0774790 + 41.6870830 95.1066880 + 41.6891880 95.1087500 + 41.6912500 95.1108130 + 41.6912500 95.1191880 + 41.6891460 95.1212500 + 41.6870830 95.1233130 + 41.6870830 95.1275210 + 41.6849790 95.1295830 + 41.6829170 95.1316880 + 41.6808130 95.1337500 + 41.6787500 95.1358540 + 41.6766460 95.1379170 + 41.6745830 95.1400210 + 41.6725210 95.1420830 + 41.6683130 95.1420830 + 41.6495830 95.1608130 + 41.6495830 95.1650210 + 41.6475210 95.1670830 + 41.6391460 95.1670830 + 41.6370830 95.1691880 + 41.6350210 95.1712500 + 41.6308130 95.1712500 + 41.6287500 95.1733540 + 41.6266880 95.1754170 + 41.6224790 95.1754170 + 41.6204170 95.1733130 + 41.6183130 95.1712500 + 41.6162500 95.1691460 + 41.6141460 95.1670830 + 41.6120830 95.1649790 + 41.6100210 95.1629170 + 41.6058130 95.1629170 + 41.6037500 95.1649790 + 41.6037500 95.1691880 + 41.6016460 95.1712500 + 41.5995830 95.1733540 + 41.5974790 95.1754170 + 41.5954170 95.1774790 + 41.5954170 95.1816880 + 41.5933540 95.1837500 + 41.5891460 95.1837500 + 41.5870830 95.1858540 + 41.5850210 95.1879170 + 41.5808130 95.1879170 + 41.5787500 95.1900210 + 41.5766460 95.1920830 + 41.5745830 95.1899790 + 41.5725210 95.1879170 + 41.5683130 95.1879170 + 41.5662500 95.1900210 + 41.5641880 95.1920830 + 41.5558130 95.1920830 + 41.5537500 95.1941880 + 41.5516880 95.1962500 + 41.5474790 95.1962500 + 41.5454170 95.1983130 + 41.5454170 95.2066880 + 41.5433540 95.2087500 + 41.5391460 95.2087500 + 41.5370830 95.2108540 + 41.5350210 95.2129170 + 41.5308130 95.2129170 + 41.5287500 95.2150210 + 41.5308540 95.2170830 + 41.5329170 95.2191460 + 41.5329170 95.2275210 + 41.5350210 95.2295830 + 41.5370830 95.2316460 + 41.5266880 95.2504170 + 41.5224790 95.2504170 + 41.5204170 95.2483130 + 41.5183540 95.2462500 + 41.5141460 95.2462500 + 41.5120830 95.2441880 + 41.5120830 95.2399790 + 41.5100210 95.2379170 + 41.4891460 95.2379170 + 41.4870830 95.2400210 + 41.4849790 95.2420830 + 41.4829170 95.2400210 + 41.4829170 95.2358130 + 41.4808540 95.2337500 + 41.4683130 95.2337500 + 41.4662500 95.2337500 + 41.4495830 95.2524790 + 41.4495830 95.2608540 + 41.4475210 95.2629170 + 41.4433130 95.2629170 + 41.4412500 95.2649790 + 41.4412500 95.2816880 + 41.4391880 95.2837500 + 41.4141460 95.2837500 + 41.4120830 95.2858540 + 41.4100210 95.2879170 + 41.4058130 95.2879170 + 41.4037500 95.2899790 + 41.4037500 95.3066880 + 41.4058540 95.3087500 + 41.4079170 95.3108130 + 41.4079170 95.3150210 + 41.4058540 95.3170830 + 41.4016460 95.3170830 + 41.3995830 95.3191880 + 41.3975210 95.3212500 + 41.3849790 95.3212500 + 41.3829170 95.3233540 + 41.3808130 95.3254170 + 41.3787500 95.3274790 + 41.3787500 95.3316880 + 41.3808540 95.3337500 + 41.3829170 95.3358130 + 41.3829170 95.3608540 + 41.3850210 95.3629170 + 41.3870830 95.3649790 + 41.3870830 95.3691880 + 41.3891460 95.3712500 +1608 1608 -1 51 41.31000 95.43500 + 41.4700000 95.2300000 + 41.4300000 95.2000000 + 41.4200000 95.2200000 + 41.4000000 95.2000000 + 41.3800000 95.2300000 + 41.3500000 95.2300000 + 41.2800000 95.2300000 + 41.2700000 95.2200000 + 41.2200000 95.2200000 + 41.1300000 95.2800000 + 41.0800000 95.3200000 + 41.0700000 95.3300000 + 41.0200000 95.3500000 + 41.0000000 95.3700000 + 40.9700000 95.3800000 + 40.9800000 95.4200000 + 40.9300000 95.4300000 + 40.8700000 95.5300000 + 40.8700000 95.5800000 + 40.8700000 95.6000000 + 40.8800000 95.6700000 + 40.9300000 95.6700000 + 41.0300000 95.6700000 + 41.0700000 95.6700000 + 41.1500000 95.6500000 + 41.1800000 95.6200000 + 41.2200000 95.6300000 + 41.2700000 95.6300000 + 41.3500000 95.6000000 + 41.4200000 95.5200000 + 41.5000000 95.5000000 + 41.5300000 95.4500000 + 41.6000000 95.4300000 + 41.6700000 95.3800000 + 41.7000000 95.3800000 + 41.7300000 95.4000000 + 41.7500000 95.3800000 + 41.7000000 95.3500000 + 41.6000000 95.3700000 + 41.5700000 95.3800000 + 41.5500000 95.3800000 + 41.5200000 95.4000000 + 41.4700000 95.3800000 + 41.4700000 95.4000000 + 41.4000000 95.4200000 + 41.3800000 95.3800000 + 41.3800000 95.3300000 + 41.4000000 95.3200000 + 41.4000000 95.3000000 + 41.4300000 95.2800000 + 41.4700000 95.2300000 +1609 1609 -1 63 41.08500 95.27550 + 41.5700000 95.1800000 + 41.5700000 95.1700000 + 41.4500000 95.1700000 + 41.3200000 95.2000000 + 41.2800000 95.1800000 + 41.2700000 95.1700000 + 41.2300000 95.1700000 + 41.1500000 95.2000000 + 41.0200000 95.2700000 + 41.0200000 95.2300000 + 41.0200000 95.2200000 + 41.0500000 95.1700000 + 41.0300000 95.1500000 + 41.0000000 95.1700000 + 40.9800000 95.1700000 + 40.9700000 95.1800000 + 40.8800000 95.2000000 + 40.8700000 95.2300000 + 40.8000000 95.2300000 + 40.7700000 95.3000000 + 40.7300000 95.3200000 + 40.6700000 95.3700000 + 40.6700000 95.3800000 + 40.6300000 95.4300000 + 40.6300000 95.4500000 + 40.6000000 95.5000000 + 40.6000000 95.5700000 + 40.6200000 95.6000000 + 40.6300000 95.6300000 + 40.6500000 95.6700000 + 40.7000000 95.6500000 + 40.7200000 95.6700000 + 40.7500000 95.6500000 + 40.8000000 95.6500000 + 40.8000000 95.6700000 + 40.8200000 95.6800000 + 40.8500000 95.6700000 + 40.8800000 95.6700000 + 40.8700000 95.6000000 + 40.8700000 95.5800000 + 40.8700000 95.5300000 + 40.9300000 95.4300000 + 40.9800000 95.4200000 + 40.9700000 95.3800000 + 41.0000000 95.3700000 + 41.0200000 95.3500000 + 41.0700000 95.3300000 + 41.0800000 95.3200000 + 41.1300000 95.2800000 + 41.2200000 95.2200000 + 41.2700000 95.2200000 + 41.2800000 95.2300000 + 41.3500000 95.2300000 + 41.3800000 95.2300000 + 41.4000000 95.2000000 + 41.4200000 95.2200000 + 41.4300000 95.2000000 + 41.4700000 95.2300000 + 41.5000000 95.2500000 + 41.5300000 95.2500000 + 41.5300000 95.2200000 + 41.5500000 95.2000000 + 41.5700000 95.1800000 +1610 LITTLE NEMAHA RIVER AT AUBURN NE -1 486 40.58083 96.18583 + 40.3870830 95.8129170 + 40.3787500 95.8400210 + 40.3829170 95.8441880 + 40.3808130 95.8462500 + 40.3787500 95.8525210 + 40.3766880 95.8545830 + 40.3558130 95.8545830 + 40.3537500 95.8566880 + 40.3474790 95.8629170 + 40.3454170 95.8608130 + 40.3245830 95.8587500 + 40.3329170 95.8774790 + 40.3329170 95.8900210 + 40.3349790 95.8920830 + 40.3433540 95.8920830 + 40.3454170 95.8941880 + 40.3475210 95.8962500 + 40.3495830 95.8983540 + 40.3516880 95.9004170 + 40.3537500 95.9024790 + 40.3537500 95.9066880 + 40.3558540 95.9087500 + 40.3579170 95.9108540 + 40.3600210 95.9129170 + 40.3620830 95.9149790 + 40.3620830 95.9191880 + 40.3641880 95.9212500 + 40.3662500 95.9233540 + 40.3683540 95.9254170 + 40.3704170 95.9275210 + 40.3725210 95.9295830 + 40.3787500 95.9358130 + 40.3787500 95.9400210 + 40.3808540 95.9420830 + 40.3829170 95.9441460 + 40.3829170 95.9483540 + 40.3849790 95.9504170 + 40.4079170 95.9649790 + 40.4079170 95.9983540 + 40.4100210 96.0004170 + 40.4120830 96.0024790 + 40.4120830 96.0066880 + 40.4141880 96.0087500 + 40.4162500 96.0108130 + 40.4162500 96.0191880 + 40.4183130 96.0212500 + 40.4225210 96.0212500 + 40.4245830 96.0233130 + 40.4245830 96.0316880 + 40.4266880 96.0337500 + 40.4287500 96.0358540 + 40.4308540 96.0379170 + 40.4329170 96.0399790 + 40.4329170 96.0650210 + 40.4308130 96.0670830 + 40.4287500 96.0691460 + 40.4287500 96.0775210 + 40.4266880 96.0795830 + 40.4224790 96.0795830 + 40.4204170 96.0816880 + 40.4183130 96.0837500 + 40.4162500 96.0858540 + 40.4141880 96.0879170 + 40.4058130 96.0879170 + 40.4037500 96.0900210 + 40.4016460 96.0920830 + 40.3995830 96.0941880 + 40.3975210 96.0962500 + 40.3933130 96.0962500 + 40.3912500 96.0983540 + 40.3891460 96.1004170 + 40.3870830 96.0983130 + 40.3850210 96.0962500 + 40.3808130 96.0962500 + 40.3787500 96.0941460 + 40.3766460 96.0920830 + 40.3745830 96.0900210 + 40.3704170 96.0775210 + 40.3704170 96.0691460 + 40.3683540 96.0670830 + 40.3599790 96.0670830 + 40.3579170 96.0670830 + 40.3537500 96.0774790 + 40.3537500 96.0858540 + 40.3558540 96.0879170 + 40.3579170 96.0899790 + 40.3579170 96.1025210 + 40.3558540 96.1045830 + 40.3516460 96.1045830 + 40.3495830 96.1066460 + 40.3495830 96.1191880 + 40.3474790 96.1212500 + 40.3454170 96.1233540 + 40.3474790 96.1254170 + 40.3516880 96.1254170 + 40.3537500 96.1274790 + 40.3537500 96.1316880 + 40.3558130 96.1337500 + 40.3600210 96.1337500 + 40.3620830 96.1358540 + 40.3641460 96.1379170 + 40.3766880 96.1379170 + 40.3787500 96.1399790 + 40.3787500 96.1608540 + 40.3808130 96.1629170 + 40.3850210 96.1629170 + 40.3891460 96.1670830 + 40.3975210 96.1670830 + 40.3995830 96.1691880 + 40.4016880 96.1712500 + 40.4037500 96.1733130 + 40.4037500 96.1816880 + 40.4037500 96.1837500 + 40.4141460 96.1920830 + 40.4183540 96.1920830 + 40.4204170 96.1941460 + 40.4204170 96.2191880 + 40.4224790 96.2212500 + 40.4266880 96.2212500 + 40.4287500 96.2233540 + 40.4308540 96.2254170 + 40.4329170 96.2274790 + 40.4329170 96.2316880 + 40.4370830 96.2358130 + 40.4370830 96.2400210 + 40.4350210 96.2420830 + 40.4308130 96.2420830 + 40.4287500 96.2525210 + 40.4308540 96.2545830 + 40.4329170 96.2566460 + 40.4329170 96.2608540 + 40.4308130 96.2629170 + 40.4287500 96.2650210 + 40.4308540 96.2670830 + 40.4329170 96.2691880 + 40.4350210 96.2712500 + 40.4370830 96.2733540 + 40.4391460 96.2754170 + 40.4433540 96.2754170 + 40.4454170 96.2775210 + 40.4475210 96.2795830 + 40.4495830 96.2816460 + 40.4495830 96.2858540 + 40.4537500 96.2899790 + 40.4537500 96.3066880 + 40.4558540 96.3087500 + 40.4579170 96.3108540 + 40.4600210 96.3129170 + 40.4620830 96.3149790 + 40.4620830 96.3233540 + 40.4641460 96.3254170 + 40.4683540 96.3254170 + 40.4704170 96.3274790 + 40.4704170 96.3358540 + 40.4683130 96.3379170 + 40.4662500 96.3400210 + 40.4683540 96.3420830 + 40.4704170 96.3441460 + 40.4704170 96.3525210 + 40.4725210 96.3545830 + 40.4745830 96.3566460 + 40.4745830 96.3608540 + 40.4766460 96.3629170 + 40.4933540 96.3629170 + 40.4954170 96.3650210 + 40.4974790 96.3670830 + 40.5016880 96.3670830 + 40.5037500 96.3691880 + 40.5058130 96.3712500 + 40.5204170 96.3774790 + 40.5204170 96.3941880 + 40.5225210 96.3962500 + 40.5245830 96.3983130 + 40.5329170 96.4191460 + 40.5329170 96.4275210 + 40.5350210 96.4295830 + 40.5370830 96.4316880 + 40.5391460 96.4337500 + 40.5433540 96.4337500 + 40.5454170 96.4358540 + 40.5475210 96.4379170 + 40.5495830 96.4400210 + 40.5516460 96.4420830 + 40.5579170 96.4441460 + 40.5579170 96.4483540 + 40.5600210 96.4504170 + 40.5620830 96.4524790 + 40.5620830 96.4566880 + 40.5641880 96.4587500 + 40.5662500 96.4608130 + 40.5662500 96.4650210 + 40.5683540 96.4670830 + 40.5704170 96.4691880 + 40.5725210 96.4712500 + 40.5745830 96.4733540 + 40.5766880 96.4754170 + 40.5787500 96.4774790 + 40.5787500 96.4900210 + 40.5808540 96.4920830 + 40.5829170 96.4941880 + 40.5850210 96.4962500 + 40.5870830 96.4983540 + 40.5891880 96.5004170 + 40.5912500 96.5025210 + 40.5933130 96.5045830 + 40.6016880 96.5045830 + 40.6037500 96.5066880 + 40.6058130 96.5087500 + 40.6120830 96.5108540 + 40.6120830 96.5129170 + 40.6224790 96.5212500 + 40.6308540 96.5212500 + 40.6329170 96.5233130 + 40.6329170 96.5275210 + 40.6350210 96.5295830 + 40.6370830 96.5316880 + 40.6391460 96.5337500 + 40.6433540 96.5337500 + 40.6495830 96.5399790 + 40.6495830 96.5441880 + 40.6537500 96.5483130 + 40.6579170 96.5566460 + 40.6599790 96.5629170 + 40.6683540 96.5629170 + 40.6724790 96.5670830 + 40.6808130 96.5712500 + 40.6891880 96.5712500 + 40.6912500 96.5733540 + 40.6933130 96.5754170 + 40.6975210 96.5754170 + 40.6995830 96.5754170 + 40.6995830 96.5649790 + 40.7016460 96.5629170 + 40.7058540 96.5629170 + 40.7079170 96.5608540 + 40.7079170 96.5524790 + 40.7099790 96.5504170 + 40.7120830 96.5483540 + 40.7120830 96.5274790 + 40.7141460 96.5254170 + 40.7162500 96.5233540 + 40.7183130 96.5212500 + 40.7225210 96.5212500 + 40.7245830 96.5233130 + 40.7266460 96.5254170 + 40.7308540 96.5254170 + 40.7329170 96.5233540 + 40.7349790 96.5212500 + 40.7370830 96.5191880 + 40.7391460 96.5170830 + 40.7412500 96.5150210 + 40.7433130 96.5129170 + 40.7579170 96.5108540 + 40.7620830 96.5066880 + 40.7620830 96.4983130 + 40.7641460 96.4962500 + 40.7683130 96.4920830 + 40.7725210 96.4920830 + 40.7745830 96.4941460 + 40.7766460 96.4962500 + 40.7829170 96.4941880 + 40.7849790 96.4920830 + 40.8100210 96.4920830 + 40.8120830 96.4941460 + 40.8141460 96.4962500 + 40.8183540 96.4962500 + 40.8204170 96.4941880 + 40.8204170 96.4899790 + 40.8183540 96.4879170 + 40.8162500 96.4858540 + 40.8162500 96.4733130 + 40.8141880 96.4712500 + 40.8120830 96.4691880 + 40.8162500 96.4566880 + 40.8162500 96.4066460 + 40.8204170 96.4025210 + 40.8204170 96.3983130 + 40.8225210 96.3962500 + 40.8245830 96.3962500 + 40.8245830 96.3899790 + 40.8225210 96.3879170 + 40.8204170 96.3858540 + 40.8183540 96.3837500 + 40.8162500 96.3816880 + 40.8183130 96.3795830 + 40.8204170 96.3775210 + 40.8204170 96.3691460 + 40.8183540 96.3670830 + 40.8141460 96.3670830 + 40.8120830 96.3650210 + 40.8120830 96.3399790 + 40.8100210 96.3379170 + 40.8079170 96.3358540 + 40.8058540 96.3337500 + 40.8037500 96.3316880 + 40.8016880 96.3295830 + 40.7995830 96.3275210 + 40.7975210 96.3254170 + 40.7954170 96.3233540 + 40.7954170 96.3108130 + 40.7933540 96.3087500 + 40.7912500 96.3066880 + 40.7912500 96.2941460 + 40.7891880 96.2920830 + 40.7870830 96.2900210 + 40.7870830 96.2858130 + 40.7891460 96.2837500 + 40.7912500 96.2816880 + 40.7933130 96.2795830 + 40.8016880 96.2795830 + 40.8037500 96.2775210 + 40.8058130 96.2754170 + 40.8266880 96.2754170 + 40.8287500 96.2733540 + 40.8308130 96.2712500 + 40.8329170 96.2691880 + 40.8329170 96.2649790 + 40.8349790 96.2629170 + 40.8370830 96.2608540 + 40.8370830 96.2566460 + 40.8391460 96.2545830 + 40.8412500 96.2525210 + 40.8412500 96.2483130 + 40.8391880 96.2462500 + 40.8370830 96.2441880 + 40.8370830 96.2399790 + 40.8350210 96.2379170 + 40.8329170 96.2358540 + 40.8329170 96.2191460 + 40.8308540 96.2170830 + 40.8266460 96.2170830 + 40.8245830 96.2150210 + 40.8225210 96.2129170 + 40.8204170 96.2108540 + 40.8183540 96.2087500 + 40.8162500 96.2066880 + 40.8141880 96.2045830 + 40.8058130 96.2045830 + 40.8037500 96.2025210 + 40.8016880 96.2004170 + 40.7933130 96.2004170 + 40.7912500 96.1983540 + 40.7891880 96.1962500 + 40.7849790 96.1962500 + 40.7829170 96.1941880 + 40.7829170 96.1899790 + 40.7808540 96.1879170 + 40.7766880 96.1837500 + 40.7745830 96.1816880 + 40.7745830 96.1483130 + 40.7725210 96.1462500 + 40.7704170 96.1441880 + 40.7704170 96.1399790 + 40.7683540 96.1379170 + 40.7662500 96.1358540 + 40.7662500 96.1316460 + 40.7641880 96.1295830 + 40.7620830 96.1275210 + 40.7620830 96.0983130 + 40.7600210 96.0962500 + 40.7579170 96.0941880 + 40.7558540 96.0920830 + 40.7537500 96.0900210 + 40.7516880 96.0879170 + 40.7474790 96.0879170 + 40.7454170 96.0858540 + 40.7454170 96.0816460 + 40.7433540 96.0795830 + 40.7412500 96.0775210 + 40.7391880 96.0754170 + 40.7349790 96.0754170 + 40.7329170 96.0733540 + 40.7329170 96.0608130 + 40.7308540 96.0587500 + 40.7287500 96.0566880 + 40.7266880 96.0545830 + 40.7245830 96.0525210 + 40.7245830 96.0483130 + 40.7225210 96.0462500 + 40.7204170 96.0441880 + 40.7224790 96.0420830 + 40.7245830 96.0400210 + 40.7245830 96.0358130 + 40.7225210 96.0337500 + 40.7204170 96.0316880 + 40.7204170 95.9899790 + 40.7058130 95.9837500 + 40.6974790 95.9712500 + 40.6995830 95.9691880 + 40.6995830 95.9524790 + 40.6975210 95.9504170 + 40.6891460 95.9504170 + 40.6870830 95.9483540 + 40.6870830 95.9441460 + 40.6850210 95.9420830 + 40.6808130 95.9420830 + 40.6787500 95.9441460 + 40.6766880 95.9462500 + 40.6683130 95.9462500 + 40.6662500 95.9441880 + 40.6641880 95.9420830 + 40.6558130 95.9420830 + 40.6537500 95.9400210 + 40.6516880 95.9379170 + 40.6474790 95.9379170 + 40.6454170 95.9358540 + 40.6454170 95.9316460 + 40.6433540 95.9295830 + 40.6308130 95.9295830 + 40.6287500 95.9316460 + 40.6287500 95.9358540 + 40.6245830 95.9358540 + 40.6245830 95.9274790 + 40.6266460 95.9254170 + 40.6287500 95.9233540 + 40.6308130 95.9212500 + 40.6329170 95.9191880 + 40.6329170 95.8983130 + 40.6287500 95.8941880 + 40.6266880 95.8920830 + 40.6224790 95.8920830 + 40.6204170 95.8900210 + 40.6183540 95.8879170 + 40.6099790 95.8879170 + 40.6079170 95.8858540 + 40.6037500 95.8816880 + 40.6016880 95.8754170 + 40.5766460 95.8754170 + 40.5745830 95.8733540 + 40.5745830 95.8691460 + 40.5725210 95.8670830 + 40.5683130 95.8670830 + 40.5662500 95.8650210 + 40.5641880 95.8629170 + 40.5433130 95.8629170 + 40.5412500 95.8608540 + 40.5391880 95.8587500 + 40.5370830 95.8566880 + 40.5329170 95.8525210 + 40.5308540 95.8504170 + 40.5266460 95.8504170 + 40.5245830 95.8483540 + 40.5225210 95.8462500 + 40.5141460 95.8462500 + 40.5120830 95.8441880 + 40.5100210 95.8420830 + 40.5058130 95.8420830 + 40.5037500 95.8400210 + 40.5016880 95.8379170 + 40.4933130 95.8379170 + 40.4912500 95.8399790 + 40.4891880 95.8420830 + 40.4870830 95.8400210 + 40.4850210 95.8379170 + 40.4829170 95.8358540 + 40.4808540 95.8337500 + 40.4787500 95.8316880 + 40.4766880 95.8295830 + 40.4683130 95.8295830 + 40.4662500 95.8275210 + 40.4641880 95.8254170 + 40.4620830 95.8233540 + 40.4620830 95.8191460 + 40.4600210 95.8170830 + 40.4579170 95.8150210 + 40.4579170 95.8108130 + 40.4537500 95.8024790 + 40.4516880 95.8004170 + 40.4495830 95.7983540 + 40.4475210 95.7962500 + 40.4454170 95.7941880 + 40.4433540 95.7920830 + 40.4412500 95.7900210 + 40.4391880 95.7879170 + 40.4349790 95.7879170 + 40.4266460 95.7920830 + 40.4245830 95.7941460 + 40.4245830 95.7983540 + 40.4225210 95.8004170 + 40.4204170 95.8024790 + 40.4183540 95.8045830 + 40.4141460 95.8045830 + 40.4120830 95.8066460 + 40.4100210 95.8087500 + 40.3974790 95.8087500 + 40.3870830 95.8129170 +1611 1611 -1 30 40.95000 95.17500 + 41.2000000 95.0500000 + 41.1300000 95.0500000 + 41.1200000 95.0500000 + 41.0800000 95.0500000 + 41.0700000 95.0300000 + 41.0000000 95.0500000 + 41.0000000 95.0700000 + 40.9500000 95.0500000 + 40.9300000 95.0500000 + 40.8700000 95.0700000 + 40.7800000 95.0800000 + 40.7700000 95.0800000 + 40.7500000 95.0800000 + 40.7300000 95.1000000 + 40.7000000 95.1300000 + 40.7000000 95.2200000 + 40.7300000 95.3200000 + 40.7700000 95.3000000 + 40.8000000 95.2300000 + 40.8700000 95.2300000 + 40.8800000 95.2000000 + 40.9700000 95.1800000 + 40.9800000 95.1700000 + 41.0000000 95.1700000 + 41.0300000 95.1500000 + 41.0500000 95.1300000 + 41.1000000 95.1200000 + 41.1200000 95.1000000 + 41.2000000 95.0700000 + 41.2000000 95.0500000 +1612 1612 -1 29 40.53000 95.30500 + 40.7300000 95.3200000 + 40.7000000 95.2200000 + 40.7000000 95.1300000 + 40.6800000 95.1300000 + 40.6200000 95.1800000 + 40.5700000 95.1800000 + 40.5500000 95.1800000 + 40.5000000 95.1800000 + 40.4800000 95.2000000 + 40.4800000 95.2300000 + 40.4200000 95.2800000 + 40.4200000 95.3200000 + 40.4000000 95.3500000 + 40.3800000 95.3700000 + 40.3500000 95.3800000 + 40.3300000 95.4200000 + 40.3300000 95.4300000 + 40.3500000 95.4500000 + 40.3700000 95.4500000 + 40.3800000 95.4700000 + 40.4200000 95.4700000 + 40.4300000 95.4800000 + 40.4700000 95.4700000 + 40.4800000 95.4500000 + 40.5300000 95.4500000 + 40.6300000 95.3800000 + 40.6700000 95.3800000 + 40.6700000 95.3700000 + 40.7300000 95.3200000 +1613 1613 -1 29 40.43770 96.48228 + 40.6243200 96.5290300 + 40.5264900 96.4103700 + 40.5266100 96.3710600 + 40.4677200 96.3445700 + 40.4189000 96.2004200 + 40.3697900 96.1872100 + 40.3696300 96.2787300 + 40.3204000 96.3177300 + 40.3203000 96.3569300 + 40.2711400 96.3697400 + 40.2807500 96.4350800 + 40.2511900 96.4610100 + 40.2510900 96.4871100 + 40.3395200 96.4877100 + 40.3688300 96.5271400 + 40.4179600 96.5275000 + 40.3980800 96.5796700 + 40.4372600 96.6061600 + 40.4664100 96.6718700 + 40.5057800 96.6591400 + 40.5253000 96.6855300 + 40.5346000 96.7773500 + 40.5741300 96.7384500 + 40.5744300 96.6860000 + 40.5450900 96.6595100 + 40.5649400 96.6203600 + 40.5454100 96.5939700 + 40.5751800 96.5286600 + 40.6243200 96.5290300 +1614 1614 -1 22 40.09950 96.28455 + 40.1729200 96.3561900 + 40.2220500 96.3564400 + 40.2315800 96.4478300 + 40.2511900 96.4610100 + 40.2807500 96.4350800 + 40.2711400 96.3697400 + 40.3203000 96.3569300 + 40.3204000 96.3177300 + 40.1144000 96.1474600 + 40.1046000 96.1213900 + 39.9277800 96.1080900 + 39.9179500 96.1210700 + 39.9277100 96.1730700 + 39.8785700 96.1859300 + 39.8785100 96.2248800 + 39.8981600 96.2249500 + 39.9273300 96.3549700 + 39.9960900 96.3553200 + 40.0844700 96.3687700 + 40.1140500 96.3298500 + 40.1533500 96.3300200 + 40.1729200 96.3561900 +1615 1615 -1 17 39.81000 96.01058 + 39.9179500 96.1210700 + 39.9278100 96.0691100 + 39.9671100 96.0431500 + 39.9670900 95.9131400 + 39.9277200 95.8352300 + 39.8786600 95.8872800 + 39.6822500 95.9782300 + 39.6724300 96.0041300 + 39.6527900 95.9911900 + 39.6527800 96.0300200 + 39.6724100 96.0688700 + 39.7214900 96.1207400 + 39.7804300 96.1078700 + 39.7902100 96.1468000 + 39.8785700 96.1859300 + 39.9277100 96.1730700 + 39.9179500 96.1210700 +1616 1616 -1 18 40.24700 96.12182 + 40.1046000 96.1213900 + 40.1144000 96.1474600 + 40.3204000 96.3177300 + 40.3696300 96.2787300 + 40.3697900 96.1872100 + 40.4189000 96.2004200 + 40.3600500 96.1218300 + 40.3600800 96.0826000 + 40.3011500 95.9780400 + 40.1930500 95.9259100 + 40.1341100 95.9390000 + 40.1341300 95.9781000 + 40.1046500 95.9781000 + 40.1046600 96.0171800 + 40.0751700 96.0562400 + 40.0751500 96.0953000 + 40.1046200 96.0953400 + 40.1046000 96.1213900 +1617 1617 -1 27 40.04560 95.86095 + 40.1930500 95.9259100 + 40.1733900 95.8998600 + 40.1733000 95.8216200 + 40.0845600 95.6655800 + 40.0745500 95.6005200 + 39.9468400 95.6012300 + 39.9273100 95.6403200 + 39.9469900 95.6532200 + 39.9471000 95.6922100 + 39.9176900 95.7183200 + 39.8981900 95.7963300 + 39.8982100 95.8093200 + 39.9277200 95.8352300 + 39.9670900 95.9131400 + 39.9671100 96.0431500 + 39.9278100 96.0691100 + 39.9179500 96.1210700 + 39.9277800 96.1080900 + 40.1046000 96.1213900 + 40.1046200 96.0953400 + 40.0751500 96.0953000 + 40.0751700 96.0562400 + 40.1046600 96.0171800 + 40.1046500 95.9781000 + 40.1341300 95.9781000 + 40.1341100 95.9390000 + 40.1930500 95.9259100 +1618 NODAWAY RIVER AT CLARINDA IA -1 540 41.11000 94.86083 + 40.7370830 95.0129170 + 40.7412500 95.0566880 + 40.7454170 95.0608130 + 40.7454170 95.0733540 + 40.7475210 95.0754170 + 40.7495830 95.0774790 + 40.7495830 95.0816880 + 40.7516880 95.0837500 + 40.7537500 95.0858540 + 40.7537500 95.0879170 + 40.7600210 95.0879170 + 40.7620830 95.0858540 + 40.7724790 95.0754170 + 40.7745830 95.0774790 + 40.7766460 95.0795830 + 40.7787500 95.0816460 + 40.7808130 95.0837500 + 40.7850210 95.0837500 + 40.7870830 95.0858130 + 40.7891460 95.0879170 + 40.7933540 95.0879170 + 40.7954170 95.0858540 + 40.7974790 95.0837500 + 40.7995830 95.0858130 + 40.8016460 95.0879170 + 40.8058540 95.0879170 + 40.8079170 95.0899790 + 40.8099790 95.0920830 + 40.8120830 95.0900210 + 40.8141460 95.0879170 + 40.8225210 95.0879170 + 40.8245830 95.0858540 + 40.8266460 95.0837500 + 40.8350210 95.0837500 + 40.8370830 95.0816880 + 40.8391460 95.0795830 + 40.8558540 95.0795830 + 40.8579170 95.0775210 + 40.8599790 95.0754170 + 40.8766880 95.0754170 + 40.8787500 95.0733540 + 40.8787500 95.0691460 + 40.8808130 95.0670830 + 40.8829170 95.0650210 + 40.8829170 95.0608130 + 40.8849790 95.0587500 + 40.8870830 95.0566880 + 40.8891460 95.0545830 + 40.8912500 95.0566460 + 40.8933130 95.0587500 + 40.8954170 95.0608130 + 40.8974790 95.0629170 + 40.9058540 95.0629170 + 40.9079170 95.0608540 + 40.9099790 95.0587500 + 40.9120830 95.0566880 + 40.9141460 95.0545830 + 40.9162500 95.0525210 + 40.9183130 95.0504170 + 40.9245830 95.0483540 + 40.9266460 95.0462500 + 40.9350210 95.0462500 + 40.9370830 95.0483130 + 40.9370830 95.0566880 + 40.9391460 95.0587500 + 40.9412500 95.0608130 + 40.9474790 95.0670830 + 40.9641880 95.0670830 + 40.9662500 95.0650210 + 40.9683130 95.0629170 + 40.9725210 95.0629170 + 40.9745830 95.0649790 + 40.9766460 95.0670830 + 40.9975210 95.0670830 + 40.9995830 95.0650210 + 41.0016460 95.0629170 + 41.0058540 95.0629170 + 41.0079170 95.0608540 + 41.0099790 95.0587500 + 41.0120830 95.0566880 + 41.0141460 95.0545830 + 41.0183540 95.0545830 + 41.0204170 95.0566460 + 41.0224790 95.0587500 + 41.0266880 95.0587500 + 41.0287500 95.0566880 + 41.0308130 95.0545830 + 41.0350210 95.0545830 + 41.0370830 95.0525210 + 41.0391460 95.0504170 + 41.0412500 95.0483540 + 41.0433130 95.0462500 + 41.0454170 95.0441880 + 41.0474790 95.0420830 + 41.0516880 95.0420830 + 41.0537500 95.0441460 + 41.0558130 95.0462500 + 41.0600210 95.0462500 + 41.0620830 95.0483130 + 41.0620830 95.0525210 + 41.0641460 95.0545830 + 41.0725210 95.0545830 + 41.0745830 95.0566460 + 41.0745830 95.0608540 + 41.0766460 95.0629170 + 41.0808130 95.0670830 + 41.0954170 95.0650210 + 41.0974790 95.0629170 + 41.0995830 95.0608540 + 41.1016460 95.0587500 + 41.1058540 95.0587500 + 41.1079170 95.0566880 + 41.1099790 95.0545830 + 41.1141880 95.0545830 + 41.1162500 95.0566460 + 41.1183130 95.0587500 + 41.1266880 95.0587500 + 41.1287500 95.0608130 + 41.1308130 95.0629170 + 41.1329170 95.0649790 + 41.1349790 95.0670830 + 41.1370830 95.0650210 + 41.1391460 95.0629170 + 41.1516880 95.0629170 + 41.1537500 95.0649790 + 41.1558130 95.0670830 + 41.1579170 95.0650210 + 41.1766880 95.0629170 + 41.1787500 95.0649790 + 41.1850210 95.0670830 + 41.1870830 95.0650210 + 41.1975210 95.0629170 + 41.1995830 95.0608540 + 41.2016460 95.0587500 + 41.2079170 95.0608130 + 41.2099790 95.0629170 + 41.2433540 95.0629170 + 41.2454170 95.0608540 + 41.2474790 95.0587500 + 41.2558540 95.0587500 + 41.2579170 95.0566880 + 41.2599790 95.0545830 + 41.2641880 95.0545830 + 41.2662500 95.0525210 + 41.2683130 95.0504170 + 41.2808540 95.0504170 + 41.2933540 95.0462500 + 41.2954170 95.0462500 + 41.2974790 95.0045830 + 41.3037500 95.0025210 + 41.3037500 94.9483130 + 41.3058130 94.9462500 + 41.3079170 94.9441880 + 41.3079170 94.9274790 + 41.3058540 94.9254170 + 41.2974790 94.9254170 + 41.2954170 94.9233540 + 41.2954170 94.9108130 + 41.2974790 94.9087500 + 41.2995830 94.9066880 + 41.3016460 94.9045830 + 41.3058540 94.9045830 + 41.3079170 94.9025210 + 41.3079170 94.8858130 + 41.3099790 94.8837500 + 41.3120830 94.8816880 + 41.3141460 94.8795830 + 41.3183540 94.8795830 + 41.3204170 94.8775210 + 41.3204170 94.8608130 + 41.3224790 94.8587500 + 41.3245830 94.8566880 + 41.3266460 94.8545830 + 41.3308540 94.8545830 + 41.3329170 94.8525210 + 41.3349790 94.8504170 + 41.3370830 94.8483540 + 41.3370830 94.8441460 + 41.3391460 94.8420830 + 41.3412500 94.8400210 + 41.3412500 94.8274790 + 41.3391880 94.8254170 + 41.3370830 94.8233540 + 41.3391460 94.8212500 + 41.3412500 94.8191880 + 41.3433130 94.8170830 + 41.3454170 94.8150210 + 41.3474790 94.8129170 + 41.3641880 94.8129170 + 41.3662500 94.8108540 + 41.3662500 94.8066460 + 41.3683130 94.8045830 + 41.3704170 94.8025210 + 41.3704170 94.7983130 + 41.3808130 94.7879170 + 41.3829170 94.7899790 + 41.3849790 94.7920830 + 41.3891880 94.7920830 + 41.3912500 94.7900210 + 41.3933130 94.7879170 + 41.3954170 94.7858540 + 41.3974790 94.7837500 + 41.4016880 94.7837500 + 41.4037500 94.7816880 + 41.4037500 94.7566460 + 41.4058130 94.7545830 + 41.4100210 94.7545830 + 41.4120830 94.7525210 + 41.4120830 94.7483130 + 41.4141460 94.7462500 + 41.4162500 94.7441880 + 41.4183130 94.7420830 + 41.4225210 94.7420830 + 41.4245830 94.7400210 + 41.4266460 94.7379170 + 41.4308540 94.7379170 + 41.4329170 94.7358540 + 41.4329170 94.7316460 + 41.4349790 94.7295830 + 41.4391880 94.7295830 + 41.4412500 94.7275210 + 41.4412500 94.7191460 + 41.4495830 94.7108540 + 41.4495830 94.7024790 + 41.4516460 94.7004170 + 41.4537500 94.6983540 + 41.4537500 94.6899790 + 41.4558130 94.6879170 + 41.4579170 94.6858540 + 41.4599790 94.6837500 + 41.4620830 94.6816880 + 41.4620830 94.6774790 + 41.4641460 94.6754170 + 41.4662500 94.6733540 + 41.4683130 94.6712500 + 41.4704170 94.6691880 + 41.4724790 94.6670830 + 41.4745830 94.6650210 + 41.4745830 94.6566460 + 41.4766460 94.6545830 + 41.4787500 94.6525210 + 41.4808130 94.6504170 + 41.4829170 94.6483540 + 41.4829170 94.6358130 + 41.4808540 94.6337500 + 41.4787500 94.6316880 + 41.4787500 94.6233130 + 41.4766880 94.6212500 + 41.4745830 94.6191880 + 41.4725210 94.6170830 + 41.4704170 94.6150210 + 41.4683540 94.6129170 + 41.4558130 94.6129170 + 41.4537500 94.6108540 + 41.4537500 94.5983130 + 41.4516880 94.5962500 + 41.4495830 94.5941880 + 41.4475210 94.5920830 + 41.4454170 94.5900210 + 41.4454170 94.5816460 + 41.4433540 94.5795830 + 41.4349790 94.5795830 + 41.4329170 94.5775210 + 41.4308540 94.5754170 + 41.4225210 94.5712500 + 41.4120830 94.5650210 + 41.4079170 94.5566880 + 41.4079170 94.5524790 + 41.4099790 94.5504170 + 41.4120830 94.5483540 + 41.4120830 94.5399790 + 41.4141460 94.5379170 + 41.4162500 94.5358540 + 41.4162500 94.5316460 + 41.4183130 94.5295830 + 41.4204170 94.5316460 + 41.4224790 94.5337500 + 41.4308540 94.5337500 + 41.4329170 94.5358130 + 41.4349790 94.5379170 + 41.4475210 94.5379170 + 41.4495830 94.5399790 + 41.4516460 94.5420830 + 41.4537500 94.5400210 + 41.4558130 94.5379170 + 41.4579170 94.5358540 + 41.4579170 94.5274790 + 41.4558540 94.5254170 + 41.4537500 94.5233540 + 41.4537500 94.5191460 + 41.4516880 94.5170830 + 41.4495830 94.5191460 + 41.4475210 94.5212500 + 41.4349790 94.5212500 + 41.4329170 94.5191880 + 41.4308540 94.5170830 + 41.4287500 94.5150210 + 41.4266880 94.5129170 + 41.4224790 94.5129170 + 41.4204170 94.5108540 + 41.4183540 94.5087500 + 41.4016460 94.5087500 + 41.3891460 94.5004170 + 41.3808130 94.4962500 + 41.3787500 94.4941880 + 41.3766880 94.4920830 + 41.3724790 94.4920830 + 41.3704170 94.4900210 + 41.3704170 94.4858130 + 41.3683540 94.4837500 + 41.3641460 94.4837500 + 41.3620830 94.4816880 + 41.3620830 94.4566460 + 41.3641460 94.4545830 + 41.3662500 94.4525210 + 41.3641880 94.4379170 + 41.3516460 94.4379170 + 41.3495830 94.4399790 + 41.3475210 94.4420830 + 41.3391460 94.4420830 + 41.3370830 94.4400210 + 41.3350210 94.4379170 + 41.3329170 94.4399790 + 41.3308540 94.4420830 + 41.3141460 94.4420830 + 41.3120830 94.4441460 + 41.3100210 94.4462500 + 41.3079170 94.4483130 + 41.3079170 94.4566880 + 41.3058540 94.4587500 + 41.3037500 94.4608130 + 41.3016880 94.4629170 + 41.2891460 94.4629170 + 41.2870830 94.4608540 + 41.2850210 94.4587500 + 41.2787500 94.4733540 + 41.2766880 94.4754170 + 41.2745830 94.4774790 + 41.2725210 94.4795830 + 41.2683540 94.4754170 + 41.2662500 94.4733540 + 41.2641880 94.4712500 + 41.2599790 94.4754170 + 41.2579170 94.4754170 + 41.2495830 94.4899790 + 41.2495830 94.4941880 + 41.2474790 94.4962500 + 41.2454170 94.4983540 + 41.2433540 94.5004170 + 41.2370830 94.5024790 + 41.2370830 94.5191880 + 41.2349790 94.5212500 + 41.2329170 94.5233540 + 41.2308540 94.5254170 + 41.2224790 94.5254170 + 41.2204170 94.5275210 + 41.2183540 94.5295830 + 41.2079170 94.5358130 + 41.2079170 94.5441880 + 41.2058130 94.5462500 + 41.2037500 94.5483540 + 41.2016880 94.5504170 + 41.1891460 94.5504170 + 41.1849790 94.5545830 + 41.1829170 94.5524790 + 41.1808540 94.5504170 + 41.1766460 94.5504170 + 41.1745830 94.5524790 + 41.1724790 94.5629170 + 41.1704170 94.5649790 + 41.1683540 94.5712500 + 41.1620830 94.5733130 + 41.1620830 94.5775210 + 41.1579170 94.5816460 + 41.1558540 94.5879170 + 41.1474790 94.5879170 + 41.1454170 94.5899790 + 41.1454170 94.6108540 + 41.1433130 94.6129170 + 41.1412500 94.6149790 + 41.1391880 94.6212500 + 41.1287500 94.6233130 + 41.1245830 94.6358130 + 41.1245830 94.6400210 + 41.1224790 94.6420830 + 41.1204170 94.6441460 + 41.1204170 94.6483540 + 41.1183130 94.6504170 + 41.1162500 94.6524790 + 41.1162500 94.6566880 + 41.1183540 94.6587500 + 41.1204170 94.6608540 + 41.1183130 94.6629170 + 41.1162500 94.6650210 + 41.1141880 94.6670830 + 41.1099790 94.6670830 + 41.1079170 94.6691460 + 41.1079170 94.6733540 + 41.1058130 94.6754170 + 41.1037500 94.6774790 + 41.1037500 94.6816880 + 41.1016460 94.6837500 + 41.0995830 94.6858130 + 41.0995830 94.6983540 + 41.0974790 94.7004170 + 41.0954170 94.7025210 + 41.0933130 94.7045830 + 41.0912500 94.7066460 + 41.0912500 94.7150210 + 41.0891460 94.7170830 + 41.0870830 94.7191460 + 41.0870830 94.7233540 + 41.0849790 94.7254170 + 41.0829170 94.7274790 + 41.0829170 94.7358540 + 41.0808130 94.7379170 + 41.0787500 94.7400210 + 41.0766460 94.7420830 + 41.0745830 94.7441880 + 41.0724790 94.7462500 + 41.0704170 94.7483130 + 41.0704170 94.7566880 + 41.0683130 94.7587500 + 41.0662500 94.7608130 + 41.0662500 94.7650210 + 41.0641460 94.7670830 + 41.0620830 94.7691880 + 41.0599790 94.7712500 + 41.0579170 94.7733540 + 41.0558540 94.7754170 + 41.0516460 94.7754170 + 41.0495830 94.7775210 + 41.0474790 94.7795830 + 41.0454170 94.7816880 + 41.0433130 94.7837500 + 41.0412500 94.7858540 + 41.0391460 94.7879170 + 41.0370830 94.7900210 + 41.0349790 94.7920830 + 41.0329170 94.7941460 + 41.0329170 94.7983540 + 41.0308130 94.8004170 + 41.0287500 94.8025210 + 41.0308540 94.8045830 + 41.0329170 94.8066880 + 41.0308130 94.8087500 + 41.0287500 94.8108540 + 41.0266880 94.8129170 + 41.0183130 94.8129170 + 41.0162500 94.8150210 + 41.0141880 94.8170830 + 41.0099790 94.8170830 + 41.0079170 94.8191460 + 41.0079170 94.8400210 + 41.0058540 94.8420830 + 41.0016460 94.8420830 + 40.9995830 94.8441460 + 40.9995830 94.8525210 + 41.0016880 94.8545830 + 41.0037500 94.8566880 + 41.0016460 94.8587500 + 40.9995830 94.8608130 + 40.9995830 94.8691880 + 40.9974790 94.8712500 + 40.9954170 94.8733540 + 40.9933130 94.8754170 + 40.9912500 94.8774790 + 40.9912500 94.8941880 + 40.9891880 94.8962500 + 40.9808130 94.8962500 + 40.9787500 94.8983130 + 40.9787500 94.9025210 + 40.9766880 94.9045830 + 40.9724790 94.9045830 + 40.9704170 94.9066880 + 40.9683130 94.9087500 + 40.9662500 94.9108130 + 40.9662500 94.9150210 + 40.9641460 94.9170830 + 40.9620830 94.9191880 + 40.9599790 94.9212500 + 40.9579170 94.9233540 + 40.9558540 94.9254170 + 40.9433130 94.9254170 + 40.9412500 94.9275210 + 40.9391880 94.9295830 + 40.9349790 94.9295830 + 40.9329170 94.9316460 + 40.9329170 94.9358540 + 40.9308540 94.9379170 + 40.9224790 94.9379170 + 40.9204170 94.9400210 + 40.9183540 94.9420830 + 40.9120830 94.9441880 + 40.9099790 94.9462500 + 40.9079170 94.9483540 + 40.9058130 94.9504170 + 40.9037500 94.9483130 + 40.9016460 94.9462500 + 40.8995830 94.9441460 + 40.8974790 94.9420830 + 40.8954170 94.9399790 + 40.8891880 94.9420830 + 40.8474790 94.9420830 + 40.8454170 94.9441880 + 40.8433540 94.9462500 + 40.8308130 94.9462500 + 40.8287500 94.9483540 + 40.8266460 94.9504170 + 40.8245830 94.9524790 + 40.8245830 94.9566880 + 40.8225210 94.9587500 + 40.8058130 94.9587500 + 40.8037500 94.9608130 + 40.8037500 94.9650210 + 40.8016880 94.9670830 + 40.7933130 94.9670830 + 40.7912500 94.9691880 + 40.7891460 94.9712500 + 40.7870830 94.9691460 + 40.7849790 94.9670830 + 40.7829170 94.9691880 + 40.7808540 94.9712500 + 40.7724790 94.9712500 + 40.7704170 94.9733540 + 40.7683540 94.9754170 + 40.7641460 94.9754170 + 40.7620830 94.9775210 + 40.7599790 94.9795830 + 40.7579170 94.9816880 + 40.7558130 94.9837500 + 40.7537500 94.9858540 + 40.7516460 94.9879170 + 40.7495830 94.9900210 + 40.7475210 94.9920830 + 40.7433130 94.9920830 + 40.7412500 94.9941880 + 40.7391460 94.9962500 + 40.7370830 94.9983130 + 40.7370830 95.0129170 +1619 1619 -1 56 40.82500 94.89768 + 41.2700000 94.4700000 + 41.2000000 94.4200000 + 41.2000000 94.4000000 + 41.1700000 94.3800000 + 41.1300000 94.4200000 + 41.0800000 94.4300000 + 41.0300000 94.5000000 + 41.0200000 94.5300000 + 41.0200000 94.5500000 + 40.9800000 94.5500000 + 40.9700000 94.5800000 + 40.9738500 94.5992300 + 40.9800000 94.6300000 + 40.9800000 94.6700000 + 40.9300000 94.7700000 + 40.9200000 94.8000000 + 40.8700000 94.8200000 + 40.8700000 94.8300000 + 40.8000000 94.8500000 + 40.8000000 94.8700000 + 40.7300000 94.8800000 + 40.6800000 94.8500000 + 40.6300000 94.8700000 + 40.6200000 94.8800000 + 40.5800000 94.8800000 + 40.5500000 94.8700000 + 40.5000000 94.8700000 + 40.4700000 94.8800000 + 40.4300000 94.8800000 + 40.4000000 94.9200000 + 40.3800000 94.9500000 + 40.4300000 94.9800000 + 40.4200000 95.0200000 + 40.4500000 95.0300000 + 40.4500000 95.0800000 + 40.4700000 95.0800000 + 40.4800000 95.0700000 + 40.5200000 95.0800000 + 40.6000000 95.0700000 + 40.6300000 95.0500000 + 40.6500000 95.0700000 + 40.7300000 95.1000000 + 40.7500000 95.0800000 + 40.7300000 95.0200000 + 40.7300000 95.0000000 + 40.8300000 94.9500000 + 40.9000000 94.9500000 + 40.9800000 94.9000000 + 41.0000000 94.8500000 + 41.0200000 94.8200000 + 41.0700000 94.7700000 + 41.1200000 94.6700000 + 41.1500000 94.6000000 + 41.1800000 94.5500000 + 41.2000000 94.5500000 + 41.2700000 94.4700000 +1620 1620 -1 21 40.78500 94.60000 + 40.8800000 94.5500000 + 40.9000000 94.5200000 + 40.8800000 94.5200000 + 40.8800000 94.5000000 + 40.8700000 94.4700000 + 40.8500000 94.4800000 + 40.8300000 94.4800000 + 40.8300000 94.5000000 + 40.8000000 94.5000000 + 40.7700000 94.5500000 + 40.7300000 94.6000000 + 40.7000000 94.6500000 + 40.6800000 94.6500000 + 40.6700000 94.6800000 + 40.6700000 94.7000000 + 40.6800000 94.7300000 + 40.7000000 94.7200000 + 40.7300000 94.7200000 + 40.8300000 94.6200000 + 40.8700000 94.5700000 + 40.8800000 94.5500000 +1621 1621 -1 41 40.66500 94.71500 + 40.9738500 94.5992300 + 40.9500000 94.5800000 + 40.9200000 94.5800000 + 40.9200000 94.5700000 + 40.8800000 94.5500000 + 40.8700000 94.5700000 + 40.8300000 94.6200000 + 40.7300000 94.7200000 + 40.7000000 94.7200000 + 40.6800000 94.7300000 + 40.6700000 94.7000000 + 40.6700000 94.6800000 + 40.6200000 94.7000000 + 40.5700000 94.7000000 + 40.5200000 94.7200000 + 40.4800000 94.7500000 + 40.4500000 94.7700000 + 40.3500000 94.7800000 + 40.3500000 94.8300000 + 40.3500000 94.8700000 + 40.3700000 94.8800000 + 40.4000000 94.8500000 + 40.4200000 94.8700000 + 40.4300000 94.8700000 + 40.4700000 94.8800000 + 40.5000000 94.8700000 + 40.5500000 94.8700000 + 40.5800000 94.8800000 + 40.6200000 94.8800000 + 40.6300000 94.8700000 + 40.6800000 94.8500000 + 40.7300000 94.8800000 + 40.8000000 94.8700000 + 40.8000000 94.8500000 + 40.8700000 94.8300000 + 40.8700000 94.8200000 + 40.9200000 94.8000000 + 40.9300000 94.7700000 + 40.9800000 94.6700000 + 40.9800000 94.6300000 + 40.9738500 94.5992300 +1622 1622 -1 37 40.27500 94.83500 + 40.5200000 94.7200000 + 40.5000000 94.7000000 + 40.4700000 94.7300000 + 40.4200000 94.7300000 + 40.4000000 94.7500000 + 40.3000000 94.7700000 + 40.3000000 94.7800000 + 40.2300000 94.7800000 + 40.2200000 94.8000000 + 40.1800000 94.8000000 + 40.1000000 94.7700000 + 40.0800000 94.7800000 + 40.0700000 94.7700000 + 40.0500000 94.7800000 + 40.0500000 94.8300000 + 40.0500000 94.8500000 + 40.0300000 94.8500000 + 40.0500000 94.8800000 + 40.1200000 94.8800000 + 40.1300000 94.8800000 + 40.2000000 94.9200000 + 40.2800000 94.9300000 + 40.3300000 94.9700000 + 40.3800000 94.9500000 + 40.4000000 94.9200000 + 40.4300000 94.8800000 + 40.4700000 94.8800000 + 40.4300000 94.8700000 + 40.4200000 94.8700000 + 40.4000000 94.8500000 + 40.3700000 94.8800000 + 40.3500000 94.8700000 + 40.3500000 94.8300000 + 40.3500000 94.7800000 + 40.4500000 94.7700000 + 40.4800000 94.7500000 + 40.5200000 94.7200000 +1623 1623 -1 58 40.76000 94.49500 + 41.1700000 94.3800000 + 41.1000000 94.3300000 + 41.0800000 94.3200000 + 41.0300000 94.3000000 + 41.0200000 94.2800000 + 41.0000000 94.2700000 + 40.9800000 94.2700000 + 40.9700000 94.2800000 + 40.9200000 94.3300000 + 40.9300000 94.3500000 + 40.9200000 94.3700000 + 40.8300000 94.3700000 + 40.8000000 94.3800000 + 40.7300000 94.4000000 + 40.7300000 94.3800000 + 40.6800000 94.4000000 + 40.6500000 94.4500000 + 40.6200000 94.4500000 + 40.5500000 94.5300000 + 40.5500000 94.5700000 + 40.4800000 94.5800000 + 40.4000000 94.6300000 + 40.4000000 94.6500000 + 40.3500000 94.6500000 + 40.3500000 94.6800000 + 40.3500000 94.7000000 + 40.3800000 94.7200000 + 40.4200000 94.7200000 + 40.5000000 94.7000000 + 40.5200000 94.7200000 + 40.5700000 94.7000000 + 40.6200000 94.7000000 + 40.6700000 94.6800000 + 40.6800000 94.6500000 + 40.7000000 94.6500000 + 40.7300000 94.6000000 + 40.7700000 94.5500000 + 40.8000000 94.5000000 + 40.8300000 94.5000000 + 40.8300000 94.4800000 + 40.8500000 94.4800000 + 40.8700000 94.4700000 + 40.8800000 94.5000000 + 40.8800000 94.5200000 + 40.9000000 94.5200000 + 40.8800000 94.5500000 + 40.9200000 94.5700000 + 40.9200000 94.5800000 + 40.9500000 94.5800000 + 40.9738500 94.5992300 + 40.9700000 94.5800000 + 40.9800000 94.5500000 + 41.0200000 94.5500000 + 41.0200000 94.5300000 + 41.0300000 94.5000000 + 41.0800000 94.4300000 + 41.1300000 94.4200000 + 41.1700000 94.3800000 +1624 1624 -1 65 40.07500 94.66500 + 40.5000000 94.7000000 + 40.4200000 94.7200000 + 40.3800000 94.7200000 + 40.3500000 94.7000000 + 40.3500000 94.6800000 + 40.3500000 94.6500000 + 40.3000000 94.6700000 + 40.2800000 94.6800000 + 40.2200000 94.7000000 + 40.2000000 94.6800000 + 40.1300000 94.6700000 + 40.1200000 94.6500000 + 40.1200000 94.6200000 + 40.1200000 94.5800000 + 40.0800000 94.5700000 + 40.0800000 94.5500000 + 40.0800000 94.5200000 + 40.0700000 94.5300000 + 40.0200000 94.5000000 + 40.0000000 94.4800000 + 40.0000000 94.4700000 + 39.9500000 94.4700000 + 39.9300000 94.4800000 + 39.9200000 94.4500000 + 39.9000000 94.4700000 + 39.8500000 94.4800000 + 39.8000000 94.5200000 + 39.7800000 94.5300000 + 39.7300000 94.5500000 + 39.7200000 94.5800000 + 39.7300000 94.6200000 + 39.6800000 94.6200000 + 39.6500000 94.6700000 + 39.6800000 94.6700000 + 39.6800000 94.7000000 + 39.7000000 94.7300000 + 39.6800000 94.7700000 + 39.6800000 94.7800000 + 39.7200000 94.8000000 + 39.7500000 94.7800000 + 39.7500000 94.7983400 + 39.7499500 94.8000000 + 39.8300000 94.8200000 + 39.9200000 94.8000000 + 39.9300000 94.8200000 + 39.9700000 94.8700000 + 39.9800000 94.8700000 + 40.0000000 94.8800000 + 40.0500000 94.8800000 + 40.0300000 94.8500000 + 40.0500000 94.8500000 + 40.0500000 94.8300000 + 40.0500000 94.7800000 + 40.0700000 94.7700000 + 40.0800000 94.7800000 + 40.1000000 94.7700000 + 40.1800000 94.8000000 + 40.2200000 94.8000000 + 40.2300000 94.7800000 + 40.3000000 94.7800000 + 40.3000000 94.7700000 + 40.4000000 94.7500000 + 40.4200000 94.7300000 + 40.4700000 94.7300000 + 40.5000000 94.7000000 +1628 1628 -1 31 39.49000 94.70000 + 39.6700000 94.8300000 + 39.6800000 94.7800000 + 39.6800000 94.7700000 + 39.7000000 94.7300000 + 39.6800000 94.7000000 + 39.6800000 94.6700000 + 39.6500000 94.6700000 + 39.5800000 94.6800000 + 39.5500000 94.6700000 + 39.5700000 94.6300000 + 39.5300000 94.5800000 + 39.5200000 94.5700000 + 39.4800000 94.5800000 + 39.4700000 94.5700000 + 39.4200000 94.5700000 + 39.4011800 94.5747100 + 39.3800000 94.5800000 + 39.3700000 94.6300000 + 39.2800000 94.6800000 + 39.3000000 94.7300000 + 39.3300000 94.7200000 + 39.3500000 94.7200000 + 39.3700000 94.7800000 + 39.3800000 94.8000000 + 39.4000000 94.8200000 + 39.4700000 94.7700000 + 39.5000000 94.7700000 + 39.5200000 94.7500000 + 39.5800000 94.7500000 + 39.6300000 94.7800000 + 39.6700000 94.8300000 +1630 1630 -1 26 41.52000 95.06500 + 41.7200000 94.9700000 + 41.6800000 94.9500000 + 41.6500000 94.9700000 + 41.6200000 94.9300000 + 41.5800000 94.9700000 + 41.5800000 94.9800000 + 41.5500000 95.0500000 + 41.5300000 95.0500000 + 41.4500000 95.0700000 + 41.4300000 95.0800000 + 41.4200000 95.1200000 + 41.3200000 95.1200000 + 41.3200000 95.1300000 + 41.3200000 95.1700000 + 41.3200000 95.2000000 + 41.4500000 95.1700000 + 41.5700000 95.1700000 + 41.5700000 95.1800000 + 41.6000000 95.1700000 + 41.6300000 95.1700000 + 41.6500000 95.1700000 + 41.6800000 95.1200000 + 41.6800000 95.1000000 + 41.7200000 95.0200000 + 41.7000000 94.9800000 + 41.7200000 94.9700000 +1634 1634 -1 18 40.58000 95.11500 + 40.7000000 95.1300000 + 40.7300000 95.1000000 + 40.6500000 95.0700000 + 40.6300000 95.0500000 + 40.6000000 95.0700000 + 40.5200000 95.0800000 + 40.4800000 95.0700000 + 40.4700000 95.0800000 + 40.4500000 95.0800000 + 40.4500000 95.1000000 + 40.4300000 95.1700000 + 40.4800000 95.1700000 + 40.5000000 95.1800000 + 40.5500000 95.1800000 + 40.5700000 95.1800000 + 40.6200000 95.1800000 + 40.6800000 95.1300000 + 40.7000000 95.1300000 +1635 1635 -1 20 40.32500 95.06500 + 40.4500000 95.0800000 + 40.4500000 95.0300000 + 40.4200000 95.0200000 + 40.4300000 94.9800000 + 40.3800000 94.9500000 + 40.3300000 94.9700000 + 40.3300000 94.9800000 + 40.2800000 95.0300000 + 40.2200000 95.0500000 + 40.2000000 95.0700000 + 40.2000000 95.1000000 + 40.2300000 95.1200000 + 40.2500000 95.1500000 + 40.2700000 95.1700000 + 40.3000000 95.1700000 + 40.3300000 95.1700000 + 40.3500000 95.1800000 + 40.4300000 95.1700000 + 40.4500000 95.1000000 + 40.4500000 95.0800000 +1801 1801 -1 49 42.77990 97.24212 + 43.2743500 97.4489400 + 43.2152200 97.4476900 + 43.0588400 97.3221300 + 42.9603200 97.3202400 + 42.8544100 97.0473000 + 42.7761300 96.9784600 + 42.7968600 96.8298800 + 42.8955400 96.8039600 + 42.8662300 96.7629800 + 42.7482600 96.7211000 + 42.6995000 96.6259800 + 42.5620500 96.5303300 + 42.5228700 96.4761100 + 42.4738300 96.4218900 + 42.4540000 96.4621700 + 42.4536300 96.5564300 + 42.3842800 96.6500500 + 42.3251500 96.6629500 + 42.2756500 96.7162100 + 42.3247900 96.7301600 + 42.3729100 96.9055300 + 42.4610200 96.9740200 + 42.5006000 96.9476200 + 42.4804000 97.0147200 + 42.5485500 97.1101200 + 42.5477100 97.2045100 + 42.4688200 97.2166100 + 42.4974400 97.3114400 + 42.4676300 97.3378200 + 42.4470900 97.4182300 + 42.4566300 97.4453600 + 42.5736900 97.5422400 + 42.6418000 97.6112800 + 42.7007100 97.6261700 + 42.8100300 97.5475200 + 42.8305200 97.4802600 + 42.8797600 97.4813200 + 42.9275800 97.6043900 + 42.9168800 97.6719400 + 43.1020700 97.8259900 + 43.1304700 97.9083600 + 43.2477100 97.9797400 + 43.2760200 98.0623400 + 43.2770700 97.9942100 + 43.1803200 97.8689000 + 43.1735600 97.6373400 + 43.2836000 97.5036500 + 43.2842100 97.4491400 + 43.2743500 97.4489400 +1802 1802 -1 41 42.26140 96.44726 + 42.5500000 96.2800000 + 42.5300000 96.2700000 + 42.5200000 96.3000000 + 42.5200000 96.3200000 + 42.4800000 96.3200000 + 42.4700000 96.3500000 + 42.4300000 96.3500000 + 42.4200000 96.3300000 + 42.3305100 96.2584100 + 42.1986200 96.2592200 + 42.1495500 96.1785800 + 42.0413000 96.1783100 + 42.0018800 96.2183500 + 42.0213300 96.3254800 + 41.9228600 96.3517500 + 41.9227900 96.3784700 + 41.9423000 96.4320500 + 41.9618400 96.4722900 + 42.0504000 96.4728900 + 42.0698200 96.5399900 + 42.1091800 96.5402900 + 42.1679300 96.6078000 + 42.1677300 96.6480400 + 42.1774400 96.6749600 + 42.2266500 96.6754300 + 42.2756500 96.7162100 + 42.3251500 96.6629500 + 42.3842800 96.6500500 + 42.4536300 96.5564300 + 42.4540000 96.4621700 + 42.4738300 96.4218900 + 42.5228700 96.4761100 + 42.5500800 96.4703800 + 42.5500000 96.4300000 + 42.5300000 96.4200000 + 42.5300000 96.4000000 + 42.5800000 96.3500000 + 42.6000000 96.3500000 + 42.5700000 96.3200000 + 42.5700000 96.3000000 + 42.5500000 96.2800000 +1803 1803 -1 43 41.92520 96.12587 + 41.9000000 95.9500000 + 41.8500000 95.9700000 + 41.8300000 95.9300000 + 41.7800000 95.9000000 + 41.7300000 95.9500000 + 41.7200000 95.9500000 + 41.6700000 95.9700000 + 41.6500000 96.0000000 + 41.6300000 96.0500000 + 41.6000000 96.0200000 + 41.5700000 96.0300000 + 41.5500000 96.1000000 + 41.5300000 96.1200000 + 41.5200000 96.1200000 + 41.5200000 96.1500000 + 41.5297200 96.1903000 + 41.5984800 96.2437000 + 41.5787600 96.2702300 + 41.6179800 96.3236100 + 41.6769900 96.3238800 + 41.7066000 96.2840400 + 41.7261800 96.3241000 + 41.8540600 96.3247000 + 41.8836400 96.2981200 + 41.9228600 96.3517500 + 42.0213300 96.3254800 + 42.0018800 96.2183500 + 42.0413000 96.1783100 + 42.1495500 96.1785800 + 42.1986200 96.2592200 + 42.3305100 96.2584100 + 42.3200000 96.2500000 + 42.2800000 96.2000000 + 42.1700000 96.1300000 + 42.0800000 96.1000000 + 42.0700000 96.0700000 + 42.0200000 96.0500000 + 41.9700000 96.0200000 + 41.9700000 96.0000000 + 41.9700000 95.9800000 + 41.9700000 95.9700000 + 41.9700000 95.9500000 + 41.9000000 95.9500000 +1804 1804 -1 71 41.64000 95.81500 + 42.0300000 95.5500000 + 42.0000000 95.5700000 + 41.9800000 95.5800000 + 41.9300000 95.6200000 + 41.9200000 95.6500000 + 41.8800000 95.6700000 + 41.8700000 95.7000000 + 41.8200000 95.7000000 + 41.8000000 95.7300000 + 41.7700000 95.7300000 + 41.7000000 95.8000000 + 41.6500000 95.8000000 + 41.6500000 95.7800000 + 41.6200000 95.7200000 + 41.6200000 95.6500000 + 41.6300000 95.6300000 + 41.6500000 95.6300000 + 41.7300000 95.5800000 + 41.7200000 95.5500000 + 41.7700000 95.5200000 + 41.7800000 95.4800000 + 41.7300000 95.4800000 + 41.7200000 95.5200000 + 41.7000000 95.5200000 + 41.6800000 95.5500000 + 41.6500000 95.5800000 + 41.6000000 95.6200000 + 41.5500000 95.6200000 + 41.5200000 95.6300000 + 41.4800000 95.6500000 + 41.4300000 95.6800000 + 41.4000000 95.7500000 + 41.3500000 95.8200000 + 41.3200000 95.8200000 + 41.2700000 95.8500000 + 41.2700000 95.9200000 + 41.2700000 95.9500000 + 41.2500000 95.9700000 + 41.2550200 95.9700000 + 41.2700000 95.9700000 + 41.2800000 96.0000000 + 41.3200000 96.0000000 + 41.3500000 96.0000000 + 41.3800000 96.0300000 + 41.4200000 96.0500000 + 41.4300000 96.0800000 + 41.4200000 96.1000000 + 41.4800000 96.1500000 + 41.5200000 96.1500000 + 41.5200000 96.1200000 + 41.5300000 96.1200000 + 41.5500000 96.1000000 + 41.5700000 96.0300000 + 41.6000000 96.0200000 + 41.6300000 96.0500000 + 41.6500000 96.0000000 + 41.6700000 95.9700000 + 41.7200000 95.9500000 + 41.7300000 95.9500000 + 41.7800000 95.9000000 + 41.8000000 95.8700000 + 41.8000000 95.8500000 + 41.8500000 95.8200000 + 41.8700000 95.7500000 + 41.9200000 95.7500000 + 41.9300000 95.7000000 + 42.0000000 95.6800000 + 42.0000000 95.6700000 + 42.0200000 95.6300000 + 42.0300000 95.5800000 + 42.0300000 95.5500000 +1806 1806 -1 77 41.28000 95.65000 + 41.8700000 95.4000000 + 41.8500000 95.3800000 + 41.8200000 95.3800000 + 41.8000000 95.4000000 + 41.7800000 95.3700000 + 41.7700000 95.4000000 + 41.7500000 95.3800000 + 41.7300000 95.4000000 + 41.7000000 95.3800000 + 41.6700000 95.3800000 + 41.6000000 95.4300000 + 41.5300000 95.4500000 + 41.5000000 95.5000000 + 41.4200000 95.5200000 + 41.3500000 95.6000000 + 41.2700000 95.6300000 + 41.2200000 95.6300000 + 41.1800000 95.6200000 + 41.1500000 95.6500000 + 41.0700000 95.6700000 + 41.0300000 95.6700000 + 40.9300000 95.6700000 + 40.8800000 95.6700000 + 40.8500000 95.6700000 + 40.8200000 95.6800000 + 40.8200000 95.7000000 + 40.7800000 95.7300000 + 40.8000000 95.7500000 + 40.8000000 95.7800000 + 40.7800000 95.8200000 + 40.7300000 95.8500000 + 40.7000000 95.8300000 + 40.6800000 95.8500000 + 40.7000000 95.8500000 + 40.7200000 95.8800000 + 40.7500000 95.8800000 + 40.7800000 95.8300000 + 40.8000000 95.8500000 + 40.8300000 95.8300000 + 40.8700000 95.8500000 + 40.8800000 95.8200000 + 40.9000000 95.8200000 + 40.9200000 95.8300000 + 40.9500000 95.8300000 + 40.9800000 95.8300000 + 41.0000000 95.8700000 + 41.0200000 95.8700000 + 41.0300000 95.8500000 + 41.0500000 95.8700000 + 41.0800000 95.8700000 + 41.1500000 95.8800000 + 41.1700000 95.8800000 + 41.1700000 95.8500000 + 41.1800000 95.8500000 + 41.1800000 95.9200000 + 41.2000000 95.9300000 + 41.2300000 95.9200000 + 41.2700000 95.9200000 + 41.2700000 95.8500000 + 41.3200000 95.8200000 + 41.3500000 95.8200000 + 41.4000000 95.7500000 + 41.4300000 95.6800000 + 41.4800000 95.6500000 + 41.5200000 95.6300000 + 41.5500000 95.6200000 + 41.6000000 95.6200000 + 41.6500000 95.5800000 + 41.6800000 95.5500000 + 41.7000000 95.5200000 + 41.7200000 95.5200000 + 41.7300000 95.4800000 + 41.7800000 95.4800000 + 41.8000000 95.4800000 + 41.8500000 95.4200000 + 41.8800000 95.4300000 + 41.8700000 95.4000000 +1807 1807 -1 54 40.97500 96.04416 + 41.2700000 95.9200000 + 41.2300000 95.9200000 + 41.2000000 95.9300000 + 41.1800000 95.9200000 + 41.1800000 95.8500000 + 41.1700000 95.8500000 + 41.1700000 95.8800000 + 41.1500000 95.8800000 + 41.0800000 95.8700000 + 41.0500000 95.8700000 + 41.0300000 95.8500000 + 41.0200000 95.8700000 + 41.0000000 95.8700000 + 40.9800000 95.8300000 + 40.9500000 95.8300000 + 40.9200000 95.8300000 + 40.9000000 95.8200000 + 40.8800000 95.8200000 + 40.8700000 95.8500000 + 40.8300000 95.8300000 + 40.8000000 95.8500000 + 40.7800000 95.8300000 + 40.7500000 95.8800000 + 40.7200000 95.8800000 + 40.7000000 95.8500000 + 40.6800000 95.8500000 + 40.7000000 95.8700000 + 40.7000000 95.9200000 + 40.6842800 95.9278600 + 40.6942100 95.9516500 + 40.7040300 95.9516400 + 40.7531400 95.8990300 + 40.7531300 95.8858900 + 40.8514300 95.8989000 + 40.9202700 95.9778500 + 40.9005600 96.1227500 + 40.9299900 96.1755100 + 41.0184600 96.1757400 + 41.0380100 96.2417700 + 41.0675000 96.2418700 + 41.0772700 96.2683100 + 41.1264600 96.2552900 + 41.1168800 95.9910000 + 41.0972100 95.9645800 + 41.1168800 95.9645800 + 41.1168600 95.9249400 + 41.1463400 95.8984800 + 41.1758500 95.9248800 + 41.1856800 95.9248700 + 41.2446900 95.9777500 + 41.2550200 95.9700000 + 41.2500000 95.9700000 + 41.2700000 95.9500000 + 41.2700000 95.9200000 +1808 1808 -1 44 40.61000 95.68000 + 40.8200000 95.6800000 + 40.8000000 95.6700000 + 40.8000000 95.6500000 + 40.7500000 95.6500000 + 40.7200000 95.6700000 + 40.7000000 95.6500000 + 40.6500000 95.6700000 + 40.6300000 95.6300000 + 40.6200000 95.6000000 + 40.6000000 95.5700000 + 40.6000000 95.5000000 + 40.6300000 95.4500000 + 40.6300000 95.4300000 + 40.5800000 95.4500000 + 40.4800000 95.5000000 + 40.4800000 95.5200000 + 40.4500000 95.5300000 + 40.4700000 95.6000000 + 40.4000000 95.6300000 + 40.4000000 95.6500000 + 40.4000000 95.6700000 + 40.4000000 95.6800000 + 40.4200000 95.7300000 + 40.4000000 95.7300000 + 40.4300000 95.7700000 + 40.4700000 95.8300000 + 40.4800000 95.8300000 + 40.5000000 95.8300000 + 40.6300000 95.8800000 + 40.6300000 95.9200000 + 40.6700000 95.9300000 + 40.6800000 95.9300000 + 40.6842800 95.9278600 + 40.7000000 95.9200000 + 40.7000000 95.8700000 + 40.6800000 95.8500000 + 40.7000000 95.8300000 + 40.7300000 95.8500000 + 40.7800000 95.8200000 + 40.8000000 95.7800000 + 40.8000000 95.7500000 + 40.7800000 95.7300000 + 40.8200000 95.7000000 + 40.8200000 95.6800000 +1809 1809 -1 54 40.36000 95.61000 + 40.6700000 95.3800000 + 40.6300000 95.3800000 + 40.5300000 95.4500000 + 40.4800000 95.4500000 + 40.4700000 95.4700000 + 40.4300000 95.4800000 + 40.4200000 95.4700000 + 40.3800000 95.4700000 + 40.3700000 95.4500000 + 40.3500000 95.4500000 + 40.3300000 95.4300000 + 40.3300000 95.4200000 + 40.3500000 95.3800000 + 40.3300000 95.3700000 + 40.2500000 95.3800000 + 40.2500000 95.4000000 + 40.2300000 95.4200000 + 40.2000000 95.4000000 + 40.1800000 95.4000000 + 40.0800000 95.3800000 + 40.0700000 95.3800000 + 40.0500000 95.4200000 + 40.0500000 95.4300000 + 40.0700000 95.4500000 + 40.1500000 95.5300000 + 40.1700000 95.5300000 + 40.2200000 95.5700000 + 40.2000000 95.6000000 + 40.2000000 95.6200000 + 40.2200000 95.6300000 + 40.2300000 95.7200000 + 40.2700000 95.7500000 + 40.2800000 95.7800000 + 40.3000000 95.8300000 + 40.3300000 95.8500000 + 40.3328900 95.8488500 + 40.3800000 95.8300000 + 40.3800000 95.8200000 + 40.4000000 95.8000000 + 40.4200000 95.8000000 + 40.4300000 95.7700000 + 40.4000000 95.7300000 + 40.4200000 95.7300000 + 40.4000000 95.6800000 + 40.4000000 95.6700000 + 40.4000000 95.6500000 + 40.4000000 95.6300000 + 40.4700000 95.6000000 + 40.4500000 95.5300000 + 40.4800000 95.5200000 + 40.4800000 95.5000000 + 40.5800000 95.4500000 + 40.6300000 95.4300000 + 40.6700000 95.3800000 +1810 1810 -1 48 40.10440 95.59246 + 40.3328900 95.8488500 + 40.3300000 95.8500000 + 40.3000000 95.8300000 + 40.2800000 95.7800000 + 40.2700000 95.7500000 + 40.2300000 95.7200000 + 40.2200000 95.6300000 + 40.2000000 95.6200000 + 40.2000000 95.6000000 + 40.2200000 95.5700000 + 40.1700000 95.5300000 + 40.1500000 95.5300000 + 40.0700000 95.4500000 + 40.0500000 95.4300000 + 40.0500000 95.4200000 + 40.0443700 95.4184800 + 40.0443100 95.4054600 + 39.9751500 95.3280200 + 39.9260300 95.3284800 + 39.9262400 95.3674600 + 39.8672300 95.3550000 + 39.8479600 95.4330400 + 39.8973000 95.4846100 + 39.8678800 95.4978000 + 39.8679800 95.5237700 + 39.8385100 95.5239600 + 39.8289600 95.6018800 + 39.7995700 95.6279900 + 39.7799600 95.6410600 + 39.7898900 95.6799200 + 39.8587800 95.7315400 + 39.8981900 95.7963300 + 39.9176900 95.7183200 + 39.9471000 95.6922100 + 39.9469900 95.6532200 + 39.9273100 95.6403200 + 39.9468400 95.6012300 + 40.0745500 95.6005200 + 40.0845600 95.6655800 + 40.1733000 95.8216200 + 40.1733900 95.8998600 + 40.1930500 95.9259100 + 40.3011500 95.9780400 + 40.3600800 96.0826000 + 40.4092000 96.0957400 + 40.4288800 96.0303400 + 40.3305800 95.8865700 + 40.3328900 95.8488500 +1811 1811 -1 37 40.24000 95.27000 + 40.4300000 95.1700000 + 40.3500000 95.1800000 + 40.3300000 95.1700000 + 40.3000000 95.1700000 + 40.2700000 95.1700000 + 40.2500000 95.1500000 + 40.2200000 95.1500000 + 40.1800000 95.1300000 + 40.1700000 95.1500000 + 40.0800000 95.1300000 + 40.0700000 95.1300000 + 40.0300000 95.1300000 + 40.0200000 95.1200000 + 40.0200000 95.1700000 + 39.9800000 95.2200000 + 39.9800000 95.2700000 + 40.0000000 95.3000000 + 40.0300000 95.3500000 + 40.0500000 95.4200000 + 40.0700000 95.3800000 + 40.0800000 95.3800000 + 40.1800000 95.4000000 + 40.2000000 95.4000000 + 40.2300000 95.4200000 + 40.2500000 95.4000000 + 40.2500000 95.3800000 + 40.3300000 95.3700000 + 40.3500000 95.3800000 + 40.3800000 95.3700000 + 40.4000000 95.3500000 + 40.4200000 95.3200000 + 40.4200000 95.2800000 + 40.4800000 95.2300000 + 40.4800000 95.2000000 + 40.5000000 95.1800000 + 40.4800000 95.1700000 + 40.4300000 95.1700000 +1812 1812 -1 29 40.14000 95.01000 + 40.3300000 94.9700000 + 40.2800000 94.9300000 + 40.2000000 94.9200000 + 40.1300000 94.8800000 + 40.1200000 94.8800000 + 40.0500000 94.8800000 + 40.0000000 94.8800000 + 39.9800000 94.8700000 + 39.9700000 94.8700000 + 39.9500000 94.9200000 + 39.9700000 95.0000000 + 39.9800000 95.0700000 + 40.0000000 95.0800000 + 40.0200000 95.1000000 + 40.0200000 95.1200000 + 40.0300000 95.1300000 + 40.0700000 95.1300000 + 40.0800000 95.1300000 + 40.1700000 95.1500000 + 40.1800000 95.1300000 + 40.2200000 95.1500000 + 40.2500000 95.1500000 + 40.2300000 95.1200000 + 40.2000000 95.1000000 + 40.2000000 95.0700000 + 40.2200000 95.0500000 + 40.2800000 95.0300000 + 40.3300000 94.9800000 + 40.3300000 94.9700000 +1813 1813 -1 44 39.84070 95.21405 + 40.0200000 95.1200000 + 40.0200000 95.1000000 + 40.0000000 95.0800000 + 39.9800000 95.0700000 + 39.9700000 95.0000000 + 39.9500000 94.9200000 + 39.9700000 94.8700000 + 39.9300000 94.8200000 + 39.9200000 94.8000000 + 39.8300000 94.8200000 + 39.7499500 94.8000000 + 39.7464300 94.9283400 + 39.8156200 94.9792100 + 39.8163300 95.0700200 + 39.7673100 95.0836200 + 39.7292900 95.2784800 + 39.7000400 95.3176300 + 39.6313600 95.3312200 + 39.6708500 95.3697000 + 39.6710900 95.4214900 + 39.7203200 95.4470100 + 39.7207400 95.5506600 + 39.7601200 95.5763400 + 39.7799300 95.6280900 + 39.7995700 95.6279900 + 39.8289600 95.6018800 + 39.8385100 95.5239600 + 39.8679800 95.5237700 + 39.8678800 95.4978000 + 39.8973000 95.4846100 + 39.8479600 95.4330400 + 39.8672300 95.3550000 + 39.9262400 95.3674600 + 39.9260300 95.3284800 + 39.9751500 95.3280200 + 40.0443100 95.4054600 + 40.0443700 95.4184800 + 40.0500000 95.4200000 + 40.0300000 95.3500000 + 40.0000000 95.3000000 + 39.9800000 95.2700000 + 39.9800000 95.2200000 + 40.0200000 95.1700000 + 40.0200000 95.1200000 +1814 1814 -1 26 39.67320 95.05579 + 39.6800000 94.7800000 + 39.6700000 94.8300000 + 39.6500000 94.8500000 + 39.6300000 94.8500000 + 39.5700000 94.8700000 + 39.5500000 94.8800000 + 39.6000000 94.9300000 + 39.5800000 94.9800000 + 39.5700000 95.0300000 + 39.5500000 95.1200000 + 39.5800000 95.1500000 + 39.5300000 95.2000000 + 39.5720600 95.2671200 + 39.5920700 95.3315900 + 39.6313600 95.3312200 + 39.7000400 95.3176300 + 39.7292900 95.2784800 + 39.7673100 95.0836200 + 39.8163300 95.0700200 + 39.8156200 94.9792100 + 39.7464300 94.9283400 + 39.7499500 94.8000000 + 39.7500000 94.7983400 + 39.7500000 94.7800000 + 39.7200000 94.8000000 + 39.6800000 94.7800000 +1815 1815 -1 30 39.47500 94.97500 + 39.5300000 95.2000000 + 39.5800000 95.1500000 + 39.5500000 95.1200000 + 39.5700000 95.0300000 + 39.5800000 94.9800000 + 39.6000000 94.9300000 + 39.5500000 94.8800000 + 39.5700000 94.8700000 + 39.6300000 94.8500000 + 39.6500000 94.8500000 + 39.6700000 94.8300000 + 39.6300000 94.7800000 + 39.5800000 94.7500000 + 39.5200000 94.7500000 + 39.5000000 94.7700000 + 39.4700000 94.7700000 + 39.4000000 94.8200000 + 39.3800000 94.8000000 + 39.3500000 94.8300000 + 39.3300000 94.8500000 + 39.3200000 94.9200000 + 39.3200000 94.9300000 + 39.2800000 94.9800000 + 39.3200000 95.0500000 + 39.3500000 95.0500000 + 39.3538300 95.0500000 + 39.3700000 95.0500000 + 39.4200000 95.0500000 + 39.4800000 95.1700000 + 39.5300000 95.2000000 +201 201 -1 17 39.26190 97.36923 + 39.2731200 97.2660400 + 39.2439200 97.2397800 + 39.1653600 97.2384400 + 39.1254200 97.3020200 + 39.1247400 97.3662600 + 39.1344100 97.3793000 + 39.1735500 97.3929000 + 39.2216100 97.4839000 + 39.2608900 97.4847100 + 39.3000100 97.4983900 + 39.3785800 97.5000200 + 39.3991200 97.4230400 + 39.3797700 97.3968700 + 39.3306700 97.3959200 + 39.3215600 97.3313100 + 39.2727300 97.3046600 + 39.2731200 97.2660400 +208 208 -1 36 39.11710 96.67976 + 39.2583000 96.6349300 + 39.2288400 96.6346700 + 39.1802100 96.5313600 + 39.1017000 96.5179400 + 39.0720700 96.5562500 + 39.0232900 96.4788900 + 38.9741900 96.4785600 + 38.9641600 96.5297900 + 38.8679000 96.5290900 + 38.8679000 96.5333000 + 38.8659300 96.5333000 + 38.8595000 96.5333000 + 38.8595000 96.5416000 + 38.8659000 96.5416000 + 38.8679000 96.5416000 + 38.8679000 96.5750000 + 38.8595000 96.5750000 + 38.8595000 96.5833000 + 38.8679000 96.5833000 + 38.8679000 96.5916000 + 38.8762000 96.5916000 + 38.8762000 96.6079600 + 38.9342800 96.6192900 + 38.9732200 96.6837400 + 39.0222500 96.6970300 + 39.0024700 96.7225000 + 39.0121400 96.7482500 + 39.1003600 96.7748600 + 39.1491400 96.8268000 + 39.2277000 96.8276900 + 39.3157300 96.8802300 + 39.3746600 96.8809500 + 39.3554600 96.8162600 + 39.3260000 96.8159300 + 39.2772900 96.7509900 + 39.2583000 96.6349300 +209 209 -1 23 39.18530 96.45445 + 39.3472300 96.5197000 + 39.2785800 96.4934500 + 39.2689100 96.4547600 + 39.2394000 96.4674500 + 39.2297100 96.4287700 + 39.2494000 96.4160200 + 39.2298000 96.4030400 + 39.2003800 96.3900100 + 39.2201000 96.3643800 + 39.2006300 96.2999600 + 39.1319400 96.2739800 + 39.0728900 96.3251200 + 39.0726700 96.4021700 + 39.0234800 96.4275600 + 39.0232900 96.4788900 + 39.0720700 96.5562500 + 39.1017000 96.5179400 + 39.1802100 96.5313600 + 39.2288400 96.6346700 + 39.2583000 96.6349300 + 39.2586100 96.5705600 + 39.3175900 96.5581400 + 39.3472300 96.5197000 +210 210 -1 26 39.47590 96.15276 + 39.6527900 95.9911900 + 39.6527800 95.9782400 + 39.6429600 95.9782400 + 39.6429600 96.0041300 + 39.4956300 96.0170400 + 39.4661200 96.1074100 + 39.3777200 96.1072800 + 39.3482200 96.1459000 + 39.2794000 96.1972700 + 39.2793600 96.2230300 + 39.3479800 96.2876900 + 39.4264800 96.3138000 + 39.4854800 96.2882400 + 39.4952400 96.3141100 + 39.5247300 96.3013200 + 39.5246700 96.3271600 + 39.5541300 96.3272900 + 39.5542600 96.2755800 + 39.6034200 96.2499000 + 39.6230100 96.2758500 + 39.6230700 96.2499700 + 39.6722100 96.2371900 + 39.6527500 96.0947400 + 39.6724100 96.0688700 + 39.6527800 96.0300200 + 39.6527900 95.9911900 +211 211 -1 19 39.36250 96.41074 + 39.4952400 96.3141100 + 39.4854800 96.2882400 + 39.4264800 96.3138000 + 39.3969900 96.3265800 + 39.3772000 96.3780700 + 39.2495600 96.3645300 + 39.2298000 96.4030400 + 39.2494000 96.4160200 + 39.2297100 96.4287700 + 39.2394000 96.4674500 + 39.2689100 96.4547600 + 39.2785800 96.4934500 + 39.3472300 96.5197000 + 39.4258000 96.5202600 + 39.4355600 96.5332400 + 39.4752000 96.4431500 + 39.4754100 96.3785800 + 39.4950600 96.3786800 + 39.4952400 96.3141100 +213 213 -1 21 39.25470 96.19714 + 39.3482200 96.1459000 + 39.2795000 96.1200100 + 39.2697300 96.0298600 + 39.1715200 95.9912400 + 39.1617100 95.9912400 + 39.1617000 96.0298200 + 39.0829800 96.1967400 + 39.1319700 96.2611300 + 39.1319400 96.2739800 + 39.2006300 96.2999600 + 39.2201000 96.3643800 + 39.2003800 96.3900100 + 39.2298000 96.4030400 + 39.2495600 96.3645300 + 39.3772000 96.3780700 + 39.3969900 96.3265800 + 39.4264800 96.3138000 + 39.3479800 96.2876900 + 39.2793600 96.2230300 + 39.2794000 96.1972700 + 39.3482200 96.1459000 +215 215 -1 13 39.42200 95.92045 + 39.6429600 95.9782400 + 39.5938400 95.9394600 + 39.5054400 95.9524500 + 39.4169700 95.8492900 + 39.2597900 95.8238700 + 39.2009300 95.8754700 + 39.2107700 95.9011800 + 39.2893700 95.9525900 + 39.4170500 95.9654100 + 39.4465200 96.0041200 + 39.4956300 96.0170400 + 39.6429600 96.0041300 + 39.6429600 95.9782400 +216 216 -1 15 39.24990 95.81093 + 39.3972500 95.7977400 + 39.3185000 95.7077600 + 39.2988600 95.7078500 + 39.2202900 95.7081600 + 39.1908800 95.7340100 + 39.0730300 95.7344400 + 39.1125500 95.8884700 + 39.1715000 95.9140900 + 39.2009600 95.9140600 + 39.2107700 95.9011800 + 39.2009300 95.8754700 + 39.2597900 95.8238700 + 39.4169700 95.8492900 + 39.4267500 95.8234600 + 39.3972500 95.7977400 +217 217 -1 15 39.76550 95.77772 + 39.8981900 95.7963300 + 39.8587800 95.7315400 + 39.7898900 95.6799200 + 39.7799600 95.6410600 + 39.7995700 95.6279900 + 39.7799300 95.6280900 + 39.6127800 95.5772000 + 39.6032000 95.6548700 + 39.6033900 95.7324800 + 39.6428200 95.8099900 + 39.6822500 95.9782300 + 39.8786600 95.8872800 + 39.9277200 95.8352300 + 39.8982100 95.8093200 + 39.8981900 95.7963300 +219 219 -1 20 39.64210 95.49305 + 39.6313600 95.3312200 + 39.5920700 95.3315900 + 39.5531700 95.4095100 + 39.5236400 95.3968300 + 39.5139400 95.4227400 + 39.5140000 95.4356700 + 39.5042400 95.4486600 + 39.5239900 95.4743500 + 39.5243400 95.5648000 + 39.5538500 95.5775500 + 39.5540100 95.6292600 + 39.6032000 95.6548700 + 39.6127800 95.5772000 + 39.7799300 95.6280900 + 39.7601200 95.5763400 + 39.7207400 95.5506600 + 39.7203200 95.4470100 + 39.6710900 95.4214900 + 39.6708500 95.3697000 + 39.6313600 95.3312200 +2207 2207 -1 82 43.48620 99.35506 + 43.9733100 99.5985900 + 43.9846600 99.5440700 + 43.9565300 99.4875100 + 43.9766200 99.4747600 + 43.8611000 99.3588500 + 43.8216600 99.3569000 + 43.8223500 99.3294400 + 43.7829100 99.3275200 + 43.7451800 99.2570300 + 43.7468500 99.1884700 + 43.6896500 99.1034900 + 43.6778400 99.1021300 + 43.4928200 99.0809000 + 43.4349500 99.0236400 + 43.3942600 99.0764800 + 43.3761300 99.0073900 + 43.3967700 98.9673200 + 43.4559000 98.9698700 + 43.4672800 98.9020100 + 43.5476300 98.8369700 + 43.6166300 98.8398300 + 43.6746000 98.8970900 + 43.6740000 98.9244900 + 43.7337600 98.8996000 + 43.7635300 98.9232700 + 43.8646300 98.7814000 + 43.8112800 98.6335900 + 43.6882500 98.7193600 + 43.6488100 98.7178000 + 43.6003500 98.6747700 + 43.6025300 98.5652800 + 43.5441600 98.5220300 + 43.5332500 98.5763600 + 43.4730200 98.6287900 + 43.4510800 98.7373000 + 43.3412300 98.8011500 + 43.3221100 98.7730900 + 43.3240800 98.6776600 + 43.2854900 98.6352500 + 43.2460800 98.6337400 + 43.2191800 98.4964900 + 43.3187400 98.4455500 + 43.4463600 98.4774300 + 43.4473800 98.4228100 + 43.4483800 98.3681700 + 43.3899600 98.3252000 + 43.3298500 98.3777300 + 43.2510100 98.3750000 + 43.2517400 98.3341400 + 43.2320400 98.3334700 + 43.0825200 98.4235700 + 43.0700900 98.5590500 + 43.0400000 98.5851100 + 43.0276800 98.7069000 + 42.9877200 98.7324900 + 43.0259700 98.7883500 + 43.0239100 98.8833500 + 43.0815000 98.9537400 + 43.0701000 99.0212200 + 43.0783700 99.0895600 + 43.1263200 99.1461400 + 43.1250000 99.2005000 + 43.2095700 99.3679100 + 43.2489700 99.3698400 + 43.2231300 99.6002300 + 43.2795800 99.6986600 + 43.3477600 99.7296400 + 43.3773200 99.7312500 + 43.3879400 99.7045000 + 43.4269600 99.7202800 + 43.4285000 99.6656900 + 43.4690400 99.6268200 + 43.5566000 99.6725500 + 43.5690800 99.5773500 + 43.6574200 99.5956800 + 43.6975900 99.5703500 + 43.6987000 99.5292400 + 43.7176800 99.5576700 + 43.7866900 99.5612700 + 43.8071500 99.5348500 + 43.8838000 99.6213800 + 43.9733100 99.5985900 +221 221 -1 26 39.52990 95.72639 + 39.6822500 95.9782300 + 39.6428200 95.8099900 + 39.6033900 95.7324800 + 39.6032000 95.6548700 + 39.5540100 95.6292600 + 39.5538500 95.5775500 + 39.5243400 95.5648000 + 39.5239900 95.4743500 + 39.5042400 95.4486600 + 39.4749400 95.4876300 + 39.4454200 95.4749200 + 39.4261200 95.5653900 + 39.3967000 95.5784700 + 39.4164700 95.6170600 + 39.4166500 95.6815600 + 39.3775100 95.7462200 + 39.3972500 95.7977400 + 39.4267500 95.8234600 + 39.4169700 95.8492900 + 39.5054400 95.9524500 + 39.5938400 95.9394600 + 39.6429600 95.9782400 + 39.6527800 95.9782400 + 39.6527900 95.9911900 + 39.6724300 96.0041300 + 39.6822500 95.9782300 +2214 2214 -1 46 42.79310 99.38328 + 42.9519200 99.0160400 + 42.9420700 99.0156200 + 42.8312800 98.6721200 + 42.7429400 98.6551800 + 42.7108700 98.7756600 + 42.6494600 98.8812800 + 42.6396100 98.8808700 + 42.6393100 98.8943700 + 42.6390100 98.9078700 + 42.6159300 99.0554500 + 42.6251300 99.0828700 + 42.6740300 99.0985600 + 42.6730600 99.1390700 + 42.7212900 99.1818400 + 42.7199700 99.2358800 + 42.6704100 99.2470900 + 42.6673300 99.3685800 + 42.6465900 99.4081200 + 42.6634100 99.5170700 + 42.6327800 99.5560500 + 42.6316700 99.5965300 + 42.6687700 99.6795700 + 42.6880700 99.6941100 + 42.6959800 99.7621600 + 42.6424100 99.9079100 + 42.7235400 99.8313100 + 42.7424200 99.8594200 + 42.7309700 99.9129100 + 42.7006400 99.9382500 + 42.7178400 100.0204100 + 42.7576200 100.0091900 + 42.7752100 100.0779100 + 42.8248300 100.0672900 + 42.8239900 100.0943500 + 42.8826200 100.1113800 + 42.8732000 100.0972600 + 42.8679500 99.9477900 + 42.7864900 99.6993800 + 42.7986100 99.6187600 + 42.7716700 99.5225800 + 42.8518700 99.4724600 + 42.8265500 99.3086100 + 42.8702800 99.1344800 + 42.9690700 99.1254000 + 42.9703500 99.0711500 + 42.9519200 99.0160400 +2215 2215 -1 23 42.64960 98.60373 + 42.7512500 98.2090400 + 42.7217100 98.2081000 + 42.6809300 98.2878900 + 42.6213800 98.3129300 + 42.6194200 98.4208900 + 42.5689300 98.4866000 + 42.4795600 98.5238300 + 42.4684000 98.5907900 + 42.4678500 98.6177200 + 42.4737600 98.8066100 + 42.5032900 98.8078000 + 42.5679700 98.9993500 + 42.6291700 98.9074500 + 42.6390100 98.9078700 + 42.6393100 98.8943700 + 42.6396100 98.8808700 + 42.6494600 98.8812800 + 42.7108700 98.7756600 + 42.7429400 98.6551800 + 42.8312800 98.6721200 + 42.7759300 98.4805000 + 42.7789200 98.3181900 + 42.7512500 98.2090400 +2216 2216 -1 29 42.51500 98.26291 + 42.7613300 98.1958300 + 42.7132100 98.1267000 + 42.7434100 98.0870500 + 42.7442600 98.0329700 + 42.7061100 97.9507400 + 42.6566800 97.9628500 + 42.6275400 97.9350200 + 42.6172900 97.9617400 + 42.5090000 97.9586800 + 42.4987500 97.9853400 + 42.3906700 97.9688000 + 42.3502700 98.0349000 + 42.3211600 98.0071700 + 42.2706800 98.0863200 + 42.2792100 98.1672000 + 42.2686800 98.2071700 + 42.3068800 98.2756000 + 42.4228000 98.4005700 + 42.4306100 98.5085800 + 42.4684000 98.5907900 + 42.4795600 98.5238300 + 42.5689300 98.4866000 + 42.6194200 98.4208900 + 42.6213800 98.3129300 + 42.6809300 98.2878900 + 42.7217100 98.2081000 + 42.7512500 98.2090400 + 42.7514800 98.1955200 + 42.7613300 98.1958300 +2217 2217 -1 20 43.11570 99.40417 + 43.2795800 99.6986600 + 43.2231300 99.6002300 + 43.2489700 99.3698400 + 43.2095700 99.3679100 + 43.1250000 99.2005000 + 43.1263200 99.1461400 + 43.0783700 99.0895600 + 43.0701000 99.0212200 + 43.0116300 98.9914900 + 42.9519200 99.0160400 + 42.9703500 99.0711500 + 42.9690700 99.1254000 + 42.9749300 99.2885700 + 43.1250100 99.5814900 + 43.1231300 99.6494300 + 43.1523000 99.6645900 + 43.1503800 99.7325600 + 43.1972800 99.8168400 + 43.2473100 99.7923500 + 43.2795800 99.6986600 +2218 2218 -1 21 42.91640 98.60837 + 42.9877200 98.7324900 + 42.9488900 98.7038100 + 42.9699700 98.6367800 + 42.9609400 98.5957200 + 42.8749200 98.4569500 + 42.8764200 98.3756800 + 42.8302600 98.1980200 + 42.7613300 98.1958300 + 42.7514800 98.1955200 + 42.7512500 98.2090400 + 42.7789200 98.3181900 + 42.7759300 98.4805000 + 42.8312800 98.6721200 + 42.9420700 99.0156200 + 42.9519200 99.0160400 + 43.0116300 98.9914900 + 43.0701000 99.0212200 + 43.0815000 98.9537400 + 43.0239100 98.8833500 + 43.0259700 98.7883500 + 42.9877200 98.7324900 +2219 2219 -1 26 42.55930 97.78151 + 42.5736900 97.5422400 + 42.5443200 97.5281100 + 42.5133000 97.6487400 + 42.4632000 97.7149000 + 42.4522700 97.7954500 + 42.4231100 97.7677700 + 42.3737100 97.7799700 + 42.3229800 97.8862200 + 42.3211600 98.0071700 + 42.3502700 98.0349000 + 42.3906700 97.9688000 + 42.4987500 97.9853400 + 42.5090000 97.9586800 + 42.6172900 97.9617400 + 42.6275400 97.9350200 + 42.6566800 97.9628500 + 42.7061100 97.9507400 + 42.7457000 97.9383200 + 42.7179100 97.8158600 + 42.7673400 97.8036300 + 42.7677100 97.7765800 + 42.7974400 97.7638000 + 42.7302600 97.6268600 + 42.7007100 97.6261700 + 42.6418000 97.6112800 + 42.5736900 97.5422400 +2220 2220 -1 46 43.12430 98.10638 + 43.5476800 98.3305500 + 43.5479300 98.3168700 + 43.4221000 98.1760100 + 43.3629600 98.1741400 + 43.2755900 98.0895800 + 43.2760200 98.0623400 + 43.2477100 97.9797400 + 43.1304700 97.9083600 + 43.1020700 97.8259900 + 42.9168800 97.6719400 + 42.9275800 97.6043900 + 42.8797600 97.4813200 + 42.8305200 97.4802600 + 42.8100300 97.5475200 + 42.7007100 97.6261700 + 42.7302600 97.6268600 + 42.7974400 97.7638000 + 42.7677100 97.7765800 + 42.7673400 97.8036300 + 42.7179100 97.8158600 + 42.7457000 97.9383200 + 42.7061100 97.9507400 + 42.7442600 98.0329700 + 42.7434100 98.0870500 + 42.7132100 98.1267000 + 42.7613300 98.1958300 + 42.8302600 98.1980200 + 42.8764200 98.3756800 + 42.8749200 98.4569500 + 42.9609400 98.5957200 + 42.9699700 98.6367800 + 42.9488900 98.7038100 + 42.9877200 98.7324900 + 43.0276800 98.7069000 + 43.0400000 98.5851100 + 43.0700900 98.5590500 + 43.0825200 98.4235700 + 43.2320400 98.3334700 + 43.2517400 98.3341400 + 43.2510100 98.3750000 + 43.3298500 98.3777300 + 43.3899600 98.3252000 + 43.4483800 98.3681700 + 43.4473800 98.4228100 + 43.5452000 98.4673200 + 43.5476800 98.3305500 +223 223 -1 24 39.39630 95.55903 + 39.5042400 95.4486600 + 39.5140000 95.4356700 + 39.5139400 95.4227400 + 39.4351800 95.3846600 + 39.4152100 95.3203200 + 39.3563500 95.3337600 + 39.3666200 95.4239200 + 39.2981000 95.4759900 + 39.2983100 95.5275100 + 39.2787100 95.5405200 + 39.2985700 95.6048000 + 39.2789300 95.6049000 + 39.3184100 95.6691100 + 39.2988600 95.7078500 + 39.3185000 95.7077600 + 39.3972500 95.7977400 + 39.3775100 95.7462200 + 39.4166500 95.6815600 + 39.4164700 95.6170600 + 39.3967000 95.5784700 + 39.4261200 95.5653900 + 39.4454200 95.4749200 + 39.4749400 95.4876300 + 39.5042400 95.4486600 +224 224 -1 22 39.23400 95.40574 + 39.3563500 95.3337600 + 39.2974200 95.3343000 + 39.2776400 95.3087300 + 39.3167000 95.2697100 + 39.2478800 95.2575200 + 39.1984600 95.2065700 + 39.1790600 95.2453700 + 39.1989300 95.2837500 + 39.1792900 95.2839500 + 39.1696800 95.3226200 + 39.1013900 95.4131800 + 39.1115500 95.4901900 + 39.1609500 95.5669800 + 39.1903700 95.5539400 + 39.2101400 95.5924100 + 39.2789300 95.6049000 + 39.2985700 95.6048000 + 39.2787100 95.5405200 + 39.2983100 95.5275100 + 39.2981000 95.4759900 + 39.3666200 95.4239200 + 39.3563500 95.3337600 +225 225 -1 29 39.13180 95.58001 + 39.2789300 95.6049000 + 39.2101400 95.5924100 + 39.1903700 95.5539400 + 39.1609500 95.5669800 + 39.1115500 95.4901900 + 39.1013900 95.4131800 + 39.1696800 95.3226200 + 39.0814300 95.3491300 + 39.0816300 95.3876500 + 39.0521700 95.3879000 + 39.0325900 95.4009000 + 39.0030600 95.3883100 + 39.0134000 95.5037000 + 38.9547200 95.5682100 + 38.9744500 95.5937300 + 38.9548800 95.6194800 + 38.9746700 95.6706800 + 38.9452400 95.6836200 + 38.9651800 95.8374000 + 39.0044600 95.8373200 + 39.0338700 95.7987500 + 39.0434500 95.6832000 + 39.0630600 95.6702700 + 39.0730300 95.7344400 + 39.1908800 95.7340100 + 39.2202900 95.7081600 + 39.2988600 95.7078500 + 39.3184100 95.6691100 + 39.2789300 95.6049000 +226 226 -1 15 39.31390 96.02354 + 39.4956300 96.0170400 + 39.4465200 96.0041200 + 39.4170500 95.9654100 + 39.2893700 95.9525900 + 39.2107700 95.9011800 + 39.2009600 95.9140600 + 39.1715000 95.9140900 + 39.1322400 95.9655500 + 39.1715200 95.9912400 + 39.2697300 96.0298600 + 39.2795000 96.1200100 + 39.3482200 96.1459000 + 39.3777200 96.1072800 + 39.4661200 96.1074100 + 39.4956300 96.0170400 +229 229 -1 18 39.43480 95.23637 + 39.3563500 95.3337600 + 39.4152100 95.3203200 + 39.4351800 95.3846600 + 39.5139400 95.4227400 + 39.5236400 95.3968300 + 39.5531700 95.4095100 + 39.5920700 95.3315900 + 39.5720600 95.2671200 + 39.5300000 95.2000000 + 39.4800000 95.1700000 + 39.4200000 95.0500000 + 39.3700000 95.0500000 + 39.3538300 95.0500000 + 39.3653300 95.1918600 + 39.3167000 95.2697100 + 39.2776400 95.3087300 + 39.2974200 95.3343000 + 39.3563500 95.3337600 +230 230 -1 17 39.23190 95.10308 + 39.3538300 95.0500000 + 39.3500000 95.0500000 + 39.3200000 95.0500000 + 39.2800000 94.9800000 + 39.2300000 94.9700000 + 39.2300000 94.9500000 + 39.1971600 94.9364500 + 39.1080600 94.9377600 + 39.0985600 94.9764400 + 39.1280300 94.9760200 + 39.1188200 95.0532500 + 39.1681100 95.0783200 + 39.1984600 95.2065700 + 39.2478800 95.2575200 + 39.3167000 95.2697100 + 39.3653300 95.1918600 + 39.3538300 95.0500000 +2619 2619 -1 47 43.94200 97.85540 + 44.3683900 97.5693000 + 44.3190000 97.5681500 + 44.2997400 97.5262000 + 44.2503600 97.5250900 + 44.2497200 97.5803800 + 44.0231600 97.5337800 + 44.0223400 97.6026600 + 43.9924000 97.6295000 + 43.7654600 97.6240800 + 43.7351800 97.6782500 + 43.6763500 97.6493900 + 43.6460600 97.7034800 + 43.5567700 97.7423200 + 43.5156500 97.8643700 + 43.6225200 97.9768800 + 43.6004600 98.1269000 + 43.5598900 98.1940800 + 43.5476800 98.3305500 + 43.7029600 98.4730100 + 43.7597700 98.5986400 + 43.7992100 98.6001400 + 43.8112800 98.6335900 + 43.8646300 98.7814000 + 43.9449700 98.7158400 + 43.9266300 98.6462900 + 43.9770500 98.5931500 + 44.0263800 98.5950400 + 44.0450300 98.6509000 + 44.1149300 98.6122200 + 44.1234200 98.6815600 + 44.1826400 98.6839000 + 44.1864000 98.4906200 + 44.1087100 98.4187900 + 44.0709600 98.3209000 + 43.9927300 98.2769100 + 43.9445600 98.2064700 + 43.8952300 98.2048700 + 43.8961300 98.1498800 + 43.9268300 98.0820400 + 43.9663000 98.0832400 + 44.0491000 97.8238500 + 44.1487400 97.7575000 + 44.1693800 97.6889900 + 44.2093800 97.6485300 + 44.2888800 97.6089600 + 44.3677200 97.6246800 + 44.3683900 97.5693000 +2620 2620 -1 32 43.59840 97.56263 + 44.0231600 97.5337800 + 43.8068500 97.4602400 + 43.6983300 97.4579200 + 43.6594700 97.4022800 + 43.4129500 97.3972400 + 43.4121900 97.3980000 + 43.3730800 97.4373700 + 43.3237900 97.4363400 + 43.3040700 97.4359300 + 43.2842100 97.4491400 + 43.2836000 97.5036500 + 43.1735600 97.6373400 + 43.1803200 97.8689000 + 43.2770700 97.9942100 + 43.2760200 98.0623400 + 43.2755900 98.0895800 + 43.3629600 98.1741400 + 43.4221000 98.1760100 + 43.5479300 98.3168700 + 43.5476800 98.3305500 + 43.5598900 98.1940800 + 43.6004600 98.1269000 + 43.6225200 97.9768800 + 43.5156500 97.8643700 + 43.5567700 97.7423200 + 43.6460600 97.7034800 + 43.6763500 97.6493900 + 43.7351800 97.6782500 + 43.7654600 97.6240800 + 43.9924000 97.6295000 + 44.0223400 97.6026600 + 44.0231600 97.5337800 +2646 2646 -1 21 43.02550 97.12052 + 43.0434100 96.7921000 + 43.0235300 96.8190300 + 42.8955400 96.8039600 + 42.7968600 96.8298800 + 42.7761300 96.9784600 + 42.8544100 97.0473000 + 42.9603200 97.3202400 + 43.0588400 97.3221300 + 43.2152200 97.4476900 + 43.2743500 97.4489400 + 43.2749400 97.3944300 + 43.2263700 97.3253500 + 43.1968000 97.3247800 + 43.1685400 97.1881600 + 43.0895800 97.2003900 + 43.0607400 97.1183600 + 42.9721800 97.1033600 + 42.9732500 96.9676900 + 43.0135100 96.8460600 + 43.0431600 96.8328500 + 43.0434100 96.7921000 +2647 2647 -1 37 43.28290 97.27369 + 43.5934000 97.0860000 + 43.5935200 97.0723000 + 43.5248100 97.0302000 + 43.5148400 97.0437200 + 43.2803300 96.7266800 + 43.2015500 96.7122400 + 43.2174300 96.6487100 + 43.1800000 96.6300000 + 43.1522000 96.7253300 + 43.0434100 96.7921000 + 43.0431600 96.8328500 + 43.0135100 96.8460600 + 42.9732500 96.9676900 + 42.9721800 97.1033600 + 43.0607400 97.1183600 + 43.0895800 97.2003900 + 43.1685400 97.1881600 + 43.1968000 97.3247800 + 43.2263700 97.3253500 + 43.2749400 97.3944300 + 43.2743500 97.4489400 + 43.2842100 97.4491400 + 43.3040700 97.4359300 + 43.3237900 97.4363400 + 43.3249300 97.3272500 + 43.3620500 97.2672800 + 43.3258600 97.2318000 + 43.3169800 97.1225400 + 43.2385800 97.0667700 + 43.2191900 97.0256200 + 43.2293600 96.9849200 + 43.2786400 96.9856200 + 43.3579100 96.9321700 + 43.4262100 97.0287200 + 43.4755100 97.0294600 + 43.5439800 97.0988900 + 43.5934000 97.0860000 +2648 2648 -1 24 43.48010 97.09973 + 43.7410100 97.1295100 + 43.7215200 97.1017500 + 43.6326300 97.1140200 + 43.5934000 97.0860000 + 43.5439800 97.0988900 + 43.4755100 97.0294600 + 43.4262100 97.0287200 + 43.3579100 96.9321700 + 43.2786400 96.9856200 + 43.2293600 96.9849200 + 43.2191900 97.0256200 + 43.2385800 97.0667700 + 43.3169800 97.1225400 + 43.3258600 97.2318000 + 43.3620500 97.2672800 + 43.3750200 97.2463200 + 43.4444200 97.2066000 + 43.4446700 97.1792800 + 43.4738700 97.2207900 + 43.5624900 97.2360500 + 43.5819600 97.2637900 + 43.6805700 97.2667200 + 43.6812200 97.1970700 + 43.7410100 97.1295100 +2650 2650 -1 29 43.78710 97.43668 + 44.2503600 97.5250900 + 44.2213700 97.4691600 + 44.1233800 97.3980500 + 44.1033500 97.4252200 + 44.0441200 97.4239900 + 44.0237800 97.4786800 + 43.9551500 97.4358900 + 43.8071400 97.4327800 + 43.7778400 97.4047000 + 43.7589600 97.3219600 + 43.6805700 97.2667200 + 43.5819600 97.2637900 + 43.5624900 97.2360500 + 43.4738700 97.2207900 + 43.4446700 97.1792800 + 43.4444200 97.2066000 + 43.3750200 97.2463200 + 43.3620500 97.2672800 + 43.3249300 97.3272500 + 43.3237900 97.4363400 + 43.3730800 97.4373700 + 43.4121900 97.3980000 + 43.4129500 97.3972400 + 43.6594700 97.4022800 + 43.6983300 97.4579200 + 43.8068500 97.4602400 + 44.0231600 97.5337800 + 44.2497200 97.5803800 + 44.2503600 97.5250900 +309 309 -1 25 39.44030 98.02153 + 39.4909700 97.9027900 + 39.4715200 97.8893700 + 39.4626600 97.8245700 + 39.4035600 97.8359800 + 39.3251900 97.8211100 + 39.3246200 97.8597600 + 39.2951600 97.8590000 + 39.2755200 97.8585000 + 39.2655100 97.8711200 + 39.2737400 97.9743700 + 39.2835600 97.9746300 + 39.3228300 97.9757000 + 39.3504000 98.0924900 + 39.3294400 98.1692200 + 39.3678100 98.2219600 + 39.3883500 98.1709900 + 39.4278500 98.1592600 + 39.4285200 98.1205700 + 39.5760300 98.1119700 + 39.5945600 98.1771900 + 39.6142000 98.1777900 + 39.6150900 98.1260500 + 39.5480600 98.0206500 + 39.5298500 97.9296600 + 39.4909700 97.9027900 +311 311 -1 15 39.35650 97.66035 + 39.4177000 97.5137300 + 39.3882400 97.5131100 + 39.3785800 97.5000200 + 39.3000100 97.4983900 + 39.2608900 97.4847100 + 39.2605800 97.5104500 + 39.2504500 97.5359900 + 39.2790900 97.6009900 + 39.3251900 97.8211100 + 39.4035600 97.8359800 + 39.4626600 97.8245700 + 39.4052100 97.7199000 + 39.4257200 97.6558600 + 39.4268900 97.5655500 + 39.4177000 97.5137300 +601 601 -1 18 41.02060 97.86402 + 41.0478500 97.6014300 + 41.0178600 97.6403400 + 41.0162700 97.7590600 + 40.9669500 97.7710200 + 40.9652500 97.8896600 + 40.9544300 97.9552900 + 40.9247400 97.9676500 + 40.9437800 98.0077300 + 40.9322400 98.1128500 + 40.9516800 98.1266200 + 41.0219800 98.0363500 + 41.0228100 97.9835700 + 41.0525000 97.9712100 + 41.0731600 97.9057500 + 41.0550400 97.7996300 + 41.0763200 97.6813100 + 41.1164900 97.6162000 + 41.0478500 97.6014300 +602 602 -1 20 41.16030 97.25434 + 41.2211500 96.9966300 + 41.1818200 96.9960800 + 41.1815100 97.0357500 + 41.0824200 97.1267500 + 41.1020800 97.1270600 + 41.1016000 97.1798900 + 41.0520800 97.2186700 + 41.0513000 97.2978700 + 41.0609900 97.3112500 + 41.0608600 97.3244500 + 41.1395000 97.3259200 + 41.1578700 97.4452600 + 41.2160800 97.5126100 + 41.2269800 97.4202000 + 41.2665900 97.3945200 + 41.2483000 97.2617700 + 41.2682300 97.2356500 + 41.2693200 97.1164900 + 41.2304500 97.0629300 + 41.2211500 96.9966300 +603 603 -1 14 40.99860 97.19780 + 41.0824200 97.1267500 + 41.0232000 97.1521900 + 40.9741700 97.1382100 + 40.9548600 97.0983500 + 40.9155500 97.0977400 + 40.8951800 97.1764600 + 40.9250300 97.1374200 + 40.9933500 97.1912800 + 41.0122500 97.2707600 + 41.0513000 97.2978700 + 41.0520800 97.2186700 + 41.1016000 97.1798900 + 41.1020800 97.1270600 + 41.0824200 97.1267500 +604 604 -1 13 40.90340 98.04480 + 40.9652500 97.8896600 + 40.9361500 97.8625200 + 40.8773800 97.8478100 + 40.8457100 97.9917900 + 40.8824500 98.1508900 + 40.8415500 98.2418000 + 40.9210800 98.1916000 + 40.9516800 98.1266200 + 40.9322400 98.1128500 + 40.9437800 98.0077300 + 40.9247400 97.9676500 + 40.9544300 97.9552900 + 40.9652500 97.8896600 +605 605 -1 18 40.97810 97.63250 + 41.0501800 97.4034600 + 40.9620100 97.3753400 + 40.9222600 97.4141000 + 40.9221100 97.4272800 + 40.9024500 97.4268800 + 40.9307100 97.5328800 + 40.9005900 97.5849200 + 40.8777600 97.8214700 + 40.8773800 97.8478100 + 40.9361500 97.8625200 + 40.9652500 97.8896600 + 40.9669500 97.7710200 + 41.0162700 97.7590600 + 41.0178600 97.6403400 + 41.0478500 97.6014300 + 41.0787700 97.4832600 + 41.0696900 97.4170500 + 41.0501800 97.4034600 +606 606 -1 15 40.97780 97.27576 + 41.0608600 97.3244500 + 41.0609900 97.3112500 + 41.0513000 97.2978700 + 41.0122500 97.2707600 + 40.9933500 97.1912800 + 40.9250300 97.1374200 + 40.8951800 97.1764600 + 40.8946800 97.2291400 + 40.9041300 97.2688200 + 40.9229700 97.3482300 + 40.9222600 97.4141000 + 40.9620100 97.3753400 + 41.0501800 97.4034600 + 41.0510300 97.3242600 + 41.0608600 97.3244500 +607 607 -1 17 40.82140 98.10301 + 40.8777600 97.8214700 + 40.8282400 97.8465300 + 40.8276600 97.8859900 + 40.7981800 97.8852200 + 40.7975900 97.9246600 + 40.7763000 98.0293000 + 40.7955300 98.0561600 + 40.7832900 98.2005000 + 40.8013100 98.2931600 + 40.7603200 98.3838800 + 40.7799700 98.3845400 + 40.8317300 98.2414900 + 40.8415500 98.2418000 + 40.8824500 98.1508900 + 40.8457100 97.9917900 + 40.8773800 97.8478100 + 40.8777600 97.8214700 +608 608 -1 11 40.85700 97.65644 + 40.9024500 97.4268800 + 40.7942000 97.4378600 + 40.7832900 97.5297000 + 40.8214600 97.6226300 + 40.7981800 97.8852200 + 40.8276600 97.8859900 + 40.8282400 97.8465300 + 40.8777600 97.8214700 + 40.9005900 97.5849200 + 40.9307100 97.5328800 + 40.9024500 97.4268800 +609 609 -1 23 40.68330 98.19797 + 40.7975900 97.9246600 + 40.7288100 97.9228000 + 40.7183800 97.9619400 + 40.6485700 98.0256600 + 40.6671600 98.0918500 + 40.6269800 98.1431700 + 40.6258500 98.2087600 + 40.5760400 98.2465600 + 40.5753400 98.2858800 + 40.5652800 98.2986800 + 40.5844500 98.3255200 + 40.5827300 98.4172900 + 40.6018800 98.4441800 + 40.6799600 98.4731400 + 40.7207700 98.3957000 + 40.7502400 98.3967000 + 40.7504900 98.3835500 + 40.7603200 98.3838800 + 40.8013100 98.2931600 + 40.7832900 98.2005000 + 40.7955300 98.0561600 + 40.7763000 98.0293000 + 40.7975900 97.9246600 +610 610 -1 19 40.67020 97.88813 + 40.7832900 97.5297000 + 40.7045200 97.5411500 + 40.6738900 97.6324000 + 40.6344200 97.6446200 + 40.6233700 97.7362300 + 40.5937200 97.7486200 + 40.5321000 97.9306000 + 40.5189100 98.1399200 + 40.5760400 98.2465600 + 40.6258500 98.2087600 + 40.6269800 98.1431700 + 40.6671600 98.0918500 + 40.6485700 98.0256600 + 40.7183800 97.9619400 + 40.7288100 97.9228000 + 40.7975900 97.9246600 + 40.7981800 97.8852200 + 40.8214600 97.6226300 + 40.7832900 97.5297000 +611 611 -1 26 40.74950 97.40932 + 40.9041300 97.2688200 + 40.8455400 97.2282900 + 40.7767500 97.2271000 + 40.7772400 97.1745100 + 40.7477600 97.1740200 + 40.7181600 97.1866700 + 40.7172700 97.2786300 + 40.7369200 97.2789800 + 40.7463500 97.3185900 + 40.7165900 97.3443100 + 40.6854900 97.4882000 + 40.6460300 97.5005000 + 40.6458800 97.5136200 + 40.6260700 97.5263200 + 40.5759700 97.6039300 + 40.6049400 97.6439400 + 40.6344200 97.6446200 + 40.6738900 97.6324000 + 40.7045200 97.5411500 + 40.7832900 97.5297000 + 40.7942000 97.4378600 + 40.9024500 97.4268800 + 40.9221100 97.4272800 + 40.9222600 97.4141000 + 40.9229700 97.3482300 + 40.9041300 97.2688200 +612 612 -1 19 40.68260 97.26440 + 40.6503100 97.0805200 + 40.6498500 97.1330200 + 40.6693800 97.1464600 + 40.6493700 97.1855200 + 40.6483400 97.2905200 + 40.6181800 97.3555800 + 40.6168600 97.4736400 + 40.6460300 97.5005000 + 40.6854900 97.4882000 + 40.7165900 97.3443100 + 40.7463500 97.3185900 + 40.7369200 97.2789800 + 40.7172700 97.2786300 + 40.7181600 97.1866700 + 40.7477600 97.1740200 + 40.7483500 97.1083000 + 40.6998800 97.0287300 + 40.6703900 97.0283100 + 40.6503100 97.0805200 +613 613 -1 33 40.89170 97.07623 + 41.1818200 96.9960800 + 41.1130100 96.9951100 + 41.0142800 97.0464900 + 40.9750700 97.0327300 + 40.9557300 96.9929000 + 40.9360700 96.9926200 + 40.9358600 97.0189800 + 40.8768900 97.0181400 + 40.7688800 97.0034300 + 40.7298700 96.9634600 + 40.7003900 96.9630600 + 40.6518300 96.8836400 + 40.6318900 96.9227700 + 40.6122400 96.9225100 + 40.6016000 97.0273100 + 40.6503100 97.0805200 + 40.6703900 97.0283100 + 40.6998800 97.0287300 + 40.7483500 97.1083000 + 40.7477600 97.1740200 + 40.7772400 97.1745100 + 40.7767500 97.2271000 + 40.8455400 97.2282900 + 40.9041300 97.2688200 + 40.8946800 97.2291400 + 40.8951800 97.1764600 + 40.9155500 97.0977400 + 40.9548600 97.0983500 + 40.9741700 97.1382100 + 41.0232000 97.1521900 + 41.0824200 97.1267500 + 41.1815100 97.0357500 + 41.1818200 96.9960800 +614 614 -1 17 40.53160 97.65487 + 40.6260700 97.5263200 + 40.5580600 97.4593100 + 40.5294600 97.3801000 + 40.4803400 97.3791400 + 40.4403000 97.4438200 + 40.4300300 97.4828600 + 40.4287600 97.5875300 + 40.4767000 97.6802700 + 40.4650700 97.8109400 + 40.4741300 97.8635500 + 40.5321000 97.9306000 + 40.5937200 97.7486200 + 40.6233700 97.7362300 + 40.6344200 97.6446200 + 40.6049400 97.6439400 + 40.5759700 97.6039300 + 40.6260700 97.5263200 +615 615 -1 21 40.56490 97.26287 + 40.6460300 97.5005000 + 40.6168600 97.4736400 + 40.6181800 97.3555800 + 40.6483400 97.2905200 + 40.6493700 97.1855200 + 40.6210400 97.0538300 + 40.6016000 97.0273100 + 40.5918800 97.0140500 + 40.4839000 96.9994300 + 40.4829200 97.1172700 + 40.5219800 97.1441000 + 40.5215000 97.1965000 + 40.5507300 97.2232100 + 40.5499500 97.3018400 + 40.4806200 97.3529600 + 40.4803400 97.3791400 + 40.5294600 97.3801000 + 40.5580600 97.4593100 + 40.6260700 97.5263200 + 40.6458800 97.5136200 + 40.6460300 97.5005000 +616 616 -1 17 40.40830 97.14268 + 40.4839000 96.9994300 + 40.3664900 96.9324100 + 40.3661000 96.9847000 + 40.2965800 97.0751800 + 40.2658000 97.2183300 + 40.2753700 97.2446100 + 40.3244900 97.2454700 + 40.3044500 97.2843100 + 40.3531700 97.3244000 + 40.4514200 97.3262300 + 40.4806200 97.3529600 + 40.5499500 97.3018400 + 40.5507300 97.2232100 + 40.5215000 97.1965000 + 40.5219800 97.1441000 + 40.4829200 97.1172700 + 40.4839000 96.9994300 +617 617 -1 23 40.39550 96.93874 + 40.6122400 96.9225100 + 40.5631100 96.9218800 + 40.5241700 96.8689600 + 40.5346000 96.7773500 + 40.5253000 96.6855300 + 40.5057800 96.6591400 + 40.4664100 96.6718700 + 40.3878000 96.6711300 + 40.2005300 96.7737300 + 40.2293200 96.8784300 + 40.1793300 96.9951800 + 40.1985500 97.0476200 + 40.1786800 97.0734100 + 40.1974000 97.1780400 + 40.2268800 97.1785200 + 40.2658000 97.2183300 + 40.2965800 97.0751800 + 40.3661000 96.9847000 + 40.3664900 96.9324100 + 40.4839000 96.9994300 + 40.5918800 97.0140500 + 40.6016000 97.0273100 + 40.6122400 96.9225100 +618 618 -1 18 40.26010 96.63042 + 40.4664100 96.6718700 + 40.4372600 96.6061600 + 40.3980800 96.5796700 + 40.4179600 96.5275000 + 40.3688300 96.5271400 + 40.3395200 96.4877100 + 40.2510900 96.4871100 + 40.2018600 96.5128600 + 40.2015800 96.5780800 + 40.0935100 96.5772100 + 40.0834400 96.6292100 + 40.0539000 96.6419800 + 40.0537600 96.6680100 + 40.1224600 96.6816800 + 40.1417400 96.7470200 + 40.2005300 96.7737300 + 40.3878000 96.6711300 + 40.4664100 96.6718700 +619 619 -1 16 40.12620 96.85772 + 40.2005300 96.7737300 + 40.1417400 96.7470200 + 40.1224600 96.6816800 + 40.0537600 96.6680100 + 40.0341100 96.6678200 + 40.0237000 96.7718200 + 40.0230100 96.8759000 + 40.0423900 96.9151800 + 40.0522100 96.9153100 + 40.0521100 96.9283200 + 40.0709500 97.0327300 + 40.1496500 97.0208300 + 40.1985500 97.0476200 + 40.1793300 96.9951800 + 40.2293200 96.8784300 + 40.2005300 96.7737300 +620 620 -1 13 40.15250 96.49908 + 40.1729200 96.3561900 + 40.1530300 96.4343000 + 40.0543300 96.5508600 + 40.0539000 96.6419800 + 40.0834400 96.6292100 + 40.0935100 96.5772100 + 40.2015800 96.5780800 + 40.2018600 96.5128600 + 40.2510900 96.4871100 + 40.2511900 96.4610100 + 40.2315800 96.4478300 + 40.2220500 96.3564400 + 40.1729200 96.3561900 +621 621 -1 25 40.00030 96.62252 + 40.1729200 96.3561900 + 40.1533500 96.3300200 + 40.1140500 96.3298500 + 40.0844700 96.3687700 + 39.9960900 96.3553200 + 39.9665400 96.3811700 + 39.9663300 96.4461700 + 39.9269400 96.4719200 + 39.9167400 96.5628000 + 39.8872100 96.5755500 + 39.8277600 96.6788900 + 39.8473300 96.6920500 + 39.8664400 96.7831100 + 39.8662000 96.8220600 + 39.9252200 96.8097400 + 39.9247800 96.8747000 + 40.0423900 96.9151800 + 40.0230100 96.8759000 + 40.0237000 96.7718200 + 40.0341100 96.6678200 + 40.0537600 96.6680100 + 40.0539000 96.6419800 + 40.0543300 96.5508600 + 40.1530300 96.4343000 + 40.1729200 96.3561900 +622 622 -1 14 39.76410 96.68445 + 39.9269400 96.4719200 + 39.8286100 96.4972200 + 39.7791600 96.5746800 + 39.7789200 96.6265600 + 39.7592000 96.6393400 + 39.6412700 96.6512500 + 39.6013200 96.7673000 + 39.7587100 96.7300900 + 39.8664400 96.7831100 + 39.8473300 96.6920500 + 39.8277600 96.6788900 + 39.8872100 96.5755500 + 39.9167400 96.5628000 + 39.9269400 96.4719200 +623 623 -1 17 39.72380 96.90471 + 39.8664400 96.7831100 + 39.7587100 96.7300900 + 39.6013200 96.7673000 + 39.6010800 96.8061100 + 39.5912600 96.8059900 + 39.5910900 96.8318600 + 39.5810900 96.8576000 + 39.6201100 96.8968900 + 39.6194200 96.9874500 + 39.6481400 97.0784500 + 39.7070700 97.0793400 + 39.7665400 97.0154000 + 39.7666500 97.0024300 + 39.7177400 96.9758500 + 39.7182300 96.9110600 + 39.8662000 96.8220600 + 39.8664400 96.7831100 +626 626 -1 21 40.39370 98.28368 + 40.5652800 98.2986800 + 40.5161600 98.2970900 + 40.4686700 98.2038900 + 40.4296000 98.1895900 + 40.3724300 98.0832100 + 40.3333500 98.0690000 + 40.3121700 98.1598600 + 40.2530100 98.1711300 + 40.2521000 98.2233300 + 40.2029900 98.2218000 + 40.2308200 98.3140300 + 40.2504600 98.3146700 + 40.2691300 98.3675100 + 40.2789600 98.3678400 + 40.2764400 98.4983700 + 40.4046500 98.4766800 + 40.4741700 98.4398000 + 40.4744200 98.4267200 + 40.5827300 98.4172900 + 40.5844500 98.3255200 + 40.5652800 98.2986800 +627 627 -1 26 40.29910 98.04586 + 40.4686700 98.2038900 + 40.4704400 98.0991700 + 40.3241600 98.0295300 + 40.3249900 97.9772800 + 40.2676400 97.8712200 + 40.2685900 97.8059600 + 40.2303900 97.7266900 + 40.2314400 97.6484100 + 40.2028000 97.5825200 + 40.1731700 97.5949100 + 40.1796200 97.8428400 + 40.1301200 97.8676400 + 40.1772300 97.9992800 + 40.1277000 98.0239600 + 40.1471400 98.0375500 + 40.1364600 98.0893900 + 40.1655000 98.1163200 + 40.1545600 98.1811800 + 40.2029900 98.2218000 + 40.2521000 98.2233300 + 40.2530100 98.1711300 + 40.3121700 98.1598600 + 40.3333500 98.0690000 + 40.3724300 98.0832100 + 40.4296000 98.1895900 + 40.4686700 98.2038900 +628 628 -1 24 40.38940 97.88874 + 40.5321000 97.9306000 + 40.4741300 97.8635500 + 40.4650700 97.8109400 + 40.3684500 97.6908000 + 40.3313100 97.5200300 + 40.2826600 97.4798100 + 40.2335400 97.4788000 + 40.2329200 97.5309800 + 40.2032900 97.5434000 + 40.2028000 97.5825200 + 40.2314400 97.6484100 + 40.2303900 97.7266900 + 40.2685900 97.8059600 + 40.2676400 97.8712200 + 40.3249900 97.9772800 + 40.3241600 98.0295300 + 40.4704400 98.0991700 + 40.4686700 98.2038900 + 40.5161600 98.2970900 + 40.5652800 98.2986800 + 40.5753400 98.2858800 + 40.5760400 98.2465600 + 40.5189100 98.1399200 + 40.5321000 97.9306000 +629 629 -1 18 40.33060 97.47400 + 40.4300300 97.4828600 + 40.3908800 97.4689700 + 40.3716800 97.4293500 + 40.3225600 97.4283700 + 40.3228500 97.4022400 + 40.2247500 97.3872700 + 40.1845700 97.4647400 + 40.2040700 97.4781900 + 40.2032900 97.5434000 + 40.2329200 97.5309800 + 40.2335400 97.4788000 + 40.2826600 97.4798100 + 40.3313100 97.5200300 + 40.3684500 97.6908000 + 40.4650700 97.8109400 + 40.4767000 97.6802700 + 40.4287600 97.5875300 + 40.4300300 97.4828600 +630 630 -1 42 40.21800 97.28934 + 40.4806200 97.3529600 + 40.4514200 97.3262300 + 40.3531700 97.3244000 + 40.3044500 97.2843100 + 40.3244900 97.2454700 + 40.2753700 97.2446100 + 40.2658000 97.2183300 + 40.2268800 97.1785200 + 40.1974000 97.1780400 + 40.0991600 97.1764200 + 40.0984100 97.2545600 + 40.1666500 97.3079100 + 40.1658100 97.3861200 + 40.0953900 97.5280500 + 40.0261500 97.5656100 + 40.0248100 97.6696900 + 39.9755300 97.6815500 + 39.9553600 97.7200800 + 39.9648200 97.7463100 + 40.0041100 97.7472700 + 40.0317000 97.8780900 + 40.0707900 97.8921400 + 40.0994700 97.9450000 + 40.0990600 97.9710500 + 40.1277000 98.0239600 + 40.1772300 97.9992800 + 40.1301200 97.8676400 + 40.1796200 97.8428400 + 40.1731700 97.5949100 + 40.2028000 97.5825200 + 40.2032900 97.5434000 + 40.2040700 97.4781900 + 40.1845700 97.4647400 + 40.2247500 97.3872700 + 40.3228500 97.4022400 + 40.3225600 97.4283700 + 40.3716800 97.4293500 + 40.3908800 97.4689700 + 40.4300300 97.4828600 + 40.4403000 97.4438200 + 40.4803400 97.3791400 + 40.4806200 97.3529600 +631 631 -1 25 39.85400 97.28263 + 39.9815300 97.1484800 + 39.8933500 97.1211000 + 39.8741600 97.0688600 + 39.7666500 97.0024300 + 39.7665400 97.0154000 + 39.7070700 97.0793400 + 39.7266000 97.0925900 + 39.7262600 97.1314500 + 39.7944100 97.1973800 + 39.7842100 97.2361200 + 39.8033300 97.2883400 + 39.7832800 97.3268900 + 39.7538200 97.3263400 + 39.8022300 97.3921000 + 39.8013400 97.4699200 + 39.8793000 97.5234500 + 39.8984600 97.5628400 + 39.9383900 97.5117100 + 39.9489700 97.4469400 + 39.9687700 97.4343300 + 39.9696300 97.3563400 + 39.9995200 97.3178800 + 39.9809200 97.2135000 + 40.0009300 97.1748100 + 39.9815300 97.1484800 +632 632 -1 32 40.03820 97.32420 + 40.1985500 97.0476200 + 40.1496500 97.0208300 + 40.0709500 97.0327300 + 40.0521100 96.9283200 + 39.9729300 97.0053200 + 40.0212800 97.0970800 + 40.0210500 97.1230900 + 39.9815300 97.1484800 + 40.0009300 97.1748100 + 39.9809200 97.2135000 + 39.9995200 97.3178800 + 39.9696300 97.3563400 + 39.9687700 97.4343300 + 39.9489700 97.4469400 + 39.9383900 97.5117100 + 39.8984600 97.5628400 + 39.9177800 97.5892400 + 39.8778200 97.6403000 + 39.8966000 97.7056800 + 39.9358900 97.7066100 + 39.9553600 97.7200800 + 39.9755300 97.6815500 + 40.0248100 97.6696900 + 40.0261500 97.5656100 + 40.0953900 97.5280500 + 40.1658100 97.3861200 + 40.1666500 97.3079100 + 40.0984100 97.2545600 + 40.0991600 97.1764200 + 40.1974000 97.1780400 + 40.1786800 97.0734100 + 40.1985500 97.0476200 +633 633 -1 16 39.88500 96.97911 + 40.0521100 96.9283200 + 40.0522100 96.9153100 + 40.0423900 96.9151800 + 39.9247800 96.8747000 + 39.9252200 96.8097400 + 39.8662000 96.8220600 + 39.7182300 96.9110600 + 39.7177400 96.9758500 + 39.7666500 97.0024300 + 39.8741600 97.0688600 + 39.8933500 97.1211000 + 39.9815300 97.1484800 + 40.0210500 97.1230900 + 40.0212800 97.0970800 + 39.9729300 97.0053200 + 40.0521100 96.9283200 +634 634 -1 12 39.83870 96.45166 + 39.9960900 96.3553200 + 39.9273300 96.3549700 + 39.8488100 96.3286300 + 39.7600900 96.4319300 + 39.6814200 96.4573600 + 39.7203400 96.5483000 + 39.7791600 96.5746800 + 39.8286100 96.4972200 + 39.9269400 96.4719200 + 39.9663300 96.4461700 + 39.9665400 96.3811700 + 39.9960900 96.3553200 +635 635 -1 20 39.74070 96.26311 + 39.8785700 96.1859300 + 39.7902100 96.1468000 + 39.7804300 96.1078700 + 39.7214900 96.1207400 + 39.6724100 96.0688700 + 39.6527500 96.0947400 + 39.6722100 96.2371900 + 39.6230700 96.2499700 + 39.6230100 96.2758500 + 39.6034200 96.2499000 + 39.5542600 96.2755800 + 39.5541300 96.3272900 + 39.6620300 96.3795600 + 39.6814200 96.4573600 + 39.7600900 96.4319300 + 39.8488100 96.3286300 + 39.9273300 96.3549700 + 39.8981600 96.2249500 + 39.8785100 96.2248800 + 39.8785700 96.1859300 +636 636 -1 15 39.51600 96.97315 + 39.5810900 96.8576000 + 39.4926100 96.8694800 + 39.4634100 96.8303900 + 39.4533200 96.8690000 + 39.3943000 96.8812000 + 39.3843000 96.9068600 + 39.3839100 96.9584400 + 39.4425400 96.9979500 + 39.4324000 97.0365200 + 39.4715800 97.0500000 + 39.5594100 97.1159100 + 39.6481400 97.0784500 + 39.6194200 96.9874500 + 39.6201100 96.8968900 + 39.5810900 96.8576000 +637 637 -1 21 39.60200 96.55371 + 39.6814200 96.4573600 + 39.6620300 96.3795600 + 39.5541300 96.3272900 + 39.5246700 96.3271600 + 39.5247300 96.3013200 + 39.4952400 96.3141100 + 39.4950600 96.3786800 + 39.4754100 96.3785800 + 39.4752000 96.4431500 + 39.4355600 96.5332400 + 39.4249100 96.7009100 + 39.5034100 96.7145900 + 39.5912600 96.8059900 + 39.6010800 96.8061100 + 39.6013200 96.7673000 + 39.6412700 96.6512500 + 39.7592000 96.6393400 + 39.7789200 96.6265600 + 39.7791600 96.5746800 + 39.7203400 96.5483000 + 39.6814200 96.4573600 +638 638 -1 22 39.42480 96.71328 + 39.5912600 96.8059900 + 39.5034100 96.7145900 + 39.4249100 96.7009100 + 39.4355600 96.5332400 + 39.4258000 96.5202600 + 39.3472300 96.5197000 + 39.3175900 96.5581400 + 39.2586100 96.5705600 + 39.2583000 96.6349300 + 39.2772900 96.7509900 + 39.3260000 96.8159300 + 39.3554600 96.8162600 + 39.3746600 96.8809500 + 39.3844800 96.8810700 + 39.3843000 96.9068600 + 39.3943000 96.8812000 + 39.4533200 96.8690000 + 39.4634100 96.8303900 + 39.4926100 96.8694800 + 39.5810900 96.8576000 + 39.5910900 96.8318600 + 39.5912600 96.8059900 +640 640 -1 18 41.13600 97.61501 + 41.2160800 97.5126100 + 41.1578700 97.4452600 + 41.1395000 97.3259200 + 41.0608600 97.3244500 + 41.0510300 97.3242600 + 41.0501800 97.4034600 + 41.0696900 97.4170500 + 41.0787700 97.4832600 + 41.0478500 97.6014300 + 41.1164900 97.6162000 + 41.0763200 97.6813100 + 41.0550400 97.7996300 + 41.0731600 97.9057500 + 41.1230900 97.8542300 + 41.1438700 97.7754500 + 41.1252900 97.6956900 + 41.2241100 97.6583600 + 41.2160800 97.5126100 +701 701 -1 15 42.51360 99.10980 + 42.4678500 98.6177200 + 42.4284900 98.6162300 + 42.3767900 98.7354000 + 42.4794000 98.9955300 + 42.4762200 99.1301700 + 42.5214300 99.2940700 + 42.5033800 99.6033700 + 42.5627900 99.5929600 + 42.5948800 99.5001000 + 42.6346100 99.4885900 + 42.6503900 99.2596600 + 42.5679700 98.9993500 + 42.5032900 98.8078000 + 42.4737600 98.8066100 + 42.4678500 98.6177200 +702 702 -1 15 42.29350 98.58879 + 42.3068800 98.2756000 + 42.2473700 98.3005100 + 42.1934000 98.5537300 + 42.1327600 98.6319700 + 42.1186800 98.8325500 + 42.1371700 98.8869500 + 42.1762200 98.9019900 + 42.2474400 98.7974900 + 42.3767900 98.7354000 + 42.4284900 98.6162300 + 42.4678500 98.6177200 + 42.4684000 98.5907900 + 42.4306100 98.5085800 + 42.4228000 98.4005700 + 42.3068800 98.2756000 +703 703 -1 24 42.12080 98.43000 + 42.1731300 98.0297400 + 42.0944200 98.0274500 + 42.0940000 98.0542400 + 42.0542100 98.0798600 + 42.0535600 98.1200100 + 41.9945400 98.1182300 + 41.9840400 98.1580400 + 41.9346300 98.1698900 + 41.9428600 98.2637500 + 41.9812500 98.3185100 + 42.0412300 98.2669400 + 42.0705100 98.2812900 + 42.0473900 98.4680300 + 42.0665500 98.4955000 + 42.0717900 98.7234600 + 42.1186800 98.8325500 + 42.1327600 98.6319700 + 42.1934000 98.5537300 + 42.2473700 98.3005100 + 42.3068800 98.2756000 + 42.2686800 98.2071700 + 42.2792100 98.1672000 + 42.2210500 98.1116900 + 42.1731300 98.0297400 +704 704 -1 35 42.00820 97.78967 + 42.1004300 97.5987900 + 42.0714000 97.5579400 + 42.0726500 97.4508100 + 42.0140500 97.4094400 + 41.8860100 97.4202200 + 41.8952500 97.4738500 + 41.9247600 97.4744700 + 41.9231600 97.6081100 + 41.8843100 97.5671400 + 41.8644700 97.5800500 + 41.8228800 97.7526200 + 41.8319800 97.8062500 + 41.9002700 97.8481100 + 41.9282100 97.9557900 + 41.9278000 97.9825100 + 41.8980800 97.9950300 + 41.8974600 98.0351100 + 41.8777800 98.0345400 + 41.9162800 98.0891200 + 41.9346300 98.1698900 + 41.9840400 98.1580400 + 41.9945400 98.1182300 + 42.0535600 98.1200100 + 42.0542100 98.0798600 + 42.0940000 98.0542400 + 42.0944200 98.0274500 + 42.1731300 98.0297400 + 42.1934400 97.9900700 + 42.1639200 97.9892300 + 42.1653300 97.8953700 + 42.1267400 97.8407000 + 42.1466100 97.8278100 + 42.1473600 97.7741900 + 42.1182000 97.7466400 + 42.1004300 97.5987900 +705 NF ELKHORN RIVER NR PIERCE NE -1 496 42.33500 97.62750 + 42.1787500 97.4879170 + 42.1745830 97.4983540 + 42.1620830 97.5108540 + 42.1641880 97.5129170 + 42.1662500 97.5149790 + 42.1662500 97.5275210 + 42.1641880 97.5295830 + 42.1558130 97.5295830 + 42.1537500 97.5274790 + 42.1516880 97.5254170 + 42.1454170 97.5274790 + 42.1412500 97.5399790 + 42.1412500 97.5691880 + 42.1391460 97.5712500 + 42.1370830 97.5733130 + 42.1370830 97.5775210 + 42.1349790 97.5795830 + 42.1329170 97.5816460 + 42.1329170 97.5858540 + 42.1308130 97.5879170 + 42.1287500 97.5899790 + 42.1287500 97.6025210 + 42.1266460 97.6045830 + 42.1245830 97.6066880 + 42.1225210 97.6087500 + 42.1183130 97.6087500 + 42.1162500 97.6108540 + 42.1141880 97.6129170 + 42.1058130 97.6129170 + 42.1037500 97.6150210 + 42.1016460 97.6170830 + 42.0995830 97.6170830 + 42.0954170 97.6358540 + 42.0975210 97.6379170 + 42.0995830 97.6399790 + 42.0995830 97.6483540 + 42.1016880 97.6504170 + 42.1037500 97.6524790 + 42.1037500 97.6691880 + 42.1016460 97.6712500 + 42.0995830 97.6858540 + 42.1016880 97.6879170 + 42.1037500 97.6941880 + 42.1058540 97.6962500 + 42.1079170 97.6983130 + 42.1079170 97.7025210 + 42.1100210 97.7045830 + 42.1120830 97.7066460 + 42.1120830 97.7108540 + 42.1141880 97.7129170 + 42.1162500 97.7150210 + 42.1183540 97.7170830 + 42.1204170 97.7191880 + 42.1183130 97.7212500 + 42.1162500 97.7233130 + 42.1162500 97.7316880 + 42.1141460 97.7337500 + 42.1120830 97.7358130 + 42.1120830 97.7441880 + 42.1141880 97.7462500 + 42.1162500 97.7483540 + 42.1183540 97.7504170 + 42.1204170 97.7525210 + 42.1225210 97.7545830 + 42.1245830 97.7566460 + 42.1245830 97.7650210 + 42.1266880 97.7670830 + 42.1287500 97.7691880 + 42.1308540 97.7712500 + 42.1329170 97.7733130 + 42.1329170 97.7775210 + 42.1350210 97.7795830 + 42.1370830 97.7816460 + 42.1370830 97.7858540 + 42.1391880 97.7879170 + 42.1412500 97.7899790 + 42.1412500 97.7983540 + 42.1433130 97.8004170 + 42.1475210 97.8004170 + 42.1495830 97.8025210 + 42.1516460 97.8045830 + 42.1683540 97.8045830 + 42.1704170 97.8066880 + 42.1725210 97.8087500 + 42.1745830 97.8108540 + 42.1766880 97.8129170 + 42.1787500 97.8149790 + 42.1787500 97.8233540 + 42.1766460 97.8254170 + 42.1745830 97.8274790 + 42.1745830 97.8525210 + 42.1724790 97.8545830 + 42.1704170 97.8566880 + 42.1683130 97.8587500 + 42.1662500 97.8608130 + 42.1662500 97.8650210 + 42.1641460 97.8670830 + 42.1620830 97.8691460 + 42.1620830 97.8733540 + 42.1599790 97.8754170 + 42.1579170 97.8774790 + 42.1579170 97.8816880 + 42.1558130 97.8837500 + 42.1537500 97.8858130 + 42.1537500 97.8900210 + 42.1558540 97.8920830 + 42.1579170 97.8941880 + 42.1600210 97.8962500 + 42.1620830 97.8983130 + 42.1620830 97.9066880 + 42.1641880 97.9087500 + 42.1662500 97.9108130 + 42.1662500 97.9150210 + 42.1683540 97.9170830 + 42.1704170 97.9191460 + 42.1704170 97.9233540 + 42.1683130 97.9254170 + 42.1662500 97.9275210 + 42.1683540 97.9295830 + 42.1704170 97.9316460 + 42.1704170 97.9525210 + 42.1725210 97.9545830 + 42.1745830 97.9608540 + 42.1724790 97.9629170 + 42.1704170 97.9691880 + 42.1725210 97.9712500 + 42.1745830 97.9733130 + 42.1745830 97.9816880 + 42.1766460 97.9837500 + 42.1808540 97.9837500 + 42.1829170 97.9858540 + 42.1849790 97.9879170 + 42.1912500 97.9899790 + 42.1912500 97.9941880 + 42.1933540 97.9962500 + 42.1954170 97.9983540 + 42.1933130 98.0004170 + 42.1912500 98.0024790 + 42.1912500 98.0108540 + 42.1891460 98.0129170 + 42.1870830 98.0149790 + 42.1870830 98.0275210 + 42.1891880 98.0295830 + 42.1912500 98.0316460 + 42.1912500 98.0441880 + 42.1933540 98.0462500 + 42.1954170 98.0483540 + 42.1975210 98.0504170 + 42.1995830 98.0524790 + 42.1995830 98.0566880 + 42.2016880 98.0587500 + 42.2037500 98.0608540 + 42.2058540 98.0629170 + 42.2079170 98.0649790 + 42.2079170 98.0775210 + 42.2100210 98.0795830 + 42.2120830 98.0816460 + 42.2120830 98.0983540 + 42.2141880 98.1004170 + 42.2162500 98.1024790 + 42.2162500 98.1066880 + 42.2183130 98.1087500 + 42.2225210 98.1087500 + 42.2245830 98.1108540 + 42.2266460 98.1129170 + 42.2350210 98.1129170 + 42.2370830 98.1150210 + 42.2391460 98.1170830 + 42.2433540 98.1170830 + 42.2454170 98.1191880 + 42.2474790 98.1212500 + 42.2516880 98.1212500 + 42.2537500 98.1233540 + 42.2558130 98.1254170 + 42.2641880 98.1254170 + 42.2662500 98.1254170 + 42.2662500 98.1149790 + 42.2683130 98.1129170 + 42.2704170 98.1108540 + 42.2704170 98.1024790 + 42.2724790 98.1004170 + 42.2766880 98.1004170 + 42.2787500 98.0983540 + 42.2787500 98.0858130 + 42.2808130 98.0837500 + 42.2829170 98.0816880 + 42.2829170 98.0649790 + 42.2849790 98.0629170 + 42.2870830 98.0608540 + 42.2870830 98.0483130 + 42.2891460 98.0462500 + 42.2912500 98.0441880 + 42.2933130 98.0420830 + 42.2954170 98.0400210 + 42.2974790 98.0379170 + 42.2995830 98.0358540 + 42.3037500 98.0316880 + 42.3037500 98.0108130 + 42.3058130 98.0087500 + 42.3079170 98.0066880 + 42.3099790 98.0045830 + 42.3120830 98.0025210 + 42.3120830 97.9941460 + 42.3141460 97.9920830 + 42.3162500 97.9900210 + 42.3183130 97.9879170 + 42.3204170 97.9858540 + 42.3204170 97.9733130 + 42.3224790 97.9712500 + 42.3245830 97.9691880 + 42.3245830 97.9524790 + 42.3266460 97.9504170 + 42.3287500 97.9483540 + 42.3266880 97.9462500 + 42.3245830 97.9441880 + 42.3245830 97.9358130 + 42.3225210 97.9337500 + 42.3204170 97.9316880 + 42.3183540 97.9295830 + 42.3162500 97.9275210 + 42.3162500 97.9191460 + 42.3183130 97.9170830 + 42.3204170 97.9150210 + 42.3204170 97.9108130 + 42.3183540 97.9087500 + 42.3162500 97.9066880 + 42.3183130 97.9045830 + 42.3204170 97.9025210 + 42.3224790 97.9004170 + 42.3266880 97.9004170 + 42.3287500 97.8983540 + 42.3308130 97.8962500 + 42.3329170 97.8941880 + 42.3329170 97.8774790 + 42.3349790 97.8754170 + 42.3370830 97.8733540 + 42.3391460 97.8712500 + 42.3412500 97.8691880 + 42.3433130 97.8670830 + 42.3475210 97.8670830 + 42.3495830 97.8650210 + 42.3516460 97.8629170 + 42.3537500 97.8608540 + 42.3537500 97.8483130 + 42.3558130 97.8462500 + 42.3579170 97.8441880 + 42.3599790 97.8420830 + 42.3641880 97.8420830 + 42.3662500 97.8400210 + 42.3683130 97.8379170 + 42.3704170 97.8358540 + 42.3745830 97.8275210 + 42.3745830 97.8066460 + 42.3787500 97.7983130 + 42.3870830 97.7941460 + 42.3891460 97.7962500 + 42.3912500 97.7983130 + 42.3933130 97.8004170 + 42.4079170 97.7983540 + 42.4079170 97.7774790 + 42.4099790 97.7754170 + 42.4141880 97.7754170 + 42.4162500 97.7774790 + 42.4183130 97.7795830 + 42.4204170 97.7816460 + 42.4224790 97.7837500 + 42.4245830 97.7858130 + 42.4266460 97.7879170 + 42.4287500 97.7899790 + 42.4308130 97.7920830 + 42.4350210 97.7920830 + 42.4370830 97.7941460 + 42.4391460 97.7962500 + 42.4412500 97.7983130 + 42.4433130 97.8004170 + 42.4454170 97.7983540 + 42.4474790 97.7962500 + 42.4495830 97.7941880 + 42.4516460 97.7920830 + 42.4558540 97.7920830 + 42.4579170 97.7900210 + 42.4599790 97.7879170 + 42.4620830 97.7858540 + 42.4641460 97.7837500 + 42.4662500 97.7816880 + 42.4683130 97.7795830 + 42.4704170 97.7775210 + 42.4745830 97.7691880 + 42.4745830 97.7524790 + 42.4725210 97.7504170 + 42.4704170 97.7483540 + 42.4704170 97.7399790 + 42.4724790 97.7379170 + 42.4745830 97.7358540 + 42.4745830 97.7316460 + 42.4725210 97.7295830 + 42.4704170 97.7275210 + 42.4704170 97.7066460 + 42.4683540 97.7045830 + 42.4662500 97.7025210 + 42.4683130 97.7004170 + 42.4704170 97.6983540 + 42.4724790 97.6962500 + 42.4745830 97.6941880 + 42.4766460 97.6920830 + 42.4808540 97.6920830 + 42.4829170 97.6900210 + 42.4849790 97.6879170 + 42.4891880 97.6879170 + 42.4912500 97.6858540 + 42.5037500 97.6733540 + 42.5037500 97.6649790 + 42.5079170 97.6608540 + 42.5079170 97.6441460 + 42.5099790 97.6420830 + 42.5120830 97.6400210 + 42.5120830 97.6274790 + 42.5141460 97.6254170 + 42.5162500 97.6233540 + 42.5141880 97.6212500 + 42.5120830 97.6191880 + 42.5120830 97.6066460 + 42.5141460 97.6045830 + 42.5162500 97.6025210 + 42.5183130 97.6004170 + 42.5204170 97.5983540 + 42.5224790 97.5962500 + 42.5266880 97.5962500 + 42.5287500 97.5941880 + 42.5308130 97.5920830 + 42.5329170 97.5900210 + 42.5349790 97.5879170 + 42.5370830 97.5858540 + 42.5391460 97.5837500 + 42.5412500 97.5816880 + 42.5412500 97.5733130 + 42.5433130 97.5712500 + 42.5454170 97.5691880 + 42.5454170 97.5524790 + 42.5474790 97.5504170 + 42.5495830 97.5524790 + 42.5516460 97.5545830 + 42.5537500 97.5525210 + 42.5537500 97.5399790 + 42.5558130 97.5379170 + 42.5579170 97.5358540 + 42.5599790 97.5337500 + 42.5641880 97.5337500 + 42.5662500 97.5358130 + 42.5683130 97.5379170 + 42.5725210 97.5379170 + 42.5745830 97.5358540 + 42.5745830 97.5149790 + 42.5725210 97.5129170 + 42.5683130 97.5129170 + 42.5662500 97.5108540 + 42.5641880 97.5087500 + 42.5558130 97.5087500 + 42.5537500 97.5066880 + 42.5516880 97.5045830 + 42.5433130 97.5045830 + 42.5412500 97.5025210 + 42.5391880 97.5004170 + 42.5349790 97.5004170 + 42.5287500 97.4899790 + 42.5266880 97.4879170 + 42.5245830 97.4858540 + 42.5225210 97.4837500 + 42.5204170 97.4816880 + 42.5183540 97.4795830 + 42.5162500 97.4775210 + 42.5162500 97.4691460 + 42.5141880 97.4670830 + 42.5120830 97.4650210 + 42.5100210 97.4629170 + 42.5079170 97.4649790 + 42.5058540 97.4670830 + 42.5016460 97.4670830 + 42.4995830 97.4650210 + 42.4954170 97.4608540 + 42.4912500 97.4566880 + 42.4870830 97.4525210 + 42.4870830 97.4483130 + 42.4725210 97.4337500 + 42.4683130 97.4337500 + 42.4662500 97.4358130 + 42.4641880 97.4379170 + 42.4558130 97.4379170 + 42.4495830 97.4316460 + 42.4495830 97.4295830 + 42.4474790 97.4295830 + 42.4454170 97.4275210 + 42.4433540 97.4254170 + 42.4349790 97.4254170 + 42.4329170 97.4274790 + 42.4308540 97.4295830 + 42.4287500 97.4275210 + 42.4266880 97.4254170 + 42.4245830 97.4233540 + 42.4225210 97.4212500 + 42.4099790 97.4212500 + 42.4079170 97.4191880 + 42.4058540 97.4170830 + 42.4037500 97.4150210 + 42.4016880 97.4129170 + 42.3995830 97.4149790 + 42.3975210 97.4170830 + 42.3954170 97.4191460 + 42.3933540 97.4212500 + 42.3808130 97.4212500 + 42.3724790 97.4170830 + 42.3704170 97.4150210 + 42.3683540 97.4129170 + 42.3662500 97.4108540 + 42.3641880 97.4087500 + 42.3620830 97.4066880 + 42.3620830 97.4024790 + 42.3600210 97.4004170 + 42.3579170 97.3983540 + 42.3558540 97.3962500 + 42.3537500 97.3941880 + 42.3516880 97.3920830 + 42.3474790 97.3920830 + 42.3454170 97.3900210 + 42.3433540 97.3879170 + 42.3391460 97.3879170 + 42.3370830 97.3858540 + 42.3370830 97.3774790 + 42.3287500 97.3649790 + 42.3266880 97.3629170 + 42.3245830 97.3608540 + 42.3245830 97.3524790 + 42.3225210 97.3504170 + 42.3204170 97.3483540 + 42.3183540 97.3462500 + 42.3058130 97.3462500 + 42.2975210 97.3379170 + 42.2766460 97.3379170 + 42.2745830 97.3358540 + 42.2725210 97.3337500 + 42.2516460 97.3337500 + 42.2454170 97.3191460 + 42.2433540 97.3170830 + 42.2391460 97.3170830 + 42.2370830 97.3191460 + 42.2350210 97.3212500 + 42.2266460 97.3212500 + 42.2224790 97.3170830 + 42.2204170 97.3170830 + 42.2141880 97.3254170 + 42.2058130 97.3254170 + 42.2037500 97.3275210 + 42.2016460 97.3295830 + 42.1995830 97.3316460 + 42.1995830 97.3358540 + 42.1974790 97.3379170 + 42.1954170 97.3399790 + 42.1954170 97.3441880 + 42.1933130 97.3462500 + 42.1912500 97.3483130 + 42.1912500 97.3608540 + 42.1891880 97.3629170 + 42.1849790 97.3629170 + 42.1829170 97.3650210 + 42.1808130 97.3670830 + 42.1787500 97.3691460 + 42.1787500 97.3816880 + 42.1808540 97.3837500 + 42.1829170 97.3858540 + 42.1850210 97.3879170 + 42.1870830 97.3900210 + 42.1891880 97.3920830 + 42.1912500 97.3941460 + 42.1912500 97.3983540 + 42.1891460 97.4004170 + 42.1870830 97.4024790 + 42.1870830 97.4108540 + 42.1891880 97.4129170 + 42.1912500 97.4149790 + 42.1912500 97.4400210 + 42.1891460 97.4420830 + 42.1870830 97.4441880 + 42.1891880 97.4462500 + 42.1912500 97.4483130 + 42.1912500 97.4525210 + 42.1933540 97.4545830 + 42.1954170 97.4608540 + 42.1933130 97.4629170 + 42.1912500 97.4650210 + 42.1891460 97.4670830 + 42.1870830 97.4691460 + 42.1870830 97.4775210 + 42.1849790 97.4795830 + 42.1829170 97.4816880 + 42.1808130 97.4837500 + 42.1787500 97.4879170 +706 706 -1 38 41.92570 97.39318 + 42.1447400 97.1305100 + 42.0760800 97.1026100 + 42.0665800 97.0622800 + 42.0371700 97.0484400 + 41.9487200 97.0337400 + 41.8990900 97.0864600 + 41.8795300 97.0727900 + 41.8494400 97.1390900 + 41.8001400 97.1516300 + 41.7997700 97.1916500 + 41.8193200 97.2053300 + 41.7896900 97.2181600 + 41.7695000 97.2711600 + 41.6809800 97.2695500 + 41.6793000 97.4293600 + 41.6395100 97.4684800 + 41.6293700 97.4949000 + 41.6672600 97.6155600 + 41.7649300 97.6711600 + 41.7837200 97.7383100 + 41.8228800 97.7526200 + 41.8644700 97.5800500 + 41.8843100 97.5671400 + 41.9231600 97.6081100 + 41.9247600 97.4744700 + 41.8952500 97.4738500 + 41.8860100 97.4202200 + 42.0140500 97.4094400 + 42.0726500 97.4508100 + 42.0714000 97.5579400 + 42.1004300 97.5987900 + 42.1302800 97.5726600 + 42.1409100 97.5058600 + 42.1702800 97.5199100 + 42.1821900 97.3323400 + 42.2221000 97.2794100 + 42.1436300 97.2511600 + 42.1447400 97.1305100 +707 707 -1 20 41.99950 96.90828 + 42.0783400 96.7945600 + 42.0292200 96.7806100 + 42.0195400 96.7537300 + 41.9606600 96.7263600 + 41.9412000 96.6860500 + 41.8328300 96.7116800 + 41.8424400 96.7518300 + 41.9013100 96.7791800 + 41.8701200 97.0192300 + 41.8503400 97.0323000 + 41.8696900 97.0726400 + 41.8795300 97.0727900 + 41.8990900 97.0864600 + 41.9487200 97.0337400 + 42.0371700 97.0484400 + 42.0665800 97.0622800 + 42.0760800 97.1026100 + 42.1447400 97.1305100 + 42.1661100 96.9162600 + 42.0783400 96.7945600 +708 708 -1 20 41.79820 96.75809 + 41.8503400 97.0323000 + 41.8701200 97.0192300 + 41.9013100 96.7791800 + 41.8424400 96.7518300 + 41.8328300 96.7116800 + 41.9412000 96.6860500 + 41.9606600 96.7263600 + 42.0195400 96.7537300 + 42.0198400 96.7002000 + 41.8826900 96.5786100 + 41.7941500 96.5778800 + 41.7841300 96.6178200 + 41.7448400 96.6041400 + 41.7060000 96.4838900 + 41.6174200 96.4965900 + 41.5977000 96.5097500 + 41.5968300 96.6959900 + 41.5766200 96.7888800 + 41.6151700 96.9090700 + 41.8503400 97.0323000 +709 LOGAN CR. AT PENDER NE -1 506 42.31833 97.04833 + 42.1079170 96.7024790 + 42.1183130 96.7212500 + 42.1225210 96.7212500 + 42.1245830 96.7233130 + 42.1329170 96.7358130 + 42.1329170 96.7441880 + 42.1350210 96.7462500 + 42.1370830 96.7483130 + 42.1370830 96.7566880 + 42.1349790 96.7587500 + 42.1329170 96.7608540 + 42.1266880 96.7670830 + 42.1224790 96.7670830 + 42.1204170 96.7691880 + 42.1183540 96.7712500 + 42.1141460 96.7712500 + 42.1120830 96.7733130 + 42.1100210 96.7795830 + 42.1058130 96.7795830 + 42.1037500 96.7816880 + 42.0995830 96.7858130 + 42.0995830 96.7941880 + 42.0974790 96.7962500 + 42.0954170 96.7983540 + 42.0933540 96.8004170 + 42.0891460 96.8004170 + 42.0870830 96.8025210 + 42.0849790 96.8045830 + 42.0829170 96.8045830 + 42.0870830 96.8108130 + 42.0870830 96.8150210 + 42.0891880 96.8170830 + 42.0912500 96.8191880 + 42.0995830 96.8275210 + 42.0974790 96.8295830 + 42.0954170 96.8316460 + 42.0954170 96.8358540 + 42.0975210 96.8379170 + 42.0995830 96.8400210 + 42.1016880 96.8420830 + 42.1037500 96.8441460 + 42.1037500 96.8483540 + 42.1058540 96.8504170 + 42.1079170 96.8524790 + 42.1079170 96.8608540 + 42.1099790 96.8629170 + 42.1141880 96.8629170 + 42.1162500 96.8649790 + 42.1162500 96.8691880 + 42.1183540 96.8712500 + 42.1204170 96.8733540 + 42.1370830 96.8899790 + 42.1370830 96.8983540 + 42.1391880 96.9004170 + 42.1412500 96.9025210 + 42.1433540 96.9045830 + 42.1454170 96.9066880 + 42.1475210 96.9087500 + 42.1495830 96.9108540 + 42.1516460 96.9129170 + 42.1558540 96.9129170 + 42.1579170 96.9150210 + 42.1600210 96.9170830 + 42.1620830 96.9191460 + 42.1620830 96.9275210 + 42.1599790 96.9295830 + 42.1579170 96.9316460 + 42.1579170 96.9400210 + 42.1600210 96.9420830 + 42.1620830 96.9441880 + 42.1641880 96.9462500 + 42.1662500 96.9483540 + 42.1683540 96.9504170 + 42.1704170 96.9524790 + 42.1704170 96.9566880 + 42.1683130 96.9587500 + 42.1662500 96.9608130 + 42.1662500 96.9858540 + 42.1683540 96.9879170 + 42.1704170 96.9899790 + 42.1704170 97.0066880 + 42.1683130 97.0087500 + 42.1662500 97.0108130 + 42.1662500 97.0316880 + 42.1641460 97.0337500 + 42.1620830 97.0358130 + 42.1620830 97.0525210 + 42.1599790 97.0545830 + 42.1579170 97.0566880 + 42.1558130 97.0587500 + 42.1537500 97.0608130 + 42.1537500 97.0691880 + 42.1558540 97.0712500 + 42.1579170 97.0941880 + 42.1558130 97.0962500 + 42.1537500 97.0983130 + 42.1537500 97.1025210 + 42.1516460 97.1045830 + 42.1495830 97.1066880 + 42.1474790 97.1087500 + 42.1454170 97.1108540 + 42.1433130 97.1129170 + 42.1412500 97.1150210 + 42.1433540 97.1170830 + 42.1454170 97.1191880 + 42.1475210 97.1212500 + 42.1495830 97.1233540 + 42.1516880 97.1254170 + 42.1537500 97.1274790 + 42.1537500 97.1358540 + 42.1516460 97.1379170 + 42.1495830 97.1399790 + 42.1495830 97.1525210 + 42.1474790 97.1545830 + 42.1454170 97.1545830 + 42.1495830 97.2025210 + 42.1474790 97.2045830 + 42.1454170 97.2066880 + 42.1475210 97.2087500 + 42.1495830 97.2275210 + 42.1474790 97.2295830 + 42.1454170 97.2316460 + 42.1454170 97.2358540 + 42.1433130 97.2379170 + 42.1412500 97.2399790 + 42.1412500 97.2608540 + 42.1433540 97.2629170 + 42.1454170 97.2650210 + 42.1475210 97.2670830 + 42.1495830 97.2691880 + 42.1516880 97.2712500 + 42.1537500 97.2733540 + 42.1558540 97.2754170 + 42.1579170 97.2775210 + 42.1599790 97.2795830 + 42.1683540 97.2795830 + 42.1704170 97.2816880 + 42.1724790 97.2837500 + 42.1766880 97.2837500 + 42.1787500 97.2858130 + 42.1808130 97.3004170 + 42.1891880 97.3004170 + 42.1912500 97.2983130 + 42.1933130 97.2962500 + 42.2016880 97.2962500 + 42.2037500 97.2983540 + 42.2058130 97.3004170 + 42.2100210 97.3004170 + 42.2120830 97.3025210 + 42.2141880 97.3045830 + 42.2162500 97.3066460 + 42.2162500 97.3150210 + 42.2183130 97.3170830 + 42.2225210 97.3170830 + 42.2245830 97.3191880 + 42.2266460 97.3212500 + 42.2350210 97.3212500 + 42.2370830 97.3191460 + 42.2391460 97.3170830 + 42.2433540 97.3170830 + 42.2454170 97.3191460 + 42.2454170 97.3275210 + 42.2475210 97.3295830 + 42.2495830 97.3316880 + 42.2516460 97.3337500 + 42.2725210 97.3337500 + 42.2745830 97.3358540 + 42.2766460 97.3379170 + 42.2975210 97.3379170 + 42.2995830 97.3400210 + 42.3016880 97.3420830 + 42.3037500 97.3441880 + 42.3058130 97.3462500 + 42.3183540 97.3462500 + 42.3204170 97.3483540 + 42.3225210 97.3504170 + 42.3245830 97.3524790 + 42.3245830 97.3608540 + 42.3266880 97.3629170 + 42.3287500 97.3649790 + 42.3287500 97.3691880 + 42.3308540 97.3712500 + 42.3370830 97.3774790 + 42.3370830 97.3858540 + 42.3391460 97.3879170 + 42.3454170 97.3900210 + 42.3474790 97.3920830 + 42.3516880 97.3920830 + 42.3537500 97.3941880 + 42.3558540 97.3962500 + 42.3579170 97.3983540 + 42.3600210 97.4004170 + 42.3620830 97.4024790 + 42.3620830 97.4066880 + 42.3724790 97.4170830 + 42.3808130 97.4212500 + 42.3933540 97.4212500 + 42.3954170 97.4191460 + 42.3975210 97.4170830 + 42.3995830 97.4149790 + 42.4016880 97.4129170 + 42.4037500 97.4150210 + 42.4058540 97.4170830 + 42.4079170 97.4191880 + 42.4099790 97.4212500 + 42.4225210 97.4212500 + 42.4245830 97.4233540 + 42.4266880 97.4254170 + 42.4287500 97.4275210 + 42.4308540 97.4295830 + 42.4329170 97.4274790 + 42.4349790 97.4254170 + 42.4433540 97.4254170 + 42.4454170 97.4275210 + 42.4475210 97.4295830 + 42.4495830 97.4295830 + 42.4495830 97.4108130 + 42.4516460 97.4087500 + 42.4537500 97.4066880 + 42.4537500 97.3983130 + 42.4558130 97.3962500 + 42.4579170 97.3941880 + 42.4579170 97.3899790 + 42.4620830 97.3858540 + 42.4620830 97.3816460 + 42.4641460 97.3795830 + 42.4662500 97.3775210 + 42.4662500 97.3566460 + 42.4641880 97.3545830 + 42.4620830 97.3525210 + 42.4620830 97.3233130 + 42.4641460 97.3212500 + 42.4662500 97.3191880 + 42.4662500 97.3149790 + 42.4683130 97.3129170 + 42.4704170 97.3108540 + 42.4724790 97.3087500 + 42.4745830 97.3066880 + 42.4745830 97.3024790 + 42.4766460 97.3004170 + 42.4850210 97.3004170 + 42.4870830 97.2983540 + 42.4891460 97.2962500 + 42.4912500 97.2941880 + 42.4912500 97.2774790 + 42.4891880 97.2754170 + 42.4870830 97.2733540 + 42.4870830 97.2691460 + 42.4891460 97.2670830 + 42.4912500 97.2650210 + 42.4912500 97.2566460 + 42.4891880 97.2545830 + 42.4849790 97.2545830 + 42.4829170 97.2525210 + 42.4829170 97.2483130 + 42.4808540 97.2462500 + 42.4787500 97.2441880 + 42.4787500 97.2358130 + 42.4766880 97.2337500 + 42.4724790 97.2337500 + 42.4704170 97.2316880 + 42.4724790 97.2254170 + 42.4766880 97.2254170 + 42.4787500 97.2233540 + 42.4787500 97.2108130 + 42.4808130 97.2087500 + 42.4891880 97.2087500 + 42.4912500 97.2108130 + 42.4933130 97.2129170 + 42.5058540 97.2129170 + 42.5079170 97.2108540 + 42.5099790 97.2087500 + 42.5120830 97.2066880 + 42.5141460 97.2045830 + 42.5162500 97.2025210 + 42.5183130 97.2004170 + 42.5204170 97.1983540 + 42.5224790 97.1962500 + 42.5266880 97.1962500 + 42.5287500 97.1941880 + 42.5308130 97.1920830 + 42.5350210 97.1920830 + 42.5370830 97.1941460 + 42.5391460 97.1962500 + 42.5412500 97.1983130 + 42.5433130 97.2004170 + 42.5454170 97.2024790 + 42.5474790 97.2045830 + 42.5516880 97.2045830 + 42.5537500 97.2025210 + 42.5558130 97.2004170 + 42.5579170 97.1983540 + 42.5579170 97.1774790 + 42.5558540 97.1754170 + 42.5537500 97.1733540 + 42.5537500 97.1441460 + 42.5516880 97.1420830 + 42.5495830 97.1400210 + 42.5495830 97.1358130 + 42.5475210 97.1337500 + 42.5454170 97.1316880 + 42.5454170 97.1274790 + 42.5474790 97.1254170 + 42.5495830 97.1233540 + 42.5495830 97.1108130 + 42.5475210 97.1087500 + 42.5454170 97.1066880 + 42.5454170 97.0983130 + 42.5433540 97.0962500 + 42.5412500 97.0941880 + 42.5412500 97.0858130 + 42.5391880 97.0837500 + 42.5370830 97.0816880 + 42.5350210 97.0795830 + 42.5329170 97.0775210 + 42.5308540 97.0754170 + 42.5287500 97.0733540 + 42.5266880 97.0712500 + 42.5245830 97.0691880 + 42.5245830 97.0608130 + 42.5225210 97.0587500 + 42.5204170 97.0566880 + 42.5204170 97.0524790 + 42.5183540 97.0504170 + 42.5162500 97.0483540 + 42.5162500 97.0441460 + 42.5141880 97.0420830 + 42.5120830 97.0400210 + 42.5120830 97.0358130 + 42.5100210 97.0337500 + 42.5058130 97.0337500 + 42.5037500 97.0316880 + 42.5037500 97.0274790 + 42.5016880 97.0254170 + 42.4995830 97.0233540 + 42.4995830 97.0191460 + 42.4975210 97.0170830 + 42.4954170 97.0150210 + 42.4933540 97.0129170 + 42.4912500 97.0108540 + 42.4912500 97.0024790 + 42.4891880 97.0004170 + 42.4870830 96.9983540 + 42.4891460 96.9962500 + 42.4933540 96.9962500 + 42.4954170 96.9941880 + 42.4974790 96.9920830 + 42.5016880 96.9920830 + 42.5037500 96.9900210 + 42.5037500 96.9858130 + 42.4995830 96.9774790 + 42.4891460 96.9754170 + 42.4850210 96.9712500 + 42.4724790 96.9712500 + 42.4704170 96.9733130 + 42.4683540 96.9754170 + 42.4662500 96.9733540 + 42.4641880 96.9712500 + 42.4620830 96.9691880 + 42.4600210 96.9670830 + 42.4516460 96.9670830 + 42.4495830 96.9650210 + 42.4475210 96.9629170 + 42.4454170 96.9608540 + 42.4433540 96.9587500 + 42.4412500 96.9566880 + 42.4391880 96.9545830 + 42.4370830 96.9525210 + 42.4370830 96.9483130 + 42.4350210 96.9462500 + 42.4308130 96.9462500 + 42.4287500 96.9441880 + 42.4266880 96.9420830 + 42.4245830 96.9400210 + 42.4225210 96.9379170 + 42.4204170 96.9358540 + 42.4183540 96.9337500 + 42.4162500 96.9316880 + 42.4162500 96.9191460 + 42.4141880 96.9170830 + 42.4099790 96.9170830 + 42.4079170 96.9150210 + 42.4058540 96.9129170 + 42.4016460 96.9129170 + 42.3975210 96.9087500 + 42.3933540 96.9045830 + 42.3912500 96.9025210 + 42.3933130 96.9004170 + 42.3954170 96.8983540 + 42.3954170 96.8941460 + 42.3933540 96.8920830 + 42.3891460 96.8920830 + 42.3870830 96.8900210 + 42.3850210 96.8879170 + 42.3829170 96.8858540 + 42.3808540 96.8837500 + 42.3745830 96.8775210 + 42.3745830 96.8649790 + 42.3725210 96.8629170 + 42.3704170 96.8608540 + 42.3704170 96.8566460 + 42.3683540 96.8545830 + 42.3662500 96.8525210 + 42.3641880 96.8504170 + 42.3620830 96.8483540 + 42.3620830 96.8441460 + 42.3641460 96.8420830 + 42.3662500 96.8400210 + 42.3683130 96.8379170 + 42.3704170 96.8358540 + 42.3724790 96.8337500 + 42.3745830 96.8316880 + 42.3745830 96.8233130 + 42.3725210 96.8212500 + 42.3704170 96.8191880 + 42.3683540 96.8170830 + 42.3662500 96.8150210 + 42.3641880 96.8129170 + 42.3620830 96.8108540 + 42.3600210 96.8087500 + 42.3516460 96.8087500 + 42.3495830 96.8066880 + 42.3495830 96.7983130 + 42.3475210 96.7962500 + 42.3454170 96.7941880 + 42.3433540 96.7920830 + 42.3412500 96.7900210 + 42.3370830 96.7691460 + 42.3350210 96.7670830 + 42.3329170 96.7650210 + 42.3308540 96.7629170 + 42.3287500 96.7608540 + 42.3266880 96.7587500 + 42.3245830 96.7566880 + 42.3245830 96.7524790 + 42.3225210 96.7504170 + 42.3204170 96.7483540 + 42.3183540 96.7462500 + 42.3162500 96.7441880 + 42.3141880 96.7420830 + 42.3120830 96.7400210 + 42.3120830 96.7316460 + 42.3100210 96.7295830 + 42.3058130 96.7295830 + 42.3037500 96.7275210 + 42.3016880 96.7254170 + 42.2974790 96.7254170 + 42.2954170 96.7233540 + 42.2933540 96.7212500 + 42.2912500 96.7191880 + 42.2912500 96.7149790 + 42.2891880 96.7129170 + 42.2808540 96.7087500 + 42.2683130 96.7087500 + 42.2662500 96.7066880 + 42.2641880 96.7045830 + 42.2620830 96.7025210 + 42.2600210 96.7004170 + 42.2579170 96.6983540 + 42.2558540 96.6962500 + 42.2537500 96.6941880 + 42.2537500 96.6899790 + 42.2516880 96.6879170 + 42.2495830 96.6858540 + 42.2495830 96.6816460 + 42.2475210 96.6795830 + 42.2349790 96.6795830 + 42.2329170 96.6775210 + 42.2308540 96.6754170 + 42.2183130 96.6754170 + 42.2162500 96.6733540 + 42.2162500 96.6649790 + 42.2141880 96.6629170 + 42.2016460 96.6629170 + 42.1995830 96.6649790 + 42.1975210 96.6670830 + 42.1954170 96.6691460 + 42.1933540 96.6712500 + 42.1808130 96.6712500 + 42.1787500 96.6691880 + 42.1766880 96.6670830 + 42.1745830 96.6650210 + 42.1745830 96.6566460 + 42.1725210 96.6545830 + 42.1704170 96.6525210 + 42.1683540 96.6504170 + 42.1599790 96.6504170 + 42.1579170 96.6524790 + 42.1579170 96.6566880 + 42.1558540 96.6587500 + 42.1516460 96.6587500 + 42.1495830 96.6608130 + 42.1475210 96.6629170 + 42.1433130 96.6629170 + 42.1349790 96.6670830 + 42.1329170 96.6691460 + 42.1308540 96.6712500 + 42.1287500 96.6733130 + 42.1287500 96.6775210 + 42.1266880 96.6795830 + 42.1245830 96.6816460 + 42.1225210 96.6837500 + 42.1204170 96.6858130 + 42.1204170 96.6941880 + 42.1141880 96.7004170 + 42.1079170 96.7024790 +710 710 -1 24 41.93700 96.61285 + 42.1677300 96.6480400 + 42.1679300 96.6078000 + 42.1091800 96.5402900 + 42.0698200 96.5399900 + 42.0504000 96.4728900 + 41.9618400 96.4722900 + 41.9423000 96.4320500 + 41.8831700 96.4584000 + 41.8734300 96.4316300 + 41.8536600 96.4582100 + 41.7947200 96.4311400 + 41.7847400 96.4711000 + 41.7356100 96.4574400 + 41.7060000 96.4838900 + 41.7448400 96.6041400 + 41.7841300 96.6178200 + 41.7941500 96.5778800 + 41.8826900 96.5786100 + 42.0198400 96.7002000 + 42.0195400 96.7537300 + 42.0292200 96.7806100 + 42.0783400 96.7945600 + 42.1183200 96.6877900 + 42.1677300 96.6480400 +711 MAPLE CR. NR NICKERSON NE -1 408 41.69333 97.10667 + 41.5579170 96.5399790 + 41.5495830 96.5525210 + 41.5454170 96.5566460 + 41.5454170 96.5650210 + 41.5433130 96.5670830 + 41.5412500 96.5691460 + 41.5412500 96.5775210 + 41.5433540 96.5795830 + 41.5454170 96.5816460 + 41.5454170 96.5941880 + 41.5433130 96.5962500 + 41.5370830 96.6024790 + 41.5370830 96.6150210 + 41.5349790 96.6170830 + 41.5329170 96.6191460 + 41.5329170 96.6275210 + 41.5350210 96.6295830 + 41.5370830 96.6316460 + 41.5370830 96.6358540 + 41.5349790 96.6379170 + 41.5329170 96.6399790 + 41.5329170 96.6441880 + 41.5349790 96.6462500 + 41.5391880 96.6462500 + 41.5454170 96.6524790 + 41.5454170 96.6858540 + 41.5433130 96.6879170 + 41.5412500 96.6899790 + 41.5412500 96.7025210 + 41.5433540 96.7045830 + 41.5454170 96.7108540 + 41.5433130 96.7129170 + 41.5412500 96.7150210 + 41.5433540 96.7170830 + 41.5454170 96.7191460 + 41.5454170 96.7358540 + 41.5475210 96.7379170 + 41.5495830 96.7399790 + 41.5495830 96.7775210 + 41.5516880 96.7795830 + 41.5537500 96.7816460 + 41.5537500 96.7941880 + 41.5516460 96.7962500 + 41.5495830 96.7983130 + 41.5495830 96.8025210 + 41.5474790 96.8045830 + 41.5454170 96.8066880 + 41.5433130 96.8087500 + 41.5412500 96.8108130 + 41.5412500 96.8358540 + 41.5391460 96.8379170 + 41.5370830 96.8399790 + 41.5370830 96.8650210 + 41.5349790 96.8670830 + 41.5329170 96.8691460 + 41.5329170 96.8733540 + 41.5308130 96.8754170 + 41.5287500 96.8775210 + 41.5266460 96.8795830 + 41.5245830 96.8816460 + 41.5245830 96.8983540 + 41.5266880 96.9004170 + 41.5287500 96.9025210 + 41.5266460 96.9045830 + 41.5245830 96.9066460 + 41.5245830 96.9150210 + 41.5224790 96.9170830 + 41.5204170 96.9191460 + 41.5204170 96.9233540 + 41.5183130 96.9254170 + 41.5162500 96.9274790 + 41.5162500 96.9316880 + 41.5141460 96.9337500 + 41.5120830 96.9358130 + 41.5120830 96.9483540 + 41.5141880 96.9504170 + 41.5162500 96.9524790 + 41.5162500 96.9608540 + 41.5141460 96.9629170 + 41.5120830 96.9650210 + 41.5141880 96.9670830 + 41.5162500 96.9691460 + 41.5162500 97.0025210 + 41.5183540 97.0045830 + 41.5204170 97.0066460 + 41.5204170 97.0108540 + 41.5183130 97.0129170 + 41.5162500 97.0149790 + 41.5162500 97.0191880 + 41.5141460 97.0212500 + 41.5120830 97.0233130 + 41.5120830 97.0608540 + 41.5141880 97.0629170 + 41.5162500 97.0650210 + 41.5183540 97.0670830 + 41.5204170 97.0691460 + 41.5204170 97.0733540 + 41.5183130 97.0754170 + 41.5162500 97.0774790 + 41.5162500 97.1066880 + 41.5183540 97.1087500 + 41.5204170 97.1108130 + 41.5204170 97.1233540 + 41.5225210 97.1254170 + 41.5245830 97.1316880 + 41.5266880 97.1337500 + 41.5287500 97.1358130 + 41.5287500 97.1441880 + 41.5266460 97.1462500 + 41.5245830 97.1483130 + 41.5245830 97.1566880 + 41.5266880 97.1587500 + 41.5287500 97.1608130 + 41.5287500 97.1733540 + 41.5308540 97.1754170 + 41.5329170 97.1775210 + 41.5349790 97.1795830 + 41.5516880 97.1837500 + 41.5537500 97.1816880 + 41.5537500 97.1774790 + 41.5558540 97.1754170 + 41.5579170 97.1733130 + 41.5599790 97.1712500 + 41.5891880 97.1712500 + 41.5912500 97.1691460 + 41.5933130 97.1670830 + 41.5975210 97.1670830 + 41.5995830 97.1650210 + 41.5995830 97.1608130 + 41.6016460 97.1587500 + 41.6100210 97.1587500 + 41.6120830 97.1608130 + 41.6120830 97.1650210 + 41.6141460 97.1670830 + 41.6308540 97.1670830 + 41.6329170 97.1691880 + 41.6350210 97.1712500 + 41.6370830 97.1733540 + 41.6391460 97.1754170 + 41.6433540 97.1754170 + 41.6454170 97.1775210 + 41.6474790 97.1795830 + 41.6516880 97.1795830 + 41.6537500 97.1816880 + 41.6558130 97.1837500 + 41.6600210 97.1837500 + 41.6620830 97.1858130 + 41.6620830 97.1941880 + 41.6704170 97.2024790 + 41.6704170 97.2275210 + 41.6725210 97.2295830 + 41.6745830 97.2316880 + 41.6766880 97.2337500 + 41.6787500 97.2358130 + 41.6787500 97.2400210 + 41.6808540 97.2420830 + 41.6829170 97.2441880 + 41.6850210 97.2462500 + 41.6870830 97.2483130 + 41.6870830 97.2566880 + 41.6891880 97.2587500 + 41.6912500 97.2608130 + 41.6912500 97.2691880 + 41.6933130 97.2712500 + 41.6975210 97.2712500 + 41.6995830 97.2733130 + 41.6995830 97.2775210 + 41.6995830 97.2795830 + 41.7016880 97.2795830 + 41.7037500 97.2816460 + 41.7058130 97.2837500 + 41.7183540 97.2837500 + 41.7308540 97.2795830 + 41.7349790 97.2754170 + 41.7433540 97.2754170 + 41.7454170 97.2733540 + 41.7725210 97.2712500 + 41.7745830 97.2691880 + 41.7745830 97.2649790 + 41.7766460 97.2629170 + 41.7787500 97.2608540 + 41.7808130 97.2587500 + 41.7829170 97.2566880 + 41.7829170 97.2483130 + 41.7849790 97.2462500 + 41.7870830 97.2441880 + 41.7870830 97.2399790 + 41.7891460 97.2379170 + 41.7912500 97.2358540 + 41.7933130 97.2337500 + 41.7954170 97.2316880 + 41.7974790 97.2295830 + 41.7995830 97.2275210 + 41.8016460 97.2254170 + 41.8058540 97.2254170 + 41.8079170 97.2233540 + 41.8099790 97.2212500 + 41.8225210 97.2212500 + 41.8245830 97.2191880 + 41.8245830 97.2108130 + 41.8225210 97.2087500 + 41.8204170 97.2066880 + 41.8204170 97.1983130 + 41.8183540 97.1962500 + 41.8162500 97.1941880 + 41.8141880 97.1920830 + 41.8120830 97.1900210 + 41.8100210 97.1879170 + 41.8079170 97.1858540 + 41.8058540 97.1837500 + 41.8037500 97.1816880 + 41.8037500 97.1649790 + 41.8058130 97.1629170 + 41.8079170 97.1608540 + 41.8099790 97.1587500 + 41.8225210 97.1587500 + 41.8245830 97.1566880 + 41.8245830 97.1524790 + 41.8266460 97.1504170 + 41.8287500 97.1483540 + 41.8308130 97.1462500 + 41.8329170 97.1441880 + 41.8329170 97.1399790 + 41.8349790 97.1379170 + 41.8391880 97.1379170 + 41.8412500 97.1399790 + 41.8433130 97.1420830 + 41.8454170 97.1441460 + 41.8474790 97.1462500 + 41.8600210 97.1462500 + 41.8620830 97.1441880 + 41.8620830 97.1399790 + 41.8641460 97.1379170 + 41.8662500 97.1358540 + 41.8662500 97.1274790 + 41.8641880 97.1254170 + 41.8620830 97.1233540 + 41.8620830 97.1191460 + 41.8704170 97.1108540 + 41.8704170 97.1066460 + 41.8724790 97.1045830 + 41.8745830 97.1025210 + 41.8745830 97.0899790 + 41.8766460 97.0879170 + 41.8787500 97.0858540 + 41.8787500 97.0733130 + 41.8766880 97.0712500 + 41.8745830 97.0691880 + 41.8745830 97.0608130 + 41.8766460 97.0587500 + 41.8787500 97.0566880 + 41.8787500 97.0524790 + 41.8766880 97.0504170 + 41.8683130 97.0504170 + 41.8537500 97.0358130 + 41.8537500 97.0337500 + 41.8433130 97.0337500 + 41.8412500 97.0316880 + 41.8391880 97.0295830 + 41.8349790 97.0295830 + 41.8329170 97.0275210 + 41.8287500 97.0233540 + 41.8266880 97.0170830 + 41.8225210 97.0129170 + 41.8204170 97.0108540 + 41.8183540 97.0045830 + 41.8099790 97.0045830 + 41.8079170 97.0025210 + 41.8058540 97.0004170 + 41.8016460 97.0004170 + 41.7995830 96.9983540 + 41.7975210 96.9962500 + 41.7954170 96.9941880 + 41.7933540 96.9920830 + 41.7808130 96.9920830 + 41.7787500 96.9900210 + 41.7766880 96.9879170 + 41.7724790 96.9879170 + 41.7704170 96.9858540 + 41.7704170 96.9816460 + 41.7683540 96.9795830 + 41.7558130 96.9795830 + 41.7537500 96.9775210 + 41.7537500 96.9733130 + 41.7516880 96.9712500 + 41.7433130 96.9712500 + 41.7412500 96.9691880 + 41.7391880 96.9670830 + 41.7308130 96.9670830 + 41.7287500 96.9650210 + 41.7266880 96.9629170 + 41.7245830 96.9608540 + 41.7225210 96.9587500 + 41.7204170 96.9566880 + 41.7204170 96.9524790 + 41.7183540 96.9504170 + 41.7099790 96.9504170 + 41.7079170 96.9483540 + 41.7058540 96.9462500 + 41.6974790 96.9462500 + 41.6912500 96.9400210 + 41.6912500 96.9358130 + 41.6891880 96.9337500 + 41.6766460 96.9337500 + 41.6745830 96.9316880 + 41.6725210 96.9295830 + 41.6558130 96.9295830 + 41.6537500 96.9275210 + 41.6537500 96.9191460 + 41.6516880 96.9170830 + 41.6474790 96.9170830 + 41.6454170 96.9191460 + 41.6433540 96.9212500 + 41.6349790 96.9212500 + 41.6329170 96.9191880 + 41.6308540 96.9170830 + 41.6287500 96.9150210 + 41.6287500 96.9108130 + 41.6266880 96.9087500 + 41.6245830 96.9066880 + 41.6225210 96.9045830 + 41.6204170 96.9025210 + 41.6204170 96.8899790 + 41.6183540 96.8879170 + 41.6162500 96.8858540 + 41.6162500 96.8816460 + 41.6141880 96.8795830 + 41.6120830 96.8775210 + 41.6120830 96.8649790 + 41.6100210 96.8629170 + 41.6079170 96.8608540 + 41.6079170 96.8566460 + 41.6058540 96.8545830 + 41.6037500 96.8525210 + 41.6037500 96.8399790 + 41.6016880 96.8379170 + 41.5995830 96.8358540 + 41.5975210 96.8337500 + 41.5954170 96.8316880 + 41.5954170 96.8191460 + 41.5933540 96.8170830 + 41.5912500 96.8150210 + 41.5912500 96.8066460 + 41.5891880 96.8045830 + 41.5870830 96.8025210 + 41.5870830 96.7399790 + 41.5891460 96.7379170 + 41.5912500 96.7358540 + 41.5912500 96.7233130 + 41.5891880 96.7212500 + 41.5870830 96.7191880 + 41.5870830 96.7024790 + 41.5933130 96.6962500 + 41.5954170 96.6941880 + 41.5974790 96.6920830 + 41.5995830 96.6900210 + 41.6016460 96.6879170 + 41.6037500 96.6858540 + 41.6037500 96.6816460 + 41.6058130 96.6795830 + 41.6079170 96.6775210 + 41.6099790 96.6754170 + 41.6141880 96.6754170 + 41.6162500 96.6733540 + 41.6183130 96.6712500 + 41.6204170 96.6691880 + 41.6204170 96.6608130 + 41.6183540 96.6587500 + 41.6162500 96.6566880 + 41.6162500 96.6483130 + 41.6141880 96.6462500 + 41.6120830 96.6441880 + 41.6100210 96.6420830 + 41.6079170 96.6400210 + 41.6079170 96.6358130 + 41.6058540 96.6337500 + 41.6016460 96.6337500 + 41.5995830 96.6316880 + 41.5995830 96.6274790 + 41.5975210 96.6254170 + 41.5954170 96.6233540 + 41.5954170 96.6149790 + 41.5974790 96.6129170 + 41.5995830 96.6108540 + 41.5975210 96.5962500 + 41.5954170 96.5941880 + 41.5954170 96.5899790 + 41.5974790 96.5879170 + 41.5995830 96.5858540 + 41.5995830 96.5733130 + 41.5975210 96.5712500 + 41.5954170 96.5691880 + 41.5995830 96.5608130 + 41.5995830 96.5587500 + 41.5974790 96.5587500 + 41.5954170 96.5566880 + 41.5954170 96.5441460 + 41.5933540 96.5420830 + 41.5912500 96.5400210 + 41.5912500 96.5358130 + 41.5891880 96.5337500 + 41.5870830 96.5358130 + 41.5850210 96.5379170 + 41.5724790 96.5379170 + 41.5704170 96.5399790 + 41.5683540 96.5420830 + 41.5641460 96.5420830 + 41.5579170 96.5399790 +712 712 -1 32 41.61300 96.46915 + 41.9228600 96.3517500 + 41.8836400 96.2981200 + 41.8540600 96.3247000 + 41.7261800 96.3241000 + 41.7066000 96.2840400 + 41.6769900 96.3238800 + 41.6179800 96.3236100 + 41.5787600 96.2702300 + 41.5394400 96.2567800 + 41.5196900 96.2965800 + 41.4508500 96.2962900 + 41.3526000 96.2561000 + 41.3034100 96.2691700 + 41.2836800 96.2955900 + 41.4111800 96.4155300 + 41.4501300 96.5219600 + 41.4498400 96.5883300 + 41.5084600 96.6685400 + 41.5477300 96.6822100 + 41.5288000 96.5225400 + 41.5977000 96.5097500 + 41.6174200 96.4965900 + 41.7060000 96.4838900 + 41.7356100 96.4574400 + 41.7847400 96.4711000 + 41.7947200 96.4311400 + 41.8536600 96.4582100 + 41.8734300 96.4316300 + 41.8831700 96.4584000 + 41.9423000 96.4320500 + 41.9227900 96.3784700 + 41.9228600 96.3517500 +713 713 -1 30 40.62750 98.85050 + 40.8290900 98.3861900 + 40.7799700 98.3845400 + 40.7603200 98.3838800 + 40.7504900 98.3835500 + 40.7502400 98.3967000 + 40.7207700 98.3957000 + 40.6799600 98.4731400 + 40.6784000 98.5519000 + 40.6268500 98.6681900 + 40.5957000 98.7457400 + 40.5936800 98.8375200 + 40.5323600 98.9399600 + 40.5200600 99.0443100 + 40.4386100 99.1586800 + 40.4068300 99.2488900 + 40.4457700 99.2637600 + 40.4738700 99.3174500 + 40.5151900 99.2407200 + 40.5168500 99.1752500 + 40.5757800 99.1778900 + 40.5973700 99.1001100 + 40.6563000 99.1026800 + 40.6765800 99.0772900 + 40.7130100 98.7765700 + 40.7517300 98.8043700 + 40.7635500 98.7127800 + 40.8036900 98.6748400 + 40.8273400 98.4782700 + 40.8482500 98.4131700 + 40.8290900 98.3861900 +714 714 -1 29 41.09130 97.99108 + 41.4027300 97.5298800 + 41.3637100 97.5025200 + 41.2527300 97.7252300 + 41.1941000 97.6973400 + 41.1438700 97.7754500 + 41.1230900 97.8542300 + 41.0731600 97.9057500 + 41.0525000 97.9712100 + 41.0228100 97.9835700 + 41.0219800 98.0363500 + 40.9516800 98.1266200 + 40.9210800 98.1916000 + 40.8415500 98.2418000 + 40.8317300 98.2414900 + 40.7799700 98.3845400 + 40.8290900 98.3861900 + 40.8986100 98.3490100 + 40.8784700 98.3746900 + 40.8666400 98.4796400 + 40.9177700 98.3760000 + 40.9772300 98.3516200 + 41.0086100 98.2470900 + 41.2292200 97.9893800 + 41.2803600 97.8583600 + 41.2820400 97.7392000 + 41.3320800 97.6741600 + 41.3812400 97.6753200 + 41.4010700 97.6625300 + 41.4027300 97.5298800 +720 720 -1 26 41.09120 98.25436 + 41.3812400 97.6753200 + 41.3320800 97.6741600 + 41.2820400 97.7392000 + 41.2803600 97.8583600 + 41.2292200 97.9893800 + 41.0086100 98.2470900 + 40.9772300 98.3516200 + 40.9177700 98.3760000 + 40.8666400 98.4796400 + 40.8020000 98.7537200 + 40.8011400 98.7931700 + 40.8493900 98.8345700 + 40.8988100 98.8233700 + 40.9204700 98.7319600 + 40.9990800 98.7350000 + 41.0323800 98.5514600 + 41.0334300 98.4987000 + 41.1135700 98.4222300 + 41.1145700 98.3694000 + 41.2268800 98.1349100 + 41.2793900 97.9245600 + 41.3387700 97.8996700 + 41.3692300 97.8341800 + 41.3707000 97.7281200 + 41.3712300 97.6883500 + 41.3812400 97.6753200 +721 SHELL CR. NR COLUMBUS NE -1 404 41.70583 97.82333 + 41.5245830 97.2795830 + 41.4912500 97.2983540 + 41.4954170 97.3024790 + 41.4954170 97.3108540 + 41.4975210 97.3129170 + 41.5016460 97.3170830 + 41.5058540 97.3170830 + 41.5079170 97.3191460 + 41.5079170 97.3400210 + 41.5058130 97.3420830 + 41.5037500 97.3441460 + 41.5037500 97.3566880 + 41.5016460 97.3587500 + 41.4995830 97.3608130 + 41.4995830 97.3775210 + 41.5016880 97.3795830 + 41.5037500 97.3816460 + 41.5037500 97.3858540 + 41.5016460 97.3879170 + 41.4995830 97.3899790 + 41.4995830 97.3941880 + 41.5016880 97.3962500 + 41.5037500 97.3983130 + 41.5037500 97.4025210 + 41.5016880 97.4045830 + 41.4891460 97.4045830 + 41.4870830 97.4066460 + 41.4870830 97.4483540 + 41.4891460 97.4504170 + 41.4933540 97.4504170 + 41.4954170 97.4524790 + 41.4954170 97.4566880 + 41.4933130 97.4587500 + 41.4912500 97.4608130 + 41.4912500 97.4858540 + 41.4933540 97.4879170 + 41.4954170 97.4900210 + 41.4974790 97.4920830 + 41.5058540 97.4920830 + 41.5079170 97.4941460 + 41.5079170 97.4983540 + 41.5100210 97.5004170 + 41.5120830 97.5024790 + 41.5120830 97.5066880 + 41.5141880 97.5087500 + 41.5162500 97.5108540 + 41.5204170 97.5149790 + 41.5204170 97.5191880 + 41.5225210 97.5212500 + 41.5245830 97.5233130 + 41.5245830 97.5608540 + 41.5266460 97.5629170 + 41.5308540 97.5629170 + 41.5329170 97.5649790 + 41.5329170 97.5775210 + 41.5350210 97.5795830 + 41.5370830 97.5816460 + 41.5370830 97.5900210 + 41.5391880 97.5920830 + 41.5412500 97.5941460 + 41.5412500 97.6025210 + 41.5433540 97.6045830 + 41.5454170 97.6066460 + 41.5454170 97.6108540 + 41.5475210 97.6129170 + 41.5495830 97.6149790 + 41.5495830 97.6233540 + 41.5516880 97.6254170 + 41.5537500 97.6274790 + 41.5537500 97.6483540 + 41.5516460 97.6504170 + 41.5495830 97.6524790 + 41.5495830 97.6566880 + 41.5516880 97.6587500 + 41.5537500 97.6608540 + 41.5558540 97.6629170 + 41.5579170 97.6649790 + 41.5579170 97.6691880 + 41.5599790 97.6712500 + 41.5725210 97.6712500 + 41.5745830 97.6733130 + 41.5745830 97.6816880 + 41.5766880 97.6837500 + 41.5787500 97.6858540 + 41.5808130 97.6879170 + 41.5891880 97.6879170 + 41.5912500 97.6900210 + 41.5933540 97.6920830 + 41.5954170 97.6941880 + 41.6058130 97.7045830 + 41.6183540 97.7045830 + 41.6204170 97.7066880 + 41.6224790 97.7087500 + 41.6266880 97.7087500 + 41.6287500 97.7108130 + 41.6287500 97.7191880 + 41.6308130 97.7212500 + 41.6350210 97.7212500 + 41.6391460 97.7254170 + 41.6475210 97.7254170 + 41.6495830 97.7274790 + 41.6599790 97.7420830 + 41.6641880 97.7420830 + 41.6662500 97.7441880 + 41.6683130 97.7462500 + 41.6808540 97.7462500 + 41.6829170 97.7483130 + 41.6829170 97.7608540 + 41.6849790 97.7629170 + 41.6891880 97.7629170 + 41.6912500 97.7650210 + 41.6933540 97.7670830 + 41.6954170 97.7691460 + 41.6954170 97.7733540 + 41.6975210 97.7754170 + 41.6995830 97.7774790 + 41.6995830 97.7816880 + 41.7016880 97.7837500 + 41.7037500 97.7858540 + 41.7058540 97.7879170 + 41.7079170 97.7899790 + 41.7079170 97.7941880 + 41.7100210 97.7962500 + 41.7162500 97.8024790 + 41.7162500 97.8066880 + 41.7141460 97.8087500 + 41.7120830 97.8108540 + 41.7099790 97.8129170 + 41.7079170 97.8150210 + 41.7058130 97.8170830 + 41.7037500 97.8191460 + 41.7037500 97.8275210 + 41.7058540 97.8295830 + 41.7079170 97.8316460 + 41.7079170 97.8358540 + 41.7100210 97.8379170 + 41.7120830 97.8399790 + 41.7120830 97.8525210 + 41.7099790 97.8545830 + 41.7079170 97.8566460 + 41.7079170 97.8775210 + 41.7099790 97.8795830 + 41.7141880 97.8795830 + 41.7162500 97.8774790 + 41.7183130 97.8754170 + 41.7225210 97.8754170 + 41.7245830 97.8775210 + 41.7266880 97.8795830 + 41.7287500 97.8816880 + 41.7308540 97.8837500 + 41.7329170 97.8858540 + 41.7350210 97.8879170 + 41.7370830 97.8900210 + 41.7391880 97.8920830 + 41.7412500 97.8899790 + 41.7433540 97.8879170 + 41.7454170 97.8858130 + 41.7475210 97.8837500 + 41.7495830 97.8858540 + 41.7516880 97.8879170 + 41.7537500 97.8900210 + 41.7558540 97.8920830 + 41.7579170 97.8941460 + 41.7579170 97.9066880 + 41.7599790 97.9087500 + 41.7641880 97.9087500 + 41.7662500 97.9066460 + 41.7683130 97.9045830 + 41.7766880 97.9045830 + 41.7787500 97.9066460 + 41.7787500 97.9233540 + 41.7808540 97.9254170 + 41.7829170 97.9274790 + 41.7829170 97.9316880 + 41.7850210 97.9337500 + 41.7870830 97.9358540 + 41.7891880 97.9379170 + 41.7912500 97.9400210 + 41.7891460 97.9420830 + 41.7870830 97.9441460 + 41.7870830 97.9525210 + 41.7891460 97.9545830 + 41.7933540 97.9545830 + 41.7954170 97.9566460 + 41.7954170 97.9608540 + 41.7975210 97.9629170 + 41.7995830 97.9650210 + 41.8016460 97.9670830 + 41.8100210 97.9670830 + 41.8120830 97.9691460 + 41.8120830 97.9733540 + 41.8141880 97.9754170 + 41.8162500 97.9775210 + 41.8183540 97.9795830 + 41.8204170 97.9816880 + 41.8224790 97.9837500 + 41.8266880 97.9837500 + 41.8287500 97.9858540 + 41.8308130 97.9879170 + 41.8350210 97.9879170 + 41.8370830 97.9900210 + 41.8391460 97.9920830 + 41.8474790 97.9962500 + 41.8537500 97.9983130 + 41.8537500 98.0108540 + 41.8516460 98.0129170 + 41.8495830 98.0149790 + 41.8537500 98.0275210 + 41.8537500 98.0295830 + 41.8725210 98.0295830 + 41.8745830 98.0275210 + 41.8766460 98.0254170 + 41.8787500 98.0274790 + 41.8808130 98.0295830 + 41.8850210 98.0295830 + 41.8870830 98.0275210 + 41.8870830 98.0149790 + 41.8891460 98.0129170 + 41.8912500 98.0108540 + 41.8933130 98.0087500 + 41.8954170 98.0066880 + 41.8974790 98.0045830 + 41.8995830 98.0025210 + 41.8995830 97.9983130 + 41.9016460 97.9962500 + 41.9037500 97.9941880 + 41.9037500 97.9899790 + 41.9058130 97.9879170 + 41.9100210 97.9879170 + 41.9120830 97.9858540 + 41.9141460 97.9837500 + 41.9162500 97.9816880 + 41.9162500 97.9733130 + 41.9183130 97.9712500 + 41.9204170 97.9691880 + 41.9224790 97.9670830 + 41.9266880 97.9670830 + 41.9287500 97.9650210 + 41.9287500 97.9566460 + 41.9266880 97.9545830 + 41.9245830 97.9525210 + 41.9245830 97.9441460 + 41.9225210 97.9420830 + 41.9204170 97.9400210 + 41.9204170 97.9191460 + 41.9183540 97.9170830 + 41.9162500 97.9066460 + 41.9141880 97.9045830 + 41.9120830 97.9025210 + 41.9120830 97.8816460 + 41.9100210 97.8795830 + 41.9079170 97.8775210 + 41.9079170 97.8733130 + 41.9058540 97.8712500 + 41.9016460 97.8712500 + 41.8995830 97.8691880 + 41.9016460 97.8670830 + 41.9037500 97.8650210 + 41.9037500 97.8566460 + 41.8995830 97.8525210 + 41.8995830 97.8483130 + 41.8975210 97.8462500 + 41.8891460 97.8462500 + 41.8870830 97.8441880 + 41.8870830 97.8399790 + 41.8850210 97.8379170 + 41.8829170 97.8358540 + 41.8808540 97.8337500 + 41.8787500 97.8316880 + 41.8787500 97.8233130 + 41.8766880 97.8212500 + 41.8683130 97.8212500 + 41.8662500 97.8191880 + 41.8641880 97.8170830 + 41.8558130 97.8170830 + 41.8537500 97.8150210 + 41.8516880 97.8129170 + 41.8474790 97.8129170 + 41.8349790 97.8045830 + 41.8329170 97.8025210 + 41.8329170 97.7983130 + 41.8245830 97.7900210 + 41.8225210 97.7795830 + 41.8183130 97.7795830 + 41.8162500 97.7524790 + 41.8162500 97.7504170 + 41.8099790 97.7504170 + 41.8079170 97.7483540 + 41.8058540 97.7462500 + 41.8016460 97.7462500 + 41.7995830 97.7441880 + 41.7995830 97.7399790 + 41.7975210 97.7379170 + 41.7933130 97.7379170 + 41.7849790 97.7337500 + 41.7829170 97.7316880 + 41.7808540 97.7295830 + 41.7787500 97.7275210 + 41.7787500 97.7191460 + 41.7766880 97.7170830 + 41.7745830 97.7150210 + 41.7725210 97.7129170 + 41.7704170 97.7108540 + 41.7724790 97.7087500 + 41.7745830 97.7066880 + 41.7745830 97.7024790 + 41.7725210 97.7004170 + 41.7704170 97.6983540 + 41.7704170 97.6941460 + 41.7683540 97.6920830 + 41.7662500 97.6900210 + 41.7641880 97.6879170 + 41.7599790 97.6879170 + 41.7579170 97.6858540 + 41.7558540 97.6837500 + 41.7516460 97.6837500 + 41.7495830 97.6816880 + 41.7475210 97.6795830 + 41.7349790 97.6795830 + 41.7329170 97.6775210 + 41.7308540 97.6754170 + 41.7224790 97.6754170 + 41.7204170 97.6733540 + 41.7204170 97.6691460 + 41.7183540 97.6670830 + 41.7058130 97.6670830 + 41.7037500 97.6650210 + 41.7016880 97.6629170 + 41.6995830 97.6608540 + 41.6975210 97.6587500 + 41.6933130 97.6587500 + 41.6912500 97.6566880 + 41.6891880 97.6545830 + 41.6849790 97.6545830 + 41.6829170 97.6525210 + 41.6808540 97.6504170 + 41.6787500 97.6483540 + 41.6787500 97.6399790 + 41.6766880 97.6379170 + 41.6745830 97.6358540 + 41.6745830 97.6191460 + 41.6725210 97.6170830 + 41.6704170 97.6150210 + 41.6704170 97.6066460 + 41.6683540 97.6045830 + 41.6641460 97.6045830 + 41.6620830 97.6025210 + 41.6620830 97.5566460 + 41.6600210 97.5545830 + 41.6579170 97.5525210 + 41.6579170 97.5483130 + 41.6558540 97.5462500 + 41.6537500 97.5441880 + 41.6537500 97.5399790 + 41.6516880 97.5379170 + 41.6495830 97.5358540 + 41.6495830 97.5274790 + 41.6475210 97.5254170 + 41.6454170 97.5233540 + 41.6454170 97.5149790 + 41.6433540 97.5129170 + 41.6412500 97.5108540 + 41.6391880 97.5087500 + 41.6370830 97.5066880 + 41.6370830 97.4983130 + 41.6391460 97.4962500 + 41.6412500 97.4941880 + 41.6391880 97.4920830 + 41.6370830 97.4900210 + 41.6370830 97.4858130 + 41.6391460 97.4837500 + 41.6433540 97.4837500 + 41.6454170 97.4816880 + 41.6474790 97.4795830 + 41.6495830 97.4775210 + 41.6454170 97.4629170 + 41.6183130 97.4629170 + 41.5891880 97.4545830 + 41.5870830 97.4525210 + 41.5870830 97.4358130 + 41.5808130 97.4337500 + 41.5766880 97.4295830 + 41.5662500 97.4233540 + 41.5662500 97.4108130 + 41.5641880 97.4087500 + 41.5620830 97.4066880 + 41.5600210 97.4004170 + 41.5475210 97.3920830 + 41.5433130 97.3920830 + 41.5412500 97.3900210 + 41.5391880 97.3879170 + 41.5370830 97.3858540 + 41.5370830 97.3733130 + 41.5350210 97.3712500 + 41.5329170 97.3691880 + 41.5349790 97.3670830 + 41.5370830 97.3650210 + 41.5391460 97.3129170 + 41.5412500 97.3108540 + 41.5412500 97.3024790 + 41.5433130 97.3004170 + 41.5454170 97.2983540 + 41.5454170 97.2941460 + 41.5245830 97.2795830 +722 722 -1 41 41.40310 97.26144 + 41.6809800 97.2695500 + 41.6720200 97.1761600 + 41.5245000 97.1737000 + 41.5158200 97.0406700 + 41.4669600 97.0001100 + 41.4686000 96.7611200 + 41.4293400 96.7474200 + 41.3994400 96.8134300 + 41.3990000 96.8797500 + 41.2121900 96.8774300 + 41.2017900 96.9566700 + 41.2211500 96.9966300 + 41.2304500 97.0629300 + 41.2693200 97.1164900 + 41.2682300 97.2356500 + 41.2483000 97.2617700 + 41.2665900 97.3945200 + 41.2269800 97.4202000 + 41.2160800 97.5126100 + 41.2241100 97.6583600 + 41.1252900 97.6956900 + 41.1438700 97.7754500 + 41.1941000 97.6973400 + 41.2527300 97.7252300 + 41.3637100 97.5025200 + 41.4027300 97.5298800 + 41.4143600 97.3709000 + 41.4340200 97.3712800 + 41.4724800 97.4517200 + 41.4714000 97.5446600 + 41.5009000 97.5453100 + 41.5194100 97.6387500 + 41.5485700 97.6660200 + 41.5492500 97.6128500 + 41.5015300 97.4921800 + 41.5136500 97.2798200 + 41.5329200 97.3200500 + 41.5317800 97.4263600 + 41.6395100 97.4684800 + 41.6793000 97.4293600 + 41.6809800 97.2695500 +723 723 -1 15 41.03800 96.25488 + 41.1559300 96.2686200 + 41.1559500 96.2553900 + 41.1264600 96.2552900 + 41.0772700 96.2683100 + 41.0675000 96.2418700 + 41.0380100 96.2417700 + 41.0184600 96.1757400 + 40.9299900 96.1755100 + 40.9201400 96.1886700 + 40.9199700 96.2808900 + 40.9297000 96.3204700 + 40.9591600 96.3337800 + 41.0574600 96.3342400 + 41.1361400 96.3214000 + 41.1559300 96.2686200 +724 SALT CR. AT ROCA NE -1 256 40.61417 96.71917 + 40.6620830 96.6712500 + 40.6579170 96.6566880 + 40.6579170 96.6524790 + 40.6599790 96.6504170 + 40.6620830 96.6483540 + 40.6620830 96.6399790 + 40.6662500 96.6358540 + 40.6641880 96.6337500 + 40.6620830 96.6316880 + 40.6620830 96.6274790 + 40.6641460 96.6254170 + 40.6662500 96.6233540 + 40.6662500 96.6191460 + 40.6683130 96.6170830 + 40.6725210 96.6170830 + 40.6745830 96.6150210 + 40.6766460 96.6129170 + 40.6850210 96.6129170 + 40.6870830 96.6149790 + 40.6974790 96.6254170 + 40.6995830 96.6233540 + 40.7016460 96.6212500 + 40.7037500 96.6191880 + 40.7037500 96.6149790 + 40.7079170 96.6108540 + 40.7079170 96.5983130 + 40.7058540 96.5962500 + 40.7037500 96.5941880 + 40.7079170 96.5900210 + 40.7079170 96.5816460 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6524790 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5308540 96.7545830 + 40.5287500 96.7566460 + 40.5266880 96.7587500 + 40.5245830 96.7608130 + 40.5266460 96.7629170 + 40.5287500 96.7649790 + 40.5308130 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5349790 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391460 96.7920830 + 40.5412500 96.7941460 + 40.5391880 96.7962500 + 40.5370830 96.7983130 + 40.5391460 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391880 96.8129170 + 40.5370830 96.8149790 + 40.5350210 96.8170830 + 40.5329170 96.8191460 + 40.5308540 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8774790 + 40.5308130 96.8795830 + 40.5329170 96.8816460 + 40.5349790 96.8837500 + 40.5370830 96.8858130 + 40.5391460 96.8879170 + 40.5412500 96.8899790 + 40.5433130 96.8920830 + 40.5454170 96.8941460 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983130 + 40.5599790 96.9004170 + 40.5620830 96.9024790 + 40.5641460 96.9045830 + 40.5662500 96.9066460 + 40.5683130 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808130 96.9212500 + 40.5829170 96.9191880 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191460 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233130 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308130 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6349790 96.9004170 + 40.6370830 96.8983540 + 40.6412500 96.8900210 + 40.6412500 96.8858130 + 40.6433130 96.8837500 + 40.6475210 96.8837500 + 40.6495830 96.8816880 + 40.6495830 96.8774790 + 40.6516460 96.8754170 + 40.6600210 96.8754170 + 40.6620830 96.8733540 + 40.6662500 96.8691880 + 40.6662500 96.8608130 + 40.6641880 96.8587500 + 40.6620830 96.8566880 + 40.6620830 96.8441460 + 40.6641460 96.8420830 + 40.6662500 96.8400210 + 40.6662500 96.8358130 + 40.6683130 96.8337500 + 40.6704170 96.8316880 + 40.6704170 96.8274790 + 40.6724790 96.8254170 + 40.6745830 96.8233540 + 40.6766460 96.8212500 + 40.6787500 96.8191880 + 40.6787500 96.8108130 + 40.6766880 96.8087500 + 40.6745830 96.8066880 + 40.6745830 96.7983130 + 40.6725210 96.7962500 + 40.6704170 96.7941880 + 40.6704170 96.7899790 + 40.6724790 96.7879170 + 40.6766880 96.7879170 + 40.6787500 96.7858540 + 40.6808130 96.7837500 + 40.6829170 96.7816880 + 40.6829170 96.7691460 + 40.6849790 96.7670830 + 40.6870830 96.7650210 + 40.6870830 96.7566460 + 40.6829170 96.7525210 + 40.6808540 96.7504170 + 40.6787500 96.7483540 + 40.6766880 96.7462500 + 40.6745830 96.7441880 + 40.6745830 96.7399790 + 40.6725210 96.7379170 + 40.6704170 96.7358540 + 40.6704170 96.7149790 + 40.6683540 96.7129170 + 40.6662500 96.7108540 + 40.6662500 96.6941460 + 40.6620830 96.6712500 +725 725 -1 23 40.97550 96.86758 + 41.2121900 96.8774300 + 41.1437200 96.8237100 + 41.1338900 96.8235900 + 41.1046400 96.7836200 + 40.9671100 96.7689100 + 40.9280200 96.7289600 + 40.8788800 96.7284500 + 40.8496100 96.6886600 + 40.7805100 96.7405900 + 40.7995100 96.8460200 + 40.7298700 96.9634600 + 40.7688800 97.0034300 + 40.8768900 97.0181400 + 40.9358600 97.0189800 + 40.9360700 96.9926200 + 40.9557300 96.9929000 + 40.9750700 97.0327300 + 41.0142800 97.0464900 + 41.1130100 96.9951100 + 41.1818200 96.9960800 + 41.2211500 96.9966300 + 41.2017900 96.9566700 + 41.2121900 96.8774300 +726 726 -1 14 40.74650 96.77946 + 40.8496100 96.6886600 + 40.7908400 96.6486400 + 40.7812700 96.5959500 + 40.7223100 96.5954500 + 40.6730400 96.6213000 + 40.6432900 96.6735400 + 40.6919100 96.7659400 + 40.6814900 96.8577500 + 40.6518300 96.8836400 + 40.7003900 96.9630600 + 40.7298700 96.9634600 + 40.7995100 96.8460200 + 40.7805100 96.7405900 + 40.8496100 96.6886600 +727 WAHOO CR. AT ITHACA NE -1 234 41.26000 96.74417 + 41.1412500 96.5379170 + 41.1266460 96.5504170 + 41.1225210 96.5545830 + 41.1183130 96.5545830 + 41.1162500 96.5566880 + 41.1141880 96.5587500 + 41.1099790 96.5587500 + 41.1079170 96.5608540 + 41.1058540 96.5629170 + 41.1016460 96.5629170 + 41.0995830 96.5629170 + 41.1099790 96.5795830 + 41.1141880 96.5795830 + 41.1162500 96.5816460 + 41.1162500 96.5941880 + 41.1183540 96.5962500 + 41.1245830 96.6024790 + 41.1245830 96.6108540 + 41.1266460 96.6129170 + 41.1308540 96.6129170 + 41.1329170 96.6149790 + 41.1329170 96.6275210 + 41.1349790 96.6295830 + 41.1391880 96.6295830 + 41.1412500 96.6316880 + 41.1433130 96.6337500 + 41.1475210 96.6337500 + 41.1495830 96.6358540 + 41.1516880 96.6379170 + 41.1537500 96.6399790 + 41.1537500 96.6483540 + 41.1516880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1391460 96.6587500 + 41.1370830 96.6608540 + 41.1349790 96.6629170 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3308540 96.8920830 + 41.3329170 96.8941880 + 41.3350210 96.8962500 + 41.3370830 96.8983540 + 41.3391460 96.9004170 + 41.3433540 96.9004170 + 41.3454170 96.8983130 + 41.3475210 96.8962500 + 41.3495830 96.8983540 + 41.3516460 96.9004170 + 41.3683540 96.9004170 + 41.3704170 96.9025210 + 41.3724790 96.9045830 + 41.3766880 96.9045830 + 41.3787500 96.9066880 + 41.3808130 96.9087500 + 41.3891880 96.9087500 + 41.3912500 96.9066880 + 41.3912500 96.9024790 + 41.3933540 96.9004170 + 41.3954170 96.8983540 + 41.3954170 96.8816460 + 41.3975210 96.8795830 + 41.3995830 96.8775210 + 41.4037500 96.8400210 + 41.4037500 96.8316460 + 41.4058540 96.8295830 + 41.4079170 96.8275210 + 41.4079170 96.8066460 + 41.4099790 96.8045830 + 41.4141880 96.8045830 + 41.4162500 96.8024790 + 41.4183130 96.8004170 + 41.4225210 96.8004170 + 41.4245830 96.7983540 + 41.4245830 96.7649790 + 41.4224790 96.7629170 + 41.4204170 96.7608540 + 41.4204170 96.7524790 + 41.4183130 96.7504170 + 41.4162500 96.7483540 + 41.4162500 96.7358130 + 41.4141460 96.7337500 + 41.4120830 96.7316880 + 41.4120830 96.6941460 + 41.4099790 96.6920830 + 41.4079170 96.6629170 + 41.3891460 96.6629170 + 41.3870830 96.6608540 + 41.3870830 96.6566460 + 41.3850210 96.6545830 + 41.3829170 96.6525210 + 41.3808540 96.6504170 + 41.3787500 96.6483540 + 41.3766880 96.6462500 + 41.3745830 96.6441880 + 41.3745830 96.6316460 + 41.3725210 96.6295830 + 41.3704170 96.6275210 + 41.3683540 96.6254170 + 41.3641460 96.6254170 + 41.3620830 96.6233540 + 41.3600210 96.6212500 + 41.3558130 96.6212500 + 41.3537500 96.6191880 + 41.3516880 96.6170830 + 41.3391460 96.6170830 + 41.3370830 96.6191460 + 41.3350210 96.6212500 + 41.3308130 96.6212500 + 41.3287500 96.6233130 + 41.3266880 96.6254170 + 41.3099790 96.6254170 + 41.3079170 96.6233540 + 41.3058540 96.6212500 + 41.3016460 96.6212500 + 41.2995830 96.6191880 + 41.2975210 96.6170830 + 41.2933130 96.6170830 + 41.2912500 96.6150210 + 41.2891880 96.6129170 + 41.2870830 96.6108540 + 41.2870830 96.6066460 + 41.2850210 96.6045830 + 41.2766460 96.6045830 + 41.2745830 96.6025210 + 41.2725210 96.6004170 + 41.2704170 96.5983540 + 41.2683540 96.5962500 + 41.2662500 96.5941880 + 41.2641880 96.5920830 + 41.2516460 96.5920830 + 41.2495830 96.5900210 + 41.2475210 96.5879170 + 41.2433130 96.5879170 + 41.2412500 96.5858540 + 41.2391880 96.5837500 + 41.2370830 96.5816880 + 41.2350210 96.5795830 + 41.2266460 96.5795830 + 41.2245830 96.5775210 + 41.2245830 96.5733130 + 41.2225210 96.5712500 + 41.2016460 96.5712500 + 41.1995830 96.5733130 + 41.1975210 96.5754170 + 41.1933130 96.5754170 + 41.1912500 96.5733540 + 41.1912500 96.5608130 + 41.1891880 96.5587500 + 41.1870830 96.5566880 + 41.1850210 96.5545830 + 41.1808130 96.5545830 + 41.1787500 96.5525210 + 41.1766880 96.5504170 + 41.1745830 96.5483540 + 41.1745830 96.5399790 + 41.1725210 96.5379170 + 41.1558130 96.5379170 + 41.1537500 96.5358540 + 41.1516880 96.5337500 + 41.1495830 96.5316880 + 41.1475210 96.5295830 + 41.1412500 96.5379170 +728 728 -1 26 41.15040 96.48756 + 41.4198100 96.6942400 + 41.4204000 96.5748200 + 41.3910700 96.5347900 + 41.3222900 96.5210100 + 41.3224000 96.4945100 + 41.2929500 96.4810600 + 41.2931800 96.4148300 + 41.2736000 96.3882400 + 41.2146500 96.3746800 + 41.1852600 96.3348500 + 41.0770100 96.3739500 + 41.0574600 96.3342400 + 40.9591600 96.3337800 + 40.9297000 96.3204700 + 40.9199700 96.2808900 + 40.8805500 96.3202400 + 40.8804100 96.3729200 + 40.9000700 96.3730200 + 40.9195600 96.4258300 + 40.9687100 96.4261200 + 40.9685200 96.4788600 + 41.1254300 96.5724200 + 41.1551500 96.5197800 + 41.3513200 96.6272800 + 41.3608800 96.6804000 + 41.4198100 96.6942400 +729 729 -1 27 40.92870 96.59826 + 41.1254300 96.5724200 + 40.9685200 96.4788600 + 40.9687100 96.4261200 + 40.9195600 96.4258300 + 40.9000700 96.3730200 + 40.8804100 96.3729200 + 40.8803700 96.3860900 + 40.8213600 96.3989200 + 40.8209800 96.5041800 + 40.7719400 96.4775300 + 40.7717900 96.5169800 + 40.7226500 96.5166200 + 40.7027700 96.5690200 + 40.7027100 96.5821500 + 40.7223100 96.5954500 + 40.7812700 96.5959500 + 40.7908400 96.6486400 + 40.8496100 96.6886600 + 40.8788800 96.7284500 + 40.9280200 96.7289600 + 40.9671100 96.7689100 + 41.1046400 96.7836200 + 41.1338900 96.8235900 + 41.1442100 96.7444100 + 41.1249800 96.6649200 + 41.1546700 96.6255300 + 41.1254300 96.5724200 +730 730 -1 12 40.80920 98.67616 + 40.8493900 98.8345700 + 40.8011400 98.7931700 + 40.8020000 98.7537200 + 40.8666400 98.4796400 + 40.8273400 98.4782700 + 40.8036900 98.6748400 + 40.7635500 98.7127800 + 40.7517300 98.8043700 + 40.7812000 98.8055400 + 40.8386800 98.8736500 + 40.8485100 98.8740500 + 40.8493900 98.8345700 +757 757 -1 7 40.86300 98.41433 + 40.8290900 98.3861900 + 40.8482500 98.4131700 + 40.8273400 98.4782700 + 40.8666400 98.4796400 + 40.8784700 98.3746900 + 40.8986100 98.3490100 + 40.8290900 98.3861900 +770 770 -1 30 41.30260 96.39942 + 41.5477300 96.6822100 + 41.5084600 96.6685400 + 41.4498400 96.5883300 + 41.4501300 96.5219600 + 41.4111800 96.4155300 + 41.2836800 96.2955900 + 41.3034100 96.2691700 + 41.2837700 96.2558500 + 41.1559300 96.2686200 + 41.1361400 96.3214000 + 41.0574600 96.3342400 + 41.0770100 96.3739500 + 41.1852600 96.3348500 + 41.2146500 96.3746800 + 41.2736000 96.3882400 + 41.2931800 96.4148300 + 41.2929500 96.4810600 + 41.3224000 96.4945100 + 41.3222900 96.5210100 + 41.3910700 96.5347900 + 41.4204000 96.5748200 + 41.4198100 96.6942400 + 41.4196600 96.7207800 + 41.4293400 96.7474200 + 41.4686000 96.7611200 + 41.4669600 97.0001100 + 41.5158200 97.0406700 + 41.4965700 96.9872500 + 41.5468600 96.8284300 + 41.5477300 96.6822100 +804 804 -1 24 42.83000 95.30000 + 42.8800000 95.2200000 + 42.8200000 95.2300000 + 42.8200000 95.2700000 + 42.7800000 95.2700000 + 42.6800000 95.2200000 + 42.6800000 95.2700000 + 42.7200000 95.2800000 + 42.7200000 95.3000000 + 42.7700000 95.3200000 + 42.7800000 95.3000000 + 42.8200000 95.3200000 + 42.8500000 95.3700000 + 42.8700000 95.3800000 + 42.9000000 95.3500000 + 42.9200000 95.3700000 + 42.9200000 95.3500000 + 42.9300000 95.3500000 + 42.9500000 95.3500000 + 42.9800000 95.3000000 + 42.9500000 95.2500000 + 42.9200000 95.2700000 + 42.9000000 95.2500000 + 42.8800000 95.2500000 + 42.8800000 95.2200000 +805 805 -1 39 43.00000 95.46500 + 43.1800000 95.6000000 + 43.2700000 95.6000000 + 43.2700000 95.5700000 + 43.2500000 95.5000000 + 43.2200000 95.4700000 + 43.1700000 95.4800000 + 43.1300000 95.4700000 + 43.1300000 95.4500000 + 43.0800000 95.4200000 + 43.0300000 95.3700000 + 43.0200000 95.3700000 + 43.0000000 95.3500000 + 43.0000000 95.3300000 + 42.9800000 95.3000000 + 42.9500000 95.3500000 + 42.9300000 95.3500000 + 42.9200000 95.3500000 + 42.9200000 95.3700000 + 42.9000000 95.3500000 + 42.8700000 95.3800000 + 42.8300000 95.4300000 + 42.8200000 95.4500000 + 42.7800000 95.4700000 + 42.7500000 95.4800000 + 42.7300000 95.5300000 + 42.7500000 95.5500000 + 42.7700000 95.5800000 + 42.7800000 95.6300000 + 42.8000000 95.6000000 + 42.7800000 95.5700000 + 42.7800000 95.5500000 + 42.8000000 95.5300000 + 42.8800000 95.5200000 + 42.9500000 95.5200000 + 43.0200000 95.5300000 + 43.0800000 95.5500000 + 43.0800000 95.5700000 + 43.1500000 95.5700000 + 43.1800000 95.6000000 +806 806 -1 31 42.98000 95.67000 + 42.8800000 95.8200000 + 42.8800000 95.8000000 + 42.9300000 95.8200000 + 42.9700000 95.8200000 + 42.9800000 95.8200000 + 43.0200000 95.8200000 + 43.0200000 95.7800000 + 43.0300000 95.7700000 + 43.0500000 95.7700000 + 43.0800000 95.7500000 + 43.1000000 95.7300000 + 43.1300000 95.7300000 + 43.1500000 95.6700000 + 43.1500000 95.6200000 + 43.1800000 95.6200000 + 43.1800000 95.6000000 + 43.1500000 95.5700000 + 43.0800000 95.5700000 + 43.0800000 95.5500000 + 43.0200000 95.5300000 + 42.9500000 95.5200000 + 42.8800000 95.5200000 + 42.8000000 95.5300000 + 42.7800000 95.5500000 + 42.7800000 95.5700000 + 42.8000000 95.6000000 + 42.7800000 95.6300000 + 42.8000000 95.6800000 + 42.8200000 95.7200000 + 42.8500000 95.7200000 + 42.8800000 95.8200000 +807 807 -1 25 42.64500 95.70000 + 42.7800000 95.6300000 + 42.7700000 95.5800000 + 42.7500000 95.5500000 + 42.7300000 95.5300000 + 42.7500000 95.4800000 + 42.7000000 95.5000000 + 42.7000000 95.5200000 + 42.6500000 95.5000000 + 42.5800000 95.5300000 + 42.5700000 95.5200000 + 42.4800000 95.5300000 + 42.4800000 95.6000000 + 42.5000000 95.6500000 + 42.5000000 95.7300000 + 42.4700000 95.8000000 + 42.5000000 95.8500000 + 42.5000000 95.8800000 + 42.5300000 95.9200000 + 42.5800000 95.9000000 + 42.6200000 95.8300000 + 42.6800000 95.7700000 + 42.7300000 95.7700000 + 42.8200000 95.7200000 + 42.8000000 95.6800000 + 42.7800000 95.6300000 +808 808 -1 33 42.28500 95.86675 + 42.4800000 95.6000000 + 42.4300000 95.6000000 + 42.4300000 95.6300000 + 42.4000000 95.6300000 + 42.3800000 95.7000000 + 42.3500000 95.7200000 + 42.3500000 95.7300000 + 42.3000000 95.8000000 + 42.2500000 95.8200000 + 42.2300000 95.8200000 + 42.2000000 95.8500000 + 42.1800000 95.8500000 + 42.1800000 95.8800000 + 42.1500000 95.9000000 + 42.1300000 95.9200000 + 42.0800000 95.9500000 + 42.0700000 95.9800000 + 42.0800000 96.0100000 + 42.1000000 96.0000000 + 42.1800000 96.0000000 + 42.2300000 95.9500000 + 42.2800000 95.9300000 + 42.3000000 95.9200000 + 42.3200000 95.9200000 + 42.4500000 95.8800000 + 42.4700000 95.9000000 + 42.4800000 95.9000000 + 42.5000000 95.8800000 + 42.5000000 95.8500000 + 42.4700000 95.8000000 + 42.5000000 95.7300000 + 42.5000000 95.6500000 + 42.4800000 95.6000000 +809 809 -1 55 42.49500 95.40238 + 42.7200000 95.3000000 + 42.6800000 95.3000000 + 42.6500000 95.2800000 + 42.6300000 95.2800000 + 42.5700000 95.3000000 + 42.5300000 95.3000000 + 42.5200000 95.2800000 + 42.4500000 95.2700000 + 42.4300000 95.2300000 + 42.3700000 95.2300000 + 42.3500000 95.2200000 + 42.3200000 95.2200000 + 42.2800000 95.2500000 + 42.2700000 95.3200000 + 42.2800000 95.3500000 + 42.2700000 95.3800000 + 42.3000000 95.4000000 + 42.3000000 95.4300000 + 42.2800000 95.4500000 + 42.3000000 95.5200000 + 42.2200000 95.6300000 + 42.2000000 95.6700000 + 42.1700000 95.7200000 + 42.1200000 95.7500000 + 42.1200000 95.7700000 + 42.1300000 95.7800000 + 42.1500000 95.8000000 + 42.1800000 95.8500000 + 42.2000000 95.8500000 + 42.2300000 95.8200000 + 42.2500000 95.8200000 + 42.3000000 95.8000000 + 42.3500000 95.7300000 + 42.3500000 95.7200000 + 42.3800000 95.7000000 + 42.4000000 95.6300000 + 42.4300000 95.6300000 + 42.4300000 95.6000000 + 42.4800000 95.6000000 + 42.4800000 95.5300000 + 42.5700000 95.5200000 + 42.5800000 95.5300000 + 42.6500000 95.5000000 + 42.7000000 95.5200000 + 42.7000000 95.5000000 + 42.7500000 95.4800000 + 42.7800000 95.4700000 + 42.8200000 95.4500000 + 42.8300000 95.4300000 + 42.8700000 95.3800000 + 42.8500000 95.3700000 + 42.8200000 95.3200000 + 42.7800000 95.3000000 + 42.7700000 95.3200000 + 42.7200000 95.3000000 +810 810 -1 29 42.04000 95.88500 + 42.1200000 95.7500000 + 42.0800000 95.7700000 + 42.0800000 95.8000000 + 42.0700000 95.8300000 + 42.0300000 95.8300000 + 42.0200000 95.8500000 + 41.9800000 95.8700000 + 41.9700000 95.9200000 + 41.9200000 95.9300000 + 41.9000000 95.9500000 + 41.9700000 95.9500000 + 41.9700000 95.9700000 + 41.9700000 95.9800000 + 42.0000000 95.9800000 + 42.0300000 96.0000000 + 42.0500000 96.0200000 + 42.1000000 96.0200000 + 42.1000000 96.0000000 + 42.0800000 96.0100000 + 42.0700000 95.9800000 + 42.0800000 95.9500000 + 42.1300000 95.9200000 + 42.1500000 95.9000000 + 42.1800000 95.8800000 + 42.1800000 95.8500000 + 42.1500000 95.8000000 + 42.1300000 95.7800000 + 42.1200000 95.7700000 + 42.1200000 95.7500000 +811 811 -1 33 42.55500 95.93500 + 42.8200000 95.7200000 + 42.7300000 95.7700000 + 42.6800000 95.7700000 + 42.6200000 95.8300000 + 42.5800000 95.9000000 + 42.5300000 95.9200000 + 42.5300000 95.9300000 + 42.5000000 95.9800000 + 42.4700000 96.0000000 + 42.4300000 96.0500000 + 42.3800000 96.0300000 + 42.3300000 96.0300000 + 42.3000000 96.0700000 + 42.2300000 96.0700000 + 42.2700000 96.0800000 + 42.3200000 96.1300000 + 42.4300000 96.1200000 + 42.5000000 96.1500000 + 42.5700000 96.1200000 + 42.6500000 96.1300000 + 42.6800000 96.1000000 + 42.7200000 96.1000000 + 42.7300000 96.0800000 + 42.7300000 96.0500000 + 42.7800000 96.0200000 + 42.7800000 96.0000000 + 42.7800000 95.9700000 + 42.8000000 95.9500000 + 42.8000000 95.9300000 + 42.8800000 95.8700000 + 42.8800000 95.8200000 + 42.8500000 95.7200000 + 42.8200000 95.7200000 +812 812 -1 54 42.34500 96.19886 + 42.6800000 96.1500000 + 42.7200000 96.1000000 + 42.6800000 96.1000000 + 42.6500000 96.1300000 + 42.5700000 96.1200000 + 42.5000000 96.1500000 + 42.4300000 96.1200000 + 42.3200000 96.1300000 + 42.2700000 96.0800000 + 42.2300000 96.0700000 + 42.3000000 96.0700000 + 42.3300000 96.0300000 + 42.3800000 96.0300000 + 42.4300000 96.0500000 + 42.4700000 96.0000000 + 42.5000000 95.9800000 + 42.5300000 95.9300000 + 42.5300000 95.9200000 + 42.5000000 95.8800000 + 42.4800000 95.9000000 + 42.4700000 95.9000000 + 42.4500000 95.8800000 + 42.3200000 95.9200000 + 42.3000000 95.9200000 + 42.2800000 95.9300000 + 42.2300000 95.9500000 + 42.1800000 96.0000000 + 42.1000000 96.0000000 + 42.1000000 96.0200000 + 42.0500000 96.0200000 + 42.0300000 96.0000000 + 42.0000000 95.9800000 + 41.9700000 95.9800000 + 41.9700000 96.0000000 + 41.9700000 96.0200000 + 42.0200000 96.0500000 + 42.0700000 96.0700000 + 42.0800000 96.1000000 + 42.1700000 96.1300000 + 42.2800000 96.2000000 + 42.3200000 96.2500000 + 42.3305100 96.2584100 + 42.4200000 96.3300000 + 42.4300000 96.3500000 + 42.4700000 96.3500000 + 42.4800000 96.3200000 + 42.5200000 96.3200000 + 42.5200000 96.3000000 + 42.5300000 96.2700000 + 42.5500000 96.2800000 + 42.5700000 96.2500000 + 42.6800000 96.1800000 + 42.6800000 96.1700000 + 42.6800000 96.1500000 +813 813 -1 29 43.80070 97.02903 + 44.1251500 97.2186900 + 44.1061400 97.1355700 + 44.0279600 97.0378100 + 43.9790300 96.9819900 + 43.9306300 96.8437000 + 43.8912500 96.8294600 + 43.8817100 96.7743500 + 43.8125600 96.7872900 + 43.7138200 96.7998700 + 43.6746100 96.7582900 + 43.5956200 96.7711100 + 43.5265000 96.7840100 + 43.4965000 96.8520300 + 43.4762200 96.9337800 + 43.5248100 97.0302000 + 43.5935200 97.0723000 + 43.5934000 97.0860000 + 43.6326300 97.1140200 + 43.7215200 97.1017500 + 43.7410100 97.1295100 + 43.7899800 97.1715100 + 43.8295700 97.1584500 + 43.8786600 97.1867800 + 43.9284800 97.1326100 + 43.9960500 97.2990200 + 44.0355300 97.2997700 + 44.0459300 97.2448300 + 44.1248900 97.2462800 + 44.1251500 97.2186900 +819 819 -1 32 42.99500 96.37500 + 43.1700000 96.2700000 + 43.1500000 96.2000000 + 43.1700000 96.1500000 + 43.1200000 96.1800000 + 43.0800000 96.1700000 + 43.0700000 96.1800000 + 43.0500000 96.2200000 + 43.0200000 96.2200000 + 43.0000000 96.2700000 + 42.9700000 96.2800000 + 42.9300000 96.2700000 + 42.8800000 96.3300000 + 42.8700000 96.4000000 + 42.8300000 96.4500000 + 42.8200000 96.5200000 + 42.8300000 96.5700000 + 42.8700000 96.5800000 + 42.9000000 96.5700000 + 42.9200000 96.5800000 + 42.9500000 96.5800000 + 42.9800000 96.5800000 + 43.0200000 96.5800000 + 43.0300000 96.6000000 + 43.0500000 96.5800000 + 43.1000000 96.5800000 + 43.1300000 96.5700000 + 43.1200000 96.5500000 + 43.0500000 96.4800000 + 43.0500000 96.4700000 + 43.1300000 96.3500000 + 43.1500000 96.3000000 + 43.1700000 96.2700000 +820 820 -1 29 43.38410 96.71186 + 43.5480300 96.5770600 + 43.5300000 96.5500000 + 43.5200000 96.5300000 + 43.5000000 96.5000000 + 43.5200000 96.4700000 + 43.5300000 96.4700000 + 43.5300000 96.4000000 + 43.4700000 96.4200000 + 43.4300000 96.3800000 + 43.3700000 96.3800000 + 43.3500000 96.4200000 + 43.3200000 96.4300000 + 43.3000000 96.4700000 + 43.2700000 96.4700000 + 43.2700000 96.5000000 + 43.2300000 96.5800000 + 43.2200000 96.6500000 + 43.2174300 96.6487100 + 43.2015500 96.7122400 + 43.2803300 96.7266800 + 43.5148400 97.0437200 + 43.5248100 97.0302000 + 43.4762200 96.9337800 + 43.4965000 96.8520300 + 43.4670900 96.8243300 + 43.4674200 96.7696700 + 43.5271100 96.6745900 + 43.5666300 96.6612900 + 43.5480300 96.5770600 +825 825 -1 38 42.85140 96.66654 + 43.1300000 96.5700000 + 43.1000000 96.5800000 + 43.0500000 96.5800000 + 43.0300000 96.6000000 + 43.0200000 96.5800000 + 42.9800000 96.5800000 + 42.9500000 96.5800000 + 42.9200000 96.5800000 + 42.9000000 96.5700000 + 42.8700000 96.5800000 + 42.8300000 96.5700000 + 42.8200000 96.5200000 + 42.8300000 96.4500000 + 42.8700000 96.4000000 + 42.8800000 96.3300000 + 42.8700000 96.3300000 + 42.8500000 96.3000000 + 42.8300000 96.3200000 + 42.8200000 96.3500000 + 42.7800000 96.3500000 + 42.7300000 96.3800000 + 42.7000000 96.4200000 + 42.6200000 96.4300000 + 42.5800000 96.4700000 + 42.5518600 96.4700000 + 42.5500800 96.4703800 + 42.5228700 96.4761100 + 42.5620500 96.5303300 + 42.6995000 96.6259800 + 42.7482600 96.7211000 + 42.8662300 96.7629800 + 42.8955400 96.8039600 + 43.0235300 96.8190300 + 43.0434100 96.7921000 + 43.1522000 96.7253300 + 43.1800000 96.6300000 + 43.1800000 96.5800000 + 43.1300000 96.5700000 +826 826 -1 21 43.21000 96.46000 + 43.1700000 96.2700000 + 43.1500000 96.3000000 + 43.1300000 96.3500000 + 43.0500000 96.4700000 + 43.0500000 96.4800000 + 43.1200000 96.5500000 + 43.1300000 96.5700000 + 43.1800000 96.5800000 + 43.1800000 96.6300000 + 43.2174300 96.6487100 + 43.2200000 96.6500000 + 43.2300000 96.5800000 + 43.2700000 96.5000000 + 43.2700000 96.4700000 + 43.3000000 96.4700000 + 43.3200000 96.4300000 + 43.3500000 96.4200000 + 43.3700000 96.3800000 + 43.2300000 96.2800000 + 43.2200000 96.2800000 + 43.1700000 96.2700000 +855 855 -1 32 42.90500 96.00000 + 42.9700000 96.0800000 + 42.9800000 96.0700000 + 42.9800000 96.0300000 + 42.9800000 96.0000000 + 42.9700000 95.9800000 + 42.9700000 95.9500000 + 43.0000000 95.9300000 + 43.0200000 95.9200000 + 43.0300000 95.8800000 + 43.0200000 95.8200000 + 42.9800000 95.8200000 + 42.9700000 95.8200000 + 42.9300000 95.8200000 + 42.8800000 95.8000000 + 42.8800000 95.8200000 + 42.8800000 95.8700000 + 42.8000000 95.9300000 + 42.8000000 95.9500000 + 42.7800000 95.9700000 + 42.7800000 96.0000000 + 42.7800000 96.0200000 + 42.8000000 96.0800000 + 42.7800000 96.1000000 + 42.7800000 96.1300000 + 42.8000000 96.1700000 + 42.8200000 96.2000000 + 42.8500000 96.1800000 + 42.8700000 96.1800000 + 42.8800000 96.1700000 + 42.9000000 96.1300000 + 42.9500000 96.0800000 + 42.9700000 96.0800000 +856 856 -1 25 43.07500 96.11500 + 43.2200000 96.0700000 + 43.2300000 96.0200000 + 43.2000000 95.9800000 + 43.1800000 95.9800000 + 43.1700000 95.9500000 + 43.1200000 95.9800000 + 43.1000000 96.0000000 + 43.0800000 95.9800000 + 43.0700000 96.0200000 + 43.0500000 96.0200000 + 43.0200000 96.0500000 + 42.9800000 96.0700000 + 42.9700000 96.0800000 + 42.9200000 96.1500000 + 42.9200000 96.1800000 + 42.9300000 96.2700000 + 42.9700000 96.2800000 + 43.0000000 96.2700000 + 43.0200000 96.2200000 + 43.0500000 96.2200000 + 43.0700000 96.1800000 + 43.0800000 96.1700000 + 43.1200000 96.1800000 + 43.1700000 96.1500000 + 43.2200000 96.0700000 +857 857 -1 30 42.82500 96.26583 + 42.9700000 96.0800000 + 42.9500000 96.0800000 + 42.9000000 96.1300000 + 42.8800000 96.1700000 + 42.8700000 96.1800000 + 42.8500000 96.1800000 + 42.8200000 96.2000000 + 42.8000000 96.1700000 + 42.7800000 96.1300000 + 42.7800000 96.1000000 + 42.8000000 96.0800000 + 42.7800000 96.0200000 + 42.7300000 96.0500000 + 42.7300000 96.0800000 + 42.7200000 96.1000000 + 42.6800000 96.1500000 + 42.7200000 96.2300000 + 42.7500000 96.3200000 + 42.7700000 96.3200000 + 42.7800000 96.3300000 + 42.7800000 96.3500000 + 42.8200000 96.3500000 + 42.8300000 96.3200000 + 42.8500000 96.3000000 + 42.8700000 96.3300000 + 42.8800000 96.3300000 + 42.9300000 96.2700000 + 42.9200000 96.1800000 + 42.9200000 96.1500000 + 42.9700000 96.0800000 +858 858 -1 14 42.65000 96.25000 + 42.6800000 96.1500000 + 42.6800000 96.1700000 + 42.6800000 96.1800000 + 42.5700000 96.2500000 + 42.5500000 96.2800000 + 42.5700000 96.3000000 + 42.5700000 96.3200000 + 42.6000000 96.3500000 + 42.6200000 96.3500000 + 42.6300000 96.3300000 + 42.7000000 96.3300000 + 42.7500000 96.3200000 + 42.7200000 96.2300000 + 42.6800000 96.1500000 +865 865 -1 19 42.65500 96.39519 + 42.7500000 96.3200000 + 42.7000000 96.3300000 + 42.6300000 96.3300000 + 42.6200000 96.3500000 + 42.6000000 96.3500000 + 42.5800000 96.3500000 + 42.5300000 96.4000000 + 42.5300000 96.4200000 + 42.5500000 96.4300000 + 42.5500800 96.4703800 + 42.5518600 96.4700000 + 42.5800000 96.4700000 + 42.6200000 96.4300000 + 42.7000000 96.4200000 + 42.7300000 96.3800000 + 42.7800000 96.3500000 + 42.7800000 96.3300000 + 42.7700000 96.3200000 + 42.7500000 96.3200000 +904 904 -1 30 40.79660 94.31000 + 41.0200000 94.2800000 + 41.0232900 94.2712300 + 41.0200000 94.2500000 + 40.9500000 94.2200000 + 40.9200000 94.2200000 + 40.8800000 94.2300000 + 40.8500000 94.1800000 + 40.8200000 94.1800000 + 40.8200000 94.1700000 + 40.7500000 94.1800000 + 40.7300000 94.2000000 + 40.7200000 94.2300000 + 40.6700000 94.2200000 + 40.5800000 94.2700000 + 40.5700000 94.3000000 + 40.6000000 94.4200000 + 40.6200000 94.4500000 + 40.6500000 94.4500000 + 40.6800000 94.4000000 + 40.7300000 94.3800000 + 40.7300000 94.4000000 + 40.8000000 94.3800000 + 40.8300000 94.3700000 + 40.9200000 94.3700000 + 40.9300000 94.3500000 + 40.9200000 94.3300000 + 40.9700000 94.2800000 + 40.9800000 94.2700000 + 41.0000000 94.2700000 + 41.0200000 94.2800000 +905 905 -1 16 40.46000 94.47500 + 40.5700000 94.3000000 + 40.5500000 94.3300000 + 40.4500000 94.3800000 + 40.4200000 94.3800000 + 40.3800000 94.3700000 + 40.3000000 94.3800000 + 40.3200000 94.5300000 + 40.3500000 94.6500000 + 40.4000000 94.6500000 + 40.4000000 94.6300000 + 40.4800000 94.5800000 + 40.5500000 94.5700000 + 40.5500000 94.5300000 + 40.6200000 94.4500000 + 40.6000000 94.4200000 + 40.5700000 94.3000000 +906 906 -1 23 40.21500 94.53500 + 40.3000000 94.3800000 + 40.2500000 94.3800000 + 40.2000000 94.3700000 + 40.1800000 94.3800000 + 40.1800000 94.4000000 + 40.1500000 94.4200000 + 40.1200000 94.4300000 + 40.1000000 94.4700000 + 40.1000000 94.4800000 + 40.0800000 94.5200000 + 40.0800000 94.5500000 + 40.0800000 94.5700000 + 40.1200000 94.5800000 + 40.1200000 94.6200000 + 40.1200000 94.6500000 + 40.1300000 94.6700000 + 40.2000000 94.6800000 + 40.2200000 94.7000000 + 40.2800000 94.6800000 + 40.3000000 94.6700000 + 40.3500000 94.6500000 + 40.3200000 94.5300000 + 40.3000000 94.3800000 +907 907 -1 34 40.73500 94.17500 + 40.9500000 94.2200000 + 40.9500000 94.1800000 + 40.9300000 94.1700000 + 40.9300000 94.1500000 + 40.9000000 94.1200000 + 40.8500000 94.1200000 + 40.8300000 94.1000000 + 40.8300000 94.0800000 + 40.8000000 94.0700000 + 40.7700000 94.0500000 + 40.7500000 94.0700000 + 40.7200000 94.0500000 + 40.7000000 94.0500000 + 40.6800000 94.0800000 + 40.6700000 94.0800000 + 40.6200000 94.1000000 + 40.6000000 94.1300000 + 40.5800000 94.1200000 + 40.5500000 94.1300000 + 40.5300000 94.1200000 + 40.5200000 94.1200000 + 40.5500000 94.2800000 + 40.5700000 94.3000000 + 40.5800000 94.2700000 + 40.6700000 94.2200000 + 40.7200000 94.2300000 + 40.7300000 94.2000000 + 40.7500000 94.1800000 + 40.8200000 94.1700000 + 40.8200000 94.1800000 + 40.8500000 94.1800000 + 40.8800000 94.2300000 + 40.9200000 94.2200000 + 40.9500000 94.2200000 +908 908 -1 21 40.37500 94.25000 + 40.5200000 94.1200000 + 40.5000000 94.1300000 + 40.4700000 94.1200000 + 40.4200000 94.1300000 + 40.3500000 94.1500000 + 40.3200000 94.2200000 + 40.2800000 94.2200000 + 40.2500000 94.2500000 + 40.2000000 94.2700000 + 40.2000000 94.3500000 + 40.1800000 94.3800000 + 40.2000000 94.3700000 + 40.2500000 94.3800000 + 40.3000000 94.3800000 + 40.3800000 94.3700000 + 40.4200000 94.3800000 + 40.4500000 94.3800000 + 40.5500000 94.3300000 + 40.5700000 94.3000000 + 40.5500000 94.2800000 + 40.5200000 94.1200000 +909 909 -1 32 40.18500 94.29500 + 40.3500000 94.1500000 + 40.3500000 94.1300000 + 40.3300000 94.1300000 + 40.3200000 94.1200000 + 40.2700000 94.1200000 + 40.2300000 94.1300000 + 40.2000000 94.1300000 + 40.1800000 94.1200000 + 40.0800000 94.1500000 + 40.0300000 94.1300000 + 40.0200000 94.1300000 + 40.0200000 94.1500000 + 40.0200000 94.1700000 + 40.0200000 94.1800000 + 40.0200000 94.2500000 + 40.0500000 94.3000000 + 40.0500000 94.3300000 + 40.0500000 94.3500000 + 40.0300000 94.3800000 + 40.0300000 94.4200000 + 40.0500000 94.4300000 + 40.1000000 94.4700000 + 40.1200000 94.4300000 + 40.1500000 94.4200000 + 40.1800000 94.4000000 + 40.1800000 94.3800000 + 40.2000000 94.3500000 + 40.2000000 94.2700000 + 40.2500000 94.2500000 + 40.2800000 94.2200000 + 40.3200000 94.2200000 + 40.3500000 94.1500000 +910 910 -1 38 39.90000 94.32500 + 40.1000000 94.4700000 + 40.0500000 94.4300000 + 40.0300000 94.4200000 + 40.0300000 94.3800000 + 40.0500000 94.3500000 + 40.0500000 94.3300000 + 40.0500000 94.3000000 + 40.0200000 94.2500000 + 40.0200000 94.1800000 + 40.0200000 94.1700000 + 40.0200000 94.1500000 + 40.0200000 94.1300000 + 39.9500000 94.1200000 + 39.9200000 94.1300000 + 39.8700000 94.1300000 + 39.8500000 94.1800000 + 39.8300000 94.1800000 + 39.8000000 94.2200000 + 39.7800000 94.2300000 + 39.7500000 94.2300000 + 39.7300000 94.2800000 + 39.7000000 94.3200000 + 39.7200000 94.3700000 + 39.7800000 94.3800000 + 39.7800000 94.4200000 + 39.8300000 94.4200000 + 39.8500000 94.4300000 + 39.9000000 94.4700000 + 39.9200000 94.4500000 + 39.9300000 94.4800000 + 39.9500000 94.4700000 + 40.0000000 94.4700000 + 40.0000000 94.4800000 + 40.0200000 94.5000000 + 40.0700000 94.5300000 + 40.0800000 94.5200000 + 40.1000000 94.4800000 + 40.1000000 94.4700000 +933 933 -1 25 41.19500 94.24500 + 41.3700000 94.4300000 + 41.3700000 94.3700000 + 41.3300000 94.3200000 + 41.3000000 94.3200000 + 41.2500000 94.2500000 + 41.2700000 94.2200000 + 41.2200000 94.2000000 + 41.1800000 94.1700000 + 41.1800000 94.1300000 + 41.1300000 94.0800000 + 41.1300000 94.0300000 + 41.1200000 94.0200000 + 41.0800000 94.1200000 + 41.0232900 94.2712300 + 41.0200000 94.2800000 + 41.0300000 94.3000000 + 41.0800000 94.3200000 + 41.1000000 94.3300000 + 41.1700000 94.3800000 + 41.2000000 94.4000000 + 41.2000000 94.4200000 + 41.2700000 94.4700000 + 41.3000000 94.4700000 + 41.3200000 94.4500000 + 41.3700000 94.4300000 +934 934 -1 26 40.94500 94.03562 + 41.1200000 94.0200000 + 41.1200000 93.9800000 + 41.0800000 93.9800000 + 41.0500000 93.9300000 + 41.0700000 93.9200000 + 41.0500000 93.8800000 + 41.0300000 93.9000000 + 41.0200000 93.8800000 + 40.9800000 93.8800000 + 40.9800000 93.8200000 + 40.9300000 93.8000000 + 40.8300000 93.9300000 + 40.7700000 94.0500000 + 40.8000000 94.0700000 + 40.8300000 94.0800000 + 40.8300000 94.1000000 + 40.8500000 94.1200000 + 40.9000000 94.1200000 + 40.9300000 94.1500000 + 40.9300000 94.1700000 + 40.9500000 94.1800000 + 40.9500000 94.2200000 + 41.0200000 94.2500000 + 41.0232900 94.2712300 + 41.0800000 94.1200000 + 41.1200000 94.0200000 +BAYI4 BAYI4 -1 18 41.99500 94.76000 + 42.2200000 95.0000000 + 42.1800000 94.8900000 + 42.1200000 94.7500000 + 42.0200000 94.6100000 + 41.9900000 94.5300000 + 41.9700000 94.5100000 + 41.8600000 94.5100000 + 41.8400000 94.4900000 + 41.7800000 94.5000000 + 41.7700000 94.5300000 + 41.8300000 94.6700000 + 41.9000000 94.7500000 + 41.9300000 94.8200000 + 42.0500000 94.9500000 + 42.1200000 95.0200000 + 42.1500000 95.0300000 + 42.2000000 95.0200000 + 42.2200000 95.0000000 +EFWI4 EFWI4 -1 43 42.28000 94.74000 + 42.6200000 94.7300000 + 42.6000000 94.6900000 + 42.5900000 94.6600000 + 42.5400000 94.5800000 + 42.5200000 94.4900000 + 42.5100000 94.4500000 + 42.4900000 94.4200000 + 42.4300000 94.3700000 + 42.4200000 94.3600000 + 42.4000000 94.3800000 + 42.2700000 94.4900000 + 42.2200000 94.5100000 + 42.1700000 94.5100000 + 42.1200000 94.4900000 + 42.0700000 94.4400000 + 42.0200000 94.3600000 + 42.0000000 94.3600000 + 41.9900000 94.3800000 + 41.9500000 94.3800000 + 41.9400000 94.4000000 + 41.9800000 94.4700000 + 41.9900000 94.5300000 + 42.0200000 94.6100000 + 42.1200000 94.7500000 + 42.1800000 94.8900000 + 42.2200000 95.0000000 + 42.2300000 95.0300000 + 42.2700000 95.0500000 + 42.3200000 95.0300000 + 42.3200000 95.0700000 + 42.3700000 95.0800000 + 42.4700000 95.1000000 + 42.5000000 95.1200000 + 42.5200000 95.1000000 + 42.5000000 95.0800000 + 42.4500000 95.0500000 + 42.3800000 95.0300000 + 42.3000000 94.9800000 + 42.3700000 94.9400000 + 42.3800000 94.8900000 + 42.4300000 94.8500000 + 42.5300000 94.8000000 + 42.6200000 94.7300000 +FCKN1HW PAPILLION CR. NR FT. CROOK NE -1 369 41.34750 96.14417 + 41.1183130 95.9379170 + 41.1204170 95.9608540 + 41.1183540 95.9629170 + 41.1099790 95.9629170 + 41.1058540 95.9670830 + 41.1016460 95.9670830 + 41.0995830 95.9691460 + 41.0995830 95.9733540 + 41.1162500 95.9899790 + 41.1162500 96.0025210 + 41.1183130 96.0045830 + 41.1225210 96.0045830 + 41.1245830 96.0066460 + 41.1245830 96.0108540 + 41.1224790 96.0129170 + 41.1204170 96.0150210 + 41.1162500 96.0191460 + 41.1162500 96.0275210 + 41.1141460 96.0295830 + 41.1120830 96.0400210 + 41.1141880 96.0420830 + 41.1162500 96.0483540 + 41.1183540 96.0504170 + 41.1204170 96.0525210 + 41.1225210 96.0545830 + 41.1245830 96.0608540 + 41.1224790 96.0629170 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1225210 96.1004170 + 41.1245830 96.1025210 + 41.1266880 96.1045830 + 41.1287500 96.1066880 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1649790 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1183130 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2066460 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3058540 96.2587500 + 41.3079170 96.2608130 + 41.3099790 96.2629170 + 41.3120830 96.2608540 + 41.3141460 96.2587500 + 41.3162500 96.2566880 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3245830 96.2483130 + 41.3266460 96.2462500 + 41.3287500 96.2483130 + 41.3308130 96.2504170 + 41.3329170 96.2524790 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566460 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4412500 96.2983130 + 41.4412500 96.3025210 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5329170 96.2858130 + 41.5349790 96.2837500 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5558540 96.2712500 + 41.5579170 96.2691880 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5558540 96.2045830 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4224790 96.1212500 + 41.4204170 96.1191880 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4287500 96.0733540 + 41.4308130 96.0712500 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3600210 96.0254170 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3245830 96.0191880 + 41.3245830 96.0024790 + 41.3225210 96.0004170 + 41.3141460 96.0004170 + 41.3120830 95.9983540 + 41.3100210 95.9962500 + 41.2933130 95.9962500 + 41.2912500 95.9983130 + 41.2891880 96.0004170 + 41.2870830 96.0024790 + 41.2850210 96.0045830 + 41.2829170 96.0025210 + 41.2829170 95.9858130 + 41.2725210 95.9754170 + 41.2704170 95.9733540 + 41.2683540 95.9712500 + 41.2599790 95.9712500 + 41.2474790 95.9670830 + 41.2454170 95.9670830 + 41.2454170 95.9691880 + 41.2433540 95.9712500 + 41.2391460 95.9712500 + 41.2370830 95.9733130 + 41.2350210 95.9754170 + 41.2099790 95.9754170 + 41.2079170 95.9733540 + 41.2058540 95.9712500 + 41.1974790 95.9712500 + 41.1954170 95.9691880 + 41.1933540 95.9670830 + 41.1912500 95.9650210 + 41.1912500 95.9608130 + 41.1891880 95.9587500 + 41.1849790 95.9587500 + 41.1829170 95.9566880 + 41.1829170 95.9524790 + 41.1808540 95.9504170 + 41.1787500 95.9483540 + 41.1808130 95.9462500 + 41.1891880 95.9462500 + 41.1912500 95.9441880 + 41.1912500 95.9399790 + 41.1787500 95.9233130 + 41.1766880 95.9212500 + 41.1724790 95.9212500 + 41.1704170 95.9191880 + 41.1683540 95.9170830 + 41.1641460 95.9170830 + 41.1620830 95.9150210 + 41.1620830 95.9108130 + 41.1600210 95.9087500 + 41.1579170 95.9066880 + 41.1558540 95.9045830 + 41.1474790 95.9045830 + 41.1454170 95.9066460 + 41.1433540 95.9087500 + 41.1391460 95.9087500 + 41.1370830 95.9108130 + 41.1350210 95.9129170 + 41.1329170 95.9149790 + 41.1308540 95.9170830 + 41.1266460 95.9170830 + 41.1245830 95.9191460 + 41.1225210 95.9212500 + 41.1204170 95.9233130 + 41.1204170 95.9316880 + 41.1183130 95.9379170 +HBLN1HW N.F. BIG NEMAHA RIVER AT HUMBOLT NE -1 528 40.34333 96.27750 + 40.1537500 95.9420830 + 40.1287500 95.9691880 + 40.1245830 95.9733130 + 40.1245830 95.9775210 + 40.1225210 95.9795830 + 40.1141460 95.9795830 + 40.1120830 95.9816460 + 40.1120830 95.9858540 + 40.1099790 95.9879170 + 40.1058540 95.9920830 + 40.1016460 95.9920830 + 40.0995830 95.9941880 + 40.0954170 95.9983130 + 40.0954170 96.0108540 + 40.0975210 96.0129170 + 40.0995830 96.0149790 + 40.0995830 96.0233540 + 40.0974790 96.0254170 + 40.0954170 96.0274790 + 40.0954170 96.0358540 + 40.0933540 96.0379170 + 40.0891460 96.0379170 + 40.0870830 96.0399790 + 40.0870830 96.0650210 + 40.0850210 96.0670830 + 40.0808130 96.0670830 + 40.0787500 96.0691880 + 40.0766460 96.0712500 + 40.0745830 96.0733130 + 40.0745830 96.0858540 + 40.0766460 96.0879170 + 40.0808540 96.0879170 + 40.0829170 96.0900210 + 40.0850210 96.0920830 + 40.0891460 96.0962500 + 40.0933540 96.0962500 + 40.0954170 96.0983540 + 40.0974790 96.1004170 + 40.1016880 96.1004170 + 40.1037500 96.1025210 + 40.1058540 96.1045830 + 40.1079170 96.1066880 + 40.1120830 96.1108540 + 40.1099790 96.1129170 + 40.1079170 96.1149790 + 40.1079170 96.1295830 + 40.1141460 96.1337500 + 40.1183540 96.1337500 + 40.1204170 96.1358130 + 40.1245830 96.1441460 + 40.1245830 96.1525210 + 40.1266460 96.1545830 + 40.1308540 96.1545830 + 40.1329170 96.1566460 + 40.1329170 96.1608540 + 40.1350210 96.1629170 + 40.1391460 96.1670830 + 40.1433540 96.1670830 + 40.1495830 96.1733130 + 40.1495830 96.1775210 + 40.1516460 96.1795830 + 40.1558540 96.1795830 + 40.1579170 96.1774790 + 40.1600210 96.1754170 + 40.1620830 96.1775210 + 40.1641460 96.1795830 + 40.1683540 96.1795830 + 40.1704170 96.1816460 + 40.1704170 96.1858540 + 40.1766460 96.1920830 + 40.1808540 96.1920830 + 40.1829170 96.1941460 + 40.1829170 96.1983540 + 40.1849790 96.2004170 + 40.1933540 96.2004170 + 40.1954170 96.2024790 + 40.1974790 96.2129170 + 40.2100210 96.2129170 + 40.2120830 96.2150210 + 40.2141880 96.2170830 + 40.2162500 96.2191880 + 40.2183540 96.2212500 + 40.2204170 96.2233540 + 40.2224790 96.2254170 + 40.2266880 96.2254170 + 40.2287500 96.2275210 + 40.2308540 96.2295830 + 40.2329170 96.2316880 + 40.2350210 96.2337500 + 40.2370830 96.2358130 + 40.2433130 96.2462500 + 40.2475210 96.2462500 + 40.2599790 96.2587500 + 40.2683540 96.2587500 + 40.2704170 96.2608130 + 40.3037500 96.3024790 + 40.3037500 96.3150210 + 40.3058130 96.3170830 + 40.3204170 96.3233130 + 40.3204170 96.3316880 + 40.3225210 96.3337500 + 40.3245830 96.3358130 + 40.3245830 96.3483540 + 40.3225210 96.3504170 + 40.2891460 96.3504170 + 40.2870830 96.3524790 + 40.2870830 96.3566880 + 40.2891880 96.3587500 + 40.2912500 96.3608130 + 40.2912500 96.3650210 + 40.2891880 96.3670830 + 40.2849790 96.3670830 + 40.2829170 96.3691460 + 40.2829170 96.3733540 + 40.2808130 96.3754170 + 40.2787500 96.3775210 + 40.2766460 96.3795830 + 40.2745830 96.3816460 + 40.2745830 96.3941880 + 40.2766880 96.3962500 + 40.2787500 96.3983130 + 40.2787500 96.4150210 + 40.2766460 96.4170830 + 40.2745830 96.4191460 + 40.2745830 96.4233540 + 40.2724790 96.4254170 + 40.2704170 96.4274790 + 40.2704170 96.4400210 + 40.2683130 96.4420830 + 40.2662500 96.4441460 + 40.2662500 96.4525210 + 40.2641880 96.4545830 + 40.2599790 96.4545830 + 40.2579170 96.4566880 + 40.2558130 96.4587500 + 40.2537500 96.4608130 + 40.2537500 96.4650210 + 40.2516460 96.4670830 + 40.2495830 96.4670830 + 40.2454170 96.4733130 + 40.2454170 96.4941880 + 40.2454170 96.4962500 + 40.2599790 96.5004170 + 40.2641880 96.5004170 + 40.2662500 96.4983130 + 40.2683130 96.4962500 + 40.2725210 96.4962500 + 40.2745830 96.4941460 + 40.2766880 96.4920830 + 40.2787500 96.4900210 + 40.2787500 96.4733130 + 40.2808540 96.4712500 + 40.2829170 96.4691460 + 40.2850210 96.4670830 + 40.2870830 96.4691880 + 40.2891460 96.4712500 + 40.2933540 96.4712500 + 40.2954170 96.4733540 + 40.2975210 96.4754170 + 40.2995830 96.4775210 + 40.3016460 96.4795830 + 40.3058540 96.4795830 + 40.3079170 96.4816460 + 40.3079170 96.4858540 + 40.3100210 96.4879170 + 40.3120830 96.4900210 + 40.3141460 96.4920830 + 40.3266880 96.4920830 + 40.3287500 96.4899790 + 40.3308130 96.4879170 + 40.3391880 96.4879170 + 40.3412500 96.4900210 + 40.3433540 96.4920830 + 40.3454170 96.4941880 + 40.3474790 96.4962500 + 40.3516880 96.4962500 + 40.3537500 96.4983540 + 40.3558540 96.5004170 + 40.3579170 96.5024790 + 40.3579170 96.5066880 + 40.3600210 96.5087500 + 40.3620830 96.5108130 + 40.3620830 96.5191880 + 40.3641460 96.5212500 + 40.3725210 96.5212500 + 40.3745830 96.5233540 + 40.3766460 96.5254170 + 40.3891880 96.5254170 + 40.3912500 96.5275210 + 40.3933540 96.5295830 + 40.3954170 96.5316460 + 40.3954170 96.5358540 + 40.3975210 96.5379170 + 40.3995830 96.5358130 + 40.4016460 96.5337500 + 40.4058540 96.5337500 + 40.4079170 96.5358130 + 40.4079170 96.5400210 + 40.4100210 96.5420830 + 40.4120830 96.5441460 + 40.4120830 96.5775210 + 40.4141880 96.5795830 + 40.4162500 96.5816460 + 40.4162500 96.5900210 + 40.4183130 96.5920830 + 40.4266880 96.5920830 + 40.4287500 96.5941880 + 40.4308540 96.5962500 + 40.4329170 96.5983130 + 40.4329170 96.6150210 + 40.4350210 96.6170830 + 40.4370830 96.6191880 + 40.4391880 96.6212500 + 40.4412500 96.6233130 + 40.4412500 96.6316880 + 40.4433540 96.6337500 + 40.4454170 96.6358540 + 40.4475210 96.6379170 + 40.4495830 96.6400210 + 40.4516880 96.6420830 + 40.4537500 96.6441880 + 40.4558130 96.6462500 + 40.4600210 96.6462500 + 40.4620830 96.6483540 + 40.4641880 96.6504170 + 40.4662500 96.6525210 + 40.4683540 96.6545830 + 40.4704170 96.6566880 + 40.4724790 96.6587500 + 40.4766880 96.6587500 + 40.4787500 96.6566460 + 40.4808540 96.6545830 + 40.4829170 96.6524790 + 40.4849790 96.6504170 + 40.4933130 96.6545830 + 40.4975210 96.6545830 + 40.4995830 96.6566460 + 40.5120830 96.6774790 + 40.5120830 96.6858540 + 40.5141880 96.6879170 + 40.5162500 96.6900210 + 40.5183540 96.6920830 + 40.5204170 96.6941460 + 40.5224790 96.7004170 + 40.5266880 96.7004170 + 40.5287500 96.7024790 + 40.5329170 96.7108540 + 40.5308130 96.7129170 + 40.5287500 96.7150210 + 40.5266460 96.7170830 + 40.5245830 96.7191460 + 40.5245830 96.7233540 + 40.5266880 96.7254170 + 40.5287500 96.7274790 + 40.5287500 96.7358540 + 40.5308540 96.7379170 + 40.5329170 96.7399790 + 40.5329170 96.7483540 + 40.5329170 96.7504170 + 40.5350210 96.7504170 + 40.5370830 96.7524790 + 40.5391460 96.7545830 + 40.5516880 96.7545830 + 40.5537500 96.7525210 + 40.5558130 96.7504170 + 40.5579170 96.7483540 + 40.5599790 96.7462500 + 40.5620830 96.7441880 + 40.5620830 96.7191460 + 40.5641460 96.7170830 + 40.5662500 96.7150210 + 40.5683130 96.7129170 + 40.5704170 96.7108540 + 40.5704170 96.7066460 + 40.5724790 96.7045830 + 40.5745830 96.7025210 + 40.5745830 96.6941460 + 40.5725210 96.6920830 + 40.5704170 96.6900210 + 40.5704170 96.6816460 + 40.5683540 96.6795830 + 40.5662500 96.6775210 + 40.5662500 96.6608130 + 40.5641880 96.6587500 + 40.5620830 96.6566880 + 40.5620830 96.6524790 + 40.5600210 96.6504170 + 40.5558130 96.6504170 + 40.5537500 96.6483540 + 40.5537500 96.6399790 + 40.5558130 96.6379170 + 40.5579170 96.6358540 + 40.5599790 96.6337500 + 40.5620830 96.6316880 + 40.5600210 96.6295830 + 40.5579170 96.6275210 + 40.5579170 96.6191460 + 40.5558540 96.6170830 + 40.5537500 96.6150210 + 40.5537500 96.5941460 + 40.5558130 96.5920830 + 40.5579170 96.5900210 + 40.5599790 96.5879170 + 40.5620830 96.5858540 + 40.5641460 96.5837500 + 40.5662500 96.5816880 + 40.5641880 96.5795830 + 40.5620830 96.5775210 + 40.5641460 96.5754170 + 40.5662500 96.5733540 + 40.5662500 96.5691460 + 40.5683130 96.5670830 + 40.5704170 96.5650210 + 40.5704170 96.5608130 + 40.5724790 96.5587500 + 40.5745830 96.5566880 + 40.5745830 96.5524790 + 40.5766460 96.5504170 + 40.5787500 96.5483540 + 40.5808130 96.5462500 + 40.5829170 96.5441880 + 40.5829170 96.5316460 + 40.5849790 96.5295830 + 40.5891880 96.5295830 + 40.5912500 96.5275210 + 40.5933130 96.5254170 + 40.5975210 96.5254170 + 40.6100210 96.5129170 + 40.6120830 96.5129170 + 40.6120830 96.5108130 + 40.6100210 96.5087500 + 40.6058130 96.5087500 + 40.6037500 96.5066880 + 40.6016880 96.5045830 + 40.5933130 96.5045830 + 40.5912500 96.5025210 + 40.5891880 96.5004170 + 40.5870830 96.4983540 + 40.5850210 96.4962500 + 40.5829170 96.4941880 + 40.5808540 96.4920830 + 40.5787500 96.4900210 + 40.5787500 96.4774790 + 40.5766880 96.4754170 + 40.5745830 96.4733540 + 40.5725210 96.4712500 + 40.5704170 96.4691880 + 40.5683540 96.4670830 + 40.5662500 96.4650210 + 40.5662500 96.4608130 + 40.5641880 96.4587500 + 40.5620830 96.4566880 + 40.5620830 96.4524790 + 40.5600210 96.4504170 + 40.5579170 96.4483540 + 40.5579170 96.4441460 + 40.5558540 96.4420830 + 40.5516460 96.4420830 + 40.5495830 96.4400210 + 40.5475210 96.4379170 + 40.5454170 96.4358540 + 40.5433540 96.4337500 + 40.5391460 96.4337500 + 40.5350210 96.4295830 + 40.5329170 96.4275210 + 40.5329170 96.4191460 + 40.5308540 96.4170830 + 40.5287500 96.4150210 + 40.5266880 96.4129170 + 40.5245830 96.4108540 + 40.5245830 96.3983130 + 40.5225210 96.3962500 + 40.5204170 96.3941880 + 40.5204170 96.3774790 + 40.5183540 96.3754170 + 40.5162500 96.3733540 + 40.5141880 96.3712500 + 40.5058130 96.3712500 + 40.5037500 96.3691880 + 40.5016880 96.3670830 + 40.4974790 96.3670830 + 40.4954170 96.3650210 + 40.4933540 96.3629170 + 40.4766460 96.3629170 + 40.4745830 96.3608540 + 40.4745830 96.3566460 + 40.4725210 96.3545830 + 40.4704170 96.3525210 + 40.4704170 96.3441460 + 40.4683540 96.3420830 + 40.4662500 96.3400210 + 40.4683130 96.3379170 + 40.4704170 96.3358540 + 40.4704170 96.3274790 + 40.4683540 96.3254170 + 40.4620830 96.3233540 + 40.4600210 96.3129170 + 40.4558540 96.3087500 + 40.4537500 96.3066880 + 40.4537500 96.2899790 + 40.4516880 96.2879170 + 40.4495830 96.2858540 + 40.4495830 96.2816460 + 40.4475210 96.2795830 + 40.4454170 96.2775210 + 40.4433540 96.2754170 + 40.4391460 96.2754170 + 40.4370830 96.2733540 + 40.4350210 96.2712500 + 40.4329170 96.2691880 + 40.4308540 96.2670830 + 40.4287500 96.2650210 + 40.4308130 96.2629170 + 40.4329170 96.2608540 + 40.4329170 96.2566460 + 40.4308540 96.2545830 + 40.4287500 96.2525210 + 40.4287500 96.2441460 + 40.4308130 96.2420830 + 40.4350210 96.2420830 + 40.4370830 96.2400210 + 40.4370830 96.2358130 + 40.4350210 96.2337500 + 40.4329170 96.2316880 + 40.4329170 96.2274790 + 40.4308540 96.2254170 + 40.4287500 96.2233540 + 40.4266880 96.2212500 + 40.4224790 96.2212500 + 40.4204170 96.2191880 + 40.4204170 96.1941460 + 40.4183540 96.1920830 + 40.4141460 96.1920830 + 40.4037500 96.1733130 + 40.4016880 96.1712500 + 40.3995830 96.1691880 + 40.3975210 96.1670830 + 40.3891460 96.1670830 + 40.3870830 96.1650210 + 40.3850210 96.1629170 + 40.3808130 96.1629170 + 40.3787500 96.1608540 + 40.3787500 96.1399790 + 40.3766880 96.1379170 + 40.3641460 96.1379170 + 40.3620830 96.1358540 + 40.3600210 96.1337500 + 40.3558130 96.1337500 + 40.3537500 96.1316880 + 40.3537500 96.1274790 + 40.3516880 96.1254170 + 40.3474790 96.1254170 + 40.3454170 96.1233540 + 40.3474790 96.1212500 + 40.3495830 96.1191880 + 40.3495830 96.1066460 + 40.3516460 96.1045830 + 40.3558540 96.1045830 + 40.3579170 96.1025210 + 40.3579170 96.0899790 + 40.3558540 96.0879170 + 40.3537500 96.0858540 + 40.3537500 96.0774790 + 40.3579170 96.0691460 + 40.3579170 96.0670830 + 40.3558130 96.0670830 + 40.3537500 96.0650210 + 40.3516880 96.0629170 + 40.3495830 96.0608540 + 40.3475210 96.0587500 + 40.3433130 96.0587500 + 40.3412500 96.0566880 + 40.3391880 96.0545830 + 40.3370830 96.0525210 + 40.3350210 96.0504170 + 40.3329170 96.0483540 + 40.3329170 96.0399790 + 40.3308540 96.0379170 + 40.3287500 96.0358540 + 40.3287500 96.0274790 + 40.3266880 96.0254170 + 40.3224790 96.0254170 + 40.3204170 96.0233540 + 40.3183540 96.0212500 + 40.3141460 96.0212500 + 40.3120830 96.0191880 + 40.3100210 96.0170830 + 40.3079170 96.0150210 + 40.3058540 96.0129170 + 40.2954170 96.0025210 + 40.2954170 95.9899790 + 40.2933540 95.9879170 + 40.2912500 95.9858540 + 40.2912500 95.9774790 + 40.2891880 95.9754170 + 40.2849790 95.9754170 + 40.2829170 95.9733540 + 40.2808540 95.9712500 + 40.2724790 95.9712500 + 40.2704170 95.9691880 + 40.2683540 95.9670830 + 40.2662500 95.9650210 + 40.2641880 95.9629170 + 40.2558540 95.9587500 + 40.2516460 95.9587500 + 40.2495830 95.9566880 + 40.2475210 95.9545830 + 40.2391460 95.9545830 + 40.2370830 95.9525210 + 40.2350210 95.9504170 + 40.2329170 95.9483540 + 40.2225210 95.9337500 + 40.2141460 95.9337500 + 40.2058130 95.9254170 + 40.2037500 95.9254170 + 40.2016880 95.9295830 + 40.1974790 95.9295830 + 40.1933540 95.9337500 + 40.1891460 95.9337500 + 40.1870830 95.9358540 + 40.1849790 95.9379170 + 40.1829170 95.9399790 + 40.1829170 95.9441880 + 40.1808540 95.9462500 + 40.1641460 95.9462500 + 40.1620830 95.9441460 + 40.1600210 95.9420830 + 40.1537500 95.9420830 +IDNI4 IDNI4 -1 48 41.37000 93.66875 + 41.6200000 94.6500000 + 41.6000000 94.6300000 + 41.5700000 94.5500000 + 41.5300000 94.5100000 + 41.5100000 94.4700000 + 41.4800000 94.4500000 + 41.4200000 94.3900000 + 41.3900000 94.3400000 + 41.3300000 94.2400000 + 41.3100000 94.1600000 + 41.3100000 94.0800000 + 41.3200000 93.9900000 + 41.3400000 93.9100000 + 41.3800000 93.7200000 + 41.4000000 93.6700000 + 41.4300000 93.6500000 + 41.4300000 93.5700000 + 41.3800000 93.5600000 + 41.3500000 93.5900000 + 41.2900000 93.7600000 + 41.2500000 93.8000000 + 41.2200000 93.8300000 + 41.1700000 93.8600000 + 41.1400000 93.9100000 + 41.1300000 93.9900000 + 41.1200000 94.0200000 + 41.1300000 94.0300000 + 41.1300000 94.0800000 + 41.1800000 94.1300000 + 41.1800000 94.1700000 + 41.2200000 94.2000000 + 41.2700000 94.2200000 + 41.2500000 94.2500000 + 41.3000000 94.3200000 + 41.3300000 94.3200000 + 41.3700000 94.3700000 + 41.3700000 94.4300000 + 41.3700000 94.4700000 + 41.3700000 94.4800000 + 41.4700000 94.5700000 + 41.4500000 94.5700000 + 41.4700000 94.6200000 + 41.4800000 94.6300000 + 41.5300000 94.6700000 + 41.5700000 94.6700000 + 41.5800000 94.7000000 + 41.6000000 94.7000000 + 41.6200000 94.6500000 +IRVN1HW LTL PAPILLION CRK AT IRVINGTON, NE -1 76 41.36833 96.06917 + 41.3079170 96.0504170 + 41.3120830 96.0775210 + 41.3141460 96.0795830 + 41.3225210 96.0795830 + 41.3433130 96.1004170 + 41.3475210 96.1004170 + 41.3495830 96.1025210 + 41.3516880 96.1045830 + 41.3558130 96.1087500 + 41.3641880 96.1087500 + 41.3662500 96.1108540 + 41.3683130 96.1129170 + 41.3725210 96.1129170 + 41.3745830 96.1150210 + 41.3766460 96.1170830 + 41.3808540 96.1170830 + 41.3829170 96.1191880 + 41.3850210 96.1212500 + 41.3870830 96.1233540 + 41.3891460 96.1254170 + 41.3975210 96.1254170 + 41.3995830 96.1275210 + 41.4016460 96.1295830 + 41.4100210 96.1295830 + 41.4120830 96.1274790 + 41.4141880 96.1254170 + 41.4162500 96.1233130 + 41.4183540 96.1212500 + 41.4204170 96.1212500 + 41.4204170 96.1191460 + 41.4183540 96.1170830 + 41.4162500 96.1150210 + 41.4162500 96.1108130 + 41.4141880 96.1087500 + 41.4120830 96.1066880 + 41.4120830 96.0983130 + 41.4141460 96.0962500 + 41.4162500 96.0941880 + 41.4162500 96.0899790 + 41.4183130 96.0879170 + 41.4204170 96.0858540 + 41.4204170 96.0816460 + 41.4224790 96.0795830 + 41.4245830 96.0775210 + 41.4266460 96.0754170 + 41.4329170 96.0691880 + 41.4329170 96.0649790 + 41.4308540 96.0629170 + 41.4224790 96.0629170 + 41.4204170 96.0608540 + 41.4204170 96.0399790 + 41.4183540 96.0379170 + 41.4141460 96.0379170 + 41.4120830 96.0358540 + 41.4100210 96.0337500 + 41.3849790 96.0337500 + 41.3829170 96.0316880 + 41.3829170 96.0274790 + 41.3808540 96.0254170 + 41.3724790 96.0254170 + 41.3704170 96.0233540 + 41.3683540 96.0212500 + 41.3641460 96.0212500 + 41.3620830 96.0233130 + 41.3308130 96.0254170 + 41.3287500 96.0233540 + 41.3266880 96.0212500 + 41.3183130 96.0212500 + 41.3162500 96.0233130 + 41.3141880 96.0254170 + 41.3120830 96.0274790 + 41.3120830 96.0316880 + 41.3079170 96.0358130 + 41.3058540 96.0379170 + 41.3037500 96.0399790 + 41.3079170 96.0504170 +LCNN1HW SALT CR. AT LINCOLN NE -1 485 40.87250 96.86500 + 40.8454170 96.6795830 + 40.8224790 96.6670830 + 40.8141880 96.6587500 + 40.8058130 96.6587500 + 40.8037500 96.6566880 + 40.8016880 96.6545830 + 40.7995830 96.6525210 + 40.7995830 96.6483130 + 40.7975210 96.6462500 + 40.7954170 96.6441880 + 40.7954170 96.6274790 + 40.7933540 96.6254170 + 40.7912500 96.6233540 + 40.7891880 96.6212500 + 40.7870830 96.6191880 + 40.7870830 96.6108130 + 40.7850210 96.6087500 + 40.7724790 96.6087500 + 40.7704170 96.6066880 + 40.7683540 96.6045830 + 40.7662500 96.6025210 + 40.7600210 96.5962500 + 40.7558130 96.5962500 + 40.7537500 96.5941880 + 40.7516880 96.5920830 + 40.7308130 96.5920830 + 40.7287500 96.5941460 + 40.7266880 96.5962500 + 40.7245830 96.5941880 + 40.7225210 96.5920830 + 40.7183130 96.5920830 + 40.7058540 96.5795830 + 40.7016460 96.5795830 + 40.6995830 96.5774790 + 40.6995830 96.5754170 + 40.6891880 96.5712500 + 40.6808130 96.5712500 + 40.6787500 96.5691460 + 40.6766880 96.5670830 + 40.6724790 96.5670830 + 40.6704170 96.5649790 + 40.6683540 96.5629170 + 40.6599790 96.5629170 + 40.6579170 96.5608540 + 40.6579170 96.5566460 + 40.6558130 96.5545830 + 40.6537500 96.5525210 + 40.6495830 96.5441880 + 40.6495830 96.5399790 + 40.6474790 96.5379170 + 40.6454170 96.5358130 + 40.6433540 96.5337500 + 40.6329170 96.5275210 + 40.6329170 96.5233130 + 40.6308540 96.5212500 + 40.6224790 96.5212500 + 40.6204170 96.5191460 + 40.6183130 96.5170830 + 40.6162500 96.5149790 + 40.6141880 96.5129170 + 40.6099790 96.5129170 + 40.6079170 96.5150210 + 40.6058130 96.5170830 + 40.6037500 96.5191880 + 40.6016460 96.5212500 + 40.5995830 96.5233540 + 40.5975210 96.5254170 + 40.5933130 96.5254170 + 40.5912500 96.5275210 + 40.5891880 96.5295830 + 40.5849790 96.5295830 + 40.5829170 96.5316460 + 40.5829170 96.5441880 + 40.5808130 96.5462500 + 40.5787500 96.5483540 + 40.5766460 96.5504170 + 40.5745830 96.5524790 + 40.5745830 96.5566880 + 40.5724790 96.5587500 + 40.5704170 96.5608130 + 40.5704170 96.5650210 + 40.5683130 96.5670830 + 40.5662500 96.5691460 + 40.5662500 96.5733540 + 40.5641460 96.5754170 + 40.5620830 96.5775210 + 40.5641880 96.5795830 + 40.5662500 96.5816880 + 40.5641460 96.5837500 + 40.5620830 96.5858540 + 40.5599790 96.5879170 + 40.5579170 96.5900210 + 40.5558130 96.5920830 + 40.5537500 96.5941460 + 40.5537500 96.6150210 + 40.5558540 96.6170830 + 40.5579170 96.6191460 + 40.5579170 96.6275210 + 40.5600210 96.6295830 + 40.5620830 96.6316880 + 40.5599790 96.6337500 + 40.5579170 96.6358540 + 40.5558130 96.6379170 + 40.5537500 96.6399790 + 40.5537500 96.6483540 + 40.5558130 96.6504170 + 40.5600210 96.6504170 + 40.5620830 96.6566880 + 40.5641880 96.6587500 + 40.5662500 96.6775210 + 40.5683540 96.6795830 + 40.5704170 96.6816460 + 40.5704170 96.6900210 + 40.5725210 96.6920830 + 40.5745830 96.6941460 + 40.5745830 96.7025210 + 40.5724790 96.7045830 + 40.5704170 96.7066460 + 40.5704170 96.7108540 + 40.5683130 96.7129170 + 40.5662500 96.7150210 + 40.5641460 96.7170830 + 40.5620830 96.7441880 + 40.5599790 96.7462500 + 40.5579170 96.7483540 + 40.5558130 96.7504170 + 40.5537500 96.7525210 + 40.5516880 96.7545830 + 40.5391460 96.7545830 + 40.5370830 96.7524790 + 40.5349790 96.7504170 + 40.5329170 96.7504170 + 40.5245830 96.7608540 + 40.5266880 96.7629170 + 40.5287500 96.7650210 + 40.5308540 96.7670830 + 40.5329170 96.7691460 + 40.5329170 96.7775210 + 40.5350210 96.7795830 + 40.5370830 96.7816460 + 40.5370830 96.7900210 + 40.5391880 96.7920830 + 40.5412500 96.7941880 + 40.5391460 96.7962500 + 40.5370830 96.7983540 + 40.5391880 96.8004170 + 40.5412500 96.8024790 + 40.5412500 96.8108540 + 40.5391460 96.8129170 + 40.5370830 96.8150210 + 40.5349790 96.8170830 + 40.5329170 96.8191880 + 40.5308130 96.8212500 + 40.5287500 96.8233130 + 40.5287500 96.8316880 + 40.5266880 96.8337500 + 40.5224790 96.8337500 + 40.5204170 96.8358130 + 40.5204170 96.8566880 + 40.5225210 96.8587500 + 40.5245830 96.8608540 + 40.5224790 96.8629170 + 40.5204170 96.8649790 + 40.5204170 96.8733540 + 40.5224790 96.8754170 + 40.5266880 96.8754170 + 40.5287500 96.8775210 + 40.5308540 96.8795830 + 40.5329170 96.8816880 + 40.5350210 96.8837500 + 40.5370830 96.8858540 + 40.5391880 96.8879170 + 40.5412500 96.8900210 + 40.5433540 96.8920830 + 40.5474790 96.8962500 + 40.5558540 96.8962500 + 40.5579170 96.8983540 + 40.5600210 96.9004170 + 40.5620830 96.9025210 + 40.5641880 96.9045830 + 40.5662500 96.9066880 + 40.5683540 96.9087500 + 40.5704170 96.9108130 + 40.5704170 96.9150210 + 40.5724790 96.9170830 + 40.5808540 96.9212500 + 40.5829170 96.9191460 + 40.5849790 96.9170830 + 40.6058540 96.9170830 + 40.6079170 96.9191880 + 40.6099790 96.9212500 + 40.6141880 96.9212500 + 40.6162500 96.9233540 + 40.6183130 96.9254170 + 40.6266880 96.9254170 + 40.6287500 96.9233540 + 40.6287500 96.9149790 + 40.6308540 96.9129170 + 40.6329170 96.9108540 + 40.6329170 96.9024790 + 40.6350210 96.9004170 + 40.6370830 96.8983540 + 40.6370830 96.8941460 + 40.6391880 96.8920830 + 40.6412500 96.8899790 + 40.6433540 96.8879170 + 40.6454170 96.8900210 + 40.6475210 96.8920830 + 40.6495830 96.8941460 + 40.6495830 96.9025210 + 40.6516460 96.9045830 + 40.6725210 96.9045830 + 40.6745830 96.9066460 + 40.6745830 96.9150210 + 40.6724790 96.9170830 + 40.6704170 96.9191460 + 40.6704170 96.9233540 + 40.6725210 96.9254170 + 40.6745830 96.9275210 + 40.6870830 96.9399790 + 40.6870830 96.9525210 + 40.6891880 96.9545830 + 40.6912500 96.9566880 + 40.6933130 96.9587500 + 40.7016880 96.9587500 + 40.7037500 96.9608540 + 40.7058130 96.9629170 + 40.7391880 96.9629170 + 40.7412500 96.9649790 + 40.7412500 96.9691880 + 40.7433540 96.9712500 + 40.7454170 96.9733130 + 40.7454170 96.9775210 + 40.7475210 96.9795830 + 40.7495830 96.9816880 + 40.7516880 96.9837500 + 40.7537500 96.9858540 + 40.7558540 96.9879170 + 40.7579170 96.9899790 + 40.7579170 96.9941880 + 40.7599790 96.9962500 + 40.7683540 96.9962500 + 40.7704170 96.9983540 + 40.7725210 97.0004170 + 40.7766880 97.0045830 + 40.7787500 97.0024790 + 40.7808130 97.0004170 + 40.7850210 97.0004170 + 40.7870830 96.9983130 + 40.7891460 96.9962500 + 40.7933540 96.9962500 + 40.7954170 96.9983540 + 40.7974790 97.0004170 + 40.8225210 97.0004170 + 40.8245830 97.0025210 + 40.8266880 97.0045830 + 40.8287500 97.0066880 + 40.8308130 97.0087500 + 40.8516880 97.0087500 + 40.8537500 97.0108540 + 40.8558130 97.0129170 + 40.8641880 97.0129170 + 40.8662500 97.0108130 + 40.8683130 97.0087500 + 40.8933540 97.0087500 + 40.8954170 97.0108540 + 40.8975210 97.0129170 + 40.8995830 97.0150210 + 40.9016880 97.0170830 + 40.9037500 97.0149790 + 40.9058130 97.0129170 + 40.9100210 97.0129170 + 40.9120830 97.0108130 + 40.9183540 97.0087500 + 40.9204170 97.0108540 + 40.9224790 97.0129170 + 40.9266880 97.0129170 + 40.9287500 97.0108130 + 40.9308540 97.0087500 + 40.9329170 97.0066460 + 40.9350210 97.0045830 + 40.9370830 97.0025210 + 40.9370830 96.9941460 + 40.9391880 96.9920830 + 40.9412500 96.9899790 + 40.9433130 96.9879170 + 40.9475210 96.9879170 + 40.9495830 96.9858130 + 40.9516460 96.9837500 + 40.9558540 96.9837500 + 40.9579170 96.9858540 + 40.9600210 96.9879170 + 40.9620830 96.9899790 + 40.9620830 97.0025210 + 40.9641460 97.0045830 + 40.9683540 97.0045830 + 40.9704170 97.0066880 + 40.9725210 97.0087500 + 40.9745830 97.0108130 + 40.9745830 97.0233540 + 40.9766460 97.0254170 + 40.9975210 97.0254170 + 40.9995830 97.0275210 + 41.0016460 97.0295830 + 41.0058540 97.0295830 + 41.0079170 97.0316460 + 41.0141460 97.0420830 + 41.0225210 97.0420830 + 41.0245830 97.0441880 + 41.0266880 97.0462500 + 41.0287500 97.0441460 + 41.0308130 97.0420830 + 41.0350210 97.0420830 + 41.0370830 97.0399790 + 41.0391880 97.0379170 + 41.0412500 97.0358130 + 41.0433130 97.0337500 + 41.0475210 97.0337500 + 41.0495830 97.0316460 + 41.0516880 97.0295830 + 41.0537500 97.0275210 + 41.0537500 97.0233130 + 41.0558540 97.0212500 + 41.0579170 97.0191460 + 41.0599790 97.0170830 + 41.0766880 97.0170830 + 41.0787500 97.0191880 + 41.0808540 97.0212500 + 41.0829170 97.0233540 + 41.0849790 97.0254170 + 41.0975210 97.0254170 + 41.0995830 97.0233130 + 41.1016880 97.0212500 + 41.1037500 97.0191460 + 41.1058540 97.0170830 + 41.1079170 97.0150210 + 41.1079170 97.0108130 + 41.1141880 97.0087500 + 41.1162500 97.0066460 + 41.1183540 97.0045830 + 41.1204170 97.0024790 + 41.1225210 97.0004170 + 41.1245830 96.9983130 + 41.1266460 96.9962500 + 41.1391880 96.9962500 + 41.1412500 96.9941460 + 41.1433540 96.9920830 + 41.1454170 96.9941460 + 41.1454170 96.9983540 + 41.1474790 97.0004170 + 41.1766880 97.0004170 + 41.1787500 97.0025210 + 41.1808540 97.0045830 + 41.1829170 97.0066880 + 41.1891880 97.0087500 + 41.1912500 97.0066460 + 41.1933130 97.0045830 + 41.2016880 97.0045830 + 41.2037500 97.0066880 + 41.2100210 97.0087500 + 41.2120830 97.0108540 + 41.2183540 97.0129170 + 41.2204170 97.0129170 + 41.2204170 97.0024790 + 41.2224790 97.0004170 + 41.2245830 96.9983540 + 41.2245830 96.9899790 + 41.2225210 96.9879170 + 41.2204170 96.9858540 + 41.2183540 96.9837500 + 41.2162500 96.9816880 + 41.2162500 96.9774790 + 41.2183130 96.9754170 + 41.2204170 96.9733540 + 41.2183540 96.9712500 + 41.2141460 96.9712500 + 41.2120830 96.9691880 + 41.2120830 96.9649790 + 41.2100210 96.9629170 + 41.2079170 96.9608540 + 41.2079170 96.9274790 + 41.2058540 96.9254170 + 41.2037500 96.9233540 + 41.2037500 96.9149790 + 41.2058130 96.9129170 + 41.2079170 96.9108540 + 41.2058540 96.9087500 + 41.2037500 96.9066880 + 41.2120830 96.8941460 + 41.2120830 96.8920830 + 41.2099790 96.8920830 + 41.2079170 96.8900210 + 41.2079170 96.8858130 + 41.2058540 96.8837500 + 41.2016460 96.8837500 + 41.1995830 96.8816880 + 41.1975210 96.8795830 + 41.1954170 96.8775210 + 41.1933540 96.8754170 + 41.1891460 96.8754170 + 41.1870830 96.8733540 + 41.1850210 96.8712500 + 41.1829170 96.8691880 + 41.1808540 96.8670830 + 41.1787500 96.8650210 + 41.1766880 96.8629170 + 41.1745830 96.8608540 + 41.1745830 96.8524790 + 41.1725210 96.8504170 + 41.1683130 96.8504170 + 41.1600210 96.8420830 + 41.1391460 96.8420830 + 41.1370830 96.8400210 + 41.1370830 96.8358130 + 41.1329170 96.8316460 + 41.1329170 96.8295830 + 41.1266460 96.8295830 + 41.1245830 96.8275210 + 41.1245830 96.8149790 + 41.1183540 96.8087500 + 41.1141460 96.8087500 + 41.1120830 96.8066880 + 41.1100210 96.8004170 + 41.1016460 96.8004170 + 41.0995830 96.7983540 + 41.0975210 96.7962500 + 41.0808130 96.7962500 + 41.0787500 96.7983130 + 41.0766880 96.8004170 + 41.0745830 96.7983540 + 41.0725210 96.7962500 + 41.0704170 96.7941880 + 41.0683540 96.7920830 + 41.0662500 96.7900210 + 41.0641880 96.7879170 + 41.0391460 96.7879170 + 41.0370830 96.7858540 + 41.0350210 96.7837500 + 41.0183130 96.7837500 + 41.0162500 96.7858130 + 41.0141880 96.7879170 + 41.0120830 96.7858540 + 41.0100210 96.7837500 + 41.0016460 96.7837500 + 40.9995830 96.7816880 + 40.9975210 96.7795830 + 40.9933130 96.7795830 + 40.9912500 96.7775210 + 40.9891880 96.7754170 + 40.9766460 96.7754170 + 40.9745830 96.7733540 + 40.9725210 96.7712500 + 40.9704170 96.7691880 + 40.9683540 96.7670830 + 40.9641460 96.7670830 + 40.9620830 96.7650210 + 40.9600210 96.7629170 + 40.9558130 96.7629170 + 40.9537500 96.7608540 + 40.9516880 96.7587500 + 40.9495830 96.7566880 + 40.9475210 96.7545830 + 40.9454170 96.7525210 + 40.9433540 96.7504170 + 40.9412500 96.7483540 + 40.9391880 96.7462500 + 40.9349790 96.7462500 + 40.9329170 96.7441880 + 40.9308540 96.7420830 + 40.9058130 96.7420830 + 40.9037500 96.7400210 + 40.9016880 96.7379170 + 40.8891460 96.7379170 + 40.8787500 96.7233130 + 40.8766880 96.7212500 + 40.8745830 96.7191880 + 40.8725210 96.7170830 + 40.8704170 96.7150210 + 40.8683540 96.7129170 + 40.8641460 96.7129170 + 40.8620830 96.7108540 + 40.8600210 96.7087500 + 40.8579170 96.7066880 + 40.8579170 96.6899790 + 40.8454170 96.6795830 +NEWI4 NEWI4 -1 24 42.78500 95.09000 + 42.9300000 94.9500000 + 42.8700000 94.9200000 + 42.8000000 94.9100000 + 42.7700000 94.9200000 + 42.6800000 94.9700000 + 42.6300000 95.0200000 + 42.6200000 95.0200000 + 42.6000000 95.0800000 + 42.6500000 95.1500000 + 42.6800000 95.2200000 + 42.7800000 95.2700000 + 42.8200000 95.2700000 + 42.8200000 95.2300000 + 42.8800000 95.2200000 + 42.8800000 95.2000000 + 42.8700000 95.1700000 + 42.8700000 95.1500000 + 42.8700000 95.1300000 + 42.8800000 95.1000000 + 42.9000000 95.0700000 + 42.9200000 95.0700000 + 42.9200000 95.0200000 + 42.9700000 94.9800000 + 42.9300000 94.9500000 +NRWI4 NRWI4 -1 28 41.42000 94.08000 + 41.5300000 94.5100000 + 41.5300000 94.4700000 + 41.5200000 94.3800000 + 41.5000000 94.2600000 + 41.5100000 94.2300000 + 41.4800000 94.1500000 + 41.4800000 94.1200000 + 41.4800000 94.0300000 + 41.5000000 93.9800000 + 41.4900000 93.9000000 + 41.4700000 93.8400000 + 41.4800000 93.7700000 + 41.5000000 93.7200000 + 41.4700000 93.6600000 + 41.4600000 93.6500000 + 41.4300000 93.6500000 + 41.4000000 93.6700000 + 41.3800000 93.7200000 + 41.3400000 93.9100000 + 41.3200000 93.9900000 + 41.3100000 94.0800000 + 41.3100000 94.1600000 + 41.3300000 94.2400000 + 41.3900000 94.3400000 + 41.4200000 94.3900000 + 41.4800000 94.4500000 + 41.5100000 94.4700000 + 41.5300000 94.5100000 +PANI4 PANI4 -1 9 41.65500 94.34500 + 41.7000000 94.4400000 + 41.7000000 94.3800000 + 41.7000000 94.3500000 + 41.7200000 94.3000000 + 41.6000000 94.2500000 + 41.5900000 94.3200000 + 41.6000000 94.4000000 + 41.6500000 94.4300000 + 41.7000000 94.4400000 +PNLI4 PNLI4 -1 10 41.77000 94.44000 + 41.8400000 94.4900000 + 41.8200000 94.4100000 + 41.7500000 94.3700000 + 41.7000000 94.3500000 + 41.7000000 94.3800000 + 41.7000000 94.4400000 + 41.7300000 94.4400000 + 41.7700000 94.5300000 + 41.7800000 94.5000000 + 41.8400000 94.4900000 +PPLN1HW W BR PAPILLION CREEK AT PAPILLION, NE -1 159 41.23917 96.18583 + 41.1495830 96.0420830 + 41.1391460 96.0462500 + 41.1370830 96.0483130 + 41.1370830 96.0566880 + 41.1350210 96.0587500 + 41.1245830 96.0587500 + 41.1204170 96.0649790 + 41.1204170 96.0691880 + 41.1183540 96.0712500 + 41.1120830 96.0733130 + 41.1120830 96.0941880 + 41.1141460 96.0962500 + 41.1183540 96.0962500 + 41.1204170 96.0983540 + 41.1329170 96.1108130 + 41.1329170 96.1275210 + 41.1308130 96.1295830 + 41.1287500 96.1316460 + 41.1287500 96.1441880 + 41.1308540 96.1462500 + 41.1329170 96.1483130 + 41.1329170 96.1608540 + 41.1308130 96.1629170 + 41.1287500 96.1733540 + 41.1266880 96.1754170 + 41.1162500 96.1774790 + 41.1162500 96.1900210 + 41.1183540 96.1920830 + 41.1204170 96.1941460 + 41.1204170 96.2025210 + 41.1183130 96.2045830 + 41.1162500 96.2150210 + 41.1183130 96.2170830 + 41.1225210 96.2170830 + 41.1245830 96.2191460 + 41.1245830 96.2316880 + 41.1266880 96.2337500 + 41.1287500 96.2400210 + 41.1308540 96.2420830 + 41.1329170 96.2441880 + 41.1349790 96.2462500 + 41.1391880 96.2462500 + 41.1412500 96.2441460 + 41.1433130 96.2420830 + 41.1475210 96.2420830 + 41.1495830 96.2441880 + 41.1516880 96.2462500 + 41.1537500 96.2483540 + 41.1558540 96.2504170 + 41.1579170 96.2524790 + 41.1579170 96.2650210 + 41.1579170 96.2670830 + 41.1850210 96.2670830 + 41.1870830 96.2650210 + 41.1891460 96.2629170 + 41.1912500 96.2608540 + 41.1933130 96.2587500 + 41.1975210 96.2587500 + 41.1995830 96.2566880 + 41.2016460 96.2504170 + 41.2100210 96.2504170 + 41.2120830 96.2524790 + 41.2141460 96.2545830 + 41.2162500 96.2566460 + 41.2183130 96.2587500 + 41.2225210 96.2587500 + 41.2245830 96.2608130 + 41.2266460 96.2629170 + 41.2350210 96.2629170 + 41.2370830 96.2608540 + 41.2391460 96.2587500 + 41.2433540 96.2587500 + 41.2495830 96.2525210 + 41.2516460 96.2504170 + 41.2537500 96.2483540 + 41.2558130 96.2462500 + 41.2725210 96.2462500 + 41.2745830 96.2483130 + 41.2766460 96.2504170 + 41.2850210 96.2504170 + 41.2891460 96.2545830 + 41.2975210 96.2545830 + 41.2995830 96.2566880 + 41.2995830 96.2587500 + 41.3100210 96.2629170 + 41.3120830 96.2608130 + 41.3141880 96.2587500 + 41.3225210 96.2545830 + 41.3245830 96.2525210 + 41.3266880 96.2462500 + 41.3287500 96.2483540 + 41.3308540 96.2504170 + 41.3329170 96.2525210 + 41.3349790 96.2545830 + 41.3391880 96.2545830 + 41.3412500 96.2566880 + 41.3433130 96.2587500 + 41.3475210 96.2587500 + 41.3495830 96.2608130 + 41.3495830 96.2650210 + 41.3516460 96.2670830 + 41.3600210 96.2670830 + 41.3620830 96.2670830 + 41.3620830 96.2649790 + 41.3641460 96.2629170 + 41.3662500 96.2608540 + 41.3662500 96.2358130 + 41.3641880 96.2337500 + 41.3620830 96.2316880 + 41.3620830 96.2274790 + 41.3600210 96.2254170 + 41.3579170 96.2233540 + 41.3579170 96.2191460 + 41.3558540 96.2170830 + 41.3537500 96.2150210 + 41.3537500 96.2024790 + 41.3516880 96.2004170 + 41.3495830 96.1983540 + 41.3475210 96.1962500 + 41.3391460 96.1962500 + 41.3183540 96.1754170 + 41.3120830 96.1733540 + 41.3120830 96.1691460 + 41.3100210 96.1670830 + 41.2974790 96.1670830 + 41.2912500 96.1566460 + 41.2912500 96.1545830 + 41.2891460 96.1545830 + 41.2599790 96.1462500 + 41.2579170 96.1441880 + 41.2558540 96.1420830 + 41.2516460 96.1420830 + 41.2495830 96.1400210 + 41.2495830 96.1316460 + 41.2475210 96.1295830 + 41.2454170 96.1275210 + 41.2433540 96.1254170 + 41.2412500 96.1233540 + 41.2412500 96.1149790 + 41.2391880 96.1129170 + 41.2370830 96.1108540 + 41.2350210 96.1087500 + 41.2308130 96.1087500 + 41.2287500 96.1066880 + 41.2266880 96.1045830 + 41.2204170 96.1025210 + 41.2204170 96.0899790 + 41.2016880 96.0754170 + 41.1974790 96.0754170 + 41.1954170 96.0733540 + 41.1954170 96.0649790 + 41.1912500 96.0566460 + 41.1891880 96.0545830 + 41.1870830 96.0566460 + 41.1850210 96.0587500 + 41.1829170 96.0566880 + 41.1683540 96.0379170 + 41.1599790 96.0379170 + 41.1495830 96.0420830 +PROI4 PROI4 -1 40 42.10000 94.30000 + 42.4100000 94.2700000 + 42.3900000 94.2600000 + 42.3600000 94.2400000 + 42.3300000 94.2100000 + 42.3100000 94.2000000 + 42.3100000 94.1600000 + 42.3000000 94.1400000 + 42.2800000 94.1400000 + 42.2400000 94.1500000 + 42.1500000 94.2300000 + 42.0900000 94.2400000 + 42.0200000 94.2400000 + 41.9800000 94.2200000 + 41.9300000 94.1500000 + 41.8400000 94.0800000 + 41.8000000 94.0700000 + 41.8100000 94.1100000 + 41.8300000 94.2100000 + 41.8200000 94.2300000 + 41.7800000 94.2400000 + 41.8100000 94.2900000 + 41.8400000 94.3400000 + 41.9200000 94.4600000 + 41.9700000 94.5100000 + 41.9900000 94.5300000 + 41.9800000 94.4700000 + 41.9400000 94.4000000 + 41.9500000 94.3800000 + 41.9900000 94.3800000 + 42.0000000 94.3600000 + 42.0200000 94.3600000 + 42.0700000 94.4400000 + 42.1200000 94.4900000 + 42.1700000 94.5100000 + 42.2200000 94.5100000 + 42.2700000 94.4900000 + 42.4000000 94.3800000 + 42.4200000 94.3600000 + 42.3900000 94.3200000 + 42.4100000 94.2700000 +PSGI4HW SOLDIER RIVER AT PISGAH IA -1 404 42.03917 95.68167 + 41.8287500 95.9337500 + 41.8350210 95.9379170 + 41.8474790 95.9504170 + 41.8516880 95.9504170 + 41.8558130 95.9545830 + 41.8600210 95.9545830 + 41.8620830 95.9524790 + 41.8641460 95.9504170 + 41.8891880 95.9504170 + 41.8912500 95.9483130 + 41.8933130 95.9462500 + 41.8975210 95.9462500 + 41.8995830 95.9441460 + 41.9016460 95.9420830 + 41.9058540 95.9420830 + 41.9079170 95.9399790 + 41.9141880 95.9337500 + 41.9162500 95.9337500 + 41.9162500 95.9191460 + 41.9183130 95.9170830 + 41.9225210 95.9170830 + 41.9245830 95.9150210 + 41.9266460 95.9129170 + 41.9308540 95.9129170 + 41.9329170 95.9108540 + 41.9349790 95.9087500 + 41.9558540 95.9087500 + 41.9579170 95.9108130 + 41.9599790 95.9129170 + 41.9662500 95.9024790 + 41.9683540 95.8962500 + 41.9662500 95.8941880 + 41.9662500 95.8899790 + 41.9683130 95.8879170 + 41.9704170 95.8858540 + 41.9724790 95.8837500 + 41.9766880 95.8837500 + 41.9787500 95.8816880 + 41.9787500 95.8733130 + 41.9766880 95.8712500 + 41.9745830 95.8691880 + 41.9766460 95.8670830 + 41.9787500 95.8650210 + 41.9808130 95.8629170 + 41.9891880 95.8629170 + 41.9912500 95.8608540 + 41.9933130 95.8587500 + 41.9954170 95.8566880 + 42.0016460 95.8504170 + 42.0141880 95.8504170 + 42.0162500 95.8483540 + 42.0183130 95.8462500 + 42.0225210 95.8462500 + 42.0245830 95.8441880 + 42.0245830 95.8399790 + 42.0266460 95.8379170 + 42.0350210 95.8379170 + 42.0516880 95.8295830 + 42.0537500 95.8316460 + 42.0558130 95.8337500 + 42.0579170 95.8316880 + 42.0599790 95.8295830 + 42.0620830 95.8275210 + 42.0641460 95.8254170 + 42.0683540 95.8254170 + 42.0704170 95.8191460 + 42.0787500 95.8108540 + 42.0787500 95.8024790 + 42.0829170 95.7733130 + 42.0849790 95.7712500 + 42.0870830 95.7691880 + 42.0870830 95.7649790 + 42.0891460 95.7629170 + 42.0933540 95.7629170 + 42.0954170 95.7649790 + 42.0974790 95.7670830 + 42.0995830 95.7650210 + 42.1016460 95.7629170 + 42.1037500 95.7608540 + 42.1058130 95.7587500 + 42.1079170 95.7566880 + 42.1099790 95.7545830 + 42.1183540 95.7545830 + 42.1204170 95.7525210 + 42.1224790 95.7504170 + 42.1245830 95.7483540 + 42.1266460 95.7462500 + 42.1308540 95.7462500 + 42.1329170 95.7441880 + 42.1349790 95.7420830 + 42.1391880 95.7420830 + 42.1412500 95.7400210 + 42.1412500 95.7358130 + 42.1433130 95.7337500 + 42.1474790 95.7295830 + 42.1558540 95.7295830 + 42.1579170 95.7275210 + 42.1599790 95.7212500 + 42.1641880 95.7212500 + 42.1662500 95.7191880 + 42.1683130 95.7087500 + 42.1725210 95.7087500 + 42.1745830 95.7066880 + 42.1745830 95.7024790 + 42.1766460 95.7004170 + 42.1787500 95.6983540 + 42.1808130 95.6962500 + 42.1829170 95.6941880 + 42.1849790 95.6920830 + 42.1933540 95.6920830 + 42.1954170 95.6900210 + 42.1954170 95.6816460 + 42.1974790 95.6795830 + 42.2016880 95.6795830 + 42.2037500 95.6775210 + 42.2037500 95.6691460 + 42.2058130 95.6670830 + 42.2079170 95.6650210 + 42.2079170 95.6399790 + 42.2099790 95.6379170 + 42.2120830 95.6358540 + 42.2141460 95.6337500 + 42.2162500 95.6316880 + 42.2183130 95.6295830 + 42.2204170 95.6275210 + 42.2224790 95.6254170 + 42.2245830 95.6233540 + 42.2266460 95.6212500 + 42.2308130 95.6170830 + 42.2350210 95.6170830 + 42.2370830 95.6150210 + 42.2391460 95.6129170 + 42.2412500 95.6108540 + 42.2454170 95.6025210 + 42.2433540 95.6004170 + 42.2412500 95.5983540 + 42.2412500 95.5899790 + 42.2579170 95.5733540 + 42.2579170 95.5691460 + 42.2620830 95.5608130 + 42.2662500 95.5566880 + 42.2683130 95.5545830 + 42.2704170 95.5525210 + 42.2724790 95.5504170 + 42.2808540 95.5504170 + 42.2829170 95.5483540 + 42.2808540 95.5462500 + 42.2787500 95.5441880 + 42.2787500 95.5399790 + 42.2808130 95.5379170 + 42.2829170 95.5358540 + 42.2829170 95.5316460 + 42.2870830 95.5275210 + 42.2891460 95.5254170 + 42.2912500 95.5233540 + 42.2912500 95.5024790 + 42.2870830 95.4858130 + 42.2870830 95.4837500 + 42.2849790 95.4837500 + 42.2829170 95.4816880 + 42.2829170 95.4733130 + 42.2808540 95.4712500 + 42.2787500 95.4691880 + 42.2787500 95.4524790 + 42.2808130 95.4504170 + 42.2829170 95.4483540 + 42.2849790 95.4462500 + 42.2870830 95.4441880 + 42.2870830 95.4399790 + 42.2891460 95.4379170 + 42.2912500 95.4358540 + 42.2933130 95.4337500 + 42.2954170 95.4316880 + 42.2954170 95.4274790 + 42.2933540 95.4254170 + 42.2912500 95.4233540 + 42.2912500 95.4108130 + 42.2933130 95.4087500 + 42.2954170 95.4066880 + 42.2933540 95.4045830 + 42.2912500 95.4025210 + 42.2891880 95.4004170 + 42.2808130 95.4004170 + 42.2787500 95.4024790 + 42.2766880 95.4045830 + 42.2745830 95.4025210 + 42.2725210 95.3962500 + 42.2704170 95.3941880 + 42.2704170 95.3899790 + 42.2724790 95.3879170 + 42.2745830 95.3858540 + 42.2745830 95.3816460 + 42.2766460 95.3795830 + 42.2787500 95.3775210 + 42.2787500 95.3691460 + 42.2808130 95.3670830 + 42.2829170 95.3650210 + 42.2829170 95.3483130 + 42.2808540 95.3462500 + 42.2787500 95.3441880 + 42.2787500 95.3358130 + 42.2745830 95.3233130 + 42.2745830 95.3212500 + 42.2662500 95.3274790 + 42.2662500 95.3316880 + 42.2641880 95.3337500 + 42.2579170 95.3358130 + 42.2579170 95.3525210 + 42.2558130 95.3545830 + 42.2537500 95.3524790 + 42.2516880 95.3504170 + 42.2391460 95.3504170 + 42.2370830 95.3524790 + 42.2370830 95.3566880 + 42.2349790 95.3587500 + 42.2329170 95.3608130 + 42.2329170 95.3650210 + 42.2287500 95.3691460 + 42.2287500 95.3775210 + 42.2266460 95.3795830 + 42.2245830 95.3816880 + 42.2224790 95.3837500 + 42.2141880 95.3920830 + 42.1995830 95.3983130 + 42.1995830 95.4066880 + 42.1954170 95.4108130 + 42.1954170 95.4150210 + 42.1933540 95.4170830 + 42.1787500 95.4191880 + 42.1683540 95.4295830 + 42.1641460 95.4295830 + 42.1620830 95.4274790 + 42.1599790 95.4254170 + 42.1579170 95.4233540 + 42.1579170 95.4191460 + 42.1558540 95.4170830 + 42.1433130 95.4170830 + 42.1412500 95.4149790 + 42.1391880 95.4129170 + 42.1308130 95.4129170 + 42.1287500 95.4108130 + 42.1224790 95.4087500 + 42.1204170 95.4108540 + 42.1183130 95.4129170 + 42.1162500 95.4150210 + 42.1141460 95.4170830 + 42.1120830 95.4191880 + 42.1058130 95.4212500 + 42.1037500 95.4233130 + 42.1037500 95.4316880 + 42.1016460 95.4337500 + 42.0995830 95.4358540 + 42.0975210 95.4379170 + 42.0933130 95.4379170 + 42.0912500 95.4379170 + 42.0829170 95.4649790 + 42.0829170 95.4816880 + 42.0808130 95.4837500 + 42.0766880 95.4879170 + 42.0704170 95.4899790 + 42.0704170 95.5025210 + 42.0683130 95.5045830 + 42.0662500 95.5066880 + 42.0641460 95.5087500 + 42.0620830 95.5108540 + 42.0599790 95.5129170 + 42.0579170 95.5149790 + 42.0579170 95.5275210 + 42.0558130 95.5295830 + 42.0537500 95.5274790 + 42.0516880 95.5254170 + 42.0433540 95.5295830 + 42.0391460 95.5295830 + 42.0370830 95.5316460 + 42.0329170 95.5399790 + 42.0329170 95.5483540 + 42.0308130 95.5504170 + 42.0287500 95.5525210 + 42.0266460 95.5545830 + 42.0245830 95.5545830 + 42.0287500 95.5608130 + 42.0287500 95.5816880 + 42.0308540 95.5837500 + 42.0329170 95.5858130 + 42.0329170 95.5900210 + 42.0350210 95.5920830 + 42.0370830 95.5941460 + 42.0370830 95.6066880 + 42.0349790 95.6087500 + 42.0329170 95.6108540 + 42.0308540 95.6129170 + 42.0266460 95.6129170 + 42.0245830 95.6149790 + 42.0204170 95.6233130 + 42.0204170 95.6275210 + 42.0183130 95.6295830 + 42.0162500 95.6316880 + 42.0141460 95.6337500 + 42.0120830 95.6358130 + 42.0120830 95.6608540 + 42.0099790 95.6629170 + 42.0079170 95.6650210 + 42.0058130 95.6670830 + 42.0037500 95.6691880 + 42.0016460 95.6712500 + 41.9995830 95.6733540 + 41.9975210 95.6754170 + 41.9891460 95.6754170 + 41.9870830 95.6774790 + 41.9870830 95.6816880 + 41.9850210 95.6837500 + 41.9808130 95.6837500 + 41.9787500 95.6858540 + 41.9766880 95.6879170 + 41.9683130 95.6879170 + 41.9662500 95.6900210 + 41.9641460 95.6920830 + 41.9620830 95.6941880 + 41.9600210 95.6962500 + 41.9516880 95.7004170 + 41.9433540 95.7045830 + 41.9349790 95.7045830 + 41.9329170 95.7066460 + 41.9329170 95.7233540 + 41.9308130 95.7254170 + 41.9287500 95.7275210 + 41.9266460 95.7295830 + 41.9245830 95.7316880 + 41.9224790 95.7337500 + 41.9204170 95.7358540 + 41.9162500 95.7399790 + 41.9162500 95.7441880 + 41.9141880 95.7462500 + 41.8849790 95.7462500 + 41.8829170 95.7483540 + 41.8808540 95.7504170 + 41.8683130 95.7504170 + 41.8662500 95.7524790 + 41.8662500 95.7566880 + 41.8641460 95.7587500 + 41.8620830 95.7608540 + 41.8599790 95.7629170 + 41.8579170 95.7650210 + 41.8558130 95.7670830 + 41.8537500 95.7691460 + 41.8537500 95.7733540 + 41.8516460 95.7754170 + 41.8495830 95.7775210 + 41.8474790 95.7795830 + 41.8454170 95.7816460 + 41.8454170 95.7858540 + 41.8475210 95.7879170 + 41.8495830 95.7900210 + 41.8474790 95.7920830 + 41.8454170 95.7941880 + 41.8475210 95.7962500 + 41.8495830 95.7983130 + 41.8433540 95.8170830 + 41.8308540 95.8212500 + 41.8266460 95.8212500 + 41.8245830 95.8233540 + 41.8225210 95.8254170 + 41.8183130 95.8254170 + 41.8162500 95.8275210 + 41.8141460 95.8295830 + 41.8120830 95.8316880 + 41.8099790 95.8337500 + 41.8079170 95.8358540 + 41.8058130 95.8379170 + 41.8037500 95.8399790 + 41.8037500 95.8441880 + 41.8016460 95.8462500 + 41.7995830 95.8483540 + 41.7974790 95.8504170 + 41.7954170 95.8525210 + 41.7974790 95.8545830 + 41.8016880 95.8545830 + 41.8037500 95.8566460 + 41.8037500 95.8691880 + 41.8016460 95.8712500 + 41.7995830 95.8733540 + 41.7974790 95.8754170 + 41.7954170 95.8775210 + 41.7933130 95.8795830 + 41.7912500 95.8816460 + 41.7912500 95.8858540 + 41.7891460 95.8879170 + 41.7870830 95.8899790 + 41.7870830 95.8983540 + 41.7870830 95.9004170 + 41.7933130 95.9045830 + 41.7975210 95.9045830 + 41.7995830 95.9066880 + 41.8016460 95.9087500 + 41.8058540 95.9087500 + 41.8079170 95.9108540 + 41.8100210 95.9129170 + 41.8120830 95.9150210 + 41.8183130 95.9212500 + 41.8225210 95.9212500 + 41.8245830 95.9233540 + 41.8266880 95.9254170 + 41.8287500 95.9274790 + 41.8287500 95.9337500 +RDOI4HW E. NISHNABOTNA RIVER AT REDOAK IA -1 596 41.46417 94.92333 + 41.0099790 95.2420830 + 41.0162500 95.2483130 + 41.0162500 95.2525210 + 41.0183130 95.2545830 + 41.0329170 95.2691460 + 41.0329170 95.2733540 + 41.0349790 95.2754170 + 41.0391880 95.2754170 + 41.0412500 95.2733540 + 41.0433130 95.2712500 + 41.0558540 95.2712500 + 41.0579170 95.2691880 + 41.0579170 95.2649790 + 41.0599790 95.2629170 + 41.0641880 95.2629170 + 41.0662500 95.2608540 + 41.0683130 95.2587500 + 41.0704170 95.2566880 + 41.0724790 95.2545830 + 41.0766880 95.2545830 + 41.0787500 95.2525210 + 41.0808130 95.2504170 + 41.0891880 95.2504170 + 41.0912500 95.2483540 + 41.0933130 95.2462500 + 41.0954170 95.2441880 + 41.0974790 95.2420830 + 41.1016880 95.2420830 + 41.1037500 95.2400210 + 41.1037500 95.2358130 + 41.1058130 95.2337500 + 41.1100210 95.2337500 + 41.1120830 95.2316880 + 41.1141460 95.2295830 + 41.1183540 95.2295830 + 41.1204170 95.2275210 + 41.1224790 95.2254170 + 41.1308540 95.2254170 + 41.1329170 95.2233540 + 41.1349790 95.2212500 + 41.1475210 95.2212500 + 41.1495830 95.2191880 + 41.1516460 95.2170830 + 41.1537500 95.2150210 + 41.1558130 95.2129170 + 41.1600210 95.2129170 + 41.1620830 95.2108540 + 41.1641460 95.2087500 + 41.1683540 95.2087500 + 41.1704170 95.2108130 + 41.1724790 95.2129170 + 41.1850210 95.2129170 + 41.1870830 95.2108540 + 41.1870830 95.2066460 + 41.1891460 95.2045830 + 41.1912500 95.2025210 + 41.1912500 95.1983130 + 41.1933130 95.1962500 + 41.2058540 95.1962500 + 41.2079170 95.1941880 + 41.2099790 95.1920830 + 41.2183540 95.1920830 + 41.2204170 95.1900210 + 41.2224790 95.1879170 + 41.2433540 95.1879170 + 41.2454170 95.1858540 + 41.2474790 95.1837500 + 41.2683540 95.1837500 + 41.2704170 95.1858130 + 41.2704170 95.1900210 + 41.2724790 95.1920830 + 41.2975210 95.1920830 + 41.2995830 95.1900210 + 41.3016460 95.1879170 + 41.3037500 95.1858540 + 41.3100210 95.1837500 + 41.3120830 95.1858130 + 41.3141460 95.1879170 + 41.3162500 95.1858540 + 41.3183130 95.1837500 + 41.3266880 95.1837500 + 41.3287500 95.1858130 + 41.3308130 95.1879170 + 41.3329170 95.1858540 + 41.3475210 95.1837500 + 41.3495830 95.1816880 + 41.3516460 95.1795830 + 41.3579170 95.1775210 + 41.3599790 95.1754170 + 41.3787500 95.1774790 + 41.3808130 95.1795830 + 41.3850210 95.1795830 + 41.3870830 95.1775210 + 41.3891460 95.1754170 + 41.4058540 95.1754170 + 41.4079170 95.1774790 + 41.4141880 95.1795830 + 41.4162500 95.1775210 + 41.4308540 95.1754170 + 41.4329170 95.1774790 + 41.4433540 95.1795830 + 41.4454170 95.1775210 + 41.4474790 95.1754170 + 41.4516880 95.1754170 + 41.4537500 95.1733540 + 41.4558130 95.1712500 + 41.4579170 95.1733130 + 41.4599790 95.1754170 + 41.4620830 95.1733540 + 41.4641460 95.1712500 + 41.4891880 95.1712500 + 41.4912500 95.1733130 + 41.4933130 95.1754170 + 41.5016880 95.1754170 + 41.5037500 95.1774790 + 41.5058130 95.1795830 + 41.5225210 95.1795830 + 41.5349790 95.1920830 + 41.5391880 95.1920830 + 41.5412500 95.1941460 + 41.5412500 95.1983540 + 41.5433540 95.2004170 + 41.5454170 95.2004170 + 41.5454170 95.1983130 + 41.5474790 95.1962500 + 41.5516880 95.1962500 + 41.5537500 95.1941880 + 41.5558130 95.1920830 + 41.5641880 95.1920830 + 41.5662500 95.1900210 + 41.5683130 95.1879170 + 41.5725210 95.1879170 + 41.5745830 95.1899790 + 41.5766460 95.1920830 + 41.5850210 95.1879170 + 41.5870830 95.1858540 + 41.5891460 95.1837500 + 41.5933540 95.1837500 + 41.5954170 95.1816880 + 41.5954170 95.1774790 + 41.5974790 95.1754170 + 41.5995830 95.1733540 + 41.6016460 95.1712500 + 41.6037500 95.1691880 + 41.6037500 95.1649790 + 41.6058130 95.1629170 + 41.6100210 95.1629170 + 41.6120830 95.1649790 + 41.6141460 95.1670830 + 41.6162500 95.1691460 + 41.6183130 95.1712500 + 41.6204170 95.1733130 + 41.6224790 95.1754170 + 41.6266880 95.1754170 + 41.6287500 95.1733540 + 41.6350210 95.1712500 + 41.6370830 95.1691880 + 41.6391460 95.1670830 + 41.6475210 95.1670830 + 41.6495830 95.1650210 + 41.6495830 95.1608130 + 41.6516460 95.1587500 + 41.6537500 95.1566880 + 41.6558130 95.1545830 + 41.6579170 95.1525210 + 41.6599790 95.1504170 + 41.6620830 95.1483540 + 41.6641460 95.1462500 + 41.6662500 95.1441880 + 41.6683130 95.1420830 + 41.6725210 95.1420830 + 41.6745830 95.1400210 + 41.6870830 95.1275210 + 41.6870830 95.1233130 + 41.6912500 95.1191880 + 41.6912500 95.1108130 + 41.6891880 95.1087500 + 41.6870830 95.1066880 + 41.6870830 95.0774790 + 41.6891460 95.0754170 + 41.6912500 95.0733540 + 41.6933130 95.0712500 + 41.6954170 95.0691880 + 41.6954170 95.0649790 + 41.6933540 95.0629170 + 41.6912500 95.0608540 + 41.6912500 95.0483130 + 41.6933130 95.0462500 + 41.6975210 95.0462500 + 41.6995830 95.0441880 + 41.7016460 95.0420830 + 41.7037500 95.0400210 + 41.7037500 95.0149790 + 41.7120830 95.0024790 + 41.7100210 95.0004170 + 41.7058130 95.0004170 + 41.7037500 94.9983540 + 41.7037500 94.9858130 + 41.7058130 94.9837500 + 41.7100210 94.9837500 + 41.7120830 94.9816880 + 41.7141460 94.9795830 + 41.7162500 94.9775210 + 41.7162500 94.9733130 + 41.7183130 94.9712500 + 41.7225210 94.9712500 + 41.7245830 94.9733130 + 41.7266460 94.9754170 + 41.7287500 94.9733540 + 41.7308130 94.9712500 + 41.7433540 94.9712500 + 41.7454170 94.9733130 + 41.7474790 94.9754170 + 41.7600210 94.9754170 + 41.7620830 94.9733540 + 41.7620830 94.9691460 + 41.7641460 94.9670830 + 41.7662500 94.9650210 + 41.7683130 94.9629170 + 41.7704170 94.9608540 + 41.7724790 94.9587500 + 41.7745830 94.9566880 + 41.7745830 94.9483130 + 41.7766460 94.9462500 + 41.7787500 94.9441880 + 41.7808130 94.9420830 + 41.7829170 94.9441460 + 41.7849790 94.9462500 + 41.7891880 94.9462500 + 41.7912500 94.9441880 + 41.7912500 94.9316460 + 41.7933130 94.9295830 + 41.7954170 94.9275210 + 41.8058130 94.9170830 + 41.8100210 94.9170830 + 41.8120830 94.9191460 + 41.8141460 94.9212500 + 41.8266880 94.9212500 + 41.8287500 94.9233130 + 41.8287500 94.9275210 + 41.8350210 94.9295830 + 41.8370830 94.9316460 + 41.8391460 94.9337500 + 41.8433540 94.9337500 + 41.8454170 94.9358130 + 41.8454170 94.9400210 + 41.8474790 94.9420830 + 41.8495830 94.9441460 + 41.8495830 94.9525210 + 41.8558540 94.9545830 + 41.8579170 94.9566460 + 41.8599790 94.9587500 + 41.8620830 94.9608130 + 41.8641460 94.9629170 + 41.8662500 94.9649790 + 41.8683130 94.9670830 + 41.8704170 94.9691460 + 41.8724790 94.9712500 + 41.8745830 94.9733130 + 41.8766460 94.9795830 + 41.8891880 94.9795830 + 41.8912500 94.9816460 + 41.8933130 94.9837500 + 41.8975210 94.9837500 + 41.8995830 94.9858130 + 41.9016460 94.9920830 + 41.9100210 94.9920830 + 41.9120830 94.9900210 + 41.9141460 94.9879170 + 41.9162500 94.9858540 + 41.9162500 94.9774790 + 41.9141880 94.9754170 + 41.9120830 94.9733540 + 41.9204170 94.9650210 + 41.9204170 94.9608130 + 41.9245830 94.9587500 + 41.9245830 94.9566460 + 41.9225210 94.9545830 + 41.9204170 94.9525210 + 41.9204170 94.9274790 + 41.9141460 94.9170830 + 41.9162500 94.9150210 + 41.9162500 94.9066460 + 41.9016460 94.8962500 + 41.8995830 94.8941880 + 41.8995830 94.8858130 + 41.8975210 94.8837500 + 41.8954170 94.8816880 + 41.8954170 94.8733130 + 41.8912500 94.8649790 + 41.8850210 94.8587500 + 41.8808130 94.8587500 + 41.8745830 94.8525210 + 41.8745830 94.8483130 + 41.8725210 94.8462500 + 41.8704170 94.8441880 + 41.8704170 94.8399790 + 41.8683540 94.8379170 + 41.8662500 94.8358540 + 41.8641880 94.8337500 + 41.8558130 94.8337500 + 41.8537500 94.8358130 + 41.8516880 94.8379170 + 41.8474790 94.8379170 + 41.8454170 94.8358540 + 41.8433540 94.8337500 + 41.8412500 94.8316880 + 41.8391880 94.8295830 + 41.8370830 94.8275210 + 41.8350210 94.8254170 + 41.8287500 94.8233540 + 41.8266880 94.8170830 + 41.8204170 94.8150210 + 41.8183540 94.8004170 + 41.8058130 94.8004170 + 41.8037500 94.7983540 + 41.8016880 94.7962500 + 41.7995830 94.7941880 + 41.7995830 94.7899790 + 41.7975210 94.7879170 + 41.7933130 94.7879170 + 41.7912500 94.7858540 + 41.7891880 94.7837500 + 41.7870830 94.7816880 + 41.7850210 94.7795830 + 41.7829170 94.7775210 + 41.7808540 94.7754170 + 41.7599790 94.7754170 + 41.7579170 94.7691460 + 41.7558540 94.7670830 + 41.7537500 94.7650210 + 41.7516880 94.7629170 + 41.7495830 94.7608540 + 41.7495830 94.7566460 + 41.7516460 94.7545830 + 41.7683540 94.7545830 + 41.7704170 94.7525210 + 41.7704170 94.7399790 + 41.7683540 94.7379170 + 41.7662500 94.7358540 + 41.7641880 94.7337500 + 41.7516460 94.7337500 + 41.7495830 94.7358130 + 41.7475210 94.7379170 + 41.7454170 94.7399790 + 41.7433540 94.7420830 + 41.7412500 94.7400210 + 41.7391880 94.7379170 + 41.7308130 94.7379170 + 41.7287500 94.7358540 + 41.7266880 94.7337500 + 41.7245830 94.7316880 + 41.7225210 94.7295830 + 41.7204170 94.7275210 + 41.7183540 94.7254170 + 41.7141460 94.7254170 + 41.7120830 94.7233540 + 41.7100210 94.7212500 + 41.7058130 94.7212500 + 41.7016880 94.7170830 + 41.6933130 94.7170830 + 41.6912500 94.7150210 + 41.6891880 94.7129170 + 41.6870830 94.7108540 + 41.6850210 94.7087500 + 41.6829170 94.7066880 + 41.6829170 94.6983130 + 41.6808540 94.6962500 + 41.6745830 94.6941880 + 41.6725210 94.6920830 + 41.6704170 94.6900210 + 41.6683540 94.6879170 + 41.6662500 94.6858540 + 41.6641880 94.6837500 + 41.6599790 94.6837500 + 41.6579170 94.6858130 + 41.6579170 94.6900210 + 41.6558540 94.6920830 + 41.6516460 94.6920830 + 41.6495830 94.6941460 + 41.6475210 94.6962500 + 41.6454170 94.6983130 + 41.6454170 94.7025210 + 41.6433540 94.7045830 + 41.6412500 94.7025210 + 41.6391880 94.7004170 + 41.6370830 94.6983540 + 41.6350210 94.6962500 + 41.6308130 94.6962500 + 41.6287500 94.6941880 + 41.6266880 94.6920830 + 41.6099790 94.6920830 + 41.6079170 94.6941460 + 41.6058540 94.6962500 + 41.6037500 94.6983130 + 41.6016880 94.7004170 + 41.5995830 94.7024790 + 41.5975210 94.7045830 + 41.5954170 94.7025210 + 41.5933540 94.7004170 + 41.5912500 94.6983540 + 41.5849790 94.6962500 + 41.5829170 94.6941880 + 41.5808540 94.6920830 + 41.5787500 94.6900210 + 41.5724790 94.6879170 + 41.5704170 94.6858540 + 41.5704170 94.6774790 + 41.5683540 94.6754170 + 41.5662500 94.6733540 + 41.5662500 94.6691460 + 41.5641880 94.6670830 + 41.5516460 94.6670830 + 41.5495830 94.6650210 + 41.5475210 94.6629170 + 41.5454170 94.6608540 + 41.5433540 94.6587500 + 41.5391460 94.6587500 + 41.5370830 94.6566880 + 41.5350210 94.6545830 + 41.5329170 94.6566460 + 41.5308540 94.6587500 + 41.5266460 94.6587500 + 41.5245830 94.6566880 + 41.5225210 94.6545830 + 41.5183130 94.6545830 + 41.5100210 94.6462500 + 41.4974790 94.6462500 + 41.4954170 94.6441880 + 41.4954170 94.6399790 + 41.4849790 94.6379170 + 41.4829170 94.6379170 + 41.4745830 94.6566460 + 41.4745830 94.6650210 + 41.4724790 94.6670830 + 41.4704170 94.6691880 + 41.4683130 94.6712500 + 41.4662500 94.6733540 + 41.4641460 94.6754170 + 41.4620830 94.6774790 + 41.4620830 94.6816880 + 41.4599790 94.6837500 + 41.4579170 94.6858540 + 41.4558130 94.6879170 + 41.4537500 94.6899790 + 41.4537500 94.6983540 + 41.4516460 94.7004170 + 41.4495830 94.7024790 + 41.4495830 94.7108540 + 41.4474790 94.7129170 + 41.4454170 94.7150210 + 41.4433130 94.7170830 + 41.4412500 94.7191460 + 41.4412500 94.7275210 + 41.4391880 94.7295830 + 41.4349790 94.7295830 + 41.4329170 94.7316460 + 41.4329170 94.7358540 + 41.4308540 94.7379170 + 41.4266460 94.7379170 + 41.4245830 94.7400210 + 41.4225210 94.7420830 + 41.4183130 94.7420830 + 41.4162500 94.7441880 + 41.4120830 94.7483130 + 41.4120830 94.7525210 + 41.4100210 94.7545830 + 41.4037500 94.7566460 + 41.4037500 94.7816880 + 41.4016880 94.7837500 + 41.3974790 94.7837500 + 41.3954170 94.7858540 + 41.3933130 94.7879170 + 41.3912500 94.7900210 + 41.3891880 94.7920830 + 41.3849790 94.7920830 + 41.3829170 94.7899790 + 41.3704170 94.7983130 + 41.3704170 94.8025210 + 41.3683130 94.8045830 + 41.3662500 94.8066460 + 41.3662500 94.8108540 + 41.3641880 94.8129170 + 41.3370830 94.8233540 + 41.3391880 94.8254170 + 41.3412500 94.8274790 + 41.3412500 94.8400210 + 41.3391460 94.8420830 + 41.3370830 94.8441460 + 41.3370830 94.8483540 + 41.3349790 94.8504170 + 41.3329170 94.8525210 + 41.3308540 94.8545830 + 41.3204170 94.8608130 + 41.3204170 94.8775210 + 41.3183540 94.8795830 + 41.3141460 94.8795830 + 41.3120830 94.8816880 + 41.3099790 94.8837500 + 41.3079170 94.8858130 + 41.3079170 94.9025210 + 41.3058540 94.9045830 + 41.3016460 94.9045830 + 41.2995830 94.9066880 + 41.2974790 94.9087500 + 41.2954170 94.9108130 + 41.2954170 94.9233540 + 41.2974790 94.9254170 + 41.3058540 94.9254170 + 41.3079170 94.9274790 + 41.3079170 94.9441880 + 41.3058130 94.9462500 + 41.3037500 94.9483130 + 41.3037500 95.0025210 + 41.3016880 95.0045830 + 41.2974790 95.0045830 + 41.2954170 95.0066460 + 41.2954170 95.0441880 + 41.2933540 95.0462500 + 41.2849790 95.0462500 + 41.2829170 95.0483540 + 41.2808540 95.0504170 + 41.2683130 95.0504170 + 41.2662500 95.0525210 + 41.2641880 95.0545830 + 41.2599790 95.0545830 + 41.2579170 95.0566880 + 41.2558540 95.0587500 + 41.2474790 95.0587500 + 41.2454170 95.0608540 + 41.2433540 95.0629170 + 41.2099790 95.0629170 + 41.2079170 95.0608130 + 41.2058540 95.0587500 + 41.2016460 95.0587500 + 41.1995830 95.0608540 + 41.1974790 95.0629170 + 41.1954170 95.0629170 + 41.1912500 95.0816460 + 41.1912500 95.0858540 + 41.1891460 95.0879170 + 41.1870830 95.0900210 + 41.1850210 95.0920830 + 41.1558130 95.0920830 + 41.1516880 95.0962500 + 41.1433540 95.1004170 + 41.1308130 95.1004170 + 41.1287500 95.1025210 + 41.1266880 95.1045830 + 41.1224790 95.1045830 + 41.1204170 95.1066880 + 41.1183130 95.1087500 + 41.1162500 95.1108130 + 41.1162500 95.1191880 + 41.1141460 95.1212500 + 41.1120830 95.1233540 + 41.1100210 95.1254170 + 41.1058130 95.1254170 + 41.1037500 95.1275210 + 41.1016460 95.1295830 + 41.0995830 95.1316460 + 41.0995830 95.1358540 + 41.0974790 95.1379170 + 41.0954170 95.1358130 + 41.0933540 95.1337500 + 41.0891460 95.1337500 + 41.0870830 95.1316460 + 41.0849790 95.1295830 + 41.0829170 95.1316880 + 41.0808540 95.1337500 + 41.0641460 95.1337500 + 41.0620830 95.1358540 + 41.0600210 95.1379170 + 41.0474790 95.1379170 + 41.0454170 95.1400210 + 41.0433130 95.1420830 + 41.0412500 95.1441460 + 41.0412500 95.1525210 + 41.0391460 95.1545830 + 41.0370830 95.1566460 + 41.0370830 95.1608540 + 41.0349790 95.1629170 + 41.0329170 95.1650210 + 41.0329170 95.1670830 + 41.0412500 95.1691460 + 41.0412500 95.1733540 + 41.0454170 95.1774790 + 41.0412500 95.1858130 + 41.0412500 95.1941880 + 41.0370830 95.1983540 + 41.0349790 95.2004170 + 41.0120830 95.2233130 + 41.0120830 95.2358540 + 41.0099790 95.2379170 + 41.0079170 95.2400210 + 41.0099790 95.2420830 +REDI4 REDI4 -1 58 41.81000 94.71381 + 42.1200000 95.0200000 + 42.0500000 94.9500000 + 41.9300000 94.8200000 + 41.9000000 94.7500000 + 41.8300000 94.6700000 + 41.7700000 94.5300000 + 41.7300000 94.4400000 + 41.7000000 94.4400000 + 41.6500000 94.4300000 + 41.6000000 94.4000000 + 41.5900000 94.3200000 + 41.6000000 94.2500000 + 41.7200000 94.3000000 + 41.7000000 94.3500000 + 41.7500000 94.3700000 + 41.8200000 94.4100000 + 41.8400000 94.4900000 + 41.8600000 94.5100000 + 41.9700000 94.5100000 + 41.9200000 94.4600000 + 41.8400000 94.3400000 + 41.8100000 94.2900000 + 41.7800000 94.2400000 + 41.7500000 94.2200000 + 41.7300000 94.2100000 + 41.6600000 94.1800000 + 41.6300000 94.1500000 + 41.6100000 94.1400000 + 41.5800000 94.1800000 + 41.5400000 94.1900000 + 41.5300000 94.2200000 + 41.5100000 94.2300000 + 41.5000000 94.2600000 + 41.5200000 94.3800000 + 41.5300000 94.4700000 + 41.5300000 94.5100000 + 41.5700000 94.5500000 + 41.6200000 94.6500000 + 41.6300000 94.6700000 + 41.6500000 94.6700000 + 41.7000000 94.7200000 + 41.7700000 94.7500000 + 41.8000000 94.8000000 + 41.8700000 94.8300000 + 41.8800000 94.8700000 + 41.9200000 94.9000000 + 41.9200000 94.9500000 + 41.9200000 94.9800000 + 41.9500000 94.9800000 + 41.9500000 94.9700000 + 42.0000000 94.9800000 + 42.0000000 95.0000000 + 42.0300000 95.0200000 + 42.0300000 95.0300000 + 42.0500000 95.0300000 + 42.0700000 95.0200000 + 42.0800000 95.0200000 + 42.1200000 95.0200000 +SCRI4 SCRI4 -1 35 42.61500 95.01500 + 42.7700000 94.7600000 + 42.6900000 94.7700000 + 42.6500000 94.7600000 + 42.6200000 94.7300000 + 42.5300000 94.8000000 + 42.4300000 94.8500000 + 42.3800000 94.8900000 + 42.3700000 94.9400000 + 42.3000000 94.9800000 + 42.3800000 95.0300000 + 42.4500000 95.0500000 + 42.5000000 95.0800000 + 42.5200000 95.1000000 + 42.5800000 95.1300000 + 42.6000000 95.2000000 + 42.6300000 95.2800000 + 42.6500000 95.2800000 + 42.6800000 95.3000000 + 42.7200000 95.3000000 + 42.7200000 95.2800000 + 42.6800000 95.2700000 + 42.6800000 95.2200000 + 42.6500000 95.1500000 + 42.6000000 95.0800000 + 42.6200000 95.0200000 + 42.6300000 95.0200000 + 42.6800000 94.9700000 + 42.7700000 94.9200000 + 42.8000000 94.9100000 + 42.8700000 94.9200000 + 42.9300000 94.9500000 + 42.9200000 94.8800000 + 42.9000000 94.8500000 + 42.8700000 94.8000000 + 42.7700000 94.7600000 +SRBN1HW Pebble Creek near Scribner, NE -1 220 41.73917 96.86500 + 41.6537500 96.6795830 + 41.6266460 96.6837500 + 41.6183540 96.6754170 + 41.6099790 96.6754170 + 41.6079170 96.6775210 + 41.6058130 96.6795830 + 41.6037500 96.6816460 + 41.6037500 96.6858540 + 41.6016460 96.6879170 + 41.5995830 96.6900210 + 41.5870830 96.7024790 + 41.5870830 96.7191880 + 41.5891880 96.7212500 + 41.5912500 96.7233130 + 41.5912500 96.7358540 + 41.5891460 96.7379170 + 41.5870830 96.7399790 + 41.5870830 96.8025210 + 41.5891880 96.8045830 + 41.5912500 96.8066460 + 41.5912500 96.8150210 + 41.5933540 96.8170830 + 41.5954170 96.8191460 + 41.5954170 96.8316880 + 41.5975210 96.8337500 + 41.5995830 96.8358540 + 41.6016880 96.8379170 + 41.6037500 96.8399790 + 41.6037500 96.8525210 + 41.6058540 96.8545830 + 41.6079170 96.8566460 + 41.6079170 96.8608540 + 41.6100210 96.8629170 + 41.6120830 96.8649790 + 41.6120830 96.8775210 + 41.6141880 96.8795830 + 41.6162500 96.8816460 + 41.6162500 96.8858540 + 41.6183540 96.8879170 + 41.6204170 96.8899790 + 41.6204170 96.9025210 + 41.6225210 96.9045830 + 41.6245830 96.9066880 + 41.6266880 96.9087500 + 41.6287500 96.9108130 + 41.6287500 96.9150210 + 41.6308540 96.9170830 + 41.6329170 96.9191880 + 41.6349790 96.9212500 + 41.6433540 96.9212500 + 41.6454170 96.9191460 + 41.6474790 96.9170830 + 41.6516880 96.9170830 + 41.6537500 96.9191460 + 41.6537500 96.9275210 + 41.6558130 96.9295830 + 41.6766460 96.9337500 + 41.6891880 96.9337500 + 41.6912500 96.9358130 + 41.6912500 96.9400210 + 41.6933540 96.9420830 + 41.6954170 96.9441880 + 41.6974790 96.9462500 + 41.7058540 96.9462500 + 41.7079170 96.9483540 + 41.7099790 96.9504170 + 41.7183540 96.9504170 + 41.7204170 96.9524790 + 41.7204170 96.9566880 + 41.7225210 96.9587500 + 41.7245830 96.9608540 + 41.7266880 96.9629170 + 41.7287500 96.9650210 + 41.7308130 96.9670830 + 41.7391880 96.9670830 + 41.7412500 96.9691880 + 41.7433130 96.9712500 + 41.7516880 96.9712500 + 41.7537500 96.9733130 + 41.7537500 96.9775210 + 41.7558130 96.9795830 + 41.7683540 96.9795830 + 41.7704170 96.9816460 + 41.7704170 96.9858540 + 41.7724790 96.9879170 + 41.7766880 96.9879170 + 41.7787500 96.9900210 + 41.7808130 96.9920830 + 41.7933540 96.9920830 + 41.7954170 96.9941880 + 41.7975210 96.9962500 + 41.7995830 96.9983540 + 41.8016460 97.0004170 + 41.8058540 97.0004170 + 41.8079170 97.0025210 + 41.8099790 97.0045830 + 41.8183540 97.0045830 + 41.8204170 97.0066460 + 41.8204170 97.0108540 + 41.8225210 97.0129170 + 41.8245830 97.0150210 + 41.8266880 97.0170830 + 41.8287500 97.0191460 + 41.8349790 97.0295830 + 41.8391880 97.0295830 + 41.8412500 97.0316880 + 41.8433130 97.0337500 + 41.8516880 97.0337500 + 41.8537500 97.0337500 + 41.8537500 97.0233130 + 41.8558130 97.0212500 + 41.8579170 97.0191880 + 41.8579170 97.0149790 + 41.8599790 97.0129170 + 41.8620830 97.0149790 + 41.8641460 97.0170830 + 41.8725210 97.0170830 + 41.8745830 97.0150210 + 41.8745830 96.9858130 + 41.8766460 96.9837500 + 41.8808540 96.9837500 + 41.8829170 96.9816880 + 41.8849790 96.9795830 + 41.8870830 96.9775210 + 41.8850210 96.9754170 + 41.8829170 96.9733540 + 41.8829170 96.9566460 + 41.8808540 96.9545830 + 41.8787500 96.9525210 + 41.8808130 96.9504170 + 41.8829170 96.9483540 + 41.8829170 96.9399790 + 41.8849790 96.9379170 + 41.8870830 96.9358540 + 41.8891460 96.9337500 + 41.8912500 96.9316880 + 41.8912500 96.9274790 + 41.8891880 96.9254170 + 41.8870830 96.9233540 + 41.8870830 96.8983130 + 41.8850210 96.8962500 + 41.8829170 96.8858130 + 41.8808540 96.8837500 + 41.8787500 96.8816880 + 41.8787500 96.8774790 + 41.8829170 96.8649790 + 41.8829170 96.8629170 + 41.8808130 96.8629170 + 41.8787500 96.8608540 + 41.8766880 96.8587500 + 41.8724790 96.8587500 + 41.8704170 96.8566880 + 41.8683540 96.8545830 + 41.8662500 96.8525210 + 41.8641880 96.8504170 + 41.8620830 96.8483540 + 41.8600210 96.8462500 + 41.8579170 96.8441880 + 41.8558540 96.8420830 + 41.8537500 96.8400210 + 41.8516880 96.8379170 + 41.8433130 96.8379170 + 41.8412500 96.8358540 + 41.8391880 96.8337500 + 41.8349790 96.8337500 + 41.8329170 96.8316880 + 41.8308540 96.8295830 + 41.8287500 96.8275210 + 41.8266880 96.8254170 + 41.8245830 96.8233540 + 41.8225210 96.8212500 + 41.8204170 96.8191880 + 41.8183540 96.8170830 + 41.8162500 96.8191460 + 41.8141880 96.8212500 + 41.8099790 96.8212500 + 41.8079170 96.8191880 + 41.8058540 96.8170830 + 41.8037500 96.8150210 + 41.8037500 96.8108130 + 41.8016880 96.8087500 + 41.7995830 96.8066880 + 41.7975210 96.8045830 + 41.7933130 96.8045830 + 41.7912500 96.8025210 + 41.7912500 96.7983130 + 41.7891880 96.7962500 + 41.7766880 96.7879170 + 41.7641460 96.7879170 + 41.7620830 96.7858540 + 41.7620830 96.7816460 + 41.7600210 96.7795830 + 41.7516460 96.7795830 + 41.7495830 96.7775210 + 41.7475210 96.7754170 + 41.7454170 96.7733540 + 41.7454170 96.7649790 + 41.7433540 96.7629170 + 41.7412500 96.7608540 + 41.7391880 96.7587500 + 41.7308130 96.7587500 + 41.7287500 96.7566880 + 41.7266880 96.7545830 + 41.7245830 96.7525210 + 41.7225210 96.7504170 + 41.7183130 96.7504170 + 41.7162500 96.7483540 + 41.7141880 96.7462500 + 41.7099790 96.7462500 + 41.6995830 96.7316460 + 41.6954170 96.7275210 + 41.6933540 96.7254170 + 41.6891460 96.7254170 + 41.6870830 96.7233540 + 41.6850210 96.7212500 + 41.6829170 96.7191880 + 41.6808540 96.7170830 + 41.6787500 96.7150210 + 41.6787500 96.6899790 + 41.6537500 96.6795830 +WLBN1HW TURKEY CR. NR WILBUR NE -1 464 40.54333 97.24000 + 40.4787500 97.0170830 + 40.4704170 97.0316880 + 40.4662500 97.0358130 + 40.4662500 97.0400210 + 40.4683540 97.0420830 + 40.4745830 97.0483130 + 40.4745830 97.0566880 + 40.4766880 97.0587500 + 40.4787500 97.0608130 + 40.4787500 97.0816880 + 40.4766460 97.0837500 + 40.4745830 97.0858130 + 40.4745830 97.0900210 + 40.4766880 97.0920830 + 40.4787500 97.0941460 + 40.4787500 97.1025210 + 40.4808130 97.1045830 + 40.4850210 97.1045830 + 40.4870830 97.1066460 + 40.4870830 97.1150210 + 40.4891880 97.1170830 + 40.4912500 97.1191460 + 40.4912500 97.1316880 + 40.4933130 97.1337500 + 40.5016880 97.1337500 + 40.5037500 97.1358540 + 40.5058540 97.1379170 + 40.5079170 97.1400210 + 40.5141460 97.1462500 + 40.5183540 97.1462500 + 40.5204170 97.1483130 + 40.5204170 97.1650210 + 40.5183130 97.1670830 + 40.5162500 97.1691460 + 40.5162500 97.1858540 + 40.5141460 97.1879170 + 40.5120830 97.1900210 + 40.5141880 97.1920830 + 40.5162500 97.1941880 + 40.5183540 97.1962500 + 40.5204170 97.1983130 + 40.5204170 97.2025210 + 40.5225210 97.2045830 + 40.5245830 97.2066880 + 40.5266880 97.2087500 + 40.5287500 97.2108540 + 40.5308130 97.2129170 + 40.5391880 97.2129170 + 40.5412500 97.2149790 + 40.5412500 97.2275210 + 40.5433540 97.2295830 + 40.5454170 97.2316880 + 40.5433130 97.2337500 + 40.5412500 97.2358130 + 40.5412500 97.2441880 + 40.5433540 97.2462500 + 40.5454170 97.2483540 + 40.5475210 97.2504170 + 40.5495830 97.2524790 + 40.5495830 97.2691880 + 40.5474790 97.2712500 + 40.5454170 97.2733130 + 40.5454170 97.2983540 + 40.5433130 97.3004170 + 40.5412500 97.3025210 + 40.5391460 97.3045830 + 40.5370830 97.3066460 + 40.5370830 97.3108540 + 40.5349790 97.3129170 + 40.5329170 97.3149790 + 40.5329170 97.3233540 + 40.5308130 97.3254170 + 40.5287500 97.3275210 + 40.5266880 97.3295830 + 40.5224790 97.3295830 + 40.5204170 97.3316880 + 40.5183540 97.3337500 + 40.5141460 97.3337500 + 40.5120830 97.3358540 + 40.5100210 97.3379170 + 40.5058130 97.3379170 + 40.5037500 97.3400210 + 40.5016460 97.3420830 + 40.4995830 97.3441880 + 40.4975210 97.3462500 + 40.4933130 97.3462500 + 40.4912500 97.3483540 + 40.4891880 97.3504170 + 40.4849790 97.3504170 + 40.4829170 97.3525210 + 40.4808130 97.3545830 + 40.4787500 97.3545830 + 40.4745830 97.3608130 + 40.4745830 97.3858540 + 40.4724790 97.3879170 + 40.4704170 97.3900210 + 40.4683540 97.3920830 + 40.4641460 97.3920830 + 40.4620830 97.3941880 + 40.4599790 97.3962500 + 40.4579170 97.3983540 + 40.4558130 97.4004170 + 40.4495830 97.4066460 + 40.4495830 97.4275210 + 40.4474790 97.4295830 + 40.4454170 97.4316460 + 40.4454170 97.4400210 + 40.4433130 97.4420830 + 40.4412500 97.4441880 + 40.4391460 97.4462500 + 40.4370830 97.4483130 + 40.4370830 97.4525210 + 40.4349790 97.4545830 + 40.4329170 97.4566460 + 40.4329170 97.4608540 + 40.4308540 97.4629170 + 40.4266460 97.4629170 + 40.4224790 97.4670830 + 40.4204170 97.4670830 + 40.4245830 97.5024790 + 40.4245830 97.5233540 + 40.4266880 97.5254170 + 40.4287500 97.5274790 + 40.4287500 97.5608540 + 40.4266460 97.5629170 + 40.4245830 97.5649790 + 40.4245830 97.5691880 + 40.4266880 97.5712500 + 40.4287500 97.5733130 + 40.4287500 97.5858540 + 40.4308540 97.5879170 + 40.4329170 97.5899790 + 40.4329170 97.6025210 + 40.4349790 97.6045830 + 40.4391880 97.6045830 + 40.4412500 97.6066880 + 40.4433540 97.6087500 + 40.4454170 97.6108130 + 40.4454170 97.6150210 + 40.4495830 97.6191460 + 40.4495830 97.6233540 + 40.4516460 97.6254170 + 40.4620830 97.6275210 + 40.4599790 97.6295830 + 40.4579170 97.6316460 + 40.4579170 97.6441880 + 40.4558130 97.6462500 + 40.4537500 97.6483130 + 40.4537500 97.6566880 + 40.4495830 97.6650210 + 40.4474790 97.6670830 + 40.4454170 97.6691460 + 40.4454170 97.6858540 + 40.4475210 97.6879170 + 40.4495830 97.6899790 + 40.4495830 97.6941880 + 40.4516460 97.6962500 + 40.4600210 97.6962500 + 40.4620830 97.6983130 + 40.4620830 97.7108540 + 40.4641880 97.7129170 + 40.4662500 97.7149790 + 40.4662500 97.7233540 + 40.4641460 97.7254170 + 40.4620830 97.7274790 + 40.4620830 97.7358540 + 40.4641880 97.7379170 + 40.4662500 97.7399790 + 40.4662500 97.7733540 + 40.4641460 97.7754170 + 40.4620830 97.7774790 + 40.4620830 97.7858540 + 40.4599790 97.7879170 + 40.4579170 97.7899790 + 40.4579170 97.7983540 + 40.4558130 97.8004170 + 40.4537500 97.8004170 + 40.4537500 97.8066880 + 40.4558130 97.8087500 + 40.4579170 97.8108130 + 40.4599790 97.8129170 + 40.4620830 97.8149790 + 40.4641460 97.8170830 + 40.4683540 97.8170830 + 40.4704170 97.8191460 + 40.4704170 97.8525210 + 40.4683540 97.8545830 + 40.4662500 97.8566460 + 40.4662500 97.8650210 + 40.4683130 97.8670830 + 40.4704170 97.8691460 + 40.4724790 97.8712500 + 40.4745830 97.8733130 + 40.4766460 97.8754170 + 40.4787500 97.8774790 + 40.4808130 97.8795830 + 40.5058540 97.8795830 + 40.5079170 97.8816460 + 40.5079170 97.8941880 + 40.5099790 97.8962500 + 40.5120830 97.8983130 + 40.5120830 97.9025210 + 40.5141460 97.9045830 + 40.5162500 97.9066460 + 40.5183130 97.9087500 + 40.5204170 97.9108130 + 40.5224790 97.9129170 + 40.5308540 97.9129170 + 40.5329170 97.9149790 + 40.5349790 97.9170830 + 40.5370830 97.9191460 + 40.5391460 97.9212500 + 40.5412500 97.9191880 + 40.5433130 97.9170830 + 40.5475210 97.9170830 + 40.5495830 97.9150210 + 40.5495830 97.8941460 + 40.5516460 97.8920830 + 40.5537500 97.8900210 + 40.5537500 97.8858130 + 40.5558130 97.8837500 + 40.5579170 97.8816880 + 40.5599790 97.8795830 + 40.5620830 97.8775210 + 40.5620830 97.8649790 + 40.5641460 97.8629170 + 40.5662500 97.8608540 + 40.5662500 97.8483130 + 40.5683130 97.8462500 + 40.5704170 97.8441880 + 40.5724790 97.8420830 + 40.5745830 97.8400210 + 40.5745830 97.8358130 + 40.5766460 97.8337500 + 40.5787500 97.8316880 + 40.5787500 97.8108130 + 40.5808130 97.8087500 + 40.5829170 97.8066880 + 40.5849790 97.8045830 + 40.5870830 97.8025210 + 40.5870830 97.7983130 + 40.5891460 97.7962500 + 40.5912500 97.7941880 + 40.5933130 97.7920830 + 40.5954170 97.7900210 + 40.5974790 97.7879170 + 40.5995830 97.7858540 + 40.6016460 97.7837500 + 40.6079170 97.7775210 + 40.6079170 97.7733130 + 40.6058540 97.7712500 + 40.6016460 97.7712500 + 40.5995830 97.7691880 + 40.5995830 97.7524790 + 40.6100210 97.7462500 + 40.6120830 97.7441880 + 40.6120830 97.7399790 + 40.6141460 97.7379170 + 40.6162500 97.7358540 + 40.6183130 97.7337500 + 40.6204170 97.7316880 + 40.6204170 97.7149790 + 40.6224790 97.7129170 + 40.6245830 97.7108540 + 40.6245830 97.7066460 + 40.6287500 97.6691460 + 40.6287500 97.6670830 + 40.6141460 97.6670830 + 40.6120830 97.6650210 + 40.6100210 97.6629170 + 40.6079170 97.6608540 + 40.6058540 97.6587500 + 40.6037500 97.6566880 + 40.6016880 97.6545830 + 40.5995830 97.6525210 + 40.5995830 97.6483130 + 40.5975210 97.6462500 + 40.5954170 97.6441880 + 40.5954170 97.6399790 + 40.5933540 97.6379170 + 40.5912500 97.6358540 + 40.5891880 97.6337500 + 40.5870830 97.6316880 + 40.5870830 97.6191460 + 40.5891460 97.6170830 + 40.5912500 97.6150210 + 40.5933130 97.6129170 + 40.5954170 97.6066460 + 40.5974790 97.6045830 + 40.5995830 97.6025210 + 40.5975210 97.6004170 + 40.5954170 97.5983540 + 40.5954170 97.5816460 + 40.5974790 97.5795830 + 40.5995830 97.5775210 + 40.5995830 97.5608130 + 40.6016460 97.5587500 + 40.6037500 97.5566880 + 40.6037500 97.5524790 + 40.6058130 97.5504170 + 40.6100210 97.5504170 + 40.6120830 97.5483540 + 40.6141460 97.5462500 + 40.6162500 97.5441880 + 40.6162500 97.5399790 + 40.6183130 97.5379170 + 40.6204170 97.5358540 + 40.6204170 97.5274790 + 40.6183540 97.5254170 + 40.6162500 97.5233540 + 40.6162500 97.5149790 + 40.6183130 97.5129170 + 40.6204170 97.5108540 + 40.6224790 97.5087500 + 40.6245830 97.5066880 + 40.6266460 97.5045830 + 40.6287500 97.5025210 + 40.6287500 97.4858130 + 40.6308130 97.4837500 + 40.6329170 97.4816880 + 40.6308540 97.4795830 + 40.6287500 97.4775210 + 40.6287500 97.4691460 + 40.6266880 97.4670830 + 40.6245830 97.4650210 + 40.6245830 97.4608130 + 40.6225210 97.4587500 + 40.6204170 97.4566880 + 40.6183540 97.4545830 + 40.6162500 97.4525210 + 40.6141880 97.4504170 + 40.6120830 97.4483540 + 40.6120830 97.4358130 + 40.6100210 97.4337500 + 40.6079170 97.4316880 + 40.6099790 97.4295830 + 40.6120830 97.4275210 + 40.6120830 97.4191460 + 40.6100210 97.4170830 + 40.6079170 97.4150210 + 40.6079170 97.4108130 + 40.6099790 97.4087500 + 40.6120830 97.4024790 + 40.6141460 97.4004170 + 40.6162500 97.3983540 + 40.6141880 97.3962500 + 40.6120830 97.3941880 + 40.6120830 97.3774790 + 40.6141460 97.3754170 + 40.6183540 97.3754170 + 40.6204170 97.3733540 + 40.6224790 97.3712500 + 40.6245830 97.3691880 + 40.6266460 97.3670830 + 40.6287500 97.3650210 + 40.6287500 97.3608130 + 40.6308130 97.3587500 + 40.6329170 97.3566880 + 40.6329170 97.3483130 + 40.6349790 97.3462500 + 40.6370830 97.3441880 + 40.6391460 97.3420830 + 40.6412500 97.3400210 + 40.6412500 97.3358130 + 40.6433130 97.3337500 + 40.6454170 97.3316880 + 40.6454170 97.3149790 + 40.6433540 97.3129170 + 40.6412500 97.3108540 + 40.6433130 97.3087500 + 40.6454170 97.3066880 + 40.6454170 97.3024790 + 40.6474790 97.3004170 + 40.6495830 97.2983540 + 40.6516460 97.2962500 + 40.6558540 97.2962500 + 40.6579170 97.2941880 + 40.6599790 97.2920830 + 40.6641880 97.2920830 + 40.6662500 97.2900210 + 40.6662500 97.2691460 + 40.6641880 97.2670830 + 40.6599790 97.2670830 + 40.6579170 97.2650210 + 40.6579170 97.2608130 + 40.6558540 97.2587500 + 40.6537500 97.2566880 + 40.6537500 97.2441460 + 40.6558130 97.2420830 + 40.6579170 97.2400210 + 40.6579170 97.2274790 + 40.6599790 97.2254170 + 40.6620830 97.2233540 + 40.6600210 97.2212500 + 40.6579170 97.2191880 + 40.6579170 97.2024790 + 40.6558540 97.2004170 + 40.6537500 97.1983540 + 40.6558130 97.1962500 + 40.6579170 97.1941880 + 40.6579170 97.1858130 + 40.6620830 97.1774790 + 40.6620830 97.1754170 + 40.6599790 97.1754170 + 40.6579170 97.1733540 + 40.6558540 97.1712500 + 40.6537500 97.1691880 + 40.6516880 97.1670830 + 40.6495830 97.1650210 + 40.6495830 97.1608130 + 40.6475210 97.1587500 + 40.6454170 97.1566880 + 40.6433540 97.1545830 + 40.6329170 97.1483540 + 40.6329170 97.1274790 + 40.6308540 97.1254170 + 40.6287500 97.1233540 + 40.6287500 97.1024790 + 40.6266880 97.1004170 + 40.6245830 97.0983540 + 40.6245830 97.0816460 + 40.6225210 97.0795830 + 40.6204170 97.0775210 + 40.6204170 97.0733130 + 40.6183540 97.0712500 + 40.6162500 97.0691880 + 40.6141880 97.0670830 + 40.6120830 97.0650210 + 40.6100210 97.0629170 + 40.6079170 97.0608540 + 40.6079170 97.0566460 + 40.6058540 97.0545830 + 40.5933130 97.0545830 + 40.5912500 97.0525210 + 40.5891880 97.0504170 + 40.5870830 97.0483540 + 40.5870830 97.0399790 + 40.5745830 97.0275210 + 40.5745830 97.0233130 + 40.5725210 97.0212500 + 40.5704170 97.0191880 + 40.5704170 97.0066460 + 40.5683540 97.0045830 + 40.5662500 97.0025210 + 40.5641880 97.0004170 + 40.5558130 97.0004170 + 40.5537500 97.0024790 + 40.5516880 97.0045830 + 40.5370830 97.0025210 + 40.5329170 96.9983540 + 40.5308540 96.9962500 + 40.5120830 96.9941880 + 40.5100210 96.9920830 + 40.5079170 96.9941460 + 40.5058540 96.9962500 + 40.4974790 96.9920830 + 40.4954170 96.9920830 + 40.4933540 97.0004170 + 40.4891460 97.0004170 + 40.4829170 97.0066460 + 40.4829170 97.0108540 + 40.4808130 97.0129170 + 40.4787500 97.0149790 + 40.4787500 97.0170830 +WOON1HW WAHOO CREEK AT WAHOO, NE -1 171 41.23083 96.76083 + 41.1975210 96.6212500 + 41.1787500 96.6441880 + 41.1766880 96.6462500 + 41.1641880 96.6504170 + 41.1433130 96.6504170 + 41.1412500 96.6524790 + 41.1412500 96.6566880 + 41.1287500 96.6691460 + 41.1287500 96.6733540 + 41.1266460 96.6754170 + 41.1245830 96.6774790 + 41.1245830 96.6816880 + 41.1224790 96.6837500 + 41.1204170 96.6858540 + 41.1183130 96.6879170 + 41.1162500 96.6899790 + 41.1162500 96.7025210 + 41.1183540 96.7045830 + 41.1204170 96.7066460 + 41.1204170 96.7108540 + 41.1225210 96.7129170 + 41.1245830 96.7150210 + 41.1266460 96.7170830 + 41.1412500 96.7274790 + 41.1412500 96.7400210 + 41.1433540 96.7420830 + 41.1454170 96.7441460 + 41.1454170 96.7566880 + 41.1475210 96.7587500 + 41.1495830 96.7608130 + 41.1495830 96.8066880 + 41.1474790 96.8087500 + 41.1454170 96.8108540 + 41.1433130 96.8129170 + 41.1412500 96.8191880 + 41.1391460 96.8212500 + 41.1370830 96.8233540 + 41.1349790 96.8254170 + 41.1329170 96.8274790 + 41.1329170 96.8316880 + 41.1350210 96.8337500 + 41.1370830 96.8358130 + 41.1370830 96.8400210 + 41.1391460 96.8420830 + 41.1600210 96.8420830 + 41.1620830 96.8441880 + 41.1641880 96.8462500 + 41.1683130 96.8504170 + 41.1725210 96.8504170 + 41.1745830 96.8524790 + 41.1745830 96.8608540 + 41.1766880 96.8629170 + 41.1787500 96.8650210 + 41.1808540 96.8670830 + 41.1829170 96.8691880 + 41.1850210 96.8712500 + 41.1870830 96.8733540 + 41.1891460 96.8754170 + 41.2016460 96.8837500 + 41.2058540 96.8837500 + 41.2079170 96.8858130 + 41.2079170 96.8900210 + 41.2099790 96.8920830 + 41.2308540 96.8920830 + 41.2329170 96.8941880 + 41.2349790 96.8962500 + 41.2891880 96.8962500 + 41.2912500 96.8941460 + 41.2933130 96.8920830 + 41.2975210 96.8920830 + 41.2995830 96.8941880 + 41.3016460 96.8962500 + 41.3141880 96.8962500 + 41.3162500 96.8941460 + 41.3183130 96.8920830 + 41.3225210 96.8920830 + 41.3245830 96.8941880 + 41.3266880 96.8962500 + 41.3287500 96.8941460 + 41.3329170 96.8920830 + 41.3329170 96.8899790 + 41.3349790 96.8879170 + 41.3370830 96.8858540 + 41.3370830 96.8816460 + 41.3391460 96.8795830 + 41.3433540 96.8795830 + 41.3454170 96.8775210 + 41.3474790 96.8754170 + 41.3495830 96.8733540 + 41.3495830 96.8399790 + 41.3475210 96.8379170 + 41.3454170 96.8358540 + 41.3454170 96.8316460 + 41.3433540 96.8295830 + 41.3412500 96.8275210 + 41.3412500 96.8149790 + 41.3391880 96.8129170 + 41.3349790 96.8129170 + 41.3329170 96.8108540 + 41.3308540 96.8087500 + 41.3287500 96.8066880 + 41.3266880 96.8045830 + 41.3245830 96.8025210 + 41.3225210 96.8004170 + 41.3183130 96.8004170 + 41.3162500 96.7983540 + 41.3141880 96.7962500 + 41.3120830 96.7941880 + 41.3100210 96.7920830 + 41.3079170 96.7900210 + 41.3079170 96.7816460 + 41.3058540 96.7795830 + 41.3037500 96.7775210 + 41.3037500 96.7733130 + 41.3016880 96.7712500 + 41.2995830 96.7691880 + 41.2995830 96.7649790 + 41.2975210 96.7629170 + 41.2954170 96.7608540 + 41.2974790 96.7587500 + 41.3016880 96.7587500 + 41.3037500 96.7566880 + 41.3037500 96.7358130 + 41.3016880 96.7337500 + 41.2995830 96.7316880 + 41.2975210 96.7295830 + 41.2954170 96.7275210 + 41.2974790 96.7254170 + 41.2995830 96.7233540 + 41.2995830 96.7024790 + 41.2975210 96.7004170 + 41.2954170 96.6983540 + 41.2954170 96.6858130 + 41.2933540 96.6837500 + 41.2891460 96.6837500 + 41.2870830 96.6816880 + 41.2870830 96.6733130 + 41.2850210 96.6712500 + 41.2829170 96.6691880 + 41.2808540 96.6670830 + 41.2787500 96.6650210 + 41.2787500 96.6566460 + 41.2766880 96.6545830 + 41.2724790 96.6545830 + 41.2704170 96.6525210 + 41.2683540 96.6504170 + 41.2662500 96.6483540 + 41.2641880 96.6462500 + 41.2620830 96.6441880 + 41.2600210 96.6420830 + 41.2579170 96.6400210 + 41.2579170 96.6358130 + 41.2558540 96.6337500 + 41.2537500 96.6316880 + 41.2516880 96.6295830 + 41.2474790 96.6295830 + 41.2454170 96.6275210 + 41.2433540 96.6254170 + 41.2412500 96.6274790 + 41.2391880 96.6295830 + 41.2308130 96.6295830 + 41.2287500 96.6275210 + 41.2266880 96.6254170 + 41.2183130 96.6254170 + 41.2162500 96.6233540 + 41.2141880 96.6212500 + 41.2120830 96.6191880 + 41.2100210 96.6170830 + 41.2079170 96.6150210 + 41.2058540 96.6129170 + 41.1975210 96.6212500 +1850 BIG PAPILLION CREEK AT FORT STREET, NE -1 193 41.44333 96.21917 + 41.3016460 96.1087500 + 41.3037500 96.1316880 + 41.2995830 96.1358130 + 41.2995830 96.1400210 + 41.2954170 96.1441460 + 41.2954170 96.1483540 + 41.2933130 96.1504170 + 41.2912500 96.1524790 + 41.2912500 96.1608540 + 41.2933540 96.1629170 + 41.2974790 96.1670830 + 41.3100210 96.1670830 + 41.3120830 96.1691460 + 41.3120830 96.1733540 + 41.3141460 96.1754170 + 41.3391460 96.1962500 + 41.3475210 96.1962500 + 41.3495830 96.1983540 + 41.3516880 96.2004170 + 41.3537500 96.2024790 + 41.3537500 96.2150210 + 41.3558540 96.2170830 + 41.3579170 96.2191460 + 41.3579170 96.2233540 + 41.3600210 96.2254170 + 41.3620830 96.2274790 + 41.3620830 96.2316880 + 41.3641880 96.2337500 + 41.3662500 96.2358130 + 41.3662500 96.2608540 + 41.3641460 96.2629170 + 41.3620830 96.2670830 + 41.3683540 96.2670830 + 41.3704170 96.2691460 + 41.3724790 96.2712500 + 41.3808540 96.2712500 + 41.3829170 96.2691880 + 41.3849790 96.2670830 + 41.3933540 96.2670830 + 41.3954170 96.2650210 + 41.3974790 96.2629170 + 41.4016880 96.2629170 + 41.4037500 96.2649790 + 41.4058130 96.2670830 + 41.4079170 96.2691460 + 41.4099790 96.2712500 + 41.4120830 96.2691880 + 41.4141460 96.2670830 + 41.4162500 96.2691460 + 41.4183130 96.2712500 + 41.4204170 96.2733130 + 41.4224790 96.2837500 + 41.4308540 96.2837500 + 41.4329170 96.2858130 + 41.4329170 96.2900210 + 41.4349790 96.2920830 + 41.4370830 96.2941460 + 41.4391460 96.2962500 + 41.4412500 96.2983130 + 41.4433130 96.3045830 + 41.4475210 96.3045830 + 41.4495830 96.3066460 + 41.4516460 96.3087500 + 41.4558540 96.3087500 + 41.4579170 96.3108130 + 41.4599790 96.3129170 + 41.4620830 96.3108540 + 41.4641460 96.3087500 + 41.4662500 96.3066880 + 41.4683130 96.3045830 + 41.4704170 96.3025210 + 41.4704170 96.2983130 + 41.4724790 96.2962500 + 41.4745830 96.2983130 + 41.4745830 96.3025210 + 41.4766460 96.3045830 + 41.4808540 96.3045830 + 41.4829170 96.3066460 + 41.4849790 96.3087500 + 41.4933540 96.3087500 + 41.4954170 96.3108130 + 41.4974790 96.3129170 + 41.5058540 96.3129170 + 41.5079170 96.3108540 + 41.5099790 96.3087500 + 41.5141880 96.3087500 + 41.5162500 96.3066880 + 41.5162500 96.3024790 + 41.5183130 96.3004170 + 41.5266880 96.3004170 + 41.5287500 96.2983540 + 41.5308130 96.2962500 + 41.5329170 96.2941880 + 41.5370830 96.2816880 + 41.5370830 96.2774790 + 41.5391460 96.2754170 + 41.5412500 96.2733540 + 41.5433130 96.2712500 + 41.5599790 96.2670830 + 41.5641880 96.2670830 + 41.5662500 96.2650210 + 41.5683130 96.2629170 + 41.5725210 96.2629170 + 41.5745830 96.2649790 + 41.5745830 96.2691880 + 41.5766460 96.2712500 + 41.5787500 96.2733130 + 41.5808130 96.2754170 + 41.5829170 96.2774790 + 41.5849790 96.2795830 + 41.5891880 96.2795830 + 41.5912500 96.2775210 + 41.5912500 96.2691460 + 41.5933130 96.2670830 + 41.5954170 96.2650210 + 41.5954170 96.2441460 + 41.5933540 96.2420830 + 41.5912500 96.2400210 + 41.5891880 96.2379170 + 41.5870830 96.2358540 + 41.5870830 96.2191460 + 41.5850210 96.2170830 + 41.5766460 96.2170830 + 41.5745830 96.2150210 + 41.5725210 96.2129170 + 41.5599790 96.2129170 + 41.5579170 96.2108540 + 41.5579170 96.2066460 + 41.5516880 96.2004170 + 41.5474790 96.2004170 + 41.5224790 96.1837500 + 41.5204170 96.1816880 + 41.5204170 96.1733130 + 41.5162500 96.1691880 + 41.5141880 96.1670830 + 41.5120830 96.1650210 + 41.5120830 96.1566460 + 41.5079170 96.1524790 + 41.5079170 96.1504170 + 41.4766460 96.1504170 + 41.4745830 96.1483540 + 41.4725210 96.1462500 + 41.4704170 96.1441880 + 41.4683540 96.1420830 + 41.4599790 96.1420830 + 41.4579170 96.1400210 + 41.4558540 96.1379170 + 41.4516460 96.1379170 + 41.4495830 96.1358540 + 41.4475210 96.1337500 + 41.4454170 96.1316880 + 41.4433540 96.1295830 + 41.4391460 96.1295830 + 41.4370830 96.1275210 + 41.4350210 96.1254170 + 41.4329170 96.1233540 + 41.4308540 96.1212500 + 41.4183130 96.1212500 + 41.4162500 96.1233130 + 41.4141880 96.1254170 + 41.4120830 96.1274790 + 41.4100210 96.1295830 + 41.4016460 96.1295830 + 41.3995830 96.1275210 + 41.3975210 96.1254170 + 41.3891460 96.1254170 + 41.3870830 96.1233540 + 41.3850210 96.1212500 + 41.3829170 96.1191880 + 41.3808540 96.1170830 + 41.3766460 96.1170830 + 41.3745830 96.1150210 + 41.3725210 96.1129170 + 41.3683130 96.1129170 + 41.3662500 96.1108540 + 41.3641880 96.1087500 + 41.3558130 96.1087500 + 41.3537500 96.1066880 + 41.3516880 96.1045830 + 41.3495830 96.1025210 + 41.3475210 96.1004170 + 41.3433130 96.1004170 + 41.3225210 96.0795830 + 41.3141460 96.0795830 + 41.3120830 96.0774790 + 41.3120830 96.0754170 + 41.2995830 96.0774790 + 41.2995830 96.0858540 + 41.3037500 96.0899790 + 41.3037500 96.1025210 + 41.3016460 96.1045830 + 41.2995830 96.1066880 + 41.3016460 96.1087500 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/topography b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/topography new file mode 100644 index 0000000000..2bf36ac507 --- /dev/null +++ b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/geo/topography @@ -0,0 +1,2 @@ +44.000000 99.000000 5.000000 5.000000 0.500000 0.500000 + 50 51 51 49 48 48 49 50 51 51 51 50 51 51 52 52 52 52 52 52 52 52 53 53 54 54 54 54 54 54 53 52 53 54 54 54 54 54 55 55 55 55 55 56 56 56 57 56 56 54 52 51 51 49 48 47 46 45 45 44 44 43 42 41 42 42 42 42 42 41 41 41 41 41 41 41 40 40 41 41 41 41 41 40 40 41 40 40 40 40 40 40 40 40 39 38 38 38 39 39 39 39 39 39 39 39 38 38 37 36 37 39 39 39 39 39 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 40 40 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 42 42 43 43 43 44 44 44 45 45 45 46 46 46 46 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 50 51 51 51 51 51 51 52 51 51 50 51 52 52 52 52 53 53 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 52 52 51 51 51 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 52 51 51 51 52 51 50 50 50 50 49 49 49 48 48 47 46 46 46 46 46 46 47 49 49 50 50 50 50 50 50 50 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 50 51 51 51 51 52 53 53 52 52 52 53 53 54 54 54 54 53 53 53 52 52 51 51 51 52 52 52 53 53 54 54 53 54 54 55 55 55 55 55 55 55 54 53 52 52 52 52 52 52 52 51 51 51 50 50 50 50 51 52 52 52 52 51 51 51 51 50 49 49 48 48 48 48 48 48 48 48 47 47 47 48 48 48 48 48 48 48 48 47 47 46 46 45 45 45 45 45 46 46 46 46 46 47 46 44 43 44 45 45 45 44 44 44 44 44 44 43 44 44 44 44 44 44 44 45 45 45 45 45 44 44 45 45 46 45 44 45 46 47 47 46 45 45 44 43 43 43 43 42 43 42 42 42 42 41 41 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 30 30 29 29 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 29 29 29 29 29 29 30 30 30 50 50 50 49 48 49 50 50 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 53 53 54 54 53 53 52 52 53 54 54 53 53 54 55 55 55 55 55 55 56 57 57 55 54 52 51 51 50 48 47 46 46 45 45 44 44 43 43 41 42 43 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 39 39 39 39 39 39 39 39 39 39 38 38 37 37 38 39 39 39 39 39 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 43 42 42 42 43 43 43 43 44 44 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 52 51 51 50 50 51 53 54 54 54 54 54 55 55 54 54 54 53 53 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 52 51 51 50 50 49 49 49 48 47 46 46 46 46 46 46 46 47 48 48 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 49 49 49 49 49 50 50 50 51 51 51 52 52 52 53 52 52 52 53 53 54 54 54 54 54 53 53 52 52 51 50 50 51 51 51 52 52 53 53 53 53 54 55 55 54 54 54 55 55 55 54 53 52 52 52 52 52 52 51 51 50 50 50 51 51 51 52 53 53 52 52 51 51 51 51 50 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 48 47 47 47 46 46 46 45 44 45 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 44 45 45 46 45 44 43 44 46 46 46 46 45 44 44 44 44 43 43 43 43 43 43 43 43 42 42 41 40 40 40 40 41 41 41 40 39 39 39 39 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 34 34 34 33 33 33 34 34 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 32 32 32 32 32 32 32 31 31 31 30 30 30 30 30 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 48 49 49 48 48 49 50 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 53 54 53 53 53 54 54 54 54 54 54 55 56 57 56 54 52 51 51 51 50 48 47 46 46 45 45 44 44 44 43 42 41 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 37 37 37 37 38 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 43 42 42 42 43 43 43 43 44 44 45 45 45 46 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 52 51 51 50 50 50 53 54 54 54 55 55 55 55 55 55 55 54 53 52 51 51 51 51 52 52 52 52 51 51 50 49 49 49 48 48 48 49 50 50 51 51 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 51 50 50 50 51 51 51 51 51 52 51 51 50 50 50 49 49 48 46 46 46 46 47 47 47 48 48 48 48 49 49 48 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 50 50 51 51 51 52 52 52 52 52 53 53 53 53 53 53 54 54 54 53 53 53 52 52 52 51 50 50 51 51 51 52 52 52 52 52 53 54 54 55 54 54 54 54 55 56 55 54 53 52 52 51 51 51 51 51 50 50 50 51 51 51 52 53 53 53 52 52 52 52 51 50 49 49 49 48 48 47 47 48 47 47 47 46 46 46 47 47 47 48 48 48 47 47 46 46 45 45 45 44 44 44 45 45 46 45 45 44 45 46 45 45 45 45 45 44 44 44 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 44 43 44 45 45 46 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 36 36 37 37 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 32 32 32 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 29 29 29 29 30 30 30 29 29 30 29 29 30 30 30 30 31 48 48 48 48 48 49 50 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 52 52 52 52 53 52 52 53 53 54 54 55 55 55 56 56 56 54 52 51 50 51 51 49 48 47 46 46 45 45 45 44 44 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 37 37 38 38 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 43 42 42 43 44 44 44 44 45 45 46 46 46 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 51 51 51 51 50 50 50 52 53 54 54 54 54 54 54 54 54 53 53 52 52 51 51 51 52 53 53 52 52 51 50 49 48 48 48 48 48 48 48 49 49 50 51 51 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 52 52 51 50 50 49 49 49 49 48 46 46 46 47 47 48 48 49 49 49 49 49 49 48 49 50 50 49 49 49 50 49 49 49 49 49 49 49 48 48 48 48 49 49 49 50 50 50 50 51 51 52 52 52 52 52 52 53 53 53 53 53 53 53 54 53 53 53 53 52 52 52 52 51 50 51 51 51 51 51 51 51 52 52 53 54 55 54 53 53 53 54 55 55 54 54 53 52 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 52 52 51 51 50 49 48 48 48 47 46 46 47 46 46 46 46 46 46 46 47 47 48 48 48 47 47 46 46 46 45 45 45 44 44 44 44 45 44 44 44 45 45 46 46 46 46 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 45 44 43 43 44 44 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 40 40 40 40 40 39 39 38 39 40 39 39 38 38 38 37 37 37 36 36 37 37 37 36 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 33 33 32 32 32 32 32 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 32 31 31 31 31 31 32 31 31 31 31 31 31 31 32 31 31 31 31 31 31 31 30 30 31 30 30 30 29 29 29 30 30 30 30 29 29 30 30 30 30 30 30 30 31 49 49 49 49 49 50 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 52 53 53 54 55 55 55 55 56 55 54 52 51 50 51 51 50 49 48 48 47 46 45 45 45 44 44 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 37 37 38 38 38 38 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 43 43 44 44 44 44 44 45 45 45 45 46 46 46 46 47 47 47 47 47 48 48 48 48 49 49 49 49 49 50 50 51 51 51 51 51 51 52 52 51 51 50 49 51 52 53 53 54 54 54 54 54 53 53 53 53 52 52 52 52 52 53 53 53 52 51 51 50 49 49 49 49 48 48 48 48 48 49 49 50 51 51 51 51 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 51 50 49 49 49 49 49 47 46 46 46 47 48 48 48 49 49 49 49 49 49 48 48 49 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 50 50 50 50 50 51 51 51 52 52 52 52 52 52 53 53 53 53 53 53 53 54 53 53 53 52 52 51 51 52 51 50 50 50 51 51 51 51 51 52 53 53 53 54 54 53 52 53 53 54 55 55 55 54 53 52 51 51 51 51 52 52 52 51 51 52 52 53 53 53 52 52 52 51 50 50 49 48 48 47 47 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 48 47 47 47 46 46 46 45 45 44 44 44 44 44 44 44 45 45 46 46 46 46 46 45 45 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 44 44 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 40 41 41 41 40 40 39 38 39 40 40 39 38 38 38 38 37 37 37 37 37 37 37 37 36 36 35 35 35 35 34 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 30 30 30 30 30 29 30 29 29 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 50 50 50 50 51 51 52 51 51 51 51 51 51 50 50 50 50 51 51 51 52 52 51 51 52 52 53 53 53 53 53 52 52 53 53 53 53 54 54 54 54 55 54 54 53 52 51 50 50 51 51 50 49 48 47 46 46 45 45 45 44 44 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 37 37 37 38 38 38 38 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 43 43 44 44 44 44 44 44 45 45 45 46 46 46 46 47 47 46 46 47 48 48 48 48 49 49 49 49 49 49 50 50 50 50 51 51 51 52 52 51 51 50 49 50 51 52 53 53 54 54 54 54 54 54 54 53 53 52 52 53 53 53 54 54 54 53 52 51 51 50 49 49 49 49 48 48 48 48 48 49 50 50 51 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 50 50 49 49 50 50 51 51 50 50 49 48 48 48 48 47 46 46 46 47 48 48 48 49 49 49 49 49 48 48 49 49 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 50 50 50 51 51 52 52 51 51 51 52 52 53 53 53 53 54 54 54 54 53 53 52 52 51 51 51 51 51 50 49 50 50 50 50 51 52 52 52 52 53 53 54 53 52 52 52 53 54 54 55 54 54 53 52 51 51 51 51 52 52 52 52 52 52 53 53 52 52 51 51 51 50 50 49 49 48 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 45 45 44 44 44 44 44 45 45 45 46 45 45 45 45 45 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 44 45 45 45 44 43 44 44 44 43 43 43 43 43 44 44 43 43 43 43 43 42 42 41 41 40 40 40 39 39 39 38 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 34 34 34 33 33 32 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 30 30 30 29 29 29 29 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 51 51 51 51 51 51 51 51 51 51 51 51 50 49 49 49 50 50 50 51 53 53 52 53 54 54 55 55 56 55 54 54 54 54 54 54 54 54 54 54 54 54 53 52 51 51 50 50 51 51 51 49 48 48 47 46 46 45 45 45 44 44 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 37 37 37 37 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 44 44 44 44 44 44 45 45 45 46 46 46 46 46 47 46 46 47 48 48 48 48 48 48 49 49 49 49 49 49 49 50 51 51 51 51 51 51 50 49 48 49 50 51 52 53 53 53 54 54 54 54 54 54 53 53 53 53 54 54 54 54 54 54 53 53 52 51 50 49 49 48 48 48 48 48 48 48 49 50 50 50 50 50 51 51 51 51 51 51 52 51 51 51 52 51 51 50 49 49 49 50 51 51 50 49 49 48 47 48 48 47 46 46 46 46 47 48 48 48 49 49 49 48 48 48 49 49 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 51 51 51 51 51 52 52 53 53 53 53 54 54 54 53 53 52 52 51 51 51 51 51 50 49 49 49 49 50 51 51 51 51 52 53 53 54 53 52 52 52 53 54 54 55 55 55 55 53 51 51 51 51 51 51 52 52 52 52 52 52 52 51 51 50 50 50 50 49 48 47 47 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 44 44 44 45 45 45 44 44 44 44 45 45 45 45 44 44 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 42 43 44 45 45 45 44 44 44 44 44 43 43 43 43 43 44 44 43 43 43 43 43 43 42 42 41 41 40 40 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 37 36 36 35 35 34 34 34 34 34 33 34 33 33 33 32 33 33 33 33 33 33 33 33 32 32 32 32 32 32 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 31 31 31 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 51 51 51 51 51 51 51 51 51 51 51 50 49 48 49 49 49 50 51 51 52 53 54 54 55 55 56 57 57 56 55 55 55 54 54 54 54 54 54 53 53 52 51 51 50 50 50 51 51 50 50 49 48 48 47 46 46 45 45 45 44 44 43 42 42 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 41 40 40 40 40 40 39 39 39 39 40 40 40 39 39 39 39 39 39 39 39 39 39 39 40 40 40 39 38 38 39 39 39 38 37 37 37 37 38 38 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 44 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 48 48 48 49 49 49 49 50 50 51 51 51 51 51 50 48 48 48 49 50 51 52 52 53 53 54 54 54 54 54 54 54 54 54 54 54 54 55 54 54 54 54 53 53 52 50 49 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 51 51 51 51 51 51 52 52 52 51 51 51 50 50 50 50 50 50 49 48 48 47 47 47 47 46 46 46 46 46 47 48 48 48 48 49 49 48 47 48 49 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 51 51 51 51 51 52 52 52 53 53 53 54 54 53 53 52 52 52 51 50 50 50 50 50 49 49 49 49 50 50 51 51 51 52 52 53 53 53 52 51 51 52 54 54 54 55 55 55 54 52 51 51 51 51 51 51 51 52 52 52 52 51 51 51 50 50 50 49 49 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 45 45 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 44 44 44 44 45 45 45 45 45 44 44 44 44 44 44 44 42 42 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 44 44 43 43 43 42 42 43 43 42 42 41 41 40 40 40 39 40 40 39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 35 34 34 34 34 33 33 34 34 34 34 33 33 34 33 33 33 33 33 33 33 33 32 32 32 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 31 31 31 32 32 31 31 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 31 31 31 30 30 29 29 30 30 30 30 30 30 30 51 52 51 51 51 51 51 51 51 50 50 49 48 48 48 49 50 51 52 52 53 54 54 54 55 57 58 58 58 57 56 55 55 54 53 53 53 53 52 52 51 51 51 50 50 50 50 51 51 50 49 48 48 47 47 46 46 45 45 44 44 43 43 42 42 42 43 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 41 41 40 40 40 40 39 39 39 39 40 40 40 39 39 39 39 39 39 39 39 40 40 40 40 40 40 39 38 38 39 39 39 38 38 38 38 37 37 37 38 39 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 41 42 41 42 43 43 43 44 44 44 44 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 48 48 49 49 49 49 49 50 51 51 50 50 50 50 49 48 48 48 49 50 51 52 52 53 53 54 54 54 54 54 54 54 54 54 54 54 55 55 55 54 54 53 53 52 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 51 51 51 51 52 52 52 52 51 51 50 49 49 49 48 48 48 47 47 46 46 46 45 45 45 46 47 47 48 48 48 48 48 47 47 48 49 49 49 48 48 48 49 49 49 48 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 50 50 51 51 51 51 52 52 52 52 53 54 53 53 53 53 52 52 52 51 50 50 49 49 49 49 49 49 49 49 50 50 50 51 51 52 52 52 52 52 51 50 52 53 53 52 52 52 52 52 51 51 52 52 51 51 51 51 51 51 52 52 51 51 51 50 50 50 49 49 49 49 48 48 48 47 47 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 46 45 45 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 43 42 42 43 42 43 43 43 43 43 43 44 44 44 44 44 43 43 44 44 44 43 42 42 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 35 35 34 34 34 34 34 34 34 34 34 34 34 33 34 34 34 34 34 34 33 33 33 33 34 34 34 34 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 31 31 30 30 30 31 31 31 31 31 31 31 30 30 30 30 30 31 30 30 30 30 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 50 51 52 52 53 54 54 55 55 56 57 58 58 59 58 57 56 55 54 53 52 51 51 51 51 50 50 50 49 49 50 51 51 50 49 48 48 47 47 46 46 46 45 45 44 44 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 39 39 39 39 39 39 39 40 40 40 40 40 40 40 39 38 38 39 39 39 39 39 39 39 38 37 36 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 42 43 43 44 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 48 49 49 49 49 49 50 50 51 50 50 50 50 49 48 48 48 49 50 51 51 52 52 53 53 54 54 54 54 54 54 54 55 55 54 54 54 54 54 53 53 52 51 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 50 51 51 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 48 47 46 46 45 45 45 45 46 47 47 47 47 47 47 47 47 48 49 49 48 48 48 48 49 49 49 48 48 48 48 48 48 48 49 49 49 50 50 51 51 51 51 50 50 50 51 51 51 52 52 52 52 53 53 53 53 53 53 53 52 52 52 51 51 51 50 49 49 49 48 48 48 49 50 50 50 51 52 52 51 51 52 51 50 50 50 51 51 51 52 52 52 52 52 52 51 52 52 52 51 51 51 51 52 52 52 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 47 46 46 46 46 45 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 43 43 43 44 43 43 43 43 43 43 43 43 44 43 42 42 43 43 43 42 42 43 43 43 43 44 43 43 43 43 43 43 44 44 44 42 42 42 42 42 42 42 43 42 42 42 41 41 41 41 41 40 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 31 31 31 31 30 30 31 30 30 30 30 30 30 31 31 31 31 31 31 31 32 32 32 32 31 30 30 30 30 30 30 30 30 30 30 51 50 50 50 50 49 50 49 48 47 48 48 48 48 49 50 51 52 52 53 54 54 55 56 56 57 58 58 59 59 58 56 54 54 52 51 51 51 51 50 50 49 49 49 49 50 51 50 50 49 48 48 47 46 46 46 46 45 45 44 44 43 43 43 43 43 42 42 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 39 38 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 42 43 43 44 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 49 49 49 49 49 50 50 51 50 50 50 49 49 48 48 48 49 50 50 51 51 52 53 54 54 55 55 55 54 54 54 55 54 54 54 54 53 53 52 52 51 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 50 50 51 51 51 51 51 51 51 50 50 49 48 48 48 48 49 49 48 48 47 46 46 45 45 45 45 46 46 46 46 46 47 47 47 48 49 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 50 50 51 51 52 51 50 49 50 50 51 51 51 52 52 52 53 53 53 52 52 52 52 52 52 52 52 52 52 51 50 49 48 48 48 48 49 49 49 50 50 51 52 51 50 50 50 49 49 49 50 50 51 52 54 54 54 55 55 54 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 49 49 49 48 48 48 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 46 47 47 47 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 43 43 43 43 42 42 44 44 44 43 42 42 42 43 43 43 43 43 43 43 43 43 44 44 44 43 42 42 43 42 42 42 42 43 43 43 43 42 41 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 34 34 34 34 34 34 34 34 33 33 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 31 30 30 30 30 30 30 31 31 31 31 31 31 32 32 32 31 31 30 30 30 30 30 30 30 30 30 30 49 49 48 48 48 47 47 47 47 48 48 48 48 49 50 50 51 52 52 53 54 54 55 56 57 58 59 59 59 58 57 55 54 53 52 51 50 50 50 50 49 49 49 49 49 50 50 50 49 48 48 48 47 46 46 46 46 45 45 44 44 44 43 43 42 42 43 43 42 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 40 39 39 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 42 43 43 44 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 49 49 49 49 49 48 48 48 49 49 50 51 52 53 53 54 54 55 55 54 54 54 54 54 54 53 53 53 52 52 51 51 51 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 47 47 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 49 49 48 48 48 48 48 48 48 48 49 49 50 50 51 51 51 51 50 49 50 50 51 51 51 52 52 53 53 53 53 52 51 51 51 52 52 51 51 51 51 51 50 49 48 48 48 48 49 49 49 50 50 49 50 49 49 49 49 50 50 51 51 52 54 54 54 55 55 55 55 55 54 53 52 51 51 52 52 53 53 53 52 51 51 51 51 51 51 50 50 50 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 46 46 47 47 47 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 43 43 42 42 43 44 44 44 44 43 42 42 43 43 43 43 43 43 42 42 43 44 44 44 43 43 43 43 43 43 42 42 43 43 43 43 42 40 40 39 40 39 39 39 40 39 39 40 40 40 40 39 38 38 37 38 38 38 38 37 37 37 37 36 36 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 34 34 33 33 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 47 47 47 47 47 47 47 47 47 48 49 49 49 50 50 50 51 51 51 52 53 54 55 56 57 58 59 59 59 58 56 54 53 52 51 51 50 49 49 49 49 49 49 49 49 50 50 50 49 48 48 47 47 46 46 46 45 45 45 45 44 44 43 43 42 42 43 43 42 41 41 42 41 41 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 37 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 43 43 43 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 50 49 49 49 49 49 49 48 48 48 48 49 50 51 52 53 53 54 54 54 55 54 54 54 54 54 53 53 52 52 52 51 51 51 51 50 50 50 50 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 50 51 51 51 50 50 50 50 50 49 49 49 50 50 49 49 49 48 48 48 47 46 46 46 45 45 45 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 48 48 47 47 48 48 49 49 48 49 50 50 51 50 50 50 49 49 49 50 51 51 51 51 52 53 53 53 53 52 51 51 51 51 51 51 50 50 51 51 51 49 48 48 48 48 49 49 49 49 48 48 49 50 50 49 50 51 52 52 52 53 55 55 54 54 55 55 55 55 54 54 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 46 45 45 46 45 45 46 46 47 47 47 46 46 46 46 45 45 44 44 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 42 43 44 44 44 44 44 44 44 43 42 42 43 43 43 43 43 42 42 43 44 44 44 44 43 43 43 43 43 42 42 43 43 43 42 41 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 39 38 37 37 37 37 38 37 37 37 37 37 37 36 36 36 37 36 36 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 33 33 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 31 31 32 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 46 47 47 47 47 48 48 48 48 48 49 49 49 50 50 51 51 51 51 52 52 53 54 55 56 57 58 58 58 57 55 53 52 51 51 50 50 49 49 49 49 49 49 49 49 50 50 49 48 48 48 47 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 42 41 41 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 36 37 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 44 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 48 48 49 49 49 50 50 49 49 49 49 49 48 48 48 48 49 50 50 52 53 54 54 54 54 54 54 54 54 53 53 53 52 52 51 51 51 51 51 51 51 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 50 50 50 50 49 49 49 49 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 46 45 45 45 46 46 47 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 48 48 49 48 48 48 49 50 50 50 49 49 49 49 50 51 51 51 51 51 52 52 53 53 52 52 51 51 51 51 51 50 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 49 51 52 51 51 51 52 52 53 53 54 55 54 54 54 55 55 55 55 55 54 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 49 49 49 49 49 48 48 49 48 48 48 48 48 47 47 47 47 47 47 46 46 45 45 45 46 46 46 46 47 47 46 46 46 46 46 45 44 44 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 43 42 42 42 42 42 43 42 42 42 43 43 44 44 44 43 43 43 43 42 41 41 42 43 42 41 42 41 41 41 41 40 40 40 40 40 39 39 39 39 40 40 39 38 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 35 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 33 33 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 31 31 31 30 30 30 30 30 31 31 31 31 31 32 32 32 32 32 31 30 30 30 31 30 30 30 30 47 48 48 48 48 49 49 49 49 49 49 49 50 51 51 51 51 52 52 52 53 53 54 55 55 57 57 57 57 55 53 52 51 51 50 50 49 49 49 48 48 48 48 49 49 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 41 41 41 42 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 36 37 38 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 48 49 49 49 50 50 49 49 49 49 49 49 48 48 48 48 49 50 51 52 54 54 54 54 54 54 54 53 53 52 52 52 51 51 51 51 51 52 52 52 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 49 49 49 49 49 49 48 48 48 47 47 47 47 46 46 45 45 45 45 46 47 47 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 48 48 48 48 49 49 50 50 49 48 48 49 50 51 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 48 48 49 50 51 51 51 51 51 52 52 53 53 54 55 54 53 53 54 54 54 55 55 54 54 53 53 53 52 52 52 52 53 53 52 52 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 44 44 43 42 42 43 44 44 44 44 44 44 44 43 44 44 45 46 45 44 42 41 41 41 42 42 42 42 43 43 44 44 44 43 43 42 42 42 42 41 42 43 42 42 43 42 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 39 39 38 37 37 37 37 36 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 35 35 35 34 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 32 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 30 30 30 30 31 31 31 31 31 32 32 32 32 32 31 30 30 30 31 30 30 30 30 48 48 49 49 49 50 50 50 50 50 49 49 50 51 51 51 52 52 53 53 54 54 55 55 56 56 56 56 54 53 52 51 51 50 50 49 49 48 48 48 48 48 48 49 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 44 44 43 43 43 43 43 42 42 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 36 37 38 39 39 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 50 52 53 54 54 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 49 49 50 50 49 49 49 49 49 49 48 48 48 47 47 47 46 46 45 45 45 45 45 46 47 47 48 47 47 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 48 48 49 50 51 51 52 52 52 52 52 52 52 51 51 51 50 50 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 48 48 49 49 50 50 50 50 51 52 52 52 53 54 55 54 53 52 53 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 51 51 51 51 50 50 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 43 43 43 44 43 43 43 43 42 42 43 44 44 45 45 44 44 43 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 45 46 45 44 43 42 41 41 41 41 42 42 43 44 43 43 43 43 43 42 42 42 42 43 43 43 43 43 42 42 41 41 41 40 40 40 39 39 39 39 40 39 39 39 39 39 39 38 37 37 37 37 36 36 37 37 37 36 36 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 33 33 32 32 32 32 32 31 30 30 30 30 31 31 32 32 31 31 32 32 32 32 32 31 30 30 30 31 30 30 30 30 48 49 49 49 50 50 50 50 50 50 50 50 50 51 51 51 52 53 53 54 54 55 55 56 56 56 55 54 53 52 51 51 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 47 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 50 51 52 53 54 54 54 55 54 53 53 52 52 52 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 48 48 49 48 48 48 49 49 50 50 50 49 49 49 49 49 49 48 47 47 47 46 46 45 45 45 45 45 45 46 46 47 48 47 47 47 47 48 48 48 48 48 47 47 47 47 47 48 48 48 48 48 48 49 49 48 48 48 48 49 49 50 51 51 51 51 51 51 52 52 52 51 51 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 47 47 48 48 49 49 49 49 49 49 50 50 51 52 52 52 54 55 54 53 52 52 53 53 53 54 54 54 54 53 52 52 53 53 53 53 53 53 52 52 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 43 44 44 43 43 43 43 42 42 42 43 43 43 44 44 43 42 42 43 43 43 42 42 43 44 45 45 45 45 44 44 44 44 45 44 44 43 43 42 42 41 41 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 40 40 40 39 39 40 40 40 40 39 39 39 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 33 33 33 33 33 33 33 33 34 34 33 33 32 32 32 32 33 32 32 32 32 32 32 33 33 32 32 32 32 31 31 30 30 31 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 30 30 30 30 49 49 50 50 50 50 50 51 51 51 51 51 51 51 51 52 53 54 54 54 55 55 56 55 55 54 54 53 52 51 51 50 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 39 38 37 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 43 44 44 45 45 45 45 46 46 46 46 47 47 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 49 49 49 48 48 48 49 51 52 53 54 54 54 55 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 50 50 50 50 49 49 49 49 49 48 48 47 46 46 45 45 45 45 45 45 46 47 47 47 48 47 47 47 47 48 48 48 48 47 47 47 47 47 48 48 48 48 48 48 48 49 49 48 48 48 48 49 49 50 50 50 51 51 51 51 52 52 52 52 51 51 50 51 51 51 50 50 50 50 50 49 48 48 47 47 47 47 48 49 48 48 48 48 48 49 49 50 51 51 52 52 54 55 54 53 52 52 52 52 53 53 54 55 54 53 52 52 53 53 53 53 53 53 52 52 52 51 51 51 51 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 46 46 46 45 45 46 46 46 46 45 45 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 42 43 43 44 44 43 42 43 44 44 44 45 45 44 44 44 44 45 44 44 44 43 43 43 42 41 41 41 42 42 43 43 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 34 34 34 33 33 32 32 32 33 33 33 32 32 32 32 32 33 33 33 32 32 32 32 31 30 30 31 32 32 32 32 32 32 32 32 32 32 31 30 30 30 30 30 30 31 31 31 49 50 50 50 50 50 51 51 52 51 51 51 51 51 52 52 53 54 55 55 55 55 55 55 54 53 52 52 51 51 50 49 49 48 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 44 44 44 43 44 44 43 43 42 42 42 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 39 39 39 37 36 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 47 47 46 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 50 50 50 50 50 49 49 48 48 49 51 52 53 54 55 55 54 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 50 50 49 49 49 49 49 49 49 48 48 48 48 49 50 50 50 49 49 49 49 49 48 48 48 47 46 45 45 45 45 45 46 47 47 47 48 48 48 47 47 47 47 48 48 48 48 47 47 47 47 48 48 48 48 48 49 49 49 48 48 48 47 48 48 49 49 50 50 50 51 51 51 51 52 52 52 52 52 51 51 51 52 52 51 50 50 50 50 49 49 48 47 47 47 47 48 48 48 48 48 48 48 48 49 50 50 51 51 52 53 54 53 53 52 52 52 52 53 53 54 54 54 53 52 52 52 52 52 52 53 53 52 52 52 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 46 46 46 45 45 46 46 46 46 45 45 45 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 44 44 44 43 42 43 43 43 44 44 44 44 44 44 44 45 44 44 43 43 43 43 43 42 41 41 42 42 43 44 44 44 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 33 33 34 34 34 33 33 33 33 33 33 34 33 32 32 32 32 32 32 33 33 33 32 32 32 32 31 30 31 32 32 32 32 32 32 32 32 32 32 31 30 31 30 30 30 30 31 31 31 50 50 50 50 50 51 51 51 52 52 52 51 51 52 52 52 53 54 54 54 54 54 54 54 53 52 52 51 51 50 50 49 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 39 39 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 36 37 38 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 43 44 44 45 45 45 45 46 46 46 46 47 47 46 46 46 47 47 47 47 47 47 47 48 48 48 48 48 49 49 50 50 50 50 50 50 50 50 49 49 48 48 48 50 52 53 54 55 55 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 49 50 50 49 49 49 49 49 48 48 47 47 47 46 45 45 45 45 45 46 47 47 48 48 48 48 48 47 47 47 47 48 48 48 48 47 47 46 47 48 48 48 48 48 48 49 48 48 48 47 47 48 49 50 50 50 50 51 51 51 52 52 52 52 52 52 52 52 51 51 52 52 51 50 50 49 49 49 49 48 47 47 46 47 47 47 47 47 47 48 48 48 49 50 50 51 51 51 53 53 52 52 52 51 51 52 53 53 54 54 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 46 46 45 45 44 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 44 44 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 33 33 33 34 33 33 33 33 33 33 33 33 33 32 33 33 32 32 32 33 33 33 32 32 32 32 31 30 30 31 32 32 32 32 32 32 32 32 32 31 30 30 30 30 31 31 31 31 31 50 51 50 50 50 51 51 52 52 53 52 52 52 52 53 53 53 53 54 54 54 54 53 53 52 52 51 51 50 50 49 48 48 48 49 49 49 49 50 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 39 39 39 39 40 40 40 40 40 40 39 39 39 39 39 39 40 38 37 37 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 43 43 43 44 45 45 45 45 46 46 46 46 47 46 46 46 46 47 48 47 47 47 47 47 48 48 48 48 48 49 49 50 50 50 50 50 50 49 49 49 49 48 48 48 50 52 53 54 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 50 50 50 50 50 49 49 49 50 49 49 49 48 48 48 49 50 50 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 45 46 47 48 48 48 48 47 47 47 47 47 47 47 48 48 48 47 47 46 46 47 47 47 48 48 48 48 48 48 47 47 48 49 50 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 49 48 48 49 48 48 47 46 46 47 47 47 47 48 48 48 48 49 50 50 50 50 51 52 52 52 52 51 50 50 52 52 52 53 53 52 52 53 53 53 53 53 53 52 52 52 52 52 52 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 43 43 44 44 45 44 44 44 44 43 43 43 43 43 43 43 42 41 41 42 43 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 33 33 33 34 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 33 33 33 32 32 32 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 51 51 51 50 50 51 51 51 52 53 53 53 52 53 53 54 54 54 54 54 54 53 53 52 51 51 51 50 50 49 48 48 48 48 48 49 49 49 49 50 49 49 49 49 49 48 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 40 39 39 39 39 39 39 39 39 40 39 38 39 39 39 39 39 38 37 38 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 43 43 42 42 42 42 43 44 45 45 45 45 46 46 46 46 47 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 49 50 50 50 49 49 49 49 49 49 49 49 48 48 49 51 52 53 53 53 54 54 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 50 50 49 49 49 49 49 50 49 49 48 48 48 48 48 50 50 49 48 48 47 47 47 47 46 45 45 45 45 45 45 45 45 46 47 48 48 48 48 47 47 47 47 47 47 47 48 48 48 47 47 47 46 46 46 47 47 47 47 47 47 47 47 47 48 49 49 50 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 49 48 48 48 48 48 47 46 46 46 46 47 47 48 48 48 48 49 49 49 49 50 50 51 51 51 51 51 50 50 51 51 51 52 52 53 54 54 54 54 54 54 53 52 52 52 52 52 52 51 51 51 50 50 50 51 50 50 50 49 49 49 49 49 48 47 47 47 47 47 47 46 46 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 44 44 44 44 44 44 43 43 43 43 42 42 42 43 42 41 42 43 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 31 30 30 31 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 31 51 52 51 51 51 51 51 51 52 52 53 53 53 53 54 54 54 54 54 53 53 53 52 52 51 51 50 50 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 44 44 45 44 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 39 39 39 38 37 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 42 42 42 42 43 44 45 45 45 45 45 46 46 46 47 47 47 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 49 49 49 50 49 49 49 49 49 49 49 49 48 47 48 50 52 52 52 53 53 54 54 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 48 48 48 50 50 50 49 48 47 46 46 46 45 45 45 45 45 45 46 46 46 46 47 48 48 48 47 47 47 47 47 46 47 47 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 50 51 51 52 52 52 52 52 52 52 52 52 53 52 52 52 52 52 51 51 51 49 48 48 48 48 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 49 50 50 51 50 50 50 50 49 49 50 50 51 52 53 54 54 55 54 54 54 54 53 53 52 52 52 52 52 52 52 51 51 50 51 51 51 50 50 50 49 49 49 49 48 47 47 46 47 47 47 46 46 45 45 46 46 46 45 44 44 44 44 44 44 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 44 44 45 45 44 44 44 44 44 43 42 42 41 42 41 41 41 42 43 43 44 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 39 39 39 39 40 40 39 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 34 34 33 33 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 52 52 52 51 51 51 51 51 51 52 53 53 54 54 54 54 54 53 53 53 52 52 51 51 51 50 50 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 41 41 42 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 37 37 37 38 38 38 39 39 39 38 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 42 42 42 43 43 44 45 45 45 45 45 46 46 46 47 47 47 46 46 46 47 47 47 48 47 47 47 47 47 48 48 47 48 48 49 49 49 49 49 49 49 49 49 49 48 47 47 49 50 51 52 53 54 55 54 53 53 53 53 53 53 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 48 48 49 48 48 47 47 48 48 48 50 50 50 49 48 48 47 46 45 45 45 45 46 46 46 47 47 47 47 47 48 48 48 47 47 47 47 46 46 47 47 48 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 46 47 47 48 48 49 50 50 51 52 52 53 53 53 53 53 53 53 53 52 52 52 52 52 51 51 50 49 48 47 47 47 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 50 50 50 50 49 49 49 49 50 50 50 51 51 52 53 54 54 55 54 54 54 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 49 49 49 49 48 48 47 46 46 47 47 46 46 45 45 45 45 46 45 44 44 44 44 44 44 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 44 45 45 46 45 44 44 44 44 43 43 42 42 42 41 41 42 42 43 43 44 43 42 42 42 42 42 41 41 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 33 32 32 32 31 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 52 52 52 52 52 52 52 52 52 53 53 53 54 54 54 53 53 53 52 52 52 51 51 51 51 50 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 42 41 42 43 42 42 42 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 37 37 38 38 39 38 37 38 40 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 42 42 42 42 43 44 44 45 45 45 46 46 46 46 46 47 47 47 46 46 46 47 47 47 48 47 47 47 47 47 47 46 47 48 49 49 49 48 48 49 49 49 49 49 48 47 47 48 49 51 53 54 54 55 54 53 53 53 53 53 53 52 51 51 51 52 51 51 51 50 50 50 50 50 50 50 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 48 48 49 50 50 49 49 48 48 47 46 45 45 45 45 46 47 47 47 48 48 48 48 48 48 48 48 48 48 47 47 46 47 47 48 48 48 48 48 48 49 48 47 47 47 47 47 46 46 46 47 47 47 47 48 49 50 51 52 52 53 53 53 53 53 53 53 53 53 52 51 51 51 52 51 50 50 49 48 47 47 47 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 49 49 49 49 49 49 49 49 50 51 51 51 51 52 53 53 54 54 54 54 54 53 53 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 48 47 46 46 46 46 46 46 45 45 45 45 46 45 45 45 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 44 44 45 45 46 45 45 45 44 44 44 43 43 43 43 42 42 43 43 43 43 44 43 42 42 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 33 33 32 32 31 30 31 32 32 32 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 53 53 53 53 53 53 54 54 54 54 54 53 53 52 52 52 52 51 51 51 50 50 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 42 41 42 42 43 43 43 42 41 41 40 40 40 40 41 41 41 41 41 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 37 38 38 37 37 39 39 39 39 40 40 40 39 39 40 40 40 40 40 40 40 40 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 42 42 42 42 43 44 44 45 45 45 46 46 46 46 46 47 47 47 47 46 46 46 47 47 47 48 47 47 47 47 47 47 47 47 48 48 49 48 48 49 49 49 49 49 48 48 47 47 48 50 52 53 54 54 54 53 53 53 53 53 52 51 51 51 51 51 52 51 51 50 50 50 50 49 49 49 49 49 48 48 48 48 49 48 48 48 48 47 47 47 47 48 49 49 50 49 48 48 48 47 46 46 45 45 45 45 46 47 47 47 48 48 49 49 48 48 49 49 48 48 48 47 46 46 47 47 47 47 48 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 48 48 49 50 51 52 52 53 53 53 53 53 53 53 53 53 52 51 51 51 52 51 50 50 49 48 47 46 47 47 47 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 49 49 49 49 50 50 51 51 52 52 52 52 53 53 53 53 54 54 54 54 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 48 48 48 47 47 46 46 46 46 46 45 45 46 46 45 45 46 46 45 44 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 43 43 44 44 45 45 46 45 45 45 45 44 44 43 43 43 43 42 42 43 43 44 44 44 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 31 30 31 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 53 53 54 54 54 54 54 54 54 53 53 53 52 52 52 52 51 51 51 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 43 43 43 42 42 42 42 42 42 42 42 42 41 41 40 40 40 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 39 39 39 39 39 40 40 40 40 39 39 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 42 42 43 42 42 42 42 43 44 44 45 45 45 45 46 46 46 46 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 48 48 47 47 47 48 49 48 48 48 49 48 48 48 48 48 48 47 47 49 51 52 53 54 54 53 54 54 54 53 52 52 51 51 51 51 52 51 51 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 48 49 49 49 49 48 47 47 46 46 45 45 45 45 46 46 46 47 47 48 48 49 49 48 48 48 49 49 48 48 47 46 46 47 47 47 47 48 48 47 47 47 47 47 47 47 46 46 46 46 46 48 48 48 48 49 50 51 51 52 53 53 53 52 52 52 53 53 52 52 51 51 51 52 51 50 49 48 47 46 46 47 47 46 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 49 51 51 50 51 51 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 48 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 45 45 45 46 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 45 45 46 46 45 45 45 45 44 44 43 43 43 43 42 42 42 43 44 44 44 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 31 30 31 32 32 33 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 53 53 53 53 54 54 54 54 54 53 53 53 52 52 52 52 52 52 51 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 42 42 42 41 41 41 40 40 41 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 39 39 39 38 38 38 38 38 38 38 38 39 39 39 39 39 38 36 37 38 38 38 38 38 39 40 40 39 39 39 39 39 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 46 46 46 46 46 47 47 47 47 46 46 46 47 47 47 48 48 48 48 48 48 48 47 47 47 48 48 47 47 48 48 47 48 48 49 48 47 46 48 51 52 53 54 54 54 54 53 53 53 53 52 52 51 50 51 51 51 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 49 49 48 47 46 46 46 45 45 45 45 45 46 46 46 47 47 47 48 48 48 48 47 48 48 49 48 48 47 46 46 46 46 47 47 48 47 47 47 46 46 46 46 46 46 45 46 46 47 48 48 49 49 50 50 51 51 52 52 53 53 52 52 52 52 52 52 51 50 51 51 52 51 50 49 48 48 47 46 46 47 46 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 49 50 51 51 52 52 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 53 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 43 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 40 40 40 40 39 39 38 38 38 37 37 37 37 37 37 37 36 36 36 37 36 36 36 36 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 33 33 33 33 34 34 34 34 33 33 33 32 32 32 31 31 31 32 32 32 33 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 53 54 54 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 43 42 42 42 41 41 41 41 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 39 39 39 39 39 37 37 37 38 38 38 38 39 39 39 38 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 43 43 44 45 45 45 45 45 46 46 46 46 46 47 47 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 47 47 47 47 47 46 47 47 47 47 48 48 48 47 46 47 50 51 52 53 53 53 53 53 52 52 52 52 52 51 50 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 48 48 48 48 49 49 48 47 46 46 45 45 45 45 45 45 45 46 46 47 47 47 48 48 48 47 47 48 48 48 48 48 48 47 47 46 46 46 47 48 47 47 46 46 45 45 45 45 46 45 45 46 47 47 48 48 49 50 51 51 51 52 52 53 53 52 52 52 52 52 51 50 50 50 51 51 51 50 49 48 48 47 46 46 46 46 46 46 46 47 47 47 47 47 48 48 48 47 47 48 48 49 50 51 52 52 52 52 52 51 51 50 50 50 51 51 51 52 52 52 52 52 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 43 44 44 45 45 45 45 45 45 45 45 45 44 44 44 44 43 42 42 44 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 39 39 40 40 40 39 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 36 36 36 36 36 37 37 37 37 36 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 32 33 33 33 33 32 32 32 32 32 32 31 31 32 32 32 32 33 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 52 53 54 54 54 53 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 43 42 42 42 42 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 39 39 40 38 37 37 37 38 38 39 38 38 38 38 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 45 45 46 46 47 47 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 47 47 48 48 47 46 46 49 50 51 52 52 53 53 53 52 52 52 51 51 51 50 50 51 51 50 49 49 49 49 49 49 49 49 49 49 48 47 47 48 48 48 47 46 46 47 48 48 48 48 49 49 48 47 46 46 45 45 45 45 45 45 45 45 46 47 47 48 48 47 47 47 48 48 48 48 48 48 49 48 47 47 46 46 47 47 47 46 46 45 45 45 45 45 45 46 46 46 47 47 48 48 49 50 51 51 51 52 52 53 52 52 52 51 51 51 51 50 49 50 50 50 50 49 49 48 48 47 46 46 46 46 46 46 46 47 46 46 47 47 48 48 47 47 47 48 48 49 50 51 51 51 51 51 51 51 50 50 50 50 51 51 51 52 52 53 52 52 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 48 48 47 47 47 46 46 47 46 46 46 46 46 45 45 44 44 44 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 43 42 42 43 43 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 39 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 35 36 37 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 34 34 33 33 32 32 32 32 32 32 32 33 32 32 32 31 31 32 32 32 33 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 52 52 53 53 54 54 53 53 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 39 39 39 37 36 37 38 38 38 38 38 38 39 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 45 45 45 46 46 47 47 47 47 48 48 48 48 48 48 48 47 47 47 46 47 46 46 46 47 48 48 48 46 46 48 49 50 51 52 52 53 53 52 52 52 52 52 51 50 49 50 50 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 48 47 47 46 46 47 48 48 47 48 50 50 48 46 46 46 45 45 45 45 45 45 45 45 46 46 47 48 47 47 46 47 47 48 48 47 47 48 48 48 47 46 46 46 46 46 46 46 45 45 46 46 46 46 46 47 47 47 48 48 49 48 48 49 50 50 51 51 52 53 52 52 51 51 50 51 51 50 49 50 50 50 49 49 48 48 47 47 46 45 45 45 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 49 49 50 50 50 50 51 51 50 49 49 49 50 50 51 51 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 48 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 42 42 42 42 42 42 42 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 44 44 43 43 42 42 43 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 38 38 37 37 37 37 37 38 37 37 37 37 37 36 36 36 37 37 37 37 37 36 35 35 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 34 33 32 32 31 31 31 32 32 33 34 34 34 34 33 32 33 33 33 33 33 33 32 32 32 32 32 32 52 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 39 38 37 37 38 38 38 37 38 38 38 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 44 44 45 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 46 47 48 48 47 46 47 49 50 51 51 52 52 53 53 53 52 53 53 52 50 49 49 48 48 49 48 48 49 49 49 49 49 49 49 48 47 47 47 48 47 46 46 46 47 47 47 48 48 49 49 48 47 46 46 45 45 45 45 45 45 45 45 46 46 47 47 47 47 46 46 47 47 47 47 47 47 47 47 46 46 46 46 45 45 46 46 46 46 46 47 47 48 48 48 47 48 48 49 49 49 49 49 50 50 50 51 52 52 52 51 51 50 49 50 50 49 49 49 50 50 49 49 48 47 47 47 46 45 45 45 45 45 45 46 46 46 47 47 47 47 46 46 46 47 47 48 48 49 49 50 50 50 51 51 50 49 48 48 49 49 50 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 52 52 52 51 51 51 50 50 50 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 42 42 42 42 42 42 42 42 42 43 43 43 44 44 45 45 45 45 45 45 45 45 45 44 44 43 42 42 43 44 44 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 37 37 38 38 37 37 37 38 38 38 37 37 37 37 37 36 36 37 37 37 37 37 37 37 36 36 36 36 37 37 36 36 36 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 31 31 31 31 31 31 31 33 33 34 34 34 33 32 33 33 33 33 33 33 32 32 32 32 32 32 52 52 53 53 53 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 42 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 38 37 37 37 38 37 37 38 38 38 38 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 45 46 47 47 47 46 47 48 49 50 51 52 52 53 53 53 53 53 53 52 51 50 49 48 48 48 48 48 48 48 49 49 49 49 49 48 47 47 47 48 47 46 46 46 47 47 47 48 48 48 49 49 48 48 47 46 45 45 45 45 45 45 45 45 46 47 47 47 47 46 46 47 47 47 47 46 46 46 46 45 45 46 46 45 45 46 46 45 46 46 47 48 48 48 48 48 48 48 48 49 49 49 50 50 50 51 52 52 52 51 50 50 49 48 49 49 48 48 49 50 50 49 49 48 47 47 47 46 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 47 47 47 48 49 49 49 49 50 50 51 50 49 48 48 48 49 49 50 50 50 50 50 51 52 52 52 51 51 51 51 51 51 51 51 51 52 52 51 51 51 50 50 50 49 49 49 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 43 44 45 45 45 45 45 45 45 45 45 45 44 44 43 43 42 42 42 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 37 37 38 37 37 37 38 38 38 38 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 31 31 31 31 31 31 30 31 32 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 43 42 42 42 42 43 43 43 42 42 43 43 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 37 37 37 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 41 41 41 41 41 41 41 42 43 43 43 42 42 42 43 43 43 42 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 45 46 46 46 45 46 48 48 49 51 52 52 53 53 53 53 53 53 52 51 50 49 48 48 48 48 48 48 48 48 48 49 49 49 48 47 47 47 47 47 46 46 46 47 47 47 48 48 48 49 49 49 49 48 47 46 45 45 45 45 45 45 45 46 47 47 47 47 46 46 47 46 46 46 46 46 45 45 45 44 45 45 45 45 46 45 45 46 47 47 47 48 48 48 48 48 48 48 49 49 50 50 50 50 50 51 51 51 50 49 49 48 47 47 48 48 48 48 49 50 49 49 48 47 47 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 47 47 48 48 49 49 49 49 50 50 50 49 48 48 48 48 49 49 49 49 50 50 51 52 52 52 51 51 50 50 50 51 51 51 51 51 52 52 51 51 51 50 50 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 44 44 45 45 45 45 45 45 46 46 45 45 44 44 43 43 42 42 42 42 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 31 31 31 31 32 32 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 49 49 50 50 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 38 38 38 38 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 41 41 41 41 41 41 41 42 42 43 42 42 42 43 43 43 42 42 42 42 43 43 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 45 45 45 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 48 48 48 47 47 47 46 46 46 46 46 46 46 47 47 49 50 51 52 53 53 53 53 53 53 52 51 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 47 47 47 47 48 48 48 49 49 49 49 48 47 47 46 45 45 45 45 45 45 46 47 47 47 47 46 46 46 46 46 45 45 45 45 45 44 44 44 44 45 45 45 45 45 46 47 48 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 49 48 48 47 46 47 47 47 48 48 49 49 49 49 49 48 47 47 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 49 49 50 50 49 49 49 48 48 48 49 49 49 50 50 51 51 52 51 51 51 51 50 50 50 51 51 51 51 51 51 52 52 51 51 50 50 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 44 44 45 45 45 46 46 46 47 46 46 46 45 44 43 43 43 42 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 36 36 36 36 35 35 35 36 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 33 32 32 32 32 32 32 32 31 31 32 31 31 31 31 32 32 32 33 33 33 33 33 33 34 34 34 33 33 33 33 51 51 51 51 52 52 52 52 52 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 48 48 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 38 37 37 38 38 39 38 38 39 39 39 39 39 40 39 39 39 40 40 40 40 41 41 41 41 41 42 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 46 46 46 46 45 45 46 46 46 46 47 47 47 47 47 48 48 48 48 48 49 49 49 48 47 47 47 47 47 47 47 46 46 45 46 47 48 50 51 52 52 53 53 53 52 52 52 52 51 49 49 49 48 48 48 48 47 47 47 47 48 48 48 47 47 47 47 46 46 46 47 48 47 47 48 48 48 48 49 49 49 48 48 47 46 45 45 45 45 45 45 46 47 47 47 47 46 45 46 46 46 45 45 45 44 44 43 43 43 44 45 45 45 45 46 47 47 47 48 49 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 49 48 48 47 46 46 46 46 47 47 48 48 49 49 50 50 49 49 47 45 45 45 45 45 45 45 46 46 46 46 46 47 47 46 45 45 46 46 46 47 47 48 49 49 49 50 50 50 49 49 48 48 48 48 49 49 50 50 51 52 51 51 51 51 51 50 50 50 50 51 51 51 51 51 52 52 51 51 51 50 49 49 49 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 44 44 45 45 45 46 46 47 47 47 47 46 45 44 44 43 43 42 42 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 37 36 36 36 36 37 36 36 37 37 37 37 37 36 36 36 36 36 35 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 34 33 32 32 32 32 32 32 32 32 32 31 31 31 31 31 32 32 32 32 33 33 33 34 34 34 34 34 34 34 33 51 51 51 51 52 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 38 37 37 38 39 39 39 39 40 40 39 39 39 40 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 46 45 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 48 48 48 49 48 47 47 47 47 47 47 46 46 46 45 46 47 48 49 51 51 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 47 47 47 48 48 49 49 48 48 48 47 46 45 45 45 45 45 45 45 46 46 46 46 46 45 46 46 45 44 45 45 44 43 42 42 43 44 45 46 45 45 46 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 50 49 49 48 48 47 46 46 46 46 47 47 48 48 48 48 48 49 49 48 46 45 45 45 45 45 46 46 47 47 47 47 47 47 46 46 45 45 46 46 46 47 48 48 48 48 49 49 50 49 49 49 48 48 48 48 49 49 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 51 51 51 51 51 52 51 51 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 44 45 45 45 46 46 47 47 47 47 46 45 45 44 44 43 42 41 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 31 31 32 32 32 32 32 33 33 33 34 34 34 34 34 34 34 51 51 51 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 48 48 48 48 48 47 47 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 40 39 37 37 37 37 38 38 39 40 40 40 40 40 39 39 39 39 39 40 40 40 41 41 41 41 41 41 41 40 40 41 41 41 42 42 42 42 42 42 42 43 42 42 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 48 48 49 48 48 47 47 46 46 46 47 47 46 45 46 47 48 49 50 51 51 51 52 52 52 52 52 52 51 50 50 49 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 46 47 47 48 48 47 46 46 47 47 48 49 48 48 48 48 47 46 45 45 45 45 45 45 45 46 46 46 45 45 45 46 45 45 44 44 44 44 43 42 42 44 44 44 44 44 45 46 47 47 47 47 47 47 47 48 48 48 48 47 47 47 48 48 49 49 49 48 48 48 47 46 46 45 46 46 46 47 47 48 48 47 47 47 46 45 45 45 45 45 45 45 46 46 47 46 46 47 47 46 46 46 45 45 45 46 46 47 48 48 48 48 49 49 50 49 49 49 48 47 48 48 49 50 50 50 50 51 51 50 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 51 51 51 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 45 45 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 43 44 44 45 45 46 46 47 47 47 46 46 46 45 45 44 43 42 41 42 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 33 33 33 32 31 31 32 32 32 32 32 33 33 33 33 34 34 34 34 34 51 51 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 48 48 49 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 40 39 38 37 37 37 37 37 37 39 39 40 40 40 39 38 38 39 39 40 40 40 41 41 41 41 41 41 41 40 40 41 41 41 42 42 42 42 42 42 42 43 42 42 42 42 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 47 47 47 47 48 48 48 48 49 49 49 48 47 47 46 46 46 47 48 47 46 45 46 47 48 49 50 51 51 51 51 51 51 52 51 50 50 50 49 49 49 49 49 49 48 47 47 46 46 46 46 46 46 46 47 47 48 48 48 47 46 46 47 47 48 48 48 48 47 47 47 46 45 45 45 45 45 45 45 46 46 45 45 45 45 46 45 44 44 43 43 43 42 41 43 44 44 43 44 44 45 46 47 47 47 46 46 46 47 47 47 48 48 47 46 46 47 48 48 48 48 48 47 47 46 46 45 45 46 46 46 46 47 48 48 47 46 46 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 46 47 47 48 48 48 49 49 49 49 49 48 47 47 47 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 51 51 50 51 51 51 51 51 51 50 50 50 50 50 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 46 46 47 47 47 46 46 46 46 45 44 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 33 33 33 32 31 31 31 32 32 32 32 32 32 32 33 33 34 33 33 34 51 51 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 47 48 48 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 48 48 48 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 40 39 39 38 37 37 36 36 38 38 39 39 40 39 38 38 39 39 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 47 47 47 47 48 48 48 49 49 49 48 47 46 46 46 46 47 47 47 46 45 45 47 47 48 50 50 50 51 51 51 51 52 51 51 50 50 50 50 50 50 49 49 49 48 47 46 46 46 46 46 47 47 48 48 48 49 48 47 46 46 47 47 48 48 48 47 47 47 46 46 45 45 45 45 45 45 45 45 46 45 44 44 45 46 45 45 44 44 43 43 42 41 42 43 43 43 44 45 45 46 47 47 47 46 46 46 46 46 46 47 47 46 45 45 46 47 47 48 48 47 47 46 45 45 45 45 45 45 46 46 47 47 47 46 46 45 45 45 45 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 46 46 47 47 48 48 48 49 49 49 48 48 48 47 47 47 48 48 48 48 49 48 48 49 49 50 50 50 50 50 50 50 51 51 51 51 52 52 51 51 51 50 50 50 50 50 50 49 49 48 48 48 48 47 47 47 48 48 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 45 46 46 46 46 47 47 47 46 46 45 45 44 43 43 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 31 31 32 32 32 32 32 32 32 33 33 34 33 33 34 51 51 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 48 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 45 45 46 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 44 43 43 43 43 43 42 42 43 42 41 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 40 40 40 40 40 40 39 38 38 37 36 37 38 38 39 39 38 38 38 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 47 47 48 48 49 49 48 47 46 46 46 46 46 47 47 46 45 45 46 47 48 48 49 49 50 51 51 52 52 51 51 51 50 50 50 50 50 50 50 50 49 48 47 46 46 46 46 47 47 47 47 48 49 48 47 46 46 47 47 48 48 48 47 47 47 46 45 44 44 44 45 45 45 45 46 45 44 44 44 45 45 45 45 44 44 44 43 42 41 41 41 42 43 44 44 45 45 46 46 46 46 45 45 45 45 46 46 46 45 45 46 46 47 47 47 47 47 46 46 45 45 45 45 45 45 46 46 47 47 46 46 45 45 45 45 45 45 45 45 46 47 47 46 45 45 45 45 45 46 46 46 46 46 46 46 46 47 47 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 48 49 49 50 51 51 51 50 50 50 50 51 51 51 51 52 51 51 51 51 51 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 46 46 46 46 46 47 47 47 46 46 46 45 45 44 44 43 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 31 31 32 32 32 32 32 32 32 32 33 33 33 33 34 51 51 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 47 47 48 48 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 44 44 43 43 43 44 44 43 43 43 42 42 42 42 42 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 36 37 38 38 38 38 38 39 39 40 40 40 41 41 41 41 40 40 40 40 40 41 41 41 42 42 43 43 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 44 44 45 45 46 46 46 46 46 46 46 47 47 48 48 48 49 48 47 46 45 45 45 45 45 45 45 45 45 46 47 47 48 48 49 50 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 48 48 47 46 46 46 46 46 47 48 48 48 47 46 46 46 47 47 48 47 47 47 46 46 44 44 44 44 44 44 45 45 45 44 43 44 45 45 45 44 44 44 43 43 42 41 41 41 42 42 43 43 44 44 45 46 46 46 46 45 45 45 45 46 46 45 45 45 46 46 46 46 46 46 46 46 45 44 44 45 45 45 46 47 47 46 46 45 45 45 44 44 44 45 45 46 46 46 46 46 46 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 48 48 48 47 47 47 47 46 47 47 47 47 47 47 48 48 49 49 50 50 50 51 51 51 51 50 51 51 51 51 51 51 51 51 50 51 51 51 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 46 45 45 45 46 46 47 47 47 46 46 46 45 45 44 44 43 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 33 34 51 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 47 48 48 49 49 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 41 41 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 39 38 37 36 36 37 37 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 42 42 42 42 42 42 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 44 44 45 45 45 46 46 46 46 46 46 47 47 48 48 48 48 48 47 46 45 45 45 45 45 45 45 44 44 45 46 47 48 48 48 49 50 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 46 46 46 47 47 47 47 47 47 46 46 46 47 47 46 47 47 46 45 44 44 44 44 44 44 45 45 45 44 43 43 45 45 44 44 44 44 43 43 41 41 41 42 43 43 43 44 44 45 45 46 46 45 45 44 45 45 45 46 46 45 44 45 45 45 45 45 45 45 45 45 44 44 44 45 46 46 47 46 46 45 45 45 44 44 44 44 44 45 46 46 46 46 46 46 45 45 45 45 45 46 46 45 45 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 47 48 48 48 48 47 48 48 49 49 50 50 51 51 51 51 51 51 51 50 50 50 51 51 51 50 50 51 51 51 51 51 50 49 49 48 48 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 45 45 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 46 46 47 47 47 46 46 46 45 45 45 44 43 42 42 43 43 43 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 33 33 32 32 32 32 32 31 31 31 32 32 32 32 32 32 32 32 33 34 34 34 51 52 52 52 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 47 48 49 49 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 42 43 43 43 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 37 37 37 36 37 39 39 40 40 40 40 40 40 40 40 40 39 39 40 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 45 45 45 46 46 46 46 46 47 48 48 48 48 48 48 47 46 45 45 46 46 46 46 46 45 44 45 46 47 47 48 48 49 49 50 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 47 46 46 45 46 47 47 47 47 47 46 45 46 47 47 46 46 46 46 45 44 44 44 44 44 44 45 45 44 43 43 43 45 45 44 43 43 43 43 42 41 41 41 42 43 44 44 44 45 45 45 45 45 45 44 44 44 45 45 45 45 44 44 45 45 45 44 44 44 44 44 44 44 45 45 45 46 46 46 46 45 45 45 45 44 44 44 44 44 45 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 48 48 48 48 49 49 50 50 50 51 51 51 51 51 51 50 50 50 51 51 50 51 51 51 51 51 51 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 46 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 46 46 46 47 46 46 45 46 46 46 45 44 43 41 41 42 43 44 44 44 44 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 33 33 33 51 51 51 51 51 51 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 48 48 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 39 38 37 37 38 40 39 39 39 39 39 39 39 39 39 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 44 45 45 45 45 46 46 46 46 47 47 48 48 48 48 48 46 46 46 46 46 46 46 46 46 44 44 46 46 47 47 48 48 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 47 47 46 45 46 46 46 46 46 46 46 45 44 44 44 44 44 44 45 44 44 43 42 44 45 44 44 43 43 43 43 42 41 41 41 42 43 44 44 44 45 46 45 45 44 44 44 43 44 44 44 43 44 44 45 45 44 44 44 43 43 43 44 44 45 45 46 46 46 46 46 46 46 46 45 45 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 46 46 46 46 46 46 45 45 45 45 46 46 47 47 47 47 47 48 48 49 49 49 48 48 49 49 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 52 51 50 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 44 44 45 45 45 45 46 46 45 45 45 45 46 46 45 44 43 42 42 41 41 42 43 44 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 33 33 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 45 45 45 44 44 45 44 44 44 44 44 43 43 43 42 42 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 40 40 39 38 37 38 38 38 39 39 39 39 39 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 46 46 46 46 47 47 48 48 48 48 47 46 46 46 46 46 46 46 46 45 44 44 46 47 47 47 47 48 48 49 49 49 49 50 50 50 50 51 50 50 50 49 49 48 48 48 48 48 48 47 47 47 47 46 45 46 46 46 46 47 46 45 46 46 46 46 47 46 46 46 45 43 43 43 44 45 44 44 43 42 42 44 44 43 43 43 43 42 42 42 42 41 40 41 42 43 44 44 45 45 45 45 44 43 43 43 43 43 43 43 44 45 45 45 44 43 43 43 43 44 44 45 46 46 46 47 47 47 47 46 46 46 45 45 44 44 44 44 45 45 45 45 45 45 44 44 44 44 44 44 45 45 46 46 46 46 46 46 45 45 45 45 45 46 47 47 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 50 50 50 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 52 51 50 49 49 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 46 46 45 44 44 43 43 42 40 40 42 43 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 39 39 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 33 34 34 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 43 43 44 44 44 43 43 42 42 41 41 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 44 44 45 45 46 46 46 47 48 48 48 49 48 47 46 46 46 46 46 46 46 46 45 44 45 47 47 47 47 47 47 48 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 49 48 48 48 48 47 46 46 46 46 45 46 47 46 46 46 46 45 45 45 45 46 46 46 45 46 45 43 43 43 44 44 44 43 43 42 41 42 42 41 40 40 41 41 41 42 42 41 40 40 42 43 44 44 44 45 45 44 43 43 43 43 43 42 42 43 44 45 45 44 43 43 43 44 45 45 45 46 46 46 46 47 47 47 47 46 46 45 45 44 44 44 43 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 45 45 45 45 45 46 47 48 48 48 48 48 49 49 49 49 49 49 49 49 48 48 49 49 50 50 50 51 51 51 51 51 50 49 50 50 51 51 51 51 52 52 51 50 50 49 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 42 40 40 41 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 34 34 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 44 44 43 43 42 41 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 40 38 37 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 42 42 42 42 42 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 46 46 46 47 47 48 48 48 48 47 47 46 46 46 46 45 45 45 45 44 45 47 47 47 47 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 49 49 48 48 48 48 47 46 46 46 46 45 45 46 47 46 46 45 45 45 45 45 46 46 45 45 45 44 43 43 43 43 44 44 44 43 42 41 40 40 40 40 40 40 40 40 40 41 41 40 40 42 43 43 44 44 44 44 44 43 42 42 42 42 42 42 43 43 44 44 43 43 43 44 45 46 46 46 46 46 46 46 46 47 47 46 46 46 45 45 44 44 44 43 43 43 44 44 44 44 44 44 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 45 45 46 46 47 47 47 48 48 48 49 49 49 49 49 49 48 48 48 48 49 50 50 50 50 50 50 50 50 50 49 50 50 50 51 51 51 52 51 51 51 50 49 48 48 48 48 48 48 48 48 48 48 49 49 49 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 41 41 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 35 36 36 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 33 33 34 34 34 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 39 37 37 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 46 46 47 48 48 48 48 47 47 47 46 46 46 45 44 44 44 44 45 46 46 47 47 47 47 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 45 45 46 46 46 46 45 45 45 45 46 46 45 45 45 45 44 43 43 43 44 44 45 44 43 43 41 40 40 42 42 42 41 41 39 39 40 41 41 41 41 42 43 43 43 43 43 43 43 42 42 42 41 42 42 42 43 43 43 43 44 44 45 46 46 47 46 46 45 45 46 46 47 47 46 46 45 45 45 45 44 44 43 43 43 44 44 44 45 45 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 48 48 48 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 50 49 49 50 50 50 50 51 51 51 51 51 51 51 50 49 49 48 48 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 46 45 45 44 44 44 43 43 43 41 40 41 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 37 37 37 36 36 37 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 32 33 33 32 32 32 33 32 32 33 34 34 33 33 34 34 34 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 50 51 51 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 42 42 42 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 40 39 37 36 37 39 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 44 43 43 44 44 45 45 45 45 46 47 47 48 48 48 48 47 47 46 46 46 45 44 44 43 44 45 45 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 45 45 45 46 46 46 45 45 45 45 46 46 45 45 45 44 43 43 43 43 44 44 44 44 43 42 40 41 43 44 44 44 43 42 40 39 40 40 40 41 41 41 41 42 42 42 42 42 41 42 42 42 42 42 43 44 43 43 43 44 44 45 46 46 46 46 46 45 45 45 45 46 47 47 46 46 45 45 45 45 44 44 43 43 43 44 44 45 45 46 46 46 46 45 45 45 46 46 46 45 45 45 45 45 45 45 45 46 46 46 47 47 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 50 50 50 49 49 50 50 50 50 50 50 51 51 51 50 50 50 49 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 46 45 44 44 44 43 43 43 43 42 41 40 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 32 32 32 32 32 32 32 32 33 32 32 32 32 33 34 33 33 33 34 34 34 34 34 34 34 51 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 47 48 48 49 49 49 49 50 50 50 50 50 50 50 51 51 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 40 40 41 40 40 40 40 39 38 37 36 37 39 40 40 40 40 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 45 45 44 43 43 44 44 45 45 45 45 46 46 47 47 48 48 48 47 47 46 46 46 45 45 44 44 43 44 45 46 46 46 46 47 47 47 47 48 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 48 47 45 45 45 45 46 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 44 43 43 43 42 41 41 43 44 45 45 44 43 42 40 39 40 40 40 41 41 41 41 41 41 41 41 41 41 42 43 43 43 43 44 45 45 45 45 45 45 45 46 46 46 46 46 45 45 45 45 46 46 46 46 46 45 45 45 45 44 44 43 43 43 44 44 45 45 45 45 45 45 45 45 45 46 45 45 45 44 44 44 45 45 45 45 46 46 46 47 47 47 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 46 45 44 43 43 43 43 43 43 43 42 40 41 42 42 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 36 36 35 36 36 37 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 32 32 32 32 33 32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 48 48 49 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 50 50 50 50 50 49 49 50 50 50 49 49 48 48 48 47 47 47 46 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 39 37 36 36 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 41 41 41 42 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 45 44 44 43 43 44 44 44 45 45 45 46 46 46 47 47 48 48 47 47 46 46 46 45 45 45 44 44 43 44 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 45 45 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 44 43 42 42 41 41 41 42 44 45 45 44 43 42 41 39 39 39 39 40 41 41 41 41 41 41 41 41 42 43 43 43 44 44 45 45 46 46 46 46 46 46 45 45 46 45 45 45 44 45 45 45 45 46 46 46 45 45 45 44 44 44 44 43 43 43 43 44 44 44 44 45 45 45 45 45 46 45 45 45 44 44 44 44 45 45 45 45 46 46 46 46 46 46 47 48 48 48 48 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 50 50 49 49 50 50 51 51 50 50 50 50 50 50 51 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 45 44 43 43 43 43 43 43 43 42 41 40 41 42 42 43 43 43 43 42 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 36 37 37 37 37 36 36 37 37 36 35 35 35 35 35 35 36 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 32 33 33 33 33 32 32 32 32 32 32 32 32 33 33 34 33 33 33 33 33 34 34 34 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 48 48 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 39 37 36 37 38 39 39 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 41 41 42 42 41 41 41 42 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 44 44 44 45 45 45 46 46 46 47 47 47 48 47 47 46 46 46 46 45 45 44 43 44 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 46 46 45 45 45 45 44 44 44 44 44 44 45 44 44 43 43 43 43 43 43 42 41 41 41 42 42 44 45 45 44 44 44 43 42 40 39 39 39 39 40 40 40 40 41 41 41 42 43 43 44 44 44 45 45 45 45 45 45 45 46 46 46 45 45 45 44 44 44 45 45 45 46 46 46 46 45 45 44 44 44 44 44 43 43 43 43 44 44 44 44 44 45 45 45 46 45 45 45 44 44 43 44 44 44 44 44 45 45 45 46 46 46 46 47 47 48 48 48 49 49 49 48 48 48 48 48 49 49 49 49 49 48 48 49 49 49 49 50 51 51 51 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 47 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 43 43 44 44 45 45 45 44 43 43 43 42 42 43 43 43 41 40 40 41 42 43 43 42 42 42 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 37 37 35 34 34 35 36 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 35 35 35 35 35 34 34 34 34 34 34 34 33 33 32 33 34 33 33 33 32 32 32 32 32 32 32 32 33 33 34 34 33 33 33 33 34 34 34 50 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 51 50 50 50 50 50 51 50 50 49 49 48 48 48 47 47 47 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 40 39 37 36 38 39 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 42 42 41 40 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 44 44 44 44 43 43 43 43 44 44 44 45 45 45 45 46 46 47 47 47 47 46 46 45 45 45 45 44 43 42 44 46 46 45 45 45 46 46 47 47 47 48 48 48 48 48 48 49 48 48 49 49 48 48 48 48 48 48 48 47 47 46 46 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 44 43 42 42 43 43 43 44 45 45 44 43 43 43 43 42 40 38 38 39 40 40 41 41 41 41 41 41 41 42 43 43 43 44 44 44 44 45 45 45 45 46 46 46 45 45 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 44 44 43 43 44 44 44 44 44 44 44 45 45 45 45 46 46 47 47 48 49 49 49 49 48 48 47 47 48 48 48 48 48 48 48 48 48 48 49 50 51 51 51 51 51 51 51 51 51 51 50 50 48 48 48 48 49 48 48 48 48 48 48 48 49 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 43 43 43 44 45 45 44 44 43 43 42 42 42 43 43 42 42 41 40 40 41 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 35 35 36 36 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 36 35 35 35 35 35 34 34 34 34 34 34 33 33 33 33 34 33 33 33 33 32 32 32 32 32 32 33 34 34 34 34 34 34 34 34 34 34 34 50 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 49 49 49 49 49 49 48 48 49 49 49 49 49 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 51 51 50 50 50 49 49 50 49 49 49 49 50 50 51 50 50 49 49 49 48 48 47 47 46 46 46 46 46 45 45 45 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 39 37 37 38 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 40 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 43 43 44 44 45 45 45 45 46 46 47 47 47 46 45 45 45 44 44 44 43 42 44 45 45 45 44 45 45 46 46 46 47 47 48 48 49 49 49 50 49 49 49 48 48 47 47 48 48 47 47 46 46 46 46 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 44 44 43 43 43 44 44 44 45 45 44 44 43 42 42 41 40 38 38 39 40 41 42 43 43 42 41 41 41 41 42 43 43 43 43 43 44 44 45 45 45 46 46 45 45 45 45 44 43 43 44 44 44 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 43 43 44 44 44 44 45 45 45 45 45 44 44 43 43 43 44 44 44 44 44 44 45 45 45 45 46 46 47 48 48 49 49 49 49 48 48 47 47 47 47 48 48 48 48 48 48 49 49 50 50 50 51 51 51 51 51 51 50 50 50 50 49 48 48 48 48 49 48 48 48 49 49 49 49 49 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 43 43 43 42 41 42 42 42 42 42 42 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 36 35 36 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 32 32 32 33 34 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 46 47 48 48 49 49 49 49 49 48 48 48 48 49 49 50 50 50 50 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 48 48 48 49 49 50 50 51 51 50 50 50 49 49 48 48 47 47 46 46 46 46 46 45 45 44 44 43 43 43 43 43 42 42 42 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 39 38 37 37 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 42 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 42 42 43 44 44 44 45 45 45 45 46 46 46 46 47 46 45 45 44 44 43 43 43 42 44 45 45 44 44 44 45 46 46 46 46 47 47 48 49 49 50 49 49 49 49 48 47 47 47 47 47 47 46 46 46 46 46 45 45 44 44 44 44 44 45 44 43 43 43 43 43 43 44 45 45 44 44 43 43 44 45 45 45 44 44 43 42 41 40 39 38 38 39 40 41 42 43 43 43 42 42 42 42 43 44 44 44 44 44 45 45 45 45 45 46 45 45 45 45 45 44 43 43 43 44 44 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 42 43 44 45 45 45 45 45 45 45 45 44 44 43 43 43 43 44 44 44 44 45 45 45 45 45 45 46 47 48 48 49 49 49 49 48 48 47 47 47 47 47 48 48 48 49 49 49 49 49 50 50 51 51 52 52 51 51 50 50 49 49 49 49 48 47 48 48 48 47 48 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 41 42 42 42 43 43 43 42 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 36 35 36 36 36 37 37 37 37 37 37 37 36 35 35 35 36 36 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 32 32 33 34 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 46 46 47 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 50 50 50 50 50 51 50 50 50 50 50 50 50 50 49 49 49 50 50 50 49 49 48 48 48 48 48 49 49 50 50 51 51 51 51 50 50 49 49 48 48 47 47 46 46 46 46 46 45 45 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 39 39 40 41 41 41 41 41 41 41 40 40 40 39 38 38 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 41 40 41 42 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 42 42 43 44 44 45 45 45 45 45 46 46 46 46 46 46 45 44 44 43 43 43 43 42 43 44 44 44 44 44 45 45 46 46 46 46 47 48 48 49 49 49 49 49 49 48 48 48 48 48 47 47 46 46 46 46 46 45 45 44 44 45 45 45 45 45 45 44 43 43 43 44 45 45 44 44 45 44 43 43 45 45 45 45 44 44 43 42 42 40 38 38 39 40 40 41 42 43 43 43 43 43 42 43 44 44 45 45 45 45 44 45 45 45 46 45 44 44 44 45 45 44 43 44 45 45 45 46 45 45 45 44 44 44 44 44 44 43 42 42 42 42 43 43 44 44 45 45 45 45 45 44 44 44 44 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 47 48 48 49 49 49 49 48 48 47 47 46 47 47 47 48 48 48 48 48 49 49 50 50 51 51 51 51 51 50 50 50 49 48 49 49 48 47 47 48 47 47 48 48 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 42 42 41 40 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 37 37 37 35 35 35 36 36 36 36 37 37 37 37 36 35 35 35 36 36 36 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 33 33 33 34 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 50 50 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 47 47 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 49 49 49 49 49 50 49 49 49 49 50 50 50 49 49 49 49 49 49 50 49 48 48 48 48 48 48 49 49 50 50 51 51 51 51 51 50 50 50 49 48 48 47 47 47 46 46 46 46 45 45 45 44 44 44 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 39 39 39 40 40 40 41 41 41 41 41 40 40 40 39 37 37 39 40 40 40 40 40 40 40 40 41 41 40 40 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 41 40 41 41 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 42 43 44 44 44 45 45 45 45 45 46 46 46 46 46 45 45 44 43 43 43 43 42 43 43 43 44 44 44 45 45 46 46 46 46 46 47 47 48 48 48 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 43 43 44 44 43 43 43 44 43 43 44 45 45 45 45 45 45 44 44 44 42 39 38 39 40 40 41 42 42 43 43 44 43 43 43 44 44 44 44 44 44 44 44 45 45 46 45 45 44 44 44 44 43 43 44 45 45 45 46 46 45 45 45 45 44 44 44 43 43 42 42 42 42 43 43 44 44 45 44 45 45 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 46 46 47 47 47 48 48 49 49 49 48 48 47 46 46 46 47 47 48 48 48 48 48 49 49 50 50 51 51 51 51 50 50 50 50 49 48 48 48 48 48 47 47 48 48 48 48 48 49 49 48 48 48 48 47 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 43 43 43 43 43 43 42 41 40 40 39 39 40 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 36 35 36 35 34 35 35 35 36 36 36 36 36 36 36 35 35 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 50 50 50 50 51 50 50 50 50 50 50 50 50 50 49 49 49 49 48 48 47 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 48 48 48 48 49 49 48 47 47 47 47 48 49 49 50 50 50 50 50 51 51 51 51 50 49 49 48 48 47 47 47 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 39 39 39 39 39 40 40 40 41 41 41 40 40 40 38 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 42 43 42 42 41 40 40 41 41 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 44 44 44 45 45 45 45 46 46 46 46 46 46 46 45 43 43 43 42 42 43 43 43 43 43 44 44 45 46 46 46 46 46 46 46 47 47 48 48 49 49 49 49 49 48 48 47 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 44 44 44 43 42 39 38 39 40 40 41 41 43 43 44 44 44 43 43 44 44 44 44 44 44 44 44 45 45 46 46 45 44 44 44 44 43 43 44 44 45 45 45 45 45 45 45 45 44 44 44 43 43 42 42 42 42 42 43 44 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 46 46 46 47 47 48 48 48 49 48 48 49 48 48 47 46 46 47 47 47 48 48 48 48 48 49 49 50 50 51 50 50 50 50 50 51 50 49 48 48 48 48 47 47 48 48 48 48 48 49 49 48 48 48 48 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 42 42 41 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 37 37 37 38 38 38 38 38 38 37 36 35 34 34 34 35 36 36 36 36 35 35 35 35 35 35 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 51 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 47 47 47 47 47 47 46 46 47 47 47 47 47 47 48 48 48 48 48 48 49 49 48 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 48 48 48 47 47 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 39 40 40 40 40 40 39 37 37 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 43 43 42 43 43 44 44 44 45 45 45 45 45 46 46 46 46 46 45 44 43 43 42 42 42 43 42 43 43 43 43 44 45 46 46 46 46 46 46 46 47 47 47 48 48 49 49 49 48 47 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 45 44 44 43 43 43 44 44 45 45 45 45 45 44 44 43 43 43 43 43 42 41 39 38 39 39 40 41 42 43 43 44 44 44 44 44 44 44 44 44 43 44 44 45 45 45 46 46 45 44 44 43 43 43 43 43 44 45 45 45 45 45 45 45 45 44 44 44 44 43 42 42 41 41 42 43 44 44 44 43 42 43 43 44 44 44 44 44 44 45 44 44 44 44 44 45 45 45 46 46 46 47 47 47 47 48 48 48 48 49 48 48 47 46 47 47 47 47 47 47 47 47 48 48 49 49 50 50 50 49 50 50 51 50 50 49 48 48 48 48 47 48 48 49 49 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 42 41 41 41 41 40 40 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 36 34 34 34 35 36 36 36 35 35 35 35 35 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 51 50 50 50 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 48 48 47 46 46 47 47 46 46 46 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 49 49 49 49 49 49 49 49 50 51 50 50 49 49 48 48 48 47 47 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 39 40 40 40 39 38 37 38 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 45 45 44 44 44 44 43 43 43 42 42 43 43 43 44 45 45 45 45 45 45 45 46 46 46 46 45 43 43 43 42 41 41 41 42 43 43 43 44 45 45 45 46 45 45 45 46 46 46 46 47 48 48 49 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 45 45 45 46 46 46 45 45 44 43 43 43 43 43 43 42 42 40 38 38 39 40 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 45 46 45 45 44 44 43 43 43 44 44 44 44 44 45 45 45 45 45 45 44 44 44 43 43 43 42 41 41 42 43 44 44 43 42 42 43 44 44 45 45 45 45 45 45 44 44 44 44 44 45 45 45 45 45 46 46 47 47 47 47 48 48 48 49 48 47 46 46 46 46 47 47 47 47 47 48 48 48 49 49 50 50 49 49 50 51 51 50 50 49 48 48 48 47 47 48 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 41 41 41 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 37 35 34 34 35 36 36 36 35 35 35 35 36 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 35 35 35 34 34 34 34 34 34 33 33 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 51 50 50 50 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 47 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 49 49 49 49 49 49 49 50 50 51 50 49 49 49 48 48 48 47 47 46 46 45 45 45 45 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 39 40 40 39 38 37 37 39 40 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 41 41 41 40 40 41 42 42 43 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 43 43 43 43 42 42 42 42 43 44 44 44 45 45 45 45 45 45 46 45 45 44 43 43 43 42 42 41 41 41 42 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 46 46 45 45 46 46 46 45 45 45 45 44 43 43 43 42 42 42 43 43 42 40 38 38 40 41 42 42 43 43 42 42 42 42 42 43 43 42 42 43 44 45 45 45 46 45 44 44 44 43 43 43 44 44 44 44 44 45 45 46 46 45 45 44 44 44 43 43 43 42 41 41 42 43 43 43 42 42 43 44 44 44 44 45 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 46 46 47 47 47 47 47 48 48 48 47 46 46 46 46 46 46 46 47 47 48 48 48 49 49 50 50 49 49 50 51 51 50 49 49 49 48 48 47 47 48 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 47 48 48 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 44 45 45 44 44 43 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 43 44 44 44 44 44 44 43 43 43 42 41 42 42 41 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 35 35 36 36 36 35 35 35 35 35 36 37 37 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 34 34 34 34 34 34 33 33 34 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 51 51 50 50 50 50 49 49 49 49 49 49 49 50 50 49 49 49 48 48 49 49 49 49 49 48 48 47 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 49 49 48 48 48 48 47 47 46 46 45 45 45 45 45 44 44 43 43 43 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 39 39 38 37 38 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 42 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 44 44 44 43 43 43 43 43 42 42 42 42 43 43 44 44 44 45 45 45 45 45 45 44 44 43 43 43 43 43 42 41 41 41 42 42 43 43 43 44 44 45 45 45 45 45 45 46 46 46 46 46 46 46 46 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 43 43 42 42 41 42 42 42 42 42 40 38 39 40 41 41 41 42 41 41 41 42 42 42 42 42 43 44 44 45 45 45 46 45 44 44 44 43 42 42 43 43 43 44 44 45 45 45 46 45 45 44 44 44 43 43 43 42 41 41 41 41 42 42 42 42 43 44 44 44 44 44 44 44 44 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 47 46 46 46 46 46 46 46 47 47 47 48 48 49 49 49 49 49 49 50 50 50 50 49 49 49 49 48 47 47 48 48 49 49 49 49 48 48 48 48 48 48 49 48 47 47 47 46 46 46 47 47 47 48 47 47 47 46 46 46 46 46 46 46 45 45 45 45 44 44 44 44 44 45 44 44 43 43 43 43 44 44 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 44 44 44 43 43 43 42 42 42 42 42 42 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 36 35 35 36 36 36 36 37 37 37 36 35 35 35 35 35 35 35 34 34 35 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 47 47 48 49 49 49 49 49 48 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 49 49 50 50 50 50 49 49 49 48 48 48 47 46 46 46 45 45 45 45 44 44 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 40 40 39 38 38 38 38 37 37 39 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 42 42 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 44 44 44 43 43 43 43 43 43 43 42 42 42 43 43 43 44 44 45 45 45 45 45 45 44 44 44 43 44 44 43 41 41 41 41 42 42 42 43 43 44 44 44 45 44 44 44 45 45 45 45 46 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 45 45 45 45 45 44 44 43 43 43 42 41 41 41 41 41 41 41 39 38 39 39 40 40 41 41 41 42 42 42 43 43 43 43 44 44 44 45 45 46 45 45 44 44 44 43 42 42 42 43 43 44 44 45 45 45 45 45 45 45 45 44 44 44 44 43 42 41 41 41 41 42 43 43 43 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 46 46 46 46 46 47 46 46 46 46 46 46 46 47 47 48 48 48 48 48 49 49 49 49 49 50 50 50 50 49 49 49 49 48 47 47 47 48 48 49 48 48 48 47 48 48 48 49 49 49 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 44 44 43 43 42 42 42 42 43 43 42 41 41 40 39 39 40 41 41 41 41 41 41 41 41 41 40 40 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 34 34 34 35 35 35 35 35 34 33 34 35 34 34 34 35 34 34 34 34 34 35 35 35 36 36 35 35 35 35 51 50 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 47 47 48 48 49 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 47 47 47 47 47 48 48 49 49 50 50 50 49 49 49 49 48 48 47 47 46 46 45 45 44 44 44 44 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 38 37 38 37 37 39 39 39 39 40 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 41 41 41 41 40 40 40 42 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 45 44 44 44 44 43 43 43 43 43 43 42 42 41 42 42 43 43 44 44 44 45 45 45 45 45 45 44 43 43 43 43 41 41 41 41 41 41 41 42 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 42 42 41 41 41 41 40 39 39 39 40 41 41 41 42 42 43 43 43 43 43 44 44 44 44 44 45 45 45 45 44 44 44 44 43 43 43 42 42 43 43 44 44 44 45 45 45 44 44 45 44 44 44 43 43 43 42 41 41 41 42 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 46 46 45 45 45 46 45 45 46 46 46 47 47 47 47 47 48 48 48 48 48 48 48 49 50 50 51 50 50 49 49 49 49 48 47 46 47 47 48 49 48 47 47 48 48 49 49 49 49 48 48 47 47 47 47 47 47 47 48 47 47 47 47 47 47 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 44 45 44 44 45 45 44 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 44 43 42 42 42 42 43 43 43 43 42 41 40 39 39 40 41 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 34 34 35 35 34 34 35 34 33 34 35 34 34 34 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 51 51 50 50 50 50 50 50 49 49 49 49 49 48 47 47 47 47 47 47 47 47 48 47 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 47 48 48 49 50 50 50 50 50 49 49 49 48 48 47 47 46 46 46 45 44 44 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 37 37 39 39 39 40 40 40 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 41 41 41 41 40 40 41 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 44 44 44 43 43 43 43 43 42 42 41 42 42 42 43 43 44 44 44 44 44 45 45 44 43 43 42 41 41 41 40 40 41 41 41 41 42 42 43 43 43 43 44 44 43 44 44 44 44 45 45 45 44 44 44 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 42 41 41 41 41 39 38 40 41 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 44 44 44 44 44 45 44 44 44 44 43 43 42 43 43 42 41 41 41 42 43 43 43 43 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 45 46 46 45 45 44 45 45 45 45 46 46 46 47 47 47 47 47 47 48 48 48 48 48 48 48 49 49 50 50 50 50 49 49 49 49 48 47 46 46 47 48 48 48 47 47 48 48 48 49 48 48 48 48 47 47 47 46 46 46 47 48 48 48 48 47 47 46 46 45 45 44 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 44 44 44 44 45 45 45 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 46 46 45 45 44 43 42 42 42 43 43 44 44 43 42 41 40 39 39 40 40 40 40 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 34 34 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 36 36 35 35 51 51 50 50 50 50 50 50 50 50 49 49 49 48 47 47 46 46 47 47 46 46 47 47 47 48 48 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 48 46 47 48 49 49 50 50 50 50 49 49 49 49 48 48 47 47 46 46 46 45 45 44 44 44 44 44 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 39 39 40 39 39 40 40 40 40 39 38 38 37 37 38 39 40 40 40 39 39 39 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 41 41 41 40 40 41 42 43 43 43 43 42 42 43 43 43 43 43 43 44 44 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 42 42 41 42 43 43 43 45 45 45 44 43 43 42 41 41 41 40 40 40 41 41 41 41 42 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 42 41 41 40 40 39 39 40 41 43 44 44 43 43 43 42 42 43 44 44 44 44 44 44 44 44 44 43 43 44 44 44 44 43 43 43 42 42 42 43 43 43 43 44 44 44 44 44 44 43 43 42 42 42 42 42 41 41 41 41 41 41 41 42 41 41 42 42 43 43 44 44 44 44 44 43 43 44 44 44 44 44 44 45 45 45 46 46 45 44 44 45 45 45 46 46 47 47 47 47 48 47 47 47 48 48 48 48 48 48 48 48 49 49 50 50 50 49 49 49 49 48 47 46 46 47 47 47 47 46 47 48 48 48 48 48 48 48 48 47 47 47 46 46 46 47 47 47 48 48 47 46 45 45 44 44 44 44 44 45 44 44 44 44 44 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 45 44 43 43 43 43 43 43 44 44 44 45 46 46 46 46 46 45 45 44 43 43 44 44 44 45 44 44 44 42 41 39 39 38 39 39 39 40 41 41 41 41 41 40 40 40 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 35 35 51 51 51 50 50 50 50 50 50 50 50 49 49 48 48 47 47 46 46 46 46 47 47 47 47 48 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 47 47 48 48 49 49 49 50 49 49 49 49 49 48 48 48 47 46 46 46 46 45 45 45 44 44 44 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 39 39 40 40 40 40 40 40 40 39 38 37 37 37 37 39 39 39 39 39 39 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 41 41 40 40 40 40 41 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 41 42 44 45 44 43 43 43 43 42 41 41 40 40 40 40 40 41 41 41 41 42 42 43 43 43 43 42 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 42 41 41 41 41 41 40 39 38 39 42 43 43 42 42 42 42 43 43 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 44 43 43 42 42 42 43 43 43 43 44 44 44 44 44 44 43 43 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 44 44 45 45 46 46 47 47 47 47 47 48 47 47 47 47 48 48 48 48 48 47 47 48 49 49 50 50 50 49 49 48 48 48 47 46 46 46 47 46 46 47 47 48 48 48 48 48 48 48 47 46 46 46 46 46 46 47 47 48 48 47 46 46 46 45 45 44 44 44 45 44 44 44 44 43 43 44 43 43 43 44 44 45 44 44 44 43 43 44 44 44 44 44 44 43 43 43 43 44 44 44 45 45 46 46 47 47 46 46 45 45 44 44 45 45 45 46 45 45 44 43 42 41 40 39 39 38 39 40 41 41 41 41 40 40 40 40 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 37 37 37 38 38 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 36 36 51 51 51 51 51 50 50 49 49 49 49 49 49 48 48 47 46 46 46 46 46 47 48 48 48 48 49 49 49 49 49 49 48 48 48 48 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 48 48 48 48 48 49 48 48 49 49 48 47 47 48 48 48 48 48 49 49 49 49 48 48 48 48 48 48 47 46 46 46 46 45 45 45 44 44 44 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 39 38 38 39 38 37 38 38 38 38 39 40 40 40 40 40 40 40 40 40 41 40 40 40 39 39 40 40 40 40 40 39 40 40 41 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 43 44 43 43 43 43 43 42 42 41 41 40 40 40 40 40 41 41 41 41 42 42 43 43 43 43 42 42 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 41 42 42 41 39 39 40 42 42 41 41 42 42 43 43 43 43 43 43 43 42 42 43 43 44 44 44 44 44 44 43 43 42 42 41 41 42 44 44 44 44 44 43 43 43 44 43 43 43 42 42 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 45 46 46 46 46 46 47 47 47 48 47 47 46 47 47 47 47 47 47 47 47 48 48 49 50 50 50 50 49 48 48 48 48 47 46 46 46 46 46 47 47 47 48 48 47 48 48 48 47 46 46 46 46 46 46 47 48 48 47 47 47 47 47 47 46 45 45 45 45 45 44 44 44 43 43 44 43 43 44 45 45 46 45 44 43 43 43 43 44 44 43 43 44 44 43 43 43 43 44 44 45 46 46 46 47 47 46 46 45 45 45 45 45 45 46 46 45 45 44 43 43 43 42 41 40 39 38 39 40 40 40 40 40 40 40 40 41 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 37 37 38 37 37 37 37 37 36 36 36 36 37 37 36 36 36 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 36 36 36 36 36 51 51 52 52 52 51 50 49 49 49 49 49 49 48 47 47 46 45 46 47 47 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 48 48 48 48 48 48 48 49 49 47 46 46 47 47 48 48 48 48 49 49 49 48 48 48 48 48 48 47 47 46 46 46 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 37 37 37 36 37 39 39 39 39 39 39 39 39 40 40 41 40 40 40 39 39 40 40 40 39 39 40 41 42 42 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 45 45 45 45 44 44 44 44 43 43 44 44 44 44 44 44 44 43 43 43 43 42 41 42 42 42 43 43 43 43 42 41 41 40 40 40 40 40 40 40 41 41 41 41 42 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 40 41 42 43 43 43 42 41 39 39 39 40 42 43 43 43 43 43 42 42 42 42 42 42 43 43 44 44 44 44 45 44 43 43 43 42 42 41 42 43 43 43 43 43 42 43 43 44 43 43 43 43 42 42 42 42 42 40 40 41 41 41 42 42 42 42 42 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 45 45 45 45 46 46 46 47 47 47 48 47 47 46 47 47 47 46 46 47 47 47 48 48 49 49 50 50 49 49 48 48 48 49 48 46 46 46 46 46 46 46 47 47 47 47 48 48 47 47 46 46 46 46 46 47 47 48 48 47 47 47 46 46 46 46 45 46 45 45 44 44 44 44 43 43 43 43 44 45 45 45 45 45 44 43 43 43 44 44 44 43 43 44 44 44 43 43 43 43 44 45 46 46 46 47 47 47 46 45 45 45 45 45 45 46 45 45 44 44 43 43 43 43 42 41 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 37 37 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 37 37 36 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 36 36 36 36 36 52 52 52 52 51 51 50 49 49 49 49 48 48 47 46 46 45 46 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 48 48 47 46 46 47 47 47 48 48 48 48 48 48 48 48 48 47 45 46 46 47 47 47 47 47 48 49 49 48 48 48 48 48 48 47 47 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 39 39 40 40 40 39 38 38 38 38 37 36 36 36 37 38 37 37 37 38 38 39 40 40 40 41 40 40 39 39 40 40 39 38 39 40 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 41 41 41 41 42 43 42 42 41 40 40 40 40 40 40 40 40 40 41 41 41 42 42 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 42 43 43 43 43 43 42 40 38 38 40 41 41 41 42 42 42 41 41 41 41 42 43 43 43 44 44 44 44 45 44 44 43 43 44 43 42 41 42 43 42 42 43 43 43 43 44 44 44 44 43 43 43 43 43 42 40 40 40 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 45 45 46 46 46 47 47 47 47 48 47 47 46 46 46 46 46 46 47 47 47 47 48 48 49 49 49 49 49 48 48 48 48 48 47 47 46 46 45 45 46 46 46 46 47 47 47 47 47 46 46 45 46 46 47 47 48 48 47 47 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 44 44 45 45 45 45 44 43 43 43 43 44 43 43 43 44 44 44 44 43 43 43 45 46 46 46 47 47 47 46 46 46 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 41 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 51 52 51 51 51 50 50 49 49 48 48 48 47 46 45 46 46 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 49 49 49 49 49 49 48 47 46 46 47 47 47 48 48 48 48 48 48 48 47 48 46 45 45 46 46 46 47 47 47 48 48 49 48 48 48 48 48 48 47 47 47 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 38 38 37 37 37 37 37 37 37 36 36 37 38 39 40 40 40 40 40 40 40 39 39 38 38 39 40 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 44 43 42 42 41 41 42 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 42 42 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 42 43 43 42 42 41 41 41 41 42 42 43 43 43 43 43 43 42 41 40 39 39 39 39 40 41 41 40 40 40 41 42 42 43 43 43 43 43 44 44 45 45 44 44 44 43 43 42 41 41 42 42 42 43 44 44 44 43 43 43 43 43 44 43 43 43 42 41 40 40 40 41 41 41 42 42 42 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 44 45 45 45 46 46 47 47 47 47 48 48 48 47 46 46 46 46 46 46 46 46 46 47 47 47 48 49 49 48 48 49 48 48 48 48 49 48 47 46 45 45 45 46 46 46 46 46 46 46 47 47 46 45 45 46 47 47 47 47 47 47 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 44 44 45 45 45 44 44 43 43 43 43 43 43 43 44 44 44 44 44 43 43 45 46 46 47 47 47 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 41 39 38 39 40 40 40 40 40 40 40 40 40 40 39 39 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 51 51 51 51 50 49 49 49 48 48 48 47 46 45 46 47 47 48 48 48 48 49 49 49 49 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 48 48 48 48 48 48 48 48 47 47 47 46 45 45 46 46 46 46 46 47 48 48 48 47 47 48 48 48 48 47 47 47 47 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 37 37 38 39 38 38 39 39 39 39 39 38 37 36 37 39 40 40 40 40 40 40 40 39 39 38 39 40 41 41 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 42 41 41 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 42 42 41 41 42 42 42 42 42 43 43 43 43 42 42 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 42 42 41 41 41 42 43 43 43 43 42 42 42 42 41 41 40 39 39 38 39 39 40 40 39 41 42 43 43 43 43 43 43 43 44 44 45 45 44 43 43 43 42 42 42 41 41 42 43 43 43 43 44 43 43 43 42 43 43 43 43 43 42 41 40 40 40 41 41 41 42 42 42 42 42 42 43 43 43 43 43 44 44 44 43 43 43 42 42 42 42 43 43 44 44 45 46 46 46 46 46 46 47 47 47 48 47 47 47 46 46 46 46 45 45 45 46 46 46 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 46 45 45 45 45 45 46 46 46 46 46 46 45 45 45 46 46 46 47 47 47 47 46 46 46 45 45 45 45 45 44 44 44 45 45 45 45 45 45 44 44 44 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 42 41 39 38 39 39 40 40 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 51 50 50 50 50 49 48 48 48 48 47 46 45 45 46 47 48 48 48 49 49 49 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 48 48 48 48 48 48 48 48 48 48 47 46 46 45 45 45 45 45 45 46 47 48 48 47 47 47 48 48 48 48 47 47 47 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 38 38 39 40 39 39 40 40 40 40 40 39 38 37 37 38 39 40 39 39 40 40 40 39 39 38 39 40 40 41 42 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 40 40 40 41 41 41 41 41 42 42 41 41 41 41 41 41 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 42 42 42 42 43 43 42 42 42 42 42 42 42 41 41 41 40 40 39 38 39 40 41 41 42 42 42 43 43 44 44 44 44 44 45 45 45 45 44 43 43 42 42 42 41 41 42 43 42 42 43 43 43 42 41 41 42 42 42 43 43 42 41 40 40 40 41 41 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 44 44 44 45 45 45 46 46 46 47 47 47 48 47 47 47 46 46 46 46 45 45 45 46 46 46 47 47 48 48 48 48 48 48 47 47 47 47 47 48 47 47 46 45 45 45 45 45 45 45 46 45 45 45 45 45 45 45 46 46 46 46 47 46 46 46 45 45 45 45 45 45 45 45 45 45 45 46 46 46 45 44 44 45 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 44 44 45 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 42 40 39 39 39 39 39 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 51 50 49 49 48 48 47 47 47 47 46 45 45 45 46 47 48 48 49 49 49 50 50 50 51 51 51 50 49 49 49 49 49 49 49 48 48 48 48 48 49 49 48 48 48 48 49 49 49 49 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 48 48 48 48 48 48 48 48 48 48 47 46 45 45 45 45 45 45 45 45 46 47 47 47 47 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 39 38 37 36 37 38 38 39 40 40 40 39 39 38 38 40 40 41 42 42 42 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 42 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 40 40 39 38 39 41 42 42 42 43 43 43 43 43 43 44 44 44 44 45 45 45 45 44 43 43 42 42 42 41 41 42 43 42 43 43 43 43 42 41 41 42 42 42 43 42 41 41 40 40 40 41 41 42 43 42 41 42 42 43 43 42 42 42 42 43 43 43 43 43 42 42 42 42 42 43 43 43 43 44 44 45 46 46 47 47 47 47 48 48 47 47 46 46 46 46 46 45 45 45 46 46 46 47 47 47 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 46 45 45 45 45 45 45 45 46 46 46 46 46 47 46 46 45 45 45 46 46 45 45 45 45 45 45 46 46 46 45 44 44 44 45 45 45 45 43 43 43 43 43 43 43 43 43 44 44 45 45 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 42 40 39 39 39 39 40 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 36 36 35 35 35 35 51 50 48 47 47 47 47 46 45 44 45 46 46 47 47 48 48 48 49 50 50 50 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 47 47 47 48 48 48 48 48 48 48 48 48 47 47 46 45 45 44 44 44 45 45 45 46 46 46 46 47 48 48 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 39 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 37 37 37 38 39 40 40 39 38 39 40 41 41 41 42 42 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 41 41 41 40 40 40 40 40 39 39 39 38 38 39 39 40 40 40 40 41 41 41 41 41 41 41 40 40 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 39 38 41 42 41 42 42 43 44 44 44 43 43 44 44 44 45 45 45 45 45 44 43 43 42 41 41 41 41 42 43 43 43 43 43 43 42 41 41 41 41 42 42 42 40 40 40 40 40 41 41 42 42 41 41 42 42 43 42 42 42 42 42 43 43 43 43 43 43 42 42 42 42 42 43 43 43 44 44 45 46 47 47 47 47 47 47 48 47 47 46 46 46 46 46 45 45 45 45 46 46 47 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 47 46 45 45 45 46 46 46 46 45 45 46 45 45 46 46 46 45 44 44 44 45 45 44 43 43 43 43 43 43 43 43 44 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 43 42 41 39 39 39 39 39 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 36 36 36 36 36 51 51 49 47 46 47 46 45 45 46 46 46 47 47 48 48 48 48 49 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 47 46 46 47 48 48 48 49 48 48 48 48 47 47 46 45 44 44 44 44 44 44 45 45 46 46 46 46 47 47 48 48 48 48 47 47 46 46 46 46 46 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 37 36 37 38 39 39 38 39 40 40 41 41 41 41 42 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 46 46 45 45 45 45 45 44 44 43 43 43 43 42 42 42 42 42 41 41 41 40 40 40 40 39 39 39 39 38 38 38 39 39 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 41 41 40 40 39 38 38 41 42 42 42 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 43 42 42 41 41 41 42 43 43 42 42 43 43 42 42 40 40 41 41 41 41 40 40 40 40 41 41 42 42 41 41 41 42 43 42 41 41 42 43 43 42 42 43 43 43 43 42 42 42 42 42 42 43 43 44 45 45 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 45 45 45 45 46 46 46 46 47 47 47 48 48 48 47 47 47 46 46 46 47 47 47 46 45 45 45 45 44 44 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 46 45 45 45 45 46 45 44 44 45 45 45 44 43 43 43 43 43 43 43 43 44 45 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 42 40 39 39 38 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 35 35 35 35 35 35 35 35 36 36 36 36 52 51 50 47 46 46 45 45 47 48 47 46 47 48 48 48 48 48 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 48 48 47 46 46 47 48 48 48 49 48 48 47 47 47 46 46 45 44 44 44 44 44 44 44 45 46 46 46 46 47 47 47 48 48 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 43 42 42 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 37 37 37 38 40 40 40 40 41 41 41 41 42 43 43 43 43 44 44 44 45 45 45 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 43 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 39 39 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 40 40 40 40 40 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 38 38 40 43 43 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 44 43 43 42 41 40 41 42 42 42 42 43 43 43 42 40 40 40 40 40 40 39 39 40 40 41 41 41 41 41 41 41 42 42 41 41 41 42 43 42 42 42 43 43 43 43 43 42 42 42 42 42 43 43 44 45 45 45 46 46 46 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 46 46 46 46 46 47 47 47 47 48 48 47 47 46 46 46 46 46 46 46 45 45 44 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 44 44 45 45 44 44 43 43 43 43 43 44 43 43 43 44 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 45 45 45 45 44 44 44 44 44 44 43 42 40 40 39 38 38 38 39 39 38 38 38 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 35 35 35 35 35 35 35 36 36 36 36 37 52 50 49 46 45 45 44 46 48 49 48 48 48 48 48 48 48 48 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 51 51 50 50 50 50 50 49 49 49 48 48 46 46 47 48 48 49 49 48 48 47 47 47 46 46 45 44 44 44 44 44 44 45 45 45 45 45 46 46 46 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 36 38 40 40 40 40 40 41 41 41 41 42 42 43 43 44 44 45 45 45 46 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 42 41 41 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 40 40 40 39 38 38 38 40 42 42 43 44 43 43 43 43 44 44 44 44 45 45 45 45 45 45 46 45 44 43 43 42 41 40 41 41 41 41 42 42 43 43 42 40 40 40 40 39 39 39 40 40 41 41 41 41 40 40 41 41 41 40 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 44 44 45 45 45 46 47 47 47 47 46 46 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 47 47 47 47 48 47 47 47 46 45 45 46 46 46 46 46 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 47 47 47 47 46 46 46 45 45 45 46 44 43 44 44 44 44 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 44 43 43 43 42 42 41 40 39 38 38 38 39 38 38 38 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 35 36 36 36 36 36 36 37 37 50 49 47 45 44 44 44 47 49 49 49 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 50 50 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 46 46 47 48 48 49 48 48 47 47 47 46 46 46 45 45 44 44 44 44 44 45 45 45 45 45 45 45 46 47 47 46 46 46 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 37 39 39 39 39 40 40 41 41 41 41 42 43 43 44 44 45 45 45 46 46 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 42 41 41 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 40 40 39 38 38 38 40 40 41 42 42 42 43 43 44 44 44 44 45 44 44 44 44 44 44 45 45 44 43 43 42 41 40 40 40 41 41 42 42 42 43 42 40 40 39 39 39 40 40 41 41 42 42 41 41 40 40 41 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 44 44 44 44 45 45 45 46 47 47 46 46 46 46 47 47 46 45 45 45 45 45 45 46 47 47 46 46 46 46 46 46 47 47 47 47 47 47 47 46 46 45 45 46 46 46 46 45 45 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 43 43 44 44 43 43 44 44 44 43 43 43 44 45 45 45 45 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 43 43 43 42 42 42 41 39 38 38 38 38 38 38 38 39 40 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 35 36 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 35 35 36 36 36 35 35 36 36 37 37 47 45 44 44 45 46 47 48 50 50 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 49 49 50 50 49 49 49 49 49 49 49 48 47 46 46 47 48 48 48 48 47 46 46 46 46 46 46 45 45 44 43 43 44 44 45 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47 47 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 37 39 39 39 39 40 40 41 41 41 42 42 43 43 43 44 45 45 46 47 48 48 48 48 48 47 47 47 46 46 47 47 47 46 46 46 45 45 45 45 44 43 43 44 43 42 42 43 43 43 42 42 41 41 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 40 40 40 40 40 40 40 40 41 40 38 38 40 41 41 41 42 42 43 43 44 44 44 44 45 44 43 43 43 44 44 44 45 44 44 43 42 41 40 40 40 40 41 42 43 42 42 41 40 39 39 39 40 41 42 42 42 42 42 41 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 42 42 43 43 43 44 44 44 44 44 44 44 45 45 46 46 46 46 46 46 47 47 46 45 45 45 45 45 45 45 46 46 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 46 45 45 45 45 45 45 46 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 45 45 45 45 45 44 43 43 44 44 44 44 44 43 43 43 44 45 45 45 45 45 46 46 46 45 45 45 44 44 44 44 44 44 44 44 44 43 43 44 44 44 45 45 45 45 44 43 43 43 43 43 43 43 41 39 38 38 38 38 38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 37 36 36 37 37 37 36 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 35 35 36 36 37 37 44 44 45 46 48 49 49 50 50 51 51 51 52 52 51 51 50 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 46 46 46 47 47 47 47 46 46 46 46 46 46 45 45 45 44 44 43 43 44 45 45 45 45 45 45 45 45 46 46 46 46 47 47 47 47 47 47 46 46 46 46 45 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 36 37 39 40 40 40 40 41 41 41 41 42 42 43 43 43 44 45 45 46 48 48 48 48 48 47 47 47 47 46 46 47 46 46 46 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 39 40 40 40 40 40 40 39 38 38 41 42 42 43 42 43 43 43 43 43 44 44 44 44 43 43 43 43 44 44 44 44 44 43 42 41 40 40 40 40 40 41 42 42 41 40 39 39 40 40 41 42 42 42 43 43 41 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 43 43 43 43 43 44 44 44 44 45 44 44 44 44 45 45 45 46 46 46 46 47 47 47 46 45 44 45 45 45 45 46 46 46 46 47 47 47 47 46 46 46 46 47 47 47 47 47 47 46 46 45 45 45 45 45 46 45 45 44 44 44 43 43 44 44 44 45 45 45 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 43 42 43 44 45 45 45 46 46 46 46 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 44 44 44 45 45 45 45 45 44 43 43 44 44 43 43 42 40 38 38 38 38 38 38 39 39 39 39 39 39 39 39 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 36 36 36 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 36 36 37 37 43 45 47 49 49 49 50 50 51 51 51 52 53 54 53 53 53 51 51 50 50 51 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 47 46 45 45 46 46 47 46 46 46 46 46 45 45 45 45 45 44 44 43 43 44 45 45 45 45 45 45 45 45 46 46 47 47 47 47 47 48 47 47 47 46 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 37 36 37 38 39 40 40 41 41 41 41 42 42 43 43 43 43 44 45 46 47 48 48 47 47 47 46 46 45 45 45 45 45 45 45 45 44 44 43 42 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 39 39 40 39 39 39 39 38 38 38 39 40 41 42 42 43 44 44 43 43 44 44 44 44 43 43 42 42 43 43 43 44 44 44 43 42 41 41 40 39 40 41 41 41 40 39 39 40 41 42 42 42 42 42 42 42 41 40 40 41 41 41 41 40 40 40 41 41 41 41 41 41 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 46 47 47 47 47 47 46 45 44 44 45 45 45 45 46 46 46 46 47 47 47 47 47 47 46 46 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 43 43 44 44 44 45 45 45 46 46 46 45 45 45 45 44 44 44 45 45 45 45 45 45 45 45 45 46 46 46 45 44 43 43 43 43 42 42 42 43 43 42 43 44 44 45 45 46 46 46 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 46 46 45 44 44 44 44 44 43 43 42 40 39 38 38 38 38 38 39 39 39 39 39 39 39 39 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 43 46 48 49 50 50 51 51 51 52 52 53 53 54 55 55 55 53 52 52 51 51 51 51 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 49 48 48 47 46 45 46 46 46 46 46 45 45 45 45 45 45 45 45 44 43 43 43 44 44 45 45 44 44 45 45 45 46 46 47 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 36 36 38 39 39 40 40 41 41 41 41 41 42 42 43 43 43 44 45 46 47 48 47 47 46 46 46 45 45 44 44 43 43 43 44 43 43 43 42 42 42 41 41 41 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 40 40 40 40 39 39 39 39 39 40 40 40 39 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 39 38 38 38 38 38 37 38 40 40 40 42 43 43 44 45 44 44 44 44 44 44 43 43 42 41 42 42 43 43 44 44 43 43 42 41 41 40 39 40 40 40 40 39 39 41 42 43 43 42 41 40 40 40 40 40 41 42 42 41 41 41 40 40 40 40 41 41 41 41 42 43 43 43 43 43 43 43 44 44 44 43 43 43 44 44 44 45 46 46 46 46 46 46 46 44 44 44 45 46 46 46 46 47 47 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 44 44 44 44 44 44 43 43 43 44 44 44 45 45 45 46 46 45 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 46 46 45 45 44 43 43 43 44 43 42 43 44 44 43 44 44 44 45 45 45 46 46 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 46 46 45 45 45 45 44 43 43 42 42 41 38 37 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 37 36 36 36 44 47 48 50 51 52 52 52 51 51 52 53 53 54 55 56 55 54 53 52 52 51 51 51 51 51 51 50 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 50 50 50 51 51 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 45 45 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 43 44 44 44 44 44 44 45 45 45 45 46 47 47 48 48 48 48 48 49 48 48 48 48 47 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 38 37 38 39 39 40 40 40 40 41 41 41 41 42 42 43 43 43 44 45 45 47 48 47 47 46 46 46 46 46 45 44 44 44 43 42 42 42 41 41 41 41 41 41 41 41 41 42 41 41 41 41 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 38 39 39 40 41 42 41 41 42 44 44 45 45 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 44 44 43 43 42 42 41 40 39 39 39 39 39 40 41 42 43 42 41 40 40 40 40 40 41 41 42 42 42 42 42 41 41 40 40 41 41 41 41 42 43 43 43 43 43 43 43 44 43 43 43 43 43 44 44 44 45 45 46 45 45 45 46 45 44 44 45 45 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 47 47 47 46 46 46 46 45 44 44 44 44 44 44 44 43 43 43 44 44 45 45 45 46 46 45 45 45 45 45 44 44 43 43 43 43 43 44 44 45 45 45 45 45 45 44 44 44 43 43 43 43 44 44 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 44 44 43 42 41 41 40 38 37 37 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 36 36 36 36 37 37 37 37 44 45 46 48 49 50 50 50 49 48 51 53 54 55 55 55 55 54 53 52 52 52 52 52 51 51 51 50 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 50 50 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 45 45 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 45 46 46 47 47 47 48 48 49 49 49 49 49 48 48 47 47 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 37 37 39 39 40 40 40 40 41 41 41 41 41 42 42 43 43 44 45 45 47 48 47 47 47 47 47 48 48 48 46 45 45 44 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 39 39 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 37 37 37 37 38 39 41 43 43 43 42 41 42 43 44 44 45 44 43 42 42 42 42 42 42 42 42 41 41 42 43 43 43 43 43 42 42 42 41 40 39 39 38 39 40 41 41 42 42 41 40 40 41 41 41 41 42 42 42 43 43 43 43 42 41 40 40 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 44 44 44 44 44 44 44 45 45 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 47 47 48 48 48 47 47 47 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 43 44 44 44 45 45 45 46 46 45 45 45 44 44 43 43 43 43 43 44 44 45 45 45 44 44 45 44 44 44 43 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 46 45 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 45 45 45 45 44 43 41 40 40 39 37 37 37 37 38 38 38 38 38 39 39 39 39 39 39 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 36 37 36 36 42 43 44 46 48 48 46 46 47 48 51 53 53 55 56 55 55 54 53 53 52 52 52 52 51 51 51 50 50 49 49 49 49 49 48 48 47 47 47 48 49 49 49 49 50 50 50 50 50 50 50 51 51 51 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 45 45 46 46 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 46 46 46 47 48 48 49 49 49 49 49 49 49 48 48 48 47 46 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 39 37 36 38 40 40 40 40 41 41 41 41 41 41 42 42 43 43 44 45 46 47 48 47 47 47 47 48 49 50 49 48 46 45 45 44 43 43 42 41 41 41 41 40 40 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 38 37 37 37 37 38 40 42 43 44 44 44 44 43 43 43 44 44 44 44 43 42 42 42 42 41 42 43 42 40 41 42 42 42 43 42 42 42 41 40 40 40 39 38 39 39 40 41 41 41 40 40 41 41 42 42 42 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 44 44 44 45 46 46 47 47 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 48 48 48 47 47 46 46 46 46 46 46 46 45 45 44 43 43 43 43 43 43 43 43 44 45 45 45 45 46 45 45 44 44 44 44 43 43 43 43 44 45 44 44 44 44 44 44 44 44 43 42 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 44 43 42 41 40 39 38 37 37 37 37 38 38 38 38 39 39 40 40 40 39 39 39 38 38 37 37 38 38 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 36 41 41 42 45 46 46 44 44 46 50 51 49 49 54 57 57 56 55 54 53 53 52 52 52 51 51 51 51 50 50 50 50 49 49 49 48 47 47 46 47 48 48 49 49 49 50 50 50 50 50 50 51 50 50 50 50 49 49 49 49 48 48 48 48 47 47 47 47 47 47 46 45 45 45 46 45 45 44 44 43 43 44 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 46 47 47 48 48 48 49 49 49 49 49 49 49 48 47 46 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 38 36 37 39 39 39 40 40 41 41 41 41 41 41 42 42 42 43 44 44 45 46 48 48 47 47 47 48 49 50 50 49 48 47 46 46 45 45 44 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 37 37 37 37 37 39 42 43 42 43 43 44 44 44 44 44 44 44 44 43 43 43 43 42 41 41 42 41 41 40 41 41 41 42 42 42 42 41 41 42 41 39 38 38 38 39 39 40 40 40 41 41 42 42 42 42 43 42 42 42 43 43 43 42 41 41 41 41 41 41 41 42 43 42 42 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 47 47 47 47 48 48 48 47 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 43 43 44 44 44 45 45 45 45 45 44 44 44 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 42 41 42 43 43 43 43 43 44 44 45 45 45 45 46 46 46 45 45 46 46 45 44 43 43 43 44 43 43 43 43 43 43 43 43 45 45 45 45 45 45 45 46 46 44 43 42 42 41 40 39 38 37 37 37 37 38 38 38 38 39 40 40 40 39 38 38 38 37 37 37 38 39 39 39 39 38 38 38 38 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 36 36 36 42 41 41 42 43 43 43 43 45 46 46 44 45 49 52 55 56 55 54 54 53 52 52 52 51 51 51 51 51 51 51 50 50 49 49 48 48 47 46 46 47 48 48 49 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 47 47 47 47 46 46 46 46 46 45 44 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 45 45 45 46 46 46 47 48 48 48 48 49 49 50 50 49 47 46 46 45 45 44 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 39 39 39 39 40 40 39 39 40 39 39 39 39 39 39 39 39 39 39 38 37 37 38 39 39 39 40 40 40 40 40 41 41 41 41 41 42 42 43 44 45 46 47 48 47 47 47 48 49 50 51 50 50 49 48 48 47 47 46 44 44 42 41 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 39 39 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 37 37 39 40 42 43 43 44 44 44 45 45 45 45 44 43 43 43 42 41 40 40 41 41 41 40 40 40 41 42 42 42 42 42 42 42 41 39 38 38 38 39 39 40 40 41 41 41 41 41 41 42 42 42 42 42 43 43 43 42 41 42 42 41 41 41 41 41 42 42 42 43 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 43 43 43 43 43 44 44 44 44 45 45 45 44 43 43 43 43 43 43 44 44 43 43 42 42 42 42 43 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 44 43 43 43 43 43 43 43 43 44 45 45 44 44 44 45 46 46 44 43 43 42 41 41 40 39 38 38 37 37 37 38 38 39 39 40 40 39 39 38 38 38 38 38 39 38 38 39 39 39 39 39 39 39 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 35 34 35 35 35 35 35 35 36 36 35 36 36 36 37 46 42 41 41 41 41 41 41 42 42 42 41 42 43 44 48 53 55 54 54 53 53 52 52 52 52 52 52 52 52 51 50 49 49 49 48 48 47 46 46 47 48 48 48 49 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 48 47 47 46 46 46 46 45 45 45 45 44 44 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 46 47 47 47 47 48 49 49 49 49 48 48 47 46 45 45 45 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 39 40 39 39 38 38 38 38 38 38 38 37 37 37 38 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 42 43 44 45 46 47 47 47 47 47 48 49 50 51 52 52 51 51 50 49 49 48 47 46 44 43 42 42 41 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 39 39 39 40 39 39 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 43 43 42 40 39 38 37 38 40 43 44 44 44 43 43 44 45 45 44 43 42 42 42 41 41 41 40 40 41 41 41 40 40 41 42 42 42 42 42 42 42 40 39 38 38 39 39 39 40 40 40 40 40 41 41 42 42 42 42 42 42 43 43 43 43 42 42 42 41 41 41 41 41 42 42 42 43 42 42 42 42 43 44 44 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 44 45 45 45 46 46 46 46 46 45 45 46 46 46 46 46 47 47 47 47 47 48 47 47 46 46 46 46 46 46 46 45 45 46 46 46 45 45 44 44 44 43 43 43 43 43 43 44 44 44 45 45 44 43 42 42 43 43 44 43 43 43 42 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 45 45 45 45 45 44 44 45 45 44 43 43 42 43 43 43 43 42 42 43 42 42 43 43 44 44 45 44 43 43 44 45 46 45 44 43 43 42 41 41 40 39 39 38 37 37 37 37 38 39 40 39 39 39 38 38 37 39 40 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 52 49 45 43 42 41 41 41 41 41 41 41 41 41 41 43 49 53 53 53 53 53 53 52 52 52 52 52 53 52 51 50 49 49 49 49 48 47 46 46 46 48 48 48 49 50 51 50 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 46 46 46 45 44 44 44 44 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 46 46 46 47 47 47 47 48 48 48 48 49 48 48 48 47 46 45 45 45 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 39 38 38 38 38 37 37 36 36 37 39 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 43 44 45 46 47 47 46 47 47 48 49 50 51 51 51 51 51 50 50 49 49 48 46 45 44 43 42 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 38 38 38 38 39 39 40 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 39 40 39 39 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 43 43 43 43 44 45 45 45 43 41 39 38 37 38 40 43 44 43 43 42 42 44 44 44 44 44 43 42 41 41 41 41 40 40 40 41 41 40 39 40 41 41 42 42 41 41 41 39 38 38 39 39 39 39 40 40 40 40 40 41 41 42 42 43 43 43 43 43 44 44 43 42 42 42 42 42 42 41 41 41 42 42 42 42 42 42 42 43 43 44 44 44 43 43 43 43 44 43 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 46 46 45 45 46 46 47 47 47 47 47 48 47 46 46 46 46 45 45 45 45 45 46 46 46 46 45 45 44 44 44 43 43 43 43 43 43 43 43 44 44 44 43 42 42 42 43 43 43 42 42 41 41 41 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 43 43 42 42 42 43 43 43 42 42 42 42 42 42 43 43 44 45 44 44 43 43 45 45 46 45 44 43 43 42 41 41 40 40 39 38 37 37 37 37 38 39 40 39 38 38 37 37 38 39 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 54 56 54 52 50 47 45 44 44 44 43 43 42 41 41 41 45 51 53 52 52 53 53 53 53 52 51 51 52 52 50 49 48 48 48 48 48 47 46 46 46 47 48 48 49 50 51 50 49 49 49 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 45 45 44 44 44 44 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 46 47 47 48 48 48 49 49 49 49 48 48 49 48 48 48 48 47 46 45 45 45 44 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 37 37 36 36 37 39 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 43 44 45 46 47 46 46 46 46 47 48 49 50 51 51 51 51 51 51 50 50 49 48 47 46 44 43 42 41 41 41 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 39 39 39 39 40 39 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 40 39 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 42 42 43 44 44 44 45 45 45 45 45 44 43 41 38 37 37 37 38 40 41 41 41 41 41 42 43 44 44 44 43 43 42 41 40 40 40 39 40 40 40 40 39 40 41 41 41 41 40 40 39 38 38 38 39 40 40 40 41 41 41 42 42 41 40 41 42 43 43 44 43 43 44 43 43 43 43 42 42 43 43 42 42 41 41 42 41 41 42 42 42 42 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 46 46 45 45 45 46 46 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 46 46 45 45 45 44 44 44 43 43 43 43 43 43 43 43 44 44 43 42 42 42 43 43 43 42 41 41 41 41 41 42 43 43 43 43 44 44 44 44 44 43 43 43 44 44 43 43 42 42 43 43 43 42 42 42 43 43 42 42 41 41 41 41 42 42 42 43 44 44 44 43 43 44 45 45 46 45 44 43 43 42 41 41 40 40 39 38 37 37 37 37 38 38 39 38 38 37 38 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 51 56 59 58 55 53 53 53 51 50 49 46 43 41 41 41 42 49 54 53 52 52 52 52 52 52 51 50 50 50 50 49 48 48 47 47 47 47 46 45 46 47 47 48 48 49 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 47 46 46 45 45 46 45 44 43 43 44 45 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 46 46 47 47 47 48 48 48 49 49 49 50 51 51 51 50 49 49 48 48 48 47 47 46 46 45 45 44 44 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 39 38 37 37 36 36 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 43 44 46 46 46 45 45 46 46 47 48 49 50 50 51 51 51 51 51 50 49 49 48 47 46 44 43 42 41 41 41 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 39 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 43 43 44 44 45 45 46 46 46 46 45 44 43 41 39 38 37 37 38 38 38 39 38 39 39 40 42 43 43 44 44 43 42 41 40 40 40 39 38 39 39 39 40 40 40 40 40 40 39 39 38 38 38 39 40 40 41 41 41 41 43 43 43 42 41 41 42 42 43 44 44 43 44 43 43 43 43 43 43 43 43 43 43 42 42 42 41 42 42 42 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 46 46 46 46 46 46 46 46 45 45 46 46 47 47 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 45 45 44 44 44 44 43 43 43 42 42 43 43 44 43 43 43 42 42 42 42 43 42 41 41 41 41 41 41 42 43 43 43 43 44 43 43 43 43 42 43 43 43 42 42 42 42 42 42 42 42 42 42 43 42 42 41 41 41 41 41 41 42 42 43 43 44 43 43 43 43 44 45 46 45 44 43 43 42 41 41 40 40 40 39 37 37 37 37 37 37 38 38 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 48 51 53 54 53 52 55 56 54 53 52 48 43 41 41 41 42 46 52 54 53 52 51 51 52 51 50 49 49 49 49 48 48 47 47 46 46 47 46 45 46 47 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 45 45 46 45 43 43 43 44 45 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 44 44 44 45 45 46 46 46 47 48 48 49 49 49 49 50 50 51 51 51 52 52 52 52 51 50 49 49 48 47 46 47 47 46 45 44 44 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 39 40 39 38 37 36 36 38 39 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 43 45 45 46 45 45 45 45 46 47 48 49 50 50 50 51 51 50 50 49 49 49 48 47 46 45 44 43 41 41 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 41 41 41 41 41 42 42 42 43 43 43 43 43 44 45 45 46 46 46 46 46 46 45 44 42 43 42 41 41 41 41 39 38 38 38 37 38 41 42 42 43 43 43 42 41 41 40 40 39 38 38 39 39 40 40 39 39 39 39 38 38 38 38 39 40 41 41 41 41 41 42 43 43 43 43 42 41 41 42 42 43 43 43 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 43 43 43 44 45 44 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 46 46 46 46 46 45 45 45 45 45 45 45 46 45 45 45 45 44 44 44 44 43 43 42 42 42 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 42 42 43 43 44 43 43 42 42 42 42 42 42 41 41 41 42 42 42 41 42 42 43 43 42 41 41 41 41 41 41 41 41 42 42 43 43 43 42 42 43 44 45 45 45 44 44 43 42 41 41 40 40 40 39 38 37 37 37 37 37 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 39 39 39 39 38 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 46 46 49 52 50 50 52 53 52 49 50 49 45 42 41 41 41 44 50 54 53 51 51 52 53 51 50 49 48 48 48 48 47 46 46 46 46 46 45 45 46 47 47 47 48 48 48 48 48 48 49 49 49 49 49 50 49 48 48 47 47 46 46 46 45 45 45 44 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 44 44 44 45 45 45 46 46 47 48 48 49 50 50 51 51 51 52 52 52 52 53 53 53 53 53 51 50 50 49 48 47 46 46 47 47 46 45 45 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 40 39 38 37 36 36 37 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 43 44 45 45 46 45 45 45 45 46 47 48 49 49 50 50 50 50 50 49 49 49 48 48 47 46 46 44 42 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 41 41 41 41 42 42 42 43 43 43 43 44 44 44 45 45 46 46 46 46 46 46 45 44 43 44 44 44 44 44 44 42 41 41 40 38 37 39 41 42 42 42 41 41 41 41 40 40 38 38 38 39 38 38 38 37 37 37 37 38 38 38 39 40 41 42 42 42 42 42 43 44 43 43 43 43 42 41 42 42 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 46 45 45 45 46 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 42 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 43 42 42 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 43 43 44 45 45 44 43 43 43 42 41 40 40 39 39 38 37 37 37 37 37 38 38 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 39 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 45 44 46 49 48 48 48 48 48 46 46 47 45 41 41 41 42 46 51 53 52 50 50 53 53 52 51 49 48 47 47 47 47 46 45 45 45 45 45 46 47 48 48 48 48 48 48 48 48 48 48 48 48 48 49 50 49 49 48 47 47 46 46 46 46 45 44 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 42 42 42 43 43 44 44 44 44 45 45 45 46 47 48 48 49 50 51 52 52 52 53 53 53 53 53 54 54 54 54 53 52 51 50 49 48 47 46 46 47 47 47 46 45 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 36 36 37 37 38 39 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 41 42 42 43 44 45 45 45 45 45 45 45 46 47 48 48 49 49 50 49 49 49 49 49 48 48 48 47 47 46 45 44 43 42 41 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 39 40 40 40 40 40 41 41 41 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 46 45 44 44 44 43 43 42 43 43 43 44 44 42 41 38 37 38 40 41 41 40 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 38 38 38 40 41 41 41 42 42 42 43 43 43 44 44 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 42 42 42 42 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 44 44 43 43 43 42 41 41 40 39 38 38 38 37 37 37 37 37 37 38 38 38 38 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 37 37 37 37 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 49 47 45 45 44 44 45 44 44 43 43 43 42 41 41 41 42 47 51 51 51 49 47 48 50 52 51 49 47 47 46 46 46 45 44 44 45 45 45 47 48 49 48 48 48 48 48 48 48 48 48 48 47 48 49 49 49 49 48 48 47 46 46 45 45 45 44 43 43 43 43 43 43 44 44 45 45 44 43 43 43 43 43 42 42 42 43 43 43 44 44 44 44 45 45 46 46 47 48 49 50 51 52 52 53 53 54 54 54 54 54 54 55 56 55 54 53 52 51 50 49 48 47 46 46 47 47 47 46 45 44 44 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 36 36 36 37 38 39 39 40 39 39 40 40 40 39 39 39 40 40 40 40 40 41 41 41 42 43 44 45 45 45 44 44 45 46 46 47 48 48 49 49 49 49 49 49 48 48 47 48 48 48 47 46 46 45 44 44 43 41 41 41 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 40 40 40 41 41 41 41 42 42 42 42 43 43 43 43 43 44 44 45 45 45 45 45 46 46 45 45 45 44 45 44 43 42 42 41 42 43 43 43 41 40 38 38 39 40 40 40 40 39 39 39 39 38 37 37 37 37 37 37 37 38 38 39 39 39 38 39 39 40 41 41 41 41 42 42 43 43 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 43 43 44 44 43 43 42 42 42 42 42 43 43 44 44 44 44 44 44 44 44 45 45 45 44 44 44 44 45 45 45 46 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 45 45 44 44 45 45 44 44 44 44 44 44 44 44 43 43 43 42 42 42 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 43 42 41 41 40 40 39 38 38 38 38 37 37 37 37 37 37 38 38 38 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 37 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 37 37 50 48 46 44 43 43 43 42 41 42 42 42 42 41 41 41 42 46 49 48 47 47 46 45 46 49 51 51 48 46 46 46 46 45 44 44 45 46 47 49 50 50 50 50 50 50 49 49 48 48 47 47 46 47 48 48 48 48 48 47 46 45 45 45 44 44 43 43 43 43 44 44 44 44 45 45 44 44 43 43 43 43 43 42 42 43 43 43 44 44 44 44 44 45 45 46 47 47 48 49 50 51 52 53 53 54 54 55 55 55 55 55 56 57 56 55 54 52 51 50 49 48 47 46 46 46 47 47 46 45 45 44 44 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 37 37 36 36 37 37 38 39 39 39 39 40 40 39 39 40 39 39 40 40 40 40 41 41 42 43 43 44 45 45 44 44 45 45 46 47 47 48 48 49 49 49 49 49 48 47 47 47 47 48 47 46 46 46 46 46 44 42 41 41 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 39 40 40 40 40 40 41 41 41 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 45 46 46 46 46 46 45 46 45 44 44 43 42 42 41 41 41 42 42 42 41 39 38 38 39 40 40 39 39 39 39 38 37 37 37 37 37 38 39 39 40 40 40 40 41 40 39 40 40 41 42 41 41 42 43 43 44 44 44 44 44 43 43 43 43 43 43 43 42 42 43 43 42 42 42 42 42 42 42 43 44 43 43 43 43 42 42 42 42 43 43 43 43 42 42 42 42 42 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 46 47 47 47 47 47 47 47 47 47 46 45 45 45 45 45 44 44 44 45 44 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 42 41 41 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 38 38 39 39 40 40 40 40 40 39 39 40 40 40 39 39 39 39 39 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 37 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 36 35 35 35 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 45 45 44 44 43 43 43 43 43 43 48 47 42 41 41 41 42 44 45 45 44 45 45 44 43 46 49 51 50 47 45 45 45 45 44 45 46 46 48 51 52 51 51 52 52 52 51 50 49 48 47 46 46 45 46 47 47 46 46 45 45 45 45 44 44 43 43 43 43 44 44 45 45 45 45 45 44 44 43 43 43 43 43 42 42 43 43 43 44 44 44 44 44 45 45 46 47 47 48 49 50 51 52 53 53 54 54 54 55 55 56 56 56 56 55 54 53 52 51 50 49 48 47 46 45 45 46 46 46 46 45 45 44 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 36 37 37 38 38 38 39 39 39 39 40 39 39 39 40 40 40 40 40 41 41 42 42 43 44 44 44 44 44 45 45 46 46 47 48 48 49 49 49 49 48 48 47 46 46 46 46 45 45 45 45 46 45 43 42 41 41 40 39 39 39 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 39 40 40 40 40 41 41 41 42 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 46 46 47 46 46 46 45 45 45 44 43 43 43 42 41 40 40 41 41 41 41 40 38 37 37 39 40 39 38 39 39 37 37 37 37 37 38 39 40 40 41 41 41 42 42 41 41 41 41 41 42 42 42 42 43 44 44 44 44 44 44 44 44 44 43 43 42 42 42 42 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 44 44 44 43 43 43 43 43 44 44 44 44 44 45 45 45 46 46 46 46 46 47 47 47 47 47 47 47 47 46 46 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 42 42 41 41 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 37 37 37 38 38 39 39 40 40 40 39 39 39 40 39 39 39 39 39 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 36 36 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 44 45 46 44 44 46 47 47 47 46 51 52 45 42 41 41 41 43 43 43 42 43 43 42 42 44 46 48 49 48 45 44 44 44 44 46 46 47 49 51 52 52 52 53 54 53 52 51 50 49 47 46 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 45 45 45 44 44 43 43 43 43 42 42 42 43 43 43 44 44 44 45 45 45 45 45 46 47 48 49 50 51 52 52 53 53 54 54 55 56 56 57 56 55 54 53 53 52 51 50 49 48 47 46 45 45 46 46 47 46 46 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 37 36 37 37 38 38 38 38 38 38 39 39 39 39 40 40 40 40 40 40 41 41 42 42 42 43 44 44 44 44 44 45 45 47 48 48 49 49 50 50 49 49 48 47 46 45 45 45 44 44 45 45 45 44 44 42 41 40 40 40 40 39 39 40 40 39 39 38 38 38 38 37 37 37 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 39 39 39 40 40 41 42 43 43 44 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 47 46 46 45 45 44 45 45 44 44 43 42 42 41 40 40 41 41 41 40 38 37 37 38 38 38 38 38 38 37 37 37 37 38 38 39 39 40 41 41 42 42 42 42 42 42 42 42 41 41 42 42 43 43 44 44 45 45 44 44 44 44 44 43 42 42 42 43 43 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 44 44 44 45 45 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 46 45 45 45 45 45 44 44 44 44 44 45 44 43 43 43 43 43 43 43 43 43 43 42 42 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 43 42 41 41 41 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 38 38 37 37 37 37 38 38 38 38 39 39 39 40 39 39 40 39 38 39 40 40 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 37 37 36 36 37 37 36 36 36 36 36 35 35 35 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 47 47 50 49 46 49 52 51 50 48 50 53 50 43 41 41 41 41 41 41 41 41 41 41 41 41 42 43 44 47 45 43 43 44 45 45 46 47 49 50 52 52 53 55 55 55 54 52 51 50 49 47 45 45 45 44 44 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 45 45 44 44 43 43 43 43 42 42 42 43 43 43 44 44 44 45 45 45 45 45 46 47 48 48 49 50 51 52 53 53 54 55 56 57 57 57 56 55 54 53 52 52 51 50 49 48 47 46 45 45 45 46 46 46 46 46 45 45 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 39 38 38 38 37 37 36 36 37 37 37 37 37 37 37 38 39 40 39 39 39 40 40 40 40 41 41 41 41 42 43 43 43 44 44 44 45 46 47 48 48 49 50 50 50 50 49 49 47 46 45 45 44 44 44 45 45 44 44 43 42 41 41 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 38 38 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 39 39 39 40 41 42 43 43 44 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 44 44 44 44 44 43 43 42 41 40 40 40 40 40 39 38 36 37 37 37 37 37 38 38 37 37 37 37 38 40 40 40 40 40 40 41 42 42 43 43 43 43 43 43 43 42 42 43 43 44 44 44 44 45 44 44 44 44 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 42 42 42 43 43 43 43 42 42 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 46 47 47 47 47 47 47 46 46 46 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 41 41 41 40 40 40 39 38 38 38 38 38 38 38 37 37 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 39 39 38 39 38 38 39 40 40 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 36 36 37 37 36 36 36 36 36 36 36 35 34 34 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 36 36 36 37 36 49 48 52 53 49 50 54 54 53 50 50 53 51 47 43 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 41 42 44 45 44 45 48 50 52 54 54 55 56 57 57 56 55 54 53 51 48 45 45 44 44 44 43 43 44 44 44 44 44 43 44 44 44 44 44 45 45 45 45 45 45 45 44 43 43 43 43 42 42 42 43 43 43 44 44 45 45 45 45 45 46 46 46 47 48 49 50 51 52 53 54 55 56 56 56 57 57 56 55 54 53 52 52 51 50 49 48 47 46 45 45 45 45 46 47 47 46 46 45 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 39 40 39 38 38 38 38 37 36 36 36 36 37 37 37 37 38 39 40 39 39 39 40 40 40 40 40 41 41 41 41 42 43 43 44 44 44 44 45 46 47 48 49 50 50 51 50 50 49 48 46 45 45 45 44 44 44 44 44 43 43 43 42 42 41 40 40 39 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 39 39 39 40 40 42 43 43 43 44 45 45 46 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 45 45 45 45 44 43 43 43 43 43 43 42 40 40 39 39 40 40 39 38 36 36 37 37 37 37 38 38 37 36 37 38 39 40 41 41 41 40 40 41 41 42 43 43 44 43 43 43 43 43 43 43 43 43 44 44 44 45 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 42 42 42 42 42 42 42 42 42 43 44 44 44 43 44 44 44 45 45 45 45 45 45 45 45 45 46 46 47 47 46 46 46 46 46 46 45 45 45 44 44 44 44 43 44 44 44 44 44 43 43 43 43 44 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 44 44 44 43 42 41 41 40 40 40 39 39 38 38 38 38 38 37 37 37 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 41 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 36 36 36 35 35 35 36 36 35 35 34 34 34 34 35 34 34 35 35 35 36 36 36 36 36 36 36 36 36 36 36 36 36 49 49 53 55 52 52 55 56 54 52 52 53 52 49 44 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 45 44 44 45 49 51 53 55 56 55 56 57 56 56 57 55 52 50 47 45 44 44 44 44 45 45 46 46 46 45 45 44 44 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 42 42 42 43 43 43 44 44 45 45 45 45 46 46 46 46 47 48 49 50 51 52 53 54 55 55 55 55 56 56 56 55 54 53 52 52 51 50 49 48 47 46 45 45 45 45 45 46 47 47 47 46 45 45 45 44 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 39 40 39 38 38 38 38 38 37 37 37 36 36 36 35 36 36 37 38 38 38 39 40 40 40 40 40 40 40 41 41 41 41 42 43 43 43 43 43 44 45 46 47 48 49 50 50 50 49 49 48 47 46 45 45 45 44 44 45 44 43 42 42 42 42 41 40 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 39 40 40 40 41 42 43 43 44 44 45 45 45 45 45 45 45 44 44 45 45 45 45 46 46 46 46 45 45 45 45 44 43 43 43 43 42 42 41 40 40 39 39 39 39 40 38 37 36 36 36 37 37 37 37 37 36 37 39 40 41 41 41 42 42 42 42 42 42 43 43 43 42 42 42 42 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 43 42 42 42 42 42 42 42 43 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 41 41 42 42 43 42 42 42 42 42 42 42 43 43 44 44 44 44 44 44 44 45 45 46 46 46 46 46 45 45 46 46 46 46 46 45 46 46 46 46 45 45 45 45 44 44 44 43 43 44 44 44 44 43 43 43 44 44 44 44 43 43 42 42 42 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 41 41 41 41 41 41 42 42 41 41 41 41 41 43 43 43 44 44 44 44 43 43 42 41 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 37 38 38 37 37 37 37 38 37 37 38 38 38 38 38 38 38 38 38 38 39 39 39 40 40 40 41 41 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 50 51 53 55 54 55 58 57 54 53 54 54 52 50 47 44 43 44 46 45 43 44 44 42 43 43 41 41 41 41 41 42 43 43 43 44 47 50 52 53 54 54 53 53 54 54 54 55 54 51 48 46 44 44 44 45 46 47 47 47 47 48 48 47 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 42 42 42 43 43 43 43 44 44 45 45 45 46 46 46 46 47 47 48 49 51 52 52 53 54 54 54 54 54 55 55 55 54 53 53 52 52 51 50 49 48 47 46 45 45 45 45 45 46 47 48 47 46 46 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 37 37 36 36 37 37 36 36 37 39 40 40 40 40 40 40 40 40 41 41 41 41 42 43 43 43 43 43 44 45 46 47 48 49 49 49 49 48 48 47 46 45 44 44 44 44 45 44 43 42 41 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 41 42 43 43 43 43 44 44 44 44 44 44 44 44 44 44 45 45 46 45 45 45 45 45 45 44 44 43 43 43 43 43 42 41 41 40 40 40 39 38 38 39 38 38 37 36 36 37 37 37 37 36 37 38 39 40 41 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 43 43 43 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 42 43 43 43 43 42 42 42 42 42 42 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 46 45 45 45 45 45 46 46 46 46 46 45 45 45 45 45 44 44 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 41 41 41 41 41 42 43 43 43 43 44 43 42 42 41 41 40 40 40 40 40 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 40 40 40 41 41 41 40 40 39 39 38 38 38 38 38 38 38 38 37 37 38 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 51 53 54 55 57 58 60 59 56 56 57 55 53 53 52 48 44 47 52 51 49 50 47 44 47 47 44 43 41 41 41 41 42 42 43 44 47 51 53 53 52 51 51 50 51 52 51 52 54 51 47 45 43 43 45 48 49 49 49 49 49 50 50 49 47 46 45 46 46 46 45 45 45 45 45 45 44 44 44 43 43 42 42 42 43 43 43 43 44 44 45 45 45 45 46 46 46 47 47 48 49 50 51 52 53 53 53 53 53 53 54 55 55 54 53 53 52 52 51 50 49 48 47 47 46 45 45 45 45 46 47 47 47 47 46 45 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 38 39 39 39 39 39 38 38 38 39 38 36 35 36 38 40 40 40 39 39 40 40 40 40 41 41 40 41 42 42 43 43 43 43 44 45 46 48 48 48 49 49 48 48 47 47 45 44 43 43 44 45 44 43 42 41 41 41 40 39 39 39 39 39 39 39 38 38 38 38 38 37 37 37 36 36 36 36 36 37 37 38 38 38 38 38 38 38 38 38 38 38 39 39 40 41 41 42 42 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 44 44 45 44 43 42 42 42 43 43 43 43 42 42 41 41 39 38 37 38 37 37 37 36 36 37 36 37 37 37 37 39 40 41 41 42 42 42 42 41 41 41 41 41 41 42 43 43 43 43 44 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 42 41 42 43 43 43 43 43 44 43 42 42 42 42 43 42 42 42 42 43 43 43 42 41 41 42 43 43 43 43 43 43 43 42 42 42 43 43 44 45 44 44 44 44 44 44 45 45 45 45 45 44 44 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 44 44 44 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 42 42 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 41 41 41 41 42 42 43 43 42 43 43 43 42 41 41 41 40 40 40 40 39 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 40 40 40 41 41 41 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 37 54 56 57 58 60 61 61 61 59 57 56 56 54 53 52 49 46 47 51 53 54 52 49 48 50 50 48 47 43 41 41 41 41 42 43 46 48 51 52 51 51 50 49 48 49 51 50 51 53 51 46 43 42 44 46 49 52 52 53 52 52 52 51 49 48 47 46 46 46 46 45 45 45 45 45 45 45 44 44 43 43 42 42 42 43 43 43 43 44 44 45 45 45 45 46 46 46 46 47 48 48 50 51 52 53 53 52 52 52 53 54 54 54 54 53 52 52 52 51 50 49 48 47 47 46 46 45 44 44 45 46 47 47 47 46 46 45 45 45 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 38 39 39 39 39 39 39 39 40 40 40 39 38 39 40 39 38 36 36 37 39 39 40 39 38 39 39 40 40 40 40 40 40 41 42 42 42 42 42 43 44 45 47 48 48 49 49 49 49 48 47 46 45 44 44 45 45 45 44 42 41 41 41 40 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 40 41 41 42 42 43 43 43 44 44 45 45 44 44 44 44 45 45 45 45 45 44 43 43 44 44 44 43 42 42 43 43 44 43 43 43 42 41 41 40 38 37 37 37 37 37 37 37 37 36 37 38 38 39 40 40 41 41 41 41 41 41 40 41 41 41 42 42 42 43 43 42 42 43 43 43 44 44 44 44 43 43 43 43 44 44 43 43 43 42 42 42 43 43 43 43 43 44 43 43 43 43 43 43 42 42 42 42 42 43 43 42 41 41 42 43 43 43 43 43 43 43 42 42 42 42 43 44 44 45 45 44 44 44 44 45 45 45 44 44 44 44 44 44 44 45 45 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 42 42 43 43 42 41 41 41 41 41 40 40 40 40 40 40 41 41 41 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 41 41 41 42 42 43 42 42 42 43 43 43 42 41 41 41 40 40 40 40 39 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 39 39 40 40 40 41 41 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 36 36 35 36 36 36 36 36 37 37 37 55 59 60 61 61 61 61 60 58 55 54 54 54 52 50 49 50 50 51 54 55 54 54 53 51 50 50 48 43 41 41 41 41 41 43 45 47 49 49 49 51 51 49 46 46 48 48 49 52 50 45 42 42 44 46 49 53 55 55 55 54 54 52 50 48 47 47 46 46 46 45 45 45 45 45 45 45 45 44 44 43 42 42 42 42 43 43 44 44 45 44 44 45 45 46 46 46 46 47 48 49 50 51 52 52 52 51 51 52 52 52 53 53 53 53 52 52 51 50 49 48 47 47 47 46 46 45 44 44 45 45 46 46 47 46 46 45 45 45 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 39 37 37 37 37 38 39 38 38 38 39 39 39 40 40 40 40 40 41 41 42 41 42 42 43 44 46 47 47 48 48 48 49 48 47 46 45 44 45 46 45 45 44 42 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 37 37 37 37 37 37 37 37 38 38 38 38 39 39 40 40 40 41 41 41 42 43 43 43 44 44 45 45 45 44 44 45 45 45 45 45 44 43 42 43 43 44 43 43 42 42 43 43 43 42 42 42 42 40 40 40 39 37 37 37 37 37 37 37 36 37 38 39 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 43 43 43 42 42 42 42 43 43 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 43 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 42 43 43 44 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 46 46 46 46 45 45 45 44 45 45 44 43 43 42 42 43 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 41 41 42 42 43 43 43 43 43 43 43 43 42 41 41 41 40 40 40 39 39 39 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 39 40 40 40 40 40 39 38 38 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 37 37 37 59 61 62 62 62 61 61 60 57 55 54 53 51 50 50 52 54 55 54 55 55 54 54 52 49 47 46 44 42 41 41 41 41 41 42 43 44 45 45 46 47 48 48 47 45 45 45 46 50 48 44 41 42 44 46 49 53 54 55 55 54 54 52 50 49 48 48 48 47 47 46 46 45 45 45 45 45 45 45 44 43 43 42 42 42 43 43 43 44 44 44 44 44 45 46 46 46 46 47 48 48 50 51 51 51 51 51 51 51 51 52 52 52 53 53 52 52 51 50 49 48 47 47 47 46 46 45 45 44 44 44 45 46 46 46 46 45 44 45 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 41 41 41 40 39 38 37 36 36 37 37 37 37 38 38 39 40 40 40 40 40 40 41 41 41 41 42 42 43 44 46 46 47 47 48 48 48 48 46 45 44 44 45 45 44 44 43 42 42 42 41 40 40 40 39 39 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 37 37 38 38 38 39 39 39 39 40 40 41 41 41 41 42 43 43 44 44 44 45 45 45 44 44 43 43 44 44 45 44 43 42 42 43 43 43 42 42 43 43 43 43 42 41 41 41 40 39 39 38 37 37 36 36 36 36 37 37 38 40 40 40 40 40 40 40 40 40 41 42 42 41 41 42 42 43 43 43 43 42 42 42 42 42 42 43 44 44 44 43 43 43 42 42 43 43 42 42 41 42 43 43 43 44 44 44 44 44 43 43 43 42 42 42 42 41 42 43 42 41 40 41 42 43 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 45 44 44 44 44 44 44 44 44 43 43 44 44 44 45 45 45 45 45 45 46 46 46 46 45 45 45 45 45 45 45 44 43 42 42 42 43 44 44 44 43 43 43 43 43 43 44 43 43 43 43 43 43 43 42 42 42 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 41 42 41 41 42 43 43 43 43 43 44 43 43 43 42 41 41 41 41 40 40 39 38 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 38 38 38 38 38 39 40 40 40 39 38 38 38 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 37 37 37 61 62 62 61 61 61 60 60 57 55 54 52 50 50 53 55 56 56 55 55 54 53 52 51 49 47 45 42 43 43 43 42 41 41 41 42 42 43 43 43 44 44 44 45 43 42 44 47 48 45 42 42 43 44 45 46 49 51 52 52 51 51 51 50 50 50 49 49 48 47 46 46 45 45 45 45 45 45 45 44 43 43 42 42 42 42 42 42 43 43 44 44 44 45 46 46 46 46 47 47 48 49 50 51 51 51 50 50 50 51 51 52 52 53 52 52 51 51 50 49 48 47 47 47 46 46 45 45 44 43 44 45 45 46 46 46 45 44 44 44 45 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 42 41 40 39 38 37 37 36 36 36 36 37 38 39 40 40 40 40 39 40 40 41 41 41 42 42 43 44 46 46 46 47 47 48 48 47 45 44 43 44 44 44 43 43 43 43 43 42 41 40 40 40 39 39 38 38 38 38 38 37 37 37 37 37 36 36 36 36 36 37 37 37 37 38 38 38 38 39 40 40 40 40 40 41 41 41 42 42 43 44 44 45 45 45 44 44 44 44 43 43 43 44 44 44 42 42 42 42 42 42 41 42 43 43 43 42 41 41 40 40 40 39 38 37 37 37 36 36 36 36 36 38 40 41 41 40 39 39 39 40 41 41 42 43 43 42 42 43 43 42 42 42 42 42 42 43 43 43 43 43 43 44 44 43 43 43 42 42 42 42 42 41 42 43 43 43 43 44 44 44 44 44 43 43 43 42 42 42 42 41 41 42 42 41 40 41 42 43 42 42 42 42 42 42 42 43 42 42 43 43 43 43 44 44 44 44 44 43 43 43 44 43 43 43 44 44 44 45 45 45 45 45 45 46 46 46 46 45 45 46 46 46 45 45 44 43 42 42 42 43 43 44 44 43 43 43 43 43 43 43 44 44 43 43 43 43 43 42 42 42 42 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 40 40 40 40 40 40 41 41 41 41 42 42 42 42 42 42 42 42 42 43 43 43 43 43 44 43 43 42 41 41 40 40 41 40 40 39 39 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 37 37 37 37 37 37 37 37 38 38 38 38 39 39 38 38 38 37 37 37 38 38 38 38 38 37 37 36 36 37 37 37 37 36 36 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 37 37 37 37 37 37 37 37 37 61 61 61 61 61 60 60 58 55 54 54 53 53 53 55 56 56 55 54 54 53 53 53 53 53 52 48 43 45 49 49 45 41 41 41 41 41 41 42 42 42 42 42 42 41 41 42 44 44 43 42 42 43 43 44 43 45 48 49 49 50 51 52 53 53 53 51 50 49 48 47 46 45 45 45 45 45 45 45 44 44 43 43 43 42 42 42 42 42 43 43 44 44 45 45 45 45 46 46 46 47 48 50 51 51 51 50 49 50 50 51 51 52 52 52 52 51 51 50 49 48 47 47 46 46 46 45 45 44 43 43 44 45 46 46 46 45 44 44 44 44 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 42 41 40 40 40 39 38 38 37 36 36 37 39 40 39 39 39 39 39 40 41 41 41 41 41 41 43 44 45 45 45 45 47 47 47 46 45 43 43 44 44 43 43 43 43 43 43 42 41 40 40 39 39 39 38 38 38 37 37 37 37 36 36 36 36 36 36 36 37 37 37 38 38 38 38 38 39 40 40 39 39 40 41 41 42 43 43 44 44 45 45 46 45 44 43 43 43 43 42 43 43 43 43 43 42 41 41 41 42 42 43 43 44 43 42 41 40 40 39 39 39 38 37 36 36 36 36 36 36 37 39 40 40 40 39 39 39 40 41 41 42 42 42 42 43 43 42 42 42 42 41 42 42 42 43 43 43 44 44 43 44 44 44 44 43 42 42 41 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 41 41 42 41 41 41 42 42 42 42 42 42 42 42 42 43 43 44 44 44 44 44 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 44 43 43 42 42 42 43 44 44 43 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 42 42 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 42 42 42 42 42 43 43 43 43 43 43 43 42 42 43 44 44 44 43 43 42 42 41 41 40 40 41 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 37 37 37 38 38 38 38 38 38 37 37 36 36 37 37 37 37 36 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 36 36 36 37 37 61 60 60 60 60 60 60 58 56 56 57 56 56 56 55 55 54 53 53 52 51 52 53 52 52 52 49 44 46 51 52 46 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 46 47 49 52 54 55 54 54 54 53 52 50 49 48 47 46 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 41 42 42 42 43 44 44 44 45 46 46 46 47 48 49 50 51 51 50 49 50 50 51 51 52 52 51 51 51 51 50 49 48 47 47 46 46 46 45 45 44 43 43 44 45 45 45 46 46 45 44 43 44 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 41 41 40 40 40 40 39 36 35 36 39 39 39 39 38 38 38 39 40 40 41 41 40 41 42 42 43 44 44 44 46 47 47 47 46 44 43 43 44 44 43 43 44 43 43 42 41 40 40 39 39 38 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 37 37 38 38 38 38 38 38 39 39 39 39 40 41 41 42 43 43 44 45 45 46 45 44 43 43 42 42 42 42 43 43 43 43 43 42 41 41 41 42 43 43 43 44 43 43 42 41 39 39 38 38 37 36 36 36 36 36 36 37 39 39 39 39 40 39 39 39 40 40 41 41 42 42 42 42 42 42 41 42 41 41 42 43 43 43 43 43 44 44 44 44 43 43 43 43 43 42 41 41 41 41 42 42 42 43 42 42 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 40 40 41 41 41 42 42 41 41 41 42 42 42 42 42 42 42 43 43 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 46 46 46 46 46 46 45 44 44 44 44 43 42 41 42 43 43 44 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 43 44 44 43 43 43 42 42 41 41 40 40 40 40 39 39 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 36 36 36 37 37 60 59 59 60 59 59 59 59 58 58 58 58 57 57 56 55 55 53 53 52 51 50 49 49 49 49 47 45 45 50 49 44 46 47 44 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 44 45 45 47 50 53 55 54 53 53 54 54 53 52 51 49 48 47 46 46 45 45 45 44 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 43 44 44 45 45 45 46 48 49 50 51 51 49 49 50 50 50 51 52 52 51 50 51 50 50 49 48 48 47 46 46 46 45 45 44 44 43 43 45 45 45 46 46 45 44 43 43 43 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 42 43 43 42 40 40 40 40 39 38 36 36 38 38 38 38 38 38 38 38 39 40 41 41 40 41 41 41 42 42 43 44 45 46 47 47 46 44 42 42 44 45 43 42 44 44 43 42 41 40 40 40 39 38 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 36 37 37 38 38 38 38 38 38 39 39 40 40 41 41 42 43 43 44 45 45 45 45 44 43 42 42 41 42 43 42 42 42 42 43 42 41 41 41 42 42 43 43 44 43 42 42 41 40 39 37 37 37 36 36 35 35 36 37 38 39 38 38 39 40 40 39 40 40 41 41 41 42 43 42 42 42 41 41 41 41 41 42 43 43 43 43 43 44 43 43 43 43 42 43 43 42 42 41 41 41 41 42 42 42 42 42 42 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 41 41 41 42 42 43 42 42 41 42 42 42 42 42 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 45 45 44 44 44 44 43 43 41 41 42 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 40 42 42 42 43 43 43 43 43 43 43 44 44 43 43 43 44 44 43 43 43 43 42 42 41 41 40 40 40 40 39 39 39 39 38 38 37 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 37 37 36 36 37 37 37 36 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 37 37 37 37 36 36 36 37 37 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 56 55 54 53 51 49 49 51 52 49 47 48 51 49 48 52 50 44 42 43 44 43 41 42 44 44 43 43 42 41 41 41 41 41 41 40 40 40 42 44 46 48 50 53 53 52 51 52 53 54 54 53 53 51 50 49 47 46 46 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 43 44 45 45 46 48 49 50 50 50 49 48 49 49 49 50 51 51 50 50 50 50 49 48 48 47 47 47 46 46 45 45 45 44 44 43 44 44 45 45 45 45 45 44 43 43 43 44 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 44 45 44 41 40 40 40 40 39 37 36 36 36 36 37 37 38 37 38 39 40 40 41 41 40 40 40 41 41 42 43 44 45 46 47 46 45 42 42 44 44 42 42 44 44 44 44 42 41 41 40 39 38 38 38 38 37 37 37 37 37 36 36 36 36 36 36 36 36 37 37 37 38 38 38 38 39 40 40 41 41 42 42 43 43 44 45 45 46 45 44 43 42 41 41 41 42 43 42 41 41 42 43 42 40 40 41 41 42 42 43 44 43 41 41 40 40 39 38 36 36 36 35 35 36 37 38 38 38 38 39 40 40 40 39 40 41 41 41 42 43 43 42 41 41 41 40 41 41 41 42 43 43 44 44 44 43 43 43 43 43 42 41 42 41 41 40 40 41 42 42 43 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 41 40 40 40 41 41 42 42 42 42 43 43 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 44 44 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 45 45 44 44 44 43 43 44 43 41 41 42 43 43 44 43 43 43 43 42 42 43 43 42 42 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 41 41 42 42 42 42 42 42 42 42 42 42 42 41 41 40 39 41 42 42 42 43 43 43 42 42 43 43 43 44 44 44 44 44 44 43 43 43 42 42 42 41 41 40 40 40 40 38 38 38 37 37 37 37 38 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 36 36 36 36 37 37 37 37 36 36 36 36 36 37 37 37 37 38 38 38 37 37 36 36 36 37 37 36 34 34 34 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 36 36 37 37 59 59 59 59 59 58 58 58 58 58 59 58 58 58 58 58 58 58 57 55 53 53 52 52 54 53 51 51 53 54 52 52 53 47 44 45 48 49 46 44 47 50 49 48 47 46 46 45 43 41 41 41 40 38 38 39 41 44 47 49 50 52 51 49 50 52 53 53 53 53 52 51 50 49 48 47 46 46 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 42 42 41 42 43 44 45 46 47 49 50 50 49 48 48 49 49 49 49 50 50 49 50 50 49 49 48 47 46 46 46 46 46 45 44 44 45 44 43 43 43 44 44 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 44 45 43 41 40 39 39 39 39 38 37 36 36 36 36 37 37 38 39 39 40 40 41 40 40 40 40 40 41 42 43 45 45 46 46 46 44 42 42 42 41 42 44 44 44 44 43 42 42 41 40 39 38 38 38 38 37 37 37 37 37 37 36 36 36 35 36 37 37 37 37 38 38 39 39 40 40 40 41 42 43 43 44 44 45 45 46 46 45 44 43 42 41 41 41 42 42 42 41 41 42 42 41 40 40 41 41 42 42 43 43 43 41 40 40 40 39 38 36 35 35 35 36 38 39 38 37 38 39 40 40 40 39 39 40 40 40 41 41 42 42 42 40 40 40 40 41 41 42 42 42 43 43 43 43 43 43 42 42 43 42 41 41 41 41 40 40 41 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 41 40 40 41 42 42 42 42 42 43 43 43 42 42 42 42 42 42 42 43 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 44 43 43 43 43 43 42 41 41 42 43 43 44 44 44 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 43 42 42 42 42 42 43 43 42 42 41 39 41 42 42 42 43 43 42 41 41 42 42 43 43 43 43 44 44 43 43 43 42 42 42 42 41 41 40 40 40 39 38 38 37 37 37 38 38 38 38 37 37 37 37 38 38 37 36 36 36 36 36 36 37 37 37 37 36 36 36 36 37 37 37 36 36 36 36 36 36 36 36 36 37 37 37 36 35 35 36 36 36 36 36 37 37 37 37 37 36 36 36 36 37 37 36 35 35 34 34 34 35 35 36 35 35 35 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 58 58 58 58 58 58 58 58 58 58 59 59 59 58 58 58 59 58 57 56 55 54 54 54 56 55 54 54 56 55 54 54 52 47 47 51 53 52 50 50 52 53 52 52 51 50 52 51 47 45 43 41 39 38 38 38 38 41 45 47 50 51 50 48 49 51 52 52 52 52 51 51 51 50 50 49 49 48 47 46 46 45 45 45 45 44 44 44 44 44 44 44 43 43 43 42 42 43 44 44 45 47 49 49 49 49 48 48 48 48 48 49 50 49 49 49 49 49 49 49 47 45 45 45 46 45 45 44 44 44 44 43 43 43 43 44 44 45 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 41 41 41 41 41 42 44 44 42 40 39 39 39 39 40 39 38 38 37 36 36 36 38 38 39 40 40 41 40 40 40 40 40 40 40 41 43 44 44 45 45 45 42 41 42 42 43 44 44 44 44 43 43 43 42 40 39 38 38 38 37 37 37 37 37 37 37 37 37 36 35 36 37 37 37 38 38 39 40 40 40 40 41 41 42 43 43 44 45 45 46 45 45 44 43 43 42 41 41 41 41 42 41 40 40 41 41 40 40 41 41 41 42 43 43 43 42 41 40 40 39 38 36 35 35 35 35 37 39 39 38 37 38 39 40 40 39 38 39 39 39 40 40 41 41 42 41 40 40 41 41 41 41 42 42 42 43 43 44 43 43 42 41 42 42 42 41 41 40 40 40 41 42 43 42 42 42 42 42 43 43 43 43 43 43 42 42 42 41 41 41 40 39 40 41 42 42 42 43 43 43 43 42 42 42 43 43 43 43 43 43 44 43 43 43 44 43 43 43 43 43 43 43 43 44 44 45 45 44 44 45 45 45 45 46 46 46 46 47 47 47 46 46 46 46 45 43 42 42 43 43 43 41 40 42 43 43 44 44 44 44 44 43 43 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 42 42 42 42 43 43 42 40 41 43 43 43 43 42 41 42 42 42 42 42 42 42 43 43 43 42 42 42 41 41 42 42 41 41 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 37 36 36 37 37 37 37 37 36 36 36 36 36 36 36 36 36 37 36 36 35 35 35 36 36 36 35 35 35 35 35 36 36 35 35 35 37 38 38 37 37 36 35 34 34 34 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 38 37 37 36 36 36 35 35 58 58 58 58 58 58 58 58 58 58 58 59 59 59 58 58 59 58 58 57 56 56 56 57 57 57 56 56 56 56 55 54 50 49 52 54 53 53 54 53 53 53 53 52 51 51 51 50 48 45 43 41 41 40 39 38 38 38 42 46 49 50 48 47 48 49 50 50 50 50 50 50 50 50 50 50 50 49 49 48 47 47 47 46 45 45 45 45 44 44 44 43 43 43 43 42 42 42 43 43 44 46 48 49 48 48 48 47 47 48 49 49 49 48 49 49 49 49 49 48 47 46 45 45 45 45 45 44 44 43 43 43 42 42 43 44 44 44 44 44 43 43 43 42 42 43 43 43 42 42 42 41 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 41 42 43 43 41 39 38 38 39 40 40 39 38 38 37 36 36 38 38 39 40 40 41 40 40 40 40 39 39 40 40 41 43 43 45 45 44 42 41 41 42 43 44 44 44 43 43 43 42 41 41 40 39 38 38 37 37 37 37 36 36 36 36 36 36 35 36 37 37 37 38 38 38 39 39 40 40 41 41 42 42 43 44 44 44 45 44 44 44 43 42 41 40 40 41 41 41 41 40 40 40 40 40 40 41 42 42 43 43 42 42 41 40 40 39 39 38 36 35 35 35 36 37 38 39 38 37 38 39 40 39 38 38 38 38 38 38 39 40 41 41 40 40 40 40 41 41 42 42 42 42 43 44 44 43 43 42 41 41 41 41 41 40 40 40 40 42 43 43 42 41 42 42 42 43 43 43 43 42 42 42 41 41 40 41 41 40 39 40 41 41 42 42 43 43 43 43 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 44 44 44 45 45 46 45 45 46 46 46 46 46 46 47 46 46 46 46 45 43 42 42 42 43 42 41 40 42 42 43 43 44 44 45 44 44 43 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 42 43 43 42 40 41 43 43 43 41 41 42 43 44 44 42 42 42 42 42 42 41 41 41 41 41 41 42 42 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 36 36 36 37 37 37 36 36 36 36 36 36 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 38 38 38 37 36 35 35 34 35 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 59 58 58 57 57 57 57 57 57 58 58 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 56 56 56 55 54 51 52 55 54 52 51 52 52 51 50 49 48 47 46 46 46 44 43 42 43 45 45 42 39 38 38 39 44 47 47 45 45 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 46 45 45 45 44 44 43 43 43 43 43 43 42 42 42 43 44 47 47 47 47 47 47 47 49 50 49 48 48 49 49 49 49 48 48 47 46 45 44 45 44 44 44 43 43 43 43 42 42 43 43 44 44 44 44 43 43 43 42 41 42 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 40 40 41 42 43 41 39 38 38 39 40 39 39 38 38 37 36 36 37 38 39 40 41 41 40 40 40 40 40 39 39 39 40 42 43 44 44 43 42 41 41 42 42 43 43 43 43 43 42 42 41 41 40 39 38 38 38 37 37 36 36 35 35 35 35 35 36 36 37 37 37 37 38 38 39 39 40 40 41 41 41 42 42 43 43 43 43 43 43 43 43 42 41 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 42 42 42 41 40 40 39 38 38 36 35 35 35 36 37 39 40 39 37 37 38 39 39 38 38 38 39 39 39 39 39 40 40 39 39 40 40 41 41 42 42 42 42 43 44 43 43 43 42 41 41 41 40 40 39 40 40 40 41 42 42 41 42 42 43 43 42 42 43 42 41 42 41 40 41 40 40 40 39 40 41 41 42 42 42 43 43 43 43 43 43 43 44 44 44 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 44 44 44 45 45 45 45 45 46 46 46 46 46 46 47 46 46 46 46 45 43 43 42 42 42 42 40 41 42 42 43 43 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 41 40 42 43 42 41 42 43 44 44 44 44 43 43 43 43 42 41 41 42 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 36 36 36 35 35 36 35 35 35 35 36 36 36 36 36 36 36 36 36 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 35 34 35 36 36 36 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 59 59 58 57 57 57 57 56 57 58 58 59 59 58 58 59 58 58 58 58 58 58 58 57 57 57 57 57 56 55 55 54 52 53 55 53 52 52 51 51 50 49 48 47 46 45 46 45 43 44 45 46 49 49 44 42 40 38 38 40 44 46 44 44 45 46 47 47 48 48 48 48 48 48 49 48 48 48 48 47 47 48 49 49 48 48 47 46 46 45 44 44 43 43 43 43 43 43 43 42 42 43 45 46 46 46 46 46 47 48 49 49 48 48 49 49 49 48 48 47 46 46 45 44 44 44 44 44 43 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 41 42 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 40 40 40 40 40 40 40 41 40 39 38 38 39 40 39 39 38 38 37 36 35 37 39 40 40 41 41 41 40 40 40 40 39 38 39 39 40 42 43 43 43 41 42 43 44 44 43 43 43 43 42 42 41 41 40 40 39 38 38 38 37 36 36 35 35 35 36 36 36 37 37 37 37 37 37 38 38 38 39 40 40 40 40 41 41 42 43 43 43 43 42 42 42 42 42 41 40 40 40 40 40 40 40 40 40 40 40 41 41 42 43 43 43 43 43 42 41 41 40 38 38 36 35 35 35 36 37 39 39 38 37 38 39 39 38 38 39 40 40 41 42 41 40 40 40 40 40 40 40 40 40 41 42 42 43 43 43 43 42 42 42 41 40 40 40 39 40 40 40 40 41 41 41 42 42 42 42 43 42 42 42 41 41 41 40 39 40 39 39 40 40 41 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 45 45 44 44 45 45 45 45 45 45 46 47 46 46 46 46 45 44 44 43 42 42 41 40 40 42 43 43 44 44 44 44 44 44 44 43 43 43 42 42 41 41 42 42 42 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 40 40 42 41 41 43 43 44 45 45 44 44 43 43 43 43 42 42 43 42 42 41 41 40 40 40 40 41 41 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 35 35 35 35 35 35 34 35 35 35 35 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 58 59 59 57 57 57 57 56 56 57 58 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 57 57 56 55 55 54 53 54 54 53 53 53 53 53 53 51 50 49 48 48 50 48 45 46 48 49 51 49 47 46 44 39 38 38 40 44 45 44 45 46 46 46 46 47 47 47 48 48 48 48 47 47 47 46 47 48 48 48 48 48 48 48 47 46 45 45 44 43 43 43 44 44 43 43 42 43 44 45 45 46 46 46 47 47 47 48 48 49 49 49 48 48 47 47 46 45 44 43 44 44 44 44 43 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 41 42 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 40 40 39 38 39 40 40 40 40 39 39 36 36 38 40 41 41 41 41 40 40 40 40 39 38 38 38 38 38 41 42 42 42 41 42 44 44 44 43 42 42 42 41 41 41 41 40 40 39 38 38 38 37 36 36 35 35 36 36 36 37 37 37 37 37 37 37 38 38 38 39 39 39 39 40 40 41 42 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 41 41 42 42 41 41 43 44 44 44 44 43 42 41 40 39 38 37 36 35 35 35 35 37 37 37 37 37 38 39 38 38 38 39 40 40 41 42 41 41 41 41 41 41 41 41 40 41 42 42 43 43 43 43 43 42 41 41 41 40 39 39 40 40 41 41 41 41 42 42 42 42 42 42 43 42 42 41 41 41 40 39 39 39 39 40 40 41 42 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 43 43 44 44 44 43 44 44 44 44 44 45 45 45 45 45 45 46 46 47 46 46 45 45 45 44 44 43 42 41 40 40 41 43 43 43 44 44 44 44 44 44 43 43 43 43 43 42 42 41 41 42 42 42 41 41 42 42 43 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 41 39 40 41 42 42 43 44 44 45 44 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 58 58 58 58 56 57 57 56 56 57 58 58 58 58 57 57 58 57 55 55 57 57 57 56 56 56 57 57 56 56 56 56 55 55 54 54 53 53 54 54 54 52 52 50 50 51 52 50 47 46 49 52 52 50 48 48 46 42 38 38 38 40 42 43 45 45 45 45 45 46 46 46 47 47 47 47 46 46 46 47 48 48 48 48 48 48 48 47 47 47 46 46 45 44 44 43 43 44 44 43 42 42 43 44 45 45 45 45 46 47 47 48 49 49 49 49 48 47 46 46 46 45 44 43 43 44 44 43 43 42 42 42 42 42 43 43 42 42 42 42 43 43 43 42 41 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 40 40 41 41 39 39 41 41 40 41 40 39 37 36 39 40 41 41 41 40 40 39 39 39 38 38 38 37 37 38 40 42 41 41 40 40 42 42 42 42 41 41 40 41 41 41 41 40 39 39 38 38 38 37 37 36 35 35 35 36 36 36 36 36 37 37 37 37 38 38 38 38 38 38 39 39 40 41 41 42 43 42 42 41 41 41 41 41 40 40 40 40 40 40 40 41 41 42 43 43 42 42 43 44 44 44 44 43 42 41 40 38 38 38 36 35 35 35 35 36 37 36 37 38 38 38 37 38 39 39 40 40 41 42 41 41 41 42 42 42 42 42 42 42 42 43 43 43 42 42 42 42 41 40 40 40 39 40 40 41 42 42 42 42 43 42 42 42 42 42 43 42 41 41 40 40 40 39 39 40 40 41 41 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 43 43 42 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 46 45 45 44 43 43 43 42 42 41 40 40 42 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 42 41 41 41 41 41 42 43 43 42 42 42 42 42 42 42 42 42 42 43 42 41 41 41 41 40 40 41 42 42 42 43 44 44 44 44 44 44 44 45 44 43 43 43 43 43 42 41 41 41 41 41 41 41 40 39 38 37 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 57 57 57 57 56 56 56 55 55 56 57 58 58 58 57 56 56 56 55 55 57 58 57 56 56 56 56 56 57 57 57 56 56 55 55 55 54 54 55 55 54 53 54 51 51 52 53 52 50 48 48 51 50 48 46 45 44 42 39 38 38 38 39 43 46 45 45 45 45 45 45 45 45 45 46 46 46 45 46 47 49 49 49 49 49 49 49 48 48 48 47 47 46 45 44 44 43 44 44 43 42 42 44 44 44 45 45 44 46 49 50 50 50 50 49 49 48 47 46 45 45 45 45 44 43 44 43 43 43 42 42 42 43 43 43 43 42 42 42 42 42 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 40 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 41 41 40 39 41 40 39 40 40 39 36 36 38 40 41 41 40 40 40 38 38 38 38 37 37 37 36 37 38 40 40 40 39 38 40 41 40 40 40 40 41 41 41 41 41 40 39 39 39 38 38 37 37 36 35 35 35 35 35 35 35 35 36 36 37 37 37 38 38 38 38 38 39 39 40 41 41 42 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 41 42 43 43 43 43 43 43 43 43 43 43 42 41 41 40 40 40 39 37 36 35 35 35 35 36 37 38 39 38 37 37 38 39 39 40 40 41 40 40 40 41 42 43 43 43 43 42 43 43 43 43 42 42 41 41 41 41 40 40 39 40 41 41 41 42 42 42 42 42 42 41 42 42 42 42 42 41 40 40 39 39 39 40 41 41 42 42 42 41 41 42 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 43 43 42 42 43 42 42 43 44 43 42 43 43 43 44 44 44 44 45 45 46 46 46 46 46 45 44 43 43 43 42 41 41 40 40 42 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 42 42 42 42 42 41 41 42 42 41 41 42 42 41 39 39 40 40 41 41 41 42 42 43 43 44 44 44 44 44 44 44 45 44 43 43 43 43 43 42 41 41 41 41 41 41 41 41 40 38 37 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 55 56 56 56 55 55 56 55 54 55 56 57 57 57 57 56 56 56 54 54 56 57 57 57 56 55 55 56 56 56 57 56 56 56 56 56 55 55 55 55 54 54 53 51 52 53 53 53 51 49 49 51 51 48 46 45 44 42 42 41 38 38 39 42 45 46 45 45 45 44 44 44 44 43 44 45 45 45 45 46 47 48 48 48 48 48 49 49 49 48 48 48 47 46 46 45 44 44 43 43 43 44 45 45 45 45 44 44 46 48 50 51 51 50 50 49 48 47 46 45 45 45 45 44 43 44 43 43 43 42 42 43 43 43 43 43 43 42 42 42 42 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 40 40 39 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 39 38 38 38 38 38 39 40 39 37 36 37 39 40 40 40 40 39 38 38 37 37 37 37 36 36 36 37 38 39 39 39 38 39 40 39 39 39 40 41 42 42 42 41 40 40 40 39 38 38 37 37 37 36 35 36 36 36 35 35 35 35 36 37 37 37 37 37 37 38 38 39 40 40 40 41 41 41 41 41 41 40 40 39 39 39 39 39 39 40 41 41 41 42 43 43 44 44 44 43 42 42 42 42 42 41 41 40 40 40 39 37 35 35 35 35 36 37 38 39 38 37 37 38 38 38 39 39 39 39 39 40 40 41 42 43 43 43 43 43 43 44 44 43 43 42 41 41 40 40 40 39 40 41 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 40 40 39 39 40 40 41 41 42 42 42 41 42 43 42 42 42 43 43 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 42 43 42 42 42 42 42 43 43 43 42 43 44 44 44 44 44 44 45 45 45 46 46 46 45 45 44 44 43 43 42 41 40 40 40 42 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 41 40 39 40 40 41 41 41 42 42 41 42 42 43 43 44 45 44 44 44 44 45 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 53 55 55 55 54 54 56 55 54 55 56 56 56 56 56 56 56 55 53 53 55 56 56 57 56 55 55 55 55 56 56 56 56 56 57 57 56 56 56 55 54 53 53 53 53 54 54 53 51 50 52 52 52 51 49 46 44 44 45 44 40 38 38 39 42 44 44 45 45 45 44 44 44 43 43 43 43 44 44 44 45 46 46 46 46 46 48 49 49 49 49 49 48 47 46 46 45 44 44 43 43 44 45 45 45 45 44 44 45 46 48 50 50 50 49 49 48 47 46 46 45 45 44 43 43 43 43 43 42 42 42 43 43 43 43 43 42 42 41 41 42 43 42 42 41 41 40 40 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 42 42 42 42 41 41 41 41 40 40 40 39 39 39 39 38 37 37 38 40 40 38 36 36 38 40 40 40 39 39 38 37 37 37 37 36 36 36 36 36 37 38 38 38 37 38 38 37 38 39 40 41 42 43 42 42 41 40 40 39 39 38 38 38 37 36 36 37 37 37 36 35 35 35 36 37 37 37 37 37 37 38 38 39 40 40 40 40 41 41 41 41 41 40 40 39 39 39 39 39 40 40 41 42 42 42 43 43 44 44 44 43 42 42 41 42 43 42 41 41 41 40 38 36 35 35 35 35 36 37 38 38 37 37 38 39 39 39 40 41 40 40 40 40 41 41 41 42 42 42 43 43 44 44 44 43 43 42 41 41 40 39 39 39 40 41 41 40 40 40 40 41 41 42 42 42 43 42 41 41 41 41 41 40 39 39 39 40 40 41 41 41 41 41 42 42 42 42 43 43 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 42 41 42 43 43 42 41 41 42 42 42 42 43 44 44 44 44 44 44 44 44 44 45 45 46 46 45 44 43 43 43 43 43 42 41 40 39 41 43 43 42 43 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 40 40 40 40 40 41 40 39 39 39 40 41 41 41 41 42 42 42 42 42 42 43 43 44 45 44 44 44 44 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 34 34 34 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 54 53 53 53 53 54 54 53 53 53 54 55 55 54 55 55 55 54 53 53 54 54 55 57 56 55 54 54 54 55 55 55 55 56 56 57 56 56 56 55 54 54 54 54 55 55 54 54 53 52 53 52 52 51 48 45 46 46 48 47 42 39 38 38 39 41 43 45 46 45 45 44 44 43 43 43 42 43 43 43 44 44 44 44 45 45 47 48 48 48 49 49 48 47 46 46 45 45 44 42 42 44 45 45 44 44 44 44 44 45 48 49 50 49 49 48 48 47 46 46 45 45 44 43 43 43 43 42 41 41 42 43 43 43 43 43 42 42 41 41 42 42 42 42 41 41 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 43 43 43 43 43 43 42 42 42 41 41 40 40 40 40 40 40 39 37 37 37 38 38 38 36 35 36 38 39 39 39 39 38 38 37 37 37 36 36 36 35 35 36 37 37 38 37 37 37 37 38 39 40 41 41 42 43 42 41 40 40 40 39 38 38 38 37 37 37 37 36 36 36 35 35 35 36 37 37 37 37 37 37 37 38 39 39 40 40 40 41 41 41 41 40 40 39 39 39 39 40 40 41 40 40 41 42 42 43 43 44 44 43 43 42 42 41 42 43 42 41 40 40 40 38 36 35 35 35 36 37 38 37 37 36 37 38 38 39 40 41 42 41 41 41 41 41 41 42 42 42 42 43 44 44 44 44 43 43 43 42 41 40 39 38 38 39 40 40 40 39 40 40 41 42 43 43 43 42 41 41 40 40 41 40 39 39 39 39 40 40 41 41 41 41 41 41 41 42 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 42 42 42 42 41 41 42 42 42 43 43 43 43 43 43 44 44 44 44 44 45 45 46 45 44 43 43 43 43 43 42 42 41 39 39 41 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 42 42 41 42 42 42 41 41 41 40 40 40 40 39 39 40 40 41 41 42 41 41 41 42 42 42 43 43 43 43 44 44 44 43 43 44 44 45 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 55 55 54 53 53 53 53 53 52 52 52 53 52 52 53 54 54 53 53 52 53 53 54 55 55 55 53 52 53 54 54 54 55 55 55 56 56 56 55 55 55 55 55 55 56 55 55 54 54 54 54 53 51 50 48 47 50 50 50 48 44 42 39 37 37 39 42 45 46 46 46 45 45 44 43 43 42 41 42 42 43 43 43 44 44 45 46 47 48 48 48 49 49 48 47 47 46 45 44 43 42 42 44 44 43 43 43 43 43 45 48 49 49 49 48 48 47 46 46 46 45 44 44 43 43 43 43 42 41 41 42 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 41 42 42 43 43 44 44 44 44 44 43 43 43 43 42 42 42 41 41 41 40 40 40 39 39 38 38 37 37 37 36 35 35 37 38 38 39 39 38 38 37 37 37 36 36 36 35 35 35 36 36 37 37 37 38 38 38 39 39 39 40 41 42 41 41 41 41 40 39 38 38 38 37 37 37 37 36 36 36 35 35 35 36 37 37 37 37 37 37 37 38 38 39 40 40 40 40 40 40 40 40 40 39 39 39 40 40 40 41 41 41 41 42 43 43 43 44 43 43 43 42 42 41 42 42 42 41 40 39 38 37 36 35 35 35 37 38 38 37 36 36 38 38 38 39 41 42 42 42 42 41 41 41 41 42 43 43 44 44 44 44 44 43 42 42 42 42 42 41 40 39 38 39 39 40 39 39 40 40 41 42 42 42 43 42 42 41 40 40 40 40 39 39 40 40 41 41 41 41 41 41 41 42 42 42 43 43 43 44 44 44 44 43 43 44 44 44 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 45 46 45 45 44 43 43 42 42 42 41 40 39 39 41 42 42 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 42 43 42 42 42 41 41 40 40 39 39 40 41 42 42 42 41 41 41 41 41 42 42 42 43 43 43 43 43 43 43 44 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 40 40 38 38 38 38 38 38 38 38 38 37 37 37 38 37 37 38 38 38 38 38 37 37 37 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 34 34 34 34 35 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 56 57 56 55 55 54 54 54 53 52 52 53 52 51 51 51 52 52 52 52 52 52 53 54 54 55 54 52 52 53 53 54 54 54 54 55 55 55 55 55 55 55 55 55 56 55 55 55 54 54 54 54 53 52 51 51 52 51 49 47 46 43 40 38 37 37 39 43 46 46 45 46 45 44 44 43 42 41 42 42 42 43 43 43 44 45 46 47 47 47 47 48 49 49 48 48 47 46 46 45 43 42 43 43 43 42 42 41 43 45 47 47 47 47 47 47 46 45 45 45 45 44 43 43 42 42 42 41 41 41 42 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 44 44 45 45 45 45 45 44 44 44 43 43 43 43 42 42 42 41 41 40 40 40 40 40 40 39 38 38 37 35 35 36 38 38 38 38 38 38 37 37 36 36 36 36 35 35 35 35 35 36 36 36 37 38 37 38 38 38 39 39 40 40 41 41 41 41 40 39 38 38 38 37 37 37 37 37 36 35 35 36 36 37 37 37 36 36 37 37 38 38 39 39 39 39 40 40 40 40 40 39 39 39 39 40 40 40 41 41 41 42 43 44 44 44 43 43 42 42 41 40 40 41 41 41 41 39 38 37 36 35 35 35 35 37 38 37 36 36 37 38 39 39 40 41 41 41 42 41 40 41 41 42 42 43 44 44 44 44 44 43 43 42 41 41 41 41 40 40 39 38 38 39 40 39 39 40 40 41 42 42 42 42 42 41 41 40 40 40 39 39 40 40 40 42 42 41 41 41 42 42 42 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 43 43 43 44 44 44 44 45 45 46 46 45 44 43 42 42 42 41 41 40 39 40 42 40 40 42 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 42 42 43 43 43 43 42 41 42 42 40 39 39 39 40 41 43 42 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 43 43 43 43 42 43 42 42 42 41 41 41 41 40 40 41 40 40 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 35 35 35 35 35 35 34 34 34 34 35 34 34 34 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 57 57 57 56 56 56 55 54 54 54 54 54 54 53 52 52 52 52 51 50 50 51 52 53 53 54 54 52 52 52 53 54 54 53 53 54 55 54 54 54 54 54 54 54 55 55 55 55 55 54 54 54 53 53 52 52 51 49 46 45 44 42 41 39 37 37 38 40 43 44 44 45 45 44 44 42 42 42 43 43 43 43 43 43 43 45 45 46 46 46 47 48 48 48 48 47 47 47 46 45 44 42 41 41 41 41 41 41 42 45 46 45 46 46 47 47 46 45 45 44 44 43 43 42 42 42 41 41 41 42 42 43 42 42 43 43 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 42 42 43 44 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 42 42 42 41 41 41 41 40 40 40 40 39 39 37 36 35 36 38 38 38 38 38 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 36 36 36 37 38 37 37 38 39 40 40 41 42 42 41 40 39 38 38 37 37 37 37 37 36 35 35 35 36 37 37 37 36 36 36 37 38 38 38 38 39 39 39 39 40 40 40 39 39 39 39 40 41 41 41 41 42 42 43 44 44 43 43 42 42 42 41 40 40 41 40 40 40 39 37 36 35 35 35 35 37 38 37 36 36 37 38 39 40 40 41 41 40 40 41 40 40 41 41 42 43 43 43 43 43 43 43 43 43 42 41 41 41 40 40 39 39 38 38 39 39 39 39 40 40 41 41 41 41 42 41 40 40 40 40 39 39 40 41 41 41 42 42 41 41 42 41 41 42 42 42 42 42 43 43 43 43 43 44 44 44 45 44 44 43 43 43 42 42 42 42 42 42 42 41 42 42 42 42 41 41 41 42 42 42 41 41 41 43 43 43 44 44 44 44 44 45 45 45 45 44 44 43 43 43 42 41 42 41 38 39 40 38 39 41 42 43 43 43 43 42 42 43 43 44 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 42 41 41 40 39 40 42 43 43 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 42 42 42 42 43 42 41 41 41 41 41 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 58 58 58 57 56 56 55 55 55 55 55 55 55 54 54 54 53 52 52 51 51 50 50 50 51 52 52 52 52 52 52 53 54 53 53 53 54 54 53 53 52 53 53 53 54 54 54 54 54 54 54 54 53 53 53 52 50 48 47 45 42 42 43 42 39 37 37 37 38 40 41 43 44 44 43 41 41 43 43 43 43 42 42 43 43 44 45 45 44 45 47 47 48 48 47 47 48 48 47 45 44 44 42 41 40 40 40 41 42 43 44 45 45 46 46 46 46 45 44 44 43 43 43 42 41 41 42 42 42 42 42 42 42 42 43 42 41 41 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 42 43 43 44 45 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 40 39 39 39 39 39 38 36 35 36 38 38 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 38 38 39 39 41 42 42 41 41 40 39 38 38 37 37 37 37 36 36 35 35 35 36 36 36 36 37 37 37 37 38 38 38 38 38 39 39 39 40 40 40 40 40 40 41 41 42 42 42 43 43 43 44 44 43 42 41 41 41 40 40 40 40 40 39 40 38 37 36 35 35 35 36 37 37 36 36 36 38 38 39 40 41 41 41 40 40 40 39 40 41 41 41 42 42 42 42 43 43 43 43 43 43 42 41 41 41 40 39 39 38 38 38 38 38 39 40 40 40 41 41 41 42 41 40 40 40 39 39 40 41 41 41 42 42 41 40 41 42 42 42 42 42 43 44 43 43 43 43 43 43 43 44 44 45 45 44 44 44 43 43 43 43 43 43 43 43 42 41 42 42 43 42 42 41 41 41 41 41 42 42 43 44 44 44 44 44 44 44 45 45 45 44 43 43 43 42 41 41 41 40 39 38 39 39 39 38 38 39 41 42 43 42 41 41 42 43 43 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 40 40 43 44 44 43 43 42 41 41 41 42 42 43 42 42 42 43 43 43 42 42 43 43 43 42 42 42 41 41 41 40 40 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 58 58 57 57 56 56 56 56 55 55 55 55 55 55 55 54 53 53 53 53 52 51 51 51 51 50 50 50 50 50 51 52 53 52 52 52 53 53 53 52 52 52 53 53 54 54 54 53 53 53 53 53 53 52 52 52 52 50 50 47 44 45 46 44 41 39 38 37 37 37 38 39 40 42 42 41 41 42 42 42 42 42 42 43 43 43 44 44 44 46 46 46 47 47 46 46 47 47 48 47 46 45 44 42 41 41 40 40 41 42 44 45 45 46 46 46 45 45 44 43 43 43 43 42 41 42 43 43 42 42 42 41 42 42 42 42 41 40 40 40 40 40 40 40 41 41 40 40 40 40 40 40 39 40 40 41 41 41 41 41 42 42 42 43 43 45 45 45 45 45 46 46 46 45 45 45 44 44 44 44 44 43 43 42 41 41 41 41 41 41 40 39 38 38 38 38 38 36 35 36 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 38 38 39 40 40 41 40 40 39 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 36 37 37 37 37 38 38 38 39 39 39 39 40 39 40 41 42 42 42 42 42 43 43 43 43 44 43 43 43 41 40 41 41 39 39 39 40 39 38 39 38 37 35 35 35 35 35 36 36 36 37 38 39 39 40 40 41 40 40 40 39 38 39 40 40 40 41 41 41 42 42 43 43 44 44 43 43 42 42 42 41 40 40 40 39 38 38 38 39 39 39 40 40 41 41 41 41 41 40 39 38 38 39 40 41 41 42 42 42 41 41 41 42 42 43 43 44 44 44 44 43 43 43 43 43 43 44 44 45 45 45 44 44 43 43 43 43 43 43 43 42 42 41 40 42 42 42 42 41 40 40 40 41 42 42 43 44 44 44 45 44 44 44 44 45 45 44 44 43 43 42 41 40 39 38 37 39 40 41 41 40 39 38 38 40 42 42 42 41 41 42 42 43 42 42 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 42 41 40 41 44 44 44 43 43 42 42 41 41 42 42 42 42 42 42 42 43 43 42 42 43 43 43 42 42 42 42 41 41 41 41 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 36 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 35 56 57 57 57 57 57 56 56 56 55 55 55 55 55 54 53 53 54 55 54 52 52 53 53 52 51 51 50 50 49 49 50 52 51 51 53 53 54 53 52 52 52 53 54 54 54 53 53 53 53 52 52 52 52 51 51 51 51 51 50 48 49 49 46 44 42 40 39 38 37 37 37 37 38 39 39 40 41 41 41 42 43 43 43 43 43 43 43 44 45 45 45 46 47 46 45 45 46 48 49 48 46 44 43 42 41 40 40 41 43 44 45 46 46 46 46 45 44 43 42 42 42 41 41 41 42 42 42 42 42 41 41 41 42 42 42 41 40 40 39 39 39 40 40 40 40 40 39 39 39 39 39 39 39 40 40 41 41 41 41 42 42 43 43 44 45 45 45 46 47 48 48 47 46 46 45 45 45 45 45 44 43 43 42 41 41 41 40 40 40 40 40 39 38 38 38 38 36 35 35 35 36 36 36 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 38 38 38 39 40 40 40 39 38 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 37 37 37 37 38 38 38 39 39 39 39 39 39 40 42 43 43 43 42 42 43 43 43 43 43 43 42 42 42 40 40 41 39 38 38 40 40 38 37 37 36 35 35 35 35 35 36 37 38 39 39 39 40 41 40 40 40 40 39 38 38 39 40 40 40 41 41 42 42 42 43 44 44 44 44 43 43 43 42 41 41 40 40 39 38 38 38 39 39 39 40 41 41 41 41 40 40 39 38 38 39 40 41 41 42 42 42 41 41 42 42 42 43 43 44 44 44 44 43 43 43 43 44 44 44 44 44 44 45 45 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 42 41 40 40 41 41 42 42 43 44 44 45 44 44 44 44 45 44 44 44 44 43 43 42 41 39 38 37 39 41 42 42 42 42 41 39 38 39 40 40 39 39 39 41 42 42 42 42 42 42 43 43 43 42 41 41 42 42 43 43 43 43 43 43 42 41 41 42 44 45 44 44 43 43 42 42 41 41 42 42 42 42 42 42 42 43 43 42 42 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 37 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 54 55 55 56 56 56 57 57 56 56 56 55 55 55 54 54 54 54 55 54 53 53 53 53 53 53 52 52 51 50 49 49 49 49 50 52 53 53 52 51 51 51 52 53 53 53 53 53 53 52 52 51 51 51 50 50 50 50 51 51 51 50 50 49 47 45 43 42 41 39 38 37 37 37 37 37 38 38 39 39 41 42 42 43 44 44 43 43 43 43 43 44 45 46 47 46 45 45 46 48 49 47 46 44 42 40 40 41 42 43 44 45 45 46 46 46 44 44 43 42 42 41 40 40 41 42 42 42 41 41 41 41 41 42 42 42 41 40 40 39 38 38 39 39 39 39 39 39 39 38 38 38 39 39 40 40 41 41 41 41 41 42 43 44 45 46 46 47 48 48 49 48 48 47 46 46 46 46 46 45 45 44 43 42 41 41 41 40 39 39 39 39 38 38 38 37 37 36 35 35 35 35 35 35 36 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 38 38 39 40 40 39 38 37 37 37 37 37 37 37 36 35 35 35 35 36 37 37 37 37 37 38 38 38 38 38 39 38 38 39 40 42 43 43 42 41 41 42 43 42 42 42 42 41 41 42 40 39 40 39 38 38 40 40 39 37 37 36 35 35 35 35 36 37 38 39 40 39 39 40 40 39 39 39 38 39 39 39 40 40 40 41 42 43 43 43 43 44 44 44 44 43 43 42 42 41 41 41 40 39 38 38 38 38 39 40 40 41 41 41 41 41 40 39 38 39 40 41 42 42 42 42 42 41 40 41 42 42 43 43 43 44 44 44 43 43 43 44 44 44 44 45 44 44 44 45 45 45 44 44 44 43 43 43 43 42 42 43 43 41 40 40 40 40 41 41 40 40 41 41 42 43 43 44 44 45 44 43 43 44 44 43 43 43 43 42 42 42 42 41 39 37 38 40 41 42 42 42 43 42 41 41 40 40 39 39 38 40 42 41 41 42 42 42 42 42 41 40 39 39 40 42 42 42 42 42 43 43 41 40 42 43 44 45 45 44 43 43 42 42 42 42 41 41 41 42 42 42 42 42 43 42 41 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 37 37 37 37 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 51 51 51 52 52 53 55 56 56 56 56 56 55 55 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 51 51 50 48 48 49 51 51 52 52 51 50 51 51 52 52 52 52 52 52 52 52 51 51 50 49 49 49 49 50 51 51 50 50 50 50 47 45 46 45 43 42 40 38 37 37 37 37 37 37 38 38 39 40 40 41 42 43 43 43 42 42 43 43 44 46 46 44 44 45 46 48 48 47 45 43 41 40 41 43 44 44 45 45 45 45 45 44 43 43 43 43 41 40 40 41 41 41 41 41 41 40 40 41 41 42 42 41 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 41 41 42 43 43 44 45 46 47 48 48 48 48 48 48 48 47 46 45 46 45 44 44 44 43 42 41 41 41 40 40 38 38 38 38 38 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 37 39 40 40 39 38 37 37 37 37 37 37 37 36 35 35 35 36 37 37 37 37 37 38 38 38 38 38 39 39 39 39 40 41 41 41 41 41 41 42 42 41 40 41 41 40 41 41 40 38 39 39 38 38 39 39 39 39 38 36 35 35 35 35 36 37 38 39 39 39 39 40 39 38 37 37 38 39 40 41 41 42 42 42 43 43 43 43 43 43 44 44 44 43 43 42 41 40 40 40 40 39 38 38 38 39 40 40 41 41 41 41 40 40 39 38 38 39 40 41 42 42 42 42 41 40 40 41 42 42 43 43 44 45 45 44 43 43 43 44 44 44 44 45 44 44 44 44 45 45 45 44 44 43 43 43 43 42 42 43 43 42 41 41 40 40 40 40 40 40 40 41 42 43 43 44 44 44 44 43 43 44 44 43 42 42 42 41 41 42 41 40 38 37 38 40 41 41 42 43 43 44 44 44 43 42 41 39 39 41 42 42 41 41 40 40 41 40 39 39 39 39 40 41 41 40 40 40 40 41 40 40 42 43 44 44 44 44 43 43 42 42 42 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 34 34 35 35 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 33 33 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 50 50 50 50 50 50 51 54 55 56 56 56 55 55 55 55 55 56 55 55 54 54 53 53 53 52 52 52 52 52 52 51 50 49 48 49 51 51 51 51 50 50 51 51 51 51 52 51 51 51 52 51 51 51 50 50 49 49 49 49 50 50 49 50 51 50 49 49 49 49 48 47 44 42 40 39 38 37 37 37 37 37 37 37 38 39 40 41 42 43 42 41 42 44 46 45 43 43 45 46 47 47 47 46 45 41 40 42 44 44 44 45 45 44 44 44 44 43 43 43 43 41 40 40 40 41 41 41 41 41 40 40 40 40 41 41 40 40 40 39 38 38 37 37 37 37 37 38 38 38 38 38 39 39 39 40 40 41 41 43 44 45 45 47 47 48 48 48 48 48 47 46 46 46 44 43 45 45 44 43 42 42 41 41 40 40 40 39 38 38 37 37 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 37 38 39 39 39 37 37 37 37 37 36 35 35 35 35 36 37 37 37 37 37 37 38 38 38 38 39 40 40 39 39 40 40 40 40 40 41 41 42 41 39 40 40 40 41 41 40 38 38 39 38 37 38 38 38 39 38 36 35 35 35 35 35 36 37 38 37 37 38 38 38 37 37 38 39 39 40 42 42 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 42 41 40 40 40 38 38 38 39 40 41 41 41 42 41 40 39 39 38 38 39 40 41 41 41 41 41 40 40 40 41 42 42 42 43 44 44 45 45 44 43 43 43 44 44 44 44 45 45 44 44 44 45 45 45 44 44 43 43 43 42 42 43 43 43 43 42 41 41 41 40 39 39 39 40 41 41 42 43 44 44 44 43 42 43 44 44 44 42 41 41 40 39 40 39 38 37 37 38 40 41 41 42 43 43 44 44 44 43 42 41 38 39 41 42 41 40 40 40 39 39 40 40 41 41 40 39 39 40 39 39 39 39 39 39 40 42 43 44 44 44 43 43 43 42 42 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 37 38 38 37 37 38 38 38 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 35 35 34 33 33 34 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 51 51 52 51 51 50 49 50 53 55 56 56 55 55 56 56 56 56 55 55 54 54 53 53 53 53 53 52 52 53 52 52 52 51 49 48 49 49 50 49 49 50 51 51 51 51 51 51 50 51 51 51 51 51 52 51 50 49 49 48 49 49 49 50 50 50 52 52 52 51 50 50 50 48 46 45 44 42 40 39 38 37 37 37 37 37 37 37 39 40 40 40 41 44 45 45 43 42 43 45 45 46 46 45 43 41 40 42 44 44 45 45 44 44 44 44 44 43 43 43 43 41 40 40 40 39 39 40 41 40 40 39 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 38 38 38 38 38 38 38 39 40 40 41 43 45 46 46 46 47 47 46 46 47 47 47 46 45 44 45 44 43 43 43 43 42 41 40 40 41 40 40 40 39 38 38 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 39 38 37 37 37 37 36 35 35 35 35 36 37 37 37 37 37 37 37 37 38 38 38 39 39 39 38 39 40 40 40 39 40 40 41 40 39 40 40 40 41 41 40 38 38 39 37 37 38 38 37 37 36 35 35 35 35 36 36 36 36 36 37 37 37 37 37 37 38 38 39 40 41 42 43 43 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 41 40 39 38 38 38 38 39 40 41 41 41 41 40 40 38 38 38 38 40 40 41 41 41 40 39 39 40 40 41 42 42 42 43 44 44 44 44 43 42 44 44 44 44 44 44 45 45 44 44 45 45 44 44 44 43 43 43 43 42 43 43 43 43 42 42 42 42 41 40 39 39 39 40 41 41 42 43 44 43 43 43 42 42 44 44 43 42 42 42 39 38 37 37 37 38 39 39 40 40 41 42 43 44 45 44 43 43 42 40 38 38 40 40 40 40 41 41 41 41 42 42 43 42 41 40 39 39 39 39 41 41 40 41 42 42 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 42 42 42 42 42 41 41 41 41 41 40 40 39 39 40 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 37 37 37 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 34 34 35 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 54 54 54 54 53 52 51 50 50 52 54 55 55 56 55 55 56 56 55 55 54 54 53 53 53 53 53 53 53 53 52 52 52 52 51 50 48 47 48 48 49 51 50 50 50 50 50 50 50 51 51 51 51 50 51 51 51 50 48 47 48 48 47 49 50 51 52 51 51 50 49 48 49 48 49 50 50 48 45 42 40 40 40 39 38 37 37 37 37 37 38 38 39 41 42 44 44 42 40 42 43 44 45 43 41 40 40 42 44 44 45 44 44 43 44 44 44 43 43 43 43 42 41 41 39 38 38 39 40 40 40 39 38 39 39 39 39 40 40 39 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 40 41 43 45 45 45 46 45 44 45 44 43 44 45 45 45 44 43 43 44 42 41 41 41 41 40 38 38 38 38 38 38 37 38 38 38 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 37 38 37 37 37 37 36 35 35 35 35 36 36 36 36 37 37 37 37 37 38 38 38 38 39 39 38 38 38 39 39 39 39 40 39 39 40 40 40 41 41 41 40 38 38 39 38 37 38 38 37 36 35 35 35 35 36 37 38 38 37 37 37 37 37 37 37 38 38 39 40 40 41 42 43 43 43 43 44 44 43 43 42 42 42 42 42 42 42 41 40 40 39 38 37 37 38 38 39 40 40 40 40 40 39 39 38 38 38 39 40 40 40 39 39 39 39 40 41 41 41 41 42 43 44 45 45 44 43 42 43 44 44 44 45 44 44 45 45 45 45 45 45 44 44 44 43 43 43 43 43 43 44 43 43 42 41 41 41 42 41 40 39 40 41 41 42 43 43 43 43 43 42 41 41 43 43 43 42 42 42 40 38 37 37 38 39 41 42 42 42 43 43 44 45 45 44 43 42 41 41 40 39 39 39 41 42 42 42 43 43 43 43 43 43 42 41 40 39 40 41 42 42 42 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 40 40 39 39 39 39 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 33 33 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 55 55 55 55 54 53 52 52 50 50 51 53 54 55 54 55 56 55 55 55 54 54 54 54 54 54 54 54 54 53 52 52 52 52 51 50 49 48 47 47 49 50 50 49 49 50 50 49 49 50 50 51 50 49 50 51 51 51 49 48 47 47 47 48 49 50 51 50 50 50 49 48 47 47 48 50 50 49 47 45 45 46 46 44 41 40 40 38 37 37 37 37 37 38 39 40 41 41 40 41 41 43 43 41 39 40 41 43 43 43 44 44 43 43 43 43 44 44 43 43 43 43 42 41 40 39 38 39 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 41 43 44 43 42 42 42 41 41 40 39 39 40 41 42 42 42 42 41 40 39 38 38 38 38 37 36 35 35 35 35 35 35 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 37 37 37 36 36 36 36 35 35 35 35 35 36 36 37 37 37 37 37 38 38 38 38 38 38 38 37 37 38 38 38 39 39 38 38 40 40 40 41 41 41 40 39 37 38 38 37 38 38 37 36 35 35 35 35 36 37 38 39 39 39 38 38 38 38 38 39 39 39 40 41 42 42 42 42 43 43 43 43 43 42 41 40 40 40 40 41 42 41 40 40 39 38 37 37 38 39 39 39 39 39 39 38 38 38 37 38 39 39 40 39 38 38 38 39 40 41 42 42 42 42 43 43 44 44 44 43 42 42 43 44 44 45 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 44 43 43 42 41 41 41 41 41 40 39 39 40 41 42 43 43 43 43 42 41 41 41 43 43 43 42 42 42 40 38 37 38 40 41 42 42 43 43 44 44 45 46 45 43 43 43 42 41 41 41 40 41 41 41 41 42 42 43 43 43 43 42 42 41 41 41 42 42 43 43 42 42 43 42 42 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 40 40 39 39 39 39 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 33 33 33 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 55 55 55 55 54 54 54 53 52 50 49 49 52 53 53 54 54 54 55 55 55 55 55 55 55 55 55 55 54 53 52 52 52 52 51 49 49 49 47 46 47 48 48 48 48 48 48 48 48 49 50 50 49 49 50 50 50 50 50 50 48 46 46 48 48 49 51 50 49 49 49 49 48 46 47 49 49 48 48 49 48 48 48 47 44 43 42 41 39 38 38 37 37 37 37 37 38 39 39 39 39 41 40 39 39 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 40 39 38 39 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 40 41 40 39 38 38 38 37 37 37 37 37 37 38 39 39 39 39 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 37 37 36 36 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 38 38 38 38 38 38 37 37 37 37 38 39 38 38 38 39 40 41 41 41 41 40 39 37 37 37 37 37 37 36 35 35 35 35 35 37 37 38 39 39 40 40 39 39 39 39 40 40 40 41 42 42 42 42 42 43 43 43 43 43 42 41 40 39 39 40 40 41 41 40 40 39 38 37 37 38 39 39 39 39 39 38 38 37 37 38 39 40 40 39 38 38 38 39 40 41 42 43 43 43 43 43 43 43 43 43 42 42 43 44 44 44 44 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 44 44 44 43 43 42 41 41 40 40 40 39 38 39 41 41 42 43 43 43 42 41 41 42 43 43 42 42 42 40 39 38 37 38 40 41 42 42 43 44 45 45 46 46 45 44 44 44 43 42 43 42 40 41 42 42 42 41 41 42 43 43 42 41 41 41 41 41 41 41 42 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 40 40 40 40 40 40 39 39 40 39 39 40 39 39 39 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 36 36 36 36 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 55 55 55 55 55 55 55 54 53 51 49 48 49 50 52 52 51 51 51 52 53 54 55 56 56 55 55 55 55 54 53 53 52 52 51 50 49 49 48 48 47 46 46 46 46 45 46 48 48 48 49 49 49 48 49 49 49 49 49 49 48 46 45 46 47 49 50 50 49 47 48 49 48 45 45 48 48 46 46 48 48 46 47 48 47 45 44 43 41 41 41 40 38 37 37 37 37 37 37 37 37 39 39 39 41 42 43 42 42 42 42 43 43 43 43 44 44 43 43 44 43 43 42 42 42 41 39 38 38 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 36 37 37 36 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 38 37 37 37 38 38 37 37 37 37 38 38 38 38 39 40 40 41 41 41 40 39 38 38 36 35 36 37 36 35 35 34 34 35 36 38 38 38 39 39 40 41 41 41 40 40 41 41 40 41 41 41 41 42 43 43 43 43 43 43 43 42 41 40 39 39 40 41 40 40 40 39 38 37 37 38 39 38 38 38 39 38 37 37 38 39 40 40 39 38 38 39 40 40 40 41 42 43 43 43 42 42 43 43 43 42 41 42 43 43 43 44 44 44 44 44 44 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 44 43 43 42 41 40 40 41 41 40 39 39 39 40 40 41 42 42 42 41 41 42 43 42 41 42 40 39 38 38 39 39 39 40 42 43 44 45 45 46 46 46 46 45 45 44 44 44 44 42 41 41 42 43 43 42 41 41 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 35 35 35 35 36 36 36 36 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 33 56 55 55 55 55 55 55 55 53 51 50 50 49 48 49 49 48 48 48 48 49 50 51 53 54 54 52 52 53 53 53 53 53 52 51 51 50 50 50 50 50 49 48 47 47 46 46 46 46 46 46 47 48 47 47 48 47 48 48 48 47 46 45 45 47 48 48 47 47 46 46 47 47 45 44 45 46 45 44 46 47 45 44 45 46 46 45 45 45 44 45 44 41 39 38 38 37 37 37 37 37 38 39 41 42 43 43 41 41 42 43 43 43 44 44 44 44 44 44 44 44 43 43 43 43 42 41 39 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 36 37 37 37 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 38 37 37 37 38 38 37 37 37 37 38 39 40 40 40 40 41 41 41 40 40 40 38 37 36 36 36 36 35 35 34 34 34 36 37 38 37 37 38 39 40 41 41 42 42 41 42 42 41 41 41 41 42 42 42 42 42 42 42 43 43 42 42 41 40 39 40 41 40 39 39 39 38 37 37 38 39 38 38 38 37 37 37 38 39 39 39 38 37 38 39 41 41 41 41 41 42 42 42 42 42 42 43 43 42 41 41 42 43 43 43 43 43 44 44 44 45 45 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 42 41 40 40 39 39 39 39 40 42 42 42 41 40 41 42 42 40 39 38 38 38 39 40 41 41 42 43 44 44 44 45 45 46 47 47 46 46 46 46 46 45 44 42 41 42 43 43 42 42 41 42 42 42 41 41 41 41 41 41 41 41 40 41 41 41 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 39 39 38 38 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 36 36 36 35 36 36 36 35 35 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 56 56 56 55 55 55 55 55 53 51 51 53 51 50 50 49 50 50 50 49 48 48 49 50 50 50 49 49 49 51 53 53 53 52 52 52 51 51 52 51 51 51 50 49 48 47 47 46 46 46 45 46 46 45 45 45 45 45 45 45 46 46 45 45 45 45 45 45 45 45 45 45 46 45 44 43 43 43 42 43 45 44 43 43 43 44 43 44 46 46 46 45 45 44 43 42 40 38 37 37 37 37 38 39 41 42 41 40 41 42 43 44 45 45 45 45 45 45 45 45 45 44 43 43 43 43 42 41 40 39 37 37 37 37 37 37 38 38 38 38 39 39 39 38 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 40 40 40 39 38 37 37 37 38 38 38 38 38 38 38 39 40 40 40 40 39 38 37 36 36 35 35 35 35 35 35 35 35 35 35 36 37 38 38 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 36 37 37 37 36 36 35 35 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 38 38 38 37 37 38 39 40 41 41 41 41 41 40 40 39 39 38 37 37 36 36 35 34 34 34 35 35 36 37 37 37 37 38 40 40 41 42 42 43 42 42 43 42 40 40 41 41 41 41 41 41 42 42 43 43 42 41 40 39 39 40 41 40 39 37 37 37 37 37 38 39 38 38 37 37 38 38 38 38 38 37 38 38 39 40 41 41 41 41 41 41 41 42 42 42 42 42 42 41 41 41 42 43 43 44 43 43 44 44 45 45 44 44 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 42 42 42 40 40 40 40 39 38 40 40 41 41 41 40 41 42 41 39 37 38 39 40 41 41 42 43 43 44 44 44 45 45 45 45 46 46 47 47 47 47 46 45 45 43 42 42 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 39 38 38 38 38 39 39 39 39 39 39 39 38 38 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 36 36 35 35 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 33 33 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 56 56 55 55 56 55 55 55 53 51 52 53 52 52 53 52 52 52 52 51 50 49 48 47 47 47 47 47 47 48 50 51 52 52 52 52 52 52 52 52 52 52 50 50 49 49 49 48 48 48 47 47 46 47 47 45 44 45 44 44 44 45 45 43 43 43 43 43 42 43 43 42 44 44 42 41 41 42 41 41 41 41 41 41 41 41 41 42 43 43 43 44 45 46 45 45 44 41 39 37 37 37 37 37 38 39 40 40 41 42 43 44 45 45 45 46 46 46 46 46 45 44 44 44 44 43 42 41 40 39 37 37 37 37 37 38 40 40 40 40 42 43 42 41 42 43 42 41 40 38 37 37 38 38 38 37 37 38 39 38 37 40 41 42 43 43 42 42 40 38 37 39 41 42 41 40 41 42 41 41 42 41 41 40 40 39 38 38 37 37 36 36 37 37 37 37 37 37 38 38 38 39 39 38 38 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 36 37 37 37 36 35 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 37 37 38 39 40 41 41 40 39 39 38 38 38 37 36 35 35 34 34 34 34 35 36 37 38 38 38 38 39 41 41 41 41 42 43 43 42 42 42 40 40 41 41 41 41 42 42 42 42 42 42 42 41 40 39 38 39 40 40 39 37 37 37 37 38 39 39 38 37 37 37 38 39 38 37 37 37 38 38 39 39 40 40 40 40 40 41 41 40 41 41 41 40 40 41 42 42 42 43 44 43 43 43 44 44 44 44 44 44 45 44 44 44 43 43 43 43 43 43 43 43 44 43 43 43 42 42 42 43 42 41 40 41 41 41 40 39 39 39 40 40 40 39 40 41 39 37 37 39 41 41 42 43 44 44 44 44 44 44 45 45 44 45 45 46 46 47 46 46 46 45 44 43 42 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 33 33 33 33 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 55 55 54 54 54 54 53 53 52 52 53 53 53 53 54 53 53 53 53 52 51 50 49 49 49 49 48 48 47 47 47 48 49 49 50 50 50 50 50 50 51 52 51 52 53 52 50 49 50 50 50 50 49 50 49 47 47 47 48 48 47 45 44 43 44 44 44 43 43 43 43 43 43 44 43 43 43 44 43 42 42 42 41 40 41 41 40 40 40 40 40 41 42 42 41 42 42 42 40 39 38 37 37 37 37 37 38 40 42 43 44 44 45 46 47 46 45 45 45 45 45 44 44 44 44 43 41 40 39 38 37 37 37 37 39 41 42 44 43 43 44 45 45 44 44 45 46 46 43 41 39 39 42 41 39 38 39 40 41 40 39 40 42 43 44 43 42 42 42 40 39 41 43 43 44 43 43 43 43 42 42 41 41 40 40 39 39 39 37 37 37 38 38 38 37 38 38 39 40 40 39 40 41 41 40 40 40 40 38 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 36 37 37 36 35 34 34 35 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 39 40 39 39 38 38 38 38 37 35 34 34 34 34 34 35 36 37 38 39 40 40 40 40 41 41 41 41 42 42 42 41 41 41 40 40 41 42 42 42 43 42 42 42 41 41 41 40 40 39 38 39 40 40 38 37 37 36 37 38 39 38 38 37 37 37 38 38 37 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 40 40 40 41 41 41 42 43 43 43 43 43 43 43 43 43 44 44 44 44 45 45 45 45 44 44 43 43 43 43 43 43 44 44 44 43 43 43 42 42 41 41 41 41 42 43 41 39 37 38 39 40 40 39 40 40 38 36 37 40 42 42 43 43 44 44 43 44 43 43 44 44 44 45 45 46 46 46 45 45 46 45 44 43 43 43 44 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 33 33 33 33 34 34 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 55 54 54 54 54 54 53 53 53 54 54 54 54 54 54 54 53 53 53 52 50 51 52 52 51 51 51 50 49 48 47 46 47 47 47 47 47 47 47 47 47 48 49 50 51 52 52 52 53 52 52 52 51 50 48 48 48 48 50 50 49 47 45 46 47 47 46 46 45 47 48 47 45 45 46 46 45 45 45 44 44 44 43 42 42 43 42 41 40 40 40 40 40 40 39 39 39 39 39 39 38 37 37 37 37 37 37 39 41 42 43 43 45 47 48 47 44 43 44 44 44 43 43 43 43 42 41 39 38 37 37 37 37 38 42 44 46 47 47 47 46 46 48 48 48 47 48 47 45 44 43 41 43 43 41 41 41 40 42 42 41 41 42 44 44 44 43 42 42 41 40 42 43 43 44 44 44 44 44 43 42 42 41 40 40 40 40 38 37 37 38 38 38 37 37 38 38 40 41 41 41 42 43 43 42 41 42 42 40 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 38 37 38 38 37 36 34 34 34 34 34 34 35 37 38 38 39 40 40 40 40 41 41 41 42 42 41 40 40 40 40 40 41 42 43 43 43 43 43 43 42 41 40 40 39 39 39 38 39 40 39 38 37 36 36 37 39 38 37 36 36 36 37 37 37 38 39 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 41 41 42 42 42 43 43 44 44 43 42 42 43 43 43 43 43 43 44 45 45 45 46 45 44 44 43 42 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 42 42 40 39 38 37 39 39 39 40 39 37 36 38 40 42 43 43 44 43 43 43 43 43 43 43 43 44 45 45 45 45 45 45 45 46 46 45 44 43 43 44 43 43 43 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 41 41 40 40 41 41 41 41 40 40 40 40 40 40 40 39 39 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 35 34 34 34 35 35 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 56 56 55 55 55 56 55 55 55 55 55 55 55 55 54 54 54 54 53 51 51 52 52 52 52 52 52 51 51 50 49 48 47 47 47 47 46 46 46 47 47 46 46 46 47 48 50 52 52 52 53 53 52 51 50 50 50 50 50 50 49 48 48 49 50 48 47 47 48 49 50 49 47 46 48 47 46 46 46 45 45 45 45 45 44 44 44 44 43 42 42 41 41 40 39 39 39 40 40 39 39 38 38 37 37 37 37 37 37 39 40 42 43 45 46 45 42 42 43 44 43 42 42 42 43 42 40 38 37 37 37 37 39 40 42 45 48 48 48 49 48 48 49 51 51 50 49 49 49 47 45 43 43 45 44 43 42 41 42 43 43 44 45 45 44 43 42 42 41 41 41 42 43 43 43 44 44 44 44 43 43 42 41 41 41 40 39 38 37 38 39 39 39 38 37 38 39 40 41 42 42 43 43 42 41 40 40 40 41 40 39 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 37 38 38 37 37 37 37 36 35 34 34 34 34 34 35 37 38 38 38 38 39 40 40 40 40 41 41 41 41 41 40 39 39 40 40 41 42 43 43 43 43 43 42 42 41 40 39 38 38 38 38 39 40 39 38 37 36 36 38 38 37 36 36 36 36 37 37 38 39 40 40 41 41 40 40 40 40 41 41 41 41 41 42 41 41 42 43 43 43 43 43 43 44 43 43 42 42 43 43 43 43 43 43 44 44 44 45 45 45 44 44 43 42 42 43 43 43 43 43 43 43 43 43 42 42 42 42 41 42 42 42 41 40 40 39 38 38 38 39 38 36 38 39 40 42 43 43 43 43 43 43 43 43 42 42 43 43 44 44 45 45 45 45 45 46 46 46 45 43 43 44 44 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 41 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 36 36 35 35 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 57 56 56 56 56 55 55 55 56 56 55 55 55 55 55 55 54 54 53 51 51 52 52 53 53 53 52 52 52 51 50 50 50 50 49 49 48 48 48 48 48 47 47 46 45 45 46 47 47 49 50 50 50 50 50 50 51 52 51 51 50 49 49 51 51 50 49 50 50 50 49 48 49 50 50 49 47 48 48 47 47 47 47 46 46 46 46 46 45 44 43 43 43 42 41 41 41 42 42 41 40 40 40 39 38 37 37 37 37 37 38 39 39 40 43 43 41 41 42 43 43 42 40 41 41 40 39 37 37 37 37 38 41 43 44 46 47 47 47 49 48 48 49 51 52 53 52 52 52 50 47 45 47 49 47 45 44 43 42 43 44 45 46 45 44 43 43 43 42 41 42 43 44 44 43 43 43 44 44 43 43 42 42 41 41 40 38 37 37 38 39 40 39 39 39 39 40 40 41 41 42 42 41 41 40 39 38 38 39 40 40 39 39 38 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 37 36 37 38 37 37 37 37 35 34 34 34 34 34 35 36 38 38 38 38 38 39 40 40 40 40 41 41 41 40 40 39 38 39 40 41 42 42 42 43 43 43 43 42 41 40 40 39 38 38 37 39 40 39 39 38 37 36 37 38 37 36 36 36 37 37 37 38 38 39 40 41 42 42 41 41 41 42 42 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 43 43 42 42 42 42 42 42 43 44 44 44 43 44 45 44 44 43 42 42 42 43 43 42 42 42 42 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 38 38 39 38 37 37 39 41 42 42 42 42 43 43 43 43 42 42 42 42 43 43 44 44 44 44 44 45 45 45 46 46 45 44 43 44 44 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 41 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 36 36 35 35 35 35 35 35 35 35 35 35 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 35 35 35 35 34 34 34 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 57 57 57 57 56 55 55 56 56 56 55 55 55 55 55 55 55 54 54 52 52 53 53 53 54 53 53 52 52 51 51 51 51 51 51 50 49 49 50 49 49 49 49 48 47 46 45 45 45 45 46 46 46 46 46 47 48 49 49 49 50 50 51 52 51 50 50 49 49 48 47 47 48 48 48 47 47 47 47 47 48 49 49 48 47 48 48 47 46 46 45 45 45 44 43 43 44 44 43 42 43 43 42 42 40 39 39 37 37 37 37 37 37 38 39 39 39 40 41 42 42 42 41 39 39 38 37 37 37 37 38 41 44 45 45 46 46 45 46 46 47 47 48 49 50 52 53 53 53 51 49 48 50 52 50 47 46 44 43 44 46 47 47 46 45 45 44 43 42 41 42 44 45 44 43 43 43 43 43 43 42 42 42 41 40 39 39 39 39 39 40 41 41 41 40 39 40 41 41 42 42 41 41 41 41 40 38 38 38 38 39 39 39 39 38 38 38 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 35 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 35 36 37 37 37 37 36 34 34 34 34 34 35 35 36 37 37 37 37 38 38 39 40 40 41 41 42 41 40 39 38 38 39 40 42 42 41 41 42 43 44 44 43 42 41 40 40 39 38 37 38 39 38 38 38 37 36 36 37 37 36 36 37 38 38 38 40 40 40 41 41 42 41 41 41 41 42 42 43 43 43 43 43 43 43 43 44 44 43 43 44 44 44 44 43 42 42 41 41 42 43 43 44 43 43 43 44 44 44 43 43 42 42 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 41 41 40 40 39 38 38 37 36 37 39 40 41 42 42 42 43 43 43 42 42 42 42 42 43 44 44 44 44 44 44 44 45 45 46 46 45 44 43 44 44 44 43 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 58 58 58 57 56 56 56 56 56 56 56 56 56 55 55 54 53 53 53 53 54 54 54 54 54 54 54 53 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 48 47 46 46 46 45 45 44 45 46 45 45 44 44 45 46 48 49 49 48 47 46 45 44 44 43 43 43 43 43 43 44 44 44 44 45 46 46 46 47 48 49 48 48 48 46 47 46 45 45 46 46 45 45 44 45 46 45 43 41 41 42 41 39 37 37 37 37 37 37 37 38 38 39 40 40 41 40 38 37 37 37 37 37 37 38 42 44 43 42 43 44 45 45 45 46 47 48 49 50 52 53 53 52 52 52 51 51 52 52 51 48 46 45 45 47 47 46 46 45 44 44 43 43 42 43 45 45 44 43 43 43 43 42 42 41 41 41 40 40 40 40 40 41 41 42 42 41 41 40 40 40 41 42 42 42 41 40 41 41 40 40 39 38 38 38 38 39 39 39 40 39 37 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 35 35 36 36 37 37 37 37 37 36 36 36 35 35 36 36 36 37 36 35 35 36 36 37 37 37 37 36 36 35 35 35 35 36 36 37 36 35 34 34 34 34 35 35 35 36 36 36 37 37 37 38 39 40 41 41 42 41 40 39 38 38 39 40 41 41 41 41 41 42 43 44 44 43 43 42 41 41 40 38 37 37 38 38 37 37 36 36 36 36 36 36 37 38 39 39 39 40 40 41 41 41 41 40 41 41 42 42 43 43 43 44 44 44 44 43 43 44 44 43 43 43 44 44 44 43 43 42 41 41 42 43 43 43 42 43 44 43 43 43 43 43 42 41 42 43 42 42 41 42 43 43 43 43 43 43 42 42 42 43 43 42 42 41 40 40 40 39 38 37 36 37 39 40 40 41 42 43 43 42 42 42 42 42 42 42 43 44 44 44 43 43 44 44 45 45 46 46 45 44 43 43 44 44 43 43 43 43 42 42 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 59 59 59 58 58 57 57 57 56 56 56 56 56 55 54 54 54 54 54 55 55 55 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 51 51 51 51 51 51 51 50 50 49 49 49 48 47 46 46 48 49 48 46 45 45 44 43 44 44 44 44 43 43 44 44 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 43 45 48 49 48 47 47 48 47 46 47 47 46 45 46 45 45 47 46 44 41 41 44 44 42 40 40 40 39 38 37 37 37 37 37 38 38 39 38 37 37 37 37 37 37 37 38 40 40 40 41 42 44 46 47 47 47 48 49 50 52 53 53 53 52 52 52 52 51 51 52 53 52 50 47 47 48 47 46 46 45 44 44 44 44 44 44 45 45 44 43 43 43 42 42 41 42 41 40 41 41 42 41 41 42 42 42 41 41 41 40 40 41 42 42 42 42 40 39 39 39 39 40 40 38 38 37 37 38 38 39 39 39 37 36 35 35 36 36 36 37 36 35 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 35 35 35 35 35 34 34 34 34 34 34 35 36 36 35 35 35 35 36 36 36 37 36 35 35 35 35 35 35 35 36 35 34 34 34 34 34 35 35 36 36 36 37 38 38 38 39 40 41 41 41 41 40 40 38 37 38 40 41 40 40 40 41 41 42 43 44 44 43 43 43 42 41 40 39 38 37 37 37 37 36 36 36 36 36 36 37 38 39 40 39 39 40 40 41 41 40 40 40 42 43 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 43 44 43 43 43 42 41 41 42 43 43 43 42 42 43 43 43 43 43 42 42 41 42 42 43 42 41 41 42 42 42 42 42 43 43 42 42 42 43 42 42 41 41 40 40 40 40 39 37 36 36 37 39 40 42 42 43 43 42 41 42 42 42 42 42 43 44 44 43 43 43 44 44 45 45 46 46 46 44 43 43 44 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 37 37 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 35 35 35 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 60 61 60 59 58 58 58 57 57 56 56 56 56 55 55 56 57 57 56 57 57 56 55 55 55 55 55 54 54 54 54 54 54 53 53 52 52 52 52 52 52 52 51 51 51 51 51 50 50 49 47 46 48 49 49 49 48 48 47 46 46 45 45 45 44 44 44 45 45 46 45 46 46 46 45 44 43 44 44 44 43 43 43 42 41 42 43 44 45 44 45 46 47 47 48 48 47 46 46 46 46 47 47 44 43 44 45 45 44 43 44 44 41 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 40 40 40 40 41 42 44 45 46 47 48 49 50 51 51 52 53 53 53 52 52 51 50 50 50 51 52 53 52 49 48 49 48 47 46 45 45 46 46 46 46 45 45 44 43 43 43 42 42 42 42 42 41 41 41 42 43 43 43 43 43 42 42 43 42 42 41 42 43 43 43 42 40 38 38 38 38 38 38 38 38 37 37 38 38 37 38 37 36 35 35 36 37 38 39 39 38 37 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 35 36 37 36 35 34 34 34 34 34 34 35 34 34 34 34 34 34 35 36 37 38 38 38 39 40 40 40 40 41 41 41 40 39 39 38 38 39 40 40 40 40 41 41 41 43 44 43 43 43 42 42 42 41 40 40 40 38 37 36 36 36 36 37 37 36 36 38 39 39 39 38 39 40 40 40 40 40 40 41 42 42 42 43 44 44 44 44 43 43 43 43 43 43 43 43 44 44 43 43 43 43 42 41 41 42 43 43 43 42 42 42 42 42 43 43 42 41 41 42 43 43 42 41 41 41 42 42 42 42 42 42 41 42 43 43 42 41 41 40 40 40 39 39 38 37 36 36 38 39 41 42 42 43 43 42 41 42 42 42 42 43 43 43 43 43 42 43 44 44 45 46 46 46 46 45 43 43 44 44 44 43 43 43 42 42 41 41 41 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 37 37 37 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 33 33 35 35 35 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 62 62 61 59 59 58 58 58 58 57 57 57 57 58 58 57 58 59 58 58 57 57 57 57 57 55 55 54 55 55 55 54 54 54 53 53 53 53 53 53 53 52 52 52 52 51 51 50 49 48 47 48 49 50 50 49 49 49 49 48 48 48 48 47 46 46 45 45 46 46 47 46 47 47 47 47 46 47 47 47 47 46 45 44 42 41 41 41 41 41 41 42 43 45 47 47 47 47 47 47 47 47 46 45 45 46 47 46 46 45 44 42 40 37 37 38 38 37 37 37 37 37 37 38 38 39 39 39 40 42 42 42 43 44 45 45 45 45 47 48 50 51 52 52 52 52 52 53 52 52 51 50 50 50 51 52 52 53 52 51 50 49 48 47 46 46 47 47 46 46 46 45 44 43 43 43 42 42 43 43 43 42 41 42 43 44 44 45 45 44 43 43 44 44 43 42 43 44 43 42 41 40 39 39 38 38 37 37 38 39 39 39 40 39 38 37 36 36 36 35 35 37 38 40 41 40 40 40 39 37 36 35 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 37 38 38 38 39 40 41 41 41 41 41 40 39 39 38 37 38 38 39 39 39 40 41 42 43 43 44 43 43 42 42 43 43 41 40 40 40 39 38 36 35 36 37 38 36 36 37 38 38 38 38 38 39 40 39 39 39 40 41 41 42 42 42 43 44 44 43 43 43 43 43 42 42 43 43 44 43 43 43 42 42 42 41 41 42 43 43 43 42 41 41 42 42 42 43 42 41 41 42 42 42 42 41 41 41 42 42 41 41 41 41 41 41 42 42 42 42 41 41 41 40 39 38 37 37 36 36 38 40 40 41 42 43 43 42 41 42 42 42 42 42 43 43 43 43 42 42 43 44 44 45 45 46 46 46 45 44 43 43 44 44 43 43 43 43 43 42 41 41 40 40 40 40 40 40 40 39 38 38 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 32 33 35 35 35 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 62 62 61 60 59 59 59 59 59 59 58 57 58 59 60 59 59 60 60 59 58 58 58 58 57 56 56 55 56 56 56 55 55 54 54 54 54 53 53 53 52 52 52 51 50 49 49 48 48 48 49 50 50 51 51 50 50 50 50 50 49 49 49 47 46 46 45 46 47 47 48 48 48 48 49 48 48 48 48 48 48 47 46 45 44 43 42 43 42 42 41 40 40 41 43 45 47 48 48 48 48 47 46 46 46 46 47 47 47 45 42 40 38 37 37 39 40 39 39 40 40 40 39 41 43 42 41 39 39 41 42 41 43 44 45 46 46 47 48 49 50 51 52 52 52 52 51 52 52 51 51 50 49 51 52 52 52 53 53 53 52 50 49 48 47 47 47 47 46 46 46 45 44 44 44 43 43 43 43 43 43 42 42 43 44 44 45 46 46 45 44 44 45 45 44 43 44 44 43 42 41 41 41 41 40 38 38 38 39 40 40 40 40 40 38 37 37 37 37 36 35 36 37 39 40 41 41 42 41 38 38 37 37 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 38 39 40 40 41 41 41 42 41 41 40 39 38 38 37 38 39 40 40 40 40 41 43 43 44 44 43 43 42 42 43 43 42 41 40 39 39 38 37 35 36 37 37 36 36 37 38 37 37 38 38 38 39 38 39 39 40 41 42 42 42 43 44 44 44 43 43 43 43 42 42 42 43 44 44 43 43 42 41 41 41 41 41 42 43 43 43 42 41 41 41 42 43 42 41 40 41 42 42 41 41 41 41 42 42 42 41 40 40 41 41 41 41 42 42 41 41 41 41 40 38 37 36 36 36 36 39 40 41 41 42 42 42 41 41 42 42 43 42 42 42 42 42 42 43 43 43 44 44 44 45 46 46 45 45 44 43 43 44 44 44 43 43 43 43 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 40 40 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 32 32 34 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 62 62 61 60 60 60 60 60 60 59 58 57 58 59 60 61 61 60 60 59 59 59 59 58 57 57 57 57 57 57 56 56 56 55 54 54 54 54 53 53 51 50 50 50 49 48 48 49 50 51 51 51 51 51 51 51 51 51 51 50 49 48 47 46 46 47 47 48 49 48 48 49 49 49 49 49 49 49 48 48 48 47 47 46 46 45 44 45 45 45 43 41 40 40 40 42 44 45 45 46 47 48 48 47 47 47 47 47 46 44 41 39 37 37 38 40 41 42 41 42 43 42 41 44 46 44 42 42 39 39 41 41 42 44 45 46 47 48 49 50 51 52 52 52 52 51 51 51 51 50 49 49 50 51 52 52 52 53 53 53 53 52 50 49 49 49 48 47 47 46 46 45 45 45 45 44 44 44 43 43 43 43 43 44 44 45 46 47 46 45 45 45 45 45 45 45 44 44 44 43 42 42 42 42 40 39 39 38 39 40 39 39 39 38 37 37 38 38 38 37 36 36 37 38 39 40 42 43 41 38 39 39 39 39 37 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 38 39 40 40 40 40 41 42 42 42 41 40 40 39 37 37 38 39 40 41 42 42 42 42 42 43 43 43 43 43 42 42 43 42 41 41 41 39 38 37 37 35 35 36 36 36 36 37 37 37 37 37 37 37 38 39 40 40 40 41 42 43 43 44 44 44 44 43 43 42 42 42 41 42 43 43 43 43 43 43 42 41 41 40 41 41 42 43 43 42 41 41 41 42 42 41 41 41 42 42 41 41 41 41 41 42 42 41 40 40 40 41 41 41 41 42 41 41 41 41 40 39 37 36 36 38 39 39 39 40 40 41 42 42 41 41 41 41 42 42 42 42 42 41 42 42 43 43 43 43 43 44 45 46 46 45 45 44 43 43 43 43 44 43 43 43 43 43 42 41 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 34 35 35 35 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 62 62 62 61 61 61 61 61 60 59 58 58 58 59 60 61 61 61 60 60 60 60 59 58 58 58 58 58 58 58 57 57 56 54 53 52 52 51 51 51 50 50 50 50 50 50 50 51 52 52 52 52 52 52 52 51 51 51 51 50 49 47 47 47 48 49 49 50 51 49 48 49 49 49 50 50 49 49 49 49 48 47 48 48 47 46 45 45 46 46 45 43 41 40 40 40 40 41 41 43 44 46 47 47 48 48 47 46 45 44 41 39 37 37 39 40 41 42 42 43 44 44 44 45 46 46 45 45 42 40 40 42 43 44 46 46 47 49 50 51 52 52 52 51 51 51 50 50 50 49 48 48 49 51 51 51 51 52 53 53 54 53 53 51 50 50 49 48 47 47 46 46 46 46 45 45 44 44 44 43 43 43 44 45 45 46 47 48 46 46 46 46 45 44 44 44 44 44 43 42 42 41 41 42 41 40 40 40 40 40 39 39 38 37 39 40 39 40 40 39 37 36 36 37 38 39 41 43 41 39 40 41 42 41 40 38 38 39 38 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 39 39 40 40 41 41 42 42 41 41 41 40 39 38 37 37 39 39 40 41 42 42 43 43 43 43 43 42 42 42 42 43 43 41 40 41 41 40 39 38 36 35 35 35 35 36 37 37 37 37 37 37 37 38 39 40 41 41 41 42 42 43 44 44 44 44 44 43 43 42 41 41 41 42 43 43 43 43 43 43 43 41 41 40 40 41 41 42 42 42 41 41 41 42 41 40 40 41 41 41 41 41 40 40 41 41 41 41 40 40 41 41 41 41 41 41 41 40 40 40 39 37 36 36 37 39 40 40 40 40 41 42 42 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 43 44 45 45 46 46 46 45 44 43 43 43 44 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 39 38 38 39 39 39 39 38 38 39 40 40 40 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 34 33 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 63 63 62 62 62 62 61 60 59 58 58 58 58 59 60 61 61 61 61 60 61 61 60 59 59 59 59 59 58 58 57 57 55 54 52 51 51 51 51 51 52 53 52 53 52 51 50 51 52 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 50 51 51 51 50 49 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 47 46 47 47 47 46 44 42 41 40 40 40 40 40 40 40 41 43 44 47 48 46 45 44 43 40 38 37 37 39 41 41 43 43 43 44 45 46 46 46 48 47 45 43 41 39 41 42 43 44 45 47 49 50 50 51 52 52 51 50 50 50 50 49 48 48 48 48 49 50 51 52 52 53 53 54 54 54 52 51 51 51 50 49 48 47 47 46 46 46 46 46 45 45 44 44 44 45 46 46 46 47 47 46 46 45 45 46 45 44 43 43 43 43 42 41 41 41 42 41 41 40 40 40 40 39 38 37 37 39 41 42 41 40 40 39 37 36 37 38 39 40 42 42 42 43 43 42 41 40 39 39 40 41 40 39 37 35 36 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 38 38 39 40 41 43 44 42 41 40 40 40 39 37 37 38 39 41 41 41 41 42 43 44 44 43 42 41 41 41 41 43 42 41 40 41 40 39 40 39 36 35 35 35 36 37 38 38 38 39 39 39 38 39 40 41 41 41 42 43 43 43 43 43 44 44 44 43 43 42 41 41 42 43 43 43 42 42 42 43 43 42 41 40 40 41 42 42 41 40 40 40 41 42 41 40 40 41 41 41 41 41 40 40 41 41 41 41 40 40 41 41 40 40 40 41 41 40 39 39 39 37 36 35 37 38 39 39 40 40 41 42 42 41 41 41 41 41 42 42 42 42 42 43 42 42 42 42 42 42 43 44 45 45 46 46 46 45 44 43 43 43 44 44 44 43 43 43 43 42 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 38 38 39 39 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 34 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 63 63 63 63 62 62 61 60 59 60 60 59 59 59 60 61 61 62 61 61 61 61 61 60 60 60 60 60 59 57 56 56 55 54 52 52 53 53 53 54 54 54 54 54 53 51 51 52 53 53 53 53 53 53 52 52 52 50 49 49 51 51 50 50 51 52 52 51 50 50 51 51 51 50 50 50 50 50 50 50 50 50 49 48 46 47 48 47 47 46 45 44 43 43 42 42 42 42 41 40 40 39 39 40 43 45 45 45 43 42 40 38 38 38 40 42 43 43 43 44 45 45 46 46 47 48 47 45 44 42 40 39 40 42 44 45 47 49 50 50 51 52 52 51 49 49 49 48 48 48 48 48 49 50 50 51 52 52 53 53 54 55 54 53 53 53 52 52 51 50 50 49 48 48 48 47 47 47 46 46 45 45 46 46 46 46 45 45 45 45 44 44 45 45 44 43 42 42 42 42 41 40 40 40 39 39 39 39 39 39 38 38 37 37 38 40 41 42 42 41 41 39 37 37 38 39 39 41 42 44 44 42 41 40 40 41 42 42 42 41 39 38 37 39 38 37 36 36 37 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 40 40 41 43 43 41 42 41 39 39 38 37 38 39 40 41 41 42 42 43 43 43 43 43 43 41 41 41 42 42 42 40 40 39 39 39 38 37 35 35 35 36 37 38 39 39 40 40 40 40 39 40 41 42 42 43 43 43 42 42 42 43 43 43 44 44 43 42 41 41 42 42 43 42 41 41 43 43 42 42 41 40 39 40 41 42 41 40 39 40 41 42 40 40 40 41 41 42 41 41 40 40 41 41 41 41 40 39 40 41 40 40 40 39 40 39 38 39 40 39 37 35 36 37 38 38 39 40 41 42 41 41 41 42 42 42 42 42 42 43 43 43 43 43 42 42 43 43 43 44 45 46 46 45 45 45 44 44 43 43 43 44 44 43 43 43 43 42 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 39 39 39 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 63 63 63 62 62 61 61 60 60 61 61 60 60 60 60 61 62 62 62 61 61 61 61 61 61 61 60 60 59 57 56 55 54 53 52 53 53 53 54 55 55 55 54 53 53 52 52 53 53 54 54 54 54 53 52 50 50 50 50 51 52 52 51 51 52 53 53 52 51 51 52 52 51 51 51 51 51 50 50 50 50 49 49 48 47 48 48 47 46 45 45 45 45 46 45 44 45 45 44 42 41 41 40 39 40 41 43 44 42 41 39 38 38 38 39 41 43 44 44 45 46 47 46 46 48 49 48 47 45 43 42 42 40 41 43 45 47 49 49 49 50 50 50 49 48 49 48 47 47 48 49 50 51 51 50 50 51 52 52 53 54 55 55 54 54 54 54 54 53 52 52 51 50 50 49 48 48 48 48 47 46 46 46 45 45 44 44 44 44 43 43 43 43 43 43 42 42 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 39 40 41 42 41 40 39 37 38 39 40 40 42 44 44 44 43 42 43 45 45 44 43 43 41 39 38 38 41 40 39 39 38 40 40 38 36 36 37 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 38 39 39 39 42 43 41 41 40 38 37 37 36 38 39 40 42 42 43 43 44 43 42 42 42 41 41 42 42 43 42 41 40 40 39 39 39 37 35 35 35 36 37 38 39 40 40 40 41 41 40 40 41 42 42 43 43 43 43 42 42 42 43 42 43 44 44 43 42 40 41 42 42 42 42 41 42 43 43 42 42 41 39 39 40 40 41 41 40 39 40 41 41 40 39 40 41 42 42 41 41 40 40 41 41 41 41 40 39 40 40 40 41 40 39 39 38 38 39 40 39 37 35 36 38 39 39 40 41 41 41 41 41 41 41 42 41 41 42 42 43 44 44 44 43 43 43 43 43 43 44 45 46 46 45 45 45 45 44 43 43 43 44 44 44 43 43 43 42 41 41 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 36 37 37 37 36 36 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 34 34 34 34 34 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 63 62 62 62 62 61 61 61 62 62 61 61 61 61 61 61 62 62 62 62 62 61 61 61 61 60 59 58 58 57 56 54 53 53 53 54 54 55 56 57 56 55 54 53 53 52 53 53 54 54 53 53 53 52 50 49 49 50 52 52 52 52 52 52 53 53 53 52 51 52 52 52 52 52 52 51 51 51 51 50 49 49 50 50 49 49 48 48 48 47 47 47 46 46 45 45 45 46 45 43 43 43 42 40 39 39 40 41 40 39 38 38 38 39 39 41 43 43 44 46 47 48 47 47 48 49 48 47 45 44 44 43 40 40 43 45 47 48 48 48 48 49 48 47 47 47 48 48 48 48 49 50 51 52 51 51 51 52 53 53 53 55 55 55 55 55 54 53 53 52 52 53 52 51 50 49 48 48 47 47 46 45 45 45 44 44 44 44 43 43 43 43 43 42 42 42 43 42 41 40 40 40 39 39 39 39 39 38 39 39 38 38 38 38 39 40 41 41 41 41 41 39 37 39 41 42 42 43 44 45 44 44 44 44 45 45 44 43 42 41 39 39 39 41 41 41 41 39 41 40 39 38 38 39 40 41 39 38 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 38 40 41 42 42 40 39 38 36 36 37 38 38 39 41 42 42 43 44 43 42 41 41 40 41 42 43 44 43 41 40 40 40 38 37 36 35 35 35 36 37 39 40 40 41 41 41 42 41 41 42 42 42 42 42 43 43 42 42 42 42 42 42 43 43 43 42 40 40 41 41 41 41 42 42 43 43 43 42 41 39 39 40 40 40 40 39 39 40 41 40 39 39 40 41 41 41 41 40 39 40 41 41 41 41 40 39 40 40 41 41 41 40 39 38 38 39 40 38 36 35 36 38 40 41 41 42 42 41 41 40 40 40 41 41 42 42 43 44 44 45 45 45 44 44 43 43 43 44 44 45 46 45 45 45 45 44 44 43 43 44 44 43 43 43 43 42 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 36 36 37 37 37 36 36 36 36 36 35 35 36 36 37 36 36 37 37 37 37 37 36 36 36 36 36 36 37 36 36 35 35 35 35 35 34 34 35 35 35 35 34 34 34 34 34 34 33 33 34 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 63 62 62 62 62 62 61 61 62 62 61 61 62 62 62 62 62 62 62 62 62 61 61 61 61 60 58 58 57 56 55 53 54 54 54 55 55 56 57 58 57 55 54 54 53 53 53 54 54 54 53 53 52 51 49 50 51 51 52 53 53 53 53 53 54 54 53 52 52 53 53 53 53 53 52 53 53 52 52 50 49 50 51 51 50 49 49 49 49 49 48 48 47 46 46 46 46 46 45 44 44 44 43 42 40 39 39 39 39 38 38 40 41 41 40 40 42 43 44 46 47 48 48 48 49 49 48 47 46 45 45 44 41 41 44 46 47 47 47 47 46 47 47 46 46 47 48 49 49 49 48 49 51 52 52 52 52 53 53 53 53 54 55 56 56 55 54 53 52 51 51 51 51 50 50 49 48 48 47 46 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 44 43 42 42 41 40 40 40 40 40 40 40 40 40 39 39 38 39 40 40 41 41 41 42 42 39 38 39 42 43 43 43 43 44 45 45 45 44 43 42 42 42 41 41 39 39 40 40 41 43 43 41 42 42 41 39 38 39 40 42 41 40 38 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 38 40 40 41 40 40 39 37 35 36 38 38 38 39 41 42 42 43 44 43 42 41 41 40 41 42 42 43 43 41 39 40 41 38 36 35 35 35 36 37 38 39 40 41 41 41 42 42 42 42 42 42 42 42 42 43 43 43 42 41 42 42 42 42 42 42 41 40 40 40 40 40 41 42 42 42 42 42 42 41 40 39 39 39 40 39 39 40 40 40 39 39 40 40 41 41 41 41 40 39 39 40 41 41 40 39 39 40 40 41 41 41 41 39 38 37 39 39 37 35 35 36 38 40 41 42 43 42 41 41 40 40 41 42 42 43 43 44 44 45 45 45 45 45 44 44 43 43 44 44 45 46 45 45 44 44 44 44 44 44 44 44 43 43 43 43 42 42 41 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 39 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 37 37 37 37 37 36 36 35 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 35 35 35 34 34 33 33 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 63 63 62 62 62 62 62 62 62 62 61 61 62 62 62 62 62 62 62 62 62 62 61 61 61 60 59 58 57 56 54 53 55 56 56 55 56 57 58 58 57 56 55 55 54 53 53 54 54 54 53 53 52 51 50 51 52 53 53 54 54 54 54 54 55 54 53 52 53 54 54 54 54 54 53 54 54 53 52 50 50 52 53 52 51 50 50 50 50 49 49 49 48 47 46 46 46 46 45 45 45 44 43 43 43 42 41 40 41 40 40 42 43 43 41 40 42 43 44 45 47 47 48 49 49 50 49 48 48 47 46 44 42 41 43 44 45 45 44 45 45 44 45 46 47 48 48 49 50 49 49 50 51 52 52 52 52 53 53 53 54 55 55 55 55 54 54 53 52 51 50 49 49 49 49 48 48 47 47 46 46 46 46 46 45 45 46 46 46 46 45 45 44 44 44 44 44 44 43 43 42 42 42 42 41 41 41 41 41 41 42 41 40 40 40 40 40 40 40 40 39 38 38 38 41 42 42 43 43 44 45 45 44 43 42 42 43 43 42 43 40 40 41 40 41 42 42 42 43 43 42 40 38 39 40 42 42 40 39 39 39 38 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 40 41 38 38 38 36 35 36 37 38 39 40 42 43 43 43 44 43 43 42 40 40 41 41 41 42 43 41 39 39 39 38 36 35 35 35 37 38 39 39 40 40 41 42 42 41 41 41 41 41 42 42 42 43 42 42 42 41 42 42 42 41 42 41 40 40 39 40 40 41 42 42 42 42 42 42 42 42 41 40 39 39 39 39 39 40 40 39 39 39 40 41 41 42 42 42 41 39 39 40 41 41 40 39 39 40 41 42 42 42 41 39 38 37 37 38 36 35 36 38 39 40 41 42 43 42 42 41 40 40 41 42 42 42 43 44 44 44 44 44 45 45 44 44 44 44 44 45 45 46 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 37 36 36 37 37 37 36 36 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 32 33 32 33 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 34 62 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 59 58 57 55 54 55 57 58 57 55 57 58 59 58 57 57 57 56 55 54 53 53 53 53 53 52 52 51 52 52 52 53 54 55 55 55 55 55 55 54 53 53 54 55 55 55 55 54 54 55 55 54 52 51 52 53 53 52 51 51 51 51 51 50 49 49 48 48 47 47 47 46 46 45 45 44 44 44 44 44 43 43 44 43 42 43 44 44 41 40 42 44 45 46 47 47 48 49 50 50 49 49 48 46 45 44 42 41 41 42 43 43 43 44 45 46 47 48 48 48 49 49 50 50 50 51 51 52 52 53 53 53 53 54 54 55 55 55 54 54 53 52 52 51 50 49 49 49 48 48 48 47 47 47 47 47 47 47 47 46 47 47 46 46 45 45 45 45 44 45 45 45 45 44 44 44 44 44 43 43 43 42 42 43 43 43 42 42 41 40 40 40 39 38 38 38 39 38 39 41 41 43 43 44 45 45 44 43 43 43 44 44 43 42 40 41 42 42 41 41 41 42 44 43 42 42 40 40 42 42 42 42 40 40 40 40 39 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 38 37 37 37 35 35 37 38 38 39 40 42 43 43 43 43 43 42 41 40 40 41 41 41 42 42 40 39 39 38 37 35 35 35 35 37 38 39 39 39 40 41 42 41 41 41 41 41 42 42 43 42 42 42 41 41 41 42 42 41 41 42 41 40 39 39 41 41 42 42 41 41 41 41 42 42 42 42 41 39 39 39 38 39 39 39 39 40 40 40 41 41 42 42 42 41 40 39 39 41 41 40 38 39 41 42 42 42 41 40 40 39 37 36 36 35 36 38 39 41 41 42 43 43 43 43 42 40 40 41 41 42 42 43 43 43 43 43 43 44 44 44 45 44 44 44 44 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 41 41 41 40 40 40 39 39 39 39 38 38 38 38 38 38 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 39 39 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 35 35 35 35 35 35 35 34 34 34 34 34 33 33 33 32 32 33 34 34 34 34 34 34 34 34 35 34 34 35 35 35 35 35 35 35 35 35 34 62 63 63 63 62 62 62 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 59 58 57 56 55 54 56 57 59 57 56 57 59 59 59 58 58 58 57 55 54 53 53 53 53 52 52 52 52 52 52 52 53 55 56 57 57 56 56 56 54 54 54 54 55 56 56 56 55 55 55 55 53 52 53 53 54 53 53 53 53 53 52 51 51 50 50 49 49 49 48 48 47 46 45 45 45 44 45 45 44 44 43 43 44 44 44 45 44 41 40 42 44 47 48 48 48 48 50 50 51 50 49 48 47 46 45 45 42 42 43 44 44 45 46 46 48 49 49 48 48 48 49 50 51 52 52 53 53 53 54 54 55 54 55 55 55 55 54 54 54 54 53 52 51 51 50 50 49 48 48 49 49 49 48 48 49 48 49 49 48 48 48 47 47 46 46 47 46 46 46 46 46 46 45 44 44 44 44 44 45 45 45 44 44 44 44 44 44 42 42 41 40 39 38 39 40 40 40 38 39 41 42 43 43 44 45 45 44 44 44 44 43 42 40 41 42 42 42 43 43 42 42 44 44 43 43 42 42 42 40 41 41 41 41 41 41 39 37 37 37 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 38 36 35 36 38 39 40 40 40 41 42 43 43 43 42 42 42 40 39 40 41 41 42 41 39 39 39 38 36 35 35 35 36 37 37 38 38 39 40 41 40 40 40 40 41 41 42 43 42 42 42 41 41 41 42 43 42 41 41 42 41 40 39 39 41 41 42 41 40 40 41 42 42 42 41 42 41 40 39 38 38 39 39 40 40 40 41 41 42 42 42 42 40 40 40 39 39 40 40 39 38 39 41 41 40 40 41 40 39 38 37 35 35 35 36 39 40 41 42 43 43 42 43 42 41 40 40 41 42 42 43 42 42 42 42 43 44 44 44 44 45 44 44 43 43 44 45 45 45 45 44 44 43 43 44 44 44 43 43 43 43 43 43 42 42 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 37 37 37 36 36 37 37 37 36 36 37 36 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 62 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 62 61 61 60 60 60 59 58 56 55 55 57 58 59 58 57 57 59 60 59 58 59 59 57 55 54 54 54 54 53 53 53 52 52 53 54 53 54 56 57 58 58 57 57 56 55 56 56 56 56 57 57 56 56 56 55 54 53 53 54 54 54 54 54 54 55 55 53 53 52 51 50 50 49 49 49 48 47 47 47 46 45 45 46 45 44 44 44 44 44 45 45 45 43 40 40 42 44 46 48 49 49 49 50 51 51 51 50 49 48 47 47 46 43 42 44 46 47 47 47 46 47 49 50 49 49 49 49 50 51 52 53 54 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 52 51 51 51 49 49 49 49 49 50 50 50 50 49 50 50 49 49 49 48 48 48 48 48 47 47 46 45 45 45 44 44 44 43 43 43 44 45 45 45 44 44 44 44 44 43 43 41 40 38 38 39 40 41 41 40 39 40 41 42 43 44 46 46 45 45 45 43 43 42 41 42 43 43 43 43 44 44 44 44 42 42 42 42 41 40 39 39 40 41 42 42 41 40 38 39 40 41 38 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 35 35 37 38 39 39 40 41 43 44 43 43 42 41 42 41 39 40 41 41 41 41 40 40 40 38 36 34 34 35 36 36 37 38 39 39 40 40 40 40 40 40 40 41 42 43 42 41 41 41 40 42 43 43 42 41 41 42 41 40 39 39 41 41 41 41 40 40 41 41 41 41 40 40 40 40 38 38 39 40 40 40 41 41 42 42 43 42 42 41 40 40 39 38 39 40 40 38 38 40 41 41 40 39 40 39 37 36 36 36 36 36 38 40 41 42 43 42 42 42 42 42 41 41 41 41 42 42 42 41 42 42 43 43 44 45 45 45 45 45 44 43 43 43 44 45 45 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 38 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 37 36 36 36 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 36 36 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 62 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 60 60 60 60 59 59 59 59 57 56 55 56 58 59 60 59 57 58 59 59 59 59 59 59 57 55 55 55 55 54 54 54 53 52 52 54 55 55 54 56 57 58 58 58 58 56 56 57 57 57 56 57 57 57 56 56 55 54 54 55 55 54 55 55 55 55 55 55 55 55 54 53 52 51 50 50 49 49 48 48 48 47 47 47 46 45 45 45 44 45 46 46 47 46 43 40 42 44 46 47 48 49 50 50 50 51 52 51 50 50 49 48 47 46 43 42 43 46 48 48 48 48 48 49 50 50 50 50 50 50 50 51 53 54 55 55 55 55 55 55 54 54 54 54 53 53 53 53 54 54 53 52 52 51 50 50 50 50 50 51 51 51 50 50 49 49 49 49 48 47 48 48 47 47 47 46 45 45 45 45 45 45 44 44 43 43 43 44 44 44 44 43 43 43 42 41 41 40 39 39 39 40 41 42 42 41 40 40 41 42 43 45 46 47 47 46 45 43 44 43 42 43 43 45 45 45 45 44 45 45 43 42 41 40 40 40 39 39 39 39 40 41 41 41 40 39 40 41 39 38 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 36 35 35 37 38 39 39 40 42 44 44 43 43 42 40 41 41 39 39 40 41 41 41 40 40 39 38 36 34 34 35 35 36 37 38 39 40 40 40 39 40 39 39 40 41 42 42 41 41 40 40 41 42 42 42 42 41 41 41 41 40 39 39 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 41 41 41 41 42 43 43 42 42 42 41 40 39 37 38 39 40 39 38 38 40 40 41 40 38 37 37 35 35 36 37 36 38 40 40 40 41 42 42 41 41 42 43 42 42 41 41 42 42 41 41 42 43 43 43 44 45 46 46 46 45 44 43 43 43 43 44 44 45 45 44 43 43 42 42 42 43 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 36 36 36 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 36 36 36 37 37 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 34 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 60 59 59 59 59 58 57 57 56 56 56 57 59 60 60 60 58 58 58 59 60 59 59 58 56 55 55 55 55 55 55 54 54 53 53 54 56 56 55 56 57 58 59 58 57 57 57 57 58 57 57 58 57 57 56 55 55 54 55 56 56 56 56 56 55 54 55 54 54 55 54 54 54 53 52 51 50 49 49 49 48 48 48 48 47 47 47 47 46 47 48 48 47 46 43 40 41 44 46 47 47 48 49 50 51 51 51 52 51 50 49 48 47 46 44 42 44 46 47 48 49 50 49 49 49 50 50 50 50 50 50 52 53 54 54 54 55 55 55 54 54 54 54 53 53 53 53 54 54 54 53 53 52 51 51 51 52 51 52 52 52 51 51 50 49 49 48 48 47 46 46 46 46 46 46 46 45 45 45 46 46 46 46 45 45 44 43 42 43 43 43 42 42 42 41 40 40 39 39 40 40 41 42 42 42 40 40 40 41 42 43 44 46 47 47 46 46 45 45 44 44 44 44 45 45 45 44 43 43 44 43 42 41 41 41 41 41 39 38 38 38 40 40 40 41 41 41 41 40 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 36 38 39 40 41 41 42 43 43 42 42 41 40 40 40 39 39 41 41 41 40 40 40 38 36 35 34 35 35 36 36 37 38 39 40 40 39 38 39 39 39 41 42 42 42 41 40 40 40 42 42 42 41 41 41 41 41 42 41 40 39 39 40 40 39 39 39 40 40 39 39 38 38 39 39 40 40 40 40 41 42 42 42 43 42 41 41 41 41 40 39 37 38 40 40 39 38 38 39 39 39 38 36 35 35 36 37 38 38 37 37 38 39 40 41 41 41 41 42 43 42 41 41 41 40 41 41 41 42 42 43 43 44 44 45 45 45 45 44 43 43 43 43 43 44 44 45 45 44 44 43 42 42 42 42 42 42 42 42 43 43 43 42 42 41 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 36 37 37 37 36 36 36 36 36 37 37 37 36 36 36 37 36 36 36 36 36 36 37 36 36 36 35 35 35 35 35 35 35 35 35 34 34 33 32 32 33 34 34 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 60 60 59 59 58 57 56 56 56 57 58 59 60 61 60 60 59 58 59 60 60 59 57 56 57 57 56 55 55 55 55 54 54 53 54 56 57 57 56 57 58 58 58 58 57 58 58 58 58 58 58 57 57 57 56 56 56 56 56 57 56 56 55 55 54 54 53 53 53 53 53 53 53 52 52 51 50 50 50 49 49 49 48 48 48 48 48 49 49 49 48 47 45 43 41 41 44 44 45 47 47 48 49 50 51 51 51 51 50 49 48 47 47 45 43 44 46 47 48 50 50 50 49 49 49 50 50 50 50 51 52 54 54 53 53 54 54 54 54 54 54 54 53 52 53 53 54 55 55 54 54 53 52 51 52 52 52 52 52 51 51 51 50 49 49 49 49 48 47 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 45 43 42 42 42 41 41 41 40 40 40 40 40 40 41 42 42 43 43 43 41 40 39 40 41 42 43 45 46 46 46 46 46 46 45 45 45 45 45 45 45 44 43 43 42 42 42 41 41 41 41 41 40 39 39 38 38 39 40 40 41 41 40 39 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 38 39 40 41 41 42 43 42 41 41 40 39 40 40 39 39 41 42 41 40 40 40 38 36 34 34 35 37 37 37 37 38 40 40 39 38 38 39 40 40 41 42 42 42 41 40 40 41 42 41 41 41 40 40 41 41 42 41 40 38 38 40 40 39 38 39 39 39 38 38 38 39 40 40 40 40 40 40 41 42 43 43 42 41 41 41 41 41 40 39 37 38 39 40 40 39 38 37 37 36 35 35 36 36 37 39 40 40 38 37 37 38 39 40 40 41 42 42 43 42 41 40 40 41 41 41 42 42 42 43 43 44 44 43 44 44 44 44 43 43 43 43 43 44 44 45 45 44 44 43 42 42 42 42 42 42 42 42 42 43 43 43 43 42 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 36 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 61 61 61 60 59 58 57 57 57 56 57 59 60 60 60 61 60 59 59 59 60 60 59 57 56 57 58 57 56 56 55 55 55 55 54 53 55 56 57 57 57 58 58 59 58 58 58 58 58 58 58 58 58 58 57 57 57 57 56 56 56 56 55 55 54 53 52 52 52 52 52 52 51 51 50 51 51 51 51 50 50 49 49 49 49 49 49 50 51 50 49 49 47 46 44 41 41 44 46 46 47 48 49 50 50 51 51 50 50 49 50 49 48 45 44 43 44 46 47 48 48 49 49 50 50 50 50 50 51 51 51 52 53 53 53 53 53 54 54 53 54 53 53 52 52 53 53 54 54 55 56 55 54 53 52 53 53 53 52 52 51 50 50 50 50 50 50 49 49 48 47 47 48 49 49 49 48 48 47 46 45 45 45 45 45 44 43 43 43 42 41 40 40 40 41 41 40 41 42 42 42 43 43 44 43 42 40 40 40 41 42 43 45 45 45 45 46 46 46 46 47 47 46 46 46 45 44 44 44 43 43 43 43 42 42 42 42 40 40 39 39 38 38 38 39 40 40 39 39 38 39 39 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 36 38 38 38 40 41 41 43 42 41 40 39 39 40 39 39 40 41 41 41 40 40 39 38 36 34 35 36 37 38 38 37 38 40 40 38 38 38 39 40 41 41 41 41 41 41 39 39 41 41 40 40 40 40 40 41 41 41 40 40 39 38 38 39 38 38 38 38 38 38 39 40 40 41 41 40 41 41 42 42 43 43 42 41 40 40 41 41 41 40 38 37 38 39 39 40 40 38 36 35 35 36 38 38 39 39 41 42 41 40 39 39 39 38 39 41 41 42 42 43 42 41 40 40 42 42 42 42 42 43 43 44 44 43 43 43 44 44 43 43 43 42 42 43 44 44 45 45 45 44 44 43 42 42 42 42 42 42 42 42 43 43 43 43 42 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 34 33 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 60 60 59 58 58 58 58 58 57 57 59 59 60 60 61 60 59 59 59 60 60 59 58 57 57 58 58 57 56 55 55 55 55 54 54 54 56 58 58 58 58 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 55 55 54 53 52 52 53 53 54 53 52 51 50 50 50 50 50 50 49 49 49 49 48 48 49 49 50 51 50 49 48 47 46 45 43 42 43 46 47 48 49 49 50 52 52 52 51 50 50 49 48 48 46 43 43 43 45 47 47 47 48 50 51 51 51 52 51 51 51 51 51 52 52 52 52 53 54 53 53 54 54 53 52 52 52 53 54 54 55 55 55 55 53 52 53 54 53 53 52 52 51 51 51 51 50 50 49 49 48 48 48 48 49 50 49 49 48 47 47 46 46 45 45 45 44 44 44 43 42 41 40 41 41 42 42 41 42 43 43 43 43 44 44 43 42 41 40 40 41 42 43 44 44 45 44 44 45 46 47 48 48 46 46 45 44 44 45 44 43 44 45 44 43 43 43 42 41 40 39 40 39 38 37 37 37 38 38 38 38 39 40 39 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 38 39 40 41 42 42 42 41 39 39 40 40 38 39 41 42 41 40 39 39 38 37 35 34 35 37 37 38 38 38 39 40 39 38 38 39 40 41 40 40 40 41 41 41 40 39 40 40 40 39 40 41 41 41 41 41 41 40 39 38 38 37 37 38 38 38 39 39 40 41 41 42 42 41 42 42 42 43 43 43 42 41 40 40 41 41 40 40 38 37 38 39 38 38 38 37 35 35 36 38 39 39 39 40 41 41 42 42 42 42 41 39 40 41 42 42 42 42 41 41 40 40 41 42 42 43 43 43 44 43 43 42 42 42 43 43 42 42 42 42 42 43 44 44 45 45 45 44 44 44 43 42 42 42 42 42 42 42 42 43 43 42 41 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 36 35 36 37 36 36 36 36 35 35 36 36 36 36 36 35 35 35 35 35 35 34 34 34 34 34 33 33 32 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 64 64 64 64 64 63 63 63 62 62 62 62 62 62 61 61 62 62 61 60 59 59 58 58 58 59 59 59 58 58 59 59 60 61 61 60 59 59 59 60 60 59 58 57 58 59 58 57 56 56 56 57 56 54 54 55 56 58 58 58 58 59 59 59 59 59 59 58 58 58 57 57 57 57 56 56 56 56 56 55 54 53 53 53 53 54 55 56 55 54 54 52 51 51 51 50 49 49 48 48 48 48 47 47 47 48 49 49 49 49 48 47 46 45 45 43 42 46 48 48 49 50 50 51 52 52 51 51 50 48 47 47 46 45 43 43 45 47 48 49 49 50 51 51 53 53 52 52 51 50 51 52 52 52 53 53 53 53 53 53 53 52 51 51 52 53 53 53 54 55 55 55 54 54 54 54 54 53 52 52 52 52 51 51 51 51 50 50 49 49 49 49 49 50 50 49 49 49 49 48 47 46 46 46 46 45 45 43 42 41 41 43 44 44 44 43 42 43 44 44 44 44 44 43 43 42 41 41 40 41 42 42 43 44 44 44 44 45 46 47 47 46 46 45 45 45 45 44 44 45 46 45 44 44 43 42 42 41 41 40 39 38 39 38 37 37 37 36 38 39 39 39 39 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 39 39 41 42 42 42 41 39 39 40 40 38 38 40 41 41 40 39 38 37 35 34 34 36 37 38 39 39 39 40 40 39 38 38 39 40 40 40 40 40 41 41 41 40 39 38 39 39 40 40 41 42 41 40 41 41 40 39 38 37 37 38 39 40 40 41 41 41 42 42 42 43 42 43 42 41 42 42 42 41 41 40 40 41 41 40 39 38 37 38 38 37 36 36 35 35 36 37 39 40 39 39 39 40 41 42 43 43 43 42 40 40 41 42 42 42 41 41 41 40 40 40 41 42 42 42 43 43 43 42 42 42 42 42 42 42 42 42 42 43 43 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 42 41 41 41 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 38 38 38 37 37 38 37 37 37 37 37 37 36 36 36 36 36 35 35 36 35 35 36 36 36 36 36 36 35 35 35 35 35 34 34 33 34 33 33 32 31 33 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 64 64 64 64 64 63 63 63 63 63 63 62 62 62 61 61 61 61 60 60 59 59 59 60 60 60 60 59 58 58 60 60 60 61 61 60 59 59 60 59 59 59 58 57 58 59 59 59 58 58 57 57 56 55 55 55 56 58 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 56 56 56 55 55 54 53 53 53 53 54 56 56 56 55 55 56 55 53 52 51 51 50 50 49 49 49 49 48 47 46 45 46 46 47 48 48 47 46 45 44 42 43 46 47 47 48 50 51 51 52 51 50 50 49 48 47 48 48 47 45 44 46 48 49 50 50 51 52 52 53 53 52 52 51 50 51 52 51 52 53 53 53 52 52 52 51 51 51 51 51 52 53 54 54 55 56 56 56 55 55 54 54 54 53 53 53 52 52 52 52 52 51 50 50 49 49 49 48 49 49 49 49 49 49 49 48 48 47 46 46 45 44 42 42 42 43 44 45 45 45 44 43 43 44 45 45 45 44 43 42 42 43 42 41 41 41 41 42 43 44 44 44 44 45 46 47 46 47 47 47 46 45 45 45 45 45 45 45 44 43 42 42 42 40 39 39 39 40 40 39 38 37 36 36 37 38 38 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 38 38 40 42 41 41 41 39 38 39 39 37 38 40 40 41 40 39 38 36 34 34 35 36 37 37 38 39 40 40 40 38 37 38 39 40 39 39 40 41 41 41 41 40 39 38 39 40 41 41 41 41 41 40 40 40 40 39 37 37 38 39 40 40 41 41 41 42 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 41 41 39 38 37 36 36 36 35 35 35 35 37 38 39 40 41 41 41 40 41 41 42 42 43 43 42 40 40 41 41 42 42 42 42 42 42 41 40 40 41 42 42 42 42 42 41 41 41 42 42 42 42 42 42 42 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 42 42 42 41 41 41 41 40 39 39 39 39 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 36 35 35 35 35 35 35 36 37 37 36 36 36 35 35 35 35 35 34 34 34 33 32 31 31 33 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 64 64 64 64 64 63 63 63 63 62 62 62 62 62 61 61 60 60 61 61 61 61 61 60 60 59 59 58 59 60 60 61 61 61 60 60 60 60 59 59 59 58 58 59 59 59 59 59 59 57 56 55 54 55 57 57 58 58 58 59 59 59 59 59 58 58 59 58 58 57 57 58 57 56 56 56 55 55 54 54 54 55 55 55 56 57 56 56 57 57 56 55 55 53 52 52 51 50 49 50 49 49 48 47 46 46 46 45 46 46 46 45 43 43 43 44 45 46 47 48 49 51 51 51 50 50 50 49 48 48 49 49 48 46 45 45 47 49 50 51 52 52 52 52 51 50 50 49 50 51 51 51 52 53 52 52 52 51 51 51 52 52 52 52 52 53 54 54 55 55 56 56 56 56 56 55 55 54 54 54 53 53 52 52 52 51 50 49 48 48 47 47 47 47 47 47 47 46 47 47 47 46 45 44 44 43 43 42 43 43 43 44 45 45 45 44 43 44 45 46 46 44 43 43 43 43 43 43 41 41 41 42 42 42 43 44 45 45 46 46 47 47 47 47 47 47 46 46 46 45 44 44 43 42 42 42 41 40 39 39 40 41 41 40 40 39 37 36 36 36 36 37 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 38 39 41 42 41 40 40 39 37 37 37 37 39 40 41 40 39 39 37 35 34 34 36 37 37 38 38 39 40 40 39 38 37 38 39 39 38 39 40 41 41 41 41 40 39 39 39 41 42 42 41 41 41 41 40 39 39 38 37 37 38 38 38 39 39 40 40 41 42 43 43 42 42 42 42 42 40 40 40 40 39 39 40 41 41 39 38 37 36 35 35 35 36 36 38 40 41 42 41 41 42 42 42 41 41 42 42 42 42 41 40 41 41 42 42 42 43 43 43 42 41 40 40 41 41 41 41 41 41 41 41 42 42 43 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 44 44 44 44 43 43 43 43 42 42 42 41 41 41 41 40 40 39 39 39 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 36 36 35 35 35 35 35 36 37 37 37 37 37 36 35 35 35 35 35 34 34 33 33 32 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 64 64 64 64 64 64 63 63 62 62 62 62 62 61 61 61 62 62 61 61 61 61 60 60 59 59 59 58 60 60 61 61 61 60 60 60 60 59 59 59 58 59 60 60 60 59 58 58 57 56 55 55 56 57 58 59 58 58 59 59 59 59 59 58 58 58 58 58 57 57 57 57 56 56 56 55 55 55 55 55 55 56 56 56 56 56 56 56 56 56 56 56 55 54 53 52 52 50 50 50 50 49 49 49 49 48 46 45 45 45 44 43 44 45 46 45 45 47 49 51 52 52 51 51 51 50 49 49 49 49 49 48 47 46 44 46 48 50 51 52 52 51 52 51 49 48 49 50 51 51 51 51 52 52 52 51 50 50 51 52 53 53 53 53 53 53 54 54 55 56 56 56 57 57 56 55 55 55 54 53 53 52 52 52 51 50 49 48 48 48 47 47 47 46 47 47 46 45 45 45 44 44 44 44 44 43 43 43 44 44 45 45 46 46 45 44 45 45 46 46 45 44 44 43 43 43 43 42 42 42 42 42 42 43 44 45 46 46 46 46 46 46 46 47 47 47 46 46 46 44 43 42 42 42 41 40 40 39 40 41 41 42 41 40 39 38 37 36 35 35 37 38 38 38 37 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 39 40 41 41 42 40 39 38 37 36 36 38 39 40 40 38 37 38 36 34 34 36 37 37 38 38 39 39 40 40 38 37 38 38 39 38 38 40 41 41 40 40 40 40 39 38 39 40 41 41 41 41 40 40 39 38 37 37 37 38 38 39 39 39 39 39 39 40 41 41 41 42 41 41 42 42 41 40 40 39 39 39 40 41 41 40 39 39 37 36 35 35 36 37 38 40 41 41 41 42 42 43 42 42 43 43 42 42 42 41 41 42 42 42 42 43 43 43 43 42 41 40 40 40 40 40 40 41 41 41 42 42 43 43 43 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 43 43 43 43 42 43 43 43 42 42 42 41 41 41 41 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 36 36 35 35 35 35 35 36 36 37 37 37 37 36 35 35 35 35 35 35 34 34 34 34 33 31 31 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 64 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 59 58 59 60 61 61 61 60 60 60 60 59 59 59 59 59 60 60 60 59 59 58 57 56 55 56 56 56 57 58 58 59 59 59 59 59 59 58 57 58 58 57 57 57 56 56 56 56 55 55 55 56 56 55 56 57 57 57 56 55 55 55 54 54 54 53 53 53 52 53 52 51 50 50 50 49 48 48 49 49 47 46 45 44 44 44 46 47 48 47 46 47 49 50 51 52 52 52 52 51 50 50 49 49 49 48 47 46 45 45 47 49 50 51 50 50 51 50 49 48 50 50 50 51 51 51 51 52 51 50 50 50 52 52 53 54 54 54 54 54 54 54 55 55 55 56 57 57 56 56 56 55 54 53 52 52 51 51 50 50 49 49 49 49 49 49 48 48 48 48 47 46 46 45 44 45 45 45 45 44 43 44 44 45 46 46 46 47 46 45 45 46 46 46 46 45 45 44 43 43 43 43 43 43 43 43 42 43 44 45 46 47 47 46 45 45 45 45 45 46 46 46 45 45 44 44 44 43 42 41 40 41 41 42 42 41 40 38 38 37 37 37 37 35 36 37 37 37 37 37 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 39 41 41 40 41 40 39 38 36 35 37 39 39 39 38 37 36 36 34 34 36 37 37 37 38 38 39 40 39 38 37 37 38 38 39 38 38 39 40 40 40 40 40 40 39 38 38 40 40 40 41 40 40 39 38 37 37 37 38 39 40 40 40 40 41 40 40 40 41 41 41 41 41 41 41 42 41 40 40 39 38 39 41 41 40 40 39 38 37 35 35 36 37 38 39 39 40 41 41 42 43 43 43 43 43 43 43 42 42 41 41 42 42 43 43 43 43 43 43 42 42 41 40 40 40 40 40 41 41 41 42 42 42 42 43 43 43 44 44 44 44 44 43 43 42 42 42 42 42 42 43 43 43 42 42 42 42 42 43 43 42 40 40 41 41 40 40 40 40 39 39 38 37 37 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 35 35 35 35 35 34 34 34 33 32 30 32 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 65 65 65 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 59 59 59 60 60 61 61 60 60 60 60 60 59 59 59 60 60 60 60 59 59 58 57 56 56 57 57 57 57 58 58 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 56 55 56 56 57 56 56 56 57 58 57 55 54 53 53 53 53 52 51 51 51 51 51 51 50 50 49 49 49 48 48 48 49 47 45 44 45 46 47 48 48 49 48 47 47 48 48 50 51 52 51 51 51 50 49 49 50 50 49 46 46 47 46 46 47 47 48 48 48 49 49 48 48 49 49 49 49 50 50 50 51 51 50 50 51 52 53 54 54 53 54 54 55 55 55 54 55 55 56 56 56 56 56 56 55 54 53 52 52 51 50 49 49 49 50 51 50 49 49 49 48 48 47 47 47 47 46 46 47 47 46 46 44 44 44 45 46 46 47 47 48 47 46 45 46 46 46 46 46 46 46 45 44 44 44 44 44 44 44 43 43 44 45 45 46 47 47 45 44 44 43 44 45 45 45 45 45 44 45 45 44 43 42 41 41 41 42 42 40 39 38 38 38 38 38 38 37 36 36 36 35 35 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 38 40 40 39 39 38 38 37 36 37 38 40 39 38 37 36 35 34 34 35 37 38 39 38 38 39 39 40 39 38 37 37 37 38 39 38 37 38 39 39 39 40 40 40 39 38 38 39 40 40 40 39 38 37 37 37 37 38 39 40 40 40 41 41 42 42 42 41 41 40 40 41 40 40 40 42 41 40 40 39 38 40 41 41 40 39 38 37 35 35 35 38 39 40 40 40 41 41 40 41 42 42 42 43 44 44 43 43 42 41 41 42 42 42 43 44 43 43 42 42 42 42 41 40 40 40 40 41 41 41 41 41 41 42 42 42 42 43 43 44 44 43 43 43 42 42 42 41 41 41 42 42 42 42 42 42 42 42 43 43 42 41 40 40 40 40 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 34 34 35 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 33 32 31 30 32 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 60 60 59 60 60 60 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 58 56 57 58 58 58 58 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 56 56 56 56 56 56 57 57 57 57 57 57 58 56 55 54 53 52 52 52 51 50 49 49 48 49 49 48 48 48 48 48 47 46 46 47 47 45 45 46 48 48 48 49 49 49 48 48 48 49 49 50 51 51 50 50 50 50 50 50 49 47 46 48 49 48 46 46 46 46 46 47 48 48 47 47 48 48 48 48 50 49 49 50 50 50 51 51 52 53 53 53 53 54 54 55 56 55 55 55 56 56 56 56 56 56 55 55 54 53 52 52 51 51 51 50 50 51 52 51 49 49 49 48 48 47 48 48 47 47 48 48 47 46 45 45 45 45 45 46 46 47 48 49 48 47 46 46 47 47 47 47 47 47 47 46 45 45 45 45 45 45 44 43 43 44 45 46 46 46 45 44 44 43 44 43 43 43 43 43 44 45 45 43 42 42 42 42 41 41 41 40 40 40 39 40 40 39 38 38 37 36 35 35 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 34 34 35 38 40 38 38 38 37 36 37 39 40 39 38 37 36 35 34 34 35 36 37 38 39 39 39 39 39 39 39 38 37 37 38 39 39 38 38 38 38 38 39 40 40 39 38 37 38 38 40 40 39 38 37 37 37 38 38 39 40 40 40 40 41 41 41 42 43 42 41 40 40 40 40 40 40 41 41 40 39 38 39 40 40 41 41 40 39 36 35 35 36 38 38 38 38 39 39 39 39 40 41 42 42 43 44 44 43 43 42 42 41 41 41 42 43 43 43 42 41 41 41 42 41 40 40 40 40 40 40 40 41 41 41 41 41 41 42 42 43 44 44 44 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 42 43 43 42 41 40 40 40 40 40 40 40 40 39 37 37 37 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 34 34 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 33 32 31 30 31 33 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 64 64 65 65 65 64 64 64 64 64 64 63 63 63 64 64 63 63 63 63 63 63 62 62 61 61 61 61 60 60 60 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 58 57 57 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 56 56 57 57 57 57 58 57 57 57 56 56 56 55 54 53 52 51 51 50 50 49 48 48 48 47 47 47 48 48 47 47 46 45 45 45 45 47 47 47 47 47 48 49 49 49 49 49 49 50 50 50 50 50 50 50 51 51 50 48 46 47 49 50 49 49 48 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 50 50 51 51 52 52 52 53 53 53 53 54 54 55 55 56 56 56 56 56 56 56 55 55 55 55 54 53 52 52 52 52 51 51 52 52 51 50 49 49 49 48 48 49 49 48 48 49 48 47 45 45 46 46 46 45 45 46 47 48 48 48 48 47 47 46 46 47 47 47 47 47 47 47 47 47 46 46 46 45 44 44 44 45 46 46 46 46 46 45 45 45 44 43 43 42 42 43 44 45 44 43 42 42 41 41 41 41 40 41 41 40 40 40 39 38 37 36 35 36 37 36 36 36 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 34 34 36 39 40 39 38 38 37 36 37 40 39 38 36 35 35 34 34 35 36 37 38 38 39 39 40 39 38 38 38 38 37 38 39 39 39 38 38 38 38 39 40 40 40 39 37 37 38 39 39 39 39 38 37 37 38 39 39 40 40 40 40 40 41 41 41 42 43 42 41 41 40 39 39 39 40 40 40 40 39 38 39 40 40 40 41 40 38 36 34 35 36 36 37 37 38 39 39 39 39 40 41 42 43 43 43 44 43 43 44 43 42 41 41 42 43 43 43 42 41 41 41 41 40 40 40 41 41 41 41 41 42 42 42 42 41 42 42 42 43 43 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 42 43 43 42 41 40 40 40 40 39 39 39 39 38 37 37 38 38 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 33 32 30 30 31 32 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 64 64 65 65 65 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 61 61 61 61 61 60 60 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 55 54 54 54 53 52 51 50 49 49 50 50 50 50 49 49 48 48 48 48 47 48 48 47 45 44 46 48 48 47 47 47 47 48 49 49 49 49 49 50 50 50 50 50 50 50 51 51 50 48 47 48 50 51 51 51 49 47 48 49 49 48 48 49 50 50 50 50 50 50 50 50 50 51 52 52 51 52 52 53 54 54 54 54 54 54 55 56 56 56 55 55 56 56 55 54 54 55 54 54 53 53 53 53 52 52 52 52 52 51 51 50 50 50 50 49 49 49 49 49 48 46 45 46 47 47 46 46 47 47 47 47 48 49 48 48 47 46 46 46 47 47 47 47 46 47 48 48 47 46 46 45 44 44 45 45 46 46 46 47 47 46 46 46 46 45 43 42 42 42 43 44 44 44 42 41 41 40 41 41 41 41 40 40 40 39 38 37 36 36 36 38 38 37 37 38 37 36 35 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 34 34 36 39 40 39 38 37 37 36 37 39 38 37 35 34 34 34 35 35 35 37 38 39 40 40 40 40 38 38 38 37 37 38 39 39 39 38 37 38 38 40 41 41 40 39 37 37 39 40 40 39 38 38 37 37 38 39 40 40 40 39 40 41 41 42 42 43 43 42 41 41 40 40 39 38 38 39 39 39 38 38 39 40 40 39 40 39 37 35 34 35 37 37 38 38 39 40 41 41 40 40 40 41 41 42 42 43 43 44 44 43 42 41 41 42 43 43 43 42 42 41 41 40 40 39 40 41 41 41 41 42 42 43 43 43 43 42 43 43 43 44 44 43 43 43 43 43 42 41 41 41 41 41 40 40 40 41 41 42 43 43 43 42 41 40 40 40 39 38 38 38 37 37 38 38 38 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 37 37 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 33 33 32 31 31 31 31 32 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 63 64 64 65 65 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 54 53 52 52 51 50 50 49 50 50 50 50 50 49 49 49 49 49 49 48 49 49 47 45 45 47 48 49 48 47 48 48 48 49 49 49 49 50 50 50 50 49 49 50 50 50 50 50 48 47 48 50 51 52 51 49 48 49 50 50 50 49 49 50 51 51 51 51 51 50 50 51 51 52 52 52 52 53 54 55 55 55 55 54 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 54 54 54 53 52 52 52 52 52 52 51 51 51 51 49 49 48 48 48 48 47 46 46 47 48 48 47 47 48 48 47 47 47 48 48 48 48 47 46 46 46 46 46 46 46 46 46 47 48 47 46 45 44 44 45 45 46 47 47 47 46 46 46 46 46 45 44 44 43 42 42 43 44 43 42 40 40 40 39 39 39 39 39 38 37 37 37 36 36 37 38 39 38 37 38 38 38 38 38 36 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 34 34 35 39 40 39 38 37 35 35 37 38 37 36 34 34 35 36 37 37 36 38 39 40 40 41 41 40 39 37 37 36 37 38 39 39 39 37 37 38 38 40 41 41 40 39 37 37 39 40 40 39 37 36 37 38 39 40 40 39 38 39 41 42 42 42 42 43 43 43 42 41 41 41 40 40 38 38 39 38 37 39 40 40 40 39 38 37 35 35 35 36 37 38 38 38 38 39 40 41 41 41 41 41 40 41 42 43 43 43 43 43 42 41 42 42 42 43 43 43 42 41 41 40 39 39 40 41 41 40 41 41 42 42 42 42 43 43 44 44 44 43 43 44 44 43 43 43 42 41 41 41 41 41 40 40 40 41 41 42 42 42 43 42 41 40 40 40 39 39 39 39 38 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 35 35 35 35 35 35 35 36 35 35 34 34 34 34 34 34 33 33 33 33 32 32 32 32 32 31 31 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 63 63 63 63 64 64 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 62 62 62 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 58 58 58 57 57 56 56 56 55 55 54 53 52 51 51 51 50 50 50 51 51 51 51 50 49 49 50 50 49 49 49 49 48 45 45 46 48 49 49 48 47 47 48 48 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 48 48 48 49 50 51 51 50 49 50 51 51 50 49 50 50 50 51 51 52 52 51 51 51 52 52 53 53 53 54 54 55 55 55 55 55 55 55 55 55 54 54 55 55 55 55 55 54 54 54 55 55 55 54 53 52 52 51 51 51 50 50 50 50 49 48 48 48 48 48 47 47 46 47 47 49 50 49 49 49 49 48 47 47 47 48 48 48 48 47 46 46 46 46 46 46 46 46 46 47 47 47 47 46 45 45 45 46 47 47 47 46 46 45 46 46 45 45 46 45 42 41 42 42 41 41 40 40 39 38 38 38 38 37 37 37 36 36 36 38 39 39 39 38 38 38 39 39 39 38 37 35 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 36 39 39 39 38 36 34 35 37 37 36 34 33 35 36 38 39 39 39 39 40 40 41 41 40 40 39 37 36 37 37 38 39 39 39 37 37 38 39 40 40 40 39 38 37 37 39 40 39 38 36 36 37 39 40 39 39 38 39 40 41 42 41 42 42 42 43 43 43 42 42 41 41 40 39 38 38 37 37 39 39 39 39 38 37 36 35 36 37 37 37 37 38 38 38 39 40 40 40 41 41 42 42 41 42 43 43 43 43 43 42 42 42 43 43 42 42 42 42 42 41 40 39 38 39 40 40 40 40 40 41 41 41 41 42 43 43 43 42 42 43 44 44 44 43 43 43 42 41 41 40 40 40 40 41 41 41 41 41 42 42 42 41 40 40 40 40 40 40 40 39 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 33 33 33 34 32 31 32 32 31 31 32 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 64 63 63 63 63 63 64 64 63 63 63 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 57 58 58 58 57 57 56 56 55 55 54 53 52 52 52 52 52 51 51 51 51 52 52 51 51 50 50 51 51 50 49 49 48 47 45 46 47 48 50 49 48 48 48 48 49 49 49 49 49 50 50 49 49 49 49 49 49 49 48 48 48 49 49 50 51 51 51 50 50 51 52 52 51 51 51 51 50 50 51 52 53 52 52 52 52 53 53 53 54 54 55 55 55 56 56 56 55 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 54 53 52 52 52 51 50 49 48 48 48 49 49 49 50 50 48 47 47 47 48 50 51 51 50 49 49 48 48 48 47 47 47 48 48 48 47 47 46 46 45 45 46 45 46 46 47 47 47 47 46 46 45 46 47 47 47 47 46 45 45 46 46 46 46 45 43 43 43 40 40 39 39 39 38 39 39 39 39 39 39 39 39 38 38 39 40 40 40 39 38 38 39 39 39 38 38 37 35 35 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 38 38 39 38 36 34 35 36 35 34 33 34 35 37 39 40 40 40 41 41 41 41 41 40 40 38 36 36 37 38 38 39 38 38 36 36 38 40 40 41 40 38 38 37 36 38 38 37 36 36 37 38 38 39 39 39 39 40 41 41 41 41 41 42 42 42 42 42 42 42 41 41 40 40 39 37 37 37 38 38 38 38 37 36 35 36 37 38 39 39 39 39 40 40 40 41 41 41 42 42 42 43 42 41 42 43 44 44 43 42 42 42 43 43 42 42 41 41 42 41 41 40 39 38 38 39 39 39 39 40 40 40 41 41 41 41 42 41 41 42 43 43 43 43 43 43 42 41 41 40 40 40 40 40 41 41 41 41 42 42 42 41 40 40 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 35 35 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 33 31 30 31 31 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 58 58 57 57 56 55 55 54 53 53 52 53 53 53 52 52 52 52 52 53 53 52 51 51 50 51 51 49 49 49 47 46 46 46 48 49 50 50 49 49 49 49 49 50 50 49 49 50 50 49 49 49 49 49 49 49 48 48 49 49 50 50 51 52 51 51 50 51 52 53 52 52 52 52 52 51 51 52 53 53 53 54 53 54 54 54 54 54 55 55 55 55 55 56 56 55 54 54 54 53 53 54 54 54 54 54 54 54 54 55 55 55 54 53 53 52 53 52 51 50 49 50 50 50 49 49 50 49 48 47 48 48 48 49 51 51 50 49 49 49 48 48 47 46 47 47 47 47 48 48 47 46 46 45 45 45 45 45 46 46 45 45 46 46 47 47 48 48 47 47 46 46 45 45 46 47 47 45 44 44 44 41 40 39 39 38 38 41 42 41 41 41 41 41 40 38 38 40 40 41 41 40 39 38 39 38 38 38 39 39 38 37 36 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 36 37 37 37 36 34 34 35 35 33 33 36 37 38 39 39 39 40 41 41 41 40 39 39 39 37 36 36 37 38 39 39 38 36 36 37 38 39 40 40 40 39 38 37 36 37 37 35 35 36 37 37 38 38 39 41 40 41 42 41 41 41 41 41 41 41 42 43 43 43 42 41 41 40 40 39 38 36 36 37 37 37 36 35 35 36 38 39 40 41 41 40 41 41 41 42 42 42 43 43 43 43 43 42 42 42 43 44 43 43 43 43 43 43 43 42 41 40 41 41 41 41 40 39 38 39 40 40 39 39 39 40 40 40 40 41 41 41 41 42 43 43 43 43 43 43 42 41 41 41 40 40 40 40 40 41 41 42 42 43 42 41 41 41 40 40 40 40 39 38 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 36 36 35 35 35 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 33 31 31 32 32 31 30 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 58 57 57 57 56 55 55 53 53 53 53 53 54 54 54 53 52 52 53 54 54 52 52 51 51 51 51 50 49 49 47 46 46 46 48 49 51 51 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 48 49 49 49 50 50 51 52 52 51 51 52 52 53 53 53 53 53 53 53 52 53 53 54 54 54 54 54 54 53 53 54 54 54 54 54 55 55 55 54 54 54 53 53 53 53 54 54 54 54 54 55 55 55 55 54 54 54 54 53 52 52 51 50 51 51 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 49 49 49 49 47 46 46 46 46 47 47 47 47 47 48 47 46 45 45 45 45 45 45 45 45 46 47 47 48 47 47 47 47 46 45 44 45 46 47 46 45 45 43 42 41 41 41 39 39 42 43 42 42 42 42 41 40 39 39 40 41 41 41 40 39 39 39 38 37 37 38 39 38 39 40 38 36 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 35 35 34 33 34 34 33 34 35 37 37 37 37 38 39 41 40 39 39 39 38 38 36 36 37 38 39 39 38 37 35 36 37 37 38 39 39 39 39 38 36 35 36 35 35 36 37 37 38 39 40 40 41 42 42 42 40 40 40 40 41 42 42 42 43 43 43 43 42 41 41 41 41 40 38 36 35 36 36 35 35 35 36 38 40 40 41 42 41 42 42 42 42 42 43 43 44 44 44 44 43 43 42 43 44 43 43 43 43 43 43 43 42 41 40 40 40 41 41 40 39 38 39 40 40 40 40 39 39 40 40 40 41 41 41 42 43 43 43 43 44 43 43 42 41 41 41 41 41 40 40 40 41 41 42 42 43 42 42 42 41 40 40 40 40 40 39 38 37 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 36 35 36 36 36 36 36 36 36 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 32 32 34 34 33 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 56 56 56 55 54 53 53 53 53 53 54 55 55 53 53 53 53 54 54 53 52 52 51 51 51 50 49 49 48 46 46 46 48 49 50 51 50 50 50 50 51 51 51 51 51 50 50 51 51 50 50 50 49 49 48 48 48 49 49 49 50 51 51 52 52 52 52 52 53 54 54 54 54 55 54 53 53 53 53 54 54 54 54 54 53 53 54 54 54 54 54 55 55 54 54 54 54 53 53 53 53 53 54 54 54 55 56 55 55 56 55 55 55 54 54 53 52 51 51 51 51 51 51 50 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 48 47 46 46 46 46 46 46 47 48 48 48 47 47 46 45 45 45 45 45 45 45 46 47 47 47 47 47 47 46 45 44 44 45 46 45 45 45 44 44 42 42 41 39 39 42 44 44 43 43 42 42 41 41 41 41 42 42 42 42 41 40 40 39 38 37 36 37 37 38 39 39 39 38 36 35 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 35 36 36 37 37 38 39 40 40 39 38 38 38 37 35 35 37 38 39 38 37 36 35 36 37 37 38 38 38 38 38 38 36 35 35 35 35 36 38 39 39 39 39 41 42 42 41 40 39 40 41 41 41 42 43 43 42 42 42 43 43 41 40 41 41 41 40 38 36 35 35 35 36 36 38 38 39 39 40 41 41 41 41 41 41 41 42 43 43 43 44 44 44 43 43 43 44 44 44 44 43 43 43 43 42 41 41 40 39 40 40 40 39 38 39 40 40 41 41 41 41 41 41 42 43 42 43 43 43 44 44 44 44 43 43 43 42 41 41 41 41 41 40 40 40 41 42 42 43 43 42 42 41 40 40 40 40 40 40 39 38 38 37 37 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 35 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 34 33 34 34 34 34 33 33 32 33 34 34 34 33 31 31 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 59 59 58 58 57 57 56 56 55 55 54 54 55 54 54 54 55 55 54 53 53 54 55 55 53 52 52 52 51 51 50 49 49 48 46 47 48 48 48 49 51 51 51 51 51 51 52 52 51 51 51 51 51 51 50 50 50 49 49 48 48 48 49 50 49 49 50 50 51 52 52 52 53 53 54 54 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 54 54 55 54 53 53 53 53 53 52 53 54 54 55 55 55 56 56 56 56 56 56 55 55 54 53 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 51 51 50 49 49 49 49 49 48 47 46 45 45 46 46 47 48 48 48 48 47 45 45 45 45 45 45 45 45 46 47 47 47 48 48 47 46 45 44 44 45 45 45 46 45 45 44 42 41 39 40 41 43 44 44 44 43 43 43 43 43 44 43 42 41 41 41 40 39 39 39 38 36 35 36 36 36 37 38 39 39 37 35 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 36 36 37 37 38 38 39 39 39 38 37 37 38 37 36 35 37 38 37 37 37 36 35 36 37 38 38 39 39 39 39 39 37 36 35 35 35 36 38 39 40 40 40 41 42 42 40 39 39 41 42 42 41 41 42 43 41 40 41 42 42 42 40 40 39 40 40 39 37 35 34 35 36 37 38 38 37 38 39 39 39 39 40 40 40 41 41 42 42 42 43 43 44 44 44 43 43 43 43 43 42 42 42 42 42 41 41 41 40 39 38 39 38 38 39 40 41 41 41 41 42 42 42 42 43 42 42 43 44 44 43 44 44 44 43 43 43 42 41 41 41 41 40 40 40 41 42 42 42 42 42 42 41 41 41 41 40 40 40 40 40 40 38 37 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 33 33 34 33 33 33 33 33 34 34 34 34 33 31 31 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 65 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 56 56 56 55 55 56 55 55 54 55 56 55 54 54 54 55 55 54 53 52 52 52 52 51 51 50 48 46 47 49 49 48 49 51 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 49 49 49 48 48 49 49 50 50 50 50 50 51 52 52 53 54 54 54 55 54 54 55 55 55 55 54 54 54 53 53 54 53 52 52 53 53 53 53 54 54 54 53 52 52 53 53 52 53 54 54 54 55 55 56 56 57 57 56 56 56 55 55 54 53 52 53 53 53 53 53 53 52 52 52 52 52 51 50 49 49 50 51 50 50 49 49 48 49 49 49 48 48 46 45 45 45 46 47 48 48 48 47 46 45 45 45 45 45 45 45 46 46 46 47 48 47 47 47 46 45 44 44 44 44 45 45 45 44 42 40 40 41 42 42 43 44 44 43 43 42 42 42 44 44 43 41 39 39 40 39 38 38 37 36 36 36 36 35 35 36 38 38 38 36 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 36 37 37 37 37 37 38 39 38 38 37 36 38 38 36 35 36 37 37 37 37 36 35 36 38 39 39 39 40 40 39 38 37 36 35 35 36 37 38 40 41 42 42 41 41 41 39 39 40 41 41 41 42 42 42 42 41 39 40 41 40 40 40 40 39 39 40 39 37 35 34 34 35 36 36 36 36 37 37 37 38 38 38 39 39 40 41 41 41 41 42 42 43 43 44 43 43 42 41 42 41 40 40 41 42 41 41 41 40 39 38 38 38 39 39 40 41 41 40 40 41 42 42 41 41 41 42 42 42 43 42 43 44 44 43 43 43 42 42 41 41 41 40 40 40 41 42 41 41 42 42 42 41 41 41 40 40 40 40 40 40 40 38 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 33 33 33 33 34 34 34 34 34 34 34 33 31 30 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 65 65 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 56 56 56 56 57 56 55 55 55 56 56 55 55 55 55 55 54 53 53 53 52 52 51 51 50 48 47 47 50 50 49 48 50 51 52 53 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 48 48 49 50 50 50 50 50 51 51 52 53 54 54 54 54 54 54 54 55 55 55 54 53 54 53 53 53 52 52 52 53 53 53 54 54 54 54 53 53 52 52 52 52 53 53 54 54 54 54 55 55 56 57 57 57 57 56 55 54 54 54 54 54 53 54 54 53 52 52 52 52 52 52 51 50 49 49 50 50 50 50 49 48 48 48 49 49 48 47 47 46 45 45 46 47 47 48 48 47 46 45 45 45 45 45 45 45 45 45 47 47 47 46 46 46 46 45 44 43 42 42 43 43 42 41 40 41 42 43 43 44 44 43 43 42 41 41 41 41 43 43 42 40 39 39 39 38 37 36 36 37 38 38 37 35 35 38 38 37 36 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 33 35 36 37 37 37 36 37 37 38 37 37 36 37 38 36 35 36 37 38 37 37 36 35 36 37 39 40 40 40 41 40 38 36 35 35 36 37 38 39 41 42 42 42 40 39 39 39 40 40 41 41 41 42 42 41 41 41 39 39 40 40 38 39 40 38 38 38 37 35 34 34 35 35 36 36 37 38 38 38 38 38 38 39 39 39 39 40 40 40 42 42 42 42 43 43 43 42 41 40 41 41 40 40 42 42 41 40 40 39 40 39 38 38 39 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 43 44 44 43 42 42 42 42 41 41 41 40 40 40 40 40 40 41 41 42 42 42 41 41 40 40 41 40 40 40 40 39 37 37 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 31 32 31 31 31 32 33 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 65 65 65 64 64 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 56 55 55 56 56 56 56 56 55 55 55 54 53 53 53 52 52 52 51 50 48 48 49 51 51 50 49 50 50 51 52 52 52 53 53 53 52 52 52 52 51 51 51 51 51 50 50 49 49 48 49 50 50 50 50 51 51 51 52 53 54 54 53 53 53 54 54 54 54 54 53 53 53 53 52 52 52 52 53 54 54 54 54 55 54 53 53 53 53 52 52 52 52 53 53 53 53 54 54 55 55 56 56 57 57 56 55 55 55 54 54 53 53 53 53 53 52 52 51 51 51 51 51 50 49 48 48 49 49 50 49 49 48 48 48 49 48 48 48 47 46 45 45 46 46 47 49 48 47 46 45 45 45 45 45 45 45 45 46 48 48 47 46 46 45 45 46 45 44 43 42 42 41 40 40 41 42 43 44 45 44 43 42 41 41 42 42 40 40 41 41 41 40 39 38 37 36 36 37 39 40 39 38 36 35 36 36 36 35 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 34 35 37 37 36 36 36 36 37 37 37 36 36 37 35 35 36 37 37 38 37 36 35 37 38 39 40 40 40 40 40 38 36 35 35 36 37 39 40 41 41 40 39 38 39 39 39 40 40 40 41 41 42 42 41 41 41 40 38 38 40 39 38 38 38 36 36 35 34 34 34 36 37 38 38 38 39 40 40 40 40 40 41 41 41 41 40 40 41 42 42 43 43 42 42 43 42 41 40 40 40 40 41 42 42 40 40 39 39 39 39 38 38 40 40 40 40 40 40 40 41 40 41 42 41 42 42 43 43 43 43 43 44 44 43 43 42 42 42 41 41 41 40 40 39 39 40 40 41 41 42 42 42 41 41 40 40 40 40 40 40 40 39 37 37 38 39 38 38 37 37 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 31 30 32 34 34 33 33 34 34 34 34 34 34 34 34 33 33 33 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 56 57 57 56 56 56 55 54 53 53 52 52 51 51 52 51 49 48 48 48 50 52 52 51 51 51 51 51 51 51 52 53 53 53 53 52 53 52 52 52 52 52 51 51 51 50 49 49 49 49 50 50 51 51 51 52 52 53 54 54 53 53 53 53 54 54 54 54 53 52 52 52 52 51 52 52 53 54 54 54 54 54 54 53 52 52 52 52 52 52 52 52 53 53 53 54 54 55 55 55 56 57 57 56 56 55 55 55 54 54 53 52 52 52 52 52 52 51 51 51 51 50 50 49 49 48 48 48 49 49 48 48 48 48 48 47 47 47 46 45 45 45 45 46 47 48 48 47 45 45 45 45 45 44 44 45 46 48 48 48 47 46 45 45 45 44 44 44 43 41 41 41 42 42 44 45 45 44 43 43 42 42 43 43 42 40 39 39 39 39 39 39 39 37 36 37 39 41 41 40 39 37 37 35 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 33 34 36 37 37 36 36 36 35 36 37 36 35 36 35 35 35 36 37 38 37 36 35 37 38 38 39 39 39 39 39 38 36 34 35 37 38 38 40 40 40 39 38 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 39 38 38 39 38 37 36 35 34 34 34 34 34 36 38 40 39 39 40 40 41 41 42 41 41 42 42 42 41 41 42 42 42 43 43 42 41 42 42 41 40 39 39 40 41 42 42 41 40 40 40 40 39 38 38 39 39 39 39 39 39 39 40 40 41 41 41 42 42 42 43 43 43 44 44 44 44 43 43 43 43 42 41 41 40 40 40 40 39 40 41 41 42 42 42 41 41 40 40 40 40 40 40 40 38 37 37 38 38 38 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 32 31 32 34 34 32 32 33 33 34 34 34 34 34 34 34 33 33 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 56 56 56 56 56 55 55 54 54 53 53 52 51 50 49 49 49 49 49 49 49 50 52 52 52 52 52 52 52 52 51 52 53 53 53 53 53 53 52 52 52 52 52 51 51 51 51 50 49 49 49 50 50 51 51 52 52 52 53 54 54 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 53 53 53 54 54 53 52 52 52 52 52 52 53 53 53 53 53 54 54 54 54 54 54 54 55 55 56 56 56 55 54 54 54 54 53 52 52 51 52 52 52 52 51 51 51 51 51 51 50 49 48 47 47 48 48 48 48 47 47 47 46 46 46 45 45 45 45 45 45 47 47 47 46 45 45 45 45 44 44 44 45 46 47 47 47 47 46 45 44 43 43 43 42 41 42 43 43 44 45 46 45 44 43 44 44 43 43 43 42 42 41 41 40 39 39 38 38 36 37 39 40 41 40 39 38 38 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 32 32 32 33 33 35 37 37 36 35 35 35 36 37 36 35 35 35 35 36 36 37 37 37 36 34 35 36 36 37 38 38 40 40 39 37 35 35 36 37 38 39 39 39 37 38 40 41 41 41 42 42 41 41 41 40 40 40 40 41 40 40 39 38 38 37 35 34 34 34 35 36 36 37 38 40 41 40 40 41 41 40 42 43 43 42 43 43 43 43 43 43 43 43 43 42 41 40 41 41 40 39 39 40 40 41 42 42 41 40 40 40 40 39 38 38 38 38 38 39 39 39 40 40 40 40 40 41 42 41 41 42 42 43 44 43 43 43 44 44 44 43 43 42 42 42 41 41 40 39 39 40 41 42 43 42 41 41 40 39 39 40 40 40 40 39 38 37 37 38 37 37 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 32 30 31 32 31 30 31 32 31 32 34 34 34 34 34 33 33 34 67 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 61 60 61 61 60 60 60 61 60 60 59 59 59 59 59 58 58 58 57 57 56 55 55 56 55 55 55 54 53 53 53 52 51 51 49 49 49 50 50 50 50 51 51 52 53 52 52 52 53 53 53 52 52 53 53 53 54 54 53 53 53 52 52 52 51 51 51 51 50 49 49 49 50 50 51 51 51 52 52 53 53 54 53 53 53 53 52 52 52 52 52 52 52 51 51 51 52 52 52 53 54 54 54 53 53 52 52 52 52 52 53 53 54 54 54 54 54 54 55 54 54 55 54 55 56 56 55 55 54 54 54 54 53 52 52 51 51 52 52 51 51 51 51 51 50 50 50 49 48 48 47 47 47 47 47 46 46 47 46 46 46 46 46 46 45 45 45 45 46 46 47 46 45 45 44 44 44 44 45 45 46 46 47 47 46 45 45 45 45 43 42 43 45 45 44 45 46 46 45 44 44 44 43 43 42 41 41 41 41 41 41 39 39 38 38 37 37 39 40 40 40 39 39 39 38 36 37 36 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 32 32 33 33 34 37 37 36 35 35 35 36 37 37 35 35 35 35 36 37 37 37 36 35 35 36 36 37 38 39 39 40 41 39 37 36 34 35 36 38 39 38 38 37 38 39 40 41 42 41 41 41 41 41 40 40 40 40 40 40 40 39 38 37 35 34 34 35 36 37 39 39 40 40 39 39 39 39 39 39 39 41 42 42 42 42 42 43 43 43 44 44 43 42 42 41 40 40 40 39 39 39 41 41 41 42 41 41 40 40 39 39 38 38 39 39 39 39 39 40 41 41 41 42 42 42 42 43 42 42 42 42 43 43 43 42 42 43 44 43 43 42 42 42 42 41 41 40 39 39 40 41 42 42 41 41 41 40 39 39 40 40 40 40 40 40 39 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 32 31 31 31 31 31 31 30 30 33 34 34 34 34 33 33 34 68 67 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 61 61 61 61 61 61 61 61 61 60 59 59 59 59 58 58 58 57 57 57 56 55 55 54 54 54 54 54 54 52 51 51 51 51 50 50 51 52 52 51 50 52 52 52 53 53 52 52 53 53 53 53 53 53 53 53 54 54 54 53 53 53 53 52 51 51 51 50 50 49 49 49 50 50 51 51 51 51 52 53 53 54 54 54 54 53 52 52 52 52 52 52 52 52 51 51 52 52 53 53 54 54 54 53 53 52 52 52 52 53 53 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 52 51 51 51 52 51 51 51 51 50 49 49 49 48 48 48 47 47 47 46 46 46 46 46 46 46 46 47 47 47 47 46 46 45 45 45 45 46 46 45 44 44 44 45 45 45 45 45 47 47 46 46 46 46 46 44 43 44 45 45 45 46 46 46 46 45 44 44 43 44 43 42 41 40 40 40 40 39 40 40 40 38 37 39 41 41 41 41 40 40 39 37 37 35 34 34 34 33 33 33 33 34 34 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 34 36 37 35 33 33 34 34 35 36 35 35 35 34 35 35 36 37 35 35 36 36 37 38 39 39 39 39 39 38 37 36 35 34 36 38 38 37 37 37 38 39 40 41 41 40 41 41 41 40 40 40 40 41 41 40 40 39 38 36 34 34 34 36 37 38 39 39 39 38 38 38 38 38 39 39 40 40 41 41 41 42 42 43 43 43 43 42 41 40 41 41 40 40 39 39 39 40 41 41 40 41 41 40 40 39 38 38 38 38 39 39 39 40 40 40 41 42 42 43 43 43 42 42 42 43 43 42 42 42 42 42 43 43 44 44 43 43 42 42 42 41 40 39 39 39 40 41 42 42 41 40 41 40 40 40 40 40 40 40 40 40 39 38 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 31 31 31 31 33 34 34 34 34 34 34 33 67 67 66 66 66 66 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 61 61 61 60 60 60 61 61 61 59 59 59 59 58 58 58 57 56 56 55 55 55 54 53 53 53 53 53 52 51 51 52 52 52 52 52 52 52 52 51 51 52 52 52 53 53 53 53 54 54 54 54 54 53 53 54 54 55 54 54 54 53 52 51 51 51 51 50 50 49 50 50 50 51 51 51 51 52 53 54 54 54 54 54 53 53 53 53 52 52 52 52 52 51 51 52 52 53 54 53 53 53 53 52 51 51 52 53 53 53 53 53 53 54 54 54 54 55 55 55 55 54 54 54 55 54 53 53 53 52 52 53 53 52 52 51 51 51 51 51 50 49 49 48 48 48 48 48 48 47 47 48 48 48 47 47 47 47 47 47 48 48 48 47 47 46 46 45 44 44 45 46 46 45 44 44 45 45 45 45 45 45 46 46 47 47 46 45 45 44 43 44 44 45 46 47 47 47 46 45 44 44 44 43 42 42 41 40 40 40 41 42 40 39 38 37 39 41 42 42 41 41 40 39 38 37 34 34 34 34 33 33 33 33 33 34 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 33 35 36 35 34 33 33 33 33 33 34 34 34 34 34 34 35 34 34 34 35 35 36 37 38 39 40 39 40 40 38 37 37 35 34 35 38 38 37 36 37 38 40 41 41 40 40 41 42 41 40 40 39 40 41 42 41 39 38 38 36 34 33 35 37 38 39 39 37 37 37 38 40 40 40 41 41 41 40 41 41 42 43 44 44 44 43 43 42 41 41 41 40 40 39 38 39 39 39 39 40 41 41 41 40 40 39 38 37 37 38 40 40 40 40 41 41 41 42 43 43 43 43 42 41 41 42 42 41 41 42 43 43 44 44 44 44 43 43 43 42 42 42 41 40 39 40 41 41 42 43 42 41 41 41 40 39 40 40 40 40 40 39 39 38 37 36 37 37 37 37 37 37 37 37 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 33 31 32 31 31 33 34 34 34 34 34 34 33 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 59 59 58 58 58 57 57 56 56 56 56 55 55 55 54 54 54 53 53 52 52 52 52 53 53 53 53 53 53 53 51 51 52 52 52 53 53 53 54 54 55 55 55 54 54 54 54 55 55 55 55 55 53 52 52 51 51 52 51 51 50 50 50 51 51 51 51 52 52 53 54 53 53 53 53 53 53 53 53 52 52 52 52 52 51 51 51 52 53 53 53 53 53 53 52 51 51 52 53 53 53 53 53 53 54 54 54 54 55 55 55 55 54 54 54 54 54 54 54 53 52 52 52 52 52 52 51 51 50 50 50 49 49 48 48 49 48 48 48 48 48 49 49 49 49 48 48 49 48 47 47 48 48 47 47 46 46 46 45 44 44 44 44 45 46 44 44 44 45 45 45 44 44 45 46 47 47 46 45 45 44 43 44 44 45 46 46 48 48 47 47 46 44 43 44 43 42 42 42 42 42 42 41 39 38 38 38 39 40 41 41 41 40 39 39 38 36 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 33 33 33 33 33 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 35 36 37 38 39 39 40 40 40 40 39 37 37 36 34 35 36 38 37 36 37 38 40 41 41 40 40 41 41 40 40 39 38 40 41 41 41 39 38 37 35 33 34 36 37 38 39 38 37 38 39 41 42 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 44 43 42 41 40 39 38 37 38 39 39 40 41 41 41 41 40 39 39 38 37 38 39 40 40 39 40 40 41 41 42 42 43 42 42 41 41 41 42 41 41 41 43 43 43 44 44 44 44 43 43 42 42 41 41 41 40 40 40 40 41 42 42 43 41 41 41 40 39 40 40 40 40 40 39 39 38 37 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 31 30 32 34 34 34 34 34 34 34 67 67 66 66 66 66 67 66 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 59 58 58 58 57 56 56 56 56 56 56 56 56 55 55 55 54 53 53 53 53 53 54 54 54 54 54 54 53 52 51 52 53 53 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 54 54 53 52 51 52 52 52 51 51 50 50 51 51 51 52 52 53 54 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 52 52 53 52 52 51 51 51 53 53 53 53 52 52 53 54 54 54 55 55 55 55 55 54 53 53 54 54 54 54 54 52 51 52 52 51 51 51 51 49 49 49 49 49 49 50 50 49 49 49 49 49 50 49 49 49 48 48 48 48 48 48 47 47 46 46 46 45 46 45 45 45 45 44 44 45 45 44 44 44 45 45 44 44 45 46 46 46 46 46 45 44 44 44 44 45 46 46 47 47 46 47 46 45 44 44 44 43 43 43 43 43 42 40 39 38 38 40 41 41 40 41 41 40 39 38 36 35 35 35 35 34 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 35 35 36 37 37 37 38 38 39 39 40 40 39 38 37 35 34 34 35 36 36 36 36 38 39 39 39 39 41 42 41 40 39 38 38 40 40 40 40 40 38 36 34 33 35 36 36 36 36 36 37 39 40 41 41 41 42 42 43 43 43 44 44 44 44 43 43 44 45 45 44 43 42 41 41 39 38 37 38 40 41 41 41 42 42 41 40 39 38 38 37 38 39 39 39 40 40 40 41 41 42 42 42 42 41 41 40 41 41 41 41 41 42 42 42 43 44 44 44 43 43 42 41 41 40 40 40 39 40 40 41 42 42 42 41 40 41 41 39 39 40 41 40 40 40 40 39 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 33 33 33 32 30 32 34 33 33 34 34 34 34 68 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 60 59 58 58 58 57 57 57 57 57 57 57 57 56 56 54 54 54 54 54 54 54 54 55 55 55 54 54 54 53 53 52 53 54 54 54 55 55 55 55 55 55 56 55 55 55 55 55 55 55 55 54 54 54 54 53 52 52 52 52 52 52 50 50 51 51 51 51 52 53 54 53 52 52 52 51 51 51 51 51 51 51 51 51 50 50 51 50 50 51 52 52 52 52 51 51 52 53 53 53 52 52 52 53 53 54 54 55 55 55 55 54 54 53 53 54 53 53 53 54 53 52 51 51 50 50 50 50 50 49 49 50 50 51 51 51 50 50 50 50 50 50 49 49 49 48 47 47 47 48 48 47 46 46 46 46 46 46 46 46 46 45 44 44 44 44 44 43 44 44 44 44 44 44 45 46 46 46 46 45 45 45 45 45 45 46 47 47 47 46 46 46 46 45 44 44 43 42 42 42 42 41 40 39 38 39 41 41 41 41 40 39 39 39 37 36 35 35 37 37 36 34 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 35 35 34 35 36 35 35 37 37 38 38 39 39 39 38 37 35 34 34 35 36 37 36 36 38 39 39 39 39 41 41 41 40 39 37 38 40 40 40 39 39 37 35 34 33 34 35 35 36 36 37 37 37 38 38 39 39 40 41 42 43 43 44 45 45 44 44 44 44 44 44 44 43 42 41 41 40 38 37 38 39 40 40 41 42 42 42 41 40 39 38 37 37 38 39 40 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 42 43 43 44 44 44 43 43 42 41 41 40 40 39 39 40 40 41 42 43 42 40 40 41 41 39 39 40 41 40 40 40 40 38 37 37 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 31 31 30 31 33 33 33 34 34 33 33 67 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 59 59 59 59 59 59 59 59 59 59 59 59 60 59 59 59 58 58 58 58 58 58 58 58 57 56 56 55 54 55 55 55 55 55 55 55 55 55 55 55 54 53 54 53 53 54 54 54 55 55 55 55 55 56 56 56 56 55 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 52 52 52 52 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 51 50 50 51 51 51 52 52 51 51 51 52 53 53 52 52 52 53 53 53 53 54 55 55 55 54 54 53 53 54 53 53 53 53 52 51 51 50 50 50 50 50 50 50 50 50 51 52 52 52 51 51 50 50 50 49 49 48 48 48 48 48 47 47 47 46 47 47 47 46 47 46 46 46 46 46 45 45 44 44 44 43 43 43 43 43 43 44 45 46 45 45 45 45 45 46 46 46 46 46 48 48 47 46 46 46 46 46 46 45 44 43 42 42 41 40 40 39 38 39 41 41 40 40 38 38 37 37 36 37 37 37 38 38 37 36 34 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 33 34 34 35 35 35 36 37 38 39 39 38 37 37 35 34 34 35 37 37 36 35 37 38 38 39 40 40 40 41 40 39 37 38 39 39 40 38 37 36 34 34 34 36 37 37 38 39 39 38 38 38 38 38 39 41 42 42 42 43 43 43 44 44 44 43 43 43 43 44 43 42 41 41 40 38 37 38 38 39 40 41 41 41 41 41 41 41 39 38 37 38 39 39 39 39 39 40 40 40 40 40 40 40 40 41 41 42 42 42 42 42 43 43 44 44 44 44 43 43 42 41 41 41 41 40 39 40 41 41 42 43 42 41 41 41 40 40 40 40 41 40 40 39 39 38 37 38 38 38 38 38 38 38 39 38 38 38 38 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 32 32 31 31 31 32 34 34 34 33 33 67 67 67 67 66 66 66 65 65 65 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 58 58 58 58 58 59 59 59 59 59 59 59 59 59 60 60 60 60 60 59 59 59 59 58 59 59 58 57 57 57 57 57 56 56 56 56 55 55 56 56 56 56 55 55 54 54 53 53 54 55 55 55 56 56 56 56 56 56 57 56 56 55 55 54 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 51 51 51 51 51 51 51 51 51 51 51 52 52 53 53 53 54 54 55 55 55 54 54 53 52 53 54 53 52 52 52 52 51 51 50 51 51 51 50 50 51 51 52 52 52 52 52 51 50 50 50 49 49 49 49 49 49 49 48 47 46 46 47 48 48 48 48 47 46 46 46 46 46 46 46 45 44 43 43 43 43 43 43 43 44 45 45 44 44 45 46 46 47 47 47 47 48 48 47 46 46 45 44 45 46 46 45 44 44 44 42 42 41 40 39 39 41 41 40 39 38 37 37 37 37 38 37 37 39 39 38 38 36 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 33 33 33 33 34 35 35 36 37 38 39 39 38 37 36 35 34 34 35 37 37 36 35 36 37 38 38 39 40 40 41 40 39 37 37 37 39 39 37 35 34 34 33 34 37 38 39 39 41 41 41 41 41 41 41 41 42 43 44 44 43 43 42 42 44 44 43 42 42 42 43 43 43 42 41 39 38 37 38 39 40 40 41 41 40 40 41 42 41 40 38 37 38 39 39 39 39 39 40 41 41 41 40 40 41 41 41 42 42 43 43 43 43 43 44 44 44 45 44 43 43 42 41 41 41 41 40 39 39 40 40 42 42 42 41 41 40 40 40 41 40 40 40 39 39 39 38 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 30 31 34 34 34 34 34 68 68 68 68 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 59 59 59 59 58 58 58 58 58 59 59 59 59 59 59 59 59 60 60 60 61 61 60 60 60 60 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 55 55 56 55 53 54 56 56 56 56 57 57 57 57 57 57 56 56 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 51 51 51 51 51 52 52 51 51 52 52 52 52 53 53 54 54 55 55 54 53 54 53 52 53 53 53 53 53 53 52 51 51 51 52 52 51 51 52 52 52 52 52 52 51 51 50 50 50 50 50 49 49 49 49 49 48 48 47 47 48 48 48 49 49 48 47 48 48 48 47 47 47 46 45 44 44 43 43 43 43 43 44 44 44 44 44 45 46 46 47 47 48 48 47 47 48 47 46 45 43 44 45 45 45 45 45 44 44 44 43 41 40 40 41 41 41 41 40 38 38 38 39 40 39 38 38 39 40 40 39 37 35 33 33 33 33 33 33 33 33 33 32 32 32 32 33 33 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 33 34 35 35 36 38 39 39 39 39 37 35 34 34 34 35 37 37 36 35 35 36 36 38 39 39 39 40 39 38 37 37 37 39 38 35 34 33 34 34 35 37 38 40 41 42 42 42 43 42 42 43 43 42 42 43 44 43 42 41 41 43 44 43 42 41 41 42 42 42 42 41 39 38 38 39 41 41 41 40 40 40 40 40 41 40 39 37 38 39 40 40 41 41 41 41 42 43 43 43 42 42 43 42 42 43 43 43 43 43 43 43 43 44 44 44 44 43 43 42 41 42 41 41 39 39 40 40 41 42 42 41 40 39 40 40 40 40 40 40 39 38 38 37 36 37 38 38 38 37 37 38 38 38 38 38 38 37 37 37 37 37 36 36 36 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 30 31 33 34 34 34 34 68 68 68 68 68 67 67 67 67 66 66 67 67 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 58 58 59 58 58 59 59 59 59 60 60 60 60 61 61 61 61 61 60 59 59 59 59 59 58 58 58 58 57 57 58 58 58 58 57 57 57 57 56 56 56 56 55 54 55 56 56 57 57 57 57 57 57 57 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 53 52 52 52 52 51 51 51 51 50 50 51 51 50 50 50 51 51 51 51 51 53 53 53 52 52 52 52 52 53 53 53 54 54 54 54 53 54 53 52 52 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 49 49 49 49 48 47 48 48 49 49 48 48 49 48 48 48 48 48 47 47 47 46 46 46 46 45 44 43 43 43 43 44 43 44 45 45 46 46 47 48 48 48 47 47 47 47 46 45 44 43 44 44 45 45 45 44 44 44 44 42 40 41 42 42 41 40 39 39 39 39 39 40 40 39 38 39 40 41 41 40 38 35 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 33 34 35 35 37 39 39 38 38 36 34 33 34 35 36 37 38 37 35 35 35 37 38 39 39 37 38 38 37 37 36 37 38 36 33 33 34 35 37 39 39 39 41 41 41 41 42 43 43 43 43 44 44 43 44 44 44 42 40 40 42 43 42 42 41 40 41 42 41 41 40 38 38 39 41 42 41 40 40 39 39 38 38 39 38 37 37 39 40 41 41 42 43 42 42 42 42 42 42 42 42 43 43 43 42 42 42 42 42 43 43 43 44 44 44 44 44 43 42 42 43 43 42 41 39 39 40 41 42 43 42 40 39 39 39 39 39 40 39 38 38 37 36 36 37 38 38 37 37 37 37 38 38 38 38 38 37 37 37 37 37 37 36 36 36 37 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 32 30 30 31 33 34 34 33 69 68 68 68 68 67 67 67 67 67 67 67 67 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 59 59 59 59 58 58 58 58 58 58 59 59 59 59 60 60 60 60 60 60 61 61 61 61 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 57 57 57 57 57 56 55 55 55 56 56 56 56 56 57 57 57 56 56 56 55 55 56 56 56 56 55 55 54 54 54 54 54 55 55 54 54 53 53 52 52 52 52 52 51 51 51 51 52 52 52 53 53 52 52 52 51 51 50 50 50 50 50 50 50 51 51 51 51 52 53 54 54 54 52 51 51 52 53 53 54 54 54 54 53 53 53 52 52 53 54 54 55 54 54 53 53 53 53 52 53 53 53 52 52 52 52 52 51 51 52 52 52 51 51 50 50 50 49 49 49 48 48 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 44 44 43 43 43 43 44 45 45 46 46 47 48 48 48 48 47 47 47 46 46 45 44 43 43 42 43 44 44 43 43 43 41 40 41 43 43 42 41 40 39 40 40 40 41 40 40 40 41 41 42 42 41 40 38 35 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 33 33 32 32 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 34 36 37 39 39 37 37 35 33 33 34 36 37 38 37 36 34 34 36 38 38 38 38 36 36 36 36 37 36 37 37 35 33 33 35 37 39 40 40 40 41 41 40 40 41 41 42 42 42 43 44 44 44 44 44 43 41 40 41 41 41 42 41 40 41 41 41 41 39 37 38 40 41 41 40 38 38 37 37 37 36 37 37 37 37 38 40 41 41 42 42 42 41 40 40 40 41 41 41 41 42 42 41 42 43 43 43 43 44 44 44 43 43 44 44 44 43 43 43 43 43 42 40 39 40 41 42 42 42 42 39 38 39 39 39 39 39 38 37 37 37 36 36 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 37 37 36 35 35 36 36 35 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 32 32 31 31 32 32 32 31 69 68 68 68 68 67 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 59 59 59 59 58 58 58 58 58 58 59 59 60 60 59 60 60 60 60 60 60 60 61 61 61 60 60 60 60 60 59 59 59 58 58 59 59 59 58 58 58 58 58 57 57 57 56 56 55 55 55 56 56 56 56 57 57 57 57 57 56 56 56 57 57 57 56 56 55 55 55 55 55 55 55 55 55 55 54 53 53 53 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 51 51 52 52 52 53 53 54 54 52 51 51 52 53 54 54 54 53 53 53 52 52 51 52 53 54 54 55 55 55 55 54 54 54 53 53 53 52 52 52 52 52 52 51 50 51 51 52 51 51 50 50 50 49 49 49 48 48 49 49 48 48 48 47 47 47 48 48 47 47 47 47 47 47 47 47 47 46 45 45 45 44 43 43 43 43 44 45 45 46 47 48 48 47 47 46 45 45 46 46 45 45 45 43 42 42 42 42 42 42 41 40 41 42 43 43 43 42 40 39 41 41 41 42 41 41 41 42 42 41 41 40 40 39 36 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 33 36 37 39 39 37 36 35 34 33 35 36 37 38 37 36 35 34 36 38 37 36 36 35 36 36 37 37 37 38 37 35 33 33 35 38 40 41 41 41 40 39 39 39 40 40 41 42 43 44 44 43 43 44 44 43 41 40 39 40 41 42 41 40 40 39 41 41 38 37 38 39 39 38 38 37 36 37 37 37 37 38 38 37 37 37 38 39 39 39 40 39 39 40 40 40 40 40 40 40 41 41 41 42 44 45 44 44 43 43 43 42 43 44 44 44 44 44 43 43 42 42 41 39 39 40 41 41 41 41 40 38 38 39 39 39 38 38 37 37 37 36 36 36 37 37 37 37 37 37 37 37 38 38 37 37 37 37 37 37 36 35 35 35 35 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 34 34 34 34 33 31 30 30 68 68 68 68 68 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 58 58 58 58 58 58 58 59 59 59 60 59 59 60 60 60 60 60 61 61 61 61 61 60 60 60 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 58 58 57 57 56 56 55 55 55 55 55 55 55 54 54 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 52 52 52 53 52 52 52 51 51 50 50 50 50 51 51 51 52 53 53 53 54 53 52 51 52 52 53 53 53 53 53 53 52 51 51 52 53 54 54 55 55 55 55 55 55 54 54 53 53 52 52 52 52 51 52 51 51 50 50 51 51 51 50 50 50 50 49 48 48 48 48 47 47 47 47 46 46 46 47 48 48 48 48 48 47 47 47 48 47 46 46 46 46 45 44 43 43 42 43 44 45 45 46 47 48 47 47 46 46 46 45 45 45 45 45 45 44 43 42 42 42 42 41 41 43 43 43 43 43 41 40 40 42 42 42 43 42 42 41 41 41 40 39 38 38 39 37 34 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 34 36 39 40 38 36 35 34 33 35 37 37 37 37 37 36 34 35 36 35 34 34 35 36 37 38 39 39 39 37 34 33 33 35 38 40 41 41 40 39 38 39 39 41 42 42 43 44 44 43 42 42 43 44 44 42 41 39 39 40 40 40 40 39 39 40 40 37 37 37 37 37 37 37 37 37 38 39 39 39 39 39 39 38 39 38 38 38 38 39 39 39 39 39 40 40 40 40 40 40 40 41 42 44 44 44 43 42 42 42 43 43 44 44 44 44 43 43 43 42 41 41 40 39 40 40 41 41 41 40 39 38 39 39 38 38 37 37 37 37 37 36 35 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 35 35 36 37 37 37 37 37 37 36 36 36 37 37 37 37 36 36 36 36 36 36 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 32 30 30 67 68 68 68 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 66 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 57 57 58 58 59 60 59 59 59 59 59 60 60 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 58 58 58 57 57 57 56 56 57 56 56 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 58 57 57 57 56 56 55 55 55 55 55 54 54 53 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 51 50 50 49 50 50 51 51 52 52 53 53 53 53 52 51 52 52 52 52 52 53 53 52 51 52 52 52 53 53 53 54 54 55 55 56 56 55 54 53 52 52 52 52 51 51 51 51 51 51 51 50 50 50 49 49 50 50 49 49 49 48 47 46 46 46 47 47 46 45 46 46 47 47 47 47 47 46 46 47 47 47 47 47 46 46 45 44 43 42 42 43 44 44 45 45 47 48 48 47 47 47 45 45 45 44 45 45 46 45 44 43 43 42 41 41 43 43 43 43 43 41 40 41 42 43 42 41 41 40 40 39 39 38 38 37 36 37 35 35 34 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 39 38 37 35 33 33 34 36 37 37 38 37 37 35 34 34 34 34 35 36 37 37 39 39 40 39 37 34 33 33 34 37 39 40 39 38 38 39 40 40 41 42 43 43 43 42 42 41 41 43 44 44 43 42 40 39 38 38 39 40 40 39 38 37 36 36 36 37 37 37 38 39 39 39 40 40 40 40 40 40 40 40 40 39 39 40 40 41 41 40 40 40 41 41 42 41 41 40 40 41 42 42 42 41 41 42 42 43 43 43 44 44 44 43 42 43 42 41 40 40 39 40 40 41 40 40 40 39 39 39 38 37 37 37 37 37 37 37 36 36 35 35 35 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 35 34 35 36 37 37 37 37 37 37 36 36 36 37 37 36 36 36 35 36 36 36 36 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 32 32 67 68 68 67 67 67 67 67 66 66 66 67 66 66 65 65 65 65 65 65 65 65 65 65 65 66 66 66 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 60 60 61 60 60 60 59 59 59 58 58 58 57 57 57 57 59 60 59 59 59 59 59 60 60 60 60 60 60 61 61 60 60 60 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 58 58 57 57 57 58 58 58 57 56 56 56 56 56 56 55 55 55 54 54 53 53 53 52 52 53 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 51 51 50 49 49 50 51 51 51 52 52 52 52 52 52 51 51 52 52 51 51 52 52 51 51 52 53 53 53 54 54 54 54 54 54 55 55 55 54 53 52 52 52 52 51 51 50 50 50 51 51 51 50 50 49 49 49 49 49 49 49 49 47 46 46 47 48 47 47 46 45 46 47 48 47 47 48 47 46 46 46 47 47 46 46 46 46 44 43 43 42 42 43 44 44 45 46 47 48 47 46 46 46 46 45 44 44 45 46 46 45 45 44 42 41 41 42 43 43 43 43 41 41 41 42 43 42 41 41 41 40 40 39 39 39 39 37 35 34 35 37 37 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 36 35 34 33 35 36 37 37 37 36 36 35 33 33 34 35 36 37 37 38 39 39 40 39 37 35 33 32 34 37 38 37 37 37 39 40 40 40 40 42 42 43 43 42 41 41 42 43 43 43 43 43 41 39 38 37 39 40 39 38 36 36 35 36 37 38 38 38 40 41 41 41 41 40 41 41 41 41 41 40 40 41 41 41 42 43 42 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 42 42 42 42 42 43 42 43 43 43 42 41 42 42 41 40 39 39 40 41 40 40 40 40 39 39 37 37 37 37 37 37 37 37 37 37 37 36 36 35 36 36 36 36 36 36 36 37 37 37 37 37 37 37 35 34 35 36 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 37 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 67 68 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 66 66 66 66 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 58 58 58 57 57 57 57 58 58 59 59 59 59 59 60 60 60 60 60 60 61 61 61 60 60 59 59 59 59 59 59 59 58 58 58 58 58 57 58 58 57 58 58 58 58 58 58 59 59 59 59 58 58 57 57 57 58 58 57 57 56 55 55 55 55 55 55 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 51 50 49 49 50 50 51 51 51 51 51 52 51 50 51 51 51 51 51 51 51 51 52 53 54 53 53 54 54 53 54 54 54 55 55 55 54 53 52 52 51 51 51 50 50 50 50 49 50 51 50 50 50 49 49 48 48 49 49 49 47 46 47 47 47 47 47 46 45 45 46 48 47 47 47 47 46 45 45 46 46 45 45 46 45 45 44 43 42 42 42 43 43 44 46 47 47 46 46 46 46 46 46 45 44 44 45 45 45 45 44 43 42 42 42 42 43 43 43 42 42 43 43 43 42 42 41 41 41 41 41 40 39 39 38 36 34 35 37 40 40 38 36 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 35 34 33 35 36 37 37 37 35 34 34 34 35 36 36 36 37 38 39 40 40 40 40 38 36 33 32 34 37 37 35 36 39 40 39 40 41 42 42 43 43 42 41 40 41 43 42 41 42 43 44 42 40 38 37 37 38 37 36 35 36 36 37 38 39 40 39 40 41 42 42 42 42 43 44 43 42 42 40 41 42 43 43 43 44 43 42 41 42 42 42 42 43 43 42 42 41 41 42 42 42 43 43 43 43 42 42 41 42 42 42 42 41 41 42 42 40 39 38 39 40 40 39 39 39 39 38 37 37 37 37 37 37 37 37 38 38 38 38 37 36 36 36 36 36 35 35 36 36 36 37 37 37 36 36 35 35 35 36 37 36 36 37 37 36 36 37 37 36 36 36 36 36 36 37 37 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 67 67 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 66 66 66 66 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 57 57 57 57 57 58 59 59 59 59 59 59 60 60 59 59 60 60 61 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 58 57 57 56 55 55 55 54 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 51 51 51 52 52 52 51 50 49 49 50 50 51 51 51 51 51 51 50 50 51 51 51 51 51 51 51 52 53 54 54 54 54 54 53 53 54 54 54 55 55 54 53 52 51 51 50 50 50 49 49 49 48 49 49 49 50 50 49 49 49 48 48 48 48 47 47 47 47 47 47 47 46 45 45 45 47 47 46 46 46 45 45 45 45 45 44 44 45 45 45 45 44 43 42 42 42 43 44 45 46 46 45 45 45 45 45 46 45 44 44 44 44 44 45 44 43 43 43 43 43 43 43 42 42 43 43 43 42 42 42 42 42 42 40 39 39 38 38 37 36 35 34 37 40 41 41 40 37 35 35 33 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 35 34 34 35 36 37 36 35 34 33 34 35 36 37 38 38 39 40 40 41 40 41 40 39 37 34 32 34 36 36 35 38 40 40 40 41 42 43 43 42 42 41 41 40 41 42 41 41 42 43 43 42 40 39 37 36 35 35 36 36 37 38 38 38 40 41 40 40 42 43 43 43 43 44 45 45 44 42 42 42 43 44 45 45 45 44 42 42 42 42 43 43 43 43 43 43 42 42 43 43 44 44 43 43 43 42 42 41 41 40 41 42 41 40 40 40 41 39 38 38 40 40 39 38 38 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 37 37 36 36 36 36 35 35 35 36 37 37 37 36 35 36 35 35 36 36 36 36 36 36 36 36 37 36 35 36 36 37 36 36 37 37 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 67 67 67 67 67 67 68 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 66 66 65 64 64 63 63 63 63 63 63 63 63 62 62 62 62 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 58 58 59 59 59 59 60 59 59 59 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 58 58 57 57 56 57 57 57 57 56 56 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 53 53 52 51 51 51 51 50 50 50 50 51 51 51 51 51 51 50 49 49 50 50 50 50 50 51 51 50 50 51 51 51 51 50 50 51 52 53 54 54 53 54 54 53 53 53 53 54 54 54 54 53 52 51 51 50 50 50 50 49 49 49 48 48 48 48 48 48 49 49 49 48 47 47 47 48 48 48 47 47 47 46 46 45 45 46 47 46 46 46 45 45 44 44 44 44 44 44 44 44 44 44 43 42 42 42 42 42 44 45 45 45 44 44 45 45 46 45 45 44 43 43 44 45 45 44 43 44 44 43 43 43 42 42 42 42 42 42 41 42 42 43 42 40 38 38 39 39 38 38 35 34 37 40 39 39 41 40 39 40 38 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 33 33 34 35 36 34 33 33 34 35 35 36 37 38 39 40 40 40 41 41 40 40 39 37 35 33 33 34 35 36 38 39 41 42 42 42 43 43 41 40 41 41 40 40 41 41 40 41 43 42 40 39 38 36 36 36 36 37 37 38 38 39 39 41 42 42 42 43 44 43 43 43 43 45 45 44 43 43 44 44 44 44 45 45 44 43 43 43 44 44 44 45 44 44 44 43 42 43 44 44 44 44 43 43 43 43 42 41 41 40 40 40 41 40 40 40 39 38 38 39 40 39 38 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 37 37 36 37 36 35 35 35 35 35 35 36 36 36 36 36 36 35 35 35 36 36 36 36 36 36 36 36 36 36 37 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 67 67 67 67 66 67 67 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 58 58 59 59 59 60 59 59 59 60 60 60 60 61 60 60 60 60 60 60 60 60 59 60 60 59 59 59 59 59 59 59 59 59 58 58 59 58 58 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 54 53 52 52 52 52 53 53 53 53 53 53 54 54 53 52 52 51 51 50 50 50 50 50 50 51 51 51 51 51 50 49 49 49 50 50 50 51 51 50 50 50 50 50 50 50 50 51 52 53 53 53 52 52 53 53 53 53 53 54 54 54 54 53 52 52 51 50 50 51 51 50 50 51 50 50 49 49 48 47 47 48 49 48 48 48 48 48 48 48 47 47 47 47 46 46 45 45 46 46 46 46 46 45 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 43 44 45 44 43 44 45 46 46 46 45 44 43 44 44 45 45 44 44 44 44 44 43 42 41 41 41 41 41 42 42 42 43 42 40 39 40 41 40 39 38 36 35 36 38 38 39 40 41 41 41 40 38 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 32 33 35 35 33 33 34 35 36 37 38 38 37 39 40 39 40 40 39 38 38 38 37 35 33 32 34 36 37 38 38 40 41 42 42 42 43 41 39 39 40 39 39 40 41 40 40 42 42 39 37 36 35 36 38 39 39 38 38 39 40 40 41 41 43 43 43 43 42 42 43 44 45 44 43 43 44 44 43 43 44 44 45 45 44 44 44 44 44 45 45 45 45 46 44 43 43 44 44 43 43 43 43 43 43 43 42 41 40 39 39 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 37 37 37 36 35 35 35 35 34 34 34 35 36 36 36 36 35 34 35 36 36 36 36 36 36 36 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 33 67 68 67 67 66 66 66 66 66 66 66 66 66 67 66 66 66 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 57 57 57 57 57 56 56 57 58 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 61 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 53 54 53 53 53 53 53 54 54 53 53 52 51 51 51 50 50 50 50 50 50 50 51 51 51 50 49 49 49 49 50 50 50 50 49 49 50 49 49 50 51 52 52 52 52 52 52 52 53 54 54 53 53 54 54 55 55 54 52 52 52 51 51 52 52 51 51 51 51 51 50 50 49 48 47 47 47 47 47 47 47 48 48 48 47 47 47 47 46 46 46 45 45 45 45 45 45 45 44 43 43 43 43 43 43 42 42 43 43 43 43 43 42 42 42 42 43 44 44 43 44 44 45 46 46 46 45 44 43 44 45 45 44 43 43 43 43 43 43 42 42 42 41 40 40 41 42 42 42 41 40 41 41 41 40 38 37 36 36 38 40 40 40 42 42 41 41 40 38 38 37 35 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 33 33 34 35 36 38 38 37 37 38 40 41 41 40 37 36 37 36 35 33 32 32 35 37 38 39 40 41 41 40 40 42 42 41 39 38 38 38 39 40 41 39 39 40 39 37 35 35 36 37 38 39 40 40 39 40 41 42 42 42 43 43 42 42 42 41 43 44 44 43 43 43 43 42 43 44 44 44 44 45 45 44 44 44 44 44 45 46 46 46 45 44 44 44 44 43 43 43 43 43 43 42 42 42 41 40 39 39 39 39 39 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 37 36 34 35 35 36 35 35 34 34 34 35 35 35 35 35 35 36 36 36 37 37 36 36 37 37 37 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 35 35 35 35 35 35 35 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 32 32 33 33 32 68 68 67 67 66 66 66 66 66 66 66 66 67 67 67 66 66 66 66 66 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 58 57 57 56 56 56 57 58 58 59 59 58 58 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 58 58 57 58 58 58 57 57 56 56 56 56 56 56 55 55 55 54 55 55 55 54 54 54 54 54 53 53 53 54 54 54 53 53 52 52 52 52 52 53 53 52 52 52 51 51 51 51 50 50 50 49 50 50 50 51 50 49 49 49 49 49 50 50 50 49 49 49 49 50 51 51 52 52 52 52 52 52 51 52 53 54 54 54 54 54 55 55 54 53 54 53 52 52 51 51 51 51 50 50 50 49 50 50 49 49 48 47 46 46 46 46 47 47 47 47 47 47 47 47 46 46 46 45 45 45 44 44 44 43 43 43 43 44 44 43 43 43 44 44 44 44 44 43 42 42 42 42 43 43 43 44 45 45 46 46 46 46 45 44 43 44 44 44 43 43 42 42 42 43 42 42 43 42 41 39 40 41 42 43 42 42 42 42 40 39 39 39 37 36 38 39 39 39 40 42 42 41 40 39 38 39 37 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 35 35 36 36 36 37 38 39 40 42 40 38 36 35 33 32 32 33 34 36 38 40 41 41 42 42 40 41 42 42 41 39 38 37 39 41 40 40 39 37 38 37 35 35 36 37 39 40 40 41 41 41 40 41 43 44 43 43 43 42 41 41 42 43 43 42 42 43 43 42 42 43 44 44 44 45 45 45 44 44 45 45 45 46 46 46 45 44 44 43 44 44 43 42 42 42 43 43 42 42 42 42 41 40 40 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 39 39 38 38 38 37 35 35 36 37 36 36 35 34 34 34 34 34 35 34 35 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 35 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 32 31 31 31 31 30 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 61 61 61 61 61 61 61 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 56 56 56 56 57 58 59 59 58 58 58 59 59 59 59 59 60 60 60 60 60 60 60 59 59 59 60 60 59 59 59 59 58 58 58 58 57 57 57 57 57 57 56 55 55 56 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 53 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 49 49 49 49 49 50 50 49 49 49 49 49 50 50 50 49 49 49 50 51 51 51 51 51 51 51 51 52 52 52 53 53 53 54 54 55 55 55 54 54 54 53 52 51 51 51 50 50 50 50 49 49 48 49 49 49 48 47 47 47 46 45 45 46 47 46 46 47 47 47 46 46 46 46 45 44 44 44 43 44 45 45 45 45 45 45 45 45 45 45 44 43 43 42 42 42 42 42 43 43 43 44 44 45 45 45 45 45 45 44 43 44 44 44 44 43 42 42 41 41 41 41 41 41 40 40 41 42 43 43 43 42 42 40 38 38 38 37 36 36 37 39 39 40 41 41 40 40 39 38 37 36 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 36 37 37 37 38 38 39 40 40 40 37 33 32 32 33 34 36 38 39 40 40 41 42 40 40 41 41 41 39 38 37 37 40 40 39 39 38 37 37 36 35 36 37 38 39 40 41 42 42 42 41 42 43 43 43 42 43 42 41 40 41 42 41 41 41 42 41 41 42 42 42 43 44 45 45 44 43 44 45 45 46 46 45 45 45 44 44 43 43 44 43 42 41 42 42 43 41 41 42 42 41 40 40 40 39 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 40 40 39 39 38 38 37 36 37 37 37 36 36 35 35 34 34 34 34 34 35 36 37 36 36 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 33 33 33 33 33 32 32 30 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 60 60 61 62 61 61 60 60 61 61 61 60 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 56 57 58 58 58 57 58 58 58 59 59 59 60 59 59 60 60 60 60 59 59 59 59 59 60 60 59 59 59 58 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 53 53 52 52 52 52 53 53 53 53 53 53 52 52 52 52 52 52 52 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 50 49 49 49 49 50 50 50 50 50 50 50 50 51 52 53 53 53 53 53 53 53 54 55 55 55 54 53 53 52 52 51 50 50 51 51 50 50 49 49 48 48 48 49 49 48 47 46 46 45 45 46 45 45 46 47 47 47 46 46 46 45 45 44 44 44 44 46 46 46 46 45 45 45 45 45 45 44 43 43 43 42 42 41 42 42 42 43 43 44 45 45 46 45 45 44 44 43 43 44 44 44 44 43 42 41 40 40 40 40 40 39 39 40 41 43 43 43 42 40 40 40 38 38 37 36 36 38 40 41 42 42 42 42 42 41 39 38 36 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 37 37 37 37 38 38 39 40 40 38 38 39 37 34 32 33 34 36 37 39 40 39 39 41 40 39 41 40 40 41 40 38 37 37 39 38 37 38 37 36 35 35 35 36 37 38 38 39 40 42 43 43 43 43 43 42 41 41 43 42 40 40 40 41 41 41 41 41 41 41 41 41 42 43 44 45 44 43 44 44 45 46 46 45 45 46 45 44 44 43 44 44 43 42 41 41 42 43 41 40 42 42 41 40 40 40 39 38 37 37 37 38 39 39 39 39 39 39 38 38 39 39 38 38 39 38 38 38 39 40 40 40 40 39 39 39 38 38 37 37 37 37 37 37 37 36 36 35 33 33 33 33 34 35 35 35 36 36 36 37 37 36 36 36 37 37 36 35 35 35 34 34 34 35 35 34 34 33 33 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 31 68 68 68 68 67 67 67 67 67 66 66 66 66 66 66 66 66 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 61 61 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 57 58 57 57 57 58 58 58 59 59 59 59 59 60 60 60 60 59 59 59 60 60 60 60 59 59 59 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 53 53 54 54 54 54 54 54 53 53 53 53 53 54 53 53 52 51 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 51 51 51 52 53 53 54 54 53 53 53 53 54 55 55 54 53 52 52 52 51 51 51 52 52 51 50 49 49 48 48 47 48 49 48 47 47 46 46 46 46 45 45 45 46 46 47 46 46 46 45 45 44 44 44 45 47 47 47 46 45 44 44 44 44 44 44 44 43 43 43 42 41 41 41 42 42 43 44 45 46 46 46 45 44 44 43 42 43 44 45 44 43 43 42 41 42 42 41 40 39 38 39 41 42 42 42 41 39 39 38 38 38 38 36 36 38 39 40 41 41 42 42 42 41 38 38 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 37 36 36 38 38 39 39 39 39 38 36 37 36 33 32 33 34 37 38 38 39 38 39 40 40 39 39 39 39 40 41 39 37 37 37 37 36 36 36 35 35 36 36 37 38 39 39 40 41 41 43 42 42 43 43 42 41 41 41 40 40 40 41 42 41 41 41 42 41 41 42 42 42 43 43 44 44 43 44 44 45 46 46 44 44 46 46 45 43 43 43 44 43 41 40 40 41 42 41 40 41 41 39 39 38 38 38 38 38 38 38 39 39 39 40 40 40 40 39 40 40 40 39 39 39 39 39 38 39 39 40 40 40 39 38 38 39 38 38 38 38 37 37 37 37 36 36 35 34 34 33 33 33 33 33 34 35 35 36 36 36 36 36 36 37 37 36 35 35 35 34 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 34 35 34 34 35 35 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 33 32 68 68 69 68 68 67 67 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 61 61 61 60 60 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 56 56 56 56 56 56 56 57 56 57 57 58 58 58 59 58 59 60 60 60 60 59 58 59 60 61 61 60 59 59 59 58 58 58 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 53 53 53 54 55 55 54 54 54 53 53 54 54 54 54 54 54 53 52 51 50 50 50 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 50 50 50 51 52 52 52 53 53 54 54 54 54 54 54 54 54 55 55 54 54 53 52 52 52 52 52 52 52 52 51 50 50 49 49 48 47 47 47 47 46 46 47 48 48 47 46 45 45 45 46 45 45 45 45 45 44 44 45 46 47 47 46 46 46 46 45 45 44 44 43 43 43 43 42 42 42 41 41 41 42 43 44 44 45 46 46 46 45 44 44 43 43 44 45 44 43 43 43 43 44 44 43 43 42 40 39 39 40 40 41 42 41 40 39 38 37 37 36 36 37 38 38 40 41 42 42 42 42 40 40 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 36 37 39 39 39 38 38 38 38 36 36 34 32 32 33 34 37 38 37 37 37 38 39 40 39 37 37 38 39 39 39 37 36 36 35 35 35 35 36 37 38 38 39 39 39 41 42 42 43 42 40 41 42 42 41 41 40 40 39 40 41 43 44 43 42 42 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 44 45 46 45 43 42 42 44 43 41 40 40 41 42 41 40 40 39 38 37 37 37 38 39 39 39 40 40 40 40 40 40 40 40 40 41 41 41 40 39 39 39 39 39 39 39 40 40 40 39 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 34 34 33 33 33 33 34 35 35 35 35 35 35 36 36 37 37 36 35 35 35 35 35 35 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 68 68 68 68 68 68 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 62 62 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 58 58 58 58 58 58 57 57 56 56 56 56 55 55 55 56 56 56 56 57 58 58 58 58 58 59 60 59 59 59 58 58 59 61 61 60 59 59 59 58 58 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 53 54 55 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 51 51 50 50 49 49 49 49 49 48 48 48 48 48 49 49 50 50 50 50 51 52 52 53 53 53 54 54 54 54 55 55 55 55 55 55 54 54 54 53 52 52 52 52 52 51 51 51 50 50 49 49 48 47 46 46 46 46 47 48 49 48 47 47 46 45 45 45 45 45 45 45 45 45 44 45 46 46 46 46 46 46 46 45 45 45 44 43 43 43 43 43 43 43 42 41 41 42 42 44 44 45 45 46 45 45 44 44 44 43 43 44 44 44 44 44 44 44 44 43 42 42 41 39 38 38 39 41 41 42 42 41 40 37 37 36 36 37 38 39 40 41 42 43 43 42 41 40 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 38 37 37 37 38 38 37 36 35 33 32 32 34 35 37 37 37 37 38 39 40 40 39 37 37 39 38 37 37 36 35 34 34 35 36 37 38 38 39 40 40 40 40 41 42 43 43 42 40 40 42 41 40 40 39 39 40 42 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 45 45 45 44 43 42 42 43 44 45 45 44 43 42 42 43 42 42 41 40 42 42 41 40 39 38 37 38 38 38 39 39 39 40 41 41 41 40 40 41 41 41 41 41 41 41 40 40 39 39 39 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 34 34 33 33 33 33 34 35 35 35 35 35 36 36 37 37 36 35 35 35 35 35 35 34 34 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 69 68 68 68 68 68 67 67 67 68 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 62 62 62 61 61 62 62 62 62 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 58 58 58 57 56 56 56 57 56 56 55 55 55 55 55 55 56 57 57 57 57 57 57 58 59 58 57 58 58 59 60 60 60 60 60 60 60 59 58 58 57 57 57 57 58 57 56 56 56 56 56 55 55 55 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 49 49 48 48 48 48 48 48 49 49 49 49 49 50 50 51 52 52 52 53 53 53 54 54 55 55 55 55 55 55 55 54 53 52 52 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 47 48 49 49 48 48 47 46 45 45 45 45 45 45 46 46 46 45 45 46 46 46 46 45 45 46 45 44 44 43 43 43 43 44 44 44 43 42 41 41 41 42 42 43 44 45 45 45 45 44 44 43 43 43 44 44 45 45 44 44 44 44 42 41 41 41 40 40 39 38 39 39 41 41 41 40 38 37 36 37 38 40 41 41 41 42 43 42 41 40 39 39 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 37 37 38 38 36 35 34 33 32 32 33 34 35 37 37 38 38 39 39 40 39 39 38 37 39 38 36 35 35 34 34 35 36 37 39 40 40 40 41 41 42 42 42 42 42 42 41 40 40 41 41 40 39 39 40 42 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 45 45 45 44 43 41 41 43 44 44 44 43 43 43 43 44 42 42 40 40 41 41 40 39 38 37 38 40 40 40 40 40 39 40 40 41 41 40 40 41 42 43 43 42 42 41 41 40 40 39 40 40 41 40 39 39 39 39 39 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 34 34 33 32 33 34 35 35 35 35 36 36 36 36 35 35 36 36 36 36 35 35 34 34 33 33 33 34 34 34 34 34 34 35 35 34 34 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 69 69 68 68 68 68 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 62 62 62 62 62 62 62 62 61 61 61 60 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 55 55 55 55 55 55 55 55 56 56 56 57 58 57 57 58 58 58 59 59 59 60 60 60 60 60 59 58 58 58 58 58 58 58 58 57 56 56 56 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 52 52 51 50 50 49 49 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 51 51 52 52 53 53 53 54 54 54 54 54 54 54 54 54 53 53 52 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 48 48 47 47 47 46 45 45 46 47 47 47 47 47 47 46 46 46 46 46 46 45 44 44 44 43 43 43 44 45 45 45 44 44 43 43 42 41 41 41 41 42 43 44 44 45 45 44 44 43 42 43 44 44 45 44 43 43 44 44 43 42 42 42 42 41 40 39 38 38 39 41 40 38 38 37 37 37 38 39 40 41 42 42 41 40 40 39 38 38 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 38 38 38 38 38 36 35 33 32 32 32 32 34 36 37 36 37 39 40 39 39 39 38 38 38 37 38 38 36 34 34 34 35 36 37 37 39 41 41 41 42 42 43 42 42 42 42 40 40 39 39 39 39 39 39 39 41 42 42 42 42 42 43 43 42 42 42 43 43 44 45 46 46 45 45 45 44 43 43 42 41 42 43 42 42 42 42 43 44 44 43 41 40 39 40 39 39 39 38 38 39 40 40 40 40 41 41 40 40 40 40 40 41 41 42 42 43 43 43 42 42 42 41 40 40 41 41 41 40 40 39 39 39 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 34 34 34 33 32 33 34 34 34 35 36 36 36 35 34 34 35 36 36 36 35 35 35 34 34 34 33 33 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 35 34 34 34 34 34 34 34 34 69 69 68 68 68 68 68 67 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 56 55 55 55 55 55 55 54 54 54 55 55 55 56 56 56 57 57 57 58 57 58 58 59 59 59 60 60 59 59 58 58 59 59 59 59 58 57 57 56 56 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 51 51 52 51 51 50 49 48 48 48 48 48 48 48 48 48 49 50 50 51 51 50 50 51 52 53 53 53 53 53 53 53 53 53 53 53 54 55 54 53 52 52 51 50 50 50 50 50 50 50 50 50 50 50 49 48 48 49 49 48 48 47 47 46 46 46 46 47 47 47 47 47 47 46 45 45 45 45 45 45 45 44 44 44 43 44 44 44 45 45 44 44 44 44 43 43 41 41 41 41 41 42 43 44 44 45 45 44 43 42 43 44 44 45 44 43 43 42 42 42 42 43 43 43 42 41 40 39 38 38 39 39 39 38 37 37 36 37 38 39 41 42 42 41 40 40 40 39 39 36 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 38 39 39 37 34 33 32 32 32 32 33 36 39 39 38 38 40 40 39 38 38 37 38 37 36 38 37 35 34 34 35 36 37 37 38 38 40 42 42 42 41 42 41 41 41 40 39 39 38 38 38 39 39 39 40 40 40 41 41 41 41 41 41 41 42 42 43 43 43 44 46 46 46 45 44 44 43 43 42 41 42 42 41 41 42 43 43 44 43 42 41 40 39 39 39 39 38 38 39 39 40 40 41 41 41 41 41 41 41 40 40 40 40 41 41 42 43 43 43 43 42 42 41 41 41 41 41 41 40 39 39 39 39 38 38 38 38 38 38 38 37 37 37 37 36 35 35 35 34 34 33 33 32 33 34 34 34 35 36 36 36 36 35 34 35 36 36 36 35 35 35 34 34 33 33 33 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 35 35 34 34 35 35 34 34 34 34 34 34 34 69 69 69 68 68 68 68 68 67 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 60 60 59 59 59 58 58 58 57 58 57 57 57 56 56 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 55 55 56 56 57 58 58 58 58 59 59 59 58 58 59 59 59 60 60 59 58 58 58 57 56 55 54 54 55 54 54 54 54 54 53 53 54 54 54 54 54 54 53 53 52 52 52 52 52 51 51 51 51 51 51 52 52 53 53 53 53 52 52 51 51 51 50 50 50 49 48 48 48 48 48 48 48 48 48 49 49 50 51 51 50 51 51 52 53 54 53 54 54 53 53 53 52 52 53 54 55 54 53 53 52 51 51 50 49 49 49 49 49 50 50 50 49 49 48 47 47 47 48 48 47 46 46 46 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 45 45 44 44 44 44 44 43 43 43 42 41 41 41 41 41 41 42 43 43 44 45 44 43 42 42 43 44 44 44 43 43 42 42 42 42 43 42 43 43 43 41 40 39 38 38 39 40 40 38 37 37 38 38 39 40 41 41 41 40 39 40 40 40 37 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 39 39 38 35 33 32 32 32 32 33 35 37 38 40 40 39 40 41 40 38 37 37 37 36 36 36 35 34 34 35 36 37 38 39 39 39 40 41 41 41 40 41 41 40 39 38 37 38 38 38 39 40 41 41 40 40 40 40 41 41 40 41 41 41 42 43 43 44 44 44 45 46 45 44 44 44 43 43 42 40 40 41 41 43 43 43 43 43 42 42 41 40 39 38 38 38 38 38 40 41 42 42 42 42 42 41 41 42 42 42 41 41 41 41 41 42 43 43 44 44 43 43 42 42 41 41 41 41 40 40 39 39 39 39 39 38 38 38 38 38 37 37 37 37 37 35 35 35 35 34 34 33 32 33 33 33 34 34 35 36 36 36 36 35 35 35 36 36 36 35 35 34 34 33 33 33 34 34 34 34 34 34 34 34 35 35 35 35 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 69 69 69 68 68 68 68 68 68 67 67 67 67 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 57 57 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 56 57 57 57 57 57 57 57 57 57 58 58 59 60 61 60 59 59 59 58 58 57 56 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 52 53 53 52 51 51 51 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 50 51 50 50 51 51 52 53 54 54 54 53 52 52 52 52 53 55 55 54 54 53 53 52 52 51 49 49 49 48 48 48 49 49 48 48 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 44 44 44 43 43 43 43 43 42 42 41 41 41 41 41 42 43 43 44 44 43 41 42 43 44 44 43 43 43 43 43 42 42 42 41 41 41 42 43 41 40 39 38 38 38 39 38 37 38 39 39 40 42 41 40 39 39 38 39 39 39 36 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 36 38 37 37 34 32 32 32 32 32 34 36 37 38 40 41 41 40 41 40 38 38 37 36 36 36 35 34 34 35 36 37 39 39 40 40 41 41 41 40 40 40 41 40 39 38 37 38 39 39 39 40 41 42 42 41 41 41 42 42 42 41 42 43 42 42 42 43 44 45 45 45 45 45 44 43 43 44 43 42 41 40 40 42 43 43 43 43 42 42 41 41 40 38 37 37 37 37 38 39 40 41 42 42 43 43 42 42 42 43 43 42 42 43 42 42 42 43 43 44 44 43 43 42 42 42 42 42 41 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 37 36 35 35 35 35 34 33 32 32 32 32 33 34 35 35 35 35 35 35 34 35 35 36 36 35 35 34 33 32 32 33 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 34 70 69 69 69 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 57 57 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 56 56 57 57 57 58 58 59 60 60 60 60 59 59 59 59 58 57 56 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 51 51 51 52 52 52 51 51 51 52 51 51 50 50 50 50 49 50 49 49 50 51 51 51 50 49 48 48 48 48 48 49 49 50 49 50 50 50 51 52 53 54 53 52 51 51 53 53 53 54 54 54 54 53 53 52 52 51 50 49 49 49 49 48 48 48 48 47 47 47 48 48 47 47 47 49 49 48 48 48 49 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 45 46 46 46 45 45 44 43 43 44 44 44 43 43 42 41 41 41 41 41 42 43 43 43 42 41 43 43 43 44 44 45 45 44 44 44 43 42 42 41 41 41 42 42 42 41 40 38 38 38 37 37 39 40 40 41 43 41 40 39 38 38 39 39 37 37 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 34 34 32 32 32 32 33 34 35 37 38 39 39 40 41 40 40 39 38 38 38 35 35 34 34 34 35 36 37 38 38 39 40 41 42 42 41 39 40 41 40 39 38 37 37 38 40 41 41 40 40 42 43 42 41 41 42 43 44 43 42 43 43 43 43 43 43 45 46 45 45 44 44 43 43 43 43 43 41 39 40 41 42 43 43 42 42 41 41 41 39 37 37 39 39 39 39 39 39 40 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 42 42 41 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 37 37 36 36 36 35 35 34 33 32 32 32 32 33 34 34 35 35 35 35 34 34 34 35 36 36 35 34 32 32 33 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 70 70 70 69 68 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 61 60 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 61 61 60 60 60 60 60 60 59 59 58 58 58 57 57 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 56 56 56 57 58 58 59 59 60 59 58 58 58 58 58 58 58 57 56 55 54 54 54 54 54 54 54 54 55 54 53 53 53 52 52 52 53 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 50 51 52 51 50 50 48 48 48 48 48 48 48 48 48 49 50 50 51 52 52 52 53 52 51 52 53 53 53 54 53 53 54 54 53 52 52 51 50 50 50 50 50 50 49 48 48 49 49 48 49 49 49 48 49 50 49 49 49 49 49 49 49 49 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 46 45 44 43 44 44 44 44 43 43 43 42 41 41 41 41 41 41 42 42 42 42 43 43 44 44 45 46 46 45 45 44 43 43 43 43 42 40 40 42 43 42 42 40 40 40 38 37 39 41 41 41 42 41 41 40 38 39 39 38 37 37 36 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 33 32 32 32 32 32 33 35 35 36 37 37 39 40 40 40 39 40 38 37 36 34 33 33 34 35 36 37 37 38 38 39 40 41 41 41 41 39 39 40 39 38 37 38 38 39 40 40 41 41 42 43 43 43 42 43 43 43 44 44 44 44 44 44 44 44 44 45 45 45 45 44 44 43 43 43 42 42 40 39 40 41 42 43 42 42 41 40 39 39 38 38 39 40 41 41 41 41 40 41 41 41 42 42 43 44 44 44 44 43 43 44 44 44 43 43 43 42 42 42 42 43 42 41 41 41 40 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 36 35 35 35 34 33 33 33 32 32 33 34 34 35 35 35 35 34 34 35 35 36 35 34 33 33 34 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 71 70 70 69 69 68 68 68 68 68 68 68 67 67 67 67 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 61 61 62 61 61 62 62 62 62 62 62 61 61 61 60 61 61 61 61 61 61 60 60 60 60 61 61 60 59 59 59 58 58 57 57 57 56 56 56 55 55 55 55 54 54 55 54 54 54 54 54 53 53 53 53 53 54 55 55 55 56 56 56 56 57 57 57 58 59 59 58 57 57 57 57 57 58 58 57 56 54 54 54 54 54 54 54 55 55 54 53 53 53 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 49 48 48 48 48 48 48 48 48 49 50 51 51 52 52 52 52 51 51 52 53 52 53 54 53 53 54 54 53 52 51 51 50 51 51 51 51 50 50 50 50 50 50 49 50 50 49 49 48 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 46 47 47 47 47 47 46 46 45 45 45 44 44 44 44 44 44 44 44 44 44 43 42 41 41 41 41 41 41 41 42 43 43 43 44 44 44 45 45 45 45 44 44 43 43 42 42 40 39 40 42 42 43 42 41 40 38 38 39 41 41 41 41 40 40 40 39 38 39 38 37 36 35 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 37 37 37 38 39 39 39 39 39 39 38 36 34 33 33 33 34 35 36 38 39 39 39 39 41 41 41 41 40 38 39 39 38 37 38 39 39 40 40 40 41 42 42 43 43 42 43 44 44 44 44 44 44 44 44 44 45 45 44 45 45 45 45 44 44 43 42 43 43 41 40 39 39 41 42 43 42 42 40 38 37 37 38 38 39 40 40 41 42 42 42 43 42 42 42 43 43 44 44 44 44 43 43 43 44 44 43 43 43 43 42 41 42 43 42 41 40 40 41 42 42 41 40 40 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 35 35 35 34 34 34 34 33 32 32 33 34 34 34 34 34 34 34 34 34 35 35 34 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 34 35 35 35 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 71 71 70 70 69 69 69 68 68 68 68 68 68 68 67 67 67 66 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 62 62 62 62 61 60 60 61 61 61 61 60 60 60 59 59 59 58 58 57 57 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 54 55 56 56 56 56 55 55 56 56 57 57 58 58 58 57 56 56 56 57 58 58 57 55 54 54 54 54 54 54 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 52 51 51 52 52 53 52 52 51 52 51 50 49 48 48 47 47 47 47 48 48 50 50 51 51 51 51 51 51 51 51 52 52 52 53 54 53 52 53 54 54 53 52 52 52 51 51 52 52 50 50 51 50 50 50 50 50 51 50 49 48 48 48 48 48 48 49 48 47 47 47 47 47 46 46 46 46 46 46 47 47 47 46 46 46 45 45 45 45 44 44 45 44 44 44 44 44 43 43 42 41 41 41 41 41 41 41 42 43 43 43 44 44 43 44 45 44 44 44 44 44 43 42 41 41 40 40 40 40 40 42 41 40 38 38 40 41 41 41 41 40 39 38 38 37 38 39 37 36 35 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 36 38 39 39 39 39 39 38 37 38 38 37 36 35 33 33 33 34 36 37 37 37 38 40 40 40 42 41 41 40 39 38 38 37 37 38 39 39 39 40 41 41 41 42 42 43 42 41 42 43 44 44 44 43 42 44 44 44 44 44 44 44 44 44 44 44 43 42 42 43 43 43 42 39 39 40 41 42 43 41 38 37 38 38 39 39 39 40 39 40 41 42 43 44 43 43 43 43 44 43 43 42 42 43 43 42 43 44 44 43 43 43 42 41 42 42 42 41 40 41 42 42 43 42 41 40 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 36 35 35 35 35 35 35 35 34 32 32 32 33 34 34 33 33 33 34 34 34 34 34 33 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 35 34 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 33 32 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 71 71 71 70 70 69 69 69 69 68 68 68 68 68 67 67 66 66 66 66 66 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 62 62 61 61 61 61 60 61 61 60 60 60 60 59 59 59 59 58 58 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 53 53 52 53 54 55 56 56 55 54 55 56 56 56 56 57 58 58 58 57 56 56 56 56 56 56 56 55 54 54 54 54 54 55 55 55 55 55 55 54 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 53 53 52 51 51 50 49 49 49 48 47 47 47 47 47 48 49 50 50 49 49 49 49 50 51 52 53 53 53 54 54 53 52 53 53 54 54 53 52 52 51 50 51 51 50 50 50 49 50 50 49 49 49 50 49 49 48 47 48 48 48 48 47 47 46 46 46 47 47 47 46 45 46 46 46 47 46 46 46 46 46 46 46 46 45 45 45 44 45 45 45 44 43 42 42 42 42 41 41 41 41 41 41 42 43 42 43 44 43 44 45 45 44 44 44 45 44 44 43 43 42 41 42 40 39 39 40 41 39 38 39 40 40 41 41 40 38 38 38 36 37 38 38 37 37 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 38 39 40 39 39 39 37 36 37 38 36 34 33 33 33 34 36 37 38 38 37 37 38 40 41 41 40 40 39 38 38 38 37 38 39 40 39 40 40 41 42 41 41 42 42 41 41 43 43 44 43 43 42 42 43 43 43 44 44 44 43 43 44 44 44 43 42 42 43 43 42 42 40 39 39 40 42 42 40 37 37 39 39 41 41 42 42 41 41 42 43 43 43 42 42 43 43 43 43 42 41 42 42 42 42 42 43 43 44 44 43 43 42 42 42 41 42 42 42 42 42 43 42 41 41 41 40 39 38 38 38 38 38 38 37 37 37 37 37 37 36 35 35 35 36 36 36 35 34 33 32 32 32 33 34 33 33 34 34 34 34 34 33 32 33 34 34 35 35 35 35 36 35 35 35 35 35 35 35 34 33 34 35 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 34 33 33 32 32 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 34 71 71 71 70 70 69 69 69 69 69 69 68 68 68 68 68 67 66 66 66 66 66 67 67 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 58 58 58 57 57 57 56 56 57 57 58 57 57 57 57 56 56 55 55 55 55 55 55 54 53 53 52 52 52 53 54 54 54 54 55 56 56 56 56 56 57 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 55 55 54 55 55 55 54 53 53 53 54 53 53 52 52 52 52 51 51 51 51 51 52 52 53 53 52 52 52 52 52 52 51 51 50 49 49 49 49 48 47 47 47 47 47 48 49 49 49 49 49 49 50 51 52 53 53 53 54 54 53 52 52 53 54 54 54 53 52 51 51 50 50 50 50 49 49 49 49 50 50 49 48 48 49 49 48 48 48 47 47 47 46 47 47 47 46 46 46 46 46 45 45 46 46 47 46 46 45 45 46 46 46 45 45 45 45 44 44 44 44 43 42 42 43 43 43 42 41 41 41 40 40 41 42 43 43 43 43 44 44 44 44 43 44 44 44 45 44 43 43 43 43 42 42 41 40 39 38 38 39 40 40 41 41 39 38 38 37 36 36 37 37 37 36 35 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 38 38 40 40 38 37 37 36 36 37 35 34 33 33 33 33 34 36 38 39 39 39 39 39 40 40 39 39 39 38 37 37 37 38 39 40 40 40 41 41 40 41 40 40 41 40 40 41 42 43 44 43 43 42 42 43 42 43 43 43 43 42 43 43 44 44 43 43 42 42 43 42 40 40 39 39 40 41 40 38 36 37 39 40 42 43 43 44 44 43 44 44 44 43 42 42 41 42 43 43 42 42 42 41 41 42 42 43 43 44 44 44 43 43 42 41 40 41 42 42 42 42 43 42 42 42 41 40 40 39 38 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 37 36 35 35 34 32 32 32 33 34 33 33 33 34 34 33 32 32 32 33 33 33 34 34 35 35 36 36 36 35 35 35 35 34 33 33 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 33 33 33 33 32 32 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 34 34 34 34 34 34 34 33 70 70 70 70 69 69 69 69 69 69 69 69 68 68 68 68 67 67 66 66 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 63 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 61 61 60 60 60 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 57 58 59 58 58 58 57 56 56 56 55 55 55 55 54 54 54 53 53 53 52 52 52 52 53 54 55 56 56 55 55 56 57 56 56 56 56 56 57 56 55 54 55 55 55 54 54 54 53 54 54 54 54 54 55 55 54 54 54 54 55 54 53 53 52 52 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 48 47 47 47 47 48 49 48 48 48 49 50 51 51 52 53 53 53 53 53 52 51 52 52 53 54 53 53 52 51 51 51 50 49 49 48 48 48 48 49 50 49 48 48 48 48 48 47 47 47 47 47 47 47 48 47 46 46 46 45 45 45 45 46 46 46 46 46 45 44 45 46 46 45 45 45 44 44 43 43 43 43 42 43 44 43 43 43 42 41 41 40 40 40 41 42 42 42 43 43 43 43 44 44 43 43 44 44 43 43 44 44 44 42 42 41 41 39 38 39 40 40 41 41 41 40 39 39 38 37 35 35 37 36 35 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 39 39 39 38 36 36 35 35 35 33 33 33 33 34 35 35 36 37 38 39 40 40 40 40 39 38 39 39 37 36 37 38 39 40 40 41 41 41 41 40 39 39 40 41 41 41 42 42 42 43 43 42 41 41 42 42 42 42 41 42 42 43 44 44 43 43 43 42 41 41 42 40 39 38 38 39 38 37 36 37 38 39 40 41 41 42 43 44 44 44 45 44 43 42 41 41 41 42 42 41 41 41 41 41 42 43 43 43 44 44 44 43 42 41 40 40 40 40 40 40 41 41 42 42 42 41 40 40 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 35 34 33 32 32 32 34 33 33 33 34 34 32 31 31 31 32 33 33 33 34 35 35 35 36 36 36 36 35 35 34 33 34 35 34 34 34 34 33 33 33 34 34 34 34 34 34 33 32 33 33 33 32 32 33 34 34 34 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 70 69 69 69 69 69 69 69 69 69 69 69 69 68 68 68 68 67 67 67 67 68 68 67 66 66 66 66 66 66 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 57 57 57 58 58 58 58 57 58 59 59 59 59 58 58 57 57 56 55 55 55 55 54 54 54 54 54 53 53 52 52 52 52 53 54 55 56 55 55 55 56 56 55 55 55 55 56 56 55 55 54 54 55 54 54 54 54 53 53 53 53 53 54 54 54 54 54 54 55 55 54 53 53 53 53 53 52 52 52 53 53 52 52 51 51 51 50 50 50 50 50 50 51 51 51 51 50 49 48 47 47 47 47 48 48 48 48 49 50 51 50 51 52 53 52 51 51 51 52 52 52 53 54 54 53 52 51 51 50 50 50 50 49 48 47 47 48 49 49 49 50 49 48 48 47 48 48 48 48 48 48 48 47 47 47 46 45 45 45 45 45 46 46 46 46 45 45 44 45 46 46 46 45 44 44 44 43 43 43 43 43 44 43 43 43 42 41 41 40 40 40 41 41 41 42 43 42 42 43 44 44 43 43 43 43 42 43 43 44 44 42 41 41 41 40 39 41 41 41 41 41 41 40 41 40 39 37 35 35 35 35 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 38 38 38 37 37 36 35 34 33 33 33 33 33 34 36 37 37 37 38 38 38 40 41 41 40 39 38 38 38 37 37 37 38 39 40 41 41 40 40 39 38 39 41 42 42 41 42 41 42 41 42 42 40 40 41 41 41 41 41 42 42 43 44 44 43 41 42 43 42 40 40 40 41 40 38 39 39 37 37 38 38 39 39 39 40 41 42 43 43 42 43 44 44 43 42 41 41 40 40 40 41 41 41 42 42 42 43 43 44 44 44 43 43 42 41 42 41 41 40 39 39 39 40 41 41 41 41 41 40 40 40 40 39 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 34 33 32 32 32 32 33 34 34 33 32 31 31 31 31 33 34 34 34 34 35 35 35 35 36 35 35 35 34 33 33 34 34 34 34 34 34 33 33 34 34 34 34 34 34 33 32 33 34 33 33 32 33 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 33 34 34 34 34 34 34 34 34 34 33 33 33 70 70 69 69 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 67 67 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 62 62 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 59 59 59 59 58 59 59 59 59 59 58 57 57 56 55 55 55 55 55 55 55 55 54 54 54 53 53 52 52 52 52 53 54 54 54 54 56 55 55 56 55 55 55 56 55 55 55 54 54 53 53 54 54 54 53 53 53 52 53 54 54 54 54 54 55 55 54 54 53 53 53 53 52 52 52 53 53 52 52 51 51 50 50 50 50 50 51 51 52 52 51 50 49 49 49 48 47 47 47 47 47 48 48 49 50 49 49 50 51 52 51 51 52 53 53 54 54 54 54 54 53 52 51 50 50 49 50 49 49 49 47 47 47 47 48 50 50 50 49 49 48 49 49 48 47 48 49 48 48 47 46 46 45 45 45 45 45 45 45 46 46 46 45 44 45 45 45 46 46 45 45 45 44 44 44 44 44 44 43 43 43 43 42 41 40 40 40 40 40 41 41 42 42 42 42 43 43 43 44 43 42 42 42 43 44 43 42 41 41 40 39 40 41 42 42 42 41 40 39 40 39 39 38 36 35 34 35 35 34 34 35 35 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 35 35 36 38 38 37 36 36 35 34 33 32 32 33 33 35 36 37 38 38 37 39 39 38 40 41 41 40 39 38 37 37 37 37 38 39 40 41 41 40 39 38 39 39 40 42 42 41 40 40 40 39 39 40 40 39 40 40 40 40 40 41 43 44 44 44 44 43 41 42 43 42 40 39 40 41 40 38 38 38 36 38 39 40 40 41 41 41 42 43 43 42 42 42 42 43 42 42 41 41 40 40 41 42 42 42 42 42 42 42 42 43 44 44 43 43 42 42 42 42 41 40 40 39 39 39 40 40 40 41 41 41 41 41 40 39 38 38 37 37 37 36 36 36 36 36 36 37 37 37 37 37 37 36 35 34 33 32 31 31 33 34 34 33 31 32 32 31 30 32 33 33 34 34 34 35 34 34 35 35 35 35 34 34 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 33 34 34 34 33 33 34 34 34 33 33 33 33 33 34 34 33 33 33 33 33 33 33 33 34 33 33 34 34 34 34 34 34 33 32 33 70 70 70 69 69 69 69 69 69 69 68 68 68 68 68 68 68 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 61 61 60 59 59 59 59 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 59 59 59 58 57 57 57 56 56 56 56 56 56 56 55 55 54 54 54 53 53 52 52 51 51 51 52 52 52 53 53 53 55 55 54 54 54 54 54 55 54 54 53 53 54 54 55 54 53 52 52 53 54 54 54 53 53 54 55 55 54 53 53 52 52 52 52 52 53 53 53 52 52 51 51 51 51 51 51 52 52 52 51 50 49 49 49 49 49 47 47 47 47 47 48 48 49 49 48 48 49 50 50 50 51 52 53 54 54 54 54 55 54 54 53 52 51 50 50 49 49 48 47 47 47 46 47 48 49 50 49 49 49 49 49 49 48 47 47 48 48 49 48 47 45 45 45 46 46 45 45 45 45 46 46 46 45 44 45 45 46 45 45 46 45 44 45 45 44 44 44 44 44 44 43 43 42 41 40 40 40 40 40 40 41 42 41 41 42 42 43 44 44 43 43 42 43 43 43 42 42 41 39 39 41 42 42 42 42 41 40 39 38 37 37 37 36 36 36 37 37 36 35 36 37 36 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 34 35 35 37 37 37 36 36 35 33 32 33 33 34 35 36 37 37 38 39 39 38 38 39 41 41 40 39 38 38 37 37 37 38 40 40 41 41 40 39 38 38 40 41 41 41 41 40 39 39 40 39 39 39 40 41 41 40 41 41 41 42 44 45 46 45 43 42 42 41 41 41 40 40 40 41 39 37 36 36 37 38 40 42 42 41 41 41 42 43 42 41 41 42 42 42 42 41 41 40 40 40 41 41 41 41 41 42 42 42 42 43 43 43 42 42 42 42 41 41 41 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 38 38 38 37 36 36 36 36 36 36 37 37 37 37 37 37 36 36 35 35 34 33 32 32 32 32 32 31 32 33 32 31 31 31 32 33 34 34 35 34 34 34 34 34 34 35 35 34 33 33 34 34 34 34 34 33 34 34 35 35 35 35 34 33 32 33 34 34 33 32 33 33 33 32 33 33 32 33 34 34 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 33 32 69 70 70 70 69 69 69 69 69 68 68 68 68 68 68 68 67 67 67 67 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 61 60 59 59 59 60 60 61 60 59 59 59 60 60 60 59 60 60 59 60 60 60 60 59 59 60 60 59 59 58 58 58 57 57 57 57 57 56 57 56 56 56 55 55 55 54 54 53 53 52 51 51 51 51 51 51 51 52 52 52 52 52 52 52 53 53 53 53 52 53 53 53 54 54 54 52 52 53 54 54 54 53 52 53 54 55 54 54 53 52 52 51 51 51 51 52 52 53 52 52 51 51 51 51 51 52 52 51 51 50 50 50 50 49 49 48 47 46 46 47 47 47 48 48 48 48 48 48 49 50 51 52 52 53 53 54 55 55 54 54 53 52 51 50 50 50 50 49 48 48 48 47 46 47 48 49 49 49 49 49 49 48 48 47 47 46 47 48 48 47 46 46 47 46 45 45 44 44 44 45 45 45 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 42 41 41 41 40 40 40 40 40 40 40 41 41 41 42 43 44 44 43 42 41 42 43 43 42 41 40 40 42 43 43 43 42 41 41 39 38 37 37 36 36 37 38 38 38 36 35 36 36 37 37 35 34 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 35 36 36 37 37 37 36 35 34 33 32 33 34 35 36 37 37 37 38 39 40 40 40 39 40 41 41 40 39 39 38 38 37 37 39 41 41 41 40 39 38 38 40 41 41 41 40 39 38 38 40 41 42 42 41 42 43 42 43 43 42 43 44 44 44 45 44 42 42 42 41 40 40 39 39 41 40 38 36 36 37 39 40 42 43 42 41 41 42 42 43 42 41 40 41 41 40 41 41 40 40 39 39 40 40 41 41 42 42 42 42 43 43 43 43 42 41 41 41 41 41 41 41 40 40 40 39 38 38 39 39 40 40 40 40 40 40 40 39 38 38 37 37 36 36 36 36 37 37 37 37 37 37 36 36 35 35 35 35 34 33 32 31 31 32 32 33 34 33 33 32 32 32 33 34 35 34 34 34 34 34 33 34 34 34 34 33 32 33 34 34 34 34 33 33 34 35 35 34 34 34 33 32 33 34 33 32 32 32 32 32 32 32 32 32 32 33 33 33 32 32 33 32 32 32 33 33 32 33 34 34 34 34 34 34 34 34 32 69 69 69 69 69 69 69 69 69 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 59 59 60 60 60 61 60 60 60 60 60 61 60 60 60 60 60 60 60 61 61 60 60 60 60 59 59 59 58 58 57 57 58 58 58 57 57 57 57 56 56 56 56 55 55 54 54 53 52 52 51 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 52 52 52 53 54 53 52 53 53 53 53 53 52 52 53 54 54 54 54 53 52 51 50 50 50 51 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 48 47 46 46 47 47 47 48 48 48 48 49 49 50 50 51 51 52 53 53 54 54 55 53 52 52 52 51 51 50 50 50 50 50 50 49 47 46 46 47 47 48 48 49 49 49 48 48 48 47 46 46 47 48 47 47 47 47 46 45 45 45 44 44 44 44 44 44 43 43 44 44 45 44 44 45 45 46 46 46 45 44 44 43 43 43 43 42 42 42 41 41 40 40 40 40 40 40 40 40 41 42 43 43 43 43 42 42 42 42 43 42 40 40 41 42 42 43 43 43 43 42 40 39 39 38 38 38 38 39 38 37 35 35 36 37 37 38 38 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 37 38 37 37 36 34 32 32 34 34 34 36 37 38 38 37 38 40 40 40 40 40 41 42 41 40 39 38 37 37 37 37 39 41 41 39 39 38 38 40 41 41 40 40 39 38 38 39 40 42 43 42 41 41 42 43 43 43 43 44 43 43 43 44 44 43 41 41 42 40 39 38 39 40 38 36 37 39 39 40 42 42 41 41 41 42 42 42 42 41 40 40 40 39 40 40 39 39 39 40 40 40 40 41 40 41 42 41 42 42 42 43 43 43 43 42 42 42 42 41 41 40 40 40 40 39 39 38 38 39 40 40 39 39 40 40 39 38 38 37 37 36 36 36 36 37 37 37 37 37 36 36 35 35 35 35 35 34 34 34 33 32 33 34 34 34 34 34 33 33 32 32 34 34 34 34 34 34 33 32 33 33 33 33 32 32 32 33 33 33 33 33 33 34 34 34 34 34 33 32 32 32 33 32 31 31 31 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 34 33 33 32 69 69 69 69 69 69 69 69 69 69 69 69 68 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 61 61 61 60 60 60 61 62 61 60 60 60 60 60 61 62 61 61 60 60 60 60 59 59 59 58 57 58 59 59 58 58 58 58 57 57 57 57 57 56 56 55 54 53 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 51 52 52 52 52 52 52 52 52 52 52 52 52 53 53 54 54 53 52 52 51 50 49 50 51 52 52 53 53 52 52 52 51 50 50 51 51 51 52 51 51 51 50 49 48 47 46 46 47 47 48 48 48 49 50 50 50 51 52 51 52 53 54 54 54 54 53 52 52 52 51 51 51 49 49 49 49 50 49 48 47 46 46 46 47 47 48 49 49 49 49 48 48 46 45 46 48 48 47 46 46 46 45 45 46 45 45 44 44 43 43 43 43 44 45 45 44 44 45 45 46 46 45 44 44 44 43 43 43 43 42 42 42 42 41 41 40 40 40 40 40 40 40 40 41 41 42 42 42 42 43 42 42 42 42 41 41 42 42 41 42 43 43 43 43 42 41 41 40 39 40 40 40 38 36 34 35 37 38 37 38 38 35 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 32 35 36 37 38 37 38 37 34 33 32 33 35 36 36 37 39 40 39 39 40 40 40 40 40 41 41 42 41 40 40 39 38 37 36 37 39 40 40 38 37 37 39 40 39 39 38 38 38 37 38 39 40 41 42 41 41 41 42 43 43 43 43 42 42 42 43 44 44 43 41 41 41 40 38 39 40 39 36 36 38 40 40 41 43 42 40 40 42 42 41 41 42 41 40 40 39 38 39 39 39 40 40 41 42 42 42 42 41 41 41 41 42 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 40 40 39 38 38 38 38 39 39 39 39 39 39 38 38 37 37 36 36 36 36 36 37 38 37 37 36 36 36 35 35 35 35 35 34 34 34 33 33 34 34 35 35 35 34 33 31 31 32 33 34 34 34 34 33 32 33 33 33 32 32 32 32 31 31 32 32 32 33 33 33 33 33 33 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 32 32 69 69 69 69 69 69 69 69 69 69 69 69 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 64 64 63 63 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 61 61 62 61 61 61 61 61 62 61 61 61 61 60 60 61 61 62 61 61 60 60 60 60 59 59 58 58 58 59 59 59 58 57 58 58 57 57 57 57 57 57 56 55 54 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 52 52 52 52 53 53 53 52 52 52 50 49 50 50 51 52 52 52 52 51 51 51 50 49 50 51 51 51 52 52 51 50 50 49 48 46 46 46 47 48 48 49 49 50 51 51 51 52 53 53 53 54 54 54 53 53 53 52 51 50 50 50 49 48 48 48 49 49 49 48 47 45 46 46 46 47 48 48 49 49 48 47 46 45 46 47 47 47 46 46 46 45 46 46 46 45 45 45 44 43 43 43 44 45 45 44 44 44 45 46 46 45 45 45 45 44 43 43 43 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 40 41 41 42 42 43 42 42 41 41 42 43 43 42 42 43 43 43 42 42 42 41 40 39 40 40 39 38 36 35 36 37 38 38 39 39 36 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 33 33 34 36 37 38 36 34 32 32 33 35 37 38 39 39 40 39 40 41 40 39 39 40 40 41 41 40 40 40 40 39 37 36 38 40 40 38 37 37 37 38 38 37 37 37 38 38 39 38 38 39 40 40 41 43 42 42 42 42 43 43 42 42 42 44 44 44 43 41 40 40 39 38 39 41 39 36 37 38 40 41 41 43 42 40 39 41 41 40 41 41 40 39 39 38 38 39 40 40 41 41 42 43 43 43 43 43 41 41 42 43 43 43 43 43 43 43 43 43 42 42 42 42 41 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 37 37 36 36 36 36 36 37 37 37 37 37 37 37 36 36 35 35 35 34 34 34 33 33 34 34 35 35 35 34 33 32 32 31 31 33 34 34 34 33 32 33 34 33 33 33 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 33 33 33 33 33 33 32 69 69 69 69 69 69 69 68 68 69 69 68 68 68 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 61 61 62 62 62 61 61 61 62 62 62 62 62 61 61 60 60 60 61 61 61 60 60 60 60 60 59 58 58 59 59 59 59 58 57 57 57 58 58 58 58 57 57 56 55 54 55 55 55 54 53 53 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 50 51 51 51 51 51 52 52 52 52 52 51 50 49 49 50 51 51 51 51 50 50 50 51 50 49 50 50 50 51 51 50 50 50 49 48 46 46 46 47 48 48 49 49 50 51 52 52 52 53 53 53 53 53 54 53 53 52 52 51 51 50 49 49 49 49 48 47 48 48 47 46 45 45 45 46 46 47 47 47 47 47 47 46 46 45 46 47 47 46 47 46 46 46 47 47 46 46 45 45 45 44 43 43 44 44 44 44 45 45 46 46 46 46 46 45 44 43 43 43 42 43 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 41 41 42 43 42 41 41 41 42 43 42 43 44 44 43 42 42 42 41 41 39 38 39 38 37 36 36 37 37 39 39 39 39 36 33 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 38 37 35 33 32 32 33 35 37 38 39 39 38 38 40 41 40 39 38 39 40 41 40 40 40 39 39 38 36 36 38 39 38 37 36 37 37 37 37 38 38 39 40 40 41 41 40 40 40 40 42 43 43 42 40 40 41 42 41 42 42 42 42 42 43 43 41 40 40 38 37 39 38 36 38 39 41 42 42 42 42 41 39 40 40 40 40 40 40 39 38 38 39 40 40 40 41 42 42 43 43 44 44 43 42 42 42 42 43 44 44 43 43 44 44 43 43 42 42 42 41 40 40 40 40 40 40 40 40 40 39 38 38 38 38 38 37 37 37 37 36 36 35 35 36 36 37 37 37 37 37 37 37 37 36 35 35 35 34 34 34 34 34 35 35 35 35 35 34 34 34 33 31 31 32 32 33 33 31 32 34 34 33 33 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 31 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 33 33 33 32 69 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 63 63 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 58 58 59 59 59 59 58 57 57 57 57 58 59 58 57 57 57 55 54 55 56 55 55 54 54 53 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 51 51 50 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 49 49 49 48 46 46 46 47 47 47 48 49 50 51 52 53 52 52 53 52 52 52 53 53 52 52 52 52 52 51 50 50 50 49 49 48 47 47 46 46 45 45 44 45 46 46 47 47 46 46 47 47 46 45 45 46 46 46 47 47 46 46 47 47 46 46 46 45 44 44 44 43 43 44 44 44 45 45 45 46 46 46 45 45 44 44 44 43 44 44 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 40 40 40 41 41 42 41 40 40 41 41 42 42 43 43 43 43 42 42 42 42 41 39 38 37 37 36 36 37 38 39 39 38 38 39 38 34 32 31 31 32 31 31 32 32 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 37 33 32 32 32 34 35 36 37 39 39 38 38 39 40 40 39 38 40 41 41 40 39 39 38 37 37 36 35 36 36 36 36 37 37 38 38 38 40 40 41 42 42 42 42 43 42 41 41 41 43 43 42 41 40 40 41 41 41 41 41 42 42 42 43 43 42 40 39 37 37 36 36 39 41 42 42 42 42 42 41 39 39 39 39 40 40 39 38 38 39 40 40 40 40 40 41 42 43 43 44 44 44 43 42 42 42 43 44 44 44 44 45 45 44 43 42 42 42 42 41 41 41 40 39 40 40 40 39 39 39 38 38 38 38 37 37 37 37 36 36 35 35 36 36 37 37 37 37 36 36 36 37 36 35 35 35 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 33 32 31 31 31 31 32 34 34 33 33 33 32 32 32 32 31 31 31 31 31 31 32 32 32 32 31 30 30 30 30 31 31 31 31 31 30 30 31 31 31 30 30 30 30 30 31 31 31 31 31 32 32 32 32 32 32 32 33 33 33 33 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 68 68 67 67 67 68 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 57 57 57 57 58 58 58 57 56 56 55 54 55 56 55 55 55 55 54 54 55 54 53 53 52 52 53 53 52 51 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 47 46 46 46 46 47 48 49 50 51 52 53 52 52 51 51 51 51 53 54 52 52 53 52 52 51 50 50 49 49 49 50 49 48 47 47 46 46 45 45 45 45 46 47 46 45 46 46 46 46 44 45 45 45 46 47 47 47 47 47 46 46 46 45 44 44 44 43 43 43 43 44 45 45 45 46 46 46 45 45 44 44 44 44 45 45 44 44 43 43 42 42 42 43 43 42 41 40 40 40 40 40 40 40 40 40 40 41 40 40 40 41 42 42 42 43 44 43 42 42 42 41 40 39 38 37 36 35 37 37 38 40 39 38 37 38 38 37 34 32 31 31 31 31 31 32 32 32 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 32 32 32 33 35 37 39 39 40 39 38 38 39 40 39 38 38 40 41 41 41 40 38 37 36 36 37 37 36 36 37 38 38 39 40 40 39 40 41 43 43 43 43 43 44 43 42 42 43 43 42 42 41 39 40 40 40 40 40 41 42 44 44 42 42 42 41 40 38 36 36 37 39 41 41 41 41 42 42 40 38 37 37 38 38 38 38 39 40 40 41 41 41 40 40 40 41 42 43 44 44 45 44 43 43 43 44 44 44 45 45 45 45 44 43 43 42 42 43 42 41 41 40 40 40 40 40 39 39 40 40 40 39 39 39 39 39 37 37 36 35 35 36 36 36 37 37 37 36 36 36 36 35 35 36 35 35 35 34 34 35 35 35 36 36 36 35 35 35 35 35 35 35 33 31 30 31 32 32 32 32 32 32 33 32 32 32 32 32 31 31 31 31 32 32 32 32 31 30 30 30 30 31 31 31 31 31 30 30 31 31 30 30 30 30 30 30 31 30 30 31 31 31 32 32 32 32 32 32 33 33 33 33 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 68 67 67 67 67 68 67 67 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 62 62 62 62 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 56 56 55 55 55 54 55 56 56 55 55 55 55 55 55 54 54 54 54 53 53 54 53 52 52 52 52 52 52 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 47 48 49 50 52 52 53 53 52 51 51 50 51 52 52 52 52 52 52 52 51 50 49 49 49 48 48 49 49 49 48 47 47 46 45 44 45 46 46 46 45 44 44 45 45 43 43 44 44 46 46 46 46 47 46 46 46 46 45 45 45 45 44 43 43 43 44 45 45 45 45 46 46 46 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 43 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 43 44 43 42 41 42 41 40 39 37 36 36 37 38 38 38 39 39 38 37 37 36 36 35 34 32 31 31 31 31 32 32 32 32 31 31 31 31 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 35 38 40 41 40 37 37 38 39 39 38 38 39 40 41 41 40 39 38 37 36 36 39 40 38 38 39 40 39 40 41 42 41 41 42 43 43 43 44 44 44 44 44 44 43 42 41 40 41 40 39 38 39 40 41 42 43 44 44 42 40 41 41 39 37 35 36 39 40 40 39 40 40 40 39 38 37 37 37 37 37 38 38 39 40 41 42 42 42 41 41 42 42 42 44 44 45 46 45 44 44 44 44 44 44 44 45 45 45 45 44 43 42 42 42 42 42 41 41 40 40 40 41 40 40 41 41 40 40 39 39 38 38 37 37 36 35 35 36 36 36 36 37 37 37 37 36 35 34 35 36 36 35 35 35 35 35 35 36 36 36 36 36 35 35 35 35 35 35 35 34 31 30 31 31 31 31 31 32 32 32 32 32 32 32 32 31 31 31 32 32 32 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 32 32 32 33 33 33 33 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 68 67 67 66 66 67 67 67 67 67 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 56 56 56 55 55 55 54 55 56 56 55 55 55 56 55 54 54 55 55 54 54 54 54 53 52 52 53 53 53 52 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 47 48 49 51 51 52 53 52 51 51 50 50 51 52 52 51 51 52 53 52 51 50 49 48 47 47 49 49 49 49 48 47 46 46 45 44 44 44 44 44 43 43 43 43 43 42 42 43 44 44 45 45 46 46 46 46 45 45 45 46 45 45 44 43 42 42 44 44 44 45 46 45 45 45 45 45 45 45 45 45 45 45 44 43 44 44 43 43 43 43 43 43 42 41 40 40 40 40 40 40 40 40 40 40 40 40 40 41 42 42 42 42 41 41 42 41 39 38 36 37 38 39 39 38 39 40 39 39 39 38 36 35 35 35 33 31 31 31 31 32 32 32 32 31 31 31 31 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 35 37 39 39 39 38 36 37 39 39 38 37 38 40 41 41 41 40 39 37 36 36 37 39 40 39 38 40 41 42 41 42 42 42 43 43 43 43 43 43 44 44 45 45 44 43 41 40 39 41 41 39 38 39 41 42 42 43 43 42 42 40 40 40 38 36 35 38 40 39 38 37 38 38 37 37 37 38 39 39 39 38 39 39 40 40 41 41 42 43 43 42 43 43 44 44 44 44 45 46 45 45 45 44 43 43 43 44 44 44 44 44 43 42 41 41 42 42 42 41 40 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 37 35 35 36 36 36 36 37 38 38 37 36 35 34 34 36 37 36 35 35 35 35 35 36 36 36 36 36 36 36 35 35 35 35 35 34 33 32 32 33 32 30 31 32 32 32 32 32 32 32 32 31 31 32 31 31 32 31 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 31 31 31 32 32 32 33 33 33 33 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 68 67 67 67 66 66 66 66 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 56 56 56 56 56 56 55 54 55 56 56 56 56 57 56 54 54 55 55 54 54 54 54 54 53 52 53 53 53 52 52 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 49 50 51 53 52 51 51 50 49 50 52 52 50 50 51 52 51 50 49 49 48 48 47 48 48 48 48 47 46 46 45 44 43 43 43 43 42 42 42 42 43 42 42 42 42 42 42 43 44 45 46 46 46 45 44 45 45 45 45 44 43 42 42 42 43 44 45 45 45 44 45 45 45 44 44 44 45 46 45 45 44 44 43 43 44 43 43 43 43 43 42 42 41 41 40 40 40 40 40 40 39 39 39 40 41 42 42 41 41 41 41 42 41 38 37 36 39 40 41 40 40 41 40 40 39 39 39 38 38 36 35 33 32 31 31 32 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 34 35 37 38 38 38 37 36 37 39 39 38 38 39 39 39 40 40 40 40 38 36 35 36 39 40 41 40 39 41 42 43 43 42 42 43 43 42 43 43 43 43 44 44 44 44 44 44 42 40 39 40 41 40 38 38 39 40 41 42 42 41 41 41 39 38 37 35 35 36 37 36 36 36 37 36 37 39 39 39 40 40 40 40 40 39 40 41 42 42 42 43 44 44 44 44 44 44 43 44 45 45 45 45 45 44 43 43 43 43 44 43 43 44 43 43 42 41 41 42 43 43 42 42 42 42 41 40 40 39 38 38 39 39 38 38 39 39 38 37 36 36 36 36 37 37 38 38 37 36 36 35 34 36 37 36 35 34 34 35 35 36 36 37 37 36 36 36 35 35 35 35 35 35 35 35 35 34 33 32 31 31 31 31 31 31 32 32 32 32 32 32 31 31 32 31 30 30 31 31 31 31 31 32 32 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 31 31 32 32 32 32 32 33 33 33 69 69 69 69 69 69 68 68 68 68 68 68 68 68 68 67 67 66 67 66 66 66 66 67 68 67 67 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 62 62 62 61 60 60 60 60 60 60 59 59 59 59 59 59 60 60 60 59 59 59 59 58 57 56 56 56 56 56 56 54 55 56 56 57 57 57 57 56 54 54 55 55 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 51 51 51 51 51 51 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 50 53 53 52 52 50 49 49 50 51 50 49 50 51 51 50 49 49 49 48 47 46 47 47 46 45 44 44 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 45 45 45 45 44 45 45 45 44 43 43 42 42 42 43 44 45 45 44 45 45 45 44 44 44 45 46 45 45 45 44 43 43 43 43 42 42 42 42 42 42 42 42 41 40 40 40 40 40 39 39 39 39 40 41 42 41 41 40 41 42 41 39 37 37 39 39 39 39 40 41 40 39 39 37 38 38 37 35 34 33 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 34 34 35 36 36 36 36 36 36 36 38 40 39 38 38 40 39 38 38 39 40 38 36 35 36 39 41 40 41 41 41 43 43 43 43 42 42 41 41 42 43 44 44 44 44 44 43 42 42 43 43 41 39 39 39 38 38 38 40 41 41 42 41 40 41 40 38 36 35 35 36 37 36 37 38 38 39 39 39 39 41 41 40 41 42 42 41 40 41 42 43 42 41 42 43 43 43 44 44 44 43 44 44 44 45 45 45 44 43 43 43 43 43 44 43 43 42 42 42 42 41 42 43 43 43 43 42 42 40 40 40 39 39 38 38 38 37 37 37 38 38 37 36 35 36 37 37 38 38 38 37 37 37 35 34 35 36 36 35 34 34 34 35 36 36 37 37 37 36 36 36 36 36 36 36 35 35 34 34 33 33 33 32 31 31 31 30 30 31 32 32 32 32 32 31 30 31 31 30 30 31 31 31 32 32 32 32 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 31 31 32 32 32 32 32 33 33 33 69 69 69 69 69 68 68 68 68 67 67 67 67 67 67 67 66 66 66 66 66 66 66 67 68 68 67 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 62 62 61 61 60 60 60 60 60 60 60 59 59 59 59 59 60 60 60 60 59 60 59 58 57 57 58 57 56 56 55 54 55 56 57 57 57 57 56 55 54 54 55 55 54 54 55 55 54 53 53 53 54 53 53 52 52 53 53 52 51 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 48 51 52 51 50 50 49 48 49 50 50 49 49 50 50 50 49 48 48 47 46 46 46 45 45 44 44 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 45 44 44 44 44 44 43 44 44 44 42 42 42 43 44 44 44 44 45 45 45 44 44 44 45 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 41 41 41 40 40 40 40 39 39 39 39 40 41 42 42 41 41 40 40 41 40 38 37 38 39 39 39 40 41 40 38 37 36 36 36 35 34 33 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 36 36 37 36 35 36 37 38 39 39 38 37 38 39 39 38 38 38 38 36 35 36 38 40 40 40 41 41 42 42 43 43 41 40 41 41 42 43 43 44 44 44 44 43 42 41 40 41 42 42 40 38 38 37 38 40 41 42 41 42 40 40 40 37 36 35 36 38 39 40 39 39 41 40 40 41 39 39 41 42 42 42 43 42 41 42 42 42 42 42 42 43 43 43 43 43 44 43 43 44 44 45 46 46 45 44 44 43 43 43 43 44 43 43 43 42 43 43 42 41 42 43 43 43 43 41 40 41 40 40 40 40 40 38 37 37 37 37 37 36 35 35 36 37 37 37 38 38 38 37 36 35 34 34 35 35 35 34 34 34 35 35 36 36 37 37 36 36 36 37 36 36 36 36 35 34 34 33 33 32 32 32 32 32 31 29 30 31 31 31 32 31 30 30 31 32 31 30 31 32 32 32 32 32 32 31 31 31 31 31 32 32 32 31 30 30 30 30 30 30 30 31 31 31 31 32 32 32 32 33 33 33 69 69 69 69 68 68 68 68 68 67 67 66 66 67 67 67 67 66 66 66 66 66 66 67 67 67 68 68 68 68 67 67 66 66 66 66 66 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 64 64 63 63 62 62 61 61 60 60 60 60 60 60 60 60 60 60 61 60 60 61 60 60 59 59 59 58 58 57 58 58 58 56 55 55 54 55 55 57 57 57 56 55 55 55 55 55 55 54 54 55 55 54 54 53 54 54 54 53 53 53 53 53 52 51 52 52 52 52 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 48 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 48 50 51 50 49 49 48 49 51 50 48 48 49 49 48 48 48 47 47 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 44 44 44 44 44 44 45 45 45 44 43 42 41 42 43 44 43 43 44 45 45 44 44 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 41 41 41 40 40 40 40 40 39 39 39 39 39 41 42 43 42 41 40 39 40 40 38 37 38 40 40 40 41 41 40 39 37 35 35 35 34 34 34 33 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 37 37 37 39 38 36 36 37 38 39 38 37 37 38 39 39 38 37 36 36 35 36 38 39 39 38 40 41 41 41 42 42 42 41 41 42 43 43 43 43 44 44 43 43 42 42 41 41 40 40 40 41 39 37 37 38 40 42 41 40 40 39 39 37 35 35 36 37 39 40 40 41 41 42 42 42 42 40 40 41 42 42 43 44 44 43 42 42 42 42 43 44 44 43 43 43 43 43 44 44 45 45 45 46 46 46 45 44 44 43 43 43 43 43 44 43 43 43 43 42 41 41 42 42 42 42 42 42 42 41 40 40 40 40 39 38 38 38 37 37 37 36 36 36 36 36 36 37 37 38 37 37 36 35 34 34 34 35 35 34 34 35 35 36 36 36 36 37 37 37 36 36 36 37 37 36 35 34 34 34 33 33 32 32 32 31 30 30 30 30 30 31 31 30 30 31 31 31 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 30 30 30 30 30 30 30 30 31 31 31 32 32 32 32 32 32 33 69 69 69 69 68 68 68 68 67 67 66 66 66 66 66 66 67 66 66 66 66 66 66 66 66 67 67 68 68 68 68 67 67 66 66 66 66 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 62 62 62 62 63 63 63 64 64 64 63 63 62 61 61 61 60 60 60 60 60 60 60 60 61 62 62 62 61 60 59 59 59 58 58 58 58 57 57 56 56 55 55 55 55 55 56 57 58 57 55 56 56 56 56 55 54 55 56 56 55 55 54 54 54 54 54 54 53 53 53 52 51 52 52 52 52 51 51 52 52 52 52 51 51 51 50 49 49 49 49 50 50 49 49 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 45 45 47 50 50 49 49 48 48 50 50 48 48 48 48 48 47 47 46 45 45 45 44 44 44 44 43 43 43 43 43 44 44 44 44 44 45 44 44 45 44 43 43 43 43 42 42 42 42 41 41 42 43 44 45 45 45 46 45 44 44 44 42 42 41 42 43 43 43 43 43 43 44 44 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 42 42 41 40 40 40 40 40 39 39 38 38 39 40 42 42 42 41 40 39 39 39 38 38 40 41 41 41 42 41 39 38 37 36 34 34 34 34 35 34 34 33 32 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 38 38 37 39 39 37 37 38 38 38 37 36 37 39 39 38 37 36 35 35 35 36 38 38 38 39 40 41 40 40 42 42 40 40 41 43 43 42 42 42 43 43 43 43 41 41 42 42 41 40 40 40 40 38 37 38 40 41 40 38 37 38 37 35 35 36 37 38 38 38 39 40 41 42 42 43 43 42 41 41 42 42 44 45 44 43 42 42 41 42 43 43 43 43 43 44 44 43 44 45 45 44 45 45 45 46 45 44 44 43 42 42 43 43 44 43 43 43 42 41 41 41 41 42 42 42 43 43 42 41 40 39 39 40 40 39 38 38 37 37 37 37 37 36 36 36 36 36 37 38 38 37 37 36 35 34 34 34 34 33 33 34 35 36 36 36 36 36 37 37 36 36 35 36 36 37 36 36 35 34 34 34 33 33 32 31 31 31 31 31 30 30 30 30 30 30 30 30 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 29 29 30 30 30 31 31 31 32 32 32 32 32 32 69 69 69 68 68 68 68 68 67 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 68 68 68 68 68 67 67 66 66 66 66 66 65 65 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 61 61 61 61 62 62 62 62 63 64 64 64 63 62 61 61 61 61 61 61 60 60 60 60 61 62 62 62 61 60 59 59 59 59 59 59 59 58 57 56 56 55 55 55 56 56 56 57 58 58 57 56 56 57 56 56 55 54 55 56 56 55 55 54 54 54 55 55 54 54 53 53 52 52 52 52 52 51 51 51 52 53 53 52 52 52 51 50 50 49 50 50 51 51 50 50 50 50 50 49 49 50 50 50 50 49 49 49 48 48 48 49 48 48 48 47 47 46 46 46 46 46 46 46 45 45 45 47 49 49 48 48 47 48 49 48 47 48 48 47 46 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 43 42 41 41 41 41 42 43 44 44 45 45 45 44 44 43 43 41 41 42 42 42 43 43 43 44 44 44 44 43 43 42 43 43 44 44 44 44 44 43 43 43 43 43 42 41 41 40 40 40 40 39 38 38 38 38 40 41 42 42 42 41 39 38 38 38 38 40 41 41 42 42 41 40 38 38 37 35 34 35 36 37 36 36 34 32 32 32 32 32 31 31 31 31 31 31 31 31 32 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 38 37 38 39 39 39 38 37 37 36 36 38 39 39 37 36 35 35 35 36 37 38 38 39 39 39 40 40 41 41 41 40 40 41 41 41 41 43 43 43 43 42 41 40 40 41 40 40 40 39 40 39 38 37 39 40 40 39 38 37 36 35 35 36 37 38 39 39 39 39 39 40 41 41 43 44 43 42 41 41 42 44 44 44 43 42 42 42 43 42 42 42 43 43 43 44 43 44 44 44 44 45 45 45 45 45 45 44 43 42 42 43 44 44 43 43 42 42 42 42 41 41 41 41 42 42 42 41 41 40 39 38 38 38 38 37 36 37 36 36 38 38 36 36 37 37 36 37 37 37 38 37 36 35 34 34 33 34 33 34 34 35 35 36 36 36 36 37 37 37 36 35 35 35 36 36 37 36 34 34 33 33 34 33 32 32 32 32 32 32 31 31 30 30 29 29 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 29 29 30 30 30 30 30 31 31 32 32 32 32 32 69 69 69 68 68 68 68 68 67 67 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 68 68 68 68 68 67 67 66 66 66 66 66 65 65 64 64 63 63 63 63 63 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 61 61 61 61 62 62 63 63 64 63 62 62 62 61 61 62 61 61 61 61 61 61 62 62 61 60 59 59 59 59 59 59 59 58 58 57 57 56 55 55 56 56 56 56 57 58 58 57 57 57 57 56 55 55 55 56 56 56 55 54 54 54 54 55 55 55 54 53 53 53 53 53 52 52 51 51 51 52 53 54 53 52 52 52 51 50 50 51 52 52 51 51 51 51 51 51 50 50 51 51 51 51 50 50 50 49 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 45 45 45 45 46 47 47 47 47 48 49 47 47 48 47 46 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 46 46 46 45 45 45 45 46 45 45 45 45 44 44 44 43 43 42 42 41 41 41 42 42 43 43 44 44 44 44 44 43 42 41 41 41 42 42 42 43 44 44 44 44 44 44 43 42 43 43 44 44 44 44 43 43 42 42 42 42 41 41 41 40 40 40 39 38 38 38 38 39 41 41 42 42 41 40 39 38 38 38 39 40 40 41 41 40 40 40 39 37 36 36 37 38 38 37 37 34 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 36 37 39 40 39 38 37 36 36 38 39 39 38 36 34 34 35 37 38 38 37 38 38 38 38 40 41 42 42 40 40 40 40 41 42 43 43 43 44 43 42 40 40 40 40 39 39 38 39 39 38 37 37 40 40 39 37 36 35 35 35 37 39 39 40 40 41 42 40 39 40 41 42 43 44 44 43 44 43 42 43 43 43 43 42 42 43 42 41 41 43 44 43 43 43 44 44 45 45 45 45 44 44 45 45 45 44 43 42 42 43 43 43 44 44 43 42 43 42 41 41 40 40 41 41 41 41 41 40 39 39 38 38 37 36 37 37 36 37 38 38 37 37 38 37 36 36 36 37 38 37 37 36 35 34 33 34 34 34 35 35 35 35 36 36 36 36 37 37 37 36 36 36 35 35 36 35 34 34 34 34 34 33 32 32 33 33 32 32 32 32 32 31 30 29 30 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 29 29 30 30 30 30 30 31 31 31 32 32 32 32 69 69 69 69 69 68 68 68 68 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 66 66 67 67 68 68 68 68 68 67 66 66 66 66 66 66 65 65 64 64 63 63 63 64 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 62 62 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 62 62 61 60 60 60 59 59 60 59 59 58 57 56 56 56 56 56 56 56 57 58 59 59 58 58 58 58 57 56 55 55 56 56 56 55 55 54 54 54 54 55 56 55 54 53 53 54 54 54 53 52 52 51 51 52 53 54 53 53 53 52 52 51 50 52 53 53 52 52 52 52 52 51 50 50 51 51 52 52 51 51 51 51 50 49 49 50 49 49 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 46 46 46 48 49 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 47 46 47 47 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 42 42 41 41 41 41 41 42 43 43 43 43 43 43 43 42 41 41 41 41 42 43 44 44 44 44 44 44 43 43 42 43 43 44 44 44 43 43 42 42 41 42 41 40 40 39 39 40 40 38 38 38 38 39 40 41 42 42 41 40 39 39 38 38 39 39 40 40 41 40 39 38 38 37 37 38 39 39 39 38 37 34 32 32 32 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 35 35 36 37 38 39 38 39 38 36 36 36 38 39 38 37 35 34 34 35 37 37 36 36 36 37 37 38 40 41 42 41 39 39 40 41 42 42 43 43 43 42 42 41 40 39 39 39 38 38 38 40 39 37 36 38 39 38 37 36 35 35 36 37 38 39 41 42 41 42 43 41 39 39 41 42 42 44 45 45 45 44 43 43 43 43 42 41 41 42 41 41 43 44 45 44 44 44 44 45 45 45 44 44 43 44 44 44 44 44 43 42 42 43 43 43 44 44 44 43 43 43 42 41 40 40 41 41 41 41 40 40 40 40 40 39 38 38 38 37 36 36 37 37 37 38 38 37 36 36 36 37 37 37 37 36 35 34 33 33 34 34 35 35 35 35 35 35 35 36 37 38 37 37 37 37 36 34 34 35 35 35 35 35 35 34 33 33 33 33 33 33 32 32 32 32 31 29 29 30 32 32 32 32 33 32 32 32 32 32 32 32 32 31 31 30 30 30 30 30 29 29 29 29 30 30 30 30 30 31 32 32 32 32 69 70 70 70 69 69 68 68 68 68 68 67 67 67 66 66 65 65 65 66 66 65 65 65 66 66 66 67 68 68 68 68 68 67 67 66 66 66 66 66 66 65 65 65 64 64 64 65 65 65 65 65 65 65 65 65 64 63 63 63 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 60 59 59 60 60 60 60 60 61 61 62 63 62 62 62 62 62 63 62 62 62 62 62 61 62 62 62 61 61 60 60 60 60 60 59 59 58 58 57 56 56 56 56 57 57 57 59 59 59 58 58 58 58 57 56 56 55 56 56 56 55 54 54 55 55 55 55 55 55 54 54 54 54 55 54 54 53 52 53 53 52 53 54 54 53 53 52 52 51 50 52 53 53 53 53 52 52 52 51 50 51 51 52 52 52 52 52 51 51 50 49 50 50 49 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 46 47 46 45 45 45 45 45 45 45 45 45 46 46 46 45 46 47 48 48 48 48 48 47 47 47 47 46 47 47 47 46 46 46 46 46 45 45 44 44 43 43 42 42 41 41 41 41 41 41 42 42 42 43 43 43 43 42 41 41 41 42 42 43 43 43 43 44 44 43 43 42 42 43 44 44 44 43 43 43 43 42 42 42 42 41 40 39 40 40 39 38 38 38 39 40 41 42 41 41 40 40 40 39 39 40 39 40 40 41 40 38 37 37 37 37 38 39 40 40 39 38 36 33 32 32 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 35 36 36 36 37 39 39 38 37 36 35 36 37 38 38 37 36 34 34 35 35 36 36 36 36 37 37 38 40 41 41 41 40 39 39 41 42 41 41 41 42 42 40 40 40 40 38 38 38 37 37 38 39 37 35 35 36 37 36 35 35 35 36 37 39 39 40 41 41 41 41 43 43 42 41 41 42 42 44 45 45 44 44 43 42 42 43 42 40 40 41 41 43 44 44 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 42 42 42 43 44 43 43 43 44 44 43 43 42 42 42 41 41 40 40 41 40 39 40 40 41 40 39 39 40 39 38 37 35 36 37 37 37 37 37 36 36 36 36 36 37 37 36 35 34 34 33 33 34 34 35 35 35 34 34 35 36 36 37 37 38 37 37 37 35 34 34 34 34 34 35 35 35 34 34 33 33 33 33 32 32 32 32 31 30 29 30 31 32 32 32 33 33 33 33 32 32 32 32 32 31 31 30 30 30 30 30 29 29 29 29 30 30 30 30 30 31 31 32 32 33 70 70 70 70 70 69 69 68 68 68 68 68 67 67 67 66 65 65 65 65 65 65 65 65 66 66 66 67 68 68 68 68 68 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 62 62 62 62 62 62 61 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 61 62 62 62 61 61 61 62 63 63 63 63 63 62 62 63 63 63 62 62 61 61 62 61 60 60 59 59 58 58 57 57 57 57 57 57 57 58 59 59 59 58 58 58 57 56 56 56 56 57 56 55 55 55 56 57 56 56 55 55 55 55 54 54 55 54 53 53 53 53 54 54 54 55 54 53 52 52 52 51 50 51 53 53 53 53 53 53 52 52 51 51 52 52 53 52 52 52 51 51 50 50 50 50 49 49 49 48 48 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 47 47 47 46 46 48 49 49 49 49 48 47 47 48 47 47 48 48 48 47 47 46 46 47 46 45 45 44 43 43 43 42 42 42 41 41 41 41 41 41 42 42 42 42 43 42 41 41 41 41 42 42 42 42 43 43 43 43 43 42 42 43 43 44 44 43 42 42 42 42 42 42 42 41 40 39 39 40 39 38 38 38 39 40 42 42 41 41 41 41 40 40 40 40 40 40 41 41 40 39 38 38 39 38 38 39 40 41 40 39 36 33 32 32 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 34 36 37 37 38 39 39 39 37 35 34 35 37 37 38 36 34 34 35 36 37 37 38 37 37 38 39 40 41 42 42 40 39 39 41 41 40 41 42 42 41 41 40 39 39 39 38 37 37 36 36 36 35 35 34 34 34 34 35 36 36 37 37 36 38 39 39 40 40 40 40 41 43 43 41 42 43 43 43 44 45 44 44 43 41 41 42 42 40 40 41 42 43 43 44 45 45 45 45 46 45 44 45 44 44 43 42 42 42 42 42 42 43 44 44 43 43 44 44 44 44 43 42 43 42 41 41 41 40 40 40 39 38 39 40 40 40 39 40 39 38 38 37 36 36 36 36 36 36 35 36 37 36 36 36 36 36 36 36 35 34 33 34 34 34 34 34 34 34 35 35 36 37 37 38 38 38 37 36 35 34 34 33 34 35 35 35 34 34 33 33 33 33 32 32 32 32 32 31 30 29 30 31 32 32 33 33 33 33 32 32 32 32 32 32 31 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 31 32 32 33 70 70 70 70 70 69 69 68 68 68 68 68 68 67 67 66 65 65 65 65 65 65 65 65 66 66 66 67 68 68 68 68 68 68 68 67 67 67 67 67 66 66 65 65 65 65 66 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 60 61 61 62 61 61 61 62 62 63 63 63 63 63 63 63 63 63 63 63 63 63 63 61 61 60 59 59 59 58 57 57 58 58 58 58 58 59 60 60 60 60 59 59 58 58 57 57 57 57 56 56 56 56 57 57 56 56 56 55 55 55 55 55 55 54 54 54 54 54 55 55 55 55 54 53 52 52 52 51 50 52 53 53 53 52 52 53 53 52 52 52 52 53 53 53 52 52 52 51 50 51 51 50 50 49 49 49 48 48 47 46 46 47 47 47 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 47 47 48 49 49 48 47 48 49 49 49 49 48 47 48 49 48 47 48 48 48 47 47 46 46 46 46 46 45 45 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 42 42 41 41 41 40 40 41 41 41 42 42 43 43 43 43 43 42 42 43 44 44 43 41 41 41 41 40 40 40 40 40 39 39 39 38 38 38 38 39 40 42 42 41 40 40 40 40 40 41 41 41 41 41 41 41 39 38 38 40 39 40 40 40 40 39 38 36 33 32 32 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 38 38 38 39 40 39 38 37 35 34 34 36 36 35 34 34 35 36 37 38 39 39 39 39 39 40 41 42 42 40 39 40 41 42 41 41 42 43 43 42 40 40 39 38 39 38 37 36 35 34 34 34 34 34 34 35 36 36 37 38 38 38 38 37 37 38 39 40 41 41 41 42 42 42 43 44 43 44 45 45 45 44 43 42 42 41 41 40 41 42 42 42 43 44 45 45 45 44 44 44 44 44 44 43 43 42 41 41 41 42 43 44 45 45 44 44 44 44 44 44 44 43 43 42 42 41 41 40 40 41 40 38 38 39 40 40 40 40 39 37 37 37 37 36 36 36 35 35 35 36 37 37 36 35 35 36 37 36 35 34 34 34 33 33 34 34 34 34 34 35 35 37 37 38 38 38 37 37 36 35 34 33 33 34 34 34 34 33 33 33 33 33 33 32 32 32 32 32 30 29 30 31 32 32 32 33 33 33 32 32 32 32 32 32 31 31 30 30 30 30 29 29 29 30 30 30 30 30 30 30 31 32 32 33 70 70 70 69 69 69 69 68 68 68 68 68 68 67 67 66 65 65 65 65 65 65 65 65 65 66 66 67 67 68 68 68 68 68 68 68 68 68 67 67 66 66 65 65 65 65 66 66 67 66 66 66 65 66 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 61 60 60 60 60 59 59 59 59 59 59 59 59 60 60 61 61 61 61 61 61 62 62 63 62 61 62 63 63 63 63 63 63 63 63 62 61 61 60 59 59 58 58 58 58 58 58 58 59 59 60 60 60 59 60 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 56 56 55 55 55 54 54 54 54 55 55 55 55 54 53 52 53 52 51 51 51 52 52 52 52 52 52 52 52 53 52 52 53 53 53 53 52 52 51 51 51 51 51 50 50 49 49 49 48 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 47 47 48 49 50 49 49 48 47 48 50 50 49 49 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 46 45 45 44 44 44 44 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 41 42 42 42 42 43 43 42 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 39 40 41 42 41 40 40 40 40 40 41 41 41 41 41 41 41 40 38 39 40 40 41 40 40 40 39 38 36 33 32 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 35 38 39 39 39 39 39 38 37 37 36 34 33 34 33 34 35 37 37 38 40 39 39 40 41 42 42 41 40 40 39 40 42 42 41 40 41 42 43 42 42 39 38 38 37 37 36 35 34 34 34 34 34 36 36 37 37 38 38 38 39 39 40 40 38 37 38 38 38 40 42 41 41 42 43 44 45 44 45 46 45 45 45 44 43 43 41 40 41 41 43 44 44 44 44 45 44 44 43 43 43 44 44 45 44 43 42 41 41 41 42 43 44 44 45 45 45 45 45 45 45 44 44 43 43 44 43 42 41 41 40 40 39 39 39 39 39 40 40 39 38 37 36 35 36 37 36 35 35 35 35 36 36 36 35 35 36 37 36 36 35 35 34 33 33 33 33 33 34 35 36 36 36 37 37 37 37 37 37 36 36 35 34 33 34 34 33 33 33 33 33 32 33 33 32 32 32 32 31 30 29 29 30 31 32 32 33 32 32 32 32 32 32 32 32 32 31 30 30 30 30 29 29 29 30 30 30 30 30 30 30 31 31 31 32 70 70 70 69 69 69 69 69 69 68 68 68 68 67 67 66 65 65 65 65 65 65 65 65 65 66 66 67 67 67 67 68 68 68 68 68 68 68 67 67 66 66 65 65 65 65 65 66 66 67 67 66 66 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 58 59 59 60 60 60 61 61 61 61 62 62 62 61 61 62 62 62 63 62 62 61 61 61 61 60 59 59 59 58 58 58 59 58 58 59 59 59 60 60 59 58 58 58 58 58 57 58 59 59 59 59 58 58 58 58 58 58 57 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 55 54 54 53 53 53 52 51 51 51 52 52 52 52 51 51 52 52 52 52 52 53 53 53 52 52 52 51 51 51 51 50 50 49 49 49 48 48 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 46 46 47 47 48 49 51 51 51 49 48 47 48 49 51 50 49 48 47 47 47 47 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 40 40 41 41 41 42 42 42 42 43 43 43 42 42 42 43 43 43 42 42 41 41 42 42 41 41 40 40 39 38 38 38 38 38 40 41 42 42 42 41 41 40 40 41 41 40 40 41 41 41 40 39 39 40 41 41 40 39 39 39 37 36 33 32 32 32 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 36 38 39 39 38 38 39 38 38 37 35 33 32 33 34 34 35 37 37 38 39 38 38 40 41 42 41 40 39 38 40 42 42 41 40 40 41 41 41 41 41 40 38 38 37 36 34 34 34 34 35 35 36 38 38 39 39 39 39 40 41 41 41 41 40 38 39 39 39 39 40 40 41 42 43 44 44 43 44 45 45 45 44 43 43 43 41 40 41 42 43 44 44 43 44 45 44 43 43 44 44 44 44 45 44 43 41 41 41 42 43 43 43 44 45 45 46 45 45 45 44 44 44 44 44 44 43 43 42 41 40 40 40 40 40 38 38 38 39 39 39 37 36 36 37 38 37 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 35 34 33 33 33 33 35 36 37 37 37 37 37 37 36 36 37 36 36 35 34 33 34 34 34 34 33 33 32 32 32 32 32 32 32 32 31 31 30 29 29 30 31 32 32 32 32 32 32 32 32 32 32 32 31 31 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 31 69 69 69 69 69 69 69 69 69 69 69 69 68 68 67 67 66 65 65 65 65 65 65 65 65 65 66 66 66 66 67 67 68 68 68 68 68 68 67 67 66 65 65 65 65 65 65 65 66 66 66 67 66 66 66 65 65 65 64 64 63 63 63 63 63 64 64 64 64 63 62 62 62 62 62 61 61 60 60 60 59 59 59 59 58 58 58 59 59 60 60 61 61 60 60 61 62 61 60 60 61 62 62 61 60 60 60 60 60 60 59 59 59 58 58 59 60 60 59 60 60 60 59 59 59 58 58 58 58 57 56 56 58 58 58 59 59 58 58 58 58 58 57 56 55 55 55 55 54 54 54 54 54 53 53 53 53 54 54 54 54 53 53 53 52 51 51 51 52 52 52 52 51 51 51 51 51 51 52 52 53 53 52 52 52 52 52 52 51 51 50 50 50 49 48 48 48 47 47 47 47 47 46 46 46 45 45 45 45 45 46 46 46 45 45 46 47 47 48 49 50 51 52 51 50 49 48 48 49 50 50 49 48 48 48 48 47 47 47 46 46 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 43 45 45 46 45 44 43 43 41 41 41 41 41 41 40 40 41 41 42 43 43 43 43 43 43 42 41 42 42 42 42 43 43 42 42 41 41 41 41 40 40 39 38 38 38 38 38 40 41 42 43 43 42 41 40 40 40 40 39 40 40 41 41 41 40 40 40 41 41 40 39 38 38 36 35 34 32 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 37 39 41 40 39 38 37 37 36 34 33 32 33 34 35 36 36 37 36 37 38 38 39 40 41 41 41 40 38 38 40 42 41 40 39 41 41 40 39 39 40 40 39 37 36 34 33 34 35 36 37 38 38 39 39 40 40 39 40 41 42 43 42 42 41 40 39 40 41 41 41 41 42 42 43 43 43 43 44 44 45 44 44 43 42 41 40 40 41 43 44 44 44 43 43 43 43 43 44 44 44 45 44 43 43 42 41 41 41 41 42 43 43 44 44 45 46 45 45 44 44 43 43 44 44 43 43 43 43 42 42 41 40 39 38 39 39 38 37 38 38 38 38 38 38 39 38 36 35 35 35 35 35 35 34 34 35 35 36 35 35 36 35 34 33 33 33 34 35 36 36 37 37 37 36 35 35 36 36 35 35 35 34 34 34 35 35 34 33 33 33 32 32 32 32 32 32 32 32 31 30 29 29 30 31 32 32 32 32 31 31 31 31 31 32 32 31 31 30 30 30 29 29 30 30 30 30 30 30 30 29 29 29 29 30 69 69 69 68 68 68 68 69 69 69 69 69 69 68 67 67 66 66 65 65 65 64 64 65 65 65 65 65 66 66 66 67 67 68 68 68 68 67 67 67 66 65 65 65 65 65 65 65 66 66 66 67 67 66 65 65 65 65 64 64 63 63 63 63 64 65 65 65 64 63 63 62 62 62 61 61 61 61 61 60 60 59 59 59 58 58 58 58 58 59 59 60 60 60 60 60 61 61 60 60 60 61 61 62 61 59 59 59 60 60 60 60 59 59 59 60 61 61 60 60 60 59 59 59 59 59 59 58 58 57 56 56 57 57 58 58 58 58 58 58 57 57 56 56 56 56 56 55 55 54 54 54 53 53 53 52 52 53 52 52 53 52 52 52 52 51 51 51 51 52 52 52 52 52 51 51 51 51 51 52 52 52 53 52 52 52 52 52 52 51 51 50 50 49 49 49 48 48 48 47 47 47 47 46 46 45 45 45 45 46 46 46 46 46 46 46 47 48 48 49 50 52 52 51 50 49 48 48 49 49 50 50 49 49 49 48 47 47 47 47 47 46 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 44 45 46 45 44 45 45 44 42 40 40 40 40 40 40 40 41 42 42 42 43 44 43 43 42 41 42 42 42 42 43 43 42 41 41 40 40 40 40 40 39 38 38 38 38 38 40 42 43 42 42 41 41 40 40 39 40 40 40 41 41 41 41 41 41 41 41 40 39 38 37 37 37 36 33 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 36 38 39 40 39 39 39 37 36 34 32 32 33 34 35 36 37 38 38 37 36 37 38 39 39 40 42 41 40 38 38 40 41 40 39 39 42 42 40 39 39 38 38 38 36 34 33 33 35 37 38 39 40 40 39 40 41 41 41 42 41 42 43 43 43 42 41 40 40 42 43 43 43 42 42 42 43 43 43 44 44 44 44 43 43 42 41 40 41 42 43 44 45 44 43 42 42 42 42 44 44 44 44 43 43 43 42 41 41 42 42 42 42 43 44 44 45 46 46 45 44 44 43 43 43 44 44 43 43 43 43 43 42 41 39 39 40 40 39 38 37 37 38 39 40 39 38 37 37 37 36 36 35 35 35 34 34 34 34 35 35 35 35 35 34 34 34 33 34 35 35 36 36 37 37 36 35 35 35 34 34 34 34 34 34 35 35 35 35 34 33 33 33 32 32 32 32 32 32 32 31 30 29 29 29 31 32 32 32 31 31 30 30 31 31 31 31 31 30 30 30 30 29 29 29 30 31 31 31 30 30 30 29 29 29 30 69 69 69 68 68 68 68 68 69 69 68 68 68 68 67 67 67 66 66 65 65 64 64 64 64 64 65 65 65 66 66 66 67 67 67 67 68 67 67 67 66 66 65 65 65 65 65 65 65 65 65 66 66 66 65 65 65 65 64 64 64 64 64 64 65 65 65 64 64 63 63 62 62 61 61 61 61 61 60 60 60 60 60 59 59 58 58 58 58 58 58 58 59 59 59 59 60 61 60 60 60 60 60 62 61 59 59 59 60 60 60 60 60 60 60 60 61 61 61 60 60 60 60 59 59 59 58 58 57 57 57 57 56 56 57 57 57 58 58 58 58 57 57 56 56 56 55 55 55 55 54 54 53 53 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 51 51 51 51 52 52 52 51 51 51 52 52 51 51 50 50 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 47 47 47 47 48 48 49 50 51 52 52 51 50 49 48 49 49 49 50 49 49 49 49 48 48 47 48 48 47 47 47 47 47 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 44 44 43 41 40 40 40 40 40 40 41 42 43 43 43 44 44 43 43 42 41 42 42 43 43 43 42 42 41 40 40 40 40 40 39 38 38 38 38 38 40 41 42 42 41 41 40 40 39 39 40 41 41 41 41 41 41 42 42 41 40 40 39 38 37 37 38 35 33 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 31 31 31 31 31 32 32 32 32 32 32 36 37 38 39 38 37 38 38 36 35 33 32 33 34 35 37 37 37 38 39 38 38 38 38 38 39 41 41 40 40 38 39 40 39 39 40 41 42 42 40 40 39 37 37 36 34 33 33 34 36 38 38 38 40 41 40 41 42 42 42 41 41 42 43 44 44 43 41 41 42 42 43 43 42 41 41 42 43 43 44 44 43 43 43 43 42 42 41 40 41 43 43 45 45 44 43 42 42 43 43 44 44 43 43 43 43 42 41 41 42 43 43 43 43 42 43 44 44 45 46 46 45 44 44 44 43 43 43 43 43 42 42 42 43 42 40 40 40 40 40 39 38 38 37 38 39 39 38 38 37 37 37 37 36 36 35 35 35 34 33 33 34 34 34 34 33 34 34 34 34 35 35 35 35 36 36 35 35 35 34 34 34 34 34 34 34 34 35 35 35 34 33 32 33 33 32 32 32 31 31 31 31 30 30 29 29 30 32 32 31 31 31 30 30 30 30 31 31 31 30 30 30 30 30 29 29 30 30 30 30 30 30 30 29 29 29 29 69 69 69 68 68 68 68 68 68 68 68 68 68 67 67 67 67 66 66 66 66 65 65 65 64 64 64 64 65 66 66 66 66 66 66 67 68 67 67 67 66 65 65 65 65 65 65 65 65 65 65 65 65 66 66 65 65 65 65 65 65 65 65 65 65 66 65 65 64 64 64 63 62 62 61 60 60 60 60 60 60 60 60 60 59 58 58 59 58 58 57 57 57 58 58 58 59 60 60 60 60 59 60 61 61 59 58 59 59 59 59 59 59 61 61 61 62 61 61 61 61 61 60 60 59 59 58 58 58 58 58 57 56 56 56 56 57 57 57 58 58 58 57 57 56 55 55 55 55 54 54 53 53 53 54 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 51 50 50 51 51 51 51 51 51 51 51 51 51 50 49 49 49 49 49 48 48 47 47 48 47 46 46 47 47 47 48 48 48 49 49 48 48 48 49 50 51 51 52 52 50 49 49 49 49 49 50 50 49 50 50 49 49 48 48 49 49 49 48 48 47 47 46 45 45 45 45 45 45 44 45 45 45 45 45 44 44 43 43 42 42 43 43 43 42 41 40 40 40 40 40 41 43 44 43 43 44 44 43 43 42 41 42 43 43 43 43 43 42 42 41 41 41 40 40 39 38 38 38 38 38 40 41 42 41 41 41 40 40 39 39 40 41 41 41 41 41 41 41 41 40 40 39 38 38 37 37 37 34 32 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 31 31 31 31 31 31 31 32 32 32 32 33 35 37 38 39 38 37 36 36 34 33 32 33 34 36 37 39 39 39 39 40 40 40 39 38 38 40 41 41 40 39 38 39 39 39 41 42 43 43 42 41 40 39 37 35 34 33 33 34 36 38 39 40 40 41 42 42 42 42 41 41 41 42 43 44 44 44 43 42 42 42 42 42 42 41 41 42 43 43 43 43 43 42 41 42 42 42 40 40 40 41 42 43 44 44 43 42 41 42 43 44 44 43 43 42 42 42 41 41 41 42 42 43 43 44 43 43 43 43 44 46 46 45 44 44 44 43 42 42 43 43 43 42 42 42 42 42 42 41 40 41 40 40 40 38 37 38 39 39 39 38 37 37 37 37 37 36 36 36 35 34 33 33 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 35 35 35 34 33 32 33 33 33 32 32 31 30 31 31 31 30 29 29 30 31 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 29 29 29 69 69 69 68 68 68 68 68 68 68 68 68 67 67 67 67 66 66 66 67 67 66 66 66 65 64 64 64 64 65 66 66 66 66 66 66 67 67 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 65 65 65 66 65 65 64 64 65 65 64 63 62 62 61 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 57 57 57 57 57 58 59 59 59 59 60 61 61 60 58 58 58 58 58 58 59 60 61 62 62 62 61 61 61 60 60 61 61 60 60 60 60 60 59 58 57 56 55 55 56 56 57 58 58 58 58 57 56 56 55 55 55 54 53 54 54 55 55 54 54 53 53 53 52 52 53 53 52 52 52 52 52 52 51 51 51 50 50 50 51 52 52 52 51 50 50 51 50 50 51 51 51 51 51 51 50 50 50 50 49 49 48 47 47 46 47 46 46 47 48 48 48 49 49 49 50 50 49 48 49 50 50 51 52 52 52 51 50 50 50 49 49 49 49 49 50 50 50 49 49 49 49 49 49 48 47 47 47 46 46 45 45 46 46 45 44 44 44 44 45 45 45 45 44 43 43 43 42 42 42 42 41 40 40 40 40 40 41 43 45 44 44 43 43 44 43 42 41 41 42 42 42 42 42 42 42 42 41 41 40 40 39 38 38 38 38 38 39 41 41 41 41 41 41 40 39 40 41 40 40 40 41 41 41 41 40 39 40 39 37 37 37 37 37 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 31 31 31 31 31 31 31 31 32 32 32 33 35 36 37 39 39 38 36 35 33 32 32 34 35 36 37 38 39 40 41 41 40 40 41 41 39 40 41 42 41 39 37 37 40 41 42 42 42 42 42 41 40 39 38 36 34 33 33 33 36 38 40 41 42 42 42 42 43 43 40 39 40 41 42 42 42 44 44 43 43 43 43 42 41 41 41 41 42 43 42 41 42 41 40 40 40 40 40 40 40 41 41 41 42 42 42 41 41 41 42 43 42 42 42 41 41 41 41 41 41 41 41 42 43 44 44 44 43 43 44 44 45 45 45 44 44 44 43 42 42 42 43 43 43 42 42 43 43 43 42 41 41 40 40 40 40 38 37 38 39 40 39 38 37 36 36 36 36 36 36 36 35 35 34 34 33 34 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 35 35 35 34 34 33 33 33 32 32 31 30 30 30 30 30 30 29 29 29 30 31 31 30 29 29 29 29 29 29 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 69 69 69 68 68 68 68 68 68 68 67 67 67 67 67 66 66 66 66 66 66 66 67 66 66 65 64 64 64 64 65 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 63 64 65 65 64 63 62 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 58 57 57 57 57 57 57 58 58 59 60 60 61 61 59 58 57 57 57 58 59 60 61 62 62 61 61 61 61 61 62 62 60 60 60 60 60 60 59 58 58 57 56 55 55 55 56 58 58 58 58 57 57 56 55 55 55 54 54 55 55 55 54 54 54 54 53 53 53 54 54 53 53 53 53 53 53 52 52 52 51 50 50 50 50 50 51 51 51 50 49 49 49 50 50 50 50 50 51 51 51 50 49 49 49 48 47 47 47 47 47 48 47 48 49 49 49 49 50 50 50 50 49 48 49 50 50 51 52 52 52 52 52 51 50 50 49 49 48 49 50 50 50 50 50 49 49 49 49 48 47 47 47 47 46 46 46 45 45 45 45 44 43 44 45 45 46 45 44 44 44 43 43 43 42 42 41 41 40 40 40 40 40 42 45 45 43 43 43 44 43 43 42 41 41 42 42 41 42 42 41 42 41 41 41 40 39 38 38 38 38 38 39 40 41 41 42 41 40 40 39 39 40 40 40 40 41 41 41 41 39 38 39 38 37 36 36 38 38 35 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 31 31 31 31 31 31 31 31 31 31 32 35 37 38 38 38 38 36 35 33 32 32 33 35 37 38 38 38 39 41 41 40 40 41 41 41 41 42 42 42 41 40 37 38 41 42 42 41 41 40 41 40 37 37 37 35 33 33 33 34 37 39 40 41 41 41 41 41 42 41 39 39 41 41 41 40 41 43 44 44 43 43 43 42 41 40 41 41 42 42 41 40 39 39 40 40 40 40 40 40 41 42 42 41 41 42 41 41 42 42 43 42 41 41 41 41 40 41 42 43 43 42 42 43 44 44 44 44 44 43 43 44 44 44 45 45 44 44 44 43 41 41 42 42 42 41 41 42 43 43 43 42 41 40 39 39 39 39 38 37 37 39 40 39 38 38 37 36 36 35 35 36 35 35 34 34 33 33 34 34 34 34 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 33 32 32 31 31 30 30 30 30 29 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 29 29 29 29 28 28 29 29 29 29 29 29 69 69 69 68 68 68 68 68 68 67 67 67 67 67 67 66 66 66 66 66 66 66 67 67 66 66 65 65 64 63 64 65 65 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 64 64 64 65 66 66 66 66 65 65 65 65 65 65 66 65 65 65 64 64 63 64 64 64 63 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 58 58 58 58 57 57 57 57 57 58 59 59 59 59 59 58 57 57 57 57 58 59 61 61 62 62 61 61 61 61 61 61 60 59 59 58 59 59 59 58 58 58 57 56 55 54 55 57 57 58 58 57 56 56 55 55 54 54 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 50 50 50 51 51 50 49 48 48 47 47 48 48 49 50 49 48 49 50 50 49 49 50 51 51 51 50 48 48 50 51 51 51 52 52 52 51 50 50 50 49 49 48 48 49 49 50 50 50 50 49 49 49 49 48 47 47 47 46 46 46 45 44 44 44 44 44 44 45 45 46 45 45 44 44 44 44 43 43 42 41 41 40 40 40 40 40 42 44 44 43 43 44 44 43 43 43 42 41 41 41 41 42 41 41 41 41 40 40 39 38 38 38 38 38 38 39 41 41 41 41 41 40 39 39 39 39 40 41 41 41 41 40 40 40 38 37 37 38 36 35 38 39 35 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 31 31 31 31 31 31 31 31 31 31 31 31 34 36 37 38 37 37 37 35 34 33 32 34 36 36 36 39 40 39 40 41 40 40 42 42 43 43 43 43 41 40 41 39 37 38 40 41 40 40 40 40 41 40 38 37 35 34 33 33 34 35 37 39 40 40 40 41 41 41 41 40 39 39 41 41 40 41 42 43 44 44 43 42 42 42 41 40 40 41 41 42 41 39 39 40 41 42 42 42 43 42 42 42 42 41 41 41 41 42 43 43 43 41 40 40 41 42 42 43 44 44 44 44 44 44 43 44 44 44 44 43 42 43 43 43 44 45 45 44 44 43 42 42 41 42 41 41 42 43 43 43 43 41 40 40 39 39 39 39 40 38 37 37 38 38 39 39 38 37 37 35 35 35 35 34 34 34 33 33 33 34 34 34 34 34 34 34 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 32 31 31 31 30 30 30 30 30 30 30 30 29 29 29 29 29 28 28 29 29 29 29 28 28 28 28 28 29 29 29 30 29 29 28 28 28 28 28 28 28 28 28 29 70 70 69 69 68 68 68 68 68 67 66 66 66 66 66 66 66 65 65 65 65 66 66 67 67 66 66 65 64 63 63 64 65 66 66 66 66 67 66 66 66 66 66 66 66 66 65 65 65 64 63 64 65 65 65 65 65 65 65 65 65 65 65 66 66 66 65 65 64 63 63 63 64 63 63 63 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 56 57 57 58 57 57 58 58 57 57 57 57 58 59 60 61 62 62 61 61 61 60 59 59 59 59 58 57 58 59 59 59 58 58 58 57 56 54 54 55 56 57 58 57 56 56 56 55 55 55 56 55 55 55 56 55 55 55 55 55 54 53 53 53 53 53 53 53 54 53 53 52 52 52 52 51 51 51 50 49 49 49 49 49 48 48 49 49 49 49 50 50 50 50 49 48 47 47 48 49 49 49 50 50 49 49 50 50 50 50 50 50 50 50 50 49 48 49 51 51 50 51 52 52 51 51 50 50 49 49 49 48 48 49 49 50 50 49 49 48 48 48 48 47 46 46 46 46 46 45 45 44 44 43 43 43 44 45 45 46 45 44 43 43 44 44 43 43 42 41 41 40 40 40 41 42 44 44 43 43 43 43 42 43 43 42 41 41 41 41 41 41 41 41 40 40 39 39 38 38 38 37 37 38 39 40 41 41 41 41 40 39 39 39 40 41 41 41 41 41 40 39 39 39 36 36 36 36 35 36 37 34 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 31 31 31 31 31 31 31 31 31 31 31 32 35 37 36 36 36 37 37 34 33 33 34 37 39 37 36 38 40 41 40 39 40 42 43 44 44 44 44 43 42 41 40 38 37 39 41 41 40 39 39 40 41 40 39 37 34 33 33 33 34 36 37 39 40 39 40 40 40 40 39 39 39 40 40 41 42 43 43 43 44 44 44 43 41 41 41 40 40 40 41 41 40 39 39 41 42 43 43 43 44 43 42 42 41 41 41 41 41 42 42 43 42 40 39 40 41 42 43 43 43 44 44 44 44 44 43 43 43 44 44 44 43 42 42 42 43 45 45 45 44 43 43 42 41 41 41 41 42 42 43 43 43 41 40 40 40 40 40 41 40 39 38 38 37 37 38 39 38 38 37 36 35 36 36 35 35 34 34 34 34 33 33 33 33 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 32 32 32 31 31 30 31 31 31 30 30 30 30 30 29 29 29 29 29 30 29 29 29 29 28 28 28 28 29 29 29 29 29 28 28 28 28 28 28 28 28 28 28 72 71 71 69 69 68 68 68 68 67 67 66 66 66 66 66 66 65 65 65 65 65 66 67 67 67 66 65 65 64 63 63 64 65 66 66 67 66 66 66 66 67 66 66 66 66 65 65 65 64 63 63 65 65 65 65 65 65 65 65 64 64 65 65 66 66 66 65 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 58 57 57 57 56 56 57 57 57 57 57 57 57 58 59 60 60 60 60 61 61 60 60 59 59 59 59 59 58 57 57 57 58 59 59 59 58 58 57 55 54 54 55 56 57 58 57 57 56 55 55 55 56 56 56 56 55 55 55 55 55 55 54 53 53 53 53 52 52 53 53 53 53 53 53 52 52 52 52 51 51 51 50 50 49 48 48 48 48 48 48 48 49 49 50 49 48 48 47 47 49 50 50 50 50 50 50 50 51 51 51 51 50 50 49 50 50 49 49 49 50 50 50 51 52 52 52 51 51 51 50 50 49 48 48 48 48 49 50 49 48 48 48 48 48 47 46 46 45 45 45 45 45 45 44 44 43 43 43 44 45 46 45 44 43 43 43 43 43 43 42 41 40 40 40 40 41 42 44 44 43 42 42 42 42 42 43 43 42 40 40 41 41 40 40 40 40 39 39 38 38 38 38 37 37 38 39 40 41 41 40 40 40 39 39 40 40 41 41 41 41 41 40 38 38 37 36 35 35 35 35 34 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 34 37 38 37 36 36 36 35 33 32 33 36 38 39 37 36 38 40 40 38 38 39 42 43 43 44 44 44 43 43 42 39 38 38 40 41 42 41 39 38 40 40 39 38 35 33 33 33 34 36 36 37 38 38 38 38 38 37 38 38 38 39 41 41 42 43 43 43 43 43 44 44 44 42 41 42 42 40 39 40 40 39 39 40 40 41 42 42 43 44 43 43 42 42 41 41 41 40 42 42 43 42 40 39 41 42 43 43 42 42 43 44 44 44 43 43 42 42 43 44 44 44 42 41 42 43 44 44 45 45 44 43 43 42 42 41 41 41 42 42 41 42 41 41 40 41 40 41 41 41 40 40 39 37 36 38 39 39 39 38 37 36 36 37 36 36 36 35 35 35 34 34 33 33 33 33 34 35 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 32 33 33 32 32 32 31 31 32 32 31 31 31 30 30 31 30 30 30 30 30 30 30 30 30 29 29 28 28 28 28 29 29 29 29 29 29 29 29 28 28 28 28 28 28 73 73 72 71 69 69 68 68 68 68 67 66 66 66 66 65 65 65 65 65 65 65 65 66 66 67 66 66 66 65 64 63 63 64 65 66 66 66 66 65 66 67 66 66 66 66 65 65 65 64 63 63 63 64 65 65 65 65 65 65 64 63 64 65 66 66 66 66 65 64 63 63 63 63 63 63 63 63 64 64 63 63 62 62 61 60 60 61 61 60 60 60 60 60 60 60 59 59 58 58 58 58 57 56 56 57 57 57 57 57 57 58 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 56 57 57 58 58 58 57 57 57 56 54 54 55 56 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 53 53 53 53 52 52 52 51 51 51 51 51 50 49 48 48 48 48 48 48 48 48 48 49 48 48 48 47 48 50 51 51 51 51 51 50 50 51 51 51 51 51 50 50 50 50 50 50 49 50 50 50 51 51 52 53 52 51 50 49 49 49 49 48 48 49 49 50 50 49 49 49 49 48 47 47 46 46 45 45 45 45 44 44 44 43 43 43 43 44 45 44 44 44 43 42 43 43 43 42 40 40 40 40 40 40 41 43 44 44 43 43 42 41 42 43 42 41 40 40 41 41 40 40 40 40 39 38 38 38 38 38 37 37 38 40 41 41 41 40 40 40 40 39 39 40 40 40 40 41 41 40 38 37 37 36 37 37 36 35 34 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 31 34 37 39 38 37 37 35 33 32 32 33 36 37 39 39 38 38 38 38 38 39 41 43 42 42 44 44 43 42 42 40 38 38 39 41 42 41 40 39 38 40 39 37 36 34 33 33 33 34 36 37 37 37 36 36 37 37 38 38 38 39 40 41 42 42 43 44 43 43 43 43 44 43 41 41 43 43 41 40 40 39 38 39 40 40 41 42 42 43 44 43 43 43 42 41 40 40 40 41 42 42 41 40 40 42 43 43 43 41 42 43 44 45 44 44 43 42 42 43 43 44 44 43 41 41 42 43 43 44 45 45 44 43 43 43 42 41 41 41 41 41 42 42 42 42 42 42 42 41 42 41 40 39 38 36 37 38 39 39 39 38 36 36 37 37 37 37 37 36 36 36 36 36 35 33 33 34 35 36 36 35 35 35 35 34 34 35 35 34 34 35 35 34 34 34 33 33 32 32 32 33 33 32 32 32 32 31 31 31 30 30 31 31 30 30 30 30 30 30 30 30 30 29 29 29 28 28 28 28 29 29 29 29 30 29 29 29 28 28 28 28 73 73 73 72 71 69 69 68 68 68 67 67 66 66 66 65 65 65 65 65 65 65 65 65 65 66 66 66 66 66 65 64 63 63 64 65 65 65 65 65 65 66 66 67 67 67 66 65 65 64 64 63 63 63 64 65 65 65 64 64 63 63 64 65 66 66 66 66 66 66 64 64 63 63 63 63 63 63 64 64 64 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 59 59 59 58 58 57 56 56 57 57 57 57 57 59 60 60 60 60 60 60 60 60 59 59 59 59 59 58 57 56 56 56 56 57 57 57 56 56 56 55 54 54 55 56 55 56 57 57 56 57 57 57 56 55 55 55 54 54 54 54 53 53 53 53 53 53 53 52 52 51 52 52 53 53 53 52 52 52 51 51 51 51 50 49 48 48 48 49 50 50 49 48 48 48 48 48 48 48 48 49 50 51 51 51 51 51 51 51 52 52 52 51 51 50 50 51 51 51 51 50 49 50 51 51 50 51 52 52 51 49 49 49 49 49 48 47 48 49 49 49 50 50 49 49 48 47 47 47 47 47 46 46 45 44 43 43 43 43 43 42 43 43 43 44 44 43 42 42 43 43 42 41 40 40 40 40 40 41 43 44 44 44 43 42 41 42 42 42 41 41 40 41 41 40 40 39 39 38 38 38 38 38 38 37 37 39 40 41 41 41 41 41 41 40 39 38 39 39 40 40 41 41 41 39 39 39 38 39 39 38 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 33 36 38 38 37 35 34 33 32 33 35 36 37 38 39 38 38 39 39 38 40 42 42 41 43 44 43 42 42 42 40 37 39 40 41 41 41 40 39 38 40 39 37 34 33 32 33 33 34 34 35 36 36 36 37 38 39 40 40 40 40 41 41 41 42 42 43 43 42 42 43 43 42 41 42 42 42 42 40 39 39 39 40 40 41 42 42 42 42 43 42 42 42 42 41 39 39 40 41 41 41 39 39 41 42 43 43 42 41 42 43 43 44 44 44 43 42 41 42 42 43 43 42 41 41 41 42 43 44 44 45 45 44 44 43 43 42 41 41 41 41 42 42 43 43 43 43 42 42 41 41 41 40 38 37 36 36 37 38 39 39 38 37 36 37 37 37 37 37 37 37 37 37 35 33 34 35 36 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 33 33 33 32 33 34 34 33 32 32 32 32 32 31 31 31 31 31 31 31 30 30 30 31 31 30 30 30 29 29 29 28 28 29 29 29 29 30 30 30 29 29 29 29 28 28 72 72 73 73 72 71 70 69 68 68 68 67 67 67 66 66 65 65 65 65 65 65 65 65 64 65 65 66 66 66 65 64 63 62 63 64 64 65 65 64 64 65 66 67 68 67 66 66 65 65 64 63 63 62 63 64 65 65 65 64 63 63 64 65 66 66 65 65 66 67 66 65 65 64 63 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 61 61 61 60 60 60 59 58 58 57 56 56 56 56 57 58 59 60 59 59 60 60 60 59 60 59 58 59 60 60 59 57 57 56 55 55 55 56 55 55 56 56 56 55 54 55 55 55 55 56 56 56 56 56 57 57 56 55 55 54 54 54 53 53 53 52 52 52 53 52 52 52 51 51 52 52 53 53 52 52 52 52 51 51 50 50 48 48 48 49 50 51 51 50 49 49 49 48 48 48 48 48 49 50 50 50 51 51 51 52 52 52 52 52 51 50 50 51 51 51 51 51 51 50 50 51 50 50 50 50 51 52 50 49 49 49 49 49 48 47 47 48 48 49 50 49 49 49 48 48 48 48 48 47 46 46 45 44 43 43 43 43 43 42 42 43 44 43 43 42 42 42 42 42 41 40 40 40 40 40 41 42 43 43 44 43 42 41 41 41 42 41 40 40 41 41 41 40 40 39 39 38 38 38 38 38 37 37 38 40 41 42 42 41 40 40 40 40 39 38 39 40 40 41 41 41 40 39 39 39 39 39 38 38 37 36 35 32 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 31 34 38 38 38 36 33 33 33 33 34 37 37 37 38 38 39 41 41 40 38 40 42 41 41 43 43 42 42 41 41 39 38 40 40 40 40 40 40 39 38 39 39 36 33 32 32 33 33 34 35 36 36 36 37 39 41 41 42 43 42 42 43 42 41 42 42 42 43 42 41 42 41 41 42 43 42 41 41 41 39 39 40 40 40 41 41 41 41 42 42 42 41 41 42 41 39 39 41 40 40 39 39 39 41 42 42 42 41 41 43 43 43 44 44 44 43 43 42 41 42 42 42 41 41 42 42 42 43 43 44 45 46 46 45 44 43 43 42 41 41 41 42 42 43 43 43 43 43 42 41 41 41 40 39 39 37 36 37 36 37 38 39 38 36 36 36 35 35 36 36 36 37 36 35 34 35 36 37 37 37 36 36 36 36 35 35 35 35 35 35 35 35 34 34 34 33 33 33 32 32 33 33 32 32 32 32 32 32 32 31 31 31 31 31 31 31 31 30 30 31 30 30 30 29 29 29 28 28 29 30 30 30 30 30 30 29 29 29 29 28 28 71 72 72 73 72 72 71 70 69 68 68 67 67 67 66 66 66 66 65 65 65 65 65 65 64 64 65 65 65 65 64 64 63 62 62 63 63 64 64 64 64 64 65 66 67 67 66 66 65 65 65 64 63 62 62 63 64 65 65 64 63 63 64 65 65 65 65 65 66 67 67 66 65 64 65 65 65 65 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 62 62 62 61 61 61 61 60 59 59 58 58 57 56 55 56 57 57 59 59 58 58 59 60 59 58 59 59 58 58 60 60 59 58 57 57 57 57 56 56 55 54 54 55 55 55 54 54 54 55 56 56 56 55 55 56 56 57 56 55 55 55 54 54 54 54 54 53 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 52 52 51 50 49 48 48 49 50 51 51 51 50 50 50 50 49 49 49 48 48 49 50 51 51 51 51 51 52 52 52 52 53 52 51 51 52 52 51 50 50 51 51 50 50 50 50 49 49 50 51 50 50 51 50 50 49 49 47 46 48 48 48 49 49 49 49 49 49 48 48 47 47 47 46 45 45 44 43 43 44 43 42 41 42 43 43 43 43 43 42 41 41 40 40 40 40 40 40 41 41 42 43 43 43 43 42 41 41 41 40 40 40 41 41 41 41 41 40 39 38 38 38 38 37 37 38 39 39 40 41 41 40 40 40 40 40 39 39 39 39 40 41 40 40 40 39 38 38 39 39 38 37 36 35 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 35 39 37 36 35 32 32 33 34 35 37 40 39 38 39 41 42 42 42 41 40 40 41 42 43 41 41 42 40 39 38 39 41 41 41 41 40 39 40 38 38 38 35 33 32 33 34 35 37 37 38 39 38 39 39 40 41 42 43 43 43 44 43 43 42 41 42 43 42 41 41 41 42 43 43 43 42 41 41 40 39 39 39 41 41 40 41 41 42 43 42 41 41 41 40 39 40 40 39 39 40 41 41 42 42 41 40 41 42 43 43 44 44 43 43 44 44 42 41 41 41 41 41 42 43 43 43 43 43 44 45 46 46 45 44 43 43 42 41 41 42 42 42 43 43 43 43 42 41 41 41 40 39 40 40 39 39 38 37 36 36 37 38 38 38 36 35 35 34 35 35 35 35 34 34 35 36 37 37 37 36 36 37 37 36 35 36 35 35 35 35 35 34 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 31 30 30 30 30 30 30 29 29 29 28 28 28 29 30 30 30 30 30 29 29 29 29 29 29 70 71 72 73 73 73 72 72 70 69 69 68 68 67 67 67 67 66 66 65 65 65 65 65 64 64 64 64 64 64 64 63 63 62 62 62 62 63 63 63 63 64 65 65 66 66 66 65 65 65 65 65 64 63 62 62 63 64 65 65 64 63 63 64 65 65 65 65 66 67 67 66 65 65 65 65 65 65 64 64 64 65 65 65 65 64 64 64 63 63 63 63 63 62 62 62 62 61 61 61 60 60 59 59 59 58 57 55 55 56 56 58 59 58 57 57 58 58 57 58 59 58 58 59 60 60 59 59 59 58 57 57 57 56 55 54 54 54 54 54 53 53 54 56 56 55 54 55 55 55 55 56 55 55 55 55 55 54 54 54 54 53 52 51 51 51 51 51 51 51 51 52 52 52 52 52 51 51 51 50 49 48 48 49 51 52 51 50 50 51 51 51 50 50 49 49 48 48 49 50 50 50 50 50 51 51 51 52 53 53 52 52 52 51 51 51 50 50 50 50 49 50 50 49 49 49 50 51 51 51 50 50 49 49 48 47 47 47 48 49 49 49 49 49 48 48 47 46 46 46 46 46 45 44 43 43 43 42 42 42 42 42 43 44 44 43 42 42 41 40 40 40 40 40 40 41 41 41 42 43 44 43 42 42 41 40 40 40 41 41 40 40 41 40 40 39 38 38 38 37 37 37 39 40 40 40 41 41 41 42 42 41 40 40 39 39 39 40 41 40 40 40 38 37 37 38 39 38 36 36 35 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 32 36 38 37 36 34 32 31 33 35 37 39 40 40 39 40 41 41 42 43 41 39 40 40 41 42 41 41 41 40 38 39 41 41 41 41 41 40 39 40 38 37 36 33 32 33 34 36 37 38 38 39 39 39 39 40 40 41 42 43 42 42 43 43 43 41 41 42 42 41 41 42 43 43 43 42 43 43 43 42 41 39 38 39 40 40 40 40 40 41 42 41 40 41 41 40 39 39 39 39 40 41 42 43 42 41 40 40 42 43 44 44 44 44 42 43 44 43 43 41 40 40 41 41 42 44 44 44 44 43 44 45 45 46 45 45 44 43 42 41 41 42 43 42 42 43 43 43 43 42 42 42 40 39 39 39 40 40 39 39 38 36 36 37 39 39 38 37 37 36 36 35 34 34 34 35 34 34 36 37 37 36 36 37 36 35 35 36 35 35 35 35 35 34 34 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 30 30 30 30 29 29 29 29 28 28 29 30 30 31 30 30 30 30 29 29 29 29 70 72 73 73 73 73 73 73 72 71 69 68 68 67 67 67 67 67 66 66 66 65 65 65 65 65 64 64 64 64 64 64 63 62 62 62 62 62 63 63 63 63 64 65 65 65 65 65 65 65 65 65 64 63 62 62 63 64 65 65 64 63 63 64 65 65 65 66 66 66 66 66 65 65 65 65 65 65 64 63 64 64 64 65 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 60 59 58 57 55 55 55 56 58 58 58 57 57 58 58 57 57 58 58 58 58 59 60 60 60 60 59 57 57 57 56 56 56 55 54 54 54 53 53 53 55 55 55 54 54 55 54 54 56 56 55 55 55 55 55 55 55 55 54 53 52 52 51 51 51 51 51 51 51 51 52 52 51 51 51 51 50 49 48 49 50 51 52 51 51 51 51 52 52 51 50 50 50 49 48 48 49 49 49 50 50 51 51 51 52 53 53 53 52 52 51 51 51 50 49 49 49 49 49 50 49 48 48 49 51 51 50 50 50 49 48 48 47 46 47 48 48 49 49 48 48 48 48 47 46 46 45 45 45 45 45 44 43 42 42 42 42 42 42 43 44 44 43 43 43 42 41 40 39 39 39 40 40 41 41 41 43 44 43 42 42 40 40 40 41 41 41 40 40 40 40 39 39 38 38 38 37 37 38 39 40 41 41 41 41 41 41 41 41 40 40 40 39 39 40 40 40 39 39 38 38 36 36 38 38 37 37 36 35 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 31 31 31 31 31 34 37 37 36 35 34 31 31 33 35 37 38 40 41 41 40 40 39 41 41 39 40 41 39 39 40 39 40 40 38 37 40 41 41 40 38 39 40 39 37 36 35 34 32 32 34 36 37 38 38 38 38 38 39 40 41 41 42 42 41 41 41 42 43 43 42 42 42 42 41 42 43 42 42 42 42 43 44 43 43 42 40 38 38 39 40 41 40 39 40 41 40 40 40 39 39 38 38 39 40 41 42 43 42 41 40 40 41 42 43 43 44 44 43 42 43 43 43 43 41 40 40 41 41 42 43 44 44 44 44 43 44 45 45 45 45 45 44 43 42 42 43 42 42 42 43 43 43 44 43 43 42 41 41 40 40 39 39 40 40 39 38 37 36 37 38 38 38 38 38 37 36 35 35 36 37 35 34 36 37 37 36 35 35 36 35 35 35 35 35 35 35 35 35 35 35 34 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 31 31 31 31 31 31 30 30 30 30 29 29 29 29 29 29 29 30 30 31 30 30 30 30 29 29 29 69 71 73 73 73 72 72 71 72 71 70 69 69 68 68 67 67 67 67 66 66 65 65 65 65 65 65 65 65 65 65 65 64 63 63 63 62 62 62 62 62 63 63 64 65 65 65 65 65 64 64 65 64 64 63 62 63 64 64 65 64 64 63 64 64 64 65 65 65 65 65 65 65 65 64 65 66 66 65 63 63 63 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 60 59 58 57 56 55 55 56 58 58 58 57 57 58 58 57 57 58 58 57 57 58 59 59 59 59 59 58 59 58 57 56 56 56 55 55 54 53 53 53 53 54 55 54 53 53 53 54 56 56 56 56 56 56 55 55 55 55 54 54 53 53 52 52 52 51 51 51 51 51 51 52 51 50 50 50 50 49 49 49 50 51 52 52 51 51 51 51 51 51 51 50 50 50 48 48 48 49 50 50 51 51 52 52 52 53 53 53 52 52 51 51 50 50 49 48 49 49 49 49 49 48 48 49 50 51 51 50 51 50 48 48 47 46 47 48 49 49 49 48 48 48 48 47 47 46 46 45 45 45 44 44 43 42 42 43 43 42 41 42 43 44 44 44 44 43 42 40 39 39 39 39 40 41 41 41 42 43 43 42 41 40 40 41 42 41 41 41 40 40 40 39 38 38 38 38 37 37 39 40 41 41 41 40 40 41 41 40 40 40 40 39 39 39 40 40 39 39 39 38 39 37 36 37 37 37 37 35 34 34 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 34 37 36 34 32 32 32 32 34 36 37 38 40 41 40 39 39 40 40 39 39 40 41 39 37 38 38 38 37 36 37 39 41 42 40 38 38 38 37 35 33 33 32 32 34 35 36 36 36 37 38 39 39 40 41 41 40 41 40 40 41 42 43 43 44 43 41 41 41 41 41 41 41 41 42 43 43 43 43 42 42 41 39 38 37 38 40 41 40 40 40 39 38 38 38 38 39 40 41 41 42 43 43 42 40 40 41 42 42 43 43 43 42 42 42 42 43 43 42 41 41 41 41 41 41 42 43 44 44 44 43 43 44 44 44 44 44 44 43 42 41 41 41 41 42 42 42 43 44 43 43 42 42 42 41 41 39 39 40 40 40 39 39 37 36 36 36 37 38 38 38 37 37 37 37 37 36 34 34 35 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 34 34 34 33 32 32 32 32 32 32 32 31 31 32 32 32 32 32 32 32 32 32 31 31 30 30 30 30 30 30 29 29 29 29 29 29 30 31 31 31 31 30 30 30 29 29 69 70 71 72 72 71 70 70 71 70 70 70 70 69 68 68 68 67 67 67 66 65 65 65 65 65 65 65 65 65 66 65 65 65 64 64 64 63 62 62 62 62 62 62 63 64 64 64 64 64 64 64 64 64 63 62 63 64 64 64 64 64 63 63 63 64 65 65 64 64 64 65 65 64 63 65 65 65 65 64 64 63 63 63 63 63 62 62 62 62 62 62 63 63 63 63 62 62 62 61 61 61 61 60 59 58 57 57 55 55 56 57 57 58 57 57 57 57 57 57 58 58 57 56 57 58 58 58 58 58 58 59 58 57 57 57 56 55 55 55 54 54 53 52 53 54 54 53 53 53 55 56 55 56 56 56 56 55 55 55 55 55 54 53 53 52 52 52 52 51 51 50 50 51 52 51 51 50 50 49 49 49 49 50 51 51 51 51 51 51 51 51 51 50 50 50 50 49 48 49 50 50 50 51 51 52 53 53 53 53 53 52 52 51 51 51 50 49 48 49 49 48 48 48 48 49 49 49 50 50 51 51 50 49 48 47 46 47 48 49 49 49 49 49 49 48 48 47 47 47 46 45 44 43 43 42 42 43 44 44 43 42 41 43 43 43 43 44 43 42 40 39 39 39 39 40 41 41 41 42 43 43 42 41 40 41 42 42 41 41 41 40 40 40 39 38 38 38 38 37 38 39 41 41 41 41 40 40 40 40 40 40 40 40 39 39 40 40 40 39 39 38 37 38 38 36 35 35 35 35 34 34 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 32 34 33 31 31 31 32 34 36 38 39 40 40 39 38 38 39 40 38 38 39 40 40 38 37 38 38 37 36 36 38 39 40 42 41 39 37 36 35 33 32 32 33 33 34 36 36 35 35 35 38 40 40 41 41 40 39 40 40 42 42 42 43 44 43 42 41 40 40 40 40 41 42 43 44 43 42 41 41 41 42 41 40 38 37 37 39 40 40 39 39 38 37 38 39 40 41 41 42 42 43 44 42 41 40 40 41 42 42 43 42 42 42 41 41 42 42 41 41 41 42 43 43 42 42 42 43 44 44 43 42 42 43 43 44 43 42 41 41 40 40 41 40 41 41 41 42 43 43 43 43 43 43 42 42 42 41 39 39 39 39 40 40 39 38 37 35 35 36 36 36 35 36 37 38 37 37 35 35 35 35 35 35 35 34 33 33 34 35 35 35 35 34 34 34 34 34 34 34 33 32 32 32 32 33 32 32 31 31 31 31 32 32 32 32 32 32 32 31 31 30 30 30 30 30 30 29 29 29 30 29 28 29 30 31 31 31 31 31 30 30 29 69 69 70 71 70 70 70 70 70 69 69 69 70 70 70 69 68 67 67 67 66 66 66 65 65 66 66 66 66 66 66 66 66 66 65 65 65 64 63 63 62 62 62 61 62 63 63 63 63 63 63 64 64 63 62 62 62 63 62 62 63 63 63 62 63 64 64 64 63 63 63 64 64 63 63 63 63 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 63 63 63 62 62 62 61 60 60 59 59 58 58 57 57 55 55 55 56 57 57 58 58 58 57 57 57 57 58 58 56 56 57 58 57 57 57 58 58 58 58 57 57 57 56 55 55 55 55 55 53 53 53 53 53 53 53 55 55 55 55 56 55 55 56 55 55 55 54 54 53 53 52 52 52 52 52 52 51 50 50 51 52 51 50 49 49 49 49 50 50 50 50 51 51 51 51 51 50 50 50 50 50 49 48 48 49 50 50 51 51 51 52 52 52 52 52 52 52 51 50 50 50 50 49 49 48 48 47 47 47 48 49 48 48 49 49 51 51 50 49 49 48 46 47 48 48 48 49 49 49 48 47 47 47 48 47 47 46 45 44 44 43 43 44 44 44 43 42 41 42 43 43 43 43 42 41 40 39 39 39 39 39 40 41 41 41 42 42 41 40 40 42 42 42 41 41 40 40 40 40 39 38 38 38 37 37 38 40 40 41 41 41 40 40 39 39 39 40 40 39 39 40 40 41 40 40 40 39 38 37 37 36 35 35 35 34 34 34 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 34 36 37 38 39 39 38 37 37 39 39 38 38 38 38 40 40 38 37 37 37 36 36 37 39 38 38 40 39 38 38 36 33 32 32 32 33 34 35 37 38 37 36 36 37 39 41 41 40 38 39 40 42 43 42 42 43 43 43 42 40 39 40 41 42 43 44 44 45 44 42 40 39 40 41 40 40 40 38 37 37 39 39 38 37 38 38 39 40 42 43 43 43 43 43 42 41 40 40 41 42 43 43 42 41 41 41 41 41 41 41 40 41 42 43 44 44 43 43 43 43 42 42 42 42 42 42 41 42 41 40 40 41 41 42 42 41 41 41 41 42 43 43 43 42 43 43 42 42 41 40 40 39 38 38 38 39 39 39 38 38 37 36 35 35 35 35 35 36 37 37 36 37 38 37 37 36 36 36 33 33 35 35 34 34 34 34 34 34 33 33 34 34 34 33 32 32 32 33 33 33 32 32 31 31 31 31 32 32 32 32 32 31 31 31 30 30 30 30 30 30 30 30 30 29 28 28 29 30 31 31 31 31 30 30 29 68 68 68 69 69 70 70 69 68 68 69 69 69 70 70 70 69 68 67 67 67 67 66 66 66 66 66 66 66 66 66 66 66 65 65 64 64 64 64 63 62 62 62 61 61 61 61 62 62 62 62 63 63 62 61 61 61 61 61 61 62 62 61 62 63 64 63 62 62 62 62 63 63 63 63 63 63 64 64 64 63 63 63 63 63 64 64 63 62 62 63 63 62 62 63 62 62 62 62 61 60 59 58 57 57 57 56 56 55 54 55 56 57 58 59 59 58 57 57 56 57 58 58 57 56 56 57 57 57 57 57 58 57 57 58 57 57 56 55 55 55 54 54 53 52 52 52 52 52 53 54 54 55 55 55 55 55 55 55 55 55 54 54 53 53 52 52 52 52 52 52 51 50 50 50 51 50 49 49 49 49 50 51 51 51 51 51 50 50 50 51 50 50 50 50 49 49 48 48 49 50 50 51 51 51 51 51 52 52 52 52 52 51 50 49 49 49 49 49 48 48 47 47 47 47 47 48 48 49 50 51 50 49 50 49 48 47 46 47 47 48 48 49 48 48 47 46 46 47 47 47 46 46 46 45 44 44 44 44 44 44 42 41 41 42 43 43 43 42 42 41 40 39 39 39 39 39 40 41 41 41 41 41 40 41 42 42 42 42 41 41 40 40 40 39 38 38 38 37 37 39 40 40 40 41 41 42 41 40 39 39 39 40 39 39 40 40 40 40 40 40 40 39 39 38 36 36 37 37 36 36 34 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 35 37 37 37 36 36 37 38 40 40 38 38 39 38 37 38 39 38 35 35 36 36 37 38 38 38 38 39 39 38 37 35 33 32 32 33 34 35 36 37 38 38 38 38 38 37 39 39 39 39 39 41 42 42 43 43 43 42 42 40 40 41 42 43 43 43 43 44 44 44 42 40 39 39 40 40 39 40 40 38 37 38 39 38 37 38 39 40 41 42 43 43 43 43 43 41 40 40 41 42 43 43 42 41 40 40 40 40 40 39 40 40 41 42 43 44 44 43 43 43 43 43 42 41 42 43 42 41 40 40 40 41 42 43 43 43 42 42 42 42 43 43 43 42 42 42 43 42 42 41 40 39 38 39 39 38 38 38 38 37 37 38 38 38 37 37 36 35 34 35 35 35 36 37 37 36 36 35 35 33 32 33 34 34 34 34 34 33 33 33 33 34 34 34 33 32 31 32 33 33 34 33 32 32 31 30 31 32 32 32 32 31 31 31 31 31 31 31 30 30 30 30 30 30 30 29 28 28 29 30 30 31 31 31 30 30 67 68 68 69 70 70 69 69 67 68 68 68 69 69 70 70 70 69 67 67 67 67 66 66 66 66 66 67 67 66 66 66 65 65 64 64 64 64 64 63 63 62 62 62 61 61 60 60 61 61 61 61 61 61 60 60 60 60 59 60 60 60 60 60 61 63 62 61 61 62 63 63 63 63 63 62 62 63 64 64 63 62 62 62 63 64 64 63 63 63 64 64 63 62 62 62 62 62 61 61 61 59 58 58 57 57 56 56 56 55 54 55 57 57 58 58 58 58 57 56 56 58 58 58 56 55 56 57 57 56 57 57 57 58 58 57 57 56 56 55 55 54 53 53 53 53 53 52 52 52 52 53 54 54 54 55 54 54 55 55 55 55 54 53 53 52 52 52 52 52 52 51 50 50 50 50 50 49 49 49 50 50 51 51 50 50 50 50 50 50 50 50 50 49 49 49 48 48 49 49 49 49 50 50 50 50 51 52 52 52 51 51 51 50 49 49 49 49 48 48 48 47 46 46 46 47 47 49 49 49 50 50 49 49 49 48 47 46 45 47 48 48 48 49 48 47 46 46 46 46 46 45 45 46 45 44 44 44 44 43 43 43 42 41 41 42 43 43 43 43 42 41 40 39 39 39 40 40 41 41 41 41 40 40 42 42 42 42 42 41 41 41 40 40 39 38 38 37 37 37 39 40 40 40 41 41 42 41 41 40 39 39 39 39 39 40 40 40 39 39 40 40 39 38 38 37 37 37 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 35 37 36 36 36 36 38 40 40 38 37 38 39 38 37 37 38 36 34 35 35 36 37 38 38 39 39 38 38 37 35 33 32 32 32 33 35 36 36 37 38 39 39 40 39 37 38 39 39 39 41 42 42 41 42 42 43 42 39 39 41 42 42 43 43 43 44 44 44 44 43 41 40 39 38 39 39 40 39 38 37 39 39 38 37 37 39 40 41 42 42 42 41 42 42 41 40 40 42 43 42 41 41 40 39 39 39 39 39 40 41 42 42 42 42 42 42 42 43 44 43 43 42 41 43 43 43 42 41 40 40 41 42 43 42 43 43 43 43 43 42 42 42 41 41 42 43 43 42 41 40 40 39 40 40 40 40 39 39 38 37 37 38 38 38 37 37 37 35 34 34 33 34 36 37 36 36 35 35 34 33 32 32 33 34 34 34 33 32 32 33 34 34 34 33 32 32 32 32 33 33 32 32 32 31 30 30 31 31 32 32 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 29 28 28 29 30 30 31 31 30 30 67 67 69 70 70 70 69 68 67 67 67 68 68 69 69 69 69 70 68 67 67 67 67 66 66 66 67 67 67 67 66 66 66 65 64 64 64 64 64 63 63 63 63 63 62 62 61 61 60 60 60 60 60 59 59 60 60 59 59 59 59 59 59 59 60 61 61 61 61 62 63 63 63 63 62 61 61 62 63 63 63 61 60 61 62 63 63 64 64 63 63 63 63 62 62 62 61 61 61 61 61 60 60 58 58 57 57 57 57 56 55 54 55 56 57 57 57 57 57 56 55 57 58 58 57 55 55 57 57 56 57 57 58 59 58 57 57 56 55 55 54 54 54 55 55 55 55 54 53 52 51 51 53 54 54 53 53 54 55 55 54 54 54 53 53 53 52 52 52 51 51 51 50 51 51 51 51 51 50 50 50 50 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 50 50 50 50 51 52 52 52 52 51 50 51 50 49 49 49 49 48 48 48 47 46 46 46 46 46 48 49 48 49 49 48 48 48 47 46 46 45 45 46 47 48 49 48 47 46 46 45 45 44 44 45 45 44 44 43 43 44 43 42 42 43 42 40 41 42 42 42 43 43 42 40 39 39 39 40 41 41 41 41 41 40 41 42 42 42 43 42 41 40 40 40 39 38 38 37 37 37 38 39 40 41 41 41 41 41 41 40 40 40 40 39 39 39 39 40 39 39 39 40 40 39 38 38 38 38 36 36 35 33 32 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 33 36 36 35 36 38 39 39 39 38 36 37 38 38 37 37 36 35 34 34 35 36 37 38 38 39 40 39 37 36 35 34 33 32 32 33 35 37 37 37 38 38 39 40 41 39 39 40 40 40 40 42 42 40 41 41 42 43 42 39 39 41 41 42 43 44 44 45 44 44 44 44 43 41 40 39 39 39 39 38 37 38 40 40 38 37 37 38 40 41 41 42 42 41 42 41 40 40 41 42 42 40 39 39 39 39 39 39 39 40 41 42 43 44 43 42 41 41 42 43 43 43 42 41 41 42 43 43 43 41 40 39 40 41 42 42 43 44 43 43 43 42 41 41 41 41 41 42 43 42 41 41 40 40 40 41 41 40 40 40 39 37 36 36 37 38 38 37 37 37 36 35 34 33 33 34 35 36 37 36 36 35 33 32 32 33 34 33 33 32 32 33 34 34 34 34 33 32 32 32 32 32 32 32 31 30 30 30 31 31 32 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 29 30 31 31 31 30 67 66 68 69 68 69 69 69 68 67 66 68 69 69 69 69 69 70 69 68 67 68 68 67 67 67 67 67 67 67 67 66 66 65 65 65 64 64 64 63 63 63 64 64 63 63 63 62 62 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 60 60 60 61 62 62 61 61 61 60 60 61 62 63 63 62 60 61 63 63 63 63 63 63 63 63 63 63 62 61 61 61 60 60 60 60 60 59 58 58 58 58 58 57 55 54 54 55 56 57 57 57 57 56 55 57 58 58 57 55 55 56 57 56 55 56 57 58 58 57 56 56 56 56 55 55 55 56 56 55 55 55 54 54 52 51 51 53 53 53 53 54 55 55 54 54 53 53 53 52 52 52 52 51 51 51 51 51 52 52 52 52 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 50 50 50 50 50 51 51 51 51 51 52 52 51 51 50 50 51 50 50 50 50 50 49 49 48 47 47 47 46 45 45 47 47 48 49 49 49 48 47 47 47 47 46 45 45 46 48 49 49 48 47 47 46 45 44 44 44 43 43 43 43 43 43 43 42 42 42 41 40 40 41 41 42 42 42 42 40 38 38 39 40 40 40 40 41 41 40 41 42 42 42 42 41 40 40 40 40 39 38 38 37 37 37 38 39 40 40 41 41 41 42 42 40 40 40 40 39 38 38 38 39 39 39 40 40 40 39 39 38 38 37 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 33 35 34 35 37 40 42 39 38 36 36 38 38 37 36 36 37 34 32 34 37 37 38 40 39 39 39 39 38 35 33 33 32 32 33 35 37 38 38 37 37 38 39 41 42 40 40 41 41 42 42 42 41 40 40 41 42 43 42 40 39 39 41 43 43 44 44 44 44 44 43 44 44 43 41 40 38 38 38 37 37 38 40 40 38 37 37 38 39 41 41 41 41 41 41 41 39 39 41 41 40 39 38 39 40 40 40 40 41 41 41 42 42 44 44 43 43 42 42 43 43 42 42 41 40 42 42 43 42 42 40 39 40 41 42 43 43 44 44 44 43 42 41 41 41 41 41 42 43 43 42 42 41 40 39 39 40 39 39 38 37 37 37 36 35 37 37 37 37 37 36 35 35 34 33 33 32 34 36 36 37 36 34 34 34 33 33 32 32 32 32 32 33 34 34 34 33 32 31 32 32 32 32 32 31 30 30 30 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 31 31 31 30 30 28 29 30 30 31 31 31 66 66 67 68 67 68 69 68 68 67 66 68 69 69 68 68 69 69 70 69 68 68 68 68 68 68 67 67 67 67 67 66 66 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 60 59 59 59 59 59 60 61 61 61 61 60 61 60 60 61 61 62 63 62 61 61 62 62 62 61 62 62 63 64 64 63 62 62 62 61 60 60 60 60 60 60 60 60 59 58 57 57 56 55 54 54 55 56 56 57 57 56 55 56 57 57 56 55 55 56 57 56 55 56 57 57 58 58 57 57 57 57 56 56 56 57 57 55 55 55 54 54 53 52 51 51 52 53 53 54 55 55 54 54 53 53 53 52 52 52 52 51 51 51 51 52 52 52 52 52 51 51 50 50 49 49 49 49 49 49 49 49 49 49 49 50 49 49 50 50 50 50 50 51 51 51 51 51 52 51 50 50 50 51 51 50 50 50 50 49 49 48 48 49 49 48 48 47 46 45 46 47 48 49 49 49 49 48 48 48 48 46 45 45 47 48 48 48 49 48 47 46 44 43 43 43 42 42 43 43 43 43 42 42 41 41 40 40 40 40 41 42 42 41 40 39 38 38 39 39 40 40 41 41 40 40 41 41 42 42 41 40 40 39 39 39 38 38 37 37 37 39 39 40 40 40 40 41 41 41 40 40 39 39 39 39 38 38 38 39 40 40 39 39 39 39 39 38 36 36 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 32 34 34 35 37 39 39 38 36 36 37 39 39 38 36 35 35 33 33 36 37 38 39 40 39 38 38 37 36 34 32 32 32 33 34 35 37 38 38 38 37 37 39 40 40 41 41 41 42 43 42 41 40 40 41 42 43 43 42 41 39 39 41 43 43 43 43 43 44 44 43 43 44 43 41 40 39 38 37 37 37 39 40 39 38 37 38 39 40 41 41 40 40 40 40 40 39 39 40 39 38 38 39 40 41 40 40 41 42 42 42 42 42 43 44 45 45 44 42 43 44 43 42 41 40 41 42 42 42 42 40 39 40 41 42 43 43 44 45 44 43 42 41 41 41 41 41 42 42 43 42 41 41 40 39 39 39 38 38 38 38 38 38 37 35 35 37 37 38 37 35 35 36 36 35 34 33 33 33 34 35 36 36 35 35 34 32 31 32 32 32 33 33 34 34 34 33 31 30 32 33 33 32 32 31 30 30 30 30 30 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 31 32 31 31 30 28 28 30 30 30 31 31 65 65 66 67 66 68 69 67 66 66 66 67 68 67 67 67 68 69 69 69 68 67 68 68 68 68 67 67 67 66 66 66 66 65 65 66 66 65 65 64 64 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 61 61 60 59 59 59 59 59 60 60 60 61 60 60 59 60 61 61 61 62 62 61 60 60 61 61 60 61 62 63 63 62 62 62 62 62 61 61 60 60 60 60 60 60 61 60 58 57 57 57 56 55 55 54 54 55 55 55 55 54 55 56 56 56 55 55 56 56 56 55 55 57 58 58 58 58 57 57 57 57 56 57 57 56 56 55 55 54 54 53 53 52 51 51 52 52 53 54 54 54 54 53 53 52 52 52 52 51 51 51 51 51 52 52 52 52 52 51 51 50 50 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 50 50 51 52 51 50 50 50 50 50 50 49 49 49 49 48 48 48 49 49 49 48 47 47 46 45 45 46 47 48 49 49 49 49 48 47 46 45 45 46 47 47 48 49 47 46 45 44 44 44 44 43 42 42 42 42 42 42 42 41 41 41 40 40 40 40 41 41 41 41 40 39 38 38 39 39 40 40 41 40 39 40 41 42 42 41 40 40 39 39 38 38 38 37 37 38 39 40 40 41 40 40 40 41 41 40 40 39 39 40 40 39 38 38 39 39 39 38 38 38 38 38 37 35 35 35 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 32 33 35 37 37 38 37 35 36 38 38 39 38 36 34 33 32 34 37 38 38 39 39 38 36 36 36 34 33 32 32 32 34 35 35 37 38 39 40 40 37 38 39 40 41 40 41 42 43 41 40 40 41 43 43 42 42 42 41 39 39 41 41 41 41 42 42 44 44 44 43 43 43 42 42 41 40 38 37 38 39 40 39 38 37 39 40 41 41 40 39 40 40 40 39 38 38 39 39 39 39 40 41 42 42 42 42 42 42 42 43 44 44 44 45 45 45 43 43 44 43 43 41 40 40 41 41 41 41 39 39 40 41 41 42 42 44 45 44 43 43 42 41 41 41 40 41 41 42 42 41 40 41 41 40 39 38 39 39 38 37 37 37 37 35 35 37 38 37 36 36 36 36 35 35 35 33 32 32 33 35 36 36 35 34 34 33 32 31 31 31 32 33 34 33 31 30 31 33 33 33 33 32 31 30 30 30 30 30 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 29 28 30 30 30 31 31 63 64 66 66 66 67 68 67 66 65 66 67 67 66 67 68 69 69 69 68 67 66 67 67 68 68 67 67 67 66 66 66 66 66 66 66 66 66 65 65 65 65 66 66 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 61 60 60 60 59 59 59 59 59 59 59 60 59 58 59 60 60 60 60 61 61 61 60 60 60 60 60 61 62 62 63 62 61 61 61 61 61 61 60 60 59 59 59 60 60 60 58 58 58 58 57 57 56 55 54 54 54 54 54 54 54 55 57 56 54 55 56 56 55 55 56 57 58 58 58 57 57 57 57 57 57 57 56 56 56 55 55 54 54 53 53 53 51 51 51 51 51 53 54 54 53 53 53 52 52 52 51 51 51 51 51 51 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 51 50 51 51 50 50 49 49 49 49 49 49 50 50 50 50 50 51 52 51 51 50 49 49 49 49 49 48 48 48 48 48 48 49 49 49 48 47 47 47 46 45 45 46 47 48 49 49 49 48 47 46 45 45 45 46 47 48 48 47 46 45 44 45 45 45 44 43 43 42 42 41 41 41 41 41 40 40 40 40 39 39 40 41 41 40 39 38 38 38 39 40 40 40 39 39 40 42 42 41 40 40 40 39 38 38 38 37 37 37 38 39 40 40 41 41 40 39 40 40 40 40 40 40 40 40 38 37 38 38 38 38 38 39 39 39 38 37 36 36 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 34 36 37 37 35 35 37 38 38 39 38 35 34 33 32 34 36 38 38 39 38 38 36 35 34 33 33 32 32 33 34 35 37 38 39 40 41 40 38 38 40 41 40 39 41 41 41 40 39 41 42 43 43 41 41 42 40 38 39 41 42 42 42 42 43 44 44 45 44 43 43 43 42 41 40 39 37 37 39 39 39 37 37 39 40 40 40 40 39 39 40 39 38 38 39 40 40 40 40 41 41 41 42 42 44 43 42 42 44 44 44 44 43 44 44 44 43 42 43 43 42 42 41 40 41 41 40 39 40 41 41 41 41 42 44 44 43 43 43 41 41 41 41 40 41 41 42 43 43 41 41 40 39 39 40 40 40 39 38 38 39 39 37 35 35 35 35 35 36 35 34 34 35 36 35 34 32 32 34 35 36 35 34 34 34 33 32 31 30 31 32 33 31 30 31 32 32 32 32 32 31 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 30 28 29 30 30 31 31 63 63 64 65 65 66 67 67 66 66 66 67 66 66 67 69 68 68 68 67 66 66 66 67 68 68 67 67 67 66 66 66 66 66 66 66 67 66 66 66 65 65 66 66 66 65 65 64 64 64 64 64 63 63 63 63 64 64 63 63 62 61 61 61 61 60 59 59 59 58 58 58 58 57 57 58 59 59 59 60 60 61 61 60 60 60 60 60 61 61 61 62 62 61 61 61 61 61 61 61 60 60 59 59 59 60 60 59 59 59 58 58 57 56 55 55 55 54 54 54 54 54 54 56 56 55 54 56 56 55 55 56 56 57 58 58 57 57 57 56 57 57 56 56 55 55 55 55 55 54 53 53 52 52 51 50 50 51 52 53 53 53 53 53 52 52 52 51 51 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 49 49 49 49 49 50 50 50 51 51 51 51 51 51 50 50 49 48 48 48 48 48 48 49 49 49 49 50 50 49 48 48 48 47 46 45 45 46 47 48 49 49 49 48 47 46 45 45 45 46 47 48 48 47 46 46 46 45 45 44 44 44 43 42 42 41 41 41 41 41 41 40 40 39 39 40 40 41 40 39 38 38 38 39 39 40 40 39 39 40 41 41 41 40 40 40 39 38 38 37 37 37 37 38 39 40 41 41 41 40 39 39 40 40 40 41 41 40 39 38 37 37 37 38 39 39 40 40 39 38 37 37 37 36 35 33 31 31 31 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 36 37 36 34 35 36 37 39 39 37 34 33 32 33 35 36 37 39 40 38 37 35 35 33 32 33 33 33 35 36 37 38 39 40 40 41 39 38 39 40 40 39 40 41 40 39 39 40 41 42 42 42 41 40 40 39 38 40 42 43 44 44 43 43 44 44 44 44 43 43 42 41 41 41 39 37 37 38 38 37 37 38 39 40 40 40 39 39 38 38 38 39 40 40 41 41 41 41 41 41 41 42 42 44 44 43 44 45 44 44 44 43 42 43 44 43 42 42 43 43 43 42 40 41 41 40 39 40 41 41 41 42 43 43 43 43 43 42 40 40 40 41 41 41 42 43 43 43 42 40 40 41 41 40 40 41 40 38 38 38 38 37 37 36 35 34 34 34 33 33 33 34 36 36 35 34 32 32 34 36 36 35 35 35 33 32 31 31 32 32 32 31 31 31 31 31 31 31 31 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 28 27 29 30 30 31 63 63 63 63 64 65 66 66 67 66 65 65 65 66 67 68 67 67 67 67 66 66 67 68 69 68 68 67 67 66 66 66 66 66 66 67 67 67 66 66 65 65 65 66 66 66 65 64 64 64 64 64 64 64 64 64 64 64 64 63 63 62 62 62 61 61 60 59 59 58 58 58 57 57 57 57 58 58 59 59 59 60 60 60 59 59 60 60 61 61 60 60 61 61 60 60 61 61 61 61 61 60 60 59 59 59 59 60 60 59 58 57 57 57 56 56 55 56 55 55 54 54 53 54 55 54 54 55 55 55 55 55 56 57 57 58 57 56 56 56 57 57 56 56 55 55 55 55 55 55 54 54 53 52 52 51 50 50 51 52 53 53 53 53 52 52 52 51 51 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 51 50 50 50 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 51 52 51 51 50 50 50 50 49 49 49 50 49 49 49 50 50 50 51 51 50 48 48 48 47 47 46 45 45 47 47 47 48 49 48 47 47 45 44 44 45 46 46 48 48 47 47 47 46 45 45 44 44 44 43 43 42 41 41 41 42 42 41 40 40 39 39 40 40 40 39 39 38 38 38 39 39 40 39 39 40 41 40 40 40 40 40 39 38 37 37 37 37 38 39 40 41 40 40 41 40 39 39 40 40 40 41 41 40 39 38 37 37 38 39 39 40 40 40 39 38 38 37 36 35 34 33 32 31 31 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 34 36 35 34 35 37 37 38 38 38 36 34 33 32 34 36 37 38 39 39 37 36 35 34 34 33 32 33 34 36 37 38 38 38 38 40 40 39 39 40 41 39 38 40 40 39 40 41 42 43 43 43 42 41 39 38 38 38 40 42 43 44 44 43 43 43 43 44 44 43 42 42 41 40 40 39 37 37 38 39 37 37 39 40 40 40 40 39 38 38 39 39 40 41 41 42 41 42 42 41 41 42 43 43 43 43 44 44 45 45 45 45 42 41 42 42 42 42 42 43 43 43 42 41 40 41 40 39 39 41 41 42 43 42 42 42 41 41 41 40 40 41 42 42 43 43 43 43 43 42 42 41 41 41 40 40 40 39 38 38 37 37 37 37 37 36 35 34 34 35 34 33 33 35 36 35 35 34 32 33 35 36 36 36 36 34 33 31 31 31 32 32 31 30 30 31 31 31 31 31 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 30 30 29 27 28 30 30 30 63 63 63 63 63 64 65 66 66 65 65 65 66 66 68 68 67 67 66 66 66 66 68 69 69 69 69 68 67 66 66 66 67 66 67 68 68 67 66 66 66 65 65 66 67 66 65 64 64 64 64 64 64 64 64 64 64 64 64 64 63 62 62 62 62 62 61 60 60 59 59 58 58 58 57 57 57 57 57 58 58 59 59 60 59 58 59 60 60 60 60 60 60 60 60 59 60 60 60 61 61 60 60 59 59 58 58 59 59 58 57 57 57 57 57 57 56 57 57 56 55 54 53 53 54 53 53 54 55 55 54 54 55 56 56 56 56 56 55 55 57 57 56 55 55 55 55 54 54 54 54 54 53 53 53 52 51 50 50 50 51 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 51 50 50 50 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 50 51 52 51 50 50 50 50 50 50 50 51 51 50 49 50 50 50 50 50 50 49 48 48 48 47 47 46 45 45 45 46 46 47 48 48 47 46 45 45 44 44 45 46 47 48 47 47 46 46 46 46 45 44 43 43 43 42 41 42 43 43 43 42 41 40 40 39 39 39 39 40 39 38 38 38 38 38 39 38 38 40 41 41 40 40 40 40 39 38 37 37 37 37 38 39 40 41 40 40 41 40 39 38 39 40 41 41 40 40 40 39 37 38 39 39 40 41 40 40 39 38 37 36 36 36 35 34 32 32 31 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 32 33 33 34 36 38 39 38 38 36 35 35 33 32 35 37 37 38 37 37 36 35 33 32 33 33 32 33 35 36 36 38 37 37 38 39 39 40 40 41 41 39 39 39 39 40 42 43 43 43 43 42 42 40 38 38 39 40 41 43 43 43 43 43 42 43 43 43 43 42 42 42 41 39 38 38 37 38 39 39 37 38 39 40 40 40 39 38 38 39 40 41 41 40 41 41 41 42 41 40 41 42 43 43 42 43 44 43 44 45 45 45 43 41 41 41 42 42 42 43 43 42 42 41 40 41 40 39 40 41 42 43 43 42 41 41 41 40 40 41 42 42 43 43 43 43 43 42 42 43 44 42 41 41 41 41 40 39 39 38 37 37 36 35 35 35 35 34 36 37 36 34 33 33 35 35 35 35 33 32 34 36 35 35 34 33 32 32 32 31 32 33 30 31 32 32 32 31 31 31 31 31 30 30 30 30 31 31 31 31 31 30 30 30 30 29 29 29 29 29 29 29 29 30 30 30 30 29 29 28 28 30 30 30 63 63 63 63 63 63 64 65 66 65 65 66 67 67 68 68 67 66 66 66 66 66 67 68 69 69 69 68 68 68 68 67 67 67 67 67 68 67 67 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 62 62 61 60 60 60 59 59 58 58 57 57 57 57 57 57 58 58 59 58 57 59 59 59 59 60 60 60 60 59 58 59 60 60 60 60 60 60 59 59 59 58 58 59 59 58 57 57 57 57 57 57 57 57 56 55 54 53 53 53 53 53 54 55 55 55 54 54 54 55 55 55 55 54 54 56 56 56 55 55 55 54 54 53 53 54 53 53 53 52 52 51 51 50 49 50 51 52 52 52 52 53 52 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 51 51 50 50 50 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 50 51 50 50 49 49 49 50 50 50 50 50 51 50 50 50 50 49 49 49 49 48 48 47 46 46 46 45 44 44 45 45 46 47 48 48 47 46 45 44 43 44 46 47 47 46 45 45 46 46 45 44 44 43 43 42 41 42 42 43 43 43 42 41 41 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 39 41 41 40 40 40 40 39 38 37 37 37 38 39 40 40 41 40 40 40 40 39 39 40 41 41 41 40 40 39 38 37 38 39 39 40 40 40 39 38 38 38 37 36 36 35 34 34 33 31 31 31 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 32 35 37 38 38 38 38 37 35 35 33 32 35 38 38 37 36 36 34 32 31 31 31 32 33 35 34 34 34 35 36 36 38 38 39 40 40 40 41 39 39 39 38 41 43 42 42 43 42 40 40 39 38 39 41 41 42 43 43 43 43 42 42 43 43 43 42 41 41 42 41 40 39 38 37 38 39 38 38 39 40 40 40 39 38 37 38 40 40 41 40 40 40 40 41 41 41 40 40 41 41 42 42 43 43 43 43 44 43 43 43 41 41 42 43 44 44 44 44 43 42 41 40 40 39 39 41 42 43 43 41 41 41 41 40 40 41 42 43 44 44 43 42 42 42 41 42 43 43 42 41 41 41 41 41 40 39 37 37 37 36 36 35 35 36 36 36 37 36 35 33 32 33 35 35 35 34 32 33 35 35 35 34 33 33 33 32 30 31 31 30 32 33 32 32 32 33 33 33 32 30 30 30 30 31 31 30 30 31 31 30 30 30 30 30 29 29 29 29 29 29 30 30 30 30 29 29 28 28 29 29 30 63 63 63 63 63 63 63 64 66 65 64 66 66 67 67 67 66 65 65 66 66 66 66 66 68 69 68 68 69 69 68 67 67 67 67 67 68 67 67 67 67 66 66 66 66 66 66 66 65 65 65 66 66 66 65 65 65 65 64 64 64 64 64 64 63 63 62 62 61 61 60 60 60 59 59 58 58 57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 59 59 58 58 59 59 59 60 60 60 60 60 60 59 58 58 59 59 58 58 57 57 58 58 58 58 56 55 55 54 53 53 52 52 53 54 54 55 54 53 54 54 54 54 54 54 54 55 56 56 56 56 55 55 54 53 53 54 54 53 53 53 52 52 51 51 49 49 49 51 51 51 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 49 49 49 49 50 49 49 49 50 50 50 50 50 51 51 51 51 50 49 49 48 48 48 47 47 47 46 46 45 45 44 44 45 46 47 48 48 47 45 44 44 43 44 45 46 47 46 46 45 45 45 44 43 43 42 42 43 43 43 43 42 42 43 42 41 41 41 40 40 39 39 38 38 38 38 38 38 38 38 38 38 39 40 41 40 40 40 40 39 38 37 37 37 39 40 40 41 41 40 40 40 40 39 39 40 40 41 40 40 39 38 37 37 38 39 39 40 40 40 40 40 39 38 37 36 36 35 35 36 35 32 31 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 32 35 37 37 36 37 38 38 36 34 32 32 35 37 36 36 36 34 32 31 31 31 32 34 34 35 35 35 35 35 35 35 36 37 38 39 40 40 40 39 38 39 40 42 42 41 42 41 40 39 38 37 39 40 40 41 42 42 41 41 41 41 42 43 43 42 41 40 41 41 41 41 40 38 37 37 37 37 39 40 41 41 40 39 37 38 40 41 40 40 40 40 40 40 41 40 40 40 40 40 41 41 42 42 41 42 43 42 41 42 42 41 41 42 43 44 45 44 44 44 42 41 41 39 39 40 41 42 42 41 40 40 40 40 39 40 41 43 43 44 45 44 42 42 42 41 42 43 43 43 42 41 41 40 39 38 38 38 39 38 37 37 37 37 38 37 36 36 36 34 33 32 32 33 34 35 35 34 33 34 35 36 36 35 34 34 33 32 31 31 31 31 32 32 32 33 34 34 33 32 31 31 30 30 30 30 30 30 31 31 31 31 30 30 30 30 30 29 29 29 29 30 30 30 29 29 28 28 29 29 29 30 63 63 63 63 63 63 63 63 64 64 64 65 66 66 66 65 65 65 66 66 66 66 66 66 67 68 67 68 69 69 69 67 66 66 66 66 67 67 67 67 67 67 66 67 67 66 67 67 66 65 66 67 67 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 62 61 61 61 61 60 60 59 59 58 57 57 56 56 56 56 56 56 57 57 57 57 58 57 57 57 58 58 57 58 58 58 59 60 60 60 60 60 59 58 57 58 59 59 58 58 58 58 58 58 58 57 56 55 55 54 53 53 52 52 52 53 55 55 53 53 53 54 55 55 54 54 55 56 56 55 55 55 55 54 53 52 53 54 53 53 53 53 52 52 52 51 50 49 49 50 51 51 51 51 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 49 49 50 50 50 49 50 50 51 51 51 50 49 49 48 47 47 47 47 48 48 47 46 46 45 44 44 45 46 48 47 46 45 44 44 43 43 44 46 47 47 47 46 44 44 45 44 43 43 43 44 44 44 43 43 42 42 42 42 41 41 40 40 40 39 39 39 38 38 38 38 38 38 38 37 38 38 40 40 40 40 40 39 38 38 37 37 38 39 40 41 41 41 41 40 39 39 39 40 40 41 40 39 38 38 37 37 38 39 39 39 39 40 39 39 39 38 38 37 37 36 36 37 36 34 32 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 33 36 36 36 37 37 37 35 33 32 33 36 36 35 35 35 33 31 31 32 33 34 36 36 36 36 37 38 36 35 37 37 36 37 40 40 39 39 38 38 40 41 41 41 41 41 39 39 39 37 38 39 40 41 42 41 40 40 40 40 41 42 42 42 41 40 40 40 40 39 40 40 38 37 37 37 39 40 40 41 41 40 39 37 38 40 40 39 39 40 41 41 40 40 40 39 40 41 42 42 42 42 41 40 41 42 42 41 41 41 41 42 42 42 43 43 43 42 42 42 42 41 39 38 40 42 42 41 40 40 40 41 41 41 41 41 42 42 43 44 45 44 43 43 42 41 42 41 42 42 41 40 38 37 38 39 40 40 38 37 37 37 38 38 37 36 36 35 33 34 33 33 33 32 34 34 34 33 33 34 35 36 36 35 35 35 34 33 33 31 30 31 31 32 33 34 33 33 33 32 32 31 30 30 29 29 31 32 32 31 31 31 30 30 30 30 29 29 29 30 30 30 30 29 28 27 27 28 29 29 29 65 65 64 63 63 63 63 62 62 63 63 64 65 65 65 64 63 65 66 66 66 66 65 65 65 66 66 67 68 69 69 68 67 66 66 66 66 66 67 67 67 67 67 67 67 66 67 67 66 66 66 67 67 67 67 66 65 66 66 66 64 63 63 63 63 63 63 63 62 62 61 61 61 61 60 60 59 58 58 58 57 56 56 56 56 56 56 56 57 57 58 57 57 57 57 58 57 57 57 58 59 60 60 60 60 60 59 58 57 57 58 58 59 59 58 58 58 58 58 58 57 56 55 55 54 53 52 52 52 53 54 55 53 52 53 55 55 56 55 55 55 56 56 55 55 55 55 55 53 52 52 53 53 54 53 53 53 52 52 52 50 49 49 50 50 51 51 51 52 52 52 51 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 48 48 49 49 49 49 49 50 51 51 51 52 51 50 49 48 48 48 47 46 46 47 47 46 46 46 44 44 44 46 47 47 46 45 44 44 43 43 44 45 46 47 47 47 46 45 46 45 44 44 44 43 44 44 44 44 43 42 42 42 42 41 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 37 38 39 39 39 39 40 39 39 38 37 37 37 39 41 41 40 40 40 40 39 39 40 40 40 40 38 38 38 37 37 38 39 40 39 39 39 38 38 38 38 39 39 38 37 37 38 36 34 33 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 33 34 36 35 35 34 33 32 32 34 35 35 36 36 35 32 31 32 32 33 35 36 37 37 38 37 37 37 37 38 38 37 38 40 40 38 37 38 39 41 41 40 41 42 41 39 38 38 38 38 39 40 41 41 41 40 40 41 41 41 42 42 42 40 40 40 40 39 38 39 38 37 36 37 39 40 40 40 41 40 40 38 37 38 39 39 39 39 40 41 41 40 40 39 39 41 42 42 41 42 41 40 40 41 41 40 40 40 41 42 42 42 42 43 43 43 41 41 40 41 40 39 39 41 42 41 40 39 39 41 42 43 43 42 41 42 43 44 45 45 45 44 43 42 41 40 40 40 41 41 40 40 39 39 41 41 41 40 38 38 38 37 37 37 38 37 35 33 34 35 35 34 32 32 32 33 32 32 32 34 35 35 35 36 36 35 34 34 32 32 32 31 32 34 33 33 33 34 33 32 31 31 31 30 29 30 31 32 32 32 32 31 31 31 30 29 29 29 30 30 30 29 29 29 28 27 27 28 29 28 66 66 65 63 63 63 63 62 62 62 63 63 63 63 63 63 63 64 66 66 66 65 64 63 65 66 66 66 67 68 69 69 68 67 65 66 66 66 66 66 66 67 67 67 67 66 66 67 67 67 67 67 67 67 67 67 66 66 66 65 64 63 63 63 63 63 63 62 61 60 60 60 60 60 59 59 59 58 58 58 57 57 56 56 56 56 55 55 56 57 57 57 57 57 57 57 57 57 57 58 59 59 59 60 60 60 59 58 57 57 57 57 58 58 58 58 58 58 58 58 57 56 56 55 55 54 53 52 52 52 53 54 53 53 54 54 55 56 56 55 55 55 55 56 55 55 55 54 54 53 52 52 53 54 54 53 52 52 53 52 51 50 49 49 50 51 51 51 51 52 52 51 51 51 51 51 51 50 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 48 49 49 48 48 47 47 47 47 48 48 48 48 48 48 48 48 49 50 50 51 51 51 51 50 49 49 48 48 48 46 45 46 47 46 46 46 45 44 44 45 46 46 45 45 44 44 43 43 44 45 46 46 47 47 46 46 45 45 45 44 43 43 43 43 44 44 43 42 41 41 41 41 41 41 41 40 40 39 39 39 40 39 39 39 39 38 38 38 37 37 38 38 38 38 38 39 38 37 37 37 38 39 40 40 40 40 40 39 39 40 40 40 39 38 38 38 37 37 38 39 40 39 38 39 38 38 38 37 39 39 38 38 38 38 36 33 35 35 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 32 33 33 32 32 31 32 34 35 34 35 36 34 33 32 32 33 33 34 35 35 36 37 38 38 37 37 37 38 37 38 39 40 40 38 36 38 40 41 40 40 40 41 41 39 38 37 38 40 40 41 41 41 41 40 40 41 42 42 42 42 41 40 40 40 40 40 39 38 37 36 36 38 40 41 41 40 40 40 39 38 37 38 39 39 40 40 40 41 41 41 41 39 39 40 41 41 40 41 41 39 39 40 39 39 41 42 42 43 43 41 41 42 43 43 42 41 40 40 39 39 40 41 41 41 40 39 40 41 42 42 42 43 43 43 44 44 44 44 45 44 43 42 41 41 40 41 42 42 42 42 41 41 40 40 41 40 39 39 38 37 36 36 37 36 35 33 35 36 34 34 34 33 33 33 33 32 32 32 33 33 34 34 35 35 35 35 34 34 34 31 31 32 31 32 34 34 34 33 32 32 32 31 30 30 31 32 32 32 32 32 32 32 31 30 29 29 29 29 29 29 29 29 28 27 27 27 28 27 66 66 66 65 63 63 63 62 62 62 63 63 63 63 63 63 63 63 65 65 65 64 63 63 64 65 64 65 67 67 67 67 67 67 66 65 65 66 65 65 66 66 66 67 67 66 65 66 67 67 67 66 66 66 66 66 65 65 65 65 64 64 64 64 64 63 62 61 61 61 61 60 59 59 59 59 59 58 57 57 57 57 57 57 57 56 56 55 55 55 56 56 56 56 56 57 57 56 57 58 58 58 57 58 60 60 60 59 58 57 57 56 57 57 57 57 58 58 58 58 57 57 56 55 55 55 54 53 52 52 52 52 52 53 54 54 55 55 55 55 55 55 55 56 55 55 54 53 54 54 53 52 53 54 54 53 52 52 52 51 51 50 49 49 49 50 51 51 51 52 52 52 51 51 51 51 50 50 50 50 50 51 51 50 51 51 50 50 50 50 49 49 49 49 48 48 48 48 48 48 47 48 48 47 46 47 48 48 49 49 49 48 48 48 49 49 49 50 51 51 50 49 49 48 47 47 47 47 46 45 47 47 46 46 45 44 43 44 46 46 46 46 45 44 43 42 43 45 45 45 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 40 40 40 40 40 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 39 38 38 39 40 41 40 39 38 38 37 37 38 38 39 39 38 37 37 37 37 38 39 38 37 37 36 36 34 34 36 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 32 33 33 34 36 35 33 34 33 31 31 32 33 34 34 35 35 36 38 38 38 38 39 39 38 38 37 37 38 39 39 38 36 38 39 40 39 39 39 40 40 39 37 37 38 40 41 41 41 40 40 40 40 40 41 42 42 41 40 40 40 40 40 39 38 38 37 36 36 38 40 41 41 40 39 39 38 37 38 39 40 40 40 40 40 40 40 41 41 40 39 39 40 40 40 40 40 39 39 40 40 41 42 42 43 43 42 41 41 42 42 42 42 41 40 40 39 38 39 41 41 40 39 38 40 41 41 41 41 42 44 44 44 43 43 43 43 43 42 41 41 41 41 43 43 41 41 42 42 41 39 39 38 38 38 38 37 36 36 35 35 34 34 34 35 36 35 34 35 35 34 35 34 34 32 31 31 31 32 32 32 34 35 35 35 34 34 33 32 32 31 32 34 33 33 34 33 33 32 31 30 29 31 32 32 32 32 32 32 31 31 30 29 29 28 29 29 29 29 29 28 27 27 27 27 27 66 66 66 66 64 62 62 62 62 62 62 62 63 63 63 62 62 63 63 63 63 63 63 63 64 64 63 64 65 65 66 66 66 67 67 65 65 65 65 65 65 66 66 66 67 66 65 65 66 66 66 66 66 66 66 65 64 64 65 66 65 64 64 64 63 63 62 62 62 62 62 61 60 60 60 60 59 58 58 59 59 58 58 58 58 57 57 56 56 55 55 55 55 55 55 56 56 56 56 57 57 57 57 57 58 59 60 59 58 58 57 57 56 57 57 57 57 58 58 58 58 58 57 56 55 55 54 53 52 52 52 52 52 53 53 53 55 55 55 55 55 54 54 55 55 55 54 54 54 53 53 52 51 53 53 53 53 52 51 50 50 51 50 49 49 49 50 51 51 51 51 52 52 51 51 50 50 50 50 50 50 50 50 50 51 51 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 49 49 48 46 47 48 49 49 49 50 50 49 49 49 49 49 50 50 50 49 49 48 47 47 46 46 46 46 45 46 46 47 46 45 44 43 44 45 46 46 46 45 44 43 42 43 44 44 45 46 46 46 45 45 44 43 43 44 44 44 43 42 43 43 43 43 42 41 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 38 37 37 39 40 41 41 40 39 38 37 37 37 38 40 40 39 38 37 37 37 37 37 36 35 35 35 34 34 36 37 36 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 34 35 35 36 37 36 33 32 31 30 31 32 34 35 35 35 36 37 38 39 38 39 40 40 40 38 37 38 38 38 38 36 37 39 40 39 39 39 39 39 38 37 36 37 38 40 40 40 41 40 39 40 40 40 41 42 41 40 40 40 40 40 40 39 38 37 36 36 36 38 40 41 41 40 39 38 38 37 38 39 40 40 40 40 40 41 40 40 40 39 39 39 40 40 40 39 39 39 40 42 42 42 41 41 42 42 40 40 41 42 41 41 43 43 41 40 39 37 39 41 41 40 39 38 39 40 41 41 41 42 44 44 44 43 42 43 42 41 41 41 42 42 43 43 43 42 42 42 41 41 40 39 37 38 38 37 37 38 38 36 36 35 36 36 36 36 36 36 36 36 36 35 35 34 33 32 32 32 32 32 32 32 33 34 35 34 34 34 33 32 31 31 32 31 31 32 33 32 31 30 29 30 31 32 31 31 31 31 31 30 30 30 29 29 28 28 29 29 29 29 28 27 27 27 27 27 66 66 65 65 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 64 64 63 63 63 65 66 65 66 67 67 65 64 64 65 64 64 65 66 66 66 66 65 65 65 66 66 65 66 66 66 65 65 64 64 65 65 63 63 63 63 63 63 63 63 63 62 60 60 61 61 60 59 58 59 60 59 59 59 60 59 58 58 57 57 56 56 55 55 55 55 55 55 55 55 55 56 57 57 57 57 58 59 59 59 59 58 58 57 56 56 57 57 58 58 57 57 56 56 56 55 55 54 53 52 52 52 52 51 52 53 53 54 55 54 54 54 54 53 53 54 55 54 54 54 53 52 52 51 51 52 52 52 52 51 51 50 50 50 49 48 48 49 50 50 50 50 51 52 51 51 51 50 49 50 50 50 50 50 50 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 48 49 49 49 48 46 46 47 48 49 49 49 50 50 50 50 50 50 50 50 50 50 49 48 48 47 47 46 46 45 45 45 46 46 46 45 45 43 43 44 45 46 45 44 44 43 42 42 43 43 45 46 46 46 45 45 45 44 43 43 43 43 43 42 42 43 42 42 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 36 36 37 37 37 38 39 40 40 40 40 39 38 38 37 37 38 40 40 40 40 39 39 38 37 36 36 36 36 36 36 35 37 38 37 35 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 34 36 36 36 36 36 33 31 30 30 31 33 34 36 36 36 37 38 38 38 37 38 39 40 40 38 37 38 38 37 36 36 38 40 40 39 37 39 39 37 36 36 37 38 39 39 39 40 41 39 39 40 40 40 41 42 41 41 41 40 40 40 40 40 38 37 36 36 37 39 40 41 41 40 39 38 37 37 37 39 39 39 39 40 40 41 41 40 40 39 38 39 39 39 39 39 40 40 41 42 42 41 40 40 41 42 40 40 41 41 41 42 43 42 41 40 39 37 38 41 41 40 38 38 39 40 40 41 41 42 42 42 42 42 42 42 40 41 41 42 43 43 43 43 43 43 43 42 41 41 41 40 38 39 39 38 39 39 38 36 37 38 37 37 37 36 36 36 36 36 36 35 36 36 34 34 34 34 34 34 33 32 31 33 34 33 34 35 34 32 31 31 31 31 31 31 30 30 30 30 29 30 32 32 31 30 30 30 30 29 29 29 29 28 27 28 29 29 30 29 29 29 28 27 27 26 67 66 65 64 63 63 63 63 62 62 62 62 62 62 61 61 62 62 61 61 61 61 61 62 64 64 63 63 63 65 65 64 65 67 67 65 63 64 64 64 64 65 66 66 66 65 65 64 65 65 65 65 65 65 66 66 66 64 63 63 64 64 63 63 63 63 64 63 63 62 61 60 61 61 61 60 58 59 59 60 60 60 60 60 59 58 58 57 57 57 57 56 56 55 54 54 54 55 55 55 55 56 57 57 57 58 59 59 59 59 59 58 57 56 55 56 57 57 58 58 57 56 56 56 55 55 55 54 53 52 52 52 51 51 52 53 53 54 54 53 53 53 53 53 54 55 54 53 53 53 52 52 51 51 51 52 52 52 51 51 50 50 50 49 49 48 48 48 48 49 49 51 52 52 51 50 50 49 49 49 49 49 50 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 47 46 46 48 49 49 49 49 50 50 49 49 49 49 49 50 50 50 49 48 48 47 47 46 46 45 44 46 46 45 45 45 44 43 43 45 46 45 44 44 43 42 42 43 44 45 45 45 46 45 44 44 44 43 43 43 43 42 41 41 42 42 41 41 41 40 40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 38 37 37 37 37 37 36 36 36 36 38 39 40 40 40 41 40 39 38 38 37 37 38 40 40 40 40 40 40 39 38 38 38 38 38 38 38 37 37 38 37 35 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 35 36 37 36 35 33 31 30 30 31 33 33 33 34 35 36 37 37 37 38 38 39 39 40 39 37 37 38 37 36 35 37 39 40 40 39 37 38 38 36 37 38 39 40 40 39 40 40 39 39 39 39 40 41 41 41 40 40 41 40 39 40 39 38 37 37 36 36 37 39 40 40 40 40 39 38 37 37 38 38 38 38 39 40 40 41 41 41 40 39 38 39 39 39 39 40 40 40 41 41 42 41 40 40 41 41 40 39 40 40 41 42 42 41 40 40 39 37 38 40 40 38 38 39 40 41 41 42 42 41 41 41 41 42 41 40 41 42 43 43 44 44 44 43 43 43 42 42 42 41 41 41 41 40 39 39 39 39 38 37 38 39 38 38 37 35 35 35 35 34 34 35 35 34 34 33 33 34 35 35 34 33 32 31 32 32 33 34 34 34 33 33 33 33 32 30 29 29 29 29 28 29 31 31 30 30 29 29 29 29 29 29 29 28 28 29 30 31 30 30 30 30 29 29 28 27 67 66 65 64 63 63 64 64 63 63 63 62 62 61 61 61 61 61 61 61 60 60 60 61 62 62 62 61 62 64 65 64 65 66 66 65 63 63 63 63 64 65 66 66 66 65 65 64 64 64 64 64 64 64 65 66 66 65 63 63 63 63 63 63 64 64 64 64 63 62 63 62 62 62 61 59 59 59 60 60 60 60 60 60 60 59 58 58 59 59 59 58 57 56 55 55 54 54 54 54 54 55 56 57 57 58 58 58 58 59 59 58 58 57 56 56 56 57 57 58 58 58 57 56 55 55 54 54 54 52 52 52 51 51 51 52 53 53 53 53 53 52 53 54 54 54 54 54 53 53 53 52 51 50 51 52 52 52 51 51 50 50 50 49 49 48 48 48 48 48 48 50 51 52 51 50 50 49 49 49 49 49 50 50 50 51 51 51 50 50 50 50 49 49 49 49 50 50 49 49 49 49 48 48 47 46 46 47 48 48 48 49 50 49 49 49 49 49 49 50 50 49 48 47 47 46 46 46 46 45 44 45 46 46 45 45 44 43 43 44 45 45 45 44 43 42 42 43 44 45 45 45 46 45 44 44 43 43 42 42 42 42 42 41 41 41 41 41 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 37 36 36 36 37 39 40 39 39 40 39 38 38 38 37 37 38 40 40 39 39 40 40 39 39 39 39 39 39 39 39 38 38 39 36 35 34 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 34 35 37 37 34 33 31 30 30 30 33 35 35 33 34 35 36 36 36 38 39 40 40 41 40 37 36 37 38 36 35 36 37 39 40 39 39 38 38 37 37 39 40 40 41 40 40 40 39 38 39 40 40 40 41 41 40 40 40 40 40 40 40 40 39 38 37 36 36 37 40 40 40 39 39 38 37 37 38 39 39 39 39 39 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 40 40 40 39 39 40 40 41 42 42 41 40 40 40 40 38 37 38 38 38 39 40 41 42 43 42 42 42 41 41 42 41 40 40 41 42 42 43 44 45 45 44 43 43 42 42 42 42 41 41 41 41 40 40 41 40 39 38 39 39 39 38 36 35 36 35 34 35 35 36 34 33 33 34 33 33 33 33 33 33 33 32 31 31 31 33 33 32 33 33 34 33 33 32 31 31 30 30 29 28 29 29 29 29 28 28 28 29 29 29 29 29 29 29 31 32 31 31 30 30 30 30 29 28 66 65 64 63 63 63 65 65 64 64 64 63 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 60 62 64 64 64 65 66 66 66 64 63 63 63 63 64 65 65 65 66 65 64 64 63 63 63 63 63 64 65 65 65 64 63 63 62 62 63 63 63 64 64 63 63 63 62 62 62 60 59 59 60 60 60 61 61 61 61 60 60 60 60 60 60 60 59 58 58 57 56 54 54 54 54 54 54 55 55 57 57 57 57 58 59 59 58 58 58 57 56 55 55 56 56 57 57 57 56 56 55 55 54 54 53 52 52 51 51 51 51 52 53 53 54 53 52 52 53 53 53 54 54 53 53 53 52 51 50 50 51 51 52 51 50 51 50 50 50 50 50 49 49 48 48 48 48 50 51 51 50 50 50 49 49 48 49 50 50 50 51 51 51 50 50 50 50 50 49 49 49 50 50 50 49 49 49 48 47 47 47 46 46 47 47 48 49 49 49 49 48 48 49 50 50 50 49 48 48 47 46 46 45 45 44 44 44 45 46 46 45 44 43 42 43 44 45 45 44 43 42 42 43 44 44 45 45 45 45 44 43 43 43 43 42 41 41 42 41 41 41 42 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 40 40 39 39 40 40 39 39 39 39 39 39 39 39 39 39 37 36 36 36 36 39 40 39 39 40 40 38 38 38 37 37 38 39 40 39 38 39 40 40 40 40 39 39 38 38 38 38 39 39 36 34 35 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 34 36 36 36 34 32 30 30 30 31 34 36 36 34 34 35 36 36 37 38 39 39 39 39 38 37 36 38 37 35 35 37 38 39 40 38 37 37 37 36 38 40 40 40 40 40 40 39 38 39 39 40 41 41 40 40 40 40 39 39 39 40 40 40 40 38 36 36 36 38 40 40 40 39 38 38 37 37 38 39 40 40 40 40 40 40 40 40 39 40 39 38 39 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 41 42 42 43 42 41 40 39 39 40 40 38 37 38 39 39 40 41 42 42 41 41 41 40 41 41 40 40 41 41 41 42 42 43 44 45 44 43 43 43 42 42 41 40 40 40 40 40 40 41 40 40 40 40 39 38 38 36 36 37 35 35 37 37 36 35 34 34 36 35 33 33 33 33 32 32 32 32 31 30 31 31 30 31 32 34 34 34 33 32 33 32 31 31 29 28 28 28 27 27 27 28 30 31 31 31 30 29 29 31 32 32 31 30 29 29 29 29 29 65 64 63 63 63 64 66 66 66 66 64 64 64 63 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 62 63 63 64 65 65 66 65 63 63 63 63 63 64 64 65 66 65 64 63 63 63 63 63 63 63 64 64 64 64 64 64 62 62 62 62 62 63 64 63 63 63 63 63 61 60 60 60 61 62 62 62 61 61 60 60 60 60 60 60 60 60 58 58 58 57 56 56 56 55 54 54 54 54 54 56 57 57 57 58 58 58 58 58 58 57 56 55 54 55 55 56 57 56 56 56 55 55 54 54 53 53 52 51 51 51 51 51 52 53 53 53 52 52 52 52 53 53 54 53 52 52 52 52 50 50 50 51 52 52 52 52 51 51 51 50 50 50 49 49 48 48 48 48 50 50 49 49 50 50 49 48 48 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 50 50 49 49 49 48 46 46 46 45 46 47 47 48 49 49 49 48 47 48 49 49 49 49 49 49 49 48 47 46 46 45 45 44 44 44 45 45 46 45 43 42 42 44 45 44 44 43 43 42 42 43 44 44 44 44 45 44 43 42 42 42 41 41 40 40 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 39 39 38 38 38 38 39 39 38 38 39 39 38 38 38 38 38 38 38 38 38 38 38 36 36 36 36 39 40 39 39 40 40 39 39 38 37 37 37 39 40 39 38 39 39 40 40 40 40 39 39 38 38 38 38 38 36 35 35 35 33 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 35 36 36 34 33 31 30 30 30 33 35 36 37 36 35 35 35 37 38 38 38 38 38 37 38 36 36 38 36 34 36 38 39 40 40 39 38 37 37 36 38 40 39 39 40 40 38 38 38 39 40 40 41 42 40 40 40 40 39 39 40 40 39 38 38 37 36 36 36 38 40 40 39 38 38 37 37 38 38 39 40 40 40 41 41 41 41 40 39 39 39 38 39 40 40 39 39 39 39 39 39 39 39 40 40 41 42 42 42 41 42 42 41 41 40 40 39 39 39 38 37 39 40 40 41 41 42 42 41 40 40 39 39 39 40 40 42 43 42 42 42 43 44 45 45 43 43 43 42 42 40 40 41 41 40 39 39 40 39 40 41 40 39 38 38 37 37 38 36 37 37 36 35 35 36 36 35 34 33 34 35 35 34 32 32 32 31 30 31 32 30 30 32 33 32 33 32 32 32 31 30 30 29 28 27 28 29 28 28 28 29 30 31 31 31 28 29 31 31 31 30 30 29 29 29 29 29 65 64 64 64 64 65 66 66 67 67 66 65 65 64 65 64 63 62 62 62 62 62 62 62 61 61 60 60 60 62 63 63 63 64 65 66 65 64 63 63 62 63 63 64 66 66 65 64 63 63 63 62 62 63 63 63 63 64 63 64 64 63 63 62 61 60 62 63 63 63 64 64 63 62 62 61 61 63 63 62 61 61 61 60 59 60 60 60 60 60 60 59 58 58 58 57 57 57 56 55 54 54 54 54 55 56 57 57 57 58 57 57 57 57 58 57 56 54 54 54 55 56 56 55 55 55 54 54 54 53 53 53 52 52 51 51 51 51 52 52 52 52 51 51 52 53 53 54 54 52 52 52 52 50 49 50 51 52 52 52 52 51 51 50 49 49 49 50 49 48 48 47 48 49 50 49 49 49 49 49 48 48 48 48 49 50 50 50 50 50 50 49 49 49 49 49 49 49 50 49 49 48 48 47 46 45 45 45 46 47 48 49 49 49 47 47 47 48 49 49 49 48 49 49 48 47 46 46 46 46 44 43 43 44 44 45 45 44 42 42 43 44 45 45 44 43 42 42 42 44 44 43 44 44 42 42 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 38 38 37 36 36 36 36 38 40 39 39 39 39 40 40 39 38 37 37 39 39 38 38 39 39 39 39 39 40 40 40 39 39 38 38 37 36 36 35 35 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 35 35 33 32 30 30 30 30 31 34 36 36 37 37 37 36 35 37 38 38 37 37 37 37 37 36 36 37 35 35 37 38 39 40 40 39 38 37 36 36 38 38 38 39 40 39 38 39 39 40 40 40 41 41 40 40 40 40 40 40 41 40 38 38 37 36 35 36 37 39 40 40 38 37 37 37 37 39 40 40 40 40 40 41 42 42 42 42 41 40 38 38 39 40 39 39 39 39 39 39 39 39 40 40 41 42 43 42 41 41 41 41 41 41 41 40 38 38 37 37 37 39 40 41 42 42 42 41 41 39 39 39 39 40 41 41 42 44 44 44 44 43 43 44 44 44 43 43 43 42 41 41 42 42 41 41 40 40 39 38 39 40 39 39 38 38 38 38 37 36 36 35 36 37 37 36 34 34 34 35 35 34 34 33 33 33 32 33 33 33 31 31 31 30 30 30 30 29 30 29 29 28 28 28 28 30 31 30 29 29 29 28 28 29 30 29 28 30 30 30 29 29 29 29 29 29 30 65 64 65 65 66 67 67 66 66 66 66 66 65 65 65 64 63 63 63 63 63 63 63 62 62 61 61 60 61 62 63 63 63 63 64 65 65 64 63 62 62 63 63 64 65 65 65 65 64 64 63 63 62 62 62 63 63 63 63 63 64 64 63 63 62 61 61 62 63 64 64 64 64 63 63 63 63 63 63 62 61 61 61 60 59 59 59 60 60 59 59 59 59 58 58 58 57 57 57 56 55 54 53 53 54 55 56 57 57 57 57 57 57 57 58 58 56 55 54 54 55 56 56 56 56 55 55 54 54 53 53 53 53 52 52 51 50 50 50 51 51 51 51 51 52 53 54 54 54 53 52 52 51 50 49 49 51 52 52 52 52 51 51 51 50 50 49 49 49 48 48 47 47 48 49 49 49 48 48 49 49 48 48 49 50 50 50 50 50 50 49 49 49 49 49 49 48 48 49 48 48 48 47 47 46 46 45 46 47 48 49 48 49 49 47 46 47 48 49 50 49 48 48 48 48 47 46 46 46 45 44 43 43 43 43 43 44 44 43 42 42 44 45 45 44 43 43 43 42 42 43 42 42 42 41 41 41 40 40 40 40 40 40 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 38 38 39 40 39 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 40 40 39 38 38 39 39 39 38 37 36 38 38 37 37 38 38 38 38 39 39 40 40 40 39 38 37 37 38 38 37 37 35 33 32 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 32 30 30 30 30 30 31 33 34 35 36 37 38 38 37 36 37 38 38 37 37 37 36 35 36 37 36 34 36 38 39 38 39 41 40 39 37 36 37 38 38 39 39 39 38 39 40 40 40 40 40 41 41 40 41 41 40 40 40 41 42 40 39 39 37 35 36 39 40 41 40 37 36 36 37 38 39 39 39 39 39 40 41 41 42 42 42 42 40 39 38 38 39 39 39 40 40 40 40 41 41 40 40 41 42 42 42 40 41 41 40 40 40 40 39 37 37 36 38 38 38 39 40 42 42 41 40 39 38 39 40 40 40 41 42 42 43 44 44 45 43 43 43 43 43 44 44 43 43 43 43 42 42 42 41 41 41 40 38 38 39 40 40 39 39 38 37 36 36 35 36 38 37 36 35 34 35 36 36 36 35 34 34 34 34 34 35 34 33 31 30 30 31 31 30 30 30 30 30 30 30 30 30 31 31 32 31 31 31 31 30 29 28 29 29 28 28 28 28 28 27 27 27 27 28 28 65 65 65 66 66 68 68 68 67 66 65 65 65 65 64 63 64 65 65 64 64 64 63 63 62 61 61 60 60 62 62 62 63 63 64 65 65 64 63 62 62 63 63 63 64 65 65 66 65 65 65 63 62 62 61 62 62 63 63 62 63 64 63 62 62 61 60 60 61 62 63 63 63 64 63 63 63 63 62 61 61 61 61 60 59 58 58 58 59 58 58 59 59 58 58 58 57 57 58 57 56 55 54 53 53 54 55 56 57 57 57 56 56 57 57 57 56 55 54 54 55 56 56 57 56 56 55 55 54 54 53 52 52 52 52 51 50 50 50 50 50 50 51 52 52 53 53 53 53 53 52 52 51 51 50 50 50 51 52 52 52 52 52 51 51 51 50 49 49 49 49 47 47 47 47 48 48 47 47 48 48 47 47 49 50 50 50 50 50 50 49 49 49 49 49 48 48 47 47 47 47 47 47 48 48 47 45 46 47 48 48 48 49 48 46 46 48 49 50 50 49 48 47 47 48 47 46 45 45 45 44 44 44 43 43 43 43 43 43 42 42 42 44 44 44 44 43 43 42 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 40 40 40 40 39 39 38 38 38 38 37 38 38 37 37 37 36 36 37 37 36 36 36 36 36 39 40 39 38 38 38 39 39 38 37 36 37 37 37 38 38 37 37 38 38 39 40 39 39 39 38 37 37 39 39 38 37 36 35 34 32 32 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 34 35 35 35 36 37 37 37 37 38 39 39 37 37 36 35 35 35 36 37 36 34 36 37 38 38 39 40 39 38 36 36 38 39 40 40 39 39 39 39 40 41 40 39 40 41 41 40 41 41 40 39 41 42 42 41 40 39 37 36 36 38 40 39 38 36 36 37 38 39 39 39 38 39 39 40 41 41 41 42 41 42 41 39 38 38 38 39 40 40 40 40 41 42 42 41 41 41 41 42 42 40 40 40 40 41 40 40 38 37 36 37 38 39 39 40 41 42 41 40 39 38 39 41 41 40 40 41 42 42 42 43 44 44 42 41 42 43 44 44 45 44 43 43 43 41 40 40 40 40 41 40 39 39 39 39 40 40 40 38 37 37 37 37 37 39 38 36 35 35 36 37 37 36 35 35 35 35 34 34 33 34 33 31 30 32 33 33 31 31 32 32 32 32 33 32 32 32 31 32 32 32 32 32 32 31 30 28 28 28 28 28 28 28 27 27 27 28 27 27 65 65 65 66 66 67 68 68 67 66 65 65 65 65 65 65 66 66 65 65 64 63 63 63 62 61 61 60 59 60 61 62 63 63 63 64 63 63 63 62 62 62 62 63 63 64 65 65 66 66 66 64 62 62 61 61 61 62 62 61 62 63 62 61 61 61 60 60 60 61 62 63 63 63 64 63 63 63 61 60 60 60 60 60 59 59 59 58 57 57 57 58 58 58 58 58 58 58 58 57 56 55 54 54 53 53 54 54 55 56 57 56 55 56 57 57 57 55 54 54 54 55 56 56 56 55 55 54 54 54 53 52 52 52 52 51 51 50 50 49 49 50 51 52 52 52 52 53 53 53 52 52 52 51 50 49 50 50 51 51 52 52 52 51 51 51 50 50 50 50 49 48 48 47 47 47 46 46 46 47 47 47 47 49 50 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 48 48 49 49 47 46 45 46 47 47 47 48 47 45 46 48 49 49 49 49 49 48 47 46 45 45 45 45 45 45 45 45 45 45 44 43 43 43 42 42 42 42 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 40 40 40 39 39 39 39 38 38 38 38 38 38 37 36 36 36 36 36 36 36 36 36 38 39 39 39 38 38 38 38 38 37 36 37 37 37 37 37 37 38 38 39 40 40 39 38 39 38 37 37 39 39 38 37 36 36 35 33 32 32 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 34 36 37 36 36 37 37 37 37 38 39 38 36 36 36 35 36 37 37 37 36 34 35 36 38 39 40 40 39 38 36 36 38 40 41 40 39 39 40 40 40 40 38 39 41 41 41 40 40 40 39 39 40 41 41 40 40 39 37 36 36 38 39 38 37 36 36 38 39 40 40 40 40 40 40 41 41 41 41 41 40 41 41 40 38 38 38 39 39 40 40 41 42 42 41 40 40 41 41 41 41 40 40 40 41 41 40 38 37 36 36 38 39 39 40 41 42 42 41 39 38 39 40 42 42 41 42 43 44 43 42 43 43 42 41 41 42 43 44 44 45 45 43 42 42 41 40 40 41 41 41 41 41 40 40 39 38 39 40 39 38 38 37 37 38 39 38 37 36 37 38 37 37 36 36 36 35 35 34 33 33 33 33 32 32 34 34 34 32 31 33 33 33 33 33 33 33 33 32 32 32 32 32 31 31 31 30 29 27 28 30 29 29 29 29 29 29 29 28 28 65 65 65 65 65 65 66 66 66 66 65 65 64 64 64 64 65 65 65 65 64 64 63 63 62 61 61 60 59 59 60 61 62 63 63 63 63 62 62 62 61 61 62 63 64 64 64 64 65 65 64 64 64 63 62 61 60 61 61 61 61 62 62 62 60 60 60 60 61 62 63 62 62 63 64 63 63 62 61 61 61 60 60 60 60 60 60 59 58 57 57 57 58 59 59 59 59 58 57 57 57 56 55 54 54 53 53 53 54 55 55 55 54 55 57 57 57 56 54 54 54 54 55 56 56 55 55 54 54 53 53 53 53 53 53 52 52 51 51 49 49 49 50 52 52 51 51 52 53 53 53 52 52 51 50 49 50 51 51 50 50 51 52 51 51 50 50 50 50 50 49 49 49 48 47 47 46 46 46 46 46 47 47 48 49 49 49 49 49 49 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 46 45 45 45 46 47 47 46 45 47 47 48 49 49 48 48 47 46 46 45 45 45 45 46 46 46 46 46 46 45 44 44 43 43 42 42 42 42 42 42 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 36 36 36 35 35 37 39 40 39 39 38 38 38 38 37 36 37 37 36 37 37 38 39 39 40 40 40 39 38 39 39 37 37 38 39 39 37 37 37 36 36 34 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 33 33 34 35 36 37 37 37 36 36 37 38 38 37 36 36 35 36 37 38 38 37 35 34 36 37 38 40 40 39 40 38 36 36 38 39 40 39 38 39 40 40 39 38 38 40 41 42 41 40 40 39 38 39 40 40 40 39 38 38 37 36 36 38 39 37 36 36 38 38 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 40 38 38 39 39 39 40 41 41 41 41 41 40 40 40 41 40 40 40 40 41 41 40 38 37 36 36 37 38 40 40 40 41 41 41 40 38 38 39 41 41 41 41 42 43 43 42 42 42 42 42 42 42 42 42 43 43 44 45 44 43 42 42 42 42 42 41 41 41 41 41 40 40 38 38 39 40 39 39 38 38 38 38 37 37 37 38 39 38 37 37 37 37 36 35 34 34 34 34 34 33 33 34 34 33 33 33 33 34 34 34 33 32 33 33 32 31 31 32 31 31 31 31 30 29 28 29 30 30 29 30 30 30 29 29 28 28 65 65 65 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 64 64 64 64 64 64 63 62 61 60 59 59 60 60 61 62 63 63 63 62 62 61 61 62 63 64 65 64 63 64 65 65 63 63 64 64 62 61 60 60 60 61 60 60 62 63 61 60 59 60 62 62 63 62 62 63 63 63 62 62 61 61 61 61 61 61 61 60 60 60 59 58 57 57 58 58 59 59 59 58 58 58 58 57 56 55 54 53 52 53 54 54 54 54 54 56 57 57 57 56 55 54 54 54 54 55 56 56 56 55 54 54 54 55 54 53 53 53 53 52 51 50 49 49 49 50 50 50 51 52 52 53 53 52 52 51 50 49 50 51 51 50 50 50 51 51 50 50 50 50 50 49 49 49 50 49 49 48 48 47 47 46 46 46 46 46 47 48 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 46 46 46 47 48 48 47 47 46 46 46 47 47 46 46 47 47 47 47 46 46 45 44 44 43 43 42 42 42 42 41 41 41 42 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 39 39 40 40 39 40 40 40 40 40 40 39 39 39 39 39 38 39 38 38 38 38 38 38 38 37 36 36 35 35 37 39 39 39 39 38 37 38 38 37 36 36 36 37 37 38 39 39 39 40 39 39 39 38 38 38 36 36 37 37 38 38 38 38 37 37 36 35 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 33 34 35 34 34 36 37 37 36 35 36 38 38 38 37 36 35 35 36 37 38 38 35 33 35 37 38 40 41 40 39 39 38 36 36 37 38 39 39 38 38 39 39 38 39 39 40 41 41 40 39 39 38 38 39 40 40 40 39 37 36 35 36 37 38 37 36 35 37 39 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 39 38 38 38 39 40 40 40 40 40 40 41 41 40 40 40 39 39 39 40 41 41 40 39 38 36 36 37 37 38 41 41 41 41 41 40 38 38 39 40 40 40 40 41 42 41 42 41 41 41 41 42 44 44 43 43 43 44 45 45 43 43 42 42 42 41 41 40 40 40 40 40 40 40 39 38 37 39 40 40 40 39 38 38 38 38 38 38 39 39 37 37 37 37 36 35 35 35 35 35 34 33 33 33 33 32 33 34 34 34 34 34 33 32 33 32 31 31 31 31 31 30 30 30 30 29 29 30 31 31 30 31 31 30 29 28 28 28 66 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 64 64 64 64 63 62 61 60 59 59 59 60 60 62 63 63 63 62 61 60 61 62 63 64 64 63 63 64 66 66 64 63 63 63 62 62 61 60 60 60 60 60 60 61 61 60 59 60 61 61 62 62 61 61 62 62 61 62 61 60 60 60 60 61 61 60 60 60 59 58 57 57 57 58 58 58 58 58 59 59 58 57 56 55 54 54 52 52 54 54 54 54 54 55 56 57 57 56 55 55 55 54 53 54 55 55 56 55 55 55 55 55 55 54 54 53 53 53 52 51 50 49 49 49 49 50 52 52 52 53 53 52 52 51 50 49 49 50 51 51 50 50 50 50 50 50 49 49 50 49 49 49 49 49 49 49 49 49 48 47 46 46 46 46 46 47 48 48 47 47 47 46 46 46 46 45 45 45 45 45 45 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 45 45 46 46 46 45 46 46 47 47 47 47 48 47 47 46 46 46 45 44 44 44 44 43 42 42 42 42 42 42 43 43 43 42 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 39 39 40 40 39 38 38 38 38 38 38 38 38 38 37 36 36 35 35 36 38 39 39 39 39 37 38 38 37 36 36 37 38 38 39 39 39 38 39 38 39 39 38 38 38 36 36 36 38 38 38 38 39 38 38 39 38 37 36 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 33 35 35 35 37 36 35 36 36 36 35 35 37 38 38 37 36 35 34 35 36 37 38 37 35 33 35 38 39 39 41 40 38 38 36 36 37 38 39 39 39 38 38 38 38 38 39 39 40 41 40 39 38 37 38 39 39 40 40 39 39 38 36 35 36 37 37 36 35 36 38 40 40 40 40 41 41 41 41 41 41 41 41 41 40 40 40 39 38 37 38 39 40 40 40 40 40 40 40 41 40 40 39 38 39 40 41 42 41 40 39 37 36 36 37 38 39 40 41 41 41 40 39 38 38 39 40 40 41 41 42 41 40 40 41 41 41 42 43 44 45 44 43 43 44 44 44 43 42 41 41 41 41 40 40 39 39 38 39 39 39 40 39 38 38 38 39 40 39 39 38 38 38 39 38 38 38 37 37 37 38 37 36 36 36 35 35 34 34 33 33 32 32 33 34 34 34 34 34 33 33 33 33 33 32 30 30 30 30 30 30 30 31 31 31 32 31 31 31 31 30 29 28 28 29 66 66 66 66 65 64 63 63 63 63 63 62 62 62 62 63 64 64 63 62 62 63 63 63 62 61 60 60 59 59 59 59 60 61 62 62 62 61 60 60 61 62 63 63 63 63 63 64 65 64 64 63 63 62 62 63 62 60 60 60 60 60 59 59 60 60 59 59 60 60 61 61 60 60 62 62 60 61 61 61 61 60 59 59 60 60 60 60 59 58 57 57 57 57 57 58 58 58 58 58 58 57 57 56 55 54 53 52 52 53 53 54 54 55 55 56 57 56 55 55 55 54 53 54 55 55 55 56 55 55 55 55 54 54 55 54 53 53 52 52 51 50 49 49 49 50 52 52 52 53 53 52 52 51 51 49 49 50 50 50 50 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 46 46 47 47 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 44 44 44 45 45 46 46 46 46 46 46 46 46 45 44 43 44 44 43 43 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 39 40 40 40 40 40 39 38 38 38 38 38 38 38 38 38 37 37 36 35 35 35 37 38 38 39 38 37 37 37 37 36 36 37 38 38 39 39 39 38 38 38 39 40 39 39 39 38 36 36 38 38 38 38 40 40 39 39 39 39 39 36 34 34 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 35 36 37 37 37 35 35 35 35 34 34 35 36 38 38 37 35 34 34 36 37 37 37 36 34 34 36 38 38 38 40 40 38 37 35 35 37 38 40 41 40 38 37 38 38 38 38 39 40 40 40 39 38 37 38 40 40 40 40 38 37 37 35 35 36 37 36 35 36 38 40 40 40 40 40 41 41 40 40 40 41 41 40 40 40 39 39 38 37 37 38 39 39 40 39 39 40 40 40 41 40 39 38 38 39 40 41 41 40 40 39 37 36 36 37 38 39 40 40 39 39 40 38 37 38 40 40 41 41 41 41 40 39 40 40 40 41 42 42 43 44 44 43 42 42 42 42 42 42 41 41 41 41 40 39 39 39 39 38 38 38 39 39 38 37 37 38 39 40 39 38 38 38 38 38 37 37 37 38 38 37 37 37 37 37 36 35 35 34 35 34 33 34 34 34 34 34 34 34 34 34 33 33 33 32 31 30 30 31 31 31 32 31 31 31 32 31 31 31 31 30 29 28 28 29 66 66 66 65 65 64 63 63 63 63 63 63 63 62 62 64 65 64 63 62 62 62 62 61 61 60 60 60 59 59 59 59 60 61 61 62 61 60 60 61 62 63 63 63 63 63 63 63 63 63 63 64 63 62 62 63 62 62 61 60 60 60 60 59 59 60 60 60 60 60 60 60 60 61 62 61 60 60 60 60 60 60 59 58 59 59 60 60 59 58 58 57 56 56 57 57 57 58 58 58 58 58 57 57 56 55 54 53 52 52 53 54 54 55 56 56 56 56 55 54 54 54 53 53 54 55 55 55 56 56 55 55 54 54 54 54 53 53 53 53 52 51 50 50 49 50 51 51 52 52 52 52 52 52 52 50 48 49 50 50 50 51 51 50 50 50 49 49 48 49 48 48 48 47 47 47 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 38 39 39 39 39 39 38 38 38 38 37 37 37 37 37 37 37 36 35 35 35 36 37 38 38 38 37 37 37 37 36 36 36 37 38 39 39 38 38 37 38 39 39 39 40 39 38 37 37 37 38 37 38 39 40 40 38 38 39 38 36 37 37 35 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 37 37 38 37 36 34 33 33 34 35 36 36 37 37 37 37 35 33 34 36 37 36 34 34 34 35 36 38 38 38 39 39 37 36 35 36 37 37 39 40 39 37 37 38 39 39 40 40 40 40 40 38 36 37 38 38 40 40 40 38 37 36 35 35 36 37 36 35 36 38 39 39 39 39 40 40 41 40 40 40 40 40 40 40 40 39 38 37 37 37 38 39 39 39 38 39 40 40 41 41 40 39 38 39 40 39 40 40 40 40 38 36 36 37 38 38 39 39 40 39 39 38 38 38 39 40 40 40 40 39 39 38 39 40 40 40 40 41 42 43 43 44 44 41 41 42 42 43 43 42 41 41 40 40 39 39 40 40 39 39 38 38 38 37 37 37 37 37 38 39 38 38 38 38 38 37 37 37 37 38 37 37 37 36 36 36 36 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 32 31 31 32 32 32 31 31 32 31 31 30 29 30 30 29 29 29 30 66 66 66 65 65 64 64 64 65 65 64 63 63 63 63 63 64 63 63 63 62 61 60 61 61 60 60 60 59 59 59 59 59 60 61 61 61 60 60 61 63 63 63 63 62 62 63 63 63 63 63 63 63 62 62 62 62 62 62 61 62 61 61 60 60 60 61 60 59 59 60 60 60 62 62 60 60 60 60 60 60 60 60 58 58 58 58 59 60 59 58 57 56 55 55 56 56 57 57 57 58 58 58 58 57 56 55 54 53 52 52 53 54 55 55 55 56 56 55 55 55 54 53 52 53 54 54 55 56 56 55 55 54 54 54 53 53 53 53 53 52 52 51 50 49 48 49 50 51 51 52 52 51 51 51 50 48 48 49 49 50 50 50 50 49 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 38 38 38 38 37 37 37 37 36 36 36 36 36 36 36 36 35 35 35 35 36 37 38 37 37 37 37 37 36 36 36 37 38 39 39 38 37 37 37 38 39 39 40 38 38 37 36 37 38 37 37 39 40 40 38 37 37 36 35 36 36 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 34 37 38 37 36 36 33 33 33 35 37 37 38 38 37 36 36 34 33 34 36 37 35 33 33 35 36 36 38 38 37 38 38 37 35 35 37 38 38 39 40 39 37 38 39 39 40 40 40 40 39 40 39 36 37 38 38 39 40 40 38 37 36 35 35 37 37 36 35 37 38 38 39 39 39 40 40 41 40 40 39 40 40 40 41 40 39 37 37 36 37 39 38 38 38 38 39 39 40 40 41 40 39 38 38 39 39 40 40 41 40 38 36 36 36 38 38 38 39 40 39 38 37 37 39 40 40 40 40 39 38 39 40 40 40 41 42 42 41 41 42 43 44 43 41 41 42 42 42 43 43 42 41 41 41 39 39 40 40 40 40 39 39 38 37 38 38 37 36 36 38 39 39 38 38 39 38 37 37 37 38 38 37 37 36 36 37 37 36 36 35 35 35 34 34 34 35 34 34 34 34 34 34 33 33 33 33 33 32 32 32 32 32 32 32 31 30 29 29 29 29 29 29 29 29 30 67 66 66 65 65 65 65 65 66 65 64 64 63 63 63 63 63 62 62 62 61 60 60 61 61 60 60 60 59 59 59 59 59 59 60 60 60 60 59 61 63 63 63 63 61 61 62 62 62 63 63 63 63 62 61 60 60 61 62 62 62 61 61 62 61 61 61 60 59 59 59 60 60 61 62 61 60 60 59 59 60 60 60 60 58 57 57 57 58 59 59 58 57 56 55 55 55 55 55 56 57 57 58 57 57 57 55 54 54 52 51 52 53 55 55 54 55 56 56 56 55 54 53 52 52 53 53 54 56 56 55 55 55 54 53 52 52 52 52 53 52 52 51 50 49 48 48 49 49 50 51 52 51 50 51 50 49 48 48 48 48 49 48 48 47 47 47 46 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 36 37 38 38 37 37 36 36 36 36 37 37 39 39 38 38 38 38 37 37 38 39 38 37 38 36 36 37 36 37 38 40 39 37 37 37 36 36 34 35 35 34 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 36 38 36 35 35 33 33 35 36 37 37 38 38 37 35 34 33 32 35 36 35 34 33 33 35 36 36 37 37 37 38 38 36 35 36 37 37 38 40 40 38 37 38 39 39 39 39 39 39 39 40 39 37 37 38 38 38 39 39 38 37 36 35 35 36 36 35 35 37 38 39 40 40 40 40 41 41 40 40 40 39 39 40 40 40 39 37 36 36 38 39 38 37 38 38 38 39 39 40 40 39 38 38 38 38 38 39 40 40 39 38 36 36 36 38 38 39 39 39 38 37 37 38 39 40 40 39 39 38 38 39 41 42 41 41 42 42 41 41 42 42 43 42 41 40 41 41 42 43 43 42 41 41 41 39 39 40 41 41 40 40 39 38 39 39 38 38 37 36 36 37 38 38 39 39 38 37 37 37 37 37 37 37 36 36 36 36 36 36 35 35 35 35 35 35 34 34 34 34 34 34 34 34 33 33 33 32 31 32 32 33 32 32 32 31 30 30 29 29 29 30 29 29 29 30 69 68 67 66 66 66 66 66 66 65 64 64 63 63 63 62 62 62 62 61 61 61 62 62 61 60 60 60 60 59 59 59 59 59 59 59 60 60 59 61 62 62 62 62 61 60 61 61 62 63 63 63 63 62 61 60 60 60 60 61 61 60 61 62 62 61 61 61 60 58 59 59 60 61 62 61 60 60 60 59 59 59 60 59 58 57 56 56 57 58 58 58 57 57 55 55 54 54 54 54 56 57 57 57 57 57 56 55 54 53 51 51 53 55 55 54 55 55 56 56 56 54 54 53 53 52 53 54 55 56 56 55 55 54 53 53 52 51 52 52 51 51 51 51 50 49 48 48 49 50 51 52 52 50 50 50 49 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 36 37 38 38 37 37 36 36 36 37 38 39 40 39 39 39 38 37 37 37 37 36 37 37 36 36 37 37 38 39 40 40 38 38 38 38 38 36 35 34 35 36 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 37 35 33 32 33 35 36 37 37 37 37 37 36 35 34 33 33 35 34 33 33 33 34 36 38 38 38 37 36 38 38 36 34 35 37 37 38 39 39 37 37 38 38 39 40 39 39 39 39 40 39 37 36 37 37 38 38 39 38 37 36 35 35 35 35 35 36 37 38 39 39 40 41 40 40 40 40 40 40 40 39 39 40 40 39 37 36 37 38 39 38 37 38 38 39 38 39 39 39 38 37 38 38 38 38 39 40 39 37 37 36 36 36 38 38 39 38 38 37 36 36 38 39 38 38 38 38 39 39 40 41 42 41 41 41 41 41 41 41 42 42 41 40 40 41 42 42 42 43 43 42 40 40 39 39 40 41 41 41 40 39 39 40 40 39 38 37 37 36 36 36 38 39 38 37 37 37 36 36 37 37 37 37 37 36 35 36 36 36 36 35 35 35 35 34 34 34 35 35 35 34 34 33 33 33 32 30 30 31 32 32 32 32 32 32 31 30 30 30 30 30 31 30 30 70 70 68 66 67 67 67 67 67 66 65 64 64 63 63 62 62 62 62 62 61 62 62 62 62 61 61 60 60 59 59 59 59 58 58 58 59 59 59 60 60 61 61 61 61 60 60 62 62 63 63 63 63 63 62 62 61 60 60 60 60 60 60 61 61 61 61 60 60 59 58 59 60 61 60 60 61 60 60 59 58 58 58 57 57 57 57 57 56 56 57 57 57 57 56 55 55 54 54 54 55 56 56 57 56 56 56 55 55 53 51 51 53 54 55 55 55 55 55 55 55 55 55 54 53 52 52 53 54 55 55 55 55 54 54 54 52 52 52 51 51 50 50 51 51 50 48 48 48 49 51 52 52 51 50 49 48 48 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 36 37 37 38 37 36 35 36 37 38 38 39 39 39 39 39 39 39 39 37 36 36 36 35 35 36 37 38 40 40 40 39 39 39 38 37 36 35 34 36 36 35 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 36 34 33 32 35 37 37 35 35 36 36 35 35 35 33 32 34 34 32 33 34 35 36 36 38 39 38 37 36 37 37 35 35 36 36 38 39 39 38 37 38 38 38 40 40 40 39 39 40 40 38 37 36 37 38 38 38 39 39 37 35 34 34 35 35 36 36 37 37 38 38 39 40 40 40 40 40 40 40 40 39 39 40 39 38 37 36 36 38 38 37 37 37 38 38 38 39 39 38 38 38 38 38 39 39 40 40 39 37 36 36 36 37 38 38 38 37 37 36 36 38 39 38 38 39 39 39 40 41 41 41 42 41 40 40 41 41 40 40 41 41 41 41 41 42 42 42 41 42 42 42 41 41 41 40 40 41 41 41 40 40 40 39 40 40 39 38 38 38 37 36 37 38 38 37 37 37 36 36 37 36 37 37 37 37 36 35 36 37 36 36 36 36 35 35 35 35 35 35 34 34 33 32 32 32 32 31 31 31 31 31 31 31 31 31 31 30 30 31 31 31 31 31 30 70 71 69 67 67 68 67 67 67 67 66 65 65 65 65 64 63 63 63 63 62 62 63 63 64 63 62 62 61 60 60 59 59 58 58 58 58 59 59 60 60 61 61 60 60 60 61 63 62 62 62 63 64 63 63 63 62 62 61 61 61 60 60 60 60 60 61 60 60 60 59 59 60 60 60 61 61 60 60 59 59 58 58 58 58 58 58 57 57 56 56 56 56 56 56 56 55 55 54 54 54 55 56 57 56 55 55 55 55 53 51 51 52 54 55 55 54 54 55 55 55 55 55 54 53 52 52 52 53 54 54 55 55 54 54 54 54 54 53 52 52 51 50 50 50 50 49 48 48 48 50 51 51 51 50 48 48 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 36 37 37 35 35 37 38 38 39 39 38 39 39 39 39 39 39 38 38 36 36 36 35 35 36 37 39 39 39 39 38 38 36 35 36 35 35 36 36 35 34 34 33 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 36 33 33 35 36 37 35 34 35 35 35 34 34 33 33 32 33 33 32 33 35 37 37 37 37 38 38 37 35 36 36 34 35 36 37 38 39 38 37 37 38 38 38 39 40 39 38 39 40 40 38 37 37 38 39 39 38 38 38 37 35 34 34 35 36 38 38 37 38 37 38 39 39 40 40 41 41 41 41 40 39 39 40 40 39 37 36 35 37 38 37 38 38 38 38 38 39 40 39 37 37 38 39 39 39 38 39 38 36 36 36 36 38 38 39 38 36 36 36 37 39 40 39 40 41 41 41 41 41 42 41 41 41 40 39 39 39 39 40 41 41 41 42 42 42 42 41 40 41 42 42 42 42 42 41 40 41 42 41 40 40 40 39 39 39 39 39 39 38 38 37 36 36 37 37 37 37 37 38 37 37 36 36 37 37 37 36 35 36 36 36 35 36 36 35 35 35 35 35 34 34 33 33 33 33 33 33 33 31 30 30 29 29 29 30 30 30 29 30 30 31 31 31 30 70 71 70 68 68 68 67 67 67 67 66 67 67 67 67 66 64 63 64 64 63 63 63 64 64 63 63 63 62 61 61 61 60 59 58 58 58 59 59 59 60 61 60 60 60 60 61 62 61 60 61 62 63 64 63 63 63 63 63 63 63 61 60 60 59 60 61 61 60 60 59 58 59 59 60 61 61 60 60 60 60 60 60 60 59 59 58 57 57 57 56 55 55 54 54 54 55 55 54 54 54 54 55 56 56 55 54 54 55 54 52 51 51 52 53 53 54 54 54 54 54 55 55 54 53 52 51 51 52 53 54 55 55 55 54 53 54 54 54 53 53 52 51 50 49 49 49 48 48 48 48 50 49 49 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 36 36 35 35 36 37 38 39 38 38 38 38 38 39 38 37 37 37 36 37 37 35 35 36 38 38 38 38 39 38 38 38 38 37 35 35 37 37 35 34 35 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 35 33 34 36 36 34 33 35 36 34 33 33 32 32 32 32 32 32 33 35 36 37 38 38 38 37 37 36 34 34 34 34 36 37 38 39 39 38 37 37 39 39 39 40 40 38 38 39 40 39 38 37 38 38 39 39 39 38 37 36 35 34 34 36 37 39 39 39 39 39 39 40 40 40 40 40 41 41 41 40 40 39 40 40 39 38 36 35 36 37 37 38 39 39 39 38 39 39 39 37 38 39 39 38 37 37 37 36 36 36 36 37 38 38 37 36 36 36 37 38 39 41 41 40 41 41 42 42 41 41 40 40 39 39 39 40 40 40 40 41 41 41 42 41 41 40 40 41 41 42 42 42 43 42 41 41 41 41 41 40 40 40 40 39 38 39 39 39 38 37 37 37 36 36 36 37 38 38 38 38 37 37 36 36 37 37 36 35 35 36 36 35 35 36 35 35 35 35 35 34 34 34 34 34 34 34 34 33 32 31 31 31 30 30 29 28 28 28 28 28 29 30 31 30 69 70 70 69 68 67 67 66 66 66 66 67 67 67 67 66 65 65 65 65 65 64 65 65 64 63 63 63 63 62 62 63 62 60 59 58 58 58 58 59 59 60 60 60 59 60 61 61 60 60 61 62 63 63 64 63 63 63 62 62 63 61 61 60 60 59 60 61 60 60 59 58 59 60 60 61 61 60 60 61 60 60 60 59 59 59 58 57 58 58 57 56 55 54 54 54 54 54 54 54 54 53 54 54 55 55 54 54 54 54 53 51 51 51 52 52 54 54 54 54 54 54 54 54 54 53 52 51 51 53 54 54 54 54 54 53 52 52 52 52 53 52 52 51 50 49 49 49 48 48 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 43 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 36 37 38 39 39 38 38 38 38 38 38 37 37 37 37 37 36 35 35 37 39 39 37 37 39 40 39 38 38 38 36 35 37 38 35 35 36 35 33 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 32 34 36 34 33 35 36 35 32 32 32 32 32 32 32 32 33 34 35 35 37 38 38 37 37 37 35 33 33 33 34 37 38 39 40 40 38 37 38 39 39 40 40 40 38 38 40 40 39 37 36 38 38 38 39 39 38 37 36 34 34 35 36 37 38 39 40 40 40 40 40 40 40 40 40 40 41 41 40 39 39 39 40 39 38 37 36 37 37 37 38 38 39 39 38 38 38 38 37 38 38 37 37 36 36 36 36 36 37 37 38 37 36 36 36 36 37 38 39 40 40 40 40 41 41 41 41 40 39 39 39 38 38 39 41 42 42 41 40 40 41 41 40 40 40 40 41 41 41 41 42 42 42 42 42 41 41 41 41 41 40 39 38 38 38 38 39 39 38 38 38 37 36 35 36 37 39 38 38 37 37 36 36 36 37 37 36 36 35 35 35 35 36 36 36 35 35 35 34 34 34 34 34 33 33 33 33 33 32 32 32 31 30 29 29 28 28 28 27 27 28 28 28 69 70 70 69 68 67 67 66 66 66 65 65 66 66 66 66 65 64 64 64 65 65 65 65 65 64 63 63 63 63 63 62 61 61 60 58 57 57 58 58 59 60 60 60 59 60 60 60 60 60 60 62 63 63 64 63 63 63 62 61 61 60 60 60 60 59 59 60 60 60 58 58 59 60 60 60 60 60 61 61 60 60 60 59 60 59 58 58 58 58 58 57 56 56 55 54 54 54 54 54 54 54 53 53 54 54 54 55 54 53 52 51 51 51 52 53 54 54 54 54 54 54 54 54 55 54 53 52 51 52 53 53 54 54 54 53 52 52 51 52 53 53 52 52 51 50 49 50 49 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 36 37 38 39 40 39 39 39 38 37 37 37 38 38 38 37 37 35 34 36 38 39 37 37 38 39 39 38 38 37 35 36 38 37 36 36 37 37 34 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 36 36 33 34 36 36 33 31 31 33 35 35 34 33 33 33 34 35 36 37 37 37 37 36 36 34 33 33 34 36 37 37 38 39 39 37 37 38 38 39 40 40 40 38 39 39 39 38 36 36 38 37 38 40 40 38 37 36 34 34 35 36 37 38 40 40 41 41 40 40 40 40 40 40 40 41 40 40 39 38 39 39 38 38 36 35 36 37 37 37 38 39 39 38 38 38 37 37 37 37 36 36 36 36 36 36 37 38 38 38 37 36 36 37 38 38 39 40 40 39 39 40 42 40 40 39 38 38 39 39 38 39 40 41 41 41 41 40 40 40 40 40 40 40 40 40 39 40 41 41 41 41 42 42 41 41 41 41 42 40 39 39 38 38 37 37 38 38 38 38 38 37 36 35 35 37 38 38 37 37 37 36 36 36 36 36 36 35 35 34 35 36 36 36 36 36 36 35 35 35 35 34 34 33 32 32 32 32 32 31 30 30 30 30 30 30 30 29 28 28 28 28 70 69 69 69 68 67 67 67 66 66 65 65 65 65 65 65 64 63 63 63 63 63 63 64 64 64 64 63 63 63 63 62 61 61 61 60 58 57 57 58 59 59 60 60 60 60 60 60 60 60 60 62 63 63 63 63 63 63 62 61 60 60 60 60 60 60 59 59 59 58 58 57 58 59 59 59 60 61 61 61 61 61 60 60 60 60 59 59 59 58 58 56 56 57 56 56 56 56 55 54 54 54 54 54 53 53 53 54 54 53 52 51 51 51 51 52 53 54 54 53 53 54 53 54 54 54 53 52 52 51 52 53 54 54 54 53 52 51 51 52 53 53 52 52 52 51 50 50 50 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 41 41 41 41 41 41 40 39 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 39 39 39 39 39 38 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 36 38 39 39 39 39 39 39 38 37 38 38 37 37 37 37 35 34 36 38 38 37 37 37 38 39 39 38 37 36 37 38 38 38 37 37 37 36 34 32 31 32 32 31 31 30 30 30 30 30 30 30 30 30 30 30 32 35 36 36 34 33 35 33 31 31 32 33 34 35 36 35 34 34 35 37 38 37 37 36 35 35 34 32 33 34 36 37 38 38 38 38 37 36 37 37 37 39 40 40 39 38 38 38 38 38 36 37 37 38 39 40 39 38 36 35 34 34 35 36 37 39 40 40 40 41 41 40 40 39 39 40 41 41 40 40 39 38 39 39 38 38 36 35 36 37 37 38 39 40 40 39 38 38 37 37 37 36 36 36 37 37 37 37 37 37 37 37 36 36 37 38 38 39 40 39 39 38 39 39 39 38 38 38 38 38 39 40 40 40 41 41 41 40 40 39 39 39 39 40 41 40 40 40 40 40 41 41 41 42 42 42 42 42 41 41 42 41 40 40 39 38 38 38 38 37 37 37 37 37 36 36 35 36 37 38 38 38 37 37 36 36 36 36 36 35 35 35 34 34 34 35 36 37 36 36 36 36 36 36 35 34 34 33 33 33 33 33 32 32 32 33 32 32 32 31 31 31 31 30 70 69 69 69 69 68 67 66 66 66 65 65 65 65 64 63 63 63 63 63 63 63 63 63 63 64 63 63 63 62 62 63 61 61 61 60 60 59 57 58 58 58 58 58 59 59 59 60 60 61 61 62 62 62 63 63 63 63 63 63 62 62 62 61 61 60 60 60 59 58 58 57 58 58 58 59 60 61 61 61 61 61 60 60 60 60 60 60 60 59 57 57 56 57 57 57 58 58 57 56 56 55 55 54 54 54 53 52 52 52 52 51 51 51 51 51 52 52 53 53 53 53 53 54 54 53 53 53 52 51 51 52 53 53 53 53 52 51 50 51 52 52 52 52 51 51 50 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 40 40 40 40 41 41 42 42 42 42 43 44 44 44 43 43 43 42 42 41 41 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 41 41 41 41 40 39 38 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 38 39 39 38 38 39 39 39 38 38 38 37 37 36 35 35 34 36 38 37 37 37 38 38 39 39 38 38 37 37 37 38 39 38 38 37 36 36 34 32 33 33 33 33 31 30 30 30 30 30 30 30 30 30 30 33 36 36 34 32 31 31 30 31 33 34 33 33 34 36 36 36 37 37 38 39 38 37 35 34 33 32 33 35 35 36 38 38 38 38 37 37 38 38 38 38 39 40 39 38 39 38 38 38 37 37 37 38 39 39 40 39 38 36 35 34 34 34 36 37 39 39 40 40 41 41 40 40 40 40 41 41 41 40 40 39 39 40 39 38 38 36 35 35 37 38 39 39 40 40 40 39 38 37 37 36 36 36 36 37 37 37 37 36 36 36 36 36 37 38 39 39 39 39 38 38 37 37 37 37 37 38 38 39 39 39 40 40 41 42 41 40 40 40 39 38 39 40 41 41 40 40 41 41 42 42 42 42 43 43 43 43 43 41 40 41 41 41 40 40 40 39 38 38 37 37 36 36 36 36 37 37 36 36 37 37 38 38 37 37 37 37 37 35 35 35 35 35 34 34 34 35 36 36 36 37 37 37 37 36 35 35 34 35 35 34 34 34 34 33 34 34 33 33 33 33 32 32 32 70 70 69 69 69 69 68 67 66 66 65 65 65 66 65 64 63 63 63 63 63 62 62 62 62 63 63 63 63 62 61 61 61 60 60 60 60 60 58 57 57 57 57 57 58 59 60 60 61 62 61 61 61 61 63 63 63 63 63 63 63 63 62 61 61 60 61 61 60 59 58 57 57 57 58 60 60 60 61 61 61 61 61 60 60 60 61 60 60 59 58 57 57 58 58 58 58 58 57 57 57 57 56 55 55 54 53 52 52 52 52 52 51 51 51 51 51 51 51 52 52 52 52 53 53 53 53 54 53 51 50 50 51 52 52 53 52 51 49 50 50 50 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 41 42 43 44 44 44 45 44 44 45 46 45 44 44 44 43 43 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 40 39 38 36 36 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 37 39 38 38 38 39 40 39 39 38 38 37 37 36 36 35 34 36 37 36 36 37 38 39 39 39 39 38 38 37 36 37 38 38 37 37 35 35 35 34 35 35 36 35 33 31 30 30 30 30 30 30 30 30 31 34 35 33 31 30 31 32 33 33 35 36 35 34 35 36 36 37 37 36 38 38 37 36 34 33 32 33 35 36 36 36 38 38 37 37 37 38 38 39 39 39 39 39 37 38 39 38 38 37 36 36 37 38 39 39 39 38 38 36 35 34 34 35 37 38 39 39 39 41 41 41 40 40 41 41 41 41 41 40 39 39 40 40 39 38 38 36 35 35 37 38 39 39 40 40 40 39 38 37 36 36 36 36 36 36 36 36 36 36 37 37 37 37 38 38 39 39 39 37 37 36 36 36 37 38 38 40 40 39 40 40 40 41 41 41 41 41 40 40 40 39 39 40 41 40 40 40 41 41 42 42 41 42 43 44 43 43 42 41 40 40 41 41 40 40 40 39 38 37 37 37 37 37 37 38 38 38 36 35 36 37 38 38 38 38 37 37 37 36 36 37 36 36 36 35 35 34 34 34 34 34 35 36 36 36 36 36 36 36 36 35 34 34 34 32 33 34 34 34 34 33 32 31 31 70 69 69 68 68 68 69 68 67 66 65 65 66 66 66 64 64 65 64 63 63 63 62 61 61 62 62 62 63 62 61 60 60 59 59 59 58 58 57 57 57 57 57 57 57 59 60 60 61 62 61 61 60 61 62 63 62 62 62 62 62 62 62 61 60 60 61 61 61 60 58 57 56 57 59 60 60 60 60 60 61 61 61 60 60 60 60 60 60 60 59 58 58 58 58 58 58 58 58 58 58 58 57 56 55 54 54 54 54 54 53 54 53 52 51 51 51 51 51 51 51 51 52 52 53 53 52 53 54 53 52 50 50 50 50 51 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 42 45 46 46 45 45 46 46 45 46 46 45 44 44 44 43 43 42 41 41 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 40 40 40 41 41 41 40 40 39 37 37 36 36 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 38 39 39 39 38 37 37 37 36 36 35 35 36 36 36 36 37 38 39 39 38 38 38 39 38 36 36 37 37 37 37 35 34 35 35 36 37 36 35 34 31 30 30 30 30 30 30 30 30 33 35 32 30 30 31 33 34 35 35 34 36 36 36 37 36 36 35 35 36 38 38 36 34 33 32 33 34 35 36 37 37 38 37 37 37 37 37 38 39 40 40 40 38 37 38 39 38 38 37 36 36 37 38 39 39 39 37 36 36 35 34 34 36 38 39 40 40 40 41 41 41 40 40 40 40 40 41 41 40 39 39 40 40 40 40 38 37 36 35 37 38 38 38 39 40 39 38 37 36 35 36 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 37 36 36 36 37 38 38 39 39 40 40 40 41 41 41 42 42 41 41 41 41 40 40 39 39 40 40 40 40 40 40 40 41 41 41 41 42 43 42 42 41 40 39 40 40 40 41 40 40 39 38 38 37 36 37 38 38 39 39 38 37 36 35 36 37 38 38 38 38 37 37 37 36 37 36 36 36 35 35 35 34 34 34 34 33 34 34 35 34 35 36 35 35 35 34 34 34 32 31 32 33 33 32 31 30 30 28 69 69 69 68 68 67 68 69 69 67 66 66 66 66 65 65 65 65 64 63 63 63 62 61 60 61 61 61 61 62 62 61 60 59 58 58 58 58 58 57 57 57 57 57 57 58 60 60 61 61 61 60 60 61 62 62 62 61 61 61 62 62 61 61 60 60 60 60 60 60 58 57 56 57 59 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 59 58 58 58 58 58 57 57 58 58 57 56 55 55 55 55 55 54 54 54 54 53 53 52 51 51 50 50 50 50 51 51 51 52 52 52 53 53 52 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 43 44 45 47 47 46 46 46 46 46 46 46 46 45 44 43 43 43 43 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 41 41 40 40 40 39 39 38 37 36 36 36 35 35 35 36 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 38 39 39 38 38 37 36 36 35 35 34 34 35 35 36 37 37 37 38 39 37 37 38 38 37 37 36 35 36 37 37 36 35 36 36 37 38 36 35 35 32 30 30 30 30 30 30 30 30 32 32 30 30 31 32 33 34 36 36 35 36 36 37 37 36 35 36 36 37 37 36 35 34 33 33 34 36 35 36 38 38 38 37 37 37 37 37 38 38 39 40 40 38 37 38 39 39 38 38 36 36 37 38 39 39 38 37 36 35 34 34 35 36 38 39 40 40 40 40 41 40 40 40 40 40 41 42 42 41 39 39 40 40 40 40 39 38 36 36 37 38 38 38 39 40 39 37 36 35 35 37 38 38 39 39 39 39 39 38 39 38 38 37 37 37 37 37 37 37 38 38 39 39 39 39 40 41 41 41 42 42 41 41 41 41 40 41 40 40 39 38 39 40 39 40 40 40 41 41 40 40 41 41 41 42 42 42 41 40 39 40 40 40 40 40 39 39 39 38 37 37 37 38 37 39 39 38 38 36 36 35 35 36 37 37 37 37 37 37 37 37 36 36 35 35 36 36 36 35 36 36 35 34 34 34 33 33 34 34 33 32 33 33 32 30 29 30 30 30 30 29 28 28 29 69 69 68 68 67 67 67 68 69 68 66 66 66 66 66 66 65 64 63 63 63 62 61 61 60 60 60 60 60 60 60 60 60 60 59 60 61 60 60 59 58 57 57 57 57 57 59 60 61 61 60 60 60 62 62 61 61 61 61 60 61 61 61 61 61 61 60 59 59 59 58 57 57 57 58 58 59 60 60 60 60 60 60 60 60 60 59 57 57 58 60 60 59 58 58 58 58 57 57 57 57 58 57 56 55 55 55 55 56 56 55 54 54 54 54 54 53 53 52 50 50 50 50 49 49 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 44 44 45 46 47 48 47 46 45 45 44 44 44 45 44 43 43 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 41 41 41 41 41 40 40 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 38 39 39 38 37 37 36 36 36 35 35 34 34 36 37 38 37 36 38 38 37 37 37 37 37 37 36 35 36 38 38 37 36 36 38 36 36 37 36 36 33 30 30 30 30 30 30 30 30 30 30 30 30 31 33 33 34 36 36 36 37 37 37 36 34 34 36 37 37 36 35 34 33 33 34 35 36 36 36 38 38 37 36 37 37 37 38 39 39 38 39 39 37 37 39 39 38 38 37 36 36 38 39 39 39 38 37 35 34 34 34 36 38 39 40 40 39 40 40 40 40 39 40 40 41 42 42 42 41 39 39 40 41 40 40 39 38 36 36 37 38 39 38 38 39 38 36 35 36 37 39 39 40 40 40 40 39 38 37 37 37 37 37 36 37 37 37 37 38 38 39 39 39 39 39 40 40 40 41 41 41 41 41 41 40 40 41 40 40 39 38 38 39 40 40 40 40 41 41 40 40 40 40 41 41 42 42 41 40 40 40 40 40 40 40 39 39 39 38 37 38 38 38 38 39 39 39 38 38 37 36 35 35 36 36 37 37 37 37 37 37 37 36 36 37 37 37 37 36 36 36 37 36 35 35 33 32 33 33 31 30 31 31 30 30 30 29 29 29 30 29 29 31 33 69 69 68 67 67 67 66 67 69 69 68 68 67 66 65 65 65 64 63 62 63 62 61 61 61 61 62 61 60 60 60 59 59 61 61 61 61 61 61 60 60 58 57 57 57 57 58 60 61 61 60 60 60 61 62 61 60 60 61 60 60 61 61 61 61 61 61 59 58 58 58 58 56 56 57 58 59 60 60 59 59 60 60 60 60 60 58 57 57 57 59 60 59 58 58 58 57 57 57 57 57 57 58 57 56 55 55 56 57 57 56 54 55 55 55 55 54 54 53 52 51 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 49 48 48 48 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 44 44 44 42 42 43 44 45 46 48 48 48 46 45 45 45 44 43 43 43 43 43 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 38 39 39 38 37 37 37 38 37 36 36 34 33 35 36 37 36 36 37 37 37 37 37 37 36 36 35 35 37 37 37 38 37 37 37 35 34 34 34 32 31 30 30 30 30 30 30 30 30 30 30 31 33 35 36 35 35 35 36 37 37 38 37 36 34 33 35 36 36 36 35 33 32 33 35 35 36 37 37 37 36 36 36 37 38 38 39 40 39 38 38 37 37 38 38 37 37 36 36 36 37 38 38 39 38 38 36 35 34 34 35 36 38 40 40 39 39 40 40 39 39 40 41 41 41 42 41 41 41 39 39 40 41 40 39 38 37 36 35 36 38 39 38 38 38 37 35 36 37 38 40 40 41 40 39 39 38 36 36 37 37 37 38 38 38 38 38 38 38 38 38 39 38 38 39 40 40 40 41 41 40 40 41 41 40 40 41 40 39 39 38 37 39 40 40 40 40 40 40 39 40 41 41 41 41 41 42 42 41 40 39 39 40 40 40 40 39 38 38 38 39 39 39 39 39 38 37 38 37 37 37 36 35 36 35 36 37 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 34 33 33 33 32 31 31 30 31 33 32 31 31 31 32 32 31 33 33 68 69 69 67 67 67 66 67 68 68 68 68 68 67 66 65 64 63 63 64 64 63 62 63 62 62 63 62 61 62 62 61 61 62 62 62 62 62 61 61 61 60 58 57 57 56 58 60 61 61 60 60 61 61 61 61 60 60 60 60 60 61 61 60 60 61 61 60 59 58 58 57 56 56 58 59 60 60 60 59 59 60 59 60 60 60 58 58 57 57 58 59 59 59 58 58 57 57 57 56 56 57 58 57 57 56 55 55 56 57 56 55 55 55 55 55 55 54 54 53 52 51 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 50 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 45 45 45 44 43 42 43 45 45 46 47 48 48 46 46 46 46 44 44 43 43 43 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 39 38 38 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 40 39 39 38 38 38 37 37 36 35 34 33 33 34 35 35 35 36 36 36 36 37 37 37 36 35 35 36 36 38 38 37 37 36 35 34 34 33 31 30 30 30 30 30 30 30 30 30 30 30 32 35 36 36 36 35 36 36 37 36 37 37 36 34 34 35 35 35 35 34 33 33 33 34 35 37 37 37 36 36 35 36 37 37 38 39 39 38 38 38 37 37 38 37 36 36 36 36 37 37 37 37 38 38 37 35 34 34 34 36 37 37 39 40 39 39 39 39 38 39 40 41 41 41 41 40 41 41 40 40 40 41 40 39 38 38 36 35 37 38 38 38 38 38 36 35 36 37 38 39 40 41 40 39 37 37 36 37 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 41 41 41 41 41 41 40 40 41 40 40 40 41 40 39 39 39 38 39 40 40 39 40 40 39 38 39 41 42 41 40 41 42 42 41 40 40 39 39 40 40 40 39 39 39 40 40 40 39 39 39 38 38 37 37 38 38 37 37 37 35 34 35 35 35 35 35 36 36 37 37 37 37 37 37 36 36 36 36 36 35 35 35 35 35 34 33 32 31 33 34 34 34 33 33 34 33 33 32 31 67 68 69 68 67 67 66 66 67 67 66 67 67 67 66 66 64 64 64 65 66 64 63 63 63 63 63 63 62 63 63 63 62 63 63 63 63 62 61 61 61 60 59 57 57 56 56 59 61 61 60 60 60 60 61 61 60 59 59 59 60 60 60 59 60 61 61 61 60 59 58 57 56 57 58 59 60 60 59 58 58 58 58 59 60 59 58 58 57 57 58 58 59 59 58 57 57 57 57 56 56 57 58 57 57 56 55 55 55 56 56 56 56 55 55 55 55 55 54 53 52 52 51 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 43 44 46 46 46 45 44 43 42 43 44 45 46 47 48 48 47 46 46 45 44 45 45 44 43 43 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 39 40 40 41 40 40 40 40 40 40 40 40 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 38 39 40 39 39 38 38 37 37 36 36 36 34 34 33 33 34 35 35 35 36 37 36 37 37 36 34 34 36 36 38 39 37 36 36 35 36 35 33 30 30 30 30 30 30 30 30 30 30 30 30 33 34 34 34 36 36 36 38 38 35 35 36 35 34 34 34 34 34 33 32 33 35 35 35 36 37 37 36 35 36 37 38 38 38 38 38 38 39 38 37 37 38 38 37 35 36 37 38 37 37 36 37 38 38 36 34 33 34 35 37 37 38 39 40 40 39 39 39 39 40 41 41 42 41 41 40 40 41 40 39 40 41 40 39 39 38 36 35 37 39 39 38 38 36 36 36 36 38 39 39 40 40 40 39 37 36 37 38 38 39 39 38 37 38 38 38 38 38 38 38 39 40 41 41 41 42 41 41 41 40 40 40 40 40 41 41 40 40 39 39 38 38 39 39 39 39 40 39 38 40 40 41 41 41 41 41 41 40 40 40 40 39 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 38 37 36 35 35 35 35 34 34 34 34 35 36 36 37 37 37 37 36 36 36 36 36 35 35 35 35 35 34 33 33 33 34 34 34 34 34 34 33 33 33 32 31 67 68 68 68 67 67 66 66 66 66 66 66 67 67 67 67 65 65 65 65 66 66 65 64 63 64 64 63 63 63 64 64 63 63 63 63 62 61 61 60 60 60 59 58 57 56 56 57 59 60 59 59 60 60 61 61 60 58 58 59 59 60 60 59 60 61 60 60 60 59 58 57 56 57 58 59 59 59 59 58 57 58 58 59 59 59 58 58 57 57 57 58 58 59 58 57 57 57 56 55 55 56 57 57 57 56 55 55 55 55 55 56 55 55 55 54 54 54 53 52 51 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 43 44 45 46 46 47 46 46 45 43 43 43 43 44 45 46 48 48 47 47 46 45 45 46 46 45 44 43 44 44 44 43 43 42 41 41 42 41 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 38 38 39 40 41 41 40 40 39 39 39 40 40 40 40 39 38 37 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 39 40 40 39 39 38 38 37 37 37 36 35 35 35 33 33 33 34 34 36 37 36 37 37 37 35 34 35 35 37 38 37 36 35 35 35 34 32 30 30 30 30 30 30 30 30 30 31 32 32 34 35 34 34 36 38 38 39 38 35 34 35 34 34 33 33 33 32 32 32 33 36 36 37 38 38 37 35 35 36 38 38 38 38 38 38 38 39 38 36 37 38 37 35 35 36 38 38 37 36 36 37 37 36 35 34 33 35 36 38 38 39 40 40 39 39 39 40 40 40 41 42 42 41 41 40 40 41 39 39 40 41 40 39 39 38 36 35 37 38 38 38 37 36 36 37 37 38 38 38 39 39 38 38 37 36 37 38 39 40 40 40 39 39 39 39 39 39 39 39 38 39 40 41 40 42 41 41 41 39 39 40 41 40 40 41 41 40 40 40 39 38 38 38 39 39 40 39 38 40 41 41 40 40 40 39 39 40 40 41 41 39 39 40 40 40 39 39 40 40 40 40 40 40 39 39 39 39 39 39 39 38 36 36 37 37 36 36 34 34 33 33 34 35 36 37 37 37 37 37 36 36 36 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 33 32 33 33 33 67 67 67 68 67 67 66 66 66 66 66 66 67 67 67 67 66 67 67 66 66 66 66 65 65 64 64 63 63 63 63 63 63 63 63 63 62 62 61 61 61 60 60 59 57 57 56 56 57 59 59 58 58 59 60 60 60 59 58 58 58 59 59 58 59 60 60 60 60 59 58 58 56 56 58 58 57 58 58 58 57 57 57 58 59 58 58 58 57 57 57 57 57 58 58 58 57 57 56 55 54 55 56 57 57 56 55 55 55 55 55 55 54 54 54 53 53 52 51 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 46 47 46 46 46 46 45 44 43 43 43 44 45 46 48 48 47 47 46 46 45 45 45 45 44 44 44 44 44 44 43 43 42 42 41 41 40 40 40 40 40 40 39 39 39 39 38 38 39 39 38 38 38 38 38 39 40 41 40 40 39 38 38 39 39 39 39 39 39 38 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 39 39 40 40 40 39 38 37 37 37 37 36 36 36 35 33 32 33 34 35 36 36 36 37 37 36 34 35 35 37 37 36 35 34 33 33 33 31 30 30 30 30 30 30 30 30 30 32 34 35 35 35 36 37 38 38 38 39 38 35 34 34 34 33 32 31 32 32 33 34 34 36 37 38 38 38 36 35 35 37 38 38 38 38 38 39 38 38 37 36 38 37 35 35 36 37 38 38 37 36 36 37 36 35 34 33 34 35 37 38 39 40 40 39 38 39 40 41 41 41 41 41 41 41 41 40 40 40 39 39 41 41 40 40 38 37 36 36 37 38 38 38 37 36 36 37 38 39 38 38 37 37 36 36 37 37 37 38 39 40 40 39 39 40 40 41 41 40 40 40 39 39 40 40 41 41 41 40 40 39 40 41 41 40 40 41 41 41 41 41 40 39 38 38 39 39 39 39 39 40 41 41 39 38 39 39 39 40 41 40 40 40 39 39 39 39 39 39 40 40 41 40 40 40 39 39 38 38 38 38 38 38 38 37 38 38 37 37 36 35 34 33 33 33 34 35 36 37 37 37 37 37 37 37 36 35 34 35 35 35 35 35 35 35 36 35 34 34 34 34 34 34 33 67 66 67 67 68 67 67 67 66 66 66 66 66 67 67 66 66 66 67 67 66 66 66 66 66 65 64 64 64 64 63 63 63 62 62 62 62 62 61 61 61 61 60 59 58 57 57 56 56 57 58 58 58 59 59 60 60 59 58 58 58 58 59 58 58 59 59 59 59 58 58 58 57 56 56 57 57 57 58 58 58 57 57 58 58 58 58 57 57 56 57 57 57 57 58 58 58 58 57 56 55 54 54 56 56 55 55 54 54 54 54 54 53 53 53 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 45 45 46 46 46 47 46 46 46 46 46 45 44 44 44 44 45 46 48 48 47 47 47 46 46 45 44 44 45 45 44 43 43 44 43 43 42 43 42 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 39 39 38 38 38 39 39 38 39 38 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 38 39 40 39 39 38 38 38 37 37 37 36 36 36 35 35 33 33 34 35 36 37 36 35 35 36 34 34 36 37 37 35 36 35 33 33 33 32 30 30 30 30 30 30 30 30 30 31 34 36 36 35 38 39 39 38 37 38 37 35 34 33 32 31 31 32 32 33 34 36 36 36 37 38 38 38 36 35 35 37 38 38 37 37 38 38 37 36 36 36 38 37 35 36 37 38 37 36 36 35 35 36 35 34 33 33 35 36 37 38 39 40 40 38 38 39 41 41 41 41 41 41 42 41 41 40 40 39 39 40 41 41 40 39 38 37 36 36 38 38 38 38 37 36 36 37 38 38 37 36 37 36 36 37 38 38 38 38 38 38 39 39 39 39 40 41 40 40 40 40 41 41 40 41 41 40 39 39 40 40 40 40 40 41 41 41 40 40 41 41 41 39 38 37 38 38 38 39 40 40 41 41 38 37 38 39 40 40 41 41 40 40 40 39 38 38 39 40 40 40 40 40 40 40 40 39 39 39 38 37 37 38 38 38 39 39 37 37 37 36 35 34 33 33 32 33 35 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 35 36 37 36 35 35 35 35 34 34 34 66 66 66 67 67 67 67 67 67 66 65 65 65 66 66 66 66 66 66 66 66 66 65 66 66 65 65 65 64 64 63 63 62 62 61 62 62 61 61 61 61 61 60 59 58 57 57 56 56 55 55 56 58 59 58 59 59 58 57 57 57 58 59 58 58 58 58 58 58 58 58 58 57 56 56 57 57 57 58 59 58 57 56 57 57 57 58 57 57 56 56 56 56 57 57 58 58 57 56 55 55 54 54 54 54 54 54 54 53 53 53 52 52 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 46 47 47 46 47 47 47 46 46 46 45 44 44 45 44 43 44 46 47 48 47 47 46 45 46 45 43 43 43 44 45 44 43 43 43 42 41 41 41 40 40 41 41 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 40 39 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 38 39 39 39 38 38 38 37 37 37 37 37 37 36 35 35 34 33 33 34 36 36 36 35 34 35 34 34 35 36 36 36 37 37 35 35 34 32 30 30 30 30 30 30 29 29 30 32 35 36 36 37 39 39 38 37 37 37 36 35 34 32 31 31 32 34 34 34 35 37 38 37 37 37 38 37 35 35 36 38 38 37 38 38 37 37 36 36 36 37 37 36 35 36 38 39 38 37 36 36 35 35 35 34 33 34 35 37 38 38 39 40 39 38 38 40 41 41 41 41 41 41 42 42 42 41 40 39 40 42 42 41 40 39 38 37 36 36 37 38 38 39 37 36 35 36 37 37 36 37 38 38 39 40 40 39 38 38 38 38 38 38 38 39 40 39 39 40 40 40 40 40 40 39 39 39 39 39 40 41 41 40 40 41 41 41 40 40 40 41 41 40 39 38 37 38 38 39 39 40 40 40 38 37 38 40 40 40 41 41 41 40 39 38 38 38 38 39 40 41 40 40 40 40 40 39 39 39 39 38 38 37 37 38 39 39 38 37 37 36 37 36 35 34 33 33 34 35 36 37 37 36 36 36 37 37 37 37 36 36 37 36 35 36 37 37 36 35 34 34 34 33 34 64 66 67 67 66 66 67 67 67 66 66 65 65 65 66 66 66 66 65 66 66 66 65 65 65 65 65 65 64 64 64 63 63 62 61 61 61 61 60 61 61 61 60 60 59 58 57 56 56 55 55 55 56 57 57 58 58 57 57 57 57 58 58 58 58 57 57 58 58 58 58 58 57 56 55 56 57 57 58 59 58 57 57 56 56 56 57 57 57 56 55 56 57 57 57 58 57 57 56 55 54 54 53 52 53 53 53 52 52 52 52 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 45 45 45 45 45 45 45 45 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 45 45 45 45 45 45 45 45 45 45 45 44 46 47 46 46 46 46 48 47 47 47 46 46 45 45 45 45 44 45 44 43 44 46 47 48 47 46 45 45 45 44 43 42 42 43 44 44 43 43 42 42 41 40 40 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 39 38 38 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 35 37 38 39 39 39 38 38 37 37 36 36 37 37 36 35 35 34 33 32 32 33 35 36 36 36 35 34 34 34 36 37 36 37 37 36 35 34 33 31 30 30 30 30 30 29 29 29 30 33 35 36 36 37 37 36 35 36 36 35 36 33 31 32 33 33 34 35 35 35 37 37 37 37 37 37 36 34 35 37 38 37 37 38 37 36 35 36 37 38 37 37 35 34 36 38 39 38 38 37 37 36 35 34 34 34 34 36 38 39 38 38 39 38 37 38 40 40 40 40 40 40 41 42 42 41 41 39 39 41 41 41 41 40 40 39 39 37 36 38 37 37 38 37 36 36 37 37 37 38 38 39 39 40 40 40 40 39 40 40 40 39 38 38 38 38 38 39 40 40 40 39 39 39 39 39 40 41 41 41 42 42 41 41 42 41 41 41 40 40 40 41 40 40 39 37 37 39 39 38 38 38 38 38 38 38 39 39 40 41 41 41 40 38 38 39 39 39 39 40 40 40 40 39 39 38 38 38 39 39 39 39 38 37 37 38 39 38 37 37 36 37 37 37 36 34 33 33 34 35 36 36 36 35 35 35 35 36 36 36 36 36 36 36 36 35 36 36 35 33 32 33 31 30 64 65 67 67 66 66 66 67 67 67 67 66 65 64 65 66 66 65 65 65 65 65 65 65 64 63 63 64 64 64 64 64 64 63 62 61 60 60 60 60 60 61 61 60 60 60 58 57 56 56 55 55 55 56 57 57 58 57 57 57 56 57 58 58 58 57 56 57 58 58 58 57 56 55 55 55 57 57 58 58 58 58 58 57 55 56 57 57 57 56 55 55 57 57 57 57 57 56 55 54 54 53 52 52 51 51 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 45 45 46 46 47 47 47 46 46 46 46 46 46 45 45 46 46 45 46 46 45 45 45 46 46 46 46 47 47 47 47 46 46 45 46 47 48 47 46 46 47 48 48 47 46 46 46 46 46 46 45 45 45 44 44 46 47 48 47 46 45 45 44 43 42 42 41 42 42 43 43 43 43 43 42 41 41 42 41 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 41 40 39 39 39 39 38 38 38 39 38 36 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 36 38 38 38 39 39 38 37 37 36 36 36 37 37 36 35 34 34 33 32 32 34 35 36 37 35 34 34 35 36 36 36 36 37 36 35 34 33 32 31 30 30 30 30 29 29 29 29 30 32 35 35 36 36 35 35 36 36 35 33 32 31 32 34 35 35 36 36 36 37 36 37 37 36 35 34 34 35 37 37 37 37 37 36 35 36 37 38 38 38 37 35 35 38 39 38 37 36 36 36 35 35 34 34 34 35 37 38 38 38 38 38 37 38 39 40 40 40 40 39 40 41 41 41 40 40 39 38 40 40 40 40 40 40 40 39 37 36 38 37 36 37 37 37 38 39 39 39 39 38 39 39 40 39 39 40 40 40 41 41 40 40 39 39 39 40 40 40 39 39 39 39 39 39 40 42 42 42 42 42 42 41 41 42 41 42 42 40 39 40 40 40 40 39 37 37 37 38 37 37 37 37 38 38 38 38 39 40 40 40 40 40 38 38 39 40 40 40 40 40 40 40 39 38 38 38 39 39 38 38 38 38 37 37 37 38 37 37 37 37 36 37 37 36 35 34 34 34 34 34 34 35 35 35 35 35 35 34 34 35 34 36 36 35 33 34 34 34 32 31 30 29 29 63 64 66 66 66 66 66 66 66 67 67 66 65 64 64 65 65 64 64 64 64 64 64 64 64 63 63 63 63 63 63 64 64 63 63 62 61 60 60 60 60 60 60 60 60 60 59 58 57 56 55 55 55 56 56 57 57 58 58 57 56 57 58 58 58 57 56 57 58 58 57 56 56 55 54 54 55 57 57 57 57 57 57 57 56 55 56 56 56 56 55 55 56 56 55 56 55 54 53 53 53 52 52 51 51 51 51 51 51 51 51 50 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 48 49 49 49 48 48 48 47 47 48 47 47 47 47 47 47 47 48 47 47 46 47 48 48 47 48 49 48 47 47 47 46 45 46 47 47 47 47 48 48 48 47 46 47 47 46 46 46 45 45 46 45 45 46 47 47 47 46 45 44 44 43 43 43 42 41 41 43 43 43 44 43 42 42 42 42 41 41 41 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 41 40 40 40 40 39 39 39 39 38 37 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 35 37 38 38 38 38 38 37 37 37 36 35 36 36 36 35 35 35 34 33 32 33 35 36 36 35 33 34 36 36 34 35 36 36 36 34 34 33 32 31 30 30 30 30 30 30 30 29 29 30 33 35 35 34 34 35 35 35 33 31 31 32 33 34 35 35 35 36 36 35 36 37 36 34 33 34 35 37 37 36 36 37 36 35 36 37 38 39 39 38 36 35 36 39 39 38 37 36 36 36 35 35 34 33 34 36 38 38 37 38 38 38 37 38 38 39 39 39 39 38 39 40 40 40 39 39 38 38 39 40 40 40 39 39 39 38 36 35 36 36 36 37 37 38 39 39 39 40 39 39 40 39 40 40 40 40 40 40 41 41 41 40 40 40 40 40 40 39 38 39 40 40 40 40 41 42 42 43 42 42 42 42 41 40 40 41 42 40 39 40 40 40 40 39 38 37 36 36 36 37 37 38 38 38 38 39 40 40 40 39 39 40 38 37 38 39 39 40 40 40 40 40 39 39 39 39 39 39 37 37 37 38 37 37 37 37 37 37 37 38 37 36 36 36 35 35 34 34 33 33 33 33 33 35 35 35 34 33 32 33 33 34 33 32 31 31 31 31 30 29 29 29 30 63 63 64 65 65 66 66 65 66 66 66 66 66 65 64 64 64 64 63 63 63 63 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 61 61 61 60 59 60 59 58 58 58 58 57 56 55 55 55 55 56 56 57 57 57 56 56 57 57 58 57 57 57 57 58 58 57 57 56 55 53 53 54 55 55 55 56 56 56 56 55 55 55 55 55 56 55 54 54 55 54 53 53 53 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 52 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 48 49 49 50 50 49 49 49 49 49 48 47 48 48 47 48 48 48 48 48 49 49 48 48 48 48 49 48 48 49 49 48 48 48 47 46 46 46 46 47 48 48 49 48 47 47 47 47 47 46 46 45 45 46 45 45 46 46 47 48 47 46 45 45 44 44 44 44 42 41 41 42 42 43 43 42 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 40 40 40 40 39 38 38 38 38 36 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 36 37 37 38 37 37 37 37 37 36 35 35 36 37 36 35 35 34 33 32 33 35 36 35 34 33 33 35 35 34 34 35 36 36 34 34 33 32 31 30 30 30 30 30 30 30 29 29 29 31 34 34 33 35 35 34 33 32 31 32 33 34 34 35 35 35 36 36 34 35 37 35 34 33 35 37 38 37 36 37 36 35 35 37 37 39 39 38 37 36 35 37 38 38 38 37 38 38 37 35 34 34 33 34 36 38 38 37 38 38 37 37 38 38 39 39 38 38 38 38 38 39 40 39 38 38 38 39 40 40 39 38 38 37 37 36 35 35 35 36 36 36 38 39 39 40 40 39 40 40 40 40 40 39 39 40 40 40 40 40 40 41 40 39 39 39 38 38 39 40 39 40 41 41 42 42 42 42 40 41 42 41 40 40 40 41 40 39 40 41 40 40 40 39 38 36 36 36 37 37 38 38 38 39 40 39 39 40 39 38 38 38 38 39 39 39 40 39 39 38 38 39 39 39 39 38 38 38 38 39 38 38 37 37 37 37 37 38 38 37 36 36 35 36 37 36 35 33 34 34 33 32 32 33 33 33 33 33 32 31 32 32 30 30 29 29 30 30 30 30 32 32 63 63 63 63 64 64 65 66 66 66 66 66 66 66 65 63 63 63 63 63 63 63 63 64 64 64 64 64 63 63 62 62 62 62 62 63 62 62 62 61 60 60 60 60 59 58 58 58 57 57 56 56 55 55 55 55 55 56 56 55 55 56 57 57 57 57 57 57 57 56 56 55 55 54 53 53 53 53 53 53 54 54 54 54 54 54 53 53 53 54 54 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 46 46 46 46 46 46 47 47 47 47 48 48 49 49 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 48 48 48 47 47 46 46 46 47 48 49 49 48 48 48 47 47 46 45 45 46 46 45 45 46 47 48 47 46 46 46 45 44 44 44 43 43 42 41 40 40 41 42 41 41 40 40 40 40 40 40 41 41 40 40 39 38 38 37 37 38 38 38 38 38 37 37 37 37 37 38 38 39 40 40 39 39 39 39 39 38 37 38 38 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 37 36 36 37 37 37 37 36 35 36 37 36 35 34 34 34 32 32 33 35 35 34 33 33 34 34 34 36 36 37 36 35 34 33 32 32 31 30 30 30 30 29 29 29 29 29 32 34 34 34 35 34 33 31 32 33 34 33 34 34 35 36 36 36 36 35 35 36 35 34 35 36 37 37 36 36 37 35 34 36 36 38 39 38 37 36 35 36 37 37 37 38 37 37 38 37 35 34 34 34 34 35 36 37 38 39 37 36 37 38 39 39 39 38 37 38 38 38 39 40 39 39 39 38 38 40 40 38 37 37 36 35 34 35 36 36 36 37 37 37 38 39 40 40 39 39 39 40 40 38 37 38 40 40 40 40 40 41 40 39 38 37 38 38 39 39 40 40 40 40 41 41 41 42 41 40 40 41 42 41 40 40 39 39 39 40 40 40 40 40 39 38 37 36 37 37 37 38 38 39 39 40 39 38 39 38 38 38 39 40 40 40 40 40 40 39 38 37 37 37 38 38 38 38 39 39 40 39 38 38 38 37 37 37 37 38 37 37 36 36 37 37 36 35 34 35 35 35 34 32 32 33 34 34 35 32 30 31 31 30 30 30 31 32 33 31 32 33 33 63 63 63 63 63 63 65 66 66 66 66 66 66 65 64 64 64 63 63 63 63 63 63 63 63 64 64 64 64 63 63 62 62 62 62 62 63 63 62 61 60 60 61 61 60 60 59 58 58 58 57 57 56 55 55 55 54 54 54 54 54 55 56 56 56 56 56 55 55 55 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 47 46 46 46 46 47 47 47 48 48 49 49 48 49 50 50 50 51 51 51 50 50 50 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 50 49 49 49 49 48 48 47 47 47 47 47 48 49 49 49 48 47 47 46 45 46 47 47 46 45 45 47 48 46 45 44 45 44 43 43 43 43 42 42 42 41 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 38 37 37 37 37 37 37 37 37 37 38 38 39 40 39 39 38 38 38 37 37 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 36 36 35 35 35 35 36 35 35 36 37 37 36 35 35 34 33 31 32 34 34 34 33 32 33 34 35 37 37 37 36 35 35 34 33 31 30 30 29 29 29 29 29 29 29 29 32 34 33 34 35 33 31 32 33 33 33 33 34 35 36 37 37 36 35 35 35 35 34 34 36 36 36 35 36 37 37 35 34 36 38 38 38 38 37 35 35 36 37 37 37 38 37 37 36 36 34 34 33 33 34 35 36 37 38 38 36 37 38 38 40 40 38 37 37 37 38 39 40 40 40 40 39 37 38 39 39 38 37 36 35 34 34 35 36 38 38 38 38 38 39 39 40 40 39 38 38 40 39 37 38 38 39 40 40 40 40 40 40 38 37 37 38 39 39 38 39 39 39 40 40 41 41 42 41 39 39 40 40 42 41 39 39 39 40 40 39 39 40 40 40 38 36 36 37 38 38 38 38 39 39 40 39 38 37 37 38 40 40 40 40 40 40 40 40 39 38 37 37 37 37 39 40 39 39 40 40 39 39 38 38 37 37 37 37 38 37 37 36 36 37 37 37 36 35 35 35 35 34 33 34 35 36 36 35 33 31 32 33 31 31 32 33 34 34 33 34 33 33 63 63 63 63 63 63 64 65 66 66 66 66 66 66 65 65 65 64 64 64 64 63 63 62 63 63 63 63 64 64 63 63 63 62 62 62 63 63 62 61 62 61 61 61 61 60 59 59 59 59 58 58 57 57 56 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 52 51 51 52 52 52 51 51 52 51 51 52 52 53 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 47 47 47 47 47 47 47 47 48 49 50 50 50 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 49 48 47 48 48 49 49 48 48 47 47 47 47 47 47 46 45 45 47 48 46 45 45 44 44 44 43 42 42 42 41 41 42 41 41 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 39 39 40 39 39 38 38 37 37 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 36 35 35 35 34 34 34 34 36 37 37 37 36 35 34 33 32 32 33 34 34 34 33 32 33 35 36 36 36 35 35 35 35 33 31 30 29 29 29 29 29 29 30 29 29 31 32 32 34 35 32 30 32 33 32 33 34 34 35 37 37 37 37 36 36 35 34 33 34 36 36 35 35 36 37 36 35 35 37 38 38 38 37 36 35 35 36 36 37 38 38 38 37 35 34 34 33 32 33 34 35 36 37 37 36 36 38 38 38 40 39 38 37 37 38 39 40 40 40 40 39 38 36 37 39 39 38 37 36 34 34 34 35 36 38 38 39 39 38 39 39 40 40 39 38 38 39 38 37 38 38 38 39 39 39 39 40 40 39 37 37 38 38 38 38 39 39 39 39 40 40 41 41 40 39 38 39 40 42 41 39 38 40 40 39 38 39 40 39 38 37 36 36 37 38 38 37 37 38 39 39 40 38 36 37 38 39 40 40 40 40 40 40 39 39 38 38 38 38 39 40 40 39 38 39 39 39 39 38 38 37 37 36 37 38 38 37 37 37 38 38 38 37 36 36 36 35 34 34 36 36 36 36 34 33 33 34 35 34 34 34 34 35 34 34 34 34 34 63 63 63 62 62 62 63 64 65 65 65 66 66 66 66 66 65 65 65 65 65 63 63 62 62 63 63 63 63 63 63 63 63 62 61 61 62 62 62 62 62 62 62 62 61 61 60 60 60 60 59 58 58 58 58 57 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 54 54 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 49 49 49 49 49 50 51 50 50 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 50 50 50 49 50 50 49 49 48 48 49 48 48 49 49 48 47 47 47 47 47 47 46 46 46 45 46 47 45 45 45 44 43 42 42 41 41 41 40 40 40 41 42 41 40 40 39 39 39 38 38 38 39 39 40 40 40 40 40 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 39 39 39 39 39 38 37 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 37 36 37 37 37 36 35 34 34 35 37 37 37 35 34 34 34 33 32 32 34 34 35 33 32 32 33 34 34 35 35 34 35 35 33 33 31 30 29 29 29 29 29 29 29 29 30 31 32 34 34 31 30 31 32 33 35 36 36 35 35 35 37 37 37 36 35 35 33 33 35 36 35 36 36 36 36 34 35 37 37 37 37 36 35 35 36 37 37 37 38 38 38 37 36 34 33 32 32 33 34 35 37 37 36 35 37 38 38 38 39 38 37 37 38 38 39 40 40 40 40 39 38 36 36 38 39 38 37 35 34 34 35 35 35 37 37 38 38 37 38 39 39 39 39 38 37 37 36 36 37 37 38 38 38 38 38 39 39 38 37 37 38 38 39 39 39 40 40 40 40 40 40 39 39 38 38 40 41 41 40 39 38 39 40 39 38 38 39 39 37 36 36 36 37 38 38 38 37 37 38 38 38 37 36 37 38 39 40 40 40 40 41 40 38 38 38 37 38 38 38 39 39 39 38 37 38 39 39 38 38 38 36 36 36 36 37 37 37 38 38 38 38 37 36 36 35 34 34 35 36 36 35 34 33 33 34 35 35 36 35 34 34 35 35 34 34 34 34 63 63 63 62 62 62 62 63 64 64 65 65 66 66 66 66 66 66 66 65 64 63 63 62 62 63 63 63 63 63 63 64 63 62 61 60 61 62 62 62 62 61 61 61 61 61 60 60 61 60 59 59 58 58 58 57 57 56 56 56 55 54 54 54 54 54 54 54 54 54 53 53 53 54 54 55 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 50 50 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 48 49 49 48 49 49 48 47 47 48 48 48 47 47 47 46 45 46 47 45 44 44 43 43 42 42 42 42 42 41 40 40 40 41 41 41 41 40 41 41 39 39 38 38 38 39 40 39 39 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 39 39 38 38 37 37 37 36 35 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 37 38 38 37 37 36 34 34 34 35 36 37 36 35 35 34 33 32 32 33 34 34 34 33 32 32 33 33 34 34 34 35 35 34 34 32 30 29 29 29 29 29 29 29 29 29 32 34 34 32 30 31 32 33 34 35 36 34 33 33 35 37 37 37 36 35 34 33 33 35 35 34 36 36 35 34 34 35 36 37 37 37 35 34 35 36 37 37 37 38 37 37 37 36 34 33 32 32 34 35 36 37 36 36 36 38 38 38 37 38 37 36 37 38 38 38 39 40 40 39 39 37 36 37 38 39 38 37 35 34 34 35 35 35 37 37 36 37 38 38 39 39 39 38 37 36 36 36 36 36 37 38 38 38 37 37 37 37 37 37 38 39 39 39 38 38 39 40 40 40 40 39 38 37 37 38 39 39 39 39 38 38 39 39 40 38 37 38 37 36 35 36 37 38 38 38 38 37 37 38 38 37 36 36 37 38 38 39 40 40 40 40 40 39 39 38 37 37 37 37 38 38 38 37 37 37 38 38 38 38 37 35 35 35 35 36 36 38 38 37 37 37 37 37 35 35 35 34 35 35 35 35 35 34 34 35 35 36 36 36 35 35 35 34 34 34 34 33 63 63 63 62 62 62 62 62 63 63 64 65 65 66 66 66 66 66 65 64 64 63 63 63 62 62 62 62 63 63 63 64 63 62 62 61 61 61 61 61 61 61 61 61 61 61 61 61 61 60 59 59 58 58 58 58 58 57 57 57 56 56 56 56 55 55 54 54 54 54 54 54 54 54 55 56 56 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 50 50 50 51 50 50 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 49 49 48 48 49 49 49 48 47 47 47 46 46 47 46 45 43 43 44 44 44 43 43 43 42 41 40 39 39 40 41 41 41 41 41 40 40 38 37 37 38 39 38 38 39 39 38 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 36 36 36 35 35 36 36 34 34 34 34 34 34 34 34 34 34 34 34 34 36 38 37 37 37 37 37 37 37 36 35 34 34 34 36 36 36 35 35 35 34 34 33 32 33 34 34 34 33 31 32 33 34 33 35 36 35 34 33 33 32 30 29 29 29 29 29 29 29 29 31 33 33 31 31 33 34 33 33 35 34 32 33 34 35 37 37 36 35 35 34 32 33 35 35 35 35 34 34 34 35 36 36 37 37 36 34 34 35 36 37 37 38 37 37 37 37 36 34 33 32 32 34 36 37 37 35 35 37 38 38 37 37 37 36 37 38 38 38 38 39 40 39 39 38 36 36 38 39 39 38 37 35 34 34 35 35 35 36 36 36 37 38 39 39 39 38 38 36 35 36 38 38 37 36 37 37 36 36 37 37 37 37 38 39 39 38 38 37 38 39 40 39 39 39 38 37 38 39 39 38 39 39 38 38 39 39 40 39 38 37 36 35 35 36 37 37 38 38 37 37 37 37 37 37 36 36 37 38 39 39 39 40 40 40 40 40 40 40 39 39 38 38 38 38 37 37 37 37 37 37 37 38 38 36 36 36 36 36 35 35 36 38 37 37 36 37 37 36 35 35 35 36 35 35 35 36 35 34 35 35 35 35 35 35 34 34 34 34 34 34 34 64 63 63 63 62 62 62 62 63 63 63 64 65 66 66 66 66 66 65 64 64 63 63 64 63 62 62 62 62 62 63 63 64 63 63 61 60 61 61 61 61 61 60 60 60 61 61 61 61 60 59 59 59 59 58 58 58 58 58 58 57 57 57 57 56 55 54 54 54 54 54 54 55 56 56 57 56 56 56 56 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 54 54 55 55 54 54 54 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 51 51 50 50 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 47 46 47 46 45 44 45 45 45 44 43 42 42 42 41 41 40 39 39 40 40 41 40 40 40 40 39 38 37 38 39 38 38 38 38 38 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 36 35 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 36 36 36 36 36 36 37 36 35 34 34 35 35 35 35 36 35 34 34 34 33 32 32 32 34 34 32 31 32 33 33 35 36 35 34 34 35 34 32 29 29 29 29 29 29 29 29 30 31 31 30 31 34 33 33 33 34 33 33 33 35 35 36 37 36 35 35 33 32 34 36 35 34 34 34 35 36 37 37 37 36 35 35 33 34 36 37 37 36 37 37 37 37 37 36 34 34 33 33 35 36 36 36 35 35 37 37 37 36 36 36 37 38 38 38 37 38 39 39 38 38 38 36 36 38 38 38 37 36 35 34 34 34 34 34 35 36 37 38 38 39 39 38 38 37 36 35 37 38 39 38 38 37 37 37 38 38 37 38 38 38 39 38 38 37 38 38 39 40 38 38 37 37 37 38 40 40 40 40 40 40 39 40 40 40 39 38 38 36 35 35 37 38 38 38 38 38 37 37 37 37 36 36 37 38 39 40 40 40 40 39 39 39 39 40 40 40 39 38 39 39 38 37 37 38 38 39 38 38 39 38 37 38 38 37 37 36 35 35 36 37 37 36 36 36 37 36 35 36 37 36 35 34 35 35 35 36 36 35 34 34 34 33 33 34 34 34 34 34 65 65 64 63 62 62 62 62 62 63 63 63 64 65 66 66 66 66 66 65 65 64 64 64 63 62 62 62 62 62 62 62 63 63 63 61 60 60 60 60 60 60 60 60 60 60 60 60 61 60 60 59 59 59 58 58 58 58 58 58 58 57 57 56 55 55 54 54 54 54 54 54 56 56 57 56 56 56 56 56 56 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 54 54 54 55 55 55 55 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 50 51 50 51 51 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 47 46 46 48 47 46 45 45 44 44 43 43 42 41 41 41 40 39 39 38 39 39 40 40 40 40 40 40 39 37 37 38 38 38 37 37 37 36 36 37 37 37 37 37 36 36 36 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 37 36 35 35 35 35 35 35 36 35 34 33 33 34 35 36 35 35 34 34 34 34 33 32 31 32 34 33 31 32 33 34 35 35 35 35 35 35 34 31 29 29 29 29 29 29 29 29 29 29 29 30 31 32 32 33 33 32 32 33 33 34 35 36 37 36 35 35 33 32 34 37 36 34 33 34 36 36 36 37 38 36 34 34 33 34 36 37 37 36 36 36 37 37 36 35 35 34 32 33 35 36 35 34 34 36 37 37 36 36 37 37 38 38 38 37 38 39 40 39 38 38 38 36 36 37 38 39 38 36 34 33 33 33 33 34 35 37 38 38 38 39 39 38 37 37 36 35 36 38 38 38 38 38 39 39 39 37 37 37 38 38 38 37 37 38 39 39 38 38 37 36 36 37 39 39 40 40 40 40 40 40 41 40 39 39 40 40 39 38 36 35 37 38 38 38 38 38 38 37 37 36 37 37 38 38 39 40 40 40 40 39 39 40 40 40 40 40 39 38 38 39 38 38 38 39 39 39 38 38 39 38 37 39 39 38 38 36 36 35 35 36 35 35 35 35 36 36 36 37 37 36 35 35 35 35 35 35 35 35 34 34 33 33 33 33 32 32 32 32 66 66 64 63 63 62 62 62 62 62 63 63 63 63 64 65 66 66 66 66 65 65 64 64 63 63 63 62 62 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 55 55 55 54 54 54 54 54 55 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 55 55 54 54 54 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 48 48 48 48 48 49 48 48 49 49 49 50 50 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 48 48 48 49 49 49 50 50 50 50 50 50 50 49 49 49 49 48 48 48 47 47 47 47 47 47 47 46 46 45 44 43 42 42 41 41 41 40 40 40 40 39 39 38 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 36 36 36 37 37 37 37 36 36 36 36 36 36 36 37 37 37 36 36 36 37 37 38 37 37 36 35 35 35 34 34 34 34 34 34 34 34 34 34 34 35 37 37 37 37 37 36 35 36 36 35 35 34 34 34 33 32 33 34 35 35 35 34 35 34 34 34 33 32 31 32 32 32 32 33 34 35 35 34 35 35 34 31 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 33 33 31 31 32 33 33 34 36 36 36 36 35 35 33 32 34 36 36 35 33 34 35 35 36 36 37 36 35 33 34 35 36 37 37 36 35 36 37 37 35 34 34 33 32 33 36 36 35 35 36 37 36 35 35 37 38 37 37 38 37 37 38 39 40 40 39 38 38 36 36 37 38 39 38 36 34 33 33 33 33 34 36 37 37 38 39 39 39 38 37 37 36 34 36 38 37 37 37 38 39 39 37 36 37 38 38 38 37 36 37 38 38 37 37 36 36 36 36 37 39 39 39 39 39 39 40 40 40 40 39 38 39 40 40 38 36 35 36 37 37 38 38 37 37 36 36 36 38 38 38 38 39 40 40 40 40 39 39 40 40 39 40 40 39 38 38 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 36 36 35 34 34 35 36 36 36 37 37 36 36 36 35 35 35 34 34 33 33 34 34 34 34 33 32 33 32 31 66 65 64 64 63 62 62 62 62 62 63 63 63 63 63 64 65 65 65 65 65 65 64 64 63 63 63 62 62 62 61 60 60 60 60 61 61 61 61 60 60 60 60 60 60 60 59 60 59 59 59 60 59 59 59 58 58 58 57 57 57 57 56 56 55 55 54 54 54 54 55 56 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 55 55 54 54 55 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 50 50 50 50 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 48 48 48 47 47 47 48 48 49 49 49 49 49 48 48 48 49 49 49 49 49 50 50 50 50 50 50 49 48 48 49 49 48 48 48 48 48 47 47 47 46 45 45 44 43 42 42 42 42 42 42 41 40 40 40 39 38 38 38 39 39 39 39 38 37 37 36 36 36 36 36 36 36 35 36 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 37 37 37 36 36 35 35 34 34 34 34 34 34 34 34 34 34 35 36 37 37 37 38 37 36 36 37 37 36 36 35 35 35 34 33 33 33 33 35 35 34 35 35 35 34 33 33 32 31 31 31 32 33 34 36 36 34 34 34 32 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 31 31 31 32 33 33 34 36 37 36 35 35 35 34 33 32 34 36 36 35 33 33 34 34 35 35 36 36 34 34 34 35 37 37 36 35 36 37 36 36 34 33 33 32 32 33 35 37 35 35 36 36 35 35 36 37 37 37 37 37 37 38 38 38 39 38 38 37 37 36 35 36 38 38 36 34 33 33 33 33 33 34 35 35 36 37 38 38 39 38 37 37 35 34 35 37 37 36 37 38 38 37 36 36 37 38 38 37 35 35 36 36 35 35 35 36 37 38 38 37 38 38 38 39 39 40 40 41 40 40 39 38 38 40 39 38 37 36 35 37 37 37 38 38 36 35 35 36 38 39 39 39 40 39 39 40 39 38 38 39 39 39 39 40 40 40 39 39 40 40 40 39 38 38 38 38 38 38 38 37 38 38 38 37 37 37 37 37 36 35 34 35 36 37 37 37 36 36 36 36 35 35 35 34 34 33 33 34 35 35 34 34 34 34 34 32 65 64 63 63 63 63 62 62 62 62 62 63 63 63 63 64 64 65 65 64 65 65 65 64 64 64 63 63 63 62 61 60 60 60 60 60 60 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 56 55 54 54 54 54 55 56 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 50 51 51 51 51 51 51 51 51 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 48 48 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 48 49 49 49 48 48 48 48 48 49 49 48 48 49 49 49 49 50 50 50 49 47 46 47 48 48 48 48 48 48 48 48 47 47 46 45 44 44 44 43 43 43 42 41 42 41 39 39 38 38 38 37 37 37 37 37 37 37 37 37 36 36 35 35 35 35 35 35 36 36 36 36 36 36 35 35 36 36 36 36 36 36 36 36 36 36 36 36 36 37 37 37 37 36 35 34 34 34 34 34 34 34 34 34 35 36 37 37 37 38 38 37 37 37 37 37 37 37 36 37 36 35 35 34 32 32 33 34 34 35 36 35 34 34 33 33 31 30 31 33 34 35 36 36 35 34 33 32 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 33 33 34 36 37 37 36 35 34 34 33 32 33 34 36 36 36 34 33 33 34 34 35 36 35 33 33 34 35 36 36 35 35 36 36 35 34 33 32 32 32 32 33 35 36 35 34 36 35 35 36 37 36 36 35 36 36 37 37 37 37 37 37 38 37 36 35 35 36 38 38 35 33 33 33 33 33 33 33 34 35 36 37 38 38 39 38 37 36 34 33 35 37 36 35 37 38 37 36 36 36 38 38 37 35 34 34 35 35 35 35 36 37 37 38 39 39 39 39 40 40 40 40 40 40 40 41 40 38 37 38 39 38 37 36 35 35 36 37 37 37 36 36 36 37 38 39 39 38 39 39 40 40 39 39 39 39 40 40 40 40 41 40 39 40 40 40 39 39 39 38 38 38 38 38 37 37 37 37 37 36 36 35 36 37 36 36 35 34 36 37 37 37 36 36 36 36 36 35 35 34 34 34 35 35 35 35 35 35 34 34 34 33 65 64 63 63 64 63 62 62 62 62 62 62 63 63 63 63 63 64 65 65 64 64 64 64 64 64 63 63 63 62 62 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 56 56 55 54 54 54 55 56 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 51 51 52 52 52 52 52 52 52 51 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 51 50 50 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 50 50 49 47 46 46 47 47 47 46 47 48 47 47 46 46 46 45 45 45 44 43 43 43 42 41 41 40 39 39 38 38 38 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 36 36 36 36 35 35 35 35 35 35 35 36 36 36 36 36 35 35 35 36 36 37 36 35 35 34 34 34 34 34 34 34 34 34 36 37 37 38 39 39 38 37 37 37 36 36 36 36 35 36 35 35 35 34 34 33 32 33 33 34 35 36 35 35 34 33 32 31 30 32 33 34 35 36 36 34 34 33 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 33 34 34 36 37 38 37 36 35 34 32 32 33 35 36 36 36 35 33 32 33 34 34 35 34 33 33 34 34 36 36 35 35 36 36 35 33 32 32 32 32 32 33 35 36 35 34 36 35 35 37 36 35 35 35 36 36 36 36 36 37 37 37 37 37 35 35 37 38 38 38 35 33 33 33 33 33 33 34 36 37 37 37 38 38 38 38 36 35 34 33 35 37 36 35 37 38 36 35 36 37 38 37 35 34 35 36 37 37 37 37 37 38 38 38 38 39 40 40 40 40 40 40 40 40 40 40 40 38 37 37 38 38 38 36 35 35 36 37 36 36 36 37 38 37 38 39 39 38 38 39 39 39 39 40 40 40 40 40 41 41 40 40 39 40 40 39 39 39 40 39 38 37 37 38 37 37 37 37 36 36 35 35 35 36 36 36 35 34 35 36 36 36 37 37 37 37 37 36 35 35 36 36 36 36 36 35 35 35 34 34 34 33 65 64 64 64 64 64 63 62 62 62 62 62 62 63 63 63 63 63 64 65 64 63 63 64 64 63 63 63 63 63 62 62 61 61 60 60 60 60 59 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 56 56 55 55 55 54 55 56 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 50 51 51 52 52 52 52 52 52 52 52 51 51 51 51 51 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 49 50 50 50 49 48 46 46 46 46 46 45 46 46 47 47 46 46 46 46 46 46 45 44 44 43 43 42 41 41 40 39 38 38 38 39 39 39 38 38 37 36 36 36 36 36 37 37 37 37 36 35 35 35 35 36 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 37 36 35 34 34 34 34 34 34 34 34 34 34 35 36 37 38 38 38 38 38 37 37 36 35 35 34 34 34 34 33 33 33 34 34 33 32 32 33 35 35 35 35 34 34 33 31 30 30 32 34 35 36 36 36 35 34 32 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 35 35 35 36 37 36 36 36 34 32 32 33 34 35 36 36 35 34 33 32 33 34 34 33 33 34 34 34 35 35 34 35 36 36 35 34 33 32 32 32 32 33 35 37 35 34 35 35 35 36 35 34 35 36 37 36 35 35 36 37 38 38 37 36 34 36 38 38 37 36 34 33 33 33 33 33 34 35 36 36 37 38 38 38 38 37 37 36 34 33 35 37 35 34 36 36 35 35 36 38 38 35 34 34 35 36 36 36 37 37 37 37 38 39 39 38 38 39 40 39 38 39 40 40 40 39 39 39 37 38 38 38 38 36 35 36 37 36 35 36 37 39 38 37 38 40 40 39 38 38 38 40 40 40 40 40 40 40 40 40 40 39 40 40 40 40 39 40 40 39 38 38 37 38 38 37 37 37 37 36 36 36 36 35 36 36 35 34 35 35 35 36 36 37 37 37 37 36 36 36 36 36 36 36 35 36 36 35 35 34 34 34 65 65 65 65 65 64 63 63 62 61 61 61 62 62 63 62 63 63 64 64 64 64 63 63 64 63 63 63 63 63 62 62 61 61 61 61 60 60 59 59 59 60 60 60 59 59 59 58 58 59 59 59 59 59 59 58 58 58 57 57 57 56 55 55 55 55 55 56 56 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 50 51 52 52 52 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 50 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 48 48 48 48 48 47 47 47 47 48 49 48 48 48 48 48 48 48 48 49 49 48 48 49 49 48 48 50 50 50 50 49 47 46 45 45 46 46 46 45 45 46 47 46 46 45 46 47 46 46 45 44 43 43 42 41 41 40 39 39 39 39 40 40 40 40 39 39 38 37 37 37 37 38 38 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 35 35 34 34 34 34 34 34 34 34 34 34 34 35 36 37 38 37 37 37 37 37 36 35 35 35 34 34 34 33 32 33 33 33 33 32 32 32 33 33 34 35 34 34 33 32 30 30 31 33 35 35 35 36 36 34 33 31 30 31 30 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 36 37 36 36 36 36 34 33 32 31 32 34 34 34 35 36 35 34 34 33 32 33 32 32 33 34 34 34 34 34 34 35 35 36 37 35 34 33 32 32 32 33 35 36 35 33 34 34 34 35 35 35 36 37 36 35 36 37 37 38 38 38 37 35 34 36 38 37 36 34 33 33 33 33 33 33 33 35 35 36 37 38 37 37 38 37 36 36 34 33 35 35 34 35 36 35 34 35 36 37 37 35 34 35 35 35 35 36 37 37 36 36 37 38 39 38 38 39 39 38 38 39 40 40 40 39 38 38 37 38 37 36 36 35 34 35 36 35 35 36 38 39 39 38 39 40 40 38 38 38 39 40 40 40 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 39 38 37 37 37 38 37 37 37 37 37 36 36 36 36 36 35 35 35 34 34 35 35 36 36 37 37 36 36 36 36 36 36 36 35 34 34 35 35 35 34 34 35 65 66 66 66 65 64 64 63 63 61 61 61 61 61 62 62 62 63 63 63 64 64 63 63 63 64 63 63 63 63 63 63 62 62 61 61 61 60 60 60 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 57 57 57 56 56 55 55 55 55 56 56 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 50 51 51 52 52 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 50 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 47 48 48 48 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 49 47 46 46 44 44 44 45 45 45 44 45 46 45 45 45 46 46 46 45 44 43 42 41 41 40 40 40 40 40 40 41 41 41 41 40 39 38 38 37 38 39 39 38 38 37 37 37 37 36 35 35 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 36 37 37 38 37 36 36 36 37 36 36 36 36 35 35 35 33 34 34 33 33 32 32 32 31 31 32 33 34 34 34 34 32 31 30 30 31 33 34 34 34 35 35 33 32 33 33 32 29 29 29 29 29 29 29 29 29 29 29 29 30 32 34 35 37 37 36 37 35 33 32 31 31 33 34 34 34 35 35 34 34 34 34 32 32 33 33 34 34 34 34 33 33 34 34 34 36 37 36 34 33 32 31 32 33 35 36 34 33 33 34 34 34 36 36 36 36 35 35 37 38 38 37 37 37 37 35 34 36 38 37 35 33 33 33 33 33 33 34 34 34 35 37 38 38 37 37 37 37 35 35 34 33 35 34 34 36 35 34 34 35 34 34 34 34 34 35 36 36 36 37 36 35 35 35 37 38 38 37 38 39 37 36 37 38 39 40 39 38 38 37 37 37 36 35 35 34 34 35 35 36 35 36 38 38 39 39 39 39 39 39 38 38 38 39 39 39 38 38 38 39 39 39 39 39 40 40 40 41 40 40 39 39 38 37 37 37 38 37 37 37 37 37 37 37 36 37 36 35 35 35 35 34 34 35 35 36 36 36 36 36 36 37 37 36 35 35 34 34 34 34 34 34 33 33 66 66 67 66 66 65 65 64 63 62 61 60 60 60 60 61 62 62 62 63 63 64 64 63 63 63 63 63 63 62 62 63 63 62 62 62 61 61 61 61 60 60 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 56 56 56 56 55 55 55 55 56 56 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 51 52 52 52 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 50 50 49 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 49 48 48 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 50 50 50 50 50 49 49 49 50 50 48 46 46 45 44 43 43 43 44 44 44 44 44 44 44 45 46 46 45 44 43 42 42 42 41 41 41 41 41 41 42 41 41 41 40 40 39 39 38 38 39 39 39 38 38 38 38 38 37 36 36 35 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 36 37 38 38 38 37 37 37 37 37 37 37 36 36 35 34 34 35 36 35 34 34 34 33 33 32 31 32 32 32 33 33 32 32 31 30 30 30 31 33 34 34 34 33 33 34 35 33 30 29 29 29 29 29 29 29 29 29 30 31 32 32 33 35 36 36 36 36 35 33 32 31 31 33 33 33 34 34 34 34 33 33 33 32 33 34 35 35 34 33 33 33 33 34 33 34 35 36 35 33 32 31 31 32 33 36 35 33 33 34 35 36 36 37 37 36 35 35 36 37 38 38 37 37 37 37 35 34 36 38 37 35 33 32 32 33 33 34 36 36 35 35 37 39 38 36 37 37 36 34 34 33 33 34 34 35 36 34 32 33 33 33 34 34 35 36 37 36 35 35 35 35 35 35 36 37 37 36 37 37 37 36 37 38 38 39 39 38 37 37 37 36 36 35 34 35 36 36 35 36 37 36 36 38 38 39 40 39 38 38 39 38 38 38 39 40 39 38 38 39 40 40 40 40 39 39 40 40 40 41 40 39 38 38 38 37 37 37 38 38 37 37 37 37 37 37 37 37 36 35 34 35 34 34 34 34 34 35 36 35 35 36 37 37 36 36 35 36 35 34 34 34 34 33 33 67 67 67 67 66 65 65 64 64 63 62 61 60 60 60 60 61 61 62 63 63 63 63 63 62 62 62 62 62 62 61 62 62 62 63 62 61 61 61 61 61 60 59 59 58 59 59 59 58 58 58 58 57 57 57 57 56 56 56 56 56 55 55 55 56 56 57 57 57 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 51 52 53 53 53 53 54 54 53 53 53 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 48 48 48 48 48 47 47 48 48 48 49 48 48 49 49 49 49 49 49 50 50 50 49 48 49 50 49 48 47 46 46 45 45 44 44 44 44 43 43 43 43 43 44 45 46 46 45 44 44 44 43 43 43 43 43 42 42 43 42 41 41 40 40 40 40 38 38 39 40 40 39 39 38 38 38 37 37 37 36 35 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 37 37 37 38 37 37 37 38 37 37 37 36 35 34 35 36 36 35 34 34 34 34 34 33 32 32 32 31 31 31 31 31 31 30 30 30 30 32 33 33 32 32 32 34 35 34 31 29 29 29 29 29 29 29 29 29 31 33 34 35 35 36 35 36 36 35 34 33 31 31 32 32 32 33 35 34 33 33 32 32 32 33 34 35 35 35 35 33 32 33 34 34 34 35 35 35 34 32 31 31 31 32 34 35 34 32 33 35 36 37 37 37 36 35 35 36 37 38 38 38 37 36 36 36 35 34 36 37 36 34 33 32 32 33 33 34 36 37 36 36 38 39 38 36 36 37 37 35 34 33 33 34 35 35 35 33 32 34 35 34 34 35 35 35 35 34 34 34 34 35 35 35 35 36 36 36 36 36 36 37 38 39 39 38 38 38 37 37 36 35 34 34 34 36 37 37 37 37 37 38 37 38 39 38 39 39 38 38 38 38 38 39 40 40 38 38 38 39 40 40 40 40 39 39 39 40 40 40 40 39 38 38 38 38 36 36 37 37 38 37 37 37 37 37 37 37 36 35 35 35 34 35 34 33 33 34 35 35 35 36 36 36 36 36 36 36 35 35 35 35 35 34 34 67 67 67 67 66 65 64 64 63 63 63 62 61 60 60 60 60 60 61 62 63 64 63 63 63 62 62 62 61 61 61 61 61 62 62 62 61 61 61 61 61 60 60 59 58 58 59 59 59 59 58 58 58 58 57 57 56 56 57 56 55 55 55 55 56 57 57 57 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 51 52 52 53 54 54 54 54 53 53 53 53 53 53 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 49 48 48 48 49 49 48 47 47 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 49 48 47 46 46 46 46 46 46 46 45 44 43 42 42 43 44 46 46 45 45 45 45 43 43 43 43 43 43 43 43 43 42 41 40 40 40 40 39 38 39 40 40 40 39 39 39 38 38 38 38 37 36 35 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 34 33 33 34 34 34 34 34 34 34 34 34 34 35 36 36 37 37 38 38 38 38 37 37 36 36 35 35 36 36 37 36 34 34 35 35 35 35 34 34 33 34 33 32 31 31 31 31 31 31 30 30 31 31 31 30 31 32 34 35 34 30 29 29 29 29 29 29 29 29 30 32 33 34 36 37 36 35 36 35 34 34 33 31 31 32 32 32 34 35 33 32 32 32 32 33 34 34 34 34 35 35 33 33 33 33 34 35 35 35 34 33 32 31 31 31 32 34 34 32 32 34 35 36 37 38 37 35 35 37 37 37 38 38 38 37 36 35 35 35 35 37 37 35 33 32 32 32 33 34 34 35 36 37 37 39 39 37 35 36 37 37 36 35 34 33 34 36 35 33 32 33 36 37 36 36 36 36 35 34 34 34 34 34 34 34 35 34 34 35 36 36 36 37 37 38 38 37 36 38 38 37 36 34 34 34 35 36 36 36 37 37 38 38 39 38 38 38 38 39 39 38 38 38 37 37 39 40 39 38 38 39 39 39 39 39 39 39 39 39 40 40 40 40 39 39 38 38 38 37 36 36 36 37 37 36 36 37 38 37 37 36 36 36 36 35 36 36 34 33 34 35 35 35 36 36 36 36 36 35 35 36 35 35 35 35 34 35 66 66 66 66 66 66 65 64 63 63 63 63 62 61 60 60 60 60 60 61 63 63 64 64 64 63 63 62 62 61 61 60 60 61 62 62 61 61 61 60 60 61 60 59 58 58 58 59 59 59 59 58 58 58 57 56 56 56 56 55 55 55 55 56 56 57 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 52 52 52 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 50 50 49 49 49 48 48 48 48 48 48 49 48 48 48 48 49 48 48 49 49 49 49 49 48 48 48 48 48 49 49 49 49 48 48 48 48 48 47 47 47 48 48 49 49 49 48 48 48 49 49 49 49 49 49 49 48 48 49 49 49 49 48 48 47 47 46 46 46 46 46 46 45 44 42 42 43 44 46 46 46 46 45 44 42 41 41 42 42 42 42 43 43 43 41 41 40 40 40 40 40 40 39 40 40 40 40 40 39 38 38 38 37 37 36 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 34 33 33 33 34 34 34 34 34 34 34 34 34 34 35 35 36 37 37 38 38 37 37 37 37 37 36 35 36 36 37 36 36 35 35 35 36 36 35 34 34 35 35 34 33 32 33 33 33 32 31 30 31 31 31 30 30 30 31 34 34 32 30 29 29 29 29 29 29 29 29 30 33 35 35 37 37 35 35 36 34 33 33 32 31 32 33 33 33 34 34 33 32 32 32 33 34 35 34 34 34 35 35 33 32 33 33 34 34 34 34 34 33 31 31 31 31 32 34 33 32 32 34 35 36 37 37 35 35 36 37 37 37 38 38 38 37 36 35 34 35 37 38 36 34 33 32 32 32 33 35 35 35 36 38 38 39 39 36 35 36 37 37 36 35 34 33 33 35 34 32 32 34 36 37 37 38 39 38 37 37 37 36 36 35 34 34 35 34 34 35 36 36 38 38 38 37 37 36 36 37 36 35 34 34 34 35 35 37 37 36 37 38 39 39 39 38 38 38 37 38 38 38 38 38 37 37 38 40 39 38 39 39 39 39 39 38 38 38 39 39 39 39 39 39 40 39 38 38 38 37 37 36 35 35 36 35 36 37 38 37 37 37 37 37 36 36 36 36 35 33 34 35 35 35 36 36 36 36 36 36 36 37 36 36 36 35 34 34 66 66 66 66 67 66 66 65 64 64 63 63 63 63 62 60 60 60 60 60 62 63 63 63 63 63 63 63 63 62 61 60 60 60 61 61 61 61 61 60 60 60 60 59 59 58 58 58 58 58 58 58 58 57 56 55 55 55 55 55 55 56 56 56 57 57 57 57 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 53 53 54 54 54 54 53 53 52 52 52 52 52 52 52 52 52 51 51 51 52 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 48 47 47 48 48 47 46 47 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 48 48 48 49 49 48 47 47 48 47 47 47 46 46 46 45 44 44 43 42 42 43 45 46 46 46 45 44 43 41 41 41 41 41 41 42 42 42 42 41 41 41 41 41 41 40 39 39 40 40 40 40 39 38 38 37 37 37 36 35 35 34 34 34 34 34 34 34 35 35 35 35 35 35 35 34 33 33 33 33 33 33 33 34 34 34 34 34 34 34 35 36 37 38 38 38 37 37 37 37 37 37 36 37 37 36 36 36 36 35 36 36 35 35 34 34 35 35 34 33 33 34 34 34 33 32 32 32 33 32 31 30 30 31 32 31 30 29 29 29 29 29 29 29 29 29 31 35 37 36 37 37 35 35 36 35 33 31 31 31 32 34 35 35 34 34 33 32 32 33 35 35 34 34 33 34 35 35 34 32 32 33 34 34 32 33 33 32 31 31 31 31 31 32 32 32 33 34 34 35 37 36 35 36 37 36 36 37 38 38 38 37 36 34 34 36 39 38 36 34 33 32 32 33 33 36 37 36 37 38 39 40 39 36 35 37 37 37 36 36 35 33 33 34 33 32 32 34 36 37 36 38 39 39 38 37 37 37 36 36 36 36 36 36 35 36 37 38 38 38 37 35 36 36 35 36 35 34 34 35 35 36 37 38 38 38 38 38 39 39 39 39 39 38 37 37 37 37 38 38 37 37 38 38 38 38 39 39 38 38 38 38 38 39 39 40 39 39 39 39 40 39 39 38 37 37 37 37 36 36 36 35 35 36 38 38 37 37 37 37 37 37 37 36 35 33 33 34 34 35 36 35 35 36 36 36 36 37 37 37 36 36 35 34 66 66 66 66 66 66 66 66 65 64 63 63 64 64 63 62 60 60 60 60 60 61 62 62 63 63 63 63 63 62 61 60 60 60 60 61 61 61 61 60 60 60 60 60 59 58 58 58 58 58 58 58 57 57 56 55 55 55 55 55 56 56 56 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 49 49 50 50 50 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 48 48 48 48 47 47 47 47 46 47 47 47 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 49 49 48 47 46 46 48 47 47 47 47 46 46 45 44 43 42 41 41 42 44 45 46 46 45 45 43 42 41 41 40 40 40 40 41 41 41 41 41 41 41 40 40 40 38 38 38 39 39 39 39 39 39 38 37 37 37 37 36 36 35 34 34 34 34 34 34 35 34 34 34 35 34 34 33 33 33 33 33 33 33 34 34 34 34 34 34 34 36 37 37 38 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 36 36 35 35 35 35 35 35 34 34 34 34 35 34 34 34 33 33 32 31 29 29 30 30 30 29 29 29 29 29 29 29 29 29 29 31 34 36 36 36 36 35 34 35 35 33 31 31 32 33 34 35 35 34 33 33 32 32 33 34 34 34 33 33 33 35 35 34 33 32 32 34 33 32 32 32 31 31 31 31 31 31 31 32 33 35 35 35 35 36 35 35 37 37 35 36 37 37 37 37 37 36 34 34 37 39 39 37 35 33 32 33 33 34 35 37 38 38 39 39 39 38 35 36 37 38 37 36 36 35 33 33 34 33 32 33 35 36 36 36 37 38 37 36 36 35 35 36 36 36 36 37 37 36 36 38 37 37 37 36 35 36 36 34 34 34 34 36 36 36 37 37 38 39 39 38 38 38 38 38 39 39 39 38 37 37 37 38 38 37 38 38 39 39 38 38 37 38 38 39 38 39 39 39 40 39 39 40 40 40 40 39 38 38 37 37 38 37 37 37 36 35 36 37 37 37 37 38 37 37 37 37 36 35 34 34 33 34 35 36 35 35 35 35 36 36 37 36 36 36 36 36 35 66 66 65 65 66 66 66 65 65 65 64 64 64 64 64 63 62 60 60 60 60 60 60 61 62 63 62 63 62 62 61 61 61 60 60 60 61 61 61 61 60 60 59 59 59 59 58 58 58 57 57 57 57 56 56 55 55 55 55 56 56 57 57 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 57 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 54 54 54 54 54 54 53 53 53 53 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 50 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 46 46 46 47 48 48 48 48 49 48 48 49 49 49 49 48 48 48 48 48 48 48 49 49 48 47 46 46 46 46 46 46 46 45 45 45 45 44 43 41 41 41 43 45 46 45 45 44 44 43 42 41 41 41 40 40 40 41 41 41 42 42 41 40 40 40 39 38 37 38 38 38 39 39 39 38 38 37 37 37 37 36 36 35 34 33 33 33 33 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 34 34 34 35 37 38 37 37 36 36 37 37 37 37 37 37 37 35 35 34 34 34 34 35 36 36 36 36 36 35 35 35 35 34 33 34 35 34 34 34 34 33 32 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 31 34 37 37 35 34 35 35 35 35 33 31 31 33 35 35 35 35 34 34 33 32 32 32 33 33 33 32 33 34 35 34 33 32 32 32 33 33 32 32 31 31 30 31 31 31 31 32 33 34 35 36 37 36 36 35 35 37 36 35 37 37 37 37 37 36 34 33 35 38 39 39 38 36 33 32 34 35 36 36 37 38 40 40 40 38 36 35 36 37 37 37 36 35 34 33 33 34 33 32 34 36 35 35 37 37 36 36 36 36 36 36 36 36 35 35 36 36 35 35 37 36 35 36 35 35 35 35 33 33 35 36 37 37 37 37 38 38 39 39 38 38 38 38 39 39 40 39 38 38 37 37 37 37 38 38 39 40 39 38 38 38 38 38 39 39 39 40 40 40 39 39 39 39 40 40 39 39 39 38 37 37 38 38 37 37 36 35 36 36 36 37 37 37 37 36 36 36 36 35 35 34 33 35 36 35 34 35 35 36 37 37 36 35 35 36 37 36 67 66 65 65 65 66 66 65 64 65 65 65 64 64 63 63 63 62 60 60 60 59 59 59 60 61 61 62 62 61 61 61 61 60 59 60 60 61 61 61 61 60 59 59 58 58 58 58 58 57 57 57 57 56 56 55 55 55 56 56 57 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 50 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 49 49 48 48 48 48 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 48 49 49 49 49 49 48 48 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 46 45 45 45 45 45 44 44 44 44 44 44 43 43 41 40 41 43 44 44 44 44 44 42 41 41 41 41 40 40 40 40 40 41 42 41 41 41 40 40 39 38 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 36 35 34 33 33 33 33 33 33 34 34 34 34 34 33 32 32 33 32 32 33 33 33 33 34 34 34 35 36 37 37 37 36 36 36 36 36 36 36 36 36 35 35 34 34 33 34 35 36 36 36 36 36 35 35 34 34 34 33 33 34 34 34 35 35 34 33 33 32 30 29 29 29 29 29 29 29 29 29 29 29 29 30 33 37 37 35 34 35 36 36 35 35 33 31 31 33 35 36 35 35 35 35 34 33 32 31 32 32 33 34 34 35 35 35 34 33 33 32 32 32 32 31 31 30 30 31 31 32 33 34 34 34 35 36 37 37 36 35 36 36 35 36 37 37 37 37 36 35 33 34 37 39 39 38 37 36 33 33 34 36 37 38 38 39 40 40 38 36 35 36 36 36 37 37 36 35 34 33 32 33 33 32 35 36 35 35 35 35 35 35 36 36 37 37 37 37 36 36 36 35 34 34 36 36 34 35 34 34 34 34 33 35 36 37 38 39 38 38 38 38 38 38 37 37 38 38 39 39 40 40 38 38 37 37 36 37 38 38 38 38 38 38 39 39 39 39 39 40 40 40 41 40 39 39 38 39 40 40 40 40 40 39 37 37 37 38 38 38 37 36 35 35 35 37 37 37 37 36 36 36 37 36 35 34 33 34 35 34 34 35 35 36 37 37 36 36 35 35 36 36 66 66 65 64 65 65 66 65 64 64 64 65 64 63 63 63 62 62 62 60 60 59 59 59 59 60 60 60 61 61 61 61 61 61 60 59 60 60 60 61 60 60 59 59 59 58 58 58 58 58 58 57 57 56 56 56 56 56 56 57 57 57 57 57 57 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 51 51 51 51 52 52 51 51 51 51 51 51 51 50 50 50 49 49 50 50 50 50 50 50 50 50 49 49 50 51 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 48 49 49 49 49 49 49 49 49 49 49 48 48 47 47 48 48 48 48 47 46 46 47 46 45 44 44 45 45 45 44 43 43 42 42 43 43 42 40 40 42 43 42 43 43 43 42 42 41 41 41 41 40 39 38 39 40 40 41 41 41 40 40 39 38 38 37 37 37 37 37 37 38 38 38 39 38 37 37 37 36 35 35 34 33 33 33 33 33 33 33 33 34 34 33 32 32 32 32 32 32 32 33 33 33 33 33 34 36 37 37 37 35 35 35 35 35 35 35 34 34 35 34 33 32 33 34 34 35 35 35 36 35 34 34 34 34 34 34 33 33 33 33 35 35 35 34 33 32 31 30 29 29 29 29 29 29 29 29 29 29 29 30 32 36 36 33 34 36 37 36 35 34 33 31 32 34 35 35 35 36 36 35 34 34 33 31 31 32 33 34 34 35 35 36 36 35 35 33 31 32 31 31 30 30 30 31 31 33 34 35 36 36 37 37 37 37 35 35 37 35 35 36 37 36 36 37 35 33 33 35 37 37 37 37 35 33 33 33 34 35 37 38 39 40 39 38 36 35 36 36 36 37 38 37 36 35 34 33 32 32 32 32 33 34 34 35 35 35 36 36 36 36 37 37 37 36 35 35 35 34 33 34 36 35 34 33 33 33 34 33 34 36 37 38 39 40 39 38 38 37 37 38 38 38 38 38 38 39 40 40 39 39 38 36 36 37 37 37 38 38 38 39 39 40 40 40 40 40 40 41 41 40 40 39 38 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 36 35 35 36 37 37 37 37 36 36 37 36 35 34 34 33 33 34 35 36 36 36 37 37 36 35 35 34 34 35 66 66 65 64 64 65 65 65 64 63 63 64 64 63 63 63 63 63 62 61 60 60 59 59 59 59 59 59 60 60 60 61 61 61 60 59 59 59 60 60 60 59 60 59 59 58 58 59 58 58 58 57 56 56 56 56 56 56 57 57 57 57 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 52 52 53 53 54 53 53 53 53 52 52 52 52 52 53 52 52 52 52 51 51 51 51 51 52 52 51 51 51 51 51 50 50 50 49 49 49 50 51 51 50 50 50 50 50 50 50 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 45 45 45 45 46 46 47 47 48 48 48 48 49 49 49 49 48 48 48 47 47 47 47 48 49 48 47 46 45 45 46 45 44 43 44 45 46 45 44 43 43 42 42 42 41 40 40 41 41 42 43 44 44 43 42 41 41 41 41 40 39 38 38 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 37 37 37 38 39 38 37 37 36 36 35 35 34 34 33 33 33 33 33 33 33 33 34 33 33 32 32 32 32 32 32 32 33 33 33 33 34 36 37 37 35 35 35 34 34 34 34 34 34 34 34 34 33 33 33 34 34 34 34 35 35 35 34 34 34 33 33 33 32 32 32 34 34 34 34 34 33 33 33 31 29 29 29 29 29 29 29 29 29 29 29 29 31 34 34 33 35 36 36 36 36 35 33 31 32 34 34 34 35 36 36 35 34 34 33 32 31 32 33 33 34 34 35 35 35 35 34 32 31 32 31 30 30 30 31 31 32 33 35 36 37 37 37 38 37 35 34 34 35 35 36 37 36 35 36 36 34 32 32 35 36 34 34 35 33 32 32 34 36 36 36 37 37 38 38 36 35 36 36 36 37 39 38 36 36 35 34 34 32 32 32 32 32 34 36 36 36 36 36 36 37 37 36 36 36 35 34 33 34 34 33 33 34 34 33 32 33 34 35 35 36 37 38 39 39 39 39 38 37 37 38 38 39 38 38 38 38 39 39 39 40 40 39 38 37 37 37 37 38 39 39 39 40 40 40 41 41 41 40 40 40 40 40 39 39 40 40 40 40 40 40 39 38 38 38 37 37 38 39 38 37 36 35 36 36 36 37 37 36 35 36 36 36 35 34 33 33 34 35 36 36 36 36 36 35 35 35 34 34 34 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 61 60 60 59 59 59 59 59 59 59 59 59 60 60 59 58 58 58 58 58 58 59 58 58 58 57 58 57 57 57 56 56 56 56 57 57 57 57 57 57 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 52 52 53 53 53 54 53 53 53 53 53 52 52 52 52 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 49 50 50 51 51 51 50 50 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 46 46 46 47 47 47 48 49 49 49 49 48 47 47 47 47 46 47 48 48 48 48 47 45 45 45 44 44 43 44 45 45 45 45 45 45 44 44 43 42 41 40 40 40 42 43 44 44 43 42 41 41 40 40 40 40 39 38 38 38 38 38 39 39 39 39 39 39 38 38 37 36 36 36 37 37 38 37 37 37 37 36 35 35 35 35 35 35 34 33 33 33 33 33 33 33 34 33 32 32 32 32 32 32 32 32 32 32 33 34 36 37 36 36 36 36 35 35 34 33 33 34 34 34 34 33 33 33 33 33 33 33 34 34 34 34 33 33 33 33 33 33 32 32 33 33 32 33 34 33 33 33 30 29 29 29 29 29 29 29 29 29 29 29 29 30 33 33 34 35 34 35 36 35 35 33 31 31 33 33 33 34 35 36 36 34 34 33 32 32 32 32 34 35 36 36 35 35 34 33 32 31 31 30 30 30 31 31 32 33 34 36 37 37 37 37 37 36 34 33 34 34 35 36 36 35 35 35 35 33 32 32 34 35 33 32 33 32 32 32 35 37 37 37 36 37 37 37 36 35 35 35 36 38 39 39 37 37 36 35 34 32 32 32 32 34 35 36 36 35 36 35 35 36 36 35 35 35 35 34 33 33 33 32 33 33 32 32 32 33 35 36 37 38 38 38 39 40 39 38 37 37 38 38 39 39 39 39 39 39 39 39 39 39 40 40 40 38 37 37 38 39 39 39 39 40 40 40 41 41 41 40 40 40 40 39 39 40 41 41 41 41 40 40 40 40 38 38 38 37 37 38 38 37 36 36 35 35 36 36 36 35 34 35 36 36 34 33 33 33 34 35 35 36 36 35 35 34 35 35 34 34 34 64 65 65 64 63 63 63 63 63 63 63 63 63 63 64 64 63 63 63 62 63 63 62 61 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 57 57 57 57 57 57 57 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 52 52 52 53 53 53 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 46 45 45 45 45 46 47 48 48 48 49 49 49 48 48 47 46 46 46 46 47 48 48 48 48 47 46 45 44 43 43 43 44 45 45 45 46 46 45 44 44 44 43 43 41 40 40 41 43 44 44 43 43 42 41 41 40 39 39 38 38 37 37 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 37 37 37 37 37 37 36 36 36 35 36 37 36 35 35 34 34 33 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 34 36 37 37 37 36 36 37 36 35 34 34 33 33 34 34 34 33 32 32 32 32 32 32 33 33 32 32 31 31 31 32 32 33 33 31 31 30 30 31 32 31 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 33 34 34 34 36 35 34 34 32 31 31 32 32 33 34 35 35 35 34 34 33 31 32 32 34 36 37 37 37 35 34 34 33 33 32 30 30 30 31 31 31 33 35 36 37 37 36 37 37 36 36 34 33 34 35 36 36 35 34 35 34 33 32 32 33 33 33 32 32 32 32 32 33 35 36 37 38 37 37 38 38 36 35 35 35 36 38 38 38 39 38 37 36 35 34 32 32 32 34 34 34 35 35 35 35 34 34 34 35 35 35 35 34 32 32 32 32 32 32 32 32 33 35 36 37 38 38 37 37 38 38 38 38 38 39 39 39 39 39 39 39 39 39 40 40 39 39 39 39 39 38 37 37 38 39 38 38 38 40 41 41 40 40 40 40 40 40 40 39 40 40 40 40 40 40 40 39 40 39 38 38 39 38 37 37 37 36 36 36 35 35 35 35 35 35 34 34 36 36 35 34 33 33 34 35 36 36 36 35 34 34 35 34 33 34 34 63 63 64 64 63 63 63 63 63 63 63 63 62 63 63 64 64 63 63 62 62 62 62 62 61 61 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 51 50 50 50 51 51 51 51 51 50 50 51 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 46 46 45 45 45 45 46 47 48 48 49 49 49 48 48 47 47 46 46 46 46 47 48 48 48 48 47 46 46 45 44 44 43 43 45 44 45 45 45 44 44 44 44 44 43 41 40 40 41 42 42 44 44 44 43 42 41 40 40 39 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 37 36 35 36 37 37 37 37 37 37 37 37 37 36 37 37 37 36 35 35 35 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 33 35 37 37 36 36 35 36 36 36 35 34 34 34 33 33 33 33 33 32 32 32 31 31 31 31 30 30 30 30 30 30 30 30 31 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 33 33 35 36 35 34 33 31 31 31 33 33 33 35 35 34 34 34 33 32 31 32 34 35 36 36 36 36 35 34 35 34 34 32 30 30 30 31 31 32 34 35 36 37 36 36 37 36 35 35 34 33 34 35 36 36 34 34 33 32 32 32 32 32 32 32 32 32 32 32 33 35 36 37 37 38 38 38 39 38 36 35 34 36 37 37 38 38 39 38 37 37 37 35 33 32 32 33 34 34 33 34 34 34 34 34 34 35 35 35 34 33 32 32 32 32 32 32 32 33 34 36 37 37 37 37 36 37 37 38 38 39 40 40 40 39 38 38 37 38 38 39 39 39 38 39 39 38 38 37 36 37 38 38 38 38 38 39 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 39 39 39 39 38 39 38 38 37 37 36 36 36 36 36 35 34 34 35 35 34 34 35 36 36 35 33 33 34 35 35 36 36 35 35 34 34 33 33 34 35 62 62 63 63 63 63 63 63 63 63 62 62 62 62 63 63 63 63 62 61 61 61 61 61 61 61 61 61 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 58 58 57 57 57 57 58 58 58 58 58 58 58 59 59 59 58 58 58 58 58 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 54 54 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 53 53 52 52 53 53 54 55 54 54 54 54 53 53 53 54 53 53 53 53 53 53 54 54 54 53 53 52 52 52 52 51 51 52 51 51 51 51 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 45 45 45 45 46 47 48 49 49 49 49 48 48 47 47 46 46 46 46 47 47 48 48 48 47 47 46 46 45 44 43 43 44 44 44 44 45 44 44 44 44 44 43 42 41 40 40 41 42 43 44 44 42 41 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 36 36 36 36 37 37 38 37 37 37 37 37 37 37 36 35 35 35 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 34 36 36 36 35 35 35 36 36 36 35 35 35 35 34 33 33 33 32 32 31 31 30 30 30 30 32 33 31 31 32 31 30 30 30 30 30 29 30 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 32 33 35 34 34 34 32 31 32 33 34 34 34 35 35 34 34 34 33 32 31 32 35 35 35 36 36 35 34 34 34 34 33 31 30 30 30 31 32 33 34 34 35 35 35 36 37 36 35 35 33 33 35 36 36 35 34 34 32 32 32 32 32 32 32 32 31 31 32 32 33 36 38 39 38 38 38 38 39 38 36 35 35 36 37 37 37 38 38 38 37 37 36 35 33 32 32 32 33 33 34 35 35 35 35 35 35 34 34 34 33 32 32 32 32 32 32 32 33 35 35 36 37 36 35 36 36 36 37 38 38 39 40 39 39 38 37 37 37 37 37 38 38 37 38 39 38 37 37 36 36 37 37 37 37 38 38 38 39 40 39 39 40 40 39 39 38 38 39 39 39 39 39 39 38 38 39 39 38 38 38 37 37 36 36 36 35 35 36 36 35 35 34 35 35 34 33 34 36 35 33 32 33 34 34 36 36 35 35 34 34 34 35 35 36 61 61 62 63 63 63 62 63 63 63 63 62 61 61 61 61 61 61 61 60 60 60 60 60 61 61 60 60 60 60 60 59 59 59 59 59 58 58 58 58 59 59 59 59 59 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 53 54 54 54 54 54 54 55 55 54 54 54 53 53 53 53 53 53 53 53 53 52 53 53 53 53 53 53 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 46 46 45 45 45 46 47 48 49 49 48 48 48 49 48 47 47 46 46 46 46 47 47 48 47 47 46 46 46 46 45 44 43 42 43 44 43 43 44 45 44 43 43 43 43 42 42 40 39 40 42 42 43 43 43 41 40 40 39 39 39 40 39 39 38 37 37 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 36 37 37 37 37 37 37 37 37 37 36 35 35 34 34 33 34 34 33 33 32 32 32 33 32 32 32 32 32 34 35 35 35 34 34 35 36 37 37 35 35 35 35 35 34 34 33 31 30 30 30 30 30 30 31 34 36 35 34 34 33 32 31 31 31 31 31 32 33 32 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 32 35 35 34 33 32 31 32 33 34 34 35 35 36 36 35 34 34 34 32 31 32 33 34 35 35 35 35 34 33 34 33 31 30 30 30 30 31 32 34 34 34 34 35 36 36 36 35 35 34 33 34 35 36 35 34 34 34 33 32 32 32 33 32 32 31 31 31 32 34 35 37 39 40 39 38 38 39 39 37 35 35 35 36 37 37 37 38 38 38 38 37 36 35 33 32 32 32 33 35 36 36 35 36 36 36 35 34 33 34 33 32 32 32 32 32 33 33 34 35 36 37 36 35 35 36 37 38 38 38 39 39 39 39 37 37 37 37 37 37 37 38 37 37 37 37 37 36 36 36 37 37 37 38 38 38 38 38 38 39 39 40 40 40 39 38 38 39 39 39 39 38 38 38 39 39 40 39 38 38 37 37 37 37 35 35 36 35 35 36 36 36 34 34 34 33 33 33 34 34 33 32 32 33 35 36 36 35 34 34 34 35 36 36 36 61 61 61 61 62 62 62 62 63 63 62 62 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 59 59 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 53 54 54 55 55 54 54 55 55 55 55 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 52 52 51 51 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 46 46 45 45 45 46 47 48 49 49 48 48 48 48 48 47 46 46 46 46 46 47 48 47 46 46 45 45 46 46 45 45 44 42 42 43 43 43 44 44 45 45 44 43 43 41 41 41 39 39 41 42 43 43 42 42 41 40 40 40 40 40 40 39 39 38 37 37 36 36 36 36 36 36 36 35 35 35 35 35 35 35 36 36 37 37 37 36 36 36 36 36 36 35 34 34 33 32 33 33 33 33 32 33 34 34 34 33 33 32 32 32 33 35 35 34 34 35 36 37 37 35 35 36 36 35 34 34 33 31 30 30 30 30 31 31 31 33 35 35 35 34 33 33 32 33 34 34 34 34 34 33 31 29 30 31 31 30 31 31 30 29 29 29 29 29 29 29 29 29 29 29 31 33 35 34 32 31 31 32 33 34 34 35 36 37 37 35 33 33 33 32 31 31 32 34 35 34 34 34 33 34 33 32 30 30 30 30 30 31 33 33 33 34 35 36 36 35 35 35 33 33 33 35 35 34 33 34 34 34 32 32 32 33 33 32 32 31 31 32 33 34 36 38 38 39 39 38 38 38 39 38 36 35 35 36 36 36 37 37 38 37 37 37 36 34 32 32 32 33 35 36 35 35 35 36 36 36 34 33 32 33 32 32 32 32 32 33 34 35 35 35 37 36 35 35 36 37 37 38 39 40 39 38 38 38 38 36 36 37 37 37 38 37 36 36 36 36 36 36 37 37 37 37 37 38 38 38 38 38 38 39 39 40 40 40 39 38 38 39 39 39 38 38 38 39 40 39 39 39 39 38 37 37 38 37 37 35 36 36 34 35 36 36 34 34 34 34 34 33 33 33 33 32 32 33 35 36 36 35 34 33 33 35 35 35 35 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 61 61 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 53 54 55 55 55 55 54 54 55 55 55 55 55 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 50 50 49 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 48 48 48 48 48 47 47 47 46 46 46 45 45 45 46 47 48 49 48 48 47 47 48 47 47 46 46 46 46 47 48 47 46 46 45 44 45 46 46 46 45 44 42 41 42 42 42 43 44 45 45 45 44 43 42 40 40 39 39 40 41 43 42 41 42 42 41 41 41 41 40 40 39 39 38 38 37 36 36 36 37 37 37 37 37 36 36 35 35 34 35 35 35 36 37 37 36 36 35 35 35 35 34 34 33 32 32 32 32 33 32 33 35 36 35 35 35 35 34 32 31 32 33 33 33 34 35 35 37 37 35 35 36 37 36 34 33 32 31 30 31 32 31 32 33 33 33 33 34 34 34 34 33 34 34 35 35 34 34 33 32 31 31 32 33 34 33 33 34 31 29 29 29 29 29 29 29 29 29 29 29 29 31 33 32 31 31 32 33 34 35 35 35 36 36 36 36 34 33 32 32 31 30 31 33 34 34 33 33 34 33 32 30 30 30 30 30 30 30 31 32 32 33 34 34 35 35 35 34 32 32 33 35 34 33 33 34 34 33 32 32 32 32 33 32 32 31 31 32 33 34 36 36 37 38 39 39 38 38 39 38 36 35 36 36 36 35 36 37 38 37 36 36 36 33 32 32 33 34 34 35 35 36 36 35 35 34 33 32 32 32 32 32 32 32 32 33 35 36 35 35 35 35 35 36 38 38 38 38 38 38 38 37 36 37 38 36 35 37 38 38 37 36 35 35 37 37 37 37 37 37 37 37 37 38 38 38 38 39 39 40 40 39 38 38 38 38 38 39 39 38 38 38 39 39 39 39 38 39 39 39 39 39 38 38 38 36 36 36 35 34 35 36 36 36 35 35 35 35 35 34 33 32 32 33 35 36 35 34 34 33 33 33 34 34 34 63 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 61 61 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 53 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 48 48 49 49 49 49 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 45 45 45 45 47 48 48 48 48 47 47 47 47 46 46 46 46 47 47 48 47 47 46 45 44 45 46 46 45 44 44 43 42 41 41 41 42 43 43 44 44 44 43 43 41 41 39 38 39 41 42 42 41 41 41 41 41 41 40 40 39 39 38 38 37 37 37 36 37 38 38 37 37 37 37 36 35 35 34 34 34 35 35 37 37 37 36 35 34 34 35 34 34 33 32 32 33 33 33 33 34 36 36 36 36 36 35 34 33 33 33 32 31 31 32 33 35 35 35 35 34 35 35 35 33 32 31 31 32 33 32 32 33 34 34 33 33 34 35 35 35 34 34 34 34 33 32 32 32 31 32 33 33 34 34 34 34 33 32 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 32 33 33 34 36 36 36 36 36 36 35 34 34 32 32 32 31 30 32 33 33 32 33 34 33 31 30 30 30 31 32 32 31 32 32 32 32 32 32 33 33 33 32 32 32 34 35 33 33 34 34 33 32 31 32 32 32 32 32 31 31 31 31 33 34 34 34 36 38 39 38 38 39 39 38 35 34 35 36 35 35 36 37 38 37 36 36 36 34 32 32 33 35 35 36 36 36 35 34 33 32 32 32 32 32 32 32 32 32 33 33 35 36 34 34 33 34 35 36 37 37 38 37 37 37 38 37 36 36 36 35 35 36 37 37 36 35 35 37 38 39 38 37 38 38 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 39 39 39 38 37 38 39 38 38 38 38 38 39 40 40 40 40 39 39 38 37 37 37 35 34 34 35 36 36 36 35 34 35 35 34 33 32 32 33 35 36 35 35 34 33 32 33 34 34 34 63 63 63 62 62 62 62 62 62 61 60 60 61 61 61 62 62 63 63 63 63 63 63 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 53 53 53 53 52 52 52 51 51 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 49 49 50 50 49 49 49 48 48 48 48 49 49 48 48 48 48 48 49 49 49 49 48 48 47 48 48 47 47 48 48 48 48 47 47 47 47 48 47 47 47 46 46 45 45 45 46 47 47 47 47 47 47 47 47 46 45 45 46 47 47 48 48 47 46 45 44 45 45 45 44 44 44 44 44 42 41 40 41 42 43 43 43 43 43 43 42 42 40 39 39 40 42 41 40 41 41 40 41 41 40 40 39 39 38 38 38 37 37 37 37 38 38 37 37 37 37 36 35 35 34 34 34 35 36 36 36 37 36 35 35 34 34 34 34 33 32 32 33 34 34 35 35 36 37 37 37 37 35 35 34 34 34 34 34 33 32 32 33 34 33 33 33 33 33 33 32 31 31 32 33 33 33 33 34 34 35 34 34 34 35 35 35 34 34 34 34 33 32 32 31 31 33 34 34 35 35 35 34 33 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 34 34 34 35 36 37 36 35 35 36 35 33 33 33 33 33 31 31 32 32 32 33 33 32 30 30 30 30 31 32 33 34 34 34 33 33 33 32 32 32 33 33 33 34 34 35 34 33 33 32 31 31 31 32 32 32 32 31 31 30 30 31 32 33 33 34 36 37 38 38 38 38 39 38 36 34 34 35 35 35 36 37 38 37 36 36 37 34 32 32 34 37 37 37 37 36 35 33 31 31 32 32 32 32 33 34 33 34 34 34 35 35 34 33 33 35 36 36 37 37 37 37 37 36 36 35 35 35 35 35 35 35 36 36 35 35 36 37 37 38 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 38 37 38 39 39 38 38 38 38 38 39 39 39 39 40 39 39 39 38 38 37 36 36 35 34 34 35 36 36 36 34 34 34 33 32 32 33 34 35 35 35 34 33 32 33 34 33 34 64 63 63 63 63 62 62 62 61 60 60 61 61 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 54 54 53 53 53 53 53 54 53 53 53 52 52 52 52 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 48 48 48 48 49 48 47 47 48 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 45 45 45 45 46 47 47 47 47 47 47 47 46 45 45 47 47 47 47 47 47 47 46 45 44 44 44 44 44 43 44 44 43 43 41 41 41 41 42 43 43 43 42 42 42 41 40 39 39 41 41 39 40 40 39 40 40 41 41 40 39 39 39 38 38 37 37 37 38 38 38 38 37 37 36 35 35 34 34 34 34 35 35 35 36 35 35 35 34 34 33 33 33 32 32 33 34 34 35 36 36 37 38 37 36 35 36 36 34 35 36 36 34 32 31 32 32 32 31 31 31 31 31 31 31 32 34 34 34 34 34 35 35 35 35 34 35 35 35 35 34 34 34 34 33 33 32 31 31 32 33 33 34 35 35 35 33 32 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 33 34 34 34 35 36 35 34 36 36 35 34 34 34 33 33 32 30 31 32 32 33 32 31 30 30 30 31 32 33 33 35 36 36 36 35 35 34 33 33 34 34 35 35 35 35 33 32 32 31 31 32 33 33 32 32 32 31 31 30 30 31 32 33 35 36 37 37 38 38 38 39 39 38 36 34 34 35 35 35 37 37 37 37 36 36 36 34 32 32 33 36 37 37 37 37 35 32 31 33 33 33 33 34 34 35 35 35 34 35 35 34 34 34 34 36 37 38 37 37 36 36 36 35 34 34 34 35 36 36 36 36 35 35 35 37 37 37 37 38 39 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 38 38 38 37 37 39 40 39 38 38 38 38 38 39 39 38 39 40 39 38 38 38 37 36 36 37 36 34 34 35 36 36 37 35 35 35 33 32 32 32 33 34 34 34 34 33 32 34 33 33 34 64 63 63 63 63 62 61 60 60 60 61 61 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 48 48 48 48 49 49 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 45 45 45 46 47 47 47 46 47 47 47 46 45 45 46 47 47 47 47 47 47 47 46 45 44 44 44 43 42 42 42 43 43 43 42 40 40 41 41 41 42 41 41 42 41 40 39 38 39 40 39 39 39 39 39 39 40 40 40 39 39 38 38 38 38 38 38 38 39 39 38 37 37 37 36 35 34 34 34 34 34 34 35 35 35 35 35 34 34 33 33 32 32 33 33 34 34 34 35 36 37 37 37 36 35 36 36 35 36 37 37 35 33 32 32 31 31 31 32 33 33 33 33 33 34 35 35 35 34 34 35 35 35 35 35 35 35 36 35 34 34 33 33 32 32 32 31 31 32 32 32 32 33 35 35 35 34 33 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 33 33 34 36 35 34 34 35 36 35 34 34 34 33 32 31 30 30 32 32 33 32 30 30 30 30 32 33 34 34 34 36 36 36 36 36 36 35 34 34 34 36 35 35 34 32 31 31 32 32 33 34 33 32 32 31 31 30 30 32 33 34 35 35 38 38 38 38 38 38 38 39 38 35 34 34 34 35 36 37 38 37 36 36 36 36 35 33 31 32 35 37 37 37 36 34 32 32 34 35 35 35 35 35 35 35 35 34 33 33 33 33 34 35 35 36 36 36 36 36 35 35 35 35 35 36 37 37 37 37 37 37 36 37 37 37 37 37 38 39 39 39 38 38 38 38 38 38 38 37 37 38 38 38 39 40 39 38 37 37 37 38 38 39 38 38 39 38 38 39 39 39 38 39 40 39 38 38 38 37 36 36 36 35 35 35 34 35 35 36 36 36 35 34 33 33 32 32 33 34 34 34 33 33 33 33 33 35 63 64 64 63 62 62 61 60 61 61 62 62 62 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 46 46 46 46 46 47 47 47 47 47 47 46 46 47 47 46 45 45 45 45 46 46 47 47 47 47 47 46 46 45 45 46 46 47 47 47 47 46 46 46 45 43 43 42 42 41 41 41 42 43 42 41 39 39 40 40 40 41 40 41 41 40 39 38 38 40 39 38 38 39 38 38 38 39 40 40 39 38 38 38 38 38 39 39 39 39 39 38 38 37 36 36 36 35 34 34 34 34 35 36 36 35 35 35 34 33 33 33 33 33 34 34 34 34 34 35 36 37 37 37 37 37 37 36 36 37 36 35 33 33 34 34 33 32 33 34 34 35 36 34 34 35 36 35 34 34 34 35 35 35 35 35 35 35 35 34 34 34 33 33 32 31 32 33 33 33 32 31 33 34 35 35 35 36 34 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 33 34 35 36 34 33 34 35 35 34 34 33 34 33 32 31 30 31 32 32 31 31 30 30 30 31 33 34 35 35 35 35 35 36 37 37 37 36 35 34 35 36 35 34 33 31 31 33 34 34 34 34 33 32 31 30 30 30 31 33 33 34 35 36 37 38 39 39 38 38 37 37 37 36 34 34 34 35 36 37 38 37 37 36 36 35 34 33 31 32 35 37 37 36 34 32 32 33 34 36 36 36 35 34 35 35 34 33 33 33 33 34 35 35 35 35 35 35 34 34 34 35 36 36 37 37 38 38 39 39 39 38 38 38 38 38 38 37 38 39 39 39 38 38 38 38 38 38 37 37 38 38 38 38 39 39 39 39 37 37 38 38 38 39 38 38 38 38 39 39 39 38 38 39 40 39 38 38 38 37 37 37 35 35 36 36 34 33 34 36 37 36 36 36 35 35 34 32 32 32 33 34 33 33 32 33 34 35 63 63 63 62 62 62 61 61 61 62 62 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 62 62 62 62 62 61 61 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 46 47 47 47 47 47 46 46 46 46 46 45 45 46 46 47 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 47 47 46 46 47 46 45 45 46 46 47 47 47 47 47 47 46 45 44 44 43 43 42 41 40 41 41 41 41 40 39 39 39 39 40 40 39 40 40 39 38 38 39 40 39 38 38 38 38 38 38 39 40 40 39 39 39 39 39 40 39 39 38 38 39 38 37 37 37 37 36 35 34 33 34 35 36 36 35 35 34 34 33 33 34 33 33 34 34 35 35 34 34 35 36 37 38 37 37 37 37 36 36 36 35 33 34 35 35 34 33 34 34 35 36 36 35 34 35 36 36 35 34 34 34 34 35 35 35 35 36 35 35 34 34 34 34 33 33 34 34 34 33 32 31 32 34 34 35 36 37 35 34 31 29 29 29 29 29 29 29 29 29 29 29 29 29 32 34 36 37 35 33 33 34 35 36 34 34 33 33 32 32 31 30 31 31 30 30 30 30 30 30 31 32 34 35 36 36 35 35 36 37 36 36 37 36 34 35 35 35 33 32 31 32 34 35 35 35 35 33 32 31 30 30 30 31 32 32 33 35 36 38 39 39 38 37 38 38 38 38 36 34 35 35 35 36 37 38 37 37 36 36 35 35 33 31 32 35 37 37 34 32 32 33 34 35 36 35 35 34 34 35 34 34 33 33 33 34 35 35 35 34 34 34 33 34 34 35 36 37 37 37 38 39 39 40 40 39 39 39 39 39 39 39 39 38 39 40 39 38 38 38 38 38 38 37 37 38 39 38 38 38 39 39 38 37 37 38 38 38 38 38 38 39 39 39 39 38 38 38 39 39 38 38 38 38 37 37 37 36 37 37 35 35 34 34 34 35 35 35 36 36 36 35 33 32 32 32 32 32 32 32 33 35 36 63 63 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 55 56 56 57 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 45 45 45 45 45 46 46 45 45 45 45 46 47 47 46 46 46 46 45 46 47 47 47 47 47 47 47 47 47 47 46 45 44 43 42 41 41 40 40 40 40 39 39 39 39 39 39 38 38 38 39 38 37 38 39 40 39 38 37 37 37 37 38 38 38 39 40 40 40 40 40 39 39 38 37 37 38 38 37 37 37 36 36 35 34 33 33 35 35 35 34 34 34 33 33 34 34 34 34 34 35 35 35 35 34 35 36 37 38 37 37 37 37 36 36 36 35 34 34 35 35 34 34 34 35 36 37 37 36 34 35 36 36 36 35 34 34 34 35 35 35 36 37 36 35 35 35 34 34 34 34 34 33 33 32 32 32 33 33 33 34 35 36 36 35 32 29 29 29 29 29 29 29 29 29 29 29 29 30 33 35 35 35 34 34 35 35 36 36 35 34 33 32 33 33 32 30 30 30 30 30 30 30 30 31 33 33 34 35 36 35 34 35 35 35 35 36 36 36 36 36 35 34 33 31 32 33 34 35 35 35 35 33 32 31 30 30 30 30 31 32 34 36 37 39 39 38 37 37 37 39 40 38 35 34 35 36 36 36 37 37 37 37 36 36 37 35 33 31 32 35 36 34 33 32 33 34 35 35 35 35 34 34 34 34 34 33 33 33 33 34 34 34 33 33 33 33 34 35 36 37 37 37 38 38 38 39 39 39 39 38 38 39 38 39 39 39 39 39 38 39 39 39 38 38 37 37 37 37 37 38 38 38 38 38 39 39 38 37 37 38 37 38 38 38 38 39 39 39 38 38 37 37 38 38 37 37 38 37 37 37 37 38 37 36 35 35 36 36 34 33 33 34 35 36 35 35 33 34 33 32 32 32 31 31 32 34 36 64 63 63 62 62 62 62 62 62 63 63 63 63 63 63 63 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 55 55 56 56 56 57 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 46 46 47 46 46 47 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 45 46 46 46 46 46 45 45 46 46 46 46 47 47 47 47 47 47 47 46 45 45 43 42 42 42 41 41 41 40 39 39 39 39 39 38 38 38 38 38 38 37 37 38 39 39 38 37 37 36 36 37 37 38 38 40 40 39 40 40 39 38 38 37 36 37 37 37 36 35 35 35 35 35 34 33 34 34 34 34 34 33 33 34 34 34 34 34 35 36 36 36 35 35 35 36 37 38 37 37 37 37 36 36 36 35 34 35 35 35 34 34 35 35 36 37 37 35 35 35 36 37 37 35 34 35 35 35 35 36 37 37 36 36 36 36 35 34 34 35 33 33 33 33 32 32 34 33 32 32 34 35 35 34 31 29 29 29 29 29 29 29 29 30 32 32 33 33 34 35 34 33 34 35 36 37 37 37 35 33 32 32 32 32 32 31 30 30 30 30 30 30 30 32 34 34 35 36 36 35 34 34 35 35 35 36 36 36 36 36 35 34 32 31 33 34 35 35 35 35 34 34 33 31 30 30 30 30 32 34 36 36 37 38 38 37 36 37 38 39 39 38 35 34 36 38 38 38 38 38 37 36 36 36 37 35 33 31 32 34 34 32 31 32 34 35 36 35 34 34 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 35 36 36 37 38 38 38 38 38 39 39 39 38 39 38 38 39 39 39 39 39 38 38 38 38 38 39 38 37 37 37 37 37 37 38 39 38 37 38 39 38 37 37 37 38 38 38 38 38 38 39 38 37 38 37 37 38 38 37 37 37 37 36 36 37 38 38 37 37 36 36 37 36 35 34 33 33 34 34 34 35 35 35 34 33 32 32 31 31 32 33 35 64 64 63 63 63 63 63 62 63 63 63 63 63 63 63 64 64 64 63 63 63 64 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 55 56 56 57 57 57 57 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 49 49 50 49 49 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 46 45 45 44 45 45 45 45 46 46 45 45 45 45 45 46 46 46 47 47 47 47 47 47 45 44 43 43 43 43 43 42 42 41 41 41 41 41 40 39 39 38 38 38 37 37 37 38 39 39 39 38 37 37 36 36 37 37 38 39 38 38 39 39 38 38 37 37 36 36 36 36 36 35 34 34 34 34 34 34 34 33 33 33 33 33 34 34 35 34 34 34 35 36 36 36 36 35 35 35 37 37 38 38 38 37 36 37 37 35 35 35 36 36 35 34 35 36 37 37 37 36 36 36 36 37 37 36 35 35 35 36 36 37 37 37 36 36 36 36 35 34 35 35 34 34 34 34 33 32 34 34 33 32 32 32 32 32 30 29 29 29 29 29 29 29 30 33 35 35 36 35 35 34 33 33 34 35 36 36 36 35 35 34 33 33 33 32 32 32 30 30 30 30 30 30 31 33 34 35 35 36 35 34 34 35 35 36 36 36 35 35 35 35 34 33 32 31 33 34 34 34 35 35 34 34 33 31 30 30 30 31 34 35 35 35 36 37 37 36 36 37 38 39 38 37 35 34 36 38 39 39 38 39 38 37 36 36 36 34 32 31 32 34 34 32 31 32 34 36 35 34 33 33 33 33 33 33 33 34 35 35 35 35 34 35 35 36 36 36 37 37 37 38 38 38 38 39 39 40 38 38 39 39 39 40 40 39 39 39 39 38 38 38 38 38 38 37 38 38 37 37 37 38 38 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 37 37 38 38 38 38 38 38 37 36 36 37 37 37 38 38 38 38 38 38 38 37 36 36 35 34 33 33 34 35 35 35 34 33 32 31 31 32 33 34 35 64 64 64 64 64 64 63 63 63 63 63 63 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 55 56 56 57 57 57 57 57 57 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 44 44 45 45 45 45 46 46 45 45 45 46 46 46 46 47 47 47 47 47 46 45 45 44 44 44 43 43 44 43 42 41 41 41 41 41 40 40 40 39 39 38 37 37 37 38 39 39 38 38 38 37 36 36 36 37 37 37 37 38 38 38 38 38 37 37 36 36 35 35 35 34 34 34 34 34 34 34 33 33 33 33 34 34 35 35 34 34 35 35 36 37 37 37 36 36 35 36 38 39 39 38 37 37 37 37 36 36 36 37 36 35 35 36 36 37 37 37 37 37 37 37 37 37 36 35 35 36 36 37 37 37 37 36 36 36 35 35 35 36 35 34 34 34 34 32 32 33 34 34 32 31 30 30 30 29 29 29 29 29 29 29 29 31 33 34 35 36 34 34 34 33 34 34 35 35 35 35 34 34 35 34 34 34 32 32 31 30 30 30 30 30 30 32 34 34 35 35 35 34 34 34 35 35 35 36 35 35 34 35 35 34 32 31 31 32 33 34 34 35 36 35 35 33 31 30 30 31 33 34 34 35 36 37 37 36 36 36 37 38 38 37 36 35 35 37 37 38 38 38 39 38 37 37 36 35 33 31 31 32 34 33 32 31 32 34 36 35 33 33 33 33 33 33 34 35 37 37 36 36 36 36 36 37 37 37 37 37 38 38 38 38 38 39 39 40 39 38 38 38 39 39 39 39 39 39 39 39 39 39 38 38 38 39 39 39 39 38 37 36 37 38 37 37 38 38 38 37 36 37 38 38 37 37 37 38 38 37 38 38 38 37 37 37 38 37 36 36 37 37 38 38 38 38 38 38 38 38 37 37 37 36 36 35 33 32 33 33 33 34 33 32 31 31 32 34 34 36 65 64 64 65 65 64 64 64 63 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 56 56 56 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 48 48 48 47 47 46 46 46 47 46 46 45 45 45 45 45 45 45 44 44 45 45 45 45 45 44 45 46 46 47 47 47 47 48 48 48 47 46 45 44 44 44 43 43 43 43 42 42 41 41 40 40 40 41 40 40 40 39 38 37 37 37 38 38 39 39 38 37 37 36 36 36 37 37 37 38 39 38 38 38 38 37 37 36 35 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 36 35 35 35 35 36 37 38 37 37 36 36 36 37 38 38 38 37 37 38 37 37 37 37 37 37 36 36 37 37 37 38 38 37 37 37 38 37 37 36 35 36 37 37 37 38 37 37 37 37 36 36 36 37 37 35 34 34 34 34 33 33 33 34 33 33 32 31 30 30 30 29 29 29 29 29 29 29 31 33 32 33 35 33 33 33 33 34 34 34 34 35 36 34 34 34 34 34 33 33 33 31 30 30 30 30 30 30 32 34 33 34 35 34 33 33 34 34 34 35 35 35 34 34 35 35 34 32 31 31 32 32 33 33 35 35 36 36 33 31 30 31 33 34 34 35 36 37 37 37 36 35 36 37 38 37 36 35 34 35 37 37 37 38 38 38 38 37 37 36 35 33 31 31 32 33 33 31 32 33 34 35 34 33 33 33 33 34 35 36 37 37 37 37 36 36 37 37 37 37 36 37 38 38 38 38 38 39 40 40 40 39 38 38 38 39 38 38 38 38 38 38 39 40 40 39 38 39 40 39 39 38 38 37 36 36 37 37 37 38 38 37 37 36 37 37 37 37 37 37 37 37 37 38 37 37 37 37 37 38 37 36 36 36 37 38 38 38 38 38 38 38 38 38 37 37 37 36 35 34 33 32 32 32 33 33 32 31 31 32 34 35 36 65 65 65 65 65 65 65 64 64 64 64 64 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 56 56 56 56 56 56 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 53 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 48 48 48 47 47 47 47 46 46 47 47 47 46 46 45 45 45 45 45 45 44 44 44 45 45 45 44 45 45 46 46 47 47 47 48 48 48 48 47 46 45 43 43 43 43 42 41 42 42 42 41 41 40 40 40 40 40 40 39 39 39 38 37 37 37 38 40 40 38 38 37 36 36 35 36 36 37 38 38 38 37 38 38 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 36 37 36 36 36 36 36 37 38 38 37 37 37 36 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 38 37 38 37 37 36 35 35 37 37 37 37 38 38 37 37 36 36 36 37 37 36 35 34 34 35 35 34 34 34 34 33 32 32 31 30 29 30 29 29 29 29 29 29 29 30 32 32 32 33 32 32 33 33 33 33 34 34 36 36 35 34 34 33 33 34 33 33 31 30 30 29 29 30 30 32 33 33 34 33 33 32 33 34 34 35 35 35 34 34 34 35 35 34 32 30 31 32 32 32 33 35 35 35 34 32 30 30 31 32 33 34 35 35 36 37 37 35 36 37 38 38 38 36 34 34 36 37 37 37 37 37 37 37 37 37 36 35 33 31 31 32 32 32 31 32 34 35 34 33 33 33 33 34 35 36 37 36 36 36 37 37 37 37 36 36 37 37 37 38 38 38 39 39 40 40 39 39 38 38 38 39 38 38 38 38 39 39 39 39 40 40 39 39 40 39 39 38 38 38 37 37 37 36 36 37 37 37 37 36 37 37 37 37 37 38 37 37 38 38 38 37 37 37 37 37 37 37 37 36 36 36 37 38 38 38 38 38 38 38 38 38 38 37 37 36 35 35 33 33 33 32 32 32 31 31 32 33 35 36 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 47 47 47 47 46 46 46 45 45 44 45 45 44 44 44 45 45 44 44 45 45 45 46 46 46 47 47 47 46 46 46 46 45 43 42 42 43 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 38 38 37 37 37 38 40 40 39 38 37 37 36 35 35 36 37 37 38 37 37 37 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 34 34 35 36 36 36 36 36 37 37 37 37 37 38 39 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 38 38 39 39 38 38 37 37 36 36 36 37 38 38 38 38 38 37 37 37 36 37 37 37 35 35 34 35 36 35 35 34 34 33 32 31 31 31 30 30 30 29 29 29 29 29 29 29 29 30 31 33 34 32 32 33 33 33 34 35 35 35 36 36 34 34 33 32 32 32 32 31 30 29 29 29 30 31 32 33 34 33 32 32 33 33 34 34 35 35 34 33 33 34 34 34 33 31 30 31 32 33 33 34 36 36 34 33 32 30 30 31 32 33 33 34 35 35 36 36 35 36 37 37 37 37 37 35 34 36 36 37 38 37 37 37 37 37 37 36 35 32 30 30 31 31 31 32 33 34 35 33 32 32 33 34 35 36 35 35 35 36 37 37 37 37 36 36 38 38 38 38 38 38 38 39 39 39 40 39 38 37 37 38 38 38 38 39 39 39 39 39 40 40 40 40 40 39 39 39 38 38 37 37 37 37 37 36 36 37 37 36 36 37 37 36 37 38 38 37 37 38 39 39 38 38 37 36 37 37 37 37 37 36 36 37 38 38 38 38 37 37 38 38 38 38 38 38 37 35 35 35 34 34 32 31 31 31 31 32 33 34 35 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 56 56 56 56 56 56 56 56 56 56 55 55 56 55 55 55 54 54 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 45 45 45 46 46 46 47 47 47 46 45 45 45 43 42 42 41 41 42 41 41 41 40 40 39 40 40 40 39 39 38 38 38 38 37 37 37 37 38 40 39 38 38 37 37 36 35 35 36 36 37 38 37 37 36 36 36 35 34 34 34 34 34 34 34 34 34 34 35 35 35 34 35 36 37 37 36 36 36 37 37 38 38 39 40 39 39 38 37 37 38 38 38 38 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 36 36 37 37 37 38 38 38 37 37 37 37 36 37 37 37 36 35 36 37 36 34 33 33 32 31 31 32 32 31 31 31 30 29 29 29 29 29 29 29 29 30 32 34 32 32 33 33 34 34 35 35 34 36 36 34 34 33 32 32 31 31 30 29 29 29 29 30 32 33 32 33 32 32 33 34 34 35 35 35 35 34 33 34 34 34 33 32 30 30 31 33 34 35 35 36 36 35 34 31 30 30 31 32 32 33 33 34 35 36 36 35 35 36 37 37 36 35 34 34 35 36 37 38 37 37 37 37 36 36 36 35 32 30 30 30 31 32 34 35 36 35 33 32 32 33 34 35 34 34 34 35 37 37 38 36 36 37 38 39 39 38 38 38 38 38 39 38 38 39 38 37 38 37 37 38 38 38 39 39 39 39 39 40 40 40 39 39 39 39 38 37 37 37 38 38 38 37 36 36 37 37 36 37 37 36 37 38 38 37 37 37 38 38 38 38 38 37 37 37 37 37 37 36 36 37 37 38 38 38 38 37 37 38 37 37 37 37 37 37 36 35 34 35 34 33 31 31 31 31 31 32 32 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 56 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 55 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 52 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 47 47 47 47 46 45 45 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 47 47 46 45 44 43 43 42 42 41 40 40 41 41 42 41 40 40 39 39 39 40 39 38 37 38 38 38 37 36 36 38 39 39 38 38 37 36 35 35 35 35 36 37 37 37 37 36 36 35 34 34 34 34 34 34 34 35 35 35 36 36 36 36 35 35 37 37 37 37 36 36 37 37 38 38 39 39 39 38 37 38 38 38 39 38 38 38 38 38 37 37 37 36 37 37 37 38 38 38 38 38 38 37 38 38 37 37 37 37 37 36 36 37 37 37 36 36 36 36 35 36 37 36 36 36 36 37 36 34 33 33 32 32 33 33 33 33 32 32 31 29 29 29 29 29 29 29 29 29 30 32 32 32 33 33 33 34 34 34 35 36 35 34 34 34 33 32 32 30 29 29 29 29 29 30 31 32 33 32 31 32 33 34 35 36 35 35 34 33 33 34 34 34 32 31 30 30 31 32 33 34 36 36 35 35 32 30 30 30 31 32 32 32 32 33 34 35 35 35 35 36 37 36 35 33 34 35 35 37 37 37 37 36 37 37 36 35 35 35 32 30 30 30 32 34 35 36 36 36 34 32 32 33 34 34 33 35 35 36 37 37 37 36 36 38 39 39 38 37 37 37 38 38 38 38 38 37 38 38 38 38 38 39 39 38 38 38 38 39 39 40 40 40 39 39 39 38 38 38 38 39 38 38 38 37 36 36 37 37 36 37 37 37 37 38 38 37 36 37 38 38 38 38 38 37 36 36 36 36 36 36 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 38 37 36 34 34 34 34 32 32 32 32 32 31 31 31 65 65 65 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 56 56 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 54 54 54 53 53 53 53 52 52 52 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 45 45 44 44 44 44 44 44 45 45 45 45 46 45 45 46 47 47 46 44 43 42 42 41 41 41 41 40 40 41 41 41 41 40 39 38 38 39 38 38 37 37 38 38 36 36 36 37 38 39 38 37 37 36 35 35 35 35 35 35 36 36 36 36 35 34 34 34 34 34 34 34 35 36 36 36 37 37 37 36 35 35 36 37 37 37 37 36 37 37 38 38 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 37 37 36 36 36 37 37 37 38 38 37 37 37 37 37 37 36 36 36 36 35 35 36 37 37 35 35 35 35 34 35 36 35 35 35 36 37 36 35 35 34 34 34 34 34 34 33 32 32 31 29 29 29 29 29 29 29 29 29 29 31 32 31 32 33 34 34 34 34 36 36 35 34 34 34 33 33 32 30 29 29 29 29 29 30 31 32 32 31 32 33 34 35 36 35 34 35 34 33 32 33 33 32 31 30 30 31 32 33 33 35 35 35 35 33 31 30 30 30 32 33 33 32 31 33 34 35 35 35 35 35 35 35 34 34 35 36 37 37 36 36 36 37 37 37 36 35 35 34 32 30 30 31 33 35 36 36 36 36 35 32 32 33 34 34 34 35 35 36 37 38 38 36 36 37 39 38 37 37 37 38 38 38 38 37 37 37 38 38 38 38 39 40 39 38 38 39 39 39 39 39 39 39 40 40 39 38 38 38 39 39 38 38 38 37 37 36 36 36 36 36 37 38 38 38 38 37 36 36 37 38 38 37 37 37 36 35 35 36 36 37 37 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 36 34 33 33 33 33 34 34 33 31 30 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 56 56 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 55 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 44 44 45 45 45 45 45 46 46 46 45 43 42 42 41 40 40 41 41 40 40 40 41 41 41 40 40 39 38 38 37 37 37 37 37 37 36 36 36 37 38 38 38 37 37 37 36 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 34 35 36 36 36 36 37 37 37 36 35 35 36 37 37 38 37 37 37 37 38 39 40 40 40 40 40 40 39 39 39 39 38 38 37 37 37 37 36 37 36 36 35 35 36 37 37 36 36 37 36 36 36 36 35 34 34 35 35 36 37 37 36 35 34 34 34 33 34 35 35 35 36 37 36 35 35 35 35 35 34 34 33 33 32 31 31 29 29 29 29 29 29 29 29 29 29 30 31 32 33 33 33 35 34 34 35 35 34 34 34 34 33 32 32 30 29 29 29 29 29 30 30 31 31 32 33 34 34 35 35 35 34 35 34 33 32 33 33 31 30 30 30 32 33 33 35 36 35 35 34 33 31 30 30 31 33 34 34 33 32 33 34 36 36 34 34 35 35 33 33 35 36 37 37 36 35 36 37 37 38 38 37 36 35 34 32 30 30 31 33 34 34 35 35 36 34 33 32 33 33 33 33 34 34 35 37 38 38 36 36 37 37 36 36 37 38 38 38 38 37 37 36 37 38 39 39 39 39 40 39 38 38 39 40 39 38 38 39 39 39 40 40 39 39 39 39 39 39 38 38 37 37 37 36 36 36 36 37 37 38 38 38 37 37 36 37 37 37 37 37 37 36 35 36 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 36 36 37 37 37 36 35 34 33 32 33 33 33 33 33 31 30 67 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 56 56 56 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 44 45 45 45 45 45 45 46 46 45 44 43 43 42 41 40 40 40 40 39 39 40 41 41 40 40 40 39 39 38 38 38 38 37 37 36 36 36 36 37 38 38 37 37 37 37 36 35 34 34 34 34 34 34 34 34 34 34 34 35 35 35 36 37 37 37 37 37 37 37 36 36 36 36 37 37 38 38 38 37 38 39 39 39 40 39 39 39 39 40 40 39 38 38 38 37 37 37 37 36 36 36 35 35 35 35 36 36 35 35 36 35 36 36 36 35 34 33 34 35 36 36 37 36 35 34 34 33 32 33 34 35 36 36 36 36 35 35 34 35 34 34 33 31 32 32 31 31 29 28 28 28 29 29 29 29 29 29 29 31 33 34 33 34 35 34 34 35 35 34 34 34 33 33 32 31 30 29 29 29 29 29 30 30 31 32 33 34 34 35 34 34 34 35 35 34 33 32 33 33 31 30 30 31 31 33 34 35 36 35 34 33 32 31 30 30 31 33 33 34 33 33 34 34 35 35 34 34 35 34 33 33 34 36 37 36 35 36 37 38 37 37 37 37 36 35 33 31 30 30 32 33 34 34 35 36 36 35 34 33 32 33 34 34 34 34 35 36 38 38 36 35 36 36 36 37 38 38 39 38 38 37 36 37 38 38 39 39 39 39 39 38 38 38 39 39 38 38 38 38 39 39 40 40 40 40 39 39 39 39 39 39 38 38 38 37 35 35 36 37 37 38 38 38 37 37 37 37 37 37 37 37 37 35 36 37 37 37 38 39 39 38 38 38 38 38 37 37 38 38 38 37 37 37 37 37 37 36 34 34 33 32 33 33 32 32 33 33 33 67 67 67 66 66 66 66 67 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 56 56 57 57 57 57 57 57 57 57 56 56 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 51 50 50 50 50 50 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 48 48 49 49 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 44 43 43 43 44 45 45 45 45 46 46 46 46 45 44 44 42 42 42 40 40 40 39 38 39 40 40 40 40 40 40 40 40 39 39 39 37 37 36 36 36 36 37 38 37 37 38 37 37 36 35 34 34 35 34 34 34 34 34 34 34 35 36 36 36 36 37 38 38 37 37 37 37 37 37 36 36 36 37 38 38 38 39 39 40 40 39 39 39 38 38 38 39 39 39 39 39 38 37 37 37 37 37 36 36 36 36 36 35 34 35 35 34 34 34 35 36 35 34 34 33 33 34 34 35 35 35 35 34 34 32 31 33 35 36 36 36 35 35 34 34 34 34 34 34 32 31 30 31 31 30 29 28 28 28 29 29 29 29 29 29 30 32 33 34 34 35 34 33 34 35 34 34 34 34 33 33 32 31 30 29 29 29 29 29 30 31 33 33 33 34 34 34 34 33 34 34 34 34 33 32 32 32 30 30 31 32 32 33 35 35 36 34 33 32 31 30 30 30 31 32 32 32 34 34 34 35 35 34 34 35 34 33 33 34 35 36 36 35 36 37 37 38 37 37 37 37 37 36 34 31 30 30 32 33 34 35 36 36 36 35 34 32 33 34 35 35 35 35 36 37 38 37 36 35 36 37 37 38 38 38 38 38 37 36 36 38 39 39 39 39 39 39 39 38 37 38 39 38 37 38 38 39 39 40 40 40 40 40 40 38 38 38 39 39 38 38 38 37 36 35 36 37 38 38 38 38 37 37 36 37 37 37 37 37 35 35 37 37 37 37 38 39 39 38 37 37 38 38 37 37 37 37 38 38 37 37 37 38 37 36 35 35 34 34 35 36 34 33 33 33 33 67 67 67 67 66 66 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 53 52 52 51 51 51 51 51 52 52 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 49 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 44 44 43 43 44 44 45 46 46 46 47 46 45 46 45 44 43 43 43 42 42 41 41 39 38 38 39 39 40 40 40 40 40 40 40 39 38 36 35 35 36 36 37 38 37 37 37 37 37 36 35 34 35 35 34 35 34 34 34 34 35 35 36 36 37 37 37 38 39 39 38 37 37 37 37 37 36 36 36 37 38 38 39 40 40 40 40 39 39 38 38 38 39 38 39 39 39 38 37 37 38 37 38 37 37 37 37 36 36 35 35 35 35 35 34 34 34 33 33 33 32 32 32 32 33 34 34 34 33 32 32 32 32 34 36 37 36 34 34 34 34 34 34 33 33 32 32 30 30 29 28 28 28 28 28 28 29 29 29 29 29 31 32 34 35 35 34 33 33 34 34 33 34 34 34 33 32 32 32 31 29 29 29 29 29 31 32 33 33 33 34 33 33 33 33 34 34 34 33 33 32 32 31 30 30 32 34 35 35 34 35 35 33 32 31 30 30 30 30 31 32 32 33 34 35 34 34 34 34 34 35 33 33 33 35 36 36 35 35 35 36 37 38 38 37 36 36 36 36 34 31 30 30 32 33 34 35 35 36 36 35 33 32 33 34 34 35 36 36 37 37 37 37 35 36 37 38 37 37 37 37 37 37 37 37 37 38 39 39 39 38 38 39 39 38 37 38 38 38 38 39 39 39 40 39 39 40 39 40 40 39 38 38 38 39 38 38 37 37 37 35 35 36 37 37 37 38 37 37 36 35 36 37 37 35 35 36 37 37 38 38 38 38 38 37 37 37 38 38 38 38 37 37 37 37 37 37 38 38 38 37 37 37 36 35 35 37 36 35 35 33 32 67 67 67 67 67 67 67 67 67 66 66 66 66 66 66 65 65 65 65 65 65 65 64 64 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 48 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 44 43 43 43 44 44 45 45 45 46 46 46 45 45 44 43 43 43 43 43 43 42 41 40 39 38 38 39 39 40 40 40 40 40 39 39 38 36 35 35 36 36 36 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 38 39 39 38 38 38 38 38 37 37 37 36 37 37 38 39 40 41 40 40 39 38 38 39 39 38 38 38 38 38 37 37 38 38 38 38 38 37 38 37 37 37 36 36 37 37 36 35 34 34 33 33 33 33 33 33 32 32 33 33 33 33 32 32 31 32 35 36 37 36 34 34 34 33 32 33 34 33 32 32 32 31 29 28 28 28 28 28 28 29 28 28 28 31 33 33 35 35 34 33 32 34 33 33 33 34 35 35 34 33 32 32 31 29 29 29 29 29 31 32 32 33 34 33 32 32 33 34 33 33 33 32 32 32 32 30 30 31 33 34 35 35 34 34 34 32 30 30 30 30 30 31 32 33 34 34 34 34 34 34 34 33 35 35 33 33 34 35 36 36 35 34 35 37 38 38 38 37 36 36 36 36 33 31 30 30 32 33 34 35 35 36 36 34 33 32 32 34 35 35 35 36 37 37 37 36 35 37 38 37 36 36 37 37 36 36 37 37 38 38 38 38 37 37 38 39 38 37 37 37 38 39 40 40 40 40 40 39 39 39 39 39 40 39 38 38 38 38 37 37 37 37 37 36 35 35 36 37 37 37 38 37 35 35 35 35 35 35 36 37 38 38 39 38 38 37 37 37 38 38 39 39 39 39 39 39 38 38 37 38 39 39 38 38 37 37 36 35 36 37 36 36 37 35 33 67 67 67 67 67 67 66 66 66 66 66 66 66 66 66 66 65 65 65 64 64 64 64 64 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 50 51 51 50 50 50 50 50 50 49 49 49 50 50 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 46 45 45 45 45 45 45 44 44 43 43 43 44 45 45 45 45 45 46 46 45 44 44 43 42 42 42 43 42 41 41 40 40 39 38 38 38 39 39 39 40 40 39 38 37 36 35 35 35 35 36 37 37 37 36 36 36 35 35 35 35 35 35 36 36 36 36 36 36 35 36 36 37 38 38 39 40 40 39 39 39 39 39 37 37 38 38 38 38 38 39 40 41 40 39 39 39 39 39 38 38 39 39 38 37 37 38 39 39 39 39 38 38 38 38 38 37 37 37 38 37 37 36 35 35 34 34 35 35 35 35 33 32 32 31 31 32 32 32 31 33 36 37 36 35 34 34 34 32 32 32 33 32 31 31 32 30 29 28 28 28 28 28 28 28 28 28 28 32 34 33 34 34 33 32 32 33 33 34 35 36 35 34 34 34 33 31 30 29 29 29 29 29 30 31 33 34 34 33 32 33 34 34 33 32 31 31 32 32 31 30 30 32 33 34 35 34 33 34 34 31 30 30 30 30 31 32 33 34 34 34 34 34 34 34 34 35 35 34 33 34 36 36 36 35 34 35 36 37 38 38 38 37 36 36 37 35 33 30 30 30 31 32 33 36 36 36 36 34 32 32 33 34 35 35 35 36 37 36 36 36 37 38 38 36 35 36 36 36 36 37 37 37 37 37 36 37 36 36 37 37 38 38 38 38 39 40 40 40 40 39 39 38 39 39 38 39 39 39 38 38 38 38 37 37 37 36 36 36 35 35 35 36 37 37 38 37 35 35 35 34 34 35 36 37 38 38 38 36 36 37 38 38 38 39 40 40 40 40 39 39 39 38 37 37 38 39 38 38 37 37 37 37 37 36 35 35 35 36 35 67 67 67 67 67 67 66 66 66 66 66 65 65 66 66 66 65 65 65 64 64 64 64 64 64 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 57 57 57 57 57 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 55 55 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 50 50 51 51 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 48 48 48 48 48 48 48 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 43 43 43 43 44 44 44 44 44 45 45 46 45 44 43 42 42 41 41 42 41 41 41 40 40 40 39 38 37 38 38 38 39 39 39 39 38 38 36 35 35 35 35 36 36 36 35 35 35 35 35 35 35 36 36 37 37 37 37 37 36 36 35 36 37 38 38 39 40 40 40 40 40 40 39 37 38 39 39 39 38 38 39 39 40 40 39 40 40 40 39 38 39 40 40 39 38 38 39 40 39 39 39 39 38 39 38 38 37 37 37 38 37 37 37 37 37 35 35 36 36 36 35 34 32 31 31 31 31 31 31 31 32 34 35 35 34 33 33 33 32 31 31 32 31 31 30 29 28 28 28 28 28 28 28 28 28 28 28 28 30 32 32 33 32 31 31 32 33 34 34 36 36 35 34 33 33 33 31 30 29 29 29 29 29 30 31 33 34 34 33 32 33 33 33 33 31 31 32 32 30 29 30 31 32 33 33 34 33 33 34 32 30 30 30 30 30 31 33 33 33 33 34 34 35 35 34 34 36 35 33 33 35 36 37 35 34 35 36 36 37 38 38 37 37 35 36 36 36 33 31 30 30 31 32 33 35 36 36 36 35 33 32 33 34 34 35 36 36 37 36 35 36 37 38 38 36 35 35 35 36 37 37 37 36 36 36 36 37 37 37 38 38 39 39 39 40 39 39 39 40 39 38 37 38 39 39 38 38 38 38 38 38 38 38 37 37 37 36 36 35 35 35 36 36 37 37 37 36 35 35 34 34 35 35 35 36 36 36 36 36 37 38 38 38 39 39 40 40 40 39 39 38 38 37 36 37 38 39 39 38 38 38 38 37 37 35 35 35 35 35 35 67 67 67 67 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 57 57 57 57 57 57 57 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 48 48 47 46 47 48 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 46 46 47 47 47 47 47 46 46 46 46 46 46 45 45 46 45 44 45 44 44 44 43 43 43 43 43 44 44 44 44 45 46 46 44 43 42 42 41 41 42 42 41 40 40 40 39 38 38 37 37 37 37 38 38 38 38 39 38 37 36 35 35 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 38 37 37 37 37 36 36 37 37 38 39 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 39 39 39 40 39 38 38 38 39 40 40 39 39 39 38 39 39 38 38 38 38 38 38 37 38 37 37 36 36 36 36 36 36 35 33 33 34 33 31 30 30 30 30 32 33 33 32 31 32 32 31 31 31 31 32 32 31 29 30 29 28 28 28 28 28 28 28 28 28 28 29 30 30 30 30 30 32 34 35 35 35 36 36 34 34 33 31 31 31 29 29 29 29 29 30 31 32 33 33 32 31 31 32 32 32 32 30 31 30 30 30 30 31 32 33 33 33 33 32 32 32 31 30 30 30 30 31 32 32 32 32 32 33 35 36 35 33 34 36 35 33 33 34 36 36 34 34 35 36 36 36 38 38 37 36 35 35 36 35 34 31 30 30 31 32 34 35 36 37 36 34 33 32 33 33 34 35 36 36 36 35 34 36 37 37 36 35 35 36 37 37 37 36 36 36 36 37 37 37 38 38 39 39 39 39 39 40 40 39 39 39 38 37 37 38 39 39 37 37 37 38 38 38 38 37 37 37 37 37 37 35 35 35 35 35 36 37 37 36 35 35 34 34 34 35 35 35 35 35 37 38 38 37 37 38 40 40 40 39 39 39 39 39 37 37 37 37 38 38 38 38 38 38 38 36 36 36 36 36 35 34 35 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 48 47 47 46 46 47 47 47 47 46 46 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 45 45 44 44 43 43 43 43 44 44 44 44 45 46 46 45 44 43 42 40 40 41 41 41 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 35 35 35 35 36 37 37 37 37 37 37 37 38 38 38 37 36 36 36 37 38 38 38 39 39 40 41 40 40 40 39 39 40 40 40 40 39 39 40 40 40 40 40 40 40 40 40 40 39 38 38 39 40 40 40 39 39 38 38 38 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 35 35 34 32 31 31 31 31 31 32 32 31 31 31 30 30 30 30 30 30 32 32 31 32 31 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 31 35 36 36 37 37 36 34 33 33 32 32 31 30 29 29 29 29 29 30 31 31 32 31 31 31 31 31 31 32 31 30 30 29 30 31 32 32 33 33 33 33 32 31 30 30 29 30 30 30 30 30 31 31 32 32 32 33 35 37 35 33 34 36 35 33 33 35 36 35 33 34 35 35 35 36 37 38 37 36 35 35 36 35 33 31 30 30 30 32 34 35 36 35 34 33 32 32 33 34 34 35 36 36 36 35 34 36 37 36 35 36 36 36 36 36 36 35 36 37 37 37 36 36 37 37 38 38 38 39 39 39 40 39 38 38 37 37 38 38 38 38 37 37 38 38 39 38 37 37 37 37 37 37 37 36 35 35 35 35 36 37 37 37 36 35 34 33 34 34 35 36 37 37 37 38 38 37 37 39 40 39 39 39 39 39 39 39 38 37 37 37 38 39 38 38 38 38 37 37 36 36 36 36 34 34 35 67 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 55 54 54 54 53 53 53 53 53 54 53 53 53 53 53 52 52 52 52 53 52 52 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 47 47 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 46 45 44 44 43 43 43 43 43 44 44 44 45 46 46 45 44 43 42 41 40 40 40 40 40 39 39 39 38 37 38 38 38 38 37 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 35 36 37 37 37 38 37 37 37 37 37 38 38 37 37 36 36 37 37 37 38 38 39 40 41 40 40 40 40 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 39 38 38 39 40 40 40 40 39 39 38 37 39 39 38 38 38 37 37 37 38 37 37 37 37 37 36 36 37 37 36 35 35 35 34 33 33 33 33 32 32 32 32 31 30 30 29 29 29 29 29 30 31 31 31 30 29 28 28 28 28 28 28 28 28 28 28 28 29 30 31 33 34 34 36 37 37 36 35 34 34 33 33 32 30 29 29 29 29 29 29 29 30 30 30 31 32 31 30 31 31 30 29 29 30 32 32 32 32 32 31 32 32 31 30 29 29 29 30 30 30 30 31 31 32 32 32 33 34 36 36 35 33 34 36 35 33 33 35 35 33 33 35 35 34 35 37 38 37 36 36 36 34 35 35 33 31 30 30 30 32 34 36 36 34 33 32 32 33 34 35 35 34 35 35 35 34 35 37 36 35 35 37 36 35 35 35 35 35 36 36 37 37 37 37 37 37 38 38 38 39 39 40 39 38 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 37 37 38 38 37 35 35 35 35 35 35 36 36 36 35 34 34 33 34 35 36 37 37 37 37 37 37 37 38 39 40 39 38 38 38 39 38 38 38 37 36 36 37 38 39 38 38 37 37 38 38 37 36 35 35 34 33 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 58 58 57 57 57 58 57 57 57 57 57 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 55 55 54 54 54 54 53 53 53 53 54 54 53 53 53 53 53 52 52 52 52 52 53 52 52 52 52 52 52 52 52 51 51 51 51 51 50 50 50 50 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 46 46 46 46 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 45 45 45 44 44 43 43 43 43 43 43 44 44 44 46 45 44 43 43 42 42 41 40 40 40 40 39 38 38 38 38 39 40 39 39 38 37 37 37 36 36 35 35 35 35 35 35 35 35 35 35 35 36 37 37 38 38 38 38 38 37 38 39 38 38 37 37 36 36 37 37 38 39 39 40 40 40 40 39 39 39 39 39 39 38 38 38 38 39 39 39 39 40 40 40 40 40 39 39 39 39 40 40 40 39 39 39 38 37 38 39 39 38 38 37 37 37 37 37 37 36 36 37 36 35 35 36 35 35 35 35 34 34 34 35 34 32 32 32 31 31 31 31 29 29 29 29 29 29 29 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 29 31 33 34 33 33 35 37 37 37 37 36 35 34 33 32 30 29 29 29 29 29 29 29 29 29 30 30 30 30 29 30 30 30 29 29 31 33 33 33 32 31 30 30 30 30 29 29 29 29 30 30 31 31 32 32 32 33 34 34 35 36 35 34 34 35 35 34 32 33 35 35 33 34 35 34 35 36 37 37 37 35 35 35 34 34 35 33 31 30 30 30 33 35 36 36 34 32 32 32 34 35 36 35 35 36 35 34 35 37 37 35 34 34 35 35 35 35 36 36 36 36 36 36 37 38 37 37 37 38 38 38 38 39 40 39 38 37 36 37 37 38 38 39 39 38 37 37 38 38 38 38 38 37 37 37 37 37 36 35 35 35 35 35 35 36 36 34 34 33 34 35 36 37 37 37 36 37 37 37 37 38 38 39 39 38 37 37 38 37 37 38 37 36 37 37 38 39 38 37 37 37 38 37 37 36 35 35 34 33 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 58 57 57 57 57 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 48 48 48 47 47 47 47 47 47 46 45 45 45 45 45 45 45 46 46 46 47 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 44 44 44 45 45 44 42 42 42 42 41 40 40 40 40 39 39 39 39 39 40 40 40 40 40 39 38 38 37 37 37 36 36 36 36 36 35 35 35 35 36 37 37 37 37 37 38 38 38 38 39 39 39 38 38 37 37 36 37 38 39 40 39 39 40 41 40 39 38 38 38 39 39 38 37 37 37 38 39 39 38 39 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 37 38 38 38 38 38 38 38 37 36 36 36 35 35 35 35 35 34 34 34 34 33 33 34 34 34 35 34 32 33 33 31 31 32 31 30 29 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 31 33 34 33 34 36 37 37 37 36 35 34 33 32 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 32 33 33 32 31 30 29 29 29 29 29 29 30 30 31 32 32 32 32 32 33 34 35 35 35 34 33 35 36 35 33 32 34 35 35 33 33 34 34 35 37 36 36 36 35 34 34 33 33 34 32 30 30 30 31 33 36 36 35 34 32 32 32 34 35 36 36 36 36 35 34 36 37 36 34 34 35 35 35 36 36 37 37 36 37 37 37 37 37 37 37 37 38 38 38 38 38 39 39 39 37 36 37 37 37 37 38 37 37 37 38 38 38 38 38 38 38 37 37 37 37 37 36 34 34 35 35 35 35 35 34 33 34 35 36 36 37 37 37 36 36 37 36 36 37 38 39 39 37 37 37 38 37 37 37 36 36 37 38 38 38 38 37 37 37 37 37 36 36 36 35 34 34 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 45 45 45 45 45 45 44 44 45 45 46 46 46 46 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 43 43 43 43 44 44 44 44 44 43 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 39 38 38 38 38 37 37 37 36 36 35 35 35 36 37 38 37 37 37 37 37 38 38 39 39 39 39 38 38 38 38 37 37 37 38 39 39 39 40 41 40 40 40 39 38 38 39 38 37 37 36 38 38 38 38 39 40 40 39 39 40 40 40 40 40 39 38 39 38 38 38 37 37 38 38 38 37 37 37 37 36 36 36 35 35 36 36 36 35 34 34 34 33 33 32 32 33 34 32 32 34 33 31 32 33 32 31 30 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 30 32 33 33 34 34 35 37 36 36 35 35 34 32 31 31 30 29 28 28 29 29 29 29 29 30 30 30 30 30 29 29 30 30 31 32 33 33 33 32 31 30 29 29 29 29 29 29 30 31 31 32 32 32 32 33 33 34 34 34 34 33 33 34 36 35 34 33 33 34 35 34 33 33 34 35 36 36 35 36 36 35 35 34 33 33 32 31 30 30 30 31 33 35 35 33 32 32 32 33 33 34 35 36 36 36 34 34 35 36 36 34 34 36 36 36 37 37 37 37 37 37 37 37 37 36 37 38 37 37 38 38 38 37 38 39 39 37 36 37 37 37 38 38 37 38 38 38 38 38 38 38 38 38 37 37 37 37 37 36 34 34 35 36 35 34 34 33 33 34 36 36 36 35 36 37 36 36 36 36 36 37 38 39 39 37 37 38 38 37 37 37 36 36 37 38 38 38 37 37 37 37 37 37 36 34 35 35 34 33 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 58 58 58 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 45 45 45 46 46 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 43 43 43 43 44 44 44 44 43 42 41 41 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 38 38 38 38 37 37 37 37 36 36 36 35 35 37 38 38 38 38 38 38 38 38 38 38 39 40 39 39 39 39 39 38 37 37 38 38 38 39 40 40 40 40 40 40 39 38 38 38 38 37 36 37 37 37 37 38 39 39 38 38 39 39 39 39 39 39 38 38 38 38 37 37 36 37 37 38 37 37 37 37 37 37 36 36 36 37 37 37 36 35 35 35 35 34 33 32 32 32 32 32 33 33 31 32 33 33 31 30 30 30 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 31 31 31 33 34 34 36 36 35 34 35 35 33 32 31 30 28 28 28 29 29 29 30 31 31 32 31 31 30 30 31 31 31 31 32 32 33 33 31 29 29 29 29 29 29 29 30 31 32 32 33 33 32 33 34 34 34 34 34 33 33 34 36 36 35 33 33 34 34 33 33 33 34 35 35 35 35 35 36 36 36 36 35 35 33 32 31 30 30 30 31 33 35 34 32 32 32 33 34 35 35 36 36 36 35 34 35 36 36 35 34 33 34 35 36 37 37 38 37 37 36 36 36 36 36 37 37 37 38 37 37 38 38 37 38 38 36 36 37 37 37 38 39 39 38 38 38 38 38 38 39 38 38 37 37 37 37 37 36 34 34 35 36 35 34 34 33 33 35 35 36 36 35 36 37 36 35 36 36 37 38 38 38 38 37 37 38 37 37 37 37 36 36 37 38 38 38 37 36 36 37 37 37 36 35 34 34 34 33 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 49 49 49 48 48 48 48 48 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 45 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 43 43 44 44 44 44 43 42 42 42 42 42 42 41 41 41 40 39 40 39 39 39 39 38 38 37 37 37 37 37 37 36 36 36 36 36 37 36 35 36 37 37 37 37 38 39 39 38 38 38 39 40 40 40 40 40 39 39 38 38 38 39 39 40 40 40 40 40 40 39 39 38 37 37 37 36 36 36 36 36 37 38 38 38 37 37 38 38 37 37 38 38 38 38 38 38 37 37 37 36 36 37 37 37 37 37 37 37 36 36 37 37 37 37 36 35 34 34 35 34 34 33 32 32 32 33 34 33 32 32 33 33 31 30 30 31 31 30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 30 31 32 34 35 35 35 34 34 35 35 33 33 32 30 28 28 28 28 29 29 30 31 32 33 32 32 31 32 33 32 32 32 32 31 31 31 30 29 29 29 29 29 29 30 30 31 32 32 33 33 33 33 34 34 33 33 33 32 33 36 36 35 35 33 33 34 33 32 33 34 35 36 35 34 34 34 35 36 36 35 35 35 34 33 31 30 30 30 31 34 35 34 32 31 32 34 35 36 37 37 36 35 34 34 35 36 36 34 34 34 34 35 36 37 37 38 37 36 35 35 35 36 37 37 37 37 38 37 37 37 38 37 37 37 36 36 37 38 38 39 39 38 38 38 38 38 38 38 38 38 38 37 37 36 36 36 35 34 34 35 36 35 34 33 33 33 35 35 36 35 36 37 37 36 35 36 37 37 38 37 38 38 38 37 37 38 36 37 37 36 36 38 37 37 37 37 36 36 37 37 37 36 35 34 33 33 34 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 45 46 46 45 45 45 44 44 44 44 45 44 44 44 44 45 45 46 46 47 46 46 46 46 46 45 45 45 45 45 44 44 44 43 43 43 42 43 43 44 44 44 44 43 43 43 43 43 43 42 41 40 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 35 35 37 37 37 37 37 37 38 39 39 39 39 40 40 40 40 40 40 40 40 39 38 39 40 40 41 41 40 40 40 39 39 38 37 37 37 37 37 37 36 36 36 36 37 37 37 37 37 38 38 37 37 37 37 38 38 38 38 38 38 38 37 37 36 36 37 37 37 37 37 36 37 37 37 37 37 36 36 35 34 35 34 34 34 33 32 32 33 34 34 32 32 33 33 31 31 31 31 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 33 32 31 33 34 34 34 33 33 35 34 33 33 32 30 28 28 28 28 29 29 29 30 31 32 32 32 32 32 32 31 31 31 31 30 29 29 29 29 29 29 29 29 30 30 31 31 31 32 33 32 33 34 34 33 33 32 32 33 34 36 35 34 33 33 34 34 33 33 34 35 35 35 34 33 34 35 36 36 35 34 34 33 33 33 31 30 30 30 32 34 34 33 32 31 33 35 35 36 37 38 37 35 33 34 35 36 36 34 33 34 35 35 37 36 36 37 36 35 35 35 35 36 37 37 38 37 37 37 36 37 37 37 36 36 37 37 37 38 39 39 39 38 38 38 38 38 38 39 38 38 38 37 37 36 36 36 35 34 34 35 35 34 34 33 33 33 34 35 35 35 36 36 36 35 35 36 36 37 37 37 37 37 37 37 37 37 36 36 37 35 36 37 37 37 36 36 36 37 37 37 36 35 34 34 33 33 33 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 54 55 55 55 55 54 53 53 53 53 53 53 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 47 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 47 46 46 45 45 46 46 46 46 45 45 44 44 44 43 43 43 43 43 44 44 45 45 46 46 46 46 46 46 46 45 45 45 44 44 44 44 44 43 42 42 42 43 44 45 45 44 44 44 44 43 42 42 42 41 41 41 41 41 40 40 40 39 38 38 39 39 39 39 38 38 39 38 38 38 37 36 35 36 37 38 38 38 38 38 38 38 39 40 40 40 40 41 41 40 40 40 40 39 39 40 40 41 41 41 40 40 40 40 39 38 38 38 38 39 39 38 37 37 36 35 36 37 37 37 38 38 38 38 37 36 36 37 37 38 38 38 38 38 38 37 37 36 36 36 36 36 36 36 36 37 37 37 37 37 37 36 35 35 35 35 34 33 34 33 33 34 34 33 32 33 33 32 32 32 30 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 32 33 32 32 33 33 33 33 34 35 34 32 32 32 30 28 28 28 28 29 29 29 30 30 30 31 32 32 30 29 29 30 30 29 29 29 29 29 29 29 29 29 30 31 31 32 33 33 32 32 32 34 34 33 32 32 33 34 34 36 36 35 35 33 33 34 33 33 34 35 35 34 33 33 33 34 36 37 36 35 34 34 33 33 32 30 30 30 31 33 33 32 31 31 33 35 35 36 37 37 37 36 34 34 34 35 35 35 34 33 34 35 36 37 36 35 35 35 34 35 36 37 37 37 37 37 37 37 36 36 37 37 36 36 37 38 38 39 39 39 39 38 37 38 38 38 38 39 39 38 37 37 37 37 36 36 36 34 34 35 36 36 35 35 33 32 33 34 34 34 34 34 34 35 35 36 37 37 37 37 37 37 37 37 37 38 37 36 36 36 35 36 37 37 37 36 36 37 37 38 37 36 35 34 34 33 32 32 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 53 53 53 53 54 54 55 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 49 49 49 49 50 50 49 49 48 48 48 48 47 47 47 47 47 48 48 47 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 47 47 46 46 46 46 45 44 44 44 43 43 43 43 43 43 44 44 45 45 46 46 46 46 46 46 45 45 44 44 44 44 44 44 42 42 42 43 43 44 44 45 45 45 44 43 42 42 41 41 42 41 41 41 40 40 40 39 38 39 40 40 40 40 39 39 39 38 38 38 37 37 36 36 37 38 38 38 38 39 39 39 39 40 40 41 41 42 42 41 41 41 40 39 39 40 40 41 41 40 40 39 39 39 38 38 39 39 39 39 39 38 37 37 36 35 35 36 36 37 38 38 38 38 37 36 36 36 37 37 37 38 37 37 38 38 37 37 36 36 35 35 35 35 35 36 36 36 37 37 37 36 36 35 35 35 34 34 34 34 34 34 34 33 32 33 33 33 33 31 30 30 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 30 31 31 32 32 32 32 34 35 35 34 32 31 31 30 28 28 28 28 29 29 29 30 30 31 30 30 30 29 28 28 29 29 29 29 29 29 29 29 29 30 30 31 32 32 33 34 34 33 33 33 34 34 33 32 33 34 35 36 37 36 35 35 33 33 33 32 33 35 35 34 34 33 33 34 35 36 37 36 35 35 35 34 33 31 30 30 31 33 33 32 31 31 32 34 35 35 36 37 37 37 36 35 33 34 34 34 33 33 34 34 35 36 37 36 35 34 34 35 36 37 37 37 37 37 37 37 37 36 35 36 36 35 36 37 38 38 39 39 38 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 37 36 34 34 35 36 36 35 35 34 33 33 34 34 34 34 34 35 35 36 36 37 36 36 36 36 36 37 38 38 38 37 36 36 35 35 36 36 35 36 36 37 38 38 37 37 37 36 34 34 33 32 32 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 53 53 53 54 54 55 55 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 52 51 51 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 46 46 46 47 47 47 47 47 47 47 46 45 45 45 45 44 44 44 44 44 43 43 43 43 44 45 45 45 45 46 45 45 45 45 44 44 45 44 44 43 42 42 42 42 43 44 45 45 46 45 44 43 43 42 42 41 41 40 40 39 39 38 38 38 40 41 41 40 40 39 38 38 38 38 38 37 37 36 36 37 37 37 38 39 39 40 40 40 39 40 41 42 43 42 41 41 41 40 40 40 40 41 41 41 40 40 40 40 39 39 39 39 40 39 39 39 38 37 37 37 35 34 34 35 36 37 38 38 37 37 37 35 35 35 36 37 37 37 37 37 37 37 37 37 37 36 36 35 34 35 35 35 36 36 36 37 37 36 36 36 36 35 34 35 34 34 34 34 34 33 34 34 34 33 32 31 30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 31 30 31 33 34 35 34 34 33 31 30 30 28 28 28 28 29 29 30 31 31 31 30 28 28 28 28 28 29 29 29 29 29 29 29 30 30 31 31 32 33 33 33 34 34 34 34 35 35 34 33 32 33 35 35 35 36 36 35 34 34 34 33 32 33 34 33 33 33 33 34 35 36 36 36 35 34 34 35 34 32 30 30 30 32 34 33 31 30 31 32 33 34 34 35 37 37 37 36 35 34 33 34 33 32 33 35 35 36 36 37 36 35 34 35 36 37 37 37 37 37 37 36 36 36 36 35 35 36 36 36 37 38 38 38 38 37 37 37 38 38 38 37 37 38 37 37 37 37 37 37 37 37 36 34 34 35 36 35 34 34 34 34 33 33 33 33 34 36 36 36 36 35 35 35 35 36 35 36 37 38 37 37 37 35 35 35 36 36 35 34 36 37 37 37 37 37 37 37 35 34 34 34 34 33 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 56 56 56 56 56 55 55 55 55 55 55 54 53 53 53 53 53 53 53 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 44 43 43 43 43 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 42 43 44 45 45 46 45 45 44 44 43 42 41 40 40 39 39 39 39 39 39 40 41 40 40 39 38 38 38 38 38 38 38 37 37 36 36 36 37 38 39 39 40 40 40 40 40 42 43 43 42 42 42 41 40 40 40 41 41 41 41 40 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 36 34 34 35 35 36 36 36 37 36 36 35 34 34 35 36 36 37 37 37 37 37 38 37 36 36 36 35 34 34 34 35 35 35 36 36 36 36 37 37 37 36 35 35 35 35 35 35 34 34 34 35 34 34 33 32 30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 31 33 34 34 33 33 33 31 30 29 28 28 28 28 28 29 31 31 31 30 29 28 28 28 29 29 29 29 29 29 29 30 31 30 30 30 31 32 33 33 33 33 33 34 35 36 35 34 33 33 34 34 35 35 36 35 34 33 33 34 33 32 32 32 33 33 33 33 34 35 36 36 36 35 34 34 33 32 31 30 29 29 31 33 32 30 30 32 33 33 34 34 35 36 37 37 35 35 34 33 33 32 33 35 35 36 37 37 37 36 35 34 34 36 37 37 37 37 37 36 35 35 36 35 35 35 36 37 37 37 38 37 37 37 37 37 37 38 38 38 37 37 37 37 37 38 38 38 37 37 37 36 35 34 34 35 35 34 34 34 34 33 32 32 33 34 36 36 36 35 34 35 35 35 35 35 36 37 37 37 36 36 35 34 35 36 36 34 35 36 36 35 36 36 36 37 37 36 35 35 34 34 33 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 60 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 54 53 53 53 53 52 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 51 51 51 51 51 51 50 50 50 50 50 49 49 48 48 48 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 46 47 47 48 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 43 43 43 43 44 44 44 44 44 44 45 45 45 45 44 44 43 43 42 42 43 44 44 45 45 45 45 44 44 43 42 41 40 40 40 40 40 40 39 39 40 41 40 40 40 39 39 39 39 39 38 38 38 37 36 36 36 37 38 39 39 39 40 41 41 41 41 43 43 43 43 42 41 41 40 41 41 41 41 41 40 40 39 39 40 40 39 39 38 38 38 37 37 37 37 37 36 35 34 34 34 35 35 35 35 36 35 35 35 34 35 35 36 37 37 38 38 38 38 37 37 36 36 36 36 35 34 34 34 34 35 36 36 36 37 37 37 36 35 35 36 36 36 35 34 34 34 34 34 34 33 33 31 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 31 34 35 34 32 32 32 32 32 31 30 28 28 28 29 30 30 29 29 29 28 28 29 29 29 29 29 29 29 29 31 32 32 31 31 31 31 32 32 32 33 33 34 34 35 35 35 34 32 33 34 34 34 35 35 35 34 33 32 32 32 32 32 32 34 34 34 34 34 35 36 36 37 36 34 34 33 32 31 30 29 30 31 32 31 30 31 33 34 34 34 34 35 35 36 36 35 35 34 33 32 33 35 36 36 37 36 36 37 36 35 34 35 36 36 37 37 37 36 35 35 36 35 35 35 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 37 37 37 37 38 38 38 37 37 36 35 34 34 35 35 34 34 34 34 33 32 33 34 34 35 35 34 34 35 36 35 36 37 36 36 36 36 36 35 35 34 33 35 36 35 34 35 36 35 35 36 36 36 36 37 36 36 35 34 34 33 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 52 51 50 50 50 49 49 49 50 50 50 50 50 51 51 50 50 49 49 50 49 49 49 48 48 48 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 48 47 47 47 47 47 46 47 47 46 46 46 46 46 45 45 45 45 45 45 45 45 44 44 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 43 43 42 42 42 43 44 45 45 45 44 43 43 42 41 41 42 42 41 40 40 41 40 39 40 41 41 41 40 39 39 40 40 39 38 38 38 37 37 36 36 37 37 38 39 39 40 40 40 41 41 42 43 44 44 43 42 42 41 41 41 41 41 41 40 40 39 38 39 39 38 38 38 38 37 37 36 36 36 36 36 35 35 34 34 33 34 34 34 35 36 36 35 34 34 34 35 36 37 37 37 37 37 37 37 37 36 37 36 35 34 34 34 33 34 35 35 35 36 36 36 36 35 35 35 36 36 35 34 35 35 34 33 33 32 31 31 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 32 33 34 33 31 31 31 31 32 31 29 28 28 29 31 30 28 28 28 29 29 29 29 29 29 30 30 31 31 31 32 32 33 32 32 33 33 32 32 33 34 35 35 34 34 35 33 32 32 33 34 34 35 35 34 33 32 32 33 33 33 33 34 34 35 35 35 35 35 35 36 37 36 35 35 34 32 30 30 30 31 32 32 30 30 31 32 33 34 34 34 35 35 35 35 36 35 34 33 32 33 35 36 37 36 36 36 37 36 35 34 35 36 36 37 38 37 36 35 35 35 35 34 36 37 37 38 37 37 37 36 37 38 38 38 37 37 37 36 36 36 36 37 37 37 38 37 37 37 36 36 36 34 34 34 34 34 33 33 33 32 32 33 34 34 34 34 33 34 35 35 35 36 37 37 37 36 36 35 34 34 33 34 35 35 34 34 35 35 34 34 36 35 35 36 37 36 35 35 34 34 33 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 54 54 53 53 53 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 52 52 51 51 52 52 52 52 52 52 52 52 51 51 51 51 50 49 49 49 49 49 50 50 50 51 50 50 49 49 49 49 48 48 48 48 48 49 49 50 50 50 49 49 49 49 49 49 49 48 48 48 48 49 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 44 44 44 44 44 45 44 44 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 41 41 42 43 44 45 45 44 44 43 42 42 42 43 43 42 40 41 41 41 41 41 42 41 40 40 40 40 40 40 40 39 39 38 38 37 37 36 36 37 38 39 39 40 41 41 41 42 42 43 43 44 43 43 43 42 40 40 40 41 40 40 40 40 38 38 39 38 38 38 37 37 36 35 35 35 35 35 34 34 34 34 33 33 33 34 34 35 36 36 34 33 34 35 35 36 36 37 36 37 37 36 35 35 36 36 36 35 35 35 34 33 33 34 34 35 35 35 35 35 34 34 35 35 35 35 36 36 34 34 33 32 32 31 30 30 29 28 28 28 28 28 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 29 30 32 34 34 33 32 31 30 30 29 28 28 28 28 30 29 28 29 29 29 29 29 30 30 30 31 31 33 32 32 32 32 33 32 33 34 34 33 33 34 34 35 34 34 34 34 32 32 33 34 34 35 35 35 33 31 31 33 34 34 33 34 34 35 35 35 35 34 35 36 37 37 37 36 35 34 32 30 30 30 31 33 32 30 30 30 32 32 33 35 35 34 34 35 35 36 35 34 33 33 33 35 36 37 36 35 36 36 35 34 34 35 36 37 37 37 37 36 35 35 34 34 35 37 38 37 37 37 37 37 37 38 38 38 37 37 36 36 35 35 36 37 36 36 37 37 37 37 37 36 36 36 34 34 34 34 34 33 32 32 32 33 33 33 33 34 34 34 35 35 35 35 35 36 37 38 37 37 36 35 34 33 34 35 35 33 34 34 34 34 34 35 35 35 36 36 36 35 34 34 34 34 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 61 61 61 61 61 61 61 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 60 59 59 59 59 59 58 58 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 53 53 53 53 52 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 49 49 49 49 49 49 50 50 50 49 49 48 48 48 48 48 48 48 49 50 50 50 50 50 49 49 48 48 49 49 49 48 48 48 48 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 43 43 43 42 42 42 42 41 41 41 42 43 45 45 45 45 44 43 43 43 42 42 41 40 41 41 41 42 41 42 42 40 40 40 40 40 41 40 40 39 39 38 38 37 37 36 36 37 39 40 40 41 42 42 41 41 42 43 43 43 43 43 42 41 40 40 40 40 40 40 39 38 37 38 38 37 37 36 36 35 35 36 35 35 34 34 34 34 33 33 33 33 33 33 34 36 36 35 33 33 34 34 35 36 36 36 36 36 36 35 35 35 36 36 36 36 36 35 34 33 33 34 34 34 34 34 34 34 35 35 36 36 36 36 36 34 34 34 33 33 32 31 30 30 30 29 28 28 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 29 30 33 35 34 33 32 32 31 29 28 27 27 27 28 28 29 29 29 29 29 30 31 32 31 32 32 32 33 32 32 32 33 33 33 33 34 34 33 33 33 34 35 34 34 33 32 32 33 34 35 35 35 34 34 33 31 32 33 33 33 33 33 33 34 35 35 35 34 34 35 37 38 37 36 34 34 33 31 30 29 30 33 32 30 30 30 32 32 33 35 35 34 34 35 35 35 35 34 33 33 33 34 35 36 35 35 35 35 34 34 34 35 36 37 37 37 36 35 34 34 34 35 36 37 37 37 36 36 37 37 37 38 38 37 37 36 35 35 36 36 36 36 36 36 37 37 37 36 36 35 35 35 34 34 35 35 34 33 32 32 32 33 33 33 33 34 34 35 36 36 35 35 35 35 37 37 37 37 36 34 34 34 34 35 35 34 33 33 34 34 35 35 35 35 36 36 35 34 34 34 35 35 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 54 54 54 54 53 53 53 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 50 50 50 50 50 50 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 43 43 44 44 43 43 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 42 44 45 45 45 44 43 43 43 42 41 40 41 42 42 42 42 42 41 42 41 41 41 41 41 41 40 40 40 39 39 39 38 38 37 36 37 38 39 39 40 41 41 41 41 41 42 43 43 43 43 42 41 40 40 40 40 39 39 38 37 37 37 37 36 36 36 37 36 37 36 35 35 36 35 35 35 35 34 34 34 34 33 33 34 35 34 34 33 33 34 34 35 36 36 35 35 36 35 35 35 36 37 37 37 36 36 35 35 34 33 33 34 34 34 34 33 35 36 36 35 35 36 36 36 35 34 33 33 32 31 31 30 30 29 28 28 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 29 31 33 34 34 34 33 32 31 30 29 28 27 27 28 29 30 29 29 29 30 30 31 32 33 32 32 33 32 33 33 33 33 34 34 34 34 34 34 34 34 33 34 35 34 33 32 32 33 33 34 35 35 35 34 34 33 31 32 32 32 33 34 34 34 34 34 35 35 34 34 35 37 37 37 35 35 34 32 30 29 29 30 32 32 30 30 31 32 33 34 35 35 34 34 34 34 34 34 34 33 32 33 34 35 35 35 35 35 34 34 34 35 36 36 36 37 36 35 34 34 34 35 36 37 37 36 36 37 37 37 37 37 38 38 37 36 35 35 36 36 36 37 37 37 37 36 36 37 37 36 36 35 34 34 34 34 35 34 33 32 32 32 32 33 34 34 35 35 35 36 36 35 34 35 35 37 37 36 36 36 34 33 33 34 35 35 34 33 34 34 35 35 35 35 35 35 35 34 34 34 34 34 34 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 50 50 49 50 51 51 51 50 49 49 49 49 49 48 48 49 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 48 48 47 47 47 47 47 47 47 47 47 46 46 47 47 46 46 46 46 46 46 45 45 45 45 45 45 44 45 44 44 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 41 41 43 44 45 45 45 44 44 43 42 42 42 42 43 43 43 43 42 42 42 42 42 42 42 41 41 40 40 40 40 40 39 39 39 37 37 37 38 38 39 39 40 41 41 40 40 41 42 43 42 41 41 40 40 40 39 38 38 38 38 37 37 37 37 37 37 38 38 38 37 36 35 36 37 37 37 37 36 35 35 35 35 34 33 32 33 33 33 33 33 33 34 34 35 35 35 34 35 35 34 34 35 36 37 37 37 36 36 36 36 34 33 33 33 33 33 34 35 35 35 35 35 36 36 36 35 34 34 33 33 32 31 30 30 30 29 28 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 29 31 33 34 34 34 33 33 33 32 30 28 27 27 27 28 29 31 31 30 30 31 32 32 32 33 33 33 33 33 34 34 34 34 34 33 34 35 35 35 35 34 34 34 34 34 33 31 32 34 34 35 35 35 34 34 33 32 31 32 33 33 34 34 34 34 34 34 35 35 34 34 35 37 37 36 35 34 33 31 30 29 29 30 32 32 30 30 30 32 34 34 34 35 34 33 33 34 34 34 34 33 32 32 34 35 35 35 34 34 34 33 35 36 35 35 36 36 35 34 34 34 35 36 37 37 37 36 36 37 38 38 38 37 37 38 37 36 35 36 37 37 37 38 38 37 36 36 36 36 37 36 36 35 34 34 34 35 34 34 34 32 31 32 33 34 34 34 34 35 35 36 36 34 34 35 36 37 37 35 35 35 35 33 33 34 35 35 34 33 34 34 35 35 35 35 35 35 35 34 33 34 34 34 34 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 50 50 50 51 51 51 51 50 50 49 49 49 48 48 49 50 50 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 43 44 44 44 44 45 44 43 42 42 43 44 44 44 43 43 43 42 42 42 43 43 42 41 41 40 40 40 41 40 40 40 40 39 38 37 37 38 39 40 41 41 41 41 40 41 41 42 42 41 41 40 40 40 39 38 39 40 39 39 39 38 38 38 38 37 37 37 36 35 36 37 38 38 37 37 36 35 35 34 34 34 33 33 33 32 32 32 32 32 33 33 33 34 34 34 34 34 34 34 35 36 37 37 36 35 35 35 35 35 34 33 32 32 33 34 35 35 34 34 36 36 36 36 35 34 34 33 32 32 31 30 30 30 29 29 28 27 27 27 27 27 27 27 27 27 27 28 28 28 28 30 33 33 33 34 33 32 32 32 31 30 28 27 28 28 28 29 30 31 32 32 32 32 33 33 33 34 34 34 34 35 34 34 33 33 33 33 35 35 35 35 34 34 34 34 34 32 32 33 34 34 35 35 35 34 33 32 31 32 33 34 34 34 34 34 34 34 34 35 35 34 34 35 36 37 36 35 34 33 31 29 29 29 30 32 31 29 30 30 32 34 34 34 34 34 33 33 34 35 35 34 33 32 32 34 35 34 34 34 34 34 33 35 35 35 36 36 35 34 34 34 34 36 37 37 36 36 36 37 37 37 38 38 37 37 37 37 35 35 36 37 37 37 38 37 37 36 35 35 36 36 35 34 34 34 34 35 34 34 33 33 32 31 32 34 34 34 34 34 35 36 36 35 34 34 35 36 37 37 36 35 35 34 33 33 34 35 35 33 33 34 34 35 35 35 35 35 35 35 34 34 34 34 34 33 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 59 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 50 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 42 41 41 43 44 43 43 44 44 44 43 43 43 43 44 44 44 44 44 43 43 42 41 42 43 42 41 41 40 40 40 40 40 39 39 40 40 38 37 37 39 40 40 41 41 41 41 40 40 41 42 43 42 41 40 40 40 39 40 40 40 40 40 40 39 38 38 38 37 36 36 36 36 37 38 38 37 37 36 35 35 34 34 34 34 34 35 34 33 33 32 32 32 32 32 32 32 33 34 34 33 33 35 35 36 37 37 36 35 34 34 34 34 34 34 33 32 32 33 34 34 34 34 35 36 36 36 35 34 33 32 32 32 30 30 30 30 31 32 31 29 27 27 27 27 27 27 27 27 27 27 27 28 28 30 32 32 32 33 33 32 31 30 29 28 27 28 29 29 29 29 29 31 32 33 33 33 33 33 33 33 34 34 34 34 33 33 33 34 34 34 35 36 35 35 34 34 33 34 34 32 31 33 33 34 35 35 35 34 33 32 31 32 34 34 35 35 34 33 33 33 34 35 35 34 34 35 36 37 36 35 35 33 31 30 29 29 31 32 30 29 30 31 33 34 34 33 33 33 33 33 34 34 34 34 33 32 32 34 35 34 33 34 35 34 33 35 35 35 36 36 34 33 34 34 35 36 36 36 36 36 37 37 37 37 38 37 37 37 37 36 35 35 36 36 37 37 37 37 36 36 35 35 35 35 34 34 34 34 34 35 34 34 33 31 31 32 33 34 34 33 34 34 35 36 36 34 34 34 35 35 37 38 36 35 35 34 33 33 34 34 34 33 33 34 35 34 34 35 34 34 34 34 35 34 34 34 33 33 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 52 52 52 52 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 45 45 44 44 44 44 44 44 43 43 43 42 41 42 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 43 42 41 41 41 42 42 41 41 40 40 39 39 39 38 38 38 38 38 37 37 39 40 40 41 41 41 41 40 40 41 42 42 42 41 41 41 40 40 40 41 41 41 40 40 40 39 38 38 38 36 36 37 37 38 38 38 37 37 36 35 36 35 35 36 36 36 35 35 35 34 34 34 33 32 32 32 32 32 33 34 33 33 35 35 35 37 37 37 36 36 36 35 35 35 34 33 31 31 32 33 33 33 34 34 35 35 35 34 34 33 33 33 33 31 31 31 31 32 32 32 30 28 27 27 27 27 27 27 27 27 27 27 28 28 28 29 32 33 33 33 31 29 29 28 27 27 28 30 30 30 30 30 31 32 33 34 34 33 33 34 35 35 34 34 33 32 33 33 33 34 34 35 35 35 34 35 34 33 33 33 31 32 33 33 34 34 34 35 35 34 32 31 31 33 34 34 34 33 33 34 34 34 34 34 34 34 35 35 37 36 36 35 34 32 31 29 29 30 30 29 29 30 31 33 34 33 32 32 33 33 34 34 35 35 34 33 32 32 34 35 34 34 35 34 33 33 34 35 35 35 34 33 34 35 36 36 37 36 35 36 37 38 38 37 37 37 37 37 36 36 36 36 36 36 36 37 37 37 37 37 36 34 34 34 34 34 35 35 34 34 34 34 33 32 31 31 33 34 34 33 33 33 35 36 37 36 34 34 34 35 35 36 37 36 36 35 34 33 32 33 34 33 33 34 34 34 34 34 35 34 34 34 34 34 34 33 33 33 33 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 48 48 48 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 43 43 43 42 41 41 42 42 42 43 43 44 44 45 45 45 44 43 42 42 42 42 41 41 40 41 42 42 41 40 40 40 39 38 38 38 38 38 38 38 37 37 38 39 40 40 41 41 41 40 40 41 41 41 42 42 41 41 41 40 40 41 42 41 40 40 40 39 39 39 38 37 37 38 38 39 38 37 37 37 37 37 37 36 36 37 37 37 36 36 36 35 35 35 34 33 32 32 31 31 32 33 33 33 34 34 35 36 37 37 37 37 37 36 34 35 34 33 31 31 32 33 33 33 34 34 34 35 35 35 35 35 35 35 34 33 32 32 31 31 31 30 30 29 28 27 27 27 27 27 27 27 27 27 28 28 28 28 30 31 33 34 32 29 28 28 28 29 30 30 31 31 31 32 31 31 33 35 35 34 34 35 35 34 33 32 32 33 33 34 34 34 34 35 35 34 34 35 34 33 33 32 31 34 34 34 34 34 34 35 34 33 31 30 31 33 33 33 33 32 33 34 34 33 33 34 34 34 35 35 36 37 36 35 34 33 31 29 29 29 29 29 30 31 33 34 33 32 32 34 34 34 34 34 35 35 35 33 32 32 33 34 34 34 35 34 33 33 34 34 34 33 33 34 34 35 36 37 37 36 36 37 38 39 39 38 37 37 37 37 35 35 37 37 37 37 37 37 37 36 36 36 35 34 33 34 34 35 36 36 34 34 34 34 33 31 31 32 34 35 34 34 33 34 35 35 35 35 34 34 35 35 36 37 36 35 36 35 35 33 32 33 34 33 33 34 34 34 34 34 35 35 35 34 34 34 34 33 32 33 33 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 48 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 44 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 44 45 45 45 45 44 44 43 43 42 41 41 41 41 40 40 41 42 41 40 40 39 39 38 39 39 39 39 39 38 38 38 38 38 39 40 40 41 41 40 40 40 41 41 41 41 41 42 42 42 41 41 42 42 41 40 40 40 40 39 38 37 38 39 39 40 38 38 37 38 38 38 38 37 37 38 37 37 37 36 36 35 35 34 34 33 33 33 31 31 31 33 33 32 33 34 35 36 36 36 36 36 36 35 34 34 34 33 31 32 33 34 35 35 35 35 35 35 36 36 36 36 36 36 35 34 33 33 32 31 31 30 29 29 28 27 27 27 27 27 27 27 27 27 28 27 27 27 28 29 32 34 32 31 29 28 28 31 32 32 31 32 33 33 32 30 33 34 34 34 34 34 34 32 31 32 33 33 34 34 34 34 35 35 34 34 34 34 34 33 32 31 32 33 34 35 34 34 34 35 34 32 31 30 31 33 34 33 32 32 34 34 33 33 33 34 35 34 34 35 36 36 36 36 34 33 31 29 29 29 29 30 30 32 34 34 33 32 33 34 34 34 34 34 35 35 35 33 32 32 33 34 33 33 34 33 33 34 34 33 33 33 34 35 35 35 36 37 37 36 36 37 38 39 39 38 37 37 37 37 35 36 37 37 37 37 37 37 37 36 35 35 34 33 34 35 36 36 36 35 34 34 34 33 32 30 31 33 34 34 34 34 33 33 35 34 33 34 34 35 36 36 36 36 35 35 35 35 34 33 32 34 34 33 33 34 34 33 34 35 35 35 35 35 34 34 34 33 32 32 33 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 55 55 55 54 54 54 54 54 54 53 53 53 53 52 52 53 53 53 52 52 52 51 51 51 51 51 52 52 52 52 52 52 51 51 51 52 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 43 44 45 45 45 45 45 44 43 43 43 43 43 42 42 42 42 41 40 40 40 40 40 39 39 38 39 40 40 40 40 39 39 39 39 38 38 38 39 39 40 41 40 40 40 41 40 40 41 41 42 42 42 42 42 43 42 41 40 40 40 39 38 38 38 39 39 40 40 39 39 39 38 38 37 38 38 38 38 37 37 37 37 36 35 34 34 34 34 34 33 32 31 31 32 32 32 33 35 35 36 36 36 35 35 35 35 34 33 33 33 31 32 34 35 35 35 36 36 36 36 36 37 36 36 35 36 35 34 33 33 32 31 31 30 30 30 29 27 27 27 27 27 27 27 27 27 28 27 27 27 28 29 31 33 32 32 29 27 28 31 32 32 32 33 34 34 32 30 31 32 32 32 33 32 31 31 31 33 33 34 35 35 35 35 35 34 34 35 35 34 33 32 31 30 32 33 33 34 33 33 34 35 34 33 32 30 30 32 33 32 32 33 34 34 33 32 33 34 35 34 34 35 35 35 36 36 35 33 31 29 29 29 29 30 31 32 33 33 32 32 33 33 34 34 34 35 35 35 34 33 32 32 34 34 33 33 34 32 32 34 34 33 32 33 35 36 36 36 37 37 36 36 36 37 38 39 39 39 38 37 37 36 36 37 37 37 37 37 37 37 37 36 35 35 34 34 35 36 37 36 36 35 34 33 33 32 30 30 32 34 35 34 34 34 33 32 34 34 34 35 36 36 36 35 35 35 35 34 34 34 33 32 33 34 34 33 32 33 32 33 34 35 34 34 34 35 35 35 35 34 33 33 34 65 65 65 65 64 64 64 64 64 64 64 64 63 63 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 53 53 53 53 52 52 53 53 52 52 52 51 51 51 52 52 52 52 52 52 52 52 52 52 51 51 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 45 45 45 44 44 44 44 44 44 44 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 42 43 44 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 40 39 39 39 38 39 39 40 40 40 40 39 39 40 40 39 38 38 38 39 40 40 40 39 39 40 40 40 41 41 41 42 43 43 43 42 42 41 41 40 40 39 39 39 39 39 39 40 40 40 40 40 39 38 37 37 37 37 38 37 37 37 37 36 36 35 35 35 35 34 34 33 32 31 31 31 32 33 34 34 35 35 35 35 35 35 35 35 34 33 32 31 32 33 34 35 36 36 37 37 37 37 36 36 36 35 36 36 35 33 32 32 31 31 32 32 31 30 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 32 31 29 28 27 28 31 31 32 33 33 34 33 32 31 30 31 31 31 31 31 31 31 32 33 32 34 36 36 35 35 34 34 34 35 34 34 33 31 30 31 33 33 34 33 32 33 34 35 34 33 33 31 30 31 31 31 33 34 34 33 32 32 33 34 34 34 34 34 34 35 35 36 34 33 31 29 29 29 29 30 30 31 31 31 32 33 33 34 34 35 35 35 35 35 35 34 32 33 35 34 34 34 33 32 33 34 34 33 34 35 35 36 37 37 37 37 35 35 37 37 38 38 39 39 38 37 37 35 36 37 38 38 37 38 38 37 37 37 36 34 33 34 36 36 36 36 34 33 33 32 31 30 30 31 33 34 34 34 33 33 32 32 34 34 35 36 36 35 34 35 35 35 34 33 33 33 32 33 34 33 32 32 32 33 33 34 35 35 34 34 34 35 34 34 34 34 33 34 34 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 53 53 52 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 43 43 44 44 44 44 44 43 43 43 42 42 42 42 42 42 42 42 41 40 39 39 39 39 39 40 40 41 41 41 40 40 40 40 40 40 39 38 38 38 38 39 39 39 39 39 39 40 40 41 41 43 44 43 43 42 41 41 41 41 40 40 40 40 40 39 39 39 39 39 40 40 39 38 37 37 36 36 37 37 36 37 36 36 36 36 36 36 35 34 34 33 32 31 31 31 32 33 34 34 34 34 34 34 35 35 35 34 33 33 32 31 32 33 34 35 36 36 36 37 37 37 36 35 35 35 35 36 35 34 34 33 32 32 33 33 32 33 31 28 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 29 27 27 28 29 31 31 32 34 34 34 33 33 33 32 32 32 33 32 31 32 32 32 32 32 33 35 35 35 35 34 34 34 34 33 33 32 30 30 30 32 34 34 33 32 33 34 35 34 33 32 31 30 30 31 31 33 34 33 33 32 32 33 34 34 33 33 34 34 35 36 36 34 31 30 29 29 29 29 29 29 30 30 31 32 33 33 33 34 34 35 35 35 35 35 34 32 33 35 35 34 34 33 33 35 35 33 33 35 35 35 36 37 37 37 36 35 35 37 37 37 37 38 39 38 37 37 35 35 36 37 37 37 38 38 37 36 36 36 34 33 35 37 36 36 35 33 32 31 30 30 30 31 32 33 33 33 33 33 32 32 33 34 34 35 35 35 34 34 34 34 34 33 32 32 32 32 34 34 32 31 31 33 34 35 35 34 34 34 34 34 35 34 34 34 33 33 34 34 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 54 54 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 45 45 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 42 41 41 41 41 42 43 44 44 44 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 39 39 39 41 41 41 41 41 41 40 40 41 41 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 41 42 43 43 43 42 41 41 41 40 40 40 40 40 39 39 39 38 38 38 38 39 40 40 39 37 37 36 35 36 36 35 36 35 35 35 36 36 36 35 35 34 33 33 32 31 31 31 33 34 33 33 33 33 34 34 34 34 34 33 32 31 31 32 34 35 35 35 36 36 36 37 36 36 35 34 34 34 35 36 35 34 34 33 33 33 33 32 32 31 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 27 28 29 31 32 33 33 33 34 34 34 34 34 33 32 33 34 33 32 32 32 31 31 32 33 34 35 35 34 33 33 33 32 32 32 31 30 30 31 32 34 33 32 33 34 34 35 34 32 31 30 29 30 32 33 33 34 33 32 32 32 33 34 34 32 33 34 34 36 36 35 34 32 30 29 29 29 29 29 30 30 30 31 32 32 33 33 34 34 35 35 35 34 34 33 31 32 35 34 33 33 34 35 35 34 32 33 35 35 36 36 36 37 37 36 35 35 36 37 36 37 38 39 39 38 37 36 34 35 37 37 37 37 37 36 35 35 34 33 34 35 36 35 34 34 32 31 30 30 30 31 33 33 32 31 33 33 32 32 31 32 33 34 34 34 34 34 34 34 34 34 32 31 32 33 34 34 33 32 31 31 32 34 35 35 34 34 34 34 34 34 34 34 34 33 32 33 34 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 46 46 45 46 46 47 47 47 47 46 46 46 45 45 45 45 44 45 45 44 45 45 44 44 44 44 44 43 43 43 43 42 42 43 43 44 44 43 43 43 43 43 43 42 41 41 41 41 41 42 43 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 41 41 40 40 41 42 41 41 41 42 42 42 42 41 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 42 42 41 41 40 40 39 39 39 38 38 38 37 37 37 37 38 39 39 39 38 37 37 36 35 34 34 34 35 34 34 35 35 35 35 35 34 34 34 33 32 31 31 32 32 32 33 33 32 33 34 34 34 33 33 33 32 30 31 33 34 34 34 34 35 35 36 35 35 35 34 34 33 34 36 35 34 34 34 34 34 34 33 32 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 31 32 33 32 33 34 34 35 35 35 34 33 33 33 33 32 31 31 31 31 32 33 34 35 35 34 33 34 33 32 31 31 30 29 31 32 33 33 32 32 33 34 35 34 33 32 31 29 29 31 32 32 33 33 33 32 31 32 33 33 32 31 33 34 35 36 35 34 33 32 31 29 29 29 29 30 31 32 32 32 32 32 34 34 34 34 35 35 35 34 34 33 31 32 34 33 32 34 35 35 34 32 32 33 34 35 36 36 36 37 37 36 35 34 35 36 36 37 37 38 39 38 37 36 35 35 36 36 36 37 36 35 34 33 33 34 34 36 36 33 32 32 31 30 30 31 32 32 33 32 31 31 32 32 31 31 31 33 34 34 34 33 33 34 33 33 33 32 31 31 32 34 34 33 32 32 31 32 33 34 35 34 34 33 33 33 33 34 34 34 34 33 32 33 34 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 46 45 45 46 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 42 42 43 44 43 43 43 43 43 42 42 42 42 41 41 41 41 42 43 43 43 43 42 42 41 41 41 41 40 40 40 40 40 41 41 40 41 41 40 40 41 42 42 42 42 42 43 43 43 42 41 40 40 40 41 40 40 40 41 42 41 41 41 41 41 42 42 42 42 42 43 43 42 42 41 40 40 39 39 39 39 39 38 37 37 36 37 38 38 38 38 37 37 36 35 35 34 34 35 34 34 34 34 34 34 34 35 35 35 34 32 31 30 31 31 31 32 32 32 33 33 33 34 33 32 33 31 30 31 33 34 33 33 34 34 35 36 36 35 34 34 34 33 33 35 35 34 33 33 33 33 33 33 33 32 30 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 30 31 31 31 31 32 33 34 34 33 34 33 32 32 32 33 31 30 32 32 33 34 34 34 34 33 33 33 33 31 30 30 29 30 31 32 32 31 31 33 34 34 34 33 32 31 30 29 29 30 31 32 33 33 33 32 31 31 32 32 31 32 33 35 35 35 35 34 33 31 30 29 29 29 30 31 31 32 33 33 32 32 34 34 34 34 35 34 34 34 34 33 31 32 33 33 33 34 35 34 32 32 33 34 35 36 36 36 36 36 37 37 36 34 34 35 36 37 37 37 38 38 38 37 35 34 35 35 36 37 35 34 33 33 34 35 34 35 35 33 31 30 30 30 31 32 33 33 32 32 31 31 31 30 30 30 32 34 34 33 33 32 33 33 33 32 31 30 31 32 33 34 34 33 33 32 31 31 33 34 34 34 34 32 33 32 32 34 34 35 34 33 32 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 47 47 46 46 45 46 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 45 45 45 45 44 43 43 43 43 42 42 43 43 43 43 43 43 42 42 43 42 41 41 41 41 42 43 43 43 43 43 42 42 41 42 42 41 41 41 41 41 42 42 41 42 41 41 41 41 41 42 42 43 43 43 43 43 42 41 41 40 40 41 41 41 40 42 43 42 42 42 42 42 42 41 41 42 43 43 43 43 43 42 41 41 40 41 40 40 39 38 37 37 36 36 37 37 37 38 38 37 36 36 36 35 35 36 35 35 34 33 33 33 34 34 35 35 34 33 32 31 31 31 31 31 31 31 32 32 32 33 32 32 31 30 30 31 33 33 33 33 34 34 35 36 36 36 34 34 34 33 32 34 34 34 34 33 32 32 32 32 33 33 31 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 29 30 30 31 31 32 33 33 32 31 32 32 32 33 33 32 31 31 33 33 34 34 35 34 33 32 33 32 31 30 30 29 29 31 32 33 32 31 31 33 34 33 34 34 31 30 29 29 30 30 31 32 33 33 33 32 31 31 31 31 32 33 34 34 34 33 34 34 32 30 30 29 29 29 30 32 32 33 33 34 34 34 34 34 33 34 35 34 34 34 34 33 31 32 33 32 33 33 33 32 32 33 34 35 35 35 35 35 36 36 37 37 36 34 34 35 36 37 37 36 37 37 37 37 35 34 34 35 36 35 34 32 32 33 34 34 33 34 34 32 30 29 30 31 32 33 33 32 31 31 31 31 30 30 31 32 33 33 33 32 32 33 32 31 31 31 30 31 32 33 34 34 34 34 34 33 30 31 32 34 34 34 34 32 32 32 33 34 34 34 34 32 31 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 52 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 47 47 46 46 46 47 46 46 46 46 46 46 46 45 46 46 46 46 46 46 45 44 44 44 44 44 44 43 43 42 42 43 43 43 43 43 43 43 43 42 41 41 41 41 42 42 43 44 44 43 43 43 42 42 42 41 41 41 42 43 43 42 42 43 42 41 42 42 42 43 43 43 43 43 43 43 43 42 41 41 41 41 42 42 41 42 42 43 43 43 42 41 41 40 41 42 42 43 42 42 42 43 42 42 41 41 41 40 39 38 37 37 37 36 36 36 37 37 38 37 37 37 37 37 37 37 36 35 35 34 34 33 33 33 33 33 33 32 32 32 31 31 30 30 30 30 30 30 31 31 31 31 31 30 30 32 33 33 32 32 33 33 34 35 36 36 35 34 33 32 32 34 34 34 33 33 32 30 30 31 32 33 32 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 31 30 30 31 31 32 32 33 32 31 31 32 32 32 32 31 31 31 32 33 33 33 34 34 33 32 33 33 32 30 29 29 30 31 31 33 33 32 31 31 32 32 33 33 33 31 29 29 29 30 31 32 33 33 33 33 32 32 31 30 31 33 34 34 34 33 32 33 32 31 30 29 29 29 29 31 32 33 34 34 34 34 34 33 33 34 34 34 34 35 35 34 33 31 32 33 32 32 32 32 32 33 34 34 35 35 35 34 35 35 36 36 36 35 34 34 35 36 36 36 36 36 35 35 35 35 33 32 34 34 33 33 32 33 34 34 33 32 32 32 30 29 29 31 32 33 34 33 32 31 31 31 30 30 31 32 32 32 31 31 32 32 32 31 30 30 30 31 33 33 33 33 33 34 33 32 31 30 31 33 34 34 34 33 32 31 31 33 34 33 33 32 31 31 33 34 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 45 45 44 44 44 43 42 42 43 43 43 43 43 43 43 43 42 41 41 40 41 42 43 43 44 44 44 43 43 43 43 42 42 42 42 43 43 43 42 43 43 42 42 43 43 43 43 43 43 43 42 42 43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 42 41 41 40 41 42 42 42 42 41 41 42 42 42 42 42 41 40 39 38 38 38 38 37 36 36 36 37 37 37 37 37 37 37 37 37 36 35 34 34 34 33 33 32 32 32 32 32 32 31 31 31 31 30 30 30 31 31 30 30 30 30 30 30 30 32 33 33 32 32 32 32 33 35 35 35 35 34 33 32 32 33 34 34 34 33 32 31 30 30 31 31 31 30 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 31 31 30 31 32 32 33 32 31 30 31 32 31 30 30 30 31 33 33 32 33 33 33 33 32 32 33 32 31 30 29 29 31 32 32 33 33 31 30 31 32 32 32 32 31 30 29 29 30 31 32 33 33 33 34 34 32 31 30 30 31 33 33 33 33 32 32 33 31 30 30 29 28 28 29 31 32 33 33 34 35 35 34 33 33 34 34 33 34 35 35 34 33 31 31 33 32 31 32 32 33 34 34 35 35 35 34 34 34 35 35 35 35 34 33 34 35 36 36 35 35 35 34 34 34 33 32 32 32 32 32 32 33 33 33 33 32 31 30 29 29 30 31 32 33 34 34 34 34 33 32 31 30 31 32 31 31 31 31 32 32 31 30 29 30 31 32 32 32 32 32 33 33 33 32 31 30 31 33 34 34 34 34 33 32 31 31 32 33 33 32 30 31 33 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 50 50 49 49 49 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 45 45 45 46 46 45 45 44 43 42 41 42 42 42 42 42 43 43 43 42 41 41 40 40 41 42 43 44 44 44 44 43 43 44 43 43 42 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 43 42 42 42 43 42 42 43 43 43 42 42 42 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 41 40 40 39 39 39 38 38 38 37 36 35 35 36 36 36 36 37 37 37 37 37 36 34 34 33 33 33 34 33 33 33 32 32 32 31 32 32 31 30 31 32 32 31 30 30 30 29 29 29 30 32 33 31 31 31 32 34 34 34 34 34 34 33 33 32 32 33 34 34 32 31 32 31 30 30 30 30 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 32 31 30 31 31 32 32 30 30 32 31 29 30 31 32 32 33 32 32 33 33 32 32 32 32 32 32 31 30 29 30 31 32 32 33 33 31 30 31 32 32 32 32 31 30 29 29 30 31 33 34 34 34 34 34 33 31 30 30 31 32 32 32 32 32 32 32 30 29 29 28 28 29 29 31 32 32 33 33 34 34 33 32 33 34 33 33 34 35 34 34 32 31 31 32 32 31 32 33 34 34 35 35 36 35 34 34 35 35 35 35 35 34 34 34 35 36 36 35 34 34 34 33 32 32 32 32 33 32 32 33 33 32 31 31 30 29 29 29 30 32 32 32 33 34 34 34 34 33 32 31 30 31 31 30 30 31 32 32 31 30 29 30 31 32 32 32 31 32 32 33 32 31 31 30 30 32 34 34 35 34 34 33 33 32 31 32 33 32 31 30 32 33 33 33 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 48 48 48 47 46 46 46 47 47 47 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 46 46 45 45 45 46 46 46 46 45 45 45 43 42 42 41 41 41 41 42 43 43 43 42 41 41 40 40 41 42 43 44 44 44 44 44 44 45 44 43 43 43 44 44 44 44 44 44 43 43 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 42 42 41 42 42 42 43 43 43 42 42 42 41 41 40 40 40 40 40 41 41 41 41 42 41 41 40 40 40 40 39 38 38 39 38 36 35 35 35 35 35 35 36 37 37 37 36 35 34 34 34 34 35 35 34 34 33 33 33 33 32 32 32 31 31 31 31 31 31 31 30 29 29 29 29 30 31 31 30 31 33 33 33 33 34 34 34 33 32 32 31 32 34 34 32 31 31 31 30 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 30 29 29 30 31 31 30 31 31 29 30 31 33 33 32 32 32 33 33 32 32 32 33 32 31 31 30 29 29 30 31 32 32 32 33 31 30 30 31 32 32 31 30 29 29 30 30 32 33 34 34 34 33 33 32 32 31 30 31 31 31 31 32 31 31 30 29 28 28 28 28 29 30 31 32 32 33 33 33 34 32 32 33 33 33 34 34 34 34 34 33 31 31 31 32 32 32 33 34 34 35 35 35 35 34 33 35 35 35 35 35 34 33 34 35 35 35 35 34 34 34 32 31 32 33 34 33 32 32 32 31 30 30 29 29 29 29 30 31 32 32 32 34 34 34 34 34 34 33 32 30 30 30 31 31 32 32 31 30 29 29 30 32 32 31 31 30 31 31 30 30 30 30 30 31 33 34 34 34 34 34 34 33 32 31 31 32 31 30 31 33 33 33 33 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 59 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 54 54 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 46 46 46 47 47 47 47 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 48 47 47 47 46 46 45 45 45 46 46 46 46 46 45 45 44 43 43 43 42 42 41 41 41 42 43 43 42 41 41 40 40 41 42 43 43 44 44 44 45 45 45 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 41 41 41 41 41 42 42 42 43 43 42 43 43 42 42 41 40 40 39 40 40 40 40 40 42 42 41 41 40 41 41 40 39 39 39 38 37 35 35 34 34 34 35 35 36 36 36 35 35 35 35 35 35 35 35 35 34 34 34 34 33 32 32 31 31 31 31 31 32 32 32 31 30 29 29 29 29 30 30 31 32 32 32 32 33 34 34 34 34 33 32 32 32 33 34 34 33 32 31 30 29 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 29 30 30 29 30 30 29 31 32 32 32 31 31 32 33 32 31 32 33 33 32 30 31 30 29 29 30 31 32 32 32 31 30 30 31 31 32 32 30 29 29 29 30 31 32 33 33 34 34 33 32 31 31 30 29 30 30 30 31 31 31 31 30 28 28 28 28 29 29 30 31 32 33 33 32 33 33 32 33 33 32 32 34 34 34 34 34 34 32 30 31 32 32 33 33 34 34 35 34 34 34 34 34 34 35 36 35 34 34 33 33 34 34 35 34 34 34 33 31 31 33 34 34 33 32 31 30 30 29 29 29 30 30 31 31 32 32 32 33 34 33 32 33 33 33 33 33 31 29 30 31 32 31 31 30 29 29 30 31 32 31 30 30 30 30 30 30 30 31 32 32 32 33 34 34 34 34 34 34 33 33 31 30 31 31 30 31 32 33 32 32 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 47 47 47 47 47 47 46 47 47 47 47 47 47 47 48 48 47 47 46 46 46 46 46 46 47 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 44 44 43 43 42 42 43 42 41 41 41 42 43 42 41 40 40 40 40 41 42 43 43 43 44 45 45 45 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 42 42 42 42 43 43 43 43 42 40 39 38 39 39 39 39 40 41 41 41 41 41 41 41 40 39 39 38 38 37 35 35 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 34 34 34 34 33 33 32 31 31 31 32 32 31 32 33 33 32 31 30 29 29 29 29 29 30 31 31 31 32 33 33 34 34 34 33 33 32 32 33 34 34 33 32 31 30 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 29 30 30 29 29 30 31 31 30 30 31 32 33 31 31 33 33 33 33 32 31 30 29 29 30 31 32 31 31 30 30 31 32 32 32 31 30 29 29 30 31 31 32 32 33 33 34 34 32 31 30 30 29 29 29 31 31 30 31 31 29 28 28 28 29 29 30 31 32 32 33 33 32 31 31 31 32 32 33 33 34 35 35 34 34 34 32 30 31 32 32 33 33 34 34 34 34 34 34 34 35 35 35 36 35 34 34 33 33 34 34 34 34 34 34 33 31 32 33 34 34 34 33 31 30 29 29 30 31 32 32 32 32 31 31 32 33 34 33 32 32 33 32 32 31 30 29 30 32 32 31 30 29 29 29 30 32 32 30 29 30 31 31 32 32 32 33 33 33 33 34 34 33 33 33 33 33 33 33 32 31 31 31 30 31 32 33 32 31 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 62 62 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 47 47 47 47 47 47 47 48 47 47 47 47 48 48 47 47 47 46 46 46 45 45 46 46 46 46 47 47 47 47 47 47 47 47 47 47 46 46 46 45 45 44 44 44 43 43 42 42 42 42 41 41 41 42 43 42 41 40 40 40 40 41 42 43 43 43 44 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 44 44 44 44 44 44 44 44 44 44 43 43 42 42 42 42 42 41 40 40 41 42 42 41 42 42 43 42 41 40 40 39 38 38 38 38 39 40 40 41 41 41 41 41 40 40 39 39 38 37 35 35 35 36 35 34 34 34 33 33 33 33 34 34 34 34 34 35 34 34 34 33 33 32 31 31 32 33 32 32 32 33 33 33 32 32 31 30 29 29 29 29 29 29 30 31 32 32 32 33 34 34 34 33 32 31 32 33 34 33 32 32 31 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 30 29 29 30 29 29 29 30 31 33 33 32 31 31 33 33 33 33 33 32 30 29 29 31 32 32 31 30 29 30 31 31 31 31 30 29 28 29 31 31 31 32 33 33 34 34 34 33 31 31 31 30 29 29 30 30 30 32 31 28 28 28 28 29 29 31 32 33 33 33 32 31 30 30 31 31 32 33 34 35 35 36 35 34 33 31 30 31 32 32 33 34 34 34 34 33 33 33 34 35 35 35 35 35 35 34 33 33 34 35 34 34 35 34 32 31 32 34 35 34 33 32 30 29 29 30 32 33 34 33 32 31 30 30 31 32 32 32 31 33 33 32 31 30 29 30 31 32 31 30 29 29 29 29 30 31 30 29 29 31 32 32 33 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 31 31 30 30 30 31 33 33 32 31 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 48 48 48 48 48 47 47 48 48 48 47 47 47 47 47 46 46 45 45 45 45 46 46 46 46 47 47 47 47 47 46 47 46 46 45 45 44 44 44 44 43 43 43 42 42 42 41 41 42 43 43 42 41 40 40 40 40 41 41 42 43 44 44 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 44 43 43 43 44 43 43 44 44 44 43 43 43 43 43 43 43 42 40 40 40 41 41 41 41 42 42 42 41 41 40 40 39 38 38 38 38 39 40 40 40 40 41 41 40 40 39 39 38 37 36 35 36 37 36 35 35 34 34 33 33 33 33 33 33 33 33 34 33 32 32 32 32 32 32 32 33 33 32 32 33 34 34 33 32 32 31 30 29 29 29 29 29 29 29 30 30 31 31 32 33 34 34 33 32 30 31 32 33 33 32 32 32 30 29 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 29 29 29 30 30 30 30 30 32 33 33 32 31 31 33 33 33 33 32 31 30 29 29 31 31 31 30 30 30 31 31 30 31 31 29 28 29 29 30 30 30 32 33 33 33 34 34 33 32 32 32 31 30 30 30 30 31 32 30 28 28 28 28 29 29 30 32 33 32 31 30 30 31 31 31 32 33 33 34 34 35 35 35 34 33 31 30 31 32 32 33 33 34 34 33 32 33 34 34 35 36 36 35 35 35 35 34 33 34 35 34 33 34 33 31 31 32 34 34 34 33 31 30 29 29 31 33 33 34 33 32 31 30 30 31 32 31 31 31 33 33 32 31 29 29 31 32 31 30 30 29 29 29 29 29 29 29 30 31 31 32 32 34 35 35 34 34 34 34 34 33 32 32 33 34 33 33 32 31 31 30 29 29 31 33 32 31 32 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 45 45 45 45 46 46 46 46 47 46 46 46 46 46 46 46 45 45 44 44 43 43 43 43 43 42 42 41 41 41 42 43 43 42 41 40 40 40 40 41 41 42 43 44 45 45 44 44 44 44 44 44 44 43 44 44 44 44 45 45 45 44 43 43 43 43 43 43 43 44 44 44 43 43 43 44 43 43 42 41 40 40 40 40 40 41 41 42 42 42 41 40 40 40 40 38 38 38 39 40 40 39 39 41 41 40 40 39 38 37 37 37 37 37 37 37 36 35 35 34 34 34 34 33 33 33 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 34 34 34 33 32 32 31 30 30 29 29 29 29 29 29 29 29 29 30 31 32 33 32 32 31 30 30 31 32 33 32 31 31 30 29 29 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 30 29 30 30 31 31 32 32 31 33 33 33 31 31 32 33 32 32 31 31 31 29 29 29 31 31 30 29 30 30 31 31 30 30 30 28 28 29 30 30 30 30 31 32 33 33 34 34 34 33 32 31 31 30 29 29 30 31 31 29 28 28 28 28 28 29 29 30 30 30 30 30 31 32 32 33 34 34 34 34 35 35 35 35 34 34 31 30 31 31 32 33 34 34 34 32 32 33 34 35 36 36 36 36 35 35 34 34 33 33 34 33 33 34 33 31 31 32 34 34 33 33 31 30 29 29 30 31 32 33 33 32 32 30 30 31 31 30 32 33 32 31 31 30 29 30 31 31 30 30 29 29 29 29 29 29 29 30 31 32 32 32 33 34 34 34 33 33 34 34 33 32 31 33 34 34 34 34 33 33 32 31 29 29 31 32 31 31 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 48 48 48 48 48 48 48 48 48 49 49 49 49 48 47 47 47 47 47 46 46 45 45 45 46 46 45 46 46 46 46 46 46 46 46 46 46 45 45 44 44 43 43 43 43 42 42 41 41 41 42 43 42 42 42 40 40 40 40 41 42 43 43 44 45 45 44 43 43 44 43 43 44 43 43 43 44 44 45 45 45 44 44 44 43 43 43 43 43 43 44 44 44 43 43 43 43 43 42 41 41 41 41 40 40 40 40 41 42 41 41 40 40 41 40 39 38 37 38 38 39 39 39 40 40 39 39 39 38 38 37 37 38 38 37 37 36 35 35 35 35 36 35 34 34 33 33 33 33 32 32 33 33 34 34 35 34 34 33 32 33 34 34 34 33 33 32 31 30 30 30 30 29 29 29 29 29 29 29 29 30 31 32 31 31 31 30 30 31 32 33 33 31 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 33 32 30 30 31 32 33 33 33 33 33 32 32 31 30 31 32 33 32 30 30 30 29 29 29 30 30 29 29 30 31 31 30 29 29 28 28 29 29 30 31 31 31 32 33 33 33 34 34 34 33 31 31 31 30 29 29 30 31 31 29 28 28 28 28 28 29 29 29 29 29 29 31 32 32 32 33 34 35 35 35 35 35 35 35 34 34 32 30 30 31 32 33 34 34 33 32 33 34 35 35 35 36 36 36 36 35 34 34 33 33 34 33 34 34 33 31 31 32 34 34 33 32 32 31 29 29 30 31 32 33 34 33 32 30 29 30 30 30 32 33 32 30 29 29 30 31 31 30 30 29 29 28 28 28 30 31 31 31 32 32 32 33 34 34 34 33 33 32 33 33 33 32 32 33 34 33 33 33 33 33 32 32 31 30 30 30 31 31 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 61 61 61 60 60 60 61 61 61 60 60 60 60 60 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 46 46 45 45 45 45 45 45 46 46 46 45 46 46 45 45 46 46 46 45 45 44 43 43 43 43 43 43 42 40 40 42 43 42 42 41 40 40 40 40 41 41 43 44 44 44 44 44 43 43 44 43 43 43 43 43 44 44 45 45 45 45 45 44 44 43 43 43 43 43 43 43 43 44 43 42 42 43 43 42 42 41 42 42 40 40 39 39 40 40 41 41 41 41 41 40 40 39 38 37 37 38 38 38 39 40 39 38 39 38 38 38 38 38 38 38 38 37 36 36 36 37 37 36 35 34 34 34 34 34 34 33 34 34 34 34 35 34 34 33 32 33 34 34 34 34 34 33 31 31 31 31 30 30 29 29 29 29 29 29 29 29 30 31 31 31 31 30 30 31 33 33 33 32 30 30 31 32 32 31 30 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 31 33 32 31 31 32 33 34 33 33 33 32 32 31 30 31 32 33 33 32 31 30 29 29 28 29 30 29 29 30 31 31 30 29 29 28 28 29 30 30 31 31 32 32 33 33 33 33 34 34 34 33 31 31 31 30 29 29 30 31 31 30 28 28 28 28 28 29 30 30 30 31 30 30 31 32 32 33 34 34 34 34 34 34 35 35 34 33 32 30 30 32 33 34 34 33 32 33 34 34 35 35 35 36 36 36 36 35 34 34 33 33 34 33 34 34 33 31 32 33 34 33 32 32 32 31 29 29 30 31 32 33 33 32 31 31 29 29 30 31 32 32 32 30 29 30 31 32 31 30 30 29 28 28 29 30 31 31 32 32 33 33 33 34 34 34 34 34 34 33 32 32 32 32 32 33 33 33 33 33 33 33 33 32 32 30 29 29 30 30 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 58 58 58 58 57 57 57 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 48 47 47 48 48 49 49 49 49 49 49 50 50 50 49 49 49 49 49 48 48 47 47 46 46 46 46 46 45 44 44 46 46 45 45 45 45 45 45 45 45 45 45 45 44 44 44 43 43 43 43 42 41 40 41 42 42 41 41 40 40 40 40 41 41 42 43 44 44 44 44 43 43 43 43 42 43 44 44 45 45 45 45 44 44 44 44 44 44 43 42 42 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 41 41 40 39 39 39 40 40 40 40 40 40 40 39 39 38 37 37 37 37 38 39 38 38 39 39 38 38 39 38 38 37 37 37 36 37 37 37 36 35 35 35 35 36 35 35 34 34 34 34 34 35 35 34 33 33 33 35 35 34 34 34 34 33 32 32 32 31 30 31 31 30 29 29 29 28 28 28 29 29 30 30 30 29 29 31 32 33 33 32 31 32 32 32 32 31 30 30 31 31 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 29 31 32 32 32 32 33 34 34 32 31 31 31 30 30 32 33 33 33 32 31 31 30 29 28 29 29 29 29 30 30 29 29 28 28 29 29 29 30 31 31 31 32 32 33 33 33 34 34 34 34 34 32 31 30 29 29 28 29 30 30 29 28 28 28 29 29 30 31 32 32 32 32 31 30 31 33 34 34 34 34 34 34 34 35 35 34 33 32 31 30 31 33 34 33 32 32 34 34 35 34 34 35 36 36 36 36 35 35 34 33 33 34 33 33 34 33 31 32 33 34 33 31 32 32 30 29 28 29 31 32 32 32 32 32 31 29 29 31 32 32 31 30 29 29 30 31 31 31 30 29 28 28 29 30 31 31 30 31 32 32 33 33 33 33 34 34 34 34 33 32 31 31 31 31 32 33 33 32 32 32 33 33 32 32 31 30 29 29 30 31 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 56 56 56 56 56 57 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 49 50 49 49 49 49 49 50 50 49 49 48 48 47 47 47 47 46 46 46 45 44 44 44 45 45 44 44 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 43 43 42 40 40 41 41 41 41 40 40 40 40 41 41 42 42 43 43 43 43 43 43 43 43 43 43 44 45 45 45 45 45 44 44 44 44 44 44 43 42 42 42 42 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 39 38 38 38 39 40 40 40 40 39 38 38 37 37 37 36 37 37 37 38 38 38 38 39 39 39 38 38 37 37 37 38 38 37 36 35 35 36 36 36 35 34 34 35 35 34 34 34 34 34 33 33 34 35 36 35 35 34 34 33 33 33 32 31 31 31 31 30 30 30 29 28 28 28 28 28 29 29 30 29 29 30 31 33 34 33 33 34 33 32 31 31 30 30 32 32 32 32 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 28 31 33 33 33 33 33 34 33 32 31 31 30 30 32 33 33 33 33 33 32 31 30 29 28 28 29 29 30 30 30 29 28 28 29 29 30 30 31 32 32 32 32 32 33 33 33 33 34 33 33 33 32 32 31 30 29 28 28 29 29 28 27 28 28 29 29 30 30 31 31 32 33 31 30 32 33 34 34 34 34 34 34 35 35 35 34 33 32 31 30 30 31 33 32 31 32 34 34 34 34 35 35 36 36 36 35 34 34 34 32 33 34 33 33 33 32 31 32 33 33 32 31 32 31 30 28 28 30 31 32 33 32 32 32 30 29 29 31 32 32 31 29 29 29 30 31 30 30 29 28 28 29 30 30 30 30 30 31 31 31 32 33 33 33 34 34 34 34 33 31 30 30 31 32 33 33 33 32 32 32 32 32 32 31 31 31 30 29 30 31 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 51 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 46 46 46 45 45 45 45 45 44 44 44 44 44 45 44 45 45 44 44 44 44 44 44 44 43 43 43 43 43 43 42 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 43 43 43 43 42 42 43 44 44 45 45 45 45 45 44 44 43 43 44 44 43 43 42 42 42 42 43 43 43 43 42 42 41 41 41 41 40 40 41 40 40 40 40 40 39 38 38 38 39 38 39 39 38 38 37 37 37 37 37 36 36 36 36 37 37 38 38 39 39 39 39 39 39 38 38 38 37 36 36 37 37 37 36 35 35 35 35 35 34 34 34 34 34 33 34 34 35 36 36 35 34 34 34 34 34 33 33 32 31 30 31 31 30 30 29 29 28 28 28 28 29 30 29 29 30 31 33 33 33 34 34 33 32 31 31 31 32 32 32 33 32 32 32 30 27 27 27 27 27 27 27 27 27 27 27 27 28 31 32 33 33 33 34 34 33 32 31 30 30 31 33 32 31 33 33 32 33 32 30 30 29 28 28 29 30 29 28 28 28 29 29 29 30 31 32 33 33 32 32 32 32 33 33 33 33 33 33 33 33 32 31 30 29 28 28 29 28 27 27 28 29 29 29 29 30 31 32 33 33 32 31 32 32 34 34 34 34 34 34 35 36 35 34 33 32 32 30 30 31 32 32 32 33 34 34 34 34 35 35 35 36 35 35 34 34 33 32 33 33 32 32 31 31 31 32 32 31 30 31 32 31 29 28 28 30 32 33 33 32 32 31 29 28 28 30 32 32 30 29 29 30 31 31 30 29 29 28 28 29 30 31 30 30 31 31 32 33 33 33 33 32 34 34 33 33 33 31 30 30 32 32 33 33 33 33 32 31 31 32 32 31 30 30 29 29 30 30 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 61 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 58 57 56 56 56 56 56 56 56 55 55 55 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 54 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 48 48 49 49 48 48 49 49 49 49 48 48 47 46 46 45 45 46 46 46 45 45 44 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 42 41 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 42 42 42 43 44 45 45 45 45 46 45 44 44 44 43 43 43 43 43 42 42 42 42 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 41 40 40 40 40 39 38 38 37 37 38 38 37 37 37 38 38 37 37 36 36 36 36 36 36 37 38 38 39 40 40 40 39 38 37 37 37 37 38 37 37 36 35 36 37 36 35 35 36 35 34 34 34 35 35 35 35 36 36 35 35 34 35 34 34 34 33 31 31 32 32 31 31 30 29 29 29 28 28 28 29 29 29 30 31 32 33 33 33 34 33 33 32 32 32 32 31 31 31 30 30 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 30 32 32 32 32 34 34 34 32 30 30 31 32 33 32 31 31 32 32 33 32 31 30 29 28 27 28 29 28 27 28 29 29 30 30 31 31 32 33 33 32 32 32 33 34 34 34 33 32 33 33 33 31 30 29 29 28 27 27 27 27 28 28 29 29 30 30 30 31 32 33 34 33 31 31 33 34 34 33 34 34 34 35 36 35 34 33 33 32 31 30 31 32 32 33 34 34 34 34 34 35 35 35 36 35 34 34 33 32 32 33 33 32 31 30 31 32 33 32 31 30 31 32 30 29 28 29 31 32 33 32 32 31 30 30 29 28 30 30 30 29 28 29 31 32 31 30 29 28 28 29 30 30 30 29 31 32 32 32 32 32 32 32 33 33 33 33 33 33 32 31 30 31 32 33 34 33 32 33 31 31 32 32 32 31 30 29 29 30 30 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 57 57 57 57 56 56 56 56 56 55 55 55 56 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 48 47 47 47 46 46 47 46 46 46 45 45 44 44 44 44 44 44 44 44 44 43 43 44 44 43 43 43 43 42 42 42 43 42 42 41 40 40 40 40 40 40 40 40 41 41 41 41 42 42 41 42 44 44 44 45 45 44 45 46 45 45 44 43 43 43 43 43 43 42 42 42 43 43 43 43 42 42 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 39 38 37 37 37 37 38 39 39 38 37 37 37 37 36 36 36 36 36 36 37 38 39 39 39 40 39 37 37 37 38 38 37 37 37 37 37 37 36 36 37 37 36 35 34 34 35 36 35 36 36 36 36 36 36 35 34 34 34 33 32 33 33 33 32 32 31 31 31 30 29 29 28 28 28 29 30 31 32 32 32 32 33 33 34 33 33 32 32 31 31 30 30 30 29 30 29 27 27 27 27 27 27 27 27 27 27 27 27 28 31 31 31 32 33 33 32 31 29 29 31 32 33 32 30 30 32 33 32 31 31 30 30 28 27 27 27 27 28 29 29 30 30 31 31 31 31 32 32 32 32 33 33 34 34 34 32 32 33 33 32 31 31 30 30 29 27 27 27 28 28 29 29 30 30 31 30 31 32 33 34 33 31 31 33 34 33 33 34 34 34 35 35 35 34 34 34 32 31 30 30 31 32 33 34 34 34 34 35 35 35 35 35 35 34 34 33 31 32 33 33 32 30 30 32 33 33 32 30 29 30 31 30 29 28 29 30 32 33 32 31 32 31 30 29 28 29 28 28 29 30 30 31 32 30 29 29 28 27 29 29 29 29 29 31 31 31 31 30 31 31 32 33 33 32 32 32 32 31 30 30 31 32 33 34 33 32 32 31 31 32 31 31 31 29 29 30 31 30 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 58 58 58 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 57 56 56 55 55 55 55 56 56 56 56 56 55 55 55 55 55 54 54 54 54 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 53 52 52 52 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 49 48 48 47 47 47 47 46 46 46 46 45 44 44 44 44 43 43 44 44 44 44 44 43 43 44 43 43 43 43 42 42 42 42 42 43 43 42 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 43 44 44 44 44 44 44 45 46 46 45 44 43 43 43 42 42 42 42 42 43 43 44 43 43 42 42 42 42 43 43 43 43 43 42 42 41 41 40 40 41 41 41 41 40 40 39 39 39 39 39 39 39 39 38 37 38 38 38 38 37 36 36 36 36 36 37 37 38 38 39 39 39 38 38 39 39 38 37 37 38 38 37 36 37 37 36 36 35 34 34 35 36 37 37 37 37 37 37 37 36 35 35 35 34 34 34 34 34 33 33 32 32 33 32 31 31 30 28 27 28 29 30 31 31 31 31 32 33 33 34 33 33 32 32 32 31 30 31 31 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 28 30 31 32 33 32 31 30 29 29 31 33 33 32 30 30 31 32 31 30 30 29 29 28 27 27 27 28 30 31 31 30 31 32 32 32 32 32 32 31 32 32 33 34 34 34 32 32 33 33 32 31 31 30 29 29 27 27 27 28 29 29 29 30 31 32 32 32 33 34 34 33 31 32 33 33 32 33 34 34 34 35 35 34 34 34 34 33 31 30 30 31 32 33 34 34 34 34 35 35 34 34 35 35 34 34 33 31 32 33 34 32 30 30 32 33 33 32 30 29 29 30 29 28 28 29 30 31 33 33 31 31 32 30 29 28 28 28 29 30 31 31 31 31 29 29 28 27 27 28 28 28 29 30 31 31 30 31 31 31 32 33 33 33 32 31 32 31 30 31 32 32 33 34 33 33 32 31 31 31 32 31 30 30 28 29 30 30 30 66 66 66 66 66 66 66 66 66 66 66 65 65 65 66 66 65 65 65 65 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 55 55 55 55 55 56 55 55 55 55 54 54 54 54 54 54 54 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 48 48 48 48 48 49 49 49 49 48 48 47 47 47 47 47 46 46 46 46 45 45 44 44 44 43 43 44 44 44 44 43 43 43 43 43 43 43 43 42 42 42 41 41 42 42 41 40 40 40 41 40 40 40 40 40 41 41 41 41 41 42 43 44 43 43 43 43 44 45 45 45 45 44 44 44 43 42 41 41 41 42 43 44 44 44 43 42 42 42 42 43 43 43 43 43 42 42 42 41 41 41 42 42 42 41 40 40 40 40 40 39 40 39 38 38 37 38 39 40 40 39 38 38 37 37 36 35 35 35 36 37 38 39 39 39 39 39 38 39 39 38 38 38 37 37 37 37 36 36 35 34 34 35 36 37 38 38 37 37 37 37 36 36 36 36 35 35 35 35 35 34 34 34 33 33 33 33 32 31 29 28 27 28 28 30 31 31 30 31 32 33 34 33 33 33 33 32 31 31 32 32 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 30 31 31 33 32 31 30 29 30 32 33 32 31 30 30 31 31 31 30 29 29 29 28 27 27 28 29 31 32 32 31 32 32 32 33 32 31 31 31 31 32 33 33 33 33 32 32 32 33 32 31 30 29 29 28 27 27 27 29 29 30 30 30 31 33 33 33 33 33 33 33 32 31 32 32 32 33 34 34 34 34 34 34 34 33 33 33 31 30 30 32 33 33 34 34 33 34 35 35 34 34 35 35 34 34 33 32 32 33 34 32 31 31 32 32 33 33 31 30 29 29 28 28 29 29 30 31 33 34 32 30 31 31 29 27 28 29 30 31 31 32 32 31 30 30 28 28 27 28 28 29 30 31 31 30 29 31 31 32 33 33 33 32 31 31 31 30 30 32 32 33 33 32 32 32 32 32 31 30 31 31 30 29 28 29 29 30 31 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 64 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 58 58 58 58 57 57 58 57 57 58 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 49 49 49 48 48 47 47 48 49 48 48 49 48 47 47 47 48 47 47 47 47 47 47 46 46 45 45 44 44 43 43 43 43 44 43 43 42 42 43 43 43 43 43 43 43 42 41 41 41 41 40 40 40 41 40 40 40 39 40 40 41 41 41 42 42 43 43 43 43 42 43 44 45 45 45 45 45 44 44 43 42 41 41 42 43 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 42 41 42 42 42 43 43 42 41 40 40 40 40 39 39 39 38 38 38 39 40 40 40 39 39 39 38 38 37 36 36 35 35 36 37 38 38 38 38 38 38 39 40 39 39 38 37 37 38 38 38 37 36 35 34 36 36 37 38 37 37 36 36 36 37 37 37 36 35 35 36 36 36 36 36 35 34 34 34 34 33 31 29 28 28 28 27 28 30 30 29 31 31 32 33 33 33 34 33 32 32 32 33 32 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 29 32 32 33 32 30 29 29 31 32 32 32 32 31 30 30 31 31 30 29 28 28 27 27 28 29 30 31 32 32 32 32 32 32 33 31 30 31 32 32 32 33 32 32 32 32 32 33 33 32 31 30 29 29 28 27 27 28 29 30 31 31 31 33 33 33 32 32 32 33 34 33 32 31 32 33 34 34 34 34 34 34 34 33 32 32 32 30 30 30 31 33 33 34 33 33 34 34 34 34 34 35 35 34 34 33 31 32 33 32 31 30 31 32 31 32 33 32 30 29 28 28 29 30 30 31 32 33 33 32 30 31 31 29 27 28 29 31 32 32 31 32 31 31 30 29 29 28 27 28 29 30 30 29 29 29 31 32 32 31 31 31 31 31 31 30 30 32 32 32 33 33 32 31 32 31 31 30 29 30 31 30 29 28 29 29 30 31 66 66 66 66 66 66 65 65 65 66 66 65 65 65 65 65 65 65 65 64 64 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 58 58 57 57 58 57 57 57 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 48 48 48 48 49 49 49 49 49 49 48 48 48 48 48 49 49 48 48 47 47 48 48 48 48 48 48 47 47 47 48 48 47 47 47 46 46 46 45 45 45 45 44 43 42 42 42 43 43 43 42 42 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 40 40 40 39 39 39 40 40 40 41 42 42 42 42 42 43 43 43 44 44 44 44 44 44 43 43 42 41 41 42 43 43 43 43 43 43 42 42 42 42 42 42 43 43 43 43 43 42 42 42 43 43 43 43 42 41 41 40 40 41 40 40 40 39 39 40 40 41 40 40 40 39 39 38 38 37 37 37 37 36 35 35 36 36 37 37 36 36 38 39 39 38 38 38 38 38 38 38 37 37 35 35 36 37 38 38 37 37 37 36 36 36 36 37 36 36 36 36 36 36 37 37 36 35 35 34 33 32 31 30 29 29 29 28 27 28 29 29 30 31 31 31 31 32 33 33 33 32 33 33 32 31 30 29 30 28 27 27 27 27 27 27 27 27 27 27 27 28 30 33 34 32 30 29 30 31 30 30 31 32 32 31 29 29 30 29 28 27 27 27 28 29 29 31 32 32 33 32 32 32 32 31 30 30 31 32 33 33 32 32 32 32 31 32 33 33 31 30 30 30 29 28 27 27 28 29 31 32 32 32 33 32 32 32 31 32 33 34 34 33 32 32 34 34 35 34 34 34 34 34 33 33 32 32 30 30 30 30 31 33 34 33 34 34 34 34 34 35 35 34 34 34 33 31 31 32 30 30 31 32 32 31 31 32 31 31 30 28 28 29 30 31 32 32 32 32 31 30 30 30 29 27 28 29 30 31 31 31 30 31 31 30 29 29 28 27 27 28 29 29 29 30 30 32 33 32 31 30 30 31 31 30 30 30 31 31 31 33 33 31 30 31 31 30 30 29 30 31 30 29 29 29 29 30 31 66 66 66 66 66 66 65 65 65 65 65 66 65 65 65 65 65 65 64 64 64 63 63 63 63 63 64 63 63 63 63 63 63 62 62 62 62 62 61 61 61 61 61 61 61 60 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 58 58 57 57 58 58 57 57 57 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 54 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 49 48 48 48 48 48 48 49 48 48 48 48 47 47 48 48 48 48 47 47 47 48 48 48 47 47 48 47 47 47 47 47 47 47 47 47 46 46 45 45 44 44 44 44 43 42 42 42 42 43 43 43 42 42 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 39 39 39 39 40 40 40 41 41 41 41 41 42 43 43 43 43 43 43 44 44 43 43 43 42 41 41 42 43 43 42 42 43 43 42 41 42 43 43 43 43 43 43 43 42 42 42 42 43 43 43 43 42 42 41 41 41 42 41 41 40 40 40 40 41 41 40 40 40 39 38 38 38 38 38 38 37 37 36 35 35 35 35 35 35 36 37 37 37 37 38 38 38 38 37 37 37 36 35 35 36 37 38 38 38 38 37 37 37 36 35 35 36 36 36 36 36 36 37 36 35 35 35 35 33 32 32 31 30 29 29 28 27 27 28 28 29 30 30 30 30 31 32 33 32 31 32 33 32 31 30 31 32 30 27 27 27 27 27 27 27 27 27 27 27 27 28 31 32 32 30 28 29 30 30 30 31 32 32 31 29 29 29 28 27 27 27 27 29 30 31 31 32 32 32 32 32 32 31 30 30 31 32 32 33 32 31 31 31 30 31 32 33 33 31 31 30 29 29 28 27 27 27 29 31 32 32 32 32 31 31 31 32 33 33 34 34 34 33 33 33 34 35 34 34 34 35 34 34 34 33 32 30 30 30 30 32 33 34 33 34 34 35 34 34 35 34 34 33 33 32 31 31 30 30 32 33 33 32 31 31 31 31 31 30 28 28 29 31 32 33 32 32 32 31 29 30 30 29 28 27 28 29 30 31 31 30 30 31 30 29 29 28 27 27 28 29 30 30 30 31 32 33 32 31 30 30 31 30 29 29 30 30 30 32 33 31 30 29 30 31 30 29 29 31 31 29 29 29 29 29 30 31 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 61 60 59 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 57 58 58 58 57 57 58 58 57 57 57 57 57 56 56 56 56 56 56 55 55 55 54 54 55 54 54 53 53 53 53 53 53 53 53 54 54 54 54 54 54 53 53 53 53 53 54 54 54 53 53 53 53 53 53 53 52 52 52 52 52 51 51 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 48 48 47 46 46 47 48 48 48 47 47 47 47 46 46 47 47 47 47 47 46 46 45 45 45 44 44 44 44 43 43 42 42 42 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 40 41 41 41 41 41 41 42 42 42 42 43 43 44 44 43 43 43 42 41 41 42 42 42 42 42 43 42 41 41 42 43 44 43 43 42 42 42 42 42 42 42 42 43 43 43 43 42 42 42 41 41 41 41 41 40 40 41 41 41 41 40 40 40 39 39 39 39 39 38 38 37 37 36 35 35 35 35 35 35 36 36 36 37 37 37 38 38 37 37 37 36 35 36 37 37 38 38 38 38 37 37 37 37 36 35 35 35 35 35 36 36 37 36 35 35 35 35 34 34 32 31 30 30 29 29 28 27 27 27 27 28 29 30 30 30 31 31 31 31 32 33 33 32 31 32 32 31 28 27 27 27 27 27 27 27 27 27 27 27 27 29 31 32 31 28 28 30 30 31 31 32 33 31 30 29 29 28 27 27 27 29 29 30 31 32 32 32 32 32 32 31 30 30 31 32 33 33 33 32 31 30 31 31 31 32 33 33 31 30 29 29 29 28 27 27 27 28 30 31 32 32 31 30 30 32 33 33 33 33 34 34 34 33 33 34 34 33 33 34 34 34 34 34 33 32 30 30 30 31 34 34 33 33 34 34 34 34 34 35 34 34 33 32 31 31 31 30 32 33 33 33 33 32 31 30 29 30 29 28 28 29 30 31 32 31 31 31 30 29 29 30 29 28 27 27 28 30 31 31 30 30 31 30 29 28 27 27 27 28 29 29 29 29 31 32 32 31 30 30 30 30 29 29 30 31 32 32 33 33 31 31 30 29 30 29 29 30 31 30 29 28 28 29 30 31 31 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 59 59 59 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 53 53 53 53 53 53 53 53 53 53 54 54 53 53 53 53 53 53 53 53 54 53 53 53 53 53 53 53 52 52 52 52 52 51 51 51 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 51 51 51 51 51 51 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 48 47 47 46 46 47 47 47 47 47 47 47 46 46 47 47 46 46 46 46 46 45 45 44 45 44 44 43 43 43 43 42 41 42 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 40 40 40 41 41 41 41 41 42 42 43 43 43 44 43 43 43 42 41 41 41 42 42 42 43 42 42 41 41 42 43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 37 37 36 36 35 35 35 35 35 34 34 34 35 36 36 36 37 38 37 37 37 37 37 37 37 38 38 38 38 38 38 38 37 37 36 35 34 34 34 35 36 36 36 36 35 34 34 34 34 34 33 32 30 30 31 30 30 29 28 27 27 27 28 29 29 30 31 31 30 30 31 32 32 32 32 32 32 32 29 27 27 27 27 27 27 27 27 27 27 27 27 27 30 32 30 28 29 30 32 33 33 33 32 31 30 30 29 28 27 27 28 30 30 30 31 32 33 32 32 32 31 30 30 31 32 33 32 32 32 32 30 30 31 32 32 33 33 33 32 31 30 29 29 29 28 27 27 28 29 30 32 32 30 30 31 33 34 33 32 33 33 34 34 33 33 33 33 33 33 33 34 34 34 34 33 31 30 30 30 31 34 34 33 32 33 34 34 33 34 34 34 34 33 32 31 31 30 31 33 33 32 31 31 32 31 30 29 30 29 28 28 29 30 31 31 30 31 31 31 30 29 30 29 28 27 27 28 30 31 31 29 30 31 30 29 28 27 27 27 27 28 29 29 29 31 31 31 30 29 29 30 29 29 30 32 33 32 32 33 33 32 31 30 29 28 29 30 31 31 30 29 27 28 29 30 31 30 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 58 58 57 57 58 59 58 58 58 58 58 58 58 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 51 51 51 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 50 50 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 44 44 45 45 44 43 43 43 42 42 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 40 41 40 40 41 41 41 42 43 42 42 43 43 43 42 42 41 40 41 42 42 42 42 42 41 42 43 43 43 43 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 42 42 42 41 41 40 40 40 40 40 40 40 39 38 38 38 37 37 36 36 35 35 35 36 36 35 34 34 35 35 35 36 37 37 38 38 38 38 37 37 37 38 38 38 39 39 39 38 38 37 37 36 35 34 34 35 35 35 36 36 36 35 34 34 33 33 33 32 30 31 31 31 30 30 29 28 27 27 27 28 28 29 30 30 30 29 31 32 32 31 31 31 31 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 29 30 29 29 31 32 33 34 34 33 32 31 30 30 30 28 27 27 28 30 31 31 32 33 33 32 31 31 30 30 30 31 32 31 31 31 31 30 30 31 32 32 33 33 33 32 32 31 30 29 29 29 28 27 27 28 29 29 31 31 29 30 32 32 33 32 32 33 33 33 34 33 32 33 32 33 33 34 34 34 33 33 33 31 30 30 30 31 33 34 33 32 33 34 34 33 33 34 34 33 33 31 31 31 30 31 33 33 32 31 30 30 30 30 29 29 29 28 28 29 30 31 31 30 31 32 31 30 29 29 30 29 27 27 28 29 30 30 29 29 30 30 29 28 27 27 27 27 28 29 29 30 30 30 29 29 29 29 29 29 30 32 32 32 31 32 32 33 32 30 30 29 28 29 30 31 31 30 28 27 28 29 29 31 31 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 58 59 59 58 58 59 58 58 58 58 58 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 51 51 51 52 52 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 47 47 47 46 46 46 46 47 47 47 46 46 46 45 45 46 46 46 46 45 45 45 45 44 44 44 44 44 43 43 43 42 41 41 41 41 42 42 41 41 41 41 41 42 43 42 42 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 39 40 40 40 40 41 41 41 41 42 42 42 43 43 43 42 41 40 40 41 42 43 43 42 41 41 43 44 43 43 42 42 42 42 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 42 42 42 41 41 41 40 40 40 39 39 39 39 39 40 39 38 38 37 37 36 36 36 36 36 37 37 37 36 35 34 34 34 35 36 36 36 37 37 38 38 37 37 37 38 38 38 39 40 39 39 38 38 37 37 36 35 34 34 34 35 35 35 36 35 35 34 33 33 33 32 31 31 32 32 31 30 30 29 28 27 27 27 27 27 28 29 29 29 30 31 31 30 30 31 31 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 31 32 32 32 33 33 32 32 32 30 29 29 28 27 27 28 30 32 32 32 32 32 31 30 30 29 30 30 31 32 31 30 30 30 30 31 32 32 32 33 34 33 31 31 31 30 29 29 29 28 27 27 28 29 29 30 30 29 30 32 32 31 32 32 32 32 33 33 33 32 32 32 33 34 34 34 33 32 32 32 31 29 29 30 31 33 33 32 32 33 34 34 33 33 34 34 33 32 31 30 30 30 31 33 33 32 32 31 31 30 29 28 29 29 28 28 29 29 29 30 31 31 31 30 30 29 28 29 29 28 27 27 28 29 30 29 29 30 29 28 27 26 26 26 27 28 28 28 28 28 28 28 28 28 29 29 29 31 32 32 31 31 32 32 32 31 30 30 29 28 29 29 30 31 30 29 28 27 28 29 31 31 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 59 58 58 58 58 58 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 47 46 46 46 46 46 46 47 47 46 46 46 45 45 46 46 46 46 45 45 45 44 44 43 43 43 43 43 43 42 42 41 42 42 42 43 43 42 42 41 41 42 43 43 43 43 42 41 41 42 42 41 41 41 41 41 41 41 40 40 39 39 39 39 39 39 40 40 41 41 41 41 42 41 42 43 43 43 43 42 40 40 41 42 43 43 42 41 42 43 43 43 42 42 41 42 42 43 44 44 44 44 44 44 44 44 44 44 44 43 43 42 41 41 41 41 41 41 40 40 39 39 39 39 38 38 38 38 38 37 37 37 37 37 37 38 37 37 36 36 36 35 35 34 34 34 34 35 35 36 37 38 38 38 37 37 38 38 39 39 40 39 38 37 37 37 37 36 36 35 34 34 34 34 34 34 35 35 35 34 34 33 32 32 33 33 33 32 31 31 29 28 28 27 27 27 27 27 27 28 28 29 29 30 30 29 30 31 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 30 31 32 33 32 31 32 32 31 29 29 27 27 27 29 31 32 32 32 31 31 31 29 29 29 30 31 32 32 32 30 29 30 31 32 32 32 33 33 33 33 32 31 31 31 31 30 29 29 27 27 27 28 29 29 29 29 31 32 32 31 31 32 32 32 32 33 33 32 32 33 33 34 34 34 33 32 32 31 30 29 29 30 31 32 33 32 32 33 34 33 33 34 34 34 34 33 31 30 30 30 32 33 33 32 32 31 31 30 29 28 28 28 28 27 28 29 29 30 31 31 31 31 30 29 28 28 29 28 27 27 28 29 29 28 29 30 29 27 27 26 26 27 28 28 28 28 28 28 28 28 28 28 28 29 30 31 31 31 31 31 32 33 33 31 29 30 30 28 28 29 31 31 30 30 29 27 28 29 31 31 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 50 50 50 50 51 51 51 51 51 50 50 49 49 50 50 51 51 51 50 50 51 51 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 47 47 47 47 46 45 45 45 46 45 45 45 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 43 43 43 43 42 42 42 43 43 43 43 42 42 42 43 42 41 41 41 41 41 41 41 40 40 40 39 39 39 39 39 39 40 40 40 40 41 41 41 42 42 42 42 42 41 40 40 41 42 43 43 42 41 42 42 42 42 41 41 41 42 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 42 41 41 41 41 41 40 40 39 38 39 40 40 38 38 38 37 38 38 38 38 38 39 39 38 37 37 36 36 36 36 36 36 35 34 34 34 34 35 37 38 39 38 38 38 38 38 39 39 39 39 38 37 37 37 37 36 35 35 34 34 33 33 33 33 34 35 35 34 34 33 32 33 34 34 33 32 31 30 29 29 29 28 28 27 27 27 27 27 27 27 28 29 29 29 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 30 32 33 33 32 30 31 32 31 29 28 27 27 28 29 30 31 32 32 31 30 30 29 30 30 31 31 32 32 31 30 29 31 31 31 32 32 32 32 33 33 33 32 31 31 31 30 29 28 27 27 27 28 29 29 29 30 31 32 31 30 30 31 32 32 32 33 33 32 32 33 33 34 34 34 34 33 32 30 30 29 29 30 32 33 33 32 31 32 33 33 33 33 33 34 34 33 31 30 30 31 32 33 33 32 31 30 30 29 30 30 29 28 27 27 28 29 29 30 31 31 31 31 30 29 28 28 27 27 27 27 28 29 29 29 29 29 28 27 26 26 27 28 29 29 29 29 30 30 30 30 30 30 30 30 31 31 30 30 31 32 32 33 33 32 31 31 30 28 28 29 30 31 30 29 28 27 28 29 30 30 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 60 60 60 59 59 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 52 52 52 52 52 52 51 52 52 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 46 46 46 46 46 46 45 45 45 45 46 46 46 46 46 47 46 46 45 44 45 44 44 44 43 43 43 43 43 44 44 43 42 42 42 43 43 44 44 43 43 42 42 42 42 42 42 43 43 43 43 42 42 43 43 42 41 41 41 41 41 41 41 40 40 40 40 39 39 39 39 38 39 39 40 40 41 41 41 41 42 42 41 41 40 40 40 41 42 42 42 41 42 42 41 41 41 41 41 41 41 42 42 42 42 42 43 44 44 44 44 43 43 44 44 43 43 42 42 41 40 40 39 39 39 40 41 40 39 38 39 39 39 39 39 39 39 39 39 39 37 37 38 37 38 38 37 37 37 36 35 35 34 34 35 36 38 39 39 38 37 37 38 38 38 39 40 39 37 37 37 37 36 35 35 34 34 34 34 33 33 33 34 34 34 34 34 33 34 35 34 33 32 31 30 29 29 30 30 29 28 28 28 28 27 27 27 27 27 27 28 28 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 32 33 34 32 30 31 32 31 30 29 27 27 28 29 30 31 32 32 31 29 29 29 30 31 31 31 32 31 30 30 29 30 30 31 31 31 31 32 33 34 33 32 31 30 29 29 29 28 27 27 27 27 28 28 29 31 31 31 30 30 30 31 33 33 33 33 33 32 32 33 34 33 34 34 34 33 32 31 30 29 29 30 32 33 33 32 32 33 33 34 33 33 33 34 34 32 30 30 30 31 33 34 33 33 32 32 31 31 31 31 29 28 27 27 28 28 29 30 30 30 30 31 31 30 29 29 28 28 27 27 27 28 29 29 29 28 27 27 26 26 27 27 29 29 29 30 31 31 31 31 31 31 31 31 31 31 30 30 31 32 33 32 32 32 32 31 31 29 28 28 28 29 30 29 28 27 28 29 30 29 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 63 63 63 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 57 57 57 57 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 52 51 51 52 52 53 53 53 52 52 52 52 52 52 52 52 51 51 52 52 52 51 51 51 50 50 50 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 45 45 46 46 46 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 45 45 44 44 44 43 43 43 43 43 44 44 44 44 43 42 42 43 44 44 44 43 43 42 42 42 42 42 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 39 39 39 39 38 38 38 39 40 40 40 41 41 41 41 41 41 40 40 40 42 42 42 41 41 41 41 41 41 42 42 42 42 42 42 42 42 43 43 43 44 43 43 43 43 43 44 44 43 43 42 41 41 40 40 39 39 41 41 41 40 39 39 40 40 40 40 40 40 40 39 38 38 38 38 39 38 39 38 38 37 37 36 36 35 34 34 34 36 37 39 39 38 37 37 37 38 38 39 39 39 38 38 38 37 36 36 35 34 34 34 34 34 33 32 33 33 33 34 34 34 34 34 34 33 33 31 29 30 31 31 30 29 29 29 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 30 33 33 31 30 31 32 32 31 29 28 27 27 28 29 30 31 32 31 29 29 30 31 31 31 31 32 31 30 29 29 29 30 31 31 31 32 32 33 34 33 32 32 31 29 29 29 28 27 27 27 27 28 29 30 31 30 30 30 31 32 32 33 34 34 34 34 33 32 33 33 33 33 33 34 33 32 31 30 29 29 31 32 33 33 32 32 33 33 34 33 32 33 33 33 32 30 30 30 31 33 33 33 33 33 32 32 31 31 31 29 29 27 27 28 28 28 29 30 30 30 31 31 31 30 30 29 29 28 27 27 28 28 28 29 28 27 26 26 26 27 28 29 29 29 30 31 31 31 31 30 30 30 30 30 30 29 30 32 32 33 32 31 31 31 31 31 30 28 27 28 29 30 29 27 27 28 30 30 29 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 57 57 58 58 58 57 57 57 57 56 56 56 56 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 52 52 51 50 51 52 53 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 51 50 50 49 49 49 49 49 49 49 49 50 50 50 50 49 49 50 50 50 50 49 49 49 49 48 48 48 49 49 49 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 45 45 46 46 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 44 44 45 45 45 45 45 45 45 45 44 43 42 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 39 39 39 38 38 38 39 40 40 40 41 41 41 41 40 40 40 41 42 42 41 40 40 40 40 41 42 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 44 44 44 43 43 42 41 40 40 40 40 40 41 42 41 40 39 39 41 41 41 41 41 41 40 38 38 39 38 39 40 40 40 38 38 38 37 37 36 36 34 34 35 36 37 38 38 38 38 37 37 37 38 38 39 39 39 39 38 37 36 36 35 35 34 33 33 33 32 32 32 32 32 33 33 34 34 34 34 34 32 31 30 30 32 31 30 30 29 29 31 31 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 31 31 30 30 32 33 32 30 29 28 27 27 27 29 30 31 32 31 29 29 30 30 29 31 31 31 30 30 29 29 30 31 31 32 32 33 32 32 33 32 32 32 31 30 30 29 28 27 27 27 28 29 30 30 29 29 29 30 31 32 32 33 33 34 34 34 33 32 32 32 32 32 33 33 33 32 31 30 29 29 30 31 33 33 31 31 32 33 33 32 33 33 33 33 33 31 30 30 31 33 33 32 33 31 31 31 30 30 30 30 29 28 27 27 27 28 29 30 30 29 30 31 31 31 30 29 29 28 27 27 27 28 28 29 28 27 26 26 26 27 28 28 29 29 29 30 30 30 30 29 29 30 30 30 30 30 31 32 32 32 32 31 31 31 30 30 30 29 27 27 29 30 28 27 27 29 30 30 29 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 60 60 60 60 60 59 59 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 57 57 56 56 55 55 54 54 54 54 54 55 55 54 54 54 54 54 54 54 53 53 53 52 52 52 51 50 50 51 52 52 51 51 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 48 49 49 49 49 49 49 49 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 46 46 46 46 45 45 45 45 46 46 45 45 45 46 46 46 46 45 45 45 45 46 46 46 45 45 45 45 44 43 43 43 44 44 44 43 43 43 44 43 43 43 43 44 44 43 43 43 43 43 42 42 42 42 42 41 41 41 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 39 39 40 40 40 40 41 40 39 40 41 41 41 40 40 40 41 41 42 42 43 43 44 44 44 44 43 43 43 42 42 43 43 43 43 44 44 44 44 43 43 42 41 41 40 41 41 41 41 41 41 40 39 40 41 42 41 41 41 41 40 39 39 39 39 40 40 40 39 38 38 38 38 37 36 36 35 34 34 35 36 37 38 38 38 37 36 36 37 37 38 38 38 38 38 37 37 37 36 35 34 33 34 33 33 33 33 32 32 32 33 34 34 34 34 33 32 30 30 31 32 32 31 30 29 30 31 31 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 27 27 27 27 27 27 27 27 29 31 30 30 31 32 31 29 29 28 27 27 28 29 30 31 33 31 29 29 29 29 30 31 31 30 30 29 29 30 31 32 32 32 32 32 32 32 32 32 32 31 31 30 29 29 28 27 27 27 28 29 29 29 29 29 30 31 31 32 32 33 33 33 34 34 33 32 31 32 32 32 33 33 33 33 31 30 29 29 29 31 32 32 31 31 33 34 33 32 33 34 33 32 31 30 30 30 31 32 32 32 32 31 30 30 29 29 29 29 29 28 27 27 27 28 29 29 29 29 30 30 30 30 29 29 29 28 27 27 27 27 28 29 28 27 26 26 27 27 28 28 29 29 29 29 28 28 28 29 29 31 31 31 32 31 31 32 31 31 31 30 31 31 30 29 29 28 27 27 29 29 28 27 27 28 29 29 28 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 58 57 57 57 57 57 57 57 57 56 56 55 55 55 55 55 54 54 55 54 54 54 54 54 54 54 54 53 53 53 52 52 52 52 51 50 50 51 51 50 51 51 52 52 52 52 52 52 51 51 51 51 51 51 50 50 50 50 50 50 50 51 50 50 51 50 50 49 49 48 48 48 48 49 49 49 49 49 49 49 49 49 48 47 47 47 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 47 47 47 46 46 46 46 45 45 45 45 46 46 46 46 45 45 45 45 45 46 45 45 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 43 43 44 44 44 44 44 44 44 44 44 43 43 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 40 40 40 39 39 38 38 38 38 38 39 39 40 40 40 40 39 40 41 41 40 40 40 41 42 43 43 43 43 43 43 43 43 43 43 42 42 42 43 44 44 44 44 44 44 44 44 44 43 42 41 41 41 41 42 43 42 42 41 40 40 40 41 41 41 40 40 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 37 36 35 34 33 34 35 36 37 38 38 37 37 36 36 36 37 37 37 37 37 37 37 37 36 34 34 34 35 35 34 34 34 33 32 32 32 33 34 33 33 33 32 31 31 32 32 32 31 30 30 31 32 32 31 30 29 29 28 28 28 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 27 27 27 27 27 27 27 27 29 30 30 30 31 32 31 29 28 27 26 27 28 29 31 32 33 30 28 29 30 30 31 31 31 30 29 29 29 31 31 31 32 33 33 32 31 31 32 32 31 30 30 29 29 29 28 27 27 27 28 29 29 29 29 29 31 32 32 32 32 32 32 32 33 34 33 32 31 32 32 33 33 34 34 33 32 30 29 29 29 30 31 30 30 31 33 33 32 33 33 33 32 31 30 30 29 30 31 32 31 31 32 32 31 31 30 29 29 28 28 28 27 27 27 28 29 29 28 29 29 29 30 29 29 29 29 28 27 27 27 27 28 29 27 26 26 26 27 28 28 28 28 28 28 28 28 28 29 30 30 32 31 31 31 31 31 31 30 30 30 30 31 31 30 30 30 28 27 27 29 29 28 27 27 27 29 28 27 65 65 65 65 65 65 64 64 65 65 65 65 65 65 65 65 65 65 65 64 64 64 64 64 64 64 63 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 60 61 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 57 57 58 58 57 57 57 56 56 56 55 55 55 55 55 55 55 55 54 54 55 54 54 54 54 54 53 53 53 53 53 53 52 52 51 51 50 50 49 50 51 51 51 51 52 52 52 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 48 48 47 47 48 48 48 47 47 47 47 47 48 48 48 48 48 48 48 48 48 47 47 47 46 46 47 47 47 46 46 46 45 45 45 45 45 46 46 46 46 45 45 45 45 45 46 45 45 45 45 45 46 46 46 45 45 45 45 45 44 45 45 44 44 43 43 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 38 38 39 39 39 40 39 39 39 40 40 40 40 41 42 42 42 43 43 43 43 43 42 42 42 42 42 41 42 43 43 43 43 43 43 43 43 43 44 43 42 42 42 41 42 43 43 43 43 42 41 40 41 41 41 41 40 40 41 41 41 40 40 40 40 40 39 39 38 37 38 38 38 38 37 36 35 33 33 34 36 36 37 37 37 38 37 35 35 36 36 36 36 36 37 37 37 36 35 34 35 35 35 35 34 34 34 33 32 31 32 33 33 33 33 33 32 32 32 32 33 32 31 30 31 32 32 31 29 29 29 29 29 29 28 28 29 27 27 28 27 27 27 27 26 26 26 26 26 26 27 26 26 26 27 27 27 28 29 31 31 32 32 31 29 28 26 26 28 29 29 31 32 31 29 28 29 30 31 31 30 30 30 29 29 29 31 31 30 32 32 32 32 31 31 32 32 31 30 30 30 29 29 28 27 27 27 27 28 29 29 30 30 31 32 32 32 31 31 32 32 32 33 33 32 31 32 33 33 33 33 33 32 32 31 29 29 29 30 30 30 31 32 33 33 32 33 33 32 32 31 30 29 29 30 32 32 31 30 31 32 32 32 32 30 30 29 28 28 28 27 27 27 28 28 28 29 29 30 30 29 28 28 28 28 27 27 27 28 29 28 27 26 26 26 26 27 27 27 27 28 28 29 29 30 31 30 30 31 31 30 30 30 31 31 30 29 29 30 30 30 29 30 29 28 28 27 28 28 27 27 26 27 28 27 27 65 65 65 65 65 65 64 64 64 64 64 64 64 65 65 65 65 65 65 64 64 64 64 63 63 64 63 62 62 62 62 62 62 62 61 61 61 61 61 61 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 60 60 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 59 59 58 57 58 58 58 58 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 54 53 53 52 52 52 51 51 50 49 50 50 51 51 52 52 52 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 49 50 50 50 50 50 50 49 48 48 48 48 48 48 48 48 48 48 48 47 47 46 46 47 47 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 45 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 44 44 45 45 46 45 45 44 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 40 40 40 40 40 40 39 39 39 39 39 38 38 38 39 39 39 39 39 38 39 40 39 39 40 40 41 42 42 42 43 43 43 43 42 42 42 42 42 42 43 43 43 42 42 43 43 43 43 43 44 43 43 43 43 43 42 43 43 43 43 42 42 42 42 42 42 42 41 40 40 40 41 41 40 39 38 39 38 37 37 37 37 37 37 37 37 37 36 34 33 33 35 35 35 36 37 38 37 36 35 35 35 35 35 36 36 37 37 37 36 36 36 36 35 35 34 34 33 32 32 31 31 32 33 32 32 33 32 32 32 33 33 33 32 31 32 32 31 30 30 30 29 30 30 29 28 29 30 29 29 29 28 28 29 28 26 26 26 26 26 26 26 26 26 26 27 27 26 27 29 31 31 31 32 31 30 28 26 26 28 29 30 32 32 30 28 28 29 30 30 30 29 29 29 29 29 29 30 30 30 31 31 30 31 31 32 33 33 32 32 31 30 29 29 27 27 27 27 28 29 29 30 31 32 32 32 31 31 30 30 31 31 32 33 33 33 32 31 32 33 33 33 33 31 31 31 29 29 29 30 30 31 33 33 33 33 32 33 33 32 31 30 29 29 30 31 32 32 32 31 31 32 32 32 32 31 31 30 30 29 29 28 27 27 26 26 28 29 29 30 30 29 28 27 27 27 27 27 27 28 28 27 27 26 26 26 27 27 28 28 29 29 29 29 29 30 30 30 31 31 32 31 30 30 30 31 31 29 29 29 30 29 29 29 29 28 28 26 27 27 26 27 27 26 27 27 28 65 65 65 65 65 65 64 64 64 64 64 64 64 64 65 65 65 65 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 61 61 61 61 61 61 61 61 61 61 61 61 60 60 61 60 60 60 60 60 60 59 59 59 59 59 58 58 58 58 58 58 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 52 52 52 51 51 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 47 47 47 46 46 47 47 47 47 48 48 48 48 47 47 47 47 47 46 46 47 47 46 46 45 45 45 46 46 46 46 46 46 46 46 46 46 45 45 44 45 44 44 44 44 45 46 45 44 44 45 45 45 45 45 45 45 44 44 44 44 45 45 45 45 44 44 43 43 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 40 41 41 40 40 40 39 39 39 39 39 39 40 39 38 38 38 38 38 38 38 39 39 40 39 39 39 40 40 41 41 42 42 42 42 42 42 41 41 42 42 43 42 42 42 43 43 43 43 43 44 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 41 41 40 40 41 41 40 39 38 38 38 37 37 37 37 37 36 36 36 37 36 34 33 32 33 34 34 35 35 37 37 37 36 36 35 34 35 35 35 36 37 36 36 37 36 36 35 35 34 34 33 33 32 31 31 32 33 32 32 32 32 32 33 33 33 33 33 33 33 33 32 31 31 31 29 30 31 29 29 30 30 30 30 29 29 30 31 29 27 28 27 26 26 26 26 26 26 26 26 26 26 26 27 30 31 30 31 31 30 28 26 26 27 29 30 32 33 32 29 28 29 30 30 29 28 28 28 29 29 29 29 30 31 31 30 30 30 31 32 32 33 33 31 30 30 29 28 27 27 27 27 28 29 29 30 32 32 32 31 30 30 30 31 31 32 32 33 33 34 32 31 32 33 33 33 33 31 31 30 30 29 29 30 31 32 33 33 33 32 32 32 33 32 31 30 29 29 30 32 32 31 31 30 30 31 31 32 31 31 31 31 30 30 29 28 27 27 26 26 28 29 29 29 30 30 29 28 28 27 26 26 27 28 28 27 26 26 26 26 27 28 28 29 29 28 28 29 29 30 30 31 32 32 31 30 29 29 29 30 30 30 29 29 29 29 29 30 29 29 28 27 26 26 27 27 27 26 27 29 29 65 65 65 65 65 65 64 64 64 64 64 64 64 64 65 64 64 64 64 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 60 60 61 61 61 61 61 61 60 60 60 60 61 60 60 60 60 60 60 60 60 60 59 59 59 60 59 59 59 59 59 59 59 58 58 58 57 57 58 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 52 52 52 51 51 51 51 50 49 49 50 51 51 51 51 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 47 46 46 47 47 47 47 48 48 47 47 47 47 46 46 46 46 46 46 46 45 44 45 46 45 45 46 46 46 46 46 46 46 46 45 44 44 44 44 44 44 45 45 45 44 44 45 45 45 45 45 46 45 45 44 44 45 44 44 44 44 44 44 44 43 42 42 42 42 42 42 42 43 42 42 43 43 43 43 43 43 43 42 41 41 40 40 41 41 41 40 40 40 39 39 40 40 40 40 39 39 38 38 38 38 38 39 40 40 40 39 38 39 39 40 40 41 41 41 41 42 41 41 41 42 42 42 42 41 41 42 43 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 43 43 43 43 43 42 42 42 42 41 41 39 39 40 40 40 40 39 39 39 38 38 38 37 37 37 36 35 36 36 35 34 33 32 33 33 34 34 36 37 37 37 36 35 35 34 34 35 36 36 35 36 37 37 36 35 35 34 34 34 34 32 31 31 31 31 32 32 32 32 32 32 32 32 33 33 33 34 33 32 32 32 31 30 31 31 30 29 30 31 31 30 29 29 30 31 30 28 30 31 29 27 26 26 26 26 26 26 26 26 26 26 27 29 29 30 30 29 28 26 26 27 28 29 31 33 33 29 28 29 30 29 28 28 28 29 29 29 30 30 31 30 30 30 31 32 32 32 32 33 32 30 30 29 29 28 28 27 27 27 27 28 29 30 31 32 31 30 29 30 31 32 32 33 33 33 34 33 32 31 31 32 33 34 33 32 31 30 30 29 29 29 31 33 33 33 32 31 31 32 32 32 31 29 29 29 31 32 31 30 30 30 29 30 31 32 31 30 30 31 31 30 30 29 28 27 26 26 27 28 29 29 30 30 29 29 28 27 26 26 26 28 28 27 26 26 26 26 27 27 27 28 28 28 29 29 30 30 30 30 31 31 30 30 29 29 29 30 30 30 30 29 28 28 29 30 29 29 29 28 26 26 27 27 26 26 28 29 30 65 65 65 65 65 65 64 64 64 64 64 63 63 64 64 64 64 64 64 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 62 61 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 57 57 57 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 52 52 52 52 51 51 51 50 49 49 49 50 50 50 50 51 51 51 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 47 47 47 47 47 47 47 46 46 46 45 45 46 46 45 45 45 45 45 45 46 46 46 46 46 46 45 45 46 45 44 43 44 44 44 44 44 44 43 44 45 45 45 45 45 46 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 42 43 43 42 42 42 42 43 43 43 42 42 42 42 41 40 40 41 41 41 42 41 40 41 40 40 41 40 40 40 40 40 39 38 38 38 38 39 40 40 40 39 38 38 39 39 40 40 40 41 41 41 41 41 41 42 41 41 41 42 43 43 44 44 44 45 45 45 44 44 44 44 44 44 43 44 44 43 43 43 43 43 43 42 42 41 41 41 40 40 40 39 39 39 40 40 39 38 38 38 37 37 37 37 36 35 35 35 35 34 33 32 32 32 34 35 36 37 37 37 36 36 35 34 33 34 35 35 35 36 36 37 36 35 35 34 34 34 34 33 32 31 31 31 31 31 31 31 31 31 32 32 32 32 33 34 33 33 33 32 31 32 32 32 30 30 31 32 31 29 29 29 30 31 30 30 30 32 32 29 26 26 26 26 26 26 26 26 26 26 26 27 28 29 30 29 27 26 26 27 29 30 31 32 31 29 27 28 29 28 27 28 29 29 30 30 31 32 31 29 29 30 31 32 32 31 31 32 32 31 30 29 29 29 29 28 27 26 26 28 29 30 31 31 31 29 30 31 31 31 32 32 33 33 33 33 32 31 31 33 33 33 34 33 32 31 30 29 29 30 31 33 33 34 32 31 31 32 31 31 30 29 29 29 31 31 30 30 30 29 29 29 30 31 31 30 30 31 31 30 30 29 28 27 27 26 26 27 28 29 29 30 29 29 28 28 27 26 26 27 28 28 27 26 26 26 27 27 27 28 29 29 29 29 29 30 30 30 31 30 30 29 29 29 29 30 30 29 29 30 29 28 29 30 30 29 28 27 27 26 26 26 26 27 28 29 29 65 65 65 65 65 65 65 64 64 64 64 63 63 64 64 64 64 64 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 61 61 60 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 57 57 56 56 56 56 56 56 56 56 55 55 56 55 55 55 55 55 55 55 55 54 54 54 54 54 53 53 53 53 52 52 52 52 51 51 51 51 51 51 51 50 49 49 49 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 46 46 47 47 47 47 47 46 46 45 45 45 45 45 45 45 44 44 44 44 44 45 46 46 46 46 46 45 45 45 45 44 43 43 43 44 44 44 44 43 43 44 44 44 45 46 45 44 44 44 44 43 43 44 44 44 44 44 44 43 43 43 42 42 42 42 42 41 41 41 41 42 42 42 42 41 41 41 41 40 41 42 42 42 42 42 41 41 42 42 41 41 41 41 40 40 39 39 39 38 38 39 39 39 39 39 38 38 38 39 39 39 40 40 40 40 40 40 41 41 41 41 42 43 44 44 44 45 45 45 46 45 44 44 44 44 44 44 43 43 43 43 42 42 42 42 41 41 41 40 40 40 40 41 40 40 39 38 39 39 39 38 37 37 36 37 37 36 36 36 35 34 33 33 33 33 32 32 33 35 35 36 37 37 37 37 35 34 34 33 33 34 35 35 36 36 37 36 35 35 34 34 34 33 33 32 32 31 31 30 30 30 30 30 31 31 32 32 33 33 33 34 33 32 31 32 33 32 31 30 31 32 31 30 29 30 31 32 30 30 31 32 32 30 28 26 26 26 26 26 26 26 26 26 26 26 26 27 28 27 26 27 28 28 29 30 32 32 31 29 27 27 28 28 28 29 30 31 30 31 31 31 30 29 30 31 31 31 31 30 32 33 32 31 31 31 30 29 29 28 27 26 26 28 29 30 30 30 30 29 30 31 31 31 31 31 33 33 33 33 32 31 31 32 33 33 34 33 32 31 30 29 29 30 31 33 34 33 31 31 32 32 31 30 30 29 29 30 31 31 30 30 30 30 29 29 29 30 30 29 29 30 30 29 29 29 29 28 27 26 26 26 28 29 29 30 30 29 29 28 27 26 26 27 28 28 27 26 26 26 26 27 28 29 29 28 28 29 29 30 30 30 31 30 29 29 29 29 29 29 29 29 29 29 28 29 30 30 29 29 27 27 26 26 26 26 27 28 29 29 29 65 65 65 65 65 65 65 64 64 64 63 63 63 64 63 63 63 63 63 63 63 63 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 61 61 61 61 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 57 57 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 54 54 54 54 53 53 53 53 52 52 51 51 51 51 51 52 52 52 52 52 51 51 50 49 49 49 50 50 50 51 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 44 44 43 43 43 44 45 45 45 45 45 45 45 45 45 45 45 45 43 43 43 43 43 43 43 43 43 43 44 45 46 45 44 44 44 44 43 43 43 44 43 43 43 43 43 42 42 42 41 41 41 41 41 42 41 41 41 41 41 41 40 41 41 40 41 42 42 43 43 43 42 42 42 43 43 42 41 41 41 40 40 40 40 40 39 39 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 40 40 41 42 42 43 43 44 44 44 45 45 45 46 46 45 45 45 44 43 43 43 43 43 42 42 42 42 42 42 41 41 40 40 40 41 41 40 40 40 39 38 38 39 39 38 37 37 37 37 37 37 37 36 36 35 34 34 33 32 32 33 34 34 35 36 37 37 37 36 35 34 33 32 33 34 34 35 36 37 36 36 35 34 34 34 33 33 33 33 32 32 31 31 31 30 30 30 30 31 31 31 32 33 34 33 32 32 33 33 32 31 31 32 32 31 30 30 31 32 32 30 30 30 32 33 32 30 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 30 30 31 33 31 27 27 27 28 29 29 29 31 31 30 30 31 30 29 29 31 32 31 30 31 31 33 33 32 32 32 31 30 29 29 29 27 26 26 28 29 29 29 29 29 29 30 30 30 31 32 32 32 32 33 33 32 31 30 32 32 33 34 33 31 30 29 29 29 31 32 32 33 32 31 31 33 32 31 30 30 29 29 30 31 32 31 31 30 30 30 29 29 29 30 29 29 30 30 29 29 30 29 29 28 27 26 26 27 28 28 29 30 29 28 28 27 26 26 26 28 28 26 26 26 26 26 27 28 28 28 27 28 29 29 30 30 29 30 30 29 29 28 29 29 30 29 29 29 28 28 29 29 30 29 29 27 26 26 26 26 27 28 29 29 29 29 65 65 65 65 65 65 65 65 64 64 63 63 63 64 63 63 63 63 62 62 62 62 62 62 62 62 61 61 62 62 62 62 62 62 62 61 61 61 61 61 61 61 62 62 61 61 61 61 61 61 61 61 60 60 60 60 60 59 58 58 58 59 59 59 59 58 58 59 59 58 58 58 58 58 58 58 59 59 59 59 58 58 57 57 57 57 57 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 51 51 51 51 52 52 52 52 52 52 52 52 51 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 48 48 48 48 48 48 48 48 48 47 47 46 46 46 45 45 45 45 45 46 46 46 45 45 45 45 45 44 43 43 43 43 43 43 44 44 43 43 44 45 44 44 45 44 43 43 43 42 42 42 42 42 43 45 46 46 46 45 45 44 44 44 43 44 44 43 43 43 43 42 42 42 42 41 41 42 42 42 43 42 41 41 41 41 41 41 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 38 39 39 40 40 40 40 42 43 43 43 43 44 44 45 45 45 45 46 46 46 45 45 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 41 42 42 42 41 41 40 40 39 38 39 40 39 38 38 38 37 37 38 38 37 37 37 36 35 34 32 32 32 33 34 35 35 37 37 37 36 36 35 34 33 32 33 34 34 35 36 36 35 35 35 34 34 33 33 33 33 32 32 32 32 32 31 30 30 30 30 30 31 32 33 34 33 32 33 34 33 33 32 32 33 32 31 30 31 32 32 31 30 30 31 32 33 33 32 30 30 31 30 27 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 30 30 31 29 27 27 28 29 29 30 31 31 31 30 30 31 30 29 30 31 31 30 29 31 32 32 32 32 33 32 30 29 29 29 29 28 26 26 27 28 29 29 29 28 29 29 29 30 31 32 33 31 31 32 32 32 31 30 32 32 32 33 33 31 30 29 29 30 31 31 31 32 32 31 31 32 31 30 29 29 29 29 31 32 32 32 31 30 30 29 29 29 29 30 29 29 29 29 29 29 29 30 29 29 28 26 26 26 26 28 29 29 29 28 27 27 26 26 26 27 27 26 26 26 26 26 27 27 27 28 28 29 29 30 31 30 29 30 29 29 28 29 30 30 30 30 29 29 28 28 29 29 29 29 28 27 26 25 25 26 28 29 29 29 29 28 65 65 65 65 65 65 65 65 64 64 63 63 63 64 63 63 63 62 62 62 62 62 62 61 61 61 61 61 61 62 62 61 61 62 62 61 60 60 60 61 61 61 61 61 61 61 60 60 60 60 60 60 60 59 60 60 60 59 59 58 58 58 58 58 58 58 58 58 58 58 57 57 57 58 58 58 58 58 59 59 58 58 58 58 58 58 58 57 56 56 56 56 56 56 56 56 56 56 55 55 55 55 54 54 54 54 54 54 53 53 53 52 52 52 52 51 51 52 52 52 52 52 51 51 52 51 50 49 49 48 48 49 49 49 49 49 50 50 49 49 50 49 49 48 48 48 48 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 45 45 45 46 46 47 47 47 46 46 46 46 46 45 45 44 43 43 43 43 43 43 43 43 43 44 44 43 44 44 44 43 43 42 42 41 41 42 43 44 45 46 46 46 46 45 44 44 44 44 44 43 43 43 43 43 42 42 42 42 42 42 43 43 43 42 41 42 42 42 42 42 42 43 43 42 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 39 38 38 38 38 38 38 39 40 40 41 40 41 42 42 42 42 43 43 44 44 44 45 45 46 46 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 42 42 42 42 41 40 40 40 39 38 39 39 39 38 38 38 38 39 39 38 37 37 37 36 34 33 32 32 32 33 34 35 36 37 36 36 35 35 35 34 32 32 33 34 35 36 35 35 35 35 34 34 34 34 33 33 32 32 31 31 31 31 31 31 30 30 30 31 31 32 33 33 33 34 34 34 34 33 33 33 33 32 32 32 32 32 31 30 30 31 33 33 34 34 33 33 35 34 30 27 26 26 26 26 26 26 26 26 26 27 28 30 31 31 31 30 29 28 27 28 29 29 30 31 31 31 30 30 30 30 29 29 29 30 31 30 30 31 31 31 31 32 32 31 31 31 30 29 29 28 27 27 27 27 29 29 28 28 29 29 30 31 31 32 32 30 31 32 32 32 31 30 31 32 32 33 33 31 30 29 29 30 31 31 32 33 32 31 31 31 30 29 29 29 29 30 32 32 32 32 32 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 29 28 27 26 26 26 27 28 27 27 27 27 27 26 26 26 26 27 26 25 25 26 26 26 26 27 29 29 29 30 31 31 30 29 29 29 28 28 29 29 29 30 29 29 28 27 28 29 29 28 28 27 27 26 25 26 27 28 28 28 28 27 27 65 65 65 65 65 65 65 64 64 64 63 63 63 63 63 63 62 62 62 62 62 62 62 61 61 60 60 61 61 62 62 61 61 61 61 60 60 60 60 60 60 60 61 61 61 61 60 60 60 60 60 60 60 59 59 60 60 60 59 57 57 58 58 58 58 57 57 58 58 57 57 57 57 58 57 57 57 58 58 58 58 58 58 57 57 57 58 57 57 57 56 56 56 56 56 56 56 56 55 55 55 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 52 52 52 51 51 50 50 51 50 50 50 49 49 49 49 48 48 48 48 49 49 49 49 49 48 48 48 47 47 47 48 48 48 48 48 48 48 49 49 48 48 48 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 47 47 47 47 47 46 46 46 45 45 45 45 44 44 44 44 44 44 44 45 44 43 43 43 42 42 42 43 42 42 42 43 42 42 42 42 44 45 46 46 46 46 45 44 44 44 43 43 43 44 44 44 43 42 42 42 43 43 43 43 43 43 42 42 43 43 42 42 42 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 39 39 40 41 40 40 41 41 41 42 42 42 43 44 44 44 45 45 45 45 44 44 43 44 44 44 44 44 44 43 43 44 43 43 43 43 43 43 42 41 40 41 41 41 40 40 40 39 38 38 38 39 39 38 39 40 39 38 37 37 37 36 36 35 34 34 32 31 32 33 34 35 36 36 35 34 34 34 34 33 32 33 34 35 35 35 35 35 35 34 34 34 34 34 33 32 32 32 31 30 31 31 31 31 30 29 29 30 31 32 32 33 34 34 33 33 33 34 34 34 33 33 33 33 33 32 31 31 32 33 34 35 34 33 33 33 33 31 28 26 26 26 26 26 26 26 26 26 26 26 28 30 30 31 30 29 28 27 28 29 29 30 31 31 30 30 29 29 30 29 28 29 30 30 29 30 31 31 30 31 32 32 30 30 31 31 29 29 28 27 27 26 28 29 28 27 28 29 29 31 32 31 30 30 30 31 32 32 32 31 30 30 31 32 33 32 31 29 29 29 31 32 33 33 32 31 30 31 31 29 29 29 29 30 31 33 32 31 31 31 30 29 29 29 29 29 28 28 29 28 28 29 28 28 29 29 29 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 26 26 27 28 28 29 29 29 29 30 30 29 28 28 28 27 28 29 29 29 30 29 29 28 27 28 29 28 27 27 26 26 26 26 27 27 27 27 27 27 27 27 65 65 65 65 65 65 65 64 64 64 63 62 63 63 62 62 62 62 62 62 62 62 61 61 60 60 60 60 61 61 61 61 60 60 61 60 60 60 60 60 60 60 60 61 61 61 60 60 60 60 60 60 59 59 59 59 59 59 59 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 57 57 57 57 57 57 57 58 57 57 57 56 57 57 56 56 56 55 55 55 55 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 52 51 51 51 51 50 50 51 51 50 50 50 50 50 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 47 47 48 48 48 49 49 49 48 48 48 48 48 48 48 48 47 47 46 46 46 46 46 47 47 47 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 44 44 44 44 43 43 43 42 41 41 41 41 41 41 42 42 42 41 42 44 45 46 46 46 46 45 45 44 44 43 43 44 44 44 44 43 42 42 42 43 43 43 44 44 43 43 43 43 43 42 42 42 43 42 42 43 44 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 39 39 40 40 40 40 40 41 41 41 42 43 43 43 43 44 44 45 44 44 44 44 44 43 43 44 43 43 43 43 42 42 42 42 42 43 44 43 42 41 40 40 40 40 40 40 40 40 39 38 38 39 40 39 40 40 38 37 37 37 36 35 35 35 34 34 32 31 31 33 34 35 36 36 35 34 34 34 34 33 32 33 34 34 34 34 35 35 35 35 35 35 35 34 33 32 32 32 32 31 30 30 30 30 30 29 29 29 30 31 32 33 34 34 33 32 33 34 34 34 34 33 33 33 33 33 32 32 33 34 34 34 34 33 32 32 32 31 29 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 30 29 28 27 28 29 29 30 31 31 30 29 29 29 29 28 29 30 29 29 29 30 30 30 31 32 32 31 30 30 30 31 30 30 29 28 26 26 27 28 28 27 28 29 30 31 32 31 29 29 30 31 32 33 33 32 30 30 31 32 32 31 30 29 29 29 30 32 33 33 32 31 30 31 31 29 29 29 30 31 32 33 32 30 30 30 30 29 29 30 30 29 28 28 28 27 27 28 27 27 28 28 29 29 28 27 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 26 26 27 28 28 28 28 28 29 29 30 29 28 28 27 27 28 29 30 29 29 29 28 28 28 28 29 28 27 26 26 25 25 26 27 27 27 27 27 26 27 27 65 65 65 64 64 64 65 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 61 60 60 60 60 60 60 60 60 61 60 60 60 60 60 60 60 60 60 60 60 61 61 60 60 59 59 59 60 60 59 58 58 58 59 59 59 58 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 57 57 57 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 53 53 53 52 52 51 51 51 51 51 51 51 51 52 52 52 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 47 47 47 48 48 47 47 47 46 46 46 46 46 47 47 48 47 47 47 46 46 46 47 47 47 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 47 47 46 46 46 46 45 45 45 45 44 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 43 45 45 45 45 45 45 45 44 44 43 43 44 45 44 44 43 43 43 43 43 43 43 44 44 44 43 43 43 43 43 43 43 43 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 40 40 39 38 37 37 38 38 38 39 39 39 39 39 40 42 42 42 42 42 42 43 43 44 44 44 43 44 44 44 44 43 42 43 43 43 43 43 42 42 42 42 43 44 44 43 42 41 41 40 40 39 39 39 39 39 38 37 37 38 40 40 40 40 38 37 37 37 36 35 34 34 34 34 32 31 31 33 34 34 35 35 35 34 34 34 34 33 32 32 33 33 33 34 35 35 35 35 34 34 35 34 33 32 32 32 31 31 30 30 30 30 29 29 29 29 29 30 31 32 33 34 33 32 32 33 33 33 33 32 32 33 34 33 34 34 34 34 34 34 33 32 31 31 31 30 29 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 28 27 28 29 29 30 31 31 29 29 29 29 28 28 29 29 29 29 29 29 30 30 32 32 32 31 30 29 29 30 30 30 29 27 26 26 27 28 28 28 29 29 30 30 31 30 29 29 30 31 31 32 33 32 31 30 31 32 32 31 30 29 29 29 30 32 33 32 32 30 30 31 30 29 29 30 31 32 33 32 31 31 31 30 30 31 31 31 30 29 29 29 28 28 28 28 27 27 27 27 28 28 27 27 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 26 26 26 27 28 28 28 28 29 29 29 29 28 27 27 28 29 29 29 29 29 29 27 27 28 29 29 29 28 27 26 25 25 26 26 26 27 27 26 26 27 28 64 64 64 64 64 64 64 64 64 63 63 62 62 62 62 62 62 62 62 61 61 61 61 60 59 59 59 59 60 60 60 60 60 59 60 60 60 59 59 60 60 60 60 61 61 60 59 59 59 59 59 59 59 58 57 58 58 58 59 59 59 58 58 57 57 57 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 57 57 57 56 56 55 55 55 55 55 54 54 54 54 54 53 53 53 53 52 52 52 51 51 51 51 51 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 49 49 49 48 48 48 48 49 49 49 49 49 49 49 48 47 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 46 47 47 47 48 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 44 43 42 43 43 43 44 43 42 42 43 42 42 42 42 42 42 42 42 41 41 41 42 44 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 43 43 43 43 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 40 39 38 37 37 38 38 38 38 39 39 39 40 40 41 42 42 42 42 43 43 44 44 44 43 43 44 44 43 43 43 42 42 42 43 43 42 41 42 42 42 43 44 44 43 42 41 42 41 41 40 39 39 39 38 38 38 37 37 38 40 41 40 39 37 37 37 36 35 34 33 34 34 33 32 31 32 33 33 34 35 35 35 34 33 33 33 33 32 32 33 33 34 35 35 35 35 35 34 34 34 34 33 33 33 31 31 30 30 30 30 30 29 29 29 29 30 31 32 33 33 32 31 32 33 33 32 31 31 32 34 34 33 34 34 34 34 33 33 33 31 30 29 29 29 29 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 28 26 28 29 29 31 31 30 29 29 29 29 28 28 29 29 29 29 29 30 31 31 32 33 32 31 30 29 29 29 29 29 28 27 26 26 27 28 28 27 28 29 30 30 29 29 29 30 30 30 30 32 32 32 31 30 31 32 32 32 31 29 29 29 31 32 32 32 32 30 30 30 29 28 29 30 31 32 33 32 32 32 32 31 31 32 32 31 30 30 30 29 29 29 29 29 27 27 26 26 26 26 26 26 26 26 26 26 26 26 27 27 26 26 26 25 25 25 25 25 25 26 26 27 27 28 28 29 29 29 29 29 29 28 27 28 29 29 29 29 29 29 28 27 27 28 29 29 29 28 27 26 25 25 25 26 26 26 26 26 27 28 29 63 64 64 64 64 64 64 63 63 63 62 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 59 59 59 60 60 60 59 59 59 60 60 59 59 59 59 60 60 60 60 59 59 59 58 59 59 59 59 58 57 57 58 58 58 58 59 58 58 58 58 57 56 56 56 57 56 56 56 56 57 57 57 57 57 57 57 57 58 57 57 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 53 53 52 52 52 52 52 51 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 49 49 49 49 49 48 48 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 47 47 47 47 47 47 47 47 47 47 47 46 46 47 47 47 46 46 45 45 44 44 42 43 44 45 45 45 45 44 44 44 43 43 44 44 44 44 43 43 42 41 41 41 42 43 43 43 43 44 45 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 42 42 43 43 43 43 42 41 41 41 41 41 41 42 42 42 42 41 41 40 40 41 40 39 39 39 38 38 38 38 38 38 38 39 40 41 41 42 42 43 42 42 43 44 44 42 42 42 43 43 43 43 43 43 42 42 42 42 41 41 41 42 42 43 43 44 43 42 42 42 42 41 41 41 40 40 40 40 40 38 37 37 39 40 40 39 37 37 37 36 35 34 34 33 33 33 33 31 31 31 33 34 34 35 35 34 34 33 33 32 31 32 33 33 34 34 35 35 35 35 34 34 34 34 33 33 33 32 32 31 31 31 31 31 30 30 29 29 29 30 32 32 31 30 31 33 33 33 33 31 31 32 33 33 33 34 34 34 34 33 32 33 32 31 30 29 30 30 29 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 26 27 29 30 31 31 30 29 28 29 29 28 28 28 29 29 29 29 30 31 31 31 31 32 31 30 29 29 28 29 28 27 27 26 26 27 27 27 27 28 29 30 29 28 28 29 29 30 30 31 32 33 32 31 30 31 31 31 32 31 29 29 29 30 30 31 32 32 30 30 30 28 28 29 31 31 31 32 33 32 32 32 32 32 32 31 31 31 31 31 30 29 29 29 28 27 27 27 27 26 26 26 27 27 27 27 28 27 27 28 28 27 26 26 26 26 25 25 25 25 25 26 27 27 27 27 28 29 29 29 29 28 27 27 28 29 28 28 28 29 28 27 26 27 28 29 29 29 29 28 27 25 25 25 25 26 26 26 26 27 28 29 63 63 63 63 63 63 63 63 62 62 62 62 61 61 61 61 61 61 60 61 61 60 59 59 58 58 58 59 59 60 60 60 60 59 59 59 59 59 59 59 59 60 60 60 59 59 59 59 58 58 58 58 58 58 57 57 57 57 58 58 58 58 58 58 57 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 54 54 54 53 53 53 52 52 53 53 53 53 53 53 53 53 52 52 53 53 52 52 52 52 52 51 50 50 50 50 50 50 50 49 49 49 49 49 50 50 50 49 49 49 49 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 47 47 46 46 46 46 47 47 47 47 46 46 46 47 47 46 46 45 44 43 43 43 44 45 45 46 46 46 45 45 45 44 44 45 46 46 45 45 44 43 43 42 41 41 42 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 44 44 43 43 43 42 42 43 43 42 42 42 43 42 42 42 41 41 41 41 41 41 41 42 41 41 41 41 40 40 40 41 40 40 39 38 37 37 38 38 38 38 40 40 40 41 42 42 43 42 42 42 43 42 41 41 43 43 43 43 43 43 43 42 42 42 42 41 41 42 43 43 43 44 44 44 43 42 42 41 41 41 41 40 40 41 40 40 39 37 37 38 39 40 39 38 37 37 37 36 35 34 33 33 33 32 31 30 31 33 33 34 35 35 35 34 33 32 32 31 31 32 32 33 34 34 34 34 35 35 34 34 34 34 33 32 32 32 32 32 32 32 31 30 30 29 29 29 29 30 31 31 30 31 33 33 33 33 31 30 32 33 32 32 33 33 34 33 33 32 32 32 32 32 31 31 31 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 30 28 29 29 28 27 28 29 29 29 29 30 30 30 30 31 32 32 30 29 29 28 27 27 27 26 26 26 26 26 26 27 28 29 30 28 28 28 29 29 30 30 31 32 32 32 31 30 30 31 32 32 31 30 29 29 30 31 32 32 31 30 30 30 28 28 29 31 32 32 32 32 32 32 33 33 32 32 31 31 31 31 31 30 29 29 28 27 27 28 28 28 28 27 27 28 28 28 28 29 28 28 29 28 27 27 27 27 26 26 25 25 25 25 26 26 27 27 27 28 29 29 29 28 27 26 26 28 28 27 27 27 28 27 26 27 27 28 29 29 29 29 29 28 26 25 24 25 25 25 26 26 27 28 28 62 62 62 63 63 63 63 63 62 62 62 62 61 61 61 61 61 60 60 60 60 59 58 58 58 57 58 59 59 59 60 60 60 59 58 58 58 58 58 58 59 59 60 59 59 58 58 58 58 58 58 58 58 58 57 57 57 57 57 58 58 57 57 57 57 56 56 56 56 56 56 55 55 56 56 57 57 56 56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 54 53 53 53 53 53 53 53 54 53 53 53 53 53 52 52 53 53 52 52 52 52 52 51 50 50 50 50 50 49 49 49 49 49 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 43 43 44 45 45 46 46 46 46 46 46 46 45 45 44 45 46 47 46 45 44 44 43 43 42 41 40 41 43 43 44 44 44 44 44 44 44 44 44 45 44 44 44 44 44 44 44 44 44 43 43 44 44 44 43 43 44 43 43 43 42 42 43 43 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 41 40 40 39 38 37 37 37 38 38 39 40 40 40 41 42 43 43 42 42 42 42 41 41 42 43 43 43 43 43 43 43 42 41 41 41 41 41 42 43 43 44 44 44 43 43 42 41 41 41 40 40 39 39 40 40 40 39 37 36 37 39 39 39 39 38 37 37 36 35 34 34 33 32 32 32 31 31 31 32 33 34 35 35 33 33 33 32 31 31 31 32 32 32 32 32 33 34 35 35 35 34 34 33 32 32 32 33 33 32 32 31 30 30 29 29 29 29 29 30 30 29 30 32 32 32 32 30 30 32 32 31 31 32 33 33 33 32 32 31 32 33 33 32 32 32 30 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 29 28 29 28 27 27 28 29 29 29 29 30 30 30 31 32 32 32 30 29 29 28 28 27 26 26 26 26 26 26 26 27 28 28 28 28 28 29 30 30 31 31 32 32 32 32 32 31 29 30 32 32 31 30 29 28 30 31 32 32 30 29 30 30 28 28 29 31 32 31 31 31 32 32 33 33 32 32 31 30 30 31 30 29 29 29 28 27 28 29 29 29 28 27 27 28 29 29 29 29 29 29 29 28 27 28 28 27 27 26 26 26 25 25 25 26 27 28 28 28 29 29 28 27 27 26 26 27 27 27 27 27 26 26 26 27 27 28 29 28 28 28 28 28 27 26 24 24 24 25 26 26 27 28 29 61 62 62 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 59 59 58 58 57 57 58 59 59 59 60 60 60 59 58 58 57 57 57 57 58 59 59 59 58 58 58 58 58 57 57 57 58 58 57 57 57 57 57 57 57 57 57 57 56 56 55 55 55 56 56 55 55 56 56 56 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 54 54 54 53 53 53 53 54 54 54 53 53 53 53 52 52 53 53 53 53 52 52 52 51 51 51 51 50 49 49 49 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 46 45 45 45 45 46 46 46 46 45 45 44 45 45 45 45 45 45 45 44 44 44 43 43 44 45 45 45 46 47 47 47 47 46 46 46 46 46 46 46 47 46 45 45 44 44 44 43 42 40 41 43 43 43 44 43 43 43 43 44 44 44 44 44 44 44 43 43 43 44 44 44 43 43 44 43 43 43 43 44 43 43 43 42 42 43 43 42 41 42 42 41 41 41 41 40 40 40 40 40 41 41 41 41 41 41 40 39 39 40 40 39 39 38 37 37 37 37 38 39 40 40 40 41 42 42 42 41 41 42 41 41 42 43 43 42 42 42 42 42 42 41 41 40 40 41 42 43 43 43 44 44 44 44 43 42 42 41 40 40 40 39 39 40 40 40 39 38 37 36 38 39 39 38 38 37 37 36 35 34 33 33 33 33 33 33 32 31 30 32 34 35 35 34 32 32 32 31 30 30 31 31 31 31 32 33 34 34 35 35 34 34 33 33 32 33 34 33 32 32 31 31 30 30 30 29 29 29 29 29 29 30 31 31 32 31 29 30 31 31 30 31 32 33 33 34 32 31 31 31 33 33 33 33 32 31 30 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 29 28 27 27 28 29 30 30 30 30 29 29 30 30 31 32 31 30 29 29 29 28 27 27 26 26 26 26 26 27 27 27 27 27 28 28 29 30 31 31 31 32 31 31 33 33 31 29 30 31 32 31 30 29 28 29 30 32 32 31 29 29 29 28 28 29 31 32 31 30 31 32 32 32 32 32 32 31 30 30 30 30 29 29 29 29 28 28 29 29 29 29 28 27 28 30 30 30 30 30 29 28 27 27 28 28 28 28 28 27 26 25 25 25 27 28 29 29 29 29 28 29 28 27 26 26 27 27 26 26 26 26 26 27 27 27 27 28 27 28 28 27 27 26 26 25 24 24 25 26 27 28 29 28 61 62 62 62 62 62 62 62 62 62 62 62 61 61 61 61 61 61 60 59 59 59 59 58 58 57 57 58 59 59 59 59 59 59 58 57 57 57 57 57 59 59 59 59 58 58 58 58 57 57 56 57 58 58 57 56 56 56 57 57 57 57 56 56 56 55 54 54 55 55 55 55 55 55 55 56 56 56 56 55 55 55 55 55 55 55 55 55 56 56 56 55 55 55 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 53 53 53 54 55 55 54 54 54 53 53 53 53 53 53 53 52 52 52 52 51 51 51 50 50 50 50 49 49 50 51 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 46 45 45 44 44 44 45 45 44 44 44 43 43 44 44 44 44 44 44 44 44 44 43 43 44 45 45 45 46 47 47 47 47 47 47 47 47 46 46 47 47 46 46 46 45 44 43 43 42 40 40 42 43 43 43 43 43 43 43 44 44 44 44 44 43 43 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 43 43 42 42 43 42 41 41 41 42 42 41 41 41 40 40 40 40 40 41 41 41 41 41 41 40 39 39 39 40 39 38 38 38 37 37 37 38 39 39 39 40 41 42 42 41 41 41 41 41 40 41 43 42 41 41 42 41 41 40 40 40 40 41 42 43 43 43 43 43 43 43 43 43 43 42 42 41 40 40 39 39 39 39 40 40 39 38 36 36 38 38 38 37 36 36 35 34 33 33 33 34 35 36 35 34 33 31 30 32 34 34 34 33 32 31 30 30 30 30 30 29 29 31 32 33 34 34 34 34 34 34 33 33 33 34 34 33 32 31 31 31 30 30 29 29 28 29 29 30 31 31 31 31 30 29 29 31 31 30 31 32 32 32 33 32 32 31 31 33 33 33 33 32 32 31 30 30 29 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 27 27 28 29 29 29 31 31 29 29 30 31 31 31 32 31 31 30 29 28 28 28 27 27 26 26 26 27 28 28 28 28 29 29 29 30 30 31 30 31 31 30 31 32 32 31 29 29 30 31 31 29 29 28 28 30 32 32 32 30 29 29 28 28 29 30 32 31 31 31 32 32 32 31 31 32 31 30 30 30 30 30 30 29 29 28 28 29 29 30 30 29 27 28 29 29 29 30 30 29 28 27 28 29 29 28 28 28 27 26 25 25 25 27 28 29 29 29 28 27 28 29 28 27 26 26 26 26 26 25 26 27 27 27 27 26 27 27 27 27 26 26 26 26 25 24 24 25 27 28 28 28 27 60 61 61 61 61 61 61 61 62 61 61 61 61 61 61 61 61 61 60 60 59 59 59 59 58 57 57 57 58 58 59 59 59 59 58 57 56 56 57 57 58 59 58 59 58 58 58 57 57 57 56 56 57 57 57 56 55 56 57 57 56 56 56 56 55 54 54 54 54 55 55 54 54 54 55 55 56 56 56 55 55 55 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 53 54 54 55 55 54 54 54 54 53 53 53 52 52 52 52 52 52 52 51 51 51 50 51 51 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 48 48 48 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 44 44 44 44 44 43 44 44 45 46 46 45 45 46 45 44 44 45 46 46 46 46 46 47 47 47 47 47 46 46 47 47 47 47 46 46 46 45 44 43 43 42 41 40 41 42 42 43 42 42 43 43 43 44 44 44 44 43 43 42 42 43 43 43 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 41 41 41 42 42 41 41 41 41 41 40 40 40 40 40 40 40 40 41 40 40 39 39 39 39 38 38 38 37 37 37 37 38 39 40 41 41 42 41 40 40 41 41 40 39 41 42 41 41 42 41 41 40 40 40 40 41 42 43 43 42 43 43 43 43 43 43 43 43 43 42 42 40 40 40 39 39 39 40 40 39 38 37 36 37 37 38 37 37 35 34 33 33 34 34 34 35 36 35 34 34 33 31 31 32 32 33 32 31 30 30 30 30 30 30 30 30 30 31 32 33 33 32 33 33 33 32 33 33 33 33 33 32 32 31 31 30 30 29 29 29 28 29 30 30 30 30 30 30 29 29 30 30 30 30 31 31 32 33 32 31 30 31 33 33 32 32 31 31 31 31 30 30 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 29 30 30 29 29 30 31 31 32 32 31 31 30 29 29 29 29 28 28 26 26 26 28 28 28 29 29 29 29 30 30 30 30 30 31 30 29 31 31 31 31 30 29 30 31 31 29 28 28 28 30 31 31 32 31 30 29 28 28 28 29 31 30 30 31 31 31 32 31 30 31 31 31 30 29 29 30 29 29 29 28 28 29 30 30 30 29 28 28 28 29 29 30 30 29 28 28 29 30 29 28 27 27 27 26 25 25 26 26 27 28 29 28 27 27 27 28 28 28 27 26 26 26 25 25 26 26 26 27 27 26 26 27 27 27 26 25 25 25 25 24 24 25 27 27 27 27 26 60 60 61 61 60 60 60 60 61 61 61 61 61 60 60 60 60 60 60 60 59 59 59 59 58 58 57 57 57 58 58 58 59 58 58 57 56 56 56 57 58 58 58 58 58 58 58 58 57 56 56 56 56 57 56 56 55 55 56 56 56 56 56 55 55 54 54 54 54 54 54 54 54 54 55 55 55 56 56 55 55 55 54 54 54 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 55 54 54 55 55 55 55 55 55 54 54 54 54 55 55 55 55 54 54 53 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 51 50 50 50 50 49 49 49 49 48 48 48 48 48 48 48 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 44 44 45 45 46 45 45 45 46 46 46 47 46 46 46 46 46 45 46 46 46 46 46 46 47 47 47 47 46 46 46 46 47 47 46 46 46 46 45 44 43 43 42 41 40 40 41 42 42 42 42 42 42 43 44 44 44 43 43 43 42 42 42 43 43 44 43 43 43 43 42 42 42 42 42 43 42 41 42 42 42 42 41 41 41 41 41 42 41 41 41 41 40 40 40 39 40 40 40 40 40 40 40 39 39 39 39 38 38 37 37 37 38 39 39 40 41 41 41 40 40 40 40 40 39 39 40 41 41 42 42 41 40 40 40 41 41 41 42 42 42 42 42 42 42 42 42 42 43 43 43 42 41 40 40 39 39 39 39 39 40 39 38 37 37 36 37 38 38 37 36 35 34 35 35 35 34 35 36 35 34 34 33 32 31 30 30 31 31 30 30 31 30 30 30 31 32 31 30 29 30 31 31 31 32 32 32 32 32 32 31 32 33 32 32 32 31 31 30 30 30 29 28 28 29 29 30 30 30 30 29 29 30 29 29 30 30 30 32 33 32 31 30 30 32 33 32 31 31 30 30 30 30 30 30 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 29 28 28 29 29 30 31 30 31 31 30 29 30 30 30 29 29 28 27 26 26 27 27 27 27 28 29 29 30 30 29 29 30 30 29 29 30 30 31 32 31 29 29 30 30 29 28 28 28 30 31 31 32 31 30 29 29 28 28 29 29 29 30 30 30 31 32 31 30 30 31 30 29 29 29 29 29 28 28 28 28 29 30 31 31 30 29 29 28 29 29 30 30 29 29 29 29 30 29 28 28 29 28 27 26 26 25 26 27 28 29 28 27 26 26 27 28 28 28 27 27 26 26 26 26 25 25 26 26 26 26 27 27 26 25 24 24 24 24 24 25 26 27 27 27 26 26 60 59 60 60 60 60 60 60 60 60 60 60 60 60 59 59 60 60 59 59 59 59 58 58 58 58 57 57 57 57 58 58 59 58 57 56 55 56 57 57 58 58 57 57 58 58 58 58 57 56 56 55 56 57 56 55 54 54 55 56 56 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 54 54 54 54 54 54 54 54 55 55 55 54 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 46 47 47 46 45 45 46 45 45 46 46 46 46 45 46 46 46 46 45 45 46 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 46 45 45 45 45 44 44 43 43 42 40 40 40 41 41 41 42 42 41 42 43 44 44 43 43 42 42 42 42 42 43 43 43 43 42 42 42 42 42 42 42 42 42 41 41 41 42 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 39 39 40 40 40 40 39 39 39 38 38 38 37 37 38 39 40 40 40 41 41 41 40 40 40 40 39 39 40 41 41 41 41 41 40 39 40 41 41 41 42 41 41 41 41 42 42 42 42 43 43 42 43 43 42 41 41 40 39 39 39 38 38 39 39 39 38 37 36 36 37 37 37 37 36 35 35 36 36 36 36 36 35 34 34 34 33 32 31 31 31 31 31 32 32 32 32 32 33 32 32 31 30 30 29 29 29 30 31 31 31 31 30 30 31 32 31 32 32 32 31 31 30 30 29 29 28 28 29 29 29 29 29 29 29 30 29 29 29 30 31 31 31 32 31 30 30 31 32 32 32 31 30 30 30 29 30 30 30 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 28 27 28 29 29 30 30 30 31 32 32 31 31 30 30 30 29 29 28 27 26 26 26 26 27 28 29 29 29 29 29 29 29 29 29 30 30 29 30 31 31 30 29 29 28 28 28 28 28 30 31 31 31 31 30 29 29 28 28 28 29 30 31 30 31 31 31 32 31 30 30 29 29 29 29 29 29 29 29 29 29 29 30 31 31 30 29 29 29 29 30 30 29 29 29 29 29 29 29 29 28 28 27 26 25 25 25 26 27 28 28 28 27 26 26 27 27 27 28 28 27 27 27 27 27 26 25 25 26 26 26 26 26 26 25 24 24 24 24 24 26 27 26 26 26 26 26 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 57 58 58 57 57 57 57 58 58 58 58 57 55 55 56 57 57 57 57 57 57 57 57 57 57 57 56 55 55 55 56 56 55 54 54 55 56 56 55 55 55 54 54 53 54 54 54 54 53 54 54 54 54 54 55 55 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 54 53 53 53 52 52 52 51 51 51 51 51 51 51 51 51 51 50 50 51 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 47 47 47 47 47 47 47 47 47 46 46 46 47 47 46 47 47 47 46 46 47 47 46 45 45 45 46 46 46 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 46 46 46 46 46 45 44 45 45 45 45 45 45 45 44 44 43 43 42 41 40 40 40 40 40 41 41 42 42 43 43 43 43 43 42 42 42 41 42 42 43 43 43 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 39 40 40 40 40 40 39 39 38 38 38 37 37 37 39 40 40 39 40 41 40 40 39 39 38 38 39 41 41 41 41 41 40 39 39 40 41 41 41 41 41 40 40 41 42 43 43 44 44 44 43 43 43 42 41 41 40 40 40 39 38 37 38 39 40 39 38 36 36 37 37 37 37 37 37 36 37 37 37 37 36 36 35 35 34 34 34 34 34 33 32 33 33 33 33 34 34 33 33 33 32 32 31 29 29 29 29 29 29 29 29 29 29 30 31 30 31 32 32 31 30 30 30 30 29 29 29 28 28 28 28 28 28 28 29 29 29 29 30 31 30 30 31 31 30 29 30 31 32 32 31 30 31 31 29 29 29 30 29 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 28 28 29 29 29 30 30 31 32 32 31 30 29 29 29 29 28 28 27 26 26 26 26 27 28 29 29 28 28 28 29 29 28 29 30 29 29 29 29 30 30 30 29 28 28 28 28 29 30 30 30 31 31 31 29 29 28 28 28 28 29 30 30 30 30 30 31 31 30 30 30 29 30 31 30 30 30 30 29 29 29 30 30 30 29 29 29 29 29 30 30 29 29 29 30 30 29 29 29 28 27 27 26 25 24 25 26 27 27 26 26 26 25 26 26 27 27 28 28 28 28 28 26 26 26 25 25 26 25 25 26 25 25 24 24 24 24 24 26 27 26 26 26 26 26 27 59 59 59 59 59 59 59 58 58 59 59 59 59 59 58 58 58 58 58 58 57 57 57 57 57 57 57 56 57 57 57 57 57 57 57 55 55 56 56 57 57 56 57 57 57 56 57 57 57 57 55 55 55 55 56 55 54 54 55 55 55 55 55 54 54 54 53 53 54 54 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 54 54 54 53 53 53 53 53 54 54 54 54 53 54 54 53 53 53 53 53 53 53 54 54 54 54 54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 52 51 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 47 48 48 48 48 47 47 48 48 47 46 47 48 48 47 47 47 47 46 46 46 46 45 45 45 46 47 47 47 47 47 47 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 45 45 45 45 45 45 44 43 43 43 43 42 41 40 40 40 40 40 41 42 43 43 43 43 43 42 41 42 41 41 41 42 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 41 41 41 40 40 41 41 41 41 40 40 41 41 41 41 41 40 40 39 40 40 40 40 39 39 38 37 37 37 37 37 37 37 38 38 39 40 40 40 39 38 38 39 40 40 40 40 40 40 40 39 39 40 41 41 41 40 40 40 40 40 41 42 43 43 44 44 44 44 43 43 42 42 42 41 40 40 39 38 37 37 38 39 38 37 37 36 35 36 36 36 37 38 37 37 38 38 37 37 37 36 35 34 34 34 35 35 34 32 32 33 34 34 33 33 32 32 32 32 32 31 31 31 30 29 30 30 29 30 29 29 29 29 29 31 32 32 31 30 29 29 30 30 30 29 29 28 28 28 28 27 27 27 28 29 29 29 29 29 30 31 30 30 29 29 30 31 31 32 32 32 31 30 29 28 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 29 29 29 30 31 31 32 32 32 31 30 29 29 29 28 27 27 26 26 26 26 26 26 28 28 28 28 28 28 29 28 28 29 29 29 29 29 29 29 31 31 29 28 27 27 28 29 30 29 29 31 32 31 29 29 28 27 27 28 29 29 29 30 30 30 30 31 31 30 30 31 31 32 31 31 30 30 29 29 29 30 30 30 29 29 30 30 30 30 30 29 29 30 30 31 30 30 30 28 28 28 27 26 25 25 26 26 26 26 25 24 25 25 26 27 27 27 29 29 28 28 27 26 26 25 25 26 25 26 26 24 24 24 24 24 25 25 26 27 26 26 26 26 26 27 58 58 58 58 58 58 58 57 58 58 58 58 58 58 58 58 58 57 57 57 56 56 56 56 56 57 56 56 56 56 57 57 57 56 56 55 54 55 56 56 56 55 56 57 55 55 56 56 56 56 55 54 54 55 56 55 54 54 54 55 55 55 55 54 54 54 53 53 53 53 53 52 53 54 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 51 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 48 48 49 49 48 48 48 48 48 47 47 48 48 49 48 48 48 47 47 47 46 45 45 46 47 47 47 47 48 48 48 47 47 47 46 45 44 44 44 44 44 45 46 45 45 45 44 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 42 41 42 41 40 40 40 41 42 42 42 42 42 42 41 41 41 41 41 41 42 42 43 43 43 43 43 43 42 41 41 41 41 41 41 40 40 40 41 40 40 40 41 41 41 40 40 40 40 41 40 40 40 39 39 39 39 40 39 38 37 37 37 37 37 37 37 37 37 37 37 38 38 39 40 39 38 39 40 40 40 40 40 39 39 39 39 40 41 40 40 40 40 40 40 41 41 42 43 43 43 43 44 44 44 44 43 43 43 42 41 40 40 39 38 38 37 36 37 37 37 37 36 35 35 35 35 36 37 38 38 38 38 38 38 37 36 35 35 35 35 35 34 34 33 32 33 34 34 33 31 31 30 30 31 31 32 32 32 31 31 31 31 31 31 30 29 29 28 29 30 31 31 31 29 29 29 29 29 29 30 30 30 29 29 29 28 28 27 27 28 28 28 28 29 30 30 30 29 29 29 30 30 32 32 33 33 31 30 30 29 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 31 30 31 32 32 32 32 32 30 29 29 30 29 28 28 27 26 26 26 26 26 26 28 28 28 29 28 28 28 27 28 28 28 28 29 29 29 30 31 31 29 28 27 27 28 29 29 29 29 31 32 31 30 29 28 28 27 28 29 29 29 30 31 31 31 31 32 31 31 32 32 32 32 31 31 30 29 29 30 30 31 31 30 31 31 31 31 31 31 30 30 30 30 31 30 30 30 29 29 28 27 26 25 25 25 25 25 24 24 24 24 25 26 26 26 27 28 29 28 28 27 26 25 25 25 25 25 25 25 24 24 25 25 26 26 26 26 27 26 25 26 26 26 27 57 57 57 57 57 57 57 57 57 57 57 58 58 58 57 57 57 57 56 56 56 55 55 55 55 56 56 55 55 56 56 57 56 55 55 54 54 55 55 54 55 54 55 55 54 54 54 54 54 55 55 54 54 55 55 55 54 53 54 54 54 54 54 54 53 53 53 53 53 53 53 52 52 53 53 53 54 54 54 54 54 53 53 53 54 54 54 53 53 53 53 53 53 53 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 51 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 49 49 49 48 48 49 49 49 48 48 48 49 49 48 48 48 47 47 46 46 46 46 47 47 48 48 48 47 47 47 47 47 46 46 45 45 44 44 44 44 45 45 45 45 45 44 44 44 45 45 44 43 44 44 44 44 44 44 44 43 43 43 42 42 43 42 41 40 40 40 40 41 41 41 41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 39 38 38 39 39 39 38 37 37 38 38 38 39 39 38 38 37 37 37 37 38 39 39 38 38 39 39 39 39 39 38 38 39 40 41 40 39 39 39 40 41 41 42 42 42 43 43 43 43 44 44 44 44 43 43 43 42 41 41 41 40 39 38 37 36 36 36 36 36 36 35 35 35 35 36 37 38 38 38 38 38 38 37 37 36 36 36 35 34 34 34 33 33 33 33 33 32 30 30 29 29 29 29 30 31 31 32 32 32 32 32 31 31 30 29 29 28 28 29 29 30 29 28 28 28 28 29 30 31 30 30 30 29 29 29 29 27 27 27 27 27 28 29 29 29 29 29 29 30 31 32 32 32 32 32 31 30 29 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 29 31 31 31 31 32 31 31 32 32 30 29 29 29 29 29 28 27 26 26 26 26 26 27 28 27 28 28 27 27 27 27 27 28 28 28 29 29 30 31 31 31 30 29 27 27 27 28 28 29 30 31 32 31 30 29 29 28 28 28 29 29 30 31 32 32 32 33 32 32 32 32 32 31 31 32 31 30 29 29 30 31 31 31 31 32 32 32 32 31 32 31 30 30 30 30 30 29 30 29 28 26 26 25 24 24 24 24 24 25 25 24 24 25 26 25 25 26 28 29 28 28 27 26 26 26 25 24 25 25 24 24 25 26 26 27 26 26 26 26 25 26 26 26 26 27 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 54 54 54 55 54 54 55 55 55 55 55 54 54 53 54 54 53 53 53 53 53 53 53 53 53 54 54 54 54 53 54 54 54 53 53 53 53 53 54 54 53 53 53 53 52 52 53 53 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 54 53 53 53 52 52 53 53 52 52 53 53 53 53 53 53 53 52 52 53 53 52 52 52 52 53 52 52 53 53 53 53 54 54 54 54 53 53 54 54 53 53 53 53 53 52 52 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 49 49 49 49 49 49 49 48 48 48 49 49 49 49 48 48 47 47 46 46 47 47 48 48 48 48 47 47 46 46 47 46 46 46 46 46 45 45 44 44 44 44 44 45 45 45 44 43 44 44 44 43 43 44 43 43 44 43 43 43 42 42 42 42 43 43 42 41 41 39 39 40 40 41 41 41 40 41 41 42 43 43 43 43 44 43 43 43 42 42 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 41 41 41 40 39 40 40 40 39 39 39 38 38 38 38 38 38 37 38 39 39 39 40 40 39 38 38 37 37 37 37 38 38 37 38 38 38 38 38 38 39 39 40 40 40 39 39 40 40 41 41 42 42 43 43 43 43 44 44 44 45 44 43 43 42 42 42 42 41 41 40 39 38 37 36 37 36 36 36 36 36 36 35 35 36 37 38 37 37 38 38 38 37 37 36 35 35 34 34 34 34 33 33 32 31 31 30 29 29 29 29 29 29 29 29 30 30 31 32 32 31 30 31 30 30 29 29 28 28 28 28 28 28 28 27 28 29 29 30 31 31 31 30 30 30 30 29 28 28 27 27 27 27 28 29 28 28 29 31 31 30 30 30 31 32 31 30 30 29 28 28 27 26 26 26 26 26 26 25 24 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 30 31 31 31 32 31 31 32 31 30 29 29 28 28 29 28 26 26 26 26 26 26 28 28 27 27 27 27 27 28 28 28 28 29 29 30 30 31 31 31 31 30 29 28 27 27 28 29 30 30 31 32 31 30 29 29 28 27 28 29 30 31 31 31 32 32 33 33 33 32 32 32 31 31 31 31 30 30 30 31 31 31 32 32 32 32 32 32 31 31 31 30 30 29 29 29 28 28 28 27 25 25 25 25 25 25 25 26 26 26 25 24 24 25 24 25 26 27 28 28 28 28 28 27 26 25 24 24 24 24 24 26 26 26 27 26 25 25 24 25 26 27 27 27 27 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 53 53 54 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 52 52 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 53 52 52 52 52 52 52 51 52 52 52 52 52 53 53 53 54 54 53 53 53 52 53 53 53 53 53 53 53 53 52 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 48 48 48 49 49 49 49 49 49 49 49 48 48 48 49 49 49 49 49 48 47 47 47 47 48 48 49 49 48 47 47 46 46 46 46 46 46 46 46 45 46 46 45 43 43 43 44 44 44 45 45 44 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 42 42 42 42 41 40 40 39 39 40 40 40 40 41 42 43 44 43 43 44 44 43 42 42 42 42 42 43 43 43 43 43 42 41 42 42 41 40 40 40 40 40 40 40 40 40 39 40 40 39 39 39 38 38 38 38 38 38 38 38 40 40 40 40 40 39 39 39 39 38 37 37 37 38 37 38 39 39 39 39 39 40 40 39 39 39 39 40 41 41 41 42 43 43 43 44 44 45 45 45 45 45 44 44 43 42 41 41 41 41 41 40 40 38 37 38 39 38 38 37 37 37 36 35 35 36 37 38 37 36 37 38 38 37 37 36 35 35 35 34 34 33 33 33 31 30 30 29 29 30 31 31 31 30 29 29 29 29 29 30 30 30 29 29 29 29 29 30 30 30 29 29 28 29 29 28 27 28 28 29 30 31 31 30 30 30 30 30 29 29 29 28 27 27 27 28 27 28 29 30 30 29 29 29 30 30 31 30 30 29 29 29 28 26 26 26 26 26 25 23 22 23 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 31 31 31 32 31 31 30 29 28 27 28 27 26 26 26 26 26 26 27 27 26 26 27 27 28 28 29 29 29 29 29 29 31 31 31 31 32 31 29 28 27 27 28 29 30 31 31 32 31 30 29 29 28 27 28 29 31 31 30 30 31 31 32 32 33 32 32 32 31 31 31 31 31 30 31 32 32 32 32 32 32 32 32 32 31 31 31 30 30 29 28 28 27 27 27 27 26 27 27 26 26 26 26 27 26 26 26 25 25 24 24 25 25 26 26 27 28 28 27 26 25 24 25 25 24 24 25 26 26 26 27 25 24 24 25 26 26 27 27 27 27 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 54 54 54 54 54 54 53 53 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 53 53 53 53 53 52 52 53 53 53 53 53 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 52 52 51 51 51 52 51 51 52 52 52 53 54 53 53 53 53 52 52 52 52 52 52 52 52 52 52 51 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 48 49 50 50 50 50 49 49 49 48 48 49 49 48 48 48 48 48 47 47 47 47 48 49 49 48 47 47 46 46 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 44 44 45 45 44 44 43 43 43 43 43 43 43 42 41 41 41 41 41 41 41 40 40 41 41 41 40 40 40 39 39 39 39 39 40 41 42 43 42 43 43 44 43 43 43 43 43 43 43 43 44 44 43 43 42 42 42 41 41 40 40 39 39 39 40 40 40 39 39 40 40 39 38 38 38 38 38 39 39 38 38 40 40 40 41 40 40 40 40 39 38 37 37 37 37 38 39 39 40 40 40 40 39 39 39 39 39 40 41 41 42 43 43 43 44 44 44 45 45 45 46 46 45 44 44 43 42 41 41 40 40 40 40 39 38 38 39 40 39 38 37 37 36 35 34 34 36 37 38 37 36 36 37 38 38 37 36 35 34 34 33 33 32 31 31 31 30 30 30 30 31 33 33 32 31 30 29 29 29 29 29 29 29 29 28 28 28 29 30 30 30 30 30 30 30 30 29 28 27 27 28 29 29 30 30 30 30 30 30 30 30 29 29 28 27 27 27 27 28 29 29 29 29 29 29 29 29 30 31 30 30 30 29 28 26 26 26 26 26 25 24 22 22 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 31 31 30 30 31 31 31 31 31 30 29 29 28 27 27 26 26 26 26 27 27 27 26 27 27 27 27 27 27 28 28 28 28 29 29 30 30 29 31 31 31 29 28 27 27 28 29 29 30 31 31 32 31 30 29 28 27 28 29 30 30 30 30 31 31 32 32 33 32 32 32 32 32 31 30 30 30 31 31 31 32 32 33 32 31 31 32 31 30 31 31 30 30 29 28 28 27 27 26 27 28 28 27 27 26 27 27 26 27 27 27 27 25 24 24 24 25 27 27 27 26 26 26 25 24 25 25 24 24 26 26 27 26 26 25 24 25 26 26 26 27 27 26 26 57 57 57 57 57 58 58 57 57 57 57 57 57 57 56 56 57 57 56 56 56 56 56 56 55 55 55 54 54 53 53 53 53 53 53 53 53 53 54 53 53 54 54 54 54 53 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 52 52 52 52 52 52 52 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 51 52 52 52 52 52 51 51 51 51 51 50 50 50 50 50 49 49 49 49 49 49 48 48 48 49 49 49 49 50 50 50 50 50 49 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 47 46 46 46 45 45 45 45 45 44 44 44 44 44 44 43 43 43 43 44 44 45 44 44 43 43 43 42 42 43 42 41 41 41 41 42 42 42 42 42 41 40 40 40 40 40 39 39 40 39 39 40 39 39 40 40 41 42 42 43 43 43 43 43 43 43 44 44 45 45 44 43 43 42 43 42 41 41 40 39 39 39 39 40 40 39 39 39 39 39 38 38 39 39 40 40 40 39 38 40 41 41 41 41 40 40 40 39 38 37 37 37 37 38 38 39 40 40 39 39 38 38 39 40 40 41 41 42 43 43 43 43 44 44 44 44 45 45 46 46 45 44 43 43 42 42 42 42 41 40 39 38 38 39 40 40 39 38 37 37 36 35 35 34 35 37 37 37 36 35 36 37 37 36 35 34 34 33 32 32 31 30 30 30 30 30 30 31 33 33 31 30 30 30 30 30 29 29 29 29 29 29 29 28 28 28 28 28 28 28 30 30 29 29 28 27 27 27 27 27 28 29 29 29 29 29 29 29 29 30 29 29 28 28 28 27 27 28 28 28 28 29 28 28 29 30 30 30 30 30 29 28 26 26 26 26 26 26 26 24 24 26 26 26 26 26 26 26 26 26 26 26 26 26 27 30 31 32 32 31 29 30 31 30 30 31 31 30 30 29 28 28 27 26 26 26 27 28 28 27 26 26 27 27 27 27 27 27 27 28 29 29 29 29 29 29 31 31 31 30 28 27 27 28 28 29 30 30 30 31 31 30 29 28 27 28 29 29 30 30 31 31 32 32 32 33 32 32 32 32 32 31 31 30 30 30 30 31 32 32 32 31 31 31 32 31 30 30 31 31 31 30 30 29 28 27 27 27 28 29 28 27 27 27 27 28 28 29 28 27 26 25 25 24 25 27 27 26 26 26 26 26 24 24 25 24 24 25 26 26 26 25 24 24 24 25 25 26 26 26 26 26 58 58 58 58 58 59 59 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 57 56 56 56 56 56 55 54 54 54 54 54 55 55 54 54 55 54 54 55 55 55 55 54 54 54 53 52 52 51 51 51 51 51 51 51 52 52 53 54 54 54 54 54 53 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 51 51 51 51 51 51 51 51 51 51 51 51 50 50 50 51 50 50 51 51 51 52 51 51 52 51 51 51 51 51 51 51 51 52 51 50 50 51 51 50 50 50 50 49 49 49 49 49 49 49 49 48 48 49 50 49 49 50 50 50 50 49 49 48 48 48 48 48 48 49 49 49 49 48 48 48 48 49 49 48 48 48 48 47 47 46 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 43 42 42 41 41 42 43 42 42 43 43 44 44 44 42 41 41 41 40 40 40 41 41 41 41 41 40 39 38 39 39 40 41 41 41 42 43 43 43 44 44 44 45 45 45 44 43 43 43 43 42 41 40 40 39 39 39 39 40 39 39 39 38 38 39 40 40 40 40 40 40 39 39 40 41 41 41 41 40 40 40 39 39 38 37 37 37 37 38 39 39 39 38 38 39 39 40 41 41 41 42 42 42 43 43 44 44 45 45 45 45 46 46 46 45 44 43 43 43 43 43 43 42 41 39 39 39 40 40 40 39 38 37 37 36 35 35 34 34 36 37 37 36 35 35 36 36 35 35 34 34 33 32 32 31 30 30 30 30 30 32 33 33 32 31 31 31 31 31 30 30 29 29 30 31 30 29 29 29 28 28 29 28 28 28 28 28 27 27 27 28 27 27 27 27 27 28 28 28 28 29 29 29 29 29 29 29 29 28 27 27 26 27 27 28 28 28 28 29 30 29 29 29 30 29 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 30 32 31 31 32 31 29 29 30 30 31 31 30 30 29 29 28 28 27 26 26 26 26 27 28 27 26 26 26 26 28 29 29 28 28 29 30 30 30 30 30 30 31 32 31 30 29 27 27 27 28 29 30 30 31 31 31 30 29 28 28 28 29 29 30 31 32 32 31 31 32 32 32 32 32 31 31 32 31 30 30 30 31 31 32 32 32 31 31 31 31 30 29 29 30 31 31 29 29 28 28 28 28 28 28 29 28 27 27 27 28 29 29 29 28 27 26 26 26 25 24 25 26 25 24 24 25 25 24 24 25 24 23 24 25 26 26 25 24 24 24 24 25 26 26 26 26 25 59 59 59 59 59 59 59 58 58 59 59 59 58 59 59 58 58 58 58 59 58 58 57 57 57 57 57 56 56 56 56 55 55 56 56 55 54 54 55 55 55 56 55 55 55 55 55 54 54 53 53 53 52 52 52 52 53 53 53 54 55 55 55 55 55 54 54 53 53 53 53 52 52 52 52 52 52 51 51 52 52 51 51 51 51 50 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 50 51 51 51 51 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 50 49 49 49 49 48 48 49 49 49 49 49 49 49 49 48 48 49 48 48 47 47 47 47 47 47 46 46 45 44 44 44 44 44 44 44 45 44 44 44 44 43 43 44 43 43 43 42 42 42 41 42 42 43 43 43 43 43 45 45 45 44 43 43 42 42 42 42 42 42 42 42 42 41 40 40 39 39 38 39 39 40 41 42 43 43 43 44 44 45 45 45 45 44 44 44 43 43 42 41 41 40 39 39 39 39 39 39 39 38 38 39 40 41 41 41 41 41 41 40 40 40 41 41 41 41 40 40 40 40 39 39 38 37 37 37 38 38 38 38 38 39 40 41 41 42 42 41 42 42 42 43 43 43 44 44 44 45 45 46 46 45 45 44 43 44 44 44 43 43 42 41 40 41 41 40 40 39 38 38 37 37 36 36 35 34 34 35 36 37 37 36 35 35 35 35 35 34 34 32 32 32 31 30 30 30 30 32 33 33 32 32 32 33 33 33 32 32 31 30 29 30 32 31 31 31 30 29 30 31 30 29 29 29 29 28 28 29 30 29 27 27 27 27 27 27 27 27 28 28 28 28 29 29 29 29 28 28 28 27 26 26 27 27 27 28 29 29 29 28 28 29 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 29 32 31 30 31 32 30 29 29 29 30 31 31 31 29 29 29 28 27 27 27 27 27 26 27 27 26 26 26 27 28 29 30 29 28 28 29 29 30 31 31 31 32 32 32 31 30 29 28 27 27 28 29 30 31 32 32 31 30 29 28 27 29 29 29 30 31 32 32 31 31 32 32 32 32 32 31 30 31 31 30 30 31 32 32 32 32 32 32 31 31 30 29 29 29 30 31 31 29 29 28 28 29 29 29 29 29 29 28 28 28 28 29 29 29 28 27 27 27 26 25 25 24 24 24 23 23 24 24 23 23 24 24 23 23 24 25 25 25 24 24 24 24 25 25 25 25 25 25 59 59 60 60 60 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 58 58 58 58 58 57 57 57 57 56 57 56 56 57 57 56 55 54 55 55 55 56 55 55 56 55 55 55 55 54 54 54 53 53 54 54 55 54 54 55 55 55 55 55 55 55 54 54 54 54 53 53 53 53 53 53 53 53 53 53 53 52 52 53 53 52 52 51 51 51 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 49 49 50 50 50 51 50 49 50 50 50 50 50 50 50 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 50 49 49 49 49 49 48 48 47 47 47 47 47 47 46 46 46 46 45 44 44 45 46 45 46 46 45 44 45 45 44 44 45 45 44 43 43 43 43 43 44 45 44 44 43 43 44 46 46 45 44 44 43 42 42 43 43 43 43 43 43 42 41 41 42 41 40 39 38 38 40 41 41 42 42 42 43 43 44 45 45 45 44 44 44 43 43 42 41 41 41 40 40 40 39 39 39 39 39 39 40 41 41 41 42 42 42 41 41 41 41 41 41 41 41 40 40 40 40 40 39 38 37 37 37 38 38 38 38 38 39 40 41 41 41 41 41 42 42 42 43 42 43 43 43 44 44 44 45 45 45 44 43 43 43 43 43 43 43 42 41 41 41 41 40 40 39 38 37 37 37 37 37 36 34 34 36 36 37 37 36 35 34 34 33 33 33 33 32 31 31 31 31 32 32 32 33 34 33 32 33 34 34 34 33 33 33 32 31 31 31 32 32 33 33 31 30 31 32 32 31 31 30 29 29 29 30 30 31 29 27 27 27 27 27 27 27 27 27 27 27 27 27 28 29 28 28 27 27 26 26 26 26 26 28 29 28 28 27 27 28 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 31 31 30 30 31 32 30 29 29 29 29 30 31 31 29 29 29 29 28 27 28 28 28 28 27 26 26 26 27 28 29 29 29 29 29 29 29 30 31 31 31 31 32 33 32 31 30 29 29 27 27 28 29 30 31 31 31 31 30 29 27 27 28 29 29 30 31 31 31 31 31 32 32 32 32 31 31 30 30 30 30 30 31 32 32 33 32 32 32 31 31 31 29 29 29 29 30 30 30 30 29 29 30 30 29 29 29 29 29 29 29 29 29 29 29 29 28 28 27 26 25 25 24 23 24 23 23 23 23 23 23 23 23 23 23 23 24 24 24 23 23 23 23 24 24 24 25 25 25 60 60 61 61 60 60 59 59 60 60 60 60 60 60 60 59 60 60 60 60 59 58 59 59 58 58 58 57 57 57 57 57 57 57 57 56 55 55 56 56 56 56 56 56 56 56 56 56 55 55 54 55 54 54 54 55 55 54 55 56 56 56 56 55 55 55 55 55 55 54 54 54 54 53 53 53 53 54 54 54 53 53 53 53 54 54 53 52 52 52 51 50 50 51 51 50 49 49 50 49 49 49 49 49 49 49 49 49 49 49 49 49 50 49 49 49 50 50 50 50 50 49 49 49 49 50 50 50 50 50 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 50 50 50 49 49 49 49 48 47 47 47 47 47 47 47 46 46 46 46 45 44 44 46 47 47 46 46 46 45 45 45 45 46 47 46 46 45 44 44 45 45 45 46 45 45 44 44 44 46 46 45 44 44 43 42 43 45 45 44 43 44 44 43 42 42 43 42 41 40 39 38 39 40 40 41 41 41 42 42 43 44 44 45 45 44 44 43 43 43 42 42 42 41 41 41 40 40 39 39 40 41 42 42 42 42 42 43 42 41 41 41 41 41 41 40 40 40 39 39 39 39 38 37 36 36 37 37 37 38 39 39 39 40 40 41 41 41 42 42 41 42 42 42 43 43 43 43 43 44 44 45 45 45 44 43 43 42 42 42 41 41 40 40 40 40 39 39 39 38 37 37 36 36 36 35 34 34 36 37 36 36 37 36 35 33 33 33 32 32 31 30 30 32 33 33 33 34 34 35 34 33 34 34 34 34 33 34 34 33 32 32 32 32 33 34 34 32 31 31 32 31 31 30 30 31 32 31 30 31 31 30 29 28 28 27 27 27 27 27 27 27 27 26 26 27 28 28 26 26 26 26 26 26 26 26 27 27 26 26 26 26 27 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 29 30 30 31 31 30 29 29 29 29 30 31 31 31 31 30 29 28 28 29 29 29 29 28 28 27 26 26 28 28 28 28 29 29 30 30 30 31 31 31 30 31 32 31 31 31 31 30 28 27 27 29 29 30 30 31 31 30 29 27 27 28 28 29 30 31 31 30 31 32 32 32 32 32 31 31 30 30 30 30 30 31 31 32 32 32 32 32 31 31 31 30 30 29 29 29 30 30 30 30 30 29 29 29 29 29 29 29 29 28 28 28 29 30 29 29 27 26 26 25 25 25 24 24 24 24 24 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 25 60 60 61 61 61 60 60 61 61 61 61 61 61 61 61 60 60 61 61 60 59 59 60 59 58 58 58 58 57 57 57 58 57 57 57 56 55 55 56 57 57 57 56 56 57 57 57 56 56 55 55 55 55 54 54 55 55 55 56 57 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 53 54 54 54 54 54 54 54 54 54 54 54 53 53 53 52 52 52 52 52 51 50 49 49 49 49 49 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 50 50 50 50 49 49 49 50 50 50 50 50 50 50 50 49 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 44 44 44 46 47 47 47 47 47 46 46 46 45 46 47 47 46 46 44 45 46 45 45 46 46 45 45 44 45 46 46 45 46 46 43 43 44 46 46 45 44 45 45 44 43 44 44 42 41 40 39 38 38 38 39 40 41 41 41 42 43 43 44 44 44 44 44 44 44 43 43 43 43 42 41 41 41 40 40 40 41 41 42 42 42 42 42 42 42 41 41 41 41 42 41 40 40 39 39 39 39 38 37 36 36 37 37 37 38 39 40 40 40 40 40 41 41 41 42 41 41 41 41 42 42 42 42 43 43 44 44 45 46 45 44 44 43 42 41 41 41 41 40 39 39 39 38 37 38 37 36 36 35 34 34 34 34 34 35 36 36 35 36 36 36 35 34 33 32 32 31 30 31 33 34 34 34 35 35 34 33 34 35 35 34 34 34 34 34 33 33 34 34 33 34 34 34 32 32 32 32 31 31 32 32 33 34 32 31 32 32 31 30 29 29 29 28 28 28 27 27 27 27 27 27 26 26 26 26 26 27 28 28 27 26 26 26 26 26 26 26 26 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 30 29 28 28 28 29 30 30 31 32 32 32 32 31 29 29 29 29 30 31 30 29 29 28 26 25 27 27 27 28 29 29 31 31 31 31 30 30 30 31 32 31 30 31 30 30 29 27 27 28 29 29 31 32 32 31 29 28 28 27 28 29 30 30 30 29 31 32 32 32 32 32 32 31 30 30 29 29 30 30 31 32 32 32 32 32 31 30 30 30 30 30 29 29 29 30 30 30 30 29 29 29 30 29 28 28 29 28 27 28 29 29 29 28 27 27 26 26 26 26 26 25 25 26 24 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 25 60 61 62 62 61 61 61 62 61 61 61 62 62 62 61 61 61 62 61 61 60 59 60 60 59 59 59 58 58 58 57 58 58 58 57 56 56 55 56 57 58 58 57 57 57 57 57 57 57 55 55 55 55 55 55 56 57 56 56 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 54 54 54 55 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 51 51 50 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 50 50 50 50 50 51 51 51 50 50 50 50 50 50 50 50 49 49 50 50 50 50 49 49 50 50 50 50 50 50 50 50 49 49 49 48 48 48 48 48 47 46 46 45 45 45 45 45 45 45 45 45 46 47 48 48 48 47 46 46 46 46 46 47 47 46 46 45 45 46 46 46 46 46 46 45 45 46 48 47 46 47 46 44 45 45 45 46 46 46 46 45 45 44 44 44 43 41 40 40 39 39 38 39 40 40 41 42 42 43 43 43 43 43 43 44 44 44 44 44 43 42 42 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 39 38 38 38 38 37 36 36 37 37 37 38 39 39 40 40 41 41 41 41 41 41 41 41 41 41 42 42 43 43 43 44 44 44 45 46 45 44 43 43 42 42 42 41 41 41 40 39 39 38 37 37 37 36 35 35 35 35 35 34 34 34 35 36 35 34 35 35 35 34 33 32 31 30 30 31 32 34 35 36 35 34 33 33 34 36 36 35 35 36 35 35 35 35 35 35 34 34 35 34 32 33 33 32 31 32 34 35 34 33 32 32 33 33 31 30 30 31 31 30 29 29 28 27 27 28 28 28 26 26 27 27 26 27 29 29 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 28 28 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 28 27 29 29 30 30 31 31 33 33 32 33 31 30 30 29 29 31 31 30 29 29 28 25 25 26 26 27 27 28 29 30 31 31 30 29 30 31 31 32 31 30 30 30 30 29 28 27 28 28 29 30 31 32 31 29 29 29 28 28 28 29 29 29 30 31 32 32 31 31 31 31 30 30 30 29 29 30 30 31 32 32 32 32 32 32 31 30 29 29 29 30 29 29 30 30 30 30 29 29 29 29 29 28 28 28 27 27 28 28 29 29 28 28 27 27 27 27 27 26 26 26 26 25 23 23 23 23 23 23 23 23 23 23 24 24 23 24 23 23 23 23 23 24 25 61 61 62 62 62 62 62 62 62 62 62 63 63 62 62 62 62 62 62 61 60 60 60 60 60 59 59 59 59 58 58 58 59 58 58 57 56 56 56 57 58 58 57 57 57 58 58 58 57 56 56 56 56 56 56 57 57 57 56 56 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 54 53 53 53 53 53 52 52 52 51 50 49 49 49 48 48 48 48 48 48 48 48 48 47 47 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 49 49 50 50 50 50 50 50 50 51 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 48 47 47 47 47 47 47 46 45 45 45 45 45 46 46 46 46 46 47 47 48 48 48 47 47 46 46 47 48 47 47 47 47 47 47 47 47 46 46 47 47 46 46 48 48 47 48 47 46 46 45 45 46 47 47 47 46 45 44 44 44 43 41 40 40 40 39 38 38 39 40 41 42 42 43 43 42 43 43 43 44 44 44 44 44 43 42 42 41 41 41 41 41 40 40 41 41 41 41 41 41 40 40 40 40 40 41 41 41 40 40 39 38 38 37 37 36 36 37 37 37 37 38 38 38 39 40 40 40 40 41 41 41 41 41 41 42 42 43 43 44 44 44 44 44 45 46 45 45 44 43 43 43 42 42 41 41 40 40 40 39 37 37 38 38 37 36 36 36 35 35 34 34 35 36 35 35 34 34 34 33 32 31 31 30 31 32 33 34 36 36 35 34 33 34 35 36 37 36 36 37 37 37 37 36 36 36 35 34 34 34 33 33 33 32 33 33 35 36 35 34 33 34 34 33 32 31 31 32 32 30 29 29 28 27 28 29 29 28 26 26 27 27 27 28 29 30 30 29 29 28 27 26 26 26 26 26 26 26 26 26 26 27 29 29 30 31 30 27 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 27 28 30 31 31 31 31 32 33 31 31 33 33 31 31 30 30 31 31 29 28 28 27 25 25 26 27 27 27 29 29 30 30 30 30 30 30 31 32 32 32 31 30 30 30 29 28 27 28 28 29 30 31 32 31 30 29 30 29 28 27 27 28 29 30 31 32 32 31 31 30 30 30 30 30 29 29 30 30 31 32 32 32 31 31 32 31 30 29 29 29 29 29 29 30 30 30 30 30 29 29 29 29 29 29 28 27 27 27 28 29 28 27 27 27 28 27 27 27 26 26 25 25 25 24 23 23 23 23 23 24 24 24 25 25 25 25 25 24 23 23 23 24 25 26 62 62 62 62 62 62 63 63 63 62 63 63 63 63 63 62 62 62 62 61 61 61 61 61 60 59 59 59 59 59 59 60 60 59 59 58 57 56 57 58 59 58 58 58 58 58 58 58 58 57 57 57 57 57 57 57 58 58 57 57 58 58 57 57 57 57 57 56 56 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 55 54 54 54 54 54 53 53 53 52 52 52 51 51 50 50 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 47 47 47 47 48 48 49 49 49 49 49 50 50 50 50 50 50 50 50 51 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 48 47 47 47 47 47 46 46 45 45 45 45 46 46 47 47 46 46 47 47 48 48 48 48 47 47 47 48 48 48 48 48 48 48 48 48 48 47 47 48 48 47 47 48 48 48 48 48 48 47 47 46 46 47 47 46 46 45 44 44 44 43 42 41 39 39 38 38 38 40 40 41 42 42 42 42 42 42 42 43 44 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 41 41 40 40 41 40 39 39 39 40 41 41 41 40 40 40 39 38 37 37 36 36 37 37 37 38 38 38 39 39 39 39 39 40 40 41 41 41 41 41 41 42 43 44 45 45 44 44 45 45 46 45 44 43 43 43 43 42 42 41 41 40 40 39 39 38 38 39 39 38 37 36 36 35 34 33 33 35 36 36 35 35 35 35 34 32 31 31 31 31 32 34 35 37 36 35 34 34 36 37 38 38 37 36 37 38 39 39 38 37 37 36 35 35 35 35 34 33 33 34 35 36 35 34 34 34 34 34 33 33 31 31 32 32 30 29 29 27 28 29 29 29 28 27 27 27 28 28 29 29 30 31 30 29 29 28 27 27 27 26 26 26 26 26 26 26 28 30 31 31 32 31 28 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 29 30 31 30 31 32 32 32 31 30 32 32 32 31 30 30 31 30 29 28 28 28 26 25 26 27 27 28 29 30 30 30 30 31 32 31 30 32 33 32 32 31 30 29 29 29 28 28 28 28 29 31 31 32 31 30 30 29 28 27 27 28 29 30 30 31 31 32 32 31 30 30 30 29 29 30 30 30 31 32 31 31 31 30 31 31 31 30 30 30 29 28 29 29 30 30 29 29 29 29 29 29 30 29 28 27 27 28 29 30 29 27 26 27 27 27 26 26 26 26 25 25 24 24 23 23 23 24 24 24 25 25 26 26 26 26 25 24 23 23 24 25 26 26 62 63 64 64 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 62 62 61 62 62 61 60 60 60 59 59 60 60 60 60 59 58 57 57 57 58 58 59 58 58 59 59 59 58 58 58 57 57 58 58 58 58 59 59 58 58 59 58 57 57 57 57 57 56 56 56 56 56 56 56 56 56 55 55 55 55 55 55 55 55 55 55 55 55 54 54 54 54 54 53 53 52 52 52 52 51 51 51 51 50 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 47 48 48 48 48 49 49 49 49 49 50 50 49 49 49 50 50 50 50 50 51 50 50 50 50 50 50 50 49 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 45 46 46 46 46 47 47 47 47 46 46 47 47 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 49 48 48 47 46 47 47 46 45 45 44 43 43 43 43 43 42 40 39 38 38 39 40 40 41 42 42 41 41 41 42 42 43 44 44 43 43 42 42 42 41 41 41 41 40 40 40 39 40 40 40 40 40 41 40 40 39 40 40 41 41 41 41 41 40 40 39 38 38 36 36 37 38 38 38 38 40 40 39 39 39 39 40 40 40 41 41 42 42 42 42 43 44 45 45 45 45 46 46 46 46 45 44 44 44 43 43 42 41 41 41 40 40 39 38 38 39 38 37 37 37 36 35 34 33 33 35 37 37 36 36 36 36 36 34 33 32 31 31 33 35 36 37 37 36 35 35 36 37 39 39 38 38 38 39 40 40 39 38 38 37 36 36 36 36 35 34 33 35 36 36 36 35 34 34 34 33 33 33 31 31 32 32 30 29 28 28 29 30 30 29 28 27 27 27 28 29 29 30 30 31 30 30 29 28 27 27 27 27 26 26 26 26 26 26 28 30 32 31 32 32 31 28 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 28 28 29 30 30 31 31 31 30 30 30 30 31 30 30 30 30 30 29 29 29 28 27 26 26 26 26 27 28 29 29 29 30 31 32 32 32 33 34 33 33 32 30 29 29 29 29 29 28 27 28 30 31 32 32 32 31 29 28 27 27 29 30 30 30 31 31 32 31 30 30 30 29 29 29 30 30 30 31 31 31 31 31 30 30 30 31 31 31 30 29 28 29 30 30 30 30 29 29 29 29 29 30 29 28 27 27 28 29 30 29 27 26 26 26 27 26 26 25 25 25 24 24 23 23 23 23 24 24 26 26 26 26 26 26 26 26 25 24 23 24 25 25 24 63 64 64 64 64 64 63 63 62 63 62 61 62 62 62 62 62 63 63 63 62 62 62 63 62 61 61 61 61 61 60 60 59 59 58 58 57 57 58 58 58 59 59 59 59 60 59 59 59 59 58 58 59 59 59 58 59 59 59 58 59 59 58 58 58 58 57 56 56 56 56 56 56 56 56 56 56 56 56 55 55 55 55 55 56 56 55 55 55 55 55 55 55 54 53 53 53 53 53 52 51 52 52 51 50 49 49 49 49 49 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 47 47 48 48 48 49 49 49 49 50 49 49 49 49 49 50 50 51 51 51 50 50 50 50 50 50 50 49 49 48 48 49 48 48 48 48 48 47 47 47 46 46 46 45 46 47 47 46 46 47 48 48 48 47 47 47 48 48 48 48 48 49 49 49 49 49 48 47 47 47 47 47 47 48 48 48 48 48 49 48 48 48 47 47 48 48 48 47 47 47 46 45 45 45 43 42 42 42 42 43 42 40 40 39 38 38 39 39 39 41 41 41 41 41 41 42 43 43 44 43 42 42 42 42 41 41 41 41 41 41 41 40 39 39 39 40 40 41 41 40 39 40 41 41 41 41 41 40 40 40 39 39 38 36 36 37 38 38 39 39 39 40 40 40 40 40 40 40 40 41 42 43 43 43 43 43 43 44 45 45 46 46 46 46 46 45 45 45 45 44 43 43 42 42 41 40 39 39 38 38 38 37 36 36 36 36 35 34 33 34 36 37 37 37 37 37 37 36 35 34 33 32 32 34 35 35 37 37 37 37 36 35 37 38 39 39 39 40 40 41 40 40 39 39 38 37 37 37 37 36 34 33 35 36 36 36 36 35 34 34 33 33 32 31 30 31 30 30 29 28 29 30 30 30 29 29 28 27 27 27 29 30 30 31 31 30 30 29 28 27 28 29 29 28 28 28 28 28 27 28 30 31 31 31 31 32 30 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 28 30 29 29 30 30 30 30 30 30 30 30 30 31 30 30 30 30 29 28 27 26 27 28 28 27 27 29 29 30 31 31 32 32 32 34 35 34 33 33 32 30 30 30 30 29 27 27 28 29 30 31 32 33 31 30 29 27 27 29 30 30 30 32 32 31 31 30 30 29 29 29 30 30 30 30 31 30 31 32 31 31 30 30 30 31 30 30 29 29 30 31 31 30 30 30 30 29 29 30 30 30 29 28 27 28 30 30 30 28 28 27 26 27 27 26 26 25 24 24 23 23 23 24 25 25 26 26 27 27 27 27 27 27 26 26 25 24 24 24 24 23 64 64 63 63 63 63 63 62 61 62 61 60 61 61 61 61 62 62 63 63 63 63 63 63 63 62 62 61 61 61 61 60 59 58 58 58 58 58 59 59 59 59 60 60 59 59 59 59 59 60 59 59 59 59 59 58 58 58 59 58 58 59 58 58 58 57 57 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 55 55 56 56 56 56 55 55 55 55 55 54 54 54 54 53 53 53 52 52 52 52 51 50 50 49 49 49 50 50 49 49 49 48 49 49 49 49 49 49 49 49 49 49 48 48 47 46 46 46 46 46 46 46 47 48 48 48 48 48 49 49 49 48 48 48 49 50 50 51 51 51 51 50 50 50 50 50 50 49 49 49 48 49 48 48 48 48 48 47 47 46 46 46 46 46 46 47 47 47 46 47 48 48 48 48 48 48 48 49 49 49 49 49 49 48 48 49 49 48 47 46 46 46 47 47 47 48 47 48 49 49 48 47 47 46 46 47 47 47 47 46 46 45 45 45 44 43 42 42 42 41 41 40 40 39 39 38 38 38 39 41 41 40 40 40 41 42 42 42 43 43 42 42 43 42 41 41 40 40 41 41 41 40 39 39 39 40 40 40 40 39 39 40 41 41 41 41 40 40 40 39 38 38 37 36 36 38 39 40 40 39 39 40 41 41 41 41 41 41 41 42 42 43 44 44 44 44 43 44 45 46 46 46 45 46 46 45 45 44 44 44 43 43 43 43 42 40 39 39 39 38 37 36 35 35 35 35 34 34 33 34 36 36 37 36 36 36 36 36 35 34 33 32 32 33 34 35 37 37 37 37 36 35 36 37 38 38 39 39 39 39 40 40 40 39 37 37 37 37 36 34 34 34 35 36 36 36 36 35 34 34 34 33 31 30 30 29 29 29 29 29 29 30 30 30 30 29 29 28 27 27 28 30 32 32 31 30 30 29 28 28 30 30 30 30 29 29 30 30 29 28 28 30 31 31 30 30 29 29 28 28 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 29 29 30 30 29 29 30 30 30 30 31 32 31 31 31 30 30 29 28 27 27 28 29 29 29 30 31 32 33 32 33 33 32 34 36 34 34 34 33 32 31 30 30 29 28 27 27 29 30 30 32 33 32 30 30 28 27 29 30 30 31 32 32 31 30 30 30 29 29 29 30 30 30 30 30 30 31 32 31 31 31 30 30 30 30 30 29 29 30 31 30 30 30 30 30 28 28 30 30 30 29 28 27 29 30 30 30 29 29 28 27 27 27 27 26 25 24 24 24 24 24 25 26 26 27 27 27 27 28 28 28 27 27 27 26 25 23 23 23 24 64 64 63 62 62 62 62 61 61 61 61 60 60 60 60 61 61 61 62 62 62 63 63 63 63 62 62 61 61 61 61 60 59 59 59 59 59 59 59 60 60 60 60 60 60 59 59 59 59 60 60 60 59 59 59 58 57 58 59 58 58 58 58 58 57 57 57 56 56 56 56 56 56 56 55 55 56 56 55 55 56 55 55 55 56 56 55 55 55 55 55 54 54 55 55 55 54 54 53 53 53 53 52 52 51 51 51 50 50 50 51 50 50 50 49 49 50 50 50 50 50 50 50 49 49 49 49 49 48 48 47 47 46 46 46 46 46 47 47 48 48 48 48 49 49 48 48 48 49 49 50 51 51 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 49 48 48 47 46 46 46 47 47 47 48 48 48 47 47 48 48 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 47 46 45 46 46 46 47 48 47 48 49 48 47 46 46 46 46 46 47 47 47 46 46 46 46 45 45 44 43 43 43 41 40 40 40 40 40 39 38 38 38 40 41 40 40 40 40 41 41 42 42 42 42 41 42 42 41 41 40 40 40 40 40 40 39 39 40 39 39 39 40 39 39 40 40 41 41 40 40 39 39 38 38 37 36 36 37 38 39 40 40 40 39 40 41 41 41 41 42 42 42 42 43 43 44 44 44 44 44 45 45 45 46 46 45 45 46 46 45 44 43 43 43 43 43 43 42 41 41 40 39 38 37 36 36 36 36 35 35 34 34 34 35 35 36 36 35 34 35 36 35 33 32 32 32 33 35 36 37 38 37 38 37 36 36 36 37 38 39 39 39 39 39 40 40 39 38 37 37 37 36 35 35 35 35 36 35 34 35 34 34 34 33 32 30 30 30 29 29 29 30 30 30 30 30 31 30 30 30 29 28 27 28 31 32 32 31 30 30 30 28 28 30 30 30 30 30 30 30 30 30 29 28 29 30 30 30 30 30 30 30 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 27 29 29 29 29 29 28 28 30 30 30 30 31 32 32 31 30 30 29 29 29 27 26 27 28 28 29 30 32 33 34 34 34 33 33 34 35 35 34 34 34 33 32 31 30 29 27 27 27 27 29 30 32 33 32 31 30 29 27 28 30 30 31 32 32 31 30 30 29 29 28 29 30 30 30 30 30 30 31 31 31 30 30 30 30 30 30 30 29 29 31 31 30 30 30 30 30 29 28 28 29 29 29 27 28 29 30 30 30 30 29 27 27 27 26 26 26 24 24 25 26 25 25 26 27 27 27 27 28 28 28 28 27 27 27 27 26 25 24 24 25 24 65 64 64 63 61 61 61 61 60 60 60 60 60 60 59 60 60 60 61 62 62 62 63 63 62 62 62 62 62 61 61 60 60 60 60 60 61 60 60 61 60 60 60 60 60 59 58 59 59 59 60 60 59 58 58 58 57 57 58 58 58 58 57 58 57 57 57 56 56 56 56 55 55 56 56 55 56 55 55 55 56 55 55 55 55 55 55 55 54 54 54 54 54 54 55 55 54 54 53 53 53 53 53 52 52 52 52 51 51 51 51 51 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 48 46 46 46 46 46 46 47 47 47 48 48 48 48 48 48 48 49 49 50 50 51 51 51 51 51 50 50 50 49 49 49 49 48 48 48 48 48 48 48 47 47 47 46 47 47 47 47 48 48 48 48 48 48 49 49 48 48 49 48 48 48 48 48 48 48 47 47 48 48 48 47 46 45 45 46 46 47 47 47 48 48 48 47 46 46 46 46 46 46 46 46 45 45 46 46 46 45 44 44 43 43 42 40 40 40 40 40 40 39 38 38 39 40 40 39 39 39 40 41 41 41 42 42 41 40 41 41 40 40 40 40 39 39 39 39 38 39 39 39 39 39 38 39 40 40 40 40 40 39 38 38 38 37 37 36 36 38 39 39 40 40 40 40 40 40 41 41 41 42 42 43 43 43 44 44 44 44 44 44 45 45 45 45 46 45 45 46 46 45 44 44 43 43 42 42 42 42 41 40 40 38 37 36 36 37 37 37 37 36 35 34 33 33 34 35 36 35 34 35 35 34 33 32 32 33 35 36 36 38 38 38 39 38 38 38 38 38 39 40 40 40 40 39 40 40 39 39 39 38 37 37 36 36 36 35 34 34 33 33 33 33 33 32 31 31 32 32 31 31 31 31 31 32 31 31 32 31 30 30 29 29 27 28 30 32 32 31 30 29 29 29 29 30 30 30 31 31 31 30 30 30 29 28 28 29 30 30 30 30 30 30 29 29 29 28 27 26 26 26 26 26 26 26 26 26 26 26 27 27 27 28 28 28 29 30 30 30 31 32 32 31 30 29 29 28 28 28 27 26 27 28 28 28 29 31 33 34 35 35 35 34 34 35 35 35 34 34 33 32 31 29 28 27 27 27 27 29 30 31 32 32 30 29 29 28 29 30 31 32 32 32 31 30 30 29 28 28 28 29 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 28 28 30 31 30 30 30 30 30 29 28 27 27 28 28 27 28 29 30 30 29 29 28 27 26 26 26 26 25 24 24 26 27 26 26 26 27 27 28 28 29 29 28 27 27 26 26 26 25 25 26 26 26 24 64 64 64 64 63 61 61 60 59 59 60 60 59 59 60 60 60 60 61 61 61 62 62 62 62 62 62 62 62 62 62 61 61 61 62 61 61 61 61 61 61 61 60 60 59 59 58 58 58 59 59 59 59 58 58 57 57 57 58 57 58 58 58 58 57 56 56 56 56 55 56 55 55 56 56 55 55 55 55 55 55 55 55 55 55 54 54 54 54 53 53 53 54 54 55 54 54 53 53 53 52 52 52 52 51 51 52 52 52 52 51 51 51 51 50 51 51 51 51 51 50 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 46 47 47 48 48 48 47 47 48 49 49 50 50 51 51 51 51 51 50 50 50 50 50 49 48 48 48 48 48 48 48 48 47 46 46 47 47 47 48 48 48 48 48 49 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 48 47 46 45 45 45 46 46 46 46 46 48 48 47 46 46 45 45 46 46 45 45 46 45 44 45 45 45 45 44 43 43 42 42 41 40 39 39 39 39 39 38 37 38 40 40 39 38 39 40 40 41 41 42 42 41 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 39 38 38 38 40 40 39 40 39 38 38 38 38 37 36 36 37 38 39 39 40 40 40 40 40 40 40 40 41 41 42 43 43 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 44 44 44 43 42 42 42 41 40 40 39 39 38 37 38 37 36 36 36 35 35 35 34 33 32 33 33 33 33 33 33 33 32 32 32 33 34 35 36 37 37 38 38 38 38 39 39 39 39 40 41 41 41 41 41 40 39 39 40 39 38 37 36 36 36 35 34 34 33 33 33 33 32 32 33 33 34 33 33 33 33 33 33 33 33 32 32 32 31 30 30 29 28 28 30 31 33 32 30 29 29 30 29 30 30 31 32 31 31 30 29 29 29 29 29 29 31 31 30 30 30 30 29 29 29 29 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 28 29 29 30 30 30 31 32 31 31 31 31 30 29 27 27 27 27 26 27 29 29 29 30 32 33 34 34 35 35 35 33 33 34 34 33 34 33 31 30 29 29 29 28 28 28 30 30 31 31 30 30 28 27 28 30 30 31 31 31 32 31 30 30 29 28 28 28 29 30 29 29 30 30 30 31 31 30 30 30 30 30 30 30 28 28 29 30 30 30 30 30 30 30 29 28 27 27 28 27 28 29 30 29 28 27 27 27 27 27 27 26 24 24 24 25 27 27 27 27 27 28 29 30 30 29 28 27 27 26 26 26 25 26 27 27 26 25 64 64 64 64 64 62 61 60 59 59 59 60 59 60 61 60 60 60 61 61 61 62 62 62 62 62 63 63 63 63 62 61 61 62 62 62 62 62 62 61 61 61 60 60 59 59 58 57 57 59 60 59 59 59 58 57 57 57 58 57 58 58 58 57 57 57 56 55 55 55 55 55 55 56 56 55 54 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 53 54 54 54 53 53 52 52 52 52 52 52 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 50 49 49 49 49 48 48 48 47 47 47 47 46 46 46 46 45 45 46 46 47 47 47 47 47 47 47 48 49 49 50 50 50 50 51 50 50 50 50 50 50 50 49 48 48 48 48 48 48 49 48 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 49 48 48 47 47 47 48 48 48 48 47 46 46 47 47 48 47 46 45 45 45 45 45 45 46 47 47 46 46 45 45 45 46 46 45 45 45 45 44 44 45 44 44 43 43 43 42 42 41 40 39 38 38 38 38 38 37 38 39 40 39 38 39 40 41 41 41 42 42 41 40 40 40 40 40 40 40 40 40 39 39 38 38 38 37 37 37 38 38 39 39 39 39 39 38 38 38 37 37 36 36 37 38 39 39 40 41 41 41 40 40 40 40 41 41 42 42 43 44 43 43 43 43 44 44 44 44 45 45 44 44 44 45 45 45 44 44 43 43 43 43 42 40 40 39 40 40 39 38 38 36 35 36 35 35 36 36 36 35 34 33 32 32 32 32 32 32 32 32 32 32 34 35 36 36 36 36 36 36 37 38 38 39 39 40 40 40 41 41 41 41 40 39 40 40 39 38 37 37 36 35 35 35 34 34 35 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 31 30 30 29 28 29 30 32 34 32 30 29 30 30 30 30 31 33 33 31 30 29 29 29 29 30 30 30 31 32 32 30 30 30 30 29 28 28 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 28 30 31 31 31 32 33 33 31 30 30 31 31 30 29 28 27 26 26 27 29 30 30 31 32 32 31 31 33 34 34 33 33 32 31 32 34 33 33 32 32 31 30 29 28 28 29 30 31 31 30 29 29 27 27 29 30 30 30 31 32 32 31 30 30 29 28 28 29 29 29 30 30 30 30 31 30 30 30 30 30 30 30 30 29 28 28 28 28 28 28 28 29 29 28 29 29 27 26 26 27 28 29 28 27 27 27 27 27 26 26 25 24 24 24 26 27 27 27 27 27 29 30 30 30 30 29 27 27 27 26 26 26 26 27 26 26 26 63 63 63 63 63 62 61 60 59 58 59 59 59 59 60 59 59 59 60 61 61 62 62 61 61 62 62 62 62 62 62 62 62 62 62 62 61 62 62 61 60 60 60 60 59 59 59 58 57 58 59 59 59 59 58 58 57 57 57 57 58 58 57 57 57 57 56 55 55 55 54 54 55 55 55 55 54 54 54 54 54 54 54 54 53 53 53 53 53 53 52 52 52 53 54 54 53 52 52 52 52 52 51 51 51 51 50 51 51 51 51 50 51 51 50 50 50 51 51 51 50 49 49 49 49 48 48 48 47 47 47 47 46 46 46 46 45 45 45 46 46 46 46 47 47 47 48 48 49 49 49 49 50 50 51 50 50 50 50 50 49 49 49 48 48 48 49 49 49 49 49 48 48 48 48 48 48 49 49 49 49 49 48 48 48 49 49 49 48 47 47 47 47 48 48 48 48 47 47 47 47 47 47 46 45 44 44 45 44 44 45 46 46 45 45 44 44 44 45 46 45 44 44 45 44 43 44 44 44 45 45 44 44 43 41 40 40 39 39 38 38 38 38 37 38 38 38 37 38 39 40 41 41 41 42 41 41 41 40 40 40 41 41 41 40 40 40 40 39 39 38 37 37 37 38 38 38 38 38 38 37 38 37 37 37 36 36 37 37 38 38 40 41 41 41 40 40 41 41 41 42 43 43 43 43 43 43 43 43 43 43 43 43 44 45 43 43 44 45 45 44 44 43 43 43 43 42 42 41 40 40 40 40 39 38 37 36 37 37 36 37 37 37 37 36 35 34 34 34 33 32 32 33 34 33 32 32 34 35 35 35 35 35 36 36 36 36 37 39 39 39 39 39 40 40 40 41 40 40 40 40 39 38 37 37 36 36 36 36 36 36 36 35 36 35 35 35 34 34 34 34 34 34 34 34 34 34 33 32 30 30 29 28 28 29 31 33 33 32 30 30 30 30 30 30 32 34 33 31 29 29 29 30 30 30 30 30 31 32 32 31 30 30 29 28 28 28 27 26 27 27 26 26 26 26 25 25 26 26 26 26 26 27 29 31 32 33 32 33 33 31 29 29 30 31 30 29 29 28 26 26 28 29 30 30 31 30 29 29 30 32 33 33 32 31 31 30 31 33 34 34 34 33 32 31 28 27 27 29 30 31 31 30 30 29 28 27 28 30 29 29 30 31 32 32 31 30 29 28 28 29 29 30 30 30 30 30 30 30 30 29 29 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 28 27 26 26 26 27 28 28 27 27 26 26 26 26 25 24 24 24 25 27 27 28 29 28 29 29 30 30 30 29 29 27 27 27 26 26 26 26 27 26 26 27 63 62 62 62 62 62 62 60 59 58 58 58 58 58 58 58 58 60 60 60 61 62 62 61 60 61 62 62 61 61 62 62 62 62 62 62 61 61 61 61 60 60 59 59 59 58 58 57 57 58 59 59 59 58 58 58 56 57 57 56 57 58 58 57 57 57 56 56 56 55 55 54 54 55 55 55 55 54 54 53 53 54 54 53 53 52 52 53 52 52 52 52 52 53 53 53 53 52 52 51 51 51 51 51 50 50 50 50 51 51 50 50 50 50 50 50 50 50 50 50 50 50 49 49 48 48 48 48 47 47 47 46 46 45 45 45 45 45 45 46 46 46 46 47 47 48 48 48 48 48 48 49 49 49 50 50 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 48 48 49 48 48 49 49 49 49 49 49 48 47 48 48 48 48 48 47 46 46 47 48 48 48 48 47 47 47 46 46 46 45 44 43 44 44 44 44 44 45 46 45 44 44 43 43 44 45 45 44 44 44 44 43 42 43 44 45 45 45 44 43 42 40 40 40 40 39 38 39 38 38 37 37 37 37 37 37 38 39 40 40 41 42 42 41 41 41 41 42 42 41 41 41 41 40 39 39 38 37 37 37 37 37 37 38 37 37 37 37 37 36 36 36 36 37 37 38 39 40 41 41 41 41 41 41 41 42 42 42 43 43 43 43 42 42 42 42 43 43 43 44 43 43 44 44 44 44 44 43 43 43 43 43 42 41 40 40 40 39 39 39 38 37 38 38 37 37 38 38 38 37 36 36 36 36 35 34 34 34 34 34 34 33 32 33 34 34 34 34 35 36 36 36 36 37 38 38 38 38 39 39 39 39 40 40 41 40 40 39 38 37 37 36 37 38 37 37 37 36 36 37 37 36 35 34 34 34 33 32 33 33 32 32 32 31 30 30 30 29 28 29 30 30 32 33 32 31 31 31 31 31 31 33 34 33 31 30 29 30 30 31 31 31 30 30 30 30 30 30 30 29 27 28 29 27 27 28 28 27 26 26 26 25 25 25 26 26 26 26 26 26 28 30 32 31 31 31 30 29 28 29 29 29 30 30 28 26 26 28 29 30 30 30 29 28 29 30 31 31 31 30 29 29 30 31 32 33 34 33 33 32 31 28 27 28 30 30 31 31 30 29 29 27 27 27 29 29 29 30 31 31 31 31 30 29 28 28 29 29 30 30 30 30 30 30 30 29 29 29 30 30 30 29 28 28 28 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 27 27 27 27 26 26 26 26 25 24 24 24 26 27 27 27 28 29 30 30 30 30 30 29 27 27 27 26 26 27 27 27 27 27 27 27 62 62 62 62 62 61 61 61 60 59 58 57 57 58 57 58 59 59 59 60 61 61 61 60 59 60 61 61 60 60 62 62 62 62 61 61 61 61 61 61 60 60 59 59 59 58 57 57 57 57 58 58 58 58 58 58 56 56 56 56 57 57 57 56 56 56 56 56 56 56 56 55 54 54 55 55 54 53 53 53 53 53 53 53 53 52 52 52 52 51 51 52 52 52 52 52 52 52 51 51 51 51 51 50 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 48 47 47 47 47 46 46 46 45 45 45 45 45 45 45 45 45 46 46 47 48 48 48 48 48 47 48 48 49 49 50 50 49 49 49 49 49 49 49 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 47 47 48 48 47 48 47 46 46 46 47 47 47 47 46 47 47 45 45 45 45 44 43 43 43 44 44 44 45 45 44 44 44 43 43 44 44 45 44 43 44 44 43 42 42 42 43 43 43 43 43 42 40 39 39 39 38 38 38 38 37 37 37 37 37 37 37 37 37 38 39 40 41 41 41 41 41 41 41 42 42 41 41 40 40 39 39 38 37 37 37 37 37 37 38 37 37 37 37 37 36 35 36 37 37 38 39 39 40 41 41 41 41 41 41 41 41 41 42 43 43 43 43 42 42 42 42 42 43 44 44 42 43 44 44 44 44 44 43 43 43 43 43 42 41 40 40 40 39 39 40 39 38 38 39 38 38 39 38 38 38 37 37 37 36 36 36 36 35 34 34 34 33 32 32 33 33 34 33 34 36 36 36 36 37 37 37 37 37 39 39 38 39 39 40 40 40 40 39 39 38 37 37 38 39 39 38 37 37 37 37 37 36 35 34 34 34 33 31 31 31 30 30 30 30 30 29 29 28 28 29 30 30 30 32 33 32 32 32 32 32 33 34 34 33 32 31 30 30 30 32 32 32 31 30 30 30 30 29 29 28 28 29 28 28 29 29 29 29 28 27 26 25 25 25 26 26 26 26 26 26 26 27 29 30 29 29 30 30 28 28 29 29 30 29 29 27 25 26 28 30 29 29 29 27 27 28 29 30 30 28 28 29 30 30 31 32 33 32 32 32 30 29 27 28 29 30 31 30 29 29 29 27 27 27 27 28 29 30 30 30 30 30 30 29 28 28 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 29 29 29 29 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 26 24 24 24 26 26 27 27 28 29 30 30 30 30 30 28 27 27 27 26 26 27 27 27 27 27 27 28 62 62 62 61 61 60 60 61 61 60 59 57 57 56 56 57 58 58 58 59 60 60 59 59 58 59 59 60 59 60 61 61 62 62 61 61 60 60 60 60 60 60 59 59 59 59 58 58 58 57 57 58 57 57 58 57 57 56 56 56 57 57 57 56 56 56 56 56 56 56 56 55 55 54 54 54 54 54 53 52 52 52 53 53 52 51 51 51 51 51 50 51 51 51 51 51 51 51 51 50 50 50 49 49 49 49 48 48 49 49 49 49 49 50 50 49 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 47 46 45 45 45 45 45 45 47 48 47 47 47 47 47 47 48 48 49 50 50 50 49 49 49 49 49 49 48 49 49 50 50 50 50 50 49 49 49 49 49 49 49 48 48 48 48 47 47 47 47 47 47 47 47 47 46 45 46 47 47 46 46 46 45 44 45 45 45 44 43 43 43 44 43 43 44 44 43 44 44 43 43 43 44 44 44 42 43 44 44 42 41 41 42 42 41 41 41 41 40 40 39 38 38 38 37 37 38 37 37 38 38 38 37 37 37 37 38 39 40 40 40 40 40 40 41 41 42 42 41 40 40 39 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 37 38 38 39 39 39 40 41 41 41 41 41 41 41 41 41 42 43 43 43 42 41 42 42 41 41 42 43 42 42 43 44 44 44 44 43 43 43 43 43 43 43 42 41 40 40 40 40 40 39 38 38 39 38 38 38 38 38 37 37 37 37 37 36 36 36 35 34 33 33 33 32 33 33 35 35 35 34 34 35 35 35 36 36 36 36 37 38 38 38 39 39 40 40 40 39 39 39 39 38 38 39 40 40 39 37 37 37 37 37 36 36 35 34 34 34 33 31 30 30 30 30 30 29 29 29 28 29 29 30 30 30 32 33 33 33 33 33 32 33 33 33 33 32 30 30 30 31 32 33 32 31 30 30 30 30 29 29 29 29 29 27 27 29 29 29 30 29 28 27 25 25 25 26 25 25 25 25 25 25 25 25 27 27 28 29 29 28 27 27 27 27 27 27 26 25 25 26 27 26 27 28 27 27 27 28 30 29 28 27 28 28 29 30 31 32 30 31 31 29 28 27 27 29 30 30 30 29 29 28 27 26 26 27 29 30 30 30 30 30 30 30 29 28 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 29 28 28 28 28 28 29 28 27 27 27 27 26 26 26 26 26 26 26 26 27 27 27 27 27 26 25 24 25 26 26 27 27 29 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 27 27 27 27 61 61 61 61 61 60 59 60 60 60 60 58 56 55 56 57 57 57 57 58 59 59 59 58 58 59 59 59 59 59 60 60 61 61 62 61 60 60 60 59 59 59 59 59 58 58 58 58 57 57 57 57 57 57 58 58 57 56 56 55 56 56 56 55 55 55 55 56 55 55 56 56 55 55 54 53 54 54 54 53 52 52 52 52 52 51 51 51 50 50 49 49 50 49 49 50 50 50 50 50 49 49 49 48 48 48 48 48 48 49 48 48 48 49 49 49 49 48 48 49 48 48 49 48 48 47 47 46 46 46 46 46 47 47 47 47 47 46 45 45 45 45 45 46 47 47 47 46 47 47 48 48 48 49 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 49 49 49 49 48 47 47 47 47 46 46 47 46 46 46 47 47 46 45 45 46 46 46 46 45 44 44 45 45 44 44 44 43 43 43 43 43 43 44 43 43 43 43 42 42 43 44 44 42 42 43 43 42 41 41 41 40 40 40 40 39 39 39 38 38 38 38 37 38 39 39 38 39 40 39 38 37 37 37 37 38 39 40 40 39 40 40 41 41 41 41 40 40 39 39 39 39 38 38 37 37 37 37 37 36 36 36 35 35 35 36 37 38 38 39 39 40 40 41 41 41 40 40 41 41 41 42 42 43 43 43 42 41 41 41 41 41 41 42 41 41 43 43 44 44 43 43 43 43 43 43 43 43 42 41 41 41 40 40 41 40 39 39 39 38 38 38 38 38 37 37 37 37 37 36 35 35 34 34 33 32 33 33 33 34 35 36 36 35 34 34 35 35 36 36 36 36 37 38 39 39 40 40 40 40 40 39 39 39 39 40 39 39 40 40 39 37 37 36 36 36 36 36 35 34 34 34 34 33 31 30 30 30 29 29 29 29 29 29 30 30 30 31 32 33 33 34 33 33 32 31 31 31 31 31 30 29 30 31 33 33 33 31 30 30 30 29 29 29 29 30 29 28 28 29 30 30 29 28 28 27 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 27 26 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 28 29 29 27 27 27 28 29 30 31 31 30 31 31 28 26 26 28 30 30 30 29 29 29 28 27 26 26 28 29 30 30 30 30 30 30 30 28 27 29 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 29 29 29 29 29 30 30 29 29 28 27 27 26 26 26 27 26 26 25 25 26 26 27 27 26 25 24 24 26 26 27 28 28 29 30 30 30 30 30 30 29 28 27 28 28 28 28 28 27 27 27 27 27 61 60 61 61 61 60 59 59 60 60 59 58 56 55 55 56 56 56 57 58 59 59 59 58 58 58 59 59 59 58 59 60 60 60 61 61 61 60 60 59 59 59 58 58 58 58 58 57 57 57 57 57 57 57 57 58 57 56 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 55 54 53 53 53 53 53 52 52 51 51 51 50 50 50 49 49 49 50 49 50 50 49 49 49 49 49 48 48 49 50 50 49 49 49 49 50 49 49 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 46 46 46 46 47 47 47 47 47 47 47 46 45 45 45 45 46 47 46 46 46 47 48 48 48 49 49 50 50 50 50 49 49 49 49 49 49 49 49 48 48 48 49 50 49 49 49 49 49 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 44 45 45 45 45 45 44 43 44 45 44 44 44 43 42 43 43 43 43 43 43 43 43 43 42 42 42 43 44 42 42 43 43 43 42 42 41 40 40 40 40 40 39 39 38 38 38 38 39 40 41 41 40 39 40 40 39 38 37 37 37 38 38 39 39 39 39 40 41 41 41 40 40 40 40 39 40 39 38 38 37 37 37 37 37 36 36 35 35 36 36 37 37 37 38 38 39 40 41 41 41 40 40 40 41 41 42 43 43 43 44 43 42 41 40 40 40 41 41 41 41 42 43 44 44 44 43 43 43 42 42 42 42 43 42 41 41 41 41 41 41 40 40 40 39 38 38 37 37 37 37 37 36 36 36 35 35 35 35 34 33 33 34 34 34 33 34 35 36 36 36 35 36 36 36 37 37 38 39 39 39 40 40 40 40 39 39 39 39 38 39 39 39 39 40 40 39 37 37 36 35 35 34 34 34 34 34 34 33 33 32 30 30 30 29 29 29 29 30 30 30 30 30 31 32 33 33 33 34 34 33 32 32 31 31 31 30 29 30 32 33 34 34 32 30 30 30 29 29 29 30 30 30 29 29 30 30 30 29 28 28 27 26 26 27 28 29 29 27 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 25 26 28 27 27 27 28 29 30 31 32 30 29 30 30 29 27 26 28 30 30 29 29 29 29 27 27 26 26 28 29 30 30 30 30 30 30 29 28 27 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 27 27 26 26 26 27 27 27 26 26 25 25 26 26 26 25 25 25 25 26 27 27 28 29 30 30 31 30 30 30 30 29 29 29 29 29 29 28 27 27 27 27 27 26 60 60 60 60 60 59 58 59 60 59 58 58 57 56 54 55 56 56 57 59 59 58 58 57 57 58 58 58 58 58 59 59 59 60 60 61 61 61 61 59 59 59 58 58 59 59 59 58 58 58 58 58 58 57 56 57 57 56 55 55 55 55 55 54 54 54 54 54 54 54 55 55 55 56 55 54 54 53 52 52 52 52 51 50 50 50 49 49 50 50 51 51 51 52 52 51 50 50 50 50 49 49 50 51 51 51 50 50 51 52 51 51 50 49 49 49 49 49 48 48 48 48 48 47 47 47 47 46 46 47 48 48 47 47 47 47 47 47 47 46 45 45 45 46 46 46 46 47 47 47 48 49 49 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 49 49 49 49 48 48 48 48 48 47 47 47 47 47 46 45 45 45 45 45 46 46 45 44 44 45 45 45 45 44 43 44 45 44 44 44 44 43 43 43 43 42 43 43 43 43 43 42 42 42 43 44 42 41 42 43 43 42 42 42 41 41 40 40 41 41 40 39 38 38 39 40 41 41 41 40 40 40 40 40 39 38 37 36 37 37 37 38 39 40 40 41 41 42 41 41 41 40 40 40 39 39 38 38 37 37 37 37 37 36 35 35 36 37 37 37 37 38 39 39 40 41 41 41 40 40 41 41 41 42 43 43 44 44 43 42 41 40 40 40 41 42 42 42 43 43 44 44 44 43 43 43 42 42 41 41 42 41 41 41 41 40 40 40 41 40 40 40 39 39 38 37 37 37 36 35 35 34 34 34 34 34 34 34 33 34 35 34 34 35 36 36 36 37 37 37 37 37 37 38 39 39 39 40 40 40 40 39 39 39 38 39 38 38 38 38 38 39 38 38 37 37 36 35 34 34 33 33 33 33 32 32 32 32 30 30 29 29 29 30 30 30 30 30 31 31 32 32 33 33 33 33 33 34 34 34 33 33 33 32 30 30 31 32 33 33 32 30 30 30 29 29 29 30 30 30 29 29 30 30 30 29 28 29 28 26 26 28 30 33 31 28 26 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 25 25 26 26 27 28 29 30 30 31 30 29 30 30 29 27 26 28 30 29 28 28 29 29 28 27 26 26 27 28 30 30 30 29 29 30 29 28 27 28 29 30 30 30 30 30 30 30 29 29 29 30 30 30 31 30 30 30 30 30 30 30 29 28 28 27 27 27 26 26 27 27 28 28 28 27 26 26 25 25 25 25 26 26 26 26 27 27 27 28 29 30 30 30 30 30 29 29 30 30 30 30 29 28 27 27 26 26 26 25 59 59 59 59 60 59 58 58 59 59 58 58 57 56 55 55 55 55 57 58 59 58 56 56 57 58 58 58 58 58 59 59 59 60 60 60 61 62 61 60 59 59 59 59 59 59 59 59 59 58 58 58 58 57 57 56 55 55 56 55 55 54 54 54 54 54 53 53 53 54 54 54 54 55 55 54 54 54 53 52 52 51 51 50 50 50 51 51 51 52 52 52 53 53 53 52 51 51 52 52 50 50 51 52 52 52 51 50 52 53 52 52 52 51 51 51 51 49 48 47 47 47 47 47 47 49 49 47 47 48 48 48 48 47 47 46 46 47 46 45 45 45 45 45 46 46 47 47 48 48 48 49 49 49 50 50 50 50 50 50 49 49 48 48 49 48 47 47 48 48 49 50 50 49 49 48 48 48 48 48 47 46 46 46 46 45 45 45 45 45 45 46 45 44 44 45 45 45 45 45 44 43 44 44 43 44 44 44 43 42 42 42 42 42 42 43 42 42 41 42 43 43 42 41 42 43 43 42 42 42 42 42 42 41 41 41 41 40 39 38 38 39 40 40 41 41 41 40 40 40 39 38 36 36 36 37 38 39 39 40 41 42 42 43 43 42 42 41 41 41 41 40 39 38 38 38 38 38 37 36 35 35 36 37 38 38 38 38 39 39 40 40 41 40 40 40 41 41 42 42 43 44 44 44 43 42 41 40 40 40 42 43 42 42 43 43 44 44 44 43 42 42 43 43 42 42 41 41 41 40 40 40 40 40 40 41 40 40 40 39 38 38 37 37 36 35 35 35 35 35 35 35 34 34 33 34 35 34 34 35 36 36 36 37 38 38 38 38 39 39 39 39 39 40 40 40 40 39 39 39 37 38 38 37 37 37 38 38 38 37 36 36 36 35 34 34 33 32 31 31 31 30 30 30 30 29 29 29 30 30 30 30 30 30 31 32 33 33 33 34 33 33 33 34 34 34 34 34 34 32 31 31 31 32 33 33 33 31 30 30 30 29 29 30 30 30 29 29 30 30 30 29 28 28 28 27 27 27 29 32 31 29 28 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 25 25 25 26 27 28 29 30 29 29 30 30 30 29 29 27 27 28 28 28 29 30 30 28 27 26 26 27 28 30 30 30 29 29 30 29 27 27 28 29 30 30 30 30 29 29 29 29 29 30 30 30 30 31 30 30 30 30 30 30 29 29 27 27 27 27 27 26 26 27 28 29 28 28 27 27 26 25 24 24 25 27 27 27 26 27 27 27 27 28 29 30 30 29 29 29 29 29 30 30 30 29 28 27 27 26 25 24 24 58 58 59 59 60 59 58 57 58 59 59 58 57 56 55 54 55 56 57 58 59 57 56 56 57 58 57 57 57 58 58 58 59 59 60 60 61 61 61 61 60 60 59 59 59 59 59 59 59 58 57 57 58 58 58 57 55 55 55 54 54 54 54 55 54 54 54 53 53 53 53 53 53 54 54 54 54 54 53 52 52 51 50 50 50 51 52 52 51 52 52 52 54 53 52 52 52 52 52 51 50 50 52 53 53 52 51 51 52 54 54 53 52 52 53 53 51 49 49 49 49 48 47 47 48 51 51 49 48 48 49 48 47 47 47 46 46 46 46 45 45 45 45 46 46 47 47 48 48 48 48 49 49 49 49 50 50 50 50 49 49 48 48 48 49 48 47 47 48 48 48 49 49 50 49 49 48 48 48 48 47 46 46 46 46 46 45 45 45 45 45 45 45 45 44 45 45 44 44 45 44 43 43 44 43 43 43 43 43 42 42 42 42 41 41 41 42 42 41 41 42 42 42 41 41 42 43 42 42 42 42 43 43 42 41 41 40 40 39 38 38 38 39 40 41 41 41 41 40 39 38 37 36 36 36 37 38 39 40 40 41 42 42 43 44 43 43 42 42 42 41 40 40 39 38 39 39 38 37 36 35 35 35 37 38 38 38 38 39 39 40 40 41 40 40 41 41 41 42 42 43 44 44 44 43 42 41 40 40 40 42 42 41 41 42 43 44 43 43 44 43 42 42 42 42 42 41 41 41 40 40 40 39 39 40 41 40 39 39 38 38 38 37 37 36 37 37 36 36 36 36 36 35 34 33 34 35 34 34 35 36 37 37 37 37 38 38 38 39 39 39 39 39 40 40 40 39 39 39 38 37 37 37 37 37 37 38 39 38 37 36 36 35 34 34 34 34 33 31 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 31 32 33 33 33 34 33 33 33 34 34 35 34 34 34 33 32 33 33 33 33 33 33 31 30 30 30 29 29 30 31 30 30 30 30 30 29 29 29 29 28 29 28 26 28 31 32 30 28 26 27 26 25 25 25 25 25 25 25 25 25 25 25 25 26 26 27 27 27 27 26 25 24 24 24 24 24 25 25 25 26 27 27 28 29 29 29 30 30 30 30 30 28 26 27 27 28 29 30 29 28 27 26 26 27 29 30 30 30 29 29 30 29 27 27 28 29 30 30 30 30 29 29 29 28 29 30 30 30 30 30 30 30 31 30 30 29 28 28 28 27 27 27 27 26 26 27 28 29 28 27 27 27 27 26 26 25 25 26 27 27 27 27 27 28 28 29 29 30 30 30 29 29 29 29 30 29 29 28 28 27 27 26 26 25 25 58 57 58 58 59 59 58 57 57 58 58 58 57 56 55 54 54 56 56 57 58 57 55 56 57 58 57 56 56 58 58 58 59 59 59 60 61 61 60 60 61 60 59 59 59 58 58 59 59 58 57 58 58 59 59 58 56 54 54 54 55 55 55 55 55 55 55 54 54 53 52 52 52 53 53 54 53 53 53 52 51 50 50 50 51 52 52 52 52 52 53 53 54 53 52 52 52 52 51 51 50 51 53 54 54 53 51 51 52 53 54 54 53 52 53 54 52 50 49 51 52 51 49 48 49 49 49 48 48 49 48 48 47 47 46 46 46 46 46 45 45 45 45 46 47 47 47 47 47 48 48 48 48 48 49 50 49 49 49 49 48 47 47 48 48 48 47 47 47 47 48 48 49 49 50 49 49 49 49 48 47 47 48 48 48 47 47 46 46 46 45 45 45 45 44 44 43 43 44 44 44 43 43 43 43 42 42 42 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 42 43 42 42 42 42 42 42 42 42 41 40 40 40 39 38 38 39 40 41 42 42 41 40 39 38 37 36 36 36 37 38 39 40 41 41 41 43 43 43 43 43 43 43 42 41 41 41 40 40 39 39 38 37 36 35 35 36 37 38 38 39 39 39 39 40 40 41 40 40 40 40 41 41 42 43 44 44 43 43 42 41 40 39 40 41 41 41 42 42 43 43 43 43 43 42 42 41 41 41 41 40 41 41 40 40 40 40 39 40 41 40 39 39 38 38 38 37 37 37 38 38 37 37 37 36 36 35 34 34 35 35 34 34 35 36 37 37 36 36 36 36 37 38 39 39 39 40 40 40 40 39 39 39 39 38 36 37 37 36 36 37 38 38 37 37 36 34 34 34 34 34 34 33 32 31 31 30 30 30 30 30 30 31 31 31 31 31 31 32 33 33 33 33 33 32 32 33 33 34 34 34 34 34 34 34 34 34 34 34 33 33 32 31 31 30 30 30 30 31 32 31 30 30 29 29 29 30 30 29 28 27 26 28 30 30 30 29 28 29 28 28 26 26 27 27 27 28 28 26 26 27 28 28 29 30 29 29 29 28 26 24 24 24 25 25 25 25 25 26 27 27 27 28 29 29 29 31 31 30 29 27 26 26 27 28 29 30 29 28 27 27 27 27 29 30 30 29 29 29 30 29 28 27 27 29 30 30 30 30 29 29 28 28 29 30 30 30 30 30 30 30 30 30 30 29 29 28 29 28 27 27 27 27 27 27 29 30 28 27 27 27 26 26 26 25 25 26 26 28 28 28 28 29 29 30 30 30 30 30 29 29 28 28 29 29 27 27 27 27 27 27 27 26 26 57 57 57 58 59 59 59 57 57 57 58 58 57 56 55 54 54 55 56 57 58 56 55 56 57 57 56 56 56 58 58 58 58 58 59 60 60 61 60 59 60 59 59 58 58 57 57 58 59 58 58 58 59 59 59 58 56 55 56 56 56 56 56 56 55 55 55 55 54 54 53 52 52 52 52 52 52 52 52 52 51 51 51 51 51 52 53 52 52 53 54 54 54 54 54 54 53 52 51 51 51 52 53 54 54 53 52 52 53 54 54 54 53 53 53 53 52 50 49 51 52 51 49 48 48 48 47 47 48 48 48 47 47 47 46 46 46 46 45 45 45 45 46 46 46 47 47 47 47 48 48 48 48 48 49 49 49 49 49 48 47 47 47 47 47 47 47 46 46 47 47 48 48 49 49 49 49 49 49 48 48 48 49 48 48 47 47 47 47 46 45 45 44 44 44 43 43 43 43 43 43 43 43 43 42 42 43 44 44 44 43 43 43 43 42 41 41 41 41 41 41 40 41 41 42 42 42 42 41 41 42 42 42 43 42 41 40 40 39 38 38 38 39 41 41 41 41 41 40 40 38 37 36 36 36 38 39 40 41 42 41 41 42 43 43 43 43 43 42 42 41 41 41 40 40 40 39 38 37 36 35 35 37 38 38 38 39 39 39 39 39 40 41 40 40 39 40 41 41 42 43 44 43 43 42 42 41 40 39 40 41 41 41 42 42 43 43 43 43 43 42 41 42 41 41 41 40 40 40 40 40 40 40 39 40 41 40 39 39 39 38 38 37 37 38 38 38 38 38 37 36 36 35 34 34 35 36 35 35 36 36 36 36 36 36 36 36 37 38 39 39 39 40 40 40 40 39 39 39 39 38 36 36 37 36 36 36 37 37 37 37 36 35 34 34 34 33 33 33 32 32 32 31 30 30 30 31 32 32 32 32 32 32 33 33 33 34 34 34 33 31 31 32 32 33 34 34 34 34 34 34 34 34 33 32 31 32 33 33 31 30 30 30 30 32 32 31 30 30 29 30 30 30 29 28 28 27 26 27 28 29 30 31 30 29 29 30 28 27 29 29 30 33 32 29 29 29 29 29 31 32 30 29 28 29 27 25 24 24 24 24 25 25 25 26 27 28 28 29 30 29 30 30 30 30 28 27 26 26 26 28 29 29 28 27 26 26 26 27 29 30 30 28 28 29 30 29 27 27 27 29 30 30 30 30 29 28 28 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 28 29 29 28 27 27 27 26 26 26 26 26 27 27 27 29 29 29 30 30 30 30 30 30 30 30 29 28 27 28 27 27 26 26 26 26 27 27 27 27 57 57 57 57 59 59 59 58 56 56 57 57 57 56 55 54 54 54 55 57 57 55 54 55 56 56 55 55 57 58 58 56 57 58 59 60 61 60 59 59 59 59 59 58 57 57 56 57 58 58 59 59 59 59 59 58 57 57 57 57 57 57 57 57 57 56 56 55 55 55 54 53 53 53 52 52 51 51 52 52 52 52 52 53 53 53 54 53 53 54 55 55 55 55 54 54 53 52 53 53 51 52 53 55 55 53 52 53 54 55 55 54 53 52 52 52 50 49 48 50 51 49 48 47 47 47 46 47 47 48 48 47 47 47 46 46 46 46 46 45 45 45 45 45 45 46 47 47 47 47 47 47 47 48 49 49 49 49 49 48 47 47 47 47 47 47 47 46 46 47 47 47 48 48 48 48 48 49 49 49 49 49 48 48 48 47 47 47 46 46 45 45 45 44 44 44 43 43 43 43 44 44 43 43 43 43 44 45 44 44 43 43 43 43 42 43 43 42 41 41 41 40 40 40 41 41 40 40 41 41 41 41 42 42 41 41 40 40 39 38 39 39 40 41 40 40 40 40 40 40 39 37 36 36 36 38 40 40 41 42 42 41 41 42 42 42 42 42 41 41 40 40 40 40 40 40 39 38 38 37 35 35 37 38 38 38 39 38 38 39 39 40 40 40 39 39 40 41 41 41 42 43 43 42 41 41 40 39 39 40 41 41 41 41 41 42 42 42 43 43 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 40 40 40 39 39 38 38 37 38 39 39 38 38 37 37 36 35 35 34 34 36 37 36 36 35 35 36 36 36 37 36 37 38 39 39 39 40 40 40 40 40 39 38 38 39 38 37 36 36 35 35 35 35 36 36 36 36 35 34 34 34 33 32 31 31 31 31 30 30 30 30 32 32 33 33 33 33 33 34 33 33 33 34 34 33 32 31 31 32 33 34 34 33 34 34 34 34 34 32 30 30 32 34 33 32 30 30 30 30 32 33 31 30 30 30 31 31 30 29 29 29 29 27 27 27 27 29 31 31 29 29 30 28 27 29 31 32 33 32 30 30 31 30 30 32 33 31 29 27 28 28 26 26 25 24 24 24 25 24 25 28 29 29 30 30 30 30 30 30 29 28 27 26 26 26 28 29 28 27 27 26 26 27 28 29 30 29 28 28 29 30 28 27 27 28 29 30 30 30 30 30 29 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 28 29 29 29 28 27 27 27 26 26 26 27 27 28 29 28 29 30 30 30 30 30 30 30 29 29 29 29 29 28 27 27 27 27 26 26 26 26 26 26 26 57 56 56 57 57 58 58 58 57 56 57 57 58 57 54 53 53 54 55 56 56 55 54 54 55 55 55 55 57 58 57 56 57 58 59 60 60 59 59 59 59 58 58 58 58 57 56 56 57 57 58 58 58 58 59 58 58 58 57 57 57 58 57 57 58 57 57 56 56 56 55 55 54 54 52 52 52 52 53 54 53 53 54 54 54 54 55 54 54 55 55 55 55 54 54 53 53 53 54 53 52 53 54 55 55 54 53 53 54 55 54 54 53 51 51 50 49 48 48 50 49 48 47 47 46 46 46 47 48 47 47 47 47 47 46 46 46 46 46 45 45 45 45 45 45 46 46 47 47 47 47 47 47 48 48 48 48 48 48 48 47 46 46 46 46 46 46 46 46 46 47 47 47 47 47 48 48 49 49 48 48 49 48 48 47 47 46 46 46 45 45 45 45 44 44 44 44 44 43 44 46 46 44 44 44 44 45 45 44 43 43 44 43 42 43 43 44 43 42 41 41 41 40 40 40 40 40 40 40 40 40 41 42 42 41 41 40 40 39 38 39 40 41 41 40 40 40 39 39 39 38 37 36 36 36 38 40 40 41 41 42 41 41 41 41 41 41 42 42 41 40 39 39 39 39 39 38 38 38 37 35 35 36 36 37 38 38 38 38 38 39 39 40 40 39 39 40 41 41 41 42 43 43 42 41 39 39 39 40 40 40 40 40 40 40 41 42 42 43 42 41 40 40 40 40 40 40 40 40 39 39 40 40 39 39 40 40 40 39 38 38 38 38 38 39 39 38 37 37 36 35 35 35 34 34 36 37 37 37 36 36 36 37 37 37 38 38 38 39 39 39 40 40 40 40 39 39 38 38 38 38 38 37 35 35 35 35 34 34 35 35 35 35 35 34 34 34 33 31 32 31 30 30 30 31 32 33 33 33 33 33 33 34 34 34 33 33 33 34 34 33 32 30 31 33 33 33 33 33 33 33 34 33 32 30 31 33 33 33 32 30 30 30 30 31 33 33 31 30 31 32 31 30 30 30 30 29 29 28 27 26 28 30 30 30 31 31 28 28 30 32 33 33 32 30 31 32 32 32 33 32 31 29 29 28 28 28 28 26 24 24 24 24 24 25 28 30 30 30 30 30 31 31 30 29 28 27 26 26 26 28 28 27 27 26 26 26 28 29 29 30 29 27 28 29 30 28 27 27 28 29 29 30 30 30 29 28 28 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 28 29 30 30 29 27 27 27 27 26 26 26 27 27 29 29 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 28 28 28 28 28 27 26 26 26 26 26 56 56 56 56 57 57 57 57 57 56 56 57 57 56 54 53 53 53 54 55 55 55 54 54 54 54 55 56 57 57 56 56 57 58 59 59 59 59 58 58 58 58 58 58 57 56 55 55 56 56 57 57 57 57 58 58 58 57 56 57 58 58 57 57 57 57 56 56 56 55 55 55 55 54 54 54 54 54 55 55 54 54 54 54 54 54 55 54 54 55 56 56 55 54 54 54 54 55 55 54 52 53 54 55 55 54 54 54 54 54 53 53 52 50 49 49 48 47 48 48 48 47 47 47 46 46 46 47 48 47 47 46 47 47 47 46 46 45 45 45 45 45 45 45 45 46 46 47 47 47 47 47 47 47 48 48 48 47 47 47 46 46 45 46 46 46 46 46 46 46 46 46 47 47 47 48 48 49 49 48 48 48 48 47 46 46 46 45 45 46 46 46 45 44 44 45 45 45 44 45 47 46 45 44 44 45 45 45 44 44 44 44 43 43 43 44 44 43 42 42 41 41 41 41 41 41 41 41 40 40 40 40 41 41 41 40 40 39 39 38 39 41 42 42 41 41 41 40 38 38 37 37 36 36 37 39 40 40 40 41 42 42 41 40 40 40 40 42 42 41 40 40 39 38 38 38 37 37 38 37 35 35 35 36 36 37 37 37 37 37 37 38 38 39 39 39 40 40 40 41 42 42 41 41 40 38 38 40 41 41 40 40 40 40 41 41 42 42 42 41 40 40 41 40 40 40 39 39 39 39 39 39 40 39 38 40 40 40 39 38 38 39 39 39 39 38 38 37 36 35 35 35 34 35 36 37 37 37 37 37 37 37 38 38 38 39 39 39 39 39 40 40 40 40 40 39 39 38 37 37 38 39 38 36 37 38 37 34 33 34 34 34 35 35 34 34 34 34 33 33 32 30 30 32 33 33 33 34 33 33 33 33 34 34 34 34 34 32 31 32 32 32 31 30 31 32 32 32 32 32 31 32 31 30 29 30 31 31 31 31 31 30 30 30 31 33 33 32 31 30 31 31 30 30 30 30 29 28 27 27 28 29 30 30 31 32 32 30 29 31 32 33 33 33 32 32 33 33 33 32 30 30 30 30 30 30 30 29 27 25 24 24 24 24 25 28 30 31 30 30 30 32 32 30 29 29 27 27 26 26 27 27 27 26 26 26 26 28 29 30 29 28 27 28 29 29 27 27 27 27 28 29 30 29 29 29 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 28 29 29 30 30 30 29 28 27 27 27 26 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 30 29 27 27 27 27 27 27 56 55 55 55 56 56 57 57 57 56 55 55 55 56 55 54 53 53 54 54 55 55 54 53 54 54 56 58 58 56 55 55 57 57 58 59 59 58 58 58 58 57 57 57 56 55 54 54 55 56 56 55 56 56 57 58 58 57 56 56 57 57 56 56 56 55 55 55 55 55 54 54 55 55 54 54 55 54 54 54 54 53 53 54 54 54 54 55 55 56 56 56 55 55 55 55 55 55 55 54 53 53 55 55 55 55 55 54 53 53 52 51 51 50 49 48 48 47 47 47 47 47 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 46 47 46 46 46 46 46 47 47 48 47 47 47 46 46 45 45 45 46 46 46 46 45 46 46 46 46 47 48 48 49 48 48 49 48 48 48 47 46 46 46 46 46 46 47 46 45 45 45 46 47 46 45 47 48 47 46 45 45 46 46 46 45 44 45 45 44 43 43 44 44 43 42 42 43 42 41 41 42 42 42 42 41 40 40 40 40 40 40 40 39 39 39 39 40 42 43 43 42 41 41 40 39 38 37 36 35 36 37 38 39 39 39 41 42 41 41 40 40 40 40 41 42 41 41 40 39 39 39 38 37 37 37 37 35 35 37 38 37 36 36 37 37 37 38 39 38 38 39 39 40 40 40 41 41 41 40 40 39 38 39 41 41 41 40 40 40 41 41 41 42 42 42 41 40 40 40 40 41 40 40 39 38 39 39 39 39 39 38 39 40 40 39 38 38 39 39 39 38 37 37 36 36 36 36 35 34 35 37 37 37 37 37 38 38 38 39 39 39 39 39 39 39 39 40 40 40 39 39 39 39 38 37 37 37 37 38 38 38 39 38 36 35 34 33 34 34 34 35 34 34 34 34 33 32 31 32 33 34 34 34 35 35 34 33 33 33 34 34 34 34 32 30 30 30 31 31 30 30 30 31 30 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 31 31 32 32 31 30 29 29 29 29 29 28 28 27 27 29 29 30 30 30 31 32 32 31 30 32 31 32 33 34 34 34 34 34 34 32 30 31 32 31 30 30 30 28 26 25 25 25 25 24 24 27 31 32 30 30 30 31 31 30 29 29 27 27 26 26 27 27 27 26 26 26 28 29 29 30 28 27 27 28 29 28 27 27 27 27 28 29 29 28 28 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 28 27 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 28 28 28 29 30 29 28 28 28 28 27 55 54 54 54 54 55 57 57 57 56 55 54 55 55 55 54 53 52 53 54 54 55 53 53 54 55 56 57 57 56 55 55 56 57 57 58 58 58 57 56 56 56 56 55 55 54 53 54 54 55 55 55 55 55 56 56 56 57 56 56 56 55 55 55 55 55 54 54 54 54 54 54 54 54 54 54 55 54 53 53 54 53 52 53 53 53 54 55 55 56 56 56 55 55 55 55 55 55 55 55 54 54 55 55 54 55 55 53 52 52 52 51 50 50 49 48 47 47 47 47 47 47 46 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 46 45 45 46 46 47 47 47 47 47 47 46 46 45 45 45 46 46 46 45 45 45 46 46 47 47 47 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 47 47 47 46 45 47 48 47 46 46 46 47 47 46 45 45 45 44 43 44 44 44 44 44 43 44 43 42 42 43 43 42 42 42 41 40 40 40 39 39 39 40 40 39 39 40 41 42 42 43 42 41 40 40 40 38 37 36 35 36 38 37 38 39 39 40 41 41 40 40 40 39 40 41 41 41 41 40 39 39 39 38 38 37 36 35 35 36 38 39 39 38 37 37 37 37 39 40 39 39 40 40 40 40 41 40 40 40 39 39 38 38 40 41 40 39 39 40 40 41 41 41 41 41 41 41 40 39 39 40 40 40 40 39 39 39 39 38 38 39 38 38 38 39 38 38 38 39 39 39 38 37 37 37 37 37 36 35 34 34 35 36 36 37 37 37 38 39 39 39 39 39 40 40 40 40 40 40 39 39 39 39 39 38 37 37 36 36 37 38 39 39 38 37 37 35 34 34 34 34 35 35 35 34 33 33 32 33 33 34 35 34 35 36 35 34 33 33 33 33 34 34 34 33 32 31 30 30 30 30 30 29 29 29 30 30 29 29 29 29 29 29 29 30 29 29 30 30 30 30 30 30 31 31 30 30 30 29 29 28 27 27 27 28 29 29 29 29 31 31 30 32 33 31 31 32 31 32 33 34 34 33 33 34 33 32 31 31 32 31 30 30 29 28 26 25 25 25 25 24 24 27 31 31 30 30 30 30 30 30 29 28 27 27 26 26 27 27 26 26 26 27 28 30 30 29 28 27 27 27 28 27 26 26 27 28 29 29 28 27 27 27 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 29 28 26 26 27 28 27 27 29 30 30 30 30 30 29 29 30 30 30 30 30 30 30 29 29 28 27 27 28 29 30 29 28 28 27 26 55 54 54 54 54 55 57 57 57 56 55 54 54 55 55 54 53 52 52 54 54 54 53 53 54 54 55 56 56 55 55 55 56 56 57 58 58 58 57 55 55 55 55 55 54 54 53 53 54 55 54 54 54 54 54 54 55 56 56 55 55 54 54 54 54 54 54 54 54 53 53 53 54 53 53 54 54 54 53 53 54 53 52 52 52 54 54 54 55 56 56 56 55 55 55 54 54 54 55 54 54 54 54 54 53 54 53 53 51 52 52 51 50 48 48 48 47 46 46 46 46 46 46 46 46 46 45 46 47 47 47 46 46 46 45 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 46 47 47 47 46 46 47 47 46 46 46 45 46 46 46 45 45 45 46 47 47 47 47 47 47 47 47 48 48 48 47 47 47 47 47 47 47 48 47 47 46 47 48 48 47 46 46 46 48 48 46 47 47 47 47 47 46 46 45 44 44 44 45 45 45 45 44 44 43 42 43 44 43 42 41 41 41 41 41 40 40 39 39 40 41 41 41 41 41 41 41 41 42 41 40 40 39 38 37 36 35 36 37 36 37 39 39 40 41 42 41 40 40 39 40 40 40 41 41 40 39 38 38 38 38 36 35 35 35 37 38 39 40 40 39 38 38 38 39 40 40 40 40 40 41 40 40 40 39 39 38 37 37 38 40 41 40 39 38 39 40 40 40 41 41 41 40 41 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 37 37 37 37 36 35 35 34 35 36 35 35 35 36 36 37 38 37 38 39 39 39 40 40 41 41 40 39 39 39 39 39 39 38 37 36 36 36 37 38 39 39 38 37 36 35 34 33 34 34 35 36 35 34 33 33 34 34 35 35 35 35 36 35 34 34 34 33 32 33 33 33 33 33 32 30 30 30 30 30 29 30 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 29 28 27 28 29 30 30 30 29 29 32 32 31 32 33 31 31 33 34 34 33 32 33 33 32 32 32 31 30 30 30 30 30 30 28 26 25 25 25 25 25 24 24 28 30 29 29 29 30 30 30 30 30 29 28 27 26 26 27 27 26 26 26 27 29 30 29 28 27 27 27 27 27 27 26 26 28 29 28 27 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 29 29 29 30 30 30 30 30 30 30 29 28 27 26 26 27 29 28 27 29 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 29 28 27 27 28 28 28 28 27 27 26 55 54 54 54 54 54 56 56 57 56 56 55 54 54 54 54 53 52 52 54 53 53 53 53 54 54 55 55 55 55 54 55 56 56 56 57 57 57 56 55 55 55 55 55 54 54 53 54 55 54 54 54 54 54 54 54 54 55 55 55 55 54 54 53 54 54 54 53 54 53 53 53 54 53 53 53 53 53 53 52 53 52 52 52 52 53 54 54 54 55 56 56 55 54 54 53 53 53 54 54 53 53 53 53 53 53 53 52 51 51 52 51 50 48 47 47 46 46 46 46 46 45 45 45 45 45 45 46 47 46 46 46 46 46 45 45 46 46 46 46 46 45 45 44 44 44 45 45 45 45 45 46 46 47 47 47 46 46 46 47 47 46 46 45 45 46 47 46 45 45 45 46 46 47 47 47 47 47 47 48 48 48 48 47 47 48 48 48 48 48 48 47 47 47 48 48 48 46 46 47 47 48 47 48 48 47 47 47 47 47 46 46 45 45 45 45 45 45 44 44 43 43 43 43 43 42 42 42 42 42 42 41 41 40 40 40 40 41 41 42 42 42 41 40 40 40 40 40 39 38 37 36 36 36 35 36 37 38 38 39 40 41 41 40 39 39 39 40 41 40 40 40 39 38 38 38 38 37 35 35 35 37 39 39 40 40 39 38 38 38 38 39 40 40 40 40 40 40 39 39 39 39 38 37 38 39 40 40 40 38 38 39 40 40 40 41 41 40 40 40 40 40 38 38 38 39 39 39 39 39 38 38 37 37 38 39 39 39 39 39 39 39 40 39 39 39 38 37 37 37 36 36 35 35 36 37 36 36 36 36 37 37 36 37 38 39 39 40 40 41 41 40 40 39 38 39 39 39 39 38 37 36 36 36 37 38 38 37 37 37 36 34 33 33 34 35 36 36 34 33 34 35 35 36 36 36 36 36 35 35 34 34 34 33 32 32 31 31 31 30 30 30 31 30 30 30 31 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 29 28 28 29 30 30 31 32 31 30 31 32 32 33 33 32 32 33 33 32 31 30 31 31 31 30 30 30 30 30 30 30 30 30 28 26 24 24 24 24 24 24 25 27 28 29 28 29 30 30 31 30 29 28 27 26 26 26 27 27 26 26 26 27 29 29 29 27 27 27 27 27 27 26 26 26 27 27 27 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 29 29 30 30 30 30 30 29 28 28 28 28 27 26 27 28 29 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 26 26 55 54 54 53 53 54 55 56 56 56 56 55 54 53 54 54 53 52 52 53 52 52 53 54 54 54 55 55 55 54 54 54 55 55 56 57 57 56 56 55 55 55 55 54 54 53 52 53 54 54 54 54 54 54 53 54 54 55 55 55 54 54 54 53 53 53 53 53 53 53 52 52 53 53 52 52 53 53 52 52 52 52 51 52 53 53 53 53 54 54 55 55 55 54 53 53 52 52 53 53 53 53 53 52 53 54 53 51 50 50 50 49 48 47 46 46 46 46 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 46 46 46 45 44 44 44 44 45 45 46 46 46 47 47 47 46 46 45 46 47 47 46 46 45 45 46 47 47 45 44 45 46 47 47 47 47 47 47 47 48 47 48 48 47 47 48 48 48 48 47 47 48 48 48 48 49 48 47 47 48 48 48 48 48 47 47 47 47 46 47 47 46 46 46 46 46 46 45 44 44 44 43 43 43 42 42 42 43 43 43 42 42 42 40 40 40 40 41 42 42 43 42 41 40 40 40 39 39 39 38 37 37 37 36 36 35 36 37 37 38 39 39 40 40 40 39 39 40 40 40 40 40 39 38 38 38 37 37 35 35 36 38 38 38 39 40 40 39 38 38 38 39 40 41 40 40 40 39 38 39 39 39 38 37 38 38 39 40 39 38 38 39 40 40 40 41 41 40 39 40 41 40 39 38 38 38 39 39 39 38 38 37 37 38 39 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 37 36 36 35 35 37 37 38 38 38 39 39 38 37 38 39 39 40 40 41 41 40 40 39 37 37 38 38 39 38 38 38 37 36 36 37 37 37 37 37 36 35 35 34 33 34 36 36 35 34 34 36 36 36 36 36 37 37 36 36 35 34 34 33 33 32 31 31 30 30 31 32 31 30 31 32 32 30 30 31 31 30 29 30 30 30 29 29 29 28 28 28 29 29 29 29 30 30 30 30 29 28 28 28 28 29 30 31 32 33 33 31 32 33 33 33 33 33 33 34 33 32 30 30 29 29 29 29 29 29 28 28 28 28 29 30 29 26 24 24 24 24 24 24 25 26 28 28 28 28 29 30 30 30 29 28 27 26 26 26 27 26 26 26 27 27 27 29 29 28 27 27 27 27 26 26 26 27 27 27 27 27 28 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 28 29 30 30 30 30 30 30 30 30 29 29 28 28 29 29 30 30 30 30 30 30 30 30 29 28 27 27 26 26 26 26 26 55 54 54 53 53 54 55 55 56 55 55 55 54 53 53 54 53 52 52 52 52 53 53 54 54 54 55 55 54 54 54 54 54 55 56 57 56 55 55 55 55 55 55 54 53 53 52 53 54 54 53 54 54 53 53 54 54 55 55 55 54 53 53 53 53 53 53 53 53 53 52 52 52 53 52 51 52 53 52 51 52 52 52 53 53 52 52 53 54 54 54 54 55 54 53 52 52 52 51 52 53 52 52 52 53 53 53 52 51 49 48 48 47 46 46 46 46 46 45 45 46 45 45 45 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 46 46 46 45 44 44 44 44 44 45 46 46 47 47 47 47 46 46 45 45 46 46 46 46 45 44 45 47 47 45 44 45 46 46 47 47 47 47 46 46 47 47 48 48 47 47 48 48 47 47 47 47 48 48 48 48 49 49 48 48 48 49 49 48 48 47 46 46 46 46 46 46 46 46 46 46 45 45 45 45 44 44 43 43 43 43 43 44 43 43 43 43 42 41 41 41 42 42 42 42 43 43 43 42 41 40 40 40 39 38 38 37 37 37 37 36 35 35 36 37 38 38 39 40 40 40 39 38 39 39 40 40 40 40 39 39 39 38 36 35 36 38 39 38 39 39 39 40 39 38 38 38 39 40 40 40 40 39 38 38 38 38 38 38 37 37 38 38 38 38 38 38 39 40 40 41 41 40 39 39 40 40 40 39 39 38 38 38 38 38 38 37 37 37 39 40 40 39 39 39 40 40 40 40 40 40 40 40 39 39 39 38 37 37 36 35 36 37 38 39 39 39 40 39 39 38 38 39 39 40 41 41 40 40 39 38 37 37 37 38 38 39 39 38 36 36 37 37 37 36 36 37 37 37 35 33 33 35 36 35 34 34 35 36 37 37 37 37 37 37 36 35 34 34 34 34 33 33 33 32 32 32 32 31 32 33 33 33 32 32 33 32 30 30 31 32 31 30 30 29 29 28 28 28 28 28 28 29 29 29 28 28 27 28 28 29 29 30 31 32 33 33 33 34 34 33 33 33 33 34 34 34 33 31 30 30 30 29 29 29 29 28 27 27 27 28 29 28 26 24 24 24 24 24 24 24 26 28 27 27 28 29 30 30 30 30 28 27 26 26 26 27 26 26 26 27 27 28 29 29 28 26 26 27 26 26 26 26 26 26 27 27 27 29 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 31 31 31 31 31 31 31 31 30 30 30 30 30 29 28 27 27 27 27 28 29 30 30 30 29 29 29 29 29 28 28 28 27 27 28 29 30 30 30 30 30 30 30 29 29 29 28 28 27 27 27 27 54 54 53 53 53 54 54 55 55 55 55 55 54 53 53 53 53 52 52 52 52 53 53 53 54 54 55 54 54 54 54 54 55 55 56 56 55 54 54 54 55 55 55 54 53 52 52 52 53 53 53 54 53 52 52 53 54 55 55 54 53 53 53 52 52 52 53 53 52 53 52 51 52 53 52 51 52 53 52 51 51 51 52 53 53 52 52 53 53 53 53 54 54 54 54 52 51 51 51 52 53 52 51 52 52 52 53 53 52 50 48 48 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 46 46 46 46 45 45 45 45 45 46 46 46 45 44 44 44 45 46 46 47 47 47 47 47 47 46 45 45 46 46 47 46 45 44 45 46 46 45 44 45 46 46 47 47 47 47 46 45 46 48 48 48 46 46 47 47 46 46 46 47 48 48 48 48 49 49 49 49 49 48 48 47 47 46 46 45 45 45 46 46 46 45 45 45 45 45 45 45 45 44 44 44 43 44 45 44 44 44 43 42 42 42 42 42 42 43 43 43 43 43 42 42 41 40 40 40 39 38 38 38 37 37 37 36 36 36 36 36 36 37 38 39 40 40 39 38 39 39 39 40 40 39 38 38 38 37 35 36 37 38 39 40 40 40 40 40 39 38 38 38 39 40 40 40 40 39 39 39 39 38 38 38 37 37 37 37 37 37 38 38 39 39 40 41 41 40 39 39 40 39 39 39 39 38 37 37 37 37 37 37 37 37 38 39 39 39 38 38 39 39 39 39 40 40 40 41 40 40 38 38 38 37 36 36 36 36 37 38 38 39 40 40 40 39 38 39 39 40 41 40 40 40 40 39 38 37 37 37 37 38 39 38 37 36 36 37 37 36 36 36 36 37 36 34 33 34 36 35 34 34 34 36 37 37 37 36 36 36 36 35 34 34 34 34 34 34 34 33 33 33 32 32 33 33 34 33 33 33 33 31 30 29 31 32 32 30 30 30 29 29 29 29 28 28 28 29 28 28 28 28 29 29 29 29 30 30 31 32 33 34 34 35 34 33 34 34 34 34 34 34 34 33 32 32 32 31 30 31 31 30 29 28 27 26 27 27 25 24 24 24 24 24 24 24 25 26 26 27 28 29 29 29 30 29 27 27 27 26 26 26 26 26 26 27 28 29 30 29 28 26 26 26 26 26 26 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 32 32 32 31 31 30 30 30 30 29 29 27 27 27 27 28 28 28 29 30 30 29 28 27 28 28 27 27 27 27 27 27 29 29 29 30 30 30 30 29 29 30 30 30 29 28 28 28 28 54 53 53 53 53 53 54 54 54 54 54 54 54 54 53 52 52 52 52 51 51 53 53 53 54 55 54 54 53 53 53 54 55 55 55 55 55 54 53 54 54 54 55 54 53 52 52 51 52 53 53 54 53 52 52 53 53 54 54 54 54 53 52 52 52 52 52 52 52 52 53 52 51 52 51 51 52 53 52 51 50 51 52 52 52 52 53 53 53 53 53 53 53 54 54 53 52 51 51 52 53 52 51 51 51 51 52 53 52 50 48 48 47 46 46 45 45 45 45 45 45 45 44 44 45 45 45 45 46 45 45 45 46 46 46 45 45 45 45 45 45 45 46 45 44 44 45 45 46 47 47 47 47 47 47 47 46 45 45 45 46 46 47 46 45 44 45 45 44 44 45 46 46 46 46 46 47 46 45 47 48 48 47 46 46 46 46 46 46 46 47 47 47 47 48 48 49 49 49 49 48 47 47 46 45 45 45 44 44 45 46 46 45 45 45 45 45 45 45 46 45 45 44 43 45 45 45 44 44 43 42 42 43 42 42 42 43 43 43 43 43 42 41 40 40 40 39 38 39 40 39 38 38 37 37 37 37 36 36 36 36 37 38 39 39 39 38 38 38 38 39 40 39 38 38 37 35 34 36 37 38 40 41 41 40 40 39 38 37 38 38 40 41 41 40 41 41 40 40 40 39 38 38 37 36 36 36 37 37 38 38 38 39 40 40 40 39 38 38 39 39 39 38 38 38 37 37 37 37 37 37 37 37 38 39 38 39 39 39 39 39 39 40 40 40 40 41 41 40 39 39 38 38 37 37 37 36 36 36 37 39 39 39 40 39 39 39 39 40 40 40 40 40 39 39 38 38 37 37 36 37 38 38 37 36 36 36 37 37 36 35 36 36 35 34 32 33 35 35 34 34 34 36 37 37 37 36 36 36 36 35 35 35 35 35 35 34 34 34 34 33 32 33 34 34 33 33 33 34 33 31 29 29 30 32 32 31 30 30 29 29 29 29 29 29 29 30 29 29 29 29 30 30 30 30 30 30 31 32 33 34 35 34 33 33 33 34 34 34 34 33 34 34 33 32 31 31 30 31 31 30 30 30 29 27 26 26 25 24 24 24 24 24 24 24 24 24 25 26 27 27 28 29 30 29 28 27 27 26 26 26 26 26 26 27 27 28 29 28 27 26 26 26 26 26 27 27 27 27 27 27 27 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 31 32 31 31 31 31 31 31 31 30 30 30 30 29 28 27 28 29 29 29 29 29 29 30 30 30 29 27 27 27 27 27 27 27 27 27 29 29 28 29 29 29 30 29 29 29 30 29 29 29 29 29 29 54 53 53 52 52 53 54 54 54 54 54 54 54 54 53 52 52 51 51 51 52 53 54 54 54 54 54 53 53 52 53 53 54 55 55 55 55 54 53 53 53 54 54 54 54 53 52 51 52 52 52 53 53 52 52 52 53 53 54 54 54 53 52 52 51 51 52 52 51 52 53 52 52 51 51 51 52 52 52 51 50 51 52 51 51 52 52 52 52 53 53 53 53 53 53 53 52 51 51 52 53 52 50 50 50 51 52 52 51 50 48 48 47 47 47 46 45 45 45 45 44 44 44 44 44 45 45 45 46 45 45 45 46 46 46 45 45 45 45 45 45 46 46 45 43 44 44 45 46 46 46 47 47 47 47 47 46 46 45 45 45 46 47 46 46 45 44 44 44 44 45 46 46 46 46 46 46 45 45 47 48 47 46 45 45 45 46 45 45 45 45 45 45 46 47 48 49 49 49 49 49 48 46 45 45 44 44 44 44 44 44 45 45 45 45 45 44 44 44 45 45 45 44 44 45 45 45 44 43 43 42 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 40 39 40 40 40 39 38 38 38 38 37 37 37 36 35 36 37 38 38 39 39 38 37 37 39 40 39 39 38 37 35 34 35 37 39 40 41 41 41 40 38 37 38 38 39 40 41 41 41 41 42 41 41 40 40 40 39 38 37 36 36 37 38 38 38 39 40 40 39 38 38 38 39 39 39 38 37 37 37 37 37 37 38 38 38 38 38 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 40 40 39 39 38 37 37 38 37 36 36 37 39 39 39 40 39 39 39 40 40 40 40 39 39 39 38 39 39 39 37 36 36 37 37 37 36 35 36 37 37 36 35 35 35 35 34 33 33 34 34 33 33 34 35 36 36 37 36 36 35 35 35 35 35 36 36 35 34 34 33 33 32 33 34 34 34 33 33 34 34 33 32 30 30 30 32 33 31 30 30 30 30 30 30 29 30 30 30 30 30 30 30 30 30 30 30 30 31 33 33 33 34 34 34 33 32 32 32 33 33 33 33 33 34 33 31 30 31 31 30 30 30 30 29 28 27 25 24 24 24 24 24 24 24 24 24 24 24 25 26 27 28 29 29 30 30 29 28 27 26 26 26 26 26 26 26 27 27 28 28 26 26 26 26 27 27 27 28 28 27 28 28 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 31 31 31 30 30 31 30 30 30 30 29 28 28 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 28 29 29 27 28 29 29 29 28 27 28 29 29 29 29 29 29 28 54 53 53 52 52 53 53 53 53 53 53 53 54 53 53 52 52 51 51 51 52 53 54 55 54 54 53 53 52 53 53 54 54 55 55 55 55 54 53 52 53 54 54 53 53 53 52 51 51 52 52 53 53 51 51 52 52 52 53 54 55 54 53 52 51 51 51 51 51 51 52 53 52 51 50 51 52 52 51 51 50 51 51 51 51 51 51 52 52 53 53 53 52 52 52 53 53 51 50 50 52 52 50 49 50 51 51 51 51 50 48 47 46 46 46 46 46 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 45 46 46 46 45 45 44 44 45 46 46 45 43 43 44 44 45 46 46 47 47 47 47 47 47 46 45 45 45 45 46 46 46 45 44 43 43 44 45 46 45 46 46 45 44 44 45 47 48 47 46 45 44 44 45 45 44 44 44 45 46 47 47 48 48 49 49 49 48 47 46 45 45 44 43 43 44 44 44 44 45 45 45 44 44 44 44 44 45 45 45 45 46 45 44 44 43 43 43 43 43 44 44 43 43 43 42 42 43 43 43 42 41 40 40 40 40 40 40 39 39 38 38 38 38 37 37 37 36 36 36 37 38 39 39 38 37 37 39 40 40 39 38 37 36 34 34 37 39 40 41 42 42 41 38 37 38 39 39 40 42 42 41 42 42 42 41 40 40 39 39 38 37 36 36 37 38 38 38 38 39 39 39 38 37 38 39 39 38 37 37 37 37 36 37 37 38 39 39 38 39 40 40 40 41 40 40 40 40 40 40 41 41 41 41 41 40 40 39 39 38 37 38 38 38 38 37 37 38 39 39 40 40 39 39 40 40 40 40 40 39 38 38 39 38 38 38 36 36 37 37 37 37 35 35 37 37 36 35 34 34 34 35 34 32 33 34 33 33 34 35 35 36 37 37 36 35 35 35 35 36 36 36 35 34 34 33 33 33 33 34 34 34 33 34 34 34 34 33 31 30 31 33 33 31 30 30 30 30 30 30 30 31 31 30 31 31 30 30 31 30 30 30 31 32 33 34 34 34 34 34 34 32 30 30 32 33 32 33 33 33 33 31 30 31 31 30 29 29 29 28 26 25 24 24 24 24 24 24 24 24 24 24 24 24 25 26 27 28 28 29 29 30 29 28 27 27 26 26 26 26 26 26 27 27 28 27 26 26 26 27 27 27 28 29 28 28 29 29 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 31 31 30 30 30 31 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 29 28 27 27 26 26 27 28 29 28 27 27 28 28 28 28 27 27 29 29 28 28 28 29 28 53 53 52 52 51 52 53 53 53 53 53 53 53 53 53 52 52 51 51 51 52 53 54 54 54 53 53 52 52 53 54 55 55 55 55 55 54 54 53 53 53 53 53 53 52 52 52 51 51 51 52 53 52 51 51 51 52 52 53 54 54 54 53 52 52 51 50 50 50 50 51 52 52 51 50 50 51 52 51 50 50 51 51 50 51 51 52 52 53 54 54 53 52 52 52 52 53 52 50 49 51 51 50 49 49 50 50 49 50 49 48 48 47 46 46 46 46 46 46 45 44 44 44 44 44 44 44 44 44 44 45 45 45 46 46 45 45 45 44 43 44 45 46 46 44 43 43 44 44 45 46 47 47 47 47 47 47 46 46 45 45 44 46 46 46 46 44 43 43 44 45 46 45 45 46 44 43 45 46 47 47 47 47 46 45 44 44 44 43 43 45 46 47 47 48 48 48 48 48 49 49 48 47 46 46 45 43 43 43 43 44 45 45 45 45 44 44 44 43 43 44 45 45 46 46 45 45 44 44 44 43 43 43 44 43 43 43 42 42 42 42 42 43 43 42 40 40 40 40 40 40 40 39 39 38 39 38 37 37 37 37 36 35 36 37 38 38 38 37 38 39 40 40 39 38 37 36 34 34 37 40 41 42 41 41 40 38 37 38 39 40 41 42 43 43 43 43 42 41 41 40 40 39 38 38 37 36 37 38 38 37 37 38 39 39 38 37 38 38 37 37 36 36 36 36 36 38 38 39 39 39 39 39 40 41 41 40 40 40 39 40 40 40 41 41 41 41 41 40 40 39 38 38 38 38 39 39 38 37 37 38 39 39 39 39 40 40 40 40 40 40 40 38 37 37 38 38 37 37 37 36 36 37 37 37 36 35 36 36 36 36 35 34 34 35 35 33 33 34 33 33 34 35 35 36 37 37 36 35 34 34 35 36 36 37 36 35 34 34 34 33 34 35 35 35 34 34 35 34 34 33 31 31 33 34 33 31 31 32 31 32 31 30 32 33 32 32 33 33 32 32 32 31 30 30 32 33 34 34 34 34 34 34 33 31 30 30 31 32 32 31 31 32 32 31 30 30 29 29 28 27 27 26 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 26 26 27 27 29 29 29 28 27 27 27 26 26 26 26 26 27 27 27 27 26 26 27 27 27 27 28 30 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 31 31 31 31 30 30 30 30 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 26 26 27 27 28 28 27 27 27 27 28 28 27 27 28 28 27 27 28 28 28 52 53 52 51 51 52 52 52 52 52 52 52 53 53 52 52 52 51 51 51 51 53 54 54 53 53 52 52 52 54 55 54 54 54 54 54 55 54 54 54 53 52 52 52 52 52 51 51 50 50 51 52 52 51 51 51 51 52 53 54 54 54 54 53 52 51 50 50 50 50 50 52 52 52 50 50 51 51 50 49 49 50 50 50 50 52 53 53 54 54 54 54 53 52 51 51 52 51 49 49 50 50 49 49 49 49 49 49 48 48 48 47 47 47 46 46 46 46 46 45 45 44 44 44 44 44 44 44 44 45 45 46 46 46 46 45 45 45 44 43 43 44 45 45 44 43 43 43 44 45 46 47 47 47 47 47 47 46 45 45 44 44 46 46 46 46 44 43 43 43 45 46 45 44 44 43 43 45 46 46 46 47 47 46 45 43 43 44 43 43 44 45 45 46 47 48 47 47 47 48 49 48 47 47 46 45 43 43 43 42 44 45 44 44 44 45 45 44 43 43 43 44 45 45 46 46 45 45 44 44 43 43 43 43 43 43 43 42 42 42 42 42 43 43 42 41 41 41 41 40 40 40 40 39 39 40 39 38 37 37 37 37 36 35 36 37 37 36 37 38 38 39 39 39 38 36 35 34 35 38 40 41 41 40 39 38 37 38 39 40 40 41 42 43 43 43 42 42 41 40 40 40 39 38 38 36 35 36 37 37 37 37 38 38 38 37 37 37 37 36 36 35 35 36 36 37 38 38 38 38 39 39 39 39 40 40 40 39 39 39 38 39 40 40 40 40 40 41 40 40 39 39 39 38 38 39 40 39 38 37 39 39 39 39 39 39 40 40 40 40 40 39 38 36 36 37 37 37 37 37 36 35 36 36 36 35 34 35 36 36 35 35 34 33 34 34 33 32 33 33 33 34 34 35 36 37 37 36 35 34 34 34 35 36 37 36 35 34 34 34 34 35 36 36 36 35 35 35 34 34 33 31 31 33 34 32 31 32 33 33 33 31 32 33 34 33 33 34 34 33 33 33 33 31 31 32 33 33 34 34 33 33 34 33 32 30 31 31 30 30 30 30 31 32 31 30 30 30 29 28 28 28 26 24 24 24 24 24 24 24 24 24 24 24 24 24 25 27 27 27 27 27 27 28 29 28 27 27 27 27 27 26 26 26 26 26 26 27 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 31 31 30 30 30 30 31 31 30 30 30 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 26 26 27 27 27 27 27 27 27 27 28 27 27 27 28 28 27 27 27 27 28 52 52 52 52 51 51 52 52 51 52 52 52 52 52 52 52 52 51 51 51 51 53 53 53 52 52 52 52 53 54 54 54 54 54 54 54 55 55 54 54 53 52 51 51 52 51 51 51 50 50 51 51 51 51 51 51 51 52 53 53 54 54 54 53 52 51 51 51 50 49 50 51 51 51 49 49 51 50 49 49 49 49 49 50 51 53 53 53 54 54 54 54 54 53 51 50 51 50 49 49 49 49 49 48 48 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 45 45 45 44 44 44 44 43 43 43 43 43 44 45 46 46 46 46 47 47 46 46 45 45 44 44 45 46 46 45 44 43 42 43 44 45 45 43 43 43 43 44 45 45 46 47 46 45 44 43 43 43 43 43 43 44 44 45 46 46 45 46 46 46 47 47 47 47 46 44 43 43 42 42 43 44 44 44 44 44 44 44 44 43 43 43 44 44 45 45 45 44 44 44 44 44 43 43 43 43 43 43 42 41 41 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 39 39 38 38 38 37 36 35 35 35 36 35 36 38 38 38 38 38 38 37 35 34 36 38 40 41 40 40 38 36 36 38 39 41 41 41 42 42 42 42 41 41 41 40 39 39 38 37 37 36 35 35 36 37 37 37 37 37 37 37 37 36 36 35 35 35 35 36 36 37 37 37 37 37 38 38 38 38 38 39 39 38 38 38 38 39 39 39 39 39 40 40 40 40 39 39 39 38 38 39 40 39 38 37 39 39 39 39 39 39 40 40 40 40 39 38 37 36 36 36 37 37 37 37 37 36 35 35 36 35 34 35 36 36 35 34 33 33 33 34 33 32 32 32 32 33 33 34 35 36 36 37 36 34 34 34 34 35 36 35 35 35 35 35 36 36 36 37 36 36 36 35 34 34 34 32 31 33 34 33 33 33 33 34 33 33 33 34 34 33 33 32 32 31 32 33 33 32 30 31 32 33 34 33 33 33 34 34 33 31 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 29 27 24 24 24 24 24 24 24 24 24 24 24 24 24 27 29 29 29 28 27 26 28 29 28 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 27 27 27 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 30 30 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 27 27 27 26 26 27 27 27 26 26 27 28 28 27 27 27 27 28 28 27 27 27 27 52 52 52 52 51 51 52 52 51 51 52 52 52 51 51 51 51 51 50 51 52 53 52 52 52 52 52 52 53 54 53 54 54 53 53 54 55 55 54 53 53 52 52 52 52 51 51 51 51 50 50 50 51 50 50 50 51 52 52 53 54 54 54 53 53 52 52 51 51 50 50 50 51 50 49 49 50 50 49 48 48 49 49 50 52 53 53 53 53 54 54 53 54 53 51 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 47 46 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 45 45 45 46 45 45 46 46 46 45 45 45 44 44 43 43 43 43 43 43 45 46 46 46 45 47 47 46 46 45 45 44 44 44 45 46 45 43 43 42 42 43 44 44 43 42 42 42 43 45 46 46 46 45 45 44 43 43 43 43 43 43 43 44 45 45 45 44 44 45 45 45 45 46 46 45 44 43 43 42 42 42 43 43 43 44 44 44 45 44 43 43 43 43 43 44 44 44 44 44 44 44 44 43 43 43 44 43 43 42 42 41 42 42 42 43 43 42 42 41 41 41 41 40 40 40 40 40 40 40 39 38 38 37 37 36 35 35 35 36 37 37 37 38 38 38 37 35 34 35 37 38 39 39 39 37 36 37 38 40 41 41 41 42 41 41 41 40 40 40 39 39 39 38 37 37 36 35 35 36 37 36 36 36 36 36 36 36 36 35 35 36 36 36 36 36 36 36 37 36 36 36 37 37 36 37 37 37 37 37 38 38 39 39 39 39 39 39 40 41 40 40 40 39 38 39 40 40 39 37 37 38 39 40 39 40 40 40 40 40 39 39 38 38 37 36 35 36 37 37 37 38 37 36 35 35 35 34 34 35 35 35 34 34 33 33 33 34 34 33 32 32 33 33 33 34 35 36 37 36 34 34 34 34 35 35 35 35 35 35 36 36 36 36 36 36 35 35 35 35 35 34 32 32 34 34 34 34 34 34 34 34 34 35 34 34 33 32 32 31 30 30 31 31 30 30 31 32 33 33 32 32 33 33 34 32 30 29 30 32 32 30 29 29 29 30 29 29 30 30 29 29 29 28 25 24 24 24 24 24 24 24 24 24 24 24 25 27 28 29 30 29 28 27 29 29 29 29 29 29 28 28 28 28 27 26 26 25 25 25 26 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 28 29 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 28 28 28 27 27 27 27 26 26 26 27 27 26 26 27 27 27 27 27 27 27 28 27 27 26 26 27 51 51 52 51 51 51 51 52 51 51 51 51 52 51 51 51 50 50 50 52 53 53 52 51 51 51 51 52 53 53 53 53 53 53 54 54 54 54 54 54 53 53 54 54 53 52 52 53 52 51 50 50 50 50 50 51 52 51 52 53 53 53 53 53 53 53 52 51 51 50 49 50 50 49 48 49 49 49 48 48 48 49 49 50 51 51 52 53 54 54 54 52 53 53 52 51 49 49 49 48 48 48 48 48 48 48 47 47 47 48 48 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 43 44 45 45 45 46 45 45 46 46 46 46 46 46 45 45 44 42 42 43 43 44 44 45 45 45 46 46 47 47 46 45 45 44 43 44 44 44 44 43 42 42 42 43 43 42 42 42 42 42 44 46 47 46 46 45 44 43 42 42 42 42 42 42 43 45 46 45 44 44 44 44 44 44 44 44 44 44 44 43 43 42 42 42 42 42 43 43 44 44 45 45 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 43 43 43 42 42 42 41 42 42 43 43 43 42 41 41 41 41 40 40 40 40 40 41 41 39 39 39 39 38 37 36 35 35 35 36 36 36 36 36 36 36 35 34 34 35 36 37 37 37 36 36 37 38 39 40 40 41 41 40 40 41 40 39 39 38 39 38 37 37 37 36 35 35 35 35 35 35 35 35 35 35 36 35 35 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 39 39 39 40 40 41 40 40 40 39 39 40 40 38 38 38 39 39 40 40 41 40 40 39 40 39 39 39 38 37 36 36 35 36 36 37 37 37 37 36 35 35 34 33 34 35 35 34 34 34 33 32 33 33 34 33 32 32 33 33 33 35 36 37 36 35 34 33 33 34 35 35 34 34 34 35 36 36 35 35 35 35 35 36 36 36 34 33 32 33 34 34 34 34 34 34 35 36 36 34 34 33 33 34 32 30 30 29 29 29 30 32 33 33 33 31 30 31 32 33 31 29 29 30 32 31 29 28 27 28 28 28 27 29 29 27 27 29 27 24 24 24 24 24 24 24 24 24 24 24 24 25 26 27 29 30 30 28 27 29 29 30 30 30 29 29 29 29 29 28 27 26 25 25 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 29 28 28 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 27 28 28 28 27 27 27 27 27 26 26 26 26 26 27 27 27 26 26 27 27 27 26 26 27 27 27 27 26 26 27 51 51 51 51 51 50 51 51 51 51 51 51 51 51 51 50 50 50 51 52 53 52 52 51 51 51 52 53 53 52 52 53 53 54 55 55 54 54 54 55 54 53 54 54 54 54 54 53 52 51 50 49 49 49 50 51 51 51 51 53 53 52 52 52 53 53 53 52 51 50 49 49 49 49 48 48 49 48 48 48 48 48 49 49 50 50 51 53 54 54 53 52 52 52 52 52 50 49 49 48 48 48 48 48 48 48 47 47 47 47 47 47 47 46 46 46 45 45 45 45 45 45 44 44 44 44 44 43 43 43 44 45 45 45 45 46 46 46 46 46 46 45 45 44 43 42 42 43 43 44 45 45 46 46 46 47 47 46 46 45 44 43 43 43 44 43 43 42 42 42 42 42 42 42 42 42 43 45 46 46 46 47 46 44 43 42 42 42 42 42 42 43 44 45 44 44 44 44 44 44 43 43 44 44 44 44 43 43 42 42 42 42 42 42 43 44 44 45 45 44 43 43 42 42 42 42 42 43 44 44 44 44 44 44 44 43 43 43 42 42 42 41 41 42 42 43 43 43 42 41 41 41 41 41 41 41 40 40 41 40 40 40 39 39 38 37 36 35 35 35 35 35 35 35 34 35 34 34 34 34 34 35 36 36 35 36 37 38 38 39 40 40 40 40 40 40 40 40 38 37 38 38 37 37 37 36 35 35 35 36 36 35 35 35 35 36 37 37 37 37 37 38 38 38 38 39 39 39 38 38 38 39 39 39 38 39 39 38 39 38 38 38 38 39 39 39 39 39 40 41 41 40 40 40 40 40 39 38 39 40 39 39 40 41 41 40 40 40 40 40 39 38 37 36 36 36 35 34 35 36 36 36 36 36 34 34 34 34 33 33 34 34 34 34 33 32 32 32 33 32 31 32 32 33 33 35 36 37 36 36 35 34 33 33 35 35 34 34 34 34 35 35 35 34 34 34 35 36 36 35 33 33 33 33 33 33 34 34 34 35 35 36 35 34 34 34 34 34 33 31 30 29 29 29 30 31 32 32 32 31 30 30 31 32 30 29 29 29 31 31 29 29 27 26 26 27 27 27 27 27 27 27 26 24 24 24 24 24 24 24 24 24 24 25 25 25 26 28 30 31 30 29 27 28 29 30 30 30 29 29 29 28 28 27 26 26 25 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 29 29 29 29 29 30 30 28 27 27 28 29 29 29 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 26 26 27 27 27 27 26 26 25 52 51 51 51 50 50 50 50 50 51 51 51 51 50 50 50 49 49 51 52 52 52 51 50 51 52 53 53 52 52 52 53 53 54 54 55 54 53 54 54 54 53 53 54 55 55 54 53 52 51 51 50 50 49 49 50 50 51 52 53 53 52 52 52 52 52 53 52 51 51 49 48 48 49 49 48 48 48 48 48 48 48 49 50 50 51 52 53 54 53 52 52 52 52 52 52 51 50 49 48 48 47 47 48 48 48 47 46 46 46 47 47 47 47 46 45 45 45 45 45 45 44 44 44 45 45 45 44 43 43 43 44 44 44 45 45 45 46 46 45 45 45 45 45 44 42 42 43 43 43 45 45 45 45 46 47 47 46 46 46 45 44 43 43 43 43 42 42 42 42 42 42 42 42 42 43 43 45 45 45 45 46 46 45 44 43 42 42 42 42 42 43 43 43 44 44 43 43 43 43 43 43 43 43 44 44 43 43 42 41 41 42 42 42 42 43 44 44 44 44 44 43 42 42 42 42 43 43 43 44 44 45 44 44 44 43 43 43 43 42 41 41 40 40 41 42 42 42 42 42 42 41 41 41 42 41 41 40 40 40 40 40 39 39 39 38 36 35 35 36 36 37 37 36 35 34 34 34 34 34 34 34 34 34 34 35 36 37 37 38 40 41 40 39 39 39 40 40 39 38 37 36 36 36 36 35 35 35 36 37 38 38 37 36 36 37 38 38 38 38 37 38 39 39 39 39 40 40 39 38 39 40 40 39 39 39 39 39 39 39 39 39 39 40 40 39 40 40 40 41 41 41 41 40 40 40 39 38 39 40 40 40 40 41 40 40 40 40 40 40 39 37 36 36 36 36 35 34 34 35 35 35 35 34 33 34 35 35 33 33 33 32 32 33 32 32 32 31 31 31 31 32 32 33 33 34 36 37 36 36 35 35 33 33 34 35 35 33 33 34 34 34 34 34 33 33 34 36 36 35 34 33 33 33 33 33 33 34 34 34 35 35 35 34 34 34 34 34 33 31 30 30 28 28 29 29 30 30 30 30 29 29 31 31 29 28 28 29 30 30 30 29 27 26 26 26 26 26 25 26 27 27 25 24 24 24 24 24 24 24 24 24 25 25 26 26 26 28 30 31 31 30 29 29 29 30 30 30 30 29 28 27 27 26 26 26 26 27 27 28 27 27 27 28 29 30 29 29 30 30 30 30 29 29 29 29 30 29 29 27 27 28 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 26 26 27 27 27 27 27 25 24 53 52 51 51 50 50 50 49 49 50 50 51 51 51 50 50 50 49 50 51 52 51 50 50 52 52 53 52 51 52 52 53 53 54 54 55 54 53 53 53 53 53 53 54 54 55 54 53 53 53 52 52 51 49 49 49 50 52 53 53 53 53 52 52 52 51 52 52 52 51 50 49 48 49 48 48 48 48 48 48 48 48 49 49 49 51 53 54 54 53 52 51 51 51 51 52 52 50 48 48 47 47 47 47 47 47 47 46 46 46 46 47 47 47 46 45 45 45 45 45 45 45 45 45 46 45 45 44 44 43 43 44 44 44 45 45 45 46 46 45 45 44 44 44 43 42 42 43 43 43 44 44 45 45 46 47 47 47 47 47 46 46 44 43 43 43 42 42 42 41 41 41 41 42 42 43 43 44 44 44 44 45 45 45 44 43 42 42 42 41 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 41 41 41 42 42 43 44 44 44 43 43 43 43 42 42 42 42 42 43 44 44 45 44 44 44 43 43 44 44 43 42 42 41 40 40 40 40 41 41 41 41 41 41 41 41 42 41 40 39 39 39 39 38 37 38 37 36 36 38 38 39 38 37 37 36 36 35 35 35 35 35 35 34 34 34 34 35 35 36 38 40 40 40 39 37 38 39 40 39 38 37 36 35 35 35 34 34 35 36 37 38 39 39 38 37 37 37 38 39 39 39 39 40 40 39 40 41 41 39 39 39 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 41 41 41 41 41 41 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 39 38 38 37 36 36 36 35 34 33 33 34 35 35 33 33 34 35 34 34 33 33 33 33 33 33 33 32 31 30 31 32 33 33 33 34 36 37 36 35 35 34 34 33 33 35 34 33 33 33 34 34 34 33 33 33 34 35 35 35 34 34 35 34 34 33 33 34 34 34 34 35 35 34 34 34 34 34 33 32 30 30 29 28 27 28 29 29 30 29 29 29 30 30 29 28 28 29 29 30 30 28 27 27 26 25 25 24 24 24 25 25 24 24 24 24 24 24 24 24 24 25 25 26 26 26 27 29 30 31 31 31 31 30 29 30 30 30 30 29 28 27 26 26 25 26 27 27 28 29 28 27 28 29 29 30 29 29 30 30 30 30 30 29 28 29 30 29 28 27 27 29 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 28 27 27 26 26 26 26 26 26 27 27 26 26 27 27 27 27 26 26 26 26 26 26 27 27 27 27 27 27 27 25 24 52 52 52 52 51 51 50 50 49 49 49 50 51 51 50 50 50 49 50 51 51 51 49 50 52 52 52 51 52 52 52 53 53 54 54 55 54 53 53 53 53 52 53 54 54 55 55 54 53 53 52 52 52 50 49 49 50 51 51 51 52 52 51 51 51 51 52 53 52 52 51 49 48 48 48 48 48 48 48 48 48 48 48 48 49 51 53 53 53 52 51 50 50 50 51 51 51 50 48 48 47 47 47 47 47 47 47 46 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 45 44 44 43 43 43 43 44 44 44 45 46 46 45 44 44 43 43 42 42 42 43 43 43 43 44 45 46 46 47 47 46 46 46 46 46 45 44 44 43 42 42 42 41 41 41 41 42 43 44 43 43 43 43 43 44 44 44 44 43 42 41 41 41 41 42 42 42 43 43 43 42 42 42 43 42 42 42 42 42 42 42 42 41 41 41 41 43 44 44 45 45 44 43 42 43 43 43 42 41 42 42 43 43 44 45 45 44 43 43 44 44 44 43 42 42 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 40 38 37 38 37 36 36 36 36 37 39 39 40 39 37 38 39 38 37 37 36 37 37 36 35 34 34 34 34 34 36 37 38 40 40 39 37 37 38 39 38 37 37 35 35 34 34 34 35 36 37 38 38 39 40 40 38 37 37 38 38 39 40 40 40 40 40 41 41 41 40 40 40 41 40 40 41 41 41 40 40 40 40 40 40 41 41 40 40 40 40 41 41 41 41 41 41 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 39 37 37 37 36 35 34 33 33 33 34 35 34 33 33 34 35 34 34 34 33 33 33 33 33 32 32 31 31 31 32 32 33 34 35 36 36 35 34 34 34 33 32 33 33 32 32 33 34 34 33 33 33 33 34 34 35 35 35 35 36 35 34 34 34 34 34 34 34 34 34 34 34 33 33 33 32 30 30 30 29 28 26 27 27 28 29 29 29 30 30 30 29 27 27 28 29 30 30 29 29 28 27 25 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 28 28 27 26 28 30 30 31 32 32 31 30 29 30 29 28 28 28 27 27 26 25 25 26 27 27 29 29 28 28 29 29 29 28 29 29 30 30 30 30 29 28 28 29 29 29 28 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 29 29 28 27 27 27 27 27 26 26 26 27 28 27 27 27 27 27 27 27 27 27 27 26 26 26 25 25 26 26 26 27 27 27 27 26 25 50 50 50 50 50 51 50 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 49 50 52 52 51 51 52 53 53 53 53 53 54 54 54 53 52 52 53 52 53 53 54 54 54 54 54 52 52 52 52 51 50 49 49 50 50 51 52 52 51 50 51 51 53 53 53 52 52 50 48 47 47 47 47 48 48 48 48 48 48 48 49 51 52 52 52 51 50 50 50 50 50 50 50 49 48 48 47 47 47 47 46 46 46 46 45 45 45 46 46 46 46 46 46 46 45 45 46 46 45 46 46 45 45 45 44 44 44 43 43 43 44 45 45 46 46 46 45 44 43 43 42 42 42 43 43 43 43 44 46 46 46 46 46 46 45 46 46 46 46 46 45 43 42 42 42 41 41 41 41 42 43 43 43 43 43 43 43 43 44 44 43 43 41 41 41 41 41 41 41 42 42 42 43 42 42 42 42 42 42 42 42 42 42 41 42 41 41 41 41 42 43 44 45 44 43 43 43 43 43 42 41 41 42 42 42 43 44 45 45 44 44 44 44 44 43 42 42 42 42 41 41 41 40 40 40 40 39 39 39 39 39 39 40 40 40 39 37 37 36 37 37 37 37 38 40 40 39 38 37 39 40 40 39 39 39 39 39 38 36 36 35 34 34 34 35 36 37 38 38 38 37 36 37 37 37 36 35 35 34 34 34 35 36 37 37 37 38 39 40 40 40 39 38 37 38 38 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 41 40 40 41 41 40 41 41 40 40 41 41 41 41 41 41 41 41 41 41 41 41 42 42 41 41 40 40 40 40 40 39 39 38 38 37 37 36 36 36 36 35 34 33 33 33 34 34 33 33 33 34 34 34 34 33 33 33 33 33 33 33 33 32 30 30 31 32 33 34 35 36 36 35 34 34 33 32 32 33 32 32 33 33 33 32 32 33 33 33 35 36 35 35 35 36 35 35 34 34 35 35 35 34 34 34 34 34 33 31 31 30 30 29 28 29 28 27 27 26 27 28 29 29 29 30 29 29 27 26 28 28 28 28 28 28 28 27 25 24 24 24 24 24 24 24 24 24 24 24 24 24 25 27 28 30 30 28 26 28 30 30 32 32 30 30 30 29 28 27 27 26 26 27 26 26 25 26 26 27 27 29 30 29 29 29 28 28 28 29 29 30 30 30 29 28 27 27 29 29 28 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 30 30 30 31 30 30 30 30 29 28 27 27 27 27 27 27 27 28 29 28 27 27 27 28 28 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 25 25 26 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 49 49 49 49 50 50 49 50 51 51 50 51 51 52 53 53 52 52 53 54 54 54 53 52 52 52 52 52 52 53 54 54 54 53 53 52 51 51 51 50 48 48 48 49 50 52 52 50 50 50 51 52 53 53 52 51 50 48 47 47 47 47 47 47 47 47 47 47 48 49 50 51 51 51 50 49 49 49 50 49 49 49 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 46 45 45 46 46 46 46 46 45 45 45 45 45 45 43 43 43 43 45 45 45 46 46 46 45 45 43 42 42 42 42 42 42 42 44 45 45 45 45 45 45 45 45 45 45 45 46 46 44 43 43 42 42 41 41 41 41 42 43 42 42 43 43 42 43 43 43 43 42 41 41 41 41 41 41 41 41 41 42 42 42 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 43 42 41 41 41 42 42 43 43 44 44 45 45 44 44 44 44 43 43 43 43 43 42 41 42 41 40 40 40 40 39 39 39 38 38 38 39 40 40 38 36 37 38 39 39 39 39 40 40 39 39 38 39 40 40 40 40 40 40 40 38 37 37 36 34 34 34 34 35 36 37 37 37 37 37 37 36 35 35 34 34 34 34 35 35 37 38 38 38 38 38 39 39 40 40 39 38 37 37 38 39 39 39 40 40 41 41 41 41 42 41 41 41 42 42 42 42 41 41 41 41 41 41 41 41 40 41 41 41 41 41 40 41 40 40 41 41 41 41 42 42 42 41 41 41 40 40 39 38 37 36 36 36 36 36 36 36 36 36 34 33 33 32 33 33 33 32 33 34 33 33 33 33 34 34 34 34 34 33 33 32 31 30 31 32 33 34 36 36 35 34 34 34 33 32 32 32 31 32 32 32 32 33 33 34 34 34 35 35 35 36 36 36 35 35 35 35 35 35 34 34 34 34 34 33 31 30 30 29 28 28 29 29 28 28 27 26 26 27 27 27 28 28 29 28 26 27 27 27 27 27 27 27 26 24 24 24 24 24 24 24 24 24 24 24 24 25 26 27 29 30 31 30 28 27 28 29 31 33 32 30 30 30 29 28 28 27 26 26 26 26 25 25 26 27 27 27 28 29 30 29 28 27 28 30 30 30 30 30 30 29 28 27 27 28 28 28 27 27 28 29 30 30 30 31 30 30 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 29 28 27 27 27 27 28 27 27 27 29 30 29 28 27 28 28 27 27 26 26 26 27 27 27 27 27 27 26 26 25 25 24 24 24 24 50 50 50 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 49 49 49 49 50 50 50 50 51 52 52 52 52 51 52 52 53 54 54 53 53 51 51 52 52 51 52 53 53 53 52 53 53 52 51 50 49 48 48 48 49 51 52 51 50 49 49 50 51 52 53 52 50 49 48 46 46 46 46 47 47 47 47 47 47 47 48 49 49 49 50 50 49 49 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 45 45 45 45 43 43 43 43 44 45 45 45 45 45 45 45 44 42 42 42 42 42 42 42 43 43 44 45 44 45 45 44 44 44 44 45 45 45 45 44 44 43 42 42 41 41 41 42 42 42 42 42 42 42 42 43 42 42 41 41 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 41 42 42 43 42 42 42 43 43 42 41 41 41 42 42 43 43 44 44 45 45 44 44 44 44 44 43 43 43 43 42 41 42 42 42 41 40 40 41 40 40 39 39 38 38 38 39 38 36 37 39 40 40 40 40 40 40 40 40 39 39 39 40 40 41 41 40 40 38 37 37 36 35 34 34 34 34 35 36 37 37 36 36 36 35 34 34 34 35 35 35 35 35 37 38 39 40 39 38 39 40 40 41 40 39 38 37 37 37 37 39 40 40 40 41 41 41 41 42 41 40 41 41 41 41 41 41 40 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 41 42 42 41 41 41 42 41 40 40 39 38 38 37 36 36 35 35 35 35 35 36 35 34 33 33 32 33 33 32 32 32 32 32 32 33 33 33 33 33 33 33 33 32 32 31 30 31 31 33 34 34 34 35 34 34 34 33 31 30 31 32 33 33 33 33 34 34 33 33 33 34 35 36 36 36 35 34 34 35 35 35 34 34 34 34 34 33 32 31 30 29 28 29 30 30 29 29 29 28 27 26 26 26 26 26 27 26 25 25 27 27 27 27 27 25 24 24 24 24 24 24 24 24 24 24 24 25 26 27 28 29 30 32 31 29 27 27 29 30 32 32 32 31 30 30 29 29 30 28 27 27 26 25 25 26 27 27 27 28 28 29 29 29 27 27 28 30 30 30 30 30 30 30 29 28 27 27 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 29 28 27 27 27 29 29 28 27 28 29 30 29 28 29 29 28 27 26 26 26 27 28 28 27 27 27 27 27 26 26 25 25 24 24 24 51 51 50 50 49 49 49 50 50 50 51 51 50 49 50 49 48 48 48 48 48 48 49 49 49 51 52 52 52 52 51 51 52 52 53 54 53 53 53 52 51 52 52 51 52 52 52 52 52 54 53 52 52 51 50 49 48 48 48 49 50 50 49 49 49 50 50 51 52 52 51 49 48 47 46 46 46 46 47 47 47 46 46 47 47 48 48 48 49 49 48 48 48 49 49 49 49 49 48 47 48 48 47 47 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 43 43 43 44 44 44 43 43 43 42 42 43 43 44 44 44 44 45 44 43 42 42 41 41 41 41 41 42 42 43 44 43 43 44 44 43 43 44 44 44 44 45 44 43 43 43 43 42 41 41 41 41 41 41 42 42 41 41 42 42 41 41 41 41 40 40 41 41 41 41 41 42 42 41 41 41 41 40 40 41 41 41 41 40 40 40 40 40 41 41 42 42 42 42 42 42 42 42 42 41 41 42 42 43 43 44 44 45 45 44 43 44 44 44 44 43 44 44 43 42 42 43 43 43 42 40 41 42 42 41 40 40 39 39 38 38 37 37 38 39 39 40 40 40 41 41 41 40 40 39 39 40 40 41 41 40 40 39 38 37 37 35 34 34 34 34 34 35 37 37 36 35 34 34 34 34 35 36 36 35 35 35 36 37 38 39 39 39 40 41 42 42 41 40 39 37 37 37 38 39 40 40 40 41 41 41 41 42 41 41 40 40 40 40 40 40 40 41 41 41 41 40 41 41 41 40 40 39 39 40 40 39 39 40 42 43 41 40 40 40 41 40 40 40 40 39 39 38 37 36 35 35 35 34 34 34 34 34 34 34 33 33 33 32 32 32 31 31 31 32 32 32 32 33 33 32 31 31 31 30 30 30 30 31 33 33 34 34 34 34 33 33 32 30 31 32 33 32 32 32 32 32 33 33 33 34 35 35 36 36 34 34 34 35 35 36 35 34 34 34 34 33 32 32 30 28 29 30 30 30 30 30 30 29 27 27 27 27 27 26 26 25 25 24 26 27 26 26 25 24 24 24 24 24 24 24 24 24 24 24 24 26 27 28 29 30 32 32 32 29 28 29 31 31 32 32 31 31 30 29 29 30 30 29 27 27 27 26 25 26 27 27 28 29 29 29 29 28 27 27 28 30 30 29 29 30 30 30 30 30 29 27 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 30 29 28 27 27 29 30 30 28 28 29 30 29 28 28 29 29 29 27 26 27 28 28 27 27 27 27 27 27 27 26 26 26 25 25 25 25 53 52 51 51 50 50 50 51 52 52 52 52 50 50 51 51 49 48 48 48 48 48 48 48 49 51 52 52 52 51 50 51 52 52 53 53 52 52 53 52 51 51 51 51 51 51 51 51 51 53 53 53 53 52 51 49 48 47 47 48 49 50 49 48 48 49 50 51 51 52 51 49 48 47 47 46 46 46 46 46 46 46 46 47 48 48 48 48 48 48 48 48 48 48 48 48 49 49 48 48 48 48 48 47 47 46 46 46 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 41 40 40 41 41 41 42 41 41 41 42 42 41 41 41 41 40 40 40 41 40 40 41 41 41 41 40 40 40 40 40 41 41 40 40 40 39 39 40 40 41 41 42 42 42 41 41 42 42 42 41 41 41 41 42 42 43 43 44 44 44 44 43 43 43 44 44 43 43 44 43 43 43 43 43 43 42 41 41 42 42 41 40 40 40 40 40 39 38 38 39 39 39 40 40 40 41 41 41 40 40 40 40 40 40 40 40 40 40 39 38 37 36 35 34 34 34 34 34 34 35 36 36 35 34 34 35 36 38 37 36 36 36 36 35 36 38 38 38 39 40 41 43 43 42 41 39 38 38 37 38 39 39 40 40 40 40 41 41 40 41 41 40 40 40 39 39 40 40 41 41 40 39 39 40 41 41 40 39 38 39 39 39 38 38 40 41 42 41 40 40 40 40 40 40 40 40 40 40 39 38 38 38 37 36 36 35 35 35 34 33 34 34 34 34 34 33 33 32 32 32 31 31 30 31 31 31 30 30 30 31 31 31 31 31 31 31 32 33 34 34 34 33 33 31 30 30 31 32 32 32 32 33 33 33 34 34 34 35 35 35 35 34 33 34 34 35 35 35 34 34 34 33 32 31 31 29 28 29 30 30 30 30 30 30 29 28 29 29 28 28 28 27 27 26 25 24 25 24 24 24 24 24 24 24 24 24 24 24 24 24 24 26 28 29 29 30 32 33 32 31 30 29 30 31 31 30 31 30 30 30 29 29 29 30 29 28 27 27 26 25 25 26 26 27 29 29 29 28 28 27 27 27 28 29 29 29 30 29 29 29 30 29 28 26 26 27 28 29 30 30 30 30 31 31 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 29 28 27 27 28 30 30 30 29 29 30 30 29 29 29 29 28 27 27 27 28 29 29 28 27 27 27 27 26 26 26 26 26 24 25 26 25 53 52 52 51 52 51 50 52 52 52 52 52 50 50 52 52 51 50 49 48 48 48 48 48 48 49 50 50 51 50 49 50 51 52 52 52 51 52 53 53 52 51 51 50 50 51 50 50 51 52 53 53 53 52 51 49 48 47 47 47 48 49 48 48 48 48 49 50 50 51 50 49 48 47 47 46 46 45 45 46 46 46 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 44 44 45 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 42 42 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 43 42 42 42 42 42 42 41 40 40 40 41 41 41 41 41 41 41 41 41 40 41 41 41 40 40 40 40 40 41 41 41 40 40 40 40 40 41 41 41 40 40 39 39 39 40 41 41 41 41 41 41 41 41 42 41 41 40 40 41 41 41 42 43 43 43 43 44 44 42 42 43 43 43 43 43 43 43 43 44 44 43 43 42 41 41 42 42 41 40 40 41 41 40 40 39 39 40 40 40 40 40 41 41 41 41 41 40 40 40 40 40 39 39 39 39 38 38 37 36 35 35 35 34 34 34 34 34 35 35 34 34 35 37 39 39 37 37 37 38 37 36 36 37 38 38 39 40 41 42 42 42 42 41 40 40 38 37 38 39 40 40 40 40 40 40 40 40 40 40 39 39 39 38 39 40 40 40 39 38 38 39 40 40 40 38 38 39 38 38 39 39 40 41 42 42 40 40 40 40 40 41 41 40 40 39 39 39 39 39 39 37 37 37 37 37 36 35 35 34 34 34 34 34 34 34 34 33 33 32 32 31 31 31 31 31 32 32 33 33 33 32 31 30 31 32 33 33 33 34 33 31 30 30 30 32 32 32 33 33 34 34 34 34 34 34 34 34 34 33 33 33 34 35 35 34 34 34 33 32 31 30 29 28 28 29 31 32 32 32 31 30 29 29 29 29 28 29 29 28 27 26 25 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 27 29 30 29 30 32 33 32 30 29 29 29 30 30 30 30 30 30 30 30 30 29 29 30 29 29 27 27 26 25 24 25 26 27 28 29 29 27 27 27 27 27 27 28 28 29 29 28 28 28 28 28 27 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 29 28 27 28 29 30 30 30 29 29 30 29 29 29 29 28 27 27 27 28 29 30 30 29 28 27 27 27 26 27 27 27 27 26 26 26 24 53 52 52 52 52 51 51 52 53 53 52 52 51 51 52 52 51 50 49 48 47 47 47 47 47 48 48 49 49 49 49 50 51 52 52 52 51 51 52 53 52 51 51 50 50 50 50 50 52 52 52 52 53 52 52 50 49 47 47 47 48 48 48 48 48 48 49 49 49 49 49 48 47 47 47 46 46 45 45 45 46 46 46 47 47 47 47 47 48 48 47 47 47 48 48 48 47 47 48 48 48 48 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 46 45 45 46 45 45 45 45 45 45 45 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 40 40 40 40 40 41 41 40 40 40 40 40 40 40 41 41 40 40 39 39 40 40 41 41 41 41 41 41 40 41 41 40 40 40 40 41 41 42 43 42 42 43 43 43 43 41 41 43 43 42 43 43 43 43 43 43 43 43 43 41 41 41 41 42 41 41 42 42 42 41 40 39 40 41 41 41 41 41 42 42 41 41 41 41 41 41 40 40 40 39 39 38 37 37 37 36 36 37 36 35 34 34 34 34 34 34 34 35 36 38 40 39 38 38 38 39 38 37 36 36 37 38 39 40 40 41 41 42 42 41 41 40 39 38 38 38 39 40 40 40 40 39 39 39 40 40 39 38 38 38 39 40 41 40 39 38 38 39 40 40 40 39 38 38 37 38 40 40 40 40 41 41 40 39 39 39 40 41 41 40 40 39 38 39 39 39 39 39 38 37 37 37 37 37 36 35 33 33 33 34 35 35 34 34 34 34 34 34 33 33 33 33 33 33 34 34 34 33 31 30 30 31 32 31 31 32 32 31 30 30 30 31 31 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 35 36 36 35 34 33 31 30 30 29 29 28 29 31 32 33 33 33 32 31 30 30 29 28 28 28 28 27 26 26 26 25 24 24 24 24 24 24 24 24 24 24 26 27 28 28 29 31 31 30 31 33 33 33 31 29 29 30 31 31 30 30 30 30 30 30 30 30 30 30 30 29 29 28 27 26 25 24 26 27 28 29 28 27 26 26 27 27 27 27 28 29 28 27 27 27 26 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 29 28 27 28 30 30 30 29 29 29 30 29 29 29 27 27 27 27 27 29 30 30 30 29 28 27 27 27 27 28 27 27 26 26 27 27 26 54 53 53 52 52 52 52 52 53 53 52 52 51 51 52 52 52 50 50 49 47 47 47 47 47 47 47 47 48 48 49 50 50 51 52 51 50 50 51 53 53 52 52 50 49 50 50 50 52 52 52 52 53 52 52 52 50 47 47 47 48 48 48 48 48 48 49 49 49 49 49 48 48 47 47 47 46 46 45 45 45 46 46 46 46 46 46 47 48 48 47 47 47 47 47 47 47 47 48 48 48 48 47 47 47 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 46 46 45 44 44 44 44 44 44 44 42 42 42 42 42 42 42 42 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 41 40 40 40 40 40 40 40 40 41 41 40 39 39 40 40 40 41 41 41 41 41 40 40 40 40 40 40 40 40 41 41 41 42 42 42 43 42 42 41 41 41 42 42 42 43 43 43 43 43 43 42 42 42 41 40 40 41 42 42 42 42 43 42 42 41 40 41 42 43 42 42 42 42 43 43 42 42 42 42 41 41 41 40 40 40 39 38 37 37 37 37 38 38 36 35 34 34 34 34 34 35 36 37 38 40 40 39 39 40 40 40 39 37 36 37 38 39 40 40 40 41 42 42 41 40 40 40 39 39 38 39 40 40 40 40 39 37 38 38 38 38 37 37 38 39 39 40 40 39 38 38 39 38 38 39 39 38 37 37 38 39 40 40 40 40 40 40 39 38 39 40 41 40 40 40 39 38 39 39 38 38 38 38 37 37 36 36 36 36 35 34 33 33 33 34 34 34 34 35 35 35 35 35 35 34 34 34 34 34 34 34 33 32 31 30 30 30 29 29 31 31 30 30 30 30 30 31 33 33 33 33 33 33 33 33 33 33 33 33 32 33 34 35 37 37 35 34 32 31 31 31 30 30 29 30 32 33 33 32 32 32 32 31 30 29 28 27 27 27 27 26 27 28 26 24 24 24 24 24 24 24 24 25 26 28 28 29 30 30 31 32 32 32 32 33 33 32 30 29 30 32 32 30 30 30 30 30 29 29 29 30 30 30 30 30 30 29 27 25 24 26 27 28 28 27 27 26 26 27 27 27 27 27 28 27 26 26 26 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 29 29 30 29 29 28 29 29 30 30 30 31 30 30 29 29 29 29 29 30 30 30 29 29 30 30 30 30 28 27 28 28 28 29 29 30 29 29 28 27 27 27 28 28 27 27 27 27 27 28 27 27 54 53 53 52 52 52 52 52 53 53 53 53 52 52 52 53 52 51 51 50 49 48 48 47 47 47 47 47 47 48 49 49 49 50 51 51 49 49 50 52 53 53 52 51 49 49 49 50 51 51 51 52 52 52 51 51 50 48 47 47 48 48 48 48 48 48 49 49 48 48 48 49 48 48 47 47 46 46 45 45 45 46 46 46 46 46 46 47 47 47 47 47 47 47 46 46 47 47 48 48 48 48 47 47 47 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 45 44 43 43 43 44 44 43 42 42 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 40 40 40 40 39 40 40 40 40 39 40 40 41 40 39 39 39 39 40 40 41 41 40 40 40 40 39 39 39 40 40 40 41 41 41 41 41 42 42 42 41 41 41 41 42 41 41 43 43 42 42 43 43 42 42 42 41 40 40 41 42 42 42 42 43 43 42 41 40 40 42 43 43 43 43 43 43 43 43 42 42 43 42 41 41 41 41 41 40 39 39 39 39 38 38 38 37 36 34 34 34 34 35 36 37 37 39 40 40 40 40 40 41 40 40 39 37 37 37 38 39 39 40 40 41 42 41 40 40 41 40 39 39 40 40 40 41 40 39 37 37 38 37 37 37 37 38 38 38 39 40 39 37 37 38 37 37 38 38 37 37 38 38 39 40 40 39 39 40 40 39 38 39 39 40 40 40 40 39 37 38 38 38 37 37 37 37 36 36 36 35 35 34 35 34 33 33 34 33 33 34 35 36 36 36 36 35 34 34 34 34 34 34 34 34 33 33 32 32 31 30 29 30 30 30 30 30 30 31 33 33 33 32 33 33 32 32 33 33 33 33 33 33 34 35 36 36 36 35 34 33 33 33 33 31 31 30 30 32 33 33 31 30 30 31 30 29 28 28 29 29 28 28 28 29 29 26 24 24 24 24 24 24 24 24 26 28 27 27 29 30 30 30 31 32 33 33 32 32 31 30 29 30 32 31 30 30 31 30 30 29 29 29 30 30 30 30 30 29 29 27 25 24 25 26 27 27 27 26 26 26 27 26 26 27 27 27 26 26 26 26 26 27 27 29 30 30 30 30 30 30 30 30 30 30 29 29 29 30 29 28 28 29 29 30 30 30 31 30 30 29 29 29 29 29 30 30 30 30 30 30 30 30 30 29 29 30 29 29 30 30 29 29 28 27 27 27 29 29 29 28 27 27 27 28 29 28 27 54 54 54 53 53 53 53 53 53 54 54 54 53 52 52 53 52 51 51 51 51 50 49 48 47 47 47 47 47 47 48 48 48 49 49 50 49 48 49 51 52 52 52 51 50 49 49 49 51 51 50 51 52 51 50 50 49 48 47 47 47 47 47 48 48 48 49 49 48 48 48 48 49 48 47 47 46 46 45 45 45 45 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 47 48 48 48 48 47 47 47 46 46 46 46 46 46 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 44 44 44 44 43 43 43 43 43 44 44 44 43 43 43 42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 39 39 40 40 40 39 39 39 39 40 40 41 41 40 39 39 39 39 39 40 40 41 41 41 41 41 41 41 41 42 42 41 41 41 41 41 40 41 42 43 42 42 43 43 42 41 42 42 40 40 40 41 41 41 42 42 42 42 42 41 41 41 42 43 43 43 43 43 42 42 41 41 42 42 41 41 42 41 41 40 39 39 39 40 39 38 37 37 36 34 34 34 34 36 38 38 39 40 40 41 40 40 41 41 41 41 40 39 38 37 37 38 38 39 40 41 42 42 41 42 41 40 40 39 40 41 41 40 40 39 38 37 37 37 37 38 38 37 37 38 39 39 38 37 37 37 37 37 38 38 37 36 37 38 38 38 39 38 39 40 40 39 38 38 39 39 40 40 40 39 38 37 37 38 38 37 36 36 36 36 37 36 35 34 35 34 34 34 33 33 32 33 34 36 35 34 34 34 34 33 34 34 34 34 34 34 34 34 34 33 32 30 29 30 29 29 30 30 31 32 32 31 31 30 31 31 31 31 31 31 33 33 33 34 35 35 35 35 36 35 35 34 34 34 33 33 32 31 32 33 33 32 30 30 30 29 29 29 29 29 30 29 29 29 30 30 28 25 24 24 24 24 24 24 24 24 26 28 28 29 30 30 30 30 30 31 33 33 32 31 30 29 29 31 32 32 31 32 32 30 30 29 29 29 30 30 30 30 30 29 27 27 25 24 25 26 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 28 29 30 30 30 30 30 30 30 29 29 29 29 28 29 29 28 28 29 29 29 30 30 30 31 30 29 29 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 29 29 29 28 28 28 29 30 29 28 27 27 28 28 29 29 28 56 55 55 54 54 54 53 53 54 55 55 54 53 52 53 53 53 52 52 52 51 51 51 50 48 48 47 47 47 47 47 47 47 47 47 48 48 48 49 51 52 51 51 51 50 49 48 48 50 50 50 51 52 51 49 49 48 47 46 46 47 47 47 47 48 48 48 48 48 47 47 48 48 48 47 47 46 46 45 45 45 45 45 45 46 47 48 47 46 46 46 46 46 46 45 45 46 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 43 43 43 44 45 45 45 44 44 43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 40 40 40 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 39 39 39 39 39 39 39 40 40 39 39 38 39 39 40 40 40 40 40 39 39 39 40 40 41 41 41 41 41 41 41 41 40 40 41 42 41 41 40 40 40 40 41 42 42 41 41 42 43 42 41 41 41 40 40 40 40 41 41 41 41 42 42 42 41 41 41 41 42 42 43 43 43 42 41 40 40 41 41 41 42 42 41 40 39 39 38 38 39 39 38 37 36 35 34 34 34 34 36 38 39 40 40 41 42 41 41 41 42 42 41 41 40 39 38 38 37 38 39 40 41 42 42 42 43 42 41 40 39 40 40 41 40 40 39 38 37 36 36 37 38 37 37 37 38 38 38 38 37 36 36 36 37 38 38 38 36 37 37 37 37 38 39 40 41 40 39 38 38 39 39 40 40 40 39 39 38 37 37 39 38 38 37 37 37 37 36 36 35 34 33 33 33 33 32 32 32 33 34 35 34 34 34 34 33 33 34 34 34 34 34 34 34 34 33 32 30 29 30 29 29 30 31 31 31 30 30 30 30 30 30 30 31 31 32 33 34 34 34 34 33 34 35 35 35 35 35 34 34 34 34 33 32 32 33 33 32 32 32 31 29 29 29 30 30 30 30 30 29 29 28 26 24 24 24 24 24 24 24 25 26 27 29 29 29 29 29 30 30 30 30 32 33 33 32 31 30 30 31 33 33 32 33 33 31 31 30 29 29 29 30 30 30 30 28 27 26 25 24 26 27 27 27 26 26 25 25 25 25 25 25 25 26 27 27 27 28 28 28 28 29 30 30 30 30 30 30 30 29 28 28 28 28 29 29 27 28 29 30 30 30 30 31 31 30 29 29 30 30 30 30 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 30 29 28 27 29 29 29 30 29 29 57 55 55 55 55 54 54 54 55 55 55 54 54 53 54 54 54 53 52 52 52 52 52 52 50 48 47 47 47 46 46 47 47 46 46 47 47 47 49 50 51 51 50 51 50 49 48 48 49 50 50 50 51 51 49 49 48 47 46 46 47 47 47 47 47 47 48 48 48 48 47 47 47 47 47 47 47 46 45 45 45 45 45 45 46 47 48 47 46 46 46 46 46 46 45 45 46 47 47 47 47 47 47 47 47 46 46 46 45 45 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46 45 45 46 45 45 44 44 44 44 44 45 46 45 45 45 44 43 43 43 44 43 43 43 43 42 42 42 41 41 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 39 39 40 39 39 39 39 39 39 38 38 38 38 38 39 39 38 38 39 39 39 39 39 39 38 38 39 40 41 40 40 39 40 41 40 40 41 41 41 41 41 41 41 41 41 40 40 41 41 41 41 40 40 40 40 41 41 42 41 41 41 42 43 41 40 40 40 39 39 40 41 41 40 41 42 42 42 41 40 40 41 41 42 43 43 43 43 42 41 40 40 40 40 41 41 41 40 39 38 37 37 38 39 38 37 35 34 34 34 35 36 36 37 38 40 41 41 41 42 42 42 42 42 41 40 40 40 40 39 38 38 39 40 41 42 42 43 43 43 42 41 40 40 40 40 40 39 39 39 37 36 36 37 37 36 36 37 37 37 37 37 38 37 35 35 36 37 38 38 37 36 36 37 37 37 39 40 40 40 40 38 38 39 39 39 40 39 39 39 38 37 37 38 39 38 37 37 37 37 37 37 36 35 34 33 33 33 33 32 32 32 33 34 34 34 34 34 33 33 33 34 34 34 34 34 34 34 32 32 31 29 29 29 29 30 31 30 30 30 30 30 31 31 31 32 33 32 33 34 35 34 33 33 33 34 34 34 34 34 35 35 35 34 34 34 34 33 33 33 33 33 33 31 30 30 30 30 30 29 29 28 28 27 26 24 24 24 24 24 24 24 24 26 29 29 29 28 28 29 29 30 30 30 30 30 31 31 32 32 32 31 32 33 33 33 33 32 31 31 30 29 29 29 29 29 30 30 29 28 26 25 24 26 27 27 26 25 24 24 24 25 26 26 26 26 26 27 27 28 29 29 29 29 30 30 30 30 30 30 30 29 29 27 27 27 29 29 28 27 28 29 29 30 30 30 31 31 30 30 30 30 31 31 31 31 31 30 30 30 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 29 29 30 30 30 30 30 56 55 55 55 55 55 55 55 55 55 55 55 54 54 54 55 55 54 53 53 52 52 52 52 51 50 49 48 48 47 47 47 47 46 46 46 46 47 48 49 51 50 49 50 51 50 48 47 48 49 49 49 50 50 49 48 48 48 47 46 46 47 47 47 47 47 47 48 48 48 47 47 47 47 47 47 47 46 45 45 45 45 45 46 47 47 48 47 46 46 46 46 46 45 45 45 46 47 47 47 47 47 47 47 47 46 46 46 46 46 45 45 45 46 47 48 47 47 47 46 46 47 47 46 46 46 45 45 46 45 45 44 45 45 45 45 45 46 45 45 45 44 43 43 44 44 44 43 43 43 42 42 42 42 41 43 44 43 43 43 43 43 43 42 42 41 42 42 42 42 42 41 41 41 41 41 41 40 40 41 40 40 40 40 40 40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 39 38 38 38 38 38 38 39 40 40 40 40 39 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 40 40 40 39 39 40 40 41 41 40 40 41 42 42 41 40 40 40 39 38 40 40 40 40 41 42 41 42 41 40 40 40 40 41 42 43 43 43 43 42 41 41 40 39 39 40 40 40 40 39 38 37 37 38 38 36 35 34 34 34 35 36 36 38 39 40 40 40 40 41 42 43 43 43 42 41 41 42 41 40 39 38 39 40 41 41 42 43 43 43 43 42 41 41 41 40 40 39 39 38 37 36 35 36 37 36 35 36 37 36 36 37 38 37 35 35 35 36 37 38 38 37 36 36 37 37 38 39 40 40 40 38 37 38 38 39 39 39 39 39 38 37 36 37 39 38 37 36 36 36 36 36 36 35 34 34 33 34 34 34 33 32 32 32 33 33 33 33 33 33 33 34 34 34 34 33 32 32 31 31 31 29 29 29 29 30 30 29 29 29 30 31 32 33 33 33 33 33 33 34 34 34 33 33 34 34 34 33 33 34 34 35 35 34 33 33 34 34 34 34 34 34 33 32 31 31 31 30 29 27 27 26 26 26 24 24 24 24 24 24 24 24 24 27 30 29 28 27 27 28 28 29 30 30 30 30 30 30 30 31 32 32 33 33 33 33 32 31 30 30 30 29 29 29 29 29 30 30 29 28 27 26 25 25 25 26 25 24 24 25 26 26 27 28 27 27 27 27 28 29 29 30 30 30 30 30 30 29 29 30 29 28 27 27 27 27 27 27 27 28 29 29 29 29 30 30 31 31 31 30 30 31 31 32 32 31 30 30 30 30 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 30 30 55 56 55 55 55 55 55 55 55 54 55 55 55 55 55 55 55 55 54 53 52 51 51 51 51 50 50 49 48 48 48 48 47 47 46 46 46 46 46 47 48 48 48 50 51 50 49 47 47 48 48 48 49 49 48 48 48 48 47 46 46 46 46 47 47 47 47 48 48 48 47 47 46 46 46 46 47 46 46 45 45 45 45 46 47 47 48 47 46 46 45 45 45 45 45 46 46 46 46 46 46 47 46 46 46 46 47 47 47 47 46 45 45 46 47 48 47 47 47 47 47 47 47 46 46 46 46 46 46 46 45 45 45 46 46 45 45 46 45 45 45 44 44 44 45 45 45 44 43 43 43 42 42 42 42 43 44 44 43 44 44 44 44 43 43 42 42 43 43 43 42 41 42 42 42 42 41 41 41 41 41 41 41 40 40 41 41 41 41 41 41 40 40 40 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 40 39 39 39 40 40 40 41 41 41 41 41 41 41 42 41 41 40 40 41 40 40 40 40 39 39 40 41 40 40 40 41 42 42 41 40 40 39 38 38 40 40 40 40 41 41 41 42 41 40 39 40 40 41 42 43 43 42 42 42 41 41 40 38 38 39 39 40 40 40 39 37 35 35 36 35 34 34 34 34 35 34 36 38 39 39 40 40 39 41 42 42 43 43 43 42 43 43 42 41 41 39 39 39 40 40 41 42 43 43 43 42 42 42 41 40 40 39 39 38 37 36 35 35 36 35 35 36 36 36 36 37 38 37 35 35 35 36 37 37 37 36 35 35 36 37 37 39 40 40 39 38 37 37 38 39 39 38 38 38 38 37 36 37 38 38 37 37 36 36 36 35 35 34 34 33 33 33 33 33 33 33 32 31 31 31 31 32 33 32 32 33 34 34 34 33 32 31 31 31 29 29 29 29 29 29 29 29 29 29 31 32 33 33 34 34 34 34 34 34 33 33 33 32 33 33 33 33 33 33 34 35 34 34 33 33 34 34 34 34 34 34 33 33 32 31 30 29 27 27 26 26 26 25 24 24 24 24 24 24 24 24 24 27 30 29 27 26 27 27 28 28 29 29 29 29 29 30 30 30 31 32 33 33 31 31 31 30 30 30 30 30 30 29 29 29 30 30 29 28 27 27 26 25 25 25 25 24 24 26 27 27 28 29 29 28 28 29 29 30 30 30 30 30 30 30 30 29 29 29 28 27 27 27 27 27 27 27 27 29 30 30 30 30 31 31 31 31 31 31 31 31 32 32 31 30 30 30 30 30 30 30 29 29 28 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 55 55 55 55 55 55 55 55 55 54 54 55 55 55 56 55 55 55 54 53 52 51 52 52 51 50 50 49 49 49 48 48 48 47 47 47 46 46 46 46 46 46 47 48 49 49 49 47 47 48 48 48 48 48 48 47 47 48 47 47 46 46 46 46 46 47 47 47 47 47 47 47 46 46 46 46 47 47 46 46 45 45 45 46 47 47 47 47 46 46 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 46 45 45 46 47 47 47 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 45 45 44 44 44 45 45 46 46 45 44 43 43 42 42 42 42 42 44 45 44 44 45 45 45 44 44 44 42 42 43 43 43 43 42 42 42 43 43 42 41 41 41 42 41 41 40 40 41 41 41 41 41 41 40 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 39 40 40 39 38 39 39 40 40 41 41 41 41 41 41 41 41 41 41 40 40 40 41 40 40 40 39 38 40 41 40 39 39 41 41 41 41 41 40 39 38 38 38 39 40 41 41 40 40 41 41 40 39 39 40 41 41 42 42 42 41 40 40 40 40 39 37 38 38 39 40 39 39 39 36 34 34 34 34 35 36 37 37 36 35 36 37 38 39 40 41 41 41 42 42 43 43 43 43 43 43 42 42 41 40 39 40 40 41 42 43 44 44 43 43 42 41 40 39 38 38 38 37 37 36 35 35 35 34 35 36 35 36 37 37 37 35 35 35 35 36 36 36 35 35 36 38 38 38 39 40 40 39 37 36 37 38 39 39 37 37 37 38 37 36 36 38 38 38 37 37 36 36 35 34 34 34 34 33 33 33 33 33 32 32 32 31 30 30 30 31 30 31 32 33 33 33 34 34 33 33 32 30 29 29 29 29 29 29 29 29 30 31 32 33 33 33 34 34 34 34 33 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34 33 33 33 34 34 34 33 32 30 30 29 28 28 27 27 28 26 24 23 24 24 24 24 24 24 24 27 30 29 27 26 27 29 30 29 29 29 29 29 29 30 31 31 30 31 33 32 29 30 30 30 30 30 30 30 30 29 29 29 30 30 30 29 28 27 27 26 26 25 25 24 24 25 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 28 27 27 27 27 27 28 28 27 28 29 29 30 30 31 32 32 32 32 32 31 31 32 32 32 31 30 30 30 30 30 29 29 29 29 28 28 27 27 28 29 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 54 54 55 55 55 55 54 55 55 53 53 54 55 55 55 55 55 55 54 53 52 52 53 53 52 51 51 51 50 49 48 48 48 48 48 47 47 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 45 45 46 46 46 47 47 47 47 47 46 46 45 45 46 46 46 46 45 44 44 45 47 47 46 46 46 46 45 45 45 44 45 45 46 46 46 46 46 46 46 45 45 46 46 46 46 46 45 45 45 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 45 45 46 46 45 44 44 43 43 43 42 42 42 43 44 45 45 45 46 47 46 46 46 45 43 43 43 44 44 43 43 42 43 43 43 42 42 42 41 41 41 41 40 40 41 41 42 42 41 41 41 41 41 40 40 40 40 40 40 41 41 40 38 38 38 38 38 38 38 38 39 39 39 38 39 39 40 40 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 39 39 39 38 39 40 40 39 39 40 40 41 41 40 40 39 38 37 37 38 40 41 40 40 40 41 42 41 40 40 39 40 41 41 41 41 41 40 39 39 39 38 38 37 37 39 39 37 36 37 36 34 34 34 36 37 39 38 38 38 36 36 37 37 39 41 42 41 42 43 43 43 44 44 44 44 44 43 42 41 41 40 40 41 42 43 43 44 44 43 43 42 41 41 40 39 38 37 37 36 36 35 35 34 34 34 35 35 35 36 36 36 35 34 34 34 35 35 35 36 37 38 39 39 40 40 40 39 38 37 36 37 38 39 38 37 36 36 37 37 35 35 37 38 38 37 37 36 36 35 35 34 34 34 34 34 33 33 33 33 33 33 33 32 30 30 30 30 30 30 31 31 32 33 34 34 34 33 31 30 29 29 29 29 29 30 30 30 30 31 31 31 32 33 34 34 34 33 32 32 33 33 33 34 33 33 33 33 33 34 34 34 34 34 34 33 33 33 33 34 34 33 31 30 30 29 29 29 28 29 29 27 25 23 23 24 24 24 24 24 24 25 27 27 26 27 29 29 30 30 29 29 30 30 30 31 32 32 31 31 31 31 29 29 31 31 30 30 30 29 29 29 29 29 30 30 30 30 29 29 29 28 27 27 27 25 24 25 26 27 27 28 29 29 30 30 30 30 30 30 30 30 30 30 29 28 28 27 27 27 27 27 28 29 29 28 28 28 29 30 30 31 31 32 32 32 32 32 32 31 31 31 31 30 30 30 29 30 30 29 30 30 30 29 29 27 27 28 29 30 30 30 31 31 31 30 31 32 32 31 30 30 30 30 30 30 54 54 54 54 54 54 53 54 54 53 53 53 54 54 54 55 55 55 54 52 52 53 53 53 52 52 52 52 50 49 49 49 49 49 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 47 46 46 47 46 46 46 46 46 46 46 45 45 46 46 46 46 46 47 47 46 46 46 45 45 45 46 46 46 45 45 44 45 46 46 45 46 46 46 45 44 44 44 44 45 46 46 45 45 45 46 45 45 45 45 46 46 46 46 45 44 45 45 46 45 46 46 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 46 46 45 45 46 46 46 45 45 45 45 44 43 43 43 43 44 45 45 45 46 47 47 47 46 46 45 43 43 44 45 44 44 43 43 43 43 43 42 42 41 41 41 41 41 40 40 41 42 42 42 41 41 41 41 41 41 41 41 41 41 42 41 41 41 39 38 38 39 38 38 38 38 38 38 38 38 38 39 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 39 39 39 38 39 39 38 39 40 39 39 39 39 40 40 40 40 39 38 37 37 39 40 40 40 40 40 41 41 41 41 41 39 38 39 40 40 40 41 40 40 39 38 38 38 38 36 38 39 37 35 34 34 34 34 36 37 38 39 39 38 40 39 37 37 38 38 39 40 40 41 42 42 42 44 45 45 45 44 44 43 42 42 41 41 41 42 42 43 44 45 44 43 42 42 42 41 41 40 38 37 37 36 36 36 36 35 34 34 35 35 35 35 35 34 34 34 34 34 35 36 37 38 39 40 40 41 41 40 39 37 36 36 37 38 38 37 37 37 36 35 36 35 35 36 37 37 37 37 37 36 36 35 34 34 34 33 33 33 34 34 34 33 33 32 32 32 31 31 30 30 30 30 30 30 32 32 32 32 32 31 30 29 29 29 29 30 30 30 30 30 30 30 30 31 33 33 34 34 33 33 33 34 34 34 33 32 33 33 33 33 34 34 33 33 34 34 34 33 33 33 33 34 33 31 30 30 30 29 29 30 30 29 28 26 24 23 23 23 23 24 24 24 24 24 25 27 29 30 31 31 31 31 31 31 30 30 30 32 33 33 32 31 30 29 29 30 30 29 29 29 29 29 28 28 29 30 30 30 30 30 29 29 29 28 27 26 25 24 24 25 26 27 28 28 29 30 30 30 30 30 30 30 29 29 29 28 28 27 27 27 27 28 29 29 30 30 29 29 29 29 30 30 30 31 31 31 31 32 32 31 31 30 30 31 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 29 30 30 31 32 31 31 32 33 32 31 30 30 30 29 28 29 53 53 53 53 54 53 53 53 54 53 52 52 53 53 54 54 54 55 54 53 53 53 53 53 52 52 52 51 50 50 50 50 51 51 49 48 48 48 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 46 45 44 44 45 45 45 46 46 46 45 45 44 44 44 45 45 46 45 44 45 46 45 44 45 45 45 45 45 45 44 44 44 45 45 45 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 44 43 43 43 44 45 46 46 47 47 46 45 45 45 44 44 44 45 46 45 44 44 43 44 43 43 42 41 41 41 41 41 41 41 41 41 42 43 42 41 41 42 42 42 42 42 41 41 41 42 42 42 41 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 40 39 39 39 39 40 40 40 41 42 41 40 40 40 39 38 38 38 38 38 39 38 38 38 38 39 39 39 39 39 38 37 37 39 39 39 40 40 40 40 40 41 41 40 38 37 38 38 39 40 40 40 41 40 40 39 39 38 36 36 37 37 35 34 34 34 35 37 38 38 40 39 38 40 40 37 38 40 39 39 39 40 40 41 42 42 43 44 44 45 45 45 44 44 44 42 42 42 42 43 43 44 45 45 44 44 43 42 41 40 39 39 38 37 37 37 36 36 36 34 34 34 34 35 35 34 34 34 35 35 36 37 37 37 38 39 40 41 41 40 40 39 37 36 36 37 39 39 38 38 39 37 36 35 35 34 35 36 36 36 36 36 36 36 36 35 34 34 33 33 34 34 34 34 33 33 32 33 33 33 33 32 32 31 30 31 30 30 30 30 30 30 30 30 29 29 29 29 29 30 30 31 31 31 30 30 31 33 33 34 34 34 34 34 34 33 33 32 32 32 32 31 32 32 33 32 33 34 33 33 32 31 31 32 33 33 32 31 30 30 30 30 30 30 29 28 28 27 25 23 23 23 23 24 23 23 24 24 27 29 30 31 31 31 32 33 33 32 31 30 31 33 34 34 32 30 29 28 29 30 29 28 28 28 28 27 27 29 30 30 30 30 30 28 28 29 28 27 26 25 24 24 24 25 27 27 27 28 29 30 30 30 30 29 29 29 28 28 28 27 26 26 27 27 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 30 30 30 30 30 30 30 31 31 31 30 30 30 30 29 28 28 29 27 27 29 30 30 31 31 31 31 31 31 32 31 30 30 29 28 27 28 54 53 53 52 53 53 53 53 54 53 52 52 52 53 53 53 54 54 54 54 54 54 53 53 52 52 52 51 51 51 51 52 52 52 50 49 48 48 48 48 48 47 46 46 46 46 46 46 45 45 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 45 45 45 44 44 44 44 45 45 45 45 45 44 43 44 45 46 46 45 45 45 45 44 43 44 44 45 45 45 44 45 46 45 44 44 45 45 45 45 44 44 44 44 45 45 45 45 45 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 47 47 46 46 46 46 46 46 46 46 46 45 44 43 43 44 44 45 46 47 48 47 46 45 45 45 44 44 45 46 46 46 45 45 44 44 43 42 42 41 41 41 41 41 41 41 41 41 42 43 42 42 42 42 43 42 42 43 42 42 42 42 42 41 40 40 39 39 38 38 38 38 37 37 38 38 38 38 38 39 39 40 39 39 39 39 39 40 40 40 41 41 41 40 40 40 40 39 38 38 38 37 37 37 38 38 38 38 38 38 38 38 38 36 36 38 38 38 40 39 38 38 39 40 40 40 38 36 36 37 38 38 39 40 40 40 40 40 40 39 38 37 36 35 34 34 34 35 37 39 39 39 40 39 39 40 41 38 38 40 40 41 41 41 40 41 42 43 43 44 44 45 46 45 45 45 45 44 43 43 44 44 44 44 44 45 45 45 44 43 41 40 39 39 39 38 37 36 36 36 36 35 34 33 33 34 34 34 34 35 35 35 36 36 37 38 39 40 40 41 40 40 40 39 37 36 35 36 38 39 39 39 39 37 36 35 35 34 34 35 36 36 35 35 35 35 35 35 35 35 35 35 35 35 34 34 34 34 34 34 34 34 34 33 33 31 31 32 31 30 29 29 29 29 30 30 29 29 29 29 29 30 30 31 32 32 31 31 32 34 34 34 34 33 33 33 33 33 32 32 33 32 31 31 31 30 31 30 31 32 31 31 31 30 30 32 33 32 33 31 30 30 29 29 29 29 29 29 29 29 27 24 23 23 23 23 23 23 23 24 25 27 28 29 30 30 32 33 33 32 31 30 30 32 34 33 31 30 28 27 28 29 28 27 27 27 27 27 28 29 30 30 30 30 29 28 27 28 27 26 25 24 24 24 24 26 27 27 27 27 28 29 30 30 30 29 28 28 27 27 27 27 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 31 30 30 30 30 31 32 32 31 30 30 29 28 29 29 28 28 30 30 30 30 30 30 30 30 31 31 31 30 30 28 27 27 27 55 54 53 53 52 52 52 53 53 53 52 51 52 52 52 53 54 54 53 53 53 53 53 53 53 52 52 52 52 52 52 52 52 51 50 49 49 49 49 49 48 48 47 47 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 43 43 43 44 44 44 44 45 44 43 43 44 45 45 44 44 45 45 44 44 43 44 44 44 44 44 45 45 44 44 44 44 45 45 45 44 44 43 43 44 44 45 45 45 45 46 45 45 46 47 46 46 47 47 48 48 48 47 47 47 47 47 47 47 47 47 46 47 47 46 46 47 47 47 46 45 43 43 43 44 45 46 46 47 47 47 46 46 46 46 45 45 45 46 46 46 45 45 44 43 43 42 41 42 42 42 41 41 41 41 41 42 42 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41 40 39 39 39 38 38 38 37 37 37 37 38 38 38 39 39 39 39 38 38 39 39 39 40 40 41 40 40 40 40 41 40 40 39 39 39 38 38 38 38 38 37 37 37 37 37 38 38 38 37 36 37 38 38 39 38 38 38 39 40 40 39 37 36 35 37 38 38 38 39 39 40 39 39 40 40 40 38 36 34 34 34 35 37 39 40 40 41 41 40 40 41 41 39 38 39 40 41 42 42 42 42 42 43 43 44 44 45 46 46 45 45 45 45 44 44 44 45 45 45 45 45 44 44 43 42 41 40 39 38 38 38 36 36 35 35 35 35 34 33 33 34 35 35 35 36 35 35 35 36 37 39 40 41 41 41 40 40 40 39 37 36 35 36 37 38 39 40 38 37 36 36 36 36 34 33 34 35 34 34 34 34 34 34 35 35 35 35 35 34 34 34 34 34 34 34 34 34 34 34 33 32 32 32 31 30 29 29 29 29 29 29 29 29 29 29 30 30 30 30 31 32 33 33 33 33 33 34 34 33 33 33 33 32 32 33 33 33 33 33 32 31 30 30 30 30 30 30 30 30 30 31 31 32 33 32 31 30 29 29 29 29 28 28 28 29 29 26 23 23 23 23 23 23 23 23 23 25 27 29 30 30 31 32 32 31 30 30 30 30 31 31 30 30 29 27 27 27 27 27 27 27 27 27 29 30 30 30 30 30 29 28 27 27 26 26 25 24 24 24 24 26 26 27 27 27 28 29 30 30 29 28 27 27 27 27 27 26 26 27 27 28 29 30 30 30 30 30 30 30 30 29 29 30 30 30 30 30 31 30 30 30 30 31 32 31 30 30 30 30 31 31 31 30 29 29 29 29 28 27 27 28 29 30 30 30 30 29 29 30 31 31 30 30 28 27 26 26 54 54 53 53 52 52 52 52 53 53 52 51 51 52 52 52 53 53 52 53 53 53 53 53 53 53 53 53 53 53 53 52 52 51 50 50 50 51 50 49 49 48 48 48 47 47 47 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 45 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 45 45 44 43 43 43 43 43 43 44 44 44 43 44 44 44 44 44 44 44 43 43 43 44 44 44 45 45 45 45 45 46 46 46 46 46 47 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 45 44 44 43 44 45 45 46 46 47 47 46 46 47 46 46 45 45 46 47 46 45 44 43 43 43 42 42 43 43 42 42 41 41 41 42 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 41 40 39 38 38 38 38 38 37 37 37 37 38 38 38 38 39 39 39 38 38 38 39 39 40 40 40 40 40 40 40 41 41 40 40 40 40 40 39 39 39 38 38 37 37 37 37 37 37 37 37 36 36 36 37 38 38 38 38 38 39 39 37 37 37 35 36 37 37 37 37 38 39 38 38 39 39 38 37 35 34 34 36 36 37 39 39 40 41 41 41 41 42 41 40 38 38 39 40 41 43 44 43 43 43 43 43 44 45 45 45 45 44 44 45 45 44 44 45 45 46 45 45 43 42 41 40 39 38 38 37 37 36 35 35 35 34 34 34 33 33 34 35 36 36 36 37 36 36 36 37 38 39 40 41 41 41 41 40 40 39 37 36 35 35 36 37 38 39 38 36 36 36 36 35 34 33 33 33 33 33 32 32 33 33 33 33 34 34 33 33 33 33 33 33 33 33 34 33 33 33 33 33 33 32 31 30 31 30 29 29 29 29 29 29 29 29 30 31 30 30 30 32 33 33 32 31 33 34 34 34 33 33 32 32 33 33 33 33 33 33 33 33 32 31 31 30 30 30 30 30 30 30 30 31 32 33 32 31 31 30 30 29 28 27 27 27 27 26 24 24 23 23 23 23 23 23 23 24 26 29 30 30 30 31 31 30 29 30 30 29 30 30 30 29 28 27 27 27 27 27 27 27 27 29 30 30 30 30 30 30 29 28 28 28 27 27 25 24 24 24 25 26 26 27 27 27 28 29 30 30 29 27 27 26 26 27 26 26 27 28 29 29 29 30 30 30 30 30 30 30 29 29 29 30 30 30 30 30 30 30 29 29 30 30 31 31 31 30 30 30 30 30 29 29 29 29 30 28 28 28 28 28 28 28 29 29 28 29 29 30 30 30 30 30 28 27 26 26 53 53 53 53 52 52 51 51 52 51 51 51 50 50 51 52 52 52 52 52 53 52 52 52 52 52 53 53 53 53 53 52 52 52 51 51 51 52 51 50 49 49 50 49 48 48 48 47 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 43 42 43 44 44 44 45 45 45 45 45 45 45 45 46 47 47 48 48 49 49 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 45 45 45 45 44 44 45 46 46 46 47 47 46 47 48 47 47 45 45 46 46 45 44 44 43 43 43 42 42 43 43 42 42 42 41 41 42 43 44 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 40 39 38 38 38 38 38 38 37 37 37 37 37 37 38 39 39 39 38 38 38 38 40 40 40 40 39 39 39 40 41 41 41 41 41 41 40 40 40 40 39 38 38 38 38 38 37 36 36 36 36 35 35 36 36 36 37 37 37 38 37 37 37 37 35 36 37 37 37 38 38 38 38 37 37 36 35 34 34 34 36 38 38 37 39 40 41 41 42 42 42 43 42 41 39 39 40 40 40 43 44 44 45 45 44 44 44 45 45 45 44 43 43 44 44 43 43 44 45 46 45 45 44 42 41 41 40 39 38 38 37 36 35 34 34 34 34 34 33 33 35 36 37 37 37 37 37 37 38 39 39 40 40 40 40 40 41 40 40 39 37 36 36 35 35 36 37 38 38 37 36 36 36 35 34 34 34 34 34 34 33 33 33 33 32 32 33 33 33 32 32 32 32 33 32 32 32 32 31 31 32 33 32 32 31 31 31 30 30 29 29 29 29 29 29 30 30 31 32 31 32 32 32 32 31 32 33 33 34 34 33 33 32 32 33 33 33 33 34 33 33 33 33 33 32 31 30 30 30 30 30 30 30 30 31 33 33 33 32 31 30 29 29 28 28 28 27 27 27 25 24 23 23 23 23 23 23 23 24 26 28 29 30 30 30 28 28 28 29 29 30 30 30 29 27 27 27 26 26 26 26 26 27 29 30 30 30 29 29 30 30 29 28 28 27 26 25 24 24 25 26 27 27 27 28 28 29 29 30 29 28 27 27 26 26 26 26 26 27 28 29 29 30 29 29 29 30 30 30 30 29 29 29 29 30 30 30 30 30 29 29 29 30 30 30 30 31 30 30 30 30 29 29 29 29 30 30 29 29 30 30 30 28 26 27 27 26 27 28 29 30 30 30 30 28 27 26 26 52 52 52 52 51 51 51 50 50 50 50 50 49 49 50 50 50 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 51 51 51 51 49 49 49 49 48 46 45 45 45 45 45 46 46 46 45 45 45 45 46 45 45 45 44 44 44 44 44 44 44 44 45 46 45 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 43 42 43 43 43 44 44 44 44 44 44 43 42 42 43 44 44 44 45 45 45 45 45 44 44 46 46 47 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 46 45 45 46 46 45 44 45 46 46 47 48 48 47 47 49 48 47 46 45 46 46 45 45 44 43 43 43 43 43 43 43 42 42 42 42 42 43 44 44 44 44 43 43 43 43 42 41 41 40 40 40 40 40 40 40 39 38 38 39 39 39 39 37 37 37 37 37 37 37 38 38 38 38 38 38 39 40 40 40 39 38 39 39 40 40 41 41 42 41 41 41 40 40 39 39 39 39 39 40 39 38 37 37 36 36 37 36 36 36 35 35 35 35 35 35 36 36 36 35 35 35 36 36 37 38 38 38 36 35 35 34 34 35 36 37 39 39 38 40 41 41 42 43 43 43 43 42 41 40 40 41 41 41 42 43 45 45 45 45 45 45 45 45 45 43 42 42 43 43 42 42 43 45 45 45 45 44 43 43 43 42 41 40 38 37 37 35 34 34 34 34 33 32 33 35 36 37 37 38 38 38 38 40 40 40 40 41 40 40 40 41 40 40 39 38 37 36 35 35 36 36 37 37 37 36 36 36 35 35 36 36 36 36 36 35 34 33 33 32 31 31 31 31 30 30 30 31 31 30 30 30 31 30 30 30 31 31 31 30 29 29 29 29 29 29 29 29 29 29 30 30 31 32 32 32 31 31 30 31 32 32 33 33 34 33 33 33 33 33 34 33 33 34 33 33 33 34 33 32 31 30 30 30 30 29 29 30 30 30 31 31 32 33 31 30 29 29 28 29 29 29 29 29 27 25 24 23 23 23 23 23 23 24 24 27 30 31 30 29 27 27 27 28 29 30 30 30 29 28 27 27 26 26 26 26 26 27 29 29 30 29 28 28 30 30 30 28 27 26 25 24 24 24 25 26 27 27 28 29 29 30 30 30 29 28 27 27 26 26 26 26 26 27 28 28 28 29 29 29 29 30 30 30 30 29 28 28 29 30 30 30 30 29 28 29 29 29 29 29 29 30 31 31 30 30 30 30 29 30 30 30 30 30 30 30 30 29 28 28 27 26 26 27 28 30 30 29 29 28 27 26 25 51 51 51 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 50 50 49 49 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 51 51 50 49 49 49 49 49 47 46 46 46 46 46 47 47 46 46 46 46 46 46 46 45 45 45 44 44 44 44 45 45 45 46 46 45 45 44 44 44 44 44 44 44 44 44 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 44 43 43 44 44 43 42 42 43 44 44 44 44 44 44 45 44 44 44 45 46 47 48 47 47 47 48 48 49 48 47 46 47 47 47 47 47 47 48 47 46 46 46 46 46 46 45 45 46 47 48 48 48 48 48 48 48 48 47 47 47 46 46 45 44 43 43 43 44 44 43 43 43 43 42 42 42 43 44 44 43 43 43 43 42 42 41 40 40 40 40 40 40 40 39 39 39 39 39 39 39 40 39 37 37 37 37 37 37 37 37 37 37 38 38 39 39 40 40 40 39 38 39 39 40 41 41 42 42 42 41 41 40 39 39 39 40 40 40 41 40 39 39 39 38 38 39 38 37 36 35 35 35 34 34 34 34 34 34 34 34 34 35 35 36 36 37 38 35 34 34 34 36 37 38 38 40 41 39 38 40 41 41 42 43 43 43 42 42 41 40 41 43 42 42 43 45 45 45 45 44 44 44 43 43 43 42 41 42 41 41 41 42 43 44 45 45 44 44 44 43 42 41 41 40 39 38 37 36 35 34 34 33 33 34 35 35 36 38 39 39 39 39 40 41 41 41 41 41 40 40 40 40 40 39 38 37 37 36 35 36 36 37 37 37 37 36 36 36 36 36 37 37 37 36 35 34 34 34 33 32 32 31 31 31 30 30 30 30 30 30 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 32 31 30 31 31 30 30 31 33 33 33 34 34 33 33 33 33 34 33 33 33 34 33 33 34 33 32 31 30 30 30 30 29 29 29 29 29 30 30 31 32 32 31 30 30 30 29 29 30 30 28 28 28 26 24 23 23 23 23 24 24 24 25 28 31 30 28 27 27 27 27 28 29 30 29 28 27 27 26 26 26 26 26 27 27 28 29 29 28 27 28 29 29 29 28 26 25 24 24 23 23 25 26 27 28 29 29 29 29 29 29 29 28 27 26 26 26 26 27 27 27 28 27 27 27 28 29 30 30 30 30 30 28 27 27 29 29 30 29 28 28 28 29 29 29 29 29 29 30 31 32 31 30 30 30 30 30 30 30 30 30 30 30 29 28 29 29 27 26 27 28 28 29 30 29 28 28 28 26 25 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 50 50 50 49 49 48 49 49 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 46 46 45 44 44 44 44 44 45 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 44 43 43 43 43 42 42 42 42 43 43 42 42 41 41 41 41 42 42 43 43 43 43 43 43 43 42 42 44 45 45 45 44 43 44 44 43 44 46 46 47 47 47 46 46 46 47 48 48 47 46 46 47 47 47 47 47 47 48 47 47 46 46 46 47 46 45 45 46 47 47 47 48 49 48 48 48 48 47 48 47 46 46 45 45 44 44 44 44 44 44 43 43 43 42 42 42 44 44 43 43 42 42 42 41 41 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 38 38 39 39 40 40 39 38 38 39 39 40 41 42 43 43 43 42 41 40 40 40 40 40 41 41 42 41 40 40 40 39 39 40 38 37 37 37 38 36 36 36 35 35 34 34 34 34 35 35 34 34 35 36 35 34 34 34 35 38 40 40 40 41 41 40 38 39 41 41 42 43 43 43 43 42 41 41 42 43 43 43 44 44 44 44 44 44 44 43 42 41 41 41 40 40 39 40 40 41 43 44 45 44 43 43 43 43 41 39 40 40 39 38 37 37 36 35 35 34 32 33 34 35 36 38 40 40 40 40 41 41 41 41 41 41 40 39 39 39 39 38 37 37 37 36 35 36 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 34 34 34 33 33 33 32 32 30 31 31 32 32 32 32 31 30 29 29 29 30 31 31 31 31 31 30 29 29 29 29 29 30 30 30 31 32 31 30 30 30 30 30 30 31 32 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 33 32 30 30 30 30 30 30 30 29 29 29 29 29 30 31 32 32 32 31 30 30 30 31 30 28 28 30 28 26 24 23 23 23 23 24 24 24 24 28 30 28 26 25 26 27 27 28 29 28 27 27 27 26 26 26 26 26 27 27 28 29 28 27 26 27 28 28 28 27 26 25 24 24 25 25 26 27 27 28 28 28 28 28 28 29 29 28 27 26 26 26 26 27 27 27 27 26 26 26 27 28 29 30 30 30 29 28 27 27 28 28 28 28 27 27 29 29 29 30 30 30 30 30 31 32 32 31 30 30 30 31 31 30 30 30 30 30 28 28 28 27 26 26 28 29 27 28 30 30 28 28 28 27 26 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 44 44 45 45 45 45 46 47 47 46 45 45 45 45 45 46 45 45 45 45 46 45 44 44 44 44 44 43 43 42 43 45 45 44 43 42 41 41 41 41 41 41 42 42 42 42 42 42 42 42 43 44 45 45 44 43 43 43 43 44 45 46 46 46 46 45 45 46 47 47 47 47 45 45 46 47 47 47 47 47 48 47 47 47 47 47 47 46 46 46 46 46 46 47 48 48 48 48 49 48 48 48 48 47 46 46 46 45 44 45 45 45 44 43 43 43 43 43 43 44 44 43 43 42 42 41 41 41 40 40 39 39 39 39 39 39 39 39 39 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 38 38 38 39 39 39 39 38 38 38 39 40 40 41 42 43 43 42 41 41 40 40 40 41 41 41 42 42 42 41 40 40 40 39 39 38 38 39 40 39 36 37 38 37 36 36 36 35 35 36 36 35 34 34 35 34 34 34 35 37 39 41 41 41 41 42 42 40 40 41 41 42 43 43 44 44 43 42 42 42 43 43 43 43 43 43 43 43 43 43 42 42 41 40 40 39 38 39 40 41 42 43 44 44 43 42 42 42 41 40 39 38 39 38 37 37 37 36 34 34 34 32 32 34 35 36 38 40 40 40 40 41 41 40 40 40 40 40 39 38 38 39 38 37 37 37 35 35 36 37 37 37 36 36 37 37 37 36 36 36 36 35 35 35 35 34 34 33 33 33 32 32 31 31 32 33 33 34 33 33 32 30 30 30 31 31 31 31 31 31 31 30 29 29 29 29 29 29 29 30 30 32 32 30 29 29 30 30 30 30 31 33 33 33 33 34 33 33 33 33 34 34 34 34 33 32 32 31 30 30 30 30 30 30 30 30 30 29 29 29 29 29 30 31 32 32 30 30 31 32 30 29 29 30 29 28 26 24 23 23 23 23 23 23 24 25 28 28 25 24 25 26 27 28 28 27 27 27 27 26 26 26 25 26 26 26 28 29 27 26 26 27 27 27 27 27 26 24 23 24 25 26 27 27 27 27 26 26 27 27 28 29 29 28 27 26 26 26 26 27 27 27 27 26 26 26 27 28 29 29 30 30 29 28 27 27 27 27 27 27 27 28 29 27 28 30 30 30 30 30 31 31 32 31 31 31 31 32 32 30 30 30 30 30 29 29 28 27 26 26 28 27 27 28 30 29 28 27 28 27 25 50 51 51 52 51 52 52 52 52 53 52 52 53 53 52 51 50 49 49 49 49 48 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 46 47 47 46 45 45 45 46 46 46 46 45 45 46 45 44 44 45 45 45 45 44 43 44 45 45 45 44 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 43 44 44 42 43 43 43 44 45 45 45 46 45 45 45 46 47 47 46 46 44 45 46 47 47 46 46 47 47 48 48 48 47 47 47 47 46 46 46 46 47 48 48 48 49 49 49 48 48 49 49 48 47 47 46 46 46 46 46 45 44 44 43 43 44 44 43 44 44 43 43 43 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 38 38 39 39 39 38 38 38 39 40 40 40 41 41 42 42 41 41 41 40 41 41 42 42 42 42 42 42 41 41 40 39 38 38 38 39 40 39 38 37 37 39 38 37 37 36 35 36 36 36 36 34 34 34 34 35 37 38 38 39 40 41 42 42 43 43 42 41 42 42 42 43 44 44 44 43 43 42 43 43 43 43 42 42 42 41 42 43 43 42 41 40 39 38 38 39 40 41 42 43 44 44 43 43 41 41 41 39 39 39 38 37 37 36 36 37 36 34 34 34 33 32 33 35 36 39 40 40 39 40 41 40 40 39 39 40 40 39 38 38 39 39 37 37 37 35 34 35 36 37 37 36 37 38 38 38 38 38 37 37 36 35 34 34 34 33 33 33 34 33 33 32 32 33 33 34 33 33 32 30 30 30 31 32 31 30 30 30 30 30 29 29 29 29 29 29 29 29 31 31 32 32 31 29 29 29 29 30 31 32 33 33 33 34 34 33 33 33 33 33 34 34 34 33 31 30 30 31 31 31 30 30 30 30 30 30 30 30 29 29 29 29 29 31 32 31 31 32 33 32 31 31 31 29 29 28 27 25 24 23 23 23 23 24 24 25 26 25 24 25 26 27 27 27 27 27 27 27 26 26 26 25 25 26 27 28 28 27 26 26 27 27 26 26 27 25 24 23 23 24 25 26 26 26 26 26 26 27 27 28 29 29 28 27 27 26 26 27 27 27 27 27 26 26 27 27 27 28 29 29 29 28 27 28 28 28 27 26 26 27 28 27 26 28 29 30 30 30 30 30 31 32 32 32 32 33 33 33 32 32 32 30 30 29 28 28 27 25 25 26 26 27 28 29 29 27 27 27 27 26 52 52 53 53 53 53 53 53 54 54 53 53 53 53 52 51 51 50 50 50 50 49 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 47 47 46 46 45 45 46 46 46 46 46 46 46 45 45 45 45 46 46 45 44 43 45 46 46 46 44 44 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 42 42 42 43 45 45 45 45 45 44 45 46 47 47 46 45 44 44 46 47 47 47 46 46 47 47 47 48 48 48 47 48 47 47 47 47 48 48 48 48 49 49 49 49 49 48 49 49 49 48 47 47 47 47 46 46 46 46 45 44 44 44 44 44 44 43 43 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 38 38 39 39 38 38 38 38 38 39 40 40 41 41 42 42 41 41 41 41 42 42 42 42 43 43 43 42 41 40 40 38 38 39 40 40 40 39 38 38 38 38 38 37 36 35 36 36 37 37 36 36 35 34 35 37 39 39 39 39 40 41 42 43 44 44 43 43 43 43 44 44 44 44 44 44 43 43 43 43 42 42 41 41 41 40 41 42 42 41 40 39 38 37 39 40 41 41 41 42 43 43 43 42 41 40 40 39 38 38 38 37 36 35 35 36 36 35 34 34 33 32 33 35 37 39 40 39 38 39 40 39 38 38 39 39 39 39 38 37 38 39 38 37 37 35 34 35 36 36 36 36 37 38 38 39 40 39 38 37 37 36 35 34 34 34 34 35 35 34 34 34 34 34 33 32 32 31 30 30 31 32 32 33 33 32 32 31 30 30 29 29 29 30 30 29 29 29 31 32 32 32 31 29 29 29 29 30 31 33 33 33 33 34 34 34 33 33 33 33 34 34 34 33 32 31 31 32 31 30 30 30 30 30 30 30 31 30 30 31 32 30 29 31 31 31 32 33 34 33 33 32 31 30 28 27 29 29 26 24 23 23 23 23 24 24 24 24 25 26 26 25 26 25 25 26 27 27 27 26 25 24 24 26 27 28 28 26 25 25 26 26 25 25 25 25 24 23 24 25 24 24 26 26 27 27 28 28 29 29 29 28 29 28 27 26 26 27 27 27 27 27 26 26 27 27 27 27 27 27 27 27 27 29 29 28 27 26 26 27 26 26 26 27 29 29 29 29 30 30 31 31 31 32 32 32 32 32 33 32 32 31 30 29 28 27 27 26 24 24 25 26 27 28 28 26 26 27 28 28 53 53 54 54 54 54 54 54 54 54 53 53 53 52 52 51 51 50 51 52 51 50 50 49 49 48 48 48 48 48 48 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 45 46 46 45 45 46 46 46 46 47 46 46 47 47 47 46 46 45 46 47 47 46 46 46 46 46 46 45 46 46 45 44 43 44 45 46 46 45 44 44 45 44 44 43 43 43 43 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 43 43 44 45 45 44 44 45 46 47 47 46 44 43 44 46 47 47 46 45 45 46 47 47 47 47 47 47 48 48 48 48 48 49 49 49 49 49 49 48 48 48 48 49 50 49 49 48 48 49 49 48 48 47 47 46 45 44 44 44 44 44 43 43 42 42 42 42 42 42 41 41 41 41 41 41 40 41 41 40 40 39 39 39 40 40 39 38 37 37 37 36 36 36 37 37 37 37 38 39 38 38 38 38 38 38 39 40 40 40 40 41 41 40 41 41 41 42 42 42 42 42 42 42 41 41 40 39 39 39 40 41 41 41 40 39 39 38 38 38 37 36 36 37 37 37 38 37 37 35 34 35 38 39 39 39 40 40 41 42 43 43 43 43 44 43 43 43 43 43 44 44 44 44 44 44 43 42 41 41 40 39 40 41 42 41 40 39 38 37 37 39 40 39 40 41 43 43 43 42 41 40 39 40 39 37 37 38 37 35 34 34 35 35 35 34 33 32 32 33 36 38 40 39 38 38 38 39 39 38 38 38 39 39 39 38 37 38 39 39 38 37 36 35 34 35 35 35 36 36 37 37 39 39 40 39 38 38 37 36 36 35 35 36 35 35 34 34 34 33 33 31 31 31 31 31 30 31 33 33 34 34 33 33 32 30 30 30 31 31 30 30 29 29 29 30 31 32 32 30 29 29 30 30 30 30 32 33 32 33 34 34 34 34 34 33 33 34 34 34 34 33 32 31 31 30 30 30 30 30 30 31 32 32 32 32 33 33 31 29 29 29 29 31 32 33 33 34 33 32 30 29 28 29 30 28 26 24 23 23 23 23 24 24 24 24 26 25 24 24 24 24 26 27 27 26 25 24 24 25 26 27 28 27 26 25 24 25 25 24 24 24 24 23 23 24 26 26 25 26 27 28 28 28 29 29 29 28 27 28 27 27 26 26 26 27 27 27 26 26 26 27 27 27 27 27 27 27 26 27 28 28 27 27 26 26 27 26 26 27 27 27 28 28 29 30 31 30 30 31 32 32 31 31 31 32 32 31 30 30 29 28 28 27 27 26 24 24 26 27 27 26 24 25 27 28 28 54 55 55 55 54 54 55 54 54 53 53 52 52 51 52 52 51 51 52 52 51 50 50 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 45 46 46 47 46 45 46 47 47 47 47 47 46 47 47 47 47 46 46 46 47 47 46 46 46 46 46 46 46 46 46 45 44 44 44 45 46 45 45 44 45 45 45 44 43 44 45 44 43 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 43 43 44 44 45 46 45 44 43 44 46 47 47 46 45 44 46 47 47 46 46 46 48 48 49 49 49 49 48 48 48 48 48 49 48 47 48 49 50 50 49 48 48 48 48 49 49 49 48 48 47 46 45 44 44 44 43 43 43 43 43 42 42 43 43 42 41 41 41 41 40 40 40 40 40 40 39 38 39 39 39 39 38 37 37 36 36 36 36 37 37 37 37 37 38 38 38 38 38 38 39 40 39 39 39 40 40 40 40 40 41 41 41 42 41 41 42 42 42 41 41 40 40 40 40 41 42 42 41 40 39 39 39 38 37 37 37 38 38 37 37 38 37 35 34 34 35 38 39 40 40 39 40 41 42 42 42 42 43 43 42 42 42 42 42 43 44 44 43 43 43 43 43 42 41 39 38 39 40 41 41 40 38 37 36 37 38 39 40 41 42 43 43 42 41 40 39 38 39 38 37 37 37 37 36 35 34 34 34 34 34 33 32 32 34 36 38 40 39 38 38 37 39 39 38 37 37 38 38 38 37 37 38 39 40 39 38 37 36 34 33 34 35 36 36 36 37 38 39 39 39 39 38 37 37 37 36 36 36 35 34 34 33 33 32 32 32 32 33 33 33 32 32 33 34 34 34 34 33 32 30 30 30 31 31 30 30 29 29 29 29 31 32 31 30 29 29 30 30 30 31 32 32 32 32 33 33 33 33 33 33 33 34 34 33 33 33 32 31 31 30 30 30 30 30 31 32 33 33 33 34 34 33 31 30 30 29 29 30 31 32 33 34 34 33 32 30 30 30 30 29 28 27 24 23 23 23 23 24 24 24 24 24 24 24 24 24 26 26 26 25 24 24 24 25 27 27 27 27 27 26 24 24 25 25 24 23 23 23 24 25 26 27 27 27 27 27 27 27 28 28 27 27 27 27 27 26 25 25 26 27 26 26 26 26 26 26 27 27 27 27 27 26 26 27 27 27 27 26 25 25 26 26 27 27 27 27 27 28 30 31 31 30 30 30 31 31 30 30 30 31 32 31 30 30 29 29 29 29 28 27 26 25 25 25 25 25 24 26 27 28 29 55 55 55 55 55 55 55 54 53 52 52 52 52 53 53 53 53 52 52 51 50 50 50 49 49 49 50 50 49 49 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 46 46 45 46 47 47 48 48 48 47 47 48 47 47 46 46 46 47 47 47 47 47 47 47 47 47 46 46 45 44 44 45 46 45 45 45 45 45 45 44 43 43 44 44 44 43 43 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 43 44 45 44 43 42 43 45 46 46 45 44 44 45 47 47 46 45 46 47 48 49 49 49 48 48 47 48 48 48 48 47 47 48 49 50 49 48 47 47 47 48 48 47 47 48 49 48 47 46 45 44 44 43 43 44 44 43 43 43 44 44 43 42 42 41 41 41 40 40 40 40 39 39 39 39 38 38 38 38 38 37 36 36 36 36 36 36 36 36 37 37 37 37 38 38 39 39 39 39 39 39 39 39 39 40 40 41 41 41 41 41 41 41 41 42 42 41 40 40 40 41 42 42 42 41 40 40 40 39 38 37 37 38 39 39 39 38 36 35 34 34 34 35 37 39 40 40 39 39 41 41 41 41 41 42 42 42 41 41 41 42 43 44 43 43 42 42 42 43 42 40 39 38 37 39 40 40 39 37 36 36 37 38 40 41 42 42 42 41 41 41 40 39 38 38 37 36 36 36 37 37 35 34 33 32 33 33 32 31 32 35 36 38 39 39 38 37 37 38 38 37 36 37 38 37 36 36 37 38 39 39 39 39 38 37 35 33 33 35 36 36 36 37 38 38 39 39 38 37 37 37 37 37 37 37 36 34 34 33 33 32 33 33 34 33 33 33 33 33 33 33 34 34 34 33 33 32 31 31 31 30 30 30 29 29 29 29 30 31 30 29 29 29 30 30 31 31 31 31 31 32 32 33 33 33 33 34 34 34 34 33 33 32 32 32 32 31 30 30 30 30 31 33 33 33 34 34 34 34 32 32 31 29 29 29 31 31 32 32 33 33 33 32 30 30 29 28 29 29 27 24 23 23 23 23 24 24 24 24 24 24 24 25 26 25 24 24 24 24 24 25 27 27 26 25 25 26 25 24 24 25 24 23 23 24 24 26 26 25 26 26 27 26 26 26 26 27 27 27 27 27 27 26 25 25 26 26 26 26 26 26 26 26 27 27 27 27 27 26 26 26 26 26 27 26 25 24 25 26 27 27 27 27 28 29 29 29 30 30 30 30 31 31 30 30 31 32 32 31 30 30 29 29 30 30 29 28 27 26 24 24 23 24 26 27 28 28 28 55 56 56 55 55 54 54 53 53 52 53 54 54 54 54 54 53 52 52 51 50 50 49 49 49 50 51 50 50 50 49 49 49 48 48 49 49 49 48 48 48 48 48 47 47 47 47 47 47 47 47 47 46 46 46 47 47 46 46 47 47 47 47 46 45 45 46 47 48 48 49 48 48 48 48 47 47 46 46 47 48 48 47 47 47 48 47 47 47 47 46 45 45 45 46 46 45 45 45 45 45 44 44 43 43 44 44 44 44 44 43 44 44 43 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 43 44 42 42 43 44 45 44 43 43 44 45 46 46 45 44 45 46 47 48 49 49 48 47 47 47 47 47 47 46 46 47 48 48 48 47 46 46 47 48 47 46 46 48 49 49 47 46 45 44 44 44 44 44 44 44 44 44 45 44 43 43 42 41 41 41 41 40 40 40 40 40 40 39 38 38 38 38 38 38 37 36 36 36 36 36 36 36 36 37 37 37 38 39 39 38 38 38 39 39 39 39 39 40 41 41 41 41 41 41 40 40 41 41 42 41 41 41 41 42 43 42 42 41 40 40 40 39 37 37 38 39 40 39 39 38 37 35 35 34 34 34 36 38 40 40 38 38 40 41 41 40 41 41 41 40 40 41 42 42 43 43 43 42 41 41 41 42 42 40 39 38 37 38 39 39 38 37 36 36 38 39 40 41 42 42 41 40 40 40 40 39 37 37 36 35 35 36 37 37 36 35 33 32 32 32 31 31 33 35 36 36 38 40 39 38 37 37 37 36 35 36 37 36 35 36 38 38 38 38 38 38 38 37 36 34 33 35 36 36 37 37 37 37 38 39 38 37 37 37 37 37 37 37 36 34 34 34 33 33 33 33 34 34 33 33 33 32 32 33 33 33 33 34 34 34 33 32 31 30 30 30 29 29 29 29 29 29 29 29 29 30 30 31 31 30 30 30 31 32 32 32 33 33 33 34 34 34 34 34 33 32 32 31 31 30 31 31 32 32 32 31 32 33 35 35 34 34 33 33 31 29 29 29 30 30 31 32 32 33 33 32 30 30 29 28 28 28 27 26 25 24 23 23 23 24 24 24 24 24 24 25 26 26 25 24 24 24 24 26 27 27 25 24 24 25 25 24 23 23 24 23 23 23 23 24 24 23 24 25 26 25 25 25 25 25 25 26 26 26 26 25 25 25 25 26 26 26 27 27 27 27 27 27 27 27 27 26 26 25 25 25 25 25 24 24 25 26 27 26 26 27 28 29 29 28 28 29 29 29 30 30 30 30 30 31 31 30 30 30 28 28 28 28 29 28 27 26 25 24 23 24 26 28 27 27 27 56 57 56 55 54 54 53 53 53 53 54 54 54 54 53 53 52 52 51 51 50 50 50 49 50 51 52 51 51 51 50 50 49 48 49 50 50 49 49 49 49 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 48 47 47 47 46 46 46 47 48 49 49 48 48 48 48 48 47 46 46 47 48 49 48 48 48 48 48 48 48 47 46 45 46 46 46 46 46 46 46 46 45 45 44 43 43 44 45 45 44 44 44 44 44 43 42 41 42 41 41 41 41 41 41 41 40 40 40 41 41 41 41 41 41 41 42 42 42 43 44 44 43 43 43 44 45 45 45 44 44 44 45 46 47 47 48 49 48 47 46 46 46 46 46 46 47 47 48 48 47 45 45 46 47 46 46 46 47 48 48 47 46 45 45 45 44 44 45 45 45 45 45 45 44 43 42 41 41 41 40 40 40 40 40 40 41 40 40 39 39 38 37 37 38 37 37 36 36 36 36 36 36 36 36 37 37 39 40 39 38 38 38 38 38 38 38 39 40 41 41 41 41 41 40 40 40 41 41 42 42 42 41 42 43 42 42 42 41 40 40 39 38 37 38 39 39 40 39 38 38 38 37 36 36 34 34 34 37 40 39 37 38 40 41 41 40 40 41 40 40 41 41 42 42 42 42 43 42 41 40 41 41 42 41 39 38 37 37 38 37 37 36 36 37 38 39 39 40 41 42 42 40 40 39 39 39 36 36 36 35 34 35 36 36 36 35 35 34 32 31 32 33 33 34 35 36 38 39 40 38 37 36 36 36 35 35 35 35 36 37 38 38 37 36 37 37 37 36 35 33 32 34 35 36 37 37 36 36 38 39 38 37 36 36 37 37 37 36 36 35 34 34 34 34 34 34 34 34 33 33 33 33 33 33 32 32 33 33 33 33 33 33 32 30 30 30 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 31 31 31 32 32 33 33 34 34 34 34 33 33 33 32 31 30 30 31 33 33 33 33 31 32 34 36 36 34 34 33 32 30 30 29 29 30 31 31 32 33 33 33 31 30 30 29 28 26 26 26 25 25 25 24 23 23 23 24 23 23 23 24 25 26 26 25 24 24 24 25 26 27 26 24 23 23 24 24 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 25 25 25 24 24 25 25 26 26 27 27 27 27 27 27 27 27 27 27 27 27 26 25 24 24 24 24 24 24 25 27 26 26 26 27 27 28 28 27 27 27 28 29 29 30 29 29 30 29 29 30 30 30 29 28 28 27 27 27 27 27 26 24 23 24 26 27 27 26 26 57 57 56 55 54 54 55 55 55 55 55 54 53 53 52 52 52 51 51 51 50 51 51 50 51 52 53 52 52 51 51 50 49 49 50 51 51 50 49 49 49 48 48 48 48 48 48 48 49 48 48 48 47 47 47 47 47 47 47 48 49 48 48 47 46 46 46 47 48 49 49 48 48 49 49 48 47 46 47 48 48 49 49 48 48 48 48 48 48 47 46 46 47 47 47 47 46 46 46 46 46 45 44 43 43 44 45 45 45 44 44 44 43 43 42 43 43 43 43 42 41 41 41 40 40 40 40 40 40 41 41 40 40 40 41 41 41 43 44 43 42 42 42 43 44 44 44 44 44 44 44 46 47 46 47 48 48 47 45 45 45 46 46 46 47 46 47 48 47 45 44 45 46 45 45 46 47 48 47 47 46 46 45 45 44 44 44 44 45 46 45 44 44 43 42 41 41 41 40 40 40 39 39 40 40 40 40 40 39 38 37 37 37 38 38 37 36 36 36 36 37 37 36 36 37 39 39 38 38 39 38 38 38 38 39 39 40 40 40 40 40 40 40 39 40 41 41 42 42 42 42 42 43 42 42 42 41 40 40 39 39 39 39 40 40 40 39 38 37 37 37 37 37 36 34 34 35 38 37 37 38 40 41 40 39 39 40 39 40 40 40 42 42 41 42 43 42 41 40 40 40 41 41 39 38 37 37 37 37 36 35 35 37 38 39 40 40 41 42 41 39 38 38 38 38 37 36 36 35 34 35 35 35 34 33 33 33 32 32 34 35 34 34 35 37 38 38 38 38 37 36 35 35 34 35 35 36 37 38 38 37 36 36 36 37 37 36 34 33 32 33 34 36 36 35 35 36 37 38 37 37 36 35 36 37 37 36 36 36 35 35 35 34 34 34 34 34 33 33 34 34 33 33 32 31 31 31 31 31 32 33 32 30 30 30 30 30 29 29 29 29 29 29 29 30 30 29 29 29 30 30 30 30 31 32 32 32 33 33 33 34 34 33 33 33 32 31 30 31 32 33 33 33 34 33 33 35 36 36 34 34 33 31 30 30 29 29 30 31 32 32 33 33 33 33 31 30 29 28 27 27 27 25 25 25 24 23 23 23 23 23 23 23 23 24 25 24 24 24 24 25 26 27 26 25 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 25 25 24 24 24 24 25 26 26 27 28 29 29 28 27 28 28 29 29 28 28 28 27 27 26 25 24 24 24 24 24 25 26 26 25 26 27 27 26 26 27 27 27 27 28 29 30 29 29 29 28 28 30 30 30 29 29 28 28 28 27 27 27 26 25 24 24 26 27 26 25 26 57 56 56 55 55 55 56 56 55 55 54 54 53 53 52 51 51 51 51 52 52 52 51 51 52 53 53 52 52 52 51 50 49 50 51 53 53 51 50 49 49 48 48 48 48 48 48 48 49 49 48 48 48 48 48 49 49 49 48 48 49 49 48 47 47 46 46 48 49 50 49 48 49 50 49 49 47 47 47 48 48 49 49 48 47 47 48 48 48 47 47 47 47 47 47 47 47 46 46 46 46 45 44 43 43 44 45 45 45 44 44 44 44 44 43 44 44 44 44 43 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 42 42 42 42 42 42 42 43 43 43 43 43 43 44 46 46 46 46 47 47 47 46 45 45 46 46 46 46 46 47 47 47 45 44 45 45 44 45 45 46 47 47 47 46 46 45 44 44 43 43 44 44 45 45 44 43 43 42 41 41 41 41 41 40 40 39 39 40 40 40 40 39 38 38 37 37 37 38 38 37 37 36 36 37 37 36 36 37 37 37 38 39 39 38 38 38 39 39 40 40 40 40 40 40 40 39 39 40 41 41 42 42 42 42 42 42 42 42 42 41 40 40 40 40 40 40 41 41 41 40 39 37 37 37 36 36 36 35 34 34 35 35 37 39 40 40 39 38 39 38 39 40 40 41 41 41 40 42 43 42 41 40 39 39 41 41 40 38 37 36 36 36 35 35 37 38 39 40 41 41 41 42 41 39 38 37 37 37 37 36 36 35 34 34 34 34 33 31 31 31 32 34 36 36 35 35 35 36 38 37 37 38 38 36 35 34 34 34 36 37 37 37 37 36 35 35 36 37 37 35 34 33 32 32 34 35 35 34 34 35 36 37 37 37 35 34 35 36 36 36 35 35 35 35 34 33 33 33 33 33 33 34 34 34 33 33 33 32 32 31 30 30 31 32 32 32 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 32 32 32 33 33 33 33 34 34 34 33 33 33 31 31 33 33 33 33 33 34 34 34 35 36 35 34 33 32 32 30 29 28 29 31 31 32 32 32 33 33 33 32 31 30 29 28 29 29 27 25 25 24 24 25 24 23 23 24 24 23 23 23 24 24 24 25 26 26 26 25 24 23 23 24 24 23 23 24 24 26 26 26 26 25 25 25 25 24 25 25 25 26 26 27 26 26 26 25 25 26 26 26 27 27 28 29 30 29 28 29 29 30 29 28 28 27 27 27 27 26 26 25 24 24 24 24 25 25 25 26 27 27 26 26 27 27 27 27 28 29 30 30 29 28 27 28 30 30 30 30 29 29 29 29 28 27 26 25 25 24 24 25 26 26 25 25 57 56 56 55 55 56 56 56 55 55 54 53 52 52 52 52 52 53 54 54 53 52 51 52 53 53 53 52 52 51 51 50 50 50 52 53 52 51 50 50 49 48 48 48 48 48 49 49 49 48 48 48 48 49 49 50 51 51 49 49 49 49 49 48 47 46 47 48 49 50 50 49 49 50 49 49 48 47 47 48 49 49 48 48 47 46 46 47 47 47 47 47 47 46 46 46 46 46 45 46 46 45 44 43 44 44 45 45 46 45 44 44 45 45 45 45 45 45 44 43 42 42 43 42 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 43 43 43 42 43 44 46 46 45 45 45 46 48 47 45 45 45 45 46 46 46 46 46 46 45 44 44 44 44 44 45 46 46 47 48 47 45 44 44 43 43 43 43 44 44 44 44 43 42 42 41 41 41 41 40 40 40 39 38 39 40 40 40 39 38 38 37 37 37 37 37 37 38 37 36 36 36 36 36 36 37 37 37 38 38 38 38 38 39 39 39 40 40 39 39 40 39 39 38 40 41 41 41 41 41 41 41 42 42 42 42 41 41 41 41 40 40 40 41 41 40 40 40 38 38 37 37 36 36 38 36 34 34 35 38 38 39 40 38 39 39 37 39 41 41 41 40 40 41 42 43 42 41 40 39 39 40 41 40 39 37 36 35 35 34 36 38 39 40 40 40 40 41 41 40 40 38 37 37 37 37 36 36 35 34 33 34 34 32 31 30 32 34 37 38 37 36 36 37 37 37 36 36 37 37 36 34 33 33 34 35 36 36 37 37 35 34 35 35 36 37 36 34 34 32 31 33 33 33 33 35 36 36 37 37 37 35 34 34 34 35 36 35 34 34 34 33 33 33 32 32 32 33 33 34 34 34 34 34 33 33 33 31 30 30 31 32 32 32 31 30 30 29 29 29 29 29 29 29 29 29 29 29 30 31 31 32 32 33 34 34 33 33 33 33 34 34 34 33 33 32 32 32 33 33 33 33 34 34 34 34 35 36 35 34 33 31 30 30 29 28 28 30 31 30 31 32 33 33 33 32 31 30 30 29 29 28 27 27 26 25 26 27 26 24 24 23 23 23 23 23 23 24 26 26 26 26 25 24 23 23 24 26 26 25 25 25 25 27 27 27 27 26 26 26 25 25 26 27 27 27 26 26 26 26 27 26 26 26 27 27 27 27 28 29 30 29 29 30 30 30 29 28 27 27 27 27 27 27 26 26 25 24 24 24 24 24 24 26 26 25 25 26 27 27 27 27 28 29 30 30 30 28 27 29 30 30 30 30 30 30 30 29 29 27 25 25 25 26 25 24 26 26 24 24 57 56 56 55 56 56 56 55 55 54 54 53 53 53 53 54 54 55 56 55 53 52 52 53 54 54 53 52 52 52 51 50 50 50 52 53 52 51 51 50 49 48 49 48 48 48 50 50 49 48 49 49 49 50 50 51 52 52 50 50 50 49 49 48 47 46 47 48 49 50 50 49 49 49 49 48 48 48 48 48 49 48 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 44 44 44 45 45 46 46 45 45 45 45 45 45 46 46 45 44 44 43 43 45 44 43 43 42 42 41 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 42 42 41 42 44 45 45 44 44 45 46 47 46 45 45 45 44 45 45 45 46 46 46 45 44 43 43 44 45 45 45 46 47 47 46 45 44 43 43 43 43 43 43 43 44 43 43 42 41 41 41 40 40 40 40 39 39 38 38 39 39 39 38 38 38 38 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 37 38 38 37 38 38 39 39 38 39 39 39 39 40 39 38 38 39 40 41 41 41 40 40 41 42 42 42 42 42 42 42 41 40 40 41 40 40 40 40 39 39 38 38 39 39 38 38 37 35 34 34 36 37 39 39 37 37 37 37 40 41 41 39 39 40 42 42 43 42 41 40 40 38 38 39 39 38 36 35 34 34 34 36 38 39 40 40 39 39 40 39 38 39 39 36 36 36 37 35 35 36 34 33 33 33 32 30 32 35 36 38 38 38 38 38 37 37 36 35 35 35 36 36 34 33 32 33 35 35 36 36 36 34 33 33 34 36 37 36 35 34 32 30 31 33 33 33 34 36 36 37 37 37 35 33 33 33 34 35 35 35 35 34 34 33 33 33 33 32 32 33 33 34 34 34 34 34 34 34 33 32 32 31 31 31 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 31 32 33 34 34 34 34 34 34 34 33 33 32 32 33 33 33 33 34 34 35 35 35 34 34 35 34 34 33 31 30 30 30 29 28 29 31 31 32 33 33 33 32 30 30 30 30 29 28 27 26 26 25 24 27 29 27 24 23 23 23 23 23 23 24 26 27 26 25 25 24 23 23 24 25 27 27 27 27 27 27 27 27 28 27 27 27 26 25 25 27 27 28 27 26 26 26 27 27 26 26 26 27 28 27 28 29 29 30 30 30 30 29 29 29 28 27 27 26 26 26 26 26 26 25 25 24 24 24 24 24 25 26 24 24 25 26 27 27 27 28 29 29 29 28 27 27 29 30 30 31 31 31 30 30 30 30 28 27 27 28 28 26 23 24 24 23 23 57 57 56 56 57 57 56 55 54 54 53 53 55 55 55 55 55 55 55 55 53 53 54 55 55 54 53 52 52 52 52 51 50 50 51 52 52 52 51 50 49 49 49 48 48 49 50 50 49 49 49 50 50 50 51 52 52 52 51 50 50 49 48 48 47 47 47 48 49 50 50 50 50 50 49 49 49 48 48 48 48 48 47 46 46 46 47 46 45 45 46 45 45 45 45 46 46 46 45 45 45 45 44 44 44 45 46 46 46 46 46 45 45 46 46 46 46 45 44 44 44 45 46 45 44 44 44 43 42 41 41 40 40 40 40 40 40 41 40 40 40 40 40 41 41 42 42 41 41 42 43 45 45 44 44 45 45 46 46 45 44 44 44 45 45 45 45 46 46 44 44 43 43 44 45 46 45 45 47 46 45 44 44 43 43 43 42 42 43 43 44 43 43 42 42 41 41 41 41 40 40 39 39 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 37 37 37 38 38 38 38 38 39 38 38 39 39 38 38 38 40 40 40 40 40 40 40 41 42 42 41 41 42 42 42 41 41 41 40 40 40 39 39 38 38 39 40 40 40 39 38 38 36 34 34 34 35 39 40 36 35 35 38 40 40 39 38 39 40 41 42 42 42 41 40 40 38 37 37 38 38 37 34 34 34 35 37 38 38 39 39 38 38 38 38 37 39 39 36 35 35 36 36 35 35 34 33 33 32 31 30 34 36 35 36 37 39 40 39 38 37 36 35 35 34 35 35 34 33 32 33 34 34 35 35 34 33 33 33 35 36 37 36 34 33 32 31 30 31 31 32 34 35 36 37 37 37 35 33 33 32 33 34 34 35 35 34 34 34 33 33 34 33 32 32 33 33 33 34 34 34 34 34 34 34 34 32 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 33 34 34 35 34 34 34 33 32 32 33 33 33 34 34 34 35 36 36 35 34 34 34 34 33 32 30 30 30 30 29 28 30 33 33 33 33 33 33 31 30 30 29 28 28 27 26 26 26 26 26 28 29 27 25 23 23 23 23 23 23 25 26 27 26 25 24 24 23 23 24 26 27 27 28 28 29 29 28 29 29 28 28 27 26 25 26 27 28 28 27 26 26 27 27 27 27 27 27 27 29 29 29 30 30 30 30 29 29 28 28 28 28 27 27 26 25 25 25 25 24 24 24 24 24 24 24 24 24 25 24 24 24 25 27 27 27 27 27 27 26 25 26 27 28 30 31 31 30 30 30 29 29 30 29 28 29 29 28 26 25 24 23 23 22 57 57 57 57 58 57 56 55 54 54 55 55 57 56 55 56 56 55 54 54 54 54 55 56 55 53 53 52 52 52 52 51 51 51 52 52 52 52 51 51 50 50 49 48 48 50 52 51 50 50 50 51 52 51 51 52 52 51 50 50 49 48 48 48 47 47 48 48 48 49 51 52 51 50 50 49 49 49 48 48 49 50 48 47 46 45 46 46 45 45 45 45 44 44 45 46 46 46 46 46 45 45 45 44 45 46 46 47 46 46 46 46 46 46 46 46 46 45 45 45 44 44 45 46 45 45 44 43 42 43 42 41 41 40 40 40 40 41 40 40 40 40 40 41 41 41 41 41 41 42 43 44 44 43 44 44 45 46 46 45 44 44 44 44 44 45 45 45 45 44 43 43 43 44 45 45 45 45 46 46 45 45 44 43 43 43 42 42 42 42 43 43 43 43 43 42 41 42 42 41 40 40 40 39 38 38 38 38 38 38 38 37 37 37 37 37 38 38 38 38 38 38 38 38 37 37 37 36 36 36 37 37 38 38 38 38 39 38 38 38 38 38 38 39 40 40 40 40 40 40 40 41 42 42 41 41 41 41 41 41 40 40 40 40 40 39 38 37 38 40 40 40 40 40 39 39 37 35 34 34 35 38 40 36 34 36 39 40 39 37 38 39 39 40 41 42 43 42 40 40 39 38 37 37 37 37 35 33 34 35 36 37 37 38 37 37 37 36 36 38 39 38 37 35 35 36 36 34 35 35 34 33 31 30 30 32 34 34 35 37 39 40 39 39 38 36 35 34 33 34 34 34 32 32 33 34 34 34 34 33 33 34 35 36 36 37 35 34 33 32 30 30 30 30 32 34 34 35 36 36 36 35 34 33 32 32 33 33 34 35 35 35 35 34 34 34 33 33 32 32 32 32 33 34 34 34 34 33 33 33 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 33 33 34 34 35 34 34 34 33 32 33 33 33 34 34 35 35 36 36 36 36 34 34 34 34 33 31 30 30 30 29 29 27 29 32 32 33 33 33 33 31 30 30 29 28 27 27 27 28 28 27 27 28 27 26 24 23 23 23 23 23 23 24 26 27 27 26 24 23 23 23 25 27 27 27 27 28 29 30 30 30 29 28 27 26 26 26 27 29 29 28 26 26 27 27 28 27 27 27 27 27 28 29 30 30 30 30 30 29 27 27 27 27 27 27 27 26 24 24 24 24 24 24 24 24 24 24 23 23 24 24 24 24 25 26 27 27 27 27 26 26 25 26 27 28 29 30 31 31 30 30 30 29 29 29 29 30 30 30 29 28 27 26 24 24 23 58 58 58 58 58 57 56 55 54 55 56 56 57 56 56 57 56 54 54 54 55 55 55 55 54 53 52 52 52 52 51 51 51 53 54 53 52 52 52 51 51 50 49 48 49 50 52 52 51 51 51 53 53 52 52 52 51 51 50 49 48 48 48 48 47 47 48 49 49 50 52 53 51 51 50 49 49 50 49 49 49 50 49 47 46 46 46 46 45 44 44 44 44 44 44 45 46 46 46 46 46 46 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 46 45 44 45 45 45 44 43 43 44 44 43 42 42 42 41 41 41 41 40 40 40 40 40 40 41 41 41 41 41 42 42 43 43 43 43 44 44 45 45 45 44 43 43 43 44 44 45 45 44 44 43 43 43 44 44 44 45 45 46 45 45 45 44 43 43 43 42 42 42 42 43 43 43 43 43 42 42 42 42 41 41 40 40 39 39 39 39 39 39 39 39 38 37 37 38 38 38 38 38 38 38 38 39 39 38 37 37 36 35 36 36 37 37 38 37 37 38 39 38 38 37 37 38 39 40 40 40 40 39 40 40 41 42 42 41 40 41 41 41 41 40 40 40 39 39 39 38 37 38 40 40 39 39 39 40 39 38 37 36 34 34 36 37 36 35 37 39 39 38 37 37 38 38 40 41 41 42 41 40 40 39 39 38 37 37 36 34 33 33 34 35 36 37 37 36 36 36 35 36 38 38 37 37 35 35 36 36 35 34 34 34 33 31 30 30 31 33 34 37 38 38 39 39 38 37 36 35 34 33 33 34 33 32 32 33 34 33 34 33 33 33 34 35 35 36 36 36 35 33 31 30 30 30 31 32 33 33 34 35 35 36 35 34 34 33 32 32 33 33 34 35 34 34 34 34 34 34 33 33 32 32 32 32 32 33 33 34 33 32 31 30 29 29 29 29 29 30 31 30 29 29 29 29 29 29 29 29 29 29 29 30 30 31 32 33 33 34 34 34 34 34 34 33 33 33 33 33 34 35 36 36 36 36 35 35 35 34 34 34 34 33 32 32 31 29 29 27 28 30 30 31 32 33 33 32 31 30 29 28 28 28 28 31 32 30 29 28 26 24 24 23 23 23 23 23 23 23 24 26 27 26 25 23 23 24 26 26 26 27 27 27 28 29 29 29 29 27 27 26 26 27 29 29 28 27 27 27 27 28 28 27 27 28 28 27 27 29 30 30 30 30 30 29 28 27 27 27 27 26 26 25 24 24 25 25 24 24 24 24 24 24 23 23 24 24 23 23 25 26 27 27 26 25 26 27 27 29 29 29 30 30 31 30 30 30 30 29 28 28 29 29 28 29 30 29 28 28 27 26 25 59 58 58 57 57 56 56 55 55 56 57 56 57 57 57 57 56 55 55 56 55 55 55 54 53 52 52 51 51 51 52 52 52 54 55 54 52 52 52 51 50 50 49 48 49 50 52 52 51 52 53 54 54 53 52 52 51 50 50 49 49 48 48 48 47 47 48 49 50 51 53 53 53 52 52 50 50 50 49 49 49 48 47 47 46 46 46 45 44 44 44 44 44 44 44 45 46 46 46 46 46 46 45 45 45 45 45 45 45 46 46 46 46 46 45 45 46 46 46 46 45 45 46 45 44 44 44 45 45 44 42 43 44 43 42 42 41 41 40 40 40 40 40 40 41 40 40 41 41 42 42 42 42 43 43 44 44 44 44 44 44 43 43 43 43 44 45 45 44 43 43 42 43 44 44 44 45 45 45 45 44 44 44 43 43 42 42 42 41 41 42 42 42 42 43 43 43 43 43 42 41 40 40 40 40 39 39 40 40 40 39 39 38 38 38 38 38 38 38 38 39 39 39 39 38 38 37 37 36 36 35 36 36 37 37 37 38 39 38 37 37 37 38 39 40 40 40 39 38 39 40 41 41 41 41 40 41 41 41 41 41 40 40 40 39 38 38 38 37 39 40 39 38 39 40 40 39 39 38 35 34 34 36 36 35 35 37 38 37 36 36 38 39 40 40 40 41 41 40 39 38 37 37 36 36 36 34 33 32 33 35 37 38 37 35 35 35 35 35 37 36 36 36 35 34 35 36 35 34 33 33 32 31 30 30 31 33 35 37 37 37 39 39 38 36 35 34 34 34 33 32 32 32 32 34 34 33 32 33 33 34 34 34 34 35 35 35 35 33 31 30 30 30 31 32 32 33 33 34 35 35 35 34 34 34 33 32 32 33 33 34 33 33 34 34 34 34 34 34 33 33 33 32 31 31 31 32 31 30 30 31 30 29 29 30 30 32 32 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 33 33 34 34 34 34 34 33 33 33 33 33 35 36 37 36 36 34 34 34 34 34 34 34 34 34 34 32 30 30 29 28 28 30 31 32 32 34 33 33 31 29 29 29 30 29 28 31 32 31 29 27 26 26 25 24 23 23 23 23 23 23 24 25 26 26 24 23 24 25 26 25 26 27 27 27 28 28 29 29 28 27 27 27 27 28 30 29 28 27 28 28 28 29 29 28 28 29 29 28 28 29 30 30 30 30 30 30 29 28 27 27 26 26 25 25 25 26 26 26 26 25 24 24 24 23 23 23 24 24 23 23 24 25 26 26 25 24 25 27 28 28 28 28 30 29 29 30 30 30 30 29 28 28 29 27 27 27 29 29 28 28 28 27 25 59 58 58 57 57 56 56 56 56 57 58 57 58 58 57 57 56 56 56 57 56 56 55 54 53 52 52 51 51 52 54 54 54 55 55 54 52 52 51 51 50 50 49 49 50 51 53 53 53 54 55 55 54 53 52 52 51 50 50 49 49 49 49 48 48 48 48 49 51 52 54 55 54 54 53 51 50 50 49 49 48 47 47 46 46 46 45 45 45 45 44 43 43 43 44 45 45 46 46 45 45 46 45 45 44 44 44 45 45 45 45 46 46 45 45 45 46 46 46 46 45 45 46 46 45 46 45 45 45 43 43 45 45 43 42 43 42 40 40 40 40 40 40 40 40 40 40 40 41 41 41 42 42 42 43 43 43 43 43 44 44 44 43 42 43 43 44 45 44 43 42 42 43 44 44 44 44 44 44 45 44 44 43 43 43 42 41 41 41 41 41 41 41 42 42 42 42 42 42 42 41 41 41 40 40 40 40 40 41 40 40 39 38 38 38 38 38 38 38 39 39 39 39 39 38 38 38 38 38 36 35 35 35 35 36 37 38 39 38 37 37 37 38 39 39 39 39 39 38 39 40 41 41 40 41 40 40 40 41 40 40 41 41 40 39 39 39 38 37 38 38 38 38 38 40 40 39 38 38 37 35 34 35 35 35 36 38 38 36 35 36 38 40 39 39 39 40 41 41 40 38 38 37 36 35 35 34 33 32 33 35 37 38 36 35 34 34 34 35 36 35 35 35 34 34 34 35 35 35 34 33 33 32 31 30 31 33 36 36 36 37 38 39 39 37 36 35 34 34 33 32 31 31 32 33 33 32 32 32 34 34 34 34 34 34 35 35 34 33 31 30 30 30 30 30 31 33 33 33 34 34 35 35 34 33 33 32 32 32 33 33 33 33 34 34 34 34 34 34 34 34 34 33 32 31 30 31 31 31 32 33 32 31 30 31 31 31 31 30 30 30 29 29 30 29 29 29 29 29 29 29 30 31 31 31 32 33 34 34 35 34 34 33 33 34 34 35 36 36 36 35 34 33 33 33 33 33 33 33 33 33 32 31 30 29 29 27 27 30 32 33 33 33 33 32 30 30 30 30 30 29 29 31 32 31 28 27 27 27 26 24 23 23 23 23 23 23 24 25 26 25 23 23 23 25 25 25 26 27 28 29 29 29 29 29 28 28 29 28 28 29 29 29 28 28 29 29 29 29 30 29 29 30 30 29 29 30 30 30 30 30 30 29 29 28 27 27 26 26 25 26 27 27 27 26 26 25 24 24 24 23 23 23 23 23 23 23 24 24 24 24 24 24 25 27 26 26 27 28 29 28 28 29 30 30 30 30 28 27 28 28 28 27 27 28 27 27 27 26 26 58 58 58 58 58 57 56 56 57 58 58 58 58 58 58 57 57 57 57 57 57 56 55 54 53 52 52 52 52 54 55 56 55 55 55 53 52 52 51 50 50 50 49 50 50 52 54 54 54 55 55 55 54 53 52 52 51 51 50 50 50 50 49 48 48 48 48 50 51 52 54 54 54 53 52 51 51 50 49 50 50 49 47 47 47 47 46 46 46 46 44 43 42 42 43 44 45 46 45 45 45 45 45 45 44 44 44 44 45 45 45 46 46 45 45 45 46 46 46 46 46 46 46 46 46 46 45 44 44 44 45 45 44 42 42 43 42 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 42 42 42 42 43 43 43 44 44 43 42 42 42 43 44 44 44 43 42 42 43 44 43 43 43 43 44 45 45 44 44 44 43 43 42 41 41 41 40 40 41 41 42 41 41 42 42 43 42 41 41 40 40 40 41 42 41 40 40 39 38 38 38 38 38 38 38 39 39 39 39 38 38 38 38 38 37 36 35 35 35 35 35 36 37 39 39 37 36 37 38 39 39 38 38 38 38 39 40 40 40 40 40 40 39 39 40 40 40 40 40 41 40 40 40 39 39 38 38 37 37 38 39 39 38 37 36 36 36 34 34 34 34 37 39 38 36 35 36 38 39 38 38 39 40 41 41 40 39 38 37 36 35 34 34 33 32 32 33 36 37 36 35 35 35 34 34 35 34 35 35 34 33 34 34 34 35 34 34 33 32 30 30 31 33 35 35 36 37 38 39 39 39 37 36 35 34 34 33 32 31 31 32 33 32 32 32 33 34 33 33 33 33 35 35 34 32 30 30 30 30 30 31 31 32 32 33 34 35 35 35 34 33 33 32 31 32 33 33 32 33 33 34 34 34 35 34 34 34 34 34 34 33 31 32 33 33 33 34 34 32 31 32 32 32 32 32 32 31 30 30 30 29 29 29 29 29 29 30 31 33 33 33 33 34 34 35 35 34 34 34 34 34 35 36 36 34 34 34 34 33 32 31 31 31 32 32 32 32 30 30 30 29 28 27 27 29 33 33 33 33 34 32 30 30 30 30 30 29 29 30 32 31 28 27 27 27 26 25 23 23 23 23 23 23 23 25 26 25 23 23 23 23 24 25 26 27 28 29 29 29 29 29 29 29 30 29 29 29 29 28 28 29 30 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 26 26 26 27 27 27 27 26 26 24 24 25 25 24 23 23 23 23 23 23 23 24 23 23 24 24 26 27 25 25 27 28 28 25 26 28 30 30 30 30 29 28 27 28 28 27 26 27 27 27 27 26 25 59 59 59 59 58 57 57 56 57 58 59 59 59 59 59 58 58 58 57 57 56 55 55 54 53 52 52 53 55 56 56 56 56 55 54 53 52 52 51 50 50 50 50 50 51 53 55 55 56 56 55 55 54 53 52 52 51 51 50 50 50 49 49 49 48 48 50 52 53 53 54 54 53 52 52 52 51 50 51 52 52 50 48 48 47 47 47 47 46 46 45 44 43 42 43 44 45 46 45 44 44 44 45 45 44 43 43 44 44 45 45 46 45 45 45 45 45 46 46 46 46 46 46 46 46 45 44 44 45 45 45 45 44 43 44 44 42 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 42 42 43 43 43 43 43 42 42 43 43 44 44 44 43 42 42 43 43 43 42 43 43 44 45 45 44 44 44 43 43 42 41 41 41 40 40 41 41 41 41 41 41 42 42 42 42 41 41 41 41 42 42 41 40 40 39 39 38 38 38 38 38 38 39 39 39 39 38 38 38 38 37 37 37 36 36 36 36 35 35 37 39 39 37 36 36 38 38 38 37 37 38 38 39 40 40 39 39 40 40 40 39 39 39 39 39 40 40 40 40 41 40 40 39 39 38 37 37 36 36 36 35 34 34 35 34 34 34 34 35 37 37 35 35 37 38 37 37 38 39 39 40 40 39 37 37 37 37 35 34 33 33 32 32 33 36 37 35 34 35 35 33 33 33 34 34 34 33 33 32 32 32 33 33 32 31 30 30 30 31 33 34 35 35 36 37 38 38 39 38 37 36 35 34 34 33 31 30 31 32 31 31 32 33 33 33 33 33 33 34 35 34 31 30 30 30 30 31 32 31 30 31 33 34 35 35 34 34 34 33 32 31 31 32 32 32 33 33 34 35 36 35 35 34 35 34 34 34 33 33 33 33 34 34 34 34 32 31 33 33 33 33 32 32 31 30 30 30 30 29 29 29 29 29 30 32 33 34 34 34 35 35 36 36 35 35 35 35 36 36 36 35 34 34 34 34 33 32 30 30 30 30 31 31 30 30 30 30 29 28 27 28 30 32 32 32 34 34 33 32 32 32 32 32 30 30 30 31 32 30 30 29 27 27 26 24 23 23 23 23 23 23 24 26 26 24 23 23 25 24 25 27 27 28 29 30 30 29 29 30 30 30 30 30 29 29 29 29 30 30 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 27 27 27 27 28 28 27 27 27 26 26 26 26 25 24 24 24 24 24 23 23 23 23 23 23 24 26 27 26 25 25 26 27 26 24 27 29 29 30 30 30 30 29 27 25 26 26 26 26 26 25 25 25 24 60 60 60 60 59 58 58 57 58 58 58 59 60 60 60 59 59 58 57 57 56 55 55 54 53 52 53 55 56 57 56 55 55 54 53 52 51 51 51 51 50 50 50 51 51 53 56 57 57 55 54 54 54 53 52 51 51 51 50 50 50 49 49 49 48 48 51 53 55 55 54 54 54 54 53 52 52 51 52 52 51 50 49 48 47 47 46 46 46 46 45 45 44 43 43 44 45 46 45 44 44 44 44 45 45 44 43 43 43 45 45 46 45 44 44 45 45 45 45 45 45 46 46 46 46 45 45 45 46 46 46 45 45 45 45 44 43 41 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 42 42 43 44 43 42 42 42 42 43 44 43 43 42 42 43 43 42 42 42 43 43 44 44 44 43 43 43 42 42 41 41 41 40 40 40 40 41 41 40 41 41 41 42 42 42 42 42 42 42 42 41 41 40 40 39 39 39 39 38 38 39 39 40 40 39 39 38 38 38 38 38 37 37 37 38 37 36 35 36 38 38 37 36 37 38 38 37 37 37 38 38 39 40 40 39 39 39 40 40 40 39 39 38 38 39 40 40 41 41 41 40 40 39 38 38 37 36 36 36 36 36 36 36 36 35 34 34 34 35 36 34 35 37 38 36 36 38 38 39 40 40 39 38 37 36 36 35 34 33 33 33 32 32 34 35 34 34 34 33 32 32 32 33 34 34 34 33 31 31 31 32 32 31 30 30 30 30 31 33 34 34 34 35 36 36 37 38 38 38 37 36 34 34 33 33 32 30 30 30 30 32 32 32 32 31 31 32 34 34 33 31 30 30 30 30 31 32 31 30 31 33 34 34 34 34 34 34 33 32 31 30 30 30 31 32 33 33 34 35 35 34 34 34 34 34 34 34 34 34 34 34 33 33 34 33 33 33 34 34 32 30 30 30 30 30 30 29 29 29 29 29 29 29 30 32 33 34 34 35 35 36 36 36 36 36 36 36 35 35 35 34 34 34 33 33 32 30 29 29 30 30 30 30 30 29 29 29 28 27 28 29 30 30 31 33 34 33 33 34 34 33 32 32 31 31 31 31 31 31 30 28 26 25 24 23 23 23 23 23 23 23 25 26 24 23 24 26 26 26 27 27 28 29 30 30 30 30 30 30 30 30 30 29 29 29 29 30 30 30 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 28 27 27 27 28 28 28 28 29 29 28 27 27 27 27 27 26 24 24 24 24 25 24 23 23 23 23 23 23 24 25 25 24 24 24 24 25 26 25 27 28 29 29 29 30 30 29 28 26 25 25 25 25 25 23 23 24 25 61 61 61 61 59 59 58 58 58 58 59 60 61 60 60 60 59 58 57 57 56 55 54 54 53 53 55 57 57 56 55 55 54 53 53 52 51 51 51 51 51 51 51 51 52 53 56 57 56 55 54 53 53 52 52 51 51 50 50 49 49 49 49 49 48 49 50 52 54 55 54 54 55 55 54 53 52 52 52 52 51 49 48 48 47 46 46 45 45 45 45 45 44 43 42 43 44 45 45 44 43 43 44 45 45 44 44 43 43 44 45 45 45 45 44 45 45 45 45 45 45 46 46 46 46 46 45 46 46 47 47 46 46 46 46 44 43 42 41 41 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 42 42 43 43 43 42 41 42 42 42 43 43 42 41 42 43 42 42 42 42 42 43 45 45 44 44 43 43 43 42 41 41 41 40 40 40 40 40 41 40 40 41 41 42 42 42 43 44 43 43 43 43 42 41 40 40 40 40 39 39 39 40 40 40 39 39 39 38 38 38 39 39 38 38 38 38 38 36 35 36 37 37 36 36 37 38 38 37 37 37 38 38 39 39 39 38 38 39 40 41 40 40 39 39 38 38 39 39 40 40 40 40 40 39 39 39 38 37 37 37 37 38 38 38 38 36 34 34 34 34 34 35 36 38 38 36 36 37 37 38 39 40 39 38 37 36 35 34 34 33 32 33 32 32 32 33 33 33 33 33 32 32 32 34 34 34 34 33 31 30 30 31 31 30 30 30 31 33 33 34 33 32 33 34 34 35 36 37 38 38 37 36 35 34 34 33 33 31 30 30 30 31 31 31 30 30 30 31 33 34 33 32 31 30 30 30 30 31 30 30 31 33 33 33 33 34 34 34 33 32 30 30 30 30 30 31 32 33 33 34 34 34 34 33 33 33 33 34 34 34 34 34 33 33 34 34 34 34 34 33 31 30 30 29 29 30 30 29 29 29 29 29 29 30 31 32 33 34 34 34 34 35 36 36 36 35 35 35 34 34 34 34 34 34 32 31 30 30 29 29 29 29 30 30 29 28 28 28 27 27 27 28 30 30 30 32 33 32 31 32 33 32 31 32 33 32 31 30 29 28 28 27 25 25 26 25 23 23 23 23 23 23 24 24 23 24 25 26 27 27 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 28 29 29 29 27 27 28 29 30 29 28 28 28 28 28 27 27 27 27 26 25 25 25 26 26 25 24 24 24 23 22 23 24 23 23 23 23 23 24 25 26 25 26 27 27 28 28 28 28 28 28 27 26 25 25 25 25 25 25 25 26 62 62 62 62 60 59 58 58 59 59 59 60 61 60 59 59 59 58 58 57 56 55 54 54 55 55 55 57 57 56 55 55 54 53 53 53 53 52 52 52 52 52 51 51 52 54 55 57 56 55 54 53 52 52 51 51 50 50 50 49 49 49 49 49 49 49 50 51 52 53 52 53 55 55 55 53 53 53 53 52 50 49 48 48 47 46 46 46 45 45 45 44 44 43 43 42 43 43 44 44 43 43 43 45 45 44 44 43 43 43 45 45 45 44 44 44 44 45 45 46 46 46 46 46 46 46 46 46 47 47 48 48 47 47 48 46 45 44 43 42 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 42 42 43 43 43 43 42 41 42 42 43 43 42 41 42 42 42 42 42 42 43 43 44 45 45 45 44 43 43 43 42 41 41 42 41 41 41 40 40 40 40 40 41 42 41 41 43 44 43 42 43 43 43 42 41 40 41 41 40 40 40 40 40 39 39 39 38 38 39 39 39 39 39 39 39 38 38 36 35 35 37 37 36 35 37 37 38 37 37 37 38 39 39 38 38 38 38 39 40 41 40 40 40 40 39 38 38 38 39 39 39 39 40 40 40 39 39 39 39 38 39 40 38 36 35 34 35 35 34 34 34 35 37 38 38 36 35 36 36 37 38 39 39 38 37 37 35 35 34 33 32 32 32 32 32 32 32 32 32 33 32 32 32 33 33 32 32 32 32 31 30 30 30 30 30 31 34 34 34 33 32 32 33 34 34 35 36 38 38 38 38 38 37 36 35 34 33 32 31 30 30 30 30 30 30 30 30 31 32 33 33 32 30 30 30 30 30 30 30 30 31 33 33 33 33 34 35 34 34 33 31 30 30 30 30 31 33 33 33 33 33 34 34 34 33 32 32 32 33 33 34 34 33 33 33 33 33 34 34 32 30 30 29 29 29 29 29 29 29 29 29 29 30 31 33 34 33 33 33 33 34 35 35 36 35 35 34 34 33 33 34 34 34 34 32 30 30 30 30 30 29 29 29 28 27 28 29 27 27 27 27 28 29 30 30 30 31 31 30 31 33 32 31 31 32 33 31 29 28 27 27 26 25 26 27 26 24 23 23 23 23 23 23 23 23 24 26 26 27 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 29 29 28 28 27 28 29 29 28 28 29 30 29 28 27 27 27 27 28 27 27 27 27 27 26 26 27 27 26 26 25 25 25 24 23 22 23 23 22 22 22 23 25 26 25 25 25 26 26 27 27 27 27 27 28 28 27 27 27 27 27 26 26 26 26 63 62 62 62 61 59 59 59 59 59 60 61 61 60 59 58 58 58 57 56 55 54 55 55 57 56 56 58 58 57 56 56 55 54 54 55 54 53 53 53 53 52 52 52 53 55 57 57 56 55 54 53 52 52 51 51 51 50 50 50 50 49 49 50 50 50 50 51 51 51 50 51 52 54 54 52 52 52 51 51 49 48 48 48 47 46 46 46 45 45 45 44 44 44 43 42 42 42 42 42 43 43 42 43 44 44 43 43 42 42 45 46 44 43 43 44 45 46 46 46 46 46 46 46 47 47 46 47 47 46 47 48 48 48 48 48 47 46 44 42 41 40 40 40 39 39 39 39 40 40 40 40 40 41 41 41 42 42 42 43 42 42 42 41 41 42 42 43 43 42 41 42 42 41 42 42 42 43 43 44 45 45 44 44 44 43 43 43 42 42 43 42 42 42 41 40 39 39 40 40 40 41 42 42 42 42 42 43 43 43 43 42 41 41 41 40 40 40 40 39 39 39 38 38 39 40 40 40 40 39 38 38 38 37 36 35 35 36 36 36 35 36 37 37 37 37 37 38 39 38 38 38 37 38 39 39 40 40 40 39 39 39 38 38 38 38 39 39 39 39 39 39 39 40 39 39 40 40 39 38 36 36 36 37 37 35 34 34 34 35 36 36 34 34 35 36 36 38 39 40 40 39 38 37 36 35 34 33 32 32 32 32 32 31 31 31 31 31 31 32 32 32 32 32 32 32 31 30 30 30 31 31 33 35 35 34 33 32 32 32 33 34 36 37 37 37 37 37 38 37 37 36 36 35 34 31 30 30 30 30 30 30 30 30 31 32 32 33 32 31 30 30 30 30 30 30 30 31 32 32 32 33 34 35 34 34 33 31 30 30 30 30 32 33 33 33 32 33 33 33 34 34 33 32 31 31 32 33 33 33 31 32 33 33 34 33 32 30 30 29 29 29 29 29 29 29 29 29 29 31 32 33 33 32 33 33 34 34 35 35 35 35 34 34 33 33 33 34 34 34 33 32 31 32 31 30 29 29 29 29 28 28 29 30 29 28 28 27 27 28 29 30 30 30 30 29 31 32 31 30 30 31 33 31 28 28 28 28 27 27 27 27 26 25 23 23 23 23 23 23 23 23 24 25 26 26 27 28 29 29 30 29 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 29 29 30 29 29 28 27 27 27 28 29 29 30 30 30 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 25 24 24 24 23 23 23 22 22 22 22 23 25 25 24 24 25 26 27 27 27 27 26 26 27 28 28 28 27 27 27 26 25 25 25 62 62 62 62 61 60 59 60 60 61 61 62 61 60 59 58 57 57 57 56 55 56 56 56 57 57 57 58 58 58 58 57 56 55 56 56 55 54 54 55 53 52 52 53 54 56 57 57 56 55 54 54 54 53 53 52 52 51 51 51 50 50 50 50 51 51 51 51 50 50 50 50 51 52 52 50 50 50 49 49 48 47 47 47 46 45 45 45 46 45 44 44 44 43 43 43 43 43 42 42 41 41 41 42 43 42 42 41 41 42 44 45 43 42 44 46 46 46 45 45 46 46 46 46 47 47 46 46 46 46 47 48 48 48 48 48 47 46 46 43 41 41 40 40 39 38 38 39 40 40 40 40 40 41 41 42 42 42 42 42 42 41 41 41 41 42 43 43 43 42 41 41 41 41 42 42 42 43 43 44 45 44 43 43 43 43 43 43 43 43 43 43 43 42 41 40 39 39 39 40 40 41 42 41 41 41 41 43 43 42 41 41 40 42 42 40 40 40 40 39 39 39 39 39 40 41 41 40 40 39 38 37 37 37 36 36 36 35 35 35 35 35 37 37 36 37 38 38 38 37 38 38 37 37 39 39 39 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 39 40 39 38 39 40 39 38 38 39 39 39 38 36 34 34 34 33 34 34 33 34 36 36 38 38 38 39 39 38 38 38 38 36 36 35 33 33 32 32 32 31 31 31 31 31 31 31 31 31 31 31 32 32 31 30 30 30 31 32 32 34 34 34 33 32 31 32 32 34 35 35 35 36 35 36 37 37 37 37 36 36 36 33 31 30 30 30 30 30 30 30 31 31 32 32 32 32 30 30 30 29 29 30 30 31 31 31 33 33 33 34 34 34 33 31 30 30 30 31 32 33 34 33 32 32 32 32 33 33 33 33 31 30 31 33 33 31 30 32 34 34 34 33 31 30 29 29 29 29 29 29 29 29 29 29 30 31 32 32 31 32 33 34 33 34 34 35 35 34 33 33 32 32 33 33 34 34 33 32 33 33 31 30 29 30 30 30 30 30 30 30 30 30 29 29 27 27 27 29 30 30 29 29 30 30 30 29 29 31 32 31 29 29 29 28 27 27 27 26 25 24 23 23 23 23 23 23 23 23 23 24 26 27 27 27 28 28 28 27 27 27 28 29 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 29 28 29 30 30 29 29 27 26 27 27 27 28 29 29 30 29 27 27 26 25 25 26 27 27 27 27 27 27 26 26 26 26 24 24 23 22 22 23 23 23 23 22 22 22 23 24 23 23 25 26 25 27 27 26 26 25 25 27 27 27 28 27 26 26 24 24 24 24 62 62 62 62 62 61 61 61 60 61 62 62 61 60 59 59 58 57 57 56 56 57 58 57 57 58 57 59 59 59 59 58 56 56 57 57 57 56 56 56 54 52 53 54 56 56 57 57 56 55 56 56 56 55 54 53 52 52 51 50 50 50 51 51 52 52 52 51 50 49 49 50 50 50 50 49 49 49 49 48 48 48 47 46 46 45 45 45 45 44 43 43 43 43 44 45 44 43 43 43 42 41 41 41 41 41 41 41 41 41 43 43 42 43 45 46 46 45 44 45 46 46 46 46 46 46 45 45 45 46 47 47 47 47 48 47 46 45 45 44 42 41 40 40 39 38 38 38 39 39 39 40 40 41 41 41 41 42 42 42 41 41 41 41 41 42 43 42 42 41 41 41 41 42 43 43 43 43 44 44 44 44 43 42 42 42 42 43 43 43 43 43 43 42 42 41 40 40 39 39 40 40 41 41 41 40 40 42 43 42 41 40 40 41 41 41 40 40 40 39 39 39 39 40 40 41 41 40 40 39 39 38 37 37 37 37 37 36 35 35 35 36 37 37 36 37 38 38 37 37 37 38 37 37 38 39 39 40 40 40 39 39 38 38 38 38 37 37 38 38 38 38 39 40 39 38 39 40 40 40 40 40 39 38 37 36 35 33 32 32 32 32 32 35 38 38 39 38 37 38 38 36 37 38 38 36 35 34 34 34 34 33 33 32 32 32 31 31 31 31 31 30 30 30 31 31 31 30 30 29 29 30 30 31 32 33 33 32 30 30 32 33 33 34 34 34 34 35 35 36 36 36 35 35 35 34 32 31 30 30 30 29 29 29 30 30 30 31 31 32 30 30 30 29 29 30 30 30 30 32 33 33 33 33 34 33 32 30 30 30 30 31 32 32 33 34 33 32 31 31 32 33 33 33 32 30 30 32 33 31 30 31 33 33 33 32 31 30 29 29 29 29 29 29 29 29 29 29 30 31 32 31 31 32 32 32 33 34 34 35 34 33 32 32 31 32 33 34 34 34 34 33 33 32 30 29 30 31 31 30 30 30 30 30 30 30 30 29 29 27 26 28 29 28 29 30 30 30 30 29 29 30 31 31 30 29 29 29 27 27 27 26 24 24 24 23 23 23 23 23 23 23 23 25 27 28 28 27 27 27 26 26 27 28 29 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 29 27 27 29 29 29 29 27 26 26 26 27 27 27 28 28 28 27 27 26 24 24 25 26 27 27 27 27 27 26 25 25 24 24 23 22 22 22 22 22 22 23 22 22 22 22 22 21 22 24 24 24 26 26 24 25 25 24 26 26 27 28 28 26 25 24 24 24 23 61 61 61 61 62 62 61 61 60 61 62 62 61 60 59 58 57 57 57 57 57 57 58 58 57 58 58 59 60 59 58 58 57 57 58 58 58 57 57 56 54 53 53 55 57 58 59 58 57 57 57 58 56 55 54 53 52 52 51 50 50 50 51 51 51 51 51 50 50 50 49 49 49 49 49 49 48 48 48 48 47 47 47 46 46 45 45 45 45 44 44 44 44 44 45 45 44 43 44 44 43 43 42 42 42 41 42 42 41 41 41 41 42 43 45 46 45 44 45 45 46 46 46 46 46 46 45 44 44 46 47 46 46 47 47 48 47 45 44 43 42 41 40 40 39 39 38 38 38 38 39 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 41 42 42 43 43 43 44 44 44 44 44 43 43 42 42 42 42 42 43 43 43 43 43 43 42 40 40 39 39 39 40 40 40 40 40 40 41 41 41 40 40 39 39 40 40 40 40 40 39 39 39 39 40 41 40 40 40 39 39 38 37 37 38 38 38 37 36 35 35 36 37 37 36 36 37 38 38 37 37 37 37 37 37 38 39 39 40 40 40 40 40 39 39 38 38 37 37 38 38 38 37 38 39 38 38 39 39 40 40 40 40 39 37 36 35 34 33 32 31 31 30 31 35 38 38 37 37 37 38 37 35 36 37 36 35 34 34 35 35 35 34 34 33 32 32 32 32 32 32 31 31 30 30 30 30 30 30 30 29 29 29 29 29 30 30 31 31 30 30 31 32 32 33 33 33 33 34 34 34 35 36 35 34 33 33 34 32 30 30 30 29 29 29 30 30 30 30 30 31 31 30 30 29 29 30 30 30 32 33 33 33 32 33 34 33 31 30 30 30 30 30 31 32 33 34 33 33 31 30 31 31 31 32 31 30 30 32 32 30 30 31 33 33 33 32 31 30 29 29 29 29 29 29 29 29 29 29 30 31 31 30 31 32 31 32 33 34 34 33 32 31 31 30 31 33 33 33 34 34 34 34 34 33 31 30 31 31 30 30 30 29 29 30 29 29 29 28 28 27 26 27 27 27 29 30 30 30 30 30 30 30 31 31 30 30 30 30 29 27 27 25 24 24 25 25 24 23 23 23 23 23 23 24 26 28 28 27 26 26 26 27 29 29 30 29 28 29 30 30 30 30 30 30 30 30 30 30 30 30 30 29 27 26 27 28 28 27 27 26 26 26 26 26 26 26 26 27 27 27 26 26 24 24 25 26 26 26 25 25 25 25 24 24 23 22 22 22 22 22 22 22 22 22 22 22 22 22 21 21 22 22 24 26 25 24 24 24 24 24 26 28 29 27 27 26 25 24 24 23 60 61 60 61 61 61 61 60 60 61 61 61 61 61 60 58 58 58 59 58 57 57 58 58 58 58 58 58 59 59 58 57 58 58 58 59 58 58 58 56 54 53 54 56 58 58 58 58 56 57 58 58 57 55 55 54 53 52 51 51 50 50 50 50 50 50 50 50 50 50 49 48 48 48 49 48 48 48 48 48 47 47 46 46 46 46 46 46 46 45 45 45 45 46 46 45 45 44 44 45 44 44 45 45 45 44 44 44 42 40 40 41 42 43 44 45 44 44 45 45 45 46 46 45 45 46 46 44 43 45 46 45 46 46 46 46 47 46 45 44 42 41 41 40 39 39 39 38 38 38 39 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 40 41 41 42 42 42 43 43 43 43 43 43 43 44 45 43 43 43 42 41 41 41 43 43 42 42 42 43 42 41 40 40 39 38 39 39 39 40 39 39 40 40 40 40 39 39 39 39 40 40 40 40 40 40 40 40 40 41 40 40 39 38 38 38 38 38 39 40 39 36 35 35 35 35 35 35 35 36 37 38 38 37 37 36 37 37 37 38 38 39 39 40 40 40 40 39 39 38 38 37 36 36 37 38 37 37 37 37 37 38 38 39 38 39 40 39 38 37 36 35 35 34 32 30 30 30 33 35 36 36 36 37 36 35 35 36 37 35 35 35 35 35 35 35 35 34 33 33 33 33 32 32 32 32 32 31 31 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 31 33 33 32 31 33 34 34 34 34 35 35 34 33 33 34 33 32 31 30 29 29 29 29 29 30 30 30 30 30 30 29 29 29 30 30 31 32 33 33 32 33 34 34 33 31 30 30 30 30 30 31 32 33 33 33 33 31 30 30 30 30 30 30 30 30 31 31 30 29 31 32 32 32 32 32 30 30 30 30 29 29 29 29 29 29 29 30 30 30 29 30 30 31 33 34 34 33 31 30 30 30 30 31 32 32 33 33 34 34 34 34 34 33 32 32 30 30 30 30 29 29 29 28 27 27 27 27 26 26 27 27 28 29 30 30 30 29 29 29 30 31 31 30 30 30 30 29 28 27 26 24 24 26 27 26 24 23 23 23 23 23 23 24 27 29 27 26 26 26 28 30 29 28 28 28 29 30 30 30 30 29 29 30 30 30 30 29 29 29 29 29 28 27 26 27 26 26 25 26 26 25 24 25 25 26 26 26 26 26 26 26 24 24 25 25 25 24 24 24 24 23 22 22 21 21 21 21 21 21 21 22 22 22 22 22 22 22 21 21 21 22 24 25 24 24 24 24 25 26 27 27 27 26 25 25 25 24 25 60 60 60 60 60 60 60 59 60 61 61 60 60 61 60 59 59 59 59 58 58 58 58 59 59 58 57 57 58 59 58 58 58 58 57 58 58 58 58 56 56 55 55 56 58 57 57 57 55 55 56 57 58 58 57 56 53 53 53 52 51 50 49 49 50 50 50 49 49 50 49 49 48 48 48 48 48 48 48 48 47 47 47 47 46 46 47 47 46 46 46 46 46 45 45 45 44 44 44 45 44 45 45 45 45 46 44 43 43 41 41 41 41 42 43 44 43 44 44 44 45 46 46 45 45 46 46 45 44 43 44 44 45 45 45 46 46 45 45 44 42 41 41 40 40 39 39 38 38 38 39 40 40 40 40 40 40 41 42 41 41 40 40 40 40 40 40 41 42 42 43 43 43 43 43 42 42 42 43 44 45 44 43 43 43 42 41 41 41 41 42 41 41 42 42 41 41 41 40 39 38 38 38 39 39 39 39 39 40 40 40 39 38 38 39 39 39 39 40 40 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 39 37 35 35 35 35 35 35 36 36 37 37 37 37 36 36 36 37 38 38 39 39 39 40 40 40 40 39 38 38 38 37 37 36 36 36 36 36 36 36 36 37 37 37 37 38 39 39 38 38 38 36 35 35 33 30 30 30 30 32 34 35 35 36 35 34 34 35 35 35 35 35 35 35 35 35 35 33 33 34 34 34 33 33 33 33 32 32 32 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 32 32 31 30 32 34 33 32 32 33 34 34 33 32 33 34 33 32 31 30 30 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 32 33 32 31 32 33 33 33 31 30 30 30 30 30 31 33 33 33 33 33 31 30 30 30 30 30 30 30 30 30 32 31 29 30 32 31 30 32 32 31 30 30 30 30 30 29 29 29 29 29 29 29 29 30 31 31 32 33 33 33 31 30 30 31 31 30 30 31 31 32 33 34 34 34 34 34 34 34 33 31 30 30 30 29 29 29 28 28 28 28 27 26 26 26 27 28 29 29 29 29 28 28 29 30 30 31 30 30 30 29 28 27 27 26 25 26 26 26 25 25 24 23 23 23 23 23 23 26 29 28 25 25 27 29 29 28 27 27 28 30 30 30 30 30 29 29 29 29 29 29 28 28 29 30 30 30 28 27 26 25 24 25 25 25 24 24 24 24 24 24 24 24 24 24 25 24 24 24 25 26 25 24 23 22 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 21 21 21 21 22 22 23 24 24 24 24 25 27 27 27 27 26 25 25 24 24 25 60 59 59 59 59 60 60 59 59 60 60 60 60 60 60 60 60 60 60 59 58 58 58 58 59 58 56 57 58 59 58 57 57 56 56 56 56 56 57 57 57 57 56 57 58 56 56 56 55 54 54 55 56 57 57 57 54 53 53 53 51 50 49 49 49 50 49 48 48 49 49 48 48 47 48 48 47 47 47 47 48 48 48 48 47 47 47 46 46 46 45 45 46 45 44 44 43 42 43 43 43 44 44 44 44 44 43 43 43 43 43 41 40 41 42 43 43 43 43 44 46 46 45 44 44 44 45 45 43 42 43 43 44 44 45 46 45 44 43 42 41 41 41 40 40 39 39 38 38 38 38 39 39 39 40 40 41 41 41 41 40 40 40 40 40 41 41 42 43 43 43 43 43 43 42 42 42 43 43 44 45 44 44 43 43 43 42 42 41 41 41 41 40 41 41 40 40 41 41 40 39 38 38 38 38 38 38 38 39 39 39 38 38 38 39 39 39 39 40 41 41 41 41 40 40 40 39 39 40 40 40 40 40 40 40 39 37 36 35 35 35 35 35 36 36 36 36 37 37 36 36 36 37 37 38 38 39 39 40 40 40 40 39 39 39 39 39 38 38 37 36 36 35 35 34 35 35 36 36 36 37 38 38 37 38 38 36 34 33 32 31 30 30 30 31 33 33 34 34 33 33 33 34 34 34 34 34 35 35 34 35 35 34 35 35 34 34 34 34 34 33 32 32 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 29 30 32 32 31 31 33 34 34 33 32 33 34 34 33 32 31 30 30 29 29 29 29 30 30 30 30 29 29 29 30 30 30 32 32 30 31 31 32 33 33 31 30 29 29 30 30 32 32 32 32 33 33 31 30 30 30 30 30 30 29 29 30 32 31 29 30 30 30 30 31 32 31 31 30 30 30 29 29 29 29 29 29 29 29 29 31 33 34 33 32 31 31 30 30 30 32 33 32 32 32 31 32 33 33 34 34 34 34 34 34 34 33 31 30 30 29 29 29 29 29 30 29 28 26 26 26 26 26 27 28 28 27 27 27 29 30 30 30 30 30 30 29 28 27 27 27 27 27 26 26 25 25 24 23 23 23 23 23 23 25 28 28 25 25 28 29 28 27 27 27 28 29 30 30 30 30 30 29 28 27 27 27 27 29 30 30 30 30 29 28 27 25 24 25 25 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 26 25 23 22 21 21 21 21 21 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 23 22 23 25 25 26 27 26 25 26 26 24 23 24 60 59 58 58 57 58 59 58 58 60 60 59 59 60 61 61 61 61 61 60 59 58 57 57 58 56 56 56 58 58 57 55 55 54 54 54 54 55 57 57 57 57 55 56 56 55 54 54 53 53 52 53 53 54 55 56 54 52 52 52 51 50 49 49 49 49 49 48 48 48 49 48 48 47 47 47 47 47 47 47 47 48 49 48 48 48 47 46 46 46 45 45 44 44 44 43 42 42 41 41 42 42 42 42 42 41 41 42 42 43 43 42 41 40 41 43 43 43 43 43 44 44 44 44 43 43 44 44 43 42 42 43 43 44 45 45 45 44 43 41 41 40 40 40 40 39 39 38 38 38 38 38 39 39 40 40 41 41 40 40 40 39 40 40 41 41 42 42 43 43 43 42 42 42 42 42 42 43 43 44 44 44 44 43 43 43 43 42 42 42 41 41 40 40 40 39 39 40 40 40 40 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 40 41 40 40 40 40 40 40 40 40 39 39 40 40 39 38 37 35 35 35 35 35 35 35 36 36 37 37 35 35 36 36 37 38 38 38 38 40 40 40 40 40 40 40 40 40 39 39 39 38 37 37 36 36 35 34 35 35 35 36 38 38 36 36 36 35 33 33 32 32 31 30 30 30 31 31 32 32 32 32 32 33 33 33 33 34 34 34 33 34 35 35 36 36 34 34 35 35 34 32 32 31 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 32 33 33 33 32 32 33 34 34 33 33 31 30 29 29 29 29 30 30 30 30 30 29 29 29 30 30 31 31 30 31 31 30 31 31 30 30 29 29 30 31 32 31 31 31 33 33 32 32 32 32 32 31 30 29 29 30 31 31 30 29 29 30 30 30 31 31 31 30 29 29 29 29 29 29 29 29 29 29 30 31 32 33 31 29 29 29 29 30 30 32 34 33 33 33 32 32 33 33 33 34 34 34 35 34 34 34 33 31 30 30 30 30 31 30 30 30 28 27 27 26 26 26 26 27 27 27 27 27 28 29 30 30 30 30 30 29 28 27 27 27 27 27 27 27 26 25 25 25 24 23 23 23 23 23 26 27 25 25 28 29 28 26 26 27 28 29 29 29 30 29 29 29 29 27 27 27 27 29 30 30 30 30 29 28 28 26 24 24 24 24 24 24 24 24 23 23 24 24 24 24 24 23 23 23 24 25 23 22 21 21 21 21 21 22 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 21 21 21 23 24 24 25 24 24 24 25 24 23 22 59 59 59 58 58 57 57 58 58 60 59 58 58 60 61 61 61 60 60 60 60 58 57 56 57 56 54 55 56 57 57 54 53 53 53 53 53 54 56 56 56 56 54 53 53 53 53 52 52 52 51 52 52 52 52 53 53 52 52 51 51 50 49 49 49 49 48 48 47 48 48 48 47 47 47 47 47 47 47 47 47 48 48 49 49 48 47 46 46 46 45 45 44 44 44 43 44 43 43 42 41 41 41 41 41 42 42 41 41 41 41 41 41 40 40 42 42 42 43 43 43 43 43 44 43 42 42 43 44 42 41 41 42 43 44 44 43 43 43 42 41 41 41 40 39 39 38 38 38 38 38 38 39 40 40 40 40 40 39 39 39 40 40 41 41 42 42 43 43 42 42 42 42 42 42 43 43 43 43 44 44 43 43 43 43 43 43 43 43 43 42 41 40 40 40 40 39 39 39 39 39 38 38 38 38 38 37 37 38 38 38 38 38 38 38 38 38 38 39 39 40 40 40 41 41 40 41 41 41 40 40 39 39 39 39 38 38 37 35 35 35 35 35 35 35 35 35 36 36 35 35 36 37 37 37 37 38 38 39 40 40 40 40 40 40 40 40 40 40 40 39 38 38 38 38 37 37 35 34 34 35 36 37 36 35 35 34 34 33 33 33 32 30 30 30 30 30 30 31 31 31 31 32 32 32 32 33 34 33 33 34 34 35 36 35 34 33 35 35 34 32 32 31 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 31 31 32 33 31 30 32 33 33 33 33 32 30 30 29 29 29 29 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 29 30 32 32 30 30 30 31 33 33 33 33 33 32 31 30 29 29 30 31 31 31 30 29 29 30 30 30 31 31 30 29 29 29 29 29 29 30 30 30 30 31 31 31 31 30 30 30 29 29 30 31 32 33 33 34 34 34 33 33 33 33 33 34 35 36 35 34 34 34 33 31 31 31 31 31 30 30 30 28 27 27 27 26 26 26 26 27 27 28 27 28 29 29 28 29 30 30 29 29 28 28 29 28 28 27 27 26 26 27 26 25 23 23 23 23 23 23 24 24 25 26 27 27 24 24 27 29 29 27 28 29 27 28 29 29 28 26 26 27 28 29 30 29 28 27 27 27 27 25 24 24 24 24 24 24 24 23 23 24 24 25 24 23 22 22 22 23 23 22 22 21 21 21 21 21 22 23 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21 21 21 22 21 21 21 21 22 23 24 24 24 24 24 23 22 21 57 58 59 59 59 58 56 56 58 59 58 58 59 60 60 61 61 60 59 60 59 58 56 55 56 55 54 53 54 55 55 53 52 52 52 52 52 53 54 55 54 53 53 53 52 52 53 53 52 51 51 51 51 51 51 52 52 52 52 52 51 50 50 50 49 49 48 47 47 47 48 48 47 47 46 47 47 47 47 47 47 48 48 48 48 48 47 46 46 45 45 45 46 45 45 45 45 45 45 44 43 42 42 43 44 44 43 42 42 41 40 40 40 40 40 41 41 41 42 42 42 42 42 43 43 42 41 42 43 42 41 41 41 42 43 42 42 42 42 42 42 41 41 40 39 39 38 38 38 38 38 38 39 40 40 40 40 40 39 39 40 41 41 41 41 42 42 42 42 42 42 42 43 43 43 43 43 43 44 44 44 43 43 43 42 42 42 43 44 43 43 42 41 42 41 41 41 40 40 39 39 39 39 39 39 38 37 37 37 37 37 37 38 38 38 38 38 38 39 39 39 39 40 40 40 41 41 41 41 41 40 40 40 40 39 38 38 37 36 35 35 35 35 35 35 35 35 35 36 35 36 37 37 38 37 37 38 38 39 40 40 40 40 40 40 40 39 39 39 39 39 38 39 39 38 38 38 37 34 34 34 34 35 35 35 35 34 34 34 33 33 33 31 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 32 33 34 34 35 35 33 33 33 34 33 31 30 30 29 29 29 29 29 29 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 31 30 31 32 32 32 32 32 31 30 29 29 29 29 30 30 30 30 29 29 29 29 30 30 30 30 30 30 30 30 30 30 29 29 30 31 32 31 30 30 30 31 33 33 33 33 32 31 30 30 29 29 29 30 30 30 30 29 29 29 30 30 30 30 30 29 29 29 29 29 29 30 30 30 31 31 30 29 29 30 32 32 32 32 32 32 32 33 33 34 34 34 34 34 34 34 34 34 34 35 35 34 34 34 33 33 33 32 31 30 30 30 30 28 27 27 27 26 26 26 26 27 27 28 27 27 28 28 27 29 30 30 30 30 29 29 30 29 28 27 27 27 26 26 25 25 25 24 23 23 23 23 23 23 24 24 24 24 23 24 25 27 27 26 28 29 27 27 28 28 27 25 25 26 27 28 29 28 27 27 27 26 26 26 25 25 24 24 23 23 23 23 23 23 24 24 23 22 22 22 22 22 22 22 21 21 22 22 22 22 23 23 23 23 23 23 23 24 24 23 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 23 23 23 23 22 21 21 56 56 57 58 59 58 57 56 56 57 57 59 60 59 59 60 60 59 59 59 59 58 56 54 54 53 53 53 53 54 54 53 52 52 52 51 51 52 53 53 53 52 52 52 52 51 52 53 52 51 51 50 50 51 51 52 52 52 53 52 51 51 51 50 50 49 48 48 47 46 47 48 48 47 46 46 47 46 47 47 47 48 47 47 48 48 47 46 45 45 45 46 46 46 46 46 46 45 45 44 43 44 44 45 46 45 44 43 42 41 41 41 41 40 40 40 40 41 41 41 41 41 41 41 42 41 41 41 42 42 41 40 41 41 41 41 41 41 41 41 41 41 40 40 39 39 38 38 38 38 38 38 39 40 40 40 39 39 39 39 40 41 41 42 42 41 41 41 41 41 42 43 44 44 44 44 44 44 44 43 43 43 43 43 42 42 42 43 43 43 43 42 42 43 42 42 43 42 42 41 40 40 40 40 40 39 38 38 37 37 37 37 37 37 37 38 38 38 39 38 38 39 40 40 40 41 41 41 41 40 40 40 40 39 39 38 38 37 37 35 35 35 35 35 35 35 35 35 35 35 35 36 37 37 37 37 38 38 39 40 40 40 39 39 39 40 39 39 39 38 38 38 39 39 39 39 38 37 36 35 35 35 34 34 34 34 33 33 34 33 31 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 32 32 32 31 31 31 31 31 29 29 29 29 29 29 29 29 30 31 32 32 32 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 31 32 31 30 31 30 29 29 29 29 30 30 30 30 30 29 29 29 30 29 29 29 30 30 30 29 29 29 29 29 30 30 32 32 30 30 29 29 31 33 33 32 32 31 30 30 30 29 29 28 29 29 29 30 30 29 29 29 29 30 30 30 30 30 29 29 29 29 29 29 29 31 31 29 29 29 31 31 32 33 33 33 33 33 34 34 34 34 34 33 33 34 34 35 35 34 34 34 33 33 34 33 32 32 32 31 30 30 30 29 28 27 27 27 27 26 26 26 27 27 27 27 27 27 27 28 29 29 30 30 30 30 30 29 28 27 27 27 26 26 26 25 26 26 25 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 25 27 27 27 27 27 26 24 24 25 26 28 28 28 27 27 27 26 26 27 27 26 24 24 23 23 23 22 22 22 22 22 22 22 22 22 22 22 22 21 21 21 22 23 23 23 24 25 25 24 24 24 24 24 24 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 21 21 21 21 55 55 55 56 58 58 58 56 55 55 57 59 60 59 59 59 58 58 58 60 60 59 58 56 54 53 52 52 52 53 53 53 52 51 51 51 51 51 52 52 52 52 52 52 51 51 52 52 52 50 49 49 50 51 51 52 52 51 52 52 52 51 50 50 50 49 49 49 48 47 46 48 48 47 46 46 46 46 46 47 47 48 47 47 47 48 48 47 46 46 46 46 47 47 47 46 46 45 44 44 44 45 45 44 44 44 44 43 42 41 41 42 42 41 42 41 41 40 40 40 40 40 40 40 40 40 40 40 41 41 41 40 40 41 41 41 41 40 40 41 41 41 40 39 38 38 38 38 38 38 38 38 39 40 40 40 39 39 39 40 41 41 41 42 41 41 41 40 41 42 42 43 43 43 44 44 44 44 43 43 43 43 43 43 42 41 42 42 42 43 43 43 43 43 43 43 44 44 42 41 41 41 41 40 40 39 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 39 39 39 40 40 40 40 41 40 40 40 39 38 38 38 37 36 36 35 35 35 35 35 36 35 35 35 35 35 36 36 36 35 36 37 38 39 40 40 40 40 39 38 38 38 38 38 38 37 37 37 38 38 39 39 39 38 37 38 38 37 36 36 35 34 33 32 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 31 33 33 33 33 31 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 31 31 30 30 29 29 29 29 29 30 30 30 30 30 29 29 29 29 29 29 29 30 30 30 29 29 29 29 29 30 30 31 31 30 29 29 29 30 31 32 30 30 32 31 30 30 30 29 28 28 29 29 30 30 30 29 29 29 29 29 30 30 30 29 29 29 29 29 29 30 30 30 29 29 30 31 31 31 33 33 33 34 33 32 33 33 33 33 33 33 33 33 34 34 33 33 33 33 33 33 32 30 30 30 31 30 30 29 29 28 27 28 28 27 26 26 26 26 27 27 27 27 27 27 27 28 29 29 30 30 30 30 29 29 27 27 27 26 26 26 26 26 26 25 24 25 24 23 23 23 23 23 23 23 23 23 22 22 22 22 22 23 24 25 25 25 24 24 25 26 26 27 27 27 27 27 26 26 26 26 26 27 26 24 24 23 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21 22 23 23 22 23 25 27 25 24 24 24 24 24 24 24 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 55 54 55 56 56 57 57 55 54 55 56 58 58 58 57 57 57 58 59 60 60 59 58 57 55 53 52 52 51 52 53 52 52 51 50 50 50 51 52 52 52 52 51 51 51 51 52 51 51 51 49 49 50 50 50 51 51 51 51 51 51 51 50 50 49 49 48 48 48 48 46 47 48 48 47 46 46 46 46 47 48 48 47 47 47 48 48 47 47 46 46 47 47 47 47 47 47 46 46 45 46 45 44 43 42 43 43 42 42 42 43 44 43 42 43 43 43 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 40 41 40 41 40 40 40 40 40 40 40 39 39 38 38 38 38 38 38 38 39 40 40 40 39 38 39 40 40 41 41 41 41 41 40 40 41 42 42 42 42 42 43 43 43 43 43 43 43 42 42 42 42 41 41 41 41 42 42 43 44 44 43 42 42 42 42 41 41 40 40 39 38 38 38 38 37 37 38 38 37 36 36 37 37 38 38 38 38 39 39 39 39 39 39 40 41 40 40 40 39 39 38 37 37 36 36 36 36 36 36 36 37 36 36 35 35 35 35 35 35 35 36 37 39 39 40 40 40 40 39 39 38 38 38 37 37 37 36 36 36 37 38 38 38 37 36 36 38 37 36 36 36 35 34 33 32 31 30 30 30 31 32 33 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 30 31 33 34 34 33 32 31 29 30 30 30 30 29 29 29 29 29 29 29 29 29 28 28 28 29 29 29 29 29 29 29 29 30 30 29 29 29 29 29 29 30 30 30 30 30 30 29 29 29 29 29 29 30 30 30 29 29 29 29 29 30 30 30 30 30 30 29 29 29 30 30 30 30 30 31 31 30 30 29 29 28 28 29 29 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 29 29 29 29 29 30 31 33 34 34 34 33 31 31 32 31 32 33 34 34 34 34 33 33 32 32 32 32 33 32 30 30 30 30 30 30 30 30 29 29 29 28 27 26 25 25 26 27 27 27 27 27 27 27 27 28 29 30 30 29 29 29 29 28 27 27 27 27 27 27 27 26 26 26 26 25 24 24 23 23 23 23 23 23 23 22 22 23 23 22 22 22 23 23 23 23 23 25 26 27 27 27 27 26 26 26 25 24 25 25 26 27 25 24 23 22 22 22 22 22 21 21 21 21 21 21 21 21 22 23 23 23 22 22 23 25 27 26 25 25 24 24 24 24 24 24 24 23 23 22 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 57 55 54 55 56 56 56 55 54 55 56 57 57 57 56 56 57 58 59 59 59 58 57 58 56 53 52 52 51 52 52 52 52 51 50 50 50 51 51 51 51 51 51 50 50 50 51 51 51 50 50 49 50 50 50 51 50 50 50 51 51 50 50 50 49 49 48 47 47 47 46 46 47 47 47 46 45 45 46 47 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 45 44 43 43 43 43 42 42 42 43 44 44 43 43 43 45 44 42 41 41 40 40 40 40 40 39 39 39 39 39 39 39 39 40 40 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 39 40 39 38 38 39 40 40 40 40 40 40 40 40 41 41 42 43 42 41 42 43 43 43 43 43 43 43 42 41 41 42 41 40 40 41 41 42 43 44 44 43 42 42 42 41 41 40 40 40 39 39 39 38 38 38 38 38 38 37 37 36 36 37 37 37 37 37 39 39 38 38 38 38 40 41 41 40 40 40 39 39 38 38 38 37 37 37 37 37 37 37 37 37 36 35 35 35 35 35 36 37 37 38 39 39 40 40 39 39 39 39 39 38 38 39 38 37 36 35 36 37 36 36 35 33 33 33 34 33 33 34 35 35 33 31 31 31 30 30 33 35 35 37 36 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 29 29 29 29 29 29 30 32 33 34 34 33 32 32 31 31 31 31 30 30 30 30 30 30 30 29 29 29 29 28 28 28 28 28 28 28 29 28 28 29 28 28 28 28 28 28 29 30 30 30 30 31 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 31 30 29 29 29 29 30 30 30 29 29 30 31 30 30 29 29 28 28 29 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 29 29 29 29 29 30 32 33 34 34 34 34 32 30 30 31 32 34 34 34 33 32 32 33 32 31 31 32 33 32 31 30 30 29 29 29 29 30 30 30 29 28 27 26 25 25 26 26 26 26 27 27 29 29 28 29 29 30 30 29 27 28 29 27 27 28 28 28 27 27 27 26 26 27 26 26 26 26 25 26 26 25 26 25 25 24 23 23 23 23 22 22 22 22 22 22 22 22 24 25 26 27 27 26 25 25 24 24 24 24 25 25 24 23 22 22 22 22 22 21 21 21 22 22 21 21 22 23 24 23 23 23 23 23 24 26 27 26 25 25 25 24 24 24 24 24 24 24 24 24 23 23 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 58 56 54 54 55 55 56 56 54 54 56 56 55 56 55 55 57 58 57 57 58 57 55 57 56 53 52 52 51 51 51 51 51 51 50 49 50 51 51 51 51 51 51 49 49 50 51 51 50 50 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 49 48 47 46 46 46 46 45 46 47 47 45 45 46 47 47 48 48 47 46 46 47 47 46 46 47 48 47 47 47 46 46 47 46 46 45 44 44 44 45 44 43 42 43 45 45 44 43 43 45 46 44 43 42 41 41 42 41 41 40 40 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 39 39 38 38 38 38 38 38 38 38 38 38 39 39 38 38 38 39 40 40 39 39 40 40 40 41 41 41 42 43 42 41 42 43 42 42 42 43 44 43 43 42 41 41 41 40 40 41 41 42 43 43 44 44 43 42 41 40 41 40 40 40 40 41 40 39 39 39 39 38 38 37 37 37 37 36 36 36 37 37 38 38 37 38 38 39 40 41 41 40 40 40 39 39 40 39 38 37 37 37 37 37 37 36 36 37 36 35 35 35 35 36 37 37 37 38 38 39 40 39 39 38 38 38 38 38 38 38 38 38 37 35 34 35 35 34 33 32 32 31 31 31 31 31 32 34 33 31 31 31 30 30 34 36 36 38 39 36 34 32 31 31 31 31 30 31 31 30 30 31 32 32 31 30 30 30 30 30 29 29 29 29 30 30 32 33 34 35 34 33 32 33 33 32 33 32 31 30 31 31 31 31 30 30 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 30 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 29 28 29 30 30 30 29 29 30 30 30 30 30 29 28 28 29 30 30 30 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 29 29 29 29 30 31 32 32 33 33 34 34 32 30 30 31 33 33 33 34 32 31 31 32 31 30 30 31 31 31 31 31 30 30 29 28 28 28 29 30 30 29 27 27 26 26 25 26 26 26 27 28 29 30 30 30 30 30 30 28 27 27 27 27 28 29 29 29 28 27 28 27 27 28 26 26 27 28 28 29 29 29 29 28 28 27 26 25 24 25 24 23 22 22 22 22 22 22 22 23 24 25 25 24 24 24 23 22 22 22 22 22 22 22 22 22 22 22 21 21 22 24 24 23 23 23 24 24 24 24 23 23 23 24 26 27 27 25 24 24 24 24 24 24 23 23 23 23 23 23 23 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 59 56 54 54 54 54 55 55 54 54 55 55 55 54 54 55 56 57 56 55 56 55 54 55 54 53 52 51 51 50 51 51 51 51 51 49 50 51 51 51 50 51 50 49 50 51 51 51 50 49 49 48 49 50 50 49 49 50 50 50 50 49 49 49 49 49 48 48 47 46 45 45 45 46 47 47 46 45 46 46 47 47 47 46 46 46 47 47 46 47 47 48 48 48 47 47 47 49 48 47 46 45 45 46 45 44 43 43 45 46 45 44 45 45 45 45 44 43 43 42 42 44 44 43 41 40 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 40 40 41 41 41 41 41 42 43 42 41 42 42 42 41 42 43 43 43 43 42 41 40 40 40 41 42 42 42 43 43 44 44 43 42 41 41 41 41 40 41 41 41 41 39 39 40 39 38 38 38 38 38 37 36 35 35 36 37 37 37 37 38 38 39 40 40 40 41 40 40 39 39 40 39 38 38 38 38 38 37 37 36 35 36 36 35 35 35 35 36 38 37 37 38 39 40 40 39 38 38 37 37 37 37 37 36 36 36 36 35 34 34 35 35 34 32 31 31 31 31 31 31 31 31 31 31 31 30 30 31 35 39 38 40 41 39 38 36 34 34 35 33 32 33 32 30 31 33 34 33 32 31 31 31 31 30 30 30 30 30 32 33 33 33 35 35 34 33 33 34 34 34 34 33 31 32 33 33 33 32 31 31 31 30 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 30 30 30 30 30 30 30 30 29 29 29 29 29 28 28 29 29 29 30 30 30 30 29 28 27 28 30 30 29 29 29 29 30 30 30 30 29 28 27 28 29 30 31 31 31 31 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 31 31 31 31 32 33 33 33 31 30 29 31 32 33 32 32 31 30 30 31 30 30 30 30 30 30 30 31 30 30 30 29 29 28 28 29 30 29 28 27 27 26 26 25 26 27 27 27 28 29 29 29 30 30 29 28 27 27 27 27 27 29 30 29 28 29 29 29 29 28 27 27 28 29 30 30 30 30 30 29 29 29 29 26 26 27 28 27 24 24 23 23 23 22 22 22 23 23 23 23 23 22 21 21 21 21 21 21 21 22 22 22 22 21 21 23 26 26 25 24 24 25 26 26 26 25 24 23 23 25 26 26 26 25 24 24 24 24 24 23 23 23 23 23 23 23 23 23 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 59 56 55 54 54 53 53 54 54 53 53 54 54 54 54 54 56 56 55 54 54 54 54 54 53 53 52 51 50 50 50 50 50 51 51 49 49 50 50 51 50 50 50 49 49 50 51 51 50 49 49 48 48 49 49 48 49 50 50 50 50 49 49 48 48 48 47 47 47 46 46 45 45 45 46 47 47 46 45 46 47 47 46 46 46 47 47 46 46 47 48 48 49 48 47 47 48 49 49 48 47 47 47 47 46 45 43 43 46 47 45 46 47 46 45 44 44 45 45 43 43 45 45 44 42 40 40 40 39 40 40 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 38 39 40 41 41 41 41 41 41 42 42 41 41 42 42 41 41 42 42 43 43 43 42 41 40 39 39 41 43 43 42 43 43 43 43 43 42 42 42 43 42 41 41 41 41 40 40 40 40 39 38 39 39 39 38 37 37 36 35 36 37 37 36 37 37 38 39 39 39 40 40 40 40 40 40 40 39 39 38 38 38 37 37 36 36 35 35 35 35 35 35 35 36 37 37 38 38 39 39 40 39 38 38 37 37 37 36 35 35 35 36 35 34 34 33 34 35 34 32 31 31 31 31 31 31 31 31 31 31 31 30 30 32 35 39 40 41 41 39 38 37 37 36 35 33 33 33 31 30 31 33 34 34 33 32 33 33 32 31 31 31 31 31 33 35 35 36 36 36 34 34 35 36 35 35 35 34 33 33 33 34 34 33 32 32 31 30 29 29 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 30 30 30 30 30 30 30 29 29 28 28 28 28 29 29 29 29 30 29 29 29 28 27 28 29 30 29 28 28 29 30 30 29 29 29 28 27 27 29 29 30 31 30 30 31 31 30 30 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 32 32 31 31 31 30 29 30 31 31 30 30 30 30 30 31 30 30 29 29 30 30 30 30 29 29 30 30 30 28 27 28 28 28 28 27 27 27 27 26 25 26 26 26 27 27 28 29 29 30 29 28 27 27 27 27 28 29 30 29 29 30 30 30 29 28 28 28 30 30 30 30 29 29 29 28 29 29 28 27 28 28 28 27 26 26 25 23 23 22 22 22 22 23 23 22 21 21 21 21 21 21 21 21 21 21 21 22 21 21 23 27 27 26 25 25 25 26 27 27 27 26 24 23 23 24 25 26 25 24 24 24 24 24 23 23 23 23 23 23 23 23 23 23 22 22 22 21 21 21 21 21 21 21 21 21 21 22 22 23 24 23 58 56 55 55 54 54 53 53 53 53 52 53 53 53 54 53 54 55 55 54 53 53 53 53 53 52 52 51 51 51 50 49 49 51 50 49 49 49 50 50 50 50 50 49 48 50 51 51 50 50 50 49 48 48 47 48 49 49 50 50 50 49 49 48 48 47 47 47 46 46 47 46 46 45 45 46 47 46 45 45 46 47 47 46 46 47 46 45 46 47 48 48 48 48 48 48 48 49 49 49 48 48 48 47 46 45 44 44 46 47 46 47 47 47 45 44 46 47 45 44 44 44 44 43 42 41 41 40 40 41 42 41 41 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 40 40 39 39 39 39 40 40 40 41 41 41 41 41 41 40 40 41 41 40 41 42 42 43 43 43 42 41 40 39 39 41 41 42 42 41 41 42 43 44 44 43 43 42 42 42 42 42 41 41 40 40 40 39 39 39 40 39 38 37 37 37 36 35 35 36 36 37 37 38 38 38 38 39 39 40 40 40 40 40 39 39 38 38 38 37 37 37 37 36 36 36 35 35 35 35 35 36 36 38 39 39 39 39 39 39 38 38 38 38 37 35 34 35 36 36 35 34 33 33 34 33 32 31 31 33 33 32 31 31 31 31 31 31 30 31 32 34 38 40 40 39 38 37 36 35 34 33 32 32 32 31 32 33 33 34 34 33 34 34 33 32 32 32 32 31 32 34 34 35 37 37 36 36 36 36 36 36 36 35 35 34 34 33 34 34 33 32 31 30 29 30 30 30 30 30 29 29 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 30 30 30 30 30 29 29 28 27 28 28 28 28 29 29 29 30 30 28 27 27 28 29 29 28 28 29 29 30 29 29 29 28 27 27 28 29 30 30 30 29 30 31 30 30 30 30 29 29 29 29 29 29 29 29 29 30 30 29 29 30 31 32 30 30 30 30 31 29 29 30 30 30 30 30 30 30 31 30 30 29 29 30 30 30 29 29 29 30 30 30 28 27 27 27 27 27 27 27 27 26 25 25 26 26 26 26 27 27 28 29 29 29 27 27 27 28 29 29 29 30 30 30 30 30 30 30 29 29 29 30 30 29 29 29 28 27 27 27 28 27 28 29 28 27 26 26 25 24 23 23 22 22 22 22 22 22 21 21 21 22 22 22 22 22 22 21 21 21 21 22 24 27 29 27 27 27 27 26 27 27 27 27 27 26 24 23 23 24 25 25 24 24 24 24 23 23 23 23 24 24 23 23 23 23 23 23 23 23 23 22 22 22 22 22 21 21 22 23 23 23 25 26 24 58 57 56 56 55 54 53 53 53 53 52 53 53 53 53 53 53 54 55 55 55 54 53 52 52 51 51 51 51 52 51 49 49 49 49 49 48 48 49 49 49 50 50 48 48 50 51 51 51 51 50 50 49 47 47 47 49 49 49 49 49 49 49 49 48 48 47 47 47 48 48 47 47 46 45 45 46 46 44 44 45 46 46 45 45 46 46 45 47 48 48 47 48 48 49 48 48 48 48 48 49 49 48 47 46 46 45 45 46 47 47 47 46 46 44 45 47 47 45 45 46 45 44 43 42 42 41 40 40 41 42 42 41 40 40 39 39 40 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 37 38 39 40 40 39 38 39 39 39 39 40 40 41 41 41 41 41 40 39 40 40 41 42 43 43 42 42 43 42 40 40 39 39 40 40 40 41 41 41 42 43 44 44 43 42 41 41 41 41 42 42 41 40 40 40 40 40 40 40 39 39 38 38 37 37 36 35 35 36 37 38 38 38 37 38 38 38 38 38 39 39 40 39 38 38 38 38 38 38 37 36 36 35 35 35 35 35 35 35 35 36 37 38 38 38 39 39 40 39 39 38 39 38 36 34 34 36 37 36 34 33 32 33 32 32 31 32 34 34 32 31 31 31 31 31 32 32 33 33 35 39 41 40 39 37 37 36 34 33 33 32 32 32 32 33 34 34 35 34 34 34 34 34 33 33 33 33 32 34 35 35 35 37 37 37 37 37 37 36 35 35 34 34 34 34 34 34 34 32 31 31 30 29 30 31 32 32 31 31 30 29 29 28 28 28 28 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 29 29 30 30 30 30 30 29 28 27 27 27 28 29 29 29 29 29 27 27 27 27 28 28 28 27 28 29 30 30 29 29 28 28 28 27 28 29 30 30 29 29 29 29 30 30 30 30 29 29 29 29 29 29 28 29 29 30 29 29 30 31 32 31 30 30 30 30 28 28 30 30 29 29 30 30 30 30 30 30 29 29 29 30 29 29 29 30 30 30 29 28 27 26 26 27 27 27 27 27 26 25 25 26 27 27 27 27 27 27 28 28 27 26 26 27 29 30 30 30 30 31 31 30 30 30 30 29 29 30 30 30 29 28 28 28 27 26 26 26 27 28 29 28 27 26 26 25 25 24 23 22 22 22 22 21 21 22 23 24 24 24 23 22 22 22 22 22 22 23 25 28 30 29 28 28 29 29 28 27 27 27 26 26 26 26 25 24 23 24 24 24 24 24 24 23 23 23 24 25 25 24 24 24 24 24 24 24 24 24 23 23 24 24 23 23 23 24 25 24 24 25 26 24 58 58 58 57 56 55 54 53 52 52 52 52 53 52 52 52 53 54 54 54 55 54 53 52 51 51 51 51 51 51 51 50 48 48 48 48 48 47 47 47 47 49 49 48 48 49 50 50 51 51 50 50 49 48 47 47 48 48 48 48 49 49 49 49 49 48 48 47 48 49 49 48 47 47 46 45 45 45 44 44 44 45 45 45 44 45 45 45 46 47 48 46 47 48 48 48 48 48 47 47 48 49 48 47 48 47 46 45 47 47 48 47 46 45 45 46 47 46 45 46 46 45 43 42 42 41 41 41 41 42 42 41 42 41 40 40 41 40 40 40 41 41 40 40 40 40 39 38 38 38 38 38 38 37 37 37 38 39 38 38 39 39 39 39 40 40 40 40 40 41 40 39 39 40 40 41 42 43 42 41 41 42 41 40 39 38 39 39 39 40 41 41 42 43 43 42 42 42 41 40 40 41 41 42 42 41 41 41 41 41 40 40 40 40 39 39 38 38 37 37 36 35 35 36 37 37 37 37 37 38 38 38 38 38 39 39 39 38 38 37 37 37 37 37 36 35 35 35 35 35 35 35 36 37 37 38 37 37 37 38 39 39 40 39 39 38 37 36 34 34 35 35 34 33 32 32 32 32 32 32 34 35 34 32 31 32 32 33 35 35 37 37 36 36 39 41 40 39 38 37 35 34 35 35 34 33 33 33 34 35 36 36 36 35 35 34 35 35 35 34 33 34 36 38 37 37 37 36 36 37 37 37 36 35 34 34 33 33 33 33 33 34 33 32 32 31 31 32 32 33 33 32 31 31 31 30 29 28 28 28 27 27 27 27 27 27 27 27 28 28 28 28 28 28 27 27 27 28 28 29 29 29 29 29 28 28 27 27 27 28 27 27 28 27 27 27 27 27 27 27 27 27 28 29 29 30 30 29 28 29 29 27 27 29 29 29 29 28 27 28 29 30 30 30 30 29 29 28 27 27 27 28 29 29 29 29 30 31 32 30 29 30 30 30 29 28 29 30 29 29 30 30 30 31 31 31 30 29 29 29 29 29 30 30 30 30 30 28 27 26 26 26 26 26 27 26 26 25 25 26 27 27 27 27 27 28 28 27 27 26 26 27 29 30 30 30 32 31 31 30 30 30 29 29 30 30 29 29 28 27 27 27 26 25 25 25 26 26 27 27 27 27 27 27 26 24 22 22 22 23 24 24 25 26 26 27 27 26 24 23 22 22 23 23 24 27 29 30 30 29 29 29 29 29 29 27 27 27 26 25 25 25 25 24 23 23 23 24 24 24 24 24 25 24 24 25 26 26 25 24 24 24 24 25 25 24 24 24 24 24 24 24 24 24 25 24 24 24 25 24 58 58 58 58 57 56 55 54 53 52 52 51 52 52 52 52 52 53 53 53 54 54 53 52 52 51 51 51 51 51 50 50 49 49 49 48 48 49 48 47 47 47 48 48 47 49 49 49 50 51 50 50 50 49 47 47 47 47 48 48 49 50 49 49 49 49 48 48 48 48 49 49 48 47 47 46 46 45 44 44 44 44 44 44 44 44 44 45 46 47 47 45 46 48 48 47 47 47 47 47 48 49 48 48 48 47 47 46 47 48 48 48 46 45 46 47 46 46 46 46 46 45 43 43 43 42 42 43 43 43 43 43 42 41 41 41 42 41 40 41 42 42 40 40 41 40 39 39 39 39 38 38 38 37 37 37 37 37 38 38 39 40 39 39 39 40 40 40 40 40 39 39 40 41 41 41 42 43 42 41 41 41 41 39 38 38 39 39 40 41 41 41 42 43 43 42 41 41 40 40 40 40 41 42 41 41 41 41 40 40 40 40 40 40 39 39 38 38 38 37 37 36 35 35 36 36 37 37 37 37 37 37 37 38 38 39 39 38 38 37 37 36 36 37 37 35 35 35 35 35 35 36 37 37 38 38 36 36 37 38 39 39 40 39 39 38 38 36 34 34 33 33 33 32 32 32 32 33 34 35 35 35 33 34 34 34 34 35 36 37 38 38 39 39 40 40 39 38 38 36 35 35 37 38 37 37 36 35 35 36 37 38 38 38 37 37 37 36 35 35 34 35 37 39 38 38 37 36 35 36 36 36 36 35 35 34 33 32 32 32 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 31 29 28 28 28 27 27 28 27 27 27 27 27 27 27 27 28 28 28 27 27 27 27 27 27 28 28 28 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 29 29 28 27 28 28 27 27 27 27 27 28 27 27 28 29 29 29 29 29 29 28 27 26 26 26 27 28 28 28 29 30 30 31 30 29 29 30 30 29 28 28 30 29 28 29 30 30 31 32 32 32 31 30 29 28 29 30 30 30 30 31 29 27 26 26 26 26 26 26 26 25 24 26 27 27 27 28 29 28 28 28 27 27 26 26 27 28 30 30 30 31 30 30 30 30 30 29 28 28 28 27 27 27 26 26 26 25 24 24 23 23 23 24 25 26 27 27 27 25 23 22 22 23 25 26 26 28 29 28 27 26 24 24 23 22 23 25 24 25 28 30 30 30 30 30 30 29 28 27 27 27 26 26 26 25 24 23 23 23 23 23 23 23 24 24 26 26 26 25 25 25 26 26 25 24 24 25 26 25 24 24 24 24 24 24 24 24 24 24 23 23 24 23 23 58 57 57 56 57 57 56 55 54 53 53 52 51 51 51 51 52 52 52 52 53 54 54 53 52 52 52 51 51 51 50 50 51 51 51 49 50 50 50 49 48 46 46 46 46 47 48 48 48 50 50 49 49 49 48 46 46 47 49 49 50 50 50 49 50 50 49 49 49 49 49 49 49 48 47 47 47 46 46 46 44 43 43 43 43 43 43 44 45 46 45 45 47 48 47 47 46 46 46 46 47 48 48 49 48 48 48 48 49 49 49 48 47 47 47 47 46 46 46 46 45 45 44 45 45 43 43 43 43 44 45 44 42 42 42 42 42 41 41 42 42 42 41 41 41 40 40 40 40 39 39 39 38 37 37 37 37 37 38 38 39 39 39 39 39 39 39 40 41 40 39 39 40 40 42 42 42 42 42 42 40 40 40 40 38 38 39 40 40 41 41 42 43 43 43 43 42 40 40 40 39 39 40 40 41 40 40 40 40 40 40 41 40 40 40 40 39 39 39 38 37 36 36 35 35 35 36 37 36 36 36 36 37 38 39 39 39 39 38 38 37 36 36 36 36 35 35 35 35 35 35 36 36 36 36 36 36 36 37 38 39 39 39 39 38 39 38 36 35 33 32 32 32 32 32 32 33 35 36 37 35 34 34 36 38 37 36 36 36 36 38 39 40 41 41 40 38 39 38 36 35 36 37 39 40 40 39 38 38 39 40 41 41 40 39 39 38 37 36 35 35 36 36 37 37 37 37 37 35 35 36 36 35 35 34 34 34 33 32 31 32 32 32 32 32 32 32 32 31 31 31 31 31 32 32 30 29 28 28 28 28 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 27 27 27 27 27 27 27 27 26 26 26 27 27 27 27 27 28 28 28 28 27 27 26 26 26 26 26 26 27 27 28 29 30 30 30 30 28 28 30 30 30 28 28 30 28 27 28 30 30 32 33 32 32 32 30 29 28 28 29 29 29 30 30 29 27 27 26 26 26 26 26 26 24 24 25 26 27 27 28 29 29 29 29 28 27 26 26 27 28 30 30 30 30 29 29 30 29 29 29 28 27 27 26 26 27 26 25 24 23 23 23 22 22 22 22 23 24 25 25 25 24 23 22 22 25 26 26 26 26 27 27 26 25 25 25 24 23 24 25 25 26 28 30 30 30 30 30 29 28 27 26 26 25 25 25 25 25 24 23 23 24 24 24 24 23 24 25 27 27 27 26 26 26 26 27 26 26 25 26 26 25 24 24 25 24 24 24 24 23 23 22 22 22 22 22 21 57 57 56 55 57 57 57 57 55 54 53 52 51 51 50 50 50 51 52 52 52 54 54 54 53 52 52 52 52 51 51 51 52 52 51 50 51 51 51 51 49 48 47 47 46 46 46 46 47 49 49 48 48 49 49 46 45 47 49 49 50 50 50 49 49 50 50 49 49 50 50 49 49 48 48 48 48 47 48 48 47 45 44 43 43 43 43 43 44 44 44 45 47 48 48 46 46 45 44 45 46 47 47 48 48 48 49 49 48 48 49 48 48 48 48 47 47 47 46 46 46 45 45 46 46 44 44 44 44 44 44 44 43 43 43 43 42 42 43 43 43 43 42 42 42 42 42 41 41 41 41 40 39 38 37 37 37 37 38 38 38 38 38 39 39 39 39 39 40 40 39 39 40 40 41 41 41 41 42 41 40 40 40 40 38 38 38 39 40 40 41 42 42 43 43 42 41 40 40 39 39 39 39 39 40 40 40 39 39 39 40 40 40 40 40 40 40 40 39 38 37 37 37 36 36 35 35 35 35 36 36 36 37 38 39 38 38 39 39 38 37 36 35 35 35 35 35 35 35 35 35 35 34 34 34 34 35 36 36 37 38 38 38 38 38 37 36 35 34 32 32 32 32 32 32 33 35 37 38 37 35 33 34 37 38 39 39 39 39 38 39 41 41 42 41 39 38 39 38 36 36 39 40 40 42 41 41 42 43 43 43 43 42 40 40 39 37 37 37 37 37 38 37 36 36 35 36 37 36 35 34 34 34 34 34 33 33 32 31 30 30 31 31 32 33 31 31 32 31 31 30 29 29 30 30 30 29 28 28 28 29 29 30 30 29 29 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 26 26 26 26 26 26 26 26 26 26 26 27 28 30 31 31 30 29 28 29 30 29 29 28 29 30 28 27 28 29 30 31 33 32 30 30 30 30 28 27 28 28 28 29 29 29 27 27 27 27 26 26 26 26 25 24 25 26 26 27 29 30 29 29 29 28 27 26 26 27 29 30 30 29 28 27 28 30 29 28 28 27 27 27 25 25 26 24 23 23 23 23 23 23 23 23 23 22 22 23 23 23 23 23 22 23 24 25 25 26 27 27 27 27 27 27 26 24 23 23 25 25 26 27 29 30 30 30 30 29 28 27 26 26 25 24 24 24 23 23 23 23 25 26 26 26 24 24 25 27 27 27 27 27 27 27 28 27 27 27 26 26 26 25 24 24 24 24 23 23 22 22 22 22 22 22 21 21 56 56 55 55 56 56 56 57 56 55 54 53 53 52 51 50 49 50 50 51 52 53 55 54 53 53 52 52 52 52 51 51 52 52 51 51 52 52 52 51 50 49 48 48 47 46 45 45 46 47 48 47 46 48 49 47 45 46 48 48 49 50 49 48 48 49 50 49 49 49 50 49 49 48 48 48 48 48 48 48 48 47 45 44 43 43 43 42 42 43 43 44 45 46 47 46 45 44 44 44 46 47 47 47 48 48 47 46 46 47 47 47 49 49 48 46 46 46 47 46 46 46 47 47 46 45 45 46 44 44 44 43 43 43 43 43 43 43 43 45 44 44 44 44 44 43 43 42 41 42 42 40 39 39 38 37 37 37 37 38 38 38 38 38 38 39 39 39 40 40 39 39 39 40 41 40 40 40 41 41 40 39 39 39 38 38 38 39 40 40 40 41 41 42 42 42 41 40 40 39 39 39 39 39 39 39 40 39 39 39 39 40 40 41 40 40 40 40 39 38 37 37 37 37 36 36 35 35 35 35 35 36 37 38 38 38 38 39 39 38 37 36 36 36 36 35 35 35 35 36 35 35 34 33 33 33 34 34 34 35 36 36 36 36 37 37 35 33 32 32 32 32 32 32 34 37 37 38 38 37 35 33 35 37 37 39 40 41 41 40 40 42 42 42 41 40 39 39 38 36 36 38 40 41 41 40 41 42 44 44 44 44 42 40 39 39 38 38 38 39 39 40 39 37 35 34 35 36 36 35 33 33 33 33 33 32 31 30 30 30 30 30 30 31 31 30 30 31 30 30 29 29 29 29 29 29 29 29 28 28 29 30 31 31 30 29 29 29 30 29 28 28 28 28 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 29 30 29 28 27 29 29 28 27 27 28 30 28 27 28 29 30 31 32 32 31 30 30 30 29 27 27 28 28 29 29 28 28 28 27 27 27 27 26 25 24 24 25 26 26 28 29 29 29 29 28 27 27 26 26 27 28 28 28 27 27 27 27 28 28 27 26 26 26 26 25 24 24 23 23 23 23 24 25 25 25 24 23 23 23 22 22 22 22 23 23 23 24 26 27 28 29 29 28 28 27 27 25 23 23 24 26 26 26 27 28 29 30 30 30 30 29 28 27 27 27 26 24 23 23 23 24 24 25 27 27 27 25 24 26 27 27 27 28 28 28 28 28 27 27 27 26 25 25 24 24 24 24 24 23 22 22 23 23 23 23 23 22 21 55 55 55 54 55 55 55 56 56 55 55 54 54 53 52 52 51 49 49 51 52 53 54 54 54 54 53 53 52 52 52 52 52 52 51 51 52 52 52 50 49 49 49 49 48 47 46 45 45 46 46 46 46 46 47 46 45 45 46 47 48 49 49 48 47 49 50 49 48 49 49 49 49 49 49 48 47 47 47 47 47 47 47 46 45 44 43 42 42 42 43 43 44 44 46 46 45 44 43 44 45 46 46 46 47 47 47 45 45 45 46 47 48 48 47 45 45 45 46 47 46 47 47 47 45 44 46 46 44 43 43 43 42 42 43 43 43 43 44 45 45 44 44 45 44 43 43 42 42 42 40 40 40 40 39 39 38 37 37 37 37 37 38 38 38 38 39 39 39 39 39 39 40 40 41 40 40 40 41 40 39 38 38 38 37 37 38 39 39 39 40 40 40 41 41 41 41 41 40 40 40 40 39 39 38 39 40 39 38 38 39 39 40 41 41 41 40 40 39 38 38 38 37 36 36 36 36 36 35 35 35 35 36 37 37 37 37 38 39 38 37 37 37 37 36 35 35 35 35 36 36 36 34 33 33 33 33 33 33 33 33 34 34 34 36 37 35 32 32 32 33 33 32 33 36 38 39 38 38 37 35 34 35 36 37 38 39 40 40 41 41 41 41 42 43 42 40 39 39 38 37 39 39 39 39 40 41 42 43 44 45 44 42 40 40 39 38 38 39 39 39 40 40 38 36 35 34 34 34 34 33 32 32 32 31 30 30 30 30 30 30 30 29 29 29 29 29 29 29 29 29 29 29 29 29 29 28 28 29 30 31 31 31 30 30 29 29 30 30 29 28 29 30 29 29 29 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 25 26 26 26 26 27 27 27 26 27 28 27 27 26 26 28 30 29 27 27 29 30 30 31 32 31 30 30 30 29 27 27 28 29 29 29 27 27 28 27 27 27 27 26 25 24 24 25 26 26 27 28 29 28 28 28 28 27 26 26 26 27 27 26 25 25 25 24 24 25 25 25 25 25 24 24 23 23 23 23 23 25 26 26 27 28 27 25 25 26 26 25 24 24 24 24 25 27 29 29 30 30 30 29 28 27 26 24 23 24 26 27 28 28 28 28 29 30 30 30 30 29 28 27 27 26 25 24 23 23 25 25 24 25 27 27 27 26 26 27 27 27 28 29 29 28 27 27 27 26 26 25 24 24 24 24 24 24 24 23 23 23 24 24 24 24 24 23 22 54 55 54 54 55 55 54 54 55 55 56 56 55 55 54 52 52 50 49 50 52 53 54 54 54 54 54 54 53 53 52 52 53 52 52 52 52 52 51 50 50 49 49 49 48 47 46 45 45 45 45 45 45 45 45 45 45 45 45 46 48 48 48 47 47 49 49 48 48 49 49 49 49 49 49 48 47 46 46 46 45 45 46 46 46 45 45 43 42 42 42 42 43 44 44 44 44 43 42 43 44 45 45 45 45 46 46 45 44 44 45 46 46 47 46 45 44 44 46 47 47 47 46 45 44 43 44 44 43 42 42 42 41 41 42 43 43 43 43 44 45 44 44 44 44 43 43 42 42 42 40 40 40 40 40 40 40 38 37 37 37 37 37 38 38 38 38 38 38 38 38 39 40 40 40 40 39 40 40 40 38 38 38 37 37 38 38 38 38 38 39 40 40 40 41 41 41 41 41 41 41 40 40 38 38 38 39 38 38 38 38 39 39 40 40 41 40 40 39 38 38 38 37 37 37 37 37 37 37 36 35 34 35 36 37 36 37 38 39 39 38 37 37 36 36 35 35 36 36 36 36 36 36 34 33 33 33 33 32 32 32 32 32 32 33 34 33 32 32 32 34 34 32 34 36 37 39 40 39 37 36 34 34 36 37 37 38 39 40 40 40 39 40 41 42 42 41 40 39 38 39 40 40 40 39 41 41 41 42 44 45 44 43 41 40 38 37 37 37 37 38 40 40 38 37 36 34 33 32 33 32 31 31 30 30 30 30 31 32 31 30 30 30 30 31 30 29 29 30 30 31 31 30 30 30 29 29 29 29 30 31 32 31 30 30 29 30 31 30 29 29 29 30 30 29 29 28 27 27 27 27 27 27 27 27 28 27 27 28 28 28 27 27 27 27 27 27 26 26 26 26 26 26 26 26 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 27 29 30 28 26 28 30 30 30 31 32 31 30 30 28 27 26 26 27 28 28 27 27 27 27 27 27 26 25 24 24 24 25 26 26 27 28 29 28 27 27 27 27 27 26 25 26 26 25 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 28 28 28 28 29 29 28 28 29 29 28 26 25 25 26 28 29 29 29 29 30 29 29 28 27 25 23 23 25 26 28 29 30 29 29 29 30 30 30 29 28 27 26 25 24 24 23 23 24 26 26 25 26 27 27 27 27 27 27 28 29 28 28 27 27 27 27 26 25 24 24 24 24 24 24 24 24 23 23 23 24 24 24 24 24 23 23 22 53 54 53 53 54 55 54 53 54 55 55 56 56 55 54 53 51 50 49 49 51 52 53 53 52 53 54 54 54 53 53 53 53 53 53 53 52 52 51 51 52 51 50 49 48 47 47 46 46 46 46 45 46 45 45 45 45 45 45 45 46 47 47 46 47 49 48 47 48 49 49 49 49 49 48 49 48 47 46 45 44 44 44 45 45 45 45 44 42 42 42 42 42 42 43 42 42 42 42 42 42 43 44 43 44 45 45 44 43 43 44 44 44 45 45 44 43 43 45 46 46 45 44 44 43 43 43 43 43 42 42 41 41 41 42 42 42 42 42 44 44 43 43 43 43 43 42 43 43 42 40 40 41 40 40 40 40 38 38 38 37 37 37 37 38 38 38 38 38 38 38 39 39 39 39 39 39 40 40 40 38 38 38 37 37 38 38 38 38 39 39 40 41 41 40 40 40 40 41 41 41 40 40 39 38 38 38 38 38 38 38 38 38 39 40 41 40 40 40 39 38 38 38 38 38 38 38 37 37 36 36 35 35 35 35 35 36 37 38 39 38 37 37 37 36 36 37 37 37 36 36 36 36 35 34 34 34 33 32 32 32 32 32 32 32 32 32 32 32 33 34 33 33 35 36 37 39 40 39 38 37 36 35 35 36 37 38 39 39 39 39 38 40 41 42 43 43 42 40 39 39 40 42 42 42 42 42 42 43 44 44 43 42 41 40 39 38 37 37 37 37 38 39 39 37 35 35 34 32 31 31 30 30 30 30 30 33 34 34 33 31 30 30 32 33 34 32 31 31 32 34 35 33 31 31 30 29 29 30 31 30 30 30 30 30 30 31 31 30 30 29 29 30 30 29 28 28 28 28 29 29 29 28 28 29 29 28 27 29 29 29 28 28 28 28 28 27 27 27 26 26 26 26 26 26 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 28 28 28 28 27 26 26 26 25 25 25 25 26 26 26 26 26 26 26 26 25 25 26 28 30 29 27 27 29 30 30 31 32 31 30 29 28 27 26 26 26 26 27 27 27 27 27 27 26 26 24 24 24 25 26 27 27 27 29 29 27 27 27 27 27 27 26 24 24 24 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 25 27 29 29 29 30 30 29 29 28 28 27 27 26 26 27 29 30 29 28 28 28 28 28 28 27 26 24 23 23 24 26 27 29 30 30 30 30 30 30 29 29 27 27 26 25 25 24 23 23 25 27 26 26 27 27 27 28 28 28 28 29 29 27 27 27 27 26 26 25 24 24 24 24 24 24 23 23 23 23 23 23 24 24 24 24 23 23 23 23 52 53 52 52 53 54 54 53 53 54 55 56 56 55 55 53 51 51 49 48 50 51 52 52 52 53 54 53 54 53 53 53 54 54 54 54 53 52 52 52 52 51 50 49 48 48 47 48 48 49 49 48 48 47 46 46 45 45 45 44 45 45 46 46 46 48 48 47 47 48 48 48 49 48 48 48 47 47 46 45 44 44 43 43 44 43 43 43 42 42 42 42 41 41 41 41 41 41 41 41 41 42 43 43 43 43 43 43 42 43 43 43 43 43 45 44 42 42 43 44 44 44 43 43 43 43 42 42 42 41 41 41 41 41 41 41 41 42 42 43 43 42 43 43 42 41 41 42 42 41 41 41 40 40 39 39 39 39 39 39 38 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 38 37 37 37 37 38 38 38 38 39 40 41 40 40 40 39 39 40 40 41 41 40 40 40 39 38 38 38 38 38 38 38 38 39 40 41 40 40 40 39 39 39 39 39 38 37 37 37 37 37 36 36 35 34 35 36 37 37 38 38 39 38 37 37 37 38 38 38 37 37 37 37 36 36 36 36 36 34 33 32 32 32 32 32 32 32 32 32 34 36 34 33 33 34 36 38 38 39 40 40 38 38 38 36 35 36 37 38 38 38 38 39 40 41 42 43 43 43 42 41 40 40 41 42 43 43 43 44 44 44 43 42 41 41 41 40 39 39 39 38 36 36 37 37 36 35 34 33 32 31 32 32 32 31 31 32 36 36 35 34 32 30 31 34 35 36 35 32 32 34 36 36 35 33 32 31 30 29 30 31 31 30 30 30 30 31 32 31 30 30 30 30 30 30 29 28 28 29 29 30 31 31 31 31 30 29 28 28 29 30 30 29 29 29 29 29 28 27 27 27 27 27 27 27 27 28 28 27 27 26 26 26 27 27 26 26 27 28 28 28 28 28 27 29 30 30 30 30 29 27 26 26 26 27 26 25 25 25 25 26 26 25 25 25 25 25 25 26 28 29 28 26 27 29 30 30 31 31 30 29 28 27 27 26 26 26 26 27 26 26 27 27 26 25 24 24 24 26 27 27 28 28 29 28 27 27 27 27 27 26 25 24 24 23 23 23 23 23 24 25 24 23 23 23 23 24 24 24 25 27 28 29 30 31 31 30 30 28 27 27 26 27 27 28 28 29 29 28 27 26 26 26 26 25 26 26 24 23 23 24 25 25 26 27 29 30 30 30 30 30 29 28 27 27 26 26 26 24 24 24 25 27 27 27 27 27 27 29 29 29 28 28 27 27 26 26 25 25 24 24 24 24 24 23 23 23 23 23 23 23 23 24 24 24 24 23 23 22 23 24 51 51 51 51 52 54 54 52 53 54 54 55 55 55 54 53 53 52 50 48 49 50 52 51 51 53 53 52 53 53 53 53 53 54 54 54 53 53 52 52 51 50 50 49 49 49 48 49 50 50 50 49 49 48 47 47 46 46 46 45 44 44 45 45 45 46 47 46 46 47 47 48 48 47 47 46 46 46 45 45 44 44 43 43 43 43 43 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 43 43 42 42 41 42 43 43 42 42 42 42 42 41 41 41 41 41 41 40 40 41 41 41 41 41 41 42 42 42 41 41 41 41 41 41 41 40 40 39 39 39 39 39 40 40 39 39 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 37 37 37 37 38 39 39 39 39 40 40 40 39 39 39 38 39 40 40 41 40 40 40 39 38 38 37 37 37 38 38 38 39 40 40 40 40 40 40 40 40 39 38 38 37 37 37 36 36 36 35 35 34 34 36 37 37 37 38 38 38 39 38 38 38 38 38 38 37 37 37 37 37 37 36 36 35 33 33 32 32 32 33 34 33 33 34 36 37 34 33 34 35 35 36 37 38 40 40 40 39 40 39 37 36 36 37 37 37 38 39 40 41 41 41 41 42 43 43 43 42 41 42 43 44 44 43 42 42 43 42 40 41 41 40 40 39 39 38 36 35 35 35 35 34 33 32 32 33 34 36 35 34 32 33 36 37 37 35 33 31 32 34 36 36 36 34 33 35 37 37 35 33 32 31 31 30 29 31 32 32 31 30 31 32 31 30 30 31 32 32 31 30 29 28 29 30 30 30 31 31 31 32 31 30 31 30 30 30 30 29 29 29 28 28 28 27 27 27 27 27 27 27 29 29 29 29 27 27 27 27 28 28 27 27 29 30 30 31 31 29 29 31 32 30 30 29 28 27 26 27 28 29 28 26 25 25 25 25 25 25 25 25 25 25 25 25 26 27 27 26 26 28 29 29 30 31 30 29 29 27 27 27 26 26 26 26 26 26 27 27 26 24 24 24 25 26 27 27 28 28 28 27 27 27 26 26 26 26 25 24 24 23 23 24 25 25 26 26 25 23 23 24 25 26 26 25 26 28 30 30 31 32 31 30 29 28 27 28 28 29 29 29 29 29 28 27 26 26 26 26 26 25 25 24 23 23 24 26 26 26 26 27 28 30 30 30 30 29 28 27 27 27 26 26 25 24 24 24 25 27 27 27 27 27 28 29 29 28 27 27 27 27 26 25 24 24 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 23 22 23 23 24 52 51 51 51 51 52 53 52 51 52 53 54 55 55 54 53 53 52 51 49 48 49 51 51 50 52 52 52 52 52 52 52 52 53 53 53 53 53 53 52 51 50 50 50 50 50 50 51 51 50 49 49 48 47 47 47 46 46 46 45 44 44 44 44 45 45 46 46 46 46 46 47 47 46 46 46 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 42 42 41 41 41 41 41 41 42 41 41 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 41 41 41 41 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 39 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 37 37 37 37 37 38 38 39 39 39 39 39 40 40 39 39 39 38 39 39 40 40 40 40 39 39 38 38 37 37 37 38 38 39 39 39 40 40 40 40 40 40 39 38 38 39 38 37 37 37 37 36 36 35 34 34 35 36 37 37 37 37 38 39 39 38 37 37 37 37 38 38 38 38 37 37 36 36 35 34 33 32 32 32 34 34 34 34 36 37 37 35 33 35 36 34 34 36 38 39 40 40 41 41 41 39 37 36 36 37 37 37 38 40 41 40 40 41 41 42 43 44 43 43 43 44 44 44 43 42 41 42 42 40 40 40 40 40 39 38 38 37 37 36 35 34 33 32 32 34 36 37 37 36 35 32 33 35 37 37 35 34 32 31 33 35 36 37 36 35 35 37 37 35 33 32 33 32 31 30 31 33 33 33 32 32 32 31 30 32 33 33 32 31 29 29 29 29 31 31 29 30 30 31 32 31 30 31 31 30 30 29 29 28 28 28 27 27 27 27 27 28 29 28 28 29 30 30 29 29 29 29 28 29 29 29 29 29 30 32 33 32 30 30 32 32 30 30 29 28 27 27 29 29 29 29 28 27 27 26 26 26 25 25 25 25 25 25 25 25 25 25 25 25 26 27 28 29 29 29 30 29 28 27 27 27 27 26 26 25 25 26 26 26 25 24 24 24 26 27 27 27 28 28 28 27 27 26 26 26 26 25 24 23 23 24 26 27 26 26 26 25 24 24 26 27 27 26 26 27 29 29 31 32 31 30 30 29 28 29 30 30 30 30 29 28 27 27 28 28 27 28 28 28 27 26 24 23 24 26 27 28 28 28 27 29 30 30 30 30 29 27 27 27 26 25 25 24 24 24 24 26 27 27 27 28 28 28 28 28 27 27 27 27 27 26 25 24 23 23 23 24 24 23 23 23 23 23 24 24 24 24 24 24 24 23 23 23 23 23 23 53 53 52 51 51 52 52 51 50 50 52 53 53 54 54 53 52 52 52 52 49 48 49 49 50 52 51 51 52 52 51 51 51 52 52 51 52 53 53 53 52 51 51 51 51 50 50 52 52 50 49 49 48 48 47 47 46 46 46 46 45 44 44 44 44 44 45 45 45 45 45 45 46 46 45 45 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 43 43 43 42 42 42 42 42 42 43 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 41 40 40 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 40 40 40 39 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 39 39 39 39 40 39 39 39 39 38 38 39 40 40 40 39 39 38 38 38 37 37 37 37 38 39 39 39 39 39 40 40 40 40 39 39 39 39 38 37 37 37 37 36 35 35 34 34 35 36 36 37 36 37 37 37 38 38 37 37 37 37 37 37 37 38 37 37 37 37 37 35 34 33 32 33 35 35 35 36 37 39 38 35 33 35 37 36 35 35 36 37 39 40 41 41 41 40 39 37 36 38 39 39 38 39 39 39 40 41 42 42 43 44 44 44 44 44 43 43 42 42 41 40 41 40 39 39 40 40 40 39 39 38 38 38 36 35 33 32 32 35 38 38 37 36 34 33 34 35 37 37 36 35 34 33 33 35 36 37 37 37 37 37 38 37 34 34 34 33 32 31 32 33 33 34 33 33 32 31 31 33 33 33 32 30 29 29 29 29 31 31 30 31 32 32 32 31 30 30 30 30 29 29 29 28 27 27 27 27 28 28 29 30 30 29 29 29 30 30 30 30 29 29 28 29 29 29 30 30 32 33 34 32 31 31 33 32 30 30 30 30 29 29 30 30 30 30 28 28 29 29 28 28 27 26 25 25 25 24 24 24 24 24 25 25 25 25 26 27 28 28 28 28 27 27 28 28 27 27 27 26 25 24 25 25 25 24 24 23 25 26 26 26 27 28 29 28 28 27 27 27 26 25 24 23 23 25 26 26 26 25 25 25 24 25 28 28 27 27 28 29 29 30 31 31 30 30 29 29 29 30 31 30 30 30 29 27 27 28 29 29 29 29 29 28 27 27 26 24 24 26 27 28 29 29 29 29 30 30 30 29 28 27 26 25 24 24 24 25 25 25 25 27 27 27 27 27 28 28 28 27 27 27 27 27 27 26 25 24 23 23 25 25 24 24 24 24 24 24 24 24 25 25 24 24 24 23 23 23 23 24 24 54 54 53 51 50 51 50 51 51 50 51 51 51 53 54 54 53 52 52 52 51 49 48 48 50 51 51 51 52 51 50 50 50 51 51 51 51 51 52 53 53 52 52 52 51 50 50 51 51 50 51 50 49 49 48 47 46 46 46 46 46 45 45 44 44 44 44 44 44 44 44 44 44 44 44 43 43 43 43 43 43 43 43 44 44 44 44 44 44 45 45 44 44 43 43 43 43 43 43 43 42 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 40 40 39 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 40 40 39 38 38 39 39 38 37 37 37 37 37 37 37 37 37 37 36 36 36 37 36 36 37 37 38 38 39 39 39 39 39 39 39 38 38 38 38 39 40 40 40 40 39 38 38 38 38 37 36 37 37 38 39 39 39 39 39 39 39 39 40 40 40 39 38 38 37 37 37 37 36 36 35 34 34 35 35 35 36 36 37 37 37 37 37 37 36 36 36 36 36 37 37 37 37 37 37 37 37 35 32 32 34 36 36 37 37 38 39 37 35 34 36 38 38 38 36 35 36 38 40 40 40 41 42 41 39 37 38 40 41 41 40 39 39 40 41 43 43 44 44 45 44 43 42 42 42 41 41 41 39 39 40 39 39 39 39 40 41 40 39 38 37 35 34 33 32 33 36 38 39 37 36 35 34 35 37 38 38 37 36 35 35 33 33 34 35 36 37 38 38 39 38 37 36 35 34 33 32 32 33 33 33 34 34 33 32 33 33 33 31 31 30 30 29 29 30 31 32 31 32 33 33 31 30 30 30 29 29 29 29 29 29 28 27 28 29 29 29 30 30 30 29 29 29 29 30 30 30 29 29 29 30 29 29 30 31 33 34 34 33 32 33 34 33 32 31 31 31 30 30 30 30 30 30 29 29 30 30 30 29 28 26 26 26 25 24 24 24 24 24 24 24 24 24 24 26 26 26 27 27 27 27 27 28 28 27 27 26 26 24 24 24 24 24 23 23 24 25 24 25 26 27 28 28 28 27 27 26 25 24 23 23 24 26 26 26 26 25 25 24 23 25 27 28 28 29 30 30 30 30 31 31 30 30 29 29 30 31 32 30 30 30 29 29 28 29 30 30 29 28 28 28 27 27 26 25 24 26 27 27 29 30 30 30 30 30 29 27 27 26 25 25 25 24 25 26 27 26 25 26 27 27 27 27 27 28 27 27 27 27 27 27 26 25 24 23 24 25 26 26 25 24 25 25 24 24 24 24 24 25 25 24 24 24 23 23 24 24 24 54 54 53 51 51 51 51 53 53 51 50 49 50 53 55 54 54 53 52 51 52 52 50 48 49 50 50 50 50 50 49 49 49 50 49 50 49 49 51 52 53 53 52 52 52 52 52 52 52 51 52 50 50 50 48 48 48 47 48 48 47 46 46 45 44 44 44 44 43 43 43 43 43 43 43 43 43 43 43 44 45 44 44 44 45 45 45 45 45 45 45 44 44 44 43 43 43 43 43 42 42 42 41 41 41 41 40 40 41 41 41 41 41 41 41 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 40 41 40 40 40 40 39 40 39 39 40 39 40 40 40 40 41 41 40 40 39 39 39 39 40 40 38 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 37 37 38 38 39 39 39 38 38 39 40 39 38 38 39 39 40 40 40 40 40 39 38 38 38 37 36 36 37 37 38 39 40 39 39 39 39 39 40 40 40 39 39 38 38 37 37 37 37 37 36 35 34 34 34 35 35 36 37 37 36 36 36 36 36 35 35 35 35 36 36 36 36 36 36 36 35 33 32 32 35 37 37 37 38 39 38 37 35 34 37 39 39 40 39 37 36 37 39 40 41 42 42 41 39 38 38 39 40 41 42 41 40 41 41 42 43 43 44 45 44 43 43 42 41 40 40 40 39 38 39 40 39 39 38 38 39 39 38 37 35 34 34 33 33 35 37 37 39 39 38 36 35 35 37 38 39 38 37 37 36 34 34 34 34 35 36 37 38 39 38 38 37 36 34 33 33 32 32 33 33 33 34 34 34 33 32 31 31 30 29 30 30 31 31 33 32 32 33 33 32 30 30 30 30 29 30 30 31 31 30 29 29 29 30 30 29 30 30 30 30 29 29 29 30 30 30 30 30 30 30 30 30 31 32 34 34 34 33 33 32 33 33 33 33 32 32 32 32 31 31 31 31 30 30 30 30 30 29 28 27 27 26 25 26 27 26 24 24 24 24 24 24 24 24 25 26 26 26 27 27 27 27 27 27 27 27 27 26 25 25 24 24 23 23 24 23 23 24 25 25 26 26 25 25 25 24 23 23 23 23 26 27 27 27 27 28 28 26 24 25 26 27 28 28 28 29 29 29 30 30 30 30 29 29 30 32 32 31 30 29 29 29 30 30 30 30 29 28 28 29 28 27 26 25 24 26 27 28 30 30 30 30 30 29 28 27 26 25 25 26 27 25 25 26 27 27 26 26 26 26 26 27 27 28 28 27 27 26 27 27 26 26 24 23 24 25 26 26 26 26 26 26 25 24 24 24 24 25 26 25 24 24 23 23 23 24 24 \ No newline at end of file diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/grid/misc/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/grid/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/image/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/image/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/import/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/import/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/create_gagradloc/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/create_gagradloc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/db_purge/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/db_purge/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/floodseq/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/floodseq/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/metar2shef/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/metar2shef/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/misc/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/obsfcst_monitor/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/obsfcst_monitor/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/pdc_pp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/pdc_pp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/precip_accum/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/precip_accum/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/qcalarm/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/qcalarm/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/rivermon/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/rivermon/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/riverpro/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/riverpro/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/sshp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/sshp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/vacuum/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/log/vacuum/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/metar_input/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/metar_input/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/metar_output/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/metar_output/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/pdc_pp/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/pdc_pp/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/product/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/product/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/report/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/report/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp/forecast/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp/forecast/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp/precip/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp/precip/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/incoming/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/incoming/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ingest_xml/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ingest_xml/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/outgoing/.gitignore b/nativeLib/files.native/edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/outgoing/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/files.native/edex/lib/native/linux32/libXm.so b/nativeLib/files.native/edex/lib/native/linux32/libXm.so new file mode 100755 index 0000000000..7a74015dbc Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libXm.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libXm.so.2 b/nativeLib/files.native/edex/lib/native/linux32/libXm.so.2 new file mode 100755 index 0000000000..7a74015dbc Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libXm.so.2 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libXm.so.2.0.1 b/nativeLib/files.native/edex/lib/native/linux32/libXm.so.2.0.1 new file mode 100755 index 0000000000..7a74015dbc Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libXm.so.2.0.1 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libecpg.so b/nativeLib/files.native/edex/lib/native/linux32/libecpg.so new file mode 100755 index 0000000000..732b086cfe Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libecpg.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libecpg.so.6 b/nativeLib/files.native/edex/lib/native/linux32/libecpg.so.6 new file mode 100755 index 0000000000..732b086cfe Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libecpg.so.6 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libecpg.so.6.0 b/nativeLib/files.native/edex/lib/native/linux32/libecpg.so.6.0 new file mode 100755 index 0000000000..732b086cfe Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libecpg.so.6.0 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so b/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so new file mode 100755 index 0000000000..54a73b2b0b Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so.3 b/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so.3 new file mode 100755 index 0000000000..54a73b2b0b Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so.3 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so.3.0 b/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so.3.0 new file mode 100755 index 0000000000..54a73b2b0b Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libecpg_compat.so.3.0 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libgfortran.so.1 b/nativeLib/files.native/edex/lib/native/linux32/libgfortran.so.1 new file mode 100644 index 0000000000..cd5c69bd93 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libgfortran.so.1 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libjasper.so b/nativeLib/files.native/edex/lib/native/linux32/libjasper.so new file mode 100755 index 0000000000..c720732e99 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libjasper.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libjasper.so.1 b/nativeLib/files.native/edex/lib/native/linux32/libjasper.so.1 new file mode 100755 index 0000000000..c720732e99 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libjasper.so.1 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libjasper.so.1.0.0 b/nativeLib/files.native/edex/lib/native/linux32/libjasper.so.1.0.0 new file mode 100755 index 0000000000..c720732e99 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libjasper.so.1.0.0 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libjvm.so b/nativeLib/files.native/edex/lib/native/linux32/libjvm.so new file mode 100755 index 0000000000..4adb1a1bd6 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libjvm.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so b/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so new file mode 100755 index 0000000000..b24a5dc603 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so.3 b/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so.3 new file mode 100755 index 0000000000..b24a5dc603 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so.3 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so.3.0 b/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so.3.0 new file mode 100755 index 0000000000..b24a5dc603 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libpgtypes.so.3.0 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libpq.so.5.5 b/nativeLib/files.native/edex/lib/native/linux32/libpq.so.5.5 new file mode 100644 index 0000000000..9bb5f4c89e Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libpq.so.5.5 differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.adappt.climate.so b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.climate.so new file mode 100755 index 0000000000..62296d4596 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.climate.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.adappt.climate.ui.so b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.climate.ui.so new file mode 100755 index 0000000000..63f9767bfd Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.climate.ui.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.adappt.hwr.avn.so b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.hwr.avn.so new file mode 100755 index 0000000000..e483616af1 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.hwr.avn.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.adappt.hwr.so b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.hwr.so new file mode 100755 index 0000000000..3a93a3597e Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.adappt.hwr.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.empty.motif.so b/nativeLib/files.native/edex/lib/native/linux32/library.empty.motif.so new file mode 100755 index 0000000000..dfa32983a7 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.empty.motif.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.meteorlogical.so b/nativeLib/files.native/edex/lib/native/linux32/library.meteorlogical.so new file mode 100755 index 0000000000..7d386c7ddd Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.meteorlogical.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.ohd.ffg.so b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.ffg.so new file mode 100755 index 0000000000..eb9e44b1a7 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.ffg.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.ohd.ofs.so.REMOVED.git-id b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.ofs.so.REMOVED.git-id new file mode 100644 index 0000000000..670b0bb934 --- /dev/null +++ b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.ofs.so.REMOVED.git-id @@ -0,0 +1 @@ +cbeec8412bbae976431cb0dbe85fc6b9c170253e \ No newline at end of file diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.ohd.pproc.so.REMOVED.git-id b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.pproc.so.REMOVED.git-id new file mode 100644 index 0000000000..2f1567f303 --- /dev/null +++ b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.pproc.so.REMOVED.git-id @@ -0,0 +1 @@ +4bb014852ca50921e54aaa7a931c57b1026cbccb \ No newline at end of file diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.ohd.util.so b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.util.so new file mode 100755 index 0000000000..921c7422ff Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.util.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/library.ohd.whfs.so b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.whfs.so new file mode 100755 index 0000000000..58ee78671b Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/library.ohd.whfs.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libtcl.so b/nativeLib/files.native/edex/lib/native/linux32/libtcl.so new file mode 100755 index 0000000000..af6cd8c81b Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libtcl.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libtcl8.5.so b/nativeLib/files.native/edex/lib/native/linux32/libtcl8.5.so new file mode 100755 index 0000000000..af6cd8c81b Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libtcl8.5.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libtk.so b/nativeLib/files.native/edex/lib/native/linux32/libtk.so new file mode 100755 index 0000000000..9c307e4ab6 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libtk.so differ diff --git a/nativeLib/files.native/edex/lib/native/linux32/libtk8.5.so b/nativeLib/files.native/edex/lib/native/linux32/libtk8.5.so new file mode 100755 index 0000000000..9c307e4ab6 Binary files /dev/null and b/nativeLib/files.native/edex/lib/native/linux32/libtk8.5.so differ diff --git a/nativeLib/files.native/lib/python2.5/plat-linux2/hwrdcd.so b/nativeLib/files.native/lib/python2.5/plat-linux2/hwrdcd.so new file mode 100755 index 0000000000..bd780326f0 Binary files /dev/null and b/nativeLib/files.native/lib/python2.5/plat-linux2/hwrdcd.so differ diff --git a/nativeLib/files.native/lib/python2.5/plat-linux2/hwrfmt.so b/nativeLib/files.native/lib/python2.5/plat-linux2/hwrfmt.so new file mode 100755 index 0000000000..dfcf5f36fe Binary files /dev/null and b/nativeLib/files.native/lib/python2.5/plat-linux2/hwrfmt.so differ diff --git a/nativeLib/files.native/setup/dist.native_permissions.sh b/nativeLib/files.native/setup/dist.native_permissions.sh new file mode 100755 index 0000000000..c66b563ae8 --- /dev/null +++ b/nativeLib/files.native/setup/dist.native_permissions.sh @@ -0,0 +1,1381 @@ +cd $(dirname $0) +chmod 555 ../edex/lib/native/linux32/libtcl8.5.so +chmod 555 ../edex/lib/native/linux32/libtk8.5.so +chmod 644 ../adapt/climate/data/clibrwse.conf +chmod 644 ../adapt/climate/data/clinwws.conf +chmod 644 ../adapt/climate/data/error_blast.gif +chmod 644 ../adapt/climate/data/global_day +chmod 644 ../adapt/climate/data/help/annual_periods.gif +chmod 644 ../adapt/climate/data/help/arrow.gif +chmod 644 ../adapt/climate/data/help/awip_ban.gif +chmod 644 ../adapt/climate/data/help/bc_storm.gif +chmod 644 ../adapt/climate/data/help/broadcast.html +chmod 644 ../adapt/climate/data/help/calfrop.gif +chmod 644 ../adapt/climate/data/help/climate_map.gif +chmod 644 ../adapt/climate/data/help/climate_master.gif +chmod 644 ../adapt/climate/data/help/climate_report_setup.html +chmod 644 ../adapt/climate/data/help/climate_reports_setup.gif +chmod 644 ../adapt/climate/data/help/climo_help.html +chmod 644 ../adapt/climate/data/help/climo_prefs.gif +chmod 644 ../adapt/climate/data/help/climo_prefs.html +chmod 644 ../adapt/climate/data/help/column.gif +chmod 644 ../adapt/climate/data/help/confignwr.html +chmod 644 ../adapt/climate/data/help/confignwws.html +chmod 644 ../adapt/climate/data/help/configs.html +chmod 644 ../adapt/climate/data/help/default.html +chmod 644 ../adapt/climate/data/help/delete_climo_products.html +chmod 644 ../adapt/climate/data/help/delete_products.gif +chmod 644 ../adapt/climate/data/help/display.gif +chmod 644 ../adapt/climate/data/help/dispmethods.gif +chmod 644 ../adapt/climate/data/help/dotblue.gif +chmod 644 ../adapt/climate/data/help/edit_climate.gif +chmod 644 ../adapt/climate/data/help/edit_data.gif +chmod 644 ../adapt/climate/data/help/edit_data.html +chmod 644 ../adapt/climate/data/help/error_blast.gif +chmod 644 ../adapt/climate/data/help/execute_AM_PM_climate.html +chmod 644 ../adapt/climate/data/help/f6date.gif +chmod 644 ../adapt/climate/data/help/f6.html +chmod 644 ../adapt/climate/data/help/helpnwr.html +chmod 644 ../adapt/climate/data/help/helpnwws.html +chmod 644 ../adapt/climate/data/help/hour_clim.gif +chmod 644 ../adapt/climate/data/help/import_climate.gif +chmod 644 ../adapt/climate/data/help/import_climate.html +chmod 644 ../adapt/climate/data/help/imported_data.gif +chmod 644 ../adapt/climate/data/help/initialize_climate.html +chmod 644 ../adapt/climate/data/help/missing.html +chmod 644 ../adapt/climate/data/help/mon_disp.gif +chmod 644 ../adapt/climate/data/help/norms_extremes1.gif +chmod 644 ../adapt/climate/data/help/norms_extremes2.gif +chmod 644 ../adapt/climate/data/help/norms_extremes_mon.gif +chmod 644 ../adapt/climate/data/help/notequal.gif +chmod 644 ../adapt/climate/data/help/nwr_config.gif +chmod 644 ../adapt/climate/data/help/nwws_config.gif +chmod 644 ../adapt/climate/data/help/productnwr.html +chmod 644 ../adapt/climate/data/help/productnwws.html +chmod 644 ../adapt/climate/data/help/product_properties.gif +chmod 644 ../adapt/climate/data/help/qcmethods.gif +chmod 644 ../adapt/climate/data/help/report_format.gif +chmod 644 ../adapt/climate/data/help/report_format.html +chmod 644 ../adapt/climate/data/help/report_format_MON.gif +chmod 644 ../adapt/climate/data/help/report_periods.gif +chmod 644 ../adapt/climate/data/help/retrieve.html +chmod 644 ../adapt/climate/data/help/select_climate_run.gif +chmod 644 ../adapt/climate/data/help/select_products.gif +chmod 644 ../adapt/climate/data/help/select_stations.gif +chmod 644 ../adapt/climate/data/help/select_stations.html +chmod 644 ../adapt/climate/data/help/stationlistnwr.html +chmod 644 ../adapt/climate/data/help/stationlistnwws.html +chmod 644 ../adapt/climate/data/help/stationnwr.html +chmod 644 ../adapt/climate/data/help/stationnwws.html +chmod 644 ../adapt/climate/data/help/threshnwr.html +chmod 644 ../adapt/climate/data/help/threshnwws.html +chmod 644 ../adapt/climate/data/help/tstm.gif +chmod 644 ../adapt/climate/data/help/usr_defined_values.gif +chmod 644 ../adapt/climate/data/hour_clim.gif +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep +chmod 644 ../awipsShare/hydroapps/precip_proc/local/data/app/nc2grib/gfe2grib.txt +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/coord_host.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/county.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/cwaus.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/fg_basin.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/flights.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/forecastpt.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/map_basin.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/rfc_boundary.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/river.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/state.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/host/ascii/town.dat +chmod 644 ../edex/data/hdf5/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat +chmod 644 ../edex/data/hdf5/hydroapps/lib/native/linux32/libgfortran.so.1 +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/bin/send_message.py +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe/projection.con +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct +chmod 644 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep +chmod 644 ../edex/data/hdf5/hydroapps/public/bin/amirunning +chmod 644 ../edex/data/hdf5/hydroapps/public/bin/dd_help +chmod 644 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/include_me.ksh +chmod 644 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/work.ksh +chmod 644 ../edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat +chmod 644 ../edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat.OAX +chmod 644 ../edex/data/hdf5/hydroapps/whfs/local/data/geo/topography +chmod 644 ../edex/lib/native/linux32/libpq.so.5.5 +chmod 664 ../awipsShare/hydroapps/check_app_context +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/coord_host.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/county.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/cwaus.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/fg_basin.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/flights.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/forecastpt.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/map_basin.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/rfc_boundary.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/river.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/state.dat +chmod 664 ../awipsShare/hydroapps/geo_data/host/ascii/town.dat +chmod 664 ../awipsShare/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat +chmod 664 ../awipsShare/hydroapps/lib/native/linux32/libgfortran.so.1 +chmod 664 ../awipsShare/hydroapps/precip_proc/bin/DHRgather +chmod 664 ../awipsShare/hydroapps/precip_proc/bin/gribit.LX +chmod 664 ../awipsShare/hydroapps/precip_proc/bin/launch_hpe +chmod 664 ../awipsShare/hydroapps/precip_proc/local/data/app/hpe/projection.con +chmod 664 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib/gfe2grib.txt +chmod 664 ../awipsShare/hydroapps/public/bin/amirunning +chmod 664 ../awipsShare/hydroapps/public/bin/dd_help +chmod 664 ../awipsShare/hydroapps/whfs/bin/load_maxfcst.LX +chmod 664 ../awipsShare/hydroapps/whfs/bin/log4j.xml +chmod 664 ../awipsShare/hydroapps/whfs/bin/run_damcrest +chmod 664 ../awipsShare/hydroapps/whfs/bin/run_report_alarm +chmod 664 ../awipsShare/hydroapps/whfs/bin/run_SiteSpecific +chmod 664 ../awipsShare/hydroapps/whfs/bin/start_fcstservice +chmod 664 ../awipsShare/hydroapps/whfs/bin/start_rivermonitor +chmod 664 ../awipsShare/hydroapps/whfs/local/data/app/damcrest/.vimrc +chmod 664 ../awipsShare/hydroapps/whfs/local/data/geo/basins.dat +chmod 664 ../awipsShare/hydroapps/whfs/local/data/geo/basins.dat.OAX +chmod 664 ../awipsShare/hydroapps/whfs/local/data/geo/topography +chmod 664 ../edex/lib/native/linux32/libgfortran.so.1 +chmod 755 .. +chmod 755 ../adapt +chmod 755 ../adapt/climate +chmod 755 ../adapt/climate/bin +chmod 755 ../adapt/climate/bin/Linux +chmod 755 ../adapt/climate/bin/Linux/ASOS_smDecoder.sh +chmod 755 ../adapt/climate/bin/Linux/catRecordClimateData.sh +chmod 755 ../adapt/climate/bin/Linux/clean_up.sh +chmod 755 ../adapt/climate/bin/Linux/climate +chmod 755 ../adapt/climate/bin/Linux/climate_man +chmod 755 ../adapt/climate/bin/Linux/climate.sh +chmod 755 ../adapt/climate/bin/Linux/create_f6_product +chmod 755 ../adapt/climate/bin/Linux/display.sh +chmod 755 ../adapt/climate/bin/Linux/error.tcl +chmod 755 ../adapt/climate/bin/Linux/free_text.tcl +chmod 755 ../adapt/climate/bin/Linux/init_climate_db +chmod 755 ../adapt/climate/bin/Linux/_main.sh +chmod 755 ../adapt/climate/bin/Linux/qc_climate_db +chmod 755 ../adapt/climate/bin/Linux/set_climate_env.sh +chmod 755 ../adapt/climate/bin/Linux/set_up_climate_runs +chmod 755 ../adapt/climate/bin/Linux/set_up_climate_stations +chmod 755 ../adapt/climate/bin/Linux/startRecordClimate.pl +chmod 755 ../adapt/climate/bin/Linux/stopRecordClimate.pl +chmod 755 ../adapt/climate/bin/Linux/success.tcl +chmod 755 ../adapt/climate/bin/Linux/textwsNotification.tcl +chmod 755 ../adapt/climate/bin/Linux/toggle_cli_vip.py +chmod 755 ../adapt/climate/bin/Linux/wait.tcl +chmod 755 ../adapt/climate/data +chmod 755 ../adapt/climate/data/help +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3 +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3.0 +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libecpg.so.6 +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libecpg.so.6.0 +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libjvm.so +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3 +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3.0 +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/library.ohd.ofs.so +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/library.ohd.pproc.so +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/library.ohd.util.so +chmod 755 ../awipsShare/hydroapps/lib/native/linux32/library.ohd.whfs.so +chmod 755 ../awipsShare/hydroapps/precip_proc/local/data/app/nc2grib +chmod 755 ../edex/data +chmod 755 ../edex/data/hdf5 +chmod 755 ../edex/data/hdf5/hydroapps +chmod 755 ../edex/data/hdf5/hydroapps/bin +chmod 755 ../edex/data/hdf5/hydroapps/bin/runso +chmod 755 ../edex/data/hdf5/hydroapps/data +chmod 755 ../edex/data/hdf5/hydroapps/data/fxa +chmod 755 ../edex/data/hdf5/hydroapps/data/fxa/radar +chmod 755 ../edex/data/hdf5/hydroapps/data/fxa/radar/envData +chmod 755 ../edex/data/hdf5/hydroapps/geo_data +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/host +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/host/ascii +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/host/binary +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/ofstest +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/ofstest/ascii +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/util +chmod 755 ../edex/data/hdf5/hydroapps/geo_data/util/run_create_bas_bound +chmod 755 ../edex/data/hdf5/hydroapps/lib +chmod 755 ../edex/data/hdf5/hydroapps/lib/native +chmod 755 ../edex/data/hdf5/hydroapps/lib/native/linux32 +chmod 755 ../edex/data/hdf5/hydroapps/lib/native/linux32/libjasper.so.1 +chmod 755 ../edex/data/hdf5/hydroapps/lib/native/linux32/library.empty.motif.so +chmod 755 ../edex/data/hdf5/hydroapps/lib/native/linux32/library.ohd.util.so +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/bias_trans.jar +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/DHRgather +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/DPAgather +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/DSPgather +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/gribit.LX +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/precip_station_gen.sql +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/prism.jar +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/process_dpa +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/process_dpafiles +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/process_grib_files +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/process_hpe_grib_files +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/process_rfc_bias +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/purge_hpe_files +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/purge_mpe_files +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/rerun_mpe_fieldgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/ruc.pl.template +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/ruc.tcl +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_biasmesgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_build_hourly +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_basin_format +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_climo_list +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_station_list +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_freezing_station_list +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_climo_lists +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_gage_file +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_station_lists +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_prism +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_topo +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_triangles +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDHR +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDPA +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDSP +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg_fieldgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_dqc_preprocessor +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_level +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_station_setup +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_ffg +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_qpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_gribit +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_hpe_fieldgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_lightning_proc +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_fieldgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_whfs +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/run_post_analysis +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/start_gage_pp +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe_crons +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/start_mpe_editor +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/start_process_dpafiles +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_gage_pp +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe_crons +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_process_dpafiles +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/temperature_station_gen.sql +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_bias +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_qpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/bin +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/bin/mpe_internal_script +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/bin/process_qpe_mosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/bin/run_build_hourly +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/bin/transmit_rfc_qpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/gen_areal_qpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/beam_height +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/climo +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/gage_locations +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/grid_masks +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/help +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/misbin +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/station_lists +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/utiltriangles +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/radclim +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/stage3 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/stage3/help +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_archive +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_decoded +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_error +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_gather +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_archive +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_decoded +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_error +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_gather +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/gpp_input +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/avgrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/gif +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/height +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_gif +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_jpeg +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_netcdf +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_xmrg +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/index +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/lsatpre +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/maxrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/nowcast +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedhr +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedpa +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedsp +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/disagg +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/gage_pp +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/gen_areal_qpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/hpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/lightning_proc +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/misc +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_editor +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_fieldgen +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/process_bias_message +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/siipp +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/avgrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bad_gages +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_input +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_output +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/d2d_files +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/draw_precip +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/edit_polygon +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gageonly +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gagetriangles +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/height +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/index +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield1 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield2 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield3 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locbias +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locspan +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lqmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lsatpre +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/maxrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlqmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mrmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/p3lmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/q2_state_var +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_gif +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_jpeg +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_netcdf +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_sbn +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcbmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcmmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe01 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe06 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe24 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/satpre +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sat_state_var +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sgmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srgmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srmosaic +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/state_var +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_archive +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_decoded +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_error +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage3 +chmod 755 ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage3/post_analysis +chmod 755 ../edex/data/hdf5/hydroapps/public +chmod 755 ../edex/data/hdf5/hydroapps/public/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc +chmod 755 ../edex/data/hdf5/hydroapps/rfc/data +chmod 755 ../edex/data/hdf5/hydroapps/rfc/data/products +chmod 755 ../edex/data/hdf5/hydroapps/rfc/fld +chmod 755 ../edex/data/hdf5/hydroapps/rfc/fld/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/fld/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/fld/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/fldview +chmod 755 ../edex/data/hdf5/hydroapps/rfc/fldview/floodmapdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/grib +chmod 755 ../edex/data/hdf5/hydroapps/rfc/grib/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/grib/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/grib/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb/app-defaults +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb/help_files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/hdb/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/sta_ts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3 +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/lib +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/doc +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/espts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/input +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/input/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/output/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/affg +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/cary +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/define +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grff +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grro +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/prod +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/text +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/user +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/grib +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/help_files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/options +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/options/colors +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/system +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/locks +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/mods +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper_new +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/input +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/input/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/jelkins +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/ofs +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/sys_files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/send_rfc +chmod 755 ../edex/data/hdf5/hydroapps/rfc/send_rfc/data +chmod 755 ../edex/data/hdf5/hydroapps/rfc/send_rfc/data/sbnprods +chmod 755 ../edex/data/hdf5/hydroapps/rfc/send_rfc/data/send +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify/files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify/input +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/verify/scripts +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/data +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/data/localdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/data/shefdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/parameters +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xdat/parameters/groups +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data/localdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data/misc_data +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data/rfcqpf +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data/rfcqpf/nmap +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data/shefdata +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/data/wfoqpf +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/parameters +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xnav/parameters/rules +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/bin +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/bin/ARCHIVE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/bin/RELEASE +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/files +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/hydrographs +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/hydrographs/param +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/output +chmod 755 ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/param +chmod 755 ../edex/data/hdf5/hydroapps/set_hydro_env +chmod 755 ../edex/data/hdf5/hydroapps/shefdecode +chmod 755 ../edex/data/hdf5/hydroapps/shefdecode/bin +chmod 755 ../edex/data/hdf5/hydroapps/shefdecode/input +chmod 755 ../edex/data/hdf5/hydroapps/shefdecode/logs +chmod 755 ../edex/data/hdf5/hydroapps/shefdecode/logs/decoder +chmod 755 ../edex/data/hdf5/hydroapps/shefdecode/logs/product +chmod 755 ../edex/data/hdf5/hydroapps/whfs +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/afos2awips.ksh +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/awips2afos.ksh +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/create_whfs_geodata +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/crs2awips.ksh +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/damcrest.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/fcstservice.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/fldat.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/init_rivermon_tables.ksh +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/load_rpf_backup_msg +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/MiscDialogs.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/pa +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/pdc_pp.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/pdc_pp_test +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/post_remote_CRS_msg +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/print_image +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/process_geoarea +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/process_geoline +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/process_hydro_model_data +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/process_rpf_backup_msg +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/process_shef_msg +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/purge_files +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/rax_apps.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/RiverMonitor.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/Rpf +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup_latest +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_alarm_whfs +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_check_outlier +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_ColorChooserDialog +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_damcrest +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_db_purge +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_floodseq +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_floodseq_interactive +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_hydrobrief +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_metar2shef +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_obsfcst_monitor +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_pdc_pp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_pdc_precip_pp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_pdc_tsl +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_raxdb_sync +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_report_alarm +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_roc_checker +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_rpf_batch +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SiteSpecific +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_decode +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_send +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_transfer +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_MAP_preprocess +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_ofs_extract +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_SAC_state_update +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_UnitHydrographEditor +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/run_vacuum +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/save_image +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/sdbj.LX +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/SiteSpecific.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_fcstservice +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_hydrobase +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_hydroview +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_ldv +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_raxbase +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_rivermonitor +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_riverpro +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/start_timeseries +chmod 755 ../edex/data/hdf5/hydroapps/whfs/bin/timeserieslite.jar +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/bin +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/bin/whfs_editor +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/damcrest +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/hydroview +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/hydroview/help +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/metar2shef +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/rivermon +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/riverpro +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/sshp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/app/timeseries +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/damcrest +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/geo +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/grid +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/grid/misc +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/image +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/import +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/create_gagradloc +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/db_purge +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/floodseq +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/metar2shef +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/misc +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/obsfcst_monitor +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/pdc_pp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/precip_accum +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/qcalarm +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/rivermon +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/riverpro +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/sshp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/log/vacuum +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/metar_input +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/metar_output +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/pdc_pp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/product +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/report +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp/forecast +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp/precip +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/incoming +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ingest_xml +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml +chmod 755 ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/outgoing +chmod 755 ../edex/lib/native/linux32/libecpg_compat.so.3.0 +chmod 755 ../edex/lib/native/linux32/libecpg.so.6.0 +chmod 755 ../edex/lib/native/linux32/libjvm.so +chmod 755 ../edex/lib/native/linux32/libpgtypes.so.3.0 +chmod 755 ../edex/lib/native/linux32/libpq.so.5.1 +chmod 755 ../edex/lib/native/linux32/library.adappt.climate.so +chmod 755 ../edex/lib/native/linux32/library.adappt.climate.ui.so +chmod 755 ../edex/lib/native/linux32/library.adappt.hwr.avn.so +chmod 755 ../edex/lib/native/linux32/library.adappt.hwr.so +chmod 755 ../edex/lib/native/linux32/library.meteorlogical.so +chmod 755 ../edex/lib/native/linux32/library.ohd.ffg.so +chmod 755 ../edex/lib/native/linux32/library.ohd.ofs.so +chmod 755 ../edex/lib/native/linux32/library.ohd.pproc.so +chmod 755 ../edex/lib/native/linux32/library.ohd.util.so +chmod 755 ../edex/lib/native/linux32/library.ohd.whfs.so +chmod 755 ../edex/lib/native/linux32/libXm.so.2.0.1 +chmod 755 ../lib +chmod 755 ../lib/python2.5 +chmod 755 ../lib/python2.5/plat-linux2 +chmod 755 ../lib/python2.5/plat-linux2/hwrdcd.so +chmod 755 ../lib/python2.5/plat-linux2/hwrfmt.so +chmod 755 ../setup/dist.native_permissions.sh +chmod 755 ../setup/dist.native_uninstall.sh +chmod 775 ../awipsShare +chmod 775 ../awipsShare/hydroapps +chmod 775 ../awipsShare/hydroapps/bin +chmod 775 ../awipsShare/hydroapps/bin/runso +chmod 775 ../awipsShare/hydroapps/data +chmod 775 ../awipsShare/hydroapps/data/fxa +chmod 775 ../awipsShare/hydroapps/data/fxa/radar +chmod 775 ../awipsShare/hydroapps/data/fxa/radar/envData +chmod 775 ../awipsShare/hydroapps/ffmp_templates +chmod 775 ../awipsShare/hydroapps/geo_data +chmod 775 ../awipsShare/hydroapps/geo_data/host +chmod 775 ../awipsShare/hydroapps/geo_data/host/ascii +chmod 775 ../awipsShare/hydroapps/geo_data/host/binary +chmod 775 ../awipsShare/hydroapps/geo_data/ofstest +chmod 775 ../awipsShare/hydroapps/geo_data/ofstest/ascii +chmod 775 ../awipsShare/hydroapps/geo_data/util +chmod 775 ../awipsShare/hydroapps/geo_data/util/run_create_bas_bound +chmod 775 ../awipsShare/hydroapps/lib +chmod 775 ../awipsShare/hydroapps/lib/native +chmod 775 ../awipsShare/hydroapps/lib/native/linux32 +chmod 775 ../awipsShare/hydroapps/lib/native/linux32/libjasper.so.1 +chmod 775 ../awipsShare/hydroapps/lib/native/linux32/library.empty.motif.so +chmod 775 ../awipsShare/hydroapps/precip_proc +chmod 775 ../awipsShare/hydroapps/precip_proc/bin +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/bias_trans.jar +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/DPAgather +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/DSPgather +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/precip_station_gen.sql +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/prism.jar +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/process_dpa +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/process_dpafiles +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/process_grib_files +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/process_hpe_grib_files +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/process_rfc_bias +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/purge_hpe_files +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/purge_mpe_files +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/rerun_mpe_fieldgen +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/ruc.pl.template +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/ruc.tcl +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_biasmesgen +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_build_hourly +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_convert_basin_format +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_climo_list +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_station_list +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_copygb +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_freezing_station_list +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_climo_lists +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_gage_file +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_station_lists +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_prism +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_topo +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_create_triangles +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/Run_DecodeDHR +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/Run_DecodeDPA +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/Run_DecodeDSP +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_disagg +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_disagg_fieldgen +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_dqc_preprocessor +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_freezing_level +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_freezing_station_setup +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_gen_areal_ffg +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_gen_areal_qpe +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_gribit +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_hpe_fieldgen +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_lightning_proc +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_mpe_fieldgen +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_mpe_whfs +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_nc2grib +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/run_post_analysis +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/start_gage_pp +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/start_hpe +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/start_hpe_crons +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/start_mpe_editor +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/start_process_dpafiles +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/stop_gage_pp +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/stop_hpe +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/stop_hpe_crons +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/stop_process_dpafiles +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/temperature_station_gen.sql +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/transmit_rfc_bias +chmod 775 ../awipsShare/hydroapps/precip_proc/bin/transmit_rfc_qpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local +chmod 775 ../awipsShare/hydroapps/precip_proc/local/bin +chmod 775 ../awipsShare/hydroapps/precip_proc/local/bin/mpe_internal_script +chmod 775 ../awipsShare/hydroapps/precip_proc/local/bin/process_qpe_mosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/bin/run_build_hourly +chmod 775 ../awipsShare/hydroapps/precip_proc/local/bin/transmit_rfc_qpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/gen_areal_qpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/hpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/beam_height +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/climo +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/gage_locations +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/grid_masks +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/help +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/misbin +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/station_lists +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/utiltriangles +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/radclim +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/stage3 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/app/stage3/help +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dhr_archive +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dhr_decoded +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dhr_error +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dhr_gather +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dsp_archive +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dsp_decoded +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dsp_error +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/dsp_gather +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/gpp_input +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/avgrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/gif +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/height +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_gif +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_jpeg +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_netcdf +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_xmrg +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/index +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/lsatpre +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/maxrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/hpe/nowcast +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/decodedhr +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/decodedpa +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/decodedsp +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/disagg +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/gage_pp +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/gen_areal_qpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/hpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/lightning_proc +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/misc +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/mpe_editor +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/mpe_fieldgen +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/process_bias_message +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/log/siipp +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/avgrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/bad_gages +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_input +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_output +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/bmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/d2d_files +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/fewsgrib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/netcdf_files +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/draw_precip +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/edit_polygon +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/gageonly +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/gagetriangles +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/height +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/index +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/lmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/localfield1 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/localfield2 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/localfield3 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/locbias +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/locspan +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/lqmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/lsatpre +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/maxrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/mlmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/mlqmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/mmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/mrmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/p3lmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_gif +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_jpeg +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_netcdf +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_sbn +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcbmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcmmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe01 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe06 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe24 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/rmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/satpre +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/sat_state_var +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/sgmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/srgmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/srmosaic +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/mpe/state_var +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/stage1_archive +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/stage1_decoded +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/stage1_error +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/stage3 +chmod 775 ../awipsShare/hydroapps/precip_proc/local/data/stage3/post_analysis +chmod 775 ../awipsShare/hydroapps/public +chmod 775 ../awipsShare/hydroapps/public/bin +chmod 775 ../awipsShare/hydroapps/rfc +chmod 775 ../awipsShare/hydroapps/rfc/data +chmod 775 ../awipsShare/hydroapps/rfc/data/products +chmod 775 ../awipsShare/hydroapps/rfc/fld +chmod 775 ../awipsShare/hydroapps/rfc/fld/bin +chmod 775 ../awipsShare/hydroapps/rfc/fld/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/fld/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/fldview +chmod 775 ../awipsShare/hydroapps/rfc/fldview/floodmapdata +chmod 775 ../awipsShare/hydroapps/rfc/grib +chmod 775 ../awipsShare/hydroapps/rfc/grib/bin +chmod 775 ../awipsShare/hydroapps/rfc/grib/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/grib/output +chmod 775 ../awipsShare/hydroapps/rfc/hdb +chmod 775 ../awipsShare/hydroapps/rfc/hdb/app-defaults +chmod 775 ../awipsShare/hydroapps/rfc/hdb/bin +chmod 775 ../awipsShare/hydroapps/rfc/hdb/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/hdb/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/hdb/help_files +chmod 775 ../awipsShare/hydroapps/rfc/hdb/scripts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/data +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/sta_ts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/input +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/input/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3 +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/lib +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/calb/output +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/doc +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/espts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/input +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/input/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/output +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/output/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ens/scripts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/affg +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/cary +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/define +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grff +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grro +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/prod +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/text +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/user +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/output +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/output/grib +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/output/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/icp +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/icp/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/icp/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/icp/scripts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/help_files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/options +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/options/colors +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/scripts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ifp/system +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/locks +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/mods +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper_new +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/input +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/input/oper +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/output +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/output/jelkins +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/ofs +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/sys_files +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/util +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/util/bin +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/util/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/nwsrfs/util/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/send_rfc +chmod 775 ../awipsShare/hydroapps/rfc/send_rfc/data +chmod 775 ../awipsShare/hydroapps/rfc/send_rfc/data/sbnprods +chmod 775 ../awipsShare/hydroapps/rfc/send_rfc/data/send +chmod 775 ../awipsShare/hydroapps/rfc/verify +chmod 775 ../awipsShare/hydroapps/rfc/verify/bin +chmod 775 ../awipsShare/hydroapps/rfc/verify/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/verify/files +chmod 775 ../awipsShare/hydroapps/rfc/verify/input +chmod 775 ../awipsShare/hydroapps/rfc/verify/output +chmod 775 ../awipsShare/hydroapps/rfc/verify/scripts +chmod 775 ../awipsShare/hydroapps/rfc/xdat +chmod 775 ../awipsShare/hydroapps/rfc/xdat/bin +chmod 775 ../awipsShare/hydroapps/rfc/xdat/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/xdat/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/xdat/data +chmod 775 ../awipsShare/hydroapps/rfc/xdat/data/localdata +chmod 775 ../awipsShare/hydroapps/rfc/xdat/data/shefdata +chmod 775 ../awipsShare/hydroapps/rfc/xdat/parameters +chmod 775 ../awipsShare/hydroapps/rfc/xdat/parameters/groups +chmod 775 ../awipsShare/hydroapps/rfc/xdat/parameters/groups/groups +chmod 775 ../awipsShare/hydroapps/rfc/xdat/parameters/groups/test +chmod 775 ../awipsShare/hydroapps/rfc/xdat/parameters/groups/towns_nc +chmod 775 ../awipsShare/hydroapps/rfc/xdat/parameters/pe_map +chmod 775 ../awipsShare/hydroapps/rfc/xnav +chmod 775 ../awipsShare/hydroapps/rfc/xnav/bin +chmod 775 ../awipsShare/hydroapps/rfc/xnav/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/xnav/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data/localdata +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data/misc_data +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data/rfcqpf +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data/rfcqpf/nmap +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data/shefdata +chmod 775 ../awipsShare/hydroapps/rfc/xnav/data/wfoqpf +chmod 775 ../awipsShare/hydroapps/rfc/xnav/parameters +chmod 775 ../awipsShare/hydroapps/rfc/xnav/parameters/rules +chmod 775 ../awipsShare/hydroapps/rfc/xsets +chmod 775 ../awipsShare/hydroapps/rfc/xsets/bin +chmod 775 ../awipsShare/hydroapps/rfc/xsets/bin/ARCHIVE +chmod 775 ../awipsShare/hydroapps/rfc/xsets/bin/RELEASE +chmod 775 ../awipsShare/hydroapps/rfc/xsets/files +chmod 775 ../awipsShare/hydroapps/rfc/xsets/files/oper +chmod 775 ../awipsShare/hydroapps/rfc/xsets/files/oper/hydrographs +chmod 775 ../awipsShare/hydroapps/rfc/xsets/files/oper/hydrographs/param +chmod 775 ../awipsShare/hydroapps/rfc/xsets/files/oper/output +chmod 775 ../awipsShare/hydroapps/rfc/xsets/files/oper/param +chmod 775 ../awipsShare/hydroapps/set_hydro_env +chmod 775 ../awipsShare/hydroapps/shefdecode +chmod 775 ../awipsShare/hydroapps/shefdecode/bin +chmod 775 ../awipsShare/hydroapps/shefdecode/input +chmod 775 ../awipsShare/hydroapps/shefdecode/logs +chmod 775 ../awipsShare/hydroapps/shefdecode/logs/decoder +chmod 775 ../awipsShare/hydroapps/shefdecode/logs/product +chmod 775 ../awipsShare/hydroapps/whfs +chmod 775 ../awipsShare/hydroapps/whfs/bin +chmod 775 ../awipsShare/hydroapps/whfs/bin/afos2awips.ksh +chmod 775 ../awipsShare/hydroapps/whfs/bin/awips2afos.ksh +chmod 775 ../awipsShare/hydroapps/whfs/bin/create_whfs_geodata +chmod 775 ../awipsShare/hydroapps/whfs/bin/crs2awips.ksh +chmod 775 ../awipsShare/hydroapps/whfs/bin/damcrest.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/fcstservice.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/fldat.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/init_rivermon_tables.ksh +chmod 775 ../awipsShare/hydroapps/whfs/bin/load_rpf_backup_msg +chmod 775 ../awipsShare/hydroapps/whfs/bin/MiscDialogs.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/pa +chmod 775 ../awipsShare/hydroapps/whfs/bin/pdc_pp.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/pdc_pp_test +chmod 775 ../awipsShare/hydroapps/whfs/bin/post_remote_CRS_msg +chmod 775 ../awipsShare/hydroapps/whfs/bin/print_image +chmod 775 ../awipsShare/hydroapps/whfs/bin/process_geoarea +chmod 775 ../awipsShare/hydroapps/whfs/bin/process_geoline +chmod 775 ../awipsShare/hydroapps/whfs/bin/process_hydro_model_data +chmod 775 ../awipsShare/hydroapps/whfs/bin/process_rpf_backup_msg +chmod 775 ../awipsShare/hydroapps/whfs/bin/process_shef_msg +chmod 775 ../awipsShare/hydroapps/whfs/bin/purge_files +chmod 775 ../awipsShare/hydroapps/whfs/bin/rax_apps.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/RiverMonitor.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/Rpf +chmod 775 ../awipsShare/hydroapps/whfs/bin/rpf_sendbackup +chmod 775 ../awipsShare/hydroapps/whfs/bin/rpf_sendbackup_latest +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_alarm_whfs +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_check_outlier +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_ColorChooserDialog +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_db_purge +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_floodseq +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_floodseq_interactive +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_hydrobrief +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_metar2shef +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_obsfcst_monitor +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_pdc_pp +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_pdc_precip_pp +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_pdc_tsl +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_raxdb_sync +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_roc_checker +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_rpf_batch +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_SSHP_data_decode +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_SSHP_data_send +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_SSHP_data_transfer +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_SSHP_MAP_preprocess +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_SSHP_ofs_extract +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_SSHP_SAC_state_update +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_UnitHydrographEditor +chmod 775 ../awipsShare/hydroapps/whfs/bin/run_vacuum +chmod 775 ../awipsShare/hydroapps/whfs/bin/save_image +chmod 775 ../awipsShare/hydroapps/whfs/bin/sdbj.LX +chmod 775 ../awipsShare/hydroapps/whfs/bin/SiteSpecific.jar +chmod 775 ../awipsShare/hydroapps/whfs/bin/start_hydrobase +chmod 775 ../awipsShare/hydroapps/whfs/bin/start_hydroview +chmod 775 ../awipsShare/hydroapps/whfs/bin/start_ldv +chmod 775 ../awipsShare/hydroapps/whfs/bin/start_raxbase +chmod 775 ../awipsShare/hydroapps/whfs/bin/start_riverpro +chmod 775 ../awipsShare/hydroapps/whfs/bin/start_timeseries +chmod 775 ../awipsShare/hydroapps/whfs/bin/timeserieslite.jar +chmod 775 ../awipsShare/hydroapps/whfs/local +chmod 775 ../awipsShare/hydroapps/whfs/local/bin +chmod 775 ../awipsShare/hydroapps/whfs/local/bin/whfs_editor +chmod 775 ../awipsShare/hydroapps/whfs/local/data +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/damcrest +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/hydroview +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/hydroview/help +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/metar2shef +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/rivermon +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/riverpro +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/sshp +chmod 775 ../awipsShare/hydroapps/whfs/local/data/app/timeseries +chmod 775 ../awipsShare/hydroapps/whfs/local/data/damcrest +chmod 775 ../awipsShare/hydroapps/whfs/local/data/geo +chmod 775 ../awipsShare/hydroapps/whfs/local/data/grid +chmod 775 ../awipsShare/hydroapps/whfs/local/data/grid/misc +chmod 775 ../awipsShare/hydroapps/whfs/local/data/image +chmod 775 ../awipsShare/hydroapps/whfs/local/data/import +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/create_gagradloc +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/db_purge +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/floodseq +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/metar2shef +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/misc +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/obsfcst_monitor +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/pdc_pp +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/precip_accum +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/qcalarm +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/rivermon +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/riverpro +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/sshp +chmod 775 ../awipsShare/hydroapps/whfs/local/data/log/vacuum +chmod 775 ../awipsShare/hydroapps/whfs/local/data/metar_input +chmod 775 ../awipsShare/hydroapps/whfs/local/data/metar_output +chmod 775 ../awipsShare/hydroapps/whfs/local/data/pdc_pp +chmod 775 ../awipsShare/hydroapps/whfs/local/data/product +chmod 775 ../awipsShare/hydroapps/whfs/local/data/report +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp/forecast +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp/precip +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp_transfer +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/incoming +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/ingest_xml +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml +chmod 775 ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/outgoing +chmod 775 ../edex +chmod 775 ../edex/bin +chmod 775 ../edex/bin/runso +chmod 775 ../edex/lib +chmod 775 ../edex/lib/native +chmod 775 ../edex/lib/native/linux32 +chmod 775 ../edex/lib/native/linux32/libjasper.so.1.0.0 +chmod 775 ../edex/lib/native/linux32/library.empty.motif.so +chmod 775 ../setup +chmod 777 ../adapt/climate/bin/Linux/ASOS_smDecoder +chmod 777 ../adapt/climate/bin/Linux/build_f6 +chmod 777 ../adapt/climate/bin/Linux/create_climate +chmod 777 ../adapt/climate/bin/Linux/display_climate +chmod 777 ../adapt/climate/bin/Linux/do_all_climate +chmod 777 ../adapt/climate/bin/Linux/format_climate +chmod 777 ../adapt/climate/bin/Linux/init_climate +chmod 777 ../adapt/climate/bin/Linux/qc_climate +chmod 777 ../adapt/climate/bin/Linux/recordClimate +chmod 777 ../adapt/climate/bin/Linux/set_up_climate +chmod 777 ../edex/lib/native/linux32/libecpg_compat.so +chmod 777 ../edex/lib/native/linux32/libecpg_compat.so.3 +chmod 777 ../edex/lib/native/linux32/libecpg.so +chmod 777 ../edex/lib/native/linux32/libecpg.so.6 +chmod 777 ../edex/lib/native/linux32/libjasper.so +chmod 777 ../edex/lib/native/linux32/libjasper.so.1 +chmod 777 ../edex/lib/native/linux32/libpgtypes.so +chmod 777 ../edex/lib/native/linux32/libpgtypes.so.3 +chmod 777 ../edex/lib/native/linux32/libpq.so +chmod 777 ../edex/lib/native/linux32/libpq.so.5 +chmod 777 ../edex/lib/native/linux32/libtcl.so +chmod 777 ../edex/lib/native/linux32/libtk.so +chmod 777 ../edex/lib/native/linux32/libXm.so +chmod 777 ../edex/lib/native/linux32/libXm.so.2 +exit 0 diff --git a/nativeLib/files.native/setup/dist.native_uninstall.sh b/nativeLib/files.native/setup/dist.native_uninstall.sh new file mode 100755 index 0000000000..4a55df94df --- /dev/null +++ b/nativeLib/files.native/setup/dist.native_uninstall.sh @@ -0,0 +1,1381 @@ +cd $(dirname $0) +rm -f ../lib/python2.5/plat-linux2/hwrdcd.so +rm -f ../lib/python2.5/plat-linux2/hwrfmt.so +rm -f ../setup/dist.native_permissions.sh +rm -f ../setup/dist.native_uninstall.sh +rm -f ../adapt/climate/data/error_blast.gif +rm -f ../adapt/climate/data/global_day +rm -f ../adapt/climate/data/clibrwse.conf +rm -f ../adapt/climate/data/help/delete_products.gif +rm -f ../adapt/climate/data/help/report_format.gif +rm -f ../adapt/climate/data/help/dispmethods.gif +rm -f ../adapt/climate/data/help/edit_data.gif +rm -f ../adapt/climate/data/help/stationlistnwws.html +rm -f ../adapt/climate/data/help/f6.html +rm -f ../adapt/climate/data/help/stationnwws.html +rm -f ../adapt/climate/data/help/norms_extremes_mon.gif +rm -f ../adapt/climate/data/help/error_blast.gif +rm -f ../adapt/climate/data/help/confignwr.html +rm -f ../adapt/climate/data/help/climate_reports_setup.gif +rm -f ../adapt/climate/data/help/usr_defined_values.gif +rm -f ../adapt/climate/data/help/annual_periods.gif +rm -f ../adapt/climate/data/help/climate_master.gif +rm -f ../adapt/climate/data/help/nwr_config.gif +rm -f ../adapt/climate/data/help/import_climate.html +rm -f ../adapt/climate/data/help/threshnwr.html +rm -f ../adapt/climate/data/help/threshnwws.html +rm -f ../adapt/climate/data/help/tstm.gif +rm -f ../adapt/climate/data/help/import_climate.gif +rm -f ../adapt/climate/data/help/helpnwws.html +rm -f ../adapt/climate/data/help/missing.html +rm -f ../adapt/climate/data/help/productnwr.html +rm -f ../adapt/climate/data/help/f6date.gif +rm -f ../adapt/climate/data/help/report_format_MON.gif +rm -f ../adapt/climate/data/help/execute_AM_PM_climate.html +rm -f ../adapt/climate/data/help/calfrop.gif +rm -f ../adapt/climate/data/help/column.gif +rm -f ../adapt/climate/data/help/default.html +rm -f ../adapt/climate/data/help/product_properties.gif +rm -f ../adapt/climate/data/help/delete_climo_products.html +rm -f ../adapt/climate/data/help/stationlistnwr.html +rm -f ../adapt/climate/data/help/norms_extremes2.gif +rm -f ../adapt/climate/data/help/edit_climate.gif +rm -f ../adapt/climate/data/help/dotblue.gif +rm -f ../adapt/climate/data/help/select_products.gif +rm -f ../adapt/climate/data/help/broadcast.html +rm -f ../adapt/climate/data/help/imported_data.gif +rm -f ../adapt/climate/data/help/report_periods.gif +rm -f ../adapt/climate/data/help/climate_report_setup.html +rm -f ../adapt/climate/data/help/norms_extremes1.gif +rm -f ../adapt/climate/data/help/bc_storm.gif +rm -f ../adapt/climate/data/help/mon_disp.gif +rm -f ../adapt/climate/data/help/select_climate_run.gif +rm -f ../adapt/climate/data/help/arrow.gif +rm -f ../adapt/climate/data/help/display.gif +rm -f ../adapt/climate/data/help/retrieve.html +rm -f ../adapt/climate/data/help/climo_prefs.html +rm -f ../adapt/climate/data/help/configs.html +rm -f ../adapt/climate/data/help/awip_ban.gif +rm -f ../adapt/climate/data/help/select_stations.html +rm -f ../adapt/climate/data/help/climate_map.gif +rm -f ../adapt/climate/data/help/confignwws.html +rm -f ../adapt/climate/data/help/climo_prefs.gif +rm -f ../adapt/climate/data/help/qcmethods.gif +rm -f ../adapt/climate/data/help/helpnwr.html +rm -f ../adapt/climate/data/help/productnwws.html +rm -f ../adapt/climate/data/help/climo_help.html +rm -f ../adapt/climate/data/help/stationnwr.html +rm -f ../adapt/climate/data/help/nwws_config.gif +rm -f ../adapt/climate/data/help/hour_clim.gif +rm -f ../adapt/climate/data/help/initialize_climate.html +rm -f ../adapt/climate/data/help/select_stations.gif +rm -f ../adapt/climate/data/help/report_format.html +rm -f ../adapt/climate/data/help/notequal.gif +rm -f ../adapt/climate/data/help/edit_data.html +rm -f ../adapt/climate/data/clinwws.conf +rm -f ../adapt/climate/data/hour_clim.gif +rm -f ../adapt/climate/bin/Linux/stopRecordClimate.pl +rm -f ../adapt/climate/bin/Linux/set_up_climate_runs +rm -f ../adapt/climate/bin/Linux/ASOS_smDecoder.sh +rm -f ../adapt/climate/bin/Linux/set_climate_env.sh +rm -f ../adapt/climate/bin/Linux/success.tcl +rm -f ../adapt/climate/bin/Linux/catRecordClimateData.sh +rm -f ../adapt/climate/bin/Linux/wait.tcl +rm -f ../adapt/climate/bin/Linux/textwsNotification.tcl +rm -f ../adapt/climate/bin/Linux/toggle_cli_vip.py +rm -f ../adapt/climate/bin/Linux/climate.sh +rm -f ../adapt/climate/bin/Linux/error.tcl +rm -f ../adapt/climate/bin/Linux/_main.sh +rm -f ../adapt/climate/bin/Linux/display.sh +rm -f ../adapt/climate/bin/Linux/climate_man +rm -f ../adapt/climate/bin/Linux/init_climate_db +rm -f ../adapt/climate/bin/Linux/startRecordClimate.pl +rm -f ../adapt/climate/bin/Linux/create_f6_product +rm -f ../adapt/climate/bin/Linux/climate +rm -f ../adapt/climate/bin/Linux/qc_climate_db +rm -f ../adapt/climate/bin/Linux/clean_up.sh +rm -f ../adapt/climate/bin/Linux/set_up_climate_stations +rm -f ../adapt/climate/bin/Linux/free_text.tcl +rm -f ../edex/lib/native/linux32/library.ohd.ofs.so +rm -f ../edex/lib/native/linux32/libtk8.5.so +rm -f ../edex/lib/native/linux32/libpq.so.5.1 +rm -f ../edex/lib/native/linux32/libXm.so.2.0.1 +rm -f ../edex/lib/native/linux32/libgfortran.so.1 +rm -f ../edex/lib/native/linux32/library.meteorlogical.so +rm -f ../edex/lib/native/linux32/library.adappt.climate.ui.so +rm -f ../edex/lib/native/linux32/libjasper.so.1.0.0 +rm -f ../edex/lib/native/linux32/library.adappt.hwr.avn.so +rm -f ../edex/lib/native/linux32/libecpg.so.6.0 +rm -f ../edex/lib/native/linux32/libjvm.so +rm -f ../edex/lib/native/linux32/library.empty.motif.so +rm -f ../edex/lib/native/linux32/library.ohd.ffg.so +rm -f ../edex/lib/native/linux32/library.ohd.util.so +rm -f ../edex/lib/native/linux32/library.adappt.climate.so +rm -f ../edex/lib/native/linux32/library.adappt.hwr.so +rm -f ../edex/lib/native/linux32/library.ohd.whfs.so +rm -f ../edex/lib/native/linux32/libpq.so.5.5 +rm -f ../edex/lib/native/linux32/libtcl8.5.so +rm -f ../edex/lib/native/linux32/library.ohd.pproc.so +rm -f ../edex/lib/native/linux32/libpgtypes.so.3.0 +rm -f ../edex/lib/native/linux32/libecpg_compat.so.3.0 +rm -f ../edex/data/hdf5/hydroapps/lib/native/linux32/libgfortran.so.1 +rm -f ../edex/data/hdf5/hydroapps/lib/native/linux32/library.empty.motif.so +rm -f ../edex/data/hdf5/hydroapps/lib/native/linux32/libjasper.so.1 +rm -f ../edex/data/hdf5/hydroapps/lib/native/linux32/library.ohd.util.so +rm -f ../edex/data/hdf5/hydroapps/set_hydro_env +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe/projection.con +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/bin/transmit_rfc_qpe +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/bin/mpe_internal_script +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/bin/run_build_hourly +rm -f ../edex/data/hdf5/hydroapps/precip_proc/local/bin/process_qpe_mosaic +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/temperature_station_gen.sql +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe_crons +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_gribit +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_qpe +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_dqc_preprocessor +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_whfs +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDSP +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/start_process_dpafiles +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_qpe +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_topo +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/send_message.py +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/process_dpa +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_gen_areal_ffg +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_gage_file +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/purge_mpe_files +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_post_analysis +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/process_grib_files +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_station_lists +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDPA +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/start_gage_pp +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_climo_lists +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_station_list +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_station_setup +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/purge_hpe_files +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/precip_station_gen.sql +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/start_hpe +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/DHRgather +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_triangles +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_prism +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_hpe_fieldgen +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/process_dpafiles +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe_crons +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/prism.jar +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg_fieldgen +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/ruc.tcl +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_freezing_level +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/DSPgather +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/transmit_rfc_bias +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/rerun_mpe_fieldgen +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_disagg +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_lightning_proc +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_create_freezing_station_list +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/bias_trans.jar +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_gage_pp +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_hpe +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/gribit.LX +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/process_rfc_bias +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/Run_DecodeDHR +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_dqc_climo_list +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/start_mpe_editor +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_build_hourly +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/ruc.pl.template +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/DPAgather +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/stop_process_dpafiles +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_biasmesgen +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/process_hpe_grib_files +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_mpe_fieldgen +rm -f ../edex/data/hdf5/hydroapps/precip_proc/bin/run_convert_basin_format +rm -f ../edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat +rm -f ../edex/data/hdf5/hydroapps/whfs/local/data/geo/basins.dat.OAX +rm -f ../edex/data/hdf5/hydroapps/whfs/local/data/geo/topography +rm -f ../edex/data/hdf5/hydroapps/whfs/local/bin/whfs_editor +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/save_image +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_rpf_batch +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/print_image +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_pdc_pp +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/awips2afos.ksh +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/process_shef_msg +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_riverpro +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/RiverMonitor.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_hydroview +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_floodseq +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/damcrest.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_raxbase +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_damcrest +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/afos2awips.ksh +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_decode +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/MiscDialogs.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/pdc_pp_test +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/post_remote_CRS_msg +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/sdbj.LX +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_metar2shef +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_db_purge +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_raxdb_sync +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_obsfcst_monitor +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/fldat.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_transfer +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_timeseries +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_ColorChooserDialog +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/crs2awips.ksh +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SiteSpecific +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/init_rivermon_tables.ksh +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/rpf_sendbackup_latest +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_fcstservice +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/pdc_pp.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/process_hydro_model_data +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_report_alarm +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_floodseq_interactive +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/fcstservice.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/process_geoarea +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_vacuum +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_SAC_state_update +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_ldv +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/SiteSpecific.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_alarm_whfs +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_data_send +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_UnitHydrographEditor +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_pdc_precip_pp +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/purge_files +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/Rpf +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_rivermonitor +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_roc_checker +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_hydrobrief +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/process_rpf_backup_msg +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/load_rpf_backup_msg +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_check_outlier +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_pdc_tsl +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_MAP_preprocess +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/process_geoline +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/rax_apps.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/start_hydrobase +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/timeserieslite.jar +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/create_whfs_geodata +rm -f ../edex/data/hdf5/hydroapps/whfs/bin/run_SSHP_ofs_extract +rm -f ../edex/data/hdf5/hydroapps/public/bin/amirunning +rm -f ../edex/data/hdf5/hydroapps/public/bin/dd_help +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/ofs +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/work.ksh +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts/ffg +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/include_me.ksh +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid +rm -f ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid +rm -f ../edex/data/hdf5/hydroapps/bin/runso +rm -f ../edex/data/hdf5/hydroapps/geo_data/util/run_create_bas_bound +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/town.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/map_basin.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/county.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/cwaus.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/state.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/coord_host.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/fg_basin.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/forecastpt.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/rfc_boundary.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/flights.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/host/ascii/river.dat +rm -f ../edex/data/hdf5/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat +rm -f ../edex/bin/runso +rm -f ../awipsShare/hydroapps/lib/native/linux32/library.ohd.ofs.so +rm -f ../awipsShare/hydroapps/lib/native/linux32/libgfortran.so.1 +rm -f ../awipsShare/hydroapps/lib/native/linux32/libecpg.so.6 +rm -f ../awipsShare/hydroapps/lib/native/linux32/libecpg.so.6.0 +rm -f ../awipsShare/hydroapps/lib/native/linux32/libjvm.so +rm -f ../awipsShare/hydroapps/lib/native/linux32/library.empty.motif.so +rm -f ../awipsShare/hydroapps/lib/native/linux32/libjasper.so.1 +rm -f ../awipsShare/hydroapps/lib/native/linux32/library.ohd.util.so +rm -f ../awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3 +rm -f ../awipsShare/hydroapps/lib/native/linux32/library.ohd.whfs.so +rm -f ../awipsShare/hydroapps/lib/native/linux32/library.ohd.pproc.so +rm -f ../awipsShare/hydroapps/lib/native/linux32/libpgtypes.so.3.0 +rm -f ../awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3 +rm -f ../awipsShare/hydroapps/lib/native/linux32/libecpg_compat.so.3.0 +rm -f ../awipsShare/hydroapps/set_hydro_env +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/nc2grib/gfe2grib.txt +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/hpe/projection.con +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib/gfe2grib.txt +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_mar +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_mar +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_nov +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_nov +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_ann +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_sep +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_nov +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jul +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_sep +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_may +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jun +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_feb +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_ann +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jul +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_aug +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jan +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_jul +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_may +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jun +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jan +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_mar +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_dec +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_dec +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_aug +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_apr +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_may +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_oct +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_apr +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_oct +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_dec +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_sep +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_jan +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_feb +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_ann +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_aug +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_oct +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_min_temp_oax_jun +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_mean_precip_oax_feb +rm -f ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism/prism_max_temp_oax_apr +rm -f ../awipsShare/hydroapps/precip_proc/local/bin/transmit_rfc_qpe +rm -f ../awipsShare/hydroapps/precip_proc/local/bin/mpe_internal_script +rm -f ../awipsShare/hydroapps/precip_proc/local/bin/run_build_hourly +rm -f ../awipsShare/hydroapps/precip_proc/local/bin/process_qpe_mosaic +rm -f ../awipsShare/hydroapps/precip_proc/bin/temperature_station_gen.sql +rm -f ../awipsShare/hydroapps/precip_proc/bin/start_hpe_crons +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_gribit +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_gen_areal_qpe +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_dqc_preprocessor +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_mpe_whfs +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_fieldgen_disagg_fieldgen +rm -f ../awipsShare/hydroapps/precip_proc/bin/Run_DecodeDSP +rm -f ../awipsShare/hydroapps/precip_proc/bin/start_process_dpafiles +rm -f ../awipsShare/hydroapps/precip_proc/bin/transmit_rfc_qpe +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_topo +rm -f ../awipsShare/hydroapps/precip_proc/bin/process_dpa +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_gen_areal_ffg +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_gage_file +rm -f ../awipsShare/hydroapps/precip_proc/bin/purge_mpe_files +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_post_analysis +rm -f ../awipsShare/hydroapps/precip_proc/bin/process_grib_files +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_station_lists +rm -f ../awipsShare/hydroapps/precip_proc/bin/Run_DecodeDPA +rm -f ../awipsShare/hydroapps/precip_proc/bin/start_gage_pp +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_climo_lists +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_station_list +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_freezing_station_setup +rm -f ../awipsShare/hydroapps/precip_proc/bin/purge_hpe_files +rm -f ../awipsShare/hydroapps/precip_proc/bin/precip_station_gen.sql +rm -f ../awipsShare/hydroapps/precip_proc/bin/start_hpe +rm -f ../awipsShare/hydroapps/precip_proc/bin/DHRgather +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_triangles +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_prism +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_hpe_fieldgen +rm -f ../awipsShare/hydroapps/precip_proc/bin/process_dpafiles +rm -f ../awipsShare/hydroapps/precip_proc/bin/stop_hpe_crons +rm -f ../awipsShare/hydroapps/precip_proc/bin/prism.jar +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_disagg_fieldgen +rm -f ../awipsShare/hydroapps/precip_proc/bin/launch_hpe +rm -f ../awipsShare/hydroapps/precip_proc/bin/ruc.tcl +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_freezing_level +rm -f ../awipsShare/hydroapps/precip_proc/bin/DSPgather +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_mpe_beam_height_file +rm -f ../awipsShare/hydroapps/precip_proc/bin/transmit_rfc_bias +rm -f ../awipsShare/hydroapps/precip_proc/bin/rerun_mpe_fieldgen +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_disagg +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_lightning_proc +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_create_freezing_station_list +rm -f ../awipsShare/hydroapps/precip_proc/bin/bias_trans.jar +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_copygb +rm -f ../awipsShare/hydroapps/precip_proc/bin/stop_gage_pp +rm -f ../awipsShare/hydroapps/precip_proc/bin/stop_hpe +rm -f ../awipsShare/hydroapps/precip_proc/bin/hourly_precip_station_gen.sql +rm -f ../awipsShare/hydroapps/precip_proc/bin/gribit.LX +rm -f ../awipsShare/hydroapps/precip_proc/bin/process_rfc_bias +rm -f ../awipsShare/hydroapps/precip_proc/bin/Run_DecodeDHR +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_convert_dqc_climo_list +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_nc2grib +rm -f ../awipsShare/hydroapps/precip_proc/bin/start_mpe_editor +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_build_hourly +rm -f ../awipsShare/hydroapps/precip_proc/bin/ruc.pl.template +rm -f ../awipsShare/hydroapps/precip_proc/bin/DPAgather +rm -f ../awipsShare/hydroapps/precip_proc/bin/stop_process_dpafiles +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_biasmesgen +rm -f ../awipsShare/hydroapps/precip_proc/bin/process_hpe_grib_files +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_mpe_fieldgen +rm -f ../awipsShare/hydroapps/precip_proc/bin/run_convert_basin_format +rm -f ../awipsShare/hydroapps/whfs/local/data/app/damcrest/.vimrc +rm -f ../awipsShare/hydroapps/whfs/local/data/geo/basins.dat +rm -f ../awipsShare/hydroapps/whfs/local/data/geo/basins.dat.OAX +rm -f ../awipsShare/hydroapps/whfs/local/data/geo/topography +rm -f ../awipsShare/hydroapps/whfs/local/bin/whfs_editor +rm -f ../awipsShare/hydroapps/whfs/bin/save_image +rm -f ../awipsShare/hydroapps/whfs/bin/run_rpf_batch +rm -f ../awipsShare/hydroapps/whfs/bin/print_image +rm -f ../awipsShare/hydroapps/whfs/bin/run_pdc_pp +rm -f ../awipsShare/hydroapps/whfs/bin/awips2afos.ksh +rm -f ../awipsShare/hydroapps/whfs/bin/process_shef_msg +rm -f ../awipsShare/hydroapps/whfs/bin/start_riverpro +rm -f ../awipsShare/hydroapps/whfs/bin/RiverMonitor.jar +rm -f ../awipsShare/hydroapps/whfs/bin/log4j.xml +rm -f ../awipsShare/hydroapps/whfs/bin/start_hydroview +rm -f ../awipsShare/hydroapps/whfs/bin/run_floodseq +rm -f ../awipsShare/hydroapps/whfs/bin/damcrest.jar +rm -f ../awipsShare/hydroapps/whfs/bin/start_raxbase +rm -f ../awipsShare/hydroapps/whfs/bin/run_damcrest +rm -f ../awipsShare/hydroapps/whfs/bin/afos2awips.ksh +rm -f ../awipsShare/hydroapps/whfs/bin/run_SSHP_data_decode +rm -f ../awipsShare/hydroapps/whfs/bin/MiscDialogs.jar +rm -f ../awipsShare/hydroapps/whfs/bin/pdc_pp_test +rm -f ../awipsShare/hydroapps/whfs/bin/post_remote_CRS_msg +rm -f ../awipsShare/hydroapps/whfs/bin/rpf_sendbackup +rm -f ../awipsShare/hydroapps/whfs/bin/sdbj.LX +rm -f ../awipsShare/hydroapps/whfs/bin/run_metar2shef +rm -f ../awipsShare/hydroapps/whfs/bin/run_db_purge +rm -f ../awipsShare/hydroapps/whfs/bin/run_raxdb_sync +rm -f ../awipsShare/hydroapps/whfs/bin/run_obsfcst_monitor +rm -f ../awipsShare/hydroapps/whfs/bin/fldat.jar +rm -f ../awipsShare/hydroapps/whfs/bin/run_SSHP_data_transfer +rm -f ../awipsShare/hydroapps/whfs/bin/start_timeseries +rm -f ../awipsShare/hydroapps/whfs/bin/run_ColorChooserDialog +rm -f ../awipsShare/hydroapps/whfs/bin/crs2awips.ksh +rm -f ../awipsShare/hydroapps/whfs/bin/run_SiteSpecific +rm -f ../awipsShare/hydroapps/whfs/bin/init_rivermon_tables.ksh +rm -f ../awipsShare/hydroapps/whfs/bin/rpf_sendbackup_latest +rm -f ../awipsShare/hydroapps/whfs/bin/start_fcstservice +rm -f ../awipsShare/hydroapps/whfs/bin/pdc_pp.jar +rm -f ../awipsShare/hydroapps/whfs/bin/process_hydro_model_data +rm -f ../awipsShare/hydroapps/whfs/bin/run_report_alarm +rm -f ../awipsShare/hydroapps/whfs/bin/run_floodseq_interactive +rm -f ../awipsShare/hydroapps/whfs/bin/fcstservice.jar +rm -f ../awipsShare/hydroapps/whfs/bin/process_geoarea +rm -f ../awipsShare/hydroapps/whfs/bin/run_vacuum +rm -f ../awipsShare/hydroapps/whfs/bin/run_SSHP_SAC_state_update +rm -f ../awipsShare/hydroapps/whfs/bin/load_maxfcst.LX +rm -f ../awipsShare/hydroapps/whfs/bin/start_ldv +rm -f ../awipsShare/hydroapps/whfs/bin/SiteSpecific.jar +rm -f ../awipsShare/hydroapps/whfs/bin/run_alarm_whfs +rm -f ../awipsShare/hydroapps/whfs/bin/run_SSHP_data_send +rm -f ../awipsShare/hydroapps/whfs/bin/run_UnitHydrographEditor +rm -f ../awipsShare/hydroapps/whfs/bin/run_pdc_precip_pp +rm -f ../awipsShare/hydroapps/whfs/bin/purge_files +rm -f ../awipsShare/hydroapps/whfs/bin/Rpf +rm -f ../awipsShare/hydroapps/whfs/bin/start_rivermonitor +rm -f ../awipsShare/hydroapps/whfs/bin/run_roc_checker +rm -f ../awipsShare/hydroapps/whfs/bin/run_hydrobrief +rm -f ../awipsShare/hydroapps/whfs/bin/process_rpf_backup_msg +rm -f ../awipsShare/hydroapps/whfs/bin/load_rpf_backup_msg +rm -f ../awipsShare/hydroapps/whfs/bin/run_check_outlier +rm -f ../awipsShare/hydroapps/whfs/bin/run_pdc_tsl +rm -f ../awipsShare/hydroapps/whfs/bin/run_SSHP_MAP_preprocess +rm -f ../awipsShare/hydroapps/whfs/bin/process_geoline +rm -f ../awipsShare/hydroapps/whfs/bin/rax_apps.jar +rm -f ../awipsShare/hydroapps/whfs/bin/start_hydrobase +rm -f ../awipsShare/hydroapps/whfs/bin/timeserieslite.jar +rm -f ../awipsShare/hydroapps/whfs/bin/create_whfs_geodata +rm -f ../awipsShare/hydroapps/whfs/bin/run_SSHP_ofs_extract +rm -f ../awipsShare/hydroapps/public/bin/amirunning +rm -f ../awipsShare/hydroapps/public/bin/dd_help +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/ofs +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_input_group +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/create_files_group +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts/include_hydro_env.sh +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcst +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/batchpst +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/prdutil +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppinit +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/reorder +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/espinit +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ppdutil +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filesize +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/filecrat +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpost +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/include_hydro_env.sh +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/goesdb +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/shefpars +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/sasmdb +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/ndfd2rfs +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE/fcinit +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_binxmit +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg_testit +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts/ffg +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/prodgen +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/zgrid +rm -f ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE/ffguid +rm -f ../awipsShare/hydroapps/rfc/xdat/parameters/pe_map +rm -f ../awipsShare/hydroapps/rfc/xdat/parameters/groups/groups +rm -f ../awipsShare/hydroapps/rfc/xdat/parameters/groups/test +rm -f ../awipsShare/hydroapps/rfc/xdat/parameters/groups/towns_nc +rm -f ../awipsShare/hydroapps/bin/runso +rm -f ../awipsShare/hydroapps/geo_data/util/run_create_bas_bound +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/town.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/map_basin.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/county.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/cwaus.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/state.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/coord_host.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/fg_basin.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/forecastpt.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/rfc_boundary.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/flights.dat +rm -f ../awipsShare/hydroapps/geo_data/host/ascii/river.dat +rm -f ../awipsShare/hydroapps/geo_data/ofstest/ascii/coord_ofstest.dat +rm -f ../awipsShare/hydroapps/check_app_context +unlink ../adapt/climate/bin/Linux/create_climate +unlink ../adapt/climate/bin/Linux/do_all_climate +unlink ../adapt/climate/bin/Linux/recordClimate +unlink ../adapt/climate/bin/Linux/init_climate +unlink ../adapt/climate/bin/Linux/format_climate +unlink ../adapt/climate/bin/Linux/ASOS_smDecoder +unlink ../adapt/climate/bin/Linux/qc_climate +unlink ../adapt/climate/bin/Linux/display_climate +unlink ../adapt/climate/bin/Linux/build_f6 +unlink ../adapt/climate/bin/Linux/set_up_climate +unlink ../edex/lib/native/linux32/libtk.so +unlink ../edex/lib/native/linux32/libecpg.so.6 +unlink ../edex/lib/native/linux32/libecpg.so +unlink ../edex/lib/native/linux32/libtcl.so +unlink ../edex/lib/native/linux32/libjasper.so.1 +unlink ../edex/lib/native/linux32/libXm.so.2 +unlink ../edex/lib/native/linux32/libpq.so.5 +unlink ../edex/lib/native/linux32/libpgtypes.so.3 +unlink ../edex/lib/native/linux32/libXm.so +unlink ../edex/lib/native/linux32/libpgtypes.so +unlink ../edex/lib/native/linux32/libjasper.so +unlink ../edex/lib/native/linux32/libpq.so +unlink ../edex/lib/native/linux32/libecpg_compat.so +unlink ../edex/lib/native/linux32/libecpg_compat.so.3 +rmdir ../lib/python2.5/plat-linux2 +rmdir ../lib/python2.5 +rmdir ../lib +rmdir ../setup +rmdir ../adapt/climate/data/help +rmdir ../adapt/climate/data +rmdir ../adapt/climate/bin/Linux +rmdir ../adapt/climate/bin +rmdir ../adapt/climate +rmdir ../adapt +rmdir ../edex/lib/native/linux32 +rmdir ../edex/lib/native +rmdir ../edex/lib +rmdir ../edex/data/hdf5/hydroapps/lib/native/linux32 +rmdir ../edex/data/hdf5/hydroapps/lib/native +rmdir ../edex/data/hdf5/hydroapps/lib +rmdir ../edex/data/hdf5/hydroapps/data/fxa/radar/envData +rmdir ../edex/data/hdf5/hydroapps/data/fxa/radar +rmdir ../edex/data/hdf5/hydroapps/data/fxa +rmdir ../edex/data/hdf5/hydroapps/data +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_archive +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_archive +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedsp +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/disagg +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_editor +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/process_bias_message +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/hpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/gen_areal_qpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/gage_pp +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/siipp +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedhr +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/mpe_fieldgen +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/lightning_proc +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/misc +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log/decodedpa +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/log +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_decoded +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_error +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/gpp_input +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_gather +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage3/post_analysis +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage3 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/gif +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic/grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ermosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/avgrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/height +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/dhrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/index +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/lsatpre +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/ebmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_gif +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_netcdf +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_jpeg +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/nowcast +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/bdhrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/hpe_xmrg +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe/maxrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/hpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield3 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_input +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/avgrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/height +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/index +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lsatpre +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlqmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield1 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcbmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gageonly +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe24 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_jpeg +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sgmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_gif +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/d2d_files +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/precip +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/dailyQC +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/gagetriangles +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/q2_state_var +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/sat_state_var +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/srgmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bias_message_output +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locspan +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcmmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/state_var +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/satpre +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/p3lmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_netcdf +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe01 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_sbn +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/edit_polygon +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/locbias +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe06 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bad_gages +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/draw_precip +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/mlmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/lqmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/localfield2 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/bmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe/maxrmosaic +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/mpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_decoded +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_decoded +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_error +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dsp_archive +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/radclim +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/stage3/help +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/stage3 +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/hpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/grid_masks +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/misbin +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/utiltriangles +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/gage_locations +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/help +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/climo +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/beam_height +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/prism +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe/station_lists +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/mpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app/gen_areal_qpe +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/app +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/stage1_error +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data/dhr_gather +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/data +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local/bin +rmdir ../edex/data/hdf5/hydroapps/precip_proc/local +rmdir ../edex/data/hdf5/hydroapps/precip_proc/bin +rmdir ../edex/data/hdf5/hydroapps/precip_proc +rmdir ../edex/data/hdf5/hydroapps/shefdecode/input +rmdir ../edex/data/hdf5/hydroapps/shefdecode/logs/decoder +rmdir ../edex/data/hdf5/hydroapps/shefdecode/logs/product +rmdir ../edex/data/hdf5/hydroapps/shefdecode/logs +rmdir ../edex/data/hdf5/hydroapps/shefdecode/bin +rmdir ../edex/data/hdf5/hydroapps/shefdecode +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/incoming +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/outgoing +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer/ingest_xml +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp_transfer +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/grid/misc +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/grid +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/metar_input +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/metar_output +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/qcalarm +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/db_purge +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/vacuum +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/riverpro +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/rivermon +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/create_gagradloc +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/precip_accum +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/obsfcst_monitor +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/sshp +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/pdc_pp +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/metar2shef +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/floodseq +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log/misc +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/log +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/image +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/report +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/import +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp/precip +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp/forecast +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/sshp +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/riverpro +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/rivermon +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/timeseries +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/sshp +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/hydroview/help +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/hydroview +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/damcrest +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app/metar2shef +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/app +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/pdc_pp +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/damcrest +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/geo +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data/product +rmdir ../edex/data/hdf5/hydroapps/whfs/local/data +rmdir ../edex/data/hdf5/hydroapps/whfs/local/bin +rmdir ../edex/data/hdf5/hydroapps/whfs/local +rmdir ../edex/data/hdf5/hydroapps/whfs/bin/pa +rmdir ../edex/data/hdf5/hydroapps/whfs/bin +rmdir ../edex/data/hdf5/hydroapps/whfs +rmdir ../edex/data/hdf5/hydroapps/public/bin +rmdir ../edex/data/hdf5/hydroapps/public +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb/app-defaults +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb/help_files +rmdir ../edex/data/hdf5/hydroapps/rfc/hdb +rmdir ../edex/data/hdf5/hydroapps/rfc/data/products +rmdir ../edex/data/hdf5/hydroapps/rfc/data +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/param +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/output +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/hydrographs/param +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper/hydrographs +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/files/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets/files +rmdir ../edex/data/hdf5/hydroapps/rfc/xsets +rmdir ../edex/data/hdf5/hydroapps/rfc/verify/output +rmdir ../edex/data/hdf5/hydroapps/rfc/verify/input +rmdir ../edex/data/hdf5/hydroapps/rfc/verify/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/verify/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/verify/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/verify/files +rmdir ../edex/data/hdf5/hydroapps/rfc/verify +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/jelkins +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/output +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/input/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/input +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper_new +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/mods +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs/files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ofs +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/doc +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/sys_files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/grib +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/output +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/affg +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grro +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/user +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/cary +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grff +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/text +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/prod +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/define +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg/files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ffg +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/util +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/icp +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/options/colors +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/options +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/system +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp/help_files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ifp +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/output/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/output +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/input/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/input +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/scripts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/espts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens/files +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/ens +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/lib +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/output +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/sta_ts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data/area_ts +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/data +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3 +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input/oper +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/input +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/calb +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs/locks +rmdir ../edex/data/hdf5/hydroapps/rfc/nwsrfs +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/parameters/rules +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/parameters +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data/wfoqpf +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data/localdata +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data/shefdata +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data/misc_data +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data/rfcqpf/nmap +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data/rfcqpf +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/data +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/xnav +rmdir ../edex/data/hdf5/hydroapps/rfc/fldview/floodmapdata +rmdir ../edex/data/hdf5/hydroapps/rfc/fldview +rmdir ../edex/data/hdf5/hydroapps/rfc/grib/output +rmdir ../edex/data/hdf5/hydroapps/rfc/grib/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/grib/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/grib +rmdir ../edex/data/hdf5/hydroapps/rfc/send_rfc/data/sbnprods +rmdir ../edex/data/hdf5/hydroapps/rfc/send_rfc/data/send +rmdir ../edex/data/hdf5/hydroapps/rfc/send_rfc/data +rmdir ../edex/data/hdf5/hydroapps/rfc/send_rfc +rmdir ../edex/data/hdf5/hydroapps/rfc/fld/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/fld/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/fld/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/fld +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/parameters/groups +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/parameters +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/data/localdata +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/data/shefdata +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/data +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/bin/ARCHIVE +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/bin/RELEASE +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat/bin +rmdir ../edex/data/hdf5/hydroapps/rfc/xdat +rmdir ../edex/data/hdf5/hydroapps/rfc +rmdir ../edex/data/hdf5/hydroapps/bin +rmdir ../edex/data/hdf5/hydroapps/geo_data/util +rmdir ../edex/data/hdf5/hydroapps/geo_data/host/ascii +rmdir ../edex/data/hdf5/hydroapps/geo_data/host/binary +rmdir ../edex/data/hdf5/hydroapps/geo_data/host +rmdir ../edex/data/hdf5/hydroapps/geo_data/ofstest/ascii +rmdir ../edex/data/hdf5/hydroapps/geo_data/ofstest +rmdir ../edex/data/hdf5/hydroapps/geo_data +rmdir ../edex/data/hdf5/hydroapps +rmdir ../edex/data/hdf5 +rmdir ../edex/data +rmdir ../edex/bin +rmdir ../edex +rmdir ../awipsShare/hydroapps/lib/native/linux32 +rmdir ../awipsShare/hydroapps/lib/native +rmdir ../awipsShare/hydroapps/lib +rmdir ../awipsShare/hydroapps/data/fxa/radar/envData +rmdir ../awipsShare/hydroapps/data/fxa/radar +rmdir ../awipsShare/hydroapps/data/fxa +rmdir ../awipsShare/hydroapps/data +rmdir ../awipsShare/hydroapps/ffmp_templates +rmdir ../awipsShare/hydroapps/precip_proc/local/data/stage1_archive +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dhr_archive +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/decodedsp +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/disagg +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/mpe_editor +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/process_bias_message +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/hpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/gen_areal_qpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/gage_pp +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/siipp +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/decodedhr +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/mpe_fieldgen +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/lightning_proc +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/misc +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log/decodedpa +rmdir ../awipsShare/hydroapps/precip_proc/local/data/log +rmdir ../awipsShare/hydroapps/precip_proc/local/data/stage1_decoded +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dsp_error +rmdir ../awipsShare/hydroapps/precip_proc/local/data/gpp_input +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dsp_gather +rmdir ../awipsShare/hydroapps/precip_proc/local/data/stage3/post_analysis +rmdir ../awipsShare/hydroapps/precip_proc/local/data/stage3 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/gif +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/netcdf +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic/grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ermosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/avgrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/height +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/gif +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/netcdf +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic/grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/dhrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/index +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/lsatpre +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/gif +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/netcdf +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic/grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/ebmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_gif +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_netcdf +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_jpeg +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/nowcast +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/gif +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/netcdf +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic/grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/bdhrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/hpe_xmrg +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe/maxrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/hpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/localfield3 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_input +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/avgrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/height +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/index +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/srmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/lsatpre +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/mlqmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/localfield1 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcbmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/gageonly +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe24 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_jpeg +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/sgmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_gif +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/d2d_files +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/grid +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/point +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level/MAZ +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/freezing_level +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/grid +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/point +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/bad +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/MAT +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature/dev +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/temperature +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/grid +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/point +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/bad +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/MAP +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip/dev +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/precip +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/netcdf_files +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/scratch +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC/fewsgrib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/dailyQC +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/gagetriangles +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/sat_state_var +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/srgmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/bias_message_output +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/locspan +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/mmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcmmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/state_var +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/satpre +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/p3lmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_netcdf +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe01 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_sbn +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/mrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/edit_polygon +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/locbias +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe06 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/bad_gages +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/lmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/draw_precip +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/mlmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/lqmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/qpe_grib_sbn +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/rfcqpe_temp +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/localfield2 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/bmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe/maxrmosaic +rmdir ../awipsShare/hydroapps/precip_proc/local/data/mpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dsp_decoded +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dhr_decoded +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dhr_error +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dsp_archive +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/radclim +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/nc2grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/stage3/help +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/stage3 +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/hpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/grid_masks +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/nc2grib +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/misbin +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/utiltriangles +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/gage_locations +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/help +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/climo +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/beam_height +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/prism +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe/station_lists +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/mpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app/gen_areal_qpe +rmdir ../awipsShare/hydroapps/precip_proc/local/data/app +rmdir ../awipsShare/hydroapps/precip_proc/local/data/stage1_error +rmdir ../awipsShare/hydroapps/precip_proc/local/data/dhr_gather +rmdir ../awipsShare/hydroapps/precip_proc/local/data +rmdir ../awipsShare/hydroapps/precip_proc/local/bin +rmdir ../awipsShare/hydroapps/precip_proc/local +rmdir ../awipsShare/hydroapps/precip_proc/bin +rmdir ../awipsShare/hydroapps/precip_proc +rmdir ../awipsShare/hydroapps/shefdecode/input +rmdir ../awipsShare/hydroapps/shefdecode/logs/decoder +rmdir ../awipsShare/hydroapps/shefdecode/logs/product +rmdir ../awipsShare/hydroapps/shefdecode/logs +rmdir ../awipsShare/hydroapps/shefdecode/bin +rmdir ../awipsShare/hydroapps/shefdecode +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_xml +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/incoming +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/ofs_extract_text +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/outgoing +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp_transfer/ingest_xml +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp_transfer +rmdir ../awipsShare/hydroapps/whfs/local/data/grid/misc +rmdir ../awipsShare/hydroapps/whfs/local/data/grid +rmdir ../awipsShare/hydroapps/whfs/local/data/metar_input +rmdir ../awipsShare/hydroapps/whfs/local/data/metar_output +rmdir ../awipsShare/hydroapps/whfs/local/data/log/qcalarm +rmdir ../awipsShare/hydroapps/whfs/local/data/log/db_purge +rmdir ../awipsShare/hydroapps/whfs/local/data/log/vacuum +rmdir ../awipsShare/hydroapps/whfs/local/data/log/riverpro +rmdir ../awipsShare/hydroapps/whfs/local/data/log/rivermon +rmdir ../awipsShare/hydroapps/whfs/local/data/log/create_gagradloc +rmdir ../awipsShare/hydroapps/whfs/local/data/log/precip_accum +rmdir ../awipsShare/hydroapps/whfs/local/data/log/obsfcst_monitor +rmdir ../awipsShare/hydroapps/whfs/local/data/log/sshp +rmdir ../awipsShare/hydroapps/whfs/local/data/log/pdc_pp +rmdir ../awipsShare/hydroapps/whfs/local/data/log/metar2shef +rmdir ../awipsShare/hydroapps/whfs/local/data/log/floodseq +rmdir ../awipsShare/hydroapps/whfs/local/data/log/misc +rmdir ../awipsShare/hydroapps/whfs/local/data/log +rmdir ../awipsShare/hydroapps/whfs/local/data/image +rmdir ../awipsShare/hydroapps/whfs/local/data/report +rmdir ../awipsShare/hydroapps/whfs/local/data/import +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp/precip +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp/forecast +rmdir ../awipsShare/hydroapps/whfs/local/data/sshp +rmdir ../awipsShare/hydroapps/whfs/local/data/app/riverpro +rmdir ../awipsShare/hydroapps/whfs/local/data/app/rivermon +rmdir ../awipsShare/hydroapps/whfs/local/data/app/timeseries +rmdir ../awipsShare/hydroapps/whfs/local/data/app/sshp +rmdir ../awipsShare/hydroapps/whfs/local/data/app/hydroview/help +rmdir ../awipsShare/hydroapps/whfs/local/data/app/hydroview +rmdir ../awipsShare/hydroapps/whfs/local/data/app/damcrest +rmdir ../awipsShare/hydroapps/whfs/local/data/app/metar2shef +rmdir ../awipsShare/hydroapps/whfs/local/data/app +rmdir ../awipsShare/hydroapps/whfs/local/data/pdc_pp +rmdir ../awipsShare/hydroapps/whfs/local/data/damcrest +rmdir ../awipsShare/hydroapps/whfs/local/data/geo +rmdir ../awipsShare/hydroapps/whfs/local/data/product +rmdir ../awipsShare/hydroapps/whfs/local/data +rmdir ../awipsShare/hydroapps/whfs/local/bin +rmdir ../awipsShare/hydroapps/whfs/local +rmdir ../awipsShare/hydroapps/whfs/bin/pa +rmdir ../awipsShare/hydroapps/whfs/bin +rmdir ../awipsShare/hydroapps/whfs +rmdir ../awipsShare/hydroapps/public/bin +rmdir ../awipsShare/hydroapps/public +rmdir ../awipsShare/hydroapps/rfc/hdb/scripts +rmdir ../awipsShare/hydroapps/rfc/hdb/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/hdb/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/hdb/bin +rmdir ../awipsShare/hydroapps/rfc/hdb/app-defaults +rmdir ../awipsShare/hydroapps/rfc/hdb/help_files +rmdir ../awipsShare/hydroapps/rfc/hdb +rmdir ../awipsShare/hydroapps/rfc/data/products +rmdir ../awipsShare/hydroapps/rfc/data +rmdir ../awipsShare/hydroapps/rfc/xsets/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/xsets/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/xsets/bin +rmdir ../awipsShare/hydroapps/rfc/xsets/files/oper/param +rmdir ../awipsShare/hydroapps/rfc/xsets/files/oper/output +rmdir ../awipsShare/hydroapps/rfc/xsets/files/oper/hydrographs/param +rmdir ../awipsShare/hydroapps/rfc/xsets/files/oper/hydrographs +rmdir ../awipsShare/hydroapps/rfc/xsets/files/oper +rmdir ../awipsShare/hydroapps/rfc/xsets/files +rmdir ../awipsShare/hydroapps/rfc/xsets +rmdir ../awipsShare/hydroapps/rfc/verify/output +rmdir ../awipsShare/hydroapps/rfc/verify/input +rmdir ../awipsShare/hydroapps/rfc/verify/scripts +rmdir ../awipsShare/hydroapps/rfc/verify/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/verify/bin +rmdir ../awipsShare/hydroapps/rfc/verify/files +rmdir ../awipsShare/hydroapps/rfc/verify +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/output/jelkins +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/output/ofsde_logs +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/output +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/input/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/input +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/scripts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper_new/fs5files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper_new +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/fs5files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/griddb +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/shefdata +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/dhmdata +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/mods +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/ndfd +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/sacsnow_clim +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper/gif_files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs/files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ofs +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/doc +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/sys_files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/output/grib +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/output/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/output +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/scripts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/affg +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/gdpm +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grro +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/user +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/hffg +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/cary +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grff +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/text +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/prod +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/grpp +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/define +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper/wsup +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg/files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ffg +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/util/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/util/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/util/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/util +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/icp/scripts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/icp/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/icp/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/icp/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/icp +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/options/colors +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/options +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/scripts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/system +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp/help_files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ifp +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/output/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/output +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/input/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/input +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/scripts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/espts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper/cpc_fcsts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/files/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens/files +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/ens +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/lib +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/output +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/sta_ts/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/sta_ts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper/pre +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/data/area_ts +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/data +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/input/oper/mcp3 +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/input/oper +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/input +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb/bin +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/calb +rmdir ../awipsShare/hydroapps/rfc/nwsrfs/locks +rmdir ../awipsShare/hydroapps/rfc/nwsrfs +rmdir ../awipsShare/hydroapps/rfc/xnav/parameters/rules +rmdir ../awipsShare/hydroapps/rfc/xnav/parameters +rmdir ../awipsShare/hydroapps/rfc/xnav/data/wfoqpf +rmdir ../awipsShare/hydroapps/rfc/xnav/data/localdata +rmdir ../awipsShare/hydroapps/rfc/xnav/data/shefdata +rmdir ../awipsShare/hydroapps/rfc/xnav/data/misc_data +rmdir ../awipsShare/hydroapps/rfc/xnav/data/rfcqpf/nmap +rmdir ../awipsShare/hydroapps/rfc/xnav/data/rfcqpf +rmdir ../awipsShare/hydroapps/rfc/xnav/data +rmdir ../awipsShare/hydroapps/rfc/xnav/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/xnav/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/xnav/bin +rmdir ../awipsShare/hydroapps/rfc/xnav +rmdir ../awipsShare/hydroapps/rfc/fldview/floodmapdata +rmdir ../awipsShare/hydroapps/rfc/fldview +rmdir ../awipsShare/hydroapps/rfc/grib/output +rmdir ../awipsShare/hydroapps/rfc/grib/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/grib/bin +rmdir ../awipsShare/hydroapps/rfc/grib +rmdir ../awipsShare/hydroapps/rfc/send_rfc/data/sbnprods +rmdir ../awipsShare/hydroapps/rfc/send_rfc/data/send +rmdir ../awipsShare/hydroapps/rfc/send_rfc/data +rmdir ../awipsShare/hydroapps/rfc/send_rfc +rmdir ../awipsShare/hydroapps/rfc/fld/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/fld/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/fld/bin +rmdir ../awipsShare/hydroapps/rfc/fld +rmdir ../awipsShare/hydroapps/rfc/xdat/parameters/groups +rmdir ../awipsShare/hydroapps/rfc/xdat/parameters +rmdir ../awipsShare/hydroapps/rfc/xdat/data/localdata +rmdir ../awipsShare/hydroapps/rfc/xdat/data/shefdata +rmdir ../awipsShare/hydroapps/rfc/xdat/data +rmdir ../awipsShare/hydroapps/rfc/xdat/bin/ARCHIVE +rmdir ../awipsShare/hydroapps/rfc/xdat/bin/RELEASE +rmdir ../awipsShare/hydroapps/rfc/xdat/bin +rmdir ../awipsShare/hydroapps/rfc/xdat +rmdir ../awipsShare/hydroapps/rfc +rmdir ../awipsShare/hydroapps/bin +rmdir ../awipsShare/hydroapps/geo_data/util +rmdir ../awipsShare/hydroapps/geo_data/host/ascii +rmdir ../awipsShare/hydroapps/geo_data/host/binary +rmdir ../awipsShare/hydroapps/geo_data/host +rmdir ../awipsShare/hydroapps/geo_data/ofstest/ascii +rmdir ../awipsShare/hydroapps/geo_data/ofstest +rmdir ../awipsShare/hydroapps/geo_data +rmdir ../awipsShare/hydroapps +rmdir ../awipsShare +rmdir ../ +exit 0 diff --git a/pythonPackages/dynamicserialize/adapters/LockTableAdapter.py b/pythonPackages/dynamicserialize/adapters/LockTableAdapter.py new file mode 100644 index 0000000000..09cc54eb8e --- /dev/null +++ b/pythonPackages/dynamicserialize/adapters/LockTableAdapter.py @@ -0,0 +1,90 @@ +## +# This software was developed and / or modified by Raytheon Company, +# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# +# U.S. EXPORT CONTROLLED TECHNICAL DATA +# This software product contains export-restricted data whose +# export/transfer/disclosure is restricted by U.S. law. Dissemination +# to non-U.S. persons whether in the United States or abroad requires +# an export license or other authorization. +# +# Contractor Name: Raytheon Company +# Contractor Address: 6825 Pine Street, Suite 340 +# Mail Stop B8 +# Omaha, NE 68106 +# 402.291.0100 +# +# See the AWIPS II Master Rights File ("Master Rights File.pdf") for +# further licensing information. +## + + +# +# Adapter for com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 04/22/13 rjpeter Initial Creation. +# +# +# + +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.server.lock import LockTable +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.server.lock import Lock + +ClassAdapter = 'com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable' + +def serialize(context, lockTable): + index=0 + wsIds = {lockTable.getWsId().toString() : index} + index += 1 + locks = lockTable.getLocks() + lockWsIdIndex = [] + for lock in locks: + wsIdString = lock.getWsId().toString() + + if wsIds.has_key(wsIdString): + lockWsIdIndex.append(wsIds[wsIdString]) + else: + lockWsIdIndex.append(index) + wsIds[wsIdString] = index + index += 1 + + context.writeObject(lockTable.getParmId()) + + context.writeI32(index) + for wsId in sorted(wsIds, key=wsIds.get): + context.writeObject(wsId) + + context.writeI32(len(locks)) + for lock, wsIndex in zip(locks, lockWsIdIndex): + serializer.writeI64(lock.getStartTime()) + serializer.writeI64(lock.getEndTime()) + serializer.writeI32(wsIndex) + +def deserialize(context): + parmId = context.readObject() + numWsIds = context.readI32() + wsIds = [] + for x in xrange(numWsIds): + wsIds.append(context.readObject()) + + numLocks = context.readI32() + locks = [] + for x in xrange(numLocks): + lock = Lock() + lock.setParmId(parmId) + lock.setStartTime(context.readI64()) + lock.setEndTime(context.readI64()) + lock.setWsId(wsIds[context.readI32()]) + locks.append(lock) + + lockTable = LockTable() + lockTable.setParmId(parmId) + lockTable.setWsId(wsIds[0]) + lockTable.setLocks(locks) + + return lockTable \ No newline at end of file diff --git a/pythonPackages/dynamicserialize/adapters/__init__.py b/pythonPackages/dynamicserialize/adapters/__init__.py index 69b558e738..cd3407b26f 100644 --- a/pythonPackages/dynamicserialize/adapters/__init__.py +++ b/pythonPackages/dynamicserialize/adapters/__init__.py @@ -29,7 +29,7 @@ # ------------ ---------- ----------- -------------------------- # 08/31/10 njensen Initial Creation. # 03/20/13 #1774 randerso Added TimeConstraintsAdapter -# +# 04/22/13 #1949 rjpeter Added LockTableAdapter # # @@ -53,6 +53,7 @@ __all__ = [ 'FloatBufferAdapter', 'ByteBufferAdapter', 'TimeConstraintsAdapter', + 'LockTableAdapter' # 'GridDataHistoryAdapter', ] diff --git a/rpms/awips2.core/Installer.adapt-native/component.spec b/rpms/awips2.core/Installer.adapt-native/component.spec index 1d1b70e9eb..bbd643e544 100644 --- a/rpms/awips2.core/Installer.adapt-native/component.spec +++ b/rpms/awips2.core/Installer.adapt-native/component.spec @@ -7,7 +7,6 @@ Version: %{_component_version} Release: %{_component_release} Group: AWIPSII BuildRoot: /tmp -Prefix: /awips2 URL: N/A License: N/A Distribution: N/A @@ -40,23 +39,18 @@ mkdir -p ${RPM_BUILD_ROOT}/awips2 %build %install -NATIVE_TAR_FILE="dist.native/i386-pc-linux-gnu.tar" +FILES_NATIVE="%{_baseline_workspace}/files.native" -/bin/gtar -xpf %{_baseline_workspace}/${NATIVE_TAR_FILE} \ - -C ${RPM_BUILD_ROOT}/awips2 - -# Remove Unnecessary Directories. -rm -rf ${RPM_BUILD_ROOT}/awips2/setup -rm -rf ${RPM_BUILD_ROOT}/awips2/edex -rm -rf ${RPM_BUILD_ROOT}/awips2/lib -rm -rf ${RPM_BUILD_ROOT}/awips2/awipsShare +/bin/cp -rf ${FILES_NATIVE}/adapt \ + %{_build_root}/awips2/ +if [ $? -ne 0 ]; then + exit 1 +fi %pre - %post %preun - %postun %clean diff --git a/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf b/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf index 12e7bc9ca2..a13b4b16e6 100644 --- a/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf +++ b/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf @@ -446,27 +446,26 @@ track_counts = on autovacuum = on # Enable autovacuum subprocess? 'on' # requires track_counts to also be on. -#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and +log_autovacuum_min_duration = 120s # -1 disables, 0 logs all actions and # their durations, > 0 logs only # actions running at least this number # of milliseconds. -#autovacuum_max_workers = 3 # max number of autovacuum subprocesses +autovacuum_max_workers = 6 # max number of autovacuum subprocesses # (change requires restart) -#autovacuum_naptime = 1min # time between autovacuum runs -autovacuum_vacuum_threshold = 1000 # min number of row updates before +autovacuum_naptime = 30s # time between autovacuum runs +autovacuum_vacuum_threshold = 500 # min number of row updates before # vacuum -autovacuum_analyze_threshold = 500 # min number of row updates before +autovacuum_analyze_threshold = 250 # min number of row updates before # analyze autovacuum_vacuum_scale_factor = 0.15 # fraction of table size before vacuum autovacuum_analyze_scale_factor = 0.075 # fraction of table size before analyze #autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum # (change requires restart) -#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for +autovacuum_vacuum_cost_delay = 10ms # default vacuum cost delay for # autovacuum, in milliseconds; # -1 means use vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for - # autovacuum, -1 means use - # vacuum_cost_limit +autovacuum_vacuum_cost_limit = 1000 # default vacuum cost limit for + # autovacuum, -1 means use vacuum_cost_limit #------------------------------------------------------------------------------ diff --git a/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf b/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf index ac0a75d6a4..70043e05cc 100644 --- a/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf +++ b/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf @@ -446,25 +446,25 @@ track_counts = on autovacuum = on # Enable autovacuum subprocess? 'on' # requires track_counts to also be on. -#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and +log_autovacuum_min_duration = 120s # -1 disables, 0 logs all actions and # their durations, > 0 logs only # actions running at least this number # of milliseconds. -#autovacuum_max_workers = 3 # max number of autovacuum subprocesses +autovacuum_max_workers = 6 # max number of autovacuum subprocesses # (change requires restart) -#autovacuum_naptime = 1min # time between autovacuum runs -autovacuum_vacuum_threshold = 1000 # min number of row updates before +autovacuum_naptime = 30s # time between autovacuum runs +autovacuum_vacuum_threshold = 500 # min number of row updates before # vacuum -autovacuum_analyze_threshold = 500 # min number of row updates before +autovacuum_analyze_threshold = 250 # min number of row updates before # analyze autovacuum_vacuum_scale_factor = 0.15 # fraction of table size before vacuum autovacuum_analyze_scale_factor = 0.075 # fraction of table size before analyze #autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum # (change requires restart) -#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for +autovacuum_vacuum_cost_delay = 10ms # default vacuum cost delay for # autovacuum, in milliseconds; # -1 means use vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for +autovacuum_vacuum_cost_limit = 1000 # default vacuum cost limit for # autovacuum, -1 means use # vacuum_cost_limit diff --git a/rpms/awips2.core/Installer.hydroapps/component.spec b/rpms/awips2.core/Installer.hydroapps/component.spec index 6c19fc7901..0002a05ba6 100644 --- a/rpms/awips2.core/Installer.hydroapps/component.spec +++ b/rpms/awips2.core/Installer.hydroapps/component.spec @@ -34,60 +34,24 @@ then exit 1 fi -mkdir -p ${RPM_BUILD_ROOT}/awips2 +mkdir -p ${RPM_BUILD_ROOT}/awips2/edex/data %build %install -NATIVE_TAR_FILE="dist.native/i386-pc-linux-gnu.tar" +FILES_NATIVE="%{_baseline_workspace}/files.native" -# Untar the Native Library -/bin/gtar -xpf %{_baseline_workspace}/${NATIVE_TAR_FILE} \ - -C ${RPM_BUILD_ROOT}/awips2 - -# Remove all unnecessary files and directories. -rm -rf ${RPM_BUILD_ROOT}/awips2/adapt -rm -rf ${RPM_BUILD_ROOT}/awips2/lib -rm -rf ${RPM_BUILD_ROOT}/awips2/setup -rm -rf ${RPM_BUILD_ROOT}/awips2/edex -mkdir -p ${RPM_BUILD_ROOT}/awips2/edex/data/share -mv ${RPM_BUILD_ROOT}/awips2/awipsShare/hydroapps \ - ${RPM_BUILD_ROOT}/awips2/edex/data/share -rm -rf ${RPM_BUILD_ROOT}/awips2/awipsShare - -# Add the ffmp_templates directory - part of the tar file now. -#mkdir -p ${RPM_BUILD_ROOT}/awips2/edex/data/hdf5/hydroapps/ffmp_templates - -# Add file for VIM - part of the tar file now. -#WHFS_LOCAL="edex/data/hdf5/hydroapps/whfs/local/data" -#mkdir -p ${RPM_BUILD_ROOT}/awips2/${WHFS_LOCAL}/app/ -#touch ${RPM_BUILD_ROOT}/awips2/${WHFS_LOCAL}/app/.vimrc +/bin/cp -rf ${FILES_NATIVE}/awipsShare \ + %{_build_root}/awips2/edex/data/share +if [ $? -ne 0 ]; then + exit 1 +fi %pre -if [ "${1}" = "2" ]; then - exit 0 -fi - -echo -e "\e[1;34m--------------------------------------------------------------------------------\e[m" -echo -e "\e[1;34m\| Installing the AWIPS II Hydro Distribution...\e[m" -echo -e "\e[1;34m--------------------------------------------------------------------------------\e[m" -echo -e "\e[1;34m Installation Root = /awips2\e[m" -echo -e "\e[1;34m Destination = /awips2/edex/data/share/hydroapps\e[m" - %post -echo -e "\e[1;32m--------------------------------------------------------------------------------\e[m" -echo -e "\e[1;32m\| AWIPS II Hydro Distribution Installation - COMPLETE\e[m" -echo -e "\e[1;32m--------------------------------------------------------------------------------\e[m" %preun - %postun -if [ "${1}" = "1" ]; then - exit 0 -fi -echo -e "\e[1;34m--------------------------------------------------------------------------------\e[m" -echo -e "\e[1;34m\| The AWIPS II Hydro Distribution Has Been Successfully Removed\e[m" -echo -e "\e[1;34m--------------------------------------------------------------------------------\e[m" %clean rm -rf ${RPM_BUILD_ROOT} @@ -100,4 +64,4 @@ rm -rf ${RPM_BUILD_ROOT} %dir /awips2/edex/data/share %defattr(777,awips,fxalpha,777) %dir /awips2/edex/data/share/hydroapps -/awips2/edex/data/share/hydroapps/* \ No newline at end of file +/awips2/edex/data/share/hydroapps/* diff --git a/rpms/awips2.core/Installer.hydroapps/delta/B11.3/updateA21Proto1_ffmpTemplates.sh b/rpms/awips2.core/Installer.hydroapps/delta/B11.3/updateA21Proto1_ffmpTemplates.sh deleted file mode 100644 index 140762188e..0000000000 --- a/rpms/awips2.core/Installer.hydroapps/delta/B11.3/updateA21Proto1_ffmpTemplates.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -export DELTA_BUILD="11.3" -export DELTA_ID="A21Proto1" -export DELTA_DESC="Removing Any Existing FFMP Templates So New Ones Can Be Generated." - -function runUpdate() -{ - # Ensure that the awips2-hydroapps have been installed. - rpm -q awips2-hydroapps > /dev/null - RC="$?" - if [ ! "${RC}" = "0" ]; then - return 0 - fi - - # Ensure that we know where awips2-hydroapps has been installed too. - if [ "${COMPONENT_INSTALL}" = "" ]; then - return 1 - fi - - return 0; - FFMP_TEMPLATE_DIR="${COMPONENT_INSTALL}/edex/data/hdf5/hydroapps/ffmp_templates" - # Ensure that the ffmp_template directory exists. - if [ ! -d ${FFMP_TEMPLATE_DIR} ]; then - return 0 - fi - - # Purge the existing ffmp templates. - rm -rf ${FFMP_TEMPLATE_DIR}/* - RC="$?" - if [ ! "${RC}" = "0" ]; then - return 1 - fi - - return 0 -} diff --git a/rpms/awips2.core/Installer.ldm/component.spec b/rpms/awips2.core/Installer.ldm/component.spec index 5295732a63..e17297583b 100644 --- a/rpms/awips2.core/Installer.ldm/component.spec +++ b/rpms/awips2.core/Installer.ldm/component.spec @@ -45,16 +45,11 @@ if [ $? -ne 0 ]; then fi # create the ldm directory -/bin/mkdir -p %{_build_root}/usr/local/ldm-%{_ldm_version}/SOURCES +/bin/mkdir -p %{_build_root}/usr/local/ldm/SOURCES if [ $? -ne 0 ]; then exit 1 fi -# create profile directory and ld directory -/bin/mkdir -p %{_build_root}/etc/ld.so.conf.d -if [ $? -ne 0 ]; then - exit 1 -fi /bin/mkdir -p %{_build_root}/etc/profile.d if [ $? -ne 0 ]; then exit 1 @@ -63,7 +58,7 @@ fi %build %install -_ldm_destination=%{_build_root}/usr/local/ldm-%{_ldm_version} +_ldm_destination=%{_build_root}/usr/local/ldm _ldm_destination_source=${_ldm_destination}/SOURCES _NATIVELIB_PROJECTS=( 'edexBridge' 'decrypt_file' ) @@ -122,20 +117,6 @@ done if [ $? -ne 0 ]; then exit 1 fi -/bin/touch %{_build_root}/etc/ld.so.conf.d/awips2-ldm-noarch.conf -if [ $? -ne 0 ]; then - exit 1 -fi -echo "/usr/local/ldm-%{_ldm_version}/lib" > \ - %{_build_root}/etc/ld.so.conf.d/awips2-ldm-noarch.conf -if [ $? -ne 0 ]; then - exit 1 -fi -echo "/awips2/qpid/lib" >> \ - %{_build_root}/etc/ld.so.conf.d/awips2-ldm-noarch.conf -if [ $? -ne 0 ]; then - exit 1 -fi %pre if [ -d /tmp/ldm ]; then @@ -144,14 +125,16 @@ fi mkdir -p /tmp/ldm for dir in etc .ssh; do - if [ -d /usr/local/ldm-%{_ldm_version}/${dir} ]; then - scp -qrp /usr/local/ldm-%{_ldm_version}/${dir} /tmp/ldm + if [ -d /usr/local/ldm/${dir} ]; then + scp -qrp /usr/local/${dir} /tmp/ldm fi done %post -_ldm_dir=/usr/local/ldm-%{_ldm_version} +_ldm_dir=/usr/local/ldm _ldm_root_dir=${_ldm_dir}/ldm-%{_ldm_version} +_myHost=`hostname` +_myHost=`echo ${_myHost} | cut -f1 -d'-'` pushd . > /dev/null 2>&1 cd ${_ldm_dir}/SOURCES @@ -184,42 +167,14 @@ if [ $? -ne 0 ]; then fi popd > /dev/null 2>&1 -# create the ldm directory link -pushd . > /dev/null 2>&1 -cd /usr/local -if [ -h /usr/local/ldm ]; then - # if this command fails, ldm may be a directory - # instead of a link. - rm -f /usr/local/ldm - if [ $? -ne 0 ]; then - echo "FATAL: failed to remove the /usr/local/ldm link!" - exit 1 - fi -else - if [ -d /usr/local/ldm ]; then - # archive the directory - _identifier=`date +"%s"` - mv /usr/local/ldm /usr/local/ldm.archive_${_identifier} - if [ $? -ne 0 ]; then - echo "FATAL: failed to archive the /usr/local/ldm directory!" - exit 1 - fi - echo "INFO: archived /usr/local/ldm to /usr/local/ldm.archive_${_identifier}." - fi -fi - -ln -s ${_ldm_dir} ldm -if [ $? -ne 0 ]; then - echo "FATAL: failed to create the /usr/local/ldm link." - exit 1 -fi - # create .bash_profile -echo 'export PATH=$HOME/decoders:$HOME/util:$HOME/bin:$PATH' > \ - /usr/local/ldm/.bash_profile -echo 'export MANPATH=$HOME/share/man:/usr/share/man' >> \ - /usr/local/ldm/.bash_profile -popd > /dev/null 2>&1 +if [ ! -f /usr/local/ldm/.bash_profile ]; then + echo 'export PATH=$HOME/decoders:$HOME/util:$HOME/bin:$PATH' > \ + /usr/local/ldm/.bash_profile + echo 'export MANPATH=$HOME/share/man:/usr/share/man' >> \ + /usr/local/ldm/.bash_profile + /bin/chown ldm:fxalpha /usr/local/ldm/.bash_profile +fi # construct pqact pushd . > /dev/null 2>&1 @@ -240,10 +195,13 @@ cp pqact.conf.template pqact.conf if [ $? -ne 0 ]; then exit 1 fi -cat pqact.conf.dev >> pqact.conf -if [ $? -ne 0 ]; then - echo "ERROR: Unable to merge pqact.conf.dev and pqact.conf." - exit 1 + +if [ ${_myHost} != "cpsbn1" -a ${_myHost} != "cpsbn2" -a ${_myHost} != "dx1" -a ${_myHost} != "dx2" ] ; then + cat pqact.conf.dev >> pqact.conf + if [ $? -ne 0 ]; then + echo "ERROR: Unable to merge pqact.conf.dev and pqact.conf." + exit 1 + fi fi popd > /dev/null 2>&1 @@ -254,7 +212,7 @@ if [ $? -ne 0 ]; then exit 1 fi export _current_dir=`pwd` -su ldm -lc "cd ${_current_dir}; ./configure --disable-max-size --with-noaaport --disable-root-actions" \ +su ldm -lc "cd ${_current_dir}; ./configure --disable-max-size --with-noaaport --disable-root-actions --prefix=${_ldm_dir}" \ > configure.log 2>&1 if [ $? -ne 0 ]; then echo "FATAL: ldm configure has failed!" @@ -353,50 +311,72 @@ cd .. popd > /dev/null 2>&1 -for dir in etc .ssh; +if [ ! -d .ssh ] && + [ -d /tmp/ldm/.ssh ]; then + scp -qrp /tmp/ldm/.ssh /usr/local/ldm +fi + +for _file in $( ls /tmp/ldm/etc/pqact.conf.* | grep -wE "pqact.conf.[a-z]{3,4}" | grep -v pqact.conf.dev | xargs ) ; do - if [ -d /tmp/ldm/${dir} ]; then - scp -qrp /tmp/ldm/${dir} /usr/local/ldm-%{_ldm_version} + if [[ ! -f /usr/local/ldm/etc/${_file} ]]; then + scp -qp /tmp/ldm/etc/${_file} /usr/local/ldm/etc/ fi done #if a remote CP site, copy over the filtered data configuration -case $SITE_IDENTIFIER in gum|hfo|pbp|vrh) - echo -e "\nInstalling ldmd.conf for $SITE_IDENTIFIER." - if ! scp /usr/local/ldm-%{_ldm_version}/etc/ldmd.conf.$SITE_IDENTIFIER cpsbn1:/usr/local/ldm/etc/ldmd.conf - then - echo "ERROR: Failed copy of ldmd.conf to cpsbn1" - fi +if [ ${_myHost} == "dx1" -o ${_myHost} == "dx2" ] ; then + case $SITE_IDENTIFIER in gum|hfo|pbp|vrh) + echo -e "\nInstalling ldmd.conf for $SITE_IDENTIFIER." + if ! scp /usr/local/ldm-%{_ldm_version}/etc/ldmd.conf.$SITE_IDENTIFIER cpsbn1:/usr/local/ldm/etc/ldmd.conf + then + echo "ERROR: Failed copy of ldmd.conf to cpsbn1" + fi - if ! scp /usr/local/ldm-%{_ldm_version}/etc/ldmd.conf.$SITE_IDENTIFIER cpsbn2:/usr/local/ldm/etc/ldmd.conf - then - echo "ERROR: Failed copy of ldmd.conf to cpsbn2" - fi - ;; -esac + if ! scp /usr/local/ldm-%{_ldm_version}/etc/ldmd.conf.$SITE_IDENTIFIER cpsbn2:/usr/local/ldm/etc/ldmd.conf + then + echo "ERROR: Failed copy of ldmd.conf to cpsbn2" + fi + ;; + esac +fi # remove the extra configuration files -rm -f /usr/local/ldm-%{_ldm_version}/etc/ldmd.conf.* +rm -f /usr/local/ldm/etc/ldmd.conf.* /sbin/ldconfig # create route-eth1, if it does not already exist. -if [ ! -f /etc/sysconfig/network-scripts/route-eth1 ]; then - _route_eth1=/etc/sysconfig/network-scripts/route-eth1 +if [ ${_myHost} == "cpsbn1" -o ${_myHost} == "cpsbn2" ] ; then + if [ ! -f /etc/sysconfig/network-scripts/route-eth1 ]; then + _route_eth1=/etc/sysconfig/network-scripts/route-eth1 - touch ${_route_eth1} - echo "ADDRESS0=224.0.1.1" > ${_route_eth1} - echo "NETMASK0=255.255.255.255" >> ${_route_eth1} - echo "ADDRESS1=224.0.1.2" >> ${_route_eth1} - echo "NETMASK1=255.255.255.255" >> ${_route_eth1} - echo "ADDRESS2=224.0.1.3" >> ${_route_eth1} - echo "NETMASK2=255.255.255.255" >> ${_route_eth1} - echo "ADDRESS3=224.0.1.4" >> ${_route_eth1} - echo "NETMASK3=255.255.255.255" >> ${_route_eth1} - echo "ADDRESS4=224.0.1.5" >> ${_route_eth1} - echo "NETMASK4=255.255.255.255" >> ${_route_eth1} + touch ${_route_eth1} + echo "ADDRESS0=224.0.1.1" > ${_route_eth1} + echo "NETMASK0=255.255.255.255" >> ${_route_eth1} + echo "ADDRESS1=224.0.1.2" >> ${_route_eth1} + echo "NETMASK1=255.255.255.255" >> ${_route_eth1} + echo "ADDRESS2=224.0.1.3" >> ${_route_eth1} + echo "NETMASK2=255.255.255.255" >> ${_route_eth1} + echo "ADDRESS3=224.0.1.4" >> ${_route_eth1} + echo "NETMASK3=255.255.255.255" >> ${_route_eth1} + echo "ADDRESS4=224.0.1.5" >> ${_route_eth1} + echo "NETMASK4=255.255.255.255" >> ${_route_eth1} - # restart networking - /sbin/service network restart + # restart networking + /sbin/service network restart + fi + + # check for some AWIPS specific links for the CP devices + for _dirs in data logs ; do + if [[ -h /usr/local/ldm/${_dirs} && $(readlink /usr/local/ldm/${_dirs}) != "/data/ldm/${_dirs}" ]] ; then + if ! rm -f /usr/local/ldm/${_dirs} ; then + echo "ERROR: Failed to remove /usr/local/ldm/${_dirs}" + else + if ! ln -s /data/ldm/${_dirs} /usr/local/ldm/${_dirs} ; then + echo "ERROR: Failed to create link from /usr/local/ldm/${_dirs} --> /data/ldm/${_dirs}" + fi + fi + fi + done fi rm -rf /tmp/ldm @@ -416,9 +396,8 @@ rm -rf ${RPM_BUILD_ROOT} %files %defattr(-,ldm,fxalpha,-) -%dir /usr/local/ldm-%{_ldm_version} -%dir /usr/local/ldm-%{_ldm_version}/SOURCES -/usr/local/ldm-%{_ldm_version}/SOURCES/* +%dir /usr/local/ldm +%dir /usr/local/ldm/SOURCES +/usr/local/ldm/SOURCES/* -%attr(644,root,root) /etc/ld.so.conf.d/awips2-ldm-noarch.conf -%attr(755,root,root) /etc/profile.d/awipsLDM.csh +%attr(755,root,root) /etc/profile.d/awipsLDM.csh \ No newline at end of file diff --git a/rpms/awips2.core/Installer.ldm/patch/etc/ldmadmin-pl.conf b/rpms/awips2.core/Installer.ldm/patch/etc/ldmadmin-pl.conf deleted file mode 100644 index a53794582e..0000000000 --- a/rpms/awips2.core/Installer.ldm/patch/etc/ldmadmin-pl.conf +++ /dev/null @@ -1,158 +0,0 @@ - -# The fully-qualified hostname of the computer system. If the name isn't -# fully-qualified (i.e., if it doesn't include the domain) then replace -# "dev27.oma.us.ray.com" with the fully-qualified hostname. -chomp($hostname = `hostname --fqdn`); - -# The LDM home directory: -$ldmhome = "/usr/local/ldm-6.11.2"; - -# Requested size, in bytes, of the data portion of the LDM product-queue. The -# actual size might be slightly greater than the requested size for performance -# reasons. It is recommended that IDD sites keep at least one hour's worth of -# data in the queue. This means that the queue size should depend upon how -# much data is requested. After the queue has stabilized, use the pqmon(1) -# utility to monitor the age of the oldest product in the queue and adjust this -# value, if necessary. Understood suffixes include "K", "M", and "G" for -# "kilo", "mega", and "giga", respectively. The default requested size -# is 500 megabytes (i.e., "500M"). -$pq_size = "500M"; - -# Number of slots in the LDM product-queue. This is the maximum number -# of data-products that the product-queue can contain. Because it is -# recommended that IDD sites keep at least one hour's worth of data in -# the queue, this value should equal the maximum expected number of -# data-products per hour. If the value is "default", then the number -# of slots will be computed using the size of the product-queue and a -# mean data-product size of 4096 bytes. Use the pqmon(1) utility to -# monitor the number of data-products in the product-queue and adjust -# this value, if necessary. -$pq_slots = "default"; - -# Size of the pqsurf(1) product-queue in bytes. Do not use any suffixes. This -# is only meaningful if your LDM configuration-file executes the pqsurf(1) -# utility. You probably won't need to change this. -$surf_size = "2000000"; - -# Default number of log files that the "newlog" command should keep around: -$numlogs = 7; - -# File paths - everything here is based on the $ldmhome variable by default: -$bin_path = "$ldmhome/bin"; -$etc_path = "$ldmhome/etc"; -$log_path = "$ldmhome/logs"; -$data_path = "$ldmhome/data"; -$pq_path = "$data_path/ldm.pq";; - -# NOTE: If you change the following, then you must also modify the EXEC entry -# for the "pqsurf(1)" utility in the LDM configuration-file (etc/ldmd.conf) -# to ensure that the same pathname is used (via the "-q path" option). -$surf_path = "$data_path/pqsurf.pq"; - -# ldmadmin(1) file locations and names: -$pid_file = "$ldmhome/ldmd.pid"; -$lock_file = "$ldmhome/.ldmadmin.lck"; -$log_file = "$log_path/ldmd.log"; -$ldmd_conf = "$etc_path/ldmd.conf"; -$pqact_conf = "$etc_path/pqact.conf"; -$scour_file = "$etc_path/scour.conf"; - -# Whether or not to rotate the LDM log files whenever the LDM is started or -# restarted. They are rotated if and only if the value is non-zero. -$log_rotate = 0; - -# The IP address of the network interface to be used by the LDM server. -# Address "0.0.0.0" means that the LDM server will use all available network -# interfaces. -chomp($cmd = q{/sbin/ifconfig bond0 | grep 'inet\ addr' | awk '{print $2}' | sed 's/addr://'}); -chomp($ip_addr = `$cmd`); - -# The port on which the LDM server will listen for connections: -$port = 388; - -################################################################################ -# The following variables are new with LDM version 6.8.0: -################################################################################ - -# Maximum latency in seconds. A data-product arriving with a latency greater -# than this will be rejected by any downstream LDM process. -$max_latency = 3600; - -# Request time-offset in seconds. Nomally, a downstream LDM will request data -# starting with just after the last successfully received data-product. If that -# product doesn't exist in the upstream LDM's product-queue, however, then the -# downstream LDM will request data starting from this many seconds ago. The -# need for this parameter can arise if, for example, the downstream LDM has been -# offline long enough for the last successfully recieved data-product to be -# purged from the upstream LDM's product-queue. The value must be less than or -# equal to $max_latency. -$offset = 3600; - -# Whether or not to delete the product-information files when the product-queue -# is deleted (via the "delqueue" command). If true, then the new -# product-queue will be initially populated by requests for data that go back -# $offset seconds in time; otherwise, the requests for data that are the same -# as before will start with the last successfully-received data-product for -# each connection. Relay nodes should probably set this variable to true in -# order to regenerate a buffer of data while leaf nodes should probably set it -# to false in order to avoid receiving (and processing) duplicate data-products. -$delete_info_files = 0; - -# The maximum number of extant client connections the LDM server will allow -# before additional incoming connections requests are rejected. -$max_clients = 256; - -################################################################################ -# The following deal with verifying the accuracy of the system clock. - -# Whether or not to check the system clock at all: -$check_time = 0; - -# Whether or not to print a warning if time-checking is disabled: -$warn_if_check_time_disabled = 0; - -# Pathname of the ntpdate(1) utility: -$ntpdate = "/usr/sbin/ntpdate"; - -# Timeout, in seconds, for the ntpdate(1) utility: -$ntpdate_timeout = 5; - -# Time server hostnames. Modify to suit your needs. They're accessed in -# random order. -@time_servers = ( - "ntp.ucsd.edu", - "ntp1.cs.wisc.edu", - "ntppub.tamu.edu", - "otc1.psu.edu", - "timeserver.unidata.ucar.edu", -); - -# Maximum allowable time-difference in seconds: -$check_time_limit = 10; - -# Whether or not to abort on failure: -$abort_if_check_time_failure = 0; - -################################################################################ -# The following deal with LDM performance metrics. - -# The netstat(1) command for printing numeric port numbers of TCP Internet -# connections: -$netstat = "/bin/netstat -A inet -t -n"; - -# The metrics file into which the "addmetrics" command appends data: -$metrics_file = "$log_path/metrics.txt"; - -# The file-pattern for the metrics files to be plotted by the "plotmetrics" -# command: -$metrics_files = "/usr/local/ldm-6.11.2/logs/metrics.txt*"; - -# The number of metrics-files that the "newmetrics" command should keep -# around: -$num_metrics = 4; - -################################################################################ -# The following is necessary because the last executable statement of a -# "require"ed file must have a non-zero value. -################################################################################ -1; diff --git a/rpms/awips2.core/Installer.ldm/src/awips2-ldm.6.11.2.tar.gz b/rpms/awips2.core/Installer.ldm/src/awips2-ldm.6.11.2.tar.gz index b7a9c5f88d..53b21186fd 100644 Binary files a/rpms/awips2.core/Installer.ldm/src/awips2-ldm.6.11.2.tar.gz and b/rpms/awips2.core/Installer.ldm/src/awips2-ldm.6.11.2.tar.gz differ diff --git a/rpms/awips2.core/Installer.ncep-database/component.spec b/rpms/awips2.core/Installer.ncep-database/component.spec index 3eafba3890..399e3d2c93 100644 --- a/rpms/awips2.core/Installer.ncep-database/component.spec +++ b/rpms/awips2.core/Installer.ncep-database/component.spec @@ -5,10 +5,11 @@ Name: awips2-ncep-database Summary: AWIPS II NCEP Database Installation -Version: 1.0.0 -Release: 1 +Version: %{_component_version} +Release: %{_component_release} Group: AWIPSII BuildRoot: /tmp +BuildArch: noarch Prefix: /awips2/database URL: N/A License: N/A @@ -71,9 +72,8 @@ if [ "${1}" = "2" ]; then fi POSTGRESQL_INSTALL="/awips2/postgresql" # Need this for the lwpostgis.sql and spatial_ref_sys.sql scripts -DATABASE_INSTALL=`rpm -q --queryformat '%{INSTALLPREFIX}' awips2-database` -AWIPS2_DATA_DIRECTORY="${POSTGRESQL_INSTALL}/data" -POSTGRESQL_INSTALL="${POSTGRESQL_INSTALL}/postgresql" +DATABASE_INSTALL="/awips2/database" +AWIPS2_DATA_DIRECTORY="/awips2/data" PSQL_INSTALL="/awips2/psql" POSTMASTER="${POSTGRESQL_INSTALL}/bin/postmaster" @@ -82,17 +82,18 @@ DROPDB="${POSTGRESQL_INSTALL}/bin/dropdb" PG_RESTORE="${POSTGRESQL_INSTALL}/bin/pg_restore" PSQL="${PSQL_INSTALL}/bin/psql" # Determine who owns the PostgreSQL Installation -DB_OWNER=`ls -l /awips2/ | grep -w 'data' | awk '{print $3}'` +DB_OWNER=`ls -ld ${AWIPS2_DATA_DIRECTORY} | grep -w 'data' | awk '{print $3}'` # Our log file -SQL_LOG="${RPM_INSTALL_PREFIX}/sqlScripts/share/sql/ncep/ncep_sql_install.log" -SQL_SHARE_DIR="${RPM_INSTALL_PREFIX}/sqlScripts/share/sql/ncep" +SQL_LOG="${DATABASE_INSTALL}/sqlScripts/share/sql/ncep/ncep_sql_install.log" +SQL_SHARE_DIR="${DATABASE_INSTALL}/sqlScripts/share/sql/ncep" LWPOSTGIS_SQL="/awips2/postgresql/share/contrib/postgis-2.0/postgis.sql" SPATIAL_SQL="/awips2/postgresql/share/contrib/postgis-2.0/spatial_ref_sys.sql" +LEGACY_SQL="/awips2/postgresql/share/contrib/postgis-2.0/legacy.sql" # Determine if PostgreSQL is running. I_STARTED_POSTGRESQL="NO" su ${DB_OWNER} -c \ - "${PG_CTL} status -D /awips2/data > /dev/null 2>&1" + "${PG_CTL} status -D ${AWIPS2_DATA_DIRECTORY} > /dev/null 2>&1" RC="$?" # Start PostgreSQL if it is not running. @@ -101,7 +102,7 @@ if [ ! "${RC}" = "0" ]; then echo "\| Starting PostgreSQL As User - ${DB_OWNER}..." echo "--------------------------------------------------------------------------------" su ${DB_OWNER} -c \ - "${POSTMASTER} -D /awips2/data > /dev/null 2>&1 &" + "${POSTMASTER} -D ${AWIPS2_DATA_DIRECTORY} > /dev/null 2>&1 &" RC="$?" if [ ! "${RC}" = "0" ]; then echo "" @@ -119,7 +120,7 @@ else echo "--------------------------------------------------------------------------------" # Show The User. su ${DB_OWNER} -c \ - "${PG_CTL} status -D /awips2/data" + "${PG_CTL} status -D ${AWIPS2_DATA_DIRECTORY}" fi # Create the ncep directory; remove any existing directories. @@ -127,9 +128,9 @@ echo "-------------------------------------------------------------------------- echo "\| Creating a Directory for the ncep Tablespace..." echo "--------------------------------------------------------------------------------" if [ -d /awips2/data/ncep ]; then - su ${DB_OWNER} -c "rm -rf /awips2/data/ncep" + su ${DB_OWNER} -c "rm -rf ${AWIPS2_DATA_DIRECTORY}/ncep" fi -su ${DB_OWNER} -c "mkdir -p /awips2/data/ncep" +su ${DB_OWNER} -c "mkdir -p ${AWIPS2_DATA_DIRECTORY}/ncep" echo "--------------------------------------------------------------------------------" echo "\| Creating the ncep database..." @@ -154,6 +155,9 @@ su ${DB_OWNER} -c \ su ${DB_OWNER} -c \ "${PSQL} -d ncep -U awips -q -p 5432 -f ${SPATIAL_SQL}" \ >> ${SQL_LOG} 2>&1 +su ${DB_OWNER} -c \ + "${PSQL} -d ncep -U awips -q -p 5432 -f ${LEGACY_SQL}" \ + >> ${SQL_LOG} 2>&1 su ${DB_OWNER} -c \ "${SQL_SHARE_DIR}/createNcepDb.sh ${PSQL_INSTALL} 5432 awips ${SQL_SHARE_DIR} ${SQL_LOG}" @@ -187,13 +191,14 @@ fi POSTGRESQL_INSTALL="/awips2/postgresql" PSQL_INSTALL="/awips2/psql" +AWIPS2_DATA_DIRECTORY="/awips2/data" POSTMASTER="${POSTGRESQL_INSTALL}/bin/postmaster" PG_CTL="${POSTGRESQL_INSTALL}/bin/pg_ctl" DROPDB="${POSTGRESQL_INSTALL}/bin/dropdb" PG_RESTORE="${POSTGRESQL_INSTALL}/bin/pg_restore" PSQL="${PSQL_INSTALL}/bin/psql" # Determine who owns the PostgreSQL Installation -DB_OWNER=`ls -l /awips2/ | grep -w 'data' | awk '{print $3}'` +DB_OWNER=`ls -ld ${AWIPS2_DATA_DIRECTORY} | grep -w 'data' | awk '{print $3}'` echo "--------------------------------------------------------------------------------" echo "\| Preparing to drop the ncep tablespace and database..." @@ -203,7 +208,7 @@ echo "-------------------------------------------------------------------------- # start PostgreSQL if it is not running I_STARTED_POSTGRESQL="NO" su ${DB_OWNER} -c \ - "${PG_CTL} status -D /awips2/data > /dev/null 2>&1" + "${PG_CTL} status -D ${AWIPS2_DATA_DIRECTORY} > /dev/null 2>&1" RC="$?" # Start PostgreSQL if it is not running. @@ -212,7 +217,7 @@ if [ ! "${RC}" = "0" ]; then echo "\| Starting PostgreSQL As User - ${DB_OWNER}..." echo "--------------------------------------------------------------------------------" su ${DB_OWNER} -c \ - "${POSTMASTER} -D /awips2/data > /dev/null 2>&1 &" + "${POSTMASTER} -D ${AWIPS2_DATA_DIRECTORY} > /dev/null 2>&1 &" RC="$?" if [ ! "${RC}" = "0" ]; then echo "Failed To Start The PostgreSQL Server." @@ -227,7 +232,7 @@ else echo "--------------------------------------------------------------------------------" # Show The User. su ${DB_OWNER} -c \ - "${PG_CTL} status -D /awips2/data" + "${PG_CTL} status -D ${AWIPS2_DATA_DIRECTORY}" fi echo "--------------------------------------------------------------------------------" @@ -262,7 +267,7 @@ if [ "${I_STARTED_POSTGRESQL}" = "YES" ]; then echo "\| Stopping PostgreSQL As User - ${DB_OWNER}..." echo "--------------------------------------------------------------------------------" su ${DB_OWNER} -c \ - "${PG_CTL} stop -D /awips2/data" + "${PG_CTL} stop -D ${AWIPS2_DATA_DIRECTORY}" RC="$?" if [ ! "${RC}" = "0" ]; then echo "Warning: Failed to shutdown PostgreSQL." diff --git a/rpms/awips2.core/Installer.postgres/component.spec b/rpms/awips2.core/Installer.postgres/component.spec index 0e73215652..d869115b78 100644 --- a/rpms/awips2.core/Installer.postgres/component.spec +++ b/rpms/awips2.core/Installer.postgres/component.spec @@ -228,8 +228,6 @@ fi cd ../${POSTGIS_SRC_DIR} _POSTGRESQL_ROOT=${RPM_BUILD_ROOT}/awips2/postgresql _POSTGRESQL_BIN=${_POSTGRESQL_ROOT}/bin -# disable doc since it attempts to download files from -# the internet ./configure \ --with-pgconfig=${_POSTGRESQL_BIN}/pg_config \ --with-geosconfig=${_POSTGRESQL_BIN}/geos-config \ @@ -241,9 +239,25 @@ RC="$?" if [ ! "${RC}" = "0" ]; then exit 1 fi +# disable doc since it attempts to download files from +# the internet +echo "#Do Nothing" > doc/Makefile.in +echo "docs:" > doc/Makefile +echo "" >> doc/Makefile +echo "docs-install:" >> doc/Makefile +echo "" >> doc/Makefile +echo "docs-uninstall:" >> doc/Makefile +echo "" >> doc/Makefile +echo "comments-install:" >> doc/Makefile +echo "" >> doc/Makefile +echo "comments-uninstall:" >> doc/Makefile +echo "" >> doc/Makefile +echo "clean:" >> doc/Makefile +echo "" >> doc/Makefile make -RC="$?" -if [ ! "${RC}" = "0" ]; then +# run make twice - the first time may fail due to doc +make +if [ $? -ne 0 ]; then exit 1 fi make install @@ -340,4 +354,4 @@ and populate the AWIPS II databases. %defattr(644,awips,fxalpha,755) %dir /awips2/psql/lib -/awips2/psql/lib/* \ No newline at end of file +/awips2/psql/lib/* diff --git a/rpms/awips2.edex/Installer.edex-native/component.spec b/rpms/awips2.edex/Installer.edex-native/component.spec index 1c98251018..aa43f4be4d 100644 --- a/rpms/awips2.edex/Installer.edex-native/component.spec +++ b/rpms/awips2.edex/Installer.edex-native/component.spec @@ -36,7 +36,7 @@ fi if [ -d %{_build_root} ]; then rm -rf %{_build_root} fi -mkdir -p %{_build_root}/awips2 +mkdir -p %{_build_root}/awips2/edex if [ $? -ne 0 ]; then exit 1 fi @@ -48,14 +48,16 @@ fi %build %install -DIST_NATIVE="%{_baseline_workspace}/dist.native" +FILES_NATIVE="%{_baseline_workspace}/files.native" PACKAGES="%{_awipscm_share}/packages" # extract the native libraries -/bin/tar -xpf ${DIST_NATIVE}/i386-pc-linux-gnu.tar \ - -C %{_build_root}/awips2 ./edex/lib ./edex/bin +/bin/cp -rf ${FILES_NATIVE}/edex/lib \ + ${FILES_NATIVE}/edex/bin \ + %{_build_root}/awips2/edex if [ $? -ne 0 ]; then exit 1 fi + # copy the AWIPS I mhs libraries cp ${PACKAGES}/mhs/* \ %{_build_root}/awips2/edex/lib/native/linux32/awips1 @@ -65,6 +67,7 @@ fi %pre %post + %preun %postun diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips.patch b/rpms/awips2.qpid/0.18/SOURCES/awips.patch index b923711ea2..9b13adece4 100644 --- a/rpms/awips2.qpid/0.18/SOURCES/awips.patch +++ b/rpms/awips2.qpid/0.18/SOURCES/awips.patch @@ -87,22 +87,33 @@ diff -crB a/qpid/java/build.deps b/qpid/java/build.deps derby-db=lib/required/derby-10.8.2.2.jar *************** +*** 35,38 **** + geronimo-openejb=lib/required/geronimo-ejb_3.0_spec-1.0.1.jar +! geronimo-servlet=lib/required/geronimo-servlet_2.5_spec-1.2.jar + + junit=lib/required/junit-3.8.1.jar +--- 35,38 ---- + geronimo-openejb=lib/required/geronimo-ejb_3.0_spec-1.0.1.jar +! geronimo-servlet=lib/required/geronimo-servlet_2.5_spec-1.1.2.jar + + junit=lib/required/junit-3.8.1.jar +*************** *** 45,51 **** slf4j-api=lib/required/slf4j-api-1.6.4.jar slf4j-log4j=lib/required/slf4j-log4j12-1.6.4.jar ! xalan=lib/required/xalan-2.7.0.jar - jetty=lib/required/jetty-server-7.6.3.v20120416.jar - jetty-continuation=lib/required/jetty-continuation-7.6.3.v20120416.jar + jetty=lib/required/jetty-server-7.6.3.v20120416.jar + jetty-continuation=lib/required/jetty-continuation-7.6.3.v20120416.jar --- 45,51 ---- slf4j-api=lib/required/slf4j-api-1.6.4.jar slf4j-log4j=lib/required/slf4j-log4j12-1.6.4.jar ! xalan=lib/required/xalan-2.7.1.jar - jetty=lib/required/jetty-server-7.6.3.v20120416.jar - jetty-continuation=lib/required/jetty-continuation-7.6.3.v20120416.jar + jetty=lib/required/jetty-server-7.6.3.v20120416.jar + jetty-continuation=lib/required/jetty-continuation-7.6.3.v20120416.jar *************** *** 63,70 **** diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/dependencies.txt b/rpms/awips2.qpid/0.18/SOURCES/awips2/dependencies.txt index 4633b6d665..d27edd895e 100644 --- a/rpms/awips2.qpid/0.18/SOURCES/awips2/dependencies.txt +++ b/rpms/awips2.qpid/0.18/SOURCES/awips2/dependencies.txt @@ -10,4 +10,5 @@ org.apache.commons.collections/commons-collections-3.2.jar org.apache.commons.configuration/commons-configuration-1.6.jar org.codehaus.jackson/jackson-core-asl-1.7.3.jar org.codehaus.jackson/jackson-mapper-asl-1.7.3.jar -org.junit/mockito-all-1.9.0.jar \ No newline at end of file +org.junit/mockito-all-1.9.0.jar +org.apache.commons.cxf/geronimo-servlet_2.5_spec-1.1.2.jar diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/dojo-war-1.7.2.war b/rpms/awips2.qpid/0.18/SOURCES/awips2/dojo-war-1.7.2.war new file mode 100644 index 0000000000..e42e2a4b9f Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/dojo-war-1.7.2.war differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-continuation-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-continuation-7.6.3.v20120416.jar new file mode 100644 index 0000000000..0aa38b8fb9 Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-continuation-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-http-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-http-7.6.3.v20120416.jar new file mode 100644 index 0000000000..297f2e0953 Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-http-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-io-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-io-7.6.3.v20120416.jar new file mode 100644 index 0000000000..a0496268b8 Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-io-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-security-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-security-7.6.3.v20120416.jar new file mode 100644 index 0000000000..9f428298e2 Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-security-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-server-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-server-7.6.3.v20120416.jar new file mode 100644 index 0000000000..7dcfd1cd85 Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-server-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-servlet-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-servlet-7.6.3.v20120416.jar new file mode 100644 index 0000000000..fc0bc16c1a Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-servlet-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-util-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-util-7.6.3.v20120416.jar new file mode 100644 index 0000000000..e3ba8cf14c Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-util-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-websocket-7.6.3.v20120416.jar b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-websocket-7.6.3.v20120416.jar new file mode 100644 index 0000000000..1912e971cb Binary files /dev/null and b/rpms/awips2.qpid/0.18/SOURCES/awips2/jetty-websocket-7.6.3.v20120416.jar differ diff --git a/rpms/awips2.qpid/0.18/SOURCES/deps.lib.patch b/rpms/awips2.qpid/0.18/SOURCES/deps.lib.patch deleted file mode 100644 index 3299cfa4ca..0000000000 --- a/rpms/awips2.qpid/0.18/SOURCES/deps.lib.patch +++ /dev/null @@ -1,64 +0,0 @@ -diff -crB a/qpid/java/build.deps b/qpid/java/build.deps -*** a/qpid/java/build.deps 2013-01-23 13:54:15.000000000 -0600 ---- b/qpid/java/build.deps 2013-01-23 13:52:28.000000000 -0600 -*************** -*** 19,29 **** - - commons-beanutils-core=lib/required/commons-beanutils-core-1.8.3.jar - commons-cli=lib/required/commons-cli-1.2.jar -! commons-codec=lib/required/commons-codec-1.6.jar - commons-collections=lib/required/commons-collections-3.2.1.jar -! commons-configuration=lib/required/commons-configuration-1.8.jar - commons-digester=lib/required/commons-digester-1.8.1.jar -! commons-lang=lib/required/commons-lang-2.6.jar - commons-logging=lib/required/commons-logging-1.1.1.jar - - derby-db=lib/required/derby-10.8.2.2.jar ---- 19,29 ---- - - commons-beanutils-core=lib/required/commons-beanutils-core-1.8.3.jar - commons-cli=lib/required/commons-cli-1.2.jar -! commons-codec=lib/required/commons-codec-1.4.jar - commons-collections=lib/required/commons-collections-3.2.1.jar -! commons-configuration=lib/required/commons-configuration-1.6.jar - commons-digester=lib/required/commons-digester-1.8.1.jar -! commons-lang=lib/required/commons-lang-2.3.jar - commons-logging=lib/required/commons-logging-1.1.1.jar - - derby-db=lib/required/derby-10.8.2.2.jar -*************** -*** 45,51 **** - slf4j-api=lib/required/slf4j-api-1.6.4.jar - slf4j-log4j=lib/required/slf4j-log4j12-1.6.4.jar - -! xalan=lib/required/xalan-2.7.0.jar - - jetty=lib/required/jetty-server-7.6.3.v20120416.jar - jetty-continuation=lib/required/jetty-continuation-7.6.3.v20120416.jar ---- 45,51 ---- - slf4j-api=lib/required/slf4j-api-1.6.4.jar - slf4j-log4j=lib/required/slf4j-log4j12-1.6.4.jar - -! xalan=lib/required/xalan-2.7.1.jar - - jetty=lib/required/jetty-server-7.6.3.v20120416.jar - jetty-continuation=lib/required/jetty-continuation-7.6.3.v20120416.jar -*************** -*** 63,70 **** - - felix.libs=${felix-main} - -! jackson-core=lib/required/jackson-core-asl-1.9.0.jar -! jackson-mapper=lib/required/jackson-mapper-asl-1.9.0.jar - - commons-configuration.libs = ${commons-beanutils-core} ${commons-digester} \ - ${commons-codec} ${commons-lang} ${commons-collections} ${commons-configuration} ---- 63,70 ---- - - felix.libs=${felix-main} - -! jackson-core=lib/required/jackson-core-asl-1.7.3.jar -! jackson-mapper=lib/required/jackson-mapper-asl-1.7.3.jar - - commons-configuration.libs = ${commons-beanutils-core} ${commons-digester} \ - ${commons-codec} ${commons-lang} ${commons-collections} ${commons-configuration} diff --git a/rpms/awips2.qpid/0.18/SOURCES/virtualhosts.xml b/rpms/awips2.qpid/0.18/SOURCES/virtualhosts.xml index 3530054e80..5bf0230387 100644 --- a/rpms/awips2.qpid/0.18/SOURCES/virtualhosts.xml +++ b/rpms/awips2.qpid/0.18/SOURCES/virtualhosts.xml @@ -75,7 +75,7 @@ - + 104857600 diff --git a/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 b/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 index b9b3aa10e3..2d053ec229 100644 --- a/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 +++ b/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 @@ -1,6 +1,6 @@ diff -crB a/qpid-java.spec b/qpid-java.spec *** a/qpid-java.spec 2013-04-15 16:19:49.000000000 -0500 ---- b/qpid-java.spec 2013-04-15 16:23:28.000000000 -0500 +--- b/qpid-java.spec 2013-04-24 13:31:29.000000000 -0500 *************** *** 1,6 **** Name: qpid-java @@ -14,7 +14,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec + Name: qpid-java Version: 0.18 -! Release: 3%{?dist} +! Release: 5%{?dist} Summary: Java implementation of Apache Qpid License: Apache Software License Group: Development/Java @@ -68,7 +68,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec + fi + done + # copy dependencies that are not native to the baseline to required -+ cp -f %{_topdir}/SOURCES/awips2/*.jar java/lib/required ++ cp -f %{_topdir}/SOURCES/awips2/*.jar %{_topdir}/SOURCES/awips2/*.war java/lib/required + if [ $? -ne 0 ]; then + exit 1 + fi @@ -99,7 +99,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec ! -Dmodules=${module} ! done ! ant -Dretrieve.dependencies=false \ -! -Dmodules=common\ client\ amqp-1-0-common\ amqp-1-0-client\ amqp-1-0-client-jms\ management/common\ broker\ jca\ systests\ broker-plugins/management-jmx +! -Dmodules=common\ client\ amqp-1-0-common\ amqp-1-0-client\ amqp-1-0-client-jms\ management/common\ broker\ jca\ systests\ broker-plugins/access-control\ broker-plugins/firewall\ broker-plugins/management-http\ broker-plugins/management-jmx ! if [ $? -ne 0 ]; then ! exit 1 ! fi @@ -155,30 +155,26 @@ diff -crB a/qpid-java.spec b/qpid-java.spec %changelog * Thu Sep 6 2012 Irina Boverman - 0.18-2 ---- 122,239 ---- +--- 122,233 ---- cd .. ! install -dm 755 %{buildroot}%{_awips2_directory}/lib/opt ! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-client-%{version}.jar \ ! %{buildroot}%{_awips2_directory}/lib/opt -! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-client-%{version}-sources.jar \ -! %{buildroot}%{_awips2_directory}/lib/opt ! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-common-%{version}.jar \ ! %{buildroot}%{_awips2_directory}/lib/opt -! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-common-%{version}-sources.jar \ -! %{buildroot}%{_awips2_directory}/lib/opt ! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-broker-%{version}.jar \ ! %{buildroot}%{_awips2_directory}/lib/opt -! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-broker-%{version}-sources.jar \ -! %{buildroot}%{_awips2_directory}/lib/opt ! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-management-common-%{version}.jar \ ! %{buildroot}%{_awips2_directory}/lib/opt -! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-management-common-%{version}-sources.jar \ -! %{buildroot}%{_awips2_directory}/lib/opt ! install -pm 644 %{qpid_src_dir}/java/build/lib/plugins/qpid-broker-plugins-management-jmx-%{version}.jar \ ! %{buildroot}%{_awips2_directory}/lib/opt -! install -pm 644 %{qpid_src_dir}/java/build/lib/qpid-broker-plugins-management-jmx-%{version}-sources.jar \ +! install -pm 644 %{qpid_src_dir}/java/build/lib/plugins/qpid-broker-plugins-access-control-%{version}.jar \ +! %{buildroot}%{_awips2_directory}/lib/opt +! install -pm 644 %{qpid_src_dir}/java/build/lib/plugins/qpid-broker-plugins-firewall-%{version}.jar \ +! %{buildroot}%{_awips2_directory}/lib/opt +! install -pm 644 %{qpid_src_dir}/java/build/lib/plugins/qpid-broker-plugins-management-http-%{version}.jar \ ! %{buildroot}%{_awips2_directory}/lib/opt ! ! # scripts for broker @@ -234,9 +230,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec ! %dir /awips2/qpid/lib ! %dir /awips2/qpid/lib/opt ! /awips2/qpid/lib/opt/qpid-common-%{version}.jar -! /awips2/qpid/lib/opt/qpid-common-%{version}-sources.jar ! /awips2/qpid/lib/opt/qpid-management-common-%{version}.jar -! /awips2/qpid/lib/opt/qpid-management-common-%{version}-sources.jar ! %dir /awips2/qpid/lib/opt/qpid-deps ! /awips2/qpid/lib/opt/qpid-deps/* ! %doc /awips2/qpid/LICENSE @@ -248,7 +242,6 @@ diff -crB a/qpid-java.spec b/qpid-java.spec ! %dir /awips2/qpid/lib ! %dir /awips2/qpid/lib/opt ! /awips2/qpid/lib/opt/qpid-client-%{version}.jar -! /awips2/qpid/lib/opt/qpid-client-%{version}-sources.jar ! ! %files broker ! %defattr(-,awips,fxalpha,-) @@ -256,9 +249,10 @@ diff -crB a/qpid-java.spec b/qpid-java.spec ! %dir /awips2/qpid/lib ! %dir /awips2/qpid/lib/opt ! /awips2/qpid/lib/opt/qpid-broker-%{version}.jar -! /awips2/qpid/lib/opt/qpid-broker-%{version}-sources.jar ! /awips2/qpid/lib/opt/qpid-broker-plugins-management-jmx-%{version}.jar -! /awips2/qpid/lib/opt/qpid-broker-plugins-management-jmx-%{version}-sources.jar +! /awips2/qpid/lib/opt/qpid-broker-plugins-access-control-%{version}.jar +! /awips2/qpid/lib/opt/qpid-broker-plugins-firewall-%{version}.jar +! /awips2/qpid/lib/opt/qpid-broker-plugins-management-http-%{version}.jar ! %dir /awips2/qpid/log ! %defattr(755,awips,fxalpha,755) ! %dir /awips2/qpid/bin diff --git a/rpms/build/common/lookupRPM.sh b/rpms/build/common/lookupRPM.sh index eccee6371a..6fdf748d03 100644 --- a/rpms/build/common/lookupRPM.sh +++ b/rpms/build/common/lookupRPM.sh @@ -121,7 +121,7 @@ function lookupRPM() fi # awips2 rpms. - if [ "${1}" = "Installer.ncep-database" ]; then + if [ "${1}" = "awips2-ncep-database" ]; then export RPM_SPECIFICATION="${awips2_core_dir}/Installer.ncep-database" return 0 fi diff --git a/rpms/build/i386/build.sh b/rpms/build/i386/build.sh index b19bce49fb..c7469686ff 100644 --- a/rpms/build/i386/build.sh +++ b/rpms/build/i386/build.sh @@ -153,7 +153,7 @@ if [ "${1}" = "-delta" ]; then fi buildRPM "awips2" - buildRPM "Installer.ncep-database" + buildRPM "awips2-ncep-database" buildRPM "awips2-gfesuite-client" buildRPM "awips2-gfesuite-server" buildRPM "awips2-python" @@ -190,7 +190,6 @@ if [ "${1}" = "-full" ]; then if [ $? -ne 0 ]; then exit 1 fi - buildRPM "Installer.ncep-database" buildRPM "awips2-alertviz" buildEDEX if [ $? -ne 0 ]; then @@ -231,6 +230,7 @@ if [ "${1}" = "-full" ]; then buildRPM "awips2-gfesuite-server" buildRPM "awips2-hydroapps-shared" buildRPM "awips2-localapps-environment" + buildRPM "awips2-ncep-database" buildRPM "awips2-maps-database" buildRPM "awips2-notification" buildRPM "awips2-pypies" @@ -356,7 +356,6 @@ if [ "${1}" = "-edex" ]; then buildRPM "awips2-cli" buildRPM "awips2-gfesuite-client" buildRPM "awips2-gfesuite-server" - buildRPM "Installer.ncep-database" buildEDEX if [ $? -ne 0 ]; then exit 1 @@ -375,11 +374,6 @@ if [ "${1}" = "-qpid" ]; then fi if [ "${1}" = "-ldm" ]; then - # Ensure that the user has root privileges. - if [ ! ${UID} = 0 ]; then - echo "ERROR: You must have root privileges to build ldm." - exit 1 - fi buildRPM "awips2-ldm" exit 0 diff --git a/rpms/build/x86_64/build.sh b/rpms/build/x86_64/build.sh index 1ad54435b8..4735b1a7b8 100644 --- a/rpms/build/x86_64/build.sh +++ b/rpms/build/x86_64/build.sh @@ -128,6 +128,7 @@ if [ "${1}" = "-postgres" ]; then buildRPM "awips2-database-standalone-configuration" buildRPM "awips2-database" buildRPM "awips2-maps-database" + buildRPM "awips2-ncep-database" buildRPM "awips2-pgadmin3" exit 0 @@ -216,6 +217,9 @@ if [ "${1}" = "-full" ]; then buildRPM "awips2-notification" buildRPM "awips2-python-shapely" buildRPM "awips2-postgres" + buildRPM "awips2-database" + buildRPM "awips2-maps-database" + buildRPM "awips2-ncep-database" buildRPM "awips2-pgadmin3" buildRPM "awips2-ldm" exit 0 diff --git a/tests/.classpath b/tests/.classpath index a544166a7a..908d221eab 100644 --- a/tests/.classpath +++ b/tests/.classpath @@ -73,6 +73,7 @@ + @@ -91,5 +92,6 @@ + diff --git a/tests/data/Redbook/PEIE62_KWBC_220000_47780640.rb.Input b/tests/data/Redbook/PEIE62_KWBC_220000_47780640.rb.Input new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/data/Redbook/PGIE05_KKCI_220000_48000964.rb.Input b/tests/data/Redbook/PGIE05_KKCI_220000_48000964.rb.Input new file mode 100644 index 0000000000..37c6c4c5dc Binary files /dev/null and b/tests/data/Redbook/PGIE05_KKCI_220000_48000964.rb.Input differ diff --git a/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Headers b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Headers new file mode 100644 index 0000000000..600e309a02 --- /dev/null +++ b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Headers @@ -0,0 +1,9 @@ +traceId +PMNA01_KWNS_220049_47355211.rb +ingestfilename +./data/Redbook/PMNA01_KWNS_220049_47355211.rb.Input +camelbeanmethodname +/awips2/edex/data/manual/PMNA01_KWNS_220049_47355211.rb +camelfilelastmodified +PMNA01_KWNS_220049_47355211.rb +jmsreplyto diff --git a/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Input b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Input new file mode 100644 index 0000000000..487d584645 Binary files /dev/null and b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Input differ diff --git a/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.RedbookData b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.RedbookData new file mode 100644 index 0000000000..c96e4ff217 Binary files /dev/null and b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.RedbookData differ diff --git a/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Result b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Result new file mode 100644 index 0000000000..bd2757dd2a --- /dev/null +++ b/tests/data/Redbook/PMNA01_KWNS_220049_47355211.rb.Result @@ -0,0 +1 @@ + diff --git a/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Headers b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Headers new file mode 100644 index 0000000000..3bdc3b58aa --- /dev/null +++ b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Headers @@ -0,0 +1,9 @@ +traceId +PSBB08_KWNH_220000_46836601.rb +ingestfilename +./data/Redbook/PSBB08_KWNH_220000_46836601.rb +camelbeanmethodname +/awips2/edex/data/manual/PSBB08_KWNH_220000_46836601.rb +camelfilelastmodified +PSBB08_KWNH_220000_46836601.rb +jmsreplyto diff --git a/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Input b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Input new file mode 100644 index 0000000000..e6164a3188 Binary files /dev/null and b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Input differ diff --git a/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.RedbookData b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.RedbookData new file mode 100644 index 0000000000..86956d2cd7 Binary files /dev/null and b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.RedbookData differ diff --git a/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Result b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Result new file mode 100644 index 0000000000..a113cd8b9d --- /dev/null +++ b/tests/data/Redbook/PSBB08_KWNH_220000_46836601.rb.Result @@ -0,0 +1 @@ +FCST_USED diff --git a/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Headers b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Headers new file mode 100644 index 0000000000..bcb81d5f1c --- /dev/null +++ b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Headers @@ -0,0 +1,9 @@ +traceId +PYMA20_KWBC_220000_47396312.rb +ingestfilename +./data/Redbook/PYMA20_KWBC_220000_47396312 +camelbeanmethodname +/awips2/edex/data/manual/PYMA20_KWBC_220000_47396312.rb +camelfilelastmodified +PYMA20_KWBC_220000_47396312.rb +jmsreplyto diff --git a/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Input b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Input new file mode 100644 index 0000000000..8aed1c3716 Binary files /dev/null and b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Input differ diff --git a/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.RedbookData b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.RedbookData new file mode 100644 index 0000000000..8161c263bf Binary files /dev/null and b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.RedbookData differ diff --git a/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Result b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Result new file mode 100644 index 0000000000..03d785c79e --- /dev/null +++ b/tests/data/Redbook/PYMA20_KWBC_220000_47396312.rb.Result @@ -0,0 +1 @@ + diff --git a/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/IntegrationTestDbInit.java b/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/IntegrationTestDbInit.java index 2aef0465cc..516007b2b5 100644 --- a/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/IntegrationTestDbInit.java +++ b/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/IntegrationTestDbInit.java @@ -19,10 +19,6 @@ **/ package com.raytheon.uf.edex.datadelivery.bandwidth; -import java.sql.SQLException; - -import org.hibernate.cfg.AnnotationConfiguration; - import com.raytheon.uf.edex.datadelivery.bandwidth.dao.IBandwidthDbInit; /** @@ -35,6 +31,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.dao.IBandwidthDbInit; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 12, 2012 0726 djohnson Initial creation + * Apr 30, 2013 1960 djohnson Remove unnecessary methods. * * * @@ -51,22 +48,4 @@ public class IntegrationTestDbInit implements IBandwidthDbInit { public void init() { // Nothing required } - - /** - * {@inheritDoc} - */ - @Override - public void dropTables(AnnotationConfiguration aConfig) throws SQLException { - // Nothing required - - } - - /** - * {@inheritDoc} - */ - @Override - public void createTables(AnnotationConfiguration aConfig) - throws SQLException { - // Nothing required - } } diff --git a/tests/resources/res/conf/RedbookBlocks.properties b/tests/resources/res/conf/RedbookBlocks.properties new file mode 100644 index 0000000000..97b1025d00 --- /dev/null +++ b/tests/resources/res/conf/RedbookBlocks.properties @@ -0,0 +1,4 @@ +001_001=com.raytheon.edex.plugin.redbook.common.blocks.ProductIdBlock +001_002=com.raytheon.edex.plugin.redbook.common.blocks.EndOfProductBlock +004_016=com.raytheon.edex.plugin.redbook.common.blocks.Block_004_016 +004_017=com.raytheon.edex.plugin.redbook.common.blocks.Block_004_017 diff --git a/tests/unit/com/raytheon/edex/plugin/redbook/RedbookDecoderTest.java b/tests/unit/com/raytheon/edex/plugin/redbook/RedbookDecoderTest.java new file mode 100644 index 0000000000..a210a18611 --- /dev/null +++ b/tests/unit/com/raytheon/edex/plugin/redbook/RedbookDecoderTest.java @@ -0,0 +1,286 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.edex.plugin.redbook; + +import static org.junit.Assert.assertEquals; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; + +import org.junit.Test; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.exception.DecoderException; +import com.raytheon.edex.plugin.redbook.common.RedbookRecord; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.localization.PathManagerFactoryTest; +import com.raytheon.uf.common.util.FileUtil; +import com.sun.xml.internal.ws.util.ByteArrayBuffer; + +/** + * Regression Test RedbookRecords decoded by the RedbookDecoder against known + * decoder output. + * + *
        + * 
        + * SOFTWARE HISTORY
        + * 
        + * Date         Ticket#    Engineer    Description
        + * ------------ ---------- ----------- --------------------------
        + * Apr 22, 2013 1958       bgonzale     Initial creation
        + * 
        + * 
        + * + * @author bgonzale + * @version 1.0 + */ + +public class RedbookDecoderTest { + + final static String DataDir = "./data/Redbook"; + + private class RedbookTest { + public final byte[] rawMessage; + + public final Headers headers; + + public final RedbookRecord result; + + public final String id; + + public RedbookTest(byte[] rawMessage, Headers headers, + RedbookRecord result, byte[] redbookData, String id) { + super(); + this.rawMessage = rawMessage; + this.headers = headers; + this.result = result; + if (result != null && redbookData != null) { + this.result.setRedBookData(redbookData); + } + this.id = id; + } + + public boolean hasResults() { + return result != null; + } + + } + + private static class RedbookInput { + + private static final String DOT = "."; + + private static final String HEADERS_EXT = ".Headers"; + + private static final String RESULT_EXT = ".Result"; + + private static final String REDBOOKDATA_EXT = ".RedbookData"; + + private static FilenameFilter inputExtensionFilter = new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".Input"); + } + }; + + public final File inputFile; + + public final File headersFile; + + public final File resultFile; + + public final File resultRedbookDataFile; + + public final String id; + + public RedbookInput(File inputFile) { + String inputPath = inputFile.getAbsolutePath(); + int indexOfExtension = inputPath.lastIndexOf(DOT); + String nameNoExtension = inputPath.substring(0, indexOfExtension); + + this.inputFile = inputFile; + this.headersFile = new File(nameNoExtension + HEADERS_EXT); + this.resultFile = new File(nameNoExtension + RESULT_EXT); + this.resultRedbookDataFile = new File(nameNoExtension + + REDBOOKDATA_EXT); + this.id = nameNoExtension.substring(nameNoExtension + .lastIndexOf(File.separator) + 1); + } + + public boolean hasHeaders() { + return this.headersFile != null && this.headersFile.exists(); + } + + public boolean hasResult() { + return this.resultFile != null && this.resultFile.exists(); + } + + public static RedbookInput[] getInputs() { + File dataDir = new File(DataDir); + File[] inputFiles = dataDir.listFiles(inputExtensionFilter); + RedbookInput[] inputs = new RedbookInput[inputFiles.length]; + int index = -1; + for (File inputFile : inputFiles) { + RedbookInput input = new RedbookInput(inputFile); + inputs[++index] = input; + } + return inputs; + } + + } + + private Collection tests; + + public RedbookDecoderTest() throws IOException { + PathManagerFactoryTest.initLocalization(); + tests = new ArrayList(); + // load test byte arrays, test header data, and result objects. + InputStream inStrm = null; + ByteArrayBuffer outStrm = null; + + for (RedbookInput redbookInput : RedbookInput.getInputs()) { + byte[] rawMessage = null; + Headers headers = null; + RedbookRecord result = null; + byte[] redbookData = null; + + // read rawMessage + rawMessage = FileUtil.file2bytes(redbookInput.inputFile); + + // read header data + if (redbookInput.hasHeaders()) { + headers = new Headers(); + BufferedReader reader = null; + try { + inStrm = new FileInputStream(redbookInput.headersFile); + reader = new BufferedReader(new InputStreamReader(inStrm)); + String headerName = null; + String value = null; + while ((headerName = reader.readLine()) != null) { + value = reader.readLine(); + if (value != null) { + headers.put(headerName, value); + } + } + } finally { + try { + if (inStrm != null) { + inStrm.close(); + inStrm = null; + } + } finally { + if (reader != null) { + reader.close(); + reader = null; + } + } + } + } + + // read result + if (redbookInput.hasResult()) { + try { + JAXBContext con = JAXBContext + .newInstance(RedbookRecord.class); + Unmarshaller unmarshaller = con.createUnmarshaller(); + result = (RedbookRecord) unmarshaller + .unmarshal(redbookInput.resultFile); + fixTimeObs(result); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // read result redbook data + try { + redbookData = FileUtil + .file2bytes(redbookInput.resultRedbookDataFile); + } catch (FileNotFoundException e) { + // if a result file is not found then the input file does not + // produce a result. + redbookData = null; + } + + RedbookTest test = new RedbookTest(rawMessage, headers, result, + redbookData, + redbookInput.id); + tests.add(test); + } + } + + private static void fixTimeObs(RedbookRecord record) { + if (record != null) { + Calendar cal = record.getTimeObs(); + Calendar newCal = GregorianCalendar.getInstance(TimeZone + .getTimeZone("Zulu")); + newCal.setTimeInMillis(cal.getTimeInMillis()); + record.setTimeObs(newCal); + } + } + + /** + * Test method for + * {@link com.raytheon.edex.plugin.redbook.RedbookDecoder#decode(byte[], com.raytheon.edex.esb.Headers)} + * . + * + * @throws DecoderException + */ + @Test + public void testDecode() throws DecoderException { + RedbookDecoder decoder = new RedbookDecoder(this.getClass().getName()); + + for (RedbookTest test : tests) { + PluginDataObject[] result = decoder.decode(test.rawMessage, + test.headers); + int expectedNumberOfResults = test.hasResults() ? 1 : 0; + assertEquals(test.id + + " Failure, incorrect number of results returned for " + + test.id, expectedNumberOfResults, result.length); + RedbookRecord expectedResult = (RedbookRecord) (test.hasResults() ? test.result + : null); + RedbookRecord actualResult = (RedbookRecord) (result.length > 0 ? result[0] + : null); + + // insert times have to match to perform comparison + if (expectedResult != null && actualResult != null) { + actualResult.setInsertTime(expectedResult.getInsertTime()); + } + assertEquals( + test.id + + " Failure, decoder output does not match regression test value for " + + test.id, expectedResult, actualResult); + } + } + +} diff --git a/tests/unit/com/raytheon/uf/common/serialization/TestJaxbableClassesLocator.java b/tests/unit/com/raytheon/uf/common/serialization/TestJaxbableClassesLocator.java index e534b58de4..da69e7cc65 100644 --- a/tests/unit/com/raytheon/uf/common/serialization/TestJaxbableClassesLocator.java +++ b/tests/unit/com/raytheon/uf/common/serialization/TestJaxbableClassesLocator.java @@ -55,6 +55,7 @@ public class TestJaxbableClassesLocator implements IJaxbableClassesLocator { private static final List JAXB_CLASSES; static { Class[] array = new Class[] { + com.raytheon.edex.plugin.redbook.decoder.RedbookFcstMap.class, com.raytheon.uf.common.datadelivery.registry.AdhocSubscription.class, com.raytheon.uf.common.datadelivery.registry.Connection.class, com.raytheon.uf.common.datadelivery.registry.Coverage.class,