ethyca-fides 2.63.0rc2__py2.py3-none-any.whl → 2.63.1__py2.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 (131) hide show
  1. {ethyca_fides-2.63.0rc2.dist-info → ethyca_fides-2.63.1.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.63.0rc2.dist-info → ethyca_fides-2.63.1.dist-info}/RECORD +131 -112
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/29e56fa1fdb3_add_monitor_tasks.py +147 -0
  5. fides/api/alembic/migrations/versions/5efcdf18438e_add_manual_task_tables.py +160 -0
  6. fides/api/alembic/migrations/versions/bf713b5a021d_staged_resource_ancestor_link_data_.py +20 -11
  7. fides/api/api/v1/endpoints/privacy_request_endpoints.py +4 -4
  8. fides/api/db/base.py +7 -1
  9. fides/api/migrations/post_upgrade_index_creation.py +3 -3
  10. fides/api/models/connectionconfig.py +1 -1
  11. fides/api/models/detection_discovery/__init__.py +35 -0
  12. fides/api/models/detection_discovery/monitor_task.py +162 -0
  13. fides/api/models/field_types/__init__.py +5 -0
  14. fides/api/models/field_types/encrypted_large_data.py +151 -0
  15. fides/api/models/manual_tasks/__init__.py +8 -0
  16. fides/api/models/manual_tasks/manual_task.py +110 -0
  17. fides/api/models/manual_tasks/manual_task_log.py +100 -0
  18. fides/api/models/privacy_preference.py +1 -1
  19. fides/api/models/privacy_request/execution_log.py +3 -31
  20. fides/api/models/privacy_request/privacy_request.py +16 -3
  21. fides/api/models/privacy_request/request_task.py +36 -25
  22. fides/api/models/worker_task.py +96 -0
  23. fides/api/schemas/external_storage.py +22 -0
  24. fides/api/schemas/manual_tasks/__init__.py +0 -0
  25. fides/api/schemas/manual_tasks/manual_task_schemas.py +79 -0
  26. fides/api/schemas/manual_tasks/manual_task_status.py +151 -0
  27. fides/api/schemas/privacy_request.py +1 -12
  28. fides/api/service/connectors/base_erasure_email_connector.py +1 -1
  29. fides/api/service/connectors/consent_email_connector.py +2 -1
  30. fides/api/service/connectors/dynamic_erasure_email_connector.py +2 -1
  31. fides/api/service/connectors/erasure_email_connector.py +1 -1
  32. fides/api/service/external_data_storage.py +371 -0
  33. fides/api/service/privacy_request/request_runner_service.py +5 -5
  34. fides/api/service/privacy_request/request_service.py +1 -1
  35. fides/api/task/create_request_tasks.py +1 -1
  36. fides/api/task/execute_request_tasks.py +9 -8
  37. fides/api/task/graph_task.py +22 -10
  38. fides/api/util/consent_util.py +1 -1
  39. fides/api/util/data_size.py +102 -0
  40. fides/api/util/encryption/aes_gcm_encryption_util.py +271 -0
  41. fides/service/manual_tasks/__init__.py +0 -0
  42. fides/service/manual_tasks/manual_task_service.py +150 -0
  43. fides/service/privacy_request/privacy_request_service.py +1 -1
  44. fides/ui-build/static/admin/404.html +1 -1
  45. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  46. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  47. fides/ui-build/static/admin/add-systems.html +1 -1
  48. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  49. fides/ui-build/static/admin/consent/configure.html +1 -1
  50. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  51. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  52. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  53. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  54. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  55. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  56. fides/ui-build/static/admin/consent/properties.html +1 -1
  57. fides/ui-build/static/admin/consent/reporting.html +1 -1
  58. fides/ui-build/static/admin/consent.html +1 -1
  59. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  60. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  61. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  62. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  63. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  64. fides/ui-build/static/admin/data-catalog.html +1 -1
  65. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  66. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  67. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  68. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  69. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  70. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  71. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  72. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  73. fides/ui-build/static/admin/datamap.html +1 -1
  74. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  75. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  76. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  77. fides/ui-build/static/admin/dataset/new.html +1 -1
  78. fides/ui-build/static/admin/dataset.html +1 -1
  79. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  80. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  81. fides/ui-build/static/admin/datastore-connection.html +1 -1
  82. fides/ui-build/static/admin/index.html +1 -1
  83. fides/ui-build/static/admin/integrations/[id].html +1 -1
  84. fides/ui-build/static/admin/integrations.html +1 -1
  85. fides/ui-build/static/admin/login/[provider].html +1 -1
  86. fides/ui-build/static/admin/login.html +1 -1
  87. fides/ui-build/static/admin/messaging/[id].html +1 -1
  88. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  89. fides/ui-build/static/admin/messaging.html +1 -1
  90. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  91. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  92. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  93. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  94. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  95. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  96. fides/ui-build/static/admin/poc/forms.html +1 -1
  97. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  98. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  99. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  100. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  101. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  102. fides/ui-build/static/admin/privacy-requests.html +1 -1
  103. fides/ui-build/static/admin/properties/[id].html +1 -1
  104. fides/ui-build/static/admin/properties/add-property.html +1 -1
  105. fides/ui-build/static/admin/properties.html +1 -1
  106. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  107. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  108. fides/ui-build/static/admin/settings/about.html +1 -1
  109. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  110. fides/ui-build/static/admin/settings/consent.html +1 -1
  111. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  112. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  113. fides/ui-build/static/admin/settings/domains.html +1 -1
  114. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  115. fides/ui-build/static/admin/settings/locations.html +1 -1
  116. fides/ui-build/static/admin/settings/organization.html +1 -1
  117. fides/ui-build/static/admin/settings/regulations.html +1 -1
  118. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  119. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  120. fides/ui-build/static/admin/systems.html +1 -1
  121. fides/ui-build/static/admin/taxonomy.html +1 -1
  122. fides/ui-build/static/admin/user-management/new.html +1 -1
  123. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  124. fides/ui-build/static/admin/user-management.html +1 -1
  125. {ethyca_fides-2.63.0rc2.dist-info → ethyca_fides-2.63.1.dist-info}/WHEEL +0 -0
  126. {ethyca_fides-2.63.0rc2.dist-info → ethyca_fides-2.63.1.dist-info}/entry_points.txt +0 -0
  127. {ethyca_fides-2.63.0rc2.dist-info → ethyca_fides-2.63.1.dist-info}/licenses/LICENSE +0 -0
  128. {ethyca_fides-2.63.0rc2.dist-info → ethyca_fides-2.63.1.dist-info}/top_level.txt +0 -0
  129. /fides/api/models/{detection_discovery.py → detection_discovery/core.py} +0 -0
  130. /fides/ui-build/static/admin/_next/static/{Fb70i-8GI-owNAvgEJWhA → SZn_Fpr_qG1COMjkdloep}/_buildManifest.js +0 -0
  131. /fides/ui-build/static/admin/_next/static/{Fb70i-8GI-owNAvgEJWhA → SZn_Fpr_qG1COMjkdloep}/_ssgManifest.js +0 -0
@@ -0,0 +1,271 @@
1
+ """
2
+ AES GCM encryption utilities with SQLAlchemy-Utils and cryptography library implementations.
3
+
4
+ This module provides simplified encrypt/decrypt functions using two approaches:
5
+ 1. SQLAlchemy-Utils AesGcmEngine (compatible with existing database encryption)
6
+ 2. Cryptography library with chunked processing (better performance, standard library)
7
+ """
8
+
9
+ import base64
10
+ import hashlib
11
+ import json
12
+ import os
13
+ from typing import Any, List, Optional, Union
14
+
15
+ from cryptography.hazmat.backends import default_backend
16
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
17
+ from loguru import logger
18
+ from sqlalchemy_utils.types.encrypted.encrypted_type import AesGcmEngine
19
+
20
+ from fides.api.util.collection_util import Row
21
+ from fides.api.util.custom_json_encoder import CustomJSONEncoder, _custom_decoder
22
+ from fides.config import CONFIG
23
+
24
+
25
+ class EncryptionError(Exception):
26
+ """Raised when encryption/decryption operations fail"""
27
+
28
+
29
+ # SQLAlchemy-Utils Implementation (for compatibility with existing database encryption)
30
+ def encrypt_with_sqlalchemy_utils(data: List[Row]) -> bytes:
31
+ """
32
+ Serialize and encrypt data using CustomJSONEncoder and SQLAlchemy-Utils AesGcmEngine.
33
+
34
+ This approach is compatible with existing database encryption but has lower performance.
35
+
36
+ Args:
37
+ data: Raw data to serialize and encrypt
38
+
39
+ Returns:
40
+ Encrypted bytes
41
+
42
+ Raises:
43
+ EncryptionError: If serialization or encryption fails
44
+ """
45
+ try:
46
+ # Serialize using CustomJSONEncoder for consistent ObjectId handling
47
+ serialized_data = json.dumps(data, cls=CustomJSONEncoder, separators=(",", ":"))
48
+ data_bytes = serialized_data.encode("utf-8")
49
+
50
+ # Encrypt using SQLAlchemy-Utils AesGcmEngine
51
+ engine = AesGcmEngine()
52
+ key = CONFIG.security.app_encryption_key
53
+ engine._update_key(key) # pylint: disable=protected-access
54
+
55
+ # AesGcmEngine expects string input
56
+ data_str = data_bytes.decode("utf-8")
57
+ encrypted_data = engine.encrypt(data_str)
58
+ encrypted_bytes = encrypted_data.encode("utf-8")
59
+
60
+ logger.debug(
61
+ f"SQLAlchemy-Utils: Encrypted {len(data_bytes)} bytes to {len(encrypted_bytes)} bytes"
62
+ )
63
+ return encrypted_bytes
64
+
65
+ except Exception as e:
66
+ logger.error(f"SQLAlchemy-Utils encryption failed: {e}")
67
+ raise EncryptionError(f"SQLAlchemy-Utils encryption failed: {str(e)}")
68
+
69
+
70
+ def decrypt_with_sqlalchemy_utils(encrypted_bytes: bytes) -> List[Row]:
71
+ """
72
+ Decrypt and deserialize data using SQLAlchemy-Utils AesGcmEngine and _custom_decoder.
73
+
74
+ Args:
75
+ encrypted_bytes: Encrypted data bytes to decrypt
76
+
77
+ Returns:
78
+ Deserialized data
79
+
80
+ Raises:
81
+ EncryptionError: If decryption or deserialization fails
82
+ """
83
+ try:
84
+ # Decrypt using SQLAlchemy-Utils AesGcmEngine
85
+ engine = AesGcmEngine()
86
+ key = CONFIG.security.app_encryption_key
87
+ engine._update_key(key) # pylint: disable=protected-access
88
+
89
+ # AesGcmEngine expects string input
90
+ encrypted_str = encrypted_bytes.decode("utf-8")
91
+ decrypted_data = engine.decrypt(encrypted_str)
92
+
93
+ # Deserialize using _custom_decoder for consistent ObjectId handling
94
+ data = json.loads(decrypted_data, object_hook=_custom_decoder)
95
+
96
+ logger.debug(
97
+ f"SQLAlchemy-Utils: Decrypted {len(encrypted_bytes)} bytes to {len(data)} records"
98
+ )
99
+ return data
100
+
101
+ except Exception as e:
102
+ logger.error(f"SQLAlchemy-Utils decryption failed: {e}")
103
+ raise EncryptionError(f"SQLAlchemy-Utils decryption failed: {str(e)}")
104
+
105
+
106
+ # Cryptography Library Implementation (standard, chunked processing)
107
+ def encrypt_with_cryptography(
108
+ data: Union[List[Row], Any], chunk_size: Optional[int] = None
109
+ ) -> bytes:
110
+ """
111
+ Serialize and encrypt data using the standard cryptography library with chunked processing.
112
+
113
+ This provides fast performance and memory efficiency for large datasets.
114
+
115
+ Args:
116
+ data: Raw data to serialize and encrypt
117
+ chunk_size: Size of chunks for processing (default 4MB)
118
+
119
+ Returns:
120
+ Encrypted bytes (base64-encoded string as bytes)
121
+
122
+ Raises:
123
+ EncryptionError: If serialization or encryption fails
124
+ """
125
+ try:
126
+ # Set default chunk size
127
+ if chunk_size is None:
128
+ chunk_size = 4 * 1024 * 1024 # 4MB chunks
129
+
130
+ # Serialize using CustomJSONEncoder for consistent handling
131
+ serialized_data = json.dumps(data, cls=CustomJSONEncoder, separators=(",", ":"))
132
+ plaintext = serialized_data.encode("utf-8")
133
+
134
+ data_size_mb = len(plaintext) / (1024 * 1024)
135
+ chunk_size_mb = chunk_size / (1024 * 1024)
136
+ estimated_chunks = len(plaintext) // chunk_size + (
137
+ 1 if len(plaintext) % chunk_size else 0
138
+ )
139
+ record_count = len(data) if isinstance(data, list) else "N/A"
140
+
141
+ logger.info(
142
+ f"Cryptography: Encrypting {record_count} records ({data_size_mb:.1f} MB) "
143
+ f"using {chunk_size_mb:.0f}MB chunks (~{estimated_chunks} chunks)"
144
+ )
145
+
146
+ # Use SQLAlchemy-Utils compatible key (SHA256 hash of app key)
147
+ key = _get_sqlalchemy_compatible_key()
148
+ nonce = os.urandom(12) # 96-bit nonce for AES-GCM
149
+
150
+ # Create cipher
151
+ cipher = Cipher(
152
+ algorithms.AES(key), modes.GCM(nonce), backend=default_backend()
153
+ )
154
+ encryptor = cipher.encryptor()
155
+
156
+ # Process in chunks for memory efficiency
157
+ ciphertext_chunks = []
158
+ for i in range(0, len(plaintext), chunk_size):
159
+ chunk = plaintext[i : i + chunk_size]
160
+ ciphertext_chunks.append(encryptor.update(chunk))
161
+
162
+ # Finalize and get tag
163
+ encryptor.finalize()
164
+ tag = encryptor.tag
165
+
166
+ # Combine in same format as SQLAlchemy-Utils: [nonce/iv][tag][ciphertext]
167
+ ciphertext = b"".join(ciphertext_chunks)
168
+ binary_result = nonce + tag + ciphertext
169
+
170
+ # Base64 encode to match SQLAlchemy-Utils format
171
+ base64_result = base64.b64encode(binary_result).decode("utf-8")
172
+ result_bytes = base64_result.encode("utf-8")
173
+
174
+ encrypted_size_mb = len(result_bytes) / (1024 * 1024)
175
+ logger.info(
176
+ f"Cryptography: Encrypted successfully - "
177
+ f"{len(ciphertext_chunks)} chunks, {encrypted_size_mb:.1f} MB output (base64)"
178
+ )
179
+
180
+ return result_bytes
181
+
182
+ except Exception as e:
183
+ logger.error(f"Cryptography encryption failed: {e}")
184
+ raise EncryptionError(f"Cryptography encryption failed: {str(e)}")
185
+
186
+
187
+ def decrypt_with_cryptography(
188
+ encrypted_bytes: bytes, chunk_size: Optional[int] = None
189
+ ) -> Union[List[Row], Any]:
190
+ """
191
+ Decrypt and deserialize data using the cryptography library with chunked processing.
192
+
193
+ Args:
194
+ encrypted_bytes: Encrypted data (base64-encoded string as bytes)
195
+ chunk_size: Size of chunks for processing (default 4MB)
196
+
197
+ Returns:
198
+ Deserialized data
199
+
200
+ Raises:
201
+ EncryptionError: If decryption or deserialization fails
202
+ """
203
+ try:
204
+ # Set default chunk size
205
+ if chunk_size is None:
206
+ chunk_size = 4 * 1024 * 1024 # 4MB chunks
207
+
208
+ # Decode from base64
209
+ encrypted_str = encrypted_bytes.decode("utf-8")
210
+ binary_data = base64.b64decode(encrypted_str)
211
+
212
+ # Extract components in SQLAlchemy-Utils format: [nonce/iv][tag][ciphertext]
213
+ if len(binary_data) < 28: # 12 (nonce) + 16 (tag)
214
+ raise ValueError("Encrypted data too short")
215
+
216
+ nonce = binary_data[:12] # First 12 bytes: nonce/IV
217
+ tag = binary_data[12:28] # Next 16 bytes: tag
218
+ ciphertext = binary_data[28:] # Remaining bytes: ciphertext
219
+
220
+ encrypted_size_mb = len(encrypted_bytes) / (1024 * 1024)
221
+ chunk_size_mb = chunk_size / (1024 * 1024)
222
+ estimated_chunks = len(ciphertext) // chunk_size + (
223
+ 1 if len(ciphertext) % chunk_size else 0
224
+ )
225
+
226
+ logger.info(
227
+ f"Cryptography: Decrypting {encrypted_size_mb:.1f} MB "
228
+ f"using {chunk_size_mb:.0f}MB chunks (~{estimated_chunks} chunks)"
229
+ )
230
+
231
+ # Use SQLAlchemy-Utils compatible key
232
+ key = _get_sqlalchemy_compatible_key()
233
+ cipher = Cipher(
234
+ algorithms.AES(key), modes.GCM(nonce, tag), backend=default_backend()
235
+ )
236
+ decryptor = cipher.decryptor()
237
+
238
+ # Process in chunks for memory efficiency
239
+ plaintext_chunks = []
240
+ for i in range(0, len(ciphertext), chunk_size):
241
+ chunk = ciphertext[i : i + chunk_size]
242
+ plaintext_chunks.append(decryptor.update(chunk))
243
+
244
+ # Finalize
245
+ decryptor.finalize()
246
+
247
+ # Combine and deserialize
248
+ plaintext = b"".join(plaintext_chunks)
249
+ decrypted_json = plaintext.decode("utf-8")
250
+ data = json.loads(decrypted_json, object_hook=_custom_decoder)
251
+
252
+ record_count = len(data) if isinstance(data, list) else "N/A"
253
+ logger.info(f"Cryptography: Successfully decrypted {record_count} records")
254
+
255
+ return data
256
+
257
+ except Exception as e:
258
+ logger.error(f"Cryptography decryption failed: {e}")
259
+ raise EncryptionError(f"Cryptography decryption failed: {str(e)}")
260
+
261
+
262
+ def _get_sqlalchemy_compatible_key() -> bytes:
263
+ """Get 32-byte encryption key compatible with SQLAlchemy-Utils AesGcmEngine."""
264
+ app_key = CONFIG.security.app_encryption_key.encode(CONFIG.security.encoding)
265
+ # SQLAlchemy-Utils always uses SHA256 hash of the key
266
+ return hashlib.sha256(app_key).digest()
267
+
268
+
269
+ # Public API - Use cryptography by default for new operations
270
+ encrypt_data = encrypt_with_cryptography
271
+ decrypt_data = decrypt_with_cryptography
File without changes
@@ -0,0 +1,150 @@
1
+ from typing import Optional
2
+
3
+ from loguru import logger
4
+ from sqlalchemy import select
5
+ from sqlalchemy.orm import Session
6
+
7
+ from fides.api.models.fides_user import FidesUser
8
+ from fides.api.models.manual_tasks.manual_task import ManualTask, ManualTaskReference
9
+ from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
10
+ from fides.api.schemas.manual_tasks.manual_task_schemas import (
11
+ ManualTaskLogStatus,
12
+ ManualTaskParentEntityType,
13
+ ManualTaskReferenceType,
14
+ ManualTaskType,
15
+ )
16
+
17
+
18
+ class ManualTaskService:
19
+ def __init__(self, db: Session):
20
+ self.db = db
21
+
22
+ def get_task(
23
+ self,
24
+ task_id: Optional[str] = None,
25
+ parent_entity_id: Optional[str] = None,
26
+ parent_entity_type: Optional[ManualTaskParentEntityType] = None,
27
+ task_type: Optional[ManualTaskType] = None,
28
+ ) -> Optional[ManualTask]:
29
+ """Get the manual task using provided filters.
30
+
31
+ Args:
32
+ task_id: The task ID
33
+ parent_entity_id: The parent entity ID
34
+ parent_entity_type: The parent entity type
35
+ task_type: The task type
36
+
37
+ Returns:
38
+ Optional[ManualTask]: The manual task for the connection, if it exists
39
+ """
40
+ if not any([task_id, parent_entity_id, parent_entity_type, task_type]):
41
+ logger.warning("No filters provided to get_task. Returning None.")
42
+ return None
43
+
44
+ stmt = select(ManualTask) # type: ignore[arg-type]
45
+ if task_id:
46
+ stmt = stmt.where(ManualTask.id == task_id)
47
+ if parent_entity_id:
48
+ stmt = stmt.where(ManualTask.parent_entity_id == parent_entity_id)
49
+ if parent_entity_type:
50
+ stmt = stmt.where(ManualTask.parent_entity_type == parent_entity_type)
51
+ if task_type:
52
+ stmt = stmt.where(ManualTask.task_type == task_type)
53
+ return self.db.execute(stmt).scalar_one_or_none()
54
+
55
+ # User Management
56
+ def assign_users_to_task(
57
+ self, db: Session, task: ManualTask, user_ids: list[str]
58
+ ) -> None:
59
+ """Assigns users to this task. We can assign one or more users to a task.
60
+
61
+ Args:
62
+ db: Database session
63
+ task: The task to assign users to
64
+ user_ids: List of user IDs to assign
65
+ """
66
+ user_ids = list(set(user_ids))
67
+ if not user_ids:
68
+ raise ValueError("User ID is required for assignment")
69
+
70
+ # Create new user assignment
71
+ for user_id in user_ids:
72
+ # if user is already assigned, skip
73
+ if user_id in task.assigned_users:
74
+ continue
75
+ # verify user exists
76
+ user = db.query(FidesUser).filter_by(id=user_id).first()
77
+ if not user:
78
+ ManualTaskLog.create_error_log(
79
+ db=db,
80
+ task_id=task.id,
81
+ message=f"Failed to add user {user_id} to task {task.id}: user does not exist",
82
+ details={"user_id": user_id},
83
+ )
84
+ continue
85
+
86
+ ManualTaskReference.create(
87
+ db=db,
88
+ data={
89
+ "task_id": task.id,
90
+ "reference_id": user_id,
91
+ "reference_type": ManualTaskReferenceType.assigned_user,
92
+ },
93
+ )
94
+
95
+ # Log the user assignment
96
+ ManualTaskLog.create_log(
97
+ db=db,
98
+ task_id=task.id,
99
+ status=ManualTaskLogStatus.updated,
100
+ message=f"User {user_id} assigned to task",
101
+ details={"assigned_user_id": user_id},
102
+ )
103
+
104
+ def unassign_users_from_task(
105
+ self, db: Session, task: ManualTask, user_ids: list[str]
106
+ ) -> None:
107
+ """Remove the user assignment from this task.
108
+
109
+ Args:
110
+ db: Database session
111
+ task: The task to unassign users from
112
+ user_ids: List of user IDs to unassign
113
+ """
114
+ user_ids = list(set(user_ids))
115
+ if not user_ids:
116
+ raise ValueError("User ID is required for unassignment")
117
+
118
+ # Get references to unassign
119
+ references_to_unassign = (
120
+ db.query(ManualTaskReference)
121
+ .filter(
122
+ ManualTaskReference.task_id == task.id,
123
+ ManualTaskReference.reference_type
124
+ == ManualTaskReferenceType.assigned_user,
125
+ ManualTaskReference.reference_id.in_(user_ids),
126
+ )
127
+ .all()
128
+ )
129
+
130
+ # Delete references and log unassignments
131
+ for ref in references_to_unassign:
132
+ ref.delete(db)
133
+ ManualTaskLog.create_log(
134
+ db=db,
135
+ task_id=task.id,
136
+ status=ManualTaskLogStatus.updated,
137
+ message=f"User {ref.reference_id} unassigned from task",
138
+ details={"unassigned_user_id": ref.reference_id},
139
+ )
140
+
141
+ # Check if any users weren't unassigned
142
+ unassigned_user_ids = [ref.reference_id for ref in references_to_unassign]
143
+ left_over_user_ids = [
144
+ user_id for user_id in user_ids if user_id not in unassigned_user_ids
145
+ ]
146
+ if left_over_user_ids:
147
+ logger.warning(
148
+ f"Failed to unassign users {left_over_user_ids} from task {task.id}: "
149
+ "users were not assigned to the task"
150
+ )
@@ -20,6 +20,7 @@ from fides.api.models.privacy_request import (
20
20
  RequestTask,
21
21
  )
22
22
  from fides.api.models.property import Property
23
+ from fides.api.models.worker_task import ExecutionLogStatus
23
24
  from fides.api.schemas.api import BulkUpdateFailed
24
25
  from fides.api.schemas.messaging.messaging import MessagingActionType
25
26
  from fides.api.schemas.policy import ActionType, CurrentStep
@@ -27,7 +28,6 @@ from fides.api.schemas.privacy_request import (
27
28
  BulkPostPrivacyRequests,
28
29
  BulkReviewResponse,
29
30
  CheckpointActionRequired,
30
- ExecutionLogStatus,
31
31
  PrivacyRequestCreate,
32
32
  PrivacyRequestResponse,
33
33
  PrivacyRequestResubmit,
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/pages/404-ec04f826f3dd79ea.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/pages/404-ec04f826f3dd79ea.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/92fc10cc7ed1aba3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/92fc10cc7ed1aba3.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/5277-e8a036319456127f.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/7980-736f9fd1e749ddd2.js" defer=""></script><script src="/_next/static/chunks/8499-1fd392d0be9e8ee4.js" defer=""></script><script src="/_next/static/chunks/6202-081545c7822d09af.js" defer=""></script><script src="/_next/static/chunks/4132-9b1731bfec6ee537.js" defer=""></script><script src="/_next/static/chunks/8032-74d94f7bd5b81c89.js" defer=""></script><script src="/_next/static/chunks/pages/add-systems/manual-1bec086d567aacff.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/add-systems/manual","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/92fc10cc7ed1aba3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/92fc10cc7ed1aba3.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/5277-e8a036319456127f.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/7980-736f9fd1e749ddd2.js" defer=""></script><script src="/_next/static/chunks/8499-1fd392d0be9e8ee4.js" defer=""></script><script src="/_next/static/chunks/6202-081545c7822d09af.js" defer=""></script><script src="/_next/static/chunks/4132-9b1731bfec6ee537.js" defer=""></script><script src="/_next/static/chunks/8032-74d94f7bd5b81c89.js" defer=""></script><script src="/_next/static/chunks/pages/add-systems/manual-1bec086d567aacff.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/add-systems/manual","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/3923-b4f701ada3ef0ee0.js" defer=""></script><script src="/_next/static/chunks/796-d6586308ed44334b.js" defer=""></script><script src="/_next/static/chunks/pages/add-systems/multiple-f68bf100e4e60e88.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/add-systems/multiple","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/3923-b4f701ada3ef0ee0.js" defer=""></script><script src="/_next/static/chunks/796-d6586308ed44334b.js" defer=""></script><script src="/_next/static/chunks/pages/add-systems/multiple-f68bf100e4e60e88.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/add-systems/multiple","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/972dc7eef106ee7c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/972dc7eef106ee7c.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/pages/add-systems-effde5cfe49de55f.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/add-systems","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/972dc7eef106ee7c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/972dc7eef106ee7c.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/pages/add-systems-effde5cfe49de55f.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/add-systems","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/3923-b4f701ada3ef0ee0.js" defer=""></script><script src="/_next/static/chunks/796-d6586308ed44334b.js" defer=""></script><script src="/_next/static/chunks/pages/consent/configure/add-vendors-ec95ed8cb0712828.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/configure/add-vendors","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/3923-b4f701ada3ef0ee0.js" defer=""></script><script src="/_next/static/chunks/796-d6586308ed44334b.js" defer=""></script><script src="/_next/static/chunks/pages/consent/configure/add-vendors-ec95ed8cb0712828.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/configure/add-vendors","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/3923-b4f701ada3ef0ee0.js" defer=""></script><script src="/_next/static/chunks/pages/consent/configure-4cc195e15e0c3cc8.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/configure","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/401-7e800aed05537126.js" defer=""></script><script src="/_next/static/chunks/3923-b4f701ada3ef0ee0.js" defer=""></script><script src="/_next/static/chunks/pages/consent/configure-4cc195e15e0c3cc8.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/configure","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/3670-2abd9b2f17770872.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/1817-951f58ddd5d46081.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-experience/%5Bid%5D-be8972c79fb39705.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-experience/[id]","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/3670-2abd9b2f17770872.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/1817-951f58ddd5d46081.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-experience/%5Bid%5D-be8972c79fb39705.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-experience/[id]","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/3670-2abd9b2f17770872.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/1817-951f58ddd5d46081.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-experience/new-a0039f216fb3eb93.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-experience/new","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/3670-2abd9b2f17770872.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/1817-951f58ddd5d46081.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-experience/new-a0039f216fb3eb93.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-experience/new","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/5277-e8a036319456127f.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/6853-688df0b88fe65fd5.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-experience-ccf96207de3b74ea.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-experience","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/5277-e8a036319456127f.js" defer=""></script><script src="/_next/static/chunks/7553-08bc3d9f66695111.js" defer=""></script><script src="/_next/static/chunks/4481-7f6710c928bb0cb0.js" defer=""></script><script src="/_next/static/chunks/6853-688df0b88fe65fd5.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-experience-ccf96207de3b74ea.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-experience","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/6659-b2088f525bf13c17.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/6954-4e313b4599b8763d.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-notices/%5Bid%5D-b9823cc008372cee.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-notices/[id]","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/6659-b2088f525bf13c17.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/6954-4e313b4599b8763d.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-notices/%5Bid%5D-b9823cc008372cee.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-notices/[id]","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/6659-b2088f525bf13c17.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/6954-4e313b4599b8763d.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-notices/new-373f5772ab41bc93.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_buildManifest.js" defer=""></script><script src="/_next/static/Fb70i-8GI-owNAvgEJWhA/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-notices/new","query":{},"buildId":"Fb70i-8GI-owNAvgEJWhA","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/6659-b2088f525bf13c17.js" defer=""></script><script src="/_next/static/chunks/69-00cba94689b9e740.js" defer=""></script><script src="/_next/static/chunks/6277-459e054b2702c60e.js" defer=""></script><script src="/_next/static/chunks/6954-4e313b4599b8763d.js" defer=""></script><script src="/_next/static/chunks/pages/consent/privacy-notices/new-373f5772ab41bc93.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_buildManifest.js" defer=""></script><script src="/_next/static/SZn_Fpr_qG1COMjkdloep/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/consent/privacy-notices/new","query":{},"buildId":"SZn_Fpr_qG1COMjkdloep","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>