q2rad 0.1.221__py3-none-any.whl → 0.1.223__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 q2rad might be problematic. Click here for more details.

q2rad/q2actions.py CHANGED
@@ -139,6 +139,7 @@ class Q2Actions(Q2Form, Q2_save_and_run):
139
139
  self.add_control("/t", _("Comment"))
140
140
  self.add_control("comment", gridlabel=_("Comments"), datatype="longtext", control="longtext")
141
141
  self.add_control("/")
142
+ self.add_control("q2_time", "Time", datatype="int", noform=1, alignment=7)
142
143
  self._add_save_and_run()
143
144
  self._add_save_and_run_visible()
144
145
 
q2rad/q2appmanager.py CHANGED
@@ -448,7 +448,8 @@ class AppManager(Q2Form):
448
448
  return rez
449
449
 
450
450
  def import_q2market(self):
451
- self.q2_app.check_app_update(force_update=True)
451
+ if self.q2_app.check_app_update(force_update=True):
452
+ self.q2_app.open_selected_app()
452
453
 
453
454
  def import_app(self, file=""):
454
455
  filetype = "JSON(*.json)"
q2rad/q2extensions.py CHANGED
@@ -160,7 +160,8 @@ class Q2Extensions(Q2Form):
160
160
  def import_q2market(self):
161
161
  q2market_url = self.r.q2market_url if self.r.q2market_url else self.q2_app.q2market_url
162
162
  if q2market_url:
163
- q2app.q2_app.check_ext_update(self.r.prefix, force_update=True)
163
+ if q2app.q2_app.check_ext_update(self.r.prefix, force_update=True):
164
+ q2app.q2_app.open_selected_app()
164
165
  else:
165
166
  q2Mess("No App URL!")
166
167
 
q2rad/q2forms.py CHANGED
@@ -250,6 +250,7 @@ class Q2Forms(Q2Form, Q2_save_and_run):
250
250
  control="code",
251
251
  )
252
252
  self.add_control("/")
253
+ self.add_control("q2_time", "Time", datatype="int", noform=1, alignment=7)
253
254
  self._add_save_and_run()
254
255
  self._add_save_and_run_visible()
255
256
 
q2rad/q2lines.py CHANGED
@@ -286,6 +286,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
286
286
  datatype="longtext",
287
287
  )
288
288
  self.add_control("/")
289
+ self.add_control("q2_time", "Time", datatype="int", noform=1, alignment=7)
289
290
  self._add_save_and_run()
290
291
  self._add_save_and_run_visible()
291
292
 
@@ -300,7 +301,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
300
301
  record = self.get_current_record()
301
302
  record["table"] = self.db.get("forms", f"name = '{self.prev_form.r.name}'", "form_table")
302
303
  if not q2app.q2_app.db_data.alter_column(record):
303
- q2mess(self.db_data.migrate_error_list)
304
+ q2mess(self.q2_app.db_data.migrate_error_list)
304
305
 
305
306
  def copy_to(self):
306
307
  rows = self.get_grid_selected_rows()
q2rad/q2modules.py CHANGED
@@ -56,7 +56,8 @@ class Q2Modules(Q2Form, Q2_save_and_run):
56
56
  self.add_control("/t", "Comment")
57
57
  self.add_control("comment", _("Comment"), control="text", dattype="text")
58
58
 
59
- self.add_control("last_line", "Last line", datatype="int", noform=1, migrate=1)
59
+ self.add_control("last_line", "Last line", datatype="int", noform=1, migrate=1, nogrid=1)
60
+ self.add_control("q2_time", "Time", datatype="int", noform=1, alignment=7)
60
61
  self.add_control("/")
61
62
 
62
63
  cursor: Q2Cursor = self.q2_app.db_logic.table(table_name="modules", order="name")
q2rad/q2queries.py CHANGED
@@ -63,6 +63,7 @@ class Q2Queries(Q2Form, Q2_save_and_run):
63
63
  # readonly=1,
64
64
  )
65
65
  self.add_control("comment", _("Comment"), datatype="longtext", noform=1)
66
+ self.add_control("q2_time", "Time", datatype="int", noform=1, alignment=7)
66
67
  self._add_save_and_run(save_only=True)
