flaxdiff 0.1.36.2__py3-none-any.whl → 0.1.36.4__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 (49) hide show
  1. {data → flaxdiff/data}/sources/tfds.py +12 -0
  2. {trainer → flaxdiff/trainer}/diffusion_trainer.py +6 -7
  3. {flaxdiff-0.1.36.2.dist-info → flaxdiff-0.1.36.4.dist-info}/METADATA +1 -1
  4. flaxdiff-0.1.36.4.dist-info/RECORD +47 -0
  5. flaxdiff-0.1.36.4.dist-info/top_level.txt +1 -0
  6. flaxdiff-0.1.36.2.dist-info/RECORD +0 -47
  7. flaxdiff-0.1.36.2.dist-info/top_level.txt +0 -9
  8. /__init__.py → /flaxdiff/__init__.py +0 -0
  9. {data → flaxdiff/data}/__init__.py +0 -0
  10. {data → flaxdiff/data}/dataset_map.py +0 -0
  11. {data → flaxdiff/data}/datasets.py +0 -0
  12. {data → flaxdiff/data}/online_loader.py +0 -0
  13. {data → flaxdiff/data}/sources/gcs.py +0 -0
  14. {metrics → flaxdiff/metrics}/inception.py +0 -0
  15. {metrics → flaxdiff/metrics}/utils.py +0 -0
  16. {models → flaxdiff/models}/__init__.py +0 -0
  17. {models → flaxdiff/models}/attention.py +0 -0
  18. {models → flaxdiff/models}/autoencoder/__init__.py +0 -0
  19. {models → flaxdiff/models}/autoencoder/autoencoder.py +0 -0
  20. {models → flaxdiff/models}/autoencoder/diffusers.py +0 -0
  21. {models → flaxdiff/models}/autoencoder/simple_autoenc.py +0 -0
  22. {models → flaxdiff/models}/common.py +0 -0
  23. {models → flaxdiff/models}/favor_fastattn.py +0 -0
  24. {models → flaxdiff/models}/simple_unet.py +0 -0
  25. {models → flaxdiff/models}/simple_vit.py +0 -0
  26. {predictors → flaxdiff/predictors}/__init__.py +0 -0
  27. {samplers → flaxdiff/samplers}/__init__.py +0 -0
  28. {samplers → flaxdiff/samplers}/common.py +0 -0
  29. {samplers → flaxdiff/samplers}/ddim.py +0 -0
  30. {samplers → flaxdiff/samplers}/ddpm.py +0 -0
  31. {samplers → flaxdiff/samplers}/euler.py +0 -0
  32. {samplers → flaxdiff/samplers}/heun_sampler.py +0 -0
  33. {samplers → flaxdiff/samplers}/multistep_dpm.py +0 -0
  34. {samplers → flaxdiff/samplers}/rk4_sampler.py +0 -0
  35. {schedulers → flaxdiff/schedulers}/__init__.py +0 -0
  36. {schedulers → flaxdiff/schedulers}/common.py +0 -0
  37. {schedulers → flaxdiff/schedulers}/continuous.py +0 -0
  38. {schedulers → flaxdiff/schedulers}/cosine.py +0 -0
  39. {schedulers → flaxdiff/schedulers}/discrete.py +0 -0
  40. {schedulers → flaxdiff/schedulers}/exp.py +0 -0
  41. {schedulers → flaxdiff/schedulers}/karras.py +0 -0
  42. {schedulers → flaxdiff/schedulers}/linear.py +0 -0
  43. {schedulers → flaxdiff/schedulers}/sqrt.py +0 -0
  44. {trainer → flaxdiff/trainer}/__init__.py +0 -0
  45. {trainer → flaxdiff/trainer}/autoencoder_trainer.py +0 -0
  46. {trainer → flaxdiff/trainer}/simple_trainer.py +0 -0
  47. {trainer → flaxdiff/trainer}/video_diffusion_trainer.py +0 -0
  48. /utils.py → /flaxdiff/utils.py +0 -0
  49. {flaxdiff-0.1.36.2.dist-info → flaxdiff-0.1.36.4.dist-info}/WHEEL +0 -0
