A Categorical Speaking Indictment

Combining law and math to improve speaking indictments

Greg Sepesi
32 min readAug 11, 2023

1. Introduction

According to Wikipedia, “In the United States, a speaking indictment is an indictment that goes beyond the legally required statement of the elements of the charged offense(s) by including a narrative of the alleged underlying conduct in more detail.” The Justice Department’s recent speaking indictment of Donald J. Trump about the 2020 presidential election has no pictures or diagrams … just words describing the events leading to the four counts:

  1. conspiracy to defraud the United States,
  2. conspiracy to obstruct an official proceeding,
  3. obstruction of and attempt to obstruct an official proceeding, and
  4. conspiracy against rights.

That speaking indictment about the 2020 presidential election could have been organized around

  • the timeline of events,
  • the alleged co-conspirators,
  • the events referenced in each of the indictment’s four counts,
  • the major sustained efforts, or
  • the different geographical regions involved.

Those alternative organizations of the indictment offer different perspectives that are closely related. Category theory is a field of mathematics that is particularly good at showing how things are related. This essay explores the intersection of law and mathematics to propose that all future speaking indictments should be “categorical speaking indictments” by adding category theory diagrams. Category theory diagrams are more than just information graphics. For example, a category theory diagram in this essay demonstrates that the commonly used but-for legal test to prove cause (e.g., but-for ‘A’, ‘B’ would not have happened) can also be used to prove intent (e.g., but-for the opposition by ‘B’, the progression toward the outcome that was the motivation behind ‘A’ would have continued).

2. Context

Special counsel Jack Smith has been leading the prosecution of two indictments against former president Trump:

  1. a speaking indictment about classified documents, and
  2. a speaking indictment about the 2020 presidential election.

In his brief public announcements of those indictments (each approximately 50 pages of double spaced text), Jack Smith said “I encourage everyone to read it in full.” Therefore, it appears the Justice Department has the goal of informing the public about those indictments in addition to the goal of prosecuting the alleged crimes.

Although the goal of informing the public is admirable, the premise of this essay is that a speaking indictment with category theory diagrams would be more effective at informing the public than a text-only speaking indictment. For example, approximately half of the paragraphs in the speaking indictment about the 2020 presidential election are background details, making a compelling narrative but at the cost of losing clarity in the description of the alleged crimes.

Near the end of the speaking indictment about the 2020 presidential election, there is a list of the subset of indictment paragraphs that directly support each of the four counts. That approach reminds me of the published list of income tax forms and instructions that citizens are invited to investigate at their leisure in order to understand what taxes they owe. However, unlike the legal requirement to file income taxes, there is no legal requirement for the public to spend their time investigating a poorly organized indictment. If the Justice Department truly wants to inform the public, it must put more effort into being understood.

Category theory diagrams help mathematicians understand how things are related by abstracting away unnecessary details and representing relationships between things as arrows (also called morphisms). For example, the following diagram illustrates different types of speech. In this diagram, the only two types of relationships are “is legal” and “is illegal”. By following the arrows, the relationships can be read, for example, free speech “is legal” speech and perjury “is illegal” speech. To properly set the context for the indictment, it might also be helpful to review why certain types of speech are illegal:

  • perjury and witness tampering are illegal in order to uphold the integrity of the courts, and
  • inciting a riot and conspiring to commit a crime are illegal in order to uphold public safety.
Category theory diagram with an “is legal” arrow from “free speech” to “speech”, and with “is illegal” arrows from “perjury”, “witness tampering”, “inciting a riot”, and “conspiring to commit a crime” to “speech”.

In addition to illustrating the indictment’s paragraph 3 (quoted below), a diagram like this about free speech would also set the context for possible events that could occur during the trial.

3. “The Defendant had a right, like every American, to speak publicly about the election and even to claim, falsely, that there had been outcome-determinative fraud during the election and that he had won. He was also entitled to formally challenge the results of the election through lawful and appropriate means, such as by seeking recounts or audits of the popular vote in states or filing lawsuits challenging ballots and procedures. Indeed, in many cases, the Defendant did pursue these methods of contesting the election results. His efforts to change the outcome in any state through recounts, audits, or legal challenges were uniformly unsuccessful.”

Ideally, the reason for widely informing the public about an indictment is to get a lot of people thinking about solving an underlying problem. The necessarily adversarial trial should take place within a society asking itself “how can we do better?” In a video recorded interview, two time debate world champion Bo Seo describes the needed empathy:

“There are two lessons that we can take away from how debaters listen, and to try and apply it in our own lives: The first is, it is in your best interest to understand the opposition’s argument as they would understand it. And what that means is, it’s not in your best interest to twist their meaning, or to take it at its worst, or to capture only a fraction of it, because they won’t feel as though they had been listened to and heard and ultimately responded to. And unless that moment, that click and that moment of contact happens, it’s not a real disagreement, it’s not a real debate, it’s a kind of a quarrel, or people talking across one another.

The second thing is, it’s also in your best interest to respond to the strongest version of the other side, and sometimes to build up the other side’s case, so that it’s even better than where they have it now. And the reason for that is, you know after you finish speaking, the opposition might have a light bulb [moment] and come up with a better case, or someone on their side might say, “You’ve responded to the weak version of this argument, but here’s something better.” So the further you can take it and the stronger the version of the other side you can respond to, the further ahead you pull, the more you challenge the other side to go even further, and the better the conversation becomes.”

3. Summary Diagram

The task that prompted the writing of this essay was the making of a single diagram summary of the two months of events described in the speaking indictment about the 2020 presidential election. In my opinion, some parts of the resulting diagram are easy to understand and other parts still need some work. (The Julia and GLMakie code that generate the diagram is listed in the appendix for anyone interested in improving the diagram.) Unlike most category theory diagrams, the following diagram has no relationship arrows between objects. That is because the non-chronological ordering of the indictment paragraphs would have caused a lot of crisscrossing arrow clutter with little benefit. However later in this essay, portions of this diagram are revisited. There, the relationship arrows are shown.

A rather cluttered diagram showing a horizontal timeline, the vertical axis denotes which of the six target states (AZ,GA,MI,NV,PA,WI) are involved, and events plotted as geometric shapes with each of the six co-conspirators being represented by a geometric shape.

3.1 timeline of events

The summary diagram has a timeline of the events that are described in the indictment. Because many events occurred around 06 Jan 2021, several events are plotted away from that time (to avoid overlapping) but light green semi-transparent arrows point to the time they occurred.

