From a137ea37538642d5592913d7550cc23f94f001a1 Mon Sep 17 00:00:00 2001
From: Martin Holmer This document tells you how to use Tax-Calculator, an open-source
+federal income and payroll tax simulation model. The two ways of
+using Tax-Calculator described here require no computer programming.
+If you want to participate in the development of Tax-Calculator
+— by asking a question, reporting a bug, improving the documentation
+or making an enhancement to the Python source code — you should go to
+the
+developer website. TaxBrain GUI to use Tax-Calculator via an
+interactive web application tc CLI to use Tax-Calculator on your computer
+via the command line Policy Parameters that specify tax reforms Input Variables that specify tax filing units Output Variables that describe tax results Response Parameters that specify reform responses You can use Tax-Calculator via a graphical user interface (GUI)
+provided by the TaxBrain web
+application. This approach requires only an Internet connection
+and web browser on your computer. TaxBrain (TB) uses a micro dataset
+to produce both aggregate and distributional reform estimates for each
+of ten years for a tax reform you specify. The calculations take just
+a couple of minutes and there is flexibility to show different kinds
+of distributional results as well as aggregate revenue results. The first step in using TaxBrain is to set the Start Year for the
+tax calculations. Then specify the values of policy parameters that
+you want to change in your reform. By default the policy parameter boxes contain Start Year values.
+Simply replace the current-law value with the Start Year reform value.
+If some or all of your reform provisions are going to begin after the
+Start Year, simply fill in the pre-reform years with asterisks. So,
+for example, if Start Year is 2017 and your reform calls for raising
+the social security payroll tax rate to 13 percent in 2018 and then
+to 14 percent in 2020, you would enter in that box the following:
+ Simply click on the Show me the results! button to start the tax
+calculations. That button will use the full sample and take a couple
+of minutes to compute revenue and distributional results for each of
+ten years beginning with the Start Year you specified. There is also a Quick Calculation! button that produces results
+only for the Start Year using a sub-sample of the full sample. After the tax calculations are completed, you are shown a results
+page that presents various options: you can specify, view and download
+a total liabilities table, your can specify, view and download a
+distribution table, you can use your reform to conduct different types
+of dynamic analysis (via the button labeled Link to Dynamic
+Simulations), and finally, you can go back to the policy parameters
+page to modify your reform (via the button labeled Edit Parameters). There are three variants of the total liabilities table.
+The variant shown initially is Change, meaning the amounts are the
+difference between liabilities under your reform and the liabilities
+projected for current-law policy. You can also elect to see the
+reform and current-law levels. There are many variants of the distribution table. Try
+clicking on the options to the left to define the nature of the table
+and the year for which it is constructed. Try clicking on the options
+to the right to specify which columns are included in the table. An
+easy way to uncheck all the column boxes is to double click on the
+Select All box. There are three download options for each of these two tables: Print creates a new page in your browser that is suitable
+for printing. Copy puts the table on the clipboard of your local computer
+so that you can paste it anywhere on your computer. The copy on the
+clipboard uses invisible tab characters to separate the table's
+columns. CSV downloads to your computer a CSV-formatted file
+containing the information in the table. CSV-formatted files can be
+easily imported into any spreadsheet program. After clicking on the Link to Dynamic Simulations on the static
+results page, you are presented with a page that allows you to choose
+three different types of dynamic simulations to conduct on your tax
+reform: Partial Equilibrium Simulation is described this way:
+This approach answers the question, Overlapping Generations Simulation is described this way:
+This approach answers the question, Macro Elasticity Simulation is described this way:
+This approach harnesses econometric estimates of the historical
+relationship between tax policy and the macro economy to predict the
+effect of tax reforms on economic growth. Back to Section Contents
+Back to Document Contents You can use Tax-Calculator on your own computer via a command line
+interface (CLI) called tc. This approach requires the installation of
+Anaconda Python and the taxcalc package on your computer as well as
+the use of a text editor to prepare simple files that are read by tc.
+Computer programming knowledge is not required, but if you are
+prevented from doing the easy installation or you are not willing to
+work at the command line (Terminal on Mac or Command Prompt on
+Windows) and use an editor (for example, TextEdit on Mac or Notepad on
+Windows), then you should probably use the TaxBrain GUI. If you are comfortable using an editor to prepare text files that
+describe your tax reforms, but don't want to install Python and tc on
+your computer, you can upload reform files to TaxBrain where all the
+analysis is conducted (as described in the previous section). If you
+are interested in this file-upload approach, skip the first part of
+this section, read the next part on how to specify policy reform
+files, and then skip to the last part of this section on how to upload
+files to TaxBrain. Installation of tc CLI involves several steps: Install the free Anaconda Python distribution by going to
+the Continuum Analytics
+download page and selecting a version of Python. You can install
+either Python 2.7 or Python 3.6 because we test Tax-Calculator with
+both. You must do this installation even if you already
+have Python installed on your computer because the Anaconda
+distribution contains all the additional Python packages that
+Tax-Calculator uses to conduct tax calculations (many of which are not
+included in other Python installations). You can install the Anaconda
+distribution without having administrative privileges on your computer
+and the Anaconda distribution will not interfere with any Python
+installation that came as part of your computer’s operating
+system. Check your Anaconda Python installation by entering the
+following two commands at the operating system command prompt (which
+is shown as $ here, but would be > on Windows)
+in any directory:
+ Install the free taxcalc package by entering the following:
+ Check your installation of tc (the CLI to Tax-Calculator) by
+entering the following:
+ If your installation passes the test, you are ready to begin using
+tc to analyze your tax reforms. Continue reading this section for
+information about how to do that. But if you want a quick hint about
+the range of tc capabilities, enter the following:
+ The basic idea of tc tax analysis is that each tax reform is
+specified in a text file using a simple method to describe the details
+of the reform. Read the next part of this section to see how policy
+reform files are formatted. The details of a tax reform are contained in a text file that you
+write with a text editor. The reform is expressed by specifying which
+tax policy parameters are changed from their current-law values by the
+reform. The timing and magnitude of these policy parameter changes
+are written in JSON, a simple and widely-used data-specification
+language. For several examples of reform files and the general rules for
+writing JSON reform files, go
+to this
+page. If you want to upload reform files to TaxBrain for static analysis
+(rather than use the tc CLI on your computer for analysis), go to this
+section's last part, which
+discusses uploading files to TaxBrain. If you want to assume any
+responses to your tax reform (that is, if you want to conduct
+non-static analysis), read the next part before going to the last
+part. This part explains how to specify response assumption files used in
+non-static tax analysis. If you want to start out doing static
+analysis, you can skip this part now and come back to read it whenever
+you want to go beyond static analysis.
+The next part of this section discusses
+filing-unit input files. The details of economic response assumptions are contained in a
+text file that you write with a text editor. The assumptions are
+expressed by specifying which response parameters are changed from
+their default values, all of which are zero. The timing and magnitude of
+these response parameter changes are written in JSON, a simple and
+widely-used data-specification language. For examples of response assumption files and the general rules for
+writing JSON assumption files, go
+to this
+page. If you want to upload policy reform and response assumption files
+to TaxBrain, you can go directly to this
+section's last part, which
+discusses uploading files to TaxBrain. If you want to analyze your
+tax reforms on your own computer, go to the next part on how to
+specify tax filing units used in the analysis. The taxcalc package containing the tc CLI to Tax-Calculator does
+not include the microsimulation sample used by TaxBrain. This is
+because, unlike Census survey public-use files, the IRS-SOI Public Use
+File (PUF) is proprietary. If you or your organization has paid IRS
+to use the PUF version being used by TaxBrain, then it may be possible
+for us to share with you our TaxBrain sample, which we
+call puf.csv even though it contains CPS records that
+represent non-filers. Otherwise, you have three choices. First, you can easily create with an editor a CSV-formatted
+file containing several filing units whose experience under your tax
+reform is of interest to you. Much of the public discussion of tax
+reforms is of this type: how is this family or that family affected by
+a reform; how do they fare under different reforms; etc. Notice that
+this kind of analysis of a few exemplary families is something you
+cannot do on TaxBrain. The test conducted to check the tc
+installation has left one such file. It is called test.csv
+and contains two filing units with only wage and salary income: a
+lower income family and a higher income family. You can use the
+test.csv file as tc input to analyze your tax reforms.
+Before creating your own input files be sure to read the short set of
+guidelines that appear after this list of three choices. Second, recently we made freely
+available a public-use file containing only filing units derived from
+several recent March CPS surveys. For several reasons, the results generated
+by this cps.csv file are substantially different from the results
+generated by the puf.csv file. The cps.csv file
+contains a sample of the population while the puf.csv file
+contains mostly a sample of income tax filers in which high-income
+filing units are over represented. Also, the cps.csv file
+has many income variables that are missing (and assumed to be zero by
+Tax-Calculator), which causes an understating of total incomes,
+especially for those with high incomes. All these differences
+mean that the aggregate revenue and distributional results generated
+when using the cps.csv file as input to Tax-Calculator can
+be substantially different from the results generated when using the
+puf.csv file as input. And this is particularly true when
+analyzing reforms that change the tax treatment of high-income filers. Third, when you want to estimate how your reform affects
+total tax liabilities and/or the distribution of tax liabilities, you
+can always upload your policy reform and response assumption files
+to TaxBrain. Combining this option with the first option provides a
+complete tax analysis capability.
+The last part of this section
+describes how to upload files to TaxBrain. Input-File-Preparation Guidelines The tc CLI to Tax-Calculator is flexible enough to read almost any
+kind of CSV-formatted input data on filing units as long as the
+variable names correspond to those expected by Tax-Calculator. The
+only required input variables are RECID (a unique
+filing-unit record identifier) and MARS (a positive-valued
+filing-status indicator). Other variables in the input file must have
+variable names that are listed in the Input
+Variables section for them to affect the tax calculations. Any
+variable listed in Input Variables that is not in an input file is
+automatically set to zero for every filing unit. Variables
+in the input file that are not listed in Input Variables are ignored
+by Tax-Calculator. However, there are important data-preparation issues related to the
+fact that the payroll tax is a tax on individuals, not on income-tax
+filing units. Tax-Calculator expects that the filing-unit total for
+each of several earnings-related variables is split between the
+taxpayer and the spouse. It is the responsibility of anyone preparing
+data for Tax-Calculator input to do this earnings splitting. Here are
+the relationships between the filing-unit variable and the taxpayer
+(p) and spouse (s) variables expected by
+Tax-Calculator:
+ But when including one of these three sets of variables, it is up
+to you to specify the taxpayer-spouse split. You will get an error
+message from Tax-Calculator, and it will stop running, if you do not
+split the filing-unit amount between taxpayer and spouse so that the
+above equations hold for each filing unit in the input file. In addition to this earnings-splitting data-preparation issue,
+Tax-Calculator expects that the value of ordinary dividends
+(e00600) will be no less than the value of qualified
+dividends (e00650) for each filing unit. Again, it is your
+responsibility to prepare input data in a way that ensures this
+relationship is true for each filing unit. The tc CLI to Tax-Calculator requires only an input file containing
+one or more filing units. A policy reform file is optional; no reform
+file implies you want to analyze current-law policy. A response
+assumption file is also optional; no assumption file implies you want
+to conduct static analysis. Here we explain how to conduct tax analysis with the tc CLI by
+presenting a series of examples and explaining what output is produced
+in each example. There are several types of output that tc can
+generate so there will be more than a few examples. The examples are
+numbered in order to make it easier to refer to different examples.
+All the examples assume that the input file is test.csv,
+which was mentioned in previous part of this section. Example (1) produces a minimal output file containing 2020 tax
+liabilities for each filing unit assuming the income amounts in the
+input file are amounts for 2020 and assuming current-law tax policy
+projected to 2020. The name of the CSV-formatted output file is
+test-20-#-#.csv.
+The first # symbol indicates we did not specify a
+policy reform file and the second # symbol indicates we did
+not specify a response assumption file. The variables included
+in the minimal output file include:
+RECID (of filing unit in the input file),
+YEAR (specified when executing tc CLI),
+WEIGHT (which is same as s006),
+INCTAX (which is same as iitax),
+LSTAX (which is same as lumpsum_tax) and
+PAYTAX (which is same as payroll_tax).
+ Also, documentation of the reform is always written to a text file
+ending in -doc.text, which in this example would be
+named test-20-#-#-doc.text. Example (2) produces a much more complete output file with the same
+name test-20-#-#.csv as the minimal output file produced in
+example (1). No other output is generated other than the
+test-20-#-#-doc.text file. The
+--dump option causes all the input variables (including the
+one's understood by Tax-Calculator but not included
+in test.csv, which are all zero) and all the output
+variables calculated by Tax-Calculator to be included in the output
+file. For a complete list of input variables, see
+the Input Variables section. For a complete list
+of output variables, see the Output Variables
+section. Since Tax-Calculator ignores variables in the input file
+that are not in the Input Variables section, the dump output file in
+example (2) can be used as an input file and it will produce exactly
+the same tax liabilities (apart from rounding errors of one or two
+cents) as in the original dump output. Example (3) produces the same dump output as example (2) except
+that the dump output is written not to a CSV-formatted file, but to
+the dump table in an SQLite3 database file, which is
+called test-20-#-#.db in this example. Because
+the --dump option is not used in example (3), minimal
+output will be written to the test-20-#-#.csv file. Pros and cons of putting dump output in a CSV file or an SQLite3
+database table: The CSV file is almost twice as large as the
+database, but it can be easily imported into a wide range of
+statistical packages and spreadsheets. The main advantage of the
+SQLite3 database is that the Anaconda Python distribution includes
+sqlite3 (or sqlite3.exe
+on Windows), a command-line tool that can be used to tabulate dump
+output using structured query language (SQL). SQL is a language that
+you use to specify the tabulation you want and the SQL database
+figures out the procedure for generating your tabulation and then
+executes that procedure; there is no computer programming involved.
+We will give an example of SQL tabulation of dump output in the next
+part of this section. Example (4) shows that you can get dump output in the two different
+formats from a single tc run. The remaining examples use neither the --dump nor the
+--sqldb option, and thus, produce minimal output for the
+reform. But either or both of those options could be used in all the
+subsequent examples to generate more complete output for the reform. Example (5) produces 2021 output for the filing units in the
+test.csv file using the policy reform specified in
+the ref3.json file. Because no --assump
+option is used, the output results are produced using static analysis.
+The name of the output file in this example is
+test-21-ref3-#.csv. Example (6) produces 2021 output for the filing units in the
+test.csv file using the policy reform specified in
+the ref3.json file and the response assumptions
+specified in the res1.json file. The output results
+produced by this non-static analysis are written to the
+test-21-ref3-res1.csv file. The following examples illustrate output options that work only if
+each filing unit in the input file has a positive sampling weight
+(s006). So, we are going to use the cps.csv
+file in these examples along with the policy reform specified in
+the ref3.json file, the content of which is:
+ Example (7) produces 2022 static output for the filing units in the
+cps.csv file using the policy reform specified in
+the ref3.json file. Notice that Tax-Calculator knows to
+extrapolate (or Example (8) is like example (7) except we ask for 2024 static
+output and for graphs instead of tables, although we could ask for
+both. The HTML files containing the graphs can be viewed in your
+browser. Here is what the average tax rate graph
+in cps-24-ref3-#-atr.html looks like. Here is what the marginal tax rate graph
+in cps-24-ref3-#-mtr.html looks like: There is yet another tc CLI output option that writes to the screen
+results from a normative welfare analysis of the specified policy
+reform. This --ceeu option produces experimental results
+that make sense only with input files that contain representative
+samples of the population such as the cps.csv file. The
+name of this option stands for certainty-equivalent expected utility.
+If you want to use this output option, you should read the commented
+Python source code for the ce_aftertax_income function in
+the taxcalc/utils.py file at the
+
+developer website. Given that tc CLI output can be written to either CSV-formatted
+files or SQLite3 database files, there is an enormous range of
+software tools that can be used to tabulate the output. You can use
+SAS or R, Stata or MATLAB, or even import output into a spreadsheet
+(but this would seem to be the least useful option). If you just
+want to compare the contents of two output files, you can use your
+favorite graphical diff program to view the two files Here we give some examples of using the sqlite3
+command-line tool that is part of the Anaconda distribution (so it is
+always available when using Tax-Calculator). The first step, of
+course, is to use the --sqldb option when running tc. Then
+you can use the sqlite3 tool interactively or use it to
+execute SQL scripts you have saved in a text file. We'll provide
+examples of both those approaches. There are many online tutorials on
+the SQL select command; if you want to learn more, search the
+Internet. First, we provide a simple example of using sqlite3
+interactively. This approach is ideal for exploratory data analysis.
+Our example uses the cps.csv file as input, but you can do
+the following with the output from any input file that has weights
+(s006). Also, we specify no policy reform file, so the
+output is for current-law policy. What you cannot see from the
+following record of the analysis is that the sqlite3 tool
+keeps a command history, so pressing the up-arrow key will bring up
+the prior command for editing. This feature reduces substantially the
+amount of typing required to conduct exploratory data analysis.
+ Second, we provide a simple example of using sqlite3
+with SQL commands stored in a text file. This approach is useful
+if you want to tabulate many different output files in the same way.
+This second example assumes that the first example has already
+been done. Note that on Windows you should replace cat
+with type.
+ If you want to use the sqlite3 tool to tabulate the
+changes caused by a reform, use the tc CLI to generate two database
+dump files (one for current-law policy and the other for your reform)
+and then use the SQLite3 ATTACH command to make both database files
+available in your SQLite tabulation session. Any policy reform or response assumption files you can use with tc
+can be uploaded to trigger a TaxBrain run. As mentioned above the
+main advantages of doing this is getting access to the proprietary
+puf.csv input file, getting fast execution of both reform
+and current-law policy runs for ten years and getting the flexibility
+to specify a variety of distributional tables. All the TaxBrain results
+can be downloaded to your computer for storage or for additional
+analysis. The files on your computer can be uploaded
+at the TaxBrain
+file-upload page. An extended example of how preliminary tax analysis on your
+computer can be combined with TaxBrain file-uploading is
+here. Back to Section Contents
+Back to Document Contents This section contains documentation of policy parameters in a
+format that is easy to search and print. The policy parameters are
+grouped here as they are are on TaxBrain (TB). Parameters understood
+by Tax-Calculator and the tc CLI, but not available in the TaxBrain
+GUI, are placed in an Other Parameters group at the end of the
+section. Back to Section Contents
+Back to Document Contents This section contains documentation of input variables in a format
+that is easy to search and print. The input variables are ordered
+alphabetically by name. There are no subsections, just a long list
+of input variables that Tax-Calculator is programmed to use in its
+calculations. The Availability information indicates which input
+data files contain the variable. Back to Section Contents
+Back to Document Contents This section contains documentation of output variables in a format
+that is easy to search and print. The output variables are ordered
+alphabetically by name. There are no subsections, just a long list of
+output variables that Tax-Calculator is programmed to calculate. Back to Section Contents
+Back to Document Contents This section contains documentation of several sets of parameters
+that characterize responses to a tax reform. Consumption
+parameters are used to compute marginal tax rates. Behavior
+parameters are used to compute changes in input variables caused by a
+tax reform in a partial-equilibrium setting. Growdiff parameters are
+used to specify baseline differences and/or reform responses in the
+annual rate of growth in economic variables. All the response parameters can be used by the tc CLI, but only
+those with a TB Name appear in the TaxBrain GUI. All these
+dynamic response parameters control advanced features of
+Tax-Calculator, so understanding the
+source
+code that uses them is essential. Each default parameter value is
+zero and is projected into the future at that value, which implies no
+response to the reform. Using the default no-reform-response
+assumption for all the response parameters generates a static analysis
+of the tax reform. {} — {}'.format(sec1, param['section_2'])
+ else:
+ txt = ' {} — {}'.format('Other Parameters',
+ 'Not in TaxBrain GUI')
+ txt += ' Input Variable Name: {}'.format(vname)
+ if 'required' in variable:
+ txt += ' Output Variable Name: {}'.format(vname)
+ txt += ' {} — {}'.format(sec1, param['section_2'])
+ else:
+ txt = ' {} — {}'.format('Response Parameter',
+ ptype.capitalize())
+ txt += ' This document tells you how to use Tax-Calculator, an open-source
-federal income and payroll tax simulation model. The two ways of
-using Tax-Calculator described here require no computer programming.
-If you want to participate in the development of Tax-Calculator
-— by asking a question, reporting a bug, improving the documentation
-or making an enhancement to the Python source code — you should go to
-the
-developer website. Preliminaries TaxBrain GUI to use Tax-Calculator via an
-interactive web application tc CLI to use Tax-Calculator on your computer
-via the command line Policy Parameters that specify tax reforms Input Variables that specify tax filing units Output Variables that describe tax results Response Parameters that specify reform responses Kitchen Setup on how to setup your computer to
+follow these recipes Recipe Techniques on rules to follow when
+modifying the recipes in this cookbook Recipe Ingredients on how get the
+ingredients required for these recipes in your kitchen You can use Tax-Calculator via a graphical user interface (GUI)
-provided by the TaxBrain web
-application. This approach requires only an Internet connection
-and web browser on your computer. TaxBrain (TB) uses a micro dataset
-to produce both aggregate and distributional reform estimates for each
-of ten years for a tax reform you specify. The calculations take just
-a couple of minutes and there is flexibility to show different kinds
-of distributional results as well as aggregate revenue results. Recipe Feedback on how request a new recipe
+be added to this cookbook or Basic Recipes Static Analysis of a Simple Reform Advanced Recipes coming soon The first step in using TaxBrain is to set the Start Year for the
-tax calculations. Then specify the values of policy parameters that
-you want to change in your reform. By default the policy parameter boxes contain Start Year values.
-Simply replace the current-law value with the Start Year reform value.
-If some or all of your reform provisions are going to begin after the
-Start Year, simply fill in the pre-reform years with asterisks. So,
-for example, if Start Year is 2017 and your reform calls for raising
-the social security payroll tax rate to 13 percent in 2018 and then
-to 14 percent in 2020, you would enter in that box the following:
- Text goes here. Simply click on the Show me the results! button to start the tax
-calculations. That button will use the full sample and take a couple
-of minutes to compute revenue and distributional results for each of
-ten years beginning with the Start Year you specified. Text goes here. There is also a Quick Calculation! button that produces results
-only for the Start Year using a sub-sample of the full sample. Text goes here. After the tax calculations are completed, you are shown a results
-page that presents various options: you can specify, view and download
-a total liabilities table, your can specify, view and download a
-distribution table, you can use your reform to conduct different types
-of dynamic analysis (via the button labeled Link to Dynamic
-Simulations), and finally, you can go back to the policy parameters
-page to modify your reform (via the button labeled Edit Parameters). There are three variants of the total liabilities table.
-The variant shown initially is Change, meaning the amounts are the
-difference between liabilities under your reform and the liabilities
-projected for current-law policy. You can also elect to see the
-reform and current-law levels. There are many variants of the distribution table. Try
-clicking on the options to the left to define the nature of the table
-and the year for which it is constructed. Try clicking on the options
-to the right to specify which columns are included in the table. An
-easy way to uncheck all the column boxes is to double click on the
-Select All box. There are three download options for each of these two tables: If you want to request a recipe that makes a new Print creates a new page in your browser that is suitable
-for printing. Also, please report, in the same way, any problems you experience
+following an existing recipe. Copy puts the table on the clipboard of your local computer
-so that you can paste it anywhere on your computer. The copy on the
-clipboard uses invisible tab characters to separate the table's
-columns. CSV downloads to your computer a CSV-formatted file
-containing the information in the table. CSV-formatted files can be
-easily imported into any spreadsheet program. Text goes here. After clicking on the Link to Dynamic Simulations on the static
-results page, you are presented with a page that allows you to choose
-three different types of dynamic simulations to conduct on your tax
-reform: Partial Equilibrium Simulation is described this way:
-This approach answers the question, Overlapping Generations Simulation is described this way:
-This approach answers the question, Macro Elasticity Simulation is described this way:
-This approach harnesses econometric estimates of the historical
-relationship between tax policy and the macro economy to predict the
-effect of tax reforms on economic growth. Back to Section Contents
-Back to Document Contents You can use Tax-Calculator on your own computer via a command line
-interface (CLI) called tc. This approach requires the installation of
-Anaconda Python and the taxcalc package on your computer as well as
-the use of a text editor to prepare simple files that are read by tc.
-Computer programming knowledge is not required, but if you are
-prevented from doing the easy installation or you are not willing to
-work at the command line (Terminal on Mac or Command Prompt on
-Windows) and use an editor (for example, TextEdit on Mac or Notepad on
-Windows), then you should probably use the TaxBrain GUI. If you are comfortable using an editor to prepare text files that
-describe your tax reforms, but don't want to install Python and tc on
-your computer, you can upload reform files to TaxBrain where all the
-analysis is conducted (as described in the previous section). If you
-are interested in this file-upload approach, skip the first part of
-this section, read the next part on how to specify policy reform
-files, and then skip to the last part of this section on how to upload
-files to TaxBrain. Installation of tc CLI involves several steps: Install the free Anaconda Python distribution by going to
-the Continuum Analytics
-download page and selecting a version of Python. You can install
-either Python 2.7 or Python 3.6 because we test Tax-Calculator with
-both. You must do this installation even if you already
-have Python installed on your computer because the Anaconda
-distribution contains all the additional Python packages that
-Tax-Calculator uses to conduct tax calculations (many of which are not
-included in other Python installations). You can install the Anaconda
-distribution without having administrative privileges on your computer
-and the Anaconda distribution will not interfere with any Python
-installation that came as part of your computer’s operating
-system. Check your Anaconda Python installation by entering the
-following two commands at the operating system command prompt (which
-is shown as $ here, but would be > on Windows)
-in any directory:
- Install the free taxcalc package by entering the following:
- Check your installation of tc (the CLI to Tax-Calculator) by
-entering the following:
- If your installation passes the test, you are ready to begin using
-tc to analyze your tax reforms. Continue reading this section for
-information about how to do that. But if you want a quick hint about
-the range of tc capabilities, enter the following:
- The basic idea of tc tax analysis is that each tax reform is
-specified in a text file using a simple method to describe the details
-of the reform. Read the next part of this section to see how policy
-reform files are formatted. The details of a tax reform are contained in a text file that you
-write with a text editor. The reform is expressed by specifying which
-tax policy parameters are changed from their current-law values by the
-reform. The timing and magnitude of these policy parameter changes
-are written in JSON, a simple and widely-used data-specification
-language. For several examples of reform files and the general rules for
-writing JSON reform files, go
-to this
-page. If you want to upload reform files to TaxBrain for static analysis
-(rather than use the tc CLI on your computer for analysis), go to this
-section's last part, which
-discusses uploading files to TaxBrain. If you want to assume any
-responses to your tax reform (that is, if you want to conduct
-non-static analysis), read the next part before going to the last
-part. This part explains how to specify response assumption files used in
-non-static tax analysis. If you want to start out doing static
-analysis, you can skip this part now and come back to read it whenever
-you want to go beyond static analysis.
-The next part of this section discusses
-filing-unit input files. The details of economic response assumptions are contained in a
-text file that you write with a text editor. The assumptions are
-expressed by specifying which response parameters are changed from
-their default values, all of which are zero. The timing and magnitude of
-these response parameter changes are written in JSON, a simple and
-widely-used data-specification language. For examples of response assumption files and the general rules for
-writing JSON assumption files, go
-to this
-page. If you want to upload policy reform and response assumption files
-to TaxBrain, you can go directly to this
-section's last part, which
-discusses uploading files to TaxBrain. If you want to analyze your
-tax reforms on your own computer, go to the next part on how to
-specify tax filing units used in the analysis. The taxcalc package containing the tc CLI to Tax-Calculator does
-not include the microsimulation sample used by TaxBrain. This is
-because, unlike Census survey public-use files, the IRS-SOI Public Use
-File (PUF) is proprietary. If you or your organization has paid IRS
-to use the PUF version being used by TaxBrain, then it may be possible
-for us to share with you our TaxBrain sample, which we
-call puf.csv even though it contains CPS records that
-represent non-filers. Otherwise, you have three choices. First, you can easily create with an editor a CSV-formatted
-file containing several filing units whose experience under your tax
-reform is of interest to you. Much of the public discussion of tax
-reforms is of this type: how is this family or that family affected by
-a reform; how do they fare under different reforms; etc. Notice that
-this kind of analysis of a few exemplary families is something you
-cannot do on TaxBrain. The test conducted to check the tc
-installation has left one such file. It is called test.csv
-and contains two filing units with only wage and salary income: a
-lower income family and a higher income family. You can use the
-test.csv file as tc input to analyze your tax reforms.
-Before creating your own input files be sure to read the short set of
-guidelines that appear after this list of three choices. Second, recently we made freely
-available a public-use file containing only filing units derived from
-several recent March CPS surveys. For several reasons, the results generated
-by this cps.csv file are substantially different from the results
-generated by the puf.csv file. The cps.csv file
-contains a sample of the population while the puf.csv file
-contains mostly a sample of income tax filers in which high-income
-filing units are over represented. Also, the cps.csv file
-has many income variables that are missing (and assumed to be zero by
-Tax-Calculator), which causes an understating of total incomes,
-especially for those with high incomes. All these differences
-mean that the aggregate revenue and distributional results generated
-when using the cps.csv file as input to Tax-Calculator can
-be substantially different from the results generated when using the
-puf.csv file as input. And this is particularly true when
-analyzing reforms that change the tax treatment of high-income filers. Third, when you want to estimate how your reform affects
-total tax liabilities and/or the distribution of tax liabilities, you
-can always upload your policy reform and response assumption files
-to TaxBrain. Combining this option with the first option provides a
-complete tax analysis capability.
-The last part of this section
-describes how to upload files to TaxBrain. Input-File-Preparation Guidelines The tc CLI to Tax-Calculator is flexible enough to read almost any
-kind of CSV-formatted input data on filing units as long as the
-variable names correspond to those expected by Tax-Calculator. The
-only required input variables are RECID (a unique
-filing-unit record identifier) and MARS (a positive-valued
-filing-status indicator). Other variables in the input file must have
-variable names that are listed in the Input
-Variables section for them to affect the tax calculations. Any
-variable listed in Input Variables that is not in an input file is
-automatically set to zero for every filing unit. Variables
-in the input file that are not listed in Input Variables are ignored
-by Tax-Calculator. However, there are important data-preparation issues related to the
-fact that the payroll tax is a tax on individuals, not on income-tax
-filing units. Tax-Calculator expects that the filing-unit total for
-each of several earnings-related variables is split between the
-taxpayer and the spouse. It is the responsibility of anyone preparing
-data for Tax-Calculator input to do this earnings splitting. Here are
-the relationships between the filing-unit variable and the taxpayer
-(p) and spouse (s) variables expected by
-Tax-Calculator:
- But when including one of these three sets of variables, it is up
-to you to specify the taxpayer-spouse split. You will get an error
-message from Tax-Calculator, and it will stop running, if you do not
-split the filing-unit amount between taxpayer and spouse so that the
-above equations hold for each filing unit in the input file. In addition to this earnings-splitting data-preparation issue,
-Tax-Calculator expects that the value of ordinary dividends
-(e00600) will be no less than the value of qualified
-dividends (e00650) for each filing unit. Again, it is your
-responsibility to prepare input data in a way that ensures this
-relationship is true for each filing unit. The tc CLI to Tax-Calculator requires only an input file containing
-one or more filing units. A policy reform file is optional; no reform
-file implies you want to analyze current-law policy. A response
-assumption file is also optional; no assumption file implies you want
-to conduct static analysis. Here we explain how to conduct tax analysis with the tc CLI by
-presenting a series of examples and explaining what output is produced
-in each example. There are several types of output that tc can
-generate so there will be more than a few examples. The examples are
-numbered in order to make it easier to refer to different examples.
-All the examples assume that the input file is test.csv,
-which was mentioned in previous part of this section. Example (1) produces a minimal output file containing 2020 tax
-liabilities for each filing unit assuming the income amounts in the
-input file are amounts for 2020 and assuming current-law tax policy
-projected to 2020. The name of the CSV-formatted output file is
-test-20-#-#.csv.
-The first # symbol indicates we did not specify a
-policy reform file and the second # symbol indicates we did
-not specify a response assumption file. The variables included
-in the minimal output file include:
-RECID (of filing unit in the input file),
-YEAR (specified when executing tc CLI),
-WEIGHT (which is same as s006),
-INCTAX (which is same as iitax),
-LSTAX (which is same as lumpsum_tax) and
-PAYTAX (which is same as payroll_tax).
- Also, documentation of the reform is always written to a text file
-ending in -doc.text, which in this example would be
-named test-20-#-#-doc.text. Example (2) produces a much more complete output file with the same
-name test-20-#-#.csv as the minimal output file produced in
-example (1). No other output is generated other than the
-test-20-#-#-doc.text file. The
---dump option causes all the input variables (including the
-one's understood by Tax-Calculator but not included
-in test.csv, which are all zero) and all the output
-variables calculated by Tax-Calculator to be included in the output
-file. For a complete list of input variables, see
-the Input Variables section. For a complete list
-of output variables, see the Output Variables
-section. Since Tax-Calculator ignores variables in the input file
-that are not in the Input Variables section, the dump output file in
-example (2) can be used as an input file and it will produce exactly
-the same tax liabilities (apart from rounding errors of one or two
-cents) as in the original dump output. Example (3) produces the same dump output as example (2) except
-that the dump output is written not to a CSV-formatted file, but to
-the dump table in an SQLite3 database file, which is
-called test-20-#-#.db in this example. Because
-the --dump option is not used in example (3), minimal
-output will be written to the test-20-#-#.csv file. Pros and cons of putting dump output in a CSV file or an SQLite3
-database table: The CSV file is almost twice as large as the
-database, but it can be easily imported into a wide range of
-statistical packages and spreadsheets. The main advantage of the
-SQLite3 database is that the Anaconda Python distribution includes
-sqlite3 (or sqlite3.exe
-on Windows), a command-line tool that can be used to tabulate dump
-output using structured query language (SQL). SQL is a language that
-you use to specify the tabulation you want and the SQL database
-figures out the procedure for generating your tabulation and then
-executes that procedure; there is no computer programming involved.
-We will give an example of SQL tabulation of dump output in the next
-part of this section. Example (4) shows that you can get dump output in the two different
-formats from a single tc run. The remaining examples use neither the --dump nor the
---sqldb option, and thus, produce minimal output for the
-reform. But either or both of those options could be used in all the
-subsequent examples to generate more complete output for the reform. Example (5) produces 2021 output for the filing units in the
-test.csv file using the policy reform specified in
-the ref3.json file. Because no --assump
-option is used, the output results are produced using static analysis.
-The name of the output file in this example is
-test-21-ref3-#.csv. Example (6) produces 2021 output for the filing units in the
-test.csv file using the policy reform specified in
-the ref3.json file and the response assumptions
-specified in the res1.json file. The output results
-produced by this non-static analysis are written to the
-test-21-ref3-res1.csv file. The following examples illustrate output options that work only if
-each filing unit in the input file has a positive sampling weight
-(s006). So, we are going to use the cps.csv
-file in these examples along with the policy reform specified in
-the ref3.json file, the content of which is:
- Example (7) produces 2022 static output for the filing units in the
-cps.csv file using the policy reform specified in
-the ref3.json file. Notice that Tax-Calculator knows to
-extrapolate (or Example (8) is like example (7) except we ask for 2024 static
-output and for graphs instead of tables, although we could ask for
-both. The HTML files containing the graphs can be viewed in your
-browser. Here is what the average tax rate graph
-in cps-24-ref3-#-atr.html looks like. Here is what the marginal tax rate graph
-in cps-24-ref3-#-mtr.html looks like: There is yet another tc CLI output option that writes to the screen
-results from a normative welfare analysis of the specified policy
-reform. This --ceeu option produces experimental results
-that make sense only with input files that contain representative
-samples of the population such as the cps.csv file. The
-name of this option stands for certainty-equivalent expected utility.
-If you want to use this output option, you should read the commented
-Python source code for the ce_aftertax_income function in
-the taxcalc/utils.py file at the
-
-developer website. Given that tc CLI output can be written to either CSV-formatted
-files or SQLite3 database files, there is an enormous range of
-software tools that can be used to tabulate the output. You can use
-SAS or R, Stata or MATLAB, or even import output into a spreadsheet
-(but this would seem to be the least useful option). If you just
-want to compare the contents of two output files, you can use your
-favorite graphical diff program to view the two files Here we give some examples of using the sqlite3
-command-line tool that is part of the Anaconda distribution (so it is
-always available when using Tax-Calculator). The first step, of
-course, is to use the --sqldb option when running tc. Then
-you can use the sqlite3 tool interactively or use it to
-execute SQL scripts you have saved in a text file. We'll provide
-examples of both those approaches. There are many online tutorials on
-the SQL select command; if you want to learn more, search the
-Internet. First, we provide a simple example of using sqlite3
-interactively. This approach is ideal for exploratory data analysis.
-Our example uses the cps.csv file as input, but you can do
-the following with the output from any input file that has weights
-(s006). Also, we specify no policy reform file, so the
-output is for current-law policy. What you cannot see from the
-following record of the analysis is that the sqlite3 tool
-keeps a command history, so pressing the up-arrow key will bring up
-the prior command for editing. This feature reduces substantially the
-amount of typing required to conduct exploratory data analysis.
- Second, we provide a simple example of using sqlite3
-with SQL commands stored in a text file. This approach is useful
-if you want to tabulate many different output files in the same way.
-This second example assumes that the first example has already
-been done. Note that on Windows you should replace cat
-with type.
- If you want to use the sqlite3 tool to tabulate the
-changes caused by a reform, use the tc CLI to generate two database
-dump files (one for current-law policy and the other for your reform)
-and then use the SQLite3 ATTACH command to make both database files
-available in your SQLite tabulation session. Any policy reform or response assumption files you can use with tc
-can be uploaded to trigger a TaxBrain run. As mentioned above the
-main advantages of doing this is getting access to the proprietary
-puf.csv input file, getting fast execution of both reform
-and current-law policy runs for ten years and getting the flexibility
-to specify a variety of distributional tables. All the TaxBrain results
-can be downloaded to your computer for storage or for additional
-analysis. The files on your computer can be uploaded
-at the TaxBrain
-file-upload page. An extended example of how preliminary tax analysis on your
-computer can be combined with TaxBrain file-uploading is
-here. Back to Section Contents
-Back to Document Contents This section contains documentation of policy parameters in a
-format that is easy to search and print. The policy parameters are
-grouped here as they are are on TaxBrain (TB). Parameters understood
-by Tax-Calculator and the tc CLI, but not available in the TaxBrain
-GUI, are placed in an Other Parameters group at the end of the
-section. Back to Section Contents
-Back to Document Contents This section contains documentation of input variables in a format
-that is easy to search and print. The input variables are ordered
-alphabetically by name. There are no subsections, just a long list
-of input variables that Tax-Calculator is programmed to use in its
-calculations. The Availability information indicates which input
-data files contain the variable. Back to Section Contents
-Back to Document Contents This section contains documentation of output variables in a format
-that is easy to search and print. The output variables are ordered
-alphabetically by name. There are no subsections, just a long list of
-output variables that Tax-Calculator is programmed to calculate. Back to Section Contents
-Back to Document Contents This section contains documentation of several sets of parameters
-that characterize responses to a tax reform. Consumption
-parameters are used to compute marginal tax rates. Behavior
-parameters are used to compute changes in input variables caused by a
-tax reform in a partial-equilibrium setting. Growdiff parameters are
-used to specify baseline differences and/or reform responses in the
-annual rate of growth in economic variables. All the response parameters can be used by the tc CLI, but only
-those with a TB Name appear in the TaxBrain GUI. All these
-dynamic response parameters control advanced features of
-Tax-Calculator, so understanding the
-source
-code that uses them is essential. Each default parameter value is
-zero and is projected into the future at that value, which implies no
-response to the reform. Using the default no-reform-response
-assumption for all the response parameters generates a static analysis
-of the tax reform.Using Tax-Calculator
+
+Document Contents
+
+TaxBrain GUI
+
+Section Contents
+
+
+
+
+
+
+
+Specify Tax Reform
+
+*,0.13,*,0.14
+This parameter is not indexed, so the 0.13 value for 2018 will be
+extrapolated to 2019, and the 0.14 value for 2020 will be in force
+in all subsequent years.
+
+
+
+
+Initiate Static Analysis
+
+View/Download Static Results
+
+Initiate Dynamic Analysis
+
+how would taxpayer behavior
+(income and deductions) affect revenue if all other prices in the
+economy could stay the same?
how does tax policy affect
+macroeconomic aggregates and prices?
tc CLI
+
+Section Contents
+
+
+
+
+
+
+
+
+
+
+Install/Test tc CLI
+
+$ conda --version
+Expected output is something like conda 4.3.17
+$ python --version
+Expected output should contain either the Python 2.7 or
+the Python 3.6 phrase as well as the
+Anaconda phrase, the presence of which confirm that the
+installation went smoothly.
+
+$ conda install -c ospc taxcalc
+Expected output should contain information about all the additional
+packages that Tax-Calculator needs. After all that information has
+been shown on the screen, press the y key to proceed with
+the package installation.
+
+$ tc --test
+Expected output (after about twenty seconds) is PASSED
+TEST. If you get FAILED TEST, something went wrong
+in the installation process. If the installation test fails, please
+report your experience by creating a new issue at
+
+this website or by sending an email to one of the core maintainers
+of Tax-Calculator listed at the bottom of the What is TaxBrain?
+page at this website.
+
+$ tc --help
+
+
+Specify Tax Reform
+
+Specify Analysis Assumptions
+
+Specify Filing Units
+
+
+e00200 = e00200p + e00200s
+e00900 = e00900p + e00900s
+e02100 = e02100p + e02100s
+
+Obviously, when MARS is not equal to 2 (married filing
+jointly), the values of the three s variables are zero and
+the value of each p variable is equal to the value of its
+corresponding filing-unit variable. Note that the input file can
+omit any one, or all, of these three sets variables. If the three
+variables in one of these sets are omitted, the required relationship
+will be satisfied because zero equals zero plus zero.
+
+Initiate Reform Analysis
+
+
+(1)$ tc test.csv 2020
+
+
+
+(2)$ tc test.csv 2020 --dump
+
+
+
+(3)$ tc test.csv 2020 --sqldb
+
+
+
+(4)$ tc test.csv 2020 --dump --sqldb
+
+
+
+(5)$ tc test.csv 2021 --reform ref3.json
+
+
+
+(6)$ tc test.csv 2021 --reform ref3.json --assump res1.json
+
+
+
+// ref3.json raises personal exemption amount to 8000 in 2022,
+// after which it continues to be indexed to price inflation.
+{
+ "policy": {
+ "_II_em": {"2022": [8000]}
+ }
+}
+
+The output options illustrated in the following examples generate
+tables of the post-reform level and the reform-induced change in tax
+liability by income deciles as well as graphs of marginal and average
+tax rates by income percentile.
+
+
+(7)$ tc cps.csv 2022 --reform ref3.json --tables
+You loaded data for 2014.
+Tax-Calculator startup automatically extrapolated your data to 2022.
+
+(7)$ ls cps-22*
+cps-22-ref3-#-doc.text cps-22-ref3-#-tab.text cps-22-ref3-#.csv
+
+(7)$ cat cps-22-ref3-#-tab.text
+Weighted Tax Reform Totals by Baseline Expanded-Income Decile
+ Returns ExpInc IncTax PayTax LSTax AllTax
+ (#m) ($b) ($b) ($b) ($b) ($b)
+ 0 17.93 -3.6 -2.1 3.6 0.0 1.5
+ 1 17.93 202.8 -15.4 13.7 0.0 -1.7
+ 2 17.93 353.5 -19.2 25.3 0.0 6.0
+ 3 17.93 513.8 -16.9 47.0 0.0 30.1
+ 4 17.93 696.3 -1.2 72.3 0.0 71.2
+ 5 17.93 928.0 24.0 104.3 0.0 128.2
+ 6 17.93 1246.3 59.9 147.5 0.0 207.4
+ 7 17.93 1723.5 121.0 215.3 0.0 336.3
+ 8 17.93 2497.1 224.8 317.9 0.0 542.6
+ 9 17.93 5949.7 1099.9 517.8 0.0 1617.8
+ A 179.26 14107.4 1474.8 1464.8 0.0 2939.6
+
+Weighted Tax Differences by Baseline Expanded-Income Decile
+ Returns ExpInc IncTax PayTax LSTax AllTax
+ (#m) ($b) ($b) ($b) ($b) ($b)
+ 0 17.93 -3.6 0.0 0.0 0.0 0.0
+ 1 17.93 202.8 -0.2 0.0 0.0 -0.2
+ 2 17.93 353.5 -1.8 0.0 0.0 -1.8
+ 3 17.93 513.8 -4.2 0.0 0.0 -4.2
+ 4 17.93 696.3 -7.3 0.0 0.0 -7.3
+ 5 17.93 928.0 -11.1 0.0 0.0 -11.1
+ 6 17.93 1246.3 -17.5 0.0 0.0 -17.5
+ 7 17.93 1723.5 -22.7 0.0 0.0 -22.7
+ 8 17.93 2497.1 -31.2 0.0 0.0 -31.2
+ 9 17.93 5949.7 -26.3 0.0 0.0 -26.3
+ A 179.26 14107.4 -122.3 0.0 0.0 -122.3
+
+
+age
) filing unit data in the cps.csv
+file to the specified tax year. It knows to do that because of the
+special input file name cps.csv. The tables produced by
+this static analysis are written to the
+cps-22-ref3-#-tab.text file. Note that on Windows
+you would use dir instead of ls and
+type instead of cat.
+(8)$ tc cps.csv 2024 --reform ref3.json --graphs
+You loaded data for 2014.
+Tax-Calculator startup automatically extrapolated your data to 2024.
+
+(8)$ ls cps-24*
+cps-24-ref3-#-atr.html cps-24-ref3-#-mtr.html
+cps-24-ref3-#-doc.text cps-24-ref3-#.csv
+
+
+Tabulate Reform Results
+
+side by side
+with highlighting of numbers that are different. The main point
+is to use a software tool that is available to you and that you have
+experience using.
+$ tc cps.csv 2016 --sqldb
+You loaded data for 2014.
+Tax-Calculator startup automatically extrapolated your data to 2016.
+$ sqlite3 cps-16-#-#.db
+SQLite version 3.13.0 2016-05-18 10:57:30
+Enter ".help" for usage hints.
+sqlite> select count(*) from dump;
+456465
+sqlite> select count(*),sum(s006) from dump;
+456465|165398918.379996
+sqlite> select count(*),round(sum(s006)*1e-6,3) from dump;
+456465|165.399
+sqlite> select round(sum(s006)*1e-6,3) from dump where MARS=2;
+68.234
+sqlite> select MARS,round(sum(s006)*1e-6,3) from dump group by MARS;
+1|87.385
+2|68.234
+4|9.781
+sqlite> .quit
+$
+
+
+
+
+$ cat tab.sql
+-- tabulate weight of those with negative marginal income tax rates
+select "weighted count of those with negative MTR",
+ round(sum(s006)*1e-6,3)
+from dump
+where mtr_inctax < 0;
+
+-- construct marginal income tax rate histogram with bin width 10
+select "bin number|weighted count|average MTR in bin";
+select round((mtr_inctax-5)/10) as mtr_bin, -- histogram bin number
+ round(sum(s006)*1e-6,3), -- weight of those in bin (m#)
+ -- weighted average marginal income tax rate on taxpayer earnings in bin:
+ round(sum(mtr_inctax*s006)/sum(s006),2)
+from dump
+where mtr_inctax >= 0 -- include only those with positive MTR
+group by mtr_bin
+order by mtr_bin;
+
+-- tabulate weight of all filing units
+select "weighted count of all filing units",
+ round(sum(s006)*1e-6,3)
+from dump;
+
+$ cat tab.sql | sqlite3 cps-16-#-#.db
+weighted count of those with negative MTR|22.434
+bin number|weighted count|average MTR in bin
+-1.0|35.34|0.0
+0.0|2.308|7.27
+1.0|56.887|14.11
+2.0|32.926|25.39
+3.0|14.636|32.18
+4.0|0.786|43.0
+5.0|0.069|54.52
+6.0|0.012|66.75
+weighted count of all filing units|165.399
+
+The cat command writes the contents of
+the tab.sql file to stdout. We do nothing but that in the
+first command in order to show you the file contents. The second
+command pipes the contents of the tab.sql file into
+the sqlite3 tool, which executes the SQL statements and
+writes the tabulation results to stdout. (If you're wondering about
+the validity of those high marginal tax rates, rest assured that all
+filing units with marginal income tax rates greater than seventy
+percent have been checked by hand and are valid: most are
+caught in the rapid phase-out of non-refundable education credits.
+The negative
+marginal tax rates are caused by refundable credits, primarily the
+earned income tax credit.)
+
+Upload Files to TaxBrain
+
+Policy Parameters
+
+Section Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Parameter Indexing
+
+
+
+
+
+
+Payroll Taxes
+
+
+
+
+
+
+
+
+
+
+Social Security Taxability
+
+
+
+
+
+
+
+
+Above The Line Deductions
+
+
+
+
+
+
+
+
+
+
+Personal Exemptions
+
+
+
+
+
+
+
+
+
+
+Standard Deduction
+
+
+
+
+
+
+
+
+Nonrefundable Credits
+
+
+
+
+
+
+
+
+
+
+
+
+Itemized Deductions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Capital Gains And Dividends
+
+
+
+
+
+
+
+
+
+
+Personal Income
+
+
+
+
+
+
+
+
+
+
+Other Taxes
+
+
+
+
+
+
+Refundable Credits
+
+
+
+
+
+
+
+
+
+
+
+
+Surtaxes
+
+
+
+
+
+
+
+
+
+
+Universal Basic Income
+
+
+
+
+
+
+
+
+Other Parameters
+
+
+
+Input Variables
+
+Output Variables
+
+Response Parameters
+
+Section Contents
+
+
+
+
+
+
+Consumption Parameters
+
+
+
+
+
+
+Behavior Parameters
+
+
+
+
+
+
+Growdiff Parameters
+
+
+
+
+
+
+
tc Name: {}'.format(pname)
+ if len(sec1) > 0:
+ txt += '
TB Name: {}'.format(param['long_name'])
+ else:
+ txt += '
Long Name: {}'.format(param['long_name'])
+ txt += '
Description: {}'.format(param['description'])
+ if len(param['notes']) > 0:
+ txt += '
Notes: {}'.format(param['notes'])
+ if param['cpi_inflated']:
+ txt += '
Inflation Indexed: True'
+ else:
+ txt += '
Inflation Indexed: False'
+ if param['integer_value']:
+ txt += ' Integer Value: True'
+ else:
+ txt += ' Integer Value: False'
+ if param['boolean_value']:
+ txt += ' Boolean Value: True'
+ else:
+ txt += ' Boolean Value: False'
+ txt += '
Known Values:'
+ if len(param['col_label']) > 0:
+ cols = ', '.join(param['col_label'])
+ txt += '
for: [{}]'.format(cols)
+ for cyr, val in zip(param['row_label'], param['value']):
+ final_cyr = cyr
+ final_val = val
+ txt += '
{}: {}'.format(cyr, val)
+ if not param['cpi_inflated']:
+ fcyr = int(final_cyr)
+ if fcyr < Policy.LAST_KNOWN_YEAR:
+ # extrapolate final_val thru Policy.LAST_KNOWN_YEAR if not indexed
+ for cyr in range(fcyr + 1, Policy.LAST_KNOWN_YEAR + 1):
+ txt += '
{}: {}'.format(cyr, final_val)
+ txt += '
Valid Range:'
+ if param['range']['min'] == 'default':
+ minval = 'known_value'
+ else:
+ minval = param['range']['min']
+ if param['range']['max'] == 'default':
+ maxval = 'known_value'
+ else:
+ maxval = param['range']['max']
+ txt += ' min = {} and max = {}'.format(minval, maxval)
+ txt += '
Out-of-Range Action: {}'.format(
+ param['out_of_range_action'])
+ txt += '
Required Input Variable'
+ else:
+ txt = '
Description: {}'.format(variable['desc'])
+ txt += '
Datatype: {}'.format(variable['type'])
+ if iotype == 'read':
+ txt += '
Availability: {}'.format(variable['availability'])
+ txt += '
IRS Form Location:'
+ formdict = variable['form']
+ for yrange in sorted(formdict.keys()):
+ txt += '
{}: {}'.format(yrange, formdict[yrange])
+ txt += '
tc Name: {}'.format(pname)
+ if len(sec1) > 0:
+ txt += '
TB Name: {}'.format(param['long_name'])
+ else:
+ txt += '
Long Name: {}'.format(param['long_name'])
+ txt += '
Description: {}'.format(param['description'])
+ if len(param['notes']) > 0:
+ txt += '
Notes: {}'.format(param['notes'])
+ txt += '
Default Value:'
+ if len(param['col_label']) > 0:
+ cols = ', '.join(param['col_label'])
+ txt += '
for: [{}]'.format(cols)
+ for cyr, val in zip(param['row_label'], param['value']):
+ txt += '
{}: {}'.format(cyr, val)
+ txt += 'Using Tax-Calculator
+A Cookbook of Tested Recipes for Python Programming with
+Tax-Calculator
Cookbook Contents
-Document Contents
+TaxBrain GUI
+
report problems encountered when
+following an existing recipeSection Contents
+Specify Tax Reform
-Preliminaries: Kitchen Setup
-*,0.13,*,0.14
-This parameter is not indexed, so the 0.13 value for 2018 will be
-extrapolated to 2019, and the 0.14 value for 2020 will be in force
-in all subsequent years.
+Initiate Static Analysis
+Preliminaries: Recipe Techniques
-Preliminaries: Recipe Ingredients
-View/Download Static Results
+Preliminaries: Recipe Feedback
-dish
,
+create a new issue
+here
+providing details on what you want to make and why the existing
+recipes cannot be easily modified to make what you want.Basic Recipes: Static Analysis of a Simple Reform
+Initiate Dynamic Analysis
-
-how would taxpayer behavior
-(income and deductions) affect revenue if all other prices in the
-economy could stay the same?
how does tax policy affect
-macroeconomic aggregates and prices?
tc CLI
-
-Section Contents
-
-
-
-
-
-
-
-
-
-
-Install/Test tc CLI
-
-$ conda --version
-Expected output is something like conda 4.3.17
-$ python --version
-Expected output should contain either the Python 2.7 or
-the Python 3.6 phrase as well as the
-Anaconda phrase, the presence of which confirm that the
-installation went smoothly.
-
-$ conda install -c ospc taxcalc
-Expected output should contain information about all the additional
-packages that Tax-Calculator needs. After all that information has
-been shown on the screen, press the y key to proceed with
-the package installation.
-
-$ tc --test
-Expected output (after about twenty seconds) is PASSED
-TEST. If you get FAILED TEST, something went wrong
-in the installation process. If the installation test fails, please
-report your experience by creating a new issue at
-
-this website or by sending an email to one of the core maintainers
-of Tax-Calculator listed at the bottom of the What is TaxBrain?
-page at this website.
-
-$ tc --help
-
-
-Specify Tax Reform
-
-Specify Analysis Assumptions
-
-Specify Filing Units
-
-
-e00200 = e00200p + e00200s
-e00900 = e00900p + e00900s
-e02100 = e02100p + e02100s
-
-Obviously, when MARS is not equal to 2 (married filing
-jointly), the values of the three s variables are zero and
-the value of each p variable is equal to the value of its
-corresponding filing-unit variable. Note that the input file can
-omit any one, or all, of these three sets variables. If the three
-variables in one of these sets are omitted, the required relationship
-will be satisfied because zero equals zero plus zero.
-
-Initiate Reform Analysis
-
-
-(1)$ tc test.csv 2020
-
-
-
-(2)$ tc test.csv 2020 --dump
-
-
-
-(3)$ tc test.csv 2020 --sqldb
-
-
-
-(4)$ tc test.csv 2020 --dump --sqldb
-
-
-
-(5)$ tc test.csv 2021 --reform ref3.json
-
-
-
-(6)$ tc test.csv 2021 --reform ref3.json --assump res1.json
-
-
-
-// ref3.json raises personal exemption amount to 8000 in 2022,
-// after which it continues to be indexed to price inflation.
-{
- "policy": {
- "_II_em": {"2022": [8000]}
- }
-}
-
-The output options illustrated in the following examples generate
-tables of the post-reform level and the reform-induced change in tax
-liability by income deciles as well as graphs of marginal and average
-tax rates by income percentile.
-
-
-(7)$ tc cps.csv 2022 --reform ref3.json --tables
-You loaded data for 2014.
-Tax-Calculator startup automatically extrapolated your data to 2022.
-
-(7)$ ls cps-22*
-cps-22-ref3-#-doc.text cps-22-ref3-#-tab.text cps-22-ref3-#.csv
-
-(7)$ cat cps-22-ref3-#-tab.text
-Weighted Tax Reform Totals by Baseline Expanded-Income Decile
- Returns ExpInc IncTax PayTax LSTax AllTax
- (#m) ($b) ($b) ($b) ($b) ($b)
- 0 17.93 -3.6 -2.1 3.6 0.0 1.5
- 1 17.93 202.8 -15.4 13.7 0.0 -1.7
- 2 17.93 353.5 -19.2 25.3 0.0 6.0
- 3 17.93 513.8 -16.9 47.0 0.0 30.1
- 4 17.93 696.3 -1.2 72.3 0.0 71.2
- 5 17.93 928.0 24.0 104.3 0.0 128.2
- 6 17.93 1246.3 59.9 147.5 0.0 207.4
- 7 17.93 1723.5 121.0 215.3 0.0 336.3
- 8 17.93 2497.1 224.8 317.9 0.0 542.6
- 9 17.93 5949.7 1099.9 517.8 0.0 1617.8
- A 179.26 14107.4 1474.8 1464.8 0.0 2939.6
-
-Weighted Tax Differences by Baseline Expanded-Income Decile
- Returns ExpInc IncTax PayTax LSTax AllTax
- (#m) ($b) ($b) ($b) ($b) ($b)
- 0 17.93 -3.6 0.0 0.0 0.0 0.0
- 1 17.93 202.8 -0.2 0.0 0.0 -0.2
- 2 17.93 353.5 -1.8 0.0 0.0 -1.8
- 3 17.93 513.8 -4.2 0.0 0.0 -4.2
- 4 17.93 696.3 -7.3 0.0 0.0 -7.3
- 5 17.93 928.0 -11.1 0.0 0.0 -11.1
- 6 17.93 1246.3 -17.5 0.0 0.0 -17.5
- 7 17.93 1723.5 -22.7 0.0 0.0 -22.7
- 8 17.93 2497.1 -31.2 0.0 0.0 -31.2
- 9 17.93 5949.7 -26.3 0.0 0.0 -26.3
- A 179.26 14107.4 -122.3 0.0 0.0 -122.3
-
-
-age
) filing unit data in the cps.csv
-file to the specified tax year. It knows to do that because of the
-special input file name cps.csv. The tables produced by
-this static analysis are written to the
-cps-22-ref3-#-tab.text file. Note that on Windows
-you would use dir instead of ls and
-type instead of cat.
-(8)$ tc cps.csv 2024 --reform ref3.json --graphs
-You loaded data for 2014.
-Tax-Calculator startup automatically extrapolated your data to 2024.
-
-(8)$ ls cps-24*
-cps-24-ref3-#-atr.html cps-24-ref3-#-mtr.html
-cps-24-ref3-#-doc.text cps-24-ref3-#.csv
-
-
-Tabulate Reform Results
-
-side by side
-with highlighting of numbers that are different. The main point
-is to use a software tool that is available to you and that you have
-experience using.
-$ tc cps.csv 2016 --sqldb
-You loaded data for 2014.
-Tax-Calculator startup automatically extrapolated your data to 2016.
-$ sqlite3 cps-16-#-#.db
-SQLite version 3.13.0 2016-05-18 10:57:30
-Enter ".help" for usage hints.
-sqlite> select count(*) from dump;
-456465
-sqlite> select count(*),sum(s006) from dump;
-456465|165398918.379996
-sqlite> select count(*),round(sum(s006)*1e-6,3) from dump;
-456465|165.399
-sqlite> select round(sum(s006)*1e-6,3) from dump where MARS=2;
-68.234
-sqlite> select MARS,round(sum(s006)*1e-6,3) from dump group by MARS;
-1|87.385
-2|68.234
-4|9.781
-sqlite> .quit
-$
-
-
-
-
-$ cat tab.sql
--- tabulate weight of those with negative marginal income tax rates
-select "weighted count of those with negative MTR",
- round(sum(s006)*1e-6,3)
-from dump
-where mtr_inctax < 0;
-
--- construct marginal income tax rate histogram with bin width 10
-select "bin number|weighted count|average MTR in bin";
-select round((mtr_inctax-5)/10) as mtr_bin, -- histogram bin number
- round(sum(s006)*1e-6,3), -- weight of those in bin (m#)
- -- weighted average marginal income tax rate on taxpayer earnings in bin:
- round(sum(mtr_inctax*s006)/sum(s006),2)
-from dump
-where mtr_inctax >= 0 -- include only those with positive MTR
-group by mtr_bin
-order by mtr_bin;
-
--- tabulate weight of all filing units
-select "weighted count of all filing units",
- round(sum(s006)*1e-6,3)
-from dump;
-
-$ cat tab.sql | sqlite3 cps-16-#-#.db
-weighted count of those with negative MTR|22.434
-bin number|weighted count|average MTR in bin
--1.0|35.34|0.0
-0.0|2.308|7.27
-1.0|56.887|14.11
-2.0|32.926|25.39
-3.0|14.636|32.18
-4.0|0.786|43.0
-5.0|0.069|54.52
-6.0|0.012|66.75
-weighted count of all filing units|165.399
-
-The cat command writes the contents of
-the tab.sql file to stdout. We do nothing but that in the
-first command in order to show you the file contents. The second
-command pipes the contents of the tab.sql file into
-the sqlite3 tool, which executes the SQL statements and
-writes the tabulation results to stdout. (If you're wondering about
-the validity of those high marginal tax rates, rest assured that all
-filing units with marginal income tax rates greater than seventy
-percent have been checked by hand and are valid: most are
-caught in the rapid phase-out of non-refundable education credits.
-The negative
-marginal tax rates are caused by refundable credits, primarily the
-earned income tax credit.)
-
-Upload Files to TaxBrain
-
-Policy Parameters
-
-Section Contents
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Parameter Indexing
-
-
-
-
-
-
-Payroll Taxes
-
-
-
-
-
-
-
-
-
-
-Social Security Taxability
-
-
-
-
-
-
-
-
-Above The Line Deductions
-
-
-
-
-
-
-
-
-
-
-Personal Exemptions
-
-
-
-
-
-
-
-
-
-
-Standard Deduction
-
-
-
-
-
-
-
-
-Nonrefundable Credits
-
-
-
-
-
-
-
-
-
-
-
-
-Itemized Deductions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Capital Gains And Dividends
-
-
-
-
-
-
-
-
-
-
-Personal Income
-
-
-
-
-
-
-
-
-
-
-Other Taxes
-
-
-
-
-
-
-Refundable Credits
-
-
-
-
-
-
-
-
-
-
-
-
-Surtaxes
-
-
-
-
-
-
-
-
-
-
-Universal Basic Income
-
-
-
-
-
-
-
-
-Other Parameters
-
-
-
-Input Variables
-
-Output Variables
-
-Response Parameters
-
-Section Contents
-
-
-
-
-
-
-Consumption Parameters
-
-
-
-
-
-
-Behavior Parameters
-
-
-
-
-
-
-Growdiff Parameters
-
-
-
-
+
Text goes here.
+coming soon
Text goes here.
+coming soon
Text goes here.
+coming soon
@@ -83,7 +83,20 @@ following an existing recipe.Text goes here.
+The is the recipe you should follow first. Mastering this recipe +is a prerequiste for all the other recipes in this cookbook.
+ +Ingredients
+ +AMT-repeal-plus-higher-tax-rates reform
+ +Instructions
+ + + +Results
+ + diff --git a/docs/make_cookbook.py b/docs/make_cookbook.py index a5fff6c09..5929f7ac3 100644 --- a/docs/make_cookbook.py +++ b/docs/make_cookbook.py @@ -1,10 +1,10 @@ """ -Reads skeletal index.htmx file and writes fleshed-out index.html file -containing information from several JSON files. +Reads skeletal cookbook.htmx file and writes fleshed-out cookbook.html file +containing information from recipe and ingredient files. """ # CODING-STYLE CHECKS: -# pep8 --ignore=E402 make_index.py -# pylint --disable=locally-disabled make_index.py +# pep8 --ignore=E402 make_cookbook.py +# pylint --disable=locally-disabled make_cookbook.py import os import sys @@ -16,18 +16,13 @@ from taxcalc import Policy -INPUT_FILENAME = 'index.htmx' -OUTPUT_FILENAME = 'index.html' +INPUT_FILENAME = 'cookbook.htmx' +OUTPUT_FILENAME = 'cookbook.html' CURDIR_PATH = os.path.abspath(os.path.dirname(__file__)) -TAXCALC_PATH = os.path.join(CURDIR_PATH, '..', 'taxcalc') +COOKBOOK_PATH = os.path.join(CURDIR_PATH, 'cookbook') INPUT_PATH = os.path.join(CURDIR_PATH, INPUT_FILENAME) -POLICY_PATH = os.path.join(TAXCALC_PATH, 'current_law_policy.json') -IOVARS_PATH = os.path.join(TAXCALC_PATH, 'records_variables.json') -CONSUMPTION_PATH = os.path.join(TAXCALC_PATH, 'consumption.json') -BEHAVIOR_PATH = os.path.join(TAXCALC_PATH, 'behavior.json') -GROWDIFF_PATH = os.path.join(TAXCALC_PATH, 'growdiff.json') OUTPUT_PATH = os.path.join(CURDIR_PATH, OUTPUT_FILENAME) @@ -42,10 +37,10 @@ def main(): # augment text variable with do-not-edit warning old = '' new = ('\n' - '') + '') text = text.replace(old, new) - # augment text variable with information from JSON files + # augment text variable with recipie ingredients, instructions, results text = policy_params(POLICY_PATH, text) text = io_variables('read', IOVARS_PATH, text) text = io_variables('calc', IOVARS_PATH, text) From 4dd463c195a666e83744471238f3526db3893b5e Mon Sep 17 00:00:00 2001 From: Martin HolmerIngredients
-AMT-repeal-plus-higher-tax-rates reform
+AMT-repeal-plus-higher-tax-rates reform in the ingredients/repeal_amt.json file
Instructions
- +Step-by-step instructions included in the recipe00.py file
Results
- +Expected results from executing python recipe00.py at the command prompt
diff --git a/docs/make_cookbook.py b/docs/make_cookbook.py deleted file mode 100644 index 5929f7ac3..000000000 --- a/docs/make_cookbook.py +++ /dev/null @@ -1,250 +0,0 @@ -""" -Reads skeletal cookbook.htmx file and writes fleshed-out cookbook.html file -containing information from recipe and ingredient files. -""" -# CODING-STYLE CHECKS: -# pep8 --ignore=E402 make_cookbook.py -# pylint --disable=locally-disabled make_cookbook.py - -import os -import sys -import json -from collections import OrderedDict -CUR_PATH = os.path.abspath(os.path.dirname(__file__)) -sys.path.append(os.path.join(CUR_PATH, '..')) -# pylint: disable=import-error,wrong-import-position -from taxcalc import Policy - - -INPUT_FILENAME = 'cookbook.htmx' -OUTPUT_FILENAME = 'cookbook.html' - -CURDIR_PATH = os.path.abspath(os.path.dirname(__file__)) -COOKBOOK_PATH = os.path.join(CURDIR_PATH, 'cookbook') - -INPUT_PATH = os.path.join(CURDIR_PATH, INPUT_FILENAME) -OUTPUT_PATH = os.path.join(CURDIR_PATH, OUTPUT_FILENAME) - - -def main(): - """ - Contains high-level logic of the script. - """ - # read INPUT file into text variable - with open(INPUT_PATH, 'r') as ifile: - text = ifile.read() - - # augment text variable with do-not-edit warning - old = '' - new = ('\n' - '') - text = text.replace(old, new) - - # augment text variable with recipie ingredients, instructions, results - text = policy_params(POLICY_PATH, text) - text = io_variables('read', IOVARS_PATH, text) - text = io_variables('calc', IOVARS_PATH, text) - text = response_params('consumption', CONSUMPTION_PATH, text) - text = response_params('behavior', BEHAVIOR_PATH, text) - text = response_params('growdiff', GROWDIFF_PATH, text) - - # write text variable to OUTPUT file - with open(OUTPUT_PATH, 'w') as ofile: - ofile.write(text) - - # normal return code - return 0 -# end of main function code - - -def policy_param_text(pname, param): - """ - Extract info from param for pname and return as HTML string. - """ - # pylint: disable=too-many-branches,len-as-condition - sec1 = param['section_1'] - if len(sec1) > 0: - txt = '{} — {}'.format(sec1, param['section_2']) - else: - txt = '
{} — {}'.format('Other Parameters',
- 'Not in TaxBrain GUI')
- txt += '
tc Name: {}'.format(pname)
- if len(sec1) > 0:
- txt += '
TB Name: {}'.format(param['long_name'])
- else:
- txt += '
Long Name: {}'.format(param['long_name'])
- txt += '
Description: {}'.format(param['description'])
- if len(param['notes']) > 0:
- txt += '
Notes: {}'.format(param['notes'])
- if param['cpi_inflated']:
- txt += '
Inflation Indexed: True'
- else:
- txt += '
Inflation Indexed: False'
- if param['integer_value']:
- txt += ' Integer Value: True'
- else:
- txt += ' Integer Value: False'
- if param['boolean_value']:
- txt += ' Boolean Value: True'
- else:
- txt += ' Boolean Value: False'
- txt += '
Known Values:'
- if len(param['col_label']) > 0:
- cols = ', '.join(param['col_label'])
- txt += '
for: [{}]'.format(cols)
- for cyr, val in zip(param['row_label'], param['value']):
- final_cyr = cyr
- final_val = val
- txt += '
{}: {}'.format(cyr, val)
- if not param['cpi_inflated']:
- fcyr = int(final_cyr)
- if fcyr < Policy.LAST_KNOWN_YEAR:
- # extrapolate final_val thru Policy.LAST_KNOWN_YEAR if not indexed
- for cyr in range(fcyr + 1, Policy.LAST_KNOWN_YEAR + 1):
- txt += '
{}: {}'.format(cyr, final_val)
- txt += '
Valid Range:'
- if param['range']['min'] == 'default':
- minval = 'known_value'
- else:
- minval = param['range']['min']
- if param['range']['max'] == 'default':
- maxval = 'known_value'
- else:
- maxval = param['range']['max']
- txt += ' min = {} and max = {}'.format(minval, maxval)
- txt += '
Out-of-Range Action: {}'.format(
- param['out_of_range_action'])
- txt += '
Input Variable Name: {}'.format(vname)
- if 'required' in variable:
- txt += '
Required Input Variable'
- else:
- txt = '
Output Variable Name: {}'.format(vname)
- txt += '
Description: {}'.format(variable['desc'])
- txt += '
Datatype: {}'.format(variable['type'])
- if iotype == 'read':
- txt += '
Availability: {}'.format(variable['availability'])
- txt += '
IRS Form Location:'
- formdict = variable['form']
- for yrange in sorted(formdict.keys()):
- txt += '
{}: {}'.format(yrange, formdict[yrange])
- txt += '
{} — {}'.format(sec1, param['section_2']) - else: - txt = '
{} — {}'.format('Response Parameter',
- ptype.capitalize())
- txt += '
tc Name: {}'.format(pname)
- if len(sec1) > 0:
- txt += '
TB Name: {}'.format(param['long_name'])
- else:
- txt += '
Long Name: {}'.format(param['long_name'])
- txt += '
Description: {}'.format(param['description'])
- if len(param['notes']) > 0:
- txt += '
Notes: {}'.format(param['notes'])
- txt += '
Default Value:'
- if len(param['col_label']) > 0:
- cols = ', '.join(param['col_label'])
- txt += '
for: [{}]'.format(cols)
- for cyr, val in zip(param['row_label'], param['value']):
- txt += '
{}: {}'.format(cyr, val)
- txt += '
Basic Recipes
+Basic Recipe
Static Analysis of a Simple Reform
-Advanced Recipes
+Other Recipes
coming soon
coming soon
+You need to setup your computer in certain ways in order to follow
+these recipes. First, follow
+these instructions on installing Anaconda and a taxcalc package on
+your computer. And second, install the recipes and ingredients in this
+cookbook on your computer. There are several ways to do that. If you
+have cloned the Tax-Calculator repository (see the
+
+Contributor Guide), then the recipes are located in the
+Tax-Calculator/docs/cookbook directory. If you haven't
+cloned the repository, you have a couple of choices. You can download
+the source code as a zip file by clicking on the green Clone or
+download
button on
+
+this page. Or you can copy and paste the recipes and ingredients
+to your local computer. If you follow this last option, you may need
+to edit file paths in the recipes depending on how you've organized
+the copy-and-pasted files.
The is the recipe you should follow first. Mastering this recipe -is a prerequiste for all the other recipes in this cookbook.
+-is a prerequisite for all the other recipes in this cookbook.Ingredients
From f716d82d94a17f9b0458e962d6637a3df3848999 Mon Sep 17 00:00:00 2001 From: martinholmerClone or downloadbutton on -this page. Or you can copy and paste the recipes and ingredients -to your local computer. If you follow this last option, you may need -to edit file paths in the recipes depending on how you've organized -the copy-and-pasted files. +this page. This choice has the advantage of replicating the +directory structure and file names we use in our test kitchen. Or you +can copy and paste the recipes and ingredients, as needed, to your +local computer. If you make this second choice, you may need to edit +file paths in the recipes depending on how you've organized and named +the copied-and-pasted files.
coming soon
+As with any cookbook, the best approach is to follow a recipe
+exactly the first time and then, if needed, modify the recipe to get
+the exactly the dish
you want. Remember to copy a recipe file
+and give it a new file name before you start to modify the recipe.
The Calculator object is the central object in Tax-Calculator and +it is created by passing four secondary objects (a Policy object, a +Records object, a Behavior object, and a Consumption object) to the +Calculator class constructor. When modifying a recipe, following a +few rules will minimize the chance of running into problems.
+ +Fully specify Consumption, Behavior, Records, and Policy objects +before passing them to the Calculator class constructor.
+ +After initializing a Calculator object, manipulate it using only +Calculator class methods.
+ +Following these two rules means avoiding the manipulation of a +Calculator object's private internal objects. You should definitely +avoid trying to change those internal Calculator objects. And if you +find yourself wanting to read those internal objects, look for a way +to do that using public Calculator methods. If no Calculator methods +allow you to get out of the Calculator object the information you +need, create +a new issue asking for a Tax-Calculator enhancement.
+ +The recipes in this cookbook are Python scripts that +can be executed from the command line like this: +
+python recipe00.py > recipe00.out +diff recipe00.out recipe00.res ++Your kitchen setup would be validated if the above diff +command yields no differences. Of course, you can substitute your +favorite graphical diff tool for diff to get an easier +to read set of differences. + +
Some people like to use Tax-Calculator inside an interactive +notebook. You should be able to load a recipe into an empty notebook +and execute it there. If you want to work that way, the recipes may +require some modification to show results interactively. But if you +are a notebook user, you will know how to make a recipe work in a +notebook.
coming soon
+All the ingredients needed for the recipes are included in +the Tax-Calculator/docs/cookbook/ingredients directory. If +you organize the recipes and ingredients in a different way than they +are organized in our test kitchen, you will need to change the file +path for each ingredient in each recipe.
+ +Just like with recipe modification, copy and rename an ingredient +file before you make modifications to it.
@@ -99,12 +150,15 @@The is the recipe you should follow first. Mastering this recipe --is a prerequisite for all the other recipes in this cookbook.
+This is the recipe you should follow first. Mastering this recipe +is a prerequisite for all the other recipes in this cookbook.
Ingredients
-AMT-repeal-plus-higher-tax-rates reform in the ingredients/repeal_amt.json file
+ +Policy +reform in the ingredients/raise_rates_and_stdded.json +file
Instructions
@@ -112,7 +166,9 @@Results
-Expected results from executing python recipe00.py at the command prompt
+Expected results from +executing python recipe00.py at the command prompt as shown +above.
From c6d3e8d912db8fe72245f17712cb4340e9205106 Mon Sep 17 00:00:00 2001 From: martinholmerThe recipes in this cookbook are Python scripts that can be executed from the command line like this: @@ -107,7 +107,7 @@
Some people like to use Tax-Calculator inside an interactive diff --git a/docs/index.htmx b/docs/index.htmx index a817c76b9..ecd0fdca7 100644 --- a/docs/index.htmx +++ b/docs/index.htmx @@ -15,14 +15,18 @@ div { max-width: 19cm }
This document tells you how to use Tax-Calculator, an open-source federal income and payroll tax simulation model. The two ways of using Tax-Calculator described here require no computer programming. -If you want to participate in the development of Tax-Calculator -— by asking a question, reporting a bug, improving the documentation -or making an enhancement to the Python source code — you should go to +If you are interested in Python programming with Tax-Calculator, you +should read the tested recipes in our + +Tax-Calculator Cookbook. If you want to participate in the +development of Tax-Calculator — by asking a question, reporting +a bug, improving the documentation or making an enhancement to the +Python source code — you should go to the developer website.
-Please cite the source of your analysis as "Tax-Calculator (Version -#.#.#)" and link to this site.
+Please cite the source of your analysis as Tax-Calculator
+(version #.#.#)
and link to this site.
After writing an HTML graph file to disk, you can view it in your +favorite browser. The easiest way to do that varies by operating +system.
+ @@ -166,9 +170,18 @@Results
-Expected results from -executing python recipe00.py at the command prompt as shown -above.
+Expected text results from +executing python recipe00.py > recipe00.out at the command +prompt as shown above.
+ +Expected graph (located +in the same directory as recipe00.py and named +recipe00-graph.html) from executing +python recipe00.py > recipe00.out at the command prompt as +shown above. To view the HTML graph file +generated when you follow the recipe, open it in your favorite +browser. For example, on a Mac, you enter at the command prompt +open recipe00-graph.html.
diff --git a/docs/cookbook/recipe00-graph.png b/docs/cookbook/recipe00-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..18083cfc5c084aaa07e5df8617bafae37f11f6ce GIT binary patch literal 50023 zcmdqIWk6M1+b&F}gn%F*uxJnoVFA)5of47)N-kQukrEVX5a|Y$llOP0(dzkhl!G5=fSFWV`%*cIwwASGTf(KXZ4j~Av(_tdl zt~YVq@C6W;Oj~UDuxvG{{dwZ4(O=Z5Llge%`d}(_^J#pv~jjtl20m1qCm>FiNUe zicwSg_8nKCi!MT@_zQ@Wp%3^5jyK1RM)e#*6;lMqCn{}i3v|lgyAqpqCoG{PBI616 zogZzO!Ih^V)lNXk9M$*eu5sR4-&gg9BLG0YI^w)DvsK3b-V#(2KRn+B{NoM(HiIa6 z$kqca8QlYrUkIdUgUbAQgQuJ2RMod>P}PRT1Q5ckfx}x=7(&B+V9rSxEoB1ap={lU zYlF0^!>@rXFpN;0ZcK(_;2RK}#>KK|_QY4ozR?C+#;vL9K~Q^}!6hK&u)$yPg|LEu z37{c2m|4loQZ0ckKs(0S9|g(adknx4rvpoPapAN+^bHM%EMS1U_ftOeyo7^YjIteW zs4`tCG;mIj3{!<)$uAZq4ah#Lpq(FCOHr|jt6X6rVZ!I;Ec$|5i;|}8eZBB>g-Nsr=~pPZnZ3GQGb%}yqrKKHc&C~rP`%r|)`#fS zIDRQ9CbzBY&ryh9=n(lM(pR!yN;ACX7q0!8*cC_xM}Gg<)DZr^f C?;T?2W^z{GUsI`T&y0@A!|d>MgKXngdveJ86kz 3HByyZEfgFv;!q19Ux7G_H1ch%Rszs-x7*akS4lxQu_9P?VA8{OkDH_c5eoY z+qw^ca(-^Py6vcRxxURZeqhxDiUm>%r)A4tp_3$`qan4P_%{JDo8tBEM^l~;{*LX_ zF0W&PmiNtt!=OC&XOD2g7r_48no^qeJm_ZY1XB6Hu7wg7|JxA=vWN2C#9aJ(#s1OW z86&-Pwa19GK;zBzg~~M!Igg{b642p`zdldto@@4(xG~|+!LtWi_w@9tU7YzoX%YC? zeQYpC=*=&x71TtKU~$Gsxq)(H5}*_TDti1jGRX9Z;RuKT*zLpfLos#c>kUih8 L6rxowEWNHLJ`XIb3)Lh@HMCVGwZ8k6@tEql4F?c$SP-P?9``B^toPUB!8{OP20 zokPTS3DWzaJ?MFR J~d(-YcnYk&e8_1R8unk-O Vpv8)0l(!uY(2GFu Q_0;&j+E zfR_2UKj;=9?Mt|wpNc{nF@LbW%h#(OI6qu7VtJmAF|5s&R_nO-O4GorJeFCFfvER3 zn}FbJOc>nhtT2(VQCQo9$-}8E0B5P0C*aINDDO-$rI7nrijYUt3zz-Bs)_&Rr(grb zEiVH#zg> ?VY-c$6!;(q|z|FJ;`DayjYlzO4wI6T21aBT5U!d@JvQ#`x=O?6{8LA}%n zKw$w;d&5h0IMT6_t*AreW-74!$;hfBhPfx*ci`Mj1W+W-AAkFt&ZA$f<)%*UbsT{H zl420cCxLav_x &AYCQ&I7! z0lsM@O$^y%?xn1FV@9P9;IUv5R8v*}7Dz9%e{TmQxpbGV)g8DlpCQet^Yj6r z5#$e}r%Mw3c868=`H?)^PZ>-5Ztl@BKnm!|!BjwP$NmHg8~6clj9IX6e>gckaA#|} zc62LFl%CoY6q4}HBbH|w0U X z?Ju#Cw&qc;-FH;l7|x3e)5z_Sg@8g3X$ac0|4$)UO(F@Ky7M(f6lsc<0HYM&7_fpU zjE|cYnSzDymM%+Kk4z=N6Yuyi#ZMf~paE$`MIE&4ur*%V3!F?j9MFw1abYsei!D*w zH6hOTkI+ec!orITi{r?o7o_`ry32WbyZobzgZr-KQbBODQWGEGkD_%Y?Eh__sJ@@- zvzdDVUNy1Pctgo45t8vB>W@YI%X2)0Z`o)i{&tOZ05QCtEsZQL1;|<7KA>m h*wx`Cu z*cns{4sqf^O(i`c`QTO=`IkcimjVR-|HsLm>njX@)v&%e-U3#hq+lIcYwCr*0&K8% zpSn{4^XxX>B?|FHc|~AzNS!iM?@=4>0yvrt8zI--xktnONr|*!Pmtyrut{nDOt!(! zyc?`j6 bNTRWQQI;wrv2WINktm%rps;ZsS8F`>iS9M~V&= zrZEC61|<>R(#24q2+T)fJ0)CT`$;V@w5_E$1AyFjjDLQXIptzU^HBy~bpEltzI6D( za#iD%wy9nK=;%S709>NQ&k!?Vg_(XL(57eNGUJxpE_rw|>ysL=9!3AJyW3DW<(VS~ ztF$no@P5Dcmv8VAbTjck QHaUz^G&H+K^x zi2hzk2tCGA)~U}G08y@#z!MsxbX&a3*w=RCz#-FD4cbidL5F0s`EBS1z#_?_3N4`) zgXt3Jx!=wJDQE@ErqGX5)^g}`B%F_07WzzIzfAP!hX!i`5rvq}OSQ_qf#adm1Z^RT ze|k8uIZ>q`>pN3KS~$%2|MlgF;1S_zq-{!6TbJT&FT8JTkf5Dw@=I=t1-;y*Eoa^U z9A?gjv(A6P6aB>bzYSdHQ6~Y@S^#o E= z#w$q Eb217dC-IpWz z+DgTd4oH|(pzE^CD2(qHyeqS){y2d}-0v+)BB;}AuZkMZzdFbYx$PTY0N~Lf{} pzp#Tqf*+CTWbzEy#VsXo`^ zFlBgWV(pwCc9Po|Xj-!c^hQO2ZsjixYM3!#4=K#9hXG;6SO*f9pYWbz&`OxZB{2!o z*^7~|fGA&N^n_zLumYm#T*pw*(^Bk?n{Ta@rGVw11lS1S<8j7R&xHlJBN13l^H0iI z2355463b3q4AnPLn%mf506s{4`UPVWZED)RL0_Q?J-lriVCogs4l5HNNm&he)7NvK zrw&c#>`VpZ?~Hm@lNH@%G9jwDN)(oWU{zjN{waenAeg*~LW21e=s!NxgBC#QmrOBY zzupF G#UmD{JKX3A*0`60RkNBJ67$|SX%a~$7{uM17k3xuwsWqQt zYSZfD^HBY>VeCVV5;ATJluRz`jnlM)HwyoUuJ4Y=dhh=)QATA`M##=8WM}U^$}SD$ zvPY3JB2tuWUG^rSY_dv}y^~$`$f!t3@_W5?&V6^ezrR23$9;~YxIW`Gp6e~Sy~#QD zm34Yog9!6LlQspLB{2u7b(|YzU(_#Tvc-D?l7%Y;i2=me3hp|1KKj`dF_q(Y>CMe` zZ7|(wfu3@z1O%T_eqstj6Uc0i0#zPgOqmx(d)ME^rwXJg94uT%`Z_K)J^6J}qK>av z{GALy6z?|H@^J6M0Aa%t-x3sFk0E-@Nq^JB81o5od#}>rQoGr 1ed8j}0Qn+j(41H#RSRs)7T^|Wcp`jUFgiwdr zYi;pqDziGDnrJ?={(s2@9?qP6B3oCG7di=(s#rZbc1B|AmDarfs+((WWQ)P)`Uo8! zKQ)&NUHV?`(+57yJ-UiJgQ9uE8uRnwj2dU6B?%4hbC`%FQqz35f4c(_F$4zek@72t zq0m;?BK&_CVH8pYr(p^cKO7dLSg(|=otWU z)eEJKC|+z81Lvh_aNf8r>7DTk8^(Bh%)+ANF*caS{eh_!w|_M;;Z;8R!P=)F|MJZD zkt>W6*PesDvRi9CwoKj;`>bMunDe5d7;kP4_=LruS+#6C`EJJZoqy4X{M<8N0KjNj z9x8phYK!=c$oLt6BP%OUyK*q^ m1jDeqBvkV5d<`zBk0X1YU5DdM#lxD+!K#)eHVo(F8ToN-aEb!r`GI9NJ^u5V4SS zrN=TR`O2$BTwu3|45qJcsYno3SvE6Q5w_RuQY(-(3E-Xb)QEg)MZ^bXqvhF8y~8*q ze2-rap<;ezxZM;ob%(JiXcmOOeQ-3=VXvS@{K-r51=d!B)_=&~zh {03Q< zF(B0=4O`G{ILv18ex_tI?A;9<05$>B5bVqGGz8czz`@(;gl#_7N>b+KnTxl!8dthb z`*;80NniRBnY-S+nfBwv kB!3xncJUaP1WhF%weO98Lt^@oqFWN&=gP^ws#}S0x zOV@4ybZH7{1pZY6JD`i-LA=*@-(3I1=j;wbnQ%VS60Y=PoU}L2=lp~3F;n>EBtP$I z8u9qxy$-D00OU)UU)cWcyB*8k34QB@SbNp~aVhmkM03NWW3Xm9K$Vu-5B7vgeQg?v zC_=3CU&x_sJ(`MCDSM&i89i_7;m}U7F{Kqa7AZO(a4z8iP9NV(h))FHj8FOk`T?@H zmjFnL6;&Wvj%DsE!5HwE2o@~fG5JS?#4Z0ZU5B)sz4dUhnd67V L)f# zmH)XOq;l*8c6_5Wg RJr+F?ePr|sS;6;5_p|NWCP==>_$dQh_*`T}~!$29FVL@xqj4xGm3 zoqKlS3}z|XncbrgVEvlj<7yv?leg1JA8EschxC8L *Qb4Ah*GFOzSFVT(@Au2wi& zgp1(7%5Gk-1*%g`4Y@#gPTv!WfTYCTzXc$OB@|`?1$Z#l!Uxkcp~@V7(V)uR;i`1` z)y`wHwKu;`HTTzg-?D@8y w>>uqzJ_RLk#2)J!53{)+@X!Q(?ydOVe{xuH|;ow8Z98PlFd^d>js-RbQLEz3;Fy zF0XX)wA0uK2oCO~PqGrMFsH%*nmRh&8td`4`JlE&wP%o^CE^wT`}V4ep#>izPTI68 zp!lcu+U6KiNGt>7%!w}r5PzBb(old=|J577NW55Cd~oDcJ(?iORbS?sl@}lmjML4O z@m=cyB01up$~q^ Wd;QQ|20R qDXy6)7hp4aN!tFUbhr@BK2!H)hGd zc=9(cTBS#EuQl~HK0Vg<8~`p@3_;+2j2ob|v(>>$CP9xQ0B>qN=KIS kppa>cuGQ-j*AE3TlM%_9xTS)2qN%;8J zIF8;DOMGm-T1D91X~>PZ_8}oW#9BrGLE!Fm4Bn5FQ=LB4^0y 4m4%i?Hk`}A!X zhUZI&yP4#3c<8@>n{KLASj#cW0)YGsPfa%h>tAP|8n*NO_RT2OoGodfOB3gh6E2L= zxcNVgrM+?kBo8CiG@kTG*?zwHXHF)^q{a1j=d|O~HctE>bO*p7Zu&F=7wmr~J*>V@ zaA)R4g7^BM_UCSuGekHQWe@(>5ZN}MHy^{OHt==2bqQX^HvLXu1bf>3nv3q>!WVn+ z)Y!=0C!kqvIDm*U512}KL^;4{l@KIYd8fbJQuzB!n8IPT%cae@+r@2JYt$m!<3-D* zy?+jXX5k`WsI_KZWv=C3U|lc+#?p(*Zs)^uvEi>R-PS+#=@*IGBu1GAPw?FLWQ(RE zp+?sAhAox{R8B|U-H|2VS)Jj5HANsM;PM 6!(J1>DE&(4-r?s6 z 4x&}vpo+VRzm`}9O317WjXC7_%(|9DP+WhlCU0LWNSbC`f~|?C z=(CL&Jp6uXiYc1d^M<*7>j&Gt^lVQ%wBLU@)4n-JD!%tJ6HHPo0O0c504T3Uea2;? z!Ry&c0^F)ec2AL+zg-KSHuDRvCzv_$f{xv^$*T5P9+^)#1bVhp22#7ZpB*}_9ncr~ zZ=gpF#1QS*;;)8f@Q&V}QCK#P5<;n>mWIyti#Tbo-qqa-ARj2oJhH`dNw`-gy?XtC z=7rum(hPZ$V5`Tmjf(<`Omic!Fou46rk|-kbW^vv@KT`HER?*w3pF &d%X26f?`8ohqze= zkKk13y-!5viY(P;`Lt%P{(PKWompzrUBA9O`pI0@PUa6jNX+DS`KZ=VY5C{U5Sm5} z=5&>YU%|p-MPmHlh#KBAwFud3ZW+WYpMFp!sg*1}3IS{kwz*{pWZMK*zyUC*ET?hY z9 6U-Es@@#)pDud%&8P~N33;2vf{fQdS3o r_O2F&xzD@qVv{I(hT%yq0_fNT*r8$@8 Spc@Q+N`n)b)1Uc+w_ z>Clm#;2Qiy`s>gshaus3z#tty)Q(EHFV4l-lm1#c%$O}G{d10WmQ9X{Z>c9Uq 6e+M|G^ewU@mMYS7EpWz+W+%?F*{Es&lrf=9tvnEIqR^6{-C^%#ib_oO}y(<)U`e z4+G-BDQYp%EkV>C&`M%a?i~r@WzOUBv`oPVhr_yDVW=2}J)ClA6?ST@wDC_gz=}4j zQ|gSR9^55&rqD(U0j%n!NZfqv*5WC^YVw};p_UsBgpW~AZM1%>JOTa5i?`j(KaxPC zTQ!&qZi#@03B`fs1M=f&=C1{VgqGW#jQQ}BA^=9(eW HP6!m^e1zIL2z~jfCX5H9+ S(Y& z43m0^N#1tGNO>M;y+n`m_^I-urTT9bIh`g5gSASGyyOTl24g;(4w4Hw=_3?*Dj)_< zSby_YP0S$dt_od>YAP%a9c)^M2})G=eD&`FRrnDJwxnu>1I7QdfB-vV<-_qR3v_(T z`;t%yApH*=kR)TYC@vIp2}V5^M3Us3rfa b ?CYv-LSdtV@ zcQeHJA4E|zji2a+bCXF29W-*nPo{f{#l^FdIti8=be)3eB9BnQHH+m8?=UmF%9xnR zfRvL|yqu5A#mI5Cd %hs!)J@~b}#WyCa2>e fGIf#1 U4OevVe&O-r_~=| zg6(TsWNQdgCvU>aUIrp($zPve3t=M9mIXw@+V{eCZE5(uckE2%Y*I0J8(N4s6D6(( z8!It-zzQ4}aJ16D-@{>TT*rG@dDUg=r>SGXWV7UDzg@&O5i41#Nt}9=TFeN)5zIP7 zWFXLUqxJ-zI`M9UohwKZ9U#gx&`tUy1>5*rou9EAj{_n;r;t8exRM4KUl}yXrltM_ z`t3^{pVxkGBLg1fSe9K)_U>;l{PHF4eQ%YAlaXPy=VtXTYu|lNU0wx^FWJ6R=3jk4 zI Z`xf`Xt`e4nk=QEkp z*!V_9k1ytR_3L|Qb7`*wWwaLLKc1AE=`QYjSIfdVZ>jY0SV*R=TMp=j!j9v&TpiIr zwqn-y`=;7`swd>{RH^*@kEkea1xP@As-~OSag191Ueyad0b6GY1zACb6t4br4?jGYW*h{N2~?C4!iEu}utD z!K^BWVi|7e=TP8G@nn*IIkO`TNvBnI{ubFwtX&x`Z~F@s-q!c?4pDOY0mx+ %4=tDD~EDNV|y$ea6 z^*1FE`?==8>P$3QJT-J^cNRIzJ~WlVGX=ijz+d>;YO515@>x2`%hF-4lFxLqSe^^ZT*`?3cyotK0`680jiRWuC%5MHF%EL0pyLj(>;0 zxCB0>2{fQQOmCKnu<%<3w+EE&5f|KucYZfNFZR#f*+Ih*RzZV& @*fR6A15j@dub?5&N=7W$9PVELU;xx8 zlHKe={_D@30W*ue!L7~BDEVFnx`?ZIH`H5&>gA*NZl&rbc8Jjl+1oH2VE+*YXjiD% z1mSS;)ko*u+E1?o8X|c~S-u?^Ly_@Ltt;FxXg6V6N7#^ADZbXF0G>I=Vr0YxeaWW< z3BaXv6Co-vdYrE4!ki5Ku8SF=g#ei71+c#%pU#-?HVD>YEzHk=PTMX!(LD}9Y=hr8 za3!gG@UVmpd?Q@3K$i{zcW38%^5Y$;OvEUI*wo3DRO`R@dFKa)F(HZuNNdE20;+QF zIxm3k51C}fZ2NM^U3}AyLt61CVHMYlx}bDId|4iRSL!0W7qH5>NM00k{hI`FH&D=A z$Ks15Ylc#Vf`S09%~rxiTDvi6Cfu7YJArnAYB0C}Vd@SyNyNmKoh8M7u*hVB^5_?k zqJzjSQqXDxpv3_Ym0dxi%laVvKbmn>XOjx&RLVB_aKA%D3J`wmT(89}(VL~Y%=WP% z&Ld0n2d=Q<50D4`Gp!K(2e5;2R_j+ C&%8p75sL<5~G1 z@==Y2?0v?O_NU>`nGb3C9Dv+9pA9RcMR@xXV!*coUZIOxal$TiteN4T(|-U5YYH4e zLgbyj`}S8%!h4(KP&!St96+f}$QNfYRVve>!6fidbj6;;3fIsOb`{SB<0$Mg4dKnM zStdUVv|wWsI;ZI0>386mP0vj>);xe;h +s9un`y!{mfm<6e9{Z_TZ7OBx+1EkFq9=%afZ;EJ-jIa0Z;1tXWR x&MHBl4cf4y7Le&Lk*iLLFBV<=YSqkEf9su&XH_UP{{5GNI znVqCoZC8da#EtD&;jrx~l7jcn9X8*ptvDviYbt!Nnhp?205dO)9pG+i(Ecz-bkhuZ z?10OLRi?cs35F9Z{P%+QKYgh4J$a(HY#k*d?iLOD&7ntEbv4xrY y!%NUMSIX4SXvcwM1O-IC=Yql ;>@aOjykh|Cy^} 3t`QSZ^gc*5 zmd|V^;204Kgf4-tV;F7H81P(-FJ%7IIEevs!)b@1K0Yl$seA%P<~G2<8EFejyUpWm zz8 dgWV5*2|U0L~Na7#FWgS2o*e-5@v@m}HfN &+_31SvMz7Qc9CgRHs c`lV>)BE6u0 zC2G1|@$$?~p4pEH)kX{`@d;^%yib-hjCSWKqH96dowlGYeV-GAep0>HI>^U45<8Dw zM+& 3RWw1|l=?M-lz?O^Q51q+klT^Kki8y7%k-a0~j(8B( zRvoEl@%3-IQ}z-_U={Xac!l39`D=j+b`jDAN?0FB^ EdK{$lVi4Se>hX#L}CIR zrPymkf7QXU`irt?9lOj4ouhyK-RK{sko1}{hxDQ&h)A%h8xMXB`L^|J?~(+_GRqJ) z*vD{W?{yd|aruBnO7rV0W1~cpxp^}aC T)c z_Wc 3R3qu?mZ+7KoF8soZH_;!d=N9qzF z{WVaO4vupyI4a4bm;Q;)M~hX{fdeE3rOn$;9t%b>bTcG=-kY|TQrq*S8+ek3h*M=U zUa1j3otU~BY!*a0Avi_c%6 i3RIE;M z`kV_jFCJOr>Q-c#=TRk`lN5EO`wYg4icAn6cYIp~1@8Gk(EMXStKj?p8Ncbb6XRi4 zsahEUvtRQxXEq+#)bbM{N7rli4dt#MG(`d}mHwS3UI(hOR}-(t#9yJzTLO}W+|gh5 z4~zewf(Z_Lm`9KGqEiy$1+CN@h+9%$f?u8wyXuG#v)<}t{mkE@^tO;9(m_xv&7Yfc zb3sySb+%K~J185({f_sI=btyhRueC509b@5b~Mp*2HOwVsBUic6k|&Oj#gTh`4Z}T z!gJsKwE$up{U~G1N<`r*6_y7QSCLx)Bxrs5% tq>EVP-YwGD>y%l#5g?`umNb(_k!eJ)ATX3*7P@cJt}e#?oPy+aIuHt4B%`# z+%1wH0fZ6EvvN@!r?v0FyU$Km%wt1c=QgYTH0q1E0mgy&I5GmfONHL%4veZ9NC)x& zLUZJ!6vRG2uPWxzRDr3rZO`06$Z0v}0hWP5L$gir=1)i~o_M7!_X)DHO#lP`8s$+I zScFTfq8Un96sorC>iLXUT`4kkcLGQQ5ryqf0HVPm6jA_!x)L`_=3=pSEEq#WPup}c zpRIu;8%auu_E+ICDnr?ynLC|=jeLr)c9x-W7{*Kl17Bwnh~_p2E;qIjcO_wVK{pav z-E2?Z_`BqMq*bAj6ZqQ2!7n6pAs_?od`zg7^?XtMsmy!wkl1A0R}{wJ2 VX^vCOjfd6N&&BONXZJ*YwnA$G);BeNbn%(xPTv1RISJYO**Q@?aLoRIlx%QOu zWd4me`xK||$&=wX(ktP!6SnAt$q*mA-OaWCKEAFZ5qX+Fm)uks{qN0u<0~tRiyfLP zZOd(o2FaamYuAiw&V4(3-J@o!_MG>Z#&xJc18@KZo!(Gz#1fw(Kb#=|>*Z SLh zWGAk0iG29nWl|YL4WAO;sjdt^G5+FvuB*Y9o8R {eG^V>P_1*Kml6 iCqzyx~Qt-o>S3j5ov!IhNCkp!{kC~(^?e)@4fXxUAv3?aiu7gCBQka_0gMDP7 z=?lP)aWg+v@5&nwlKUNf!NOhu5bjY^iQscRfEKZ9Nfob3ZdPMOuKeyU>!tAFj~S#+ zyN2#T%Speu=r#_i^J5Z>+n*-Pp1jeco4gkg9e>tHg!(HiGgn|WbW0PqcvF=_V8s&} zMP*{Y=98p2`&xCjw^hE}VR+_(v1y&pR*G>sqoMm=xuYfN!V;JEpG!_t1pA}nUhYX> zJ;# Xj`29{OdO4Tw@kENxqL`EkF@jYrg3`6Y6eGQ42p1X||BU&(~8 zHT;vj_3zpc#_JalOtp2|i4s>W2f5BR zQ+9=ve)}!HBZ`!jX~M@N;t>T5C=VSI73~S^);e^ZN{5<(BIJMbT($nb91D-)0Hokp zqUsp%Q*Zyy@2N`eH~9$bbgOT3 0MjdLuhxB$+d|a^SP ^zh}|E58V$kTtVfuS#@olcSYz{`I=cjl{l>Ep~l3yE1dsv^BJbEUT1kt#}&l zIW#o@iCF?uY#T~0l!Od}<8S}Roa%^|$}7s`y%ug@zdm-$sR|5%=0{sWDnxUnORx($ z2;9zTc#MbRTCu>GNN81Q0>1Znqg6DwcnnE_rLD|+)BSsd&QcX@Gg>Z4AiApd>DkES z-NTHwaBhmilu~+&E)7S`*|V$ufFIc-DO~c6zzt}~4lsVf?vbh5ha5=2ygDR%ue)r* z>q@v=+r{k%*OTTTjJ`L=zCJolT-~eO&tT$o!tfxw#C(g|lNSJ#Y6{T61mwV069uE) zO%w%qd~@w^62zBOZiOf6(W`%ly|dzmUQoj2KHw*^g#*JG`5tZK)`bPafF9X33LS2W zqI(RkO)SebA~3LA&xB*d?i$?CH)=>@Z? <-6#DRbWc6&sxekB)mIwb20B?2d0{!eMeM?utinL0egMqJTIzHz?}j D`gn08_b!Ei-GhLDYaAGrfrgSbr?z4hUa-xu;yQbgZhk&exaLh}ig& z+_D|G#~&_%>d5`&-U9=vLC5Ge7GY)Tu%$F~zvQ_~>&hjKt|%3OiRRkVN^W8%ug`wo zfCw4F1uVCXGw #lWDKhsnZx zz4&4KcR7!d^L3%6t_ADq)@|DaVpF?}ImF1CV5p2%?U6)qbA8z9+xr(_u0=^71_4RF zzdd1{2}U_tK#EU?(y|XL-TN6K2th}6IW-WjSO^pT?-zIYaNbyE=oUPp`dkn@kr@!6 zQHcy1$Xt{9qgl}ulq7D{sEz@!c%kg#EB||T31wE%$WKT)KiWxU^lH0h$sWitNG@&i zGE4@ivk8DZ$T#j1b2OG~< 5oaxvwM8Ql z65o->^0sSu0&{4tR#G7ghS9{3#~cfGV-I<`pp9rbsQHE?)<>Bt0%90hEsjCAIqeN@ zQ^rB2Yci4gte+mvjN3Sd&Garpm`LL}sU-`LiLq&)%%?pvLOXJ}<*;dpmxK>aMfY2y zP&KaXw)FC*8uMD!`i|`3Rn(0m$<+dtuJf5#(^E@;te3);|3iU$a};=hMNl?eck^O9 zyVAP>I=RJH2biv{JQD|s98HSOPfOb&2?h!5q68Wfkr6;4Qjnujk>BAJbBIQ=wD-tm zeEl%Xqxu8DOshSKm{wU??^bvIVtHV?2zQ0fNPhW@Qa_?egC`nux&&lbRI2O*DsQWm zGGqfTFNX=TmJ7AdcdM) Y|C4UlrXPV@bMOUWZ;@Z!duj5mcjo=qYk;ItyUN*V9wtSS4 zM0<=hOKaBsWG8SZD1Zi~jEOjZl#R{j6+k2`cy_5xAAI<|UhX&^fJ~SomQ7)*)gc14 z0}u(I|6L|;@!rW@`ot(ouGrb&Z*||oBgwYl!VUs6x1fIwW(KYLSos~h(|ZAKa#LN| zl~>$LAB{XC8 q=L-xYVpV}xdy93=Vr+zRnsnTdCbKt{xE^OEJ-+=S85Ro@W1Onvv`Me0`=$QKS% zmzbjgeeH`}@Iym_R{Ta~D}C|$s7!cyJGR>2^Yl9z4;ES$lKu@1l5rhF^{c3_nmRuv zi#@!w{xR=y6iI_%#dbUH3x%q WIgTUqNAX%>I8SpWep~EntNnHZ{iAc=>jw5SS+3 *bgD`{1Iime*~yzuN+pUm5(b zcFzHBQ4o&2%{91vQ1b7ZzsK(yIeY+=V-qT|!1WX=dYfyrRX+UxsYivBIQR6ntOQyI z(OG7_+0UN?z4X-hRMcF(;y=Ah9s4qdFZ%0@nPKU-Pa2iXmdU5^MeMm$e48Hkb8Y!Y zDf_ Y0ynQbpgaFC9;18lR1WJJSWxG*>w7ZDoRP$V@xxi4aG6m+`PCY`p6 zF}s)o6UI)&0C-K8WVSaRVaE6Fj^c=54l9{fc1qp?C;%`X+X64>x@7 8gN7h%VJ8_7ymP%sT95qv2>2_IMH&~3p5HZs%Et2`+TAd;y9JR- z=ANjhj}@{`Lm1LAbWEx0DcDdPAeGs5lT|WgAnXAgv)h31%d3fB^$b{sTPJ97o@3QR zeirQvYAq &gz15y> zvlN`{8gd~Fs)gaLBY-099N!B(I+`!}jGr^79t3xcH;UUdH?N%B2qPZ6K(h< v}xBz$TxFqd3WK~l9lM_H3POX zsuZw-RC>xl{N!_q>k9~J&-2~>&EEkTO~+kGhQsRDLBdTVmOwm65U>j< y?`CWzfn;^CLKTLh~5)ZwB9db=5_~8%)J8>3;l$eAJ2!wm$7Ztmi`tdp{8O zO}_!JmdsRjb4F>qgG@Cn1T!e%(gmp%uYT#44xDHS?FiX5vcsp1b6bV)s~kb6C~|z+ zOj8~A1RylgZU_aBfYbh-OjMCYWe_?kR(lLgoQp6WyRP(g &K0O@$R_!%&CB)b1=P91w8A>8Fif0OAjk5r|bKv;<5u z{oHz{W2SP%dMByaC69DEwX$n_5pUjz6=zDu-Tk1KshK$ni^(7qbHT=R-Nenre;lY+ z!J64DHh=R86n7t)md2hObco&>Wn7shnQq+rE>vTA_SJT-m;Sws27KzI8P5<3DUhA= zFYBo=PSYF%ZYJ?*C-@{5;TX(pZk@n1%UdMjAwOD;KGb?^G2s@Luw!^?JfbJ==F#2k zY)4ED?`fEG>WWnn@w*PX_!mnc;d)GkXJSxdel2(G7ORmkA6tsYf;q@5LxZUb09YD= zC Wto_wt>_YX*f?6Fng_JU>Q`_X*ndt zXt^k`xDW($K5DJt%(@mB@r~7#=yPTbs6@81+$=~=5QOhz5dnwr0x!2|+6GKAkBqON zRifNt`ART=@wa-9?*pKs6nV=M&N_070m_#F4rT)N&tO%k5R=d?ysU(r#%Q8jW=}#9 zJ21F^;3H+!ao_uDafkZ*59!gP4($;I)=HA7!um2nqa70u^K8SzSepP~o!W&zSfOAE zKv{;ZV$WN<2Ht|~Qgf_jd-x`nS5jXVpq9z8x2!x7GySR?AU@GZ9mJT-U+h}2iO7zA zFWjlhlDC**jvLM3*GB NGcvA2pAN>ExU1!R&V$DivU&lytzhpH>^-TY_U0O3?`dYj`?* z-*{t7P!JS~QUf44_@r(%EZ5)5ptLth &45~$Hc>t)ROFPcmyxIbaU<5BT}cP zD0lWJBhc&KpuQ2o^kg& DH882t`d#K0 zoj*b4y0d&TuM$>&e yq)D(6j66*^2a{{Y_@N%pRMsKc^myRL{N|&Vyf1 z`7!TMXK2(8e$C)#CBt~NQ;XZ}T~>V{Mbl_>&tY3bn@n*SzAaDs1<+D8eU#9}@zKKU z6jL&74Gex6JRs$_UxL(Rkqq^hEpRdn0zN=$h=U32!DH8E=AK4rP43{zqUN%Ms`qsX zfB^a0?Om`2bC@Fn5P O6rsordza*%amN9H9wmKUYJeARyud*NpDP9C^n ze%ulqW4<2$;TH#c(d2Zy3(f~%W&mtE-g%-oQr*o5og8ikwX*i$nqW65<4h0>OQLcM z+_V}oy!RWh5T*<$OjAkS^XEWcRzWn!Y9=@hV @alN}KKk$oOOH1xka!NEJ z_c=$PHP~a3uPJ^8{|v;jYZr#gA8*W(yR$#*2PKE5v*Y#PDnL%;n~}1De-wK6ryc^U zI)Kvn&l?X0TDSbCM(=DWDFgUL+Lht0k4M@{Y~;3oZzb02rz;=2>JUyc2ow5b6a)7e zq(ue!ftW`TY@?Mwj*DD*^FaO;yucp(qshP5IAgVo5Z*QWlf$zG7H)Z=X&i|gGmN1o z^D%~XKHicaZ|~D24k0ZX`jN76x;0jy97w|#m0~`1yl3=pXE1R4 g)+%M0-(elhZJPp!had(7(B^@roM55pq@=RzuCpHWnBH iSVs6LGGT@>to`-u+(A>1j5! n2Uz*YMr-|Gb zVU<~QFnnb~b9=j)H ` ^X0&n_jRN!|0qXY@;QFaVGT#ns)P3+@D9O$qrl+VJX6Gz^!T}XsUDPNX? ziPL0|0N<+XFkfF6JZuL~kSlR(0cF*bk?iT2>^-I#e`?!i7-RC?oOku2e%b?0XWgXP zp9faD-bZ4%mX9`fouGHoNY|PAW%88Pd%wjx*2YMk?fh{UiuOl0aCg=(gui}LJf3J~ zLD|rM)d@d+_S>!oxj&j2{vL%O40CT({Mm3t+)xhPTp$nCsb#RZFw&FbVXGv>8N^hs zJAd^{%~m_ZiNYi2$7%6QozFcD-pK^DB!<6H6GPO3$TH^FL<}wi$Df+n6(Q^O(F^*) zM*8^BLNEX}oOrU>gmkX5=6GD9F688YKqSQ!^=JpfCp|OOv@Eap;cfqcZT2O?e{JHz z6Qi{}>!u4QtNkUgW9EgQ_ SxELQelBJF>f<-^H zi5zd_v}*>-6Et@LvXG+WTfW45KcVR#wMm%N-kA}$&IeSuw`D(tY-RIH V7*qn@Bx3Y`ls^^f>>ooU=b;x z&*BSW)JrHta%{MQ2k8ixz)@Zb-=T7u76=@|T?9@Gp=FJ$kX=7-b^toUdn1aTn+e5~ zgWgr~Vtdk=VUPh$t*f{zJ8+G{5iv`!C3bo!s`r2Z#17m$MbC>?iKceFd-|wrAZ9JQ z3pswcj~Cukoe#g<3u%(^VlHVYTM^{Im`F~YGRW0#P@h=$hD2TM!YAgHMQ7l^FhH+` zQFk3JWKp;)Mxy)w>3;f^;UR+%*0Tg`?*k&)m}uDkAsl?#9s(ec^#R=RNhlt-F}Bs@ z(xu 81pn6qWG*7B#)dOuN-+H*^$}R&P zpI=_08>`&|dGLafumg}teYNHbxn;LrSSvP9qOhJjJK^%rA1T7f$j0wzYMcTa&9d&1 z!3!L_V3GwQ%gkvGy@Sx!N)kzuaZYnyKXG0*}h9G&K4`*w3daw;(^m7-fF|s0wK< z1c1Xmb~7-@NVA-!{MyP?*`StsVsY~P%;iigT)K-aS+?KQal)wm`0`bKO{!lj0B$(^ zVQ^GQPDlY3=So7>^i9+4ddZ8pdf;xSXsD6457_hOrQWYS>YuEBS|A>W_Die)pHB+u zpBMe#@}x@Y2g|BI|J7Fx+{g4)A?|9`7V&T31G;8Ot+V-U8)7aCL9i4zGiP(j4`w1B zc^NK&3dShL5*j6nT~h9h=$Fr=%`oj*mVtKC4`}cq+$R&-m1x8U2w$|+RS`RM%NQuL zkzgBB>U_^J5{Xj5xEP<9%WfzhJ@(FiYI-8|v+isLyT%C$mayU&`u1ozDkl_0ctLZ* zAiJ5HUCCovkQQ97kCwz*TrgcJ3Xh)w-(T@a5XJZ z90Ut$F)+b{|8%0|u$e}rur8V~Ia&Lm--|vF89u##`D~qd1ozg&cu>w{S08=CuFKzP z`UQv(10K;U8Tnv2Fno4lDaO|k&O4}m*BflsbghNoaj-ti0+_kejw53Bu07L7Ky3@^ zwo^~t);)zB-uy~;$e#9nd{(nCkmH%zJE(W;kw&S3A7#VwE0n43XSXqC$V63gJTe>a znWGf Zf(_WE+4czUbq_|C(W zvItd{yUIbQ9sPZ5N*{k*nHfIzO}czsK}Y=rWB5Nmg 6!@sZr5sNo*2Xu*;V zdfWqh8e#&R%gUy)XPU$0as#dcSukQxi edU(ND(kK%-oO*4VrXsOFQn)f{#J@uwrI8(_2!;xj2?!^427ybQ9j%Vmm+ z?>&TI#};sR*+J5@we&Oxbx}xDi~{Z@Cd3o}6eEIK%z&^>*Gm*j1^do(v;|HzM>>Gr zSt%_JqDBt^oa|UJzMu9P=u0*xpj%1H?OG!Bm6 1Mb871AR?in!v*jtFJ3ROMomvBv^_g5TfbIqWp r%^a>9wP>s!J~EtkeuSbqNDTLGUB-8X#(KRW=wn$F9k*m$5K4HWKXo}E-YmT$ zm^LAKvR7q$|1_9tithBM&8_{yeF}RNJ{l$GuQdr!KZzqn=p+h1#F$)VLaJnad9*)7 zVL{zs0))g!HmvQ?i@nYZ=nYEi>{>=5Si&M(9`c?53#JGDCgg aW{O5E zf9ibJ|KfaP&!MmM75r0V#YIcNVD>_3pYW_T97+jCq~-_2)k4?hPs%&}3fKoZ&t0{( zk(2BL>C+#cQE~VtHjtHg5iNJc1Hv$qd|1GIA?}B;i(4RzzoN`ju=rSh5S?lC-?21+ zBdoXOVNTyuqfT#m$`i*gNm$W_^9B9e^>+3;za#jr{d|1N=Ld0L>#39Qwlg@I=l)$p z{fZR#OlR?yid+x;Yd4oYObL_a_?t}Izi%Fw#!j&;>U-QrjVA0DM2ju0Df)EBLL5fJ zmm^sJ=zpfS2kJro86D-OT7^|H8@sx?7J2f#b$E`^D(v?yx `#>OZozjTf4KJQ snDRa661T3!+ahu<#=xTUIsV$bO zxXM=C1}953jg)ccM|5+lhj>}fXn+pSojYH@n+g7PX2y)p+y7mUV7ZL0;NK60EHe>a zMJD^+ket8o)@|7tv>uF CnF6f`x0TM~{uORS&r@V)%Cv?w%0TveYbsm?nTC-? z%4=hO0L;n`Fzdq oZ3=PrTt{A$N^=3C_lmi-u3rmtgh} zzuA#2^8wCl3vJqlA~OuDLH^~&?d!CMZl69<3mWm`E(5?O)8&CH?=|S$DW1H9SYZb^ zCdjeQy@% Z^?Z* zszIg1SN_OKAsL>DC28Xn_c+${>{U2Fs1WeWs+V67 ebZuE 4XFFSyLUP_ly?3x<68}%4jejk;2r#Ri9 zu=*7HTeoaT@`3}&CsOsd#>bD N>hU`%p=@1$q`hK%Xhm><# 7;W_0ofx10dToD{?L>Ex}+@4aI} z#&ILn%4D_FZdp*vEnsTPC%Tvz;u3yD2)Y5q_CkczP<6JH6r?Zi@$mStdHBwgRt}e4 zvW-#oor5!~8Qt1W5#6613n$BZ5E}Im{eJ0HXMfbIeYpXYChHvo6GwL-qjd2~P2*zr z_21GhQGC9?2I*~408W0+b?9kTAK;W%wkR)(%w*Z>-(+5o!iS7nz`uacCs7- Z_{$Q6Rk1BOo>AD5j`T2k;f;56uJmUI4 NG`LwwV yHZ-XZ-as^T$z z2}O*5$yZ~!J4q0b`Lg8V?MF|)r_7xZr~73qJ`a@qASf4?V-AP1-|@z3rGVCEIZ@eF zfnLlx#lZf*ql{NzHhPMMd@a4-Z7?`wraMh(QgWUn|EZu~;VSKVX^X|!MMnA}FL_2p z)iAtaEz_7wb M6%F5j+pU^aAF+H zvFRk>eMkG5sc?5HLKWC$7)14Pd-zdh`08uAfQi3GEBME8!jzGKN#zr`o$)n%)zbKm zE(7kD8DN@n9#O@eu`G|kR}b2e1> ~HV2DJTsAcaS`=D=OQJh0M5q^to8 z`o9FX4**U28i+v(06_On@P8C=uo6IVKOh*w?JgkdjEvOzFJ|4$?aZv9B7 u?Q$BH9&aq6_knKAh1`zKj&`(zHwl9A6hA(D$3BN6!iB%+>`l| zr$zFK6!o`2`_Z^Pl>l{>;)*W<55mQ4e #J7TX8Lxe0$;(ouj zb8FY H*#x9E1}CXSu(#KP?pfQF z7rvKNze1Os^E~N@H vFYuO%I Rb|862 xMc(U_8XX^K+rF?@S7~Z*aZCM?*i81CC7M3py6l!8`x1SpU8v} zLU2$%WqEn3CR^_fXy4Kk1PqSyl0@I*kJQH^7Am2{FW(FX6p6rMFod$i&IU?uU8uIV z(zeuGeW>XAmP~5)c{K#~`AGEhW2D|W!Ym|G1*TP{=EBR}F2RwSX>L3IRwp$b>`o3| z5F(db{>PkQYis<77zfm+n>XiEZmp)+n^-pT4H`ikJT{GX@6!q6ul9~^v$^r?qs?GH zNsh+L{(Mf@mv+p6>H)3UC1A91C+!!oMu7MWJyEkzVpe;R6)L1tdYE+QCdxj=|2woR zMWbDnu#mr*>q)!Bu-Sye9JlrW`|)qaHHPi5(1ZZ5A@F-|;@zD* &M)98=KMne-H-;jLSBto)eOdK$9Ddp=GK$^D{ne0;Rc>L(4e=z9V z%+ZJ!71cFsU4~{1mw@%%iG%M>1PI X);^{o6DRw1|GH$oqZ8W8=^~WjfnElw qv5MoO<)dRKr|1u9WeXk^lT}RBiM}Y!Zy{&wTWn(Nve3l&dT^Rd ztac<%4M}8aLn5y&viTxWyVyTE^f9G9)Gf(;LuY@Lv)zbF9MQ>2`iyQW^-p!Zf}U`y z@xpey{|Y^I&pdbS$elCs6yp>E^7iW&ppAF8UJT!B!wgId ^n@E0KT*Isz=7#sV zuVSp&I^StliGC_By>pGjsv_^s73ycObuaQBfio{RE^7 BR13;x({exy6u)P6I`270_`-R zswjv>tpCq(G=(b%*AQ(|eL@X!DGqU=tb{09X6Y%Bduz!27+wVVp9gj2Am<=I?S@VI z^pM0i?c%$AXlsV4M2DKYSc*&4DV4cB`(4xY9!|E+Q3L%N%IY exO&*){$GTWm4;Q{`!a1t zYGPV&M@{%SRe~GQKU<`nsRszP7E%SZW`_>xJDfyFL==?D4mTt(5bAQbBPgOeCWD$e z!hvsFwSG{f?Af&NloZQx1v~!nCmRMXJDml2!f(4=1`p-GlKIauR4KfHL~r8@J)Od* zM^xt!`ZQlGyAzK@+F9$>L|QR6?d;W}88jnAoRK$0+>&LZ6~o>*ogGYUty)_Ryn%~c z!}`9eU?O^LtGoM}eA;rwG(+U+Y8#UF?yvJV-;sX@MXw91J$~W{L$GuBVIV(INGG*5 z!O0Q(Wbe=}$k|h_%ZD8m@+cGK8>~{{O6{i(fH!KFcB!nT!oa4;PG?qDiDoQRv0z$D z%e#?5g@0vuIH$9$@}76fgtDlxPit}X_%0d4o-MUHQ|npViNxdkruVE_9CXM>f1B3r z0?)x8p9oPy`!<6rD=$H7Vqx9=o3)h1l%vzoaO2_|mm |e9`lGI>@?nkL7(rg!(ck6q6>#$ui-WI<$S({4p{GW_i98D{Ygv?olGrP5H;@=Sw zeH5-v$d14HcSeXpn^8#UJ1deMOxa-^|7$x$UTjk>$JjG= OAgz$*b*zZOrjbGr~eP?`jy@r05wTDoQK`@5H!F zE#N1wL}?{!%OD@qA5>^J6qhsh^z$Y$1>(;N-Xt_68l%|luEsp=|Hv)sxF2y=GU07( zi_yHc>;jInb1Y$FMX67lHoN|!5j=k(^#KGY7!UdBHQZcYLUYXXpX{4L>T~}}QO?7S z{_DxUxs~ U5-s^$#+F}Rg+YQxpy`(dZ75b11-<{X}dG40G zyu2tD_1@NQ1dT#LVMK%2xXzRMe60#wV=LHe{Crvh-v|x*Y@R3ems+S~QVzL>mlHWg zN*=s)Rh(k$9MqK(v=e~;3(o3dYI5Lls~YS0a+O6H?&OQO+Iu z=}7o6M&gvL7^>?DtxOyls~~CfoL953pvSY#Qfh8&mF0R}@`#H=#)nM8;yZ7L_$S1p zAsRf!h@zUFQnBsUhL%UA3a!60L~?{VF1DbTkVO77eLE7xHix5<`WJcwoP_Wy-LZ1s zjufd0T-4qiYO};(#F(lJ%88s8ISy&I!ag1qcM}8#Eem&3Xfu^WY{zi8T=%Qku8IXr zk1|3SJ1pTYHlTse(*}!;9%rmq9C*UOP>QO>Vx_+>xzd(m(n5a7lRB9}bNGsOHM6v) z$ffDEqn{lmsw1S00!nW*FB77;-w6=rup52XIJvniF7(wr0UK+&s$km}ICF$qMag*d z@kfDsA<_eIb2Skyt*!PAmG3V0v2~QyIpJC{ubtNFXH|M}F#T5XzeV9Ig_xFB_N`sL zz+fCqtLE0+UrQL*CJx)c(9@hhsS719@O!hWZ XcJ53!-|AbWvj6bYnRtXv z?d=|_vXq^bb4b$s^3)H6NZgC9Qm377rSF6`N7uaa5wD0~!&Ln<;m9isALK>t(DUB( zk114*g%J&NK57Rvp%9YVVKVZVWwHItgS54R2>H1P9?_YC;@0rcoWkk(mYY@ou=Yt@ zj9M8fESV44+0a{jZjy_weMVEP*ZLx1leAl*P`nxo8_uQ(l*eq>Vms3BIVQcMn F>s{j`5m zqXUIbtt0EGtb3bmxEF1AZdjkeO^g9TQ%Yli`ImE<_XB+z`dEW5WN#>%KZYrAL{Fl_ zbCFh{BQDvM2)iRx+I7(IO1xY5>|AGPaIml@|6La~ xFD@-f(2$%l8b!kGU_RP1n@S{aP&-w&fhLR&sJIR6kjZbs>$_M2we&=3? z`AIN4o%HHU>ZX8Lw(G?Rzmgz lt;yGbeWY#UdIz?pGn&XRk-xf|G z-FUpKi}#L+jETgc#!`2|gF4!oS+{iWxXB&4qcsZE%@fl7>?yutq(%DKyT7hce`j?J zgrlNy7lwm0zqu1ueC>lK1fCNxmSPKz99XaT$}#RJvc|H0lXme!>?yDL?9y}e-Gu&K zN1iaJHpV7&yPglJ2-+!W{j%0ED+-A9Ev!$V753fU!8NjWQ3HocPqNk|+z)hbSly0e z+K@8WGsD7AifitN2+v?L**rW=tvlItSvTiZ*|3xqo)Kx;G(8qkCv`ieaRZFnq}ST2 z**{(Lxc7*6uJe0eM!N^{M%t}KF%F8T7?S5U9oZZ *pQAGwcXSoH8LIy2?b~G+cIx~Z2ZD(TehF|$ev(;~qNP+fF3Q6-3 zjhDwH&N~;q8PsZJ-yEL|Pcso42$$9Vo@P@sxKA%S_o>ln=byluIku{W8mpaMS8_p$ z&$sviW1cUVuy2Nkx-IV33E;nYGVfzcl;{olouO5Fk6}YK9vwI*B|*B6N51!YjN0M+ zKJm-^qF+Rlk@2||{#K<&)@)wx9XgxLbbqETUcetW#V x+Qq<|?PDsZioykKqE!wLi|}Y2(faX_=Viat$(qY^ z*nF8De=DT