skip to main content
Prior Release Notes : Release Notes Version 4.0
Release Notes Version 4.0
Special Attention Notes
• Prior to this release, a bug was preventing the Maximum Iterations on accounting slots from being checked. This bug is fixed for RiverWare 4.0 so models will now abort if an accounting slot is set more than the maximum number of iterations on a given timestep. It is possible that existing models have been violating this restriction all along. If this is the case, these models will now abort. The user will need to increase the Maximum Iterations on accounting slots for the model to run completely again. This is done by selecting View->Simulation Run Parameters from the Run Control dialog box.
• RiverWare is now available for the Windows 2000 platform. RiverWare will also run on NT, however, it is only supported for Windows 2000. Important information about using the Windows executable is included below in the RiverWare for Windows 2000 section.
• Rulesets saved in the new release CANNOT be used in older executables. There is no message to warn the user about this. Rulesets saved under previous executables CAN be used with the new release however.
• The Stage Table Lookup method on Reach objects was enhanced to compute the Outflow Stage when the reach is solving downstream. Prior to this change, Outflow Stage was only computed when the reach was solving upstream. Because existing models may not have data in the Outflow Stage Table, the table interpolation may fail during the execution of this method. This will prompt a warning message that will not stop the run and will not affect results. However, if the user does not wish to see the warning message, data will need to be input to the Outflow Stage Table.
Required Model File Updates
Unit Ramping Cost Slot
In optimization models, the Unit Ramping Cost table slot has been removed from the Thermal object (the Ramping Cost series slot is still available). Users still wishing to utilize the Unit Ramping Cost slot can select it from the Ramping Modeling method category on Power Reservoir objects. See the Optimization section of the release notes for more details.
Maximum Iterations on Account Slots
Prior to this release, a bug was preventing the Maximum Iterations on accounting slots from being checked. This bug is fixed for RiverWare 4.0 so models will now abort if an accounting slot is set more than the maximum number of iterations on a given timestep. It is possible that existing models have been violating this restriction all along. If this is the case, these models will now abort. The user will need to increase the Maximum Iterations on accounting slots for the model to run completely again. This is done by selecting View->Simulation Run Parameters from the Run Control dialog box.
Model Loading
Local Inflow Solution Direction
When loading a model, RiverWare gives a warning letting the user know that the Local Inflow Solution Direction category name is replacing the localInflowCalculationCategory category name. The Local Inflow Solution Direction method category allows the user to choose which direction RiverWare solves on a Reach object. After you save your model in RiverWare 4.0, these warnings will not show up the next time you load the model. See the Simulation Objects section of the online help for more details.
Some “SeriesSlots” changed to “AggSeriesSlots”
Some SeriesSlots have been converted to AggSeriesSlots. When loading old models, diagnostics messages may be generated as old slot types are automatically converted to new slot types:
Trying to convert former slot type (“SeriesSlot”) to new slot type (“AggSeriesSlot”).
Do not be concerned by these messages. You do not need to make any changes to your model. The use and functionality of these slots has not changed.
RiverWare for Windows 2000
RiverWare is now available and supported for Windows 2000 (it will also run on NT but CADSWES is supporting Windows 2000). The user should be aware of the following differences that exist in RiverWare for Windows:
• Middle-mouse features such as QuickLink or rearranging the rows in the run analysis dialog are activated with the combination (pressed in this order): Alt + right mouse button + left mouse button.
• QuickLink can also be activated using the right-mouse button.
• The Locator View window often gets in a bad state when you resize the main workspace.
• It is possible that the objects may get shifted off the workspace if the workspace window is resized in certain ways. In order to make the objects visible again, you must save the model then reload it. Reloading the model will shift the model so that all objects are visible on the workspace.
• Ruleset files can be moved from unix to windows without modification. To move a Ruleset file from Windows to Unix you must run dos2unix on the ruleset file.
• Plotting is not supported on Windows.
• Optimization is not supported on Windows.
• The Windows DMI executable can be a DOS batch file or any other windows executable that can be run directly from a command shell.
• When saving model files that you intend to move between windows and unix systems, always save with the .gz extension. This saves the model in a binary format that is the same on windows and unix.
General RiverWare
Optional Keyword for AggSeries Slots in DMIs
There is a new optional keyword for use in the DMI User Control File. The “aggregate” keyword is used to specify whether or not the DMI should import/export all time series slot on an AggSeries slot or just the first time series column.
aggregate = <true> or <false>
The term “aggregate” is an optional keyword=value pair (KV pair) for import and export. If present, with the value “true”, and if the slot indicated is an AggSeries slot, the data file is expected to (on import) or will (on export) contain data for all subslots (columns) in the AggSeries slot. If the KV pair is absent, or if its value is “false”, only the data for the first subslot (column) of the AggSeries slot are present.
When AggSeries slot data are imported or exported in toto, the data are in row-major format, one timestep per line. The subslots of the aggregation must be homogeneous in start-date, end-date and step size, and all subslots (columns) must be represented on each line.
If used with the ‘flags=true’ KV pair, the data will appear in the form:
value flag value flag value flag ...
If the named slot is in fact the first subslot (column) of an AggSeries slot, the behavior is the same as if the subslot (column) name were absent.
Object Icon in Open Object/Slot Dialog
An object icon has been added to every Open Object and Open Slot dialog. This shows the user the type of object that the Open Object or Open Slot dialog originated from.
Resume Run
Functionality has been added to allow users to resume a stopped or aborted run. When a run is stopped or aborted, a resume button appears on the Run Control dialog. After clicking the resume button, a warning appears that says “Resuming a stopped or aborted run will likely corrupt the model’s output! Resuming from a stopped or aborted run should be used for model and rule debugging purposes ONLY. Validity of output NOT guaranteed.” The user is then able to select the timestep at which the run should resume. This feature is useful to debug large, long running models. This new resume feature allows the user to fix the problem and continue the run. As the warning suggests, the results are not guaranteed and the model must be rerun to test that changes have not affected previous timesteps. The resume functionality does not support accounting models at this time.
Command Line Options
Three new command line options were added. The --ruleset option invokes the ruleset editor for the specified ruleset. The --model option was added to replace the --file option to load a model file. The --file option is still supported but may be eliminated in the future. Finally, a --noprefs option was added to prevent the user interface from loading the user’s preferences. This may be useful if the user’s preferences become corrupted. The user’s preferences consist of window sizing and positioning, and how rules are formatted. All of the command line options are explained by typing riverware --help.
Deleting Links with Quick Link Editor
A button was added to the Quick Links dialog (middle mouse button over a link) to allow users to delete links. This was implemented to allow users to easily delete hidden links. Links between slots become hidden when their dependent methods are deselected. Previously, users would have to reselect the correct method to un-hide the link and then delete it.
Synchronize Workspace Objects to Specified Time Interval
A new dialog was added to enhance the ability to synchronize workspace objects to a specified time interval. Previously, there were menu options to synchronize all or selected objects to the run control. Now, there is a dialog box (see below) that allows the user to synchronize all or selected objects with the run control or to a specified time interval. A toggle button was also added to the same dialog to allow users to synchronize the timesteps or time interval for accounting slots on all or selected objects. The new time interval must encompass the run control time interval.
Plot Directly to File
The output manager was enhanced to allow a plot to be exported to a file instead of directly to the plotter program. This was implemented to overcome memory problems with large models that were not able to fork processes to execute the plotter program. To load a plot into xmgr use the following command in a terminal window:
pxmgr -batch YourPlotFileName
Simulation Objects
The following enhancements to the RiverWare simulation objects are described briefly. The user is encouraged to consult the Simulation Objects Documentation in the online help for more detailed descriptions of the enhancements to the objects and their methods.
Reach
Local Inflow Solution Direction Category
The name of the category LocalInflowCalculationCategrory was changed to Local Inflow Solution Direction to more generally describe the types of methods in the category. Methods in the category allow the user to select the type of local inflow calculation and limit the solution direction, i.e., the dispatch methods available. When a model with the old category name is loaded, the category names are changed and a warning is posted, but model results are not affected.
LocalInflowDownstreamOnly method
A new method, LocalInflowDownstreamOnly, was added to the Local Inflow Solution Direction category. This method, available only with the noRouting method selected, forces the reach to solve downstream only by limiting the available dispatch methods to solveNROutflow. The method is especially useful in Rulebased Simulation models for reaches that always solve downstream or models where rule priorities force the reach to solve in the wrong direction.
Seepage and Riparian CU Loss method
A new method, Seepage and Riparian CU Loss, was added to the Seepage Calc category. It is only available when using the noRouting method in the routing method category and LocalInflowDownstreamOnly in the Local Inflow Solution Direction category. It models seepage and loss from a reach by an empirical equation with inflows and consumptive use as inputs. More information can be found in the Simulation Objects Documentation online.
Reservoir
Input Seepage method
A new method, Input Seepage, was added to the Seepage Calculation category to allow users to input the seepage or set the seepage with a rule.
Rulebased Simulation
Rule Agenda Order
An enhancement has been made to the Ruleset Editor to allow the user to specify whether the rule agenda will execute in ascending or descending priority order. This functionality was added to allow the user to decide which rule execution order is most appropriate. The user must select whether to execute the rules in the descending rule priority, 1, 2, 3, ..., or in ascending rule priority, ..., 3, 2, 1. (Remember rule 1 has a higher priority than rule 3) Rulesets, by default, will execute 1, 2, 3, ... and existing models are not affected. From the main Ruleset Editor dialog, select the triangle in the lower left corner to expand the window and access this option.
Rules Formatting and Printing
Functionality has been added to allow the user to format and print the rules. The user can configure line breaking and indenting in the Ruleset Layout Editor (accessed by selecting Ruleset->Ruleset Layout from the main Ruleset Editor). This is useful to prevent long, single line rules that do not fit on the screen. The user specifies the line breaking and indenting both before and after a rule statement or variable (e.g., IF, DO, +, <expr>). The ruleset, group, or a single rule can be printed to either the printer or a postscript file by selecting File->Print Ruleset from the Ruleset Editor dialog. The user can select the font, orientation, and whether various descriptors are printed. The user preferences, layout and printer settings, can be imported/exported to an ASCII file. This is useful if a user has a desired ruleset layout and would like to configure different rulesets and models to look the same.
New Palette Functions
WeightedSum
A new palette function called WeightedSum is available on the Rule Palette. The function calculates the normalized weighted sum of a list of numbers. The function takes two arguments, a list of values to be summed and a list of the weights of the values. It calculates the weighted sum as:
See the Rulebased Simulation Documentation online for more information.
Hypothetical Target Simulation (HypTargetSim)
A new palette function called HypTargetSim is available on the Rule Palette. This function finds a value which, when set on a given slot, will lead to a desired value on another slot. Given a control slot and a target slot, target date/time, and target value, the HypTargetSim function uses hypothetical simulation (see description of the predefined function HypSim) to find a value x such that if the control slot were set to x at all timesteps in the range [current date, target date], then the target slot’s value would equal the target value. The return type of this function is a NUMERIC with the value x. Details on the use of this function and the syntax involved are available in the Rulebased Simulation documentation online.
Hypothetical Target Simulation With Status (HypTargetSimWithStatus)
A new palette function called HypTargetSimWithStatus is available on the Rule Palette. This function finds a value which, when set on a given slot, will lead to a desired value on another slot. If a value satisfying this criterion is not found, then an attempt is made to find a value that comes close to doing so. Given a control slot and a target slot, target date/time, and target value, the HypTargetSimWithStatus function uses hypothetical simulation (see description of the predefined function HypSim) to find a value x such that if the control slot were set to x at all timesteps in the range [current date, target date], then the target slot’s value would equal the target value. A two-item list is returned. The first item in the list is a boolean TRUE value if a satisfying control slot value was found, FALSE otherwise. If the first item is TRUE, then the second item is the satisfying control slot value, otherwise this value is as close as the function could get to finding such a value.
Note: this function is very similar to HypTargetSim: this only difference is that HypTargetSim fails if it can not find a satisfying control slot value, whereas this function does not fail, rather it still returns a value, along with the indication that this value does not achieve the target.
Details on the use of this function and the syntax involved are available in the Rulebased Simulation documentation online.
Water Accounting
Max Iterations Bug Fixed
Prior to this release, a bug was preventing the Maximum Iterations on accounting slots from being checked. This bug is fixed for RiverWare 4.0 so models will now abort if an accounting slot is set more than the maximum number of iterations on a given timestep. It is possible that existing models have been violating this restriction all along. If this is the case, these models will now abort. The user will need to increase the Maximum Iterations on accounting slots for the model to run completely again. This is done by selecting View->Simulation Run Parameters from the Run Control dialog box.
Object Account Summary Dialog
An Object Account Summary dialog has been added to display summary information about the accounts on an object. This new feature can be accessed by selecting Account->Summary from the Accounts view of the Open Object dialog. The dialog shows the sum of each series slot (inflow, outflow, etc.) for all accounts on the selected object. In addition, filters are available to view only the information for each water owner and water type. This dialog is a useful tool to determine the total accounting inflows, outflows, and storage for a given object.
Diversion Accounts
Functionality has been added to diversion accounts on Water User Objects and Aggregate Diversion Sites. Given a value in the Diversion slot, the diversion account solves for either Return Flow or Depletion depending on which slot is known and which is unknown. If neither Depletion nor Return Flow are known, Depletion is set to Diversion and Return Flow is set to zero. The Diversion slot on the diversion account can only be linked (using supplies) to the newly implemented diversion slot on a pass through account. Return flows from the diversion account can be linked (via supplies) back to the return flow on a pass through account (either the same account being diverted from, or a downstream account). Diversion accounts can be added to Water User objects or to Aggregate Diversion Sites when using the Lumped linking structure.
Inflow/Outflow and Diversion/Return Flow Supply Type
All accounting supplies have been assigned either an Inflow/Outflow or Diversion/Return Flow type. This is necessary to prevent selection of incorrect sources for supplies. The user must now specify the type of supply desired before the source accounts become visible. The Inflow/Outflow supply type is used to link an account to an upstream account. In this case, the supply will link the Outflow of the upstream account to the Inflow of the downstream account. The Diversion/Return Flow supply type is used to link pass through accounts to diversion accounts. In this case, the supply will link the Diversion slot on the pass through account to the Diversion slot on the diversion account (if created from the diversion account), or it will link the Return Flow slot on the diversion account to the Return Flow slot on the pass through account (if created from the pass through account).
Linking Pass Though Accounts and Diversion Accounts
Diversion and return flow slots have been added to pass through accounts. These slots should be used to link pass through accounts to diversion accounts. On the diversion account, the user should create a supply that names the pass through account, from which water is being diverted, as the source to the diversion account in question. This will create a supply between the Diversion slot on the pass through account and the Diversion slot on the diversion account. The user would then go to the pass through account that is receiving the return flow from the diversion account. Here the user should create a supply that names the diversion account as the source. This will create a supply between the Return Flow slot on the diversion account and the Return Flow slot on the pass through account. When creating these supplies, on both the diversion account and pass through account, the user should be creating supplies that are of the type Diversion/Return Flow.
Account Demands
In the account configuration dialog, a tab has been added to show the demands from an account. This information in this dialog is read only, the user still must configure the supplies on downstream accounts. However, this new tab is useful to show the supplies that both connect the account in an upstream and downstream direction.
New User Defined Accounting Method Categories
Pass Through Acct Gain Loss
A new accounting level method category, Pass Through Acct Gain Loss, was added to the Reach object. This category only appears when an accounting controller is chosen from the Run Control dialog. This method category allows users to write and select Object Level Accounting Methods that set the GainLoss slot on Pass Through Accounts on reaches. Prior to the introduction of this category, the GainLoss slot on a Pass Through Account could only be computed in terms of an optional Gain Loss Coefficient (input through the account configuration dialog), which indicated the fractional portion of the flow which was lost. If the user has input a Gain Loss Coefficient and has also created and selected a method in the Pass Through Acct Gain Loss category that sets the GainLoss slot on the same account, the Gain Loss Coefficient will be ignored.
Agg Diversion and Water User Reconciliation
A method category was added to the AggDiversionSite and Water User objects to contain user defined accounting methods for reconciling accounting water with the physical water. The categories are named Agg Diversion Reconciliation and Water User Reconciliation, respectively. These categories contain no methods so it is the responsible for the user to write these methods using the RiverWare Policy Language. Once the methods are created, they will appear, and can be selected, in the new categories.
Supply Slots in the SCT
Accounting supply slots can now be selected and used in the Simulation Control Table (SCT).
Optimization
• User defined subbasins can now have "types" such as No optimization, preferred customer, etc. Previously, these basins had to have special names. Now they can be named anything, but they need to have the appropriate type associated with them.
• Objectives can now be relaxed for later priorities. For example, objective must be within 5% of optimality, or within $100,000 of optimality. This feature is accessed by selecting Objective Min (or Max) w/ Flexibility instead of Objective Min (or Max). This selection will introduce an additional line in to the constraint editor where the user may create an expression representing the flexibility. The expression must evaluate to a constant. In addition, this line has a button to select if this value should be interpreted as a fraction of the optimal objective or an absolute quantity to relax the objective.
• Kentucky and Barkley have always been assumed to be connected to the adjoining canal using particular ends of the canal: Barkley to the "1" side and Kentucky to the "2" side. This requirement is because the canal flow equation is not symmetric with respect to these reservoirs. This requirement has been noted in the online documentation, but nothing in the code prevented a user from making incorrect links. With this release the connections are enforced and an incorrect connection will result in an error message.
• Previously the optimization formulation treated the canal symmetrically. The formulation now uses the same asymmetric formula as in simulation. (Because of linearization error, the representation remains approximate.)
• Diversion objects can now be included in optimization. The Diversion slot is a CPLEX variable, while the following slots are linearized as specified:
– Available for Diversion: a function of head using the Gravity Head Flow Table,
– Head: Diversion Intake Elevation - Diversion Base Elevation, and
– Diversion Intake Elevation: substitute with linked slot.
– All other slots are expected to be constant.
– The only physical constraint is that Diversion <= Available for Diversion.
• Optimization computes both spill and canal flows based on the average of the current and past elevation. Previously, simulation did this, but optimization used only the current time step’s elevation.
• The preferred customers modeling has been revised as previously planned. Users select the preferred customer method and specify a set of reservoirs to be in a preferred customer subbasin. The reservoirs may be a mixture of optimized reservoirs and reservoirs with energy that is allocated each day but the total is fixed rather than optimized. The Preferred Customer Energy is a CPLEX variable on the thermal object with lower bound of zero and upper bound equal to the sum of maximum energy generation for each of the subbasin members. A physical constraint is added that requires the sum of energy produced by the subbasin to be greater than or equal to the Preferred Customer Energy variable. The existing equations referencing system energy generation have been modified to subtract the preferred customer energy variable from the total generation. The modeling is completed when the user adds a policy constraint on the preferred customer energy, e.g. Thermal Object.Preferred Customer Energy >= Data Object.Energy Request
• Many model files contain extra optimization columns on slots that are no longer in use. These columns will be removed automatically.
• The use of the inflow2 slot has been modified. If the inflow2 slot on a reservoir is not linked, the optimization will expect values should be put in the simulation column. If the inflow2 slot is linked then the values will come from the linked slot. This was related to bug 2578.
• Turbine ramping is now modeled for each power reservoir when the trackRamping method is selected. This method creates two CPLEX variables to track increases and decreases in turbine ramping with the following physical constraint:
– Turbine Increase - Turbine Decrease = Turbine Release - Turbine Release(-1).
– In addition, each power reservoir has a table slot to hold the Unit Ramping Cost and a series slot that combines the costs:
– Ramping Cost = Unit Ramping Cost * (Turbine Increase + Turbine Decrease)
– After selecting methods, users can link corresponding MultiSlots on the thermal object to the individual reservoir slots: Turbine Increase, Turbine Decrease, and Ramping Cost. By referencing Thermal Object.Ramping Cost in an objective function users can minimize the total system ramping cost.
• The potential approximation error for piecewise approximations has been reduced by automatically adding a set of cuts. The worst possible error now is along a line connecting the first and last approximation points.
• "Hole cuts" are now added to the model when the appropriate method is selected on power reservoirs. When selected, cuts are added as physical constraints that reduce the incidence of holes in the schedule. The cuts constrain the segments of the piecewise linearization of power:
segment(i,t) <= segment(i,t-1) + segment(i,t+1) - segment length(i) for all i
• Both optimization and simulation now model fractional timesteps in expressions. These expressions are modelled in a way that is similar to the existing modelling of fractional time lags in reaches.e.g.
outflow[5.2] translates to: 0.8 outflow[5] + 0.2 outflow[6]
This had been filed as bug 803.
• Users can now define optimization variables without a change in the RiverWare code. Any Series Slot on a Data Object that starts with a name of "RW" will be treated as a CPLEX variable. The user can then add whatever policy constraints are necessary for the variable to have the desired behavior.
• A new method has been added to initialize turbine release to zero if it is missing (NaN). The method was added in part because of automatic generation of piecewise segments for period zero required by other enhancements.
• Code has been added to the table slot which will automatically eliminate piecewise segments during creation if the curvature is incorrect. A warning is still issued and the table is not changed.
• The automation of power linearization worked only in limited circumstances and has been repaired to work more generally. In addition, we added diagnostics for inconsistent power tables.
• When CPLEX terminates with a status hinting at numerical instability we automatically reset the CPLEX parameters to be exceedingly tolerant of numerical difficulty. We issue a warning and re-optimize.
• Automatic restart for objective functions has been turned off because of evolution of the models. Restarting at any time seems to do more harm than good. If the model is regularly restarting, we recommend increasing the time limit as necessary: under "Goal Parameters", change "Initial Time Limit".
• We increased the maximum number of pieces in a piecewise approximation from 20 to 30 to facilitate using every operating point of the power curve in the "many pieces" model.
• We added functionality to identify rows that are forcing a slot (or even an expression) to a single value. Use this fact to identify additional fixed variables both for reporting in the OptAnalyst as well as improving the speed and numerical stability of the optimization.
• We added a similar check on cuts that were forcing lambda variables to zero.
• Extrapolation of spill tables was improved by basing the extrapolation on storage for Level Power Reservoirs.
• Cut constraints have been improved to make them more useful by
– a. allowing cuts on constraints where the right hand side varies,
– b. generating additional cuts after splitting equations, and
– c. removing automatic generation of initial BWL point when the method to "reduce" cut constraints is activated. The initial point is both less useful and interferes with reducing in this case.
• Patrick Lynn improved the performance of Optimization runs which involve constraint sets with disabled constraints. During these runs, if the user had selected the option to write the CPLEX problem description to log files, then considerable time was spent doing this for disabled constraints. We don’t now bother to write anything out in this situation because no new optimization is done for disabled goals and so the problem contains no new information.
• We made the following enhancements to diagnostics:
– Missing applicability limits for initial inflow.
– Min and max inconsistent with approximation points.
– Constraints that attempt to force slots beyond bounds.
– Moved an infeasibility warning that was misplaced.
– Preferred customer warnings
– Numerical instability: problems that go from feasible to infeasible.
– Improved the context of many diagnostic messages.
– Made curvature checking less finicky for power data.
– Warning if the initial value is greater than a slot’s upper bound.
– No longer issue certain warnings for cut constraints.
– Prevent LHS >= RHS type warnings for constraints with frozen variables.
– Abbreviated some very long names for cuts.
– Updates of objective function values for MiniMax constraints whenever the objective value improves.
• The following bug fixes were made for code related at least partially to optimization. Some bugs were fixed immediately and do not have bug numbers.
– 2834: Optimization cannot be rerun.
– 2850: When saving a constraint set, model core dumps.
– CPLEX bug: writing files changes pivots.
– Incorrect cplex parameters.
– Incomplete detection of constraints inactive by Nan.
– The value -0.0 being returned by optimization.
– Incomplete detection of out of order piecewise variables.
– Inadvertent deactivation of curvature checks.
– An error message causing core dumps.
– We invalidated rows that contain only a Z variable.
– Changes in optComputeFixedOutflows to accommodate a bug fix for the problem of variable days in the month.
– Incorrect arguments in a call to notifyAddRowToProblem.
Closed Bug Reports
Bug Fixes
The following is a list of the bugs which were fixed for this release. If you wish to view the details for a specific bug, please browse to http://cadswes.colorado.edu/users/gnats-query.html and search our bug database. You will need a RiverWare user login and password.
 
