flwr-nightly 1.23.0.dev20251006__py3-none-any.whl → 1.23.0.dev20251008__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.
Files changed (37) hide show
  1. flwr/cli/auth_plugin/__init__.py +7 -3
  2. flwr/cli/log.py +2 -2
  3. flwr/cli/login/login.py +4 -13
  4. flwr/cli/ls.py +2 -2
  5. flwr/cli/pull.py +2 -2
  6. flwr/cli/run/run.py +2 -2
  7. flwr/cli/stop.py +2 -2
  8. flwr/cli/supernode/ls.py +2 -2
  9. flwr/cli/utils.py +28 -44
  10. flwr/client/grpc_rere_client/connection.py +6 -6
  11. flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +3 -6
  12. flwr/client/mod/secure_aggregation/secaggplus_mod.py +7 -5
  13. flwr/client/rest_client/connection.py +7 -1
  14. flwr/common/constant.py +10 -0
  15. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
  16. flwr/proto/fleet_pb2.py +22 -22
  17. flwr/proto/fleet_pb2.pyi +4 -1
  18. flwr/proto/node_pb2.py +1 -1
  19. flwr/server/app.py +33 -34
  20. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +8 -4
  21. flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +19 -41
  22. flwr/server/superlink/fleet/message_handler/message_handler.py +1 -1
  23. flwr/server/superlink/fleet/vce/vce_api.py +7 -1
  24. flwr/server/superlink/linkstate/in_memory_linkstate.py +39 -27
  25. flwr/server/superlink/linkstate/linkstate.py +1 -1
  26. flwr/server/superlink/linkstate/sqlite_linkstate.py +37 -21
  27. flwr/server/utils/validator.py +2 -3
  28. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +4 -2
  29. flwr/supercore/primitives/__init__.py +15 -0
  30. flwr/supercore/primitives/asymmetric.py +109 -0
  31. flwr/superlink/auth_plugin/__init__.py +29 -0
  32. flwr/superlink/servicer/control/control_grpc.py +9 -7
  33. flwr/superlink/servicer/control/control_servicer.py +34 -46
  34. {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/METADATA +1 -1
  35. {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/RECORD +37 -35
  36. {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/WHEEL +0 -0
  37. {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,15 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Cryptographic primitives for the Flower infrastructure."""
@@ -0,0 +1,109 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Asymmetric cryptography utilities."""
16
+
17
+
18
+ from typing import cast
19
+
20
+ from cryptography.exceptions import InvalidSignature
21
+ from cryptography.hazmat.primitives import hashes, serialization
22
+ from cryptography.hazmat.primitives.asymmetric import ec
23
+
24
+
25
+ def generate_key_pairs() -> (
26
+ tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
27
+ ):
28
+ """Generate private and public key pairs with Cryptography."""
29
+ private_key = ec.generate_private_key(ec.SECP384R1())
30
+ public_key = private_key.public_key()
31
+ return private_key, public_key
32
+
33
+
34
+ def private_key_to_bytes(private_key: ec.EllipticCurvePrivateKey) -> bytes:
35
+ """Serialize private key to bytes."""
36
+ return private_key.private_bytes(
37
+ encoding=serialization.Encoding.PEM,
38
+ format=serialization.PrivateFormat.PKCS8,
39
+ encryption_algorithm=serialization.NoEncryption(),
40
+ )
41
+
42
+
43
+ def bytes_to_private_key(private_key_bytes: bytes) -> ec.EllipticCurvePrivateKey:
44
+ """Deserialize private key from bytes."""
45
+ return cast(
46
+ ec.EllipticCurvePrivateKey,
47
+ serialization.load_pem_private_key(data=private_key_bytes, password=None),
48
+ )
49
+
50
+
51
+ def public_key_to_bytes(public_key: ec.EllipticCurvePublicKey) -> bytes:
52
+ """Serialize public key to bytes."""
53
+ return public_key.public_bytes(
54
+ encoding=serialization.Encoding.PEM,
55
+ format=serialization.PublicFormat.SubjectPublicKeyInfo,
56
+ )
57
+
58
+
59
+ def bytes_to_public_key(public_key_bytes: bytes) -> ec.EllipticCurvePublicKey:
60
+ """Deserialize public key from bytes."""
61
+ return cast(
62
+ ec.EllipticCurvePublicKey,
63
+ serialization.load_pem_public_key(data=public_key_bytes),
64
+ )
65
+
66
+
67
+ def sign_message(private_key: ec.EllipticCurvePrivateKey, message: bytes) -> bytes:
68
+ """Sign a message using the provided EC private key.
69
+
70
+ Parameters
71
+ ----------
72
+ private_key : ec.EllipticCurvePrivateKey
73
+ The EC private key to sign the message with.
74
+ message : bytes
75
+ The message to be signed.
76
+
77
+ Returns
78
+ -------
79
+ bytes
80
+ The signature of the message.
81
+ """
82
+ signature = private_key.sign(message, ec.ECDSA(hashes.SHA256()))
83
+ return signature
84
+
85
+
86
+ def verify_signature(
87
+ public_key: ec.EllipticCurvePublicKey, message: bytes, signature: bytes
88
+ ) -> bool:
89
+ """Verify a signature against a message using the provided EC public key.
90
+
91
+ Parameters
92
+ ----------
93
+ public_key : ec.EllipticCurvePublicKey
94
+ The EC public key to verify the signature.
95
+ message : bytes
96
+ The original message.
97
+ signature : bytes
98
+ The signature to verify.
99
+
100
+ Returns
101
+ -------
102
+ bool
103
+ True if the signature is valid, False otherwise.
104
+ """
105
+ try:
106
+ public_key.verify(signature, message, ec.ECDSA(hashes.SHA256()))
107
+ return True
108
+ except InvalidSignature:
109
+ return False
@@ -15,12 +15,41 @@
15
15
  """Account auth plugin for ControlServicer."""
16
16
 
17
17
 
18
+ from flwr.common.constant import AuthnType, AuthzType
19
+
18
20
  from .auth_plugin import ControlAuthnPlugin, ControlAuthzPlugin
19
21
  from .noop_auth_plugin import NoOpControlAuthnPlugin, NoOpControlAuthzPlugin
20
22
 
23
+ try:
24
+ from flwr.ee import get_control_authn_ee_plugins, get_control_authz_ee_plugins
25
+ except ImportError:
26
+
27
+ def get_control_authn_ee_plugins() -> dict[str, type[ControlAuthnPlugin]]:
28
+ """Return all Control API authentication plugins for EE."""
29
+ return {}
30
+
31
+ def get_control_authz_ee_plugins() -> dict[str, type[ControlAuthzPlugin]]:
32
+ """Return all Control API authorization plugins for EE."""
33
+ return {}
34
+
35
+
36
+ def get_control_authn_plugins() -> dict[str, type[ControlAuthnPlugin]]:
37
+ """Return all Control API authentication plugins."""
38
+ ee_dict: dict[str, type[ControlAuthnPlugin]] = get_control_authn_ee_plugins()
39
+ return ee_dict | {AuthnType.NOOP: NoOpControlAuthnPlugin}
40
+
41
+
42
+ def get_control_authz_plugins() -> dict[str, type[ControlAuthzPlugin]]:
43
+ """Return all Control API authorization plugins."""
44
+ ee_dict: dict[str, type[ControlAuthzPlugin]] = get_control_authz_ee_plugins()
45
+ return ee_dict | {AuthzType.NOOP: NoOpControlAuthzPlugin}
46
+
47
+
21
48
  __all__ = [
22
49
  "ControlAuthnPlugin",
23
50
  "ControlAuthzPlugin",
24
51
  "NoOpControlAuthnPlugin",
25
52
  "NoOpControlAuthzPlugin",
53
+ "get_control_authn_plugins",
54
+ "get_control_authz_plugins",
26
55
  ]
@@ -31,7 +31,11 @@ from flwr.supercore.ffs import FfsFactory
31
31
  from flwr.supercore.license_plugin import LicensePlugin
32
32
  from flwr.supercore.object_store import ObjectStoreFactory
33
33
  from flwr.superlink.artifact_provider import ArtifactProvider
34
- from flwr.superlink.auth_plugin import ControlAuthnPlugin, ControlAuthzPlugin
34
+ from flwr.superlink.auth_plugin import (
35
+ ControlAuthnPlugin,
36
+ ControlAuthzPlugin,
37
+ NoOpControlAuthnPlugin,
38
+ )
35
39
 
36
40
  from .control_account_auth_interceptor import ControlAccountAuthInterceptor
37
41
  from .control_event_log_interceptor import ControlEventLogInterceptor
@@ -54,8 +58,8 @@ def run_control_api_grpc(
54
58
  objectstore_factory: ObjectStoreFactory,
55
59
  certificates: Optional[tuple[bytes, bytes, bytes]],
56
60
  is_simulation: bool,
57
- authn_plugin: Optional[ControlAuthnPlugin] = None,
58
- authz_plugin: Optional[ControlAuthzPlugin] = None,
61
+ authn_plugin: ControlAuthnPlugin,
62
+ authz_plugin: ControlAuthzPlugin,
59
63
  event_log_plugin: Optional[EventLogWriterPlugin] = None,
60
64
  artifact_provider: Optional[ArtifactProvider] = None,
61
65
  ) -> grpc.Server:
@@ -72,11 +76,9 @@ def run_control_api_grpc(
72
76
  authn_plugin=authn_plugin,
73
77
  artifact_provider=artifact_provider,
74
78
  )
75
- interceptors: list[grpc.ServerInterceptor] = []
79
+ interceptors = [ControlAccountAuthInterceptor(authn_plugin, authz_plugin)]
76
80
  if license_plugin is not None:
77
81
  interceptors.append(ControlLicenseInterceptor(license_plugin))
78
- if authn_plugin is not None and authz_plugin is not None:
79
- interceptors.append(ControlAccountAuthInterceptor(authn_plugin, authz_plugin))
80
82
  # Event log interceptor must be added after account auth interceptor
81
83
  if event_log_plugin is not None:
82
84
  interceptors.append(ControlEventLogInterceptor(event_log_plugin))
@@ -90,7 +92,7 @@ def run_control_api_grpc(
90
92
  interceptors=interceptors or None,
91
93
  )
92
94
 
93
- if authn_plugin is None:
95
+ if isinstance(authn_plugin, NoOpControlAuthnPlugin):
94
96
  log(INFO, "Flower Deployment Runtime: Starting Control API on %s", address)
95
97
  else:
96
98
  log(
@@ -85,7 +85,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
85
85
  ffs_factory: FfsFactory,
86
86
  objectstore_factory: ObjectStoreFactory,
87
87
  is_simulation: bool,
88
- authn_plugin: Optional[ControlAuthnPlugin] = None,
88
+ authn_plugin: ControlAuthnPlugin,
89
89
  artifact_provider: Optional[ArtifactProvider] = None,
90
90
  ) -> None:
91
91
  self.linkstate_factory = linkstate_factory
@@ -111,7 +111,8 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
111
111
  )
112
112
  return StartRunResponse()
113
113
 
114
- flwr_aid = shared_account_info.get().flwr_aid if self.authn_plugin else None
114
+ flwr_aid = shared_account_info.get().flwr_aid
115
+ _check_flwr_aid_exists(flwr_aid, context)
115
116
  override_config = user_config_from_proto(request.override_config)
116
117
  federation_options = config_record_from_proto(request.federation_options)
117
118
  fab_file = request.fab.content
@@ -185,12 +186,9 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
185
186
  if not run:
186
187
  context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
187
188
 
188
- # If account auth is enabled, check if `flwr_aid` matches the run's `flwr_aid`
189
- if self.authn_plugin:
190
- flwr_aid = shared_account_info.get().flwr_aid
191
- _check_flwr_aid_in_run(
192
- flwr_aid=flwr_aid, run=cast(Run, run), context=context
193
- )
189
+ # Check if `flwr_aid` matches the run's `flwr_aid`
190
+ flwr_aid = shared_account_info.get().flwr_aid
191
+ _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=cast(Run, run), context=context)
194
192
 
195
193
  after_timestamp = request.after_timestamp + 1e-6
196
194
  while context.is_active():
@@ -226,20 +224,11 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
226
224
 
227
225
  # Build a set of run IDs for `flwr ls --runs`
228
226
  if not request.HasField("run_id"):
229
- if self.authn_plugin:
230
- # If no `run_id` is specified and account auth is enabled,
231
- # return run IDs for the authenticated account
232
- flwr_aid = shared_account_info.get().flwr_aid
233
- if flwr_aid is None:
234
- context.abort(
235
- grpc.StatusCode.PERMISSION_DENIED,
236
- "️⛔️ Account authentication is enabled, but `flwr_aid` is None",
237
- )
238
- run_ids = state.get_run_ids(flwr_aid=flwr_aid)
239
- else:
240
- # If no `run_id` is specified and no account auth is enabled,
241
- # return all run IDs
242
- run_ids = state.get_run_ids(None)
227
+ # If no `run_id` is specified and account auth is enabled,
228
+ # return run IDs for the authenticated account
229
+ flwr_aid = shared_account_info.get().flwr_aid
230
+ _check_flwr_aid_exists(flwr_aid, context)
231
+ run_ids = state.get_run_ids(flwr_aid=flwr_aid)
243
232
  # Build a set of run IDs for `flwr ls --run-id <run_id>`
244
233
  else:
245
234
  # Retrieve run ID and run
@@ -249,14 +238,11 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
249
238
  # Exit if `run_id` not found
250
239
  if not run:
251
240
  context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
241
+ raise grpc.RpcError() # This line is unreachable
252
242
 
253
- # If account auth is enabled,
254
- # check if `flwr_aid` matches the run's `flwr_aid`
255
- if self.authn_plugin:
256
- flwr_aid = shared_account_info.get().flwr_aid
257
- _check_flwr_aid_in_run(
258
- flwr_aid=flwr_aid, run=cast(Run, run), context=context
259
- )
243
+ # Check if `flwr_aid` matches the run's `flwr_aid`
244
+ flwr_aid = shared_account_info.get().flwr_aid
245
+ _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
260
246
 
261
247
  run_ids = {run_id}
262
248
 
@@ -278,13 +264,11 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
278
264
  # Exit if `run_id` not found
279
265
  if not run:
280
266
  context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
267
+ raise grpc.RpcError() # This line is unreachable
281
268
 
282
- # If account auth is enabled, check if `flwr_aid` matches the run's `flwr_aid`
283
- if self.authn_plugin:
284
- flwr_aid = shared_account_info.get().flwr_aid
285
- _check_flwr_aid_in_run(
286
- flwr_aid=flwr_aid, run=cast(Run, run), context=context
287
- )
269
+ # Check if `flwr_aid` matches the run's `flwr_aid`
270
+ flwr_aid = shared_account_info.get().flwr_aid
271
+ _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
288
272
 
289
273
  run_status = state.get_run_status({run_id})[run_id]
290
274
  if run_status.status == Status.FINISHED:
@@ -392,10 +376,9 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
392
376
  grpc.StatusCode.FAILED_PRECONDITION, PULL_UNFINISHED_RUN_MESSAGE
393
377
  )
394
378
 
395
- # Check if `flwr_aid` matches the run's `flwr_aid` when account auth is enabled
396
- if self.authn_plugin:
397
- flwr_aid = shared_account_info.get().flwr_aid
398
- _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
379
+ # Check if `flwr_aid` matches the run's `flwr_aid`
380
+ flwr_aid = shared_account_info.get().flwr_aid
381
+ _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
399
382
 
400
383
  # Call artifact provider
401
384
  download_url = self.artifact_provider.get_url(run_id)
@@ -494,24 +477,29 @@ def _create_list_runs_response(
494
477
  )
495
478
 
496
479
 
497
- def _check_flwr_aid_in_run(
498
- flwr_aid: Optional[str], run: Run, context: grpc.ServicerContext
480
+ def _check_flwr_aid_exists(
481
+ flwr_aid: Optional[str], context: grpc.ServicerContext
499
482
  ) -> None:
500
- """Guard clause to check if `flwr_aid` matches the run's `flwr_aid`."""
501
- # `flwr_aid` must not be None. Abort if it is None.
483
+ """Guard clause to check if `flwr_aid` exists."""
502
484
  if flwr_aid is None:
503
485
  context.abort(
504
486
  grpc.StatusCode.PERMISSION_DENIED,
505
- "️⛔️ Account authentication is enabled, but `flwr_aid` is None",
487
+ "️⛔️ Failed to fetch the account information.",
506
488
  )
489
+ raise RuntimeError # This line is unreachable
490
+
507
491
 
492
+ def _check_flwr_aid_in_run(
493
+ flwr_aid: Optional[str], run: Run, context: grpc.ServicerContext
494
+ ) -> None:
495
+ """Guard clause to check if `flwr_aid` matches the run's `flwr_aid`."""
496
+ _check_flwr_aid_exists(flwr_aid, context)
508
497
  # `run.flwr_aid` must not be an empty string. Abort if it is empty.
509
498
  run_flwr_aid = run.flwr_aid
510
499
  if not run_flwr_aid:
511
500
  context.abort(
512
501
  grpc.StatusCode.PERMISSION_DENIED,
513
- "⛔️ Account authentication is enabled, but the run is not associated "
514
- "with a `flwr_aid`.",
502
+ "⛔️ Run is not associated with a `flwr_aid`.",
515
503
  )
516
504
 
517
505
  # Exit if `flwr_aid` does not match the run's `flwr_aid`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.23.0.dev20251006
3
+ Version: 1.23.0.dev20251008
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -5,7 +5,7 @@ flwr/app/exception.py,sha256=WX45Yviu_CmYrYd8JHNjRkSsb-g4Br7XvVLKuVxwSdI,1298
5
5
  flwr/app/metadata.py,sha256=rdMBn0zhIOYmCvmGENQWSQqDwcxwsMJzCle4PQdlc_Y,7331
6
6
  flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
7
7
  flwr/cli/app.py,sha256=xHbxFpdgQMMQojntdXVVijS2vWq4X7iPFbSiIuzFCyo,2457
8
- flwr/cli/auth_plugin/__init__.py,sha256=Hi4YiFWCFhm7G94N_RIF1OEapxpWy3SyUeXVXfJyZSY,1226
8
+ flwr/cli/auth_plugin/__init__.py,sha256=qpebWV9uLpx72_J8yTVgT1DlH2Y9MK_RraDoTYEqv-w,1359
9
9
  flwr/cli/auth_plugin/auth_plugin.py,sha256=LK-DYGk8J85Mjsbc5BX9ueDVOOPcFSo9cKWJX25X-QI,3050
10
10
  flwr/cli/auth_plugin/noop_auth_plugin.py,sha256=KRyxoYtrzOWAIlSuXznli9gqL-rmHSG3zESmYSCQ_rg,2093
11
11
  flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=9Oyd23g-2vgsXhRQdqG9JNocPylGXZM4UVPBB6l0GXA,5147
@@ -15,10 +15,10 @@ flwr/cli/config_utils.py,sha256=o75PJzgCTl9FdFo_I9OjCB02-ykK0VWZdhIAeR0A8QA,9130
15
15
  flwr/cli/constant.py,sha256=LtxufmhkEqNWQ9doWbbbkUKa12vN_RK_Of5u0So-GHA,1729
16
16
  flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
17
17
  flwr/cli/install.py,sha256=Jr883qR7qssVpUr3hEOEcLK-dfW67Rsve3lZchjA9RU,8180
18
- flwr/cli/log.py,sha256=n_fcoECKIkY3MTOfXhB8AjOG1LSQW_GSPY-2qc7rW9Q,6553
18
+ flwr/cli/log.py,sha256=3qVYY30QqchfnKRTeeRw2ojBUj_nwvfnZkdBr4lmjpc,6541
19
19
  flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,800
20
- flwr/cli/login/login.py,sha256=TR2whArUBGd6TqS1v4MAKBGLrfABkFdRVQuzKpsUULE,4757
21
- flwr/cli/ls.py,sha256=WineydqrQKuNf8yuFPRcfptYLZ-peu9LEOi4at3lfuw,11107
20
+ flwr/cli/login/login.py,sha256=XeA6K9rZn3CBvtiFP3XWTAk7s8766BCqHvCsO_tJEuY,4558
21
+ flwr/cli/ls.py,sha256=VHF9xb4q0dOQwFZE_XmUhX_cw27eKyUvlIyxNx-crkw,11095
22
22
  flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
23
23
  flwr/cli/new/new.py,sha256=nIuUrQSGDjI4kqnymlq-rOT0RU3AHwZrat3abqHhCwM,10598
24
24
  flwr/cli/new/templates/__init__.py,sha256=FpjWCfIySU2DB4kh0HOXLAjlZNNFDTVU4w3HoE2TzcI,725
@@ -82,24 +82,24 @@ flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl,sha256=ZWW31QEd
82
82
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=Elh5bUTVBNRG1aDTrgQcZgjfrXcIaVXH00UduNJDZ2U,1484
83
83
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=g7SYiAJr6Uhwg4ZsQI2qsLVeizU8vd0CzR0_jka99_A,1508
84
84
  flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl,sha256=yAJ9jL2q6U_XXYwwUT9fpIqIKFuQR_Kgg82GpWfQ5J8,1661
85
- flwr/cli/pull.py,sha256=dHiMe6x8w8yRoFNKpjA-eiPD6eFiHz4Vah5HZrqNpuo,3364
85
+ flwr/cli/pull.py,sha256=sT3-f2zf7JcXfB-pHWLXmENrOzJeUDBoqK3oruJxzao,3352
86
86
  flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
87
- flwr/cli/run/run.py,sha256=ECa0kup9dn15O70H74QdgUsEaeErbzDqVX_U0zZO5IM,8173
88
- flwr/cli/stop.py,sha256=TR9F61suTxNUzGIktUdoBhXwdRtCdvzGhy3qCuvcfBg,5000
87
+ flwr/cli/run/run.py,sha256=ED1mDmO1PnSAgtVOrCeWwzwPm6t3aFYSs3Rh36BJzqk,8161
88
+ flwr/cli/stop.py,sha256=W7ynTYLm0-_1nC5Il4IaZTji6A3GCCm_0R-HQUudAsI,4988
89
89
  flwr/cli/supernode/__init__.py,sha256=DVrTcyCg9NFll6glPLAAA6WPi7boxu6pFY_PRqIyHMk,893
90
90
  flwr/cli/supernode/create.py,sha256=MloB7Rr-CE_37jH5lFoM8OsaSPUzWt0TSSB_GMwND5E,1959
91
91
  flwr/cli/supernode/delete.py,sha256=_oCfBnoeUFPLEq_1EAqQp_CHEdzIEP2N_vHZsFTgWn0,1958
92
- flwr/cli/supernode/ls.py,sha256=KZZHQczmXi4vmgMJlBntD893fYQ9a7ZJum-8K_BPWAw,8550
93
- flwr/cli/utils.py,sha256=3bCu_MndtJD2S5MPG9VKi7SxG0No8S651pcfBVb29Y8,14397
92
+ flwr/cli/supernode/ls.py,sha256=exeu-9fpkh27k2oyYNNT7uDhHgf8dlX0TR6WwMV8KIQ,8538
93
+ flwr/cli/utils.py,sha256=cdqtT8KrgaH20z2GWZjt2E26UTO6jfkp9qmmH-08hrs,13640
94
94
  flwr/client/__init__.py,sha256=Q0MIF442vLIGSkcwHKq_sIfECQynLARJrumAscq2Q6E,1241
95
95
  flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
96
96
  flwr/client/dpfedavg_numpy_client.py,sha256=3hul067cT2E9jBhzp7bFnFAZ_D2nWcIUEdHYE05FpzU,7404
97
97
  flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ81wvZm0-lOuuBA,742
98
98
  flwr/client/grpc_adapter_client/connection.py,sha256=JGv02EjSOAG1E5BRUD4lwXc1LLiYJ0OhInvp31qx1cU,4404
99
99
  flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
100
- flwr/client/grpc_rere_client/client_interceptor.py,sha256=zFaVHw6AxeNO-7eCKKb-RxrPa7zbM5Z-2-1Efc4adQY,2451
101
- flwr/client/grpc_rere_client/connection.py,sha256=uLcXAJoHHLVm4SVR3oFCpdqHrZJcT_kGqfC1g8reXAM,13008
100
+ flwr/client/grpc_rere_client/connection.py,sha256=SaBuUcqF6r6ieT1sv0Tg5Isqmpeb8D184R0ayLvCScQ,13091
102
101
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=dLGB5GriszAmtgvuFGuz_F7rIwpzLfDxhJ7T3Un-Ce0,6694
102
+ flwr/client/grpc_rere_client/node_auth_client_interceptor.py,sha256=EdTyb5ThFrpkeyXy9_nTKH7E9GnfAdXjcNZ_-uxt1AA,2410
103
103
  flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
104
104
  flwr/client/message_handler/message_handler.py,sha256=X9SXX6et97Lw9_DGD93HKsEBGNjXClcFgc_5aLK0oiU,6541
105
105
  flwr/client/mod/__init__.py,sha256=AtV4Y5UGuYqJdTg7bJ--KtfOZUYLGDPMy616LvtP5W4,1151
@@ -108,11 +108,11 @@ flwr/client/mod/comms_mods.py,sha256=ehp0AF-nGXxQOtm4G5Ts_7RTP04x5Y8PmA1Myfrjuro
108
108
  flwr/client/mod/localdp_mod.py,sha256=GzVQrydejUfFDgnIIEIwrUU2DgvhN990LUnoydm9Tpo,5008
109
109
  flwr/client/mod/secure_aggregation/__init__.py,sha256=k8HYXvqu3pd_V3eZ0_5wwH52o-C6XJCPbT4n4anYyWY,849
110
110
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=y54DvpM2-DWUiEYqgwZ0DssC1VVRCJEfGgST7O3OcwM,1095
111
- flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=aKqjZCrikF73y3E-7h40u-s0H6-hmyd4Ah1LHnrLrIg,19661
111
+ flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=Ib-HlhZOXB6-hAWGZ0IpbK7mIr1A5j2qpc8IRu-MxLU,19714
112
112
  flwr/client/mod/utils.py,sha256=FUgD2TfcWqSeF6jUKZ4i6Ke56U4Nrv85AeVb93s6R9g,1201
113
113
  flwr/client/numpy_client.py,sha256=Qq6ghsIAop2slKqAfgiI5NiHJ4LIxGmrik3Ror4_XVc,9581
114
114
  flwr/client/rest_client/__init__.py,sha256=MBiuK62hj439m9rtwSwI184Hth6Tt5GbmpNMyl3zkZY,735
115
- flwr/client/rest_client/connection.py,sha256=fyiS1aXTv71jWczx7mSco94LYJTBXgTF-p2PnAk3CL8,15784
115
+ flwr/client/rest_client/connection.py,sha256=y7fhRoMsgHNKfMGHX1IE_uKgseEuD1eR4MgEmw3aXwE,15971
116
116
  flwr/client/run_info_store.py,sha256=MaJ3UQ-07hWtK67wnWu0zR29jrk0fsfgJX506dvEOfE,4042
117
117
  flwr/client/typing.py,sha256=Jw3rawDzI_-ZDcRmEQcs5gZModY7oeQlEeltYsdOhlU,1048
118
118
  flwr/clientapp/__init__.py,sha256=dsXH29kvCk1meJj9UYMCIak8zehuuhVp0uDJ2COU_1c,829
@@ -126,7 +126,7 @@ flwr/common/__init__.py,sha256=5GCLVk399Az_rTJHNticRlL0Sl_oPw_j5_LuFKfX7-M,4171
126
126
  flwr/common/address.py,sha256=9JucdTwlc-jpeJkRKeUboZoacUtErwSVtnDR9kAtLqE,4119
127
127
  flwr/common/args.py,sha256=Nq2u4yePbkSY0CWFamn0hZY6Rms8G1xYDeDGIcLIITE,5849
128
128
  flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
129
- flwr/common/constant.py,sha256=c3drkY6oYfQ45fYMYd1bHCgF3XxG7sXmtj8yP6RX4T4,9183
129
+ flwr/common/constant.py,sha256=WD-qFz_JiotwVS0VWfepNjpmGEf2QV2bsNCAkeAIJfI,9400
130
130
  flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
131
131
  flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
132
132
  flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
@@ -163,7 +163,7 @@ flwr/common/retry_invoker.py,sha256=uQeDcgoTgmFwhJ0mkDE2eNz2acF9eShaqMOO5boGrPQ,
163
163
  flwr/common/secure_aggregation/__init__.py,sha256=MgW6uHGhyFLBAYQqa1Vzs5n2Gc0d4yEw1_NmerFir70,731
164
164
  flwr/common/secure_aggregation/crypto/__init__.py,sha256=5E4q4-Fw0CNz4tLah_QHj7m_rDeM4ucHcFlPWB_Na3Q,738
165
165
  flwr/common/secure_aggregation/crypto/shamir.py,sha256=N8pPa5cEksowNoAqfFm5SP3IuxuVi9GGMa3JOtPniQY,3954
166
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=H6Rlpr4i-VAwOMNdyfH33uDpXNsquiK1gKrOixtKqek,5333
166
+ flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=fc8h7ST3mSq4d0u89vAdcxSsfspdsmOpQRba0VBn3zg,2718
167
167
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=TrggOlizlny3V2KS7-3mpDr33En8UmW9oJcxcS_6oh0,3013
168
168
  flwr/common/secure_aggregation/quantization.py,sha256=ssFZpiRyj9ltIh0Ai3vGkDqWFO4SoqgoD1mDU9XqMEM,2400
169
169
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=dGYhWOBMMDJcQH4_tQNC8-Efqm-ecEUNN9ANz59UnCk,2182
@@ -203,8 +203,8 @@ flwr/proto/fab_pb2.py,sha256=2Nu0WaWxDZ8TbutMtctjdcGM7OtXiyP4kmCgg5o7Jjw,1627
203
203
  flwr/proto/fab_pb2.pyi,sha256=AMXpiDK0fo3nZWjxsC2E4otSaVjyQbU7iiWKrsSZavs,2395
204
204
  flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
205
205
  flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
206
- flwr/proto/fleet_pb2.py,sha256=VZO6c1Vom-zfdRHgkuHROvsFdt4MOA8-R6p1TT-QXRo,5150
207
- flwr/proto/fleet_pb2.pyi,sha256=0aKdrVaugxVI1ySWiy86aan1cjw9RJkDv1mTcMPyW4I,7797
206
+ flwr/proto/fleet_pb2.py,sha256=xGnNGmBbPds6LeB34HN8_vy4U1oW25-w-r-C6xNpoRo,5190
207
+ flwr/proto/fleet_pb2.pyi,sha256=btn0ertRlY5LenpN-YoiqA4X8NQgbkZsAJZQWN8Tia0,7939
208
208
  flwr/proto/fleet_pb2_grpc.py,sha256=NmzrDYxyM3MQNh3vwYczQNuFimZz3prU6ke3E-fKk_g,17539
209
209
  flwr/proto/fleet_pb2_grpc.pyi,sha256=PDERhzOrBCMAytTLS65Qck8A45bTIYni7Lotq6_I0sM,4721
210
210
  flwr/proto/grpcadapter_pb2.py,sha256=PJ8DtfeV29g_y4Z3aNZlSZocLqSxeLmTsYCdOZDYCiE,1843
@@ -223,7 +223,7 @@ flwr/proto/message_pb2.py,sha256=giymevXYEUdpIO-3A0XKsmRabXW1xSz0sIo5oOlbQ8Y,519
223
223
  flwr/proto/message_pb2.pyi,sha256=EzXZHy2mtabofrd_ZgKSI6M4QH-soIaRZIZBPwBGPv0,11260
224
224
  flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
225
225
  flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
226
- flwr/proto/node_pb2.py,sha256=_5UD-yH9Y-qtAP-gO3LZeDH_WoSFfjXmNvngsb9G-YM,1534
226
+ flwr/proto/node_pb2.py,sha256=QVVaA_zxdQE_g_9iu45p9bUN6rABViJF9Tg-E0EOahg,1534
227
227
  flwr/proto/node_pb2.pyi,sha256=kmLGmDIqudRtveUop_uVU6w696ahPB_b-O94k3HQIpU,2226
228
228
  flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
229
229
  flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
@@ -249,7 +249,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
249
249
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
250
250
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
251
  flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
252
- flwr/server/app.py,sha256=ESJ55Gl77zptQC10YwZg7WyK8Zr6zisI0rPtQJrx_-w,30698
252
+ flwr/server/app.py,sha256=2BAooGt3mKL9scCA0adFVKTps1J0WDmvHpUzUSI9qP0,30328
253
253
  flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs,6227
254
254
  flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
255
255
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
@@ -305,22 +305,22 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=KouR9PUcrPmMtoLooF4O
305
305
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=iSf0mbBAlig7G6subQwBSVjcUCgSihONKdZ1RmQPTOk,4887
306
306
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=OsS-6GgCIzMMZDVu5Y-OKjynHVUrpdc_5OrtuB-IbU0,5174
307
307
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=ahDJJ1e-lDxBpeBMgPk7YZt2wB38_QltcpOC0gLbpFs,758
308
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=X7-z4oReIH5ghMfmMXML3SSpa2bhRsuIvt2OZs82BUk,8675
309
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=9_RaYWMqFdpFi8QcE7Nv8-pRjWJ2dLHxezrwhd1tAYk,6845
308
+ flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=xkmbYjzt7IZCSvtjgyZVTC7Mm18t7pUB6OUxN_Th8nU,8847
309
+ flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py,sha256=TNK_0-Cpt_s9qTVjm9imke2sF_o_Vb5c-4WDnVg5UGA,5998
310
310
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=fHsRV0KvJ8HtgSA4_YBsEzuhJLjO8p6xx4aCY2oE1p4,731
311
- flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=3Wg20bFo1tZfkzTQUerPVSHXyOuUqNuitEib3W_Dy-U,8691
311
+ flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=-ztViMFASoqlokZp80iQ37svtHUzcp_PagYRD0A7kdc,8692
312
312
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=Lzc93nA7tDqoy-zRUaPG316oqFiZX1HUCL5ELaXY_xw,735
313
313
  flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=mxWKwGpgHPqd7cGFqd2ASnR-KZduIzLfT-d2yiNCqQ0,9257
314
314
  flwr/server/superlink/fleet/vce/__init__.py,sha256=XOKbAWOzlCqEOQ3M2cBYkH7HKA7PxlbCJMunt-ty-DY,784
315
315
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=PPH89Yqd1XKm-sRJN6R0WQlKT_b4v54Kzl2yzHAFzM8,1437
316
316
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=cSrHZ5SjCCvy4vI0pgsyjtx3cDMuMQve8KcKkK-dWWo,2196
317
317
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=cBZYTmfiAsb1HmVUmOQXYLU-UJmJTFWkj1wW4RYRDuc,7218
318
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=Xd3k77J37ReyaumImUJ3szXUoMJNvuZ4qQKGraLeCXY,12942
318
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=DRnRXM8Zr49Qt5F1p39ictquXUxO8wcvV5_Sv5-YzJ4,13108
319
319
  flwr/server/superlink/linkstate/__init__.py,sha256=OtsgvDTnZLU3k0sUbkHbqoVwW6ql2FDmb6uT6DbNkZo,1064
320
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=eNjjQp6dJ_Qz54fYeOZ9XFebbB_k9syhBB6N2rXRTsA,27891
321
- flwr/server/superlink/linkstate/linkstate.py,sha256=TCLM9wZa2XGHs55B3LP9j5-WtUPhBjOUdMKQJELG2oY,13287
320
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=2VZLVeJqvxx03ICjmHT_csUqpaMTrQXdBCfjswFGwo8,28677
321
+ flwr/server/superlink/linkstate/linkstate.py,sha256=Oo3RLrtQMuS_QMn8IQ-dQg7Mye-HHMMwKFV2AAfxFAw,13306
322
322
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=8RlosqSpKOoD_vhUUQPY0jtE3A84GeF96Z7sWNkRRcA,2069
323
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=NIJ1BDcj54TUpNaeb23af38wQE-TM6rnYVMJncJVKQ0,45503
323
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=3gfHo3x2yW9ZVIjK8Jqo0fJGFdjIotly3NYmOcb97kE,46544
324
324
  flwr/server/superlink/linkstate/utils.py,sha256=IeLh7iGRCHU5MEWOl7iriaSE4L__8GWOa2OleXadK5M,15444
325
325
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
326
326
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=-I7kBbr4w4ZVYwBZoAIle-xHKthFnZrsVfxa6WR8uxA,2310
@@ -332,13 +332,13 @@ flwr/server/superlink/utils.py,sha256=zXmyU2o535b9dgz-TvFklzfuQk4irNnMtiK8vT4Dm1
332
332
  flwr/server/typing.py,sha256=LvO6gq7H6TAWhA9JFx0WyqHxU7FycyvhSsLjBLPgpts,1011
333
333
  flwr/server/utils/__init__.py,sha256=U4gM84-uUFddarODDQkO6SjNUuGhFcsHJZMjSEbezkU,884
334
334
  flwr/server/utils/tensorboard.py,sha256=3z3MeF0cu_U6ghNgRd0UQ5bunyDQKxCLpIpEdGMoCJ0,5466
335
- flwr/server/utils/validator.py,sha256=_dFb6_aAqWSiTgFuR10p8PPRI1ojwf0GFXuT8kLL2H8,3612
335
+ flwr/server/utils/validator.py,sha256=ZDHWtDa2yFzicfUStIIzno8AZEeTCwERjBbuv_StAMs,3638
336
336
  flwr/server/workflow/__init__.py,sha256=N8G_xCBVrlV39Eov56bwImKMUTsqsaEoTCFYIQ0q8Bg,902
337
337
  flwr/server/workflow/constant.py,sha256=4t2MTvOJUlByJfuD9yZjl8Xn5SwBJQDBi15DphztXe8,1082
338
338
  flwr/server/workflow/default_workflows.py,sha256=RlD26dXbSksY-23f3ZspnN1YU1DOhDYOchMTEQvqFrM,13900
339
339
  flwr/server/workflow/secure_aggregation/__init__.py,sha256=vGkycLb65CxdaMkKsANxQE6AS4urfZKvwcS3r1Vln_c,880
340
340
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=b_pKk7gmbahwyj0ftOOLXvu-AMtRHEc82N9PJTEO8dc,5839
341
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=DkayCsnlAya6Y2PZsueLgoUCMRtV-GbnW08RfWx_SXM,29460
341
+ flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=SqAIIOsETxay-SCwGnhOUO3dkxanQaqdZD2Ex7M-wvE,29513
342
342
  flwr/serverapp/__init__.py,sha256=ZujKNXULwhWYQhFnxOOT5Wi9MRq2JCWFhAAj7ouiQ78,884
343
343
  flwr/serverapp/exception.py,sha256=5cuH-2AafvihzosWDdDjuMmHdDqZ1XxHvCqZXNBVklw,1334
344
344
  flwr/serverapp/strategy/__init__.py,sha256=dezK2TKSffjjBVXW18ATRxJLTuQ7I2M1dPuNi5y-_6c,1968
@@ -392,6 +392,8 @@ flwr/supercore/object_store/in_memory_object_store.py,sha256=CGY43syxDGrUPcdOzRH
392
392
  flwr/supercore/object_store/object_store.py,sha256=J-rI3X7ET-F6dqOyM-UfHKCCQtPJ_EnYW62H_1txts0,5252
393
393
  flwr/supercore/object_store/object_store_factory.py,sha256=QVwE2ywi7vsj2iKfvWWnNw3N_I7Rz91NUt2RpcbJ7iM,1527
394
394
  flwr/supercore/object_store/utils.py,sha256=DcPbrb9PenloAPoQRiKiXX9DrDfpXcSyY0cZpgn4PeQ,1680
395
+ flwr/supercore/primitives/__init__.py,sha256=Tx8GOjnmMo8Y74RsDGrMpfr-E0Nl8dcUDF784_ge6F8,745
396
+ flwr/supercore/primitives/asymmetric.py,sha256=g5NnE_4nnHjqOFCtSi3hVy2CdgQ_G9gcfbOtx-Kmkm0,3502
395
397
  flwr/supercore/superexec/__init__.py,sha256=XKX208hZ6a9gZ4KT9kMqfpCtp_8VGxekzKFfHSu2esQ,707
396
398
  flwr/supercore/superexec/plugin/__init__.py,sha256=GNwq8uNdE8RB7ywEFRAvKjLFzgS3YXgz39-HBGsemWw,1035
397
399
  flwr/supercore/superexec/plugin/base_exec_plugin.py,sha256=fL-Ufc9Dp56OhWOzNSJUc7HumbkuSDYqZKwde2opG4g,2074
@@ -404,16 +406,16 @@ flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
404
406
  flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
405
407
  flwr/superlink/artifact_provider/__init__.py,sha256=pgZEcVPKRE874LSu3cgy0HbwSJBIpVy_HxQOmne4PAs,810
406
408
  flwr/superlink/artifact_provider/artifact_provider.py,sha256=Gnlg2M2SOqCruji2B0U3ov68NJWKin9scmnWJTiSnNA,1267
407
- flwr/superlink/auth_plugin/__init__.py,sha256=ApYBHnDmtv5gVrnxdFq97zC58O1icqHogK2Dz6o8DVI,1000
409
+ flwr/superlink/auth_plugin/__init__.py,sha256=2INKscgltOxVMGqwuc7YyS2suR0mmBent0F5UA7ToBQ,2111
408
410
  flwr/superlink/auth_plugin/auth_plugin.py,sha256=mKaR2HanhKHmVrcvGqTUv47ut458QgqVU6enU4myB7Y,3038
409
411
  flwr/superlink/auth_plugin/noop_auth_plugin.py,sha256=BQ1v1jFZen7AHh6Gwr9arElW3e9aAAKgOO4zKikbd_4,3044
410
412
  flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfhsnhBpM,717
411
413
  flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
412
414
  flwr/superlink/servicer/control/control_account_auth_interceptor.py,sha256=Tbi4WVfWlNsOO-NNbe9iLdYp0thkO5xisi5O8ebzuCs,6252
413
415
  flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=5uBl6VcJlUOgCF0d4kmsmJc1Rs1qxyouaZv0-uH2axs,5969
414
- flwr/superlink/servicer/control/control_grpc.py,sha256=xajQdX9WuKJmyXZJOaMZKeiSwgSCrile1NOErOiXR5w,4270
416
+ flwr/superlink/servicer/control/control_grpc.py,sha256=MRCaX4I2a5ogjKmhtFs6Mj-VdWemxL2h3gU9QbQmvCA,4183
415
417
  flwr/superlink/servicer/control/control_license_interceptor.py,sha256=T3AzmRt-PPwyTq3hrdpmZHQd5_CpPOk7TtnFZrB-JRY,3349
416
- flwr/superlink/servicer/control/control_servicer.py,sha256=DJaHBHNRS_9UVuqAk9ELu-1IfmFNVbt3SilYG1awaXQ,19092
418
+ flwr/superlink/servicer/control/control_servicer.py,sha256=mus87XmRsJu_n2Qgm4lltxxvkeX5VkW2xG5HD9THcDY,18515
417
419
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
418
420
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
419
421
  flwr/supernode/cli/flower_supernode.py,sha256=7aBm0z03OU-npVd1onLCvUotyhSvlZLxAnFkGVMhZcw,8670
@@ -428,7 +430,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
428
430
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
429
431
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=nIHRu38EWK-rpNOkcgBRAAKwYQQWFeCwu0lkO7OPZGQ,10239
430
432
  flwr/supernode/start_client_internal.py,sha256=Y9S1-QlO2WP6eo4JvWzIpfaCoh2aoE7bjEYyxNNnlyg,20777
431
- flwr_nightly-1.23.0.dev20251006.dist-info/METADATA,sha256=BcU_7czuKJh5AnBvuRlID49gmN3-GSBQ01gQ2KtmLBQ,14559
432
- flwr_nightly-1.23.0.dev20251006.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
433
- flwr_nightly-1.23.0.dev20251006.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
434
- flwr_nightly-1.23.0.dev20251006.dist-info/RECORD,,
433
+ flwr_nightly-1.23.0.dev20251008.dist-info/METADATA,sha256=v2GJDfsgn1KfcGY4ecjmYoEGrmOn9OHbjbo-lEMPfdQ,14559
434
+ flwr_nightly-1.23.0.dev20251008.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
435
+ flwr_nightly-1.23.0.dev20251008.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
436
+ flwr_nightly-1.23.0.dev20251008.dist-info/RECORD,,