Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
5a7d38b
Bump roombapy to 1.5.2 (#35067)
shenxn May 2, 2020
8c84e47
added abbreviation for temperature_unit (#35076)
unixko May 2, 2020
2f31b85
Fix proliphix (#34397)
mhorst314 May 2, 2020
e602de5
Bump python-synology to 0.8.0 + Fix disk space incorrect sensor type …
Quentame May 2, 2020
9b59ef4
Update bravia-tv to 1.0.3 (#35077)
dcnielsen90 May 2, 2020
37f3613
Upgrade youtube_dl to version 2020.05.03 (#35078)
BKPepe May 2, 2020
88b7aba
Updated frontend to 20200427.2 (#35079)
bramkragten May 2, 2020
ab08c1b
Fix vera config ids not being converted to integers (#35070)
vangorra May 2, 2020
4de30ca
Improve stability of homekit media players (#35080)
bdraco May 2, 2020
221b075
UniFi - Add support for 2.4/5 GHz separated SSIDs (#35062)
Kane610 May 2, 2020
a2048b4
UniFi - Catch controllers running on UniFi OS that don't have a local…
Kane610 May 2, 2020
5450cda
Async vs sync inheritance mismatch fixes (#35088)
scop May 2, 2020
43d63d0
Use savoury1/ffmpeg4 PPA on Travis, PyAV 7 needs FFmpeg >= 4 (#35090)
scop May 2, 2020
752679c
Check isinstance on collections.abc, not typing classes (#35087)
scop May 2, 2020
78f846d
[ci skip] Translation update
homeassistant May 3, 2020
9efca00
Upgrades requests-mock to 1.8.0 (#35093)
frenck May 3, 2020
984a276
Correct error message in Microsoft Face (#35096)
ochlocracy May 3, 2020
aeb8916
Add zwave mqtt (#34987)
MartinHjelmare May 3, 2020
6afb42b
Improve UPnP configuration flow (#34737)
StevenLooman May 3, 2020
f37f488
Add support for influxdb path parameter (#35089)
pdcemulator May 3, 2020
661656e
Fix Synology NAS discovered multiple times (#35094)
Quentame May 3, 2020
de7f82e
Correct typo Asssitant -> Assistant (#35117)
ludeeus May 3, 2020
a44724f
Add codeowner to Monoprice integration (#35111)
OnFreund May 3, 2020
e0bcd00
Fix unloading of Monoprice config entries (#35112)
OnFreund May 3, 2020
d644b61
Increase surepetcare default timeout (#34944)
benleb May 3, 2020
5a2528b
Tibber config flow (#34469)
Danielhiversen May 3, 2020
90fbb15
Use suggestd_value instead of default in Monoprice options flow (#35107)
OnFreund May 3, 2020
e7fc886
Simplify MQTT light brightness logic (#35097)
LordMike May 3, 2020
2af9849
Use asynctest-mock in most places (#35109)
balloob May 3, 2020
6f6c670
Make alexa and google aware of DEVICE_CLASS_GATE (#35103)
bdraco May 3, 2020
b90cb09
Add type to device registry (#35095)
balloob May 3, 2020
39431c0
Add required features to cover service registration (#35073)
MartinHjelmare May 3, 2020
540cb6e
Upgrade spotipy to 2.12.0 (#35149)
frenck May 3, 2020
e7b9cec
Upgrade numpy to 1.18.4 (#35150)
frenck May 3, 2020
4275008
Add support for refreshing synology_dsm sensors (#35141)
ronaldheft May 3, 2020
5b7daa9
Hue: Guard for when there is no brightness (#35151)
balloob May 3, 2020
7e36699
Bump pyiCloud to 0.9.7 + do not warn when pending devices (#35156)
Quentame May 3, 2020
e4e89be
Return emulated hue id for update requests (#35139)
Tho85 May 4, 2020
73fb57f
Support multiple EDL21 meters (#33594)
mtdcr May 4, 2020
c5379a0
Improve emulated_hue compatibility with newer systems (#35148)
Tho85 May 4, 2020
7284f4e
Upgrade pyupgrade to v2.3.0 (#35159)
frenck May 4, 2020
96a998a
Fix Canary KeyError: 'ffmpeg_arguments' (#35158)
frenck May 4, 2020
49979d0
Upgrade cryptography to 2.9.2 (#35084)
BKPepe May 4, 2020
7a73c6a
scrape: extract strings from new non-text tags (#35021)
davidjb May 4, 2020
ad94ccd
Upgrade zeroconf to 0.26.0 (#35176)
fabaff May 4, 2020
5e35550
Upgrade alpha_vantage to 2.2.0 (#35172)
fabaff May 4, 2020
de62860
Remove `certificate` configuration variable from roomba (#35162)
shenxn May 4, 2020
7f2c6b4
Upgrade pytz to 2020.1 (#35174)
fabaff May 4, 2020
dbf383f
Squeezebox add query and sync (#31748)
rajlaud May 4, 2020
c5ce95f
UniFi - Improve signalling and handling of adding new entities (#34925)
Kane610 May 4, 2020
ee07fac
Simplification of upnp component (#35191)
StevenLooman May 4, 2020
b3e637c
Some Sonos fixes (#35115)
amelchio May 4, 2020
e54e927
Extract instance ID helper from updater (#35043)
balloob May 4, 2020
8279efc
Group by endpoints and not by devices for ZHA Zigbee groups (#34583)
dmulcahey May 4, 2020
d8ebdda
Move life360 I/O out of event loop in config flow (#35193)
pnbruckner May 4, 2020
953228e
Allow use of common entity update service in AirVisual (#35203)
bachya May 4, 2020
94b6130
Fix Synology DSM sensor to be False or 0 (#35208)
Quentame May 4, 2020
f9b420a
Make sure MQTT light brightness is not rounded to 0 (#35207)
emontnemery May 4, 2020
dd715fc
Add homekit camera support (#32527)
xdissent May 5, 2020
4be1006
ISY994 migration to PyISY v2 (Structure Changes to enable upgrade, Pa…
shbatm May 5, 2020
96b84ff
Fix AdGuard device info (#35217)
balloob May 5, 2020
53c1aba
Fix utility_meter calibration with float values (#35186)
dgomes May 5, 2020
f885e97
Catch samsungtv timeout exception (#35205)
escoand May 5, 2020
a307157
Fix UVC doing I/O inside the event loop (#35169)
frenck May 5, 2020
de636cc
Add zwave_mqtt sensor platform (#35135)
cgarwood May 5, 2020
0e17f61
Bump up pyserial dependency (#35201)
Adminiuga May 5, 2020
34e35f6
Add config flow base strings (#34523)
balloob May 5, 2020
710deb8
Strict creation of the config for dynalite (#34663)
ziv1234 May 5, 2020
e45f2cf
ISY994 Structure updates in prep for PyISYv2 (Part 2) (#35225)
shbatm May 5, 2020
6b9eed5
Fix string
balloob May 5, 2020
86d410d
Add Home Connect integration (#29214)
DavidMStraub May 5, 2020
8e071b6
Add BleBox integration (#32664)
gadgetmobile May 5, 2020
2ac29cf
Updated frontend to 20200505.0 (#35253)
bramkragten May 5, 2020
4ae31bc
Clean up device registry if entity registry updates (#35106)
balloob May 5, 2020
9983c43
Add issue_tracker property to manifest (#35153)
frenck May 5, 2020
87d58a5
Broader Notion exception handling (#35265)
bachya May 5, 2020
a330eba
Guard bad entity ID in entity registry (#35271)
balloob May 5, 2020
740d9c5
Add manual config flow for Plex (#34476)
jjlawren May 5, 2020
14190bd
Fix pyload API statusServer doesn't take parameters (#35242)
h4de5 May 6, 2020
56beec1
Add zwave workaround identification for Kwikset 916 and Kwikset Obsid…
bryantlee May 6, 2020
1c5b4db
Add current step that is in progress (#35272)
balloob May 6, 2020
2581b03
Fix fan not checking supported_features (#35248)
shenxn May 6, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ omit =
homeassistant/components/hitron_coda/device_tracker.py
homeassistant/components/hive/*
homeassistant/components/hlk_sw16/*
homeassistant/components/home_connect/*
homeassistant/components/homematic/*
homeassistant/components/homematic/climate.py
homeassistant/components/homematic/cover.py
Expand Down Expand Up @@ -878,6 +879,10 @@ omit =
homeassistant/components/zoneminder/*
homeassistant/components/supla/*
homeassistant/components/zwave/util.py
homeassistant/components/zwave_mqtt/__init__.py
homeassistant/components/zwave_mqtt/discovery.py
homeassistant/components/zwave_mqtt/entity.py
homeassistant/components/zwave_mqtt/services.py

[report]
# Regexes for lines to exclude from consideration
Expand Down
6 changes: 3 additions & 3 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v2.2.1
rev: v2.3.0
hooks:
- id: pyupgrade
args: [--py37-plus]
Expand All @@ -18,9 +18,9 @@ repos:
- id: codespell
args:
- --ignore-words-list=hass,alot,datas,dof,dur,farenheit,hist,iff,ines,ist,lightsensor,mut,nd,pres,referer,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing
- --skip="./.*,*.json"
- --skip="./.*,*.csv,*.json"
- --quiet-level=2
exclude_types: [json]
exclude_types: [csv, json]
- repo: https://gitlab.com/pycqa/flake8
rev: 3.7.9
hooks:
Expand Down
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ addons:
- libswscale-dev
- libswresample-dev
- libavfilter-dev
sources:
- sourceline: ppa:savoury1/ffmpeg4

matrix:
fast_finish: true
include:
Expand Down
7 changes: 5 additions & 2 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ homeassistant/components/azure_service_bus/* @hfurubotten
homeassistant/components/beewi_smartclim/* @alemuro
homeassistant/components/bitcoin/* @fabaff
homeassistant/components/bizkaibus/* @UgaitzEtxebarria
homeassistant/components/blebox/* @gadgetmobile
homeassistant/components/blink/* @fronzbot
homeassistant/components/bmp280/* @belidzs
homeassistant/components/bmw_connected_drive/* @gerard33
Expand Down Expand Up @@ -163,6 +164,7 @@ homeassistant/components/hikvisioncam/* @fbradyirl
homeassistant/components/hisense_aehw4a1/* @bannhead
homeassistant/components/history/* @home-assistant/core
homeassistant/components/hive/* @Rendili @KJonline
homeassistant/components/home_connect/* @DavidMStraub
homeassistant/components/homeassistant/* @home-assistant/core
homeassistant/components/homekit/* @bdraco
homeassistant/components/homekit_controller/* @Jc2k
Expand Down Expand Up @@ -196,7 +198,7 @@ homeassistant/components/ipp/* @ctalkington
homeassistant/components/iqvia/* @bachya
homeassistant/components/irish_rail_transport/* @ttroy50
homeassistant/components/islamic_prayer_times/* @engrbm87
homeassistant/components/isy994/* @bdraco
homeassistant/components/isy994/* @bdraco @shbatm
homeassistant/components/izone/* @Swamp-Ig
homeassistant/components/jewish_calendar/* @tsvi
homeassistant/components/juicenet/* @jesserockz
Expand Down Expand Up @@ -240,7 +242,7 @@ homeassistant/components/minecraft_server/* @elmurato
homeassistant/components/minio/* @tkislan
homeassistant/components/mobile_app/* @robbiet480
homeassistant/components/modbus/* @adamchengtkc @janiversen
homeassistant/components/monoprice/* @etsinko
homeassistant/components/monoprice/* @etsinko @OnFreund
homeassistant/components/moon/* @fabaff
homeassistant/components/mpd/* @fabaff
homeassistant/components/mqtt/* @home-assistant/core @emontnemery
Expand Down Expand Up @@ -463,6 +465,7 @@ homeassistant/components/zha/* @dmulcahey @adminiuga
homeassistant/components/zone/* @home-assistant/core
homeassistant/components/zoneminder/* @rohankapoorcom
homeassistant/components/zwave/* @home-assistant/z-wave
homeassistant/components/zwave_mqtt/* @cgarwood @marcelveldt @MartinHjelmare

# Individual files
homeassistant/components/demo/weather @fabaff
2 changes: 1 addition & 1 deletion homeassistant/components/acer_projector/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
"domain": "acer_projector",
"name": "Acer Projector",
"documentation": "https://www.home-assistant.io/integrations/acer_projector",
"requirements": ["pyserial==3.1.1"],
"requirements": ["pyserial==3.4"],
"codeowners": []
}
1 change: 1 addition & 0 deletions homeassistant/components/adguard/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,4 +206,5 @@ def device_info(self) -> Dict[str, Any]:
"name": "AdGuard Home",
"manufacturer": "AdGuard Team",
"sw_version": self.hass.data[DOMAIN].get(DATA_ADGUARD_VERION),
"entry_type": "service",
}
8 changes: 4 additions & 4 deletions homeassistant/components/adguard/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
"user": {
"description": "Set up your AdGuard Home instance to allow monitoring and control.",
"data": {
"host": "Host",
"password": "Password",
"port": "Port",
"username": "Username",
"host": "[%key:common::config_flow::data::host%]",
"password": "[%key:common::config_flow::data::password%]",
"port": "[%key:common::config_flow::data::port%]",
"username": "[%key:common::config_flow::data::username%]",
"ssl": "AdGuard Home uses a SSL certificate",
"verify_ssl": "AdGuard Home uses a proper certificate"
}
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/adguard/translations/es-419.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
},
"user": {
"data": {
"host": "Host",
"password": "Contrase\u00f1a",
"port": "Puerto",
"ssl": "AdGuard Home utiliza un certificado SSL",
Expand Down
7 changes: 7 additions & 0 deletions homeassistant/components/airvisual/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,13 @@ def update():

self.update_from_latest_data()

async def async_update(self):
"""Update the entity.

Only used by the generic entity update service.
"""
await self.coordinator.async_request_refresh()

@callback
def update_from_latest_data(self):
"""Update the entity from the latest data."""
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/airvisual/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"title": "Configure a Geography",
"description": "Use the AirVisual cloud API to monitor a geographical location.",
"data": {
"api_key": "API Key",
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "Latitude",
"longitude": "Longitude"
}
Expand Down
7 changes: 6 additions & 1 deletion homeassistant/components/airvisual/translations/es-419.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
"already_configured": "Estas coordenadas ya han sido registradas."
},
"error": {
"invalid_api_key": "Clave de API inv\u00e1lida"
"general_error": "Se ha producido un error desconocido.",
"invalid_api_key": "Clave de API inv\u00e1lida",
"unable_to_connect": "No se puede conectar a la unidad Node/Pro."
},
"step": {
"geography": {
Expand All @@ -13,12 +15,15 @@
"latitude": "Latitud",
"longitude": "Longitud"
},
"description": "Use la API de AirVisual para monitorear una ubicaci\u00f3n geogr\u00e1fica.",
"title": "Configurar una geograf\u00eda"
},
"node_pro": {
"data": {
"ip_address": "Direcci\u00f3n IP/nombre de host de la unidad",
"password": "Contrase\u00f1a de la unidad"
},
"description": "Monitoree una unidad AirVisual personal. La contrase\u00f1a se puede recuperar de la interfaz de usuario de la unidad.",
"title": "Configurar un AirVisual Node/Pro"
},
"user": {
Expand Down
20 changes: 17 additions & 3 deletions homeassistant/components/airvisual/translations/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,35 @@
"already_configured": "Cette cl\u00e9 API est d\u00e9j\u00e0 utilis\u00e9e."
},
"error": {
"invalid_api_key": "Cl\u00e9 API invalide"
"general_error": "Une erreur inconnue est survenue.",
"invalid_api_key": "Cl\u00e9 API invalide",
"unable_to_connect": "Impossible de se connecter \u00e0 l'unit\u00e9 Node / Pro."
},
"step": {
"geography": {
"data": {
"api_key": "Cl\u00e9 d'API",
"latitude": "Latitude",
"longitude": "Longitude"
}
},
"title": "Configurer une g\u00e9ographie"
},
"node_pro": {
"data": {
"ip_address": "Adresse IP / nom d'h\u00f4te de l'unit\u00e9",
"password": "Mot de passe de l'unit\u00e9"
},
"description": "Surveillez une unit\u00e9 AirVisual personnelle. Le mot de passe peut \u00eatre r\u00e9cup\u00e9r\u00e9 dans l'interface utilisateur de l'unit\u00e9.",
"title": "Configurer un AirVisual Node/Pro"
},
"user": {
"data": {
"api_key": "Cl\u00e9 API",
"cloud_api": "Localisation g\u00e9ographique",
"latitude": "Latitude",
"longitude": "Longitude"
"longitude": "Longitude",
"node_pro": "AirVisual Node Pro",
"type": "Type d'int\u00e9gration"
},
"description": "Surveiller la qualit\u00e9 de l\u2019air dans un emplacement g\u00e9ographique.",
"title": "Configurer AirVisual"
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/alexa/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ class CoverCapabilities(AlexaEntity):
def default_display_categories(self):
"""Return the display categories for this entity."""
device_class = self.entity.attributes.get(ATTR_DEVICE_CLASS)
if device_class == cover.DEVICE_CLASS_GARAGE:
if device_class in (cover.DEVICE_CLASS_GARAGE, cover.DEVICE_CLASS_GATE):
return [DisplayCategory.GARAGE_DOOR]
if device_class == cover.DEVICE_CLASS_DOOR:
return [DisplayCategory.DOOR]
Expand All @@ -408,7 +408,7 @@ def default_display_categories(self):
def interfaces(self):
"""Yield the supported interfaces."""
device_class = self.entity.attributes.get(ATTR_DEVICE_CLASS)
if device_class != cover.DEVICE_CLASS_GARAGE:
if device_class not in (cover.DEVICE_CLASS_GARAGE, cover.DEVICE_CLASS_GATE):
yield AlexaPowerController(self.entity)

supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/alpha_vantage/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
"domain": "alpha_vantage",
"name": "Alpha Vantage",
"documentation": "https://www.home-assistant.io/integrations/alpha_vantage",
"requirements": ["alpha_vantage==2.1.3"],
"requirements": ["alpha_vantage==2.2.0"],
"codeowners": ["@fabaff"]
}
1 change: 1 addition & 0 deletions homeassistant/components/atag/translations/es-419.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"step": {
"user": {
"data": {
"host": "Host",
"port": "Puerto (10000)"
},
"title": "Conectarse al dispositivo"
Expand Down
9 changes: 8 additions & 1 deletion homeassistant/components/atag/translations/fr.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
{
"config": {
"abort": {
"already_configured": "Un seul appareil Atag peut \u00eatre ajout\u00e9 \u00e0 Home Assistant"
},
"error": {
"connection_error": "Impossible de se connecter, veuillez r\u00e9essayer"
},
"step": {
"user": {
"data": {
Expand All @@ -9,5 +15,6 @@
"title": "Se connecter \u00e0 l'appareil"
}
}
}
},
"title": "Atag"
}
2 changes: 1 addition & 1 deletion homeassistant/components/atag/water_heater.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def operation_list(self):
"""List of available operation modes."""
return OPERATION_LIST

async def set_temperature(self, **kwargs):
async def async_set_temperature(self, **kwargs):
"""Set new target temperature."""
if await self.coordinator.atag.dhw_set_temp(kwargs.get(ATTR_TEMPERATURE)):
self.async_write_ha_state()
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/auth/translations/no.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"step": {
"init": {
"description": "For \u00e5 aktivere tofaktorautentisering ved hjelp av tidsbaserte engangspassord, skann QR-koden med autentiseringsappen din. Hvis du ikke har en, kan vi anbefale enten [Google Authenticator](https://support.google.com/accounts/answer/1066447) eller [Authy](https://authy.com/). \n\n {qr_code} \n \nEtter at du har skannet koden, skriver du inn den seks-sifrede koden fra appen din for \u00e5 kontrollere oppsettet. Dersom du har problemer med \u00e5 skanne QR-koden kan du taste inn f\u00f8lgende kode manuelt: **`{code}`**.",
"title": "Konfigurer tofaktorautentisering ved hjelp av TOTP"
"title": "Sett opp tofaktorautentisering ved hjelp av TOTP"
}
},
"title": "TOTP"
Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/axis/translations/es-419.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
"device_unavailable": "El dispositivo no est\u00e1 disponible",
"faulty_credentials": "Credenciales de usuario incorrectas"
},
"flow_title": "Dispositivo Axis: {name} ({host})",
"step": {
"user": {
"data": {
"host": "Host",
"password": "Contrase\u00f1a",
"port": "Puerto",
"username": "Nombre de usuario"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"is_not_occupied": "{entity_name} no est\u00e1 ocupado",
"is_not_open": "{entity_name} est\u00e1 cerrado",
"is_not_plugged_in": "{entity_name} est\u00e1 desconectado",
"is_not_powered": "{entity_name} no tiene encendido",
"is_not_present": "{entity_name} no est\u00e1 presente",
"is_not_unsafe": "{entity_name} es seguro",
"is_occupied": "{entity_name} est\u00e1 ocupado",
Expand Down Expand Up @@ -68,13 +69,16 @@
"not_locked": "{entity_name} desbloqueado",
"not_moist": "{entity_name} se sec\u00f3",
"not_moving": "{entity_name} dej\u00f3 de moverse",
"not_occupied": "{entity_name} se desocup\u00f3",
"not_opened": "{entity_name} cerrado",
"not_plugged_in": "{entity_name} desconectado",
"not_powered": "{entity_name} no encendido",
"not_present": "{entity_name} no presente",
"not_unsafe": "{entity_name} se volvi\u00f3 seguro",
"occupied": "{entity_name} se ocup\u00f3",
"opened": "{entity_name} abierto",
"plugged_in": "{entity_name} enchufado",
"powered": "{entity_name} encendido",
"present": "{entity_name} presente",
"problem": "{entity_name} comenz\u00f3 a detectar problemas",
"smoke": "{entity_name} comenz\u00f3 a detectar humo",
Expand Down
Loading