Note that the indictment’s paragraph numbers (the summary diagram displays the indictment paragraph numbers inside the geometric shapes representing the alleged co-conspirators) are not in chronological order but the summary diagram is.

3.2 alleged co-conspirators

The geometric shape representing each of the six alleged co-conspirators is defined in the bottom portion of the diagram. The geometric shape representing the former president is the circle.

3.3 events referenced in each of the indictment’s four counts

Each of the indictment’s four counts (listed in the diagram’s legend in the lower right corner) reference a list of indictment paragraph numbers. The indictment lists those paragraph numbers. The diagram instead shows (below the timeline axis)

  • a thin line on the day of the event described by the paragraph associated with each count,
  • a thick line on the day if that event involved direct instructions to people who could overturn the vote.

In an attempt to choose the correct level of abstraction to avoid unnecessary details, the diagram plots symbols only for the events that involve direct instructions to people who could overturn the vote.

3.4 major sustained efforts

As described in the indictment and listed in the diagram’s legend in the lower right corner, the three major alleged illegal efforts were

  1. fraudulent electoral voters (represented by red empty rectangle),
  2. VP electoral vote rejection (represented by green empty rectangle), and
  3. targeted state Justice Department fraudulent guidance (represented by blue empty rectangle).

3.5 each of the different geographical regions involved

The two letter abbreviations for each of the six targeted states (Arizona, Georgia, Michigan, Nevada, Pennsylvania, Wisconsin) are listed near the diagram’s right edge. Therefore, the diagram’s x-axis is time and the diagram’s y-axis is targeted state (along with Washington D.C. in the bottom row).

4. Mathematics and Law

The approach to proving something in mathematics is very different from the approach to proving something in law. However, there may be some useful analogies between mathematical and legal proofs.

In law, proof is often called the “burden of proof”. According to the Legal Information Institute at Cornell Law School,

Generally, burden of proof describes the standard that a party seeking to prove a fact in court must satisfy to have that fact legally established. There are different standards for different circumstances. For example, in criminal cases, the burden of proving the defendant’s guilt is on the prosecution, and they must establish that fact beyond a reasonable doubt. In civil cases, the plaintiff has the burden of proving their case by a preponderance of the evidence, which means the plaintiff merely needs to show that the fact in dispute is more likely than not. A “preponderance of the evidence” and “beyond a reasonable doubt” are different standards, requiring different amounts of proof.

In criminal cases, an important part of the burden of proof is proving intent. According to the Legal Information Institute at Cornell Law School,

“Intent generally refers to the mental objective behind an action. The concept of intent is often the focal point of Criminal Law and is generally shown by circumstantial evidence such as the acts or knowledge of the defendant.

In Criminal Law, criminal intent, also known as mens rea, is one of two elements that must be proven in order to secure a conviction (the other being the actual act, or actus reus). Some jurisdictions further classify intent into general and specific. It is sometimes difficult to draw a clear distinction between these modes of intent, but the Supreme Court has held that general intent corresponds loosely with knowledge of a crime whereas specific intent refers to the purpose behind committing it.

Drawing this distinction is important because they carry different standards of proof. For general intent, the prosecution need only prove that the defendant intended to do the act in question, whereas proving specific intent would require the prosecution to prove that the defendant intended to bring about a specific consequence through his or her actions, or that he or she perform the action with a wrongful purpose. It is worth noting that due to the confusion surrounding general and specific intent, some jurisdictions have adopted the Model Penal Code’s approach of demonstrating intent by showing the degree of certainty a defendant had that his or her conduct would cause a certain result.”

In mathematics, according to Wikipedia, a proof is

“a deductive argument for a mathematical statement, showing that the stated assumptions logically guarantee the conclusion. The argument may use other previously established statements, such as theorems; but every proof can, in principle, be constructed using only certain basic or original assumptions known as axioms, along with the accepted rules of inference.”

In category theory, things are defined by their relationships (represented as arrows in diagrams) instead of by their properties. And category theory proofs are typically about taking a previously established relationship that applies in one context and showing that it also in some sense applies in another context. In essence, it is analogizing but with the rigor of mathematics.

In the speaking indictment about the 2020 presidential election, three sustained illegal efforts are alleged:

  1. “The Defendant’s Use of Dishonesty. Fraud, and Deceit to Organize Fraudulent Slates of Electors and Cause Them to Transmit False Certificates to Congress”, as described in indictment paragraphs 53 through 69.
  2. “The Defendant’s Attempts to Enlist the Vice President to Fraudulently Alter the Election Results at the January 6 Certification Proceeding”, as described in indictment paragraphs 86 through 105.
  3. “The Defendant’s Attempt to Leverage the Justice Department to Use Deceit to Get State Officials to Replace Legitimate Electors and Electoral Votes with the Defendant’s”, as described in indictment paragraphs 70 through 85.

To save space in this essay’s summary diagram, the names of those three alleged illegal sustained efforts are shortened to “fraudulent electoral voters”, “VP electoral vote rejection”, and “targeted state DOJ guidance”, respectively. In the following category theory diagram, each of the three alleged illegal sustained efforts are shown as straight lines of indictment paragraph numbers.

Category theory diagram of the three major sustained efforts alleged in indictment: fraudulent electoral voters, VP electoral vote rejection, targeted state DOJ guidance. The three efforts are represented by lines that intersect at 20 Jan 2021 (presidential inauguration day).

Those three subsets of indictment paragraphs describing the three sustained efforts are all ordered chronologically, and that is very helpful from a mathematics perspective because ordering things in time is an example of a very commonly used category called totally ordered sets. (It is so common that mathematicians often shorten the name, for convenience, to toset.)

The relationship arrows in the above category theory diagram represent “at or before”. Therefore, following the arrows the diagram can be read, for example, the time of the event described in paragraph 53 is “at or before” the time of the event described in paragraph 54. In the diagram, each column of paragraph numbers describes the events of a single day. In other words, the diagram’s bin size is one day. (Zooming into a much smaller bin size would reveal a line of arrows, each coming from and going to a single paragraph.)

Stringing together relationship arrows results in a path of arrows, called a composition in category theory. The three compositions in the above category theory diagram are all straight lines, and those lines are extended by a dashed red arrow to a single goal: the 2021 presidential inauguration. The indictment alleges that all three sustained efforts were aimed at overturning the former president’s re-election loss. Therefore, those dashed red arrows represent hypothetical relationships: how the sustained efforts would have progressed if not stopped by someone or something.

To make those hypothetical relationships more concrete, it is important to clearly define how each sustained effort ended. That perspective is somewhat different from the perspective of special counsel Jack Smith because the indictment’s final paragraph listed for the sustained efforts is not the indictment paragraph that most clearly defines how the efforts ended.

