medicafe 0.251026.0__py3-none-any.whl → 0.251027.0__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.

Potentially problematic release.


This version of medicafe might be problematic. Click here for more details.

MediBot/__init__.py CHANGED
@@ -19,7 +19,7 @@ Smart Import Integration:
19
19
  medibot_main = get_components('medibot_main')
20
20
  """
21
21
 
22
- __version__ = "0.251026.0"
22
+ __version__ = "0.251027.0"
23
23
  __author__ = "Daniel Vidaud"
24
24
  __email__ = "daniel@personalizedtransformation.com"
25
25
 
MediCafe/__init__.py CHANGED
@@ -27,7 +27,7 @@ Smart Import System:
27
27
  api_suite = get_api_access()
28
28
  """
29
29
 
30
- __version__ = "0.251026.0"
30
+ __version__ = "0.251027.0"
31
31
  __author__ = "Daniel Vidaud"
32
32
  __email__ = "daniel@personalizedtransformation.com"
33
33
 
@@ -16,11 +16,6 @@ from email.mime.text import MIMEText
16
16
  from MediCafe.MediLink_ConfigLoader import load_configuration, log as mc_log
17
17
  from MediLink.MediLink_Gmail import get_access_token
18
18
 
19
- ASCII_SAFE_REPLACEMENTS = [
20
- ('"', '"'),
21
- ("'", "'"),
22
- ]
23
-
24
19
 
25
20
  def _safe_ascii(text):
26
21
  try:
@@ -66,21 +61,33 @@ def _get_latest_log_path(local_storage_path):
66
61
 
67
62
 
68
63
  def _redact(text):
69
- # Best-effort ASCII redaction: mask obvious numeric IDs and bearer tokens
70
- try:
71
- text = _safe_ascii(text)
72
- import re
73
- patterns = [
74
- (r'\b(\d{3}-?\d{2}-?\d{4})\b', '***-**-****'),
75
- (r'\b(\d{9,11})\b', '*********'),
76
- (r'Bearer\s+[A-Za-z0-9\-._~+/]+=*', 'Bearer ***'),
77
- (r'Authorization:\s*[^\n\r]+', 'Authorization: ***'),
78
- ]
79
- for pat, rep in patterns:
80
- text = re.sub(pat, rep, text)
81
- return text
82
- except Exception:
83
- return text
64
+ # Best-effort ASCII redaction: mask common secrets in logs and JSON
65
+ try:
66
+ text = _safe_ascii(text)
67
+ import re
68
+ patterns = [
69
+ # SSN-like
70
+ (r'\b(\d{3}-?\d{2}-?\d{4})\b', '***-**-****'),
71
+ # 9-11 digit numeric IDs
72
+ (r'\b(\d{9,11})\b', '*********'),
73
+ # Authorization headers
74
+ (r'Authorization:\s*Bearer\s+[A-Za-z0-9\-._~+/]+=*', 'Authorization: Bearer ***'),
75
+ (r'Authorization:\s*[^\n\r]+', 'Authorization: ***'),
76
+ # JSON token fields
77
+ (r'("access_token"\s*:\s*")([^"]+)(")', r'\1***\3'),
78
+ (r'("refresh_token"\s*:\s*")([^"]+)(")', r'\1***\3'),
79
+ (r'("id_token"\s*:\s*")([^"]+)(")', r'\1***\3'),
80
+ (r'("X-Auth-Token"\s*:\s*")([^"]+)(")', r'\1***\3'),
81
+ # URL query params: token=..., access_token=..., auth=...
82
+ (r'(token|access_token|auth|authorization)=([^&\s]+)', r'\1=***'),
83
+ # Bearer fragments in JSON or text
84
+ (r'Bearer\s+[A-Za-z0-9\-._~+/]+=*', 'Bearer ***'),
85
+ ]
86
+ for pat, rep in patterns:
87
+ text = re.sub(pat, rep, text)
88
+ return text
89
+ except Exception:
90
+ return text
84
91
 
85
92
 
86
93
  def _ensure_dir(path):
@@ -92,15 +99,7 @@ def _ensure_dir(path):
92
99
  return False
93
100
 
94
101
 