245
248
249
251
252
260
261
277
295
296
299
301
304
317
325
331
369
375
376
386
387
702
711
752
803
834
912
918
934
1097
1114
1270
1338
1377
1378
1450
1458
1487
1502
1527
1544
1557
1591
1613
1628
1661
1673
1680
1681
1702
1718
1722
1740
1749
1752
1774
1781
1786
1789
1804
1844
1845
1855
1868
1871
1878
1880
1881
1896
1900
1905
1919
1922
1928
1933
1935
1937
1939
1941
1944
1946
1952
1958
1968
1969
1977
1979
1987
2001
2002
2005
2031
2047
2062
2070
2075
2094
2095
2099
2109
2115
2143
2145
2165
2192
2195
2210
2211
2220
2238
2273
2324
2397
2414
2444
2490
2522
2543
2576
2578
2594
2604
2622
2633
2634
2640
2641
2643
2649
2652
2654
2657
2665
2671
2687
2691
2696
2697
2702
2726
2731
2732
2746
2757
2768
2769
2773
2774
2775
2781
2784
2789
2790
2796
2798
2801
2801
2802
2803
2804
2807
2808
2810
2811
2812
2813
2815
2817
2818
2823
2824
2825
2829
2830
2834
2838
2841
2842
2843
2847
2848
2850
2853
2854
2855
2856
2858
2859
2861
2864
2865
2866
2867
2868
2869
2870
2872
2873
2875
2876
2877
2878
2881
2882
2883
2884
2885
2886
2887
2888
2889
2893
2895
2896
2897
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2915
2916
2918
2920
2921
2922
2923
2924
2925
2926
2927
2928
2930
2931
2932
2934
2935
2936
2937
2938
2939
2940
2942
2944
2947
2948
2951
2952
2956
2957
2960
2961
2962
2964
2966
2970
2976
2978
 
 
 
 
Revised: 11/11/2019