@instructure/canvas-rce 7.0.0 → 7.3.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/CHANGELOG.md +60 -1
- package/__tests__/common/indicate.test.js +5 -6
- package/es/bridge/Bridge.js +2 -4
- package/es/canvasFileBrowser/FileBrowser.js +2 -4
- package/es/defaultTinymceConfig.d.ts +1 -1
- package/es/defaultTinymceConfig.js +149 -114
- package/es/enhance-user-content/doc_previews.js +1 -14
- package/es/enhance-user-content/enhance_user_content.js +7 -1
- package/es/enhance-user-content/instructure_helper.js +4 -0
- package/es/enhance-user-content/youtube_overlay.d.ts +1 -0
- package/es/enhance-user-content/youtube_overlay.js +87 -0
- package/es/format-message.d.js +1 -0
- package/es/format-message.js +5 -0
- package/es/index.d.ts +2 -1
- package/es/index.js +2 -1
- package/es/rce/AlertMessageArea.d.ts +2 -2
- package/es/rce/AlertMessageArea.js +4 -6
- package/es/rce/RCE.d.ts +0 -1
- package/es/rce/RCE.js +5 -10
- package/es/rce/RCEGlobals.d.ts +2 -0
- package/es/rce/RCEGlobals.js +1 -0
- package/es/rce/RCEVariants.d.ts +8 -3
- package/es/rce/RCEVariants.js +31 -5
- package/es/rce/RCEWrapper.d.ts +16 -14
- package/es/rce/RCEWrapper.js +260 -244
- package/es/rce/RCEWrapperProps.d.ts +1 -1
- package/es/rce/ShowOnFocusButton/index.js +4 -2
- package/es/rce/StatusBar.js +61 -15
- package/es/rce/alertHandler.js +6 -7
- package/es/rce/plugins/instructure-ui-icons/plugin.js +2 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +6 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.d.ts +5 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +4 -10
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.d.ts +7 -0
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +45 -2
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/clickCallback.d.ts +2 -0
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/clickCallback.js +45 -0
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/plugin.d.ts +1 -0
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/plugin.js +43 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.d.ts +1 -8
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +13 -33
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.d.ts +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.d.ts +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +25 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.d.ts +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +2 -1
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.d.ts +1 -1
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +2 -1
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +10 -7
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -1
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +109 -14
- package/es/rce/plugins/instructure_studio_media_options/studioToolbarIcons.d.ts +5 -0
- package/es/rce/plugins/instructure_studio_media_options/studioToolbarIcons.js +23 -0
- package/es/rce/plugins/instructure_wordcount_header/plugin.d.ts +1 -0
- package/es/rce/plugins/instructure_wordcount_header/plugin.js +75 -0
- package/es/rce/plugins/shared/ContentSelection.d.ts +1 -2
- package/es/rce/plugins/shared/ContentSelection.js +1 -18
- package/es/rce/plugins/shared/DimensionsInput/index.js +3 -3
- package/es/rce/plugins/shared/FixedContentTray.d.ts +7 -23
- package/es/rce/plugins/shared/FixedContentTray.js +7 -16
- package/es/rce/plugins/shared/ImageCropper/constants.d.ts +1 -1
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -1
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +1 -1
- package/es/rce/plugins/shared/PreviewIcon.js +1 -1
- package/es/rce/plugins/shared/StudioLtiSupportUtils.d.ts +9 -1
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +94 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +1 -1
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -4
- package/es/rce/plugins/shared/Upload/VideoUrlPanel.d.ts +15 -0
- package/es/rce/plugins/shared/Upload/VideoUrlPanel.js +51 -0
- package/es/rce/plugins/shared/Upload/videoValidationUtils.d.ts +7 -0
- package/es/rce/plugins/shared/Upload/videoValidationUtils.js +58 -0
- package/es/rce/plugins/shared/ai_tools/aiicons.d.ts +3 -3
- package/es/rce/plugins/shared/ai_tools/aiicons.js +11 -11
- package/es/rce/plugins/shared/iframeUtils.d.ts +1 -0
- package/es/rce/plugins/shared/iframeUtils.js +37 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +7 -1
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.d.ts +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +1 -1
- package/es/rce/style.js +19 -17
- package/es/rce/tinyRCE.js +2 -0
- package/es/sidebar/actions/upload.d.ts +1 -0
- package/es/sidebar/actions/upload.js +56 -0
- package/es/sidebar/containers/sidebarHandlers.d.ts +1 -0
- package/es/sidebar/containers/sidebarHandlers.js +2 -1
- package/es/translations/locales/ar.js +44 -11
- package/es/translations/locales/ca.js +47 -14
- package/es/translations/locales/cy.js +44 -11
- package/es/translations/locales/da-x-k12.js +44 -11
- package/es/translations/locales/da.js +44 -11
- package/es/translations/locales/de.js +44 -11
- package/es/translations/locales/el.js +6 -0
- package/es/translations/locales/en-AU-x-unimelb.js +44 -11
- package/es/translations/locales/en-GB-x-ukhe.js +44 -11
- package/es/translations/locales/en.js +47 -11
- package/es/translations/locales/en_AU.js +44 -11
- package/es/translations/locales/en_CA.js +44 -11
- package/es/translations/locales/en_CY.js +44 -11
- package/es/translations/locales/en_GB.js +44 -11
- package/es/translations/locales/es.js +44 -11
- package/es/translations/locales/es_ES.js +44 -11
- package/es/translations/locales/fa_IR.js +6 -6
- package/es/translations/locales/fi.js +44 -11
- package/es/translations/locales/fr.js +44 -11
- package/es/translations/locales/fr_CA.js +49 -16
- package/es/translations/locales/ga.js +61 -28
- package/es/translations/locales/he.js +6 -0
- package/es/translations/locales/hi.js +44 -11
- package/es/translations/locales/ht.js +44 -11
- package/es/translations/locales/hu.js +6 -12
- package/es/translations/locales/hy.js +6 -0
- package/es/translations/locales/id.js +44 -11
- package/es/translations/locales/is.js +44 -11
- package/es/translations/locales/it.js +44 -11
- package/es/translations/locales/ja.js +44 -11
- package/es/translations/locales/ko.js +6 -0
- package/es/translations/locales/mi.js +44 -11
- package/es/translations/locales/ms.js +44 -11
- package/es/translations/locales/nb-x-k12.js +44 -11
- package/es/translations/locales/nb.js +44 -11
- package/es/translations/locales/nl.js +44 -11
- package/es/translations/locales/nn.js +6 -12
- package/es/translations/locales/pl.js +44 -11
- package/es/translations/locales/pt.js +44 -11
- package/es/translations/locales/pt_BR.js +44 -11
- package/es/translations/locales/ru.js +44 -11
- package/es/translations/locales/sl.js +44 -11
- package/es/translations/locales/sv-x-k12.js +44 -11
- package/es/translations/locales/sv.js +44 -11
- package/es/translations/locales/th.js +44 -11
- package/es/translations/locales/tr.js +6 -3
- package/es/translations/locales/uk_UA.js +6 -9
- package/es/translations/locales/vi.js +44 -11
- package/es/translations/locales/zh-Hans.js +44 -11
- package/es/translations/locales/zh-Hant.js +44 -11
- package/es/translations/locales/zh.js +44 -11
- package/es/translations/locales/zh_HK.js +44 -11
- package/es/util/contextHelper.d.ts +7 -0
- package/{testcafe/axe.test.js → es/util/contextHelper.js} +10 -21
- package/es/util/loadingPlaceholder.js +11 -11
- package/eslint.config.js +3 -25
- package/jest/jest-setup.js +27 -2
- package/jest.config.js +5 -1
- package/package.json +61 -84
- package/testcafe/RCEWrapper.test.js +0 -319
- package/testcafe/StatusBar.test.js +0 -108
- package/testcafe/enhanceUserContent.html +0 -58
- package/testcafe/enhanceUserContent.test.js +0 -44
- package/testcafe/entry.jsx +0 -77
- package/testcafe/testcafe.html +0 -14
- package/webpack.testcafe.config.js +0 -61
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html dir="ltr" lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<title>enhanceUserContent TestCafe page</title>
|
|
5
|
-
</head>
|
|
6
|
-
<body>
|
|
7
|
-
<div id="enhance_me">
|
|
8
|
-
<div class="user_content">
|
|
9
|
-
<p>
|
|
10
|
-
external link:
|
|
11
|
-
<a class="inline_disabled" href="https://instructure.com/" target="_blank" rel="noopener">
|
|
12
|
-
instructure is external
|
|
13
|
-
</a>
|
|
14
|
-
</p>
|
|
15
|
-
<p>
|
|
16
|
-
inline preview:
|
|
17
|
-
<a
|
|
18
|
-
class="instructure_file_link instructure_scribd_file"
|
|
19
|
-
href="http://localhost:3000/courses/1/files/13?wrap=1"
|
|
20
|
-
target="_blank"
|
|
21
|
-
rel="noopener"
|
|
22
|
-
data-canvas-previewable="true"
|
|
23
|
-
data-api-endpoint="http://localhost:3000/api/v1/courses/1/files/13"
|
|
24
|
-
data-api-returntype="File"
|
|
25
|
-
>wrappedOpts.pdf</a
|
|
26
|
-
>
|
|
27
|
-
</p>
|
|
28
|
-
<p>
|
|
29
|
-
auto inline:
|
|
30
|
-
<a
|
|
31
|
-
class="instructure_file_link instructure_scribd_file auto_open"
|
|
32
|
-
href="http://localhost:3000/courses/1/files/13?wrap=1"
|
|
33
|
-
target="_blank"
|
|
34
|
-
rel="noopener"
|
|
35
|
-
data-canvas-previewable="true"
|
|
36
|
-
data-api-endpoint="http://localhost:3000/api/v1/courses/1/files/13"
|
|
37
|
-
data-api-returntype="File"
|
|
38
|
-
>wrappedOpts.pdf</a
|
|
39
|
-
>
|
|
40
|
-
</p>
|
|
41
|
-
<p>
|
|
42
|
-
in overlay:
|
|
43
|
-
<a
|
|
44
|
-
class="instructure_file_link instructure_scribd_file inline_disabled"
|
|
45
|
-
href="http://localhost:3000/courses/1/files/13?wrap=1"
|
|
46
|
-
target="_blank"
|
|
47
|
-
rel="noopener"
|
|
48
|
-
data-canvas-previewable="true"
|
|
49
|
-
data-api-endpoint="http://localhost:3000/api/v1/courses/1/files/13"
|
|
50
|
-
data-api-returntype="File"
|
|
51
|
-
>wrappedOpts.pdf</a
|
|
52
|
-
>
|
|
53
|
-
</p>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
<script src="build/testcafe.js"></script>
|
|
57
|
-
</body>
|
|
58
|
-
</html>
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2022 - present Instructure, Inc.
|
|
3
|
-
*
|
|
4
|
-
* This file is part of Canvas.
|
|
5
|
-
*
|
|
6
|
-
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
-
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
-
* Software Foundation, version 3 of the License.
|
|
9
|
-
*
|
|
10
|
-
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
-
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
-
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
-
* details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
-
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import {Selector} from 'testcafe'
|
|
20
|
-
fixture`EnhanceUserContent`.page`./enhanceUserContent.html`
|
|
21
|
-
|
|
22
|
-
// const externalLink = Selector(
|
|
23
|
-
// 'a.inline_disabled.external[target="_blank"][rel="noreferrer noopener"]'
|
|
24
|
-
// )
|
|
25
|
-
const externalLinkIcon = Selector('span.external_link_icon svg')
|
|
26
|
-
const downloadButton = Selector('a.file_download_btn svg')
|
|
27
|
-
// const loadingPreviewSpinner = Selector('.loading_image_holder')
|
|
28
|
-
const autoOpenInlinePreviewLink = Selector('.auto_open.file_preview_link')
|
|
29
|
-
const inlinePreviewContainer = Selector('.preview_container')
|
|
30
|
-
const overlayPreviewLink = Selector('.inline_disabled.preview_in_overlay')
|
|
31
|
-
|
|
32
|
-
test('enhances user_content', async t => {
|
|
33
|
-
// this one passes locally, but fails in jenkins!?!
|
|
34
|
-
// await t.expect(externalLink.exists).ok('there should be a decorated external link')
|
|
35
|
-
await t.expect(externalLinkIcon.exists).ok('there should be an external link icon')
|
|
36
|
-
await t.expect(downloadButton.exists).ok('there should be a download button')
|
|
37
|
-
// this has started failing too. I don't know why
|
|
38
|
-
// await t.expect(loadingPreviewSpinner.exists).ok('there should be a loading spinner')
|
|
39
|
-
await t
|
|
40
|
-
.expect(autoOpenInlinePreviewLink.exists)
|
|
41
|
-
.ok('there should be an auto_open inline preview link')
|
|
42
|
-
await t.expect(inlinePreviewContainer.exists).ok('there should be an inline preview container')
|
|
43
|
-
await t.expect(overlayPreviewLink.exists).ok('there should be an overlay preveiw link')
|
|
44
|
-
})
|
package/testcafe/entry.jsx
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2019 - present Instructure, Inc.
|
|
3
|
-
*
|
|
4
|
-
* This file is part of Canvas.
|
|
5
|
-
*
|
|
6
|
-
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
-
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
-
* Software Foundation, version 3 of the License.
|
|
9
|
-
*
|
|
10
|
-
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
-
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
-
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
-
* details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
-
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
// import React from 'react'
|
|
20
|
-
// import ReactDOM from 'react-dom'
|
|
21
|
-
|
|
22
|
-
import '@instructure/canvas-theme'
|
|
23
|
-
|
|
24
|
-
import {renderIntoDiv} from '../src'
|
|
25
|
-
import {enhanceUserContent} from '../src/enhance-user-content'
|
|
26
|
-
|
|
27
|
-
const content = document.getElementById('content')
|
|
28
|
-
if (content) {
|
|
29
|
-
renderIntoDiv(content, {
|
|
30
|
-
textareaId: 'textarea',
|
|
31
|
-
editorOptions: () => {
|
|
32
|
-
return {
|
|
33
|
-
plugins: [
|
|
34
|
-
'autolink',
|
|
35
|
-
'media',
|
|
36
|
-
'paste',
|
|
37
|
-
'table',
|
|
38
|
-
'link',
|
|
39
|
-
'image',
|
|
40
|
-
'instructure_upload_image',
|
|
41
|
-
'directionality',
|
|
42
|
-
'lists',
|
|
43
|
-
'wordcount',
|
|
44
|
-
'instructure-ui-icons',
|
|
45
|
-
'instructure_equation',
|
|
46
|
-
'instructure-embeds',
|
|
47
|
-
'instructure_condensed_buttons',
|
|
48
|
-
'instructure_documents',
|
|
49
|
-
'instructure_equation',
|
|
50
|
-
'instructure_media_embed',
|
|
51
|
-
'instructure_image',
|
|
52
|
-
'instructure_rce_external_tools',
|
|
53
|
-
'instructure_record',
|
|
54
|
-
'instructure_links',
|
|
55
|
-
'instructure_html_view',
|
|
56
|
-
],
|
|
57
|
-
menubar: true,
|
|
58
|
-
screenReaderOnly: false,
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
trayProps: {
|
|
62
|
-
contextType: 'course',
|
|
63
|
-
contextId: '17',
|
|
64
|
-
containingContext: {type: 'course', contextId: '17', userId: '3', contextType: 'course'},
|
|
65
|
-
canUploadFiles: true,
|
|
66
|
-
host: 'someOtherHost',
|
|
67
|
-
jwt: 'someJWT',
|
|
68
|
-
liveRegion: () => {},
|
|
69
|
-
screenReaderOnly: false,
|
|
70
|
-
},
|
|
71
|
-
})
|
|
72
|
-
} else {
|
|
73
|
-
const user_content = document.getElementById('enhance_me')
|
|
74
|
-
if (user_content) {
|
|
75
|
-
enhanceUserContent(user_content)
|
|
76
|
-
}
|
|
77
|
-
}
|
package/testcafe/testcafe.html
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html dir="ltr" lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<title>
|
|
5
|
-
Basic RCE TestCafe page
|
|
6
|
-
</title>
|
|
7
|
-
</head>
|
|
8
|
-
<body>
|
|
9
|
-
<main id="content">
|
|
10
|
-
<textarea id="textarea"></textarea>
|
|
11
|
-
</main>
|
|
12
|
-
<script src="build/testcafe.js"></script>
|
|
13
|
-
</body>
|
|
14
|
-
</html>
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2019 - present Instructure, Inc.
|
|
3
|
-
*
|
|
4
|
-
* This file is part of Canvas.
|
|
5
|
-
*
|
|
6
|
-
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
-
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
-
* Software Foundation, version 3 of the License.
|
|
9
|
-
*
|
|
10
|
-
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
-
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
-
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
-
* details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
-
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
const path = require('path')
|
|
20
|
-
const webpack = require('webpack')
|
|
21
|
-
|
|
22
|
-
module.exports = {
|
|
23
|
-
module: {
|
|
24
|
-
rules: [
|
|
25
|
-
{
|
|
26
|
-
test: /\.(js|ts|jsx|tsx)$/,
|
|
27
|
-
exclude: /node_modules/,
|
|
28
|
-
loader: 'babel-loader',
|
|
29
|
-
options: {
|
|
30
|
-
plugins: [
|
|
31
|
-
'@babel/plugin-proposal-class-properties',
|
|
32
|
-
'@babel/plugin-proposal-optional-chaining',
|
|
33
|
-
'@babel/plugin-proposal-nullish-coalescing-operator',
|
|
34
|
-
],
|
|
35
|
-
presets: [['@babel/preset-react'], ['@babel/preset-typescript']],
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
{test: /(\.css$)/, include: /node_modules/, loaders: ['style-loader', 'css-loader']},
|
|
39
|
-
{test: /\.(png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000'},
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
resolve: {
|
|
43
|
-
extensions: ['.ts', '.js', '.tsx', '.jsx'],
|
|
44
|
-
},
|
|
45
|
-
plugins: [
|
|
46
|
-
new webpack.DefinePlugin({
|
|
47
|
-
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
|
|
48
|
-
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
|
|
49
|
-
ENV: JSON.stringify(process.env.NODE_ENV),
|
|
50
|
-
}),
|
|
51
|
-
],
|
|
52
|
-
mode: 'development',
|
|
53
|
-
entry: {
|
|
54
|
-
testcafe: [path.join(__dirname, 'testcafe', 'entry.js')],
|
|
55
|
-
},
|
|
56
|
-
output: {
|
|
57
|
-
path: path.join(__dirname, 'testcafe/build'),
|
|
58
|
-
filename: '[name].js',
|
|
59
|
-
publicPath: path.join(__dirname, 'testcafe/build/'),
|
|
60
|
-
},
|
|
61
|
-
}
|