@ray-js/ipc-player-integration 0.0.1-beta-59 → 0.0.1-beta-61

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 (118) hide show
  1. package/lib/ctx/ctx.composition.d.ts +1 -1
  2. package/lib/ctx/ctx.composition.js +3 -4
  3. package/lib/ctx/ctx.js +6 -12
  4. package/lib/features/index.d.ts +1 -0
  5. package/lib/features/index.js +1 -0
  6. package/lib/{utils/plugins → features/initPlayerWidgets}/index.d.ts +1 -1
  7. package/lib/{utils/plugins → features/initPlayerWidgets}/index.js +4 -2
  8. package/lib/i18n/index.d.ts +8 -0
  9. package/lib/i18n/strings.d.ts +4 -0
  10. package/lib/i18n/strings.js +6 -2
  11. package/lib/index.d.ts +3 -1
  12. package/lib/index.js +4 -2
  13. package/lib/interface.d.ts +5 -1
  14. package/lib/ports.output.js +1 -1
  15. package/lib/res/index.d.ts +2 -0
  16. package/lib/res/index.js +2 -0
  17. package/lib/res/player_ptz_control_tip.png +0 -0
  18. package/lib/ui/constant.d.ts +1 -0
  19. package/lib/ui/constant.js +1 -0
  20. package/lib/ui/ui.d.ts +1 -0
  21. package/lib/ui/ui.js +42 -21
  22. package/lib/utils/device/index.js +2 -28
  23. package/lib/{plugins → widgets}/battery/battery.composition.d.ts +6 -2
  24. package/lib/{plugins/index.js → widgets/index.d.ts} +2 -3
  25. package/lib/{plugins/index.d.ts → widgets/index.js} +1 -0
  26. package/lib/{plugins → widgets}/moveInteractiveControl/moveInteractiveControl.js +0 -1
  27. package/lib/{plugins → widgets}/ptz/ptz.js +0 -2
  28. package/lib/{plugins → widgets}/ptz/ptz.less +9 -0
  29. package/lib/{plugins → widgets}/ptz/ptzControl.js +36 -9
  30. package/lib/widgets/ptzControlTip/index.d.ts +1 -0
  31. package/lib/widgets/ptzControlTip/index.js +1 -0
  32. package/lib/widgets/ptzControlTip/ptzControlTip.d.ts +6 -0
  33. package/lib/widgets/ptzControlTip/ptzControlTip.js +45 -0
  34. package/lib/widgets/ptzControlTip/ptzControlTip.less +42 -0
  35. package/lib/{plugins → widgets}/recordVideo/recordVideo.js +2 -3
  36. package/lib/{plugins → widgets}/screenshot/screenshot.js +3 -7
  37. package/lib/{plugins → widgets}/tempHumidity/tempHumidity.js +0 -2
  38. package/lib/{plugins → widgets}/videoBitKBP/videoBitKBP.js +2 -2
  39. package/package.json +3 -3
  40. /package/lib/{plugins → widgets}/battery/battery.composition.js +0 -0
  41. /package/lib/{plugins → widgets}/battery/battery.d.ts +0 -0
  42. /package/lib/{plugins → widgets}/battery/battery.js +0 -0
  43. /package/lib/{plugins → widgets}/battery/battery.less +0 -0
  44. /package/lib/{plugins → widgets}/battery/batteryFull.d.ts +0 -0
  45. /package/lib/{plugins → widgets}/battery/batteryFull.js +0 -0
  46. /package/lib/{plugins → widgets}/battery/index.d.ts +0 -0
  47. /package/lib/{plugins → widgets}/battery/index.js +0 -0
  48. /package/lib/{plugins → widgets}/fullScreen/constant.d.ts +0 -0
  49. /package/lib/{plugins → widgets}/fullScreen/constant.js +0 -0
  50. /package/lib/{plugins → widgets}/fullScreen/fullScreen.d.ts +0 -0
  51. /package/lib/{plugins → widgets}/fullScreen/fullScreen.js +0 -0
  52. /package/lib/{plugins → widgets}/fullScreen/fullScreen.less +0 -0
  53. /package/lib/{plugins → widgets}/fullScreen/fullTravelRouteControl.d.ts +0 -0
  54. /package/lib/{plugins → widgets}/fullScreen/fullTravelRouteControl.js +0 -0
  55. /package/lib/{plugins → widgets}/fullScreen/fullVoiceIntercom.d.ts +0 -0
  56. /package/lib/{plugins → widgets}/fullScreen/fullVoiceIntercom.js +0 -0
  57. /package/lib/{plugins → widgets}/fullScreen/index.d.ts +0 -0
  58. /package/lib/{plugins → widgets}/fullScreen/index.js +0 -0
  59. /package/lib/{plugins → widgets}/fullScreen/verticalScreen.d.ts +0 -0
  60. /package/lib/{plugins → widgets}/fullScreen/verticalScreen.js +0 -0
  61. /package/lib/{plugins → widgets}/fullScreen/verticalScreen.less +0 -0
  62. /package/lib/{plugins → widgets}/fullSmallIntercom/fullSmallIntercom.d.ts +0 -0
  63. /package/lib/{plugins → widgets}/fullSmallIntercom/fullSmallIntercom.js +0 -0
  64. /package/lib/{plugins → widgets}/fullSmallIntercom/fullSmallIntercom.less +0 -0
  65. /package/lib/{plugins → widgets}/fullSmallIntercom/index.d.ts +0 -0
  66. /package/lib/{plugins → widgets}/fullSmallIntercom/index.js +0 -0
  67. /package/lib/{plugins → widgets}/moveInteractiveControl/controlButton.d.ts +0 -0
  68. /package/lib/{plugins → widgets}/moveInteractiveControl/controlButton.js +0 -0
  69. /package/lib/{plugins → widgets}/moveInteractiveControl/controlButton.less +0 -0
  70. /package/lib/{plugins → widgets}/moveInteractiveControl/index.d.ts +0 -0
  71. /package/lib/{plugins → widgets}/moveInteractiveControl/index.js +0 -0
  72. /package/lib/{plugins → widgets}/moveInteractiveControl/moveInteractiveControl.d.ts +0 -0
  73. /package/lib/{plugins → widgets}/moveInteractiveControl/moveInteractiveControl.less +0 -0
  74. /package/lib/{plugins → widgets}/moveInteractiveControl/moveInteractiveControlUI.d.ts +0 -0
  75. /package/lib/{plugins → widgets}/moveInteractiveControl/moveInteractiveControlUI.js +0 -0
  76. /package/lib/{plugins → widgets}/moveInteractiveControl/moveInteractiveControlUI.less +0 -0
  77. /package/lib/{plugins → widgets}/muted/index.d.ts +0 -0
  78. /package/lib/{plugins → widgets}/muted/index.js +0 -0
  79. /package/lib/{plugins → widgets}/muted/muted.d.ts +0 -0
  80. /package/lib/{plugins → widgets}/muted/muted.js +0 -0
  81. /package/lib/{plugins → widgets}/muted/muted.less +0 -0
  82. /package/lib/{plugins → widgets}/ptz/index.d.ts +0 -0
  83. /package/lib/{plugins → widgets}/ptz/index.js +0 -0
  84. /package/lib/{plugins → widgets}/ptz/ptz.d.ts +0 -0
  85. /package/lib/{plugins → widgets}/ptz/ptzControl.d.ts +0 -0
  86. /package/lib/{plugins → widgets}/recordVideo/index.d.ts +0 -0
  87. /package/lib/{plugins → widgets}/recordVideo/index.js +0 -0
  88. /package/lib/{plugins → widgets}/recordVideo/recordVideo.d.ts +0 -0
  89. /package/lib/{plugins → widgets}/recordVideo/recordVideo.less +0 -0
  90. /package/lib/{plugins → widgets}/resolution/fullResolutionControl.d.ts +0 -0
  91. /package/lib/{plugins → widgets}/resolution/fullResolutionControl.js +0 -0
  92. /package/lib/{plugins → widgets}/resolution/index.d.ts +0 -0
  93. /package/lib/{plugins → widgets}/resolution/index.js +0 -0
  94. /package/lib/{plugins → widgets}/resolution/resolution.d.ts +0 -0
  95. /package/lib/{plugins → widgets}/resolution/resolution.js +0 -0
  96. /package/lib/{plugins → widgets}/resolution/resolution.less +0 -0
  97. /package/lib/{plugins → widgets}/screenshot/index.d.ts +0 -0
  98. /package/lib/{plugins → widgets}/screenshot/index.js +0 -0
  99. /package/lib/{plugins → widgets}/screenshot/screenshot.d.ts +0 -0
  100. /package/lib/{plugins → widgets}/screenshot/screenshot.less +0 -0
  101. /package/lib/{plugins → widgets}/tempHumidity/index.d.ts +0 -0
  102. /package/lib/{plugins → widgets}/tempHumidity/index.js +0 -0
  103. /package/lib/{plugins → widgets}/tempHumidity/tempHumidity.d.ts +0 -0
  104. /package/lib/{plugins → widgets}/tempHumidity/tempHumidity.less +0 -0
  105. /package/lib/{plugins → widgets}/verticalSmallIntercom/index.d.ts +0 -0
  106. /package/lib/{plugins → widgets}/verticalSmallIntercom/index.js +0 -0
  107. /package/lib/{plugins → widgets}/verticalSmallIntercom/verticalSmallIntercom.d.ts +0 -0
  108. /package/lib/{plugins → widgets}/verticalSmallIntercom/verticalSmallIntercom.js +0 -0
  109. /package/lib/{plugins → widgets}/verticalSmallIntercom/verticalSmallIntercom.less +0 -0
  110. /package/lib/{plugins → widgets}/videoBitKBP/index.d.ts +0 -0
  111. /package/lib/{plugins → widgets}/videoBitKBP/index.js +0 -0
  112. /package/lib/{plugins → widgets}/videoBitKBP/videoBitKBP.d.ts +0 -0
  113. /package/lib/{plugins → widgets}/videoBitKBP/videoBitKBP.less +0 -0
  114. /package/lib/{plugins → widgets}/voiceIntercom/index.d.ts +0 -0
  115. /package/lib/{plugins → widgets}/voiceIntercom/index.js +0 -0
  116. /package/lib/{plugins → widgets}/voiceIntercom/voiceIntercom.d.ts +0 -0
  117. /package/lib/{plugins → widgets}/voiceIntercom/voiceIntercom.js +0 -0
  118. /package/lib/{plugins → widgets}/voiceIntercom/voiceIntercom.less +0 -0