@@ -4,6 +4,8 @@ import grain.python as pygrain
4
4
  from flaxdiff.utils import AutoTextTokenizer
5
5
  from typing import Dict
6
6
  import random
7
+ import augmax
8
+ import jax
7
9
 
8
10
  # -----------------------------------------------------------------------------------------------#
9
11
  # Oxford flowers and other TFDS datasources -----------------------------------------------------#
@@ -47,6 +49,15 @@ def tfds_augmenters(image_scale, method):
47
49
  interpolation = cv2.INTER_CUBIC
48
50
  else:
49
51
  interpolation = cv2.INTER_AREA
52
+
53
+ augments = augmax.Chain(
54
+ augmax.HorizontalFlip(0.5),
55
+ augmax.RandomContrast((-0.05, 0.05), 1.),
56
+ augmax.RandomBrightness((-0.2, 0.2), 1.)
57
+ )
58
+
59
+ augments = jax.jit(augments, backend="cpu")
60
+
50
61
  class augmenters(pygrain.MapTransform):
51
62
  def __init__(self, *args, **kwargs):
52
63
  super().__init__(*args, **kwargs)
@@ -56,6 +67,7 @@ def tfds_augmenters(image_scale, method):
56
67
  image = element['image']
57
68
  image = cv2.resize(image, (image_scale, image_scale),
58
69
  interpolation=interpolation)
70
+ # image = augments(image)
59
71
  # image = (image - 127.5) / 127.5
60
72
  caption = labelizer(element)
61
73
  results = self.tokenize(caption)
@@ -14,6 +14,7 @@ from typing import Dict, Callable, Sequence, Any, Union, Tuple, Type
14
14
  from ..schedulers import NoiseScheduler
15
15
  from ..predictors import DiffusionPredictionTransform, EpsilonPredictionTransform
16
16
  from ..samplers.common import DiffusionSampler
17
+ from ..samplers.ddim import DDIMSampler
17
18
 
18
19
  from flaxdiff.utils import RandomMarkovState
19
20
 
@@ -179,9 +180,6 @@ class DiffusionTrainer(SimpleTrainer):
179
180
  nloss = loss_fn(preds, expected_output)
180
181
  # Ignore the loss contribution of images with zero standard deviation
181
182
  nloss *= noise_schedule.get_weights(noise_level)
182
- # nloss = jnp.mean(nloss, axis=(1,2,3))
183
- # nloss = jnp.where(is_non_zero, nloss, 0)
184
- # nloss = jnp.mean(nloss, where=nloss != 0)
185
183
  nloss = jnp.mean(nloss)
186
184
  loss = nloss
187
185
  return loss
@@ -224,11 +222,11 @@ class DiffusionTrainer(SimpleTrainer):
224
222
  if distributed_training:
225
223
  train_step = shard_map(train_step, mesh=self.mesh, in_specs=(P(), P(), P('data'), P('data')),
226
224
  out_specs=(P(), P(), P()))
227
- train_step = jax.jit(train_step)
225
+ train_step = jax.jit(train_step)
228
226
 
229
227
  return train_step
230
228
 
231
- def _define_vaidation_step(self, sampler_class: Type[DiffusionSampler]):
229
+ def _define_vaidation_step(self, sampler_class: Type[DiffusionSampler]=DDIMSampler, sampling_noise_schedule: NoiseScheduler=None):
232
230
  model = self.model
233
231
  encoder = self.encoder
234
232
  autoencoder = self.autoencoder