95
- def _compute_report_id(zip_path):
96
- try:
97
- h = hashlib.sha256()
98
- with open(zip_path, 'rb') as f:
99
- chunk = f.read(256 * 1024)
100
- h.update(chunk)
101
- return 'mc-{}-{}'.format(int(time.time()), h.hexdigest()[:12])
102
- except Exception:
103
- return 'mc-{}-{}'.format(int(time.time()), '000000000000')
102
+ # _compute_report_id removed (unused)
104
103
 
105
104
 
106
105
  def collect_support_bundle(include_traceback=True, max_log_lines=500):
@@ -128,7 +127,7 @@ def collect_support_bundle(include_traceback=True, max_log_lines=500):
128
127
  except Exception:
129
128
  traceback_txt = ''
130
129
 
131
- meta = {
130
+ meta = {
132
131
  'app_version': _safe_ascii(_get_version()),
133
132
  'python_version': _safe_ascii(sys.version.split(' ')[0]),
134
133
  'platform': _safe_ascii(platform.platform()),
@@ -164,11 +163,7 @@ def collect_support_bundle(include_traceback=True, max_log_lines=500):
164
163
  mc_log('Error creating support bundle: {}'.format(e), level='ERROR')
165
164
  return None
166
165
 
167
- bundle_size = os.path.getsize(zip_path)
168
- if bundle_size > 1572864:
169
- os.remove(zip_path)
170
- mc_log('Bundle too large ({} bytes) - discarded'.format(bundle_size), level='WARNING')
171
- return None
166
+ # Do not delete oversize bundles here; sender will enforce size based on config
172
167
  return zip_path
173
168
 
174
169
 
@@ -202,9 +197,12 @@ def capture_unhandled_traceback(exc_type, exc_value, exc_traceback):
202
197
  text = _redact(text)
203
198
  with open(trace_path, 'w') as f:
204
199
  f.write(text)
205
- print("An error occurred. A traceback was saved to {}".format(trace_path))
200
+ print("An error occurred. A traceback was saved to {}".format(trace_path))
206
201
  except Exception:
207
- pass
202
+ try:
203
+ mc_log('Failed to capture traceback to file', level='WARNING')
204
+ except Exception:
205
+ pass
208
206
 
209
207
  def submit_support_bundle_email(zip_path=None, include_traceback=True):
210
208
  if not zip_path:
@@ -213,16 +211,22 @@ def submit_support_bundle_email(zip_path=None, include_traceback=True):
213
211
  mc_log("Failed to create bundle.", level="ERROR")
214
212
  return False
215
213
  bundle_size = os.path.getsize(zip_path)
216
- if bundle_size > 1572864:
217
- mc_log("Bundle too large ({} bytes) - discarding.".format(bundle_size), level="WARNING")
218
- os.remove(zip_path)
219
- return False
220
214
  config, _ = load_configuration()
221
215
  email_config = config.get('MediLink_Config', {}).get('error_reporting', {}).get('email', {})
222
- if not email_config.get('enabled', False):
223
- mc_log("Email reporting disabled.", level="INFO")
216
+ # Determine max size from config with default 1.5MB
217
+ try:
218
+ max_bytes = int(email_config.get('max_bundle_bytes', 1572864))
219
+ except Exception:
220
+ max_bytes = 1572864
221
+ if bundle_size > max_bytes:
222
+ mc_log("Bundle too large ({} bytes > {} bytes) - leaving in queue.".format(bundle_size, max_bytes), level="WARNING")
223
+ return False
224
+ # Feature is always available; proceed if recipients and token are available
225
+ # Normalize and validate recipients
226
+ to_emails = _normalize_recipients(email_config.get('to', []))
227
+ if not to_emails:
228
+ mc_log("No valid recipients configured in error_reporting.email.to", level="ERROR")
224
229
  return False
225
- to_emails = email_config.get('to', [])
226
230
  subject_prefix = email_config.get('subject_prefix', 'MediCafe Error Report')
227
231
  access_token = get_access_token()
228
232
  if not access_token:
@@ -245,12 +249,105 @@ def submit_support_bundle_email(zip_path=None, include_traceback=True):
245
249
  resp = requests.post('https://gmail.googleapis.com/gmail/v1/users/me/messages/send', headers=headers, json=data)
246
250
  if resp.status_code == 200:
247
251
  mc_log("Report sent successfully!", level="INFO")
248
- os.remove(zip_path)
252
+ try:
253
+ os.remove(zip_path)
254
+ except Exception:
255
+ pass
249
256
  return True
250
257
  else:
251
- mc_log("Failed to send: {} - {}".format(resp.status_code, resp.text), level="ERROR")
258
+ # Handle auth errors by prompting re-consent using existing OAuth helpers
259
+ if resp.status_code in (401, 403):
260
+ try:
261
+ from MediLink.MediLink_Gmail import get_authorization_url, open_browser_with_executable
262
+ auth_url = get_authorization_url()
263
+ mc_log("Gmail send unauthorized ({}). Opening browser for re-consent.".format(resp.status_code), level="WARNING")
264
+ try:
265
+ print("Your Google session needs to be refreshed to gain gmail.send permission. A browser will open to re-authorize.")
266
+ except Exception:
267
+ pass
268
+ open_browser_with_executable(auth_url)
269
+ except Exception:
270
+ pass
271
+ mc_log("Failed to send: {} - {}".format(resp.status_code, _redact(resp.text)), level="ERROR")
272
+ # Preserve bundle in queue for manual retry
252
273
  return False
253
274
 
275
+
276
+ def _normalize_recipients(to_field):
277
+ try:
278
+ # Flatten to a list of strings
279
+ if isinstance(to_field, str):
280
+ candidates = [p.strip() for p in to_field.split(',')]
281
+ elif isinstance(to_field, list):
282
+ candidates = [str(p).strip() for p in to_field]
283
+ else:
284
+ candidates = []
285
+ # Basic email regex: local@domain.tld
286
+ import re
287
+ email_re = re.compile(r'^[^@\s]+@[^@\s]+\.[^@\s]+$')
288
+ valid = []
289
+ for addr in candidates:
290
+ if not addr:
291
+ continue
292
+ if email_re.match(addr):
293
+ valid.append(addr)
294
+ else:
295
+ try:
296
+ mc_log("Invalid email recipient skipped: {}".format(addr), level="WARNING")
297
+ except Exception:
298
+ pass
299
+ return valid
300
+ except Exception:
301
+ return []
302
+
303
+
304
+ def list_queued_bundles():
305
+ try:
306
+ config, _ = load_configuration()
307
+ medi = config.get('MediLink_Config', {})
308
+ local_storage_path = medi.get('local_storage_path', '.')
309
+ queue_dir = os.path.join(local_storage_path, 'reports_queue')
310
+ if not os.path.isdir(queue_dir):
311
+ return []
312
+ files = [os.path.join(queue_dir, f) for f in os.listdir(queue_dir) if f.endswith('.zip')]
313
+ files.sort()
314
+ return files
315
+ except Exception:
316
+ return []
317
+
318
+
319
+ def submit_all_queued_bundles():
320
+ sent = 0
321
+ failed = 0
322
+ try:
323
+ queued = list_queued_bundles()
324
+ for z in queued:
325
+ try:
326
+ ok = submit_support_bundle_email(zip_path=z, include_traceback=False)
327
+ if ok:
328
+ sent += 1
329
+ else:
330
+ failed += 1
331
+ except Exception:
332
+ failed += 1
333
+ except Exception:
334
+ pass
335
+ return sent, failed
336
+
337
+
338
+ def delete_all_queued_bundles():
339
+ deleted = 0
340
+ try:
341
+ for z in list_queued_bundles():
342
+ try:
343
+ os.remove(z)
344
+ deleted += 1
345
+ except Exception:
346
+ pass
347
+ except Exception:
348
+ pass
349
+ return deleted
350
+
254
351
  def email_error_report_flow():
255
352
  try:
256
353
  sent = submit_support_bundle_email(zip_path=None, include_traceback=True)
@@ -115,11 +115,34 @@ def get_authorization_url():
115
115
  def exchange_code_for_token(auth_code, retries=3):
116
116
  return oauth_exchange_code_for_token(auth_code, CREDENTIALS_PATH, REDIRECT_URI, log, retries=retries)
117
117
 
118
+ def _mask_token_value(value):
119
+ try:
120
+ s = str(value or '')
121
+ if len(s) <= 8:
122
+ return '***'
123
+ return s[:4] + '…' + s[-4:]
124
+ except Exception:
125
+ return '***'
126
+
127
+
128
+ def _mask_token_payload(token_data):
129
+ try:
130
+ if not isinstance(token_data, dict):
131
+ return '{"token":"***"}'
132
+ masked = dict(token_data)
133
+ for k in ('access_token', 'refresh_token', 'id_token'):
134
+ if k in masked:
135
+ masked[k] = _mask_token_value(masked.get(k))
136
+ return masked
137
+ except Exception:
138
+ return '{"token":"***"}'
139
+
140
+
118
141
  def get_access_token():
119
142
  if os.path.exists(TOKEN_PATH):
120
143
  with open(TOKEN_PATH, 'r') as token_file:
121
144
  token_data = json.load(token_file)
122
- log("Loaded token data:\n {}".format(token_data))
145
+ log("Loaded token data (masked):\n {}".format(_mask_token_payload(token_data)))
123
146
  if 'access_token' in token_data and 'expires_in' in token_data:
124
147
  try:
125
148
  token_time = token_data.get('token_time', time.time())
@@ -128,7 +151,7 @@ def get_access_token():
128
151
  log("KeyError while accessing token data: {}".format(e))
129
152
  return None
130
153
  if token_expiry_time > time.time():
131
- log("Access token is still valid. Expires in {} seconds.".format(token_expiry_time - time.time()))
154
+ log("Access token is still valid. Expires in {} seconds.".format(int(token_expiry_time - time.time())))
132
155
  return token_data['access_token']
133
156
  else:
134
157
  log("Access token has expired. Current time: {}, Expiry time: {}".format(time.time(), token_expiry_time))
@@ -137,10 +160,10 @@ def get_access_token():
137
160
  new_token_data['token_time'] = time.time()
138
161
  with open(TOKEN_PATH, 'w') as token_file:
139
162
  json.dump(new_token_data, token_file)
140
- log("Access token refreshed successfully. New token data: {}".format(new_token_data))
163
+ log("Access token refreshed successfully. New token data (masked): {}".format(_mask_token_payload(new_token_data)))
141
164
  return new_token_data['access_token']
142
165
  else:
143
- log("Failed to refresh access token. New token data: {}".format(new_token_data))
166
+ log("Failed to refresh access token. Response (masked): {}".format(_mask_token_payload(new_token_data)))
144
167
  return None
145
168
  log("Access token not found. Please authenticate.")
146
169
  return None
MediLink/MediLink_main.py CHANGED
@@ -23,7 +23,7 @@ if PERFORMANCE_LOGGING:
23
23
  # Now import core utilities after path setup
24
24
  from MediCafe.core_utils import get_shared_config_loader, setup_module_paths, extract_medilink_config
25
25
  from MediCafe.error_reporter import collect_support_bundle, capture_unhandled_traceback
26
- from MediCafe.error_reporter import submit_support_bundle_email
26
+ from MediCafe.error_reporter import submit_support_bundle_email, list_queued_bundles, submit_all_queued_bundles, delete_all_queued_bundles
27
27
  setup_module_paths(__file__)
28
28
 
29
29
  # Import modules after path setup
@@ -74,6 +74,7 @@ def _tools_menu(config, medi):
74
74
  options = [
75
75
  "Rebuild submission index now",
76
76
  "Submit Error Report (email)",
77
+ "Resolve Queued Error Reports",
77
78
  "Back"
78
79
  ]
79
80
  MediLink_UI.display_menu(options)
@@ -113,6 +114,18 @@ def _tools_menu(config, medi):
113
114
  except Exception as e:
114
115
  print("Error during email report submission: {}".format(e))
115
116
  elif choice == '3':
117
+ try:
118
+ queued = list_queued_bundles()
119
+ if not queued:
120
+ print("No queued bundles found.")
121
+ else:
122
+ print("Found {} queued bundle(s).".format(len(queued)))
123
+ print("Attempting to send now...")
124
+ sent, failed = submit_all_queued_bundles()
125
+ print("Queued send complete. Sent: {} Failed: {}".format(sent, failed))
126
+ except Exception as e:
127
+ print("Error while processing queued bundles: {}".format(e))
128
+ elif choice == '4':
116
129
  break
117
130
  else:
118
131
  MediLink_UI.display_invalid_choice()
@@ -502,21 +515,36 @@ if __name__ == "__main__":
502
515
  online = check_internet_connection()
503
516
  if online:
504
517
  success = submit_support_bundle_email(zip_path)
505
- if not success:
506
- print("Send failed - bundle discarded.")
518
+ if success:
519
+ # On success, remove the bundle
520
+ try:
521
+ os.remove(zip_path)
522
+ except Exception:
523
+ pass
524
+ else:
525
+ # Preserve bundle for manual retry
526
+ print("Send failed - bundle preserved at {} for retry.".format(zip_path))
507
527
  else:
508
528
  ans = input("Offline. Connect to internet, then press Y to retry or N to discard: ").strip().lower()
509
529
  if ans == 'y':
510
530
  online = check_internet_connection()
511
531
  if online:
512
532
  success = submit_support_bundle_email(zip_path)
513
- if not success:
514
- print("Send failed - bundle discarded.")
533
+ if success:
534
+ try:
535
+ os.remove(zip_path)
536
+ except Exception:
537
+ pass
538
+ else:
539
+ print("Send failed - bundle preserved at {} for retry.".format(zip_path))
515
540
  else:
516
- print("Still offline - discarding.")
541
+ print("Still offline - preserving bundle at {} for retry.".format(zip_path))
517
542
  else:
518
- print("Discarding.")
519
- os.remove(zip_path) if os.path.exists(zip_path) else None
543
+ print("Discarding bundle at user request.")
544
+ try:
545
+ os.remove(zip_path)
546
+ except Exception:
547
+ pass
520
548
  exit_code = 1
521
549
  finally:
522
550
  if exit_code == 0 and PERFORMANCE_LOGGING:
MediLink/__init__.py CHANGED
@@ -22,7 +22,7 @@ Smart Import Integration:
22
22
  datamgmt = get_components('medilink_datamgmt')
23
23
  """
24
24
 
25
- __version__ = "0.251026.0"
25
+ __version__ = "0.251027.0"
26
26
  __author__ = "Daniel Vidaud"
27
27
  __email__ = "daniel@personalizedtransformation.com"
28
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: medicafe
3
- Version: 0.251026.0
3
+ Version: 0.251027.0
4
4
  Summary: MediCafe
5
5
  Home-page: https://github.com/katanada2/MediCafe
6
6
  Author: Daniel Vidaud
@@ -12,7 +12,7 @@ MediBot/MediBot_dataformat_library.py,sha256=D46fdPtxcgfWTzaLBtSvjtozzZBNqNiODgu
12
12
  MediBot/MediBot_debug.bat,sha256=F5Lfi3nFEEo4Ddx9EbX94u3fNAMgzMp3wsn-ULyASTM,6017
13
13
  MediBot/MediBot_docx_decoder.py,sha256=9BSjV-kB90VHnqfL_5iX4zl5u0HcHvHuL7YNfx3gXpQ,33143
14
14
  MediBot/MediBot_smart_import.py,sha256=Emvz7NwemHGCHvG5kZcUyXMcCheidbGKaPfOTg-YCEs,6684
15
- MediBot/__init__.py,sha256=n9eH1i-SUxoIZz_mxReofqPsZKeOCtWKIIL8cd9XbSg,3192
15
+ MediBot/__init__.py,sha256=-jRkSW8hwPcsIRgIbVZXszXOveBY6yd98PLefrUquLI,3192
16
16
  MediBot/clear_cache.bat,sha256=F6-VhETWw6xDdGWG2wUqvtXjCl3lY4sSUFqF90bM8-8,1860
17
17
  MediBot/crash_diagnostic.bat,sha256=j8kUtyBg6NOWbXpeFuEqIRHOkVzgUrLOqO3FBMfNxTo,9268
18
18
  MediBot/f_drive_diagnostic.bat,sha256=4572hZaiwZ5wVAarPcZJQxkOSTwAdDuT_X914noARak,6878
@@ -22,14 +22,14 @@ MediBot/process_csvs.bat,sha256=3tI7h1z9eRj8rUUL4wJ7dy-Qrak20lRmpAPtGbUMbVQ,3489
22
22
  MediBot/update_json.py,sha256=vvUF4mKCuaVly8MmoadDO59M231fCIInc0KI1EtDtPA,3704
23
23
  MediBot/update_medicafe.py,sha256=G1lyvVOHYuho1d-TJQNN6qaB4HBWaJ2PpXqemBoPlRQ,17937
24
24
  MediCafe/MediLink_ConfigLoader.py,sha256=5AWsiy99WFcESXkzKbftT5afAoMygmb5-d0bER9TZSU,11419
25
- MediCafe/__init__.py,sha256=_Eh2UabfrQ1hrTeW1LQA7ovRn13NBmR7jzzSmQwIK9c,5721
25
+ MediCafe/__init__.py,sha256=Y8OIiSNkXxugmC4qzCGqUfVhAoBqDaPQKWObOxOLkQQ,5721
26
26
  MediCafe/__main__.py,sha256=mRNyk3D9Ilnu2XhgVI_rut7r5Ro7UIKtwV871giAHI8,12992
27
27
  MediCafe/api_core.py,sha256=wLAdRNZdmovKReXvzsmAgKrbYon4-wbJbGCyOm_C3AU,89896
28
28
  MediCafe/api_factory.py,sha256=I5AeJoyu6m7oCrjc2OvVvO_4KSBRutTsR1riiWhTZV0,12086
29
29
  MediCafe/api_utils.py,sha256=KWQB0q1k5E6frOFFlKWcFpHNcqfrS7KJ_82672wbupw,14041
30
30
  MediCafe/core_utils.py,sha256=XKUpyv7yKjIQ8iNrhD76PIURyt6GZxb98v0daiI7aaw,27303
31
31
  MediCafe/deductible_utils.py,sha256=-ixDYwI3JNAyACrFjKqoX_hD3Awzownq441U0PSrwXw,64932
32
- MediCafe/error_reporter.py,sha256=TfRih7pOiopLoYKf--20-Q3q_FCFGEvUw85k3QmlzZ4,8413
32
+ MediCafe/error_reporter.py,sha256=mKC6zbQN0rJHO91ASgrVgHHTCaUOFmCPisbwJiyn8gc,12296
33
33
  MediCafe/graphql_utils.py,sha256=jo4CboMb9i5_qD0jkfrLbL87_Q3aFiwOntZhjF9fMsI,51928
34
34
  MediCafe/logging_config.py,sha256=auT65LN5oDEXVhkMeLke63kJHTWxYf2o8YihAfQFgzU,5493
35
35
  MediCafe/logging_demo.py,sha256=TwUhzafna5pMdN3zSKGrpUWRqX96F1JGGsSUtr3dygs,1975
@@ -51,7 +51,7 @@ MediLink/MediLink_Deductible.py,sha256=opGa5YQ6tfowurlf8xDWRtAtQMmoNYout0gYe3R5f
51
51
  MediLink/MediLink_Deductible_Validator.py,sha256=x6tHJOi88TblUpDPSH6QhIdXXRgr3rXI7kYPVGZYCgU,24998
52
52
  MediLink/MediLink_Display_Utils.py,sha256=MonsX6VPbdvqwY_V8sHUYrXCS0fMKc4toJvG0oyr-V4,24872
53
53
  MediLink/MediLink_Down.py,sha256=s4_z-RaqHYanjwbQCl-OSkg4XIpcIQ2Q6jXa8-q_QXw,28111
54
- MediLink/MediLink_Gmail.py,sha256=zJI-pD9cfOhI7M3jJMQ6rrwnzT5wWmSMrI9DcvtXjNw,28688
54
+ MediLink/MediLink_Gmail.py,sha256=jS1mbqhndJ8emhMshd1qeOegF6k_3V_YeCGUNerqdqA,29394
55
55
  MediLink/MediLink_Mailer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  MediLink/MediLink_Parser.py,sha256=eRVZ4ckZ5gDOrcvtCUZP3DOd3Djly66rCIk0aYXLz14,12567
57
57
  MediLink/MediLink_PatientProcessor.py,sha256=9r2w4p45d30Tn0kbXL3j5574MYOehP83tDirNOw_Aek,19977
@@ -60,18 +60,18 @@ MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEM
60
60
  MediLink/MediLink_UI.py,sha256=ZEJ14EGh7pDu1XjAdORDFiay4UtTsLNWwNSJ0prHFWg,10381
61
61
  MediLink/MediLink_Up.py,sha256=rzhzmWa4F_el37bDlSauFl_08m-dWz2xiflf-vVRkwg,38453
62
62
  MediLink/MediLink_insurance_utils.py,sha256=g741Fj2K26cMy0JX5d_XavMw9LgkK6hjaUJYfysT7t8,9301
63
- MediLink/MediLink_main.py,sha256=bKCV_EDwc3DxQPFp5p0Lwy_cGXM3pexIA0HUhyAAtzw,25342
63
+ MediLink/MediLink_main.py,sha256=1nmDtbJ9IfPwLnFhCZvDtBPSG_8gzj6LneuoV60l4IQ,26736
64
64
  MediLink/MediLink_smart_import.py,sha256=ZUXvAkIA2Pk2uuyLZazKfKK8YGdkZt1VAeZo_ZSUyxk,9942
65
65
  MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
66
- MediLink/__init__.py,sha256=AzRCYizAUAcX8EnSBzpU8dWGLewh3sx-S1ooKPtowGc,3888
66
+ MediLink/__init__.py,sha256=B5c6Br7N8Atuqt1JytB7vQCaH3YvoY63wxLmL_I7Hgs,3888
67
67
  MediLink/gmail_http_utils.py,sha256=mYChIhkbA1oJaAJA-nY3XgHQY-H7zvZJUZPhUagomsI,4047
68
68
  MediLink/gmail_oauth_utils.py,sha256=Ugr-DEqs4_RddRMSCJ_dbgA3TVeaxpbAor-dktcTIgY,3713
69
69
  MediLink/openssl.cnf,sha256=76VdcGCykf0Typyiv8Wd1mMVKixrQ5RraG6HnfKFqTo,887
70
70
  MediLink/test.py,sha256=DM_E8gEbhbVfTAm3wTMiNnK2GCD1e5eH6gwTk89QIc4,3116
71
71
  MediLink/webapp.html,sha256=DwDYjVvluGJ7eDdvEogfKN4t24ZJRoIUuSBfCYCL-3w,21252
72
- medicafe-0.251026.0.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
73
- medicafe-0.251026.0.dist-info/METADATA,sha256=_UOU1GmZO36NbpKgD7pwHoqyKolvBmDRgnj3FHQdLgo,3414
74
- medicafe-0.251026.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
75
- medicafe-0.251026.0.dist-info/entry_points.txt,sha256=m3RBUBjr-xRwEkKJ5W4a7NlqHZP_1rllGtjZnrRqKe8,52
76
- medicafe-0.251026.0.dist-info/top_level.txt,sha256=U6-WBJ9RCEjyIs0BlzbQq_PwedCp_IV9n1616NNV5zA,26
77
- medicafe-0.251026.0.dist-info/RECORD,,
72
+ medicafe-0.251027.0.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
73
+ medicafe-0.251027.0.dist-info/METADATA,sha256=tiejqiQylg170c66T_tZWiIpdwt93jEHpzIe5ppzoZA,3414
74
+ medicafe-0.251027.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
75
+ medicafe-0.251027.0.dist-info/entry_points.txt,sha256=m3RBUBjr-xRwEkKJ5W4a7NlqHZP_1rllGtjZnrRqKe8,52
76
+ medicafe-0.251027.0.dist-info/top_level.txt,sha256=U6-WBJ9RCEjyIs0BlzbQq_PwedCp_IV9n1616NNV5zA,26
77
+ medicafe-0.251027.0.dist-info/RECORD,,