67
68
  self._add_save_and_run_visible(save_only=True)
68
69
 
q2rad/q2rad.py CHANGED
@@ -323,8 +323,8 @@ class Q2RadApp(Q2App):
323
323
  Q2AppSelect().run(autoload_enabled)
324
324
  if self.selected_application != {}:
325
325
  self.open_selected_app(True, migrate_db_data=False)
326
- self.check_app_update()
327
- self.check_ext_update()
326
+ if self.check_app_update() or self.check_ext_update():
327
+ self.open_selected_app()
328
328
  self.on_new_tab()
329
329
  else:
330
330
  self.close()
@@ -425,6 +425,16 @@ class Q2RadApp(Q2App):
425
425
  data_schema.add(**x)
426
426
  db_logic.set_schema(data_schema)
427
427
 
428
+ data_schema = Q2DbSchema()
429
+ for form in (
430
+ Q2Constants(),
431
+ Q2Extensions(),
432
+ ):
433
+ for x in form.get_table_schema():
434
+ data_schema.add(**x)
435
+
436
+ self.db_data.set_schema(data_schema)
437
+
428
438
  def get_autocompletition_list(self):
429
439
  rez = []
430
440
  tables = self.db_data.db_schema.get_schema_tables()
@@ -558,9 +568,11 @@ class Q2RadApp(Q2App):
558
568
  if self.dev_mode:
559
569
  self.add_menu("Dev|Forms", self.run_forms)
560
570
  self.add_menu("Dev|Modules", self.run_modules)
561
- self.add_menu("Dev|Querys", self.run_queries)
571
+ self.add_menu("Dev|Queries", self.run_queries)
562
572
  self.add_menu("Dev|Reports", self.run_reports)
563
573
  self.add_menu("Dev|Packages", self.run_packages)
574
+ self.add_menu("Dev|-")
575
+ self.add_menu("Dev|Finder", self.run_finder)
564
576
  if not self.frozen:
565
577
  self.add_menu("Dev|-")
566
578
  self.add_menu("Dev|Make binary", self.make_binary)
@@ -912,7 +924,7 @@ class Q2RadApp(Q2App):
912
924
  except Exception as e: # noqa F841
913
925
  self.show_statusbar_mess("An error occurred while checking for updates")
914
926
  return
915
- if force_update or market_version and market_version != self.app_version:
927
+ if force_update or (market_version and market_version > self.app_version):
916
928
  if force_update:
917
929
  update_detected = f"You are about to rewrite current App <b>{self.app_title}</b>!"
918
930
  else:
@@ -928,7 +940,8 @@ class Q2RadApp(Q2App):
928
940
  ):
929
941
  data = json.load(open_url(self.app_url + ".json")) # noqa F405
930
942
  AppManager.import_json_app(data)
931
- self.open_selected_app()
943
+ # self.open_selected_app()
944
+ return True
932
945
 
933
946
  def check_ext_update(self, prefix="", force_update=False, _ext_url=""):
934
947
  if self.frozen:
@@ -937,6 +950,7 @@ class Q2RadApp(Q2App):
937
950
  cu = q2cursor(f"select * from extensions where prefix='{prefix}'")
938
951
  else:
939
952
  cu = q2cursor(f"select * from extensions where checkupdates<>'' order by seq")
953
+ updated = None
940
954
  for row in cu.records():
941
955
  _prefix = row["prefix"]
942
956
 
@@ -953,8 +967,8 @@ class Q2RadApp(Q2App):
953
967
  market_version = read_url(ext_url + ".version").decode("utf-8") # noqa F405
954
968
  except Exception as e: # noqa F841
955
969
  self.show_statusbar_mess("An error occurred while checking for updates")
956
- return
957
- if force_update or market_version and market_version != ext_version:
970
+ continue
971
+ if force_update or (market_version and market_version > ext_version):
958
972
  if force_update:
959
973
  update_detected = (
960
974
  f"You are about to rewrite current Extension ({_prefix}) <b>{self.app_title}</b>!"
@@ -974,8 +988,10 @@ class Q2RadApp(Q2App):
974
988
  ):
975
989
  data = json.load(open_url(ext_url + ".json")) # noqa F405
