@elice/material-video 1.231212.0 → 1.231228.0
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.
- package/cjs/components/material-video/MaterialVideo.js +20 -25
- package/cjs/components/material-video/MaterialVideo.styled.js +1 -7
- package/cjs/components/material-video/MaterialVideoContent.js +15 -17
- package/cjs/components/material-video/locales.js +2 -4
- package/cjs/components/youtube-player/YoutubePlayer.js +16 -24
- package/cjs/components/youtube-player/YoutubePlayer.styled.js +1 -7
- package/cjs/index.js +1 -3
- package/cjs/utils/youtubeUrlParser.js +3 -5
- package/es/components/material-video/MaterialVideo.js +15 -15
- package/es/components/material-video/MaterialVideo.styled.js +1 -1
- package/es/components/material-video/MaterialVideoContent.js +6 -4
- package/es/components/material-video/locales.js +2 -2
- package/es/components/youtube-player/YoutubePlayer.js +12 -14
- package/es/components/youtube-player/YoutubePlayer.styled.js +1 -1
- package/es/utils/youtubeUrlParser.js +3 -3
- package/package.json +7 -7
|
@@ -13,41 +13,36 @@ var classnames = require('classnames');
|
|
|
13
13
|
var locales = require('./locales.js');
|
|
14
14
|
var MaterialVideoContent = require('./MaterialVideoContent.js');
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
var className = _a.className,
|
|
23
|
-
materialVideoId = _a.materialVideoId,
|
|
24
|
-
_a$locale = _a.locale,
|
|
25
|
-
locale = _a$locale === void 0 ? 'en' : _a$locale,
|
|
16
|
+
const MaterialVideo = _a => {
|
|
17
|
+
var {
|
|
18
|
+
className,
|
|
19
|
+
materialVideoId,
|
|
20
|
+
locale = 'en'
|
|
21
|
+
} = _a,
|
|
26
22
|
youtubeProps = tslib.__rest(_a, ["className", "materialVideoId", "locale"]);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
className: classnames__default["default"](prefixCls, className),
|
|
23
|
+
const prefixCls = 'em-material-video';
|
|
24
|
+
const {
|
|
25
|
+
materialVideo,
|
|
26
|
+
status: materialVideoStatus
|
|
27
|
+
} = materialSharedUtils.useMaterialFetch(types.enums.LectureMaterialType.Video, React.useCallback(signal => apiClient.getOrgMaterialVideoGet({
|
|
28
|
+
materialVideoId
|
|
29
|
+
}, {
|
|
30
|
+
signal
|
|
31
|
+
}), [materialVideoId]), apiClient.config.init);
|
|
32
|
+
return React.createElement(blocks.Flex, {
|
|
33
|
+
className: classnames(prefixCls, className),
|
|
39
34
|
align: "center",
|
|
40
35
|
justify: "center",
|
|
41
36
|
width: "100%",
|
|
42
37
|
height: "100%"
|
|
43
|
-
},
|
|
38
|
+
}, React.createElement(reactIntl.IntlProvider, {
|
|
44
39
|
locale: locale,
|
|
45
40
|
defaultLocale: "en",
|
|
46
41
|
messages: locale in locales ? locales[locale] : locales.en
|
|
47
|
-
},
|
|
42
|
+
}, React.createElement(MaterialVideoContent.default, Object.assign({
|
|
48
43
|
materialVideo: materialVideo !== null && materialVideo !== void 0 ? materialVideo : null,
|
|
49
44
|
videoGetStatus: materialVideoStatus
|
|
50
45
|
}, youtubeProps))));
|
|
51
46
|
};
|
|
52
47
|
|
|
53
|
-
exports
|
|
48
|
+
exports.default = MaterialVideo;
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
var blocks = require('@elice/blocks');
|
|
6
4
|
var styled = require('styled-components');
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
|
|
11
|
-
|
|
12
|
-
var StyledMaterialVideoStatus = styled__default["default"](blocks.Flex).withConfig({
|
|
6
|
+
const StyledMaterialVideoStatus = styled(blocks.Flex).withConfig({
|
|
13
7
|
componentId: "sc-dg3csq-0"
|
|
14
8
|
})(["width:100%;height:100%;background-color:#22222c;"]);
|
|
15
9
|
|
|
@@ -12,45 +12,43 @@ var youtubeUrlParser = require('../../utils/youtubeUrlParser.js');
|
|
|
12
12
|
var YoutubePlayer = require('../youtube-player/YoutubePlayer.js');
|
|
13
13
|
var MaterialVideo_styled = require('./MaterialVideo.styled.js');
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var videoGetStatus = _a.videoGetStatus,
|
|
21
|
-
materialVideo = _a.materialVideo,
|
|
15
|
+
const MaterialVideoContent = _a => {
|
|
16
|
+
var {
|
|
17
|
+
videoGetStatus,
|
|
18
|
+
materialVideo
|
|
19
|
+
} = _a,
|
|
22
20
|
youtubeProps = tslib.__rest(_a, ["videoGetStatus", "materialVideo"]);
|
|
23
|
-
|
|
21
|
+
const intl = reactIntl.useIntl();
|
|
24
22
|
if (videoGetStatus === 'pending') {
|
|
25
|
-
return
|
|
23
|
+
return React.createElement(MaterialVideo_styled.StyledMaterialVideoStatus, {
|
|
26
24
|
align: "center",
|
|
27
25
|
justify: "center"
|
|
28
|
-
},
|
|
26
|
+
}, React.createElement(blocks.Spinner, null), React.createElement(blocks.Hspace, {
|
|
29
27
|
width: 0.5
|
|
30
|
-
}),
|
|
28
|
+
}), React.createElement(blocks.Text, {
|
|
31
29
|
role: "white"
|
|
32
30
|
}, intl.formatMessage({
|
|
33
31
|
id: 'video.status.loading'
|
|
34
32
|
})));
|
|
35
33
|
}
|
|
36
34
|
if (!(materialVideo === null || materialVideo === void 0 ? void 0 : materialVideo.url) || videoGetStatus === 'rejected') {
|
|
37
|
-
return
|
|
35
|
+
return React.createElement(MaterialVideo_styled.StyledMaterialVideoStatus, {
|
|
38
36
|
align: "center",
|
|
39
37
|
justify: "center"
|
|
40
|
-
},
|
|
38
|
+
}, React.createElement(blocks.Icon, {
|
|
41
39
|
icon: icons.eilStatusWarn,
|
|
42
40
|
color: designTokens.base.color.white
|
|
43
|
-
}),
|
|
41
|
+
}), React.createElement(blocks.Hspace, {
|
|
44
42
|
width: 0.5
|
|
45
|
-
}),
|
|
43
|
+
}), React.createElement(blocks.Text, {
|
|
46
44
|
role: "white"
|
|
47
45
|
}, intl.formatMessage({
|
|
48
46
|
id: 'video.status.error'
|
|
49
47
|
})));
|
|
50
48
|
}
|
|
51
|
-
return
|
|
49
|
+
return React.createElement(YoutubePlayer.default, Object.assign({
|
|
52
50
|
videoId: youtubeUrlParser.youtubeUrlParser(materialVideo.url)
|
|
53
51
|
}, youtubeProps));
|
|
54
52
|
};
|
|
55
53
|
|
|
56
|
-
exports
|
|
54
|
+
exports.default = MaterialVideoContent;
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var en = {
|
|
3
|
+
const en = {
|
|
6
4
|
'video.status.loading': 'Loading video...',
|
|
7
5
|
'video.status.error': 'Error occurred while loading video'
|
|
8
6
|
};
|
|
9
|
-
|
|
7
|
+
const ko = {
|
|
10
8
|
'video.status.loading': '수업 자료 로딩 중...',
|
|
11
9
|
'video.status.error': '수업 자료를 가져오는 중 문제가 발생하였습니다.'
|
|
12
10
|
};
|
|
@@ -8,30 +8,22 @@ var Youtube = require('react-youtube');
|
|
|
8
8
|
var classnames = require('classnames');
|
|
9
9
|
var YoutubePlayer_styled = require('./YoutubePlayer.styled.js');
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
_a$autoPlay = _a.autoPlay,
|
|
21
|
-
autoPlay = _a$autoPlay === void 0 ? false : _a$autoPlay,
|
|
22
|
-
_a$disableControl = _a.disableControl,
|
|
23
|
-
disableControl = _a$disableControl === void 0 ? false : _a$disableControl,
|
|
24
|
-
_a$disableKeyboardEve = _a.disableKeyboardEvent,
|
|
25
|
-
disableKeyboardEvent = _a$disableKeyboardEve === void 0 ? false : _a$disableKeyboardEve,
|
|
26
|
-
_a$disableFullscreen = _a.disableFullscreen,
|
|
27
|
-
disableFullscreen = _a$disableFullscreen === void 0 ? false : _a$disableFullscreen,
|
|
11
|
+
const YoutubePlayer = _a => {
|
|
12
|
+
var {
|
|
13
|
+
className,
|
|
14
|
+
videoId,
|
|
15
|
+
autoPlay = false,
|
|
16
|
+
disableControl = false,
|
|
17
|
+
disableKeyboardEvent = false,
|
|
18
|
+
disableFullscreen = false
|
|
19
|
+
} = _a,
|
|
28
20
|
youtubeProps = tslib.__rest(_a, ["className", "videoId", "autoPlay", "disableControl", "disableKeyboardEvent", "disableFullscreen"]);
|
|
29
|
-
|
|
21
|
+
const prefixCls = 'em-youtube-player';
|
|
30
22
|
/**
|
|
31
23
|
* Get options for YouTube IFrame player API.
|
|
32
24
|
* ref: https://developers.google.com/youtube/player_parameters#Parameters
|
|
33
25
|
*/
|
|
34
|
-
|
|
26
|
+
const getYoutubeOptions = () => {
|
|
35
27
|
return {
|
|
36
28
|
width: '100%',
|
|
37
29
|
height: '100%',
|
|
@@ -43,15 +35,15 @@ var YoutubePlayer = function YoutubePlayer(_a) {
|
|
|
43
35
|
}
|
|
44
36
|
};
|
|
45
37
|
};
|
|
46
|
-
return
|
|
47
|
-
className:
|
|
38
|
+
return React.createElement(YoutubePlayer_styled.StyledYoutubePlayerWrapper, {
|
|
39
|
+
className: classnames(prefixCls, className),
|
|
48
40
|
justify: "center",
|
|
49
41
|
align: "center"
|
|
50
|
-
},
|
|
42
|
+
}, React.createElement(Youtube, Object.assign({
|
|
51
43
|
videoId: videoId,
|
|
52
44
|
opts: getYoutubeOptions(),
|
|
53
|
-
containerClassName:
|
|
45
|
+
containerClassName: `${prefixCls}__inner`
|
|
54
46
|
}, youtubeProps)));
|
|
55
47
|
};
|
|
56
48
|
|
|
57
|
-
exports
|
|
49
|
+
exports.default = YoutubePlayer;
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
var blocks = require('@elice/blocks');
|
|
6
4
|
var styled = require('styled-components');
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
|
|
11
|
-
|
|
12
|
-
var StyledYoutubePlayerWrapper = styled__default["default"](blocks.Flex).withConfig({
|
|
6
|
+
const StyledYoutubePlayerWrapper = styled(blocks.Flex).withConfig({
|
|
13
7
|
componentId: "sc-ao5iuk-0"
|
|
14
8
|
})(["width:100%;height:100%;background-color:#22222c;& .em-youtube-player__inner{width:90%;height:90%;}"]);
|
|
15
9
|
|
package/cjs/index.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
var MaterialVideo = require('./components/material-video/MaterialVideo.js');
|
|
6
4
|
|
|
7
5
|
|
|
8
6
|
|
|
9
|
-
exports.MaterialVideo = MaterialVideo
|
|
7
|
+
exports.MaterialVideo = MaterialVideo.default;
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
/**
|
|
6
4
|
* Get YouTube video id from url using regex
|
|
7
5
|
* @param url URL of youtube
|
|
8
6
|
* @returns id of youtube video OR null when URL is invalid
|
|
9
7
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
const youtubeUrlParser = url => {
|
|
9
|
+
const regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
|
|
10
|
+
const match = regExp.exec(url);
|
|
13
11
|
return match && match[7].length === 11 ? match[7] : null;
|
|
14
12
|
};
|
|
15
13
|
|
|
@@ -10,22 +10,22 @@ import * as locales from './locales.js';
|
|
|
10
10
|
import { en } from './locales.js';
|
|
11
11
|
import MaterialVideoContent from './MaterialVideoContent.js';
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
const MaterialVideo = _a => {
|
|
14
|
+
var {
|
|
15
|
+
className,
|
|
16
|
+
materialVideoId,
|
|
17
|
+
locale = 'en'
|
|
18
|
+
} = _a,
|
|
18
19
|
youtubeProps = __rest(_a, ["className", "materialVideoId", "locale"]);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
materialVideoStatus = _useMaterialFetch.status;
|
|
20
|
+
const prefixCls = 'em-material-video';
|
|
21
|
+
const {
|
|
22
|
+
materialVideo,
|
|
23
|
+
status: materialVideoStatus
|
|
24
|
+
} = useMaterialFetch(enums.LectureMaterialType.Video, React.useCallback(signal => getOrgMaterialVideoGet({
|
|
25
|
+
materialVideoId
|
|
26
|
+
}, {
|
|
27
|
+
signal
|
|
28
|
+
}), [materialVideoId]), config.init);
|
|
29
29
|
return React.createElement(Flex, {
|
|
30
30
|
className: classnames(prefixCls, className),
|
|
31
31
|
align: "center",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Flex } from '@elice/blocks';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
const StyledMaterialVideoStatus = styled(Flex).withConfig({
|
|
5
5
|
componentId: "sc-dg3csq-0"
|
|
6
6
|
})(["width:100%;height:100%;background-color:#22222c;"]);
|
|
7
7
|
|
|
@@ -8,11 +8,13 @@ import { youtubeUrlParser } from '../../utils/youtubeUrlParser.js';
|
|
|
8
8
|
import YoutubePlayer from '../youtube-player/YoutubePlayer.js';
|
|
9
9
|
import { StyledMaterialVideoStatus } from './MaterialVideo.styled.js';
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
11
|
+
const MaterialVideoContent = _a => {
|
|
12
|
+
var {
|
|
13
|
+
videoGetStatus,
|
|
14
|
+
materialVideo
|
|
15
|
+
} = _a,
|
|
14
16
|
youtubeProps = __rest(_a, ["videoGetStatus", "materialVideo"]);
|
|
15
|
-
|
|
17
|
+
const intl = useIntl();
|
|
16
18
|
if (videoGetStatus === 'pending') {
|
|
17
19
|
return React.createElement(StyledMaterialVideoStatus, {
|
|
18
20
|
align: "center",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
const en = {
|
|
2
2
|
'video.status.loading': 'Loading video...',
|
|
3
3
|
'video.status.error': 'Error occurred while loading video'
|
|
4
4
|
};
|
|
5
|
-
|
|
5
|
+
const ko = {
|
|
6
6
|
'video.status.loading': '수업 자료 로딩 중...',
|
|
7
7
|
'video.status.error': '수업 자료를 가져오는 중 문제가 발생하였습니다.'
|
|
8
8
|
};
|
|
@@ -4,24 +4,22 @@ import Youtube from 'react-youtube';
|
|
|
4
4
|
import classnames from 'classnames';
|
|
5
5
|
import { StyledYoutubePlayerWrapper } from './YoutubePlayer.styled.js';
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
_a$disableFullscreen = _a.disableFullscreen,
|
|
17
|
-
disableFullscreen = _a$disableFullscreen === void 0 ? false : _a$disableFullscreen,
|
|
7
|
+
const YoutubePlayer = _a => {
|
|
8
|
+
var {
|
|
9
|
+
className,
|
|
10
|
+
videoId,
|
|
11
|
+
autoPlay = false,
|
|
12
|
+
disableControl = false,
|
|
13
|
+
disableKeyboardEvent = false,
|
|
14
|
+
disableFullscreen = false
|
|
15
|
+
} = _a,
|
|
18
16
|
youtubeProps = __rest(_a, ["className", "videoId", "autoPlay", "disableControl", "disableKeyboardEvent", "disableFullscreen"]);
|
|
19
|
-
|
|
17
|
+
const prefixCls = 'em-youtube-player';
|
|
20
18
|
/**
|
|
21
19
|
* Get options for YouTube IFrame player API.
|
|
22
20
|
* ref: https://developers.google.com/youtube/player_parameters#Parameters
|
|
23
21
|
*/
|
|
24
|
-
|
|
22
|
+
const getYoutubeOptions = () => {
|
|
25
23
|
return {
|
|
26
24
|
width: '100%',
|
|
27
25
|
height: '100%',
|
|
@@ -40,7 +38,7 @@ var YoutubePlayer = function YoutubePlayer(_a) {
|
|
|
40
38
|
}, React.createElement(Youtube, Object.assign({
|
|
41
39
|
videoId: videoId,
|
|
42
40
|
opts: getYoutubeOptions(),
|
|
43
|
-
containerClassName:
|
|
41
|
+
containerClassName: `${prefixCls}__inner`
|
|
44
42
|
}, youtubeProps)));
|
|
45
43
|
};
|
|
46
44
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Flex } from '@elice/blocks';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
const StyledYoutubePlayerWrapper = styled(Flex).withConfig({
|
|
5
5
|
componentId: "sc-ao5iuk-0"
|
|
6
6
|
})(["width:100%;height:100%;background-color:#22222c;& .em-youtube-player__inner{width:90%;height:90%;}"]);
|
|
7
7
|
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* @param url URL of youtube
|
|
4
4
|
* @returns id of youtube video OR null when URL is invalid
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const youtubeUrlParser = url => {
|
|
7
|
+
const regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
|
|
8
|
+
const match = regExp.exec(url);
|
|
9
9
|
return match && match[7].length === 11 ? match[7] : null;
|
|
10
10
|
};
|
|
11
11
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elice/material-video",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.231228.0",
|
|
4
4
|
"description": "User view and editing components of Elice material video",
|
|
5
5
|
"repository": "https://git.elicer.io/elice/frontend/library/elice-material",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"start": "run-s watch",
|
|
19
19
|
"prebuild": "run-s clean",
|
|
20
20
|
"build": "run-p build:es build:cjs",
|
|
21
|
-
"build:es": "rollup -c ../../rollup.config.ts -f es",
|
|
22
|
-
"build:cjs": "rollup -c ../../rollup.config.ts -f cjs",
|
|
23
|
-
"watch": "rollup -c ../../rollup.config.ts -f es -w",
|
|
21
|
+
"build:es": "rollup -c ../../rollup.config.ts --configPlugin typescript -f es",
|
|
22
|
+
"build:cjs": "rollup -c ../../rollup.config.ts --configPlugin typescript -f cjs",
|
|
23
|
+
"watch": "rollup -c ../../rollup.config.ts --configPlugin typescript -f es -w",
|
|
24
24
|
"lint": "eslint --ext .ts,.tsx ./src --max-warnings=0",
|
|
25
25
|
"clean": "del-cli \"es/*\" \"cjs/*\" \"dist/*\""
|
|
26
26
|
},
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"@elice/design-tokens": "^1.220803.0",
|
|
49
49
|
"@elice/icons": "^1.230814.0",
|
|
50
50
|
"@elice/icons-legacy": "npm:@elice/icons@0.230814.0",
|
|
51
|
-
"@elice/material-shared-types": "1.
|
|
52
|
-
"@elice/material-shared-utils": "1.
|
|
51
|
+
"@elice/material-shared-types": "1.231228.0",
|
|
52
|
+
"@elice/material-shared-utils": "1.231228.0",
|
|
53
53
|
"@elice/types": "^1.230815.0",
|
|
54
54
|
"@types/classnames": "^2.3.1",
|
|
55
55
|
"@types/react": "~17.0.9",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"react-use": "^17.2.4",
|
|
60
60
|
"styled-components": "^5.3.0"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "98c3e4d64847cdbe7985f8fd95835bb01f1d53ca"
|
|
63
63
|
}
|