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