976
990
  AppManager.import_json_app(data, prefix=_prefix)
977
- update("extensions", {"prefix":row["prefix"], "version":market_version})
978
- self.open_selected_app()
991
+ update("extensions", {"prefix": row["prefix"], "version": market_version})
992
+ updated = True
993
+ # self.open_selected_app()
994
+ return updated
979
995
 
980
996
  def update_app_packages(self):
981
997
  if self.frozen:
@@ -1115,6 +1131,77 @@ class Q2RadApp(Q2App):
1115
1131
  def run_extensions(self):
1116
1132
  Q2Extensions().run()
1117
1133
 
1134
+ def run_finder(self):
1135
+ class Q2Finder:
1136
+ def __init__(self, find_string):
1137
+ self.find_string = find_string
1138
+
1139
+ def get_columns_sql(self, table):
1140
+ return "select {{}} from {} where concat({}) like".format(
1141
+ table,
1142
+ ", ".join([f"`{x}`" for x in q2app.q2_app.db_logic.get_database_columns(table).keys()]),
1143
+ )
1144
+
1145
+ def show_lines(self, table="lines"):
1146
+ sql = self.get_columns_sql(table).format("id") + " '%{}%'".format(self.find_string)
1147
+ where = "id in ({})".format(
1148
+ ", ".join([x["id"] for x in q2cursor(sql, q2app.q2_app.db_logic).records()])
1149
+ )
1150
+ {"actions": Q2Actions, "lines": Q2Lines}[table]().run(where=where)
1151
+
1152
+ def show_other(self, table):
1153
+ sql = self.get_columns_sql(table).format("name") + " '%{}%'".format(self.find_string)
1154
+ where = "name in ({})".format(
1155
+ ", ".join(['"' + x["name"] + '"' for x in q2cursor(sql, q2app.q2_app.db_logic).records()])
1156
+ )
1157
+ {"forms": Q2Forms, "reports": Q2Reports, "modules": Q2Modules, "queries": Q2Queries}[
1158
+ table
1159
+ ]().run(where=where)
1160
+
1161
+ finder = Q2Form("Finder")
1162
+
1163
+ finder.add_control("find_string", "Find string", datalen=150)
1164
+ finder.add_control("/")
1165
+ finder.add_control("/h", "in")
1166
+ finder.add_control(
1167
+ "button",
1168
+ "Forms",
1169
+ control="button",
1170
+ valid=lambda: Q2Finder(finder.s.find_string).show_other("forms"),
1171
+ )
1172
+ finder.add_control(
1173
+ "button",
1174
+ "Lines",
1175
+ control="button",
1176
+ valid=lambda: Q2Finder(finder.s.find_string).show_lines("lines"),
1177
+ )
1178
+ finder.add_control(
1179
+ "button",
1180
+ "Actions",
1181
+ control="button",
1182
+ valid=lambda: Q2Finder(finder.s.find_string).show_lines("actions"),
1183
+ )
1184
+ finder.add_control(
1185
+ "button",
1186
+ "Modules",
1187
+ control="button",
1188
+ valid=lambda: Q2Finder(finder.s.find_string).show_other("modules"),
1189
+ )
1190
+ finder.add_control(
1191
+ "button",
1192
+ "Queries",
1193
+ control="button",
1194
+ valid=lambda: Q2Finder(finder.s.find_string).show_other("queries"),
1195
+ )
1196
+ finder.add_control(
1197
+ "button",
1198
+ "Reports",
1199
+ control="button",
1200
+ valid=lambda: Q2Finder(finder.s.find_string).show_other("reports"),
1201
+ )
1202
+ finder.cancel_button = 1
1203
+ finder.run()
1204
+
1118
1205
  def make_binary(self):
1119
1206
  make_binary(self)
1120
1207
 
@@ -1199,12 +1286,12 @@ class Q2RadApp(Q2App):
1199
1286
  form.after_delete = self.code_runner(form_dic["after_delete"], form)
1200
1287
 
1201
1288
  # add controls
1202
- for x in cu.records():
1203
- x["valid"] = self.code_runner(x["valid"], form)
1204
- if x.get("_show"):
1205
- x["show"] = self.code_runner(x["_show"], form)
1206
- x["when"] = self.code_runner(x["_when"], form)
1207
- form.add_control(**x)
1289
+ for control in cu.records():
1290
+ control["valid"] = self.code_runner(control["valid"], form)
1291
+ if control.get("_show"):
1292
+ control["show"] = self.code_runner(control["_show"], form)
1293
+ control["when"] = self.code_runner(control["_when"], form)
1294
+ form.add_control(**control)
1208
1295
  run_module("_e_control", _locals=locals())
1209
1296
 
1210
1297
  # add datasource
@@ -1235,14 +1322,14 @@ class Q2RadApp(Q2App):
1235
1322
  ext_select = ""
1236
1323
  sql = f"select * from (select * from actions where name = '{name}' order by seq ) qq {ext_select}"
1237
1324
  cu = q2cursor(sql, self.db_logic)
1238
- for x in cu.records():
1239
- if x["action_mode"] == "1":
1325
+ for action in cu.records():
1326
+ if action["action_mode"] == "1":
1240
1327
  form.add_action("/crud")
1241
- elif x["action_mode"] == "3":
1328
+ elif action["action_mode"] == "3":
1242
1329
  form.add_action("-")
1243
1330
  else:
1244
- if x["child_form"] and x["child_where"]:
1245
- child_form_name = x["child_form"]
1331
+ if action["child_form"] and action["child_where"]:
1332
+ child_form_name = action["child_form"]
1246
1333
 
1247
1334
  def get_action_form(child_form_name):
1248
1335
  def worker():
@@ -1251,29 +1338,33 @@ class Q2RadApp(Q2App):
1251
1338
  return worker
1252
1339
 
1253
1340
  form.add_action(
1254
- x["action_text"],
1255
- self.code_runner(x["action_worker"]) if x["action_worker"] else None,
1341
+ action["action_text"],
1342
+ self.code_runner(action["action_worker"]) if action["action_worker"] else None,
1256
1343
  child_form=get_action_form(child_form_name),
1257
- child_where=x["child_where"],
1258
- hotkey=x["action_key"],
1259
- mess=x["action_mess"],
1260
- icon=x["action_icon"],
1261
- tag=x["tag"],
1262
- child_noshow=x["child_noshow"],
1263
- child_copy_mode=x["child_copy_mode"],
1344
+ child_where=action["child_where"],
1345
+ hotkey=action["action_key"],
1346
+ mess=action["action_mess"],
1347
+ icon=action["action_icon"],
1348
+ tag=action["tag"],
1349
+ child_noshow=action["child_noshow"],
1350
+ child_copy_mode=action["child_copy_mode"],
1264
1351
  eof_disabled=1,
1265
1352
  )
1266
1353
  else:
1267
1354
  form.add_action(
1268
- x["action_text"],
1269
- self.code_runner(x["action_worker"], form=form) if x["action_worker"] else None,
1270
- hotkey=x["action_key"],
1271
- icon=x["action_icon"],
1272
- mess=x["action_mess"],
1273
- tag=x["tag"],
1274
- child_noshow=x["child_noshow"],
1275
- child_copy_mode=x["child_copy_mode"],
1276
- eof_disabled=x["eof_disabled"],
1355
+ action["action_text"],
1356
+ (
1357
+ self.code_runner(action["action_worker"], form=form)
1358
+ if action["action_worker"]
1359
+ else None
1360
+ ),
1361
+ hotkey=action["action_key"],
1362
+ icon=action["action_icon"],
1363
+ mess=action["action_mess"],
1364
+ tag=action["tag"],
1365
+ child_noshow=action["child_noshow"],
1366
+ child_copy_mode=action["child_copy_mode"],
1367
+ eof_disabled=action["eof_disabled"],
1277
1368
  )
1278
1369
  run_module("_e_action", _locals=locals())
1279
1370
  return form
q2rad/q2reports.py CHANGED
@@ -241,6 +241,7 @@ class Q2Reports(Q2Form, Q2_save_and_run):
241
241
  noform=1,
242
242
  )
243
243
  self.add_control("comment", _("Comment"), datatype="text", noform=1)
244
+ self.add_control("q2_time", "Time", datatype="int", noform=1, alignment=7)
244
245
  self._add_save_and_run(save_only=True)
245
246
  self._add_save_and_run_visible(save_only=True)
246
247
 
q2rad/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.221"
1
+ __version__ = "0.1.223"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: q2rad
3
- Version: 0.1.221
3
+ Version: 0.1.223
4
4
  Summary: RAD - database, GUI, reports
5
5
  Author: Andrei Puchko
6
6
  Author-email: andrei.puchko@gmx.de
@@ -0,0 +1,25 @@
1
+ q2rad/__init__.py,sha256=Y0Up-UTXOmCYC9llNmTF10CpDDgF2kv10pyHT3-YwmQ,183
2
+ q2rad/__main__.py,sha256=zP4JARM-FzFHM-vWLehx7c5N4v4m_F-TuMobCdFzr4Q,824
3
+ q2rad/q2actions.py,sha256=sZftIHXmrVRnmkHVA51foSyAel9ziIa82rAZq03OPh4,8342
4
+ q2rad/q2appmanager.py,sha256=8btKbT_NGBlNxscINVQnpdkLZ032OuvnFeYbXda4Xnw,20616
5
+ q2rad/q2appselector.py,sha256=bjl4MDg9DoU1h6NZOQDElaIGURjVQwiHnsUwr3kp3nc,18813
6
+ q2rad/q2constants.py,sha256=dQtN4OMvZw0FATDAFYjolI7eGMVUnNnbTl6qM-ggZ4I,3416
7
+ q2rad/q2extensions.py,sha256=ZAY2gXKjun666PeYfnqGH0X17ZmTgaOMmjCvxAIltJI,7595
8
+ q2rad/q2forms.py,sha256=U19O_zgLrIk0IXCEzscHhQTSIbgW8XS3ftO2ktEHJvo,11206
9
+ q2rad/q2lines.py,sha256=wm6U_WM2K3C9TLI8971_IYcjtUghlBUdIliMAhEESt0,19276
10
+ q2rad/q2make.py,sha256=wXoyBUwf2zaAl9JjWDCbjAteUElRq0O7ippyaMY9eug,6476
11
+ q2rad/q2market.py,sha256=RNXTNv-fFUgbzBGhHPNXlzGjsAHAtz71BRbTErJarNo,2641
12
+ q2rad/q2modules.py,sha256=RwemVJwfxth0lBN4K96tKz62VOW71C7CmmKyhIoH5mc,4632
13
+ q2rad/q2packages.py,sha256=y72L1RAw1OgtKGaL8lJ1KHIaers5I6kTZSiphwwrY0M,3808
14
+ q2rad/q2queries.py,sha256=YYJEpC_0rXAV8W_lx2604yqnkooHzheFmDCfqbW02zY,13203
15
+ q2rad/q2rad.py,sha256=ObbJUrt_-3Tqu5hrMxY7GXlvkM7FBX8g6TlKBs7IGTo,55887
16
+ q2rad/q2raddb.py,sha256=tMX971d_awTwiWeYLkZGSfdrIs88oiNHBAs2cMFvSbU,4685
17
+ q2rad/q2reports.py,sha256=np_Yfjy7oiQCK9MrFDlD9ojx1dIt6Yg3QqHkJbnjT6w,84886
18
+ q2rad/q2stylesettings.py,sha256=rEJLyLzsffJEXnMbg9bPB3KHLjYfw-49QgrtcYOfGV0,4769
19
+ q2rad/q2utils.py,sha256=Vb5K8Lbb7PzQGDiBEHFrPyDcytVnUSVXy9yIkvWM1Oc,19734
20
+ q2rad/version.py,sha256=1XpZ9ZHWiFjHHBz1xBKwDLpuS3A_Vb_IEKixlVSqME4,23
21
+ q2rad-0.1.223.dist-info/entry_points.txt,sha256=DmsJQE6f3wYuhdN2h6ARYxSe8_d03paeepfGpdVj5rs,42
22
+ q2rad-0.1.223.dist-info/LICENSE,sha256=JRR3LlR18ghhYXT4G2cWgXmnxRvcuVcKlqncWWK4MRY,10347
23
+ q2rad-0.1.223.dist-info/METADATA,sha256=hEnJx6Vf38LEGE1ghZ30FAgSLn7xu29pwoFQTaykDbs,3369
24
+ q2rad-0.1.223.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
25
+ q2rad-0.1.223.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- q2rad/__init__.py,sha256=Y0Up-UTXOmCYC9llNmTF10CpDDgF2kv10pyHT3-YwmQ,183
2
- q2rad/__main__.py,sha256=zP4JARM-FzFHM-vWLehx7c5N4v4m_F-TuMobCdFzr4Q,824
3
- q2rad/q2actions.py,sha256=eExRvOSyLhT_v1XCR-DmLEhQ9g_LRkrlyXnwDCjT0LM,8258
4
- q2rad/q2appmanager.py,sha256=4c1h5I_7f4S7Ef9nDnDQthRqPC-uyK8v8B8zmhdhtr0,20567
5
- q2rad/q2appselector.py,sha256=bjl4MDg9DoU1h6NZOQDElaIGURjVQwiHnsUwr3kp3nc,18813
6
- q2rad/q2constants.py,sha256=dQtN4OMvZw0FATDAFYjolI7eGMVUnNnbTl6qM-ggZ4I,3416
7
- q2rad/q2extensions.py,sha256=iQz8_GlMCm8g9LOR3aP3YSBgi9rD5i1YkuNaxRiTn5g,7541
8
- q2rad/q2forms.py,sha256=e9FrhXjvi9ZmrhRBmnmsHoPxDQJqsanLnsPjY6rjaQI,11122
9
- q2rad/q2lines.py,sha256=hGdEOdUmBdBpfJ4jHBrXR4gLRXCrgn0dlywsH8nbJ6Q,19185
10
- q2rad/q2make.py,sha256=wXoyBUwf2zaAl9JjWDCbjAteUElRq0O7ippyaMY9eug,6476
11
- q2rad/q2market.py,sha256=RNXTNv-fFUgbzBGhHPNXlzGjsAHAtz71BRbTErJarNo,2641
12
- q2rad/q2modules.py,sha256=SpDdXJPG6IcVz1u3xnLoynA2rmiODCNZTZJT8s5iTRI,4538
13
- q2rad/q2packages.py,sha256=y72L1RAw1OgtKGaL8lJ1KHIaers5I6kTZSiphwwrY0M,3808
14
- q2rad/q2queries.py,sha256=l9SJ_T5Y38p23xa505EPZocCEmFw_a2y4ck0_-AHVP0,13119
15
- q2rad/q2rad.py,sha256=5IfUu4VHhqVuygem5ZwWFdj1WL_1VyXSKLngaVtbxbo,52313
16
- q2rad/q2raddb.py,sha256=tMX971d_awTwiWeYLkZGSfdrIs88oiNHBAs2cMFvSbU,4685
17
- q2rad/q2reports.py,sha256=1fewf1Zlz98raqTIWlRLIg-zTCYA2flGVqyIC120UEU,84802
18
- q2rad/q2stylesettings.py,sha256=rEJLyLzsffJEXnMbg9bPB3KHLjYfw-49QgrtcYOfGV0,4769
19
- q2rad/q2utils.py,sha256=Vb5K8Lbb7PzQGDiBEHFrPyDcytVnUSVXy9yIkvWM1Oc,19734
20
- q2rad/version.py,sha256=cAD9mqAwq0S1-BMh3hvd-bOW2U1IH16XAr4cwraQU60,23
21
- q2rad-0.1.221.dist-info/entry_points.txt,sha256=DmsJQE6f3wYuhdN2h6ARYxSe8_d03paeepfGpdVj5rs,42
22
- q2rad-0.1.221.dist-info/LICENSE,sha256=JRR3LlR18ghhYXT4G2cWgXmnxRvcuVcKlqncWWK4MRY,10347
23
- q2rad-0.1.221.dist-info/METADATA,sha256=_pCl1FLf9OSMdKqMC6eH-8wYEg1xpviYD4I-bfGrXso,3369
24
- q2rad-0.1.221.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
25
- q2rad-0.1.221.dist-info/RECORD,,