@@ -1,16 +1,18 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
1
2
  import React, { useContext, useEffect, useRef, useState } from 'react';
2
- import { CoverView } from '@ray-js/ray';
3
+ import { CoverView, getStorage } from '@ray-js/ray';
3
4
  import clsx from 'clsx';
4
5
  import _find from 'lodash/find';
5
6
  import _get from 'lodash/get';
6
7
  import IpcPtzZoom from '@ray-js/ipc-ptz-zoom';
7
- import IpcUtils from '@ray-js/ray-ipc-utils';
8
+ import { getDpIdByCode, publishDps } from '@ray-js/ray-ipc-utils';
8
9
  import { useMemoizedFn } from '../../hooks';
9
10
  import { useComponentHideState } from '../../ui/hooks';
10
11
  import { UIEventContext } from '../../ui/context';
12
+ import { PtzControlTip } from '../ptzControlTip';
13
+ import { ptzControlTipId, pauseTimeToHideAllComponent } from '../../ui/constant';
11
14
  import { useStore } from '../../ctx/store';
12
15
  import { getEnumRangeIsValid } from '../../utils/device';
13
- import { pauseTimeToHideAllComponent } from '../../ui/constant';
14
16
  import Styles from './ptz.less';
15
17
  const getPtzData = devId => {
16
18
  return [{
@@ -37,7 +39,8 @@ const getPtzData = devId => {
37
39
  };
38
40
  export const PtzControl = props => {
39
41
  const {
40
- devId
42
+ devId,
43
+ addContent
41
44
  } = props;
42
45
  const {
43
46
  screenType,
@@ -48,6 +51,7 @@ export const PtzControl = props => {
48
51
  });
49
52
  const [shouldHide] = useComponentHideState();
50
53
  const [isPtzActive, setIsPtzActive] = useState(true);
54
+ const [showPtzControlTip, setShowPtzControlTip] = useState(false);
51
55
  const {
52
56
  event
53
57
  } = useContext(UIEventContext);
@@ -59,6 +63,18 @@ export const PtzControl = props => {
59
63
  const onPtzControlShow = useMemoizedFn(() => {
60
64
  setIsPtzActive(true);
61
65
  });
66
+
67
+ // 获取是否有ptz控制tip
68
+ useEffect(() => {
69
+ getStorage({
70
+ key: `${devId}_ptzControlTip}`,
71
+ success: res => {
72
+ if (!res.data) {
73
+ setShowPtzControlTip(true);
74
+ }
75
+ }
76
+ });
77
+ }, []);
62
78
  useEffect(() => {
63
79
  event.on('ptzControlHide', onPtzControlHide);
64
80
  event.on('ptzControlShow', onPtzControlShow);
@@ -86,30 +102,41 @@ export const PtzControl = props => {
86
102
  ptzData: ptzData.current,
87
103
  onTouchPtzStart: async data => {
88
104
  event.emit(pauseTimeToHideAllComponent);
105
+ // event.emit('ptzControlTipShow', true);
89
106
  const {
90
107
  type
91
108
  } = data;
92
- const dpData = await IpcUtils.getDpIdByCode(devId, 'ptz_control');
109
+ const dpData = await getDpIdByCode(devId, 'ptz_control');
93
110
  if (dpData.code === 0) {
94
111
  const ptzControlId = dpData.data;
95
112
  const sndDpValue = _get(_find(ptzData.current, {
96
113
  type
97
114
  }), 'dpValue', null);
98
- IpcUtils.publishDps(devId, {
115
+ publishDps(devId, {
99
116
  [ptzControlId]: sndDpValue
100
117
  });
101
118
  ptzTimeId.current = setInterval(() => {
102
- IpcUtils.publishDps(devId, {
119
+ publishDps(devId, {
103
120
  [ptzControlId]: sndDpValue
104
121
  });
105
122
  }, 1000);
106
123
  }
124
+ if (showPtzControlTip) {
125
+ addContent('absolute', {
126
+ id: ptzControlTipId,
127
+ content: props => {
128
+ return /*#__PURE__*/React.createElement(PtzControlTip, props);
129
+ },
130
+ absoluteContentClassName: 'ipc-player-plugin-ptz-control-tip-wrap',
131
+ initProps: _objectSpread({}, props)
132
+ });
133
+ }
107
134
  },
108
135
  onTouchPtzEnd: async () => {
109
- const ptzStopData = await IpcUtils.getDpIdByCode(devId, 'ptz_stop');
136
+ const ptzStopData = await getDpIdByCode(devId, 'ptz_stop');
110
137
  if (ptzStopData.code === 0) {
111
138
  const ptzStopId = ptzStopData.data;
112
- IpcUtils.publishDps(devId, {
139
+ publishDps(devId, {
113
140
  [ptzStopId]: true
114
141
  });
115
142
  }
@@ -0,0 +1 @@
1
+ export * from './ptzControlTip';
@@ -0,0 +1 @@
1
+ export * from './ptzControlTip';
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { ComponentConfigProps } from '../../interface';
3
+ import './ptzControlTip.less';
4
+ type Props = ComponentConfigProps;
5
+ export declare const PtzControlTip: (props: Props) => React.JSX.Element | null;
6
+ export {};
@@ -0,0 +1,45 @@
1
+ import React, { useState } from 'react';
2
+ import { View, Image, CoverView, Text, setStorage } from '@ray-js/ray';
3
+ import clsx from 'clsx';
4
+ import { useStore } from '../../ctx/store';
5
+ import { ptzControlTipId } from '../../ui/constant';
6
+ import { PlayState } from '../../interface';
7
+ import './ptzControlTip.less';
8
+ import { playerPtzControlTip } from '../../res';
9
+ import Strings from '../../i18n';
10
+ export const PtzControlTip = props => {
11
+ const {
12
+ devId,
13
+ deleteContent
14
+ } = props;
15
+ const [showTipModal, setShowTipModal] = useState(true);
16
+ const {
17
+ playState
18
+ } = useStore({
19
+ playState: props.playState
20
+ });
21
+ // 获取缓存状态
22
+ const changeShowTipModal = () => {
23
+ setShowTipModal(false);
24
+ deleteContent('absolute', ptzControlTipId);
25
+ setStorage({
26
+ key: `${devId}_ptzControlTip}`,
27
+ data: 'true'
28
+ });
29
+ };
30
+ if (showTipModal && playState === PlayState.PLAYING) {
31
+ return /*#__PURE__*/React.createElement(CoverView, {
32
+ className: clsx('playerControlTipContainer')
33
+ }, /*#__PURE__*/React.createElement(Image, {
34
+ mode: "widthFix",
35
+ src: playerPtzControlTip,
36
+ className: clsx('controlTipImage')
37
+ }), /*#__PURE__*/React.createElement(Text, {
38
+ className: clsx('controlTipText')
39
+ }, Strings.getLang('ipc_player_ptz_control_tip')), /*#__PURE__*/React.createElement(View, {
40
+ className: clsx('controlTipCloseButton'),
41
+ onClick: changeShowTipModal
42
+ }, Strings.getLang('ipc_player_ptz_close_control_tip')));
43
+ }
44
+ return null;
45
+ };
@@ -0,0 +1,42 @@
1
+ .playerControlTipContainer {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ right: 0;
6
+ bottom: 0;
7
+ display: flex;
8
+ justify-content: center;
9
+ align-items: center;
10
+ z-index: 999;
11
+ background-color: rgba(0,0,0,0.5);
12
+ flex-direction: column;
13
+ padding: 0 calc(50px * var(--ipc-player-size-scale, 1));;
14
+ transition: all 0.3 ease;
15
+ .controlTipImage {
16
+ width: calc(170px * var(--ipc-player-size-scale, 1));;
17
+ }
18
+ .controlTipText {
19
+ margin-top: calc(10px * var(--ipc-player-size-scale, 1));
20
+ color: rgba(255,255,255,0.7);
21
+ word-break: break-all;
22
+ text-align: center;
23
+ font-size: calc(12px * var(--ipc-player-size-scale, 1));
24
+ font-weight: 400;
25
+ }
26
+ .controlTipCloseButton {
27
+ border-radius: calc(4px * var(--ipc-player-size-scale, 1));
28
+ background-color: rgba(255, 255, 255, 0.3);
29
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
30
+ margin-top: 20rpx;
31
+ text-align: center;
32
+ height: calc(32px * var(--ipc-player-size-scale, 1));
33
+ padding: 0 calc(24px * var(--ipc-player-size-scale, 1));
34
+ overflow: hidden;
35
+ border-radius: calc(32px * var(--ipc-player-size-scale, 1));
36
+ display: flex;
37
+ justify-content: center;
38
+ align-items: center;
39
+ font-size: calc(12px * var(--ipc-player-size-scale, 1));;
40
+ color: #ffffff;
41
+ }
42
+ }
@@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef, useContext } from 'react';
2
2
  import { View, Text, Image } from '@ray-js/ray';
3
3
  import { useSetState, useUpdateEffect } from 'ahooks';
4
4
  import clsx from 'clsx';
5
- import IpcUtils from '@ray-js/ray-ipc-utils';
5
+ import { goToIpcPageNativeRoute } from '@ray-js/ray-ipc-utils';
6
6
  import Strings from '../../i18n';
7
7
  import { PlayState } from '../../interface';
8
8
  import { UIEventContext } from '../../ui/context';
@@ -167,7 +167,7 @@ export function RecordVideo(props) {
167
167
  });
168
168
  deleteContent('absolute', RECORD_VIDEO_SUCCESS_TOAST_ID);
169
169
  clearInterval(timer.current);
170
- IpcUtils.goToIpcPageNativeRoute('ipc_album_panel', devId);
170
+ goToIpcPageNativeRoute('ipc_album_panel', devId);
171
171
  };
172
172
 
173
173
  /** 添加录制成功弹窗 */
@@ -243,7 +243,6 @@ export function RecordVideo(props) {
243
243
  }
244
244
  try {
245
245
  const recordInfo = await setRecording(target);
246
- console.log(recordInfo, 'recordInfo====');
247
246
  if (target) {
248
247
  setRecordingDisabled(true);
249
248
  setState({
@@ -1,8 +1,8 @@
1
1
  import React, { useContext, useRef } from 'react';
2
- import { View, Image, Text, showModal, openAppSystemSettingPage, getSystemInfoSync } from '@ray-js/ray';
2
+ import { View, Image, Text, showModal, openAppSystemSettingPage } from '@ray-js/ray';
3
3
  import { useSetState, useUpdateEffect, useMemoizedFn } from 'ahooks';
4
4
  import clsx from 'clsx';
5
- import IpcUtils from '@ray-js/ray-ipc-utils';
5
+ import { goToIpcPageNativeRoute } from '@ray-js/ray-ipc-utils';
6
6
  import Strings from '../../i18n';
7
7
  import { useStore } from '../../ctx/store';
8
8
  import { UIEventContext } from '../../ui/context';
@@ -61,7 +61,7 @@ export function Screenshot(props) {
61
61
  });
62
62
  deleteContent('absolute', 'plugin-screenshot-toast');
63
63
  clearInterval(timer.current);
64
- IpcUtils.goToIpcPageNativeRoute('ipc_album_panel', devId);
64
+ goToIpcPageNativeRoute('ipc_album_panel', devId);
65
65
  };
66
66
 
67
67
  /** 添加截屏成功弹窗 */
@@ -163,10 +163,6 @@ export function Screenshot(props) {
163
163
  isShowGlobal: true,
164
164
  success: res => {
165
165
  if (res.confirm) {
166
- const {
167
- platform
168
- } = getSystemInfoSync();
169
- console.log(platform, 'platform');
170
166
  openAppSystemSettingPage({
171
167
  scope: 'App-Settings',
172
168
  success: () => {
@@ -36,8 +36,6 @@ export const TempHumidity = props => {
36
36
  className: "tempHumidity"
37
37
  }, `${humidity}`));
38
38
  };
39
- console.log(tempC, tempF, humidity);
40
-
41
39
  // 当无值时返回null
42
40
  if (!tempC && !tempF && !humidity) {
43
41
  return null;
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import { View } from '@ray-js/ray';
3
3
  import clsx from 'clsx';
4
- import IpcUtils from '@ray-js/ray-ipc-utils';
4
+ import { getVideoBitrateKbps } from '@ray-js/ray-ipc-utils';
5
5
  import { PlayState } from '../../interface';
6
6
  import './videoBitKBP.less';
7
7
  import { useStore } from '../../ctx/store';
@@ -30,7 +30,7 @@ export const VideoBitKBP = props => {
30
30
  };
31
31
  }, [store.playState]);
32
32
  const init = async () => {
33
- const res = await IpcUtils.getVideoBitrateKbps(devId);
33
+ const res = await getVideoBitrateKbps(devId);
34
34
  if (res.code !== -1) {
35
35
  setBitKBP(`${res.data.kbps}KB/S`);
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ray-js/ipc-player-integration",
3
- "version": "0.0.1-beta-59",
3
+ "version": "0.0.1-beta-61",
4
4
  "description": "IPC 播放器功能集成",
5
5
  "main": "lib/index",
6
6
  "files": [
@@ -38,8 +38,8 @@
38
38
  "dependencies": {
39
39
  "@ray-js/ipc-ptz-zoom": "0.0.2-beta-7",
40
40
  "@ray-js/panel-sdk": "^1.13.1",
41
- "@ray-js/ray-ipc-player": "2.0.20-beta-12",
42
- "@ray-js/ray-ipc-utils": "1.1.0-beta-16",
41
+ "@ray-js/ray-ipc-player": "2.0.20-beta-13",
42
+ "@ray-js/ray-ipc-utils": "1.1.0-beta-17",
43
43
  "@ray-js/svg": "0.2.0",
44
44
  "clsx": "^1.2.1",
45
45
  "jotai": "^2.10.2"
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