For example in the diagram’s top sustained effort (the alleged fraudulent electoral voters effort), the indictment’s final paragraph is paragraph 69: “That evening [14 Dec 2020], at 6:26 p.m., the RNC Chairwoman forwarded to the Defendant, through his executive assistant, an email titled, “Electors Recap — Final,” which represented that in “Six Contested States” — Arizona, Georgia, Michigan, Nevada, Pennsylvania, and Wisconsin — the Defendant’s electors had voted in parallel to Biden’s electors. The Defendant’s executive assistant responded, “It’s in front of him!”” Although that paragraph describes the Defendant keeping track of the status of the sustained effort, a clearer description of the sustained effort’s end is in paragraph 101: “On the morning of January 6, an agent of the Defendant contacted a United States Senator to ask him to hand-deliver documents to the Vice President. The agent then facilitated the receipt by the Senator’s staff of the fraudulent certificates signed by the Defendant’s fraudulent electors in Michigan and Wisconsin, which were believed not to have been delivered to the Vice President or Archivist by mail. When one of the Senator’s staffers contacted a staffer for the Vice President by text message to arrange for delivery of what the Senator’s staffer had been told were “[alternate slate[s] of electors for MI and WI because archivist didn’t receive them,” the Vice President’s staffer rejected them.” In other words, but for the VP staffer’s rejection to deliver the fraudulent electoral votes to the VP, the fraudulent electoral voters effort would have progressed further toward overturning the former president’s re-election loss.

Similarly, in the diagram’s middle sustained effort (VP electoral vote rejection), the final paragraph is paragraph 105: “During and after the Defendant’s remarks, thousands of people marched toward the Capitol.” A clearer description of the sustained effort’s end is in paragraph 106: “Shortly before 1:00 p.m. [06 Jan 2021], the Vice President issued a public statement explaining that his role as President of the Senate at the certification proceeding that was about to begin did not include “unilateral authority to determine which electoral votes should be counted and which should not.”” In other words, but for VP Pence’s refusal to reject the electoral votes, the VP electoral vote rejection effort would have progressed further toward overturning the former president’s re-election loss.

Finally, in the diagram’s bottom sustained effort (targeted state DOJ guidance), the final paragraph is paragraph 85: “At the meeting in the Oval Office on the night of January 3, Co-Conspirator 4 suggested that the Justice Department should opine that the Vice President could exceed his lawful authority during the certification proceeding and change the election outcome. When the Assistant Attorney General for the Office of Legal Counsel began to explain why the Justice Department should not do so, the Defendant said, “No one here should be talking to the Vice President. I’m talking to the Vice President,” and ended the discussion.” However, a clearer description of the sustained effort’s end is in paragraph 84: “The Defendant moved immediately from this national security briefing to the meeting that the Acting Attorney General had requested earlier that day [03 Jan 2021], which included Co-Conspirator 4, the Acting Attorney General, the Acting Deputy Attorney General, the Justice Department’s Assistant Attorney General for the Office of Legal Counsel, the White House Counsel, a Deputy White House Counsel, and a Senior Advisor. At the meeting, the Defendant expressed frustration with the Acting Attorney General for failing to do anything to overturn the election results, and the group discussed Co-Conspirator 4’s plans to investigate purported election fraud and to send his proposed letter to state officials — a copy of which was provided to the Defendant during the meeting. The Defendant relented in his plan to replace the Acting Attorney General with Co-Conspirator 4 only when he was told that it would result in mass resignations at the Justice Department and of his own White House Counsel.” In other words, but for the threat of mass resignations at the Justice Department and the White House Council, the targeted state DOJ guidance effort would have progressed further toward overturning the former president’s re-election loss.

The evidence of specific intent increases with each additional sustained effort that would have continued progressing toward a common outcome but for the opposition of someone or something. This proposed use of the but for test is atypical. According to the Legal Information Institute at Cornell Law School, “The but-for test is a test commonly used in both tort law and criminal law to determine actual causation. The test asks, “but for the existence of X, would Y have occurred?”” However, a category theory diagram shows how to generalize the but for test to determine intent in addition to cause:

  • causation is based upon relationship arrows coming from the composition’s initial object and going to its terminal object,
  • intent is based upon relationship arrows coming from the terminal object and going to its initial object, and
  • causation and intent are duals of the other (i.e., the arrows are reversed and the initial and terminal objects are swapped). In mathematics, once a dual relationship is established, it is common for a mathematical proof to be just the phrase “by duality”. In law, the duality of causation and intent has not yet been established but category theory suggests an approach to establishing it.

5. Conclusion

This essay presents several category theory diagrams illustrating the context of the events described in the speaking indictment about the 2020 presidential election. More than just information graphics, the application of category theory demonstrates how the but-for legal test commonly used to prove causation can also be used to prove specific intent. For example, it is legally common to argue that but-for A, B would not have happened (i.e., causality). This essay proposes that category theory diagrams can help illustrate the legal argument that but-for B, the intention behind A would have continued to manifest.

Category theory diagrams can abstract away details added to the speaking indictment that improve the narrative but reduce the clarity of the charge(s). The level to which a category theory diagram helps depends upon choosing the right level of abstraction that shows only the essential details. We are all too easily distracted. By ignoring non-essential details, we at least give ourselves a chance to understand a complex problem.

References

Cheng, Eugenia, How to Bake Pi — An Edible Exploration of the Mathematics of Mathematics, and Life, 2015 book, ISBN 978–0465097678, Basic Books, https://www.amazon.com/How-Bake-Pi-Exploration-Mathematics/dp/0465097677

Cheng, Eugenia, The Joy of Abstraction — An Exploration of Math, Category Theory, and Life, 2023 book, ISBN 978–1–108–47722–2, Cambridge University Press, https://www.amazon.com/Joy-Abstraction-Exploration-Category-Theory/dp/1108477224

Fong, Brendan and Spivak, David, An Invitation to Applied Category Theory: Seven Sketches in Compositionality, 2019 book, ISBN 978–1108711821, Cambridge University Press, https://math.mit.edu/~dspivak/teaching/sp18/7Sketches.pdf

Appendix

The following Julia code generates this essay’s diagrams of the events described in the speaking indictment against Donald J. Trump about the 2020 presidential election.

# indictment.jl: directed graph of indictment
# isZoom = 0: plot summary of indictment
# isZoom = 1: zoom into sustained efforts
using GLMakie
using Dates
using Printf

function indictment(isZoom::Int64=0)

# initialize data
ls = 0.74 # arrow lengthscale
vfs = 34 # vertex font size
df = dateformat"yyyy-mm-dd"
xmaxPlot = 15.4
ymaxPlot = 4
C = [ # semi-transparent RGB
RGBAf(0,1,1,0.6),
RGBAf(1,0,0,0.6),
RGBAf(0,1,0,0.6),
RGBAf(0,0,1,0.6)]

PDF = [ # Paragraph Date Flag ('1' denotes unique, specific, and instructive event)
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0",
"2020-11-03 0", # paragraph 10
"2020-11-03 0",
"2020-11-03 0",
"2020-11-13 0",
"2020-11-13 0",
"2020-11-22 1",
"2020-12-01 0",
"2020-12-04 0",
"2021-01-04 1",
"2021-01-06 0",
"2020-11-16 1", # paragraph 20
"2020-12-03 1",
"2020-12-03 0",
"2020-12-04 0",
"2020-12-08 0",
"2020-12-08 0",
"2020-12-10 0",
"2020-12-15 0",
"2020-12-23 0",
"2020-12-27 0",
"2020-12-31 1", # paragraph 30
"2021-01-02 1",
"2021-01-03 0",
"2021-01-06 0",
"2020-11-05 0",
"2020-11-20 0",
"2020-12-01 0",
"2020-12-02 0",
"2020-12-04 1",
"2020-12-07 1",
"2020-12-14 0", # paragraph 40
"2021-01-06 0",
"2020-11-11 0",
"2020-11-25 0",
"2020-12-04 0",
"2020-12-31 0",
"2021-01-06 0",
"2020-11-29 0",
"2020-12-14 0",
"2020-12-21 0",
"2020-12-21 1", # paragraph 50
"2020-12-27 0",
"2021-01-06 0",
"2020-11-18 0",
"2020-12-06 1",
"2020-12-06 0",
"2020-12-06 1",
"2020-12-07 0",
"2020-12-08 0",
"2020-12-10 0",
"2020-12-11 0", # paragraph 60
"2020-12-12 0",
"2020-12-13 0",
"2020-12-13 0",
"2020-12-13 0",
"2020-12-14 0",
"2020-12-14 0",
"2020-12-14 0",
"2020-12-14 0",
"2020-12-14 0",
"2020-12-22 0", # paragraph 70
"2020-12-22 0",
"2020-12-26 0",
"2020-12-27 0",
"2020-12-27 1",
"2020-12-28 0",
"2020-12-28 0",
"2020-12-31 0",
"2021-01-02 1",
"2021-01-03 0",
"2021-01-03 0", # paragraph 80
"2021-01-03 0",
"2021-01-03 0",
"2021-01-03 0",
"2021-01-03 0",
"2021-01-03 0",
"2020-12-19 0",
"2020-12-19 0",
"2020-12-23 0",
"2020-12-23 0",
"2021-01-03 1", # paragraph 90
"2021-01-03 0",
"2021-01-04 0",
"2021-01-04 1",
"2021-01-04 0",
"2021-01-05 0",
"2021-01-05 0",
"2021-01-05 0",
"2021-01-05 0",
"2021-01-05 0",
"2021-01-06 0", # paragraph 100
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0", # paragraph 110
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 0",
"2021-01-06 1",
"2021-01-06 0", # paragraph 120
"2021-01-06 0",
"2021-01-06 1",
"2021-01-07 0",
"2021-01-07 0",
"2021-01-07 0",
"2021-01-07 0",
"2021-01-07 0",
"2021-01-07 0",
"2021-01-07 0",
"2021-01-20 0", # paragraph 130
] # PDF: Paragraph Date Flag

COUNT1 = [ # paragraph indices into PDF
# 1 2 3 4 5 6 7 8 9 10
13, 15, 16, 18, 19, 20, 21, 22, 24, 26, # 1 - 10
28, 30, 31, 32, 33, 35, 37, 38, 39, 41, # 11 - 20
43, 44, 46, 50, 52, 54, 56, 57, 58, 59, # 21 - 30
60, 61, 62, 63, 64, 67, 71, 72, 73, 74, # 31 - 40
75, 78, 79, 80, 81, 82, 84, 85, 87, 88, # 41 - 50
89, 90, 91, 92, 93, 94, 95, 96, 97, 99, # 51 - 60
100,102,103,104,111,114,116,118,119,122 # 61 - 70
] # COUNT1

COUNT234 = [ # paragraph indices into PDF
# 1 2 3 4 5 6 7 8 9 10
1, 2, 3, 4, 8, 9, 10, 11, 12, 13, # 1 to 10
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, # 11 to 20
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, # 21 to 30
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, # 31 to 40
44, 45, 46, 47, 48, 49, 50, 51, 52, 53, # 41 to 50
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, # 51 to 60
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, # 61 to 70
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, # 71 to 80
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, # 81 to 90
94, 95, 96, 97, 98, 99,100,101,102,103, # 91 to 100
104,105,106,107,108,109,110,111,112,113, # 101 to 110
114,115,116,117,118,119,120,121,122,123 # 111 to 120
] # COUNT234

EFFORT = [ # indictment paragraphs associated with sustained efforts
# 1. fraudulent elector guidance (130 is data sentinel)
[53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,130],

# 2. VP electoral vote rejection (130 is data sentinel)
[86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,130],

# 3. targeted state DOJ guidance (130 is data sentinel)
[70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,130],
] # EFFORT

# if diagram is not zoomed into 3 sustained efforts
if isZoom == 0

# initialize speaking indictment summary diagram data
fsSmall = 15
szEventMarker = 50
yConspirator = -0.1
yTimeline = 0.30
xt0 = -13.5
xt2 = 14.75
rangext = xt2 - xt0
strDate0 = "2020-11-03"
strDate2 = "2021-01-15"
dt0 = Date(strDate0,df)
dt2 = Date(strDate2,df)
rangeDate = dt2 - dt0

CMark = [ # Conspirator Markers
:rtriangle, # 1
:utriangle, # 2
:ltriangle, # 3
:dtriangle, # 4
:pentagon, # 5
:hexagon, # 6
:circle] # 7 (Defendant)

REGION = [ # geographical region 2-letter abbreviations
"AZ", # 1
"GA", # 2
"MI", # 3
"NV", # 4
"PA", # 5
"WI", # 6
"DC"] # 7

EVENTSTR = [ # each string starts with strDate followed by a space
"""1
The Defendant, DONALD J. TRUMP, was the forty-fifth President of the United States and a candidate for re-election in 2020.
The Defendent lost the 2020 presidential election. The Defendant had a right, like every American, to speak publicly
about the election and even to claim falsely, that there had been outcome-determinative fraud during the election and
that he had won. He was also entitled to formally challenge the results of the election through lawful and appropriate
means, such as by seeking recounts or audits of the popular vote in states or filing lawsuits challenging ballots and
procedures. Indeed, in many cases, the Defendant did pursue these methods of contesting the election results. His efforts
to change the outcome in any state through recounts, audits, or legal challenges were uniformly unsuccessful."""

"""15 [...]
b. The Defendant and Co-Conspirator 1 asked the Arizona House Speaker to call the legislature into session to hold
a hearing based on their claims of election fraud. The Arizona House Speaker refused, stating that doing so would
require a two-thirds vote of its members, and he would not allow it without actual evidence of fraud.

c. The Defendant and Co-Conspirator 1 asked the Arizona House Speaker to use the legislature to circumvent
the process by which legitimate electors would be ascertained for Biden based on the popular vote, and replace
those electors with a new slate for the Defendant. The Arizona House Speaker refused, responding that the
suggestion was beyond anything he had ever heard or thought of as something within his authority."""

"""18
On the morning of January 4, 2021, Co-Conspirator 2 called the Arizona House Speaker to urge him to use a majority of the
legislature to decertify the state's legitimate electors. Arizona's validly ascertained electors had voted three weeks earlier and
sent their votes to Congress, which was scheduled to count those votes in Biden's favor in just two days' time at the January 6
certification proceeding. When the Arizona House Speaker explained that state investigations had uncovered no evidence of
substantial fraud in the state, Co-Conspirator 2 conceded that he "[didn't] know enough about facts on the ground" in Arizona,
but nonetheless told the Arizona House Speaker to decertify and "let the courts sort it out." The Arizona House Speaker
refused, stating that he would not "play with the oath" he had taken to uphold the United States Constitution and Arizona law."""

"""20 _VOTING MACHINE ELECTION FRAUD INSTRUCTIONS"""

"""21
c. Co-Conspirator 2 encouraged
the legislators to decertify
the state's legitimate
electors based on false
allegations of election fraud."""

"""30
On December 31, the Defendant signed a verification affirming false election fraud
allegations made on his behalf in a lawsuit filed in his name against the Georgia Governor.
In advance of the filing, Co-Conspirator 2 - who was advising the Defendant on the lawsuit
- acknowledged in an email that he and the Defendant had, since signing a previous
verification, "been made aware that some of the allegations (and evidence proffered by the experts) has
been inaccurate" and that signing a new affirmation "with that knowledge (and incorporation by reference)
would not be accurate." The Defendant and Co-Conspirator 2 caused the Defendant's signed verification
to be filed nonetheless."""

"""31 [...]
f. The Defendant said that he needed to "find" 11,780 votes, and insinuated that the Georgia Secretary of State and his Counsel could
be subject to criminal prosecution if they failed to find election fraud as he demanded, stating, "And you are going to find that they
are - which is totally illegal - it's, it's, it's more illegal for you than it is for them because you know what they did and you're not
reporting it. That's a criminal, you know, that's a criminal offense. And you know, you can't let that happen. That's a big risk to you
and to [the Georgia Secretary of State's Counsel], your lawyer." """

"""38
On December 4, Co-Conspirator 1 sent a text message to the Michigan House
Speaker reiterating his unsupported claim of election fraud and attempting to
get the Michigan House Speaker to assist in reversing the ascertainment of the
legitimate Biden electors, stating, "Looks like Georgia may well hold some factual
hearings and change the certification under Artll sec 1 cl 2 of the Constitution. As
[Co-Conspirator 2] explained they don't just have the right to do it but the
obligation.... Help me get this done in Michigan." """

"""39
Similarly, on December 7, despite still having established no fraud in Michigan,
Co-Conspirator 1 sent a text intended for the Michigan Senate Majority Leader: "So I
need you to pass a joint resolution from the Michigan legislature that states that, *
the election is in dispute, * there's an ongoing investigation by the Legislature, and
* the Electors sent by Governor Whitmer are not the official Electors of the State of
Michigan and do not fall within the Safe Harbor deadline of Dec 8 under Michigan
law."""

"""50
That same day, in response to the court decision that had prompted the Wisconsin
Governor to sign a certificate of final determination, the Defendant issued a Tweet
repeating his knowingly false claim of election fraud and demanding that the Wisconsin
legislature overturn the election results that had led to the ascertainment of Biden's
electors as the legitimate electors."""

"""54 """

"""56 _FRAUDULENT ELECTOR INSTRUCTIONS"""

"""74
That afternoon, the Defendant called the Acting Attorney General and Acting Deputy Attorney General and said, among other things,
"People tell me [Co-Conspirator 4] is great. I should put him in." The Defendant also raised multiple false claims of election
fraud, which the Acting Attorney General and Acting Deputy Attorney General refuted. When the Acting Attorney General told the
Defendant that the Justice Department could not and would not change the outcome of the election, the Defendant responded, "Just
say that the election was corrupt and leave the rest to me and the Republican congressmen." """

"""78
On January 2, 2021, just four days before Congress's certification proceeding, Co-Conspirator 4 tried to coerce
the Acting Attorney General and Acting Deputy Attorney General to sign and send Co-Conspirator 4's draft letter,
which contained false statements, to state officials. He told them that the Defendant was considering making
Co-Conspirator 4 the new Acting Attorney General, but that Co-Conspirator 4 would decline the Defendant's
offer if the Acting Attorney General and Acting Deputy Attorney General would agree to send the proposed letter
to the targeted states. The Justice Department officials refused."""

"""90 _"STOP THE STEAL" PROTESTOR INSTRUCTIONS"""

"""93 _"VP ELECTOR REJECTION INSTRUCTIONS"""

"""119
On the evening of January 6, the Defendant and Co-Conspirator 1 attempted to exploit the violence and chaos at the Capitol by
calling lawmakers to convince them, based on knowingly false claims of election fraud, to delay the certification [...]"""

"""122
At 11:44 p.m., Co-Conspirator 2 emailed the Vice President's Counsel advocating that the Vice President violate the law and seek
further delay of the certification. Co-Conspirator 2 wrote, "I implore you to consider one more relatively minor violation [of the ECA]
and adjourn for 10 days to allow the legislatures to finish their investigations, as well as to allow a full forensic audit of the massive
amount of illegal activity that has occurred here." """
]

EVENT = [ # matrix represents each event with one column of data
# row 1: set of indictment paragraph numbers
# row 2: set of co-conspirators
# row 3: set of geographic regions
# row 4: horizontal offset in ms (to avoid overcrowding near 06 Jan)
# row 5: vertical offset in geo regions
# row 6: horizontal offset of text in ms
# row 7: font size
[1,3], # event 1
[7],
[7],
[0],
[0],
[0],
[9],

[15], # event 2
[1,7],
[1,7],
[0],
[0],
[43200000],
[8],

[18], # event 3
[2],
[1],
[175120000],
[0],
[110000000],
[8],

[20], # event 4
[3,3,7],
[2,5,7],
[0],
[0],
[0],
[8],

[21], # event 5
[2],
[2],
[0],
[2],
[30000000],
[8],

[30], # event 6
[2,7],
[2,7],
[-220000000], # 2 days of ms
[0],
[-70000000],
[8],

[31], # event 7
[7],
[7],
[-170000000],
[0],
[0],
[8],

[38], # event 8
[1],
[3],
[0],
[0],
[-60000000],
[8],

[39], # event 9
[1],
[3],
[60000000],
[0],
[90000000],
[8],

[50], # event 10
[7],
[6],
[0],
[-1],
[0],
[8],

[54], # event 11
[5,5,5,5,5,5],
[1,2,3,4,5,6],
[0],
[0],
[0],
[8],

[56], # event 12
[7],
[7],
[0],
[0],
[0],
[8],

[74], # event 13
[7],
[7],
[-770000000],
[0],
[0],
[8],

[78], # event 14
[4,7],
[1,7],
[-790000000],
[0],
[10000000],
[8],

[90], # event 15
[7,7,7,7,7,7,7],
[1,2,3,4,5,6,7],
[-79000000],
[0],
[0],
[8],

[93], # event 16
[2,2,2,2,2,2,7],
[1,2,3,4,5,6,7],
[0],
[0],
[0],
[8],

[119], # event 17
[7],
[7],
[350000000],
[0],
[0],
[8],

[122], # event 18
[2],
[7],
[550000000],
[0],
[0],
[8],
]
EVENT = reshape(EVENT,(7,:))

# initialize figure
fig = Figure(resolution = (1600, 900))
ax = Axis(fig[1,1],
limits = (-xmaxPlot,xmaxPlot, -1.8,ymaxPlot),
title = "Case l:23-cr-00257-TSC: " *
"United States of America " *
"v. Donald J. Trump, Defendant ",
titlesize = 30)
hidedecorations!(ax)
hidespines!(ax)

# describe co-conspirators
text!(-15, yConspirator,
text = """Co-Conspirator 1, an attorney who
was willing to spread knowingly
false claims and pursue strategies
that the Defendant's 2020 re-election
campaign attorneys would not.""",
fontsize = fsSmall,
align = (:left,:top),
color = :gray)
text!(-10, yConspirator,
text = """Co-Conspirator 2, an attorney who
devised and attempted to implement
a strategy to leverage the Vice
President's ceremonial certification
proceeding to obstruct the
certification of the presidential
election.""",
fontsize = fsSmall,
align = (:left,:top),
color = :gray)
text!(-5, yConspirator,
text = """Co-Conspirator 3, an attorney
whose unfounded claims of election
fraud the Defendant privately
acknowledged to others sounded
"crazy." Nonetheless, the Defendant
embraced and publicly amplified
Co-Conspirator 3's disinformation.""",
fontsize = fsSmall,
align = (:left,:top),
color = :gray)
text!(0, yConspirator,
text = """Co-Conspirator 4, a Justice
Department official who worked on
civil matters and who, with the
Defendant, attempted to use the
Justice Department to open sham
election crime investigations and
influence state legislatures with
knowingly false claims of election
fraud.""",
fontsize = fsSmall,
align = (:left,:top),
color = :gray)
text!(5, yConspirator,
text = """Co-Conspirator 5, an attorney who
assisted in devising and attempting
to implement a plan to submit
fraudulent slates of presidential
electors to obstruct the certification
proceeding.""",
fontsize = fsSmall,
align = (:left,:top),
color = :gray)
text!(10, yConspirator,
text = """Co-Conspirator 6, a political
consultant who helped implement
a plan to submit fraudulent slates
of presidential electors to obstruct
the certification proceeding.""",
fontsize = fsSmall,
align = (:left,:top),
color = :gray)

# plot conspirator marker definitions
MARKX = [-15,-8.75,-5,1,6.725,13.8] .+ 0.2
MARKY = [0, -.125, -.265, -.365, 0, .125] .- 0.82
scatter!(MARKX, MARKY,
marker = CMark[1:6],
markersize = 30,
strokewidth = 3,
strokecolor = :black,
color = :white)

# describe Julia
strJulia = "This diagram was generated by Julia and GLMakie " *
"on a laptop computer in 0.5 seconds by running the code in the " *
"appendix of the essay 'A Categorical Speaking Indictment' at\n" *
"https://olarth.medium.com/a-categorical-speaking-indictment-ed7159a4aa90 based " *
"upon the text of the indictment at " *
"https://www.justice.gov/storage/US_v_Trump_23_cr_257.pdf\n" *

"Julia was designed from the beginning for high performance. Julia " *
"programs compile to efficient native code for multiple platforms " *
"via LLVM.\n" *

"Julia is an open source project with over 1,000 contributors. It is " *
"made available under the MIT license. The source code is available " *
"on GitHub.\n\n"
text!(-15, -1.3,
text = strJulia,
fontsize = 14,
align = (:left,:top),
color = :gray)

# label timeline
text!(xt0, yTimeline,
text = "03 Nov 2020",
fontsize = 17,
align = (:left,:top),
color = :black)

# plot timing of indictment count paragraphs
Y = [0.15, 0.15]
xwday = (xt2 - xt0) / (dt2 - dt0).value
nCount1 = length(COUNT1)
for iCount1 = 2:nCount1
dt = Date(PDF[COUNT1[iCount1]][1:10])
x = xt0 + (dt - dt0)/rangeDate*rangext
lines!([x-xwday/2,x+xwday/2],Y,
linewidth = PDF[COUNT1[iCount1]][12] == '0' ? 1 : 5,
color = C[1])
end
nCount234 = length(COUNT234)
for iCount234 = 1:nCount234
dt = Date(PDF[COUNT234[iCount234]][1:10])
x = xt0 + (dt - dt0)/rangeDate*rangext
X = [x-xwday/2,x+xwday/2]
lw = PDF[COUNT234[iCount234]][12] == '0' ? 1 : 5
lines!(X,Y.-0.04, linewidth = lw, color = C[2])
lines!(X,Y.-0.08, linewidth = lw, color = C[3])
lines!(X,Y.-0.12, linewidth = lw, color = C[4])
end

# plot timing of alleged efforts
nEffort = length(EFFORT)
for iEffort = 1:nEffort
dtmin = Date(PDF[EFFORT[iEffort][1]][1:10])
xmin = xt0 + (dtmin - dt0)/rangeDate*rangext
dtmax = Date(PDF[EFFORT[iEffort][end-1]][1:10])
xmax = xt0 + (dtmax - dt0)/rangeDate*rangext
ymin = yConspirator + iEffort*0.01
ymax = 0.01 - iEffort*0.01
lines!(
[xmin, xmax, xmax, xmin, xmin],
[ymin, ymin, ymax, ymax, ymin],
color = C[iEffort+1])
end

# plot legend for COUNT* and EFFORT
xleft = 7.4
xmid = 10.5
xright = 12.5
ytop = -0.82
ybot = -1.8
marginLegend = 0.1
fs = 10
strPara = "¶"
lines!( # bounding box
[xleft, xleft, xt2], [ybot, ytop, ytop],
color = :black)
text!( # left column text
xleft+marginLegend,
ytop,
text =
"""COUNTS
1. conspiracy to defraud
the United States
2. conspiracy to obstruct
an official proceeding
3. obstruction of and attempt to
obstruct an official proceeding
4. conspiracy against rights
EFFORTS
1. fraudulent electoral voters
2. VP electoral vote rejection
3. targeted state DOJ guidance""",
align = (:left, :top),
fontsize = fs,
color = :gray)
text!( # middle column text
xmid, ytop,
text = "LISTED " * strPara,
align = (:left, :top),
fontsize = fs,
color = :gray)
text!( # right column text
xright, ytop,
text = "INSTRUCTIVE " * strPara,
align = (:left, :top),
fontsize = fs,
color = :gray)
yoff = 0.13
dy = 0.163
Y = [ytop-yoff, ytop-yoff]
for iLine = 1:4
lines!( # narrow lines
[xmid, xright], Y,
linewidth = 1,
color = C[iLine])
lines!( # thick lines
[xright, xt2-marginLegend], Y,
linewidth = 5,
color = C[iLine])
Y .-= dy
end
yoff = 0.8
dy = 0.08
hy = 0.05
X = [xmid, xt2-marginLegend, xt2-marginLegend, xmid, xmid]
Y = [ytop-yoff, ytop-yoff, ytop-yoff+hy, ytop-yoff+hy, ytop-yoff]
for iBox = 1:3
lines!( # boxes
X, Y,
linewidth = 1,
color = C[iBox+1])
Y .-= dy
end

# label geographic regions
xRegion = 14.8
xtickRegion = 0.5
ymaxRegion = 4
delRegion = (ymaxRegion - yTimeline) / 7
REGIONX = xRegion * ones(7)
REGIONY = LinRange(ymaxRegion,yTimeline+delRegion,7) .- delRegion/2
text!(REGIONX, REGIONY,
text = REGION,
align = (:center, :center),
fontsize = 20,
color = :black)
X = [(REGIONX.-xtickRegion/2)'; (REGIONX.+xtickRegion/2)'; NaN*ones(1,7)][:]
Y = [(REGIONY.+delRegion/2)'; (REGIONY.+delRegion/2)'; NaN*ones(1,7)][:]
lines!(ax, X, Y,
color = :black)

# plot events
nEvent = size(EVENT,2)
for iEvent = 1:nEvent

# plot symbol(s)
Y = REGIONY[EVENT[3,iEvent]]
iSpace = findfirst(' ', EVENTSTR[iEvent])
iParagraph = parse(Int,EVENTSTR[iEvent][1:iSpace-1])
dt = Date(PDF[iParagraph][1:10],df)
xoff = EVENT[4,iEvent]
x = xt0 + (Millisecond(dt - dt0) +
Millisecond(EVENT[4,iEvent][1])) /
Millisecond(rangeDate) * rangext
X = x * ones(length(Y))
scatter!(X, Y,
marker = CMark[EVENT[2,iEvent]],
markersize = szEventMarker,
strokewidth = 3,
strokecolor = iEvent == 1 ? :darkgreen : :black,
color = :white)

# plot indictment paragraph number inside symbol
S = String[]
push!(S,strPara * string(EVENT[1,iEvent][1]))
nP = length(EVENT[1,iEvent])
for iP = 2:nP
push!(S,"," * string(EVENT[1,iEvent][iP]))
end
str = string(S...)
nSymbol = length(EVENT[2,iEvent])
for iSymbol = 1:nSymbol
text!(X[iSymbol], Y[iSymbol],
text = str,
fontsize = 12,
align = (:center, :center),
color = iEvent == 1 ? :darkgreen : :black)
end

# write event description
x = X[1]
if EVENTSTR[iEvent][iSpace+1] == '_' # full column instruction
y = (yTimeline + ymaxPlot) / 2
text!(x, y,
text = EVENTSTR[iEvent][iSpace+2:end],
fontsize = 20,
rotation = -pi/2,
align = (:center, :center),
color = RGBAf(1,0,0,0.7))

else # not full column instruction
y = ymaxPlot
maxgap = EVENT[3,iEvent][1] - 1
nGeo = length(EVENT[3,iEvent])
for iGeo = 2:nGeo
gap = EVENT[3,iEvent][iGeo] - EVENT[3,iEvent][iGeo-1]
if maxgap < gap
maxgap = gap
y = REGIONY[EVENT[3,iEvent][iGeo-1]] - delRegion/2
end
end
gap = 7 - EVENT[3,iEvent][nGeo]
if maxgap < gap
iReg = EVENT[3,iEvent][nGeo]
y = REGIONY[iReg] - delRegion/2
end
y += EVENT[5,iEvent][1] * delRegion
xtoff = Millisecond(EVENT[6,iEvent][1]) /
Millisecond(rangeDate) * rangext
text!(x+xtoff, y,
text = EVENTSTR[iEvent][iSpace+1:end],
fontsize = EVENT[7,iEvent][1],
rotation = -pi/2,
align = (:left, :center),
color = iEvent == 1 ? :darkgreen : :gray)
end # else not full column instruction
end

# plot event marker horizontal shift arrows
c = RGBAf(0,1,0,0.15)
for iEvent = 2:nEvent
iP = EVENT[1,iEvent][1] # paragraph number
if iP in [30,74,78,119,122]
dt = Date(PDF[iP][1:10],df)
x0 = xt0 + (Millisecond(dt - dt0) +
Millisecond(EVENT[4,iEvent][1])) /
Millisecond(rangeDate) * rangext
x2 = xt0 + Millisecond(dt - dt0) /
Millisecond(rangeDate) * rangext
nCC = length(EVENT[2,iEvent])
X = fill(x0,nCC)
U = fill(x2,nCC) - X
Y = REGIONY[EVENT[3,iEvent]]
V = zeros(nCC)
arrows!(X,Y,U,V,
arrowsize = 50,
linewidth = 15,
lengthscale = ls,
color = c)
end
end

# else diagram is zoomed into 3 sustained efforts
else
# initialize diagram data
yTimeline = -1.65
xt0 = -14.75
xt2 = 14.75
rangext = xt2 - xt0
m0 = (0.9*ymaxPlot - yTimeline)/(2*rangext)
strDate0 = "2020-11-18"
strDate2 = "2021-01-20"
dt0 = Date(strDate0,df)
dt2 = Date(strDate2,df)
rangeDate = dt2 - dt0
fsize = 20
EL = [ # Effort Label
"fraudulent\nelectoral voters",
"VP electoral\nvote rejection",
"targeted state\nDOJ guidance"]

# initialize figure
fig = Figure(resolution = (1600, 900))
ax = Axis(fig[1,1],
limits = (-xmaxPlot,xmaxPlot, -2,ymaxPlot),
title = "major sustained efforts alleged in " *
"United States of America " *
"v. Donald J. Trump, Defendant ",
titlesize = 30)
hidedecorations!(ax)
hidespines!(ax)

# plot inauguration label
dt = Date("2021-01-20")
x2 = xt0 + rangext *
Millisecond(dt - dt0) /
Millisecond(rangeDate)
y2 = (yTimeline + ymaxPlot)/2
text!(x2, y2,
text = "2021 Presidential\nInauguration",
fontsize = 28,
align = (:center, :center),
rotation = -pi/2,
color = :black)

# plot paragraph numbers of each sustained effort
chPara = '¶'
S = String[]
nEffort = length(EFFORT)
for iEffort = 1:nEffort
# slope and intercept of composition line
m = (-1 + (iEffort - 1) * 1.5) * m0
b = (yTimeline + ymaxPlot)/2 - m*xt2

# first paragraph in effort's list
iPara = 1
iP = EFFORT[iEffort][iPara]
dtPrev = Date(PDF[iP][1:10])
xPrev = xt0 + rangext *
Millisecond(dtPrev - dt0) /
Millisecond(rangeDate)
yPrev = m*xPrev + b
empty!(S)
push!(S, @sprintf("%c%d", chPara,iP))

# remaining paragraphs in effort's list
nPara = length(EFFORT[iEffort])-1 # -1: data sentinel
while iPara <= nPara

# while same day
iPara += 1
iP = EFFORT[iEffort][iPara]
dt = Date(PDF[iP][1:10])
while dt == dtPrev
push!(S, @sprintf(",%d", iP))
iPara += 1
iP = EFFORT[iEffort][iPara]
dt = Date(PDF[iP][1:10])
end

# write paragraph number(s)
text!(xPrev, yPrev,
text = string(S...),
fontsize = fsize,
align = (:center, :center),
rotation = -pi/2,
color = :black)
empty!(S)
push!(S, @sprintf("%c%d", chPara,iP))

# plot arrow if enough space
x = xt0 + rangext *
Millisecond(dt - dt0) /
Millisecond(rangeDate)
y = m*x + b
if (iPara <= nPara) &&
(dt-dtPrev > Day(1))
arrows!([xPrev],[yPrev],
[x-xPrev],[y-yPrev],
arrowsize = 15,
linewidth = 1,
lengthscale = ls,
color = :lightgray)
end

# prepare for next paragraph(s)
dtPrev = dt
xPrev = x
yPrev = y
end # for remaining paragraphs in effort

# plot rightmost arrows to inauguration day
iP = EFFORT[iEffort][end-1]
dt = Date(PDF[iP][1:10])
x = xt0 + rangext *
Millisecond(dt - dt0) /
Millisecond(rangeDate)
y = m*x + b
arrows!([x],[y],
[x2-x],[y2-y],
arrowsize = 15,
linewidth = 1,
linestyle = :dashdot,
lengthscale = ls,
color = RGBAf(1,0,0,0.5))
angle = atan(0.5*(y2-y)/(ymaxPlot-yTimeline),
(x2-x)/(xt2-xt0))
text!((x+x2)/2, (y+y2)/2,
text = EL[iEffort],
fontsize = fsize,
align = (:center, :center),
rotation = angle,
color = :black)

# plot rectangle timing of alleged efforts
dtmin = Date(PDF[EFFORT[iEffort][1]][1:10])
xmin = xt0 + (dtmin - dt0)/rangeDate*rangext
dtmax = Date(PDF[EFFORT[iEffort][end-1]][1:10])
xmax = xt0 + (dtmax - dt0)/rangeDate*rangext
ymin = -1.99 + iEffort*0.01
ymax = -1.80 - iEffort*0.01
lines!(
[xmin, xmax, xmax, xmin, xmin],
[ymin, ymin, ymax, ymax, ymin],
color = C[iEffort+1])

end # for each effort
end # else zoomed into sustained efforts

# plot timeline
XYUVT = [xt0 yTimeline 2*xmaxPlot-(xmaxPlot+xt0) 0]
arrows!(
XYUVT[:,1],
XYUVT[:,2],
XYUVT[:,3],
XYUVT[:,4],
arrowsize = 25,
lengthscale = 0.98,
color = :black)
text!(14.5, yTimeline,
text = "time",
fontsize = 17,
align = (:right,:top),
color = :black)

# plot timeline hairlines
dt = Date("2020-12",df)
x = xt0 + (dt - dt0)/rangeDate*rangext
lines!([x, x], [yTimeline, 4],
linestyle = :dot,
color = :black)
text!(x, yTimeline,
text = "Dec 2020",
fontsize = 17,
align = (:center,:top),
color = :black)

dt = Date("2021-01",df)
x = xt0 + (dt - dt0)/rangeDate*rangext
lines!([x, x], [yTimeline, 4],
linestyle = :dot,
color = :black)
text!(x, yTimeline,
text = "Jan 2021",
fontsize = 17,
align = (:center,:top),
color = :black)

# save and show plotted figure
save(isZoom == 0 ?
"indictment.png" : "effort.png",
fig)
fig
end # indictment()

--

--

Greg Sepesi

software engineer pondering basic stuff like how to read