epstein-files 1.0.16__py3-none-any.whl → 1.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,6 @@
1
+ import json
1
2
  import re
3
+ from abc import ABC
2
4
  from dataclasses import dataclass, field
3
5
 
4
6
  from rich.highlighter import RegexHighlighter
@@ -7,10 +9,11 @@ from rich.text import Text
7
9
  from epstein_files.util.constant.names import *
8
10
  from epstein_files.util.constant.strings import *
9
11
  from epstein_files.util.constant.urls import ARCHIVE_LINK_COLOR
10
- from epstein_files.util.constants import (EMAILER_ID_REGEXES, EPSTEIN_V_ROTHSTEIN_EDWARDS, HEADER_ABBREVIATIONS,
12
+ from epstein_files.util.constants import (EMAILER_ID_REGEXES, EPSTEIN_V_ROTHSTEIN_EDWARDS,
11
13
  OSBORNE_LLP, REPLY_REGEX, SENT_FROM_REGEX, VIRGIN_ISLANDS)
12
14
  from epstein_files.util.doc_cfg import *
13
- from epstein_files.util.data import extract_last_name, listify, without_falsey
15
+ from epstein_files.util.data import extract_last_name, without_falsey
16
+ from epstein_files.util.logging import logger
14
17
 
15
18
  CIVIL_ATTORNEY = 'civil attorney'
16
19
  CRIMINAL_DEFENSE_ATTORNEY = 'criminal defense attorney'
@@ -19,6 +22,7 @@ EPSTEIN_LAWYER = 'Epstein lawyer'
19
22
  EPSTEIN_V_ROTHSTEIN_EDWARDS_ATTORNEY = f"{CIVIL_ATTORNEY} working on {EPSTEIN_V_ROTHSTEIN_EDWARDS}"
20
23
  ESTATE_EXECUTOR = 'estate executor'
21
24
  EPSTEIN_ESTATE_EXECUTOR = f"Epstein {ESTATE_EXECUTOR}"
25
+ QUESTION_MARKS_TXT = Text(QUESTION_MARKS, style='dim')
22
26
  REGEX_STYLE_PREFIX = 'regex'
23
27
  SIMPLE_NAME_REGEX = re.compile(r"^[-\w ]+$", re.IGNORECASE)
24
28
 
@@ -40,9 +44,9 @@ CATEGORY_STYLES = {
40
44
 
41
45
 
42
46
  @dataclass(kw_only=True)
43
- class HighlightedText:
47
+ class BaseHighlight:
44
48
  """
45
- Color highlighting for things other than people's names (e.g. phone numbers, email headers).
49
+ Regex and style information.
46
50
 
47
51
  Attributes:
48
52
  label (str): RegexHighlighter match group name, defaults to 1st 'emailers' key if only 1 emailer provided
@@ -52,24 +56,47 @@ class HighlightedText:
52
56
  theme_style_name (str): The style name that must be a part of the rich.Console's theme
53
57
  """
54
58
  label: str = ''
55
- pattern: str = ''
56
- style: str
57
59
  regex: re.Pattern = field(init=False)
60
+ style: str
58
61
  theme_style_name: str = field(init=False)
59
62
  _capture_group_label: str = field(init=False)
60
63
  _match_group_var: str = field(init=False)
61
64
 
62
65
  def __post_init__(self):
63
66
  if not self.label:
64
- raise ValueError(f"No label provided for {repr(self)}")
67
+ raise ValueError(f'Missing label for {self}')
65
68
 
66
69
  self._capture_group_label = self.label.lower().replace(' ', '_').replace('-', '_')
67
70
  self._match_group_var = fr"?P<{self._capture_group_label}>"
68
71
  self.theme_style_name = f"{REGEX_STYLE_PREFIX}.{self._capture_group_label}"
69
- self.regex = re.compile(fr"({self._match_group_var}{self.pattern})", re.IGNORECASE | re.MULTILINE)
70
72
 
71
- def __str__(self) -> str:
72
- return f"{type(self).__name__}(label='{self.label}')"
73
+
74
+ @dataclass(kw_only=True)
75
+ class HighlightedText(BaseHighlight):
76
+ """
77
+ Color highlighting for things other than people's names (e.g. phone numbers, email headers).
78
+
79
+ Attributes:
80
+ label (str): RegexHighlighter match group name, defaults to 1st 'emailers' key if only 1 emailer provided
81
+ patterns (list[str]): regex patterns identifying strings matching this group
82
+ regex (re.Pattern): matches self.pattern
83
+ style (str): Rich style to apply to text matching this group
84
+ theme_style_name (str): The style name that must be a part of the rich.Console's theme
85
+ """
86
+ patterns: list[str] = field(default_factory=list)
87
+ _pattern: str = field(init=False)
88
+
89
+ def __post_init__(self):
90
+ super().__post_init__()
91
+
92
+ if not self.label:
93
+ raise ValueError(f"No label provided for {repr(self)}")
94
+
95
+ self._pattern = '|'.join(self.patterns)
96
+ self.regex = re.compile(fr"({self._match_group_var}{self._pattern})", re.IGNORECASE | re.MULTILINE)
97
+
98
+ def __repr__(self) -> str:
99
+ return f"{type(self).__name__}(label='{self.label}', pattern='{self._pattern}', style='{self.style}')"
73
100
 
74
101
 
75
102
  @dataclass(kw_only=True)
@@ -85,10 +112,9 @@ class HighlightedNames(HighlightedText):
85
112
  """
86
113
  category: str = ''
87
114
  emailers: dict[str, str | None] = field(default_factory=dict)
88
- _pattern: str = field(init=False)
89
115
 
90
116
  def __post_init__(self):
91
- if not (self.emailers or self.pattern):
117
+ if not (self.emailers or self.patterns):
92
118
  raise ValueError(f"Must provide either 'emailers' or 'pattern' arg.")
93
119
  elif not self.label:
94
120
  if len(self.emailers) == 1:
@@ -97,13 +123,13 @@ class HighlightedNames(HighlightedText):
97
123
  raise ValueError(f"No label provided for {repr(self)}")
98
124
 
99
125
  super().__post_init__()
100
- self._pattern = '|'.join([self._emailer_pattern(e) for e in self.emailers] + listify(self.pattern))
126
+ self._pattern = '|'.join([self._emailer_pattern(e) for e in self.emailers] + self.patterns)
101
127
  self.regex = re.compile(fr"\b({self._match_group_var}({self._pattern})s?)\b", re.IGNORECASE)
102
128
 
103
129
  def get_info(self, name: str) -> str | None:
104
130
  """Label and additional info for 'name' if 'name' is in self.emailers."""
105
131
  info_pieces = [
106
- None if len(self.emailers) == 1 else (self.category or self.label.replace('_', ' ')),
132
+ self.category or ('' if len(self.emailers) == 1 else self.label.replace('_', ' ')),
107
133
  self.emailers.get(name),
108
134
  ]
109
135
 
@@ -136,87 +162,284 @@ class HighlightedNames(HighlightedText):
136
162
  return '|'.join(name_patterns)
137
163
 
138
164
  def __str__(self) -> str:
139
- return f"{type(self).__name__}(label='{self.label}')"
165
+ return super().__str__()
166
+
167
+ def __repr__(self) -> str:
168
+ s = f"{type(self).__name__}("
169
+
170
+ for property in ['label', 'style', 'category', 'patterns', 'emailers']:
171
+ value = getattr(self, property)
172
+
173
+ if not value or (property == 'label' and len(self.emailers) == 1 and not self.patterns):
174
+ continue
175
+
176
+ s += f"\n {property}="
177
+
178
+ if isinstance(value, dict):
179
+ s += '{'
180
+
181
+ for k, v in value.items():
182
+ s += f"\n {constantize_name(k)}: {json.dumps(v).replace('null', 'None')},"
183
+
184
+ s += '\n },'
185
+ elif property == 'patterns':
186
+ s += '[\n '
187
+ s += repr(value).removeprefix('[').removesuffix(']').replace(', ', ',\n ')
188
+ s += ',\n ],'
189
+ else:
190
+ s += f"{json.dumps(value)},"
191
+
192
+ return s + '\n)'
193
+
194
+
195
+ @dataclass(kw_only=True)
196
+ class ManualHighlight(BaseHighlight):
197
+ """For when you can't construct the regex."""
198
+ pattern: str
199
+
200
+ def __post_init__(self):
201
+ super().__post_init__()
202
+
203
+ if self._match_group_var not in self.pattern:
204
+ raise ValueError(f"Label '{self.label}' must appear in regex pattern '{self.pattern}'")
205
+
206
+ self.regex = re.compile(self.pattern, re.MULTILINE)
140
207
 
141
208
 
142
209
  HIGHLIGHTED_NAMES = [
210
+ # This has to come first to get both stylings applied to the email subjects
211
+ ManualHighlight(
212
+ label='email_subject',
213
+ style='light_yellow3',
214
+ pattern=r"^(> )?Subject: (?P<email_subject>.*)",
215
+ ),
216
+ HighlightedNames(
217
+ label=ACADEMIA,
218
+ style='light_goldenrod2',
219
+ emailers={
220
+ DAVID_HAIG: 'evolutionary geneticist?',
221
+ JOSCHA_BACH: 'cognitive science / AI research',
222
+ 'Daniel Kahneman': 'Nobel economic sciences laureate and cognitivie psychologist (?)',
223
+ 'Ed Boyden': f'Associate Professor, {MIT_MEDIA_LAB} neurobiology',
224
+ LAWRENCE_KRAUSS: 'theoretical physicist',
225
+ LINDA_STONE: f'ex-Microsoft, {MIT_MEDIA_LAB}',
226
+ MARK_TRAMO: 'professor of neurology at UCLA',
227
+ 'Nancy Dahl': 'wife of Lawrence Krauss',
228
+ NEAL_KASSELL: 'professor of neurosurgery at University of Virginia',
229
+ PETER_ATTIA: 'longevity medicine',
230
+ ROBERT_TRIVERS: 'evolutionary biology',
231
+ ROGER_SCHANK: 'Teachers College, Columbia University',
232
+ },
233
+ patterns=[
234
+ r"Alain Forget",
235
+ r"Brotherton",
236
+ r"Carl\s*Sagan",
237
+ r"Columbia",
238
+ r"David Grosof",
239
+ r"J(ames|im)\s*Watson",
240
+ r"(Lord\s*)?Martin\s*Rees",
241
+ r"Massachusetts\s*Institute\s*of\s*Technology",
242
+ r"Media\s*Lab",
243
+ r"Minsky",
244
+ r"MIT(\s*Media\s*Lab)?",
245
+ r"((Noam|Valeria)\s*)?Chomsky",
246
+ r"Norman\s*Finkelstein",
247
+ r"Praluent",
248
+ r"Regeneron",
249
+ r"(Richard\s*)?Dawkins",
250
+ r"Sanofi",
251
+ r"Stanford",
252
+ r"(Stephen\s*)?Hawking",
253
+ r"(Steven?\s*)?Pinker",
254
+ r"UCLA",
255
+ ],
256
+ ),
143
257
  HighlightedNames(
144
258
  label='Africa',
145
259
  style='light_pink4',
146
- pattern=r'Econet(\s*Wireless)|Ghana(ian)?|Johannesburg|Kenya|Nigerian?|Senegal(ese)?|Serengeti|(South\s*)?African?|(Strive\s*)?Masiyiwa|Tanzania|Ugandan?|Zimbabwe(an)?',
147
260
  emailers={
148
- 'Abdoulaye Wade': 'former president of Senegal, father of Karim Wade',
261
+ 'Abdoulaye Wade': "former president of Senegal, father of Karim Wade",
262
+ 'Ivan Glasenberg': "South African former CEO of Glencore, one of the world's largest commodity trading and mining companies",
149
263
  'Karim Wade': 'son of the president of Senegal, facing arrest for corruption, email handle is "Afri zp"',
150
- 'Miles Alexander': 'Operations Manager Michaelhouse Balgowan KwaZulu-Natal South Africa', # TODO: what's up with this person?
264
+ 'Miles Alexander': 'Operations Manager Michaelhouse Balgowan KwaZulu-Natal South Africa',
151
265
  'Macky Sall': 'prime minister of Senegal, defeated Abdoulaye Wade',
152
266
  },
267
+ patterns=[
268
+ r"Buhari",
269
+ r"Econet(\s*Wireless)",
270
+ r"Ghana(ian)?",
271
+ r"Glencore",
272
+ r"Goodluck Jonathan",
273
+ r"Johannesburg",
274
+ r"Kenya",
275
+ r"Nigerian?",
276
+ r"Okey Enelamah",
277
+ r"Senegal(ese)?",
278
+ r"Serengeti",
279
+ r"(South\s*)?African?",
280
+ r"(Strive\s*)?Masiyiwa",
281
+ r"Tanzania",
282
+ r"Ugandan?",
283
+ r"Zimbabwe(an)?",
284
+ ],
153
285
  ),
154
286
  HighlightedNames(
155
287
  label='bitcoin',
156
288
  style='orange1 bold',
157
- pattern=r'Balaji|bitcoin|block ?chain(\s*capital)?|Brock(\s*Pierce)?|coins?|cr[iy]?pto(currenc(y|ies))?|e-currency|(Gavin )?Andressen|(Howard\s+)?Lutnic?k|(jeffrey\s+)?wernick|Libra|Madars|(Patrick\s*)?Murck|(Ross\s*)?Ulbricht|Silk\s*Road|SpanCash|Tether|virtual\s*currenc(ies|y)|(zero\s+knowledge\s+|zk)pro(of|tocols?)',
158
- emailers = {
289
+ emailers={
290
+ 'Jeffrey Wernick': 'former COO of Parler, involved in numerous crypto companies like Bitforex',
159
291
  JEREMY_RUBIN: 'developer/researcher',
292
+ JOI_ITO: f"former head of {MIT_MEDIA_LAB} and MIT Digital Currency Initiative",
160
293
  ANTHONY_SCARAMUCCI: 'Skybridge Capital, FTX investor',
161
294
  },
295
+ patterns=[
296
+ r"Balaji",
297
+ r"bitcoin",
298
+ r"block ?chain(\s*capital)?",
299
+ r"Brock(\s*Pierce)?",
300
+ r"coins?",
301
+ r"cr[iy]?pto(currenc(y|ies))?",
302
+ r"e-currency",
303
+ r"(Gavin )?Andressen",
304
+ r"(Howard\s+)?Lutnic?k",
305
+ r"Libra",
306
+ r"Madars",
307
+ r"(Patrick\s*)?Murck",
308
+ r"(Ross\s*)?Ulbricht",
309
+ r"Silk\s*Road",
310
+ r"SpanCash",
311
+ r"Tether",
312
+ r"virtual\s*currenc(ies|y)",
313
+ r"(zero\s+knowledge\s+|zk)pro(of|tocols?)",
314
+ ],
162
315
  ),
163
316
  HighlightedNames(
164
317
  label=BUSINESS,
165
318
  style='spring_green4',
166
- pattern=r'Gruterite|(John\s*)?Kluge|Marc Rich|(Mi(chael|ke)\s*)?Ovitz|(Steve\s+)?Wynn|(Les(lie)?\s+)?Wexner|New Leaf Ventures|Park Partners|SALSS|Swedish[-\s]*American\s*Life\s*Science\s*Summit|Valhi|(Yves\s*)?Bouvier',
167
- emailers = {
319
+ emailers={
168
320
  ALIREZA_ITTIHADIEH: 'CEO Freestream Aircraft Limited',
169
321
  BARBRO_C_EHNBOM: 'Swedish pharmaceuticals, SALSS',
322
+ 'David Mitchell': 'president of New York real estate development firm Mitchell Holdings',
170
323
  FRED_HADDAD: "co-founder of Heck's in West Virginia",
171
- GERALD_BARTON: "Maryland property developer Landmark Land Company, fan of Trump's Irish golf course",
324
+ GERALD_BARTON: "Maryland property developer Landmark Land Company",
172
325
  GORDON_GETTY: 'heir of oil tycoon J. Paul Getty',
173
326
  NICHOLAS_RIBIS: 'Hilton CEO, former president of Trump Organization',
174
327
  'Philip Kafka': 'president of Prince Concepts (and son of Terry Kafka?)',
175
- ROBERT_LAWRENCE_KUHN: "investment banker, China expert",
328
+ ROBERT_LAWRENCE_KUHN: 'investment banker, China expert',
176
329
  TERRY_KAFKA: 'CEO of Impact Outdoor (highway billboards)',
177
330
  TOM_PRITZKER: 'brother of J.B. Pritzker',
178
- }
331
+ },
332
+ patterns=[
333
+ r"((Bill|David)\s*)?Koch(\s*(Bro(s|thers)|Industries))?",
334
+ r"Gruterite",
335
+ r"(John\s*)?Kluge",
336
+ r"Marc Rich",
337
+ r"(Mi(chael|ke)\s*)?Ovitz",
338
+ r"(Steve\s+)?Wynn",
339
+ r"(Les(lie)?\s+)?Wexner",
340
+ r"New Leaf Ventures",
341
+ r"Park Partners",
342
+ r"SALSS",
343
+ r"Swedish[-\s]*American\s*Life\s*Science\s*Summit",
344
+ r"Valhi",
345
+ r"(Yves\s*)?Bouvier",
346
+ ],
179
347
  ),
180
348
  HighlightedNames(
181
349
  label='cannabis',
182
350
  style='chartreuse2',
183
- pattern=r"CBD|cannabis|marijuana|THC|WEED(guide|maps)?[^s]?",
351
+ patterns=[
352
+ r"CBD",
353
+ r"cannabis",
354
+ r"marijuana",
355
+ r"THC",
356
+ r"WEED(guide|maps)?[^s]?",
357
+ ],
184
358
  ),
185
359
  HighlightedNames(
186
360
  label='China',
187
361
  style='bright_red',
188
- pattern=r"Ali.?baba|Beijing|CCP|Chin(a|e?se)(?! Daily)|DPRK|Global Times|Guo|Hong|Huaw[ae]i|Kim\s*Jong\s*Un|Kong|Jack\s+Ma|Kwok|Ministry\sof\sState\sSecurity|Mongolian?|MSS|North\s*Korea|Peking|PRC|SCMP|Tai(pei|wan)|Xi(aomi)?|Jinping",
189
362
  emailers={
190
363
  'Gino Yu': 'professor / game designer in Hong Kong',
191
- }
364
+ },
365
+ patterns=[
366
+ r"Ali.?baba",
367
+ r"Beijing",
368
+ r"CCP",
369
+ r"Chin(a|e?se)(?! Daily)",
370
+ r"DPRK",
371
+ r"Global Times",
372
+ r"Guo",
373
+ r"Hong",
374
+ r"Huaw[ae]i",
375
+ r"Kim\s*Jong\s*Un",
376
+ r"Kong",
377
+ r"Jack\s+Ma",
378
+ r"Kwok",
379
+ r"Ministry\sof\sState\sSecurity",
380
+ r"Mongolian?",
381
+ r"MSS",
382
+ r"North\s*Korea",
383
+ r"Peking",
384
+ r"PRC",
385
+ r"Pyongyang",
386
+ r"SCMP",
387
+ r"Tai(pei|wan)",
388
+ r"Xi(aomi)?",
389
+ r"Jinping",
390
+ ],
192
391
  ),
193
392
  HighlightedNames(
194
- label='Deepak Chopra',
393
+ label=DEEPAK_CHOPRA,
195
394
  style='dark_sea_green4',
196
- emailers = {
197
- 'Carolyn Rangel': 'assistant',
395
+ emailers={
396
+ CAROLYN_RANGEL: 'assistant',
198
397
  DEEPAK_CHOPRA: 'woo woo',
199
- }
398
+ },
200
399
  ),
201
400
  HighlightedNames(
202
- label='Democrats',
401
+ label='Democrat',
203
402
  style='sky_blue1',
204
- pattern=r'(Al\s*)?Franken|((Bill|Hillart?y)\s*)?Clinton|((Chuck|Charles)\s*)?S(ch|hc)umer|(Diana\s*)?DeGette|DNC|Elena\s*Kagan|(Eliott?\s*)?Spitzer(, Eliot)?|George\s*Mitchell|(George\s*)?Soros|Hill?ary|Dem(ocrat(ic)?)?|(Jo(e|seph)\s*)?Biden|(John\s*)?Kerry|Lisa Monaco|(Matteo\s*)?Salvini|Maxine\s*Waters|(Barac?k )?Obama|(Nancy )?Pelosi|Ron\s*Dellums|Schumer|(Tim\s*)?Geithner|Vernon\s*Jordan',
403
+ patterns=[
404
+ r"(Al\s*)?Franken",
405
+ r"(Barac?k )?Obama",
406
+ r"((Bill|Hillart?y)\s*)?Clinton",
407
+ r"((Chuck|Charles)\s*)?S(ch|hc)umer",
408
+ r"Dem(ocrat(ic)?)?",
409
+ r"(Diana\s*)?DeGette",
410
+ r"DNC",
411
+ r"Elena\s*Kagan",
412
+ r"(Eliott?\s*)?Spitzer(, Eliot)?",
413
+ r"Eric Holder",
414
+ r"George\s*Mitchell",
415
+ r"(George\s*)?Soros",
416
+ r"Hill?ary",
417
+ r"HRC",
418
+ r"(Jo(e|seph)\s*)?Biden",
419
+ r"(John\s*)?Kerry",
420
+ r"Lisa Monaco",
421
+ r"(Matteo\s*)?Salvini",
422
+ r"Maxine\s*Waters",
423
+ r"(Nancy )?Pelosi",
424
+ r"Ron\s*Dellums",
425
+ r"Schumer",
426
+ r"(Tim\s*)?Geithner",
427
+ r"Vernon\s*Jordan",
428
+ ],
205
429
  ),
206
430
  HighlightedNames(
207
431
  label='Dubin family',
208
432
  style='medium_orchid1',
209
- pattern=r'((Celina|Eva( Anderss?on)?|Glenn) )?Dubin',
210
- emailers = {
433
+ emailers={
211
434
  GLENN_DUBIN: "Highbridge Capital Management, married to Epstein's ex-gf Eva",
212
435
  EVA: "possibly Epstein's ex-girlfriend (?)",
213
436
  },
437
+ patterns=[r"((Celina|Eva( Anderss?on)?|Glenn) )?Dubin"],
214
438
  ),
215
439
  HighlightedNames(
216
440
  label='employee',
217
441
  style='deep_sky_blue4',
218
- pattern=r'Merwin',
219
- emailers = {
442
+ emailers={
220
443
  'Alfredo Rodriguez': "Epstein's butler, stole the journal",
221
444
  ERIC_ROTH: 'jet decorator',
222
445
  GWENDOLYN_BECK: 'Epstein fund manager in the 90s',
@@ -227,28 +450,51 @@ HIGHLIGHTED_NAMES = [
227
450
  MERWIN_DELA_CRUZ: None, # HOUSE_OVERSIGHT_032652 Groff says "Jojo and Merwin both requested off Nov. 25 and 26"
228
451
  NADIA_MARCINKO: 'pilot',
229
452
  'Sean J. Lancaster': 'airplane reseller',
230
- }
453
+ },
454
+ patterns=[r"Merwin"],
231
455
  ),
232
456
  HighlightedNames(
233
457
  label=ENTERTAINER,
234
458
  style='light_steel_blue3',
235
- pattern=r'(Art )?Spiegelman|Bobby slayton|bono\s*mick|Errol(\s*Morris)?|Etienne Binant|(Frank\s)?Gehry|Jagger|(Jeffrey\s*)?Katzenberg|(Johnny\s*)?Depp|Kid Rock|Lena\s*Dunham|Madonna|Mark\s*Burnett|Ramsey Elkholy|shirley maclaine|Steven Gaydos?|Woody( Allen)?|Zach Braff',
236
459
  emailers={
237
460
  ANDRES_SERRANO: "'Piss Christ' artist",
238
- 'Barry Josephson': 'American film producer and former music manager, editor FamilySecurityMatters.org',
461
+ 'Barry Josephson': 'American film producer, editor FamilySecurityMatters.org',
239
462
  BILL_SIEGEL: 'documentary film producer and director',
240
463
  DAVID_BLAINE: 'famous magician',
241
464
  HENRY_HOLT: f"{MICHAEL_WOLFF}'s book publisher",
242
465
  'Richard Merkin': 'painter, illustrator and arts educator',
243
466
  STEVEN_PFEIFFER: 'Associate Director at Independent Filmmaker Project (IFP)',
244
467
  },
468
+ patterns=[
469
+ r"(Art )?Spiegelman",
470
+ r"Artspace",
471
+ r"Bobby slayton",
472
+ r"bono\s*mick",
473
+ r"Errol(\s*Morris)?",
474
+ r"Etienne Binant",
475
+ r"(Frank\s)?Gehry",
476
+ r"Jagger",
477
+ r"(Jeffrey\s*)?Katzenberg",
478
+ r"(Johnny\s*)?Depp",
479
+ r"Kid Rock",
480
+ r"(Larry\s*)?Gagosian",
481
+ r"Lena\s*Dunham",
482
+ r"Madonna",
483
+ r"Mark\s*Burnett",
484
+ r"Phaidon",
485
+ r"Ramsey Elkholy",
486
+ r"Regan arts",
487
+ r"shirley maclaine",
488
+ r"Steven Gaydos?",
489
+ r"Woody( Allen)?",
490
+ r"Zach Braff",
491
+ ],
245
492
  ),
246
493
  HighlightedNames(
247
494
  label=EPSTEIN_LAWYER,
248
495
  style='purple',
249
- pattern=r'(Barry (E. )?)?Krischer|Kate Kelly|Kirkland\s*&\s*Ellis|(Leon\s*)?Jaworski|Michael J. Pike|Paul,?\s*Weiss|Steptoe|Wein(berg|garten)',
250
- emailers = {
251
- 'Alan S Halperin': 'parnter at Paul, Weiss',
496
+ emailers={
497
+ 'Alan S Halperin': 'partner at Paul, Weiss',
252
498
  ARDA_BESKARDES: 'NYC immigration attorney allegedly involved in sex-trafficking operations',
253
499
  BENNET_MOSKOWITZ: f'represented the {EPSTEIN_ESTATE_EXECUTOR}s',
254
500
  BRAD_KARP: 'head of the law firm Paul Weiss',
@@ -259,52 +505,119 @@ HIGHLIGHTED_NAMES = [
259
505
  JACK_GOLDBERGER: CRIMINAL_DEFENSE_2008,
260
506
  JACKIE_PERCZEK: CRIMINAL_DEFENSE_2008,
261
507
  JAY_LEFKOWITZ: f"Kirkland & Ellis partner, {CRIMINAL_DEFENSE_2008}",
262
- JESSICA_CADWELL: 'paralegal', # paralegal, see https://x.com/ImDrinknWyn/status/1993765348898927022
508
+ JESSICA_CADWELL: f'paralegal to {ROBERT_D_CRITTON_JR}', # house_oversight_030464
263
509
  LILLY_SANCHEZ: CRIMINAL_DEFENSE_ATTORNEY,
264
510
  MARTIN_WEINBERG: CRIMINAL_DEFENSE_ATTORNEY,
265
511
  MICHAEL_MILLER: 'Steptoe LLP partner',
266
512
  REID_WEINGARTEN: 'Steptoe LLP partner',
267
- ROBERT_D_CRITTON_JR: 'criminal defense attorney',
268
- 'Robert Gold': None,
513
+ ROBERT_D_CRITTON_JR: CRIMINAL_DEFENSE_ATTORNEY,
514
+ 'Robert Gold': 'helped Epstein track down millions belonging to wealthy Spanish families',
269
515
  'Roy Black': CRIMINAL_DEFENSE_2008,
270
- SCOTT_J_LINK: None,
516
+ SCOTT_J_LINK: CRIMINAL_DEFENSE_ATTORNEY,
271
517
  TONJA_HADDAD_COLEMAN: f'{EPSTEIN_V_ROTHSTEIN_EDWARDS_ATTORNEY}, maybe daughter of Fred Haddad?',
272
- }
518
+ },
519
+ patterns=[
520
+ r"(Barry (E. )?)?Krischer",
521
+ r"Kate Kelly",
522
+ r"Kirkland\s*&\s*Ellis",
523
+ r"(Leon\s*)?Jaworski",
524
+ r"Michael J. Pike",
525
+ r"Paul,?\s*Weiss",
526
+ r"Steptoe(\s*LLP)?",
527
+ r"Wein(berg|garten)",
528
+ ],
273
529
  ),
274
530
  HighlightedNames(
275
531
  label=ESTATE_EXECUTOR,
276
532
  style='purple3 bold',
277
- category='Epstein lawyer',
278
- emailers = {
533
+ category=EPSTEIN_LAWYER,
534
+ emailers={
279
535
  DARREN_INDYKE: EPSTEIN_ESTATE_EXECUTOR,
280
536
  RICHARD_KAHN: EPSTEIN_ESTATE_EXECUTOR,
281
- }
537
+ },
282
538
  ),
283
539
  HighlightedNames(
284
- label='europe',
540
+ label='Europe',
285
541
  style='light_sky_blue3',
286
- pattern=r'(Angela )?Merk(el|le)|Austria|(Benjamin\s*)?Harnwell|Berlin|Borge|Boris\s*Johnson|Brexit(eers?)?|Brit(ain|ish)|Brussels|Cannes|(Caroline|Jack)?\s*Lang(, Caroline)?|Cypr(iot|us)|Davos|ECB|England|EU|Europe(an)?(\s*Union)?|Fr(ance|ench)|Geneva|Germany?|Gillard|Gree(ce|k)|Ital(ian|y)|Jacques|(Kevin\s*)?Rudd|Le\s*Pen|London|Macron|Melusine|Munich|(Natalia\s*)?Veselnitskaya|(Nicholas\s*)?Sarkozy|Nigel(\s*Farage)?|Norw(ay|egian)|Oslo|Paris|Polish|pope|(Sebastian )?Kurz|(Vi(c|k)tor\s+)?Orbah?n|Edward Rod Larsen|Strasbourg|Strauss[- ]?Kahn|Swed(en|ish)(?![-\s]+America)|Switzerland|(Tony\s)?Blair|U\.?K\.?|Ukrain(e|ian)|Vienna|(Vitaly\s*)?Churkin|Zug',
287
- emailers = {
542
+ emailers={
288
543
  ANDRZEJ_DUDA: 'former president of Poland',
289
544
  MIROSLAV_LAJCAK: 'Russia-friendly Slovakian politician, friend of Steve Bannon',
290
545
  PETER_MANDELSON: 'UK politics',
291
546
  TERJE_ROD_LARSEN: 'Norwegian diplomat',
292
547
  THORBJORN_JAGLAND: 'former prime minister of Norway and head of the Nobel Peace Prize Committee',
293
- }
548
+ },
549
+ patterns=[
550
+ r"(Angela )?Merk(el|le)",
551
+ r"Austria",
552
+ r"(Benjamin\s*)?Harnwell",
553
+ r"Berlin",
554
+ r"Borge",
555
+ r"Boris\s*Johnson",
556
+ r"Brexit(eers?)?",
557
+ r"Brit(ain|ish)",
558
+ r"Brussels",
559
+ r"Cannes",
560
+ r"(Caroline|Jack)?\s*Lang(, Caroline)?",
561
+ r"Cypr(iot|us)",
562
+ r"Davos",
563
+ r"ECB",
564
+ r"England",
565
+ r"EU",
566
+ r"Europe(an)?(\s*Union)?",
567
+ r"Fr(ance|ench)",
568
+ r"Geneva",
569
+ r"Germany?",
570
+ r"Gillard",
571
+ r"Gree(ce|k)",
572
+ r"Ital(ian|y)",
573
+ r"Jacques",
574
+ r"Kiev",
575
+ r"Le\s*Pen",
576
+ r"London",
577
+ r"Macron",
578
+ r"Melusine",
579
+ r"MI\s*5",
580
+ r"Munich",
581
+ r"NATO",
582
+ r"(Nicholas\s*)?Sarkozy",
583
+ r"Nigel(\s*Farage)?",
584
+ r"Norw(ay|egian)",
585
+ r"Oslo",
586
+ r"Paris",
587
+ r"Polish",
588
+ r"pope",
589
+ r"(Sebastian )?Kurz",
590
+ r"(Vi(c|k)tor\s+)?Orbah?n",
591
+ r"Edward Rod Larsen",
592
+ r"Strasbourg",
593
+ r"Strauss[- ]?Kahn",
594
+ r"Swed(en|ish)(?![-\s]+American Life Scienc)",
595
+ r"Switzerland",
596
+ r"(Tony\s)?Blair",
597
+ r"U\.K\.",
598
+ r"Ukrain(e|ian)",
599
+ r"Vienna",
600
+ r"Zug",
601
+ ],
294
602
  ),
295
603
  HighlightedNames(
296
604
  label='famous lawyer',
297
605
  style='medium_purple3',
298
- pattern=r'(David\s*)?Bo[il]es|dersh|(Gloria\s*)?Allred|(Mi(chael|ke)\s*)?Avenatti',
299
- emailers = {
606
+ emailers={
300
607
  ALAN_DERSHOWITZ: 'Harvard Law School professor and all around (in)famous American lawyer',
608
+ 'Fabrice Aidan': f'diplomat who worked with {TERJE_ROD_LARSEN}',
301
609
  KEN_STARR: 'head of the Monica Lewinsky investigation against Bill Clinton',
302
- }
610
+ },
611
+ patterns=[
612
+ r"(David\s*)?Bo[il]es",
613
+ r"dersh",
614
+ r"(Gloria\s*)?Allred",
615
+ r"(Mi(chael|ke)\s*)?Avenatti",
616
+ ],
303
617
  ),
304
618
  HighlightedNames(
305
619
  label=FINANCE,
306
620
  style='green',
307
- pattern=r'Apollo|Ari\s*Glass|Bank|(Bernie\s*)?Madoff|Black(rock|stone)|B\s*of\s*A|Boothbay(\sFund\sManagement)?|Chase\s*Bank|Credit\s*Suisse|DB|Deutsche?\s*(Asset|Bank)|Electron\s*Capital\s*(Partners)?|Fenner|FRBNY|Goldman(\s*Sachs)|HSBC|Invesco|(Janet\s*)?Yellen|(Jerome\s*)?Powell(?!M\. Cabot)|(Jimmy\s*)?Cayne|JPMC?|j\.?p\.?\s*morgan(\.?com|\s*Chase)?|Madoff|Merrill(\s*Lynch)?|(Michael\s*)?(Cembalest|Milken)|Mizrahi\s*Bank|MLPF&S|((anti.?)?money\s+)?launder(s?|ers?|ing)?(\s+money)?|Morgan Stanley|(Peter L. )?Scher|(Ray\s*)?Dalio|(Richard\s*)?LeFrak|Schwartz?man|Serageldin|UBS|us.gio@jpmorgan.com',
308
621
  emailers={
309
622
  AMANDA_ENS: 'Citigroup',
310
623
  BRAD_WECHSLER: f"head of {LEON_BLACK}'s personal investment vehicle according to FT",
@@ -315,101 +628,322 @@ HIGHLIGHTED_NAMES = [
315
628
  'Laurie Cameron': 'currency trading',
316
629
  LEON_BLACK: 'Apollo CEO',
317
630
  MARC_LEON: 'Luxury Properties Sari Morrocco',
318
- MELANIE_SPINELLA: f'representative of {LEON_BLACK}',
319
- MORTIMER_ZUCKERMAN: 'business partner of Epstein',
631
+ MELANIE_SPINELLA: 'representative of Leon Black',
632
+ MORTIMER_ZUCKERMAN: 'business partner of Epstein, newspaper publisher',
320
633
  PAUL_BARRETT: None,
321
634
  PAUL_MORRIS: DEUTSCHE_BANK,
635
+ 'Skip Rimer': 'Milken Institute (Michael Milken)',
322
636
  'Steven Elkman': DEUTSCHE_BANK,
323
- }
637
+ },
638
+ patterns=[
639
+ r"((anti.?)?money\s+)?launder(s?|ers?|ing)?(\s+money)?",
640
+ r"Apollo",
641
+ r"Ari\s*Glass",
642
+ r"Bank(\s*of\s*Scotland)",
643
+ r"(Bernie\s*)?Madoff",
644
+ r"Black(rock|stone)",
645
+ r"B\s*of\s*A",
646
+ r"Boothbay(\sFund\sManagement)?",
647
+ r"Chase\s*Bank",
648
+ r"Credit\s*Suisse",
649
+ r"DB",
650
+ r"Deutsche?\s*(Asset|Bank)",
651
+ r"Electron\s*Capital\s*(Partners)?",
652
+ r"Fenner",
653
+ r"FRBNY",
654
+ r"Goldman(\s*Sachs)",
655
+ r"GRAT",
656
+ r"HSBC",
657
+ r"Invesco",
658
+ r"(Janet\s*)?Yellen",
659
+ r"(Jerome\s*)?Powell(?!M\. Cabot)",
660
+ r"(Jimmy\s*)?Cayne",
661
+ r"JPMC?",
662
+ r"j\.?p\.?\s*morgan(\.?com|\s*Chase)?",
663
+ r"Madoff",
664
+ r"Merrill(\s*Lynch)?",
665
+ r"(Michael\s*)?(Cembalest|Milken)",
666
+ r"Mizrahi\s*Bank",
667
+ r"MLPF&S",
668
+ r"Morgan Stanley",
669
+ r"(Peter L. )?Scher",
670
+ r"(Ray\s*)?Dalio",
671
+ r"(Richard\s*)?LeFrak",
672
+ r"Schwartz?man",
673
+ r"Serageldin",
674
+ r"UBS",
675
+ r"us.gio@jpmorgan.com",
676
+ ],
324
677
  ),
325
678
  HighlightedNames(
326
679
  label='friend',
327
680
  style='tan',
328
- pattern=r"Andrew Farkas|Thomas\s*(J\.?\s*)?Barrack(\s*Jr)?",
329
- emailers = {
681
+ emailers={
330
682
  DANGENE_AND_JENNIE_ENTERPRISE: 'founders of the members-only CORE club',
331
683
  DAVID_STERN: f'emailed Epstein from Moscow, appears to know chairman of {DEUTSCHE_BANK}',
332
684
  JONATHAN_FARKAS: "heir to the Alexander's department store fortune",
333
- 'linkspirit': "Skype username of someone Epstein communicated with",
685
+ 'linkspirit': 'Skype username of someone Epstein communicated with',
334
686
  'Peter Thomas Roth': 'student of Epstein at Dalton, skincare company founder',
335
687
  STEPHEN_HANSON: None,
336
688
  TOM_BARRACK: 'long time friend of Trump',
337
689
  },
690
+ patterns=[
691
+ r"Andrew Farkas",
692
+ r"Thomas\s*(J\.?\s*)?Barrack(\s*Jr)?",
693
+ ],
338
694
  ),
339
695
  HighlightedNames(
340
696
  label=HARVARD,
341
697
  style='light_goldenrod3',
342
- pattern=r'Cambridge|(Derek\s*)?Bok|Elisa(\s*New)?|Harvard(\s*(Business|Law|University)(\s*School)?)?|(Jonathan\s*)?Zittrain|(Stephen\s*)?Kosslyn',
343
- emailers = {
344
- "Donald Rubin": f"Professor of Statistics",
345
- "Kelly Friendly": f"longtime aide and spokesperson of {LARRY_SUMMERS}",
346
- LARRY_SUMMERS: 'board of Digital Currency Group (DCG), Harvard president, Obama economic advisor',
347
- 'Leah Reis-Dennis': 'producer for Lisa New\'s Poetry in America',
698
+ emailers={
699
+ 'Donald Rubin': 'Professor of Statistics',
700
+ 'Kelly Friendly': 'longtime aide and spokesperson of Larry Summers',
701
+ LARRY_SUMMERS: 'board of Digital Currency Group (DCG), Obama economic advisor',
702
+ 'Leah Reis-Dennis': "producer for Lisa New's Poetry in America",
348
703
  LISA_NEW: f'professor of poetry, wife of {LARRY_SUMMERS}, AKA "Elisa New"',
349
704
  'Lisa Randall': 'theoretical physicist',
350
705
  MARTIN_NOWAK: 'professor of mathematics and biology',
351
706
  MOSHE_HOFFMAN: 'lecturer and research scholar in behavioral and evolutionary economics',
352
- }
707
+ },
708
+ patterns=[
709
+ r"Cambridge",
710
+ r"(Derek\s*)?Bok",
711
+ r"Elisa(\s*New)?",
712
+ r"Harvard(\s*(Business|Law|University)(\s*School)?)?",
713
+ r"(Jonathan\s*)?Zittrain",
714
+ r"Poetry\s*in\s*America",
715
+ r"(Stephen\s*)?Kosslyn",
716
+ ],
353
717
  ),
354
718
  HighlightedNames(
355
719
  label='India',
356
720
  style='bright_green',
357
- pattern=r'Abraaj|Anna\s*Hazare|(Arif\s*)?Naqvi|(Arvind\s*)?Kejriwal|Hardeep( Pur[ei]e)?|Indian?|InsightsPod|Modi|Mumbai|Tranchulas',
358
- emailers = {
721
+ emailers={
359
722
  ANIL_AMBANI: 'chairman of Reliance Group',
360
723
  VINIT_SAHNI: None,
361
- ZUBAIR_KHAN: 'cybersecurity firm Tranchulas CEO, InsightsPod founder, based in Islamabad and Dubai',
362
- }
724
+ ZUBAIR_KHAN: 'cybersecurity firm Tranchulas CEO, InsightsPod founder, Islamabad/Dubai',
725
+ },
726
+ patterns=[
727
+ r"Abraaj",
728
+ r"Anna\s*Hazare",
729
+ r"(Arif\s*)?Naqvi",
730
+ r"(Arvind\s*)?Kejriwal",
731
+ r"Bangalore",
732
+ r"Hardeep( Pur[ei]e)?",
733
+ r"Indian?",
734
+ r"InsightsPod",
735
+ r"Modi",
736
+ r"Mumbai",
737
+ r"(New\s*)?Delhi",
738
+ r"Tranchulas",
739
+ ],
363
740
  ),
364
741
  HighlightedNames(
365
742
  label='Israel',
366
743
  style='dodger_blue2',
367
- pattern=r"AIPAC|Bibi|(eh|(Ehud|Nili Priell) )?barak|Ehud\s*Barack|Israeli?|Jerusalem|J\s*Street|Mossad|Netanyahu|(Sheldon\s*)?Adelson|Tel\s*Aviv|(The\s*)?Shimon\s*Post|Yitzhak|Rabin|YIVO|zionist",
368
744
  emailers={
369
745
  EHUD_BARAK: 'former primer minister',
370
746
  'Mitchell Bard': 'director of the American-Israeli Cooperative Enterprise (AICE)',
371
- 'Nili Priell Barak': f'wife of {EHUD_BARAK}',
372
- }
747
+ 'Nili Priell Barak': 'wife of Ehud Barak',
748
+ },
749
+ patterns=[
750
+ r"AIPAC",
751
+ r"Bibi",
752
+ r"(eh|(Ehud|Nili Priell)\s*)?barak",
753
+ r"Ehud\s*Barack",
754
+ r"Israeli?",
755
+ r"Jerusalem",
756
+ r"J\s*Street",
757
+ r"Mossad",
758
+ r"Netanyahu",
759
+ r"(Sheldon\s*)?Adelson",
760
+ r"Tel\s*Aviv",
761
+ r"(The\s*)?Shimon\s*Post",
762
+ r"Yitzhak", r"Rabin",
763
+ r"YIVO",
764
+ r"zionist",
765
+ ],
373
766
  ),
374
767
  HighlightedNames(
375
768
  label='Japan',
376
769
  style='color(168)',
377
- pattern=r'BOJ|(Bank\s+of\s+)?Japan(ese)?|jpy?(?! Morgan)|SG|Singapore|Toky[op]',
770
+ patterns=[
771
+ r"BOJ",
772
+ r"(Bank\s+of\s+)?Japan(ese)?",
773
+ r"jpy?(?! Morgan)",
774
+ r"SG",
775
+ r"Singapore",
776
+ r"Toky[op]",
777
+ ],
378
778
  ),
379
779
  HighlightedNames(
380
780
  label=JOURNALIST,
381
781
  style='bright_yellow',
382
- pattern=r'Palm\s*Beach\s*(Daily\s*News|Post)|ABC(\s*News)?|Alex\s*Yablon|(Andrew\s*)?Marra|Arianna(\s*Huffington)?|(Arthur\s*)?Kretchmer|BBC|Bloomberg|Breitbart|Charlie\s*Rose|China\s*Daily|CNBC|CNN(politics?)?|Con[cs]hita|Sarnoff|(?<!Virgin[-\s]Islands[-\s])Daily\s*(Beast|Mail|News|Telegraph)|(David\s*)?Pecker|David\s*Brooks|Ed\s*Krassenstein|(Emily\s*)?Michot|Ezra\s*Klein|(George\s*)?Stephanopoulus|Globe\s*and\s*Mail|Good\s*Morning\s*America|Graydon(\s*Carter)?|Huffington(\s*Post)?|Ingram, David|(James\s*)?(Hill|Patterson)|Jonathan\s*Karl|Julie\s*(K.?\s*)?Brown|(Katie\s*)?Couric|Keith\s*Larsen|L\.?A\.?\s*Times|Miami\s*Herald|(Michele\s*)?Dargan|(National\s*)?Enquirer|(The\s*)?N(ew\s*)?Y(ork\s*)?(P(ost)?|T(imes)?)|(The\s*)?New\s*Yorker|NYer|PERVERSION\s*OF\s*JUSTICE|Politico|Pro\s*Publica|(Sean\s*)?Hannity|Sulzberger|SunSentinel|Susan Edelman|(Uma\s*)?Sanghvi|(The\s*)?Wa(shington\s*)?Po(st)?|Viceland|Vick[iy]\s*Ward|Vox|WGBH|(The\s*)?Wall\s*Street\s*Journal|WSJ|[-\w.]+@(bbc|independent|mailonline|mirror|thetimes)\.co\.uk',
383
- emailers = {
384
- EDWARD_JAY_EPSTEIN: 'reporter who wrote about the kinds of crimes Epstein was involved in, no relation to Jeffrey',
385
- 'James Hill': 'ABC News',
782
+ emailers={
783
+ EDWARD_JAY_EPSTEIN: 'no relation, wrote about the kinds of crimes Epstein was involved in',
784
+ JAMES_HILL: 'ABC News',
386
785
  JENNIFER_JACQUET: 'Future Science',
387
786
  JOHN_BROCKMAN: 'literary agent and author specializing in scientific literature',
388
787
  LANDON_THOMAS: 'New York Times',
389
788
  MICHAEL_WOLFF: 'Author of "Fire and Fury: Inside the Trump White House"',
390
789
  PAUL_KRASSNER: '60s counterculture guy',
391
790
  'Tim Zagat': 'Zagat restaurant guide CEO',
392
- }
791
+ },
792
+ patterns=[
793
+ r"ABC(\s*News)?",
794
+ r"Alex\s*Yablon",
795
+ r"Arianna(\s*Huffington)?",
796
+ r"(Arthur\s*)?Kretchmer",
797
+ r'Associated\s*Press',
798
+ r"BBC",
799
+ r"Bloomberg",
800
+ r"Breitbart",
801
+ r"Charlie\s*Rose",
802
+ r"China\s*Daily",
803
+ r"CNBC",
804
+ r"CNN(politics?)?",
805
+ r"Con[cs]hita",
806
+ r"Sarnoff",
807
+ r"(?<!Virgin[-\s]Islands[-\s])Daily\s*(Beast|Mail|News|Telegraph)",
808
+ r"(David\s*)?(Pecker|Pegg)",
809
+ r"David\s*Brooks",
810
+ r"Ed\s*Krassenstein",
811
+ r"(Emily\s*)?Michot",
812
+ r"Ezra\s*Klein",
813
+ r"FT",
814
+ r"(George\s*)?Stephanopoulus",
815
+ r"Globe\s*and\s*Mail",
816
+ r"Good\s*Morning\s*America",
817
+ r"Graydon(\s*Carter)?",
818
+ r"Huff(ington)?(\s*Po(st)?)?",
819
+ r"Ingram, David",
820
+ r"(James\s*)?(Hill|Patterson)",
821
+ r"Jonathan\s*Karl",
822
+ r"Julie\s*(K.?\s*)?Brown", r'jbrown@miamiherald.com',
823
+ r"(Katie\s*)?Couric",
824
+ r"Keith\s*Larsen",
825
+ r"L\.?A\.?\s*Times",
826
+ r"Miami\s*Herald",
827
+ r"(Michele\s*)?Dargan",
828
+ r"(National\s*)?Enquirer",
829
+ r"NYer",
830
+ r"Palm\s*Beach\s*(Daily\s*News|Post)",
831
+ r"PERVERSION\s*OF\s*JUSTICE",
832
+ r"Politico",
833
+ r"Pro\s*Publica",
834
+ r"(Sean\s*)?Hannity",
835
+ r"Sulzberger",
836
+ r"SunSentinel",
837
+ r"Susan Edelman",
838
+ r"(The\s*)?Financial\s*Times",
839
+ r"The\s*Guardian",
840
+ r"(The\s*)?N(ew\s*)?Y(ork\s*)?(P(ost)?|T(imes)?)",
841
+ r"(The\s*)?New\s*Yorker",
842
+ r"(The\s*)?Wall\s*Street\s*Journal",
843
+ r"(The\s*)?Wa(shington\s*)?Po(st)?",
844
+ r"(Uma\s*)?Sanghvi",
845
+ r"Vanity\s*Fair",
846
+ r"Viceland",
847
+ r"Vick[iy]\s*Ward",
848
+ r"Vox",
849
+ r"WGBH",
850
+ r"WSJ",
851
+ r"[-\w.]+@(bbc|independent|mailonline|mirror|thetimes)\.co\.uk",
852
+ ],
393
853
  ),
394
854
  HighlightedNames(
395
855
  label='Latin America',
396
856
  style='yellow',
397
- pattern=r'Argentin(a|ian)|Bolsonar[aio]|Bra[sz]il(ian)?|Bukele|Caracas|Castro|Colombian?|Cuban?|El\s*Salvador|((Enrique )?Pena )?Nieto|LatAm|Lula|Mexic(an|o)|(Nicolas\s+)?Maduro|Panama( Papers)?|Peru|Venezuelan?|Zambrano',
857
+ patterns=[
858
+ r"Argentin(a|ian)",
859
+ r"Bolsonar[aio]",
860
+ r"Bra[sz]il(ian)?",
861
+ r"Caracas",
862
+ r"Castro",
863
+ r"Colombian?",
864
+ r"Cuban?",
865
+ r"El\s*Salvador",
866
+ r"((Enrique )?Pena )?Nieto",
867
+ r"Lat(in)?\s*Am(erica)?",
868
+ r"Lula",
869
+ r"Mexic(an|o)",
870
+ r"(Nicolas\s+)?Maduro",
871
+ r"Panama( Papers)?",
872
+ r"Peru(vian)?",
873
+ r"Venezuelan?",
874
+ r"Zambrano",
875
+ ],
398
876
  ),
399
877
  HighlightedNames(
400
878
  label='law enforcement',
401
879
  style='color(24) bold',
402
- pattern=r'ag|(Alicia\s*)?Valle|AML|(Andrew\s*)?McCabe|((Bob|Robert)\s*)?Mueller|(Byung\s)?Pak|CFTC?|CIA|CIS|CVRA|Dep(artmen)?t\.?\s*of\s*(the\s*)?(Justice|Treasury)|DHS|DOJ|FBI|FCPA|FDIC|Federal\s*Bureau\s*of\s*Investigation|FinCEN|FINRA|FOIA|FTC|IRS|(James\s*)?Comey|(Jennifer\s*Shasky\s*)?Calvery|((Judge|Mark)\s*)?(Carney|Filip)|(Kirk )?Blouin|KYC|NIH|NS(A|C)|OCC|OFAC|(Lann?a\s*)?Belohlavek|(Michael\s*)?Reiter|OGE|Office\s*of\s*Government\s*Ethics|Police Code Enforcement|(Preet\s*)?Bharara|SCOTUS|SD(FL|NY)|SEC|Secret\s*Service|Securities\s*and\s*Exchange\s*Commission|Southern\s*District\s*of\s*(Florida|New\s*York)|State\s*Dep(artmen)?t|Strzok|Supreme\s*Court|Treasury\s*(Dep(artmen)?t|Secretary)|TSA|USAID|(William\s*J\.?\s*)?Zloch',
403
- emailers = {
404
- ANN_MARIE_VILLAFANA: 'southern district of Florida U.S. Attorney',
405
- DANNY_FROST: 'Director of Communications at Manhattan DA',
406
- }
880
+ emailers={
881
+ ANN_MARIE_VILLAFANA: 'Southern District of Florida (SDFL) U.S. Attorney',
882
+ DANNY_FROST: 'Director of Communications at Manhattan D.A.',
883
+ },
884
+ patterns=[
885
+ r"AG",
886
+ r"(Alicia\s*)?Valle",
887
+ r"AML",
888
+ r"(Andrew\s*)?McCabe",
889
+ r"Attorney General",
890
+ r"((Bob|Robert)\s*)?Mueller",
891
+ r"(Byung\s)?Pak",
892
+ r"Case 1:19-cv-03377(-LAP)?",
893
+ r"CFTC?",
894
+ r"CIA",
895
+ r"CIS",
896
+ r"CVRA",
897
+ r"Dep(artmen)?t\.?\s*of\s*(the\s*)?(Justice|Treasury)",
898
+ r"DHS",
899
+ r"DOJ",
900
+ r"FBI",
901
+ r"FCPA",
902
+ r"FDIC",
903
+ r"Federal\s*Bureau\s*of\s*Investigation",
904
+ r"FinCEN",
905
+ r"FINRA",
906
+ r"FOIA",
907
+ r"FTC",
908
+ r"IRS",
909
+ r"(James\s*)?Comey",
910
+ r"Jeff(rey)?\s*Sessions",
911
+ r"(Jennifer\s*Shasky\s*)?Calvery",
912
+ r"((Judge|Mark)\s*)?(Carney|Filip)",
913
+ r"(Judge\s*)?(Kenneth\s*)?(A\.?\s*)?Marra",
914
+ r"(Justice|Treasury)\s*Dep(t|artment)",
915
+ r"(Kirk )?Blouin",
916
+ r"KYC",
917
+ r"(Lann?a\s*)?Belohlavek",
918
+ r"NIH",
919
+ r"NS(A|C)",
920
+ r"OCC",
921
+ r"OFAC",
922
+ r"(Michael\s*)?Reiter",
923
+ r"OGE",
924
+ r"Office\s*of\s*Government\s*Ethics",
925
+ r"Police Code Enforcement",
926
+ r"(Preet\s*)?Bharara",
927
+ r"SCOTUS",
928
+ r"SD(FL|NY)",
929
+ r"SEC",
930
+ r"Secret\s*Service",
931
+ r"Securities\s*and\s*Exchange\s*Commission",
932
+ r"Southern\s*District\s*of\s*(Florida|New\s*York)",
933
+ r"State\s*Dep(artmen)?t",
934
+ r"Strzok",
935
+ r"Supreme\s*Court",
936
+ r"Treasury\s*(Dep(artmen)?t|Secretary)",
937
+ r"TSA",
938
+ r"U\.?S\.? attorney",
939
+ r"USAID",
940
+ r"(William\s*J\.?\s*)?Zloch",
941
+ ],
407
942
  ),
408
943
  HighlightedNames(
409
944
  label=LOBBYIST,
410
945
  style='light_coral',
411
- pattern=r'[BR]ob Crowe|CSIS|Stanley Rosenberg',
412
- emailers = {
946
+ emailers={
413
947
  'Joshua Cooper Ramo': 'co-CEO of Henry Kissinger Associates',
414
948
  KATHERINE_KEATING: 'Daughter of former Australian PM',
415
949
  MOHAMED_WAHEED_HASSAN: 'former president of the Maldives',
@@ -417,25 +951,112 @@ HIGHLIGHTED_NAMES = [
417
951
  'Paul Keating': 'former PM of Australia',
418
952
  PUREVSUREN_LUNDEG: 'Mongolian ambassador to the UN',
419
953
  'Stanley Rosenberg': 'former President of the Massachusetts Senate',
420
- }
954
+ },
955
+ patterns=[
956
+ r"[BR]ob Crowe",
957
+ r"CSIS",
958
+ r"(Kevin\s*)?Rudd",
959
+ r"Stanley Rosenberg",
960
+ ],
421
961
  ),
422
962
  HighlightedNames(
423
963
  label='mideast',
424
964
  style='dark_sea_green4',
425
- # something like this won't match ever because of word boundary: [-\s]9/11[\s.]
426
- pattern=r"Abdulmalik Al-Makhlafi|Abdullah|Abu\s+Dhabi|Afghanistan|Al[-\s]?Qa[ei]da|Ahmadinejad|Arab|Aramco|Assad|Bahrain|Basiji?|Benghazi|Cairo|Chagoury|Dj[iu]bo?uti|Doha|Dubai|Egypt(ian)?|Emir(at(es?|i))?|Erdogan|Fashi|Gaddafi|(Hamid\s*)?Karzai|Hamad\s*bin\s*Jassim|HBJ|Houthi|Imran\s+Khan|Iran(ian)?|Isi[ls]|Islam(abad|ic|ist)?|Istanbul|Kh?ashoggi|(Kairat\s*)?Kelimbetov|kasshohgi|Kaz(akh|ich)stan|Kazakh?|Kh[ao]menei|Khalid\s*Sheikh\s*Mohammed|KSA|Leban(ese|on)|Libyan?|Mahmoud|Marra[hk]e[cs]h|MB(N|S|Z)|Mid(dle)?\s*East|Mohammed\s+bin\s+Salman|Morocco|Mubarak|Muslim|Nayaf|Pakistani?|Omar|(Osama\s*)?Bin\s*Laden|Osama(?! al)|Palestin(e|ian)|Persian?|Riya(dh|nd)|Saddam|Salman|Saudi(\s+Arabian?)?|Shariah?|SHC|sheikh|shia|(Sultan\s*)?Yacoub|Syrian?|(Tarek\s*)?El\s*Sayed|Tehran|Tunisian?|Turk(ey|ish)|UAE|((Iraq|Iran|Kuwait|Qatar|Yemen)i?)",
427
- emailers = {
428
- ANAS_ALRASHEED: f'former information minister of Kuwait {QUESTION_MARKS}',
965
+ emailers={
966
+ ANAS_ALRASHEED: 'former information minister of Kuwait (???)',
429
967
  AZIZA_ALAHMADI: 'Abu Dhabi Department of Culture & Tourism',
430
968
  RAAFAT_ALSABBAGH: 'Saudi royal advisor',
431
969
  SHAHER_ABDULHAK_BESHER: 'Yemeni billionaire',
432
- }
970
+ },
971
+ patterns=[
972
+ r"Abdulmalik Al-Makhlafi",
973
+ r"Abdullah",
974
+ r"Abu\s+Dhabi",
975
+ r"Afghanistan",
976
+ r"Al[-\s]?Qa[ei]da",
977
+ r"Ahmadinejad",
978
+ r"Arab",
979
+ r"Aramco",
980
+ r"Armenia",
981
+ r"Assad",
982
+ r"Ayatollah",
983
+ r"Bahrain",
984
+ r"Basiji?",
985
+ r"Beirut",
986
+ r"Benghazi",
987
+ r"Cairo",
988
+ r"Chagoury",
989
+ r"Damascus",
990
+ r"Dj[iu]bo?uti",
991
+ r"Doha",
992
+ r"[DB]ubai",
993
+ r"Egypt(ian)?",
994
+ r"Emir(at(es?|i))?",
995
+ r"Erdogan",
996
+ r"Fashi",
997
+ r"Gaddafi",
998
+ r"Gulf\s*Cooperation\s*Council",
999
+ r"GCC",
1000
+ r"(Hamid\s*)?Karzai",
1001
+ r"Hamad\s*bin\s*Jassim",
1002
+ r"Hamas",
1003
+ r"Hezbollah",
1004
+ r"HBJ",
1005
+ r"Houthi",
1006
+ r"Imran\s+Khan",
1007
+ r"Iran(ian)?",
1008
+ r"Isi[ls]",
1009
+ r"Islam(abad|ic|ist)?",
1010
+ r"Istanbul",
1011
+ r"Kabul",
1012
+ r"(Kairat\s*)?Kelimbetov",
1013
+ r"kasshohgi",
1014
+ r"Kaz(akh|ich)stan",
1015
+ r"Kazakh?",
1016
+ r"Kh[ao]menei",
1017
+ r"Khalid\s*Sheikh\s*Mohammed",
1018
+ r"Kh?ashoggi",
1019
+ r"KSA",
1020
+ r"Leban(ese|on)",
1021
+ r"Libyan?",
1022
+ r"Mahmoud",
1023
+ r"Marra[hk]e[cs]h",
1024
+ r"MB(N|S|Z)",
1025
+ r"Mid(dle)?\s*East(ern)?",
1026
+ r"Mohammed\s+bin\s+Salman",
1027
+ r"Morocco",
1028
+ r"Mubarak",
1029
+ r"Muslim",
1030
+ r"Nayaf",
1031
+ r"Pakistani?",
1032
+ r"Omar",
1033
+ r"(Osama\s*)?Bin\s*Laden",
1034
+ r"Osama(?! al)",
1035
+ r"Palestin(e|ian)",
1036
+ r"Persian?(\s*Gulf)?",
1037
+ r"Riya(dh|nd)",
1038
+ r"Saddam",
1039
+ r"Salman",
1040
+ r"Saudi(\s+Arabian?)?",
1041
+ r"Shariah?",
1042
+ r"SHC",
1043
+ r"sheikh",
1044
+ r"shia",
1045
+ r"(Sultan\s*)?Yacoub",
1046
+ r"Sultan",
1047
+ r"Syrian?",
1048
+ r"(Tarek\s*)?El\s*Sayed",
1049
+ r"Tehran",
1050
+ r"Tunisian?",
1051
+ r"Turk(ey|ish)",
1052
+ r"UAE",
1053
+ r"((Iraq|Iran|Kuwait|Qatar|Yemen)i?)",
1054
+ ],
433
1055
  ),
434
1056
  HighlightedNames(
435
1057
  label='modeling',
436
1058
  style='pale_violet_red1',
437
- pattern=r'\w+@mc2mm.com|model(ed|ing)|(Nicole\s*)?Junkerman',
438
- emailers = {
1059
+ emailers={
439
1060
  'Abi Schwinck': 'MC2 Model Management (?)',
440
1061
  DANIEL_SIAD: None,
441
1062
  FAITH_KATES: 'Next Models co-founder',
@@ -446,166 +1067,328 @@ HIGHLIGHTED_NAMES = [
446
1067
  MANUELA_MARTINEZ: 'Mega Partners (Brazilian agency)',
447
1068
  MARIANA_IDZKOWSKA: None,
448
1069
  'Michael Sanka': 'MC2 Model Management (?)',
449
- }
1070
+ 'Vladimir Yudashkin': 'director of the 1 Mother Agency',
1071
+ },
1072
+ patterns=[
1073
+ r"\w+@mc2mm.com",
1074
+ r"model(ed|ing)",
1075
+ r"(Nicole\s*)?Junkerman", # Also a venture fund manager now
1076
+ ],
450
1077
  ),
451
1078
  HighlightedNames(
452
1079
  label=PUBLICIST,
453
1080
  style='orange_red1',
454
- pattern=fr"(Matt(hew)? )?Hiltzi[gk]|{REPUTATION_MGMT}",
455
- emailers = {
1081
+ emailers={
456
1082
  AL_SECKEL: 'husband of Isabel Maxwell, Mindshift conference organizer who fell off a cliff',
457
1083
  'Barnaby Marsh': 'co-founder of Saint Partners, a philanthropy services company',
458
- CHRISTINA_GALBRAITH: f"{REPUTATION_MGMT}, worked on Epstein's Google search results with {TYLER_SHEARS}",
459
- IAN_OSBORNE: f"{OSBORNE_LLP} reputation repairer possibly hired by Epstein ca. 2011-06",
1084
+ CHRISTINA_GALBRAITH: f"{REPUTATION_MGMT}, worked with Tyler Shears",
1085
+ IAN_OSBORNE: f'{OSBORNE_LLP} reputation repairer hired by Epstein in 2011',
460
1086
  MICHAEL_SITRICK: 'crisis PR',
461
1087
  'Owen Blicksilver': 'OBPR, Inc.',
462
1088
  PEGGY_SIEGAL: 'socialite',
463
1089
  'R. Couri Hay': None,
464
1090
  ROSS_GOW: 'Acuity Reputation Management',
465
- TYLER_SHEARS: f"{REPUTATION_MGMT}, worked on Epstein's Google search results with {CHRISTINA_GALBRAITH}",
466
- }
1091
+ TYLER_SHEARS: f"{REPUTATION_MGMT}, worked on with {CHRISTINA_GALBRAITH}",
1092
+ },
1093
+ patterns=[
1094
+ r"(Matt(hew)? )?Hiltzi[gk]",
1095
+ REPUTATION_MGMT,
1096
+ ],
467
1097
  ),
468
1098
  HighlightedNames(
469
- label='Republicans',
470
- style='bold dark_red',
471
- pattern=r'Alberto\sGonzale[sz]|(Alex\s*)?Acosta|(Bill\s*)?Barr|Bill\s*Shine|(Bob\s*)?Corker|(John\s*(R.?\s*)?)Bolton|Broidy|(Chris\s)?Christie|Devin\s*Nunes|(Don\s*)?McGa[hn]n|McMaster|(George\s*)?Nader|GOP|(Brett\s*)?Kavanaugh|Kissinger|Kobach|Koch\s*Brothers|Kolfage|Kudlow|Lewandowski|(Marco\s)?Rubio|(Mark\s*)Meadows|Mattis|McCain|(?<!Merwin Dela )Cruz|(Michael\s)?Hayden|((General|Mike)\s*)?(Flynn|Pence)|(Mitt\s*)?Romney|Mnuchin|Nikki|Haley|(Paul\s+)?(Manafort|Volcker)|(Peter\s)?Navarro|Pompeo|Reagan|Reince|Priebus|Republican|(Rex\s*)?Tillerson|(?<!Cynthia )(Richard\s*)?Nixon|Sasse|Tea\s*Party',
472
- # There's no emails from these people, they're just here to automate the regex creation for both first + last names
473
- emailers = {
1099
+ label='Republican',
1100
+ style='dark_red bold',
1101
+ emailers={
1102
+ "Juleanna Glover": 'CEO of D.C. public affairs advisory firm Ridgely|Walsh',
474
1103
  RUDY_GIULIANI: None,
475
1104
  TULSI_GABBARD: None,
476
1105
  },
1106
+ patterns=[
1107
+ r"Alberto\sGonzale[sz]",
1108
+ r"(Alex\s*)?Acosta",
1109
+ r"(Ben\s*)?Sasse",
1110
+ r"((Bill|William)\s*)?Barr",
1111
+ r"Bill\s*Shine",
1112
+ r"(Bob\s*)?Corker",
1113
+ r"(Brett\s*)?Kavanaugh",
1114
+ r"Broidy",
1115
+ r"(Chris\s)?Christie",
1116
+ r"(?<!Merwin Dela )Cruz",
1117
+ r"Devin\s*Nunes",
1118
+ r"(Don\s*)?McGa[hn]n",
1119
+ r"Fox\s*News",
1120
+ r"George\s*(H\.?\s*)?(W\.?\s*)?Bush",
1121
+ r"(George\s*)?Nader",
1122
+ r"GOP",
1123
+ r"(John\s*(R.?\s*)?)Bolton",
1124
+ r"Kissinger",
1125
+ r"Kobach",
1126
+ r"Kolfage",
1127
+ r"Kudlow",
1128
+ r"Lewandowski",
1129
+ r"(Marco\s)?Rubio",
1130
+ r"(Mark\s*)Meadows",
1131
+ r"Mattis",
1132
+ r"McCain",
1133
+ r"McMaster",
1134
+ r"(Michael\s)?Hayden",
1135
+ r"((General|Mike)\s*)?(Flynn|Pence)",
1136
+ r"(Mitt\s*)?Romney",
1137
+ r"Mnuchin",
1138
+ r"Nikki",
1139
+ r"Haley",
1140
+ r"(Paul\s*)?(Manafort|Volcker)",
1141
+ r"(Peter\s*)?Navarro",
1142
+ r"Pompeo",
1143
+ r"Reagan",
1144
+ r"Reince", r"Priebus",
1145
+ r"Republican",
1146
+ r"(Rex\s*)?Tillerson",
1147
+ r"(?<!Cynthia )(Richard\s*)?Nixon",
1148
+ r"Tea\s*Party",
1149
+ ],
477
1150
  ),
478
1151
  HighlightedNames(
479
- label='Rothschild family',
1152
+ label='Rothschild',
480
1153
  style='indian_red',
481
1154
  emailers={
482
1155
  ARIANE_DE_ROTHSCHILD: 'heiress',
483
- JOHNNY_EL_HACHEM: f'Works with {ARIANE_DE_ROTHSCHILD}',
1156
+ JOHNNY_EL_HACHEM: f'works with {ARIANE_DE_ROTHSCHILD}',
484
1157
  },
1158
+ patterns=['AdR'],
485
1159
  ),
486
1160
  HighlightedNames(
487
1161
  label='Russia',
488
1162
  style='red bold',
489
- pattern=r'Alfa\s*Bank|Anya\s*Rasulova|Chernobyl|Day\s+One\s+Ventures|(Dmitry\s)?(Kiselyov|(Lana\s*)?Pozhidaeva|Medvedev|Rybolo(o?l?ev|vlev))|Dmitry|FSB|GRU|KGB|Kislyak|Kremlin|Kuznetsova|Lavrov|Lukoil|Moscow|(Oleg\s*)?Deripaska|Oleksandr Vilkul|Rosneft|RT|St.?\s*?Petersburg|Russian?|Sberbank|Soviet(\s*Union)?|USSR|Vladimir|(Vladimir\s*)?(Putin|Yudashkin)|Women\s*Empowerment|Xitrans',
490
- emailers = {
1163
+ emailers={
491
1164
  'Dasha Zhukova': 'art collector, daughter of Alexander Zhukov',
492
1165
  MASHA_DROKOVA: 'silicon valley VC, former Putin Youth',
493
1166
  RENATA_BOLOTOVA: 'former aspiring model, now fund manager at New York State Insurance Fund',
494
- SVETLANA_POZHIDAEVA: f'Epstein\'s Russian assistant who was recommended for a visa by Sergei Belyakov (FSB) and {DAVID_BLAINE}',
495
- }
496
- ),
497
- HighlightedNames(
498
- label=ACADEMIA,
499
- style='light_goldenrod2',
500
- pattern=r'Alain Forget|Brotherton|Carl\s*Sagan|Columbia|David Grosof|J(ames|im)\s*Watson|(Lord\s*)?Martin\s*Rees|Massachusetts\s*Institute\s*of\s*Technology|MIT(\s*Media\s*Lab)?|Media\s*Lab|Minsky|((Noam|Valeria)\s*)?Chomsky|Norman\s*Finkelstein|Praluent|Regeneron|(Richard\s*)?Dawkins|Sanofi|Stanford|(Stephen\s*)?Hawking|(Steven?\s*)?Pinker|UCLA',
501
- emailers = {
502
- DAVID_HAIG: 'evolutionary geneticist?',
503
- JOSCHA_BACH: 'cognitive science / AI research',
504
- 'Daniel Kahneman': 'Nobel economic sciences laureate and cognitivie psychologist (?)',
505
- 'Ed Boyden': 'Associate Professor, MIT Media Lab neurobiology',
506
- LAWRENCE_KRAUSS: 'theoretical physicist',
507
- LINDA_STONE: 'ex-Microsoft, MIT Media Lab',
508
- MARK_TRAMO: 'professor of neurology at UCLA',
509
- 'Nancy Dahl': f'wife of {LAWRENCE_KRAUSS}',
510
- NEAL_KASSELL: 'professor of neurosurgery at University of Virginia',
511
- PETER_ATTIA: 'longevity medicine',
512
- ROBERT_TRIVERS: 'evolutionary biology',
513
- ROGER_SCHANK: 'Teachers College, Columbia University',
1167
+ SVETLANA_POZHIDAEVA: "Epstein's Russian assistant who was recommended for a visa by Sergei Belyakov (FSB) and David Blaine",
514
1168
  },
1169
+ patterns=[
1170
+ r"Alfa\s*Bank",
1171
+ r"Anya\s*Rasulova",
1172
+ r"Chernobyl",
1173
+ r"Crimea",
1174
+ r"Day\s+One\s+Ventures",
1175
+ r"(Dmitry\s)?(Kiselyov|(Lana\s*)?Pozhidaeva|Medvedev|Rybolo(o?l?ev|vlev))",
1176
+ r"Dmitry",
1177
+ r"FSB",
1178
+ r"GRU",
1179
+ r"KGB",
1180
+ r"Kislyak",
1181
+ r"Kremlin",
1182
+ r"Kuznetsova",
1183
+ r"Lavrov",
1184
+ r"Lukoil",
1185
+ r"Moscow",
1186
+ r"(Natalia\s*)?Veselnitskaya",
1187
+ r"(Oleg\s*)?Deripaska",
1188
+ r"Oleksandr Vilkul",
1189
+ r"Rosneft",
1190
+ r"RT",
1191
+ r"St.?\s*?Petersburg",
1192
+ r'Svet',
1193
+ r"Russian?",
1194
+ r"Sberbank",
1195
+ r"Soviet(\s*Union)?",
1196
+ r"USSR",
1197
+ r"Vladimir",
1198
+ r"(Vladimir\s*)?Putin",
1199
+ r"Women\s*Empowerment",
1200
+ r"Xitrans",
1201
+ r"(Vitaly\s*)?Churkin",
1202
+ ],
515
1203
  ),
1204
+
516
1205
  HighlightedNames(
517
1206
  label='southeast Asia',
518
1207
  style='light_salmon3 bold',
519
- pattern=r'Bangkok|Burm(a|ese)|Cambodian?|Laos|Malaysian?|Myan?mar|Thai(land)?|Vietnam(ese)?',
1208
+ patterns=[
1209
+ r"Bangkok",
1210
+ r"Burm(a|ese)",
1211
+ r"Cambodian?",
1212
+ r"Laos",
1213
+ r"Malaysian?",
1214
+ r"Myan?mar",
1215
+ r"Thai(land)?",
1216
+ r"Vietnam(ese)?",
1217
+ ],
520
1218
  ),
521
1219
  HighlightedNames(
522
1220
  label='tech bro',
523
1221
  style='bright_cyan',
524
- pattern=r"AG?I|Chamath|Palihapitiya|Danny\s*Hillis|Drew\s*Houston|Eric\s*Schmidt|Greylock(\s*Partners)?|(?<!(ustin|Moshe)\s)Hoffmand?|LinkedIn|(Mark\s*)?Zuckerberg|Masa(yoshi)?(\sSon)?|Najeev|Nathan\s*Myhrvold|Palantir|(Peter\s)?Th(ie|ei)l|Pierre\s*Omidyar|Sergey\s*Brin|Silicon\s*Valley|Softbank|SpaceX|Tim\s*Ferriss?|WikiLeak(ed|s)",
525
- emailers = {
1222
+ emailers={
526
1223
  'Auren Hoffman': 'CEO of SafeGraph (firm that gathers location data from mobile devices) and LiveRamp',
527
1224
  ELON_MUSK: 'father of Mecha-Hitler',
528
- PETER_THIEL: 'Paypal mafia member, founder of Palantir, early Facebook investor, reactionary',
1225
+ PETER_THIEL: 'Paypal mafia member, founder of Palantir, Facebook investor',
529
1226
  REID_HOFFMAN: 'PayPal mafia member, founder of LinkedIn',
530
1227
  STEVEN_SINOFSKY: 'ex-Microsoft, loves bitcoin',
1228
+ VINCENZO_IOZZO: 'CEO of the identity-security company SlashID',
531
1229
  },
1230
+ patterns=[
1231
+ r"AG?I",
1232
+ r"Chamath", r"Palihapitiya",
1233
+ r"Danny\s*Hillis",
1234
+ r"Drew\s*Houston",
1235
+ r"Eric\s*Schmidt",
1236
+ r"Greylock(\s*Partners)?",
1237
+ r"(?<!(ustin|Moshe)\s)Hoffmand?",
1238
+ r"LinkedIn",
1239
+ r"(Mark\s*)?Zuckerberg",
1240
+ r"Masa(yoshi)?(\sSon)?",
1241
+ r"Najeev",
1242
+ r"Nathan\s*Myhrvold",
1243
+ r"Palantir",
1244
+ r"(Peter\s)?Th(ie|ei)l",
1245
+ r"Pierre\s*Omidyar",
1246
+ r"Sergey\s*Brin",
1247
+ r"Silicon\s*Valley",
1248
+ r"Softbank",
1249
+ r"SpaceX",
1250
+ r"Tim\s*Ferriss?",
1251
+ r"WikiLeak(ed|s)",
1252
+ ],
532
1253
  ),
533
1254
  HighlightedNames(
534
1255
  label='trump',
535
1256
  style='red3 bold',
536
- pattern=r"@?realDonaldTrump|(Alan\s*)?Weiss?elberg|\bDJ?T\b|Donald J. Tramp|(Donald\s+(J\.\s+)?)?Trump(ism|\s*Properties)?|Don(ald| *Jr)(?! Rubin)|Ivank?a|Jared|Kushner|(Madeleine\s*)?Westerhout|Mar[-\s]*a[-\s]*Lago|(Marla\s*)?Maples|(Matt(hew)? )?Calamari|\bMatt C\b|Melania|(Michael (J.? )?)?Boccio|Rebekah\s*Mercer|Roger\s+Stone|rona|(The\s*)?Art\s*of\s*the\s*Deal",
537
- emailers = {
1257
+ emailers={
538
1258
  'Bruce Moskowitz': "'Trump's health guy' according to Epstein",
539
1259
  },
1260
+ patterns=[
1261
+ r"@?realDonaldTrump",
1262
+ r"(Alan\s*)?Weiss?elberg",
1263
+ r"\bDJ?T\b",
1264
+ r"Donald J. Tramp",
1265
+ r"(Donald\s+(J\.\s+)?)?Trump(ism|\s*Properties)?",
1266
+ r"Don(ald| *Jr)(?! Rubin)",
1267
+ r"Ivank?a",
1268
+ r"Jared",
1269
+ r"Kushner",
1270
+ r"(Madeleine\s*)?Westerhout",
1271
+ r"Mar[-\s]*a[-\s]*Lago",
1272
+ r"(Marla\s*)?Maples",
1273
+ r"(Matt(hew)? )?Calamari",
1274
+ r"\bMatt C\b",
1275
+ r"Melania",
1276
+ r"(Michael (J.? )?)?Boccio",
1277
+ r"Rebekah\s*Mercer",
1278
+ r"Roger\s+Stone",
1279
+ r"rona",
1280
+ r"(The\s*)?Art\s*of\s*the\s*Deal",
1281
+ ],
540
1282
  ),
541
1283
  HighlightedNames(
542
1284
  label='victim',
543
1285
  style='orchid1',
544
- pattern=r'BVI|(Jane|Tiffany)\s*Doe|Katie\s*Johnson|(Virginia\s+((L\.?|Roberts)\s+)?)?Giuffre|Virginia\s+Roberts',
1286
+ patterns=[
1287
+ r"(Jane|Tiffany)\s*Doe",
1288
+ r"Katie\s*Johnson",
1289
+ r"(Virginia\s+((L\.?|Roberts)\s+)?)?Giuffre",
1290
+ r"Virginia\s+Roberts",
1291
+ ],
545
1292
  ),
546
1293
  HighlightedNames(
547
1294
  label='victim lawyer',
548
- style='dark_magenta bold',
549
- pattern=r'(Alan(\s*P.)?|MINTZ)\s*FRAADE|Paul\s*(G.\s*)?Cassell|Rothstein\s*Rosenfeldt\s*Adler|(Scott\s*)?Rothstein|(J\.?\s*)?(Stan(ley)?\s*)?Pottinger',
550
- emailers = {
551
- BRAD_EDWARDS: 'Rothstein Rosenfeldt Adler (Rothstein was a crook & partner of Roger Stone)',
1295
+ style='medium_orchid1',
1296
+ emailers={
1297
+ BRAD_EDWARDS: ROTHSTEIN_ROSENFELDT_ADLER,
1298
+ 'Grant J. Smith': ROTHSTEIN_ROSENFELDT_ADLER,
552
1299
  JACK_SCAROLA: 'Searcy Denney Scarola Barnhart & Shipley',
553
- }
1300
+ KEN_JENNE: ROTHSTEIN_ROSENFELDT_ADLER,
1301
+ },
1302
+ patterns=[
1303
+ r"(Alan(\s*P.)?|MINTZ)\s*FRAADE",
1304
+ r"(J\.?\s*)?(Stan(ley)?\s*)?Pottinger",
1305
+ r"Paul\s*(G.\s*)?Cassell",
1306
+ r"Rothstein\s*Rosenfeldt\s*Adler",
1307
+ r"(Scott\s*)?Rothstein",
1308
+ ],
554
1309
  ),
555
1310
  HighlightedNames(
556
1311
  label=VIRGIN_ISLANDS,
557
1312
  style='sea_green1',
558
- pattern=r'Antigua|Bahamas|Caribb?ean|Dominican\s*Republic|(Great|Little)\s*St.?\s*James|Haiti(an)?|(John\s*)deJongh(\s*Jr\.?)|(Kenneth E\. )?Mapp|Palm\s*Beach(?!\s*Post)|PBI|S(ain)?t.?\s*Thomas|USVI|(?<!Epstein )VI|(The\s*)?Virgin\s*Islands(\s*Daily\s*News)?', # TODO: VI Daily News should be yellow but it's hard bc Daily News xists
559
- emailers = {
560
- CECILE_DE_JONGH: f'first lady 2007-2015',
561
- STACEY_PLASKETT: 'non-voting member of Congress',
1313
+ emailers={
1314
+ CECILE_DE_JONGH: 'first lady 2007-2015',
562
1315
  KENNETH_E_MAPP: 'Governor',
1316
+ STACEY_PLASKETT: 'non-voting member of Congress',
563
1317
  },
1318
+ patterns=[
1319
+ r"Antigua",
1320
+ r"Bahamas",
1321
+ r"BVI",
1322
+ r"Caribb?ean",
1323
+ r"Dominican\s*Republic",
1324
+ r"(Great|Little)\s*St.?\s*James",
1325
+ r"Haiti(an)?",
1326
+ r"(John\s*)deJongh(\s*Jr\.?)",
1327
+ r"(Kenneth E\. )?Mapp",
1328
+ r"PBI",
1329
+ r"S(ain)?t.?\s*Thomas",
1330
+ r"USVI",
1331
+ r"(?<!Epstein )VI",
1332
+ r"(The\s*)?Virgin\s*Islands(\s*Daily\s*News)?", # Hard to make this work right
1333
+ r"(West\s*)?Palm\s*Beach(?!\s*(Daily|Post))",
1334
+ ],
564
1335
  ),
565
-
566
- # Individuals
567
1336
  HighlightedNames(
568
1337
  label=BILL_GATES,
569
1338
  style='turquoise4',
570
- pattern=r'BG|b?g?C3|(Bill\s*((and|or)\s*Melinda\s*)?)?Gates|Melinda(\s*Gates)?|Microsoft|MSFT',
571
- emailers = {
1339
+ emailers={
572
1340
  BORIS_NIKOLIC: f'biotech VC partner of {BILL_GATES}, {EPSTEIN_ESTATE_EXECUTOR}',
573
1341
  },
1342
+ patterns=[
1343
+ r"BG",
1344
+ r"b?g?C3",
1345
+ r"(Bill\s*((and|or)\s*Melinda\s*)?)?Gates",
1346
+ r"Melinda(\s*Gates)?",
1347
+ r"Microsoft",
1348
+ r"MSFT",
1349
+ ],
574
1350
  ),
575
1351
  HighlightedNames(
576
1352
  label=STEVE_BANNON,
577
1353
  style='color(58)',
578
- pattern=r'((Steve|Sean)\s*)?Bannon?|(American\s*)?Dharma',
579
- emailers = {
580
- STEVE_BANNON: 'Trump campaign manager, memecoin grifter, convicted criminal',
581
- }
1354
+ category=POLITICS,
1355
+ emailers={
1356
+ STEVE_BANNON: "Trump campaign manager, memecoin grifter, convicted criminal",
1357
+ },
1358
+ patterns=[
1359
+ r"(American\s*)?Dharma",
1360
+ r"((Steve|Sean)\s*)?Bannon?",
1361
+ ],
582
1362
  ),
583
1363
  HighlightedNames(
584
- emailers={STEVEN_HOFFENBERG: HEADER_ABBREVIATIONS['Hoffenberg']},
585
- pattern=r'(steven?\s*)?hoffenberg?w?',
586
- style='gold3'
1364
+ style='dark_olive_green3',
1365
+ category=FINANCE,
1366
+ emailers={STEVEN_HOFFENBERG: "Epstein's ponzi scheme partner at Towers Financial, prison for 18 years"},
1367
+ patterns=[r"(steven?\s*)?hoffenberg?w?"],
587
1368
  ),
588
- HighlightedNames(emailers={GHISLAINE_MAXWELL: None}, pattern='gmax(1@ellmax.com)?|TerraMar', style='deep_pink3'),
589
- HighlightedNames(emailers={JABOR_Y: HEADER_ABBREVIATIONS['Jabor']}, style='spring_green1'),
590
- HighlightedNames(emailers={JEFFREY_EPSTEIN: None}, pattern='JEGE|LSJ|Mark (L. )?Epstein', style='blue1'),
591
- HighlightedNames(emailers={JOI_ITO: 'former head of MIT Media Lab'}, style='gold1'),
1369
+ HighlightedNames(emailers={GHISLAINE_MAXWELL: None}, patterns=[r"gmax(1@ellmax.com)?", r"TerraMar"], style='deep_pink3'),
1370
+ HighlightedNames(emailers={JABOR_Y: '"an influential man in Qatar"'}, category='mideast', style='spring_green1'),
1371
+ HighlightedNames(emailers={JEFFREY_EPSTEIN: None}, patterns=[r"JEGE", r"LSJ", r"Mark (L. )?Epstein"], style='blue1'),
592
1372
  HighlightedNames(emailers={KATHRYN_RUEMMLER: 'former Obama legal counsel'}, style='magenta2'),
593
1373
  HighlightedNames(emailers={MELANIE_WALKER: 'doctor'}, style='pale_violet_red1'),
594
- HighlightedNames(emailers={PAULA: "Epstein's ex-girlfriend who is now in the opera"}, label='paula_heil_fisher', style='pink1'),
1374
+ HighlightedNames(emailers={PAULA: "Epstein's ex-girlfriend who is now in the opera world"}, label='paula_heil_fisher', style='pink1'),
595
1375
  HighlightedNames(emailers={PRINCE_ANDREW: 'British royal family'}, style='dodger_blue1'),
596
- HighlightedNames(emailers={SOON_YI_PREVIN: "wife of Woody Allen"}, style='hot_pink'),
1376
+ HighlightedNames(emailers={SOON_YI_PREVIN: 'wife of Woody Allen'}, style='hot_pink'),
597
1377
  HighlightedNames(emailers={SULTAN_BIN_SULAYEM: 'CEO of DP World, chairman of ports in Dubai'}, style='green1'),
598
1378
 
599
1379
  # HighlightedText not HighlightedNames bc of word boundary issue
600
- HighlightedText(
601
- label='unknown',
602
- style='cyan',
603
- pattern=r'\(unknown\)'
604
- ),
605
1380
  HighlightedText(
606
1381
  label='phone_number',
607
1382
  style='bright_green',
608
- pattern=r"\+?(1?\(?\d{3}\)?[- ]\d{3}[- ]\d{4}|\d{2}[- ]\(?0?\)?\d{2}[- ]\d{4}[- ]\d{4})|(\b|\+)[\d+]{10,12}\b",
1383
+ patterns=[
1384
+ r"\+?(1?\(?\d{3}\)?[- ]\d{3}[- ]\d{4}|\d{2}[- ]\(?0?\)?\d{2}[- ]\d{4}[- ]\d{4})",
1385
+ r"(\b|\+)[\d+]{10,12}\b",
1386
+ ],
1387
+ ),
1388
+ HighlightedText(
1389
+ label='unknown',
1390
+ style='cyan',
1391
+ patterns=[r'\(unknown\)']
609
1392
  ),
610
1393
  ]
611
1394
 
@@ -614,37 +1397,49 @@ HIGHLIGHTED_TEXTS = [
614
1397
  HighlightedText(
615
1398
  label='header_field',
616
1399
  style='plum4',
617
- pattern=r'^(Date|From|Sent|To|C[cC]|Importance|Subject|Bee|B[cC]{2}|Attachments):',
1400
+ patterns=[r'^(> )?(Date|From|Sent|To|C[cC]|Importance|Subject|Bee|B[cC]{2}|Attachments):'],
618
1401
  ),
619
1402
  HighlightedText(
620
1403
  label='http_links',
621
1404
  style=f'{ARCHIVE_LINK_COLOR} underline',
622
- pattern=r"https?:[^\s]+",
1405
+ patterns=[r"https?:[^\s]+"],
623
1406
  ),
624
1407
  HighlightedText(
625
1408
  label='quoted_reply_line',
626
1409
  style='dim',
627
- pattern=REPLY_REGEX.pattern,
1410
+ patterns=[REPLY_REGEX.pattern],
628
1411
  ),
629
1412
  HighlightedText(
630
1413
  label='redacted',
631
1414
  style='grey58',
632
- pattern=fr"{REDACTED}|Privileged - Redacted",
1415
+ patterns=[fr"{REDACTED}|Privileged - Redacted"],
633
1416
  ),
634
1417
  HighlightedText(
635
1418
  label='sent_from',
636
1419
  style='gray42 italic',
637
- pattern=SENT_FROM_REGEX.pattern,
1420
+ patterns=[SENT_FROM_REGEX.pattern],
638
1421
  ),
639
1422
  HighlightedText(
640
1423
  label='snipped_signature',
641
1424
  style='gray19',
642
- pattern=r'<\.\.\.(snipped|trimmed).*\.\.\.>',
1425
+ patterns=[r'<\.\.\.(snipped|trimmed).*\.\.\.>'],
643
1426
  ),
644
1427
  HighlightedText(
645
1428
  label='timestamp_2',
646
1429
  style=TIMESTAMP_STYLE,
647
- pattern=r"\d{1,4}[-/]\d{1,2}[-/]\d{2,4} \d{1,2}:\d{2}:\d{2}( [AP]M)?",
1430
+ patterns=[r"\d{1,4}[-/]\d{1,2}[-/]\d{2,4} \d{1,2}:\d{2}:\d{2}( [AP]M)?"],
1431
+ ),
1432
+
1433
+ # Manual regexes
1434
+ ManualHighlight(
1435
+ label='email_attachments',
1436
+ style='gray30 italic',
1437
+ pattern=r"^(> )?Attachments: (?P<email_attachments>.*)",
1438
+ ),
1439
+ ManualHighlight(
1440
+ label='email_timestamp',
1441
+ style=TIMESTAMP_STYLE,
1442
+ pattern=r"^(> )?(Date|Sent): (?P<email_timestamp>.*)",
648
1443
  ),
649
1444
  ]
650
1445
 
@@ -657,10 +1452,20 @@ class EpsteinHighlighter(RegexHighlighter):
657
1452
  highlights = [highlight_group.regex for highlight_group in ALL_HIGHLIGHTS]
658
1453
 
659
1454
 
660
- def get_info_for_name(name: str) -> str | None:
1455
+ def get_category_for_name(name: str | None) -> Text | None:
661
1456
  highlight_group = _get_highlight_group_for_name(name)
662
1457
 
663
1458
  if highlight_group and isinstance(highlight_group, HighlightedNames):
1459
+ category = highlight_group.category or highlight_group.label
1460
+
1461
+ if category != name:
1462
+ return styled_category(category)
1463
+
1464
+
1465
+ def get_info_for_name(name: str | None) -> str | None:
1466
+ highlight_group = _get_highlight_group_for_name(name)
1467
+
1468
+ if highlight_group and isinstance(highlight_group, HighlightedNames) and name:
664
1469
  return highlight_group.get_info(name)
665
1470
 
666
1471
 
@@ -683,11 +1488,26 @@ def get_style_for_name(name: str | None, default_style: str = DEFAULT, allow_bol
683
1488
  return style if allow_bold else style.replace('bold', '').strip()
684
1489
 
685
1490
 
686
- def styled_category(category: str) -> Text:
1491
+ def styled_category(category: str | None) -> Text:
1492
+ if not category:
1493
+ return QUESTION_MARKS_TXT
1494
+
687
1495
  return Text(category, get_style_for_category(category) or 'wheat4')
688
1496
 
689
1497
 
690
- def _get_highlight_group_for_name(name: str) -> HighlightedNames | None:
1498
+ def _get_highlight_group_for_name(name: str | None) -> HighlightedNames | None:
1499
+ if name is None:
1500
+ return None
1501
+
691
1502
  for highlight_group in HIGHLIGHTED_NAMES:
692
1503
  if highlight_group.regex.search(name):
693
1504
  return highlight_group
1505
+
1506
+
1507
+ def _print_highlighted_names_repr() -> None:
1508
+ for hn in HIGHLIGHTED_NAMES:
1509
+ if isinstance(hn, HighlightedNames):
1510
+ print(indented(repr(hn)) + ',')
1511
+
1512
+ import sys
1513
+ sys.exit()