@@ -241,7 +239,7 @@ class DiffusionTrainer(SimpleTrainer):
241
239
  sampler = sampler_class(
242
240
  model=model,
243
241
  params=state.ema_params,
244
- noise_schedule=self.noise_schedule,
242
+ noise_schedule=self.noise_schedule if sampling_noise_schedule is None else sampling_noise_schedule,
245
243
  model_output_transform=self.model_output_transform,
246
244
  image_size=self.input_shapes['x'][0],
247
245
  null_labels_seq=null_labels_full,
@@ -311,10 +309,11 @@ class DiffusionTrainer(SimpleTrainer):
311
309
  print("Error logging images to wandb", e)
312
310
  traceback.print_exc()
313
311
 
314
- def fit(self, data, training_steps_per_epoch, epochs, val_steps_per_epoch=8, sampler_class=None):
312
+ def fit(self, data, training_steps_per_epoch, epochs, val_steps_per_epoch=8, sampler_class: Type[DiffusionSampler]=DDIMSampler, sampling_noise_schedule: NoiseScheduler=None):
315
313
  local_batch_size = data['local_batch_size']
316
314
  validation_step_args = {
317
315
  "sampler_class": sampler_class,
316
+ "sampling_noise_schedule": sampling_noise_schedule,
318
317
  }
319
318
  super().fit(
320
319
  data,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flaxdiff
3
- Version: 0.1.36.2
3
+ Version: 0.1.36.4
4
4
  Summary: A versatile and easy to understand Diffusion library
5
5
  Author-email: Ashish Kumar Singh <ashishkmr472@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,47 @@
1
+ flaxdiff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ flaxdiff/utils.py,sha256=b_hFXsam2NICQYCFk0EOcqtBjM-RUqnN0NKTn0lQ070,6532
3
+ flaxdiff/data/__init__.py,sha256=PM3PkHihyohT5SHVYKc8vQ4IeVfGPpCktkSVwvqMjQ4,52
4
+ flaxdiff/data/dataset_map.py,sha256=hcHaoR2IbNQmfyPUhYd6_8xinurxxCqawQijAsDI0Ek,3093
5
+ flaxdiff/data/datasets.py,sha256=YUMoSvF2yAyikRvRofZVlHwfEOU3zXSSG4KkLnVfpoA,5626
6
+ flaxdiff/data/online_loader.py,sha256=1Fi_QRixxRzbt602nORINcDeHEccvCrBpagrz4PURYg,12499
7
+ flaxdiff/data/sources/gcs.py,sha256=11ZuQhvMyJRLg21DgVdzO5qEuae7zgzTXGNOskF-cbs,3380
8
+ flaxdiff/data/sources/tfds.py,sha256=7n-uobG_UvkD5mU_1ovPd9kb6xJrbEKFFXdVEHDunts,2781
9
+ flaxdiff/metrics/inception.py,sha256=a5kjMCPMT9gB88c_HCKiek-2vsAyoE35K7nDt4h4pVI,31843
10
+ flaxdiff/metrics/utils.py,sha256=YuuOfqvqgIjsceupwNeJ59vQ2TnGeNMIyKdkIqOmoNg,1702
11
+ flaxdiff/models/__init__.py,sha256=FAivVYXxM2JrCFIXf-C3374RB2Hth25dBrzOeNFhH1U,26
12
+ flaxdiff/models/attention.py,sha256=JvrP7-09MV6IfRLRBhqjPmNUU-lkEMk9TOnJSBKcar8,13289
13
+ flaxdiff/models/common.py,sha256=hWsSs2BP2J-JN1s4qLRr-h-KYkcVyl2hOp1Wsm_L-h8,10994
14
+ flaxdiff/models/favor_fastattn.py,sha256=79Ew1nqarsNLPzZaBSd1ILORzJr74CupYeqGiCQK5E4,27689
15
+ flaxdiff/models/simple_unet.py,sha256=L5m2j5580QP7pJ5VIme7U5xYA22PZiGP7qdvcKUnB38,11463
16
+ flaxdiff/models/simple_vit.py,sha256=UCDDr0XVnpf6tbJWKFtEt3_nAqMqOoakXf5amyVWZNo,7929
17
+ flaxdiff/models/autoencoder/__init__.py,sha256=qY-7MldZpsfkF-_T2LqlRK7VHbqfmosz0NmvzDlBkOk,78
18
+ flaxdiff/models/autoencoder/autoencoder.py,sha256=27_hYl0yXAdH9Mx4Xu9J79mSNo-FEKr9SxhVaS3ffn4,591
19
+ flaxdiff/models/autoencoder/diffusers.py,sha256=JHeFLCxiHhu-QHwhKiCuKsQJn4AZumquiuxgZkiYGQ0,3643
20
+ flaxdiff/models/autoencoder/simple_autoenc.py,sha256=UXHPgDmwGTnv3Uts6Zj3p9R9nJXnEiEXbllgarwDfXM,805
21
+ flaxdiff/predictors/__init__.py,sha256=SKkYYRF9Wfgk2zhtZw4vCXOdOeRlrm2Mk6cvuaEvAzc,4403
22
+ flaxdiff/samplers/__init__.py,sha256=_S-9TwDeshrI0VmapV-J2hqjTByOa0-oOeUs_IdovjU,285
23
+ flaxdiff/samplers/common.py,sha256=ZA08VyovxegpRx4wOQq9LSwZi0gSCz2lrbS5oVYOEYg,8488
24
+ flaxdiff/samplers/ddim.py,sha256=pB8Kod8ZLJ3GXev4uM3cOj1Uy6ibR0jsaZa-VE0fyJM,552
25
+ flaxdiff/samplers/ddpm.py,sha256=u1OchQu0XPhc_6w9JXoaFp2wo4y-zXyQNtGAIJwxNLg,2209
26
+ flaxdiff/samplers/euler.py,sha256=Htb-IJeu7jSgY6mvgYr9yl9pUnos49vijlVk5IQsRps,2740
27
+ flaxdiff/samplers/heun_sampler.py,sha256=UyI-hSlyWvt-7VEUJj27zjgyzKkGVl8fDUHV-YpSOCc,1421
28
+ flaxdiff/samplers/multistep_dpm.py,sha256=3Wu3MrMLYaBb1ObraTbWrJmtEtU0adl1dDbz5fPJ4Gs,2735
29
+ flaxdiff/samplers/rk4_sampler.py,sha256=1j1pES_Q2QiaURvEWeedbbT1LHmkc3jsu0GgH83qBL0,1926
30
+ flaxdiff/schedulers/__init__.py,sha256=3id390WEfdf-MN-oLSPAhlRFIXrFWr6ioAHPAwURJyE,375
31
+ flaxdiff/schedulers/common.py,sha256=b-W4iI-aqScpVE8VZbBpiYvAVI6rqDkUP-C_hEVBwCI,4151
32
+ flaxdiff/schedulers/continuous.py,sha256=5c_niOA20fxJ5oJDi09FfayIRogBGwtfG0XThW2IUZk,334
33
+ flaxdiff/schedulers/cosine.py,sha256=9ban0dFHLMm35wQvaBT4nCQwPGmzNsXwQ1xI0oppmJI,2005
34
+ flaxdiff/schedulers/discrete.py,sha256=O54wH2HVu3olJA71NxgAXFW9cr6B6Gl-DR_uZeytpds,3319
35
+ flaxdiff/schedulers/exp.py,sha256=cPTnUJpYdzJRRZqMLYQz0rRUCpEmaP2tXhRumLx94jA,605
36
+ flaxdiff/schedulers/karras.py,sha256=4GN120kGwdxxU-h2mVdhBVy9IORkUMm_vvz3XjthBcI,3355
37
+ flaxdiff/schedulers/linear.py,sha256=6003F5ISq1Wc0h6UAzY95MJgsDIKGMhBzbiVALpea0k,581
38
+ flaxdiff/schedulers/sqrt.py,sha256=1F84ZgQPuoNMhe6yxGTR2G0h7dPOZtm4UDQOakbSsEU,445
39
+ flaxdiff/trainer/__init__.py,sha256=T-vUVq4zHcMK6kpCsG4Gu8vn71q6lZD-lg-Ul7yKfEk,128
40
+ flaxdiff/trainer/autoencoder_trainer.py,sha256=hxihkRL9WCIQVGOP-pc1jjjIUaRXDLcNo3_erTKsuWM,7049
41
+ flaxdiff/trainer/diffusion_trainer.py,sha256=zde_nRzsC2GD5KNCn5Qjw9ldHi7L_-teJhcUNUDCdcQ,12815
42
+ flaxdiff/trainer/simple_trainer.py,sha256=lmRo8N0bMupIyS3ejPvPtxoskY_3GLC8iyJE6u4TIWc,21990
43
+ flaxdiff/trainer/video_diffusion_trainer.py,sha256=gMkKpnKNTo8QhTx5ptEEkc7W5-7rzXIr9queU53hXyQ,2197
44
+ flaxdiff-0.1.36.4.dist-info/METADATA,sha256=MTgRu4VgbQaGqbGv_S3wXd_dzeNmHXnixRdvs93dWj0,22310
45
+ flaxdiff-0.1.36.4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
46
+ flaxdiff-0.1.36.4.dist-info/top_level.txt,sha256=-2-nXnfkJgSfkki1tjm5Faw6Dso7vhtdn2szwCdX5CQ,9
47
+ flaxdiff-0.1.36.4.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ flaxdiff
@@ -1,47 +0,0 @@
1
- __init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- utils.py,sha256=b_hFXsam2NICQYCFk0EOcqtBjM-RUqnN0NKTn0lQ070,6532
3
- data/__init__.py,sha256=PM3PkHihyohT5SHVYKc8vQ4IeVfGPpCktkSVwvqMjQ4,52
4
- data/dataset_map.py,sha256=hcHaoR2IbNQmfyPUhYd6_8xinurxxCqawQijAsDI0Ek,3093
5
- data/datasets.py,sha256=YUMoSvF2yAyikRvRofZVlHwfEOU3zXSSG4KkLnVfpoA,5626
6
- data/online_loader.py,sha256=1Fi_QRixxRzbt602nORINcDeHEccvCrBpagrz4PURYg,12499
7
- data/sources/gcs.py,sha256=11ZuQhvMyJRLg21DgVdzO5qEuae7zgzTXGNOskF-cbs,3380
8
- data/sources/tfds.py,sha256=WA3h9lyR4yotCNEmJON2noIN-2HNcqhf6zigx1XXsMI,2481
9
- metrics/inception.py,sha256=a5kjMCPMT9gB88c_HCKiek-2vsAyoE35K7nDt4h4pVI,31843
10
- metrics/utils.py,sha256=YuuOfqvqgIjsceupwNeJ59vQ2TnGeNMIyKdkIqOmoNg,1702
11
- models/__init__.py,sha256=FAivVYXxM2JrCFIXf-C3374RB2Hth25dBrzOeNFhH1U,26
12
- models/attention.py,sha256=JvrP7-09MV6IfRLRBhqjPmNUU-lkEMk9TOnJSBKcar8,13289
13
- models/common.py,sha256=hWsSs2BP2J-JN1s4qLRr-h-KYkcVyl2hOp1Wsm_L-h8,10994
14
- models/favor_fastattn.py,sha256=79Ew1nqarsNLPzZaBSd1ILORzJr74CupYeqGiCQK5E4,27689
15
- models/simple_unet.py,sha256=L5m2j5580QP7pJ5VIme7U5xYA22PZiGP7qdvcKUnB38,11463
16
- models/simple_vit.py,sha256=UCDDr0XVnpf6tbJWKFtEt3_nAqMqOoakXf5amyVWZNo,7929
17
- models/autoencoder/__init__.py,sha256=qY-7MldZpsfkF-_T2LqlRK7VHbqfmosz0NmvzDlBkOk,78
18
- models/autoencoder/autoencoder.py,sha256=27_hYl0yXAdH9Mx4Xu9J79mSNo-FEKr9SxhVaS3ffn4,591
19
- models/autoencoder/diffusers.py,sha256=JHeFLCxiHhu-QHwhKiCuKsQJn4AZumquiuxgZkiYGQ0,3643
20
- models/autoencoder/simple_autoenc.py,sha256=UXHPgDmwGTnv3Uts6Zj3p9R9nJXnEiEXbllgarwDfXM,805
21
- predictors/__init__.py,sha256=SKkYYRF9Wfgk2zhtZw4vCXOdOeRlrm2Mk6cvuaEvAzc,4403
22
- samplers/__init__.py,sha256=_S-9TwDeshrI0VmapV-J2hqjTByOa0-oOeUs_IdovjU,285
23
- samplers/common.py,sha256=ZA08VyovxegpRx4wOQq9LSwZi0gSCz2lrbS5oVYOEYg,8488
24
- samplers/ddim.py,sha256=pB8Kod8ZLJ3GXev4uM3cOj1Uy6ibR0jsaZa-VE0fyJM,552
25
- samplers/ddpm.py,sha256=u1OchQu0XPhc_6w9JXoaFp2wo4y-zXyQNtGAIJwxNLg,2209
26
- samplers/euler.py,sha256=Htb-IJeu7jSgY6mvgYr9yl9pUnos49vijlVk5IQsRps,2740
27
- samplers/heun_sampler.py,sha256=UyI-hSlyWvt-7VEUJj27zjgyzKkGVl8fDUHV-YpSOCc,1421
28
- samplers/multistep_dpm.py,sha256=3Wu3MrMLYaBb1ObraTbWrJmtEtU0adl1dDbz5fPJ4Gs,2735
29
- samplers/rk4_sampler.py,sha256=1j1pES_Q2QiaURvEWeedbbT1LHmkc3jsu0GgH83qBL0,1926
30
- schedulers/__init__.py,sha256=3id390WEfdf-MN-oLSPAhlRFIXrFWr6ioAHPAwURJyE,375
31
- schedulers/common.py,sha256=b-W4iI-aqScpVE8VZbBpiYvAVI6rqDkUP-C_hEVBwCI,4151
32
- schedulers/continuous.py,sha256=5c_niOA20fxJ5oJDi09FfayIRogBGwtfG0XThW2IUZk,334
33
- schedulers/cosine.py,sha256=9ban0dFHLMm35wQvaBT4nCQwPGmzNsXwQ1xI0oppmJI,2005
34
- schedulers/discrete.py,sha256=O54wH2HVu3olJA71NxgAXFW9cr6B6Gl-DR_uZeytpds,3319
35
- schedulers/exp.py,sha256=cPTnUJpYdzJRRZqMLYQz0rRUCpEmaP2tXhRumLx94jA,605
36
- schedulers/karras.py,sha256=4GN120kGwdxxU-h2mVdhBVy9IORkUMm_vvz3XjthBcI,3355
37
- schedulers/linear.py,sha256=6003F5ISq1Wc0h6UAzY95MJgsDIKGMhBzbiVALpea0k,581
38
- schedulers/sqrt.py,sha256=1F84ZgQPuoNMhe6yxGTR2G0h7dPOZtm4UDQOakbSsEU,445
39
- trainer/__init__.py,sha256=T-vUVq4zHcMK6kpCsG4Gu8vn71q6lZD-lg-Ul7yKfEk,128
40
- trainer/autoencoder_trainer.py,sha256=hxihkRL9WCIQVGOP-pc1jjjIUaRXDLcNo3_erTKsuWM,7049
41
- trainer/diffusion_trainer.py,sha256=ajOWBgFFwXP_VQScUjcuPoaB4Gk02aF0Ls5LNlA8wqA,12691
42
- trainer/simple_trainer.py,sha256=lmRo8N0bMupIyS3ejPvPtxoskY_3GLC8iyJE6u4TIWc,21990
43
- trainer/video_diffusion_trainer.py,sha256=gMkKpnKNTo8QhTx5ptEEkc7W5-7rzXIr9queU53hXyQ,2197
44
- flaxdiff-0.1.36.2.dist-info/METADATA,sha256=4c3Kl8wDAN6pzg_nLfQ3VSbN6e9xVv3flLCsh1ub-4U,22310
45
- flaxdiff-0.1.36.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
46
- flaxdiff-0.1.36.2.dist-info/top_level.txt,sha256=FMc3ZGZsKPjeaG9fWYdPl5HYvG4JBNSxqXJj2WwJz6s,74
47
- flaxdiff-0.1.36.2.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- __init__
2
- data
3
- metrics
4
- models
5
- predictors
6
- samplers
7
- schedulers
8
- trainer
9
